|
|
@ -39,14 +39,14 @@ |
|
|
#include "core/file_sys/vfs/vfs_real.h"
|
|
|
#include "core/file_sys/vfs/vfs_real.h"
|
|
|
#include "core/frontend/applets/cabinet.h"
|
|
|
#include "core/frontend/applets/cabinet.h"
|
|
|
#include "core/frontend/applets/controller.h"
|
|
|
#include "core/frontend/applets/controller.h"
|
|
|
#include "core/frontend/applets/general_frontend.h"
|
|
|
|
|
|
|
|
|
#include "core/frontend/applets/general.h"
|
|
|
#include "core/frontend/applets/mii_edit.h"
|
|
|
#include "core/frontend/applets/mii_edit.h"
|
|
|
#include "core/frontend/applets/software_keyboard.h"
|
|
|
#include "core/frontend/applets/software_keyboard.h"
|
|
|
#include "core/hle/service/acc/profile_manager.h"
|
|
|
#include "core/hle/service/acc/profile_manager.h"
|
|
|
#include "core/hle/service/am/applet_ae.h"
|
|
|
#include "core/hle/service/am/applet_ae.h"
|
|
|
#include "core/hle/service/am/applet_message_queue.h"
|
|
|
#include "core/hle/service/am/applet_message_queue.h"
|
|
|
#include "core/hle/service/am/applet_oe.h"
|
|
|
#include "core/hle/service/am/applet_oe.h"
|
|
|
#include "core/hle/service/am/applets/applets.h"
|
|
|
|
|
|
|
|
|
#include "core/hle/service/am/frontend/applets.h"
|
|
|
#include "core/hle/service/set/system_settings_server.h"
|
|
|
#include "core/hle/service/set/system_settings_server.h"
|
|
|
#include "frontend_common/content_manager.h"
|
|
|
#include "frontend_common/content_manager.h"
|
|
|
#include "hid_core/frontend/emulated_controller.h"
|
|
|
#include "hid_core/frontend/emulated_controller.h"
|
|
|
@ -631,13 +631,14 @@ void GMainWindow::RegisterMetaTypes() { |
|
|
qRegisterMetaType<Core::Frontend::InlineAppearParameters>( |
|
|
qRegisterMetaType<Core::Frontend::InlineAppearParameters>( |
|
|
"Core::Frontend::InlineAppearParameters"); |
|
|
"Core::Frontend::InlineAppearParameters"); |
|
|
qRegisterMetaType<Core::Frontend::InlineTextParameters>("Core::Frontend::InlineTextParameters"); |
|
|
qRegisterMetaType<Core::Frontend::InlineTextParameters>("Core::Frontend::InlineTextParameters"); |
|
|
qRegisterMetaType<Service::AM::Applets::SwkbdResult>("Service::AM::Applets::SwkbdResult"); |
|
|
|
|
|
qRegisterMetaType<Service::AM::Applets::SwkbdTextCheckResult>( |
|
|
|
|
|
"Service::AM::Applets::SwkbdTextCheckResult"); |
|
|
|
|
|
qRegisterMetaType<Service::AM::Applets::SwkbdReplyType>("Service::AM::Applets::SwkbdReplyType"); |
|
|
|
|
|
|
|
|
qRegisterMetaType<Service::AM::Frontend::SwkbdResult>("Service::AM::Frontend::SwkbdResult"); |
|
|
|
|
|
qRegisterMetaType<Service::AM::Frontend::SwkbdTextCheckResult>( |
|
|
|
|
|
"Service::AM::Frontend::SwkbdTextCheckResult"); |
|
|
|
|
|
qRegisterMetaType<Service::AM::Frontend::SwkbdReplyType>( |
|
|
|
|
|
"Service::AM::Frontend::SwkbdReplyType"); |
|
|
|
|
|
|
|
|
// Web Browser Applet
|
|
|
// Web Browser Applet
|
|
|
qRegisterMetaType<Service::AM::Applets::WebExitReason>("Service::AM::Applets::WebExitReason"); |
|
|
|
|
|
|
|
|
qRegisterMetaType<Service::AM::Frontend::WebExitReason>("Service::AM::Frontend::WebExitReason"); |
|
|
|
|
|
|
|
|
// Register loader types
|
|
|
// Register loader types
|
|
|
qRegisterMetaType<Core::SystemResultStatus>("Core::SystemResultStatus"); |
|
|
qRegisterMetaType<Core::SystemResultStatus>("Core::SystemResultStatus"); |
|
|
@ -747,7 +748,7 @@ void GMainWindow::SoftwareKeyboardInitialize( |
|
|
if (is_inline) { |
|
|
if (is_inline) { |
|
|
connect( |
|
|
connect( |
|
|
software_keyboard, &QtSoftwareKeyboardDialog::SubmitInlineText, this, |
|
|
software_keyboard, &QtSoftwareKeyboardDialog::SubmitInlineText, this, |
|
|
[this](Service::AM::Applets::SwkbdReplyType reply_type, std::u16string submitted_text, |
|
|
|
|
|
|
|
|
[this](Service::AM::Frontend::SwkbdReplyType reply_type, std::u16string submitted_text, |
|
|
s32 cursor_position) { |
|
|
s32 cursor_position) { |
|
|
emit SoftwareKeyboardSubmitInlineText(reply_type, submitted_text, cursor_position); |
|
|
emit SoftwareKeyboardSubmitInlineText(reply_type, submitted_text, cursor_position); |
|
|
}, |
|
|
}, |
|
|
@ -755,7 +756,7 @@ void GMainWindow::SoftwareKeyboardInitialize( |
|
|
} else { |
|
|
} else { |
|
|
connect( |
|
|
connect( |
|
|
software_keyboard, &QtSoftwareKeyboardDialog::SubmitNormalText, this, |
|
|
software_keyboard, &QtSoftwareKeyboardDialog::SubmitNormalText, this, |
|
|
[this](Service::AM::Applets::SwkbdResult result, std::u16string submitted_text, |
|
|
|
|
|
|
|
|
[this](Service::AM::Frontend::SwkbdResult result, std::u16string submitted_text, |
|
|
bool confirmed) { |
|
|
bool confirmed) { |
|
|
emit SoftwareKeyboardSubmitNormalText(result, submitted_text, confirmed); |
|
|
emit SoftwareKeyboardSubmitNormalText(result, submitted_text, confirmed); |
|
|
}, |
|
|
}, |
|
|
@ -782,7 +783,7 @@ void GMainWindow::SoftwareKeyboardShowNormal() { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void GMainWindow::SoftwareKeyboardShowTextCheck( |
|
|
void GMainWindow::SoftwareKeyboardShowTextCheck( |
|
|
Service::AM::Applets::SwkbdTextCheckResult text_check_result, |
|
|
|
|
|
|
|
|
Service::AM::Frontend::SwkbdTextCheckResult text_check_result, |
|
|
std::u16string text_check_message) { |
|
|
std::u16string text_check_message) { |
|
|
if (!software_keyboard) { |
|
|
if (!software_keyboard) { |
|
|
LOG_ERROR(Frontend, "The software keyboard is not initialized!"); |
|
|
LOG_ERROR(Frontend, "The software keyboard is not initialized!"); |
|
|
@ -853,7 +854,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url, |
|
|
|
|
|
|
|
|
// Raw input breaks with the web applet, Disable web applets if enabled
|
|
|
// Raw input breaks with the web applet, Disable web applets if enabled
|
|
|
if (UISettings::values.disable_web_applet || Settings::values.enable_raw_input) { |
|
|
if (UISettings::values.disable_web_applet || Settings::values.enable_raw_input) { |
|
|
emit WebBrowserClosed(Service::AM::Applets::WebExitReason::WindowClosed, |
|
|
|
|
|
|
|
|
emit WebBrowserClosed(Service::AM::Frontend::WebExitReason::WindowClosed, |
|
|
"http://localhost/"); |
|
|
"http://localhost/"); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
@ -941,7 +942,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url, |
|
|
if (variant.toBool()) { |
|
|
if (variant.toBool()) { |
|
|
web_applet->SetFinished(true); |
|
|
web_applet->SetFinished(true); |
|
|
web_applet->SetExitReason( |
|
|
web_applet->SetExitReason( |
|
|
Service::AM::Applets::WebExitReason::EndButtonPressed); |
|
|
|
|
|
|
|
|
Service::AM::Frontend::WebExitReason::EndButtonPressed); |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
@ -951,7 +952,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url, |
|
|
if (web_applet->GetCurrentURL().contains(QStringLiteral("localhost"))) { |
|
|
if (web_applet->GetCurrentURL().contains(QStringLiteral("localhost"))) { |
|
|
if (!web_applet->IsFinished()) { |
|
|
if (!web_applet->IsFinished()) { |
|
|
web_applet->SetFinished(true); |
|
|
web_applet->SetFinished(true); |
|
|
web_applet->SetExitReason(Service::AM::Applets::WebExitReason::CallbackURL); |
|
|
|
|
|
|
|
|
web_applet->SetExitReason(Service::AM::Frontend::WebExitReason::CallbackURL); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
web_applet->SetLastURL(web_applet->GetCurrentURL().toStdString()); |
|
|
web_applet->SetLastURL(web_applet->GetCurrentURL().toStdString()); |
|
|
@ -984,7 +985,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url, |
|
|
#else
|
|
|
#else
|
|
|
|
|
|
|
|
|
// Utilize the same fallback as the default web browser applet.
|
|
|
// Utilize the same fallback as the default web browser applet.
|
|
|
emit WebBrowserClosed(Service::AM::Applets::WebExitReason::WindowClosed, "http://localhost/"); |
|
|
|
|
|
|
|
|
emit WebBrowserClosed(Service::AM::Frontend::WebExitReason::WindowClosed, "http://localhost/"); |
|
|
|
|
|
|
|
|
#endif
|
|
|
#endif
|
|
|
} |
|
|
} |
|
|
@ -992,7 +993,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url, |
|
|
void GMainWindow::WebBrowserRequestExit() { |
|
|
void GMainWindow::WebBrowserRequestExit() { |
|
|
#ifdef YUZU_USE_QT_WEB_ENGINE
|
|
|
#ifdef YUZU_USE_QT_WEB_ENGINE
|
|
|
if (web_applet) { |
|
|
if (web_applet) { |
|
|
web_applet->SetExitReason(Service::AM::Applets::WebExitReason::ExitRequested); |
|
|
|
|
|
|
|
|
web_applet->SetExitReason(Service::AM::Frontend::WebExitReason::ExitRequested); |
|
|
web_applet->SetFinished(true); |
|
|
web_applet->SetFinished(true); |
|
|
} |
|
|
} |
|
|
#endif
|
|
|
#endif
|
|
|
@ -1778,7 +1779,7 @@ bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t p |
|
|
system->GetUserChannel().clear(); |
|
|
system->GetUserChannel().clear(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
system->SetAppletFrontendSet({ |
|
|
|
|
|
|
|
|
system->SetFrontendAppletSet({ |
|
|
std::make_unique<QtAmiiboSettings>(*this), // Amiibo Settings
|
|
|
std::make_unique<QtAmiiboSettings>(*this), // Amiibo Settings
|
|
|
(UISettings::values.controller_applet_disabled.GetValue() == true) |
|
|
(UISettings::values.controller_applet_disabled.GetValue() == true) |
|
|
? nullptr |
|
|
? nullptr |
|
|
@ -1921,7 +1922,7 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t |
|
|
LOG_INFO(Frontend, "yuzu starting..."); |
|
|
LOG_INFO(Frontend, "yuzu starting..."); |
|
|
|
|
|
|
|
|
if (program_id == 0 || |
|
|
if (program_id == 0 || |
|
|
program_id > static_cast<u64>(Service::AM::Applets::AppletProgramId::MaxProgramId)) { |
|
|
|
|
|
|
|
|
program_id > static_cast<u64>(Service::AM::AppletProgramId::MaxProgramId)) { |
|
|
StoreRecentFile(filename); // Put the filename on top of the list
|
|
|
StoreRecentFile(filename); // Put the filename on top of the list
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -1955,10 +1956,10 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t |
|
|
|
|
|
|
|
|
if (UISettings::values.select_user_on_boot && !user_flag_cmd_line) { |
|
|
if (UISettings::values.select_user_on_boot && !user_flag_cmd_line) { |
|
|
const Core::Frontend::ProfileSelectParameters parameters{ |
|
|
const Core::Frontend::ProfileSelectParameters parameters{ |
|
|
.mode = Service::AM::Applets::UiMode::UserSelector, |
|
|
|
|
|
|
|
|
.mode = Service::AM::Frontend::UiMode::UserSelector, |
|
|
.invalid_uid_list = {}, |
|
|
.invalid_uid_list = {}, |
|
|
.display_options = {}, |
|
|
.display_options = {}, |
|
|
.purpose = Service::AM::Applets::UserSelectionPurpose::General, |
|
|
|
|
|
|
|
|
.purpose = Service::AM::Frontend::UserSelectionPurpose::General, |
|
|
}; |
|
|
}; |
|
|
if (SelectAndSetCurrentUser(parameters) == false) { |
|
|
if (SelectAndSetCurrentUser(parameters) == false) { |
|
|
return; |
|
|
return; |
|
|
@ -2161,7 +2162,7 @@ void GMainWindow::OnEmulationStopped() { |
|
|
OnTasStateChanged(); |
|
|
OnTasStateChanged(); |
|
|
render_window->FinalizeCamera(); |
|
|
render_window->FinalizeCamera(); |
|
|
|
|
|
|
|
|
system->GetAppletManager().SetCurrentAppletId(Service::AM::Applets::AppletId::None); |
|
|
|
|
|
|
|
|
system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::None); |
|
|
|
|
|
|
|
|
// Enable all controllers
|
|
|
// Enable all controllers
|
|
|
system->HIDCore().SetSupportedStyleTag({Core::HID::NpadStyleSet::All}); |
|
|
system->HIDCore().SetSupportedStyleTag({Core::HID::NpadStyleSet::All}); |
|
|
@ -2281,10 +2282,10 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target |
|
|
// User save data
|
|
|
// User save data
|
|
|
const auto select_profile = [this] { |
|
|
const auto select_profile = [this] { |
|
|
const Core::Frontend::ProfileSelectParameters parameters{ |
|
|
const Core::Frontend::ProfileSelectParameters parameters{ |
|
|
.mode = Service::AM::Applets::UiMode::UserSelector, |
|
|
|
|
|
|
|
|
.mode = Service::AM::Frontend::UiMode::UserSelector, |
|
|
.invalid_uid_list = {}, |
|
|
.invalid_uid_list = {}, |
|
|
.display_options = {}, |
|
|
.display_options = {}, |
|
|
.purpose = Service::AM::Applets::UserSelectionPurpose::General, |
|
|
|
|
|
|
|
|
.purpose = Service::AM::Frontend::UserSelectionPurpose::General, |
|
|
}; |
|
|
}; |
|
|
QtProfileSelectionDialog dialog(*system, this, parameters); |
|
|
QtProfileSelectionDialog dialog(*system, this, parameters); |
|
|
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | |
|
|
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | |
|
|
@ -4154,7 +4155,7 @@ void GMainWindow::OnToggleStatusBar() { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void GMainWindow::OnAlbum() { |
|
|
void GMainWindow::OnAlbum() { |
|
|
constexpr u64 AlbumId = static_cast<u64>(Service::AM::Applets::AppletProgramId::PhotoViewer); |
|
|
|
|
|
|
|
|
constexpr u64 AlbumId = static_cast<u64>(Service::AM::AppletProgramId::PhotoViewer); |
|
|
auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); |
|
|
auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); |
|
|
if (!bis_system) { |
|
|
if (!bis_system) { |
|
|
QMessageBox::warning(this, tr("No firmware available"), |
|
|
QMessageBox::warning(this, tr("No firmware available"), |
|
|
@ -4169,7 +4170,7 @@ void GMainWindow::OnAlbum() { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
system->GetAppletManager().SetCurrentAppletId(Service::AM::Applets::AppletId::PhotoViewer); |
|
|
|
|
|
|
|
|
system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::PhotoViewer); |
|
|
|
|
|
|
|
|
const auto filename = QString::fromStdString(album_nca->GetFullPath()); |
|
|
const auto filename = QString::fromStdString(album_nca->GetFullPath()); |
|
|
UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); |
|
|
UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); |
|
|
@ -4177,7 +4178,7 @@ void GMainWindow::OnAlbum() { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void GMainWindow::OnCabinet(Service::NFP::CabinetMode mode) { |
|
|
void GMainWindow::OnCabinet(Service::NFP::CabinetMode mode) { |
|
|
constexpr u64 CabinetId = static_cast<u64>(Service::AM::Applets::AppletProgramId::Cabinet); |
|
|
|
|
|
|
|
|
constexpr u64 CabinetId = static_cast<u64>(Service::AM::AppletProgramId::Cabinet); |
|
|
auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); |
|
|
auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); |
|
|
if (!bis_system) { |
|
|
if (!bis_system) { |
|
|
QMessageBox::warning(this, tr("No firmware available"), |
|
|
QMessageBox::warning(this, tr("No firmware available"), |
|
|
@ -4192,8 +4193,8 @@ void GMainWindow::OnCabinet(Service::NFP::CabinetMode mode) { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
system->GetAppletManager().SetCurrentAppletId(Service::AM::Applets::AppletId::Cabinet); |
|
|
|
|
|
system->GetAppletManager().SetCabinetMode(mode); |
|
|
|
|
|
|
|
|
system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::Cabinet); |
|
|
|
|
|
system->GetFrontendAppletHolder().SetCabinetMode(mode); |
|
|
|
|
|
|
|
|
const auto filename = QString::fromStdString(cabinet_nca->GetFullPath()); |
|
|
const auto filename = QString::fromStdString(cabinet_nca->GetFullPath()); |
|
|
UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); |
|
|
UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); |
|
|
@ -4201,7 +4202,7 @@ void GMainWindow::OnCabinet(Service::NFP::CabinetMode mode) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void GMainWindow::OnMiiEdit() { |
|
|
void GMainWindow::OnMiiEdit() { |
|
|
constexpr u64 MiiEditId = static_cast<u64>(Service::AM::Applets::AppletProgramId::MiiEdit); |
|
|
|
|
|
|
|
|
constexpr u64 MiiEditId = static_cast<u64>(Service::AM::AppletProgramId::MiiEdit); |
|
|
auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); |
|
|
auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); |
|
|
if (!bis_system) { |
|
|
if (!bis_system) { |
|
|
QMessageBox::warning(this, tr("No firmware available"), |
|
|
QMessageBox::warning(this, tr("No firmware available"), |
|
|
@ -4216,7 +4217,7 @@ void GMainWindow::OnMiiEdit() { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
system->GetAppletManager().SetCurrentAppletId(Service::AM::Applets::AppletId::MiiEdit); |
|
|
|
|
|
|
|
|
system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::MiiEdit); |
|
|
|
|
|
|
|
|
const auto filename = QString::fromStdString((mii_applet_nca->GetFullPath())); |
|
|
const auto filename = QString::fromStdString((mii_applet_nca->GetFullPath())); |
|
|
UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); |
|
|
UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); |
|
|
@ -4224,8 +4225,7 @@ void GMainWindow::OnMiiEdit() { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void GMainWindow::OnOpenControllerMenu() { |
|
|
void GMainWindow::OnOpenControllerMenu() { |
|
|
constexpr u64 ControllerAppletId = |
|
|
|
|
|
static_cast<u64>(Service::AM::Applets::AppletProgramId::Controller); |
|
|
|
|
|
|
|
|
constexpr u64 ControllerAppletId = static_cast<u64>(Service::AM::AppletProgramId::Controller); |
|
|
auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); |
|
|
auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); |
|
|
if (!bis_system) { |
|
|
if (!bis_system) { |
|
|
QMessageBox::warning(this, tr("No firmware available"), |
|
|
QMessageBox::warning(this, tr("No firmware available"), |
|
|
@ -4241,7 +4241,7 @@ void GMainWindow::OnOpenControllerMenu() { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
system->GetAppletManager().SetCurrentAppletId(Service::AM::Applets::AppletId::Controller); |
|
|
|
|
|
|
|
|
system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::Controller); |
|
|
|
|
|
|
|
|
const auto filename = QString::fromStdString((controller_applet_nca->GetFullPath())); |
|
|
const auto filename = QString::fromStdString((controller_applet_nca->GetFullPath())); |
|
|
UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); |
|
|
UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); |
|
|
@ -4565,7 +4565,7 @@ void GMainWindow::OnCheckFirmwareDecryption() { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
bool GMainWindow::CheckFirmwarePresence() { |
|
|
bool GMainWindow::CheckFirmwarePresence() { |
|
|
constexpr u64 MiiEditId = static_cast<u64>(Service::AM::Applets::AppletProgramId::MiiEdit); |
|
|
|
|
|
|
|
|
constexpr u64 MiiEditId = static_cast<u64>(Service::AM::AppletProgramId::MiiEdit); |
|
|
|
|
|
|
|
|
auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); |
|
|
auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); |
|
|
if (!bis_system) { |
|
|
if (!bis_system) { |
|
|
|