ukui-control-center/0000755000175000017500000000000013641405665013421 5ustar fengfengukui-control-center/plugins/0000755000175000017500000000000013641405665015102 5ustar fengfengukui-control-center/plugins/account/0000755000175000017500000000000013544017042016524 5ustar fengfengukui-control-center/plugins/account/userinfo/0000755000175000017500000000000013642553044020364 5ustar fengfengukui-control-center/plugins/account/userinfo/changepwddialog.h0000644000175000017500000000274413635333016023661 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CHANGEPWDDIALOG_H #define CHANGEPWDDIALOG_H #include namespace Ui { class ChangePwdDialog; } class ChangePwdDialog : public QDialog { Q_OBJECT public: explicit ChangePwdDialog(QWidget *parent = 0); ~ChangePwdDialog(); public: void setupComponent(); void setupConnect(); void refreshConfirmBtnStatus(); void setFace(QString iconfile); void setUsername(QString username); void setPwdType(QString type); void setAccountType(QString text); private: Ui::ChangePwdDialog *ui; Q_SIGNALS: void passwd_send(QString pwd, QString username); }; #endif // CHANGEPWDDIALOG_H ukui-control-center/plugins/account/userinfo/changetypedialog.h0000644000175000017500000000275513635333016024052 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CHANGETYPEDIALOG_H #define CHANGETYPEDIALOG_H #include namespace Ui { class ChangeTypeDialog; } class ChangeTypeDialog : public QDialog { Q_OBJECT public: explicit ChangeTypeDialog(QWidget *parent = 0); ~ChangeTypeDialog(); public: void setupComonpent(); void setFace(QString faceFile); void setUsername(QString name); void setCurrentAccountTypeLabel(QString aType); void setCurrentAccountTypeBtn(int id); private: Ui::ChangeTypeDialog *ui; int currenttype; bool currentloginstatus; Q_SIGNALS: void type_send(int type, QString username); }; #endif // CHANGETYPEDIALOG_H ukui-control-center/plugins/account/userinfo/userinfo.cpp0000644000175000017500000005270313642553044022731 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "userinfo.h" #include "ui_userinfo.h" #include #include #include #include #include #include "SwitchButton/switchbutton.h" #include "HoverWidget/hoverwidget.h" #include "elipsemaskwidget.h" /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include } #define DEFAULTFACE "/usr/share/ukui/faces/default.png" #define ITEMHEIGH 58 UserInfo::UserInfo() { ui = new Ui::UserInfo; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("userinfo"); pluginType = ACCOUNT; //构建System dbus调度对象 sysdispatcher = new SystemDbusDispatcher; //获取系统全部用户信息,用户Uid大于等于1000的 _acquireAllUsersInfo(); initComponent(); initAllUserStatus(); //设置界面用户信息 _refreshUserInfoUI(); } UserInfo::~UserInfo() { delete ui; } QString UserInfo::get_plugin_name(){ return pluginName; } int UserInfo::get_plugin_type(){ return pluginType; } QWidget *UserInfo::get_plugin_ui(){ return pluginWidget; } void UserInfo::plugin_delay_control(){ } QString UserInfo::_accountTypeIntToString(int type){ QString atype; if (type == STANDARDUSER) atype = tr("standard user"); else if (type == ADMINISTRATOR) atype = tr("administrator"); else if (type == ROOT) atype = tr("root"); return atype; } void UserInfo::_acquireAllUsersInfo(){ QStringList objectpaths = sysdispatcher->list_cached_users(); //初始化用户信息QMap allUserInfoMap.clear(); //初始化管理员数目为0 adminnum = 0; for (QString objectpath : objectpaths){ UserInfomation user; user = _acquireUserInfo(objectpath); allUserInfoMap.insert(user.username, user); } //处理root登录 } UserInfomation UserInfo::_acquireUserInfo(QString objpath){ UserInfomation user; //默认值 user.current = false; user.logined = false; user.autologin = false; QDBusInterface * iproperty = new QDBusInterface("org.freedesktop.Accounts", objpath, "org.freedesktop.DBus.Properties", QDBusConnection::systemBus()); QDBusReply > reply = iproperty->call("GetAll", "org.freedesktop.Accounts.User"); if (reply.isValid()){ QMap propertyMap; propertyMap = reply.value(); user.username = propertyMap.find("UserName").value().toString(); if (user.username == QString(g_get_user_name())){ user.current = true; user.logined = true; //获取当前用户免密登录属性 QDBusInterface *tmpSysinterface = new QDBusInterface("com.control.center.qt.systemdbus", "/", "com.control.center.interface", QDBusConnection::systemBus()); //获取免密登录状态 QDBusReply noPwdres; noPwdres = tmpSysinterface ->call("getNoPwdLoginStatus"); //const QString &tmp=noPwdres; if(!noPwdres.isValid()){ qDebug()<<"获取tmpSysinterface状态不合法---->"<< noPwdres.error(); } delete tmpSysinterface; user.noPwdLogin = noPwdres.value().contains(user.username) ? true : false; } user.accounttype = propertyMap.find("AccountType").value().toInt(); if (user.accounttype == ADMINISTRATOR) adminnum++; user.iconfile = propertyMap.find("IconFile").value().toString(); user.passwdtype = propertyMap.find("PasswordMode").value().toInt(); user.uid = propertyMap.find("Uid").value().toInt(); user.autologin = propertyMap.find("AutomaticLogin").value().toBool(); user.objpath = objpath; } else qDebug() << "reply failed"; delete iproperty; return user; } void UserInfo::initComponent(){ //样式表 pluginWidget->setStyleSheet("background: #ffffff;"); ui->currentUserWidget->setStyleSheet("QWidget{background: #F4F4F4; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); ui->autoLoginWidget->setStyleSheet("QWidget{background: #F4F4F4; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"); QString btnQss = QString("QPushButton{background: #FFFFFF; border-radius: 4px;}"); ui->changePwdBtn->setStyleSheet(btnQss); ui->changeTypeBtn->setStyleSheet(btnQss); ui->addUserWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); nopwdSwitchBtn = new SwitchButton(ui->nopwdLoginWidget); ui->nopwdHorLayout->addWidget(nopwdSwitchBtn); autoLoginSwitchBtn = new SwitchButton(ui->autoLoginWidget); ui->autoLoginHorLayout->addWidget(autoLoginSwitchBtn); ui->listWidget->setStyleSheet("QListWidget{border: none}"); ui->listWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->listWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->listWidget->setSpacing(0); ElipseMaskWidget * mainElipseMaskWidget = new ElipseMaskWidget(ui->currentUserFaceLabel); mainElipseMaskWidget->setBgColor("#F4F4F4"); mainElipseMaskWidget->setGeometry(0, 0, ui->currentUserFaceLabel->width(), ui->currentUserFaceLabel->height()); //设置添加用户的图标 ui->addBtn->setIcon(QIcon("://img/plugins/userinfo/add.png")); ui->addBtn->setIconSize(ui->addBtn->size()); ui->currentUserFaceLabel->installEventFilter(this); //修改当前用户密码的回调 connect(ui->changePwdBtn, &QPushButton::clicked, this, [=](bool checked){ Q_UNUSED(checked) UserInfomation user = allUserInfoMap.value(g_get_user_name()); showChangePwdDialog(user.username); }); //修改当前用户类型的回调 connect(ui->changeTypeBtn, &QPushButton::clicked, this, [=](bool checked){ Q_UNUSED(checked) UserInfomation user = allUserInfoMap.value(g_get_user_name()); showChangeTypeDialog(user.username); }); //修改当前用户免密登录 connect(nopwdSwitchBtn, &SwitchButton::checkedChanged, [=](bool checked){ UserInfomation user = allUserInfoMap.value(g_get_user_name()); //免密登录状态改变 QDBusInterface * tmpSysinterface = new QDBusInterface("com.control.center.qt.systemdbus", "/", "com.control.center.interface", QDBusConnection::systemBus()); if (!tmpSysinterface->isValid()){ qCritical() << "Create Client Interface Failed When execute gpasswd: " << QDBusConnection::systemBus().lastError(); return; } tmpSysinterface->call("setNoPwdLoginStatus", checked, user.username); delete tmpSysinterface; }); //修改当前用户自动登录 connect(autoLoginSwitchBtn, &SwitchButton::checkedChanged, [=](bool checked){ UserInfomation user = allUserInfoMap.value(g_get_user_name()); UserDispatcher * userdispatcher = new UserDispatcher(user.objpath); userdispatcher->change_user_autologin(checked); }); //成功删除用户的回调 connect(sysdispatcher, &SystemDbusDispatcher::deleteuserdone, this, [=](QString objPath){ deleteUserDone(objPath); }); //新建用户的回调 connect(ui->addBtn, &QPushButton::clicked, this, [=](bool checked){ Q_UNUSED(checked) showCreateUserDialog(); }); //成功新建用户的回调 connect(sysdispatcher, &SystemDbusDispatcher::createuserdone, this, [=](QString objPath){ createUserDone(objPath); }); } void UserInfo::_resetListWidgetHeigh(){ //设置其他用户控件的总高度 ui->listWidget->setFixedHeight((allUserInfoMap.count() - 1) * ITEMHEIGH); } void UserInfo::initAllUserStatus(){ _resetListWidgetHeigh(); //每次初始化用户状态清空其他用户QMap otherUserItemMap.clear(); QMap::iterator it = allUserInfoMap.begin(); for (; it != allUserInfoMap.end(); it++){ UserInfomation user = it.value(); //当前用户 if (user.username == QString(g_get_user_name())){ } else { //其他用户 _buildWidgetForItem(user); } } } void UserInfo::_refreshUserInfoUI(){ QMap::iterator it = allUserInfoMap.begin(); for (; it != allUserInfoMap.end(); it++){ UserInfomation user = it.value(); //用户头像为.face且.face文件不存在 char * iconpath = user.iconfile.toLatin1().data(); if (!g_file_test(iconpath, G_FILE_TEST_EXISTS)){ user.iconfile = DEFAULTFACE; //更新用户数据 allUserInfoMap.find(it.key()).value().iconfile = DEFAULTFACE; } //当前用户 if (user.username == QString(g_get_user_name())){ //设置用户头像 QPixmap iconPixmap = QPixmap(user.iconfile).scaled(ui->currentUserFaceLabel->size()); // ui->currentUserFaceLabel->setScaledContents(true); ui->currentUserFaceLabel->setPixmap(iconPixmap); //设置用户名 ui->userNameLabel->setText(user.username); //设置用户类型 ui->userTypeLabel->setText(_accountTypeIntToString(user.accounttype)); //设置登录状态 autoLoginSwitchBtn->setChecked(user.autologin); //设置免密登录状态 nopwdSwitchBtn->setChecked(user.noPwdLogin); } else { //其他用户 QListWidgetItem * item = otherUserItemMap.value(user.objpath); //是否需要判断?? QWidget * widget = ui->listWidget->itemWidget(item); QPushButton * faceBtn = widget->findChild("faceBtn"); faceBtn->setIcon(QIcon(user.iconfile)); } } } void UserInfo::_buildWidgetForItem(UserInfomation user){ HoverWidget * baseWidget = new HoverWidget(user.username); baseWidget->setStyleSheet("background: #ffffff;"); // baseWidget->setMinimumSize(550,50); // baseWidget->setMaximumSize(960,50); baseWidget->setAttribute(Qt::WA_DeleteOnClose); QHBoxLayout * baseVerLayout = new QHBoxLayout(baseWidget); baseVerLayout->setSpacing(0); baseVerLayout->setMargin(0); QHBoxLayout * baseHorLayout = new QHBoxLayout(); baseHorLayout->setSpacing(16); baseHorLayout->setMargin(0); QWidget * widget = new QWidget(baseWidget); widget->setFixedHeight(50); widget->setStyleSheet("background: #F4F4F4; border-radius: 4px;"); QHBoxLayout * mainHorLayout = new QHBoxLayout(widget); mainHorLayout->setSpacing(16); mainHorLayout->setContentsMargins(16, 0, 16, 0); QPushButton * faceBtn = new QPushButton(widget); faceBtn->setObjectName("faceBtn"); faceBtn->setFixedSize(32, 32); faceBtn->setIcon(QIcon(user.iconfile)); faceBtn->setIconSize(faceBtn->size()); connect(faceBtn, &QPushButton::clicked, [=](bool checked){ Q_UNUSED(checked) showChangeFaceDialog(user.username); }); QLabel * nameLabel = new QLabel(widget); QSizePolicy nameSizePolicy = nameLabel->sizePolicy(); nameSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); nameSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); nameLabel->setSizePolicy(nameSizePolicy); nameLabel->setText(user.username); QString btnQss = QString("QPushButton{background: #ffffff; border-radius: 4px;}"); QPushButton * typeBtn = new QPushButton(widget); typeBtn->setFixedSize(88, 36); typeBtn->setText(tr("Change type")); typeBtn->setStyleSheet(btnQss); connect(typeBtn, &QPushButton::clicked, this, [=](bool checked){ Q_UNUSED(checked) showChangeTypeDialog(user.username); }); typeBtn->hide(); QPushButton * pwdBtn = new QPushButton(widget); pwdBtn->setFixedSize(88, 36); pwdBtn->setText(tr("Change pwd")); pwdBtn->setStyleSheet(btnQss); connect(pwdBtn, &QPushButton::clicked, this, [=](bool checked){ Q_UNUSED(checked) showChangePwdDialog(user.username); }); pwdBtn->hide(); mainHorLayout->addWidget(faceBtn); mainHorLayout->addWidget(nameLabel); mainHorLayout->addStretch(); mainHorLayout->addWidget(typeBtn); mainHorLayout->addWidget(pwdBtn); widget->setLayout(mainHorLayout); QPushButton * delBtn = new QPushButton(baseWidget); delBtn->setFixedSize(60, 36); delBtn->setText(tr("Delete")); delBtn->setStyleSheet("QPushButton{background: #FA6056; border-radius: 4px}"); delBtn->hide(); connect(delBtn, &QPushButton::clicked, this, [=](bool checked){ Q_UNUSED(checked) showDeleteUserDialog(user.username); }); connect(baseWidget, &HoverWidget::enterWidget, this, [=](QString name){ Q_UNUSED(name) typeBtn->show(); pwdBtn->show(); delBtn->show(); }); connect(baseWidget, &HoverWidget::leaveWidget, this, [=](QString name){ Q_UNUSED(name) typeBtn->hide(); pwdBtn->hide(); delBtn->hide(); }); baseHorLayout->addWidget(widget); baseHorLayout->addWidget(delBtn, Qt::AlignVCenter); baseVerLayout->addLayout(baseHorLayout); // baseVerLayout->addStretch(); baseWidget->setLayout(baseVerLayout); QListWidgetItem * item = new QListWidgetItem(ui->listWidget); item->setSizeHint(QSize(ui->listWidget->width(), ITEMHEIGH)); item->setData(Qt::UserRole, QVariant(user.objpath)); ui->listWidget->setItemWidget(item, baseWidget); otherUserItemMap.insert(user.objpath, item); } void UserInfo::showCreateUserDialog(){ //获取系统所有用户名列表,创建时判断重名 QStringList usersStringList; for (QVariant tmp : allUserInfoMap.keys()){ usersStringList << tmp.toString(); } CreateUserDialog * dialog = new CreateUserDialog(usersStringList); connect(dialog, &CreateUserDialog::newUserWillCreate, this, [=](QString uName, QString pwd, QString pin, int aType){ createUser(uName, pwd, pin, aType); }); dialog->show(); } void UserInfo::createUser(QString username, QString pwd, QString pin, int atype){ Q_UNUSED(pin); sysdispatcher->create_user(username, "", atype); //使用全局变量传递新建用户密码 _newUserPwd = pwd; } void UserInfo::createUserDone(QString objpath){ UserDispatcher * userdispatcher = new UserDispatcher(objpath); //设置默认头像 userdispatcher->change_user_face(DEFAULTFACE); //设置默认密码 userdispatcher->change_user_pwd(_newUserPwd, ""); //刷新全部用户信息 _acquireAllUsersInfo(); //重建其他用户ListWidget高度 _resetListWidgetHeigh(); //获取新建用户信息 UserInfomation user; user = _acquireUserInfo(objpath); //构建Item _buildWidgetForItem(user); } void UserInfo::showDeleteUserDialog(QString username){ UserInfomation user = (UserInfomation)(allUserInfoMap.find(username).value()); DelUserDialog * dialog = new DelUserDialog; dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->setFace(user.iconfile); dialog->setUsername(user.username); connect(dialog, &DelUserDialog::removefile_send, this, [=](bool removeFile, QString userName){ deleteUser(removeFile, userName); }); dialog->open(); } void UserInfo::deleteUser(bool removefile, QString username){ qDebug() << allUserInfoMap.keys() << username; UserInfomation user = (UserInfomation)(allUserInfoMap.find(username).value()); sysdispatcher->delete_user(user.uid, removefile); } void UserInfo::deleteUserDone(QString objpath){ QListWidgetItem * item = otherUserItemMap.value(objpath); //删除Item ui->listWidget->takeItem(ui->listWidget->row(item)); //更新其他用户QMap otherUserItemMap.remove(objpath); //更新所有用户信息 _acquireAllUsersInfo(); //重置其他用户ListWidget高度 _resetListWidgetHeigh(); } void UserInfo::showChangeTypeDialog(QString username){ if (allUserInfoMap.keys().contains(username)){ UserInfomation user = allUserInfoMap.value(username); ChangeTypeDialog * dialog = new ChangeTypeDialog; dialog->setFace(user.iconfile); dialog->setUsername(user.username); dialog->setCurrentAccountTypeLabel(_accountTypeIntToString(user.accounttype)); dialog->setCurrentAccountTypeBtn(user.accounttype); // connect(dialog, SIGNAL(type_send(int,QString,bool)), this, SLOT(change_accounttype_slot(int,QString,bool))); connect(dialog, &ChangeTypeDialog::type_send, this, [=](int atype, QString userName){ changeUserType(atype, userName); }); dialog->show(); } else { qDebug() << "User Data Error When Change User type"; } } void UserInfo::changeUserType(int atype, QString username){ UserInfomation user = allUserInfoMap.value(username); //构建dbus调度对象 UserDispatcher * userdispatcher = new UserDispatcher(user.objpath); //继承QObject不再删除 //更改用户类型 userdispatcher->change_user_type(atype); //重新获取全部用户QMap _acquireAllUsersInfo(); //更新界面显示 _refreshUserInfoUI(); } void UserInfo::showChangeFaceDialog(QString username){ UserInfomation user = (UserInfomation)(allUserInfoMap.find(username).value()); ChangeFaceDialog * dialog = new ChangeFaceDialog; dialog->setFace(user.iconfile); dialog->setUsername(user.username); dialog->setAccountType(_accountTypeIntToString(user.accounttype)); // dialog->set_face_list_status(user.iconfile); connect(dialog, &ChangeFaceDialog::face_file_send, [=](QString faceFile, QString userName){ changeUserFace(faceFile, userName); }); dialog->show(); } void UserInfo::changeUserFace(QString facefile, QString username){ UserInfomation user = (UserInfomation)(allUserInfoMap.find(username).value()); UserDispatcher * userdispatcher = new UserDispatcher(user.objpath); userdispatcher->change_user_face(facefile); //重新获取全部用户QMap _acquireAllUsersInfo(); //更新界面显示 _refreshUserInfoUI(); //拷贝设置的头像文件到~/.face sysinterface = new QDBusInterface("com.control.center.qt.systemdbus", "/", "com.control.center.interface", QDBusConnection::systemBus()); if (!sysinterface->isValid()){ qCritical() << "Create Client Interface Failed When Copy Face File: " << QDBusConnection::systemBus().lastError(); return; } QString cmd = QString("cp %1 /home/%2/.face").arg(facefile).arg(user.username); QDBusReply reply = sysinterface->call("systemRun", QVariant(cmd)); Q_UNUSED(reply) } void UserInfo::showChangePwdDialog(QString username){ if (allUserInfoMap.keys().contains(username)){ UserInfomation user = allUserInfoMap.value(username); ChangePwdDialog * dialog = new ChangePwdDialog; dialog->setFace(user.iconfile); dialog->setUsername(user.username); dialog->setAccountType(_accountTypeIntToString(user.accounttype)); connect(dialog, &ChangePwdDialog::passwd_send, this, [=](QString pwd, QString userName){ changeUserPwd(pwd, userName); }); dialog->show(); } else { qDebug() << "User Info Data Error When Change User type"; } } void UserInfo::changeUserPwd(QString pwd, QString username){ //上层已做判断,这里不去判断而直接获取 UserInfomation user = allUserInfoMap.value(username); UserDispatcher * userdispatcher = new UserDispatcher(user.objpath); //继承QObject不再删除 QString result = userdispatcher->change_user_pwd(pwd, ""); Q_UNUSED(result) } bool UserInfo::eventFilter(QObject *watched, QEvent *event){ if (watched == ui->currentUserFaceLabel){ if (event->type() == QEvent::MouseButtonPress){ QMouseEvent * mouseEvent = static_cast(event); if (mouseEvent->button() == Qt::LeftButton){ showChangeFaceDialog(ui->userNameLabel->text()); return true; } else return false; } } return QObject::eventFilter(watched, event); } ukui-control-center/plugins/account/userinfo/elipsemaskwidget.h0000644000175000017500000000245113642553044024100 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef ELIPSEMASKWIDGET_H #define ELIPSEMASKWIDGET_H #include class ElipseMaskWidget : public QWidget { Q_OBJECT public: explicit ElipseMaskWidget(QWidget *parent = nullptr); ~ElipseMaskWidget(); public: void setBgColor(QString color); protected: void paintEvent(QPaintEvent *event); private: int pWidth; int pHeigh; int pRadius; int pBorder; QString pColor; }; #endif // ELIPSEMASKWIDGET_H ukui-control-center/plugins/account/userinfo/changefacedialog.ui0000644000175000017500000001570213642553044024154 0ustar fengfeng ChangeFaceDialog 0 0 390 412 390 412 390 412 Change Face 0 0 0 0 0 QFrame::StyledPanel QFrame::Raised 0 0 0 0 0 0 0 Qt::Horizontal 40 20 32 32 32 32 24 32 16 32 32 Change User Face 48 48 48 48 true 2 Qt::Vertical QSizePolicy::Expanding 20 24 144 36 144 36 Select face from local Qt::Horizontal 40 20 ukui-control-center/plugins/account/userinfo/createuserdialog.h0000644000175000017500000000337713642553044024071 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CREATEUSERDIALOG_H #define CREATEUSERDIALOG_H #include #include #include #include namespace Ui { class CreateUserDialog; } class CreateUserDialog : public QDialog { Q_OBJECT public: explicit CreateUserDialog(QStringList userlist, QWidget *parent = 0); ~CreateUserDialog(); public: void setupComonpent(); void setupConnect(); void refreshConfirmBtnStatus(); void nameLegalityCheck(QString username); void pwdLegalityCheck(QString pwd); private: Ui::CreateUserDialog *ui; QProcess * process; bool back; QStringList usersStringList; QString nameTip; QString pwdTip; QString pwdSureTip; private: QStyledItemDelegate* itemDelege; bool isCreateUser = false; Q_SIGNALS: void newUserWillCreate(QString username, QString pwd, QString pin, int atype); }; #endif // CREATEUSERDIALOG_H ukui-control-center/plugins/account/userinfo/changetypedialog.cpp0000644000175000017500000000607113642553044024403 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "changetypedialog.h" #include "ui_changetypedialog.h" #include "elipsemaskwidget.h" #include ChangeTypeDialog::ChangeTypeDialog(QWidget *parent) : QDialog(parent), ui(new Ui::ChangeTypeDialog) { ui->setupUi(this); setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground); setAttribute(Qt::WA_DeleteOnClose); ui->frame->setStyleSheet("QFrame{background: #ffffff; border: none; border-radius: 6px;}"); ui->closeBtn->setStyleSheet("QPushButton{background: #ffffff; border: none;}"); ui->closeBtn->setIcon(QIcon("://img/titlebar/close.png")); setupComonpent(); } ChangeTypeDialog::~ChangeTypeDialog() { delete ui; } void ChangeTypeDialog::setupComonpent(){ ElipseMaskWidget * ctMaskWidget = new ElipseMaskWidget(ui->faceLabel); ctMaskWidget->setGeometry(0, 0, ui->faceLabel->width(), ui->faceLabel->height()); ui->buttonGroup->setId(ui->standardRadioButton, 0); ui->buttonGroup->setId(ui->adminRadioButton, 1); ui->confirmPushBtn->setEnabled(false); connect(ui->closeBtn, &QPushButton::clicked, [=]{ close(); }); connect(ui->cancelPushBtn, &QPushButton::clicked, [=](bool checked){ Q_UNUSED(checked) reject(); }); connect(ui->confirmPushBtn, &QPushButton::clicked, [=](bool checked){ Q_UNUSED(checked) this->accept(); emit type_send(ui->buttonGroup->checkedId(), ui->usernameLabel->text()); }); } void ChangeTypeDialog::setFace(QString faceFile){ ui->faceLabel->setPixmap(QPixmap(faceFile)); } void ChangeTypeDialog::setUsername(QString username){ ui->usernameLabel->setText(username); } void ChangeTypeDialog::setCurrentAccountTypeLabel(QString atype){ ui->typeLabel->setText(atype); } void ChangeTypeDialog::setCurrentAccountTypeBtn(int id){ currenttype = id; if (id == 0) ui->standardRadioButton->setChecked(true); else ui->adminRadioButton->setChecked(true); connect(ui->buttonGroup, QOverload::of(&QButtonGroup::buttonClicked), [=](int id){ if (id != currenttype) ui->confirmPushBtn->setEnabled(true); else ui->confirmPushBtn->setEnabled(false); }); } ukui-control-center/plugins/account/userinfo/changefacedialog.h0000644000175000017500000000342513635333016023762 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CHANGEFACEDIALOG_H #define CHANGEFACEDIALOG_H #include #include #include #include #include /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include } namespace Ui { class ChangeFaceDialog; } class ChangeFaceDialog : public QDialog { Q_OBJECT public: explicit ChangeFaceDialog(QWidget *parent = 0); ~ChangeFaceDialog(); void setFace(QString iconfile); void setUsername(QString username); void setAccountType(QString atype); void loadSystemFaces(); void showLocalFaceDialog(); QMap delitemMap; private: Ui::ChangeFaceDialog *ui; Q_SIGNALS: void face_file_send(QString file, QString username); }; #endif // CHANGEFACEDIALOG_H ukui-control-center/plugins/account/userinfo/qtdbus/0000755000175000017500000000000013621411724021661 5ustar fengfengukui-control-center/plugins/account/userinfo/qtdbus/systemdbusdispatcher.h0000644000175000017500000000317713556706375026333 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SYSTEMDBUSDISPATCHER_H #define SYSTEMDBUSDISPATCHER_H #include #include #include #include #include class SystemDbusDispatcher : public QObject { Q_OBJECT public: explicit SystemDbusDispatcher(QObject * parent = 0); ~SystemDbusDispatcher(); QStringList list_cached_users(); void create_user(QString name, QString fullname, int accounttype); void delete_user(qint64 uid, bool removefile); private: QDBusInterface * systemiface; private slots: void create_user_success(QDBusObjectPath objpath); void delete_user_success(QDBusObjectPath objpath); signals: void createuserdone(QString path); void deleteuserdone(QString path); }; #endif // SYSTEMDBUSDISPATCHER_H ukui-control-center/plugins/account/userinfo/qtdbus/userdispatcher.cpp0000644000175000017500000000560313621411724025416 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "userdispatcher.h" #include UserDispatcher::UserDispatcher(QString objpath, QObject *parent) : QObject(parent) { this->setParent(parent); useriface = new QDBusInterface("org.freedesktop.Accounts", objpath, "org.freedesktop.Accounts.User", QDBusConnection::systemBus()); pUserInfo = (UserInfo *)QObject::parent(); } UserDispatcher::~UserDispatcher() { delete useriface; useriface = NULL; } /*来自gtk控制面板的加密代码*/ QString UserDispatcher::make_crypted (const gchar *plain){ GString *salt; gchar *result; GRand *rand; gint i; rand = g_rand_new (); salt = g_string_sized_new (21); gchar salt_char[] = "ABCDEFGHIJKLMNOPQRSTUVXYZ" "abcdefghijklmnopqrstuvxyz" "./0123456789"; // /* SHA 256 */ g_string_append (salt, "$6$"); for (i = 0; i < 16; i++) { g_string_append_c (salt, salt_char[g_rand_int_range(rand, 0, G_N_ELEMENTS (salt_char) )]); } g_string_append_c (salt, '$'); result = g_strdup ((const gchar *)crypt(plain, salt->str)); //运行后找不到crypt undefined symbol: crypt g_string_free (salt, TRUE); g_rand_free (rand); return QString(result); } QString UserDispatcher::change_user_pwd(QString pwd, QString hint){ QByteArray ba = pwd.toLatin1(); QString pwdencryption = make_crypted(ba.data()); QDBusReply reply = useriface->call("SetPassword", pwdencryption, hint); // if (reply.isValid()) // qDebug() << reply.value(); // else // qDebug() << reply.error().message(); return ""; } void UserDispatcher::change_user_type(int atype){ useriface->call("SetAccountType", QVariant(atype)); } void UserDispatcher::change_user_face(QString facefile){ useriface->call("SetIconFile", QVariant(facefile)); } void UserDispatcher::change_user_autologin(bool status){ useriface->call("SetAutomaticLogin", QVariant(status)); } ukui-control-center/plugins/account/userinfo/qtdbus/userdispatcher.h0000644000175000017500000000346613556706375025110 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef USERDISPATCHER_H #define USERDISPATCHER_H #include #include #include #include #include /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include #include } class UserInfo; class UserDispatcher : public QObject { Q_OBJECT public: explicit UserDispatcher(QString objpath, QObject *parent = 0); ~UserDispatcher(); QString change_user_pwd(QString pwd, QString hint); void change_user_type(int atype); void change_user_face(QString facefile); void change_user_autologin(bool status); private: QDBusInterface * useriface; UserInfo * pUserInfo; /***加密,来自gtk控制面板***/ QString make_crypted(const gchar * plain); /*****/ }; #endif // USERDISPATCHER_H ukui-control-center/plugins/account/userinfo/qtdbus/systemdbusdispatcher.cpp0000644000175000017500000000511313556706375026656 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "systemdbusdispatcher.h" #include SystemDbusDispatcher::SystemDbusDispatcher(QObject *parent) : QObject(parent) { systemiface = new QDBusInterface("org.freedesktop.Accounts", "/org/freedesktop/Accounts", "org.freedesktop.Accounts", QDBusConnection::systemBus()); connect(systemiface, SIGNAL(UserAdded(QDBusObjectPath)), this, SLOT(create_user_success(QDBusObjectPath))); connect(systemiface, SIGNAL(UserDeleted(QDBusObjectPath)), this, SLOT(delete_user_success(QDBusObjectPath))); } SystemDbusDispatcher::~SystemDbusDispatcher() { delete systemiface; systemiface = NULL; } QStringList SystemDbusDispatcher::list_cached_users(){ QStringList users; QDBusReply > reply = systemiface->call("ListCachedUsers"); if (reply.isValid()){ for (QDBusObjectPath op : reply.value()) users << op.path(); } return users; } void SystemDbusDispatcher::create_user(QString name, QString fullname, int accounttype){ QDBusReply repley = systemiface->call("CreateUser", name, fullname, accounttype); if (!repley.isValid()) qDebug() << "Create User Error" << repley.error().message(); // QMessageBox::information(0, "Create User Error", repley.error().message()); } void SystemDbusDispatcher::delete_user(qint64 uid, bool removefile){ systemiface->call("DeleteUser", uid, removefile); } void SystemDbusDispatcher::create_user_success(QDBusObjectPath objpath){ emit createuserdone(objpath.path()); } void SystemDbusDispatcher::delete_user_success(QDBusObjectPath objpath){ emit deleteuserdone(objpath.path()); } ukui-control-center/plugins/account/userinfo/deluserdialog.h0000644000175000017500000000263213635333016023360 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef DELUSERDIALOG_H #define DELUSERDIALOG_H #include #include #include namespace Ui { class DelUserDialog; } class DelUserDialog : public QDialog { Q_OBJECT public: explicit DelUserDialog(QWidget *parent = 0); ~DelUserDialog(); public: void setupComonpent(); void setupConnect(); void setFace(QString file); void setUsername(QString name); private: Ui::DelUserDialog *ui; Q_SIGNALS: void removefile_send(bool removefile, QString username); }; #endif // DELUSERDIALOG_H ukui-control-center/plugins/account/userinfo/createuserdialog.ui0000644000175000017500000005710613635333016024253 0ustar fengfeng CreateUserDialog 0 0 400 660 400 660 400 660 Create User 0 0 0 0 10 QFrame::StyledPanel QFrame::Raised 0 0 0 0 0 Qt::Horizontal 40 20 32 32 32 32 24 32 16 32 48 0 0 Add New Account 0 0 0 16777215 16777215 8 0 0 0 10 0 0 0 104 0 104 16777215 UserName 0 33 16777215 33 0 0 0 104 0 104 16777215 PwdType 0 33 16777215 33 0 0 0 104 0 104 16777215 Password 0 33 16777215 33 0 0 0 104 0 104 16777215 PasswordSure 0 33 16777215 33 16 Qt::Horizontal QSizePolicy::Fixed 104 20 0 0 Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 8 0 0 Account Type 0 80 16777215 80 0 0 0 0 0 16 16 16 20 0 20 16777215 buttonGroup 12 0 0 standard user 0 0 Standard users can use most software, but cannot install the software and change system settings 0 80 16777215 80 0 0 0 0 0 16 16 16 20 0 20 16777215 buttonGroup 12 0 0 administrator 0 0 Administrators can make any changes they need Qt::Vertical QSizePolicy::Fixed 20 24 16 Qt::Horizontal 40 20 120 36 120 36 Cancel 120 36 120 36 Confirm ukui-control-center/plugins/account/userinfo/changefacedialog.cpp0000644000175000017500000001115013642553044024312 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "changefacedialog.h" #include "ui_changefacedialog.h" #include "FlowLayout/flowlayout.h" #include "elipsemaskwidget.h" #include #define FACEPATH "/usr/share/ukui/faces/" ChangeFaceDialog::ChangeFaceDialog(QWidget *parent) : QDialog(parent), ui(new Ui::ChangeFaceDialog) { ui->setupUi(this); setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground); setAttribute(Qt::WA_DeleteOnClose); ui->frame->setStyleSheet("QFrame{background: #ffffff; border: none; border-radius: 6px;}"); ui->closeBtn->setStyleSheet("QPushButton{background: #ffffff; border: none;}"); ui->closeBtn->setIcon(QIcon("://img/titlebar/close.png")); ElipseMaskWidget * cfMaskWidget = new ElipseMaskWidget(ui->faceLabel); // cfMaskWidget->setBgColor("#F4F4F4"); cfMaskWidget->setGeometry(0, 0, ui->faceLabel->width(), ui->faceLabel->height()); loadSystemFaces(); connect(ui->closeBtn, &QPushButton::clicked, [=]{ close(); }); connect(ui->customfaceBtn, &QPushButton::clicked, [=]{ showLocalFaceDialog(); }); } ChangeFaceDialog::~ChangeFaceDialog() { delete ui; } void ChangeFaceDialog::loadSystemFaces(){ FlowLayout * facesFlowLayout = new FlowLayout(ui->facesWidget); ui->facesWidget->setLayout(facesFlowLayout); //遍历头像目录 QStringList facesList; QDir facesDir = QDir(FACEPATH); foreach (QString filename, facesDir.entryList(QDir::Files)){ // facesList.append(FACEPATH + filename); QString fullface = QString("%1%2").arg(FACEPATH).arg(filename); if (fullface.endsWith(".svg")) continue; if (fullface.endsWith("default.png")) continue; QPushButton * button = new QPushButton; button->setAttribute(Qt::WA_DeleteOnClose); button->setFixedSize(QSize(48, 48)); button->setStyleSheet("QPushButton{border: none;}"); QHBoxLayout * mainHorLayout = new QHBoxLayout(button); mainHorLayout->setSpacing(0); mainHorLayout->setMargin(0); QLabel * iconLabel = new QLabel(button); iconLabel->setScaledContents(true); iconLabel->setPixmap(QPixmap(fullface)); mainHorLayout->addWidget(iconLabel); button->setLayout(mainHorLayout); connect(button, &QPushButton::clicked, [=]{ //show dialog更新头像 setFace(fullface); emit face_file_send(fullface, ui->usernameLabel->text()); }); facesFlowLayout->addWidget(button); } } void ChangeFaceDialog::setFace(QString iconfile){ ui->faceLabel->setPixmap(QPixmap(iconfile)); } void ChangeFaceDialog::setUsername(QString username){ ui->usernameLabel->setText(username); } void ChangeFaceDialog::setAccountType(QString atype){ ui->typeLabel->setText(atype); } void ChangeFaceDialog::showLocalFaceDialog(){ QString filters = "Face files(*.png *.jpg *.svg)"; QFileDialog fd; fd.setDirectory(QString(const_cast(g_get_user_special_dir(G_USER_DIRECTORY_PICTURES)))); fd.setAcceptMode(QFileDialog::AcceptOpen); fd.setViewMode(QFileDialog::List); fd.setNameFilter(filters); fd.setFileMode(QFileDialog::ExistingFile); fd.setWindowTitle(tr("selsect custom face file")); fd.setLabelText(QFileDialog::Accept, tr("Select")); fd.setLabelText(QFileDialog::LookIn, tr("Position: ")); fd.setLabelText(QFileDialog::FileName, tr("FileName: ")); fd.setLabelText(QFileDialog::FileType, tr("FileType: ")); fd.setLabelText(QFileDialog::Reject, tr("Cancel")); if (fd.exec() != QDialog::Accepted) return; QString selectedfile; selectedfile = fd.selectedFiles().first(); setFace(selectedfile); emit face_file_send(selectedfile, ui->usernameLabel->text()); } ukui-control-center/plugins/account/userinfo/changepwddialog.cpp0000644000175000017500000001163113642553044024212 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "changepwddialog.h" #include "ui_changepwddialog.h" #include "elipsemaskwidget.h" #include #define PWD_LOW_LENGTH 6 ChangePwdDialog::ChangePwdDialog(QWidget *parent) : QDialog(parent), ui(new Ui::ChangePwdDialog) { ui->setupUi(this); setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground); setAttribute(Qt::WA_DeleteOnClose); ui->frame->setStyleSheet("QFrame{background: #ffffff; border: none; border-radius: 6px;}"); ui->closeBtn->setStyleSheet("QPushButton{background: #ffffff; border: none;}"); ui->pwdLineEdit->setStyleSheet("QLineEdit{background: #F4F4F4; border: none; border-radius: 4px;}"); ui->pwdsureLineEdit->setStyleSheet("QLineEdit{background: #F4F4F4; border: none; border-radius: 4px;}"); //构建Combox代理,否则样式不全部生效 QStyledItemDelegate * itemDelege = new QStyledItemDelegate(); ui->pwdtypeComboBox->setItemDelegate(itemDelege); ui->pwdtypeComboBox->setMaxVisibleItems(5); ui->pwdtypeComboBox->setStyleSheet("QComboBox{background: #F4F4F4; border-radius: 4px; font-size:14px;padding-left: 8px; color: black; min-height: 30px; combobox-popup: 0;}" "QComboBox::down-arrow{image:url(://img/dropArrow/downpx.png)}" "QComboBox::drop-down{width: 30px; border: none;}" ""); ui->closeBtn->setIcon(QIcon("://img/titlebar/close.png")); setupComponent(); setupConnect(); } ChangePwdDialog::~ChangePwdDialog() { delete ui; } void ChangePwdDialog::setupComponent(){ ElipseMaskWidget * cpMaskWidget = new ElipseMaskWidget(ui->faceLabel); cpMaskWidget->setGeometry(0, 0, ui->faceLabel->width(), ui->faceLabel->height()); ui->pwdtypeComboBox->addItem(tr("General Pwd")); ui->pwdLineEdit->setEchoMode(QLineEdit::Password); ui->pwdsureLineEdit->setEchoMode(QLineEdit::Password); ui->pwdLineEdit->setPlaceholderText(tr("New Password")); ui->pwdsureLineEdit->setPlaceholderText(tr("New Password Identify")); refreshConfirmBtnStatus(); } void ChangePwdDialog::setupConnect(){ connect(ui->closeBtn, &QPushButton::clicked, [=]{ close(); }); connect(ui->pwdLineEdit, &QLineEdit::textChanged, [=](QString text){ if (text.length() < PWD_LOW_LENGTH) ui->tipLabel->setText(tr("Password length needs to more than 5 character!")); else ui->tipLabel->setText(""); //防止先输入确认密码,再输入密码后pwdsureLabel无法刷新 if (ui->pwdLineEdit->text() == ui->pwdsureLineEdit->text()) ui->pwdsureLabel->setText(""); refreshConfirmBtnStatus(); }); connect(ui->pwdsureLineEdit, &QLineEdit::textChanged, [=](QString text){ if (text != ui->pwdLineEdit->text()) ui->tipLabel->setText(tr("Inconsistency with pwd")); else ui->tipLabel->setText(""); refreshConfirmBtnStatus(); }); connect(ui->cancelPushBtn, &QPushButton::clicked, [=]{ reject(); }); connect(ui->confirmPushBtn, &QPushButton::clicked, [=]{ this->accept(); emit passwd_send(ui->pwdLineEdit->text(), ui->usernameLabel->text()); }); } void ChangePwdDialog::setFace(QString iconfile){ ui->faceLabel->setPixmap(QPixmap(iconfile).scaled(QSize(80, 80))); } void ChangePwdDialog::setUsername(QString username){ ui->usernameLabel->setText(username); } void ChangePwdDialog::setPwdType(QString type){ ui->pwdtypeComboBox->setCurrentText(type); } void ChangePwdDialog::setAccountType(QString aType){ ui->aTypeLabel->setText(aType); } void ChangePwdDialog::refreshConfirmBtnStatus(){ if (!ui->tipLabel->text().isEmpty() || \ ui->pwdLineEdit->text().isEmpty() || ui->pwdLineEdit->text() == tr("New Password") || \ ui->pwdsureLineEdit->text().isEmpty() || ui->pwdsureLineEdit->text() == tr("New Password Identify")) ui->confirmPushBtn->setEnabled(false); else ui->confirmPushBtn->setEnabled(true); } ukui-control-center/plugins/account/userinfo/userinfo.pro0000644000175000017500000000267513642553044022752 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-29T14:35:43 # #------------------------------------------------- QT += widgets dbus TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(userinfo) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) include($$PROJECT_COMPONENTSOURCE/hoverwidget.pri) include($$PROJECT_COMPONENTSOURCE/flowlayout.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lcrypt ##加载gio库和gio-unix库 CONFIG += link_pkgconfig \ C++11 PKGCONFIG += gio-2.0 \ gio-unix-2.0 #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ elipsemaskwidget.cpp \ userinfo.cpp \ qtdbus/systemdbusdispatcher.cpp \ changepwddialog.cpp \ qtdbus/userdispatcher.cpp \ changetypedialog.cpp \ changefacedialog.cpp \ deluserdialog.cpp \ createuserdialog.cpp HEADERS += \ elipsemaskwidget.h \ userinfo.h \ qtdbus/systemdbusdispatcher.h \ changepwddialog.h \ qtdbus/userdispatcher.h \ changetypedialog.h \ changefacedialog.h \ deluserdialog.h \ createuserdialog.h FORMS += \ userinfo.ui \ changepwddialog.ui \ changetypedialog.ui \ changefacedialog.ui \ deluserdialog.ui \ createuserdialog.ui RESOURCES += \ ukui-control-center/plugins/account/userinfo/elipsemaskwidget.cpp0000644000175000017500000000326613642553044024440 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "elipsemaskwidget.h" #include ElipseMaskWidget::ElipseMaskWidget(QWidget *parent) : QWidget(parent) { setAttribute(Qt::WA_DeleteOnClose); pWidth = parent->width(); pHeigh = parent->height(); pRadius = 6; pColor = QString("#ffffff"); pBorder = 1; } ElipseMaskWidget::~ElipseMaskWidget() { } void ElipseMaskWidget::setBgColor(QString color){ pColor = color; } void ElipseMaskWidget::paintEvent(QPaintEvent *e){ Q_UNUSED(e) QPainterPath cPath; cPath.addRect(0, 0, pWidth, pHeigh); cPath.addEllipse(0, 0, pWidth, pHeigh); QPainter painter(this); painter.setRenderHint(QPainter:: Antialiasing, true); //设置渲染,启动反锯齿 painter.setPen(QPen(QColor(pColor), pBorder)); painter.drawPath(cPath); painter.fillPath(cPath, QBrush(QColor(pColor))); } ukui-control-center/plugins/account/userinfo/createuserdialog.cpp0000644000175000017500000002361313642553044024417 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "createuserdialog.h" #include "ui_createuserdialog.h" #include #define MOBILE 0 #define PC 1 #define PWD_LOW_LENGTH 6 #define PWD_HIGH_LENGTH 20 #define PIN_LENGTH 6 #define USER_LENGTH 32 CreateUserDialog::CreateUserDialog(QStringList userlist, QWidget *parent) : QDialog(parent), ui(new Ui::CreateUserDialog), usersStringList(userlist) { ui->setupUi(this); setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground); setAttribute(Qt::WA_DeleteOnClose); ui->label_8->adjustSize(); ui->label_8->setWordWrap(true); ui->label_10->adjustSize(); ui->label_10->setWordWrap(true); ui->frame->setStyleSheet("QFrame{background: #ffffff; border: none; border-radius: 6px;}"); ui->closeBtn->setStyleSheet("QPushButton{background: #ffffff; border: none;}"); ui->usernameLineEdit->setStyleSheet("QLineEdit{background: #F4F4F4; border: none; border-radius: 4px;}"); ui->pwdLineEdit->setStyleSheet("QLineEdit{background: #F4F4F4; border: none; border-radius: 4px;}"); ui->pwdsureLineEdit->setStyleSheet("QLineEdit{background: #F4F4F4; border: none; border-radius: 4px;}"); ui->closeBtn->setIcon(QIcon("://img/titlebar/close.png")); ui->pwdTypeComBox->setStyleSheet("QComboBox{background: #F4F4F4; border-radius: 4px; font-size:14px;padding-left: 8px; color: black; min-height: 30px; combobox-popup: 0;}" "QComboBox::down-arrow{image:url(://img/dropArrow/downpx.png)}" "QComboBox::drop-down{width: 30px; border: none;}" ""); //构建Combox代理,否则样式不全部生效 itemDelege = new QStyledItemDelegate(); ui->pwdTypeComBox->setItemDelegate(itemDelege); ui->pwdTypeComBox->setMaxVisibleItems(5); setupComonpent(); setupConnect(); } CreateUserDialog::~CreateUserDialog() { delete ui; // delete process; } void CreateUserDialog::setupComonpent(){ nameTip = ""; pwdTip = ""; pwdSureTip = ""; ui->pwdLineEdit->setEchoMode(QLineEdit::Password); ui->pwdsureLineEdit->setEchoMode(QLineEdit::Password); // ui->pinLineEdit->setEchoMode(QLineEdit::Password); // ui->pinsureLineEdit->setEchoMode(QLineEdit::Password); // QString required = tr("(Required)"); // QString optional = tr("(Optional)"); // if (ostype == PC){ // ui->pwdLabel->setText(required); // ui->pwdsurelabel->setText(required); // ui->pinLabel->setText(optional); // ui->pinsurelabel->setText(optional); // } // else{ // ui->pwdLabel->setText(optional); // ui->pwdsurelabel->setText(optional); // ui->pinLabel->setText(required); // ui->pinsurelabel->setText(required); // } ui->usernameLineEdit->setPlaceholderText(tr("UserName")); ui->pwdLineEdit->setPlaceholderText(tr("Password")); ui->pwdsureLineEdit->setPlaceholderText(tr("Password Identify")); // ui->pinLineEdit->setPlaceholderText(tr("PIN Code")); // ui->pinsureLineEdit->setPlaceholderText(tr("PIN Code Identify")); ui->pwdTypeComBox->addItem(tr("General Password")); // //给radiobtn设置id,id即accoutnType,方便直接返回id值 ui->buttonGroup->setId(ui->standardRadioBtn, 0); ui->buttonGroup->setId(ui->adminRadioBtn, 1); // //默认标准用户 ui->standardRadioBtn->setChecked(true); //设置确定按钮 refreshConfirmBtnStatus(); // confirm_btn_status_refresh(); } void CreateUserDialog::setupConnect(){ connect(ui->closeBtn, &QPushButton::clicked, [=](bool checked){ Q_UNUSED(checked) close(); }); connect(ui->usernameLineEdit, &QLineEdit::textChanged, [=](QString text){ nameLegalityCheck(text); }); connect(ui->pwdLineEdit, &QLineEdit::textChanged, [=](QString text){ pwdLegalityCheck(text); }); connect(ui->pwdsureLineEdit, &QLineEdit::textChanged, [=](QString text){ if (!text.isEmpty() && text != ui->pwdLineEdit->text()){ pwdSureTip = tr("Inconsistency with pwd"); } else { pwdSureTip = ""; } ui->tipLabel->setText(pwdSureTip); if (pwdSureTip.isEmpty()){ pwdTip.isEmpty() ? ui->tipLabel->setText(nameTip) : ui->tipLabel->setText(pwdTip); } refreshConfirmBtnStatus(); }); // connect(ui->confirmPushBtn, SIGNAL(clicked(bool)), this, SLOT(confirm_btn_clicked_slot())); // connect(ui->usernameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(name_legality_check_slot(QString))); // connect(ui->pwdLineEdit, SIGNAL(textChanged(QString)), this, SLOT(pwd_legality_check_slot(QString))); // connect(ui->pwdsureLineEdit, SIGNAL(textChanged(QString)), this, SLOT(pwdsure_legality_check_slot(QString))); connect(ui->confirmBtn, &QPushButton::clicked, [=](bool checked){ Q_UNUSED(checked) this->accept(); QString uName, pwd, pin; uName = ui->usernameLineEdit->text(); if (ui->pwdTypeComBox->currentIndex() == 0){ pwd = ui->pwdLineEdit->text(); pin = ""; } else { pwd = ""; pin = ui->pwdLineEdit->text(); } emit newUserWillCreate(uName, pwd, pin, ui->buttonGroup->checkedId()); }); connect(ui->cancelBtn, &QPushButton::clicked, [=](bool checked){ Q_UNUSED(checked) reject(); }); } //void CreateUserDialog::set_face_label(QString iconfile){ // ui->faceLabel->setPixmap(QPixmap(iconfile).scaled(QSize(80, 80))); //} //void CreateUserDialog::tiplabel_status_refresh(){ // if (ui->usernametipLabel->text().isEmpty()) // ui->usernametipLabel->hide(); // else // ui->usernametipLabel->show(); // if (ui->pwdtipLabel->text().isEmpty()) // ui->pwdtipLabel->hide(); // else // ui->pwdtipLabel->show(); // if (ui->pwdsuretipLabel->text().isEmpty()) // ui->pwdsuretipLabel->hide(); // else // ui->pwdsuretipLabel->show(); // if (ui->pintipLabel->text().isEmpty()) // ui->pintipLabel->hide(); // else // ui->pintipLabel->show(); // if (ui->pinsuretipLabel->text().isEmpty()) // ui->pinsuretipLabel->hide(); // else // ui->pinsuretipLabel->show(); //} void CreateUserDialog::refreshConfirmBtnStatus(){ if (ui->usernameLineEdit->text().isEmpty() || ui->pwdLineEdit->text().isEmpty() || ui->pwdsureLineEdit->text().isEmpty() || !nameTip.isEmpty() || !pwdTip.isEmpty() || !pwdSureTip.isEmpty()) ui->confirmBtn->setEnabled(false); else ui->confirmBtn->setEnabled(true); } void CreateUserDialog::pwdLegalityCheck(QString pwd){ if (pwd.length() < PWD_LOW_LENGTH) { pwdTip = tr("Password length needs to more than %1 character!").arg(PWD_LOW_LENGTH - 1); } else if (pwd.length() > PWD_HIGH_LENGTH) { pwdTip = tr("Password length needs to less than %1 character!").arg(PWD_HIGH_LENGTH + 1); } else { pwdTip = ""; } //防止先输入确认密码,再输入密码后pwdsuretipLabel无法刷新 if (!ui->pwdsureLineEdit->text().isEmpty()){ if (ui->pwdLineEdit->text() == ui->pwdsureLineEdit->text()) { pwdSureTip = ""; } else { pwdSureTip = tr("Inconsistency with pwd"); } } ui->tipLabel->setText(pwdTip); if (pwdTip.isEmpty()){ pwdSureTip.isEmpty() ? ui->tipLabel->setText(nameTip) : ui->tipLabel->setText(pwdSureTip); } refreshConfirmBtnStatus(); } void CreateUserDialog::nameLegalityCheck(QString username){ if (username.isEmpty()) nameTip = tr("The user name cannot be empty"); else if (username.startsWith("_") || username.left(1).contains((QRegExp("[0-9]")))){ nameTip = tr("The first character must be lowercase letters!"); } else if (username.contains(QRegExp("[A-Z]"))){ nameTip = tr("User name can not contain capital letters!"); } else if (username.contains(QRegExp("[a-z]")) || username.contains(QRegExp("[0-9]")) || username.contains("_")) if (username.length() > 0 && username.length() < USER_LENGTH){ /* * 此处代码需要优化 */ // back = false; // QString cmd = QString("getent group %1").arg(username); // process = new QProcess(this); // connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(name_conflict_group_slot())); // process->start(cmd); if (usersStringList.contains(username)){ nameTip = tr("The user name is already in use, please use a different one."); } else { nameTip = ""; } } else { nameTip = tr("User name length need to less than %1 letters!").arg(USER_LENGTH); } else { nameTip = tr("The user name can only be composed of letters, numbers and underline!"); } ui->tipLabel->setText(nameTip); if (nameTip.isEmpty()){ pwdTip.isEmpty() ? ui->tipLabel->setText(pwdSureTip) : ui->tipLabel->setText(pwdTip); } refreshConfirmBtnStatus(); } ukui-control-center/plugins/account/userinfo/res/0000755000175000017500000000000013543125214021147 5ustar fengfengukui-control-center/plugins/account/userinfo/res/img.qrc0000644000175000017500000000005113543125214022426 0ustar fengfeng ukui-control-center/plugins/account/userinfo/changetypedialog.ui0000644000175000017500000004445413635333016024242 0ustar fengfeng ChangeTypeDialog 0 0 542 542 397 539 542 542 Change AccountType 0 0 0 0 0 QFrame::StyledPanel QFrame::Raised 0 0 0 0 0 0 Qt::Horizontal 40 20 32 32 32 32 12 32 16 32 48 12 0 0 Change Account Type 0 0 Make sure that there is at least one administrator on the computer Qt::Vertical QSizePolicy::Fixed 20 20 8 0 0 0 48 48 48 48 true 8 0 0 0 0 Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 12 0 88 16777215 88 0 0 0 0 0 16 16 0 16 0 16 16777215 buttonGroup 12 0 0 standard user 0 0 Standard users can use most software, but cannot install software and change system settings Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 4 0 88 16777215 88 0 0 0 0 0 16 16 0 16 0 16 16777215 buttonGroup 12 0 0 administrator 0 0 Administrators can make any changes they need Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 36 16 Qt::Horizontal 40 20 120 36 120 36 Cancel true 120 36 120 36 Confirm ukui-control-center/plugins/account/userinfo/userinfo.h0000644000175000017500000000664513642553044022402 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef USERINFO_H #define USERINFO_H #include #include #include #include "shell/interface.h" #include "qtdbus/systemdbusdispatcher.h" #include "qtdbus/userdispatcher.h" #include "changepwddialog.h" #include "changefacedialog.h" #include "changetypedialog.h" #include "deluserdialog.h" #include "createuserdialog.h" enum { STANDARDUSER, ADMINISTRATOR, ROOT }; typedef struct _UserInfomation { QString objpath; QString username; QString iconfile; QString passwd; int accounttype; int passwdtype; bool current; bool logined; bool autologin; bool noPwdLogin; qint64 uid; }UserInfomation; namespace Ui { class UserInfo; } class QDBusInterface; class SwitchButton; class UserInfo : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: UserInfo(); ~UserInfo(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget *get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void initComponent(); void initAllUserStatus(); void _acquireAllUsersInfo(); UserInfomation _acquireUserInfo(QString objpath); QString _accountTypeIntToString(int type); void _buildWidgetForItem(UserInfomation user); void _resetListWidgetHeigh(); void _refreshUserInfoUI(); void showCreateUserDialog(); void createUser(QString username, QString pwd, QString pin, int atype); void createUserDone(QString objpath); void showDeleteUserDialog(QString username); void deleteUser(bool removefile, QString username); void deleteUserDone(QString objpath); void showChangePwdDialog(QString username); void changeUserPwd(QString pwd, QString username); void showChangeTypeDialog(QString username); void changeUserType(int atype, QString username); void showChangeFaceDialog(QString username); void changeUserFace(QString facefile, QString username); protected: bool eventFilter(QObject *watched, QEvent *event); private: Ui::UserInfo *ui; QString pluginName; int pluginType; QWidget * pluginWidget; private: SwitchButton * nopwdSwitchBtn; SwitchButton * autoLoginSwitchBtn; SystemDbusDispatcher * sysdispatcher; private: QMap allUserInfoMap; QMap otherUserItemMap; int adminnum; QString _newUserPwd; QString pwdcreate; QDBusInterface * sysinterface; }; #endif // USERINFO_H ukui-control-center/plugins/account/userinfo/changepwddialog.ui0000644000175000017500000004043113635333016024042 0ustar fengfeng ChangePwdDialog 0 0 401 458 401 458 401 458 Change Pwd 0 0 0 0 0 0 80 QFrame::StyledPanel QFrame::Raised 0 0 0 0 0 Qt::Horizontal 40 20 32 32 32 32 24 32 16 32 48 0 0 0 Change Pwd 16 0 0 0 48 48 48 48 true 8 0 0 0 0 Qt::Horizontal 40 20 0 0 0 0 0 8 0 0 0 10 0 0 104 0 104 16777215 Pwd type 0 32 16777215 32 0 0 104 0 104 16777215 New pwd 0 32 16777215 32 0 0 104 0 104 16777215 New pwd sure 0 32 16777215 32 Qt::Horizontal QSizePolicy::Fixed 104 20 0 0 Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 24 Qt::Horizontal 40 20 120 36 120 36 Cancel true 120 36 120 36 Confirm ukui-control-center/plugins/account/userinfo/userinfo.ui0000644000175000017500000004124713630066010022552 0ustar fengfeng UserInfo 0 0 800 710 0 0 16777215 16777215 UserInfo 2 0 0 30 30 0 0 Current User true Qt::Vertical QSizePolicy::Fixed 20 14 550 202 960 202 0 0 0 0 0 0 16 16 16 9 16 0 24 0 0 112 112 112 112 Qt::Horizontal QSizePolicy::Fixed 8 20 8 Qt::Vertical 20 40 0 0 0 0 120 36 120 36 Change pwd Qt::Vertical 20 40 120 36 120 36 Change type Qt::Horizontal 40 20 0 50 16777215 50 0 0 0 0 0 0 0 0 Login no passwd true Qt::Horizontal 40 20 550 50 960 50 0 16 0 16 0 0 0 0 0 0 enable autoLogin true Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 46 0 0 Other Users true Qt::Vertical QSizePolicy::Fixed 20 14 Qt::Vertical QSizePolicy::Fixed 20 14 550 60 960 60 0 0 0 0 0 8 16 48 48 48 48 0 0 Add new user true Qt::Horizontal 40 20 ukui-control-center/plugins/account/userinfo/deluserdialog.ui0000644000175000017500000002462513635333016023554 0ustar fengfeng DelUserDialog 0 0 502 238 502 238 502 238 Delete User 10 0 0 0 0 QFrame::StyledPanel QFrame::Raised 0 0 0 0 0 0 0 Qt::Horizontal 40 20 32 32 32 32 8 32 16 32 32 16 0 0 0 72 72 72 72 true 0 0 0 12 0 0 0 0 16777215 16777215 Delete the user, belonging to the user's desktop, documents, favorites, music, pictures and video folder will be deleted! Qt::Vertical 20 40 Qt::Horizontal 40 20 12 Qt::Horizontal 40 20 120 36 120 36 Cancel true 120 36 120 36 KeepFile buttonGroup 120 36 120 36 RemoveFile buttonGroup ukui-control-center/plugins/account/userinfo/deluserdialog.cpp0000644000175000017500000000501313635333016023707 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "deluserdialog.h" #include "ui_deluserdialog.h" #include DelUserDialog::DelUserDialog(QWidget *parent) : QDialog(parent), ui(new Ui::DelUserDialog) { ui->setupUi(this); setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground); ui->frame->setStyleSheet("QFrame{background: #ffffff; border: none; border-radius: 6px;}"); ui->closeBtn->setStyleSheet("QPushButton{background: #ffffff;}"); ui->closeBtn->setIcon(QIcon("://img/titlebar/close.png")); setupComonpent(); setupConnect(); } DelUserDialog::~DelUserDialog() { delete ui; } void DelUserDialog::setupComonpent(){ } void DelUserDialog::setupConnect(){ connect(ui->closeBtn, &QPushButton::clicked, [=](){ close(); }); connect(ui->cancelPushBtn, SIGNAL(clicked()), this, SLOT(reject())); QSignalMapper * differSignalMapper = new QSignalMapper(); for (QAbstractButton * button : ui->buttonGroup->buttons()){ connect(button, SIGNAL(clicked()), differSignalMapper, SLOT(map())); differSignalMapper->setMapping(button, button->text()); } connect(differSignalMapper, QOverload::of(&QSignalMapper::mapped), [=](const QString key){ this->accept(); bool removefile; if (ui->removePushBtn->text() == key) removefile = true; else removefile = false; emit removefile_send(removefile, ui->usernameLabel->text()); }); } void DelUserDialog::setFace(QString iconfile){ ui->faceLabel->setPixmap(QPixmap(iconfile)); } void DelUserDialog::setUsername(QString username){ ui->usernameLabel->setText(username); } ukui-control-center/plugins/account/loginoptions/0000755000175000017500000000000013556706375021271 5ustar fengfengukui-control-center/plugins/account/loginoptions/loginoptions.ui0000644000175000017500000001672413543125214024345 0ustar fengfeng LoginOptions 0 0 800 710 800 710 800 710 LoginOptions 0 0 0 0 0 20 20 25 0 0 0 0 Login options true title1# 0 0 Lock the screen after how long you leave your computer true Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 40 0 0 Password type priority true title1# 0 0 Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 40 0 0 Related settings true title1# Screenlock settings true Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Expanding 20 40 ukui-control-center/plugins/account/loginoptions/loginoptions.cpp0000644000175000017500000000270613556706375024526 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "loginoptions.h" #include "ui_loginoptions.h" LoginOptions::LoginOptions() { ui = new Ui::LoginOptions; pluginWidget = new CustomWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("loginoptions"); pluginType = ACCOUNT; } LoginOptions::~LoginOptions() { delete ui; } QString LoginOptions::get_plugin_name(){ return pluginName; } int LoginOptions::get_plugin_type(){ return pluginType; } CustomWidget * LoginOptions::get_plugin_ui(){ return pluginWidget; } void LoginOptions::plugin_delay_control(){ } ukui-control-center/plugins/account/loginoptions/loginoptions.h0000644000175000017500000000314413556706375024170 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef LOGINOPTIONS_H #define LOGINOPTIONS_H #include #include #include #include "mainui/interface.h" #include "../../pluginsComponent/customwidget.h" namespace Ui { class LoginOptions; } class LoginOptions : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: LoginOptions(); ~LoginOptions(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; CustomWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; private: Ui::LoginOptions *ui; QString pluginName; int pluginType; CustomWidget * pluginWidget; }; #endif // LOGINOPTIONS_H ukui-control-center/plugins/account/loginoptions/loginoptions.pro0000644000175000017500000000110313543125214024511 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-29T14:44:56 # #------------------------------------------------- QT += widgets TEMPLATE = lib CONFIG += plugin INCLUDEPATH += ../../.. TARGET = $$qtLibraryTarget(loginoptions) DESTDIR = ../.. include(../../pluginsComponent/pluginsComponent.pri) #DEFINES += QT_DEPRECATED_WARNINGS target.path = $$[QT_INSTALL_PREFIX]/lib/control-center/plugins/ INSTALLS += target SOURCES += \ loginoptions.cpp HEADERS += \ loginoptions.h FORMS += \ loginoptions.ui ukui-control-center/plugins/account/account.pro0000644000175000017500000000007713543125214020706 0ustar fengfengTEMPLATE = subdirs SUBDIRS = \ userinfo \ loginoptions ukui-control-center/plugins/messages-task/0000755000175000017500000000000013635333016017642 5ustar fengfengukui-control-center/plugins/messages-task/messages-task.pro0000644000175000017500000000012113543125214023122 0ustar fengfengTEMPLATE = subdirs SUBDIRS = \ about \ multitask \ notice-operation ukui-control-center/plugins/messages-task/about/0000755000175000017500000000000013635333016020754 5ustar fengfengukui-control-center/plugins/messages-task/about/about.pro0000644000175000017500000000054313621411724022610 0ustar fengfengQT += widgets dbus TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(about) DESTDIR = ../../../pluginlibs include(../../../env.pri) INCLUDEPATH += \ $$PROJECT_ROOTDIR \ #DEFINES += QT_DEPRECATED_WARNINGS HEADERS += \ about.h SOURCES += \ about.cpp FORMS += \ about.ui RESOURCES += \ res/img.qrc ukui-control-center/plugins/messages-task/about/about.ui0000644000175000017500000001752613635333016022440 0ustar fengfeng About 0 0 800 710 0 0 16777215 16777215 Form 0 0 0 32 40 550 0 960 16777215 16 0 0 0 0 10 0 0 System Summary true 0 240 16777215 240 0 0 0 0 0 24 16 16 16 10 0 0 0 true Qt::Horizontal 40 20 20 12 Qt::Vertical QSizePolicy::Fixed 20 32 0 0 Devices Summary true 0 180 16777215 180 20 12 16 16 16 ukui-control-center/plugins/messages-task/about/about.h0000644000175000017500000000411213635333016022235 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef ABOUT_H #define ABOUT_H #include #include #include #include #include #include #include #include #define MANUFACTURER "Manufacturer" #define VERSION "Version" #define PRODUCTNAME "Product Name" #define SERIALNUMBER "Serial Number" #include "shell/interface.h" namespace Ui { class About; } class About : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: About(); ~About(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupComponent(); void initUI(); void _call_dbus_get_computer_info(); void _data_init(); private: Ui::About *ui; QString pluginName; int pluginType; QWidget * pluginWidget; QLabel * envlogoLabel; QLabel * logoLabel; QDBusInterface * interface; QString computerinfo; QMap infoMap; //private slots: // void call_finished_slot(QDBusPendingCallWatcher * call); }; #endif // ABOUT_H ukui-control-center/plugins/messages-task/about/res/0000755000175000017500000000000013543125214021542 5ustar fengfengukui-control-center/plugins/messages-task/about/res/logo.svg0000644000175000017500000003042313543125214023225 0ustar fengfeng ukui-control-center/plugins/messages-task/about/res/logo.png0000644000175000017500000001652213543125214023216 0ustar fengfengPNG  IHDR>1qxIDATx] U_^.F2;X_4tgDH|[*FF|cG*([Eѣ8@ߺu}g̜{Eyٳg{֣jՓv#oQ_"*mLD]c,#%DD4^ YU'x׉hm R j}":'oh8џh|`%5:UojODGѩDy Dt)]6:bZl~}m- E&e->MVDty\ LՊW/&z<ù۰:OD+hf`ۨU^V:"ZhMuzheڋC}mKD}VMZhZD4j5n_`0ܭ"k9 " dzhYk#_b% D3)٪g~L`+r=noDtF6#=`4={u9ޗ^ ^ax9jub;˦_9)m_حVLgT$/QW"f3hG&lo_AWcxAVV7[vyE؉,:"gj5DV+&h 5 LDL#DtJL,Vq_%S΍Sn/,"zjuT:h992GbdB[wͩ_hk3o XvAcX$}>9'D wv'i@0Us<} ˌYsSV|^C[tj"u~`)(1Q:ѕXG&(c_1D֫xscVCűph<W'q}c9p?C9W&v`n "8o<dlظmj?ؾ.'Dc۠?{S}ٹ][V/L(g8 蚘X7D=VQ"sYmFDt:+i xHcڎn# \DD O8<\`cGBՏRW v&&9[:HsR~c}]>D4" x7MMAOў ~P34C`h4AцD;[`>."z 0rXeo*䯴ػۡLsV0̿dPn&2VP{DzCD ?0ѫVo158P Hf6uDRف΂+d" m1KL#zc1sjKq.I"xZg[aV3-KRtՇXvTm뵗IhՊnCDCne'r]!:=MF1juƽXYXGLσ(Kz8%<8<ޗ/Rԉ3NjA震eQZeyjAcsV gNZ2m%nA)oȷTwAo :0Gn0?01cą*ӯj;VApJ phFV`1vxՀ q9d1̹˜+0QghpfZ>X AYLo ^Ч:_3p5eBDWW?xwe=ZmN9edwǘ<L|=:L8B~#Lc$wJK X10`3#H`boD%&[k+'b~ϦL+ ޷8drp&Pͥ+oe=.9˲bC[y, ^/a<7II*VptoݝpYo&\_^}01sҚ ?aIO0#rv`ixdmtt&K cr"OE9Tj ÉX^^va{bۉaG!Kժ&SDN"! >͡bɢȹpGaw)bȥ ^>j1k@B=r^&]ĶGp`?++{g9l88y p'jŞlzw:Nj5I6L8I/Ι"Vpoؙ`&l8ǀq~#qޑ<50Ѽm$$JQ\I# .p1ZG&q+s {6`#(l)r ~b\J0c%z/; L4?弫,`ot`F;VyYnORjX,! hL0 Ya^F#Ku@P_~kbal/rA``afvVt6 @tY#Zm oWVܞP`Ihx Wpi?>!ķVO%%9YJ#! X)",|c0+%EO2~`q S, ~}:) x/㦎ZdJU@̆2.jugB0o_%?$g΃p|Jě\ h?kоX8KRD&veZ#|7 d +azkK ^_r; 3L[+m!kgcs†[P?$K!rKY_XX)b6Ror !U6kZ%@E5 gj$T ;&w 7CA̺ bV^G=&|J/qWc/Bu:b)^r%D3Ii @CX5!ߥ=pìV;yY<$EOj-d|F.`5,XGa5)[\.TCh@}}iR6[~Ф|խlOhg:\W B#D`ǡAYꁔ׵U-z/8] K3,1dJ$fzKq8No42G̹nu[텕පPթ!VQ !SmMxw s!.MKx ]$޶/tM$H;@"9zńI=yyiTJyF#xxR9~hb?Xȧ$`{mU u~njᎄa_)P pݻY><< Ϙ>R |8XF)ǫGɘI"c$.c d0Uu1/Dx_[37pEҸc>0҄&H>#Xp<$R&YۗtCrOf1`[#9Y;<qǘ|i'^tKWqPXRg]("e+l;~R7zfȺ2f49 "z0[PY ds$DZ[o ٭L;O:嘏*Q)EBU/̭<.)C"i_$ZZ\;@~;"XAD|*/c{MP~"}Ιd? Ήr5FC,PHHXn{x{";n ||=+Ƒza_,58<.Yr& cߜk\v\Z,@.^7I88'qBUW #"1c8!0q3Yc݁,E5ٟdngob.X#Y@bp8b?!tN֋M1L9MCL YZ2rt`9ROPʚEb=]aLrEu>%duLNEMRTXº!6DЧi}cY @3k\]RMDH 89x*=0%'sY|ڿL=bg\ }Ϋp`ѕ'2c,Dw1<&F򻻇{7 Ձ†=qm0 cbgQj6WUb&xvf+uy}I<2/~Sqjπ̃w,}-Y"Dnb̼iQ B}u/ƥ=2':/8 WQ yb\H$ 2xO#p=Xՙ/5aQw \84. :z(燄40]&Rppq@fmScvju-uvKmXIawyq% /]Cľ38`Ѱ!vU&PpV i.に.$1ԅ~c?xd^Ezf XIC{PPg[o.S`Lb2Ď>ńї |}R9+y XoH9hJ[;=ڻPv%Rw}\IPQύ!!V19 QRzP=8RN.AHk*)xieƊU.P4+cñRɫN/Fc Ffa.lHє*)k>Ɓ_CcCb&GJ"ׁ?MNZm%F*qq0KuCp19>'Y4B]`pPzMI~nIєji+ A |=B]'‰Yq_ ̂Mqw^ # N1-7V kb=?GRqb夔E܅%ITALoӟ8LD6O6&*0$ԅ` gb ?|:C]/d WpPŀ+ua7ܿ>J4ס.j\є.Cy^ u8,6ª4hJ~[[b$r{cQЫAC&Zk)rP~lyxJHJޞ9)Iem (0/ԅ.`'=[ke%?b`|s*8J?/i@Cj1އ 7#4QYְD5mY: ESzVc^ 3Lr^g+J8g+g5.쏺{"?0q܂!ES&ԅadqPf¦9#k!8hJC]8yQ4 _f$ܵHxCSOŏo90_[넾C ;^Z4%OUQ "9[+am9߄$m bK(á%k5 >/ L.,/ѯ.%?3I^MAD|ɛ}_'IENDB`ukui-control-center/plugins/messages-task/about/res/manufacturers/0000755000175000017500000000000013543125214024421 5ustar fengfengukui-control-center/plugins/messages-task/about/res/manufacturers/AOC.jpg0000644000175000017500000000756713543125214025544 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    !1טAQ"2IaqB#$DT%34tHYRrCSd5՗Xh!1Aaq"BQ23C ?|s&fhbM%F$Z3F$D/1.vv, ڃywYZgR!މDAX=ʌ^{܋DpN{i_'Xy?0@k:Dz76Ӏqv^W#箞Kӿ퓧KT^(Ib?:{#x;0Εm{ZB3yyG<@B %m<.M k#iaнg]HG@]7]V ejhvz3B'|KlQk͒eE*k`p*3LIi=@B,GBFD'ڴ4n}o6gP߶mn4q5ĵ)LXHV(Ԙxۅ;LJ6hI;Im4=mrk𘲓g)dD7”+D\qcWmu77HK4Il_Qwg\*`ڨ-‰MIr[[IIT(TIwj"2[3U]4*:0nkQ˺űp5{aX6s+H+tN_JJuY|Q*j0X3Gƻ4KO%ft\oh<ԗr弈ތH\ h.&_;T% tYr 42ҖiQ%Է6y? 9ld:}ͩ'V[ ɮLӿ xRQ JĪtxf?{m/xu$L8FzkX|Z%2T;DzOWT+Т{a*y {\NJOL 3c|sce4S>J8 v=.e1j{tif/Sv<=[*%#؟4YJ̇VYmOm2c3̼yzn9ϢkK*v%Z'PҞWYȜ}Μ'6y`}wq[vGCth)o8I* t>Ls@~ݷrsOreܿ٠W&z.KpEb%ѨkJ[VJ-!^7'U94VY5@o]"tձCVY#")i *II iZc8cs:ZZd[y<ѐJްMj„^hCk!tUT8B\{J9B5Ւi7g]=Ǖl-#Lٖ#E΂pO'Igiͽ tօoFMMgeu#0&1y„]ZYe8NŪI\iHI%oi";vKC\VINHXdsr2bNWgZg:cr @)7ףĸS/FY#*%'MoZj,j8ѲfKEaJ|ְa:mTWQԢ8$9xLJ8J!!θݿM/MuZL;aYٗ ʗM9m6RNVPp+4Rg2ULM c6^/Vrw` 5Ow{lj~FKv$: @ J?7rJ?7@ v?ۓwM>>gy 6N 7{6<b8~N8D|{]Ɯߧ?VaӅj;-19:trZ V@\[Sr/n@irulN͂L} Ni:D2߰@iթ;HnU:? ҝӬ, um1 |N ;D8CBwNз$ޏ@y74Co,1&ѝ 1&gr!~щwóef_;F˿`#:9 <^A=CS_ukui-control-center/plugins/messages-task/about/res/manufacturers/ATHEROS.jpg0000644000175000017500000001152113543125214026230 0ustar fengfengJFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC  !"$"$CF]"1!1AS"2QaBR,!1AQa2q"BR ?.!A!A!A*mnOx22I㯍b;Ud\u&^G$Ƈd;!p۔[,N6%[=;vAKg\=Q1s>/ׂ3׷lG6ٌxm&ȃ:egp簺hFvX!)$Yr5>-tG0FQ*.fN#FÀ+.nTTvH#XZ"xO74!",(ha.qtruG_Su5֓#*ZZVÊ8HZ u'$#MX~lj~2VE \_Xw.%J4Rp 1jRCDu'^Z)u9..3IP.ݵnSPXLM_mƂ |q|#vZMԺ«uT*+KL[ͩaH8 eEtYm6 aIBV|0.it'"af;?ͅ{28;7BnQ]gPRx@F;f3gWr\6Kl9'gV:!a^ս[>J6:|=:|=Jk/OOP(>O>O%B?@{t?@{"abT /Of%c<$!"B$!"B$!"B/ukui-control-center/plugins/messages-task/about/res/manufacturers/UNIKA.jpg0000644000175000017500000001027113543125214025773 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    !1$AQB 24%5v7aq#3DdtEu&f'X"brSce6VƇ8 !1AQaq23R"4t% ?G4 f,ZϊQ[$+k*V`cUXzO&:]n+Yp-[rպB&UZx[$%cZAfk[Gm=UBM 2KJbSFTdfťsN9 m-DH-Kqt<Wc@'=쿽?v^nY*~;Ry{jb/U@]a9 |zQX8ZPm|9QCg6 dݝJEavFqu`qx&NZiÏȍ244mbHGik}} Gu|ъPPL5hyew߶ڮa3rE&J N}fmj=5v{n `[G/(Du<} =KR5JQ4#?-YE7ҿaU ,_EM+>p𼛼1ݖ{|ީB`rڢW5!,w]p h.SjzWUaE>H)@?T k"@ i_*X`XkK{o\ÇnWV %z@cR٢{,^P=󹿒DO6G^˄[| mM۷~ua/Bzn j5:vp˚n2xl A 3g( MH[W王bJor̭KXU쎯7T$5"%M6yJÄ%'3exhM(hWp| 4%qAo.$mI@Tzx]k_{>؜vRR_1cH=H&z9Yepr:KAMCËs*;/x§qO:l {瘨ݻLiYi$j[ixc+ TҐ #xg7 |H5TzڶuI[hȓYsP9i|Ѿg?VfEQYEO_h<=΋[jǛ[xe|ީIrڢW5!,w]p hkOɄ@-e-YE<.0[J^hbt=xm{ xV-[qʺneAZ[fFT&o`+U[h9d{֎j fZoQKY~f^:TcE8D׷bHY\,ŞnƠ M2zDO("W{1;0ng;{o<of㞌y?\m&hWڣu3&5#ulKFѨr{Nڒǀ6ϋi))9)9 8LO(97p^+Κ]7i8]3 S#fO%&[2iv\ ]]Z^c(,r50ޯf QbJOw%v_PCau^ї)v 5cwӄfx.|~ %z@aX0iu-"a{jiV\ɜN]|XE?n@G_|6GWی9Za/l5Aڍc Dikewpñi)r#PWUpSn="eIR`bS&[T$'*Z[},?QxC&^>bc˪R7 %{r1w Ŗ]&ٻM&PWG% fmf ;,K-J6HFb7&ZBxlTGf aY%RPX&M!<EJs+kx>nËgZt/}#j^T7,w]p hfd:Qgwpod%{Ob 1ҫfbԊMgtR5EP3|BMH~" y_8J[ޒNwq%9 ari}C5`c>Ʃ'5׋$fz 3KĀzﱐ&DOb >mwz-~i#9<>^ %z@apXy{4ŋcy:]kfQ > pod=P{Ob 1ҫ5ТDZӒF~&5_%0㍢QHCKd % #À o/(>3bNJcJ3Q)*9cGsi[tV_7„EQ"Qp@|4USI9w\vx܏S 7]+'=]E% }< Sۉ:g 0,?%X䄷BUr.sqXx(.m*{)]K:E:1ƴLAP5R@C!aPX0iu-"E:>VH -tmUr:-=PZxSx9k*6:.~_e^nhrG!ŞlٷzGN}©t&c#\ZBhvŽ( u4f8h*ƭM>4b/6pC;G^jr5ݥP@>U4$k~&PS[Sg6TM{{1^F|o^8M֚kjqyj?\#AkoD5qk\ߛMz{`1I%vջizAEsV/:(qP@9zc4RCpEfvT_/4CZ)mjR(n"PrjS ҙvUM!f)**!p]pukui-control-center/plugins/messages-task/about/res/manufacturers/YESTON.jpg0000644000175000017500000000746013543125214026153 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF] 1q !AQ2B"$a4D% !1AQaqB"2#34d ?&ZM~T1H&U$R RA5𠏕 Ou)GDϲer)D RTi@iQA%rAJ;S*~<5MܲiWM~T1H&U$R RA5𠏕 Ou)GDϲer)D RTi@iQA%rAJ;S*~<5MܲiWM~T1H&U$R RA5𠏕 Ou)GDϲer)D RTi@iQA%rAJ;S*~<5MܲiWM~T1H&U$R Rd,v3ǚ9ior.,_y:b F4`#S&Xj-޳rW vrˆq)!2D1M/*")LsLa:xR&.$ҢJ:vTy*jeү*|ztt<6I9fOIyceb뢌` w$m!RO&)Hb=[nՌqkH.Ċ%έ&t 9[ 5p4ȱ20uUa9o;SV|v35f<ЕA`UqLK18?T w|N" ,eA`7G_ d9K0_<_Y|kgٹ,!-K*Lvn;e Ӑg6^)Ubq:0"5ԎܟN Wv 8ɵw9}6V~Z2ՙ0@gZ^>Iu;jcgX p^2ҳ»o7RɥnV3wnwńwisW=܆NǍ|- eIxǿӍě KjFF^T|ai31Ʊ黬Ɛs~Nݟ.w&o"A9N0@z9e]-K*t:U"!DxJkQv1Z#iqWya+ÍH`KPD[B ApmjُI^/9C;l"` -e8F[(I  r$[ !\w ܃ˁ@{?vw̝Umo6~h#}ٻQaA˹ki̶oY4W&*B$^U*)ztE PGʐ]CI~P2uIK4 4t?JYi4ʁW&*B$^U*)ztE PGʐ]CI~P2uIK4 4t?JYi4ʁW&*B$^U*)ztE PGʐ]CI~P2uIK4 4t?J_ukui-control-center/plugins/messages-task/about/res/manufacturers/OCZ.jpg0000644000175000017500000001064213543125214025561 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 !qAQa"2BR3ӔUSs4D5 !1AQ"qBa2R$VbrC4Tt& ?ǓJ,qS_e!Ls uIdA5]H&^<ԥKuCe9u$TTPd.QLw*jتiW&B j=T"M|R yyJ:$ $r)FIK1 4N]=ԣ֙IT7Uү*NM}1$]%)ztE z(#PRtI/IxR WX Z l=pA&Ψ-Ah8DmrF[@;6#\k:ˀ'Ol $/T7Uү*p^fyy{0.'T'%̇F{2e;2Fv)\N% D#3O<5TO,Dfq  < 7992$.僜9'-n+D{ᥑ9:2c8#k!AUqKq-?0~ҨDŽ's"?;0Z8*W^*3s*,k174K`P;}d$b?L gX59M,_޴Vm*9Zy&$9nwq:iEQ&%#0 8pCu>tg6n~q^ xϬ R~V.E]婩bǧJ*ۊDejoL'}V%|ฝ' t\bV;cߦX]!8 I9#[:%FF{6?UmSDQ[VJr]_9kc/ޫ0"=P |,9X %ב?)s{/!ڇZ32]4n\}$k/%;>%vc3dtLƀD7$Zb JmpO䗯 }%}X}$|Xz]q~rr=}x,.KR eHT#0RYQI0׾ꮋP9h$!OK_2~DPԪ(c݇O ßo/ #8|ŋ&ɞ?A[n?x1iczSRrK8}JX.Uү*~:)''nHf%-]r`4_mDxߒRDS8,/m{mir}k-'vKCoUvѰ 0zql£Ǭl#8S qeݗmC'M;;|-~OnݝgN6W=yZ?u_3`\J8̹xe3O¾"( $msSorT xKmbNs[vwXڴ_+5b_!_#8H9xa۽SY,cn3K &P:^1s/I8ec>?F̑&ؚ=\3PT0] qch![ǹ TG6ܜp?Y ypH!zr pǑWSXfH/OC, KW34JDl#hnǗVV:]Pʎ4?Ti@ Ю'V JKKu[;~}?bI ]NеaZkjxS2 k 2*a,B1bYGb rNE8df?0GTD=5V~Vy,o fx z1t(?R7fQ|K6x,q=Zso2VDmKTf֬ fK8I&P! e7Xr3PD=$HnDCP ٯM`n4Fn6l=oQt}GUتiWjnm-@  cvH@tĜduIdA5]H&^YҢjnHW572$AbKBݲqh#5 盗_N4LKŢOh[4Z6֠?AXr `ikuI(Ų phioPꗉDF-_I2dm짷=݋DM5)KH}5MUi4ʁS_e!Ls uIdA5]H&^<ԥKuCe9u$TTPd.QLw*jتiW&B j=T"M|R yyJ:$ $r)FIK1 4N]=ԣ֙IT7ukui-control-center/plugins/messages-task/about/res/manufacturers/PIXART.jpg0000644000175000017500000005647313543125214026151 0ustar fengfengJFIFHH ExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:03:13 13:25:46]F&(. }HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?}ѿ~7_My"Jů}ѿ~7_My"I}?U}ѿ~7_My"I}?U}ѿ~7_My"I}?U}ѿ~7_My"I}?U}ѿ~7_My"I}?UFǡ^vV@6dv@/ǀh7o?Мt*1}>[?ދoumkYEGX[?)v^߳vQΦWТtۏiUkmf(nõV]8url542}>7aM+ToΛ1E@,kCֻwl#@Ia xeb,ͮ.I*-?u4o@ԍS%u]u|OsyrX=Ċ,gfob1.ƾk'赩OܼӍHvS֏-`S-*Tj#CKòddexSr>׌:afVuaerCӣ#;ҺvUYp ΁w_Xz[?Ls TfHQ&4.?sY1dc! ч3. 79k\{9\.(c?֞i~gˇ$ rF#uOKQ1ϳ\G?zDȹZ% ^"5zL>ҝ]0]sdocK {Ҷںkec7m.cK]>[/[_͟blZuMږ{WNpĿ7VyM f_:l'$k to]Ӻ'7ن)}h?YnmX\wnC (lȩ;bw??+/?p敜ӌv241{|ڌ8L=.GlYsmq;\oVο}$x(8'gE/؝kd6Wh:/9I˗&Crx÷ 4QkmbǪMncK].;~^p2?)~_'ٳ"n^dzH f_:l'GV_Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$`Photoshop 3.08BIM%8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIM9F]N-Qt]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM ]FL }JFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?}ѿ~7_My"Jů}ѿ~7_My"I}?U}ѿ~7_My"I}?U}ѿ~7_My"I}?U}ѿ~7_My"I}?U}ѿ~7_My"I}?UFǡ^vV@6dv@/ǀh7o?Мt*1}>[?ދoumkYEGX[?)v^߳vQΦWТtۏiUkmf(nõV]8url542}>7aM+ToΛ1E@,kCֻwl#@Ia xeb,ͮ.I*-?u4o@ԍS%u]u|OsyrX=Ċ,gfob1.ƾk'赩OܼӍHvS֏-`S-*Tj#CKòddexSr>׌:afVuaerCӣ#;ҺvUYp ΁w_Xz[?Ls TfHQ&4.?sY1dc! ч3. 79k\{9\.(c?֞i~gˇ$ rF#uOKQ1ϳ\G?zDȹZ% ^"5zL>ҝ]0]sdocK {Ҷںkec7m.cK]>[/[_͟blZuMږ{WNpĿ7VyM f_:l'$k to]Ӻ'7ن)}h?YnmX\wnC (lȩ;bw??+/?p敜ӌv241{|ڌ8L=.GlYsmq;\oVο}$x(8'gE/؝kd6Wh:/9I˗&Crx÷ 4QkmbǪMncK].;~^p2?)~_'ٳ"n^dzH f_:l'GV_Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIMhttp://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2012-03-13T13:25:46+08:00 2012-03-13T13:25:46+08:00 2012-03-13T13:25:46+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:b3a0bc81-6ccc-11e1-818a-a659f6cdec7a image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@F]      u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?s}u_e~ԾqOsY_z]{}u_e~Kd?%߿/=Zh.?>~2{@u?4^gc?]W_R=g:V? ߿|Ld{GO׿gyoGUWԾqOsYbէ|3+_8',^sGAuv>[c/~ؿi9; -1?K?׿_z]{}u_e~Kd?%߿/=Zh.?>~2{@u?4^gc?]W_R=g:V? #]&~{}uݽu׿uG=uǿq׺RC+xg^oΞ}{Ekӯq{޺_#Kބ޼tZꜽtx6"+0cqMeK;Bt1V|hzbzYinhOq=\_W|*=6~|ij:,Y*|cH<{ ϸ󒳼|?ӏ=kFDlZJ.ֿr FjM(\'jsuBO| s#Ro|_SwmeMuE Jݕw,o1E2.]UDXe$0 ob]wܭRHU֒s>Tou\j*m)]rWK+b"{!ݹAedq7CXs\+\L+e,'?L> uɎs SunގjTTPo޺X}Z Њw#\ͬNkvƼI<gY63FW`w?IGR#qn({"L6ގ-ZSp{oɾr3\nh!5)ZLk.״K*}2 ~,dvtw7 >cfo R,Yj.g 5~x۹ꡔWφQW5fʛͻ[_^70GV{5q0׊GUbNR)1S}EeV6)d*Aos PtIZ,b 4)Ǥ.7p|X]O8lWgisoU!cOJZ1Y?qXklT8+u5)㪘64Բ% T$T۫7j1ފ˹lIoUBk¤+)e2n\, .'vXF0?ըݷ^޿dg{_nbOmzJRW$_$U0tom{ok-psh_L1#, j+eh0/q*@&JyҔvO *wG 3.micl;V\vA QV! ;o[wÔ%[k:K|L_ c'u̜7&r.۳-Tg @Z#($@?g..߽;ۖ6M.Cxm?Oez3+B*̌551Ԓz=\o\'?6$k/n`֏XNQ)gϞ{W7ɋa̐[p־*ʅ,Hу  p|L4?7+Kj=nzw\Jד{jmʼgr9ZHE<f{ $^{y-ٵquy<*^B*WֽMݷ }c3191pF3Dn_'_r6+?.Rl~q`ZFZ(ފ |sѤkji&J Y^eΗFbWR" d* i%$itfo tm;O 6L=^wn枦H1RCΝc[~9;mX eH,%3#Du]5 |~B]^=ɺfߔMǿ^ž+"jڋKID%gl~{;^%R4报jjkP8O\"w՞WrQ42xE+F*~X|o=5 lnjrXܘe>#E,㪫JQYԧ\ g7/+{]]81-jޣ*pX wؔhAP( =QiPGӤQpcyR[)ZeĿ{OnOtQoZk^%l]Fc#G-UDP($>S4 m#(KOGT]kktnpS7Eb,I2?+.?Qhryu6xb(P3)a{o*Yr_z>9y{qʎ}eٝGK^ثlnFlU*,!X5TUr${}}oi%$,bh0-:9nx6{yf[u ė4Z/-ovO%[K ]Gɦogu^fT(+MBrF+5 ȉB7|ļWvn/d^vcTiZI{fw7ncAwwyb4$ +/%ٴK6%F?iu.xq +7_W(A$8V$Fo|}vBm eQSR|_+{eϴۨ$I(eIAUgBT+_勴{Ǎp{-3no-2CE*b9ћx1LBQ9R$b.H9fٹzۑjmv/(TW̓\r}zͽq{|[ZutVƀE(ƴA:O|Q[ىWp;urM-'UoTSeRdN2I2YFѯ'wc^eߣzw qw+[h H49?.ϻOw>qGj9w<[f [˵["LU.CcӳĔ[yTW=\C&'U]c3JUTY7&y] ݯ6;[Uy$U_ԨBxeutn`VﻀivU6KGFwF.^dJ PPuv>M3=]YpĂuW\OtURji*gWe1D5sۚn;;2$-lÀ"UQ@=s}/ܝJV[_"p$KokgUI(&I^=>g~>sw6l dcyӚSA-LkV"dIur=/fܛk-,xʲ R$UW%}~kj'ݬfkigx DQx'M;Xv=˨ZTBs6;]C"4{|T] F DqiR$&=J;rܹqF.#AE@j|"٭O´cNr_S7~䟟A?˯|Wyc&6u_Va2;z+4MG;֕m0RB I"(yλن6nw.#FIg4Oʧsv$yt4 3|W>&o ɻM{>?1YJ|WNm^%)r,<.:9֒+#5Erߓ}=4689M|ztgg<ǙZ<?@1>}<ɞΚ"isuT[Q4x f>5>Z\ wQIuy?2kq/Mf+Uz*&i)sP@?q߸O6|UʀөCMs_3W3n_Fx|P^]xČdd [klQ$fq1"IEJ^WMV[Nvt{mIu7/6 1ny"g)|CAzT}RT ~?c3xNu_U,;۶4C#vֆ2p}iܲ @'$`pM2}y֯d[O GO7ַ<2u hi-HkJf`k~JuϐU ڍM՘L-M XK[ }߃]ڟn[ }37k%C&;uU L[z?j9uϼqmšHN>=6l[ {;SRڕv㯍/N\D2 3嶁$b{{u۹?d,Uuemѵx0m?ZQ¨ԑ}Rmvӳn^&(+5D Q5Ҝ=8tY+#Qjk~XL|5[[nOYeGE2͕T韜=NUYvKIXBDXc4wOwm9p'B.e?JS]SݽfuzިX1w 81#~܅lr,r[iuZ~Qt0/d{;a^߇mu_km:}~FwDrTɎTU\Mk)Ovo9Oewъtуm sA҄)VI~=Wߤy{T==Ne/MKl T|#'d)d#̔{2>[v9GĴIy˛c6$WSAhbϣ/;,8v輼}]nmѴq5jvl: v4ΊU w~ܡm.fIЉ&)pJur}ʮ9Vk6(U5L1m,P5DQF ANK[qo]y ,Xw iǞj<ImcMm$ԗ\ x%+\t'=mpmv3G"b8 OˣÿW[ݫ{#v.I smi4YbTM+V:y/-O27g3r(tt&,rW(XW$H&?0=QWtߝ/SP:S+!@8Ɛ{,F5ѱXqƁ5P@0:M|/^᝙$k 'bvNo~?#Y&3rTÖѳfHWpfȥ-5-i *~bu${/1u}C܀Ȣ$iyj8V{+(78i.T5|t||Ãjudufɟ=-2[wFf/vUVMA7NȂa āDv?36qodWut *蠪m#Xmq9mRTՎZgtK̲n  @6}H{]U_?(A]?޶\/?*eſ ~漧ѓ.?.?GklT>L9l?>v-ٯ? X'xsD/j)NMl?gUіp@Q5MGABo&mUl߸72?o?>6|cUGoa@vngIemh8ifOlCwEFխk~v>ُ==LVmHJ_5kU? ĒtGk1v/9rb/5|L6ſ+)?3At:G*tk6*_w2?_5@m\.mu?>~5/'ω(_={T߇9r`潳ʠwfR=adgGا]9;ͳʠ OO3#^S߿MfeP}{F['ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ukui-control-center/plugins/messages-task/about/res/manufacturers/TOYOTA.jpg0000644000175000017500000001073513543125214026150 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1!AqB Q"2$4 a#DF1!A2BQaq" ?LsLC) >XPF 930`!`t(9sBcmee@=AĮ|<ٕU*8=UY2;JdKWqgR &qLmmV`6<}/{pkig_n:zx~'+yp\]]V4٭Uɟ,zP!f>NB0L.aıd91 \%Pbsh0cP9rP{1+?v6ex6M7[A U -ZZ qq=K294-RP5Ig`RP!DCag mܸnR3Qg8w*|=+_imn/Z[[}j{wbVԪ-u\A4(9ԭXpsHXPJ @>:G㼩ž~su.zڮ;]6jv\wΰCf>NB0L.aıd91 \%Pbsh0cP9rP{1+?v6exow,>oSgLJۦǜL:}'ilքo`K_[m+A&-I+՜YE񩱽o͈X(Ofc#p{TɬI4릎v)In[;ݽF(@MGVLuV\a!&CsTRZKs pIm6k'$RggbVRUwʙDpQs:^CԲdK̑23gX drJݟ px 0([pW&.79](V\>;%W Doe|NR2ǥMެʄZQ=ź3o{Vߵ I{5YKg]A\ؤR; n3υU܈\"*xBf "7QiinQ$vbI3V\:+"T\m]X* Fq\CϘc*f0 XT\J('ݍ^>j?Snx:="ϟnICDhGXtW=XZfլ5(+p@ SHLU#DI]hVxWeWUB!dx}@⠲'GVC#/v S)RZe)J;֨+/̚;}Q? ڊ&䡆!k΍K΍` ҾA9DP j,1_$(nJj1,NgDUDgN]H!,U= I4o*pGg () _*":c s&^V #FYvj6[+Ke9:Xu Q.L%G6U,?(قэN0$P=s=DrYU%G HE, x 6h\U( -OW1ّǁb]d+KbIJǁU&RawW ~\񯖞񏖺{%7cfWc:򿧌}?ަD?;tt?8|/:ileֶKjY3$Rc[eT1E8&ZreLBquR5"n{ Pە3+}bW];[.2ԷDy-HrW'698J(=~8.UAnDWF`RϰL 5|MAW˚>gd Uwd!܀M`1|KOp?*Lt/s;*l%q[kJ#6p)Le2Q" 3* 3/;bD#P VP bJfH$6 ap*WFLZN ): _hm(Hضw% aaeYTqt:NUfRt@΍l$TRIˆ`X7HTV"zUr儢D^A_%|DIf'Hd2wu PaHC11gdzЧk̾ef=i$ALv V6%pt-k){EWP<3 V֮0=i.m5:MVҲxb$y\+%cY ,-"y{\N<ٕsS}WbR,5:!ej6mS m3xligJc1pH@8jQ8lRmB%*:%Ify+9D6XkHG֣ZU Zi() %ĵ0i&ړ\eІuƙ#1rrTbYΉέed~l*eぇ&v! ,k#}X`}0\щc0sc: JK16`22rbWyA>~l?ukui-control-center/plugins/messages-task/about/res/manufacturers/NOKIA.jpg0000644000175000017500000001137013543125214025766 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1 q!Q2BA"$a# R%w!1AQa"Bq42R$TbrғD%5Eu&V ?M+$\ cxH&JR RA5PGH.RpI/ ɕ˯0&.(Ңrtʟ/?uLSz-&yP*HSA5RW"MGR >Au/I~ nL]y(0 )qF7$+@e(Tybбi4ʁW&B *j="M|R y}K?eCrer)EɆ)K1 4\`{)G2SޅI^T \ӫOԌbwCۈTxaΌ+n +o˪~x}Ҟw[iM[Ui#*1P8oiٮi\LA z,5M߂eNJ[=UۻܑJ<߷eBͬd]# 'FUH[a5RIn cCۭoKZO/|{Պ^{G~.LAl3YH>=bxv53~5P^[ ػ+vfuwX9J죐qZZZA~>JIjǤ+kP.Zk}<76NrS1ꨌ*H`mX_銪˕Q#EJ\M^n[m ;ƯO-r23?UL)%khxd(/{:nu,A.F$in81;K1ˤgI"@$5߀kTyCl$0$"gdUcK7$<[ׅ<^/ *~=GCp'ѝTdgL$)-kpY`cZLG[jޖ[F:IxvGp-!^E3i&.P{$U ⷻúMn&i]t͠9Tk#UI#x5mX  ɄBzJfP:̠Y'~HvZJg ;z AWoGסǻ^S-߆hvj̓s WA'GJ|ڏs+?>5iBշ 4a.%-m<:aP)54u9 +7W-Y_^n(w./9Tt%U>Y6\G?zY~ PmߛRra6KP4wWW>Z5+Oc'k/[Vp' +ߵY²uc;NN5X-wwSĽ,omV @0۟@pnYf/ EX&<+`?WW8|Vy,w;zT{̱d#UV4pǏemoȻs53d<猰쉾)'݁ENu6Mǀ)D<=Hwʚ{(i|Wf2r~Kƚa Ī%1m8KԱdivS3"Z<Īp#˒ `i$}cidJbX/p7th(Dw/JTk -0-'#dJB+!|,ȹ }r=:qJ3c&9}1Tݍ0M+c Bt)xSW3Kvkt^ ѵgqL}[H^ZOC1t&<ظp]Xyxбi4ʁZu J-W7&~irm7Xzg H S(LƜm(ļRrsͳ ƾ2I B@%<2] WN{ˁ) >>ll|RrXI![$~@+BJ̱a\ `\ԕxdvkǺ[+KWEyi+&0EMD06;D[`jӺڞ5X)qN?^ޝQeڛ5:'/KR2N$J "YسFo._yPExaOCޛ-8:dQ1gǘM@2Y;xes[FJp#Jo?7slƋ9s 5T:WSP% ,+ sm݋g{nc@`ɮYY=#'xb+ :]_PH71ZGq.$ AV[2FD,68rl1c҉+JQRB])U\(@7C~?x(d2E9(" i Nʯ(q W@>^~8бi4ʁW&B *j="M|R y}K?eCrer)EɆ)K1 4\`{)G2SޅI^T 5RMyTȤQk蠏]C(_9*+^aJ.L1H \QE;J<>^~꘦,ZM*Uɯ7kʤE e._/E}_e)GAPܙ\ Qra@RnH *(.W.QLT7ukui-control-center/plugins/messages-task/about/res/manufacturers/ZOTAC.jpg0000644000175000017500000001433213543125214026006 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1!AQ"2Bq$4& aD% !1AQaq"2B#$% 3C4D ?'Mt8Zuj;jA:H'_TofI/8"]!շ :j(0]?-]?OrHy\6"%keL^"E]1;"G@TsQ/XN*Vc bFL44!tBgzJT V4cBUd ?-qP>W6i䳭VۢRyHVŕc w32!L_&na[LYӻc%s\WekVQ5OuM#<#0GkXР~IqˋHc1[Ҫ׈-/P{5 $yZPi) ;gOk[S+xvFԍ;V ݓ"la:8*;N+9,+#ʖ4Xs::Ǵt^/-VC?pF/me%of4UgWYfeb1l٫*4ԅfYzOctf̔ۆ8m* bS|Lux]dSW8uJ 'ݲ&:0^o.nE27K8b} Ǯ2,FU"8$1懇8[ĮunH+G:pE^?O毹 IO$ «}g ɪvZU'RaUqU/$2)r?-8.[{b}#mדuP>G,,+gmīmHؒ9s$  ;* hk vfrŮi5,X 7#B? hz4DVibc\j}IRDR՝t8}K@C%vJ/ 5[#U!W4)հݡ Nm)E4ḻ?V;Z?>krm 2%tW]$_XBT" Ϩ9Ph;xkL"⿋LzO1EZZʎCy¦ثHT€j"Y<={KڞF_1^M'AJ#y]S&/Wo,`&{Jv1i,)|:hcH1R<"}q +8z9|AvWyBt:Ue{wȯY9^%p٦1-ډ x)(ɘbcnboBR//zYq$ZkJe mˑ-E ZjE܅駒e&*8o.HFP3,D.B&RuCDpѯw>MX  D;[vʂϴ\KX" %vKZ䵕q>69*/wuqj`'u,!ɹ|Q3{cͰM2Fl1k~2"=DCV!e{@/qbLO/Ʃ_9W6&euZN0*hXhMűje-*Sg6AV^ՠ \C)sM׫؁Ω dMOaJ$lc 'vvԽ辊 T꘾e) OQx GN8\ }['K[c+yvq|9J"|Da.*ٺcOB1JA1(u06ᶝ0x$`I,̜E-l'xwfYlI'6=D(#,= D"%@< ᔚACU۫p}=aWrX6) +ڳkr`ylH[NƠ!|CmOu@^1Vz ;zҷkZ|e{I^τ;}RCCqNTlp)L$DY \uQ\ yv(~򯒗78Z;ȵm|D/Ar/QZmvڃd\Hc#A8c&z.3nV,h5>gI[*q$=H^| P ʘRc]g[R"nt9[>&i~((H }۸mk\]V. ND0fI"%0I~/#M u{*؋vo{9'E0wo7@=;JYt.[HQ9|+6,X5D$Y!!^5z??1¼%-w%p ?[2[M)@<pwE0DWk+^C]-C!Ix3Ty efnm.tmc1,bpƭHPjS8DEy%#$ZJmR e-= ҵv@&4g{ N<%խV^4x??ӎXIZ4ip9 8`XB~oApZ9Nˋq m'EtjTn^1@a%ۺON\y{Vd  ɱ\D;3 }$"oޫGM.}"8V&n`- 5%pT< "-`GJ`V?N|T'mm0b;OXE|V[/aw8! H$pYZd8x3>6G;l̓"evğ&R(s|\ڱ,RqwZO2.%r5T_bpQ~v ʻQLʭejBI#F{a wqDGZ51mb`q'lka$9DGls_cbA.07yɭ\yn5v~)Nrx mw, hK{[""ddVμj ؽ͟((acħm}DķDJ%k۷rgoZoaw"ST HWk?Nus hxkzt }>*(v&̹ǒ[K=V3նA+V'xN+T/Z%(-^!BG }m\⹯!eeMy0x]kV@Ť; #;s3b˫+2^[ТlJݠlloj~e|oBi&WRn? G۸m6NbT`-TfChZ̕*#V m|ɱ,[ɉb n/o.~රl~\J>yM28oI,{]1RZ/.5\ I-&\]i[asнϬk`)u%VŦŋS&l'` µ4z4b}bv :Yt--,٥V~3J#beP "#LPL䛽JQRH>O)Kϻm)x|G&wl\SK&|)[#HLqsZ_QHs,XpY->Dݠ;܅駒w'_GQ+R %jA:ڥH/P{4%^JI0|^Ќ Ԁ歸)QA^hG~?vhukui-control-center/plugins/messages-task/about/res/manufacturers/CISCO.jpg0000644000175000017500000001634113543125214025770 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    !1 Aq"BQ2$w av8:#346 !1AQaq"2Brs$4783t%56#Tu ?&9Cqɿ` AٌVQ ́ cQx|oь9ADlm9A2˸<`GzV3l*n@brosA7cn(=Q iǜo-!~|A;_^żn'<1ppXp5c>t1zsç#b~(NSr^l QN]>(|^ȫI \Q8;U*q]\@D(EB5D "0v` tΪԂO@qYvW $65æk!O vtWI*9;J(dgܨ[/{D)C,5wC*:Mw ˠf6K>DaPR[I: gP~Fcy:ј)|"jdhXWfJjPMI"Jb JP,3薭^f=#6H*n5wedªU,3ϷFX.y11=}!DGiYA _C]In8d~d%"3gHХ_?" \IYJ;9\8}"bCqZkh65rDKpFrխ+j   }r{ǡ+yu)\-4KS b%OVW:HPRe06E]MzUԦ P\:[Uw>}/++LkA7[E1`qaA_n jOl,F-7uYk6 s1eqJOu?CMjڢԹ_]cσ_HXus=h^[d╖m(Z.cg"ڈ\ 98p6ajgUӟʔgI+/ qI3`Ǿ?#o_a{fe}N[\qJ==sa)a/*?ݜu?<ܛ]n,1hTr(EMiKB%d=3:%9M@CψG5ӑp#VM3U>vj)X90#Q}2ԍ-R6h)!LiJYeښYY0E]n@,g=1lV[u/d1 `mVb{(ѧQb!x!@0AEN\Q4{ycEoݬ纐y9I$f8lmxhgU{hrk:Vnf#+&^!Ȓ jK1N@HS'WV+kPA9J@ϗ:%m#U:w_{276Оmӎx6WpuWm׋d~(cB! LobC!V&IHD]s,BY,闤ecϔZ*O_YT'LDaW>k}&(7JC7tewDc\IOJ>2l xvᛀԝa| s*51U4#ՏWD{hd>-o D})ePnhfjAD($Bb iwʊTfIzf֞ ٠!9;Ub吣'Ohm*'H˥a$AcˑQSVvnYf9*ORSu,fN=~ohjң6nfe rNەOn!2{ob{J-ȧ//wyq47S`~!]s;)a˳,bO j߾?'z.?;1>nwiW;.^[a 䟇~E.=7cu[kk/:iҳ\"ETZ- LsۢIQ:1AVeC`n@<(p'oV=ou7P6$5-G`y̒1">hzdwK};*MLuz՜w ȉd5iJaea*dE(}>S:|N(S-#z>U&CP$vN>fvu{rl'RD= é7֊tZթȌ1)8?zYbd 8z"jFjؔ"nŻlޚYrz\}\juAJj *eH)AIPLɐ(Ş~/۳"Z <"¢j!ga\j`QpEJ/&C{8]/o2* yI :uVvi\p7[-{ MR2oo%UiGURȭLJ J72WMT=0ō/=.+b Db*N$F!*|^H&&g#-f%,&%%G ^eK}AߏGٵR7Jj7I]?g"$qPM}Z^P^P_#y~rͺ쪒zINJEvԄ.1NTbciQ&IH̞Oi9;\ 8z&ѷHH%-g% q$HL5]MгNѥs0\V\5'#cS$%:/"Xcj* ?:^?(-fDa0NRX1ؼB˵Q}q"ˀNXE *JKy%dL95}QmMr}Wrx+ol9NR@ȸ<]R9ʜLL͕)]P9}}|u)یKJNLe3Og%D%d+^y|N{ӂr"Nݹ*lX^lY"PB!͗옡+˕+mK,&GfxU ]-,ݎi lPR1Sd=^ZY ǑI#ʨpE `:*2RQ(:Q`%dGnq+5ѹwj9E*Fxx }L$._W슴H?JNWNiJ=[[faYB;2Y+sFDָo H|xYAN*Xt["Y: 9NbկͻЕƬE&0g)8uU+;Jm\ j+2 P`6MjZz-'u@O Q8 򘉟 }8[+4᳄+L$HZ%$) VŇ?tê\6=]:䊰i+),VB!݇+eP`۔Vxa^5Jd~PwFP!C5+ @Df\㓸KbPR5R.URQyJs%+xoL& ))uosFt1[_=m=@˕S}W+kt&3HcOT+"EX9wr8X\+oU:XmI\S.H -]Zݔc>-,gFտ̵lD$ ]?5_%,8PcYRekv`Ku-"%3 xa陝qS->91n:{~ H(JUOfB`(am,tͱ!ƇiJɭi`q/.!7>FHt [ӄrWÖZMPiT' f^"k8 pp%+yO6슴:ҫEJU4ABuZz5J$F*juiT! S8)$*ɗD.i׫][LVgq"5kFmlHMt۷W7ﺭ!'쎦x%oBaqQIpٳ' NzJ<'i}ta1iSػO1G$āu1R 8J.QV~AȀ 6GU4c9d$"xypaf[+{d)X)%8 yM*?#ơ ``#JZzՑ4ҺҒY91D3qoҝQC[ >,RqQ".RN-RN!DJY7_N<ΙU X.q癌g;+QH/rF*aOx{pLzCͰ2LAjP+եZih7ޘ#AC@:&Q9*RܥI6wc|lTNȜSAE崦.҇ 6SWi PdPz^ޫ7М57^1Ar]hi&Q) T0R\8#c]Mљ idPVo_@ \!wj6|c!<^>㢫0Av>ZN)։\ڵ))#Yy%9b կ8Ɂ?3:emkLcHD tKs)@GufaQFO([Z֕ha]o=Dg2 `0_ˢLS2K>im)f8е*RLJBY5L E[ph`@Q%=_A6zp4{fTDi tq]azV5 i7a| 1979 17x;#pA7lj7`c{ 1((C2`퍧( 7c#Q9w>`OWmGukui-control-center/plugins/messages-task/about/res/manufacturers/ALI.jpg0000644000175000017500000001045513543125214025535 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1!A Qqa"2$ #GHS4d5u)BR3sDUW8Xh9 !1AQaq"2$4DBrst%57RST#Eu&V ?Q z #xLA3d%LA0JL}bCBf(9͆H "QZXޖ[ RTX9YFNuqle(%`IGc5Sb<: LJ%}bCB- |2Ï80D4j$D`Su`օ@ai!*'5ŶZÉQi[_VITH-SSEc b#(V?;S[)ugWld3?"PW mW0MqPб&L>{LjɏҁϭEe3CZGMy!g!!wKHcc#Z 8FO@R]Jaȡ0N ŏQ'OiJ6jJa Woaoؚ# j 2<%B֏_^}xWLbxJ/h'~t?F`0~`Kѧ^tIQÏ/ջh5FHn&w,m|C}[3|Mߜ^o8f~m˭3XeuaS3!ɃW?ɶ]GNJm>SD_mqlGZ<>K?RV`jﵻBB&߁2f{;e4sQP%( 40pfYL{/`uG{ϭ:I~@eZ> XNl:fXɁͫkeT;S {~V, Zg.cτau] l;J_oN w\&P%?)*q'd 4pa|"u+gӖ.btZ3lF,`;@X}x R_gc聤9[dp7ucB|U[ݘ@K\(4R "y%$HOT q蟡sVo4 ?+u [ʭn?k\ngb1QAf?"w XS$Siͯu,r/tj/56˰,|u7uU~#]vug{joo>*OJG-pϰ^,pM퉾+ܔfYU v{yx0 ;V@ngyd_-VRrp*)Uv2ΝVl$L|Irjq zeOȍ9'k#DzFFANjf>"+Y˧(k,= r;b(UK= APs :ZpQYjF2ڵc)nƩ!f# 7"n6S+uR#~ U4ifV6"6؄,:tϋب|Z3==-QY䬫,[u—ᵄO@)&3e7_NaŞ6}BV\z'8}aN4ck^1m̰xZqMG?N%QLmW׬́$oKT)NP]TY`J]"9;0Sh mSCt[V2 2j$֔03 G_kkgtOg}VjEdOZڱΈ/>,*y,lF.kٞCMCBmk-O3KmLe44(|t39Gҫ/-Gk<\Y25ZpȞu%LeBv_[O81:v#L[䝬\U\ɶ~j"5\5RF@`5=[^H8F1ei9gwR+#讓IK٩|f)鋈Q/$e|mΌ~V~neyDɓm3ɬw+,kH3a)KiHt=o~j봵Sw\ɕEgj±PP5j``,k| U*X۝jԚ+>awJUQ{5QM"U7Y/!Y9H//ťF权_@!6Y^>>Nsi'!W*Q}HQЊzFuZ4c&JwX 5rs@G"$$8˦59l,z`4F@M0iA;+øܴ l_@b z #xLA3d%LA0JL}bCBf(9͆HCaA0BhJ0!02q$xc"cp:( p&,8gN! S)|X0R¼ E6(cQb y&*b GBTdKS500Al7"Gpa"Så,&KR@64A-1E/ukui-control-center/plugins/messages-task/about/res/manufacturers/AVEO.jpg0000644000175000017500000004117413543125214025664 0ustar fengfengJFIFHH'ExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:04:13 11:27:44]F&(.HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOUK|.SHhkD?Eo+7YoUoNF}?iԸ1{鼼#AO]{8o;-{ϢnRm̵W]25V]fTz`:.5ݏKjlᛄ,Z<#p D8}%?Q]]h,ǥm eu_X2ǧ]6۷W-'cc,o}iÉa5/}鷵Zvebǿ8 @,Em/O#\~>O]~ٶ[_skdmvoS?$7Y^+krG2@\a䗑t߭YԱfs\ ZCΕ멙9yBQ OYdg:7ii/ xkSܫ& };g-f; wnq\ߠ?RUc!V N;U9q"%ҿY Iyuu_Uڱ)/ *Rg_ȳ!O~;zbCC@nŽoUz>h!M'Q.< q2Yh̃Iyzg^mNхIﱍ2_mGeQBJ6.7TiKkZ]['M=+{n`pȸ\w ݿGc~S1ˆW)tMqR>uHv9ՕuN~ggdPƐ)3{i-ǹc[Xs^X"]nǙ`.w'Kd=u:GW YL[zl.,unbs>}g9|Afuoe/&_FQhx-mͮw_7݊,lŵ{{إ̏WwO _ھc%׻#m#ڽusV>b^}2dx 憆ZN].hO]~ٶ[_skdmvoS?$7Y^+krG2@\a䗑t߭YԱfs\ ZCΕ멙9yBQ OYdg:7ii/ xkSܫ& };g-f; wnq\ߠ?RUc!V N;U9q"%ҿY Iyuu_Uڱ)/ *Rg_ȳ!O~;zbCC@nŽoUz>h!M'Q.< q2Yh̃Iyzg^mNхIﱍ2_mGeQBJ6.7TiKkZ]['M=+{n`pȸ\w ݿGc~S1ˆW)tMqR>uHv9ՕuN~ggdPƐ)3{i-ǹc[Xs^X"]nǙ`.w'Kd=u:GW YL[zl.,unbs>}g9|Afuoe/&_FQhx-mͮw_7݊,lŵ{{إ̏WwO _ھc%׻#m#ڽusV>b^}2dx 憆ZN].h 1 93 70 1 72/1 72/1 2 2012-04-13T11:27:44+08:00 2012-04-13T11:27:44+08:00 2012-04-13T11:27:44+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:8b2c796b-8518-11e1-a998-f15f6a1faa8a image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثWN*UثWb]v*UثWN*y74Iu^FKhDDF(Xp$byAЫvYIWɿ/<8럡Ri-RzbO~-NX|Arlv*UثWb]N*r3cWTzPD;5܃ID[tGܸefȴU$k_y-Ymm٤%9p #1Q^GѬu2ZH^XZkap\_J#“Q#R?z'䇝|:2Ɠai5rpQз?1,WC-쮮LzeA)I7͙Xש%//^E Ɩ Hlj*. >cozǕjOn.5#5[Zi"c2#p cE|E _TLүίYd+42F-_Vla^.%ok:_1EMx&e* J0 _˲[ L朗?`򧔵 i3B-#o۸oyel>$X|} Qwlm%ΧpZ /<伛:l( /MlL2WycHk.$Lll/~7H_vZ[ăP4G ~ AdobedF]    !1$ AQ#Faq"3CT 2S4t%V7BRrcDd5Ue&68 !1AQ"aq$2T BR4Dt%r#3s5U6FCE&f78 ?H0a=;ajj/;!{ìy`'´ܷQb{G )k }\u]FŐ=۔Dtai5d=v` r x|Р=~VOTpE`H~ptE`9{c7D+ߏ0;B'V{Nt@:=2YgU"ne8 &~NHvi黚Ъ"m3̏DhT{{%Qk>`oJed]'s,Rވ?So:zcS'z _8A*:Kg^}1]KHʏRt:`ڇS)H9g??Kr%0 MpjX:eLk;z-LLZ,nfUpPPqREI:TɵwBX6(8VMI8WlάDzZ4C\)bx$UTvbcI6WƘ5FʌdkA2>b1͙S3J-dr| .]127^yƴ}dĖ;z:1d?:g2'U*UzbC. r]'($t-蚾F_T5tҚl &Sq"ɍ R.A0zPf߁(}.7}q]&\};+pRg[BJٻ ;jI. HZkhjc{mhSUڌsA?$UPFyD^򧩨i,'RJ^ΣMvͬӽa2:%aNPSmZΚVuVcYYrL/ջ +bg=m$m11Ueo44u꣸ M(@07÷ӫYN8K#(jTxޥwiT4ŻwmMی p}v :FWj1`hԀ^4hQƞ`4S1Df$nt=(Jv )e`im_5{};ݞɃ)l#eM\;OUQyfTnUN2pWsl[Ҹĭu&\❵-- .e&''٭V99zkoJd4 jO B(DfpafatM:+?M, -֟NfԤ5hKJX%-@̎ziIr"b;?0SKYuJY(U%O*C)nv1#=r)#̎a,z^lZT7wM^U34'> 86Rr!R-F^u>H}0s6dj/E*Jx2)Pyʜpjpi'DiSZb{3j#dץrbD UR>Vr(]VW,$iRz56ۮ2xP ,Z{G`C-9'J[A)WXLK zDӞm*7OwwS MDžjU/iA-) )Y 6iRaSH !8jBp-ҬHѥӫy|,fH[MK9<8TTA Ȯ?ph#]{r&5n'u eO+q\odfSn~Yg:#|8St3v6nf c%RrAU-]ͻ4 &@4˧jZء9Wms!Xn'޳UK;]/*B,[\HsVwNSPfݒ z&8JDح%h$dg~/W8u"bU_5dd ܷ댝޵pt$o`$1'"` p&=JWݠP*WEM95YKuM+$-å$7DA= ȩ$$KJo,9vЬ"NҒl*$ʉݩ@umÏUE.m$d3-Ϡ/UiO%X&\J#ueE 9s(ϭFe ^uع;% O"qPӺ\3 "B,LpѣZBU)(@|qn9|# ,E5UqӫmR*3RTV3Iki D#Q3∝eÆr)#L 'tq!_^uy6aW[.h,ޒԎt])C*HkƲj5B֖Ko5O>.A2d)Hh@g]Lu\LPdN xyAY-5m}LMPm6΢8~KJb@$LD LIה+I6Z.:=&ͤ|ez{*lM3+!ÿ8t͐,Yo-I-]/>9隥^NF]FpLsۭOPdGTVʁ* o7jFmӽ.'u-?itDN$#>S,[ӘLjnNkJjZ[֙Il i= ٷ RD=iS/**ziY n Z* 'EL=bTra">Ͻ &Qm BL^e ̿i^ u,U  6YYXWXݧ} 6faǬu< shڢ[a<CS *ȦS+Pq=AZT43L99<<QDYrq;Cf⽋7mmjl٫ξHjd9 CS3G@]Zh-5f nRx!CtӍց`yDjf{vWm5Ev""+þ34Zh0#vbOL":%EzCrWVNVvZ!UEJ v5F0$pZ=sYnp%pfV0̚"G!b2?ZF8qͣg3?SkюE"sjlቪW!1n;?z%J)OdmuͧVR I1t|[TRr)l E%K7VtbiubΡuzՕ&>;Ni#P$U/Ĉ B7&OKv7JZ0Sz]zw7#i;.r%-kcP!ZG}SQ_*$N[(ҙ-+Z{ː5k)lvcΔ]j&o| ڻMFLڻkmds~K!Ӫ(uڬ#lG&Xt'a$=N3jџ hLWϡۅe$L5*J ~k4kg呎;s9S1s|߃ UM"ꏓuէ5=THl ҋPjbZŋf(ƓBȏ^:mT^˧`2xaUhQu2;mL^yݜ紘Dx:rNqϑ^|?7ݼW}ϳe_DZ_Ґ|/ÍGD.cݎG 5iIPHR×2ŝ7=i}z l}\>Zwj˧g7c[mz lև+ew{;HGT.gv>zG7cx{;HS>Z.~8t~'`O4`gHvw){5GpEe+<rrZy}7Љv5})k>5;ka˼ m\/Y>4}Lѯ=ѩyŌw{FFaz9,vhсtg?IZWґ4=CW{-ޔ;aʪ:P"PHq{&KwHk-xua?h]aq}Ui\' ^QC}Yʼn"Q0<Da)!zx48PnP0CNج06d}A8{c#!\dd8FB~ukui-control-center/plugins/messages-task/about/res/manufacturers/PHOENIX.jpg0000644000175000017500000000761513543125214026246 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1 !S$DAQq3T%H a2#E&VB4d5U6"CctFGwX  !1AaQ$DTt%d5BE&4Ue6' ?cnFܡcYsŌ{ЭǵHŌ}]~Ŝa֊:lAsgES1d0]$00{8Ȫ}%~NQ+)*չsn݆ܿ%ciU?}x\a}!8=t/Vɰ6ߧl5ܽY. gnufCnKՔ-Q@6'Qe"Q6Y(mNfs}.ՄBueB$>c.X@̳۬dL6짇$ej#oQ)Re;2^npV#]1KtF;'߼Yi&qs_*H- ZA'Oi88 ezd hIcbY?ZG{exD]Rjtb*kj]`<EbM_Sb? 0^K3)DV`5Bca T9m19ތԲDKY|8]ς>穦L;"kE^A|0K]\̿<>I @/Eqž|$D>Iヂ5Ƅ 99aϟ&,]р;\wr[Hq8>ov7G(ݐ6`MM>8ſ|<^10t }k ٮ(򼍿7)aJFc)*0e%)?\Y~xp?S*=Mbl#,A쮍XoX0յń[eZ _<#LpI?W]og> gǷ~bPRbi +)W3 B" LsjڃjQ!Ȅ=ˊML:[r&ʞW-,qF{wI=fCMk *QgFi5o2άR*:SɜX8O,Ÿ;leUܪNSEU&;=1JTXPڶFx-X7sppMRm#2^w]P.].S۬Dbݪn$Գ̘ h `6WO*_;Dfӻ`J=6NB^',l)s7|ᅮ܈H=^h5D7ꤪFL+9+SyaŁK4l Uʢ:5eA7p+&+%A2=%,(]@7p`aTyFE]̼ EWҋMua 6[BnKB}hC @*Ц 1J%,&Ƈ):;hݾjI(fNa)%%b9 ''~'Am6s,P2eYO焝| 4_ wb㬟L≄3ǁɣ8N<&y2N>!֦x“GkG;IoDkRUCśdk!@**Upß@9yL9,J*?u 8L"9-jg*Cy!5Ě]Xt|L?Pp9ª VY*]|岵(|3!CΠ pPCJ鿢vZGu!Z 57gϼ҆` :|}Y.KeJizg#r ]Mc,9W@y J{륪A[=3+%]&eg>濙eC}ը=)bf/vjAMȏɑ9*YҜ S92M, ]g7!L O!0Wꫢp!5ک:np|3g :\ZyI=@âaܪL=̼ O#2@i=4FW?:d9.ǭC Oq|-u$_j9Fpynroo@ pKIuc- Z@ppeߎ r&c(Q°W**w, ɨytiu(ēRi&݋QLcnUNIaqSPG8s#XH | D'(^q5ʕ9 Pʠ8 ܂0,Թ%M38YFGr,Gǀe7]g88c4*V0k^ɶʹyo l# i_>ͱ~oUh]d}׭"84*kNRmj gvٰ8UHSZڂ\kރf!eWY6 P\6k7Y8 P[6j+tՔwUI6({;4Ez>ښJ4({4ޓvb6R_b١+a YU<@I/MKV U SWg`äa6R V1Fh=QK.tz1c O:U'@͟.bf,F+fgvOO[?ukui-control-center/plugins/messages-task/about/res/manufacturers/HYUNDAI.jpg0000644000175000017500000000512213543125214026224 0ustar fengfengJFIFdd0ExifMM*1www.meitu.comC     C   F] }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S ( ( (P{XiMU_h~⿃ $]o(tm5;;mu z) (OM'N\ӭJtAaƨ_]"xfєѤ= #YižկnuGQx<+7ӁM? <;6aw{[0K*thcGP0khq\t2.by}t͜%R;1@Z\}WK쫪^ܾst=FiW=?nE'ȓXE ~4qz= ~|= ?iԵ7ws$>v >zx?@Ͽ6v[)P&|:{!*2\r2{締Zw:+hE.vb'Ytց g<z;G4;y߈:|E<4Co t߉=_LJcoդ=H6pa ly`X? MOe9G y;^t=ğ~XQ(z tk>>TW#pGҀ (^|iKec EqazyWgRxmž/Hݕn`m*Ӌ[Ƒxg!0fܷA@Jk QBm!gۑ@w_{m"/ \xk[%~}cTL=kU4;-B@AFap= ՞)c-e%@EHPҀ,P@#}@c㦓>.ݍc.ovEW%FюyJڅb$8W_zf*𕥥hrB-ۺDęqCtCRqn 7߃bt\׼)g 5mnnopGХJ忊?~k>?ӵ/kWRx2K$clڮKRT/#kzaaX€ FoC<)imnSb$Q(htP,@@94uP@P@P@ukui-control-center/plugins/messages-task/about/res/manufacturers/CHAINTECH.jpg0000644000175000017500000000750413543125214026417 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1! AQa"2qRr#$4d%5H 1A!Qaq"2Br4$%񂒢#&6 ?H٫- ) \)큂o :qGeE E1H&p"U)ep 5xb5r!B"e 4R @3E 0M$T.(LBh(2 J~2LT&,V Vf\(DL fArh dtR WMwEA W/I8*ڥ$ lP<ΕB23B*#r9̝9G`ΜY<%Z{dSV;31G1޴}/#.|ǝWkIS7:6Cߨ5yv c}WUSUV}wL2YZyZ٣%/z)R(JJsJ*N`!RMꈍ9ڗ'Qp1W 58bxv(9Q azi H. &,V Vf) %dtv.C=gl߳þ1s~;aVD [9po޴ Es-uEny}\Z򜒽[o:7xE7J&'*‚=Tt劫TZwbo֫k۴Oh[umb>}kR5vuR:-)@ȌzGoWK<9v@@+r{#Β#T& .30W; tѩ]#Zz]d#:/ڊjt<;w^1zUuh]lwwsR2/)@Aj#,==b  ʷa٨ݴĞ^icF8 k]eSkgYWݫTc 1R$x Ljh`&C8`&ԵueGmۏ;W@t7fv»|tvF =33t}5b>]FZ,HJTna1ZttVZ>k"F<$A8n ̖^tgsZ6 P@6`ĬūJg[5K ˨qKX-1/=-Fԯonr3a#1@vUm[bt{tH8:mYl#\H'#0kj&P|_~LvxárPw=_ڽuHQd-n>oF+HpH>F5}sG)qWlf.ĺ#15#rDdx{&i}ݟ0S}N?/ykʫUsuS\a㴁MZ[=q_fV%:G6ذA!f AdobedF]    1 !AQq"2B$ 34aRr#C%&W!1AQa"qB# ?<1sMC) 6 ф?`C͉cdPw<]Y NC,`z݉_R~ J"lMC) 6 ф?`C͉cdPw<]Y NC,`z݉_R~ J"l>E sUFN5*@a1 T^8i8jVJT1!}f0CKI6 28 4^^FLdIEG.ChɍXEA%I뜠"bQJ2%!@06mųN{RWcӼ2B"@.8jF\+PTO蚚7jS 3`T5$ BV[6ȧ7EeskyosiD^Ju%QCUTj)! bgPOPvswnNAr:Cjh"J%APU*+)G,$* 0q~,qn-vTNeȎt,:rvQyk*?GVfnV<#7?\A~K}"laZWF}El2Rc) ':B]&0s14qi^EuՖGifƠۗ.W 5{ORK/QMb%wuTRP) ݛz9r9O'=y:S둭]9\r])j5=kр mT2 1.@ws!Z_Ts""PRὺmx5[ &uK+Zg{TޝT_V'^)ÝRo0aldNF+Q'$m/dW *_Ri2"fljIt[m$,D>/Y*SL۴8-IzL=Ji}ܠPT8GV~w1kp7+<๾\'|N{>Wp53B:i )cv9m-DWgH?6ƙXJ?P1 :Höΐj:ث{ S"ua!LO2e΅ɵx,='*KLS!(%G<}pڿCg;h[BMoj}bNǭ aߨJ&nӵ ng%j(bFh?߳|+;ʯ2Jet?3+uoVo}+x5ws\c-^Rrյjmm'dKLzpꥡ6tX|-{saWu!U:)&2>ۓsl8tt<>뜧r ,nf|~U;*]uon15m.Zuin1#J05tU"fW#  E#8g!soa筕oo$nZC{];-c+ۨj;kQ{[>ι֕Sqei,wJ>Q MV5oWvGw޺ ')VLciQ8Sfq8ppzg[ҫQcjҮ,R[WqKar)T|RFE*D2A  GtCMcYNTL]Լzr-išMyﲛRJIt$bM+&6eR"(E,|)]f4uVat,5ҵƐUηjopXAM5p^@R66ĩwi-#ʒM3Ӿѽ`5ռ WOnۗm1W$X+@V̥LiޯSofrvZ9ܹ 弣)8>]nx\ nl.1|uզ&#vGId Nj)Jm+ӑaN^S `F;1ڪK(rJR{^&([kNwg?uMdOr&hVi†YqiTY^**n?7ٽoNŚ&8҉iԨZզsCTŽeuV`5:`ٍ֪Yզ"${]!qyA>\21dU) 1JP;/fq̪32), *cBU4MB2Dq0[;a NUq{KgIR`eԮEC+XJ+`+j'3_*e&>oN6j$)мouBj EZmTǧoUF6]EJXUNj6B!$ C{2"T5#n(\ueif -KV+]5}s"ՋQ2O*eHss 1aJ`iF- Ď3xnnnB A +Vup )kR"Rmh+)SUHI+ '|oq@{y& \op5i4ށP^\Y;]J8)~+"yRԯ/,XiA` L%<,{2{==_f=MC) 6 ф?`C͉cdPw<]Y NC,%jPO]ZM`aɷوe<6`C&bt6z0hyy,z vA˷1+"u`6`rP{+PO]ukui-control-center/plugins/messages-task/about/res/manufacturers/ELEPHANT.jpg0000644000175000017500000001301613543125214026324 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1!B AQq"$a24b%V7!1AQa3"BCq2 ?y;89OTN h0v0v>hA{Cq,{z.^V-u ;8h.^WPܮZN;.NÈe=PA;{-hrl띪ˠ 6 #ӁVR7bC'@zywmdWսv)!Ts B_"cI!ƤQe P#Nb|Y_lyiuoU H^}\6N\<$uF,{ƇVp̾@;mV`_kcҵf7P{gzLwWfar&r[#4fkHFiDb b"R1U/.U˗լB9_ R5JQMI\iO Q5UjڲpQ !V%̠?ߑ*B5Q_Nc:j+B<*M/ęšg:20X䱨/19;YEy{֨&14-G6goSu=35JLz N"T/hE]fݠծp)TJo3ijl1׌w8VV#UI!(zm*>$pcP9)}|Nu"-i jO񘮠aWbG *:$yBbҡڴ2%H%^7}u!,=M3Sc"7ѳR6./@K[U~ɝ%Q*\|͔=+p5b8S ݥks+Cv)puvZ r\.pD9)CoVXo[ްݟSy[jwVWnH&U2ʏ6|x#̢El[gRɱIOu6ڳ}Gk^Rk 3Q|JASb˟?Hxȹh|o1)ޕ9<&PljG c"\r}8ʷTSqrrs**EH)f~4I5Ur?u[b3dJͧ_^ύ{ 珉|3*Q^siw=+p31FFVj^֦mkl@*\.A>LR""v Xuݪa-D;!-5xc"'y2k Ss1G:|s.6+ƝyC+nÊF5&['2gl\Gg f1G"|e"0C`|c ~ۢ366 :q9 VcW9 5 :g8N2`7)LqBC+vY6}^ *[^ͪUN]5BVṺc֎lrK뙺S-yk|RlI$Ҁȉ yS^%jTkFړr0ӯbY4+[GV4P^~ڴj$1 6~!_ uVRT9Ws#sMҦގuWcjvU@i~':qZ6HE>K:]J!–8Q A~/9;s%*'r376**}R-juw|RN~X r̘D@E= =/qt)ofg~ )uh'Fa{|oOȸةg) Q N cyted "p\_19"PQ8kr+צ'CmU`ꉙ͞GUj&37WzZɀF\S!_PJ\b[V#.ԵBIwhZgLFWN l*y }uW&ŷkvhk7ӣbld|$3UB:17 \򫛡7D@ 7~}Hi5WU ı_e3TbUWE_&0Y-r9 ,zq)Eխ1xUi);>u?Lǫe_LU:k7|<HeS0=ȍS&ϓ>G&so^x}pq4\p"ttкbņ>ܧh1 U 9V׺o͌֟yQy`8*,G=gػ?` 7uYuB(J=ig䟸YbnoW:J)Rnj^lz-sdwg˵zV͔s}y~=4rM5NJ:'~&3ɀXALF5n ;k[PZIw*ZRY4YnUµdjvJQC?l"-JˡO@uKcXͰy*KjlG@X?Ɗ"vKO^X)6|Bҁsi(D[Mu@%,܍^CkBj)DQKQڱ`p],^ dɓ:%\S$WE ^49LSuGW{Q&(\ݞiZp۳I;6v!`њʑOwCҨDR$fSP8TU˵Ng;R0ΧLPhgSy)27#1#>&QQLx]w \zvp[A~'apB Oc$Сr)nN㮁 ArR=Wt?ukui-control-center/plugins/messages-task/about/res/manufacturers/HOMKEY.jpg0000644000175000017500000001115713543125214026124 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]     1!$ AqU QB4T%a2Dt#5&6V"b3cF) !1AQaq4B$D%52&6E"Td ?R,qGOSb:rJ_ˑJb; }Z]yșrdzs(0ʘs.U8nL:.GC=iftOo/ 0a;eI51@l0Փiـ:"G7[N="RЏe%dp}V`H<lwÅ eáf 0x̴nU3l,3vla3`dbl4VF1嗦WسGfTJ' qU%|#g+s͙TW~@ʦ+)Yl.sbo+` f^ެJ2v9;ג~%8ALV`,캘̺8ՎTRˀ 笰| VKW12fy0 ȶ5 d(uc5XоbVpCh!Y`g0U|ɚek$(ɽUA*ㅇ(TC5qjְgc9t$+!|.O+юC *TDImz0BS0Yg"!sK gh€c汗ہϿKs ME}Oe JuZدCݢs6tD4IU$n}T0#!8GsvQ}-sHbN<8lYD-M}4eJ<:Gk򓲡X0PvvjL'[f-̞SeGZ jwNgPqh/[oT(R,[1:u*Zj=殲?@6ޚN+ɬ.xܝzQtc†pԬ \[ yj],˛Y;ܜ`Lo[ u}c*}& SyF^ `!tCQ=̦ZɅASJG%aFr8!.@OGO,! y9BlZ|h*ǩTM?ޅ nwCMZLK7Φ0ض*K[HLM <5gA˃AB\X=HjAp~V Y:n# F:m#Z?'T[&ʍ!(4 ASd Ä~vQAyى`%1!a',OL,iӓ:g0rTdkOܦLO2 &A(OW3\{apzkmpVLHγzIb 6l0͝JNƬ(}~_y^|$Yzm`D >,*]d;7oS[Pu=aGjN ?ӱ|ISNy0>Na+%\jeӸyhO1D, F,mx@p;MH+n{4TIZA1sr)]=gOH ߚÕu;,!`j;:i[zG-0\["aaoE9l0| C?Ǚblr^vW^-v#*Z1*l/ ƌlfK2]b7i)Ycx"yr&0idR&V.EŒrC\v|yR9Ft򝙳fDFu/W{쎤)NXokX:* )BF86%.f3x ́ʠ0AWf lC=jS` ar'+nKӔS F_ jxDYG˔,0<jK+ẍ́v_~5~oR6[l:3=E0ΏJ(!c O*Eb`(z'`NJ^<Ŝ9Fe u [ഹBEceɯ^kmZks-L!H_NVS.Q"Mapagtҕ'i'r_!u:h&;K."dcأ=&q u(Cd Ũ5ѽZ,1g<ʻ4RNQQS"ȴY azZ s`PY4 /yH f\04DZ,:oÅ9QI]67?tyw ״ݙI6'ak)2VMZ ;1`A"0frĴGq+éϯY^0LW=a!qV$MxqH14&fʃ\F//ЪCnqY쎄S0(] g!^K`'Tcl]̕30e \G}((?|GC He+20ψ_[g+>[PÍl8Hģ ^gҸ߽iwesptf+uzR5=(FGwIv`?'.}K/mnYU,# =}{v&tX@ʍkI_j#0_<9eI!yH4]{z2/q9UPHrm8,~j<竱Hu"ڎ׹0}K Ta19c݈Yf,q7k99aKʮK<Ηɐ(]tڨU֭wUU+x5|1L8q&_pʷRˬIGOSb:rJ_ˑJb; }Z]yșrdzs(0ʘs.U8nL:.GC=i AdobedF]      1!AQaqB "2R3C$45EU6V#Sdt%u8x !1AQaqѡ"2BR$4r#t5&sTE6 ?y8b+~9`z'`t ǻxw{aK̈́rX`FPCX`0:˔00 @`G 01: 98s8aM<0N# w a _/`u(`8aBA<<akf6U^rSV2c9Jc0PK d~A~>`cYFI# FȲyjTD'pI^BH)Rc8)3 DG 8C({k1Ɖ zUWLT)M< 0ꕨ ҡLNXj VL48]=?]6s>"}a KD*RJPveKpf0iS1WƒV\* :d+%: P`, ǯ1/e>(?=VXU_7qߗɴxwѽܧ| oc۩p$VjJ`*+|a)TXS+v3PvzDs_Qyx`##ZR)Jtp7-e?T^U $}>iF&\7Et<4d4veB--=Yǡ1C^i"چlnm-X;2jvb(qZ%ir2ŧ8oJՌ)?,)*B;DA k٨T10EIhXymU[D1;IJыaQ(oCٔ*x^brҬ8U2O^[AL mvnZX1٘#la7.LU\|Rp['9*[-'vɄcQonK{q1P j2o=Mfőt Fۙ&>WEJw)RLF2T۪vXm4{J4_f ۝m&|gYrXl@Hi<2^49F1)M}!:0@F ;p}ClH#/JOYQ`b{fxaumݩw\PbkVLjJסB`?(DKqwj;#YYRq]49I\)):g jzMYΥ:49)ȮC XEc6uEgp֛6c 5V>|"⚗ڷDz^]ekuxtB '=5|+%Uh |DgNT]GA1>zG4J#Y۴g~':Mb[yX4Ժ'jksc eJkCZ1geA_(qǧ/=ioQuFYn{-gZozǯ#߸{|P;đ,@.SG.`Ö^0<*u&\ `5:QZ15OX<{岍% pyV!*{d%eR1pb6aڅiP|ͻdW /zW-F.RuvN%7:H4p_JU,%`r!'-"4"fi7s|s+W_4k/ʑˮ}:ؾD~#o,sw,^_&.Z _ii{HS e eu' hp.=2^q̡Yez=A*@ٚ`vao.t&Q理Bj_A$V ZgEn̕kdq|*=H$(-Z zqFu:ZgH qS\\o?C@i@^۪li&Eݖ“w~ Sʕy,1]+ooGS+yRbU̕RE}p nVTo+O\qS(N=mcTbxe%f\Mqju=ДgTf&T`-m"K[Яeu ޖ9?fl2r,)s1Ay;Hݥw"1q}9'H7BFi)@1.-Jk-ϹsrjDF,3dwB:>,VQ%6B@bS'oVڛ  *m)7X؝$kjLe1wWw8LY,79 @ȼbŋʭGӋj?.5aq}ŏ>]hMΫv..e2[o&U҂e.;y(y `vV- A A#Qn-ϰ!4>zRġWZ{w'$X_zy[߇/ʫb7eiJ#%V J u SEֽ^F\ISq䀌Ft}=o2ٳd?t{z[<~bHϒUt TuDz@sc@D2 qvMrvǴArΝ۸|Aى-1cS1: +{iK$R)lGI,}vH}n˔9;1S(^UJ Ӄ̫PχTp8;yA>^ءZc?hяRODC!ptLV2 r`gtWh+ ӣrW&5LNTԭu%ՠ cJ A(d 8=p$q %FLt:F*lw YBرuէF1Q+eዥYF0yx~e_yS-ؾXROp1*{Lg{=VUv U Zsr&j¦Ā"N " r|jK伝fiQAp% [in5-Βfm&eQTu(ԕQ.7Tgo^L@moYqˆr;~^HR1L(z<崋էsJ+gNZupH8&u#Pz:*R\*U Lr{Kq*aԘSYS2rSOֳPGhL![ymqc)iueK\QZbSP04K1ὗ"utͻųwS| f帎Z+/ dV"BhB:ښh*UUj%S?ԜaMP/g{6dV;4n͸jn"WzK1: 98s8aM<0N# w a _/`u(`8aBAs4}@lYlb7J~vr^0@0 r ,&[\ˉ:]  emIIe:hNI$TI%)d/d J_HjclɹߣǯDMU7~FV:WLms\mrǟoJtG>[]{}?"qK_ӕKKE;2z 3%8uuKΗq~kCCZXΝ{4֬ǃnZ [u1INLMϨ{b,i{%3lbk97ټ5cEI$TI%8Y?u`<]g4f]"uñ$vEqԆ%;.kyp Bޟ#T%7mϟ>XR͆A70%U#C{Aӳ[tۙݯeIJRI$TI%"ɨ]K<<gPH#V|BJT mLS ci)JD-*cC!:7Pm>kd)ڊM|#;Qs,w'ߤcyc|ԔJ9.$-G>uw>8%WRI$Tʩ$ ^#gy_,*ntg6^ѷkEk\AWI$輺@H._Dm[0A֛I$%I)%I) HPhotoshop 3.08BIM%8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIM?F]g*h-7]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM y]FL]JFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI%_6*sq?kI)z>s4}@lYlb7J~vr^0@0 r ,&[\ˉ:]  emIIe:hNI$TI%)d/d J_HjclɹߣǯDMU7~FV:WLms\mrǟoJtG>[]{}?"qK_ӕKKE;2z 3%8uuKΗq~kCCZXΝ{4֬ǃnZ [u1INLMϨ{b,i{%3lbk97ټ5cEI$TI%8Y?u`<]g4f]"uñ$vEqԆ%;.kyp Bޟ#T%7mϟ>XR͆A70%U#C{Aӳ[tۙݯeIJRI$TI%"ɨ]K<<gPH#V|BJT mLS ci)JD-*cC!:7Pm>kd)ڊM|#;Qs,w'ߤcyc|ԔJ9.$-G>uw>8%WRI$Tʩ$ ^#gy_,*ntg6^ѷkEk\AWI$輺@H._Dm[0A֛I$%I)%I)8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIMhttp://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2011-12-02T10:24:49+08:00 2011-12-02T10:24:49+08:00 2011-12-02T10:24:49+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:cf644b22-1c8c-11e1-ae7e-db667b27342f image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@F]      u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ߺ^׽u~{ߺ^So~ϑ6zB]ىH9Vvlk JwSe&f$M2$Љ_ zoY2ŏa1y ^v%f:<<5$i*?;st;+6s_%PrY (h[~](^}LQNz{uQb򽟇ٔu:}IuF߻~a_>FYmڿ6cGl3Uw?ט<glTJSQr{ |L 3[I27MoUéUl|.+uo)Um%4VT=׺Jt;&pg`&M"3QHj/dg l9 5_~Zoxϑ;NdnΧ-S/u^Qg:͎+2;kyleӼ3:z?uu{{^ߺ^,`&2(vwl E>\^Ӫ$A{8jLx9zCO3gߺ@O͂ywrvN^Iws>Ow! jڏ DXAC4([{(_(GQk{^)8$Hp?#StXK=tRV%-WS-DtZɡ8b puA {t5||ԠXϼɊr[sr >ڔ- m4FSǿul".m*\YjcW'~MGqTR;IҪ",[.+GP۟zRj+wţiXRvb)5Bd%G~lUKt)MIOczBF5U׺}׽u~ߺ^.")w~œe]B?]uovH목qBIRIihZYUA:{䕘v.זkߺ]y7ڏ[~J7` qϿumsc"և#dOĿS.;! s/<^>=5sjaAM읬iW⿑yr>Uo^>h6Ou~{ߺ^ߺ^v6ٛjUCWP kh&=t[T Ik誠h9>J5YA.kJJH-{u3'o+{*Uu m?O8׺GpA6}y˴6ܒ< I'{1;V(HloM=W 2ĬHԿͬo㫎%HJFY@'{3׽u~ߺ^JF-<׺{b;;menB ]6qS@ 8)bIBiU--1 ^^砥m|?pk"yl5D9 HUᕂC"׺L}{"Ƕz >>S7KaO%Dފ?~b{{'bYU6 Z\!^n`}tY}ӔԒg#2Dm=߻rKACUJ:8CK,OuWιLWyoO%JKQ`Xҟ1$8)ca3k {tj}u~{ߺ_ߺ^|W_!mt݋ 7$˃hW$K"(-{{^6/j)vSɵmU%-Qv֛|."<#ի_Qɫ<{^wM&dvח'v ,GߺL}~ '604߬}v,˨Z10S}Oԟ~=|i yuGĵtc.b󩧓4Ɋ0#R _.>{^ϣ x]tmaM׺w׽u~ukui-control-center/plugins/messages-task/about/res/manufacturers/GREAT WALL.jpg0000644000175000017500000001364513543125214026516 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1! AQq"2B#3$4a&!1AQaq"B$R2#4D3d% ?(z@PZ2۲&jN˶Q\uFn' 8v]) 6O_9FwFUoO~M[Trۨy׶ <hPTiQMWE-\EP&Eu^U=T [K~j-8%( Rr =~^:Ʃw*}8ʯB;De{SNJJ=Ӊ>cYV[EZLMI4)Z8 ܲbʞN5 < ^'lӼc-%FJI5؝ыzrR~ef^;:ؚM0%bN泵*iZ=w,jvBfU'Rv1+a=4{+wz(._O$p++>~u= ;R1|:p衶@M/W-Yhr׶C?[sRU(@k&SuEeڼ㼒JsaÖvM@S0! ޼޶rD+ZF*qTJ tH̹mRcW,@j2=dͭ@ĚWDp2Ǧ,>B[$Q`SutE On7^73``28X}*IJD+E.F L!v^p,ΓAzSod:$& YqM-B?!G: +3/YʊTe`"R@ GE3̓)>wQf.>i?TVꍖlҭTTr[*]2jr;O4nFkv8pY,"zRzxp.bPPME 5jjWّp:>mm`~ 8ԛ.͓@aQ;sq{0IRf޹ qgn'j`=aظeBl!nrFpW-,U…#P8aJz#WK5 [Z/q8Qc?8+{r^N]Qm^LjWA̪(-AM?~qG~ o}.ka7x*{i+L>cf)Tݷ9dk(]I{nA˛TR뭋HƤ4%Lª#P^*@rzmG4GPԔ$#/g<`X/I+ڽqNJY'2dIҁt(oS%s .-XRvػL*JҷaMuN3a@:ث[BRu7T-mW$`!TsgN- tvmjWbgnd.gk-92^Lhlh|bLWܚ[ͳ?ES-[dW[fX% l;#p[W2}{rQ-md࠴̂}483)~GI+ hYm^g|ܒ2&~!&*4ʉ xז[ ^\td-#I%5noH*>Cw@!ct6g-EjO}bӭy%2tWIhŭ.U4lrc1+*mc ˺Te3뱉&6pKЕzQU-t'DeGއelӞE*@B.r>\nVRna)b2npTLE$̷v&Hzmu)W .7/M iiMYr'2RBJQ7VzXTzHvF,ۀȚkW2'˅pYџ:jr' FI ;e3LefkU`]ڔbӕB7%s#,%MɭeJt31d{h+#ˆ4p+H.wq3|]sWaXcM&B+_L&5LR_͗]ttŕ]Y, )=D᎝=Щ{>η-({s,Ҁw.x=*E5Z>\ǙS$uj(ywARBD0UQһi<ݼcZ9ȵ*1L1:_[uOXLӶf1%R嶀|'ۗÖ6\|jaͧftenvMS^8T|h˘b|0BՇg)T+BB 6bq׽#$+2/J*СVOZ5*ƅC z"p 4"\èr,eRl&A^yg&!H{M=W7z^58uv遫 r_E"qN$6i퉳p{㟋U=ߙ*0Sڸʟ/&SDﴧt+PՒ cylx'`uh\J"qs<%MSBꋕ`\:ϪNw[8E{USZ"֍\ʙW /P2j)@1*H",PO/cJFToY-6[M2Ԥ#vQ-M9Lqafxܸ$vGzݙ"țI^ePUoG ^X{kpf\YpL[\M*LePU'.akՁ݆ taL!A9CA˯haFPX`0(ۣrޮCmU^Y#߮ H%gGU#Tޕ *75&-6p)lWnZVrTgT_1{pbgSE©K:&g df܇(S3IOJnyj6Qd[X\k TZSPkz~a$3|r2jצ *)93ϵ7NmGsoY)Y35T+rmw e˹JkݶfNDD xAp(G^a4 9Gǿ|s/y̺U?o^e}[=~zY Bi1ȧ'M|ϕ幤ڻWozPbW0rkc f$A 0A OVv.х0tKo .C a\ ] (᠟DZM1ގ_v0M{1& 0MGم 0Mzz u)2_;~(h9u (k X2 PraG &?ukui-control-center/plugins/messages-task/about/res/manufacturers/ELIXIR.jpg0000644000175000017500000001346713543125214026132 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   !1AQ$ q4a23SD%FBRTu&V'Csdt5EU6GW  !1AQaq5V"2B$4DU6 #%dtEeF ?B]݌cBv¶É7`Ml8h`vC<^8vC67aFɷp@0y8|6BCw;p~ >.t/o QA ~>t\xu..R Inx|yp\n>˅pOesYn|O.a[;U)F41>rvt%`{A Qm1f#nG&t1rv-ҧ<s&/gKtqe_DCXu+fW#N>ڜin+?k'aGop''v -YH2z">(hp]}m.4s; )cOCy .~ ڹ^:|:&2;,D"j+O(S+dAUlc L \.9#cn;9'+mA!U&S>Zm*r2S$v\G#cnl'6Б,9&q0rnP@6B_-E rxi(ǶO,ܭ '؉gI_?Ùn>MH da&}sC d~ZM܈pv2BswM[/b'p{WWtBP6̧֥pH(Js2{9N_zc>rէeꄝhkgH=[B :u-),њNtNTXi ^$|DZ~+~4_43Ν;ռ-Zۺ[51U&,PR6Q[̩]YGΥ (g hTN, K?gN.'Aꣵ\,l*RyLĥiIT*Y96ڀv)Qc7tkZm2"w NhIW+,]T5j{7q$Yos+(̀Fs&mXw9Lר[,)OeYn,2C NQ<03!tQȯ+yvڻY Rݟ eB "*ClVKu'UϪ=6ZR@$z n*W G~.їFjƯ/;*YJۥjNvpowsV})%׮NՍu[jP =EHk9.JKm4PsLweL_:837:huw/"JwV7V{˗mf޷`-Me .- |KԥbqfrHJR91I+YVXm+a~ֺ ª4J3ҫHhH ٣-fGCigC~\_Z1ͫ@-Aq*bΎeu[}JP%Y=mn~AV/AZUK:S$rN3g9mN zjtiU7M\-6`N۝McX3`C-'m.ݹW3WXȸdjЅ7AzqR%U4y\ /'?/25sN;ƙgʩe-)|X4W5YEjU{κ]˸\1q07.BS6bl?DbuwR:qĐr&Aq!+&*jG  pS ZT*o+WXM%Y R -P-5 0-\Ø MJ$8 st:pB^Y`lZ-UL6&v"RBdڮʣmM#:~x^UoSnݖ%az:$Ự*dnʫE)"b՟[/HTBT !MHX*ۜWFG O.Fyo3({1{j-{Wj&$8sN5#82?,`ۆsԔ:{I@Ȼ+I#oׂI(wtl"n-=9Nܜ@q8,` Vx_tAPHKRV1EW)Ab@Udgdp6s)\i)$D10QΣh:miDܤ(>(ׯb_‘Rnj4d,$^ o&9JX%FIQ(]Pۤ,JQP 1YC2sr""VX>PZ/&!EjmvpN$K&]+Ƣ6B^ot˳m %;ĀГz^BNNsg; U,YCtGQĎDL|lxD>wɡT ? p !yAWiBO $,WF]S2mUkW (* A*m t2m#jEX u[Ɨi۳aGhYW3JgjyRXF[m"3Ir4&MO&4j*y1!&վ o^^pD{,QH޻s7}ψF87o ψC|( ~Ig![ʷYvV@iޯn;9?] [@8/QrpP5?"n^,` =xt7KWb;7mx7 c+FjDi!₿0LG1GWN0SLlS'IrG~,l ,V5\O3D7o1!<+&;xoDUwήf?ph~GKGތތ?5}v7- ~Gߝ?f_/v|^ߚIl,qGK= z3z3/vS_;Kb">#ήzfb_/׆|^ߙKl4 vuqt'[ћщ|:㰯^:wM4Avivq4za[*~9 :Lb8h(<#,Q]љ? KOUM4A<%NľTP=WOKyq'ՉG/FdžTn"k.ӫb0?}m ~yͿm_C*~9w3^j&fuLSGA;a[aě&I0;!Ğ/;!ě} 0d Mt<>![!ĻN?ACH {7m|(ukui-control-center/plugins/messages-task/about/res/manufacturers/J&W.jpg0000644000175000017500000001217313543125214025515 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1 !AQq2B"#$d%5& !1AQaq"B$2#R34Dd ?M9741& VW"&`{4S==ZR 7&G.a&K0ܘ #`J>)>S%-&ڼroi cxL~HE0Mݥ7h# zz%nL]J.L1La0j(.G.|S"}=)JZMyP(&Z\`K)oGLpiJ8&K_Pܙ\b .(r`6P\] (DzmLS|jV3lڃ`?NM8g/"5>;kj=BB:~ДFh@7&+C ؐk:2!-(uՎ_rpAdܶBr{<~Y1 X]n4ȋZxq?SԧKH& 1}*OQtԵeib/႔I_8 `=OAKEJTSV&϶`) 贞5/ mҐX9maBQJT%`g Ep卸Oe62RWC6gG68#KSnZQ%8 siBQe<)7 .! %djkY$]{:|7}xW>KX!I:,Ȯ:J&־QѲ[K8$?R)y%1YcP"Uc}Rsr4NQSۙbKE=g^'aUWb(_`Rk[zØVEhѭ}s0rņܝ/$`I"ۈJf̥K?96 * :THz4zm og%.XlĉM52&,arKPٜ'53w?UU7ڷ*! wo2-,}dۈy㠶+bu=@U2]G"$̭C;Ak\>F}^#Ym3J9g>OQ➓&EVxiuYQIn\VU>EFod:> @:Nt_~V٩_^Wc6mY59kha pӵci;k>.wl^7v7]bd/<9ID~i6Uɢ$vCCҡ1S8=A=BP~y1dQ&ˎ.(D%,V8!No([r\:beoU^U83KsҹE:I98(C5j gW ̃{ WN ̉L1%P&.\S]]*EUƮ ι>ؼlQbnj$QL*@*ŢWzvv33ӯj<.Y6.M6 O0[[2DLj|='V҆!)h4m<ЈHJcHǀhSuV M//DO_:Wmb-r1(W dm+v[yDMi]E&DR2Gk/"rj^hON1o,cZΨXk#.QtVLN5INfLf6LZ{oϧJM {o囖[[ug٬ i+[m*v2!{ QRdGvԳ~9i均{8ڭ is EOrj0#V_"γ.S[6Z,Xu q%#$9;(JWqHS'fj ٣z7UE2S)nU<>]9!q]3\FZ˲wT#%GaTքzU.bKn:z7~̶ȧŞ[ȞNx{<[xG=]Nbcqqq]Oكmnǰ\16յXHS`jEr)n>. A0]ե(/ CrdrQra`4 ɀQAr9vp|41MRmʁG&77ԊS}\LOf?J`JQ2_:߬4iqFriG2'jb䥤WMM!Lo oթȦ "&~wOVd0u5 ɑ˿XiEɆ)7&mE=ҏdO7ukui-control-center/plugins/messages-task/about/res/manufacturers/SAPPHIRE.jpg0000644000175000017500000001673513543125214026352 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1 !qAQ"B2#$ aS4 !1AQaq"B23$4%bDRrCTdt5UF' ?<4 Nv('_vlpG١5 >VBP{ a ^ЌPrY2{Џl-f/t5Ѐ#6$Q 1d͛6c,8O.\t9Iަ7!^TzJtbodKԙD.uGQۻҕM w+*BaU@VYve`K3[i݄o,&_l*UĄ*G|9nQI;(Z=*0,o6u2!HPh#e?cxKLK/ܱAm%xc҄ȕzK%`Z<=GˆJ?kޡRMB6 qqےb`tpZ+@Mټ@;b˻;n4%3KPa:Z@}bJuE,);v.3_`}mNJhkEǐ&y(#jr'Dɲ.KUXTބC=;-*~?J9\94{a }lt@`h G72*>TPkJG|"Fbl`6g]J2ܫЂ d@Gȱs-ACO>;?Ǧ(a$)`LE錤8l(^P8XV-י?m˦mBc'qwAF+.zMߌI s:G) n+7ksi6U͊82/92_\Y'RzB3v]P&8c.G ) ?.@_<&wRSk _%ΎEpEa( $qq(Ho6e,13$wp7dW*nB;P绰6i̢r>%,إq2x|8A;E᳿]>]/om%¨r{wG_0Ĕ4G}^Nn{&Z,Ia2>gWH-& Oi"*Teڤkȃd%O> l3{{lY9U d'"ǜP6(nq2|D u+3S۠1 Of fT,>S 橄 `D -> ^bLύdv%o4' TE 6shiv: g;!mu< arȪCCw)+u7,{[.ב'H诱V7`OdE)U |}q7)|U bj岚tTȐUw~y+s *x\@,j%rNdMsڋHI&L1㌦!h^+-RKۙ,Effzv'H]0˾l1e*d_gk=Dy|SU$YsE8TC/mUpgr{Ӗ`{MvYKrZIJeH>gʍp?lG*egJfE?CI۳(GSz^4*P!ײ;io@6 oJ K™"\$>2,`P5GXɗ{և7Y i:it 0ru!A:eڡj[ٹІ6Fb$R,=|{ZsŝD 7m,aRyL2Mi}nj1܏Ş[G8 +["i(c&Lra0GOrُ|u3mQI)najP.fa\mQԑ]{eT?ptVq+[ 6I+hk b=7>ZS~=meh ^k2[nc}6 bt3l.aTe7#"Gch#?tPH߸{/TCjQ!M+v7ED7sc2X)l)VEn$ruا!1m,_N̻&V-oSItj,'2SaLT`*s,GVU .QSS Q n;"܉ KKj|(ۚ'@܁$lj2THP)Jii+4;c.5{`k6{{® ?]#6鍞]ug'4X#VXiD(O3T&W!VoLQj;n82I$65ڮM*aOXj7aL"P,¼YCLFZ5J{"e^ES< fX̖/HAظ0l;XiKُLi&YJ ̘PeoI:mPsJڞ$.IU+S17yȇGhceZkQYھ*&IlHvw$ J^#38˶VޓS5%48;pd};jz/SݯM9Zmc}L@٣'bV9HP&jkLJ{uW"R+)n:XuM{c4UvzheA~:&6.ISڕMl]1g3j|9.JYA82308g6k%JkQ*no\ ܄ᗅD@fIS#KY-%o8܊4u+IjtfD]f#շ$H BaZr D<}p'[5FiL2.؉Fc1%YPV+]9&P}e9 `xB5RP,eO KIQbl 98s _[8Wݒu~6_XN8=8^ՐHgxLW0^n-J)ƼAPr3p\uD1x֮5G*%q pmri/T8{7s^]a/v}}CrJe5|L@$Ѽz^W{Dy#ˊYk\O#oء2mSZvgiXko5d.v bu.~fVlܘ(m3sFq.1l# oWl?Rt1]wF6d*5T#˛c=ou6F,FNX$ZK3$`eˈjKC dn:ϧe2V9XMVlJ\WBq$,svf ˞j]h#;-udZ0L15WF6Ҫ*s.1> 6Զ~H2@pݴz3<%ЧU%UUX{A۸¢tEVMDS)Plc7+mnhGXN4\(!5E:ڔӖS&c'i7_NY)%lͻ62h7lN --)~#,3iEHf޸/Q>lҼNٳd5sSY^Z?={ |-9# @TZubۮTҐOWf[8U+!$~I\pl7B۴;M)1yc54LJbdmXda%/KU$ +S@#yzl"|a xӛe5SqNFJ]4fe\II(nBrD^yn^)<-/˃z+^_&:5_ <m_'wӷO)jk~|Wyq>dB¥,["jDkVؕԊyP:x$ ψq0*eYn|48^\rql/hD3:v;%.B䙥 4C1/"R3g)JeXj7‚ա1Xr4#(!ln\@tF 4#Y ukui-control-center/plugins/messages-task/about/res/manufacturers/3COM.jpg0000644000175000017500000001043413543125214025626 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 !"BAQ2#$ aq3sT%x9:y1!AQq2Ba" ?a= V(^ 67Bae жѩt1mlh[Yr"65r֮aHMРjXryCt7e[Sq2cS9=,?Z)8m&MoX䦢G'IԊkc눫DE#_~m—)MlhQU!L+vBhognM/w4f8Wv+\$z"87D= P>A8ڝ[ڛYtgvD{sj{ZU;{f)|@t~٧٫v`z@PlnRÐBm*qXw#Kjb wEUO$ v[ elTG'8 J @sG( QU\%ڟ嵦cYiK-o.35p:dLu j_Koqvh%KMrڏRRbxXٞcGlHb 7>Hfvbomgv*E%>ceŨhǴ[՗s8ycUGN\"穧;{N(qU7ci_xZmHS8#\21u"x5Һ VlCO&C%ȜY ]I7ІX\sbct(^z $ee$mkyXyWΌ r0%>A#,Q]wK1+ `@c ~DEaR<iuc==k;9m1?:9]s }=IiQѰ*cv׊㈭$R)Sm6Ҧǖu7u"gޓԛf@tN SJ/=c{Ҟ`4M귊cFmLV/4Gdm)Apr'<]7K%Ond5,J;7c3r gpQn"=pdD*7&Ef.킔`&Fa(=s/ʫnic8HT Qz&RJخ޷Р=lqAL!r&ho1UӔ˟K3\CĬؗD Norg2ENu!%1T99Q1?wOs"'J`:"%ʃUv˹Sw.tSPVh&!P/yGznxxfBq`cb  AdobedF] 1 !qAQ2B"$% #58x1!AQa"Bq24uT67 ? *و*B@3݂h& ى4gՄ 9ӧS$?7`0T fLNie ʝďJ.v y,Z 3b  ` :brM a'HtĔIM +=Ĉ*Sr"`@re;#R˿݃5^K,g, $=&iνH}=XIR:z1%H&=2EfS0o#t.>6֚rWp xj9&}'b-3ܲK]d ֠(NL4`4:{PBDe?AK-k俵G}CwW3?8|88OCeصcѦbdlG7֭|).k$[eaMv;qdTd2]RdYrIrdV[;Ml: .ˬ+GhiLv:ůs[&n5";|=LܮHuM+2CDY.\DV[Z9\HD·GeoF-gN)g7L'iXuX^3@l"!C?ԕ:ϥSSM]Z+.vGsSI.v]NZ+eQ)奔 \ŗ;AMxWT:I ;8K6*T $YI dvtP6ּ8.֝]ij+xڸKS<j@RL돁lwxlփs\4$zb]=<@ޘiKe&[Cp~\r.}&<:UtSˍ-& LSXJ+.#\<[Qzo~Viֳ)qa0w"S1-:~@UYG~}Gsi }Xv鄲K I'hAP72Qnmr)@z!Z=cNʤC 5ԽZjSN͘\wETx^wr\ngJm2\,Ǎ[4:|^J3 L-(&mFRAFse~J( IS 4b[؁B\$xR&k5<9`׹+e-WxDt7U !t&5(d4 sziFG&'lL擫7[8S?{K7 FМքEI+)AMJ.EGHCF-6 OR+B]kv$˺yCo~yM0c^)Fs-U4IJ`fCZZ!PT d|i{˦k-rQhR0yO߯'BI7Q`ˋLUJDTX]X`: eŵW=?ⷁ$g/ kNϭ~//9ul-pmZ&kfmJ-g[ZjDR)h4 t*~m6{_E5MHkyno帒1cٴ/ ΐm5O& J'p-3쿜qÎniT3 欃8edTtg2_UiqrT*nL6uIKuxK7`p3")k-%q* 1J^rhRdV?OՎK޲[ҦS8#q\uK5O!6PqS-2zZ22M#$/*W"HI$CLX5I{W蟑>RYo;EQo۱NnZΞfܯ[uE?}}t̼RQuSoүګ*'|^aw.˟g0hbg [N ^&&}J8ZqmD"'QL|4i]i}YYk\ ^l?\;xߎ?*u/+=L&@x?C HūD[pѩe5 LA=eG$eI;St(K9(kųϹ3c|;'Zn:!ȾMO+S}+k;2\ZqiYb"dW#0A"ʾSQJpd *]Dzy0]C?œe2[م};t݉o}4ǘQF D6Fɱ@:KTCJ^HL Ӣ*#NEk{='u{~^[.r&䣀~Vmhl$F<0xB0n@9SءS%A3W~ATbA4g^NI>$Ν=I!p羘C4bsNX$S,WTv$xTwfbeUUgM ׳iϧ ?j@sOF$H~*o`\9$AP"Ӗ Õ;)݉*>]Xc9`pgF! 4Hu@3Oڐщ)*W{T3H'4E2pNwbGOjukui-control-center/plugins/messages-task/about/res/manufacturers/INTEL.jpg0000644000175000017500000001646513543125214026012 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    !1 AQq"#$2B4a3% RbdcD6Ww8 !1AQaq"B$42Rbrd%5(CtEcsDTUe&6F7 ?Mؒh˓̈́Q3oc& |N8&mp]a%P@c P, & }aioG=~FHzCtSP=#q阧( Qy-,7c w>$xLXͬ#U݇aq ɰmpt祆N1EV-'D^<_#A!(p{ zѹ.uw~7u=5lZ^Lp?c(^@m kwu> KP ;Z ST;Iyޒd9SU00NjEi*sL̚^iyyh 3zs7ekT>'؊L@@RᵫKޖ~Br޹/w#UJ{EQ7託̘}X!fpV>ֹjt\VI.Y#uydYz/^m"fuKݐ!i©RWKV f]T-%z-@RU4=Ԣ끻 Ukwx?Z:vِwG]TZb00U(Î.c6jյDBjri81bAp|XI^+5ZMؒf&,l1 ս֪ f;LeQ%cg:zevRGeQ(.{.;%jNKLwKyysHm]AUѩYet1mc4+Zf 6[.J.]x^Qn2sJkBV" sۏ ]"OTPɑ0.˶0gVx^0QZ1Ar mM/)fS*W Šԕ)p=@nCٷ)^pMx|QVe˿6+ ^ۏI2VüRс 2>M-a\)8lL[b&Rj*ftcٷajtl1y_1 J~ka$΍C"vJz+ eeVy3 XG=[(ƭQJӮ>#iɳTM06eVE)fpxBŒ!Tv\IfJ]ĥ@+],rp/%Q%H%Z mF=`b0qr|8s;11sϋs>Kn^omw)<} !ۮmH6JXg-vF48?H*$Mm ij,\MM4cYm%2lK)DOWMMGdۉrޘO&aJì+cES&8z7ϗqH^O-sc t&8d&7CQ/S abHtb YVg+f*ۘn"L* f!n;DEm@&3XkMdSe1%LyC7r"!ݤ]ij f&_LJ$ "CPtNʮ+*ZH348; |bNyךdPt Ƌ *5N)KIa"Gǖ{3ZGv{GGQXc+]꭪5q]6P9.&.kKdשiiGgv[.(!fTVG/ac^DD6У^;_Wf̙E?Iy l{wk&`x<t;T֟$<$qsjt6JRqGHs&ZT}..;jW]k HnV_zŗկr5HNQTymk77Djۘ9f*;(U_p]K]]y%:&n1`K5w}$B&P8:N, Sp y]U)t%&?0'͋:ّ.ˁp{iN>z:W{m!3kxm?PMƌ!LQ0qs(C.2}lSySkmkVSHF:01z{Pd44*Xk7; tjRh >a!Ȓ"ͻUңXʥ | ]_řq_EoRx d钥!Dbݧ}'#E'ow}o=g$/?wo^t/fLüs1;9?vIPjǤRy_%BnrY # - #I\Y|R%1=_76K}"emY<'1xs ŠqttۣP,Y SFAx@;4QR=b>tLxbczrLIeʔ9<6 s5=iwhG졸sKZ;KUMJ7>57= Z;^OwHfXZ>mvEk~#)2t̨ xIdFcudhSXR95%%$g^V "P ߄hjZY 2&''EYѦM 3Y8@ Bv* W%ҺJ&%dWʙa4/Uou/VeowMyg*-1Z4tn<,I6rGA:guD2՚OÖ\ZWٲTQ(dnӦgl!B+ynF4bu"Z!Rjz47i[TZ+h,ÙMءѯ/l}B|O矂"·u\}?Xk}^P1܄"'{-F g@o }oh]8k5~VM(K\W-|9 -u`Y FA8X4b ]Grn~_6y'B/GAh-7рybvKcui4STW8'爋$SQ,B&"\qHJ ~DHcKmj ;$w1 ~7ׅi&nU1wG0' ?M:v>_>.nϓـ*y;9w\X_vOwN/?V'v]=.Tb1+:^⺑5o"o7t)YavӑEyʕ܎äk©(h̞S˼ONMC~&zKvTXoOeHB"%3&Pfe)nC'zmZiݫI;Jw`FF{/n\ѭ6l-E'2=1rgQKavMBح=l|I}ak!󄖪_UgG[5LLS83CŠkOoZU*.JΕPyKD9~ikQ;VK26mn3#_1EQw8xLZy1ݗEͻUV2ʧJM/I,1ek7Ѯ*B>o wB飄O uK֨ett$i$=&x> k{\XU..2@pF&CgȔd'}YP_@=JieW K߽jۨRaZĶvL2h;>W901tڕJU@fo6/;JW*{;/00/^_U\"TZMXfP\p\bX/] Aw6ۦJXRX3 bRd'nZZ=~+JcyxKT]S!Gޜv> 6T:j^lIt ,5$ oOY[]&n䄠yʙSqy10.\S+DL7B/c2th7Z=# ߈.y-C暢9 . ֊v 3p) >^kEbkڄy%X!/;kG <1aN2~Š \ػmoӃCGܭԹk[ "46qjR?p04MI-bz(׽% v_THWvM)mǟc81m1޵2IaM. wQ8hhBN7 YZ o17YwPCirYe ï{.6~^gj@]RLT8wG9|v=R * ݘQtH36TEmUg4j HJ5רC/98ə i^ AG8b%g~ Dx ƆJMj]jfLM8&aO!7fpMv67Xo䳂 863Ã)ZC4i9hmJƪtg0a9yjyAaMs, 7Z=YKu6MډO>p#LCh\M^Pn8zTz|;廗OgMp!:WkkQF5mxD8ME+9zuy]ŤP(f{Q4%>n2ѽ6ӺF;" 1/v,F>*W,,  } YOY^FI`QqkvtnuNtiۙ unmRCdN^ҙL0lL'x_n+BqR"\>Q1VLO8KS|ظ%;:Sp.t OS mMیDZH}%ܵ&ѧ)vb ]efYKP|@%xMY]*2̕ax |Dji$kUc5,l<2|)i>$0!wdTƚhcwm=ޢHR@q?DY_x~sMjk.wFR (V #d¬8}fU0G͉Tm>VU>P< aQOqOBx#,ǬFJ5!i-Q}$K({bދAtݟ~gHjMC (zHyn HJuߩuU)5ǢJiS@ HfMah˿>ɰur])-V]O[ؠXvS]Φ"f@Nڥn:E:6E !/)Ch$1֧u=?RSC,ytc4Դ뽬LWP Y,uUn"QX16\WMvY f;nΆZζ]I"l(ɵAw>AZOY^FIeɿ (/_>Ƨ5|a;~v\?kf[`ڟu{xay?JaOƿɟy]γo{ Oʃ ns?!|o5`wւ~ݽu?&=^}nϟ?N}K )_T|#nÇ!P2~*U?c mwEzZ.8b8`!. 7c w>$xLXͬ#ukui-control-center/plugins/messages-task/about/res/manufacturers/GAMEN.jpg0000644000175000017500000000776713543125214025773 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1 AQB!q"$ a4#ST&A!1QBa2q"Rb ?Bۿ^?1=xjfTQߢ7!8q2FԲ7d${-*B)3R}`jVBK\YN߮S2" Qt9 QÎ7ѿh!'hROwߩd#R_D*wnwOG1wf"ád"t Q5,&EY =D{LǔX+!=&W1VS;w~cUL10!aەM/>^ st 3QKW 13Oꂅᦻ߂&MD)b_0b(˿6V,|ȥbBpGoI$D9cM`$ 3B&i{{X:z%*4oۜwWkMmn;<ꈓjSMu&H@Sʭ`@](!]#j~9Ԭ.zUӳJZVUTUCYcG: Ñqk'2"(o5qM h8e=2UH_o@4WE8T-Q]^U@/0ۙQ&+z~Lubp\߃ڕ4|>fP53Ƹ ;[ӳ!21[Rգ7UBM{X&A=XɆeMP/m-XHjz^9:K*Vd]z/6:k(a4OQ+KwztJҍ'R0R.vtDv_jh}ɳ?ω,@}P:ӿJzjWދPμ\'/G?~߹<:?jcQ8< )Uڰ$g*DذڮUg'%e57dyCfFzx_z5}{ӨpQrBsȋ$c|̃:'vIHKS jMǻ&x%6`(櫤 &sFƾ}flOmFնZ=i6n s YU"rR.*(^Otc(uEw"" l(D4!P*e$B{eҭU .V_iᧈU>9LB{vK(yƠ JW[h U<Ӣ 6հ4c)'BC˷=iMӧQb=4*vtL3|a1>vjj+ Chn")-tm ›wZ{Fn(kNx#UtB29놱C7ssj1#X-OcʎFrEjI8hӊl5W?zv"ϴ동2;*R%ƃ#|)Whq$zMb6dIbt&zqNZJ66GhY(.½ Ss3t)Q2΀nIMTa׌5/gRZV ئXwml^Vf%A =MڥlIWJC9Ԕ&\l 5BnIm\h"T&O OrM6=I1/k)# (*J !Ni<;zixc cV8%=:-E,3\ļqi\rJ7"(Vl1T%j3Xrʫ @<}_Pŭ ':k{>?#0:uM PPL磸|e5 N +IKW|dDKH}{pOAPf[Vw)B#m*2hSM2LBqZ ͽFӞg &NGUuz:{b3b#CcixjԢMYD fmwINvC@zeӲZn_=r*JxٟȦތ2nu/q0ͨ?Uh0qF( AdobedF]    !1 QAq"2Ba#3$brs4D !1AQa"q2BR#b3c$D%rC4 ?<970A7a+&vAGf.<ִJy~M]ntkTC0l \F["s(3, \o6buK8^DKzZٵ7U("D/BQFS)!@SJ q5@#Lzf)DIP1@i9WfGTA9Vo=&@jJ'ڽ>;).4&.8B-=34@(WI]ޮ0w%JeD466K UB}mfkS [7!% uuҖԧ{Aփ!yUȬ1- 3g)s"?ìVutH$s7|vrU,\)Umk{zc1M!Ug\xc|t<y)'mXA־sy\@P)^f/c+ÌX#nuz)}ƶqՕA /cFYL@7:` a0噱^,ut_o[YaMd9!䶞كPkݸ?ɹKWCGlPr3ru7rL+eQ V]xԸ3avcqxq(zkfT*7A{{hz=a\t4Z<#0!:Mnmk? >L gK\Z;"JUV"W( *ύ% jMRG^ClY9ȬšA*<l*X)iPN)#J۫kI0LZ9>W1-I_:̚o p{?3mRO8*Aj21.8<Ppݍ&9w=Xagb|-^Vv3Mm%ȝ9{@WA[ ;+MO?MLE`V.#>2ǟpo¯KjΟA_Th"ݍ<^$.5ʒ `D$9U]J;2r1qg7_8?#ia0"TjFNB <Tؽ@u֖ÝSHC&Zz*aV i +ʅȍ]]Y%iz)YO@؀4D=!ᲣP4,Fj3Kbw]B/U7Qx_29Ms_=DQf RR@|Qͽ"+&#_I &c*c!hCYZsdc5v tN& W)tB@&Fd25C([9\c1].ʨ3Upb2 ͘YZbbiR`(#eKx}L#%ވ0kjqAjZ=bP,zLvwa2eU XMVYԂó]h?־]>=n 8f/%`nry~T?~$25Εl RNo pyt2ZpJ QP/8=l*UU]PZvM|$Zkv%yYƒDn>F2gR+Bjو糸OǭOمns`إ^i`DBIٶ6)#'46疕:qRO8sbUaNRtđ6EⒺQ\ʈҋČ\$8S1}Tߍr\Ijuk >~[[|'^@S$]GβSoGzYE!\/%~STҀb]-~4X8v)g|drp8K&IOGSMENغ7N_=0,8sL`N1T!2mHcm^H9jnܾ:}n&6CX]#.f|MWѯQ-לe.eV: 'TV\^"èc2CtBLw^`)Њ8ո^asF駋O}`*H#.؟9Tb^iWRS5?::ޛP(-fk^#4m:1D v5C ,"12ûg^jѼ} SX_=GEG UlT.+Cn4gV.W =Z\|(g <܇(#9yaіliIE%Nl1ϡ6^SWEZ M2)<ġz$˻zbPKߕZW5 =L.hamb2Èџ@p<RtoPsVqwU=n.LܲSi[mܒOߓ BˆF n&]- FyO}7@f5Op%lϵ1չhg-iL {Sȵ iv/^EӋSgE.B.1ԖDn%9L=Md0|%* P!3e(frId٪X`L;M@taRp"ֈcRdC@3P0ÖUz'#zNUsMj`9aX%$IXq"QsPGHU#R,VDV"įC84ޤ:Іˠ+妳P!E!N}>+E6֞c_\r7LpzyB)pVɜy=ZU;nrɨVLNc}KK|q\jƩW*5&c$uU z_.#-7"9v~Izb.BE'S$L1\ eLDʌyLbοrb%k HW0Zt;o(grܑ̳'6k){3ڂ\Yk]Vz٘/ k݌,ro` 6u%VMIVlv~C7=x\_YM|w_sc{ww7Vc+S&[sUng(ߣozVϾ |;;_sˇ-XwwossiT2/Yl˳}8{nމɤ&C&9w=Xbb|-^ukui-control-center/plugins/messages-task/about/res/manufacturers/OMRON.jpg0000644000175000017500000000730313543125214026020 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1 q !AQ2B":$tu'w8Xx91A!BQaq"23 ?L˓?v ƴA3A3/As] /1s* 0vZ "O?6beし&~'(A3h(f=X:(gو_H=X,_9c8r0T l@`쵁1.A+E> mŤ.L NPgQztQϧ:zYt$0sp"Ϙ`؀k,c(.\;0W}<˭tB sEݮȧi 9ӳF"J^W"aN!ĴzR@1k*שªT*jo5i-(҈i%ŭ˻ҳ=qT2_v Vn=;y~mc~v߮jQ6Ֆ6&WobJNr1%Mi¦Pr:CRV!ie:MHY ZeYi~gAci@H'RfEy߿zJESp;0r[QR1cI6>h"df_+!MwJD@TRfˉ'B%*$LQhS(']Eo}}rPvkkK[f{2 uŘOE;N#v26DJe:wIm{8EJF;oU^ړ{Yp7mmMiao{7V5]<][WzwF4/˔+'wgUԗpwGvm.}]m{hj[Z)$XX5N#Tf1 ɟVud ;8ekr۞[Jq}7mq_#|hλ^M·ܪ쁮Ɯtkj_D^SFV;\!-3LߒˣK0b!,VfL>5ŋUTĆmTu mQraNVL7⯦Gi1K̝ovjepUmq[rgWnhVijUә*Ew/K~e6gJɈKVNMURF(*rP a2hMq4OZ缿ЫkTɯ@VsS+SlT:f2T)MpT::чsK$دĕ=}<[7:J VRJu R9C9G1V4yKǔE]vHK+XKnv|9+2E[\\"hW͈pNHs>k6mt{}ɴވK"iY:ܙ;sJiS>QakKDΣS_jԏfFNoMWFQnuARVMhhKǺ9l݅&´!nүKR?z6"fJi BvP0eO75U{XMAs+ToKIƐ&6czr_sӷ]I{-^[b햺۵s'ɪU:ktQ/$}FW@DC62Tm|ZLp2݀&|LǫEL{1 \çBK>g.\ -  22:x፱yceɟLcZ V b OV .}\ [;-`@eeːuf Ob1i2q˓?v ƴA3A3/As] /1s* 0vZ "O?6ukui-control-center/plugins/messages-task/about/res/manufacturers/GIGABYTE.jpg0000644000175000017500000001317513543125214026325 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1! q"B$AQa2#D34%rCcud5EUF   !1AaQq2"$B4R#3Td5rҤ%Ee ?y6bIGrma(m`Mr4GɄFk{n+ݺ7QS:ʪ<⊛W shÆa Bn |=yQ,,>NrTͦRGZOL<~0N`ĝHg]oYkӏQx->9j(~yт%fEq#WIZJuSHzuHJ N@0}(0*`YbX0h ˰L 960o }E`,kN+an%jѮrggT7`ST2> VǺ)!LG&$'˽|פI@-xJ7T,o7`1@dSr1Z&uK\҄ewԕcNK'9 ϏrQL11=ueY*SAŵyi퍨C-@tzV>֖gJ5b K?ьث^KFx+P7bWs UP_P!Djk0 DGqRXIf "0ڲJX̞ =4[4W6jT-Gu{|.[umTm'UATZyd)91圶ˀL$ ^%=˔ʵTP F-Z$N)+(P%Z4u*VS\Ŧ@qcsO+0 ˰م!o}] {]8qOL>L*7HG/֤ޤ貔MYu*αxA9!P o{oX-QE"3BdorcZ>i15@4P?^WVZ=__;]jɶ)e"1Cqlx㱖Y[f#ȘC\DʮKLJ4xsoeG-]NXѨ7iss&Fu}nrZ{YBBO7Txy[0ǘ4N+ԗִS=%i9.O,< >Xk5IZt iEivnѸ'3P4st`0SO/Zl+7<@ 9R-5`o:=:ycnBe Zh60xs0Ę\v=X|>f$֓f&}AJ7|\PWׅ~73mBTLږ0׭nn5?b)^R)44n黢vfF-sXD96o{X{ZPұVߜgY,*G҉EfN g\/ްlq遑xlm0k{nMj71tUǭy Da*dҐxv^ k)|]&2CkidDBw^hUʻJ`0h<1DD[K'slMi$st#G WVO0YmtؤgP˓Z{˥-exn>C2erY 9NHu] _- !>>:OwA,3hcE*n"9TQHm^LUɇd CL z6@oZ/ zzz|>f+5هɁG&FRUg0vǻv|'ٿv :8z>93?7|15 '~RI˸c;v{2|Aœ+ڷB׿ֿxיg|Iq/ScvoХ1w]n6zm7gxu'q{q:޽b^M_>F6&|.ccX-ٽX;5T|⮬[#IWtӉA巳g6sCMٷxamB?s˝B a{sc컹_ofzx״>UuOKk'ɖ'r~{ܵ + Dl|+/`=x3n+_W}kG4|]p[S~ c+m!D%~QօkՆE^X!\@RmaĀ@#ҜZ1kXv\[wpzJRArW{Sq_S.':);NmZuT9Fxx3sIe#KƊߘ}86ҷbyӉX4؍+{+(!!56y)RI),Gi^wGW5{8- m%Gq=K$@'ovE+qx2EmVAk ޯ8́(1o^#1c9G_]x;G6XoT#y{}E:^]s.HuEC>Tu˸Ltm'RMJWa%Ƒ T{s|fk3|Sqo:9k`4$_1?TiuQ"]{Py]078RĒbJ R:% tn t nYiƦVE&>#I9Mѕלq6EWdVA]:ݾ@nڵcRTZB\ @jy-yXV==m/Z!(8(W$I}i%doM\ؑgEL$7!-oa'QE~k=.2M6ɞP;>J:妥- hÉ B`G0\`Tyk}uk*QF>%M}:A?e7mꛄt-= %*Hy|zֳ9[٥>W;;rn6t D㪕9=Sj}#5i aE 9p9隫'm2i֭5ld @f}NI*Q'u(C9˞?iVچ穮/^#J@Wn;k4^ ,aI*Vx&a ,./vEۗm\=^OV]-h;"Zzj>Q veJ@b\0:gM/3o\a̷)H#y֮wT'"oZe|$9 [5ޕq{IxA tczY듨ꕞU՚>tgk7Uv;<:q'lp)HZ mVKQ\ɁX\P@+hZ}w{ž %"ckն!Mmø=SiW1JڻCZۯȓ[ܖPOpg}D#*ڮe.*;'ӑ=j;Wy!o8)6-Ǻrdp#ﲝ]R_a$ި'iް̢fH ݛOQtOޝ;^$yO |\v};b }x@鞧N~%ċ,hh74ODk|FJF2:jJ 9hmiʞBkf;911<`rTQ\IQD!EQQEB`v! (B(((!?ukui-control-center/plugins/messages-task/about/res/manufacturers/PHILIPS.jpg0000644000175000017500000000752013543125214026237 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]     1 !q AQ2B"34#ar$Tu&w891A!a"BQq2R3 ?&ɏ&;J&#&<= .!e4gaXK"K #X sA])Fȼ [&p2cIұDIADItBDKpAe~ExAVȀV/.Wx}Q/Ʉw 1;c4Qb T%6,jOx崤UHNZ;-R2:,T]َf"lO}P:7_vҽ>vd/I csԆRZbj5Sw7g#&߷\).`]iy^bs3UC)O`|)ESfȄU10-7NY(mIEQ7NHוLZ*ީY+6Qd"^ebbXh\wgNY]3lJtk\rs@ᬖQx6HUiyz#$͔pgm*8Zn1e.9%$@ iW*}[zu n\L >ABIkr ZWuVg Tu9U;YB";8U z~c6z]^{ϋgއ{(~u:GVJ~1Rn] xL/Ul2Q)T\ 3v.//{?ǡWJ]ȈvөNztNrDTNnD{:W_JY2 #7 1ữQܛ$#pUpRʪ<י&ۮ(ly6}d/Iqf^wci_U.=U]촒L8UBL-ͮ̊&a$tkdTՙTȋr9.voAJ8FrOm\eU0Hnvő\ cRoŔr4<*5\* )dQ4$> mtS4< -Tҷ_52?V{|& U7^U+հ')AO=C5MNd`*g'*xERl&( MOGӴ6دbl^2n~JG;]IF_xgډE1:imbgL"'>&\LhDm-jȮwZJ2#ZUr)rvs5a;b%J?`Orvd/Gye쿠K'J(e*ijpVrݘNt7|:R%Hm{,R0 2[.1(AA$L[&yXjZGZơdu.8XԈ+d$eP6NTsϙblZށ0F\֧*tJPkדteNH44%愈.y~"HZ4~y %Chk:Ա(*oH[ZJRz]2;$LЖ=QIŒڴrwz uaf8҂6JjnvʾH iis{SK'3m6v#k4}r(Zy};y4%d- cIgI@ 3zqEQ}m>vߦ~7-n+ե6WZ3< B(FY̅޾I 6 JV!AYIAjŻ3$5dd.0]ggI8'$~ds) gdBQc5RE锄WyCLjjm6,X.S<3&JTgQv{t8M.JPq(dv*Z;䯁<ϺK?焻{t1<{{Gyɏ&;J&#&<= .!e4gaXK"K #X sA])Fȼ [&p2cIұDIADItBDKpAe~ExAVȀV/.Wx}Q/Ʉw 1;c4Qb AdobedF]    1 !Aq2BQa" #b3S$4D%5U: 1!AQaq2B"$4D5b#T% ?y/ƧqYzbD۔,H}:L\AeEl .䙊iZ݁#BŅLIj[ eZ|jxW r]W.޽k kZ^璫wRԥuY8ĝfluQLxL`E +?֗Ͷ/_1p??b|NS')~??8̰#jnVa=TbbC;gf?GLZiћڜ]$3sPҺ`C vZsNi&qNsouhe4:ce7Te:mI ܊1 jq\,ݪ$_էq`Sރ=1eCaʙDDr@3h2}|رrz XwV"g1i 5µϮ%Ϣf8&;kXar9x0{,`/ZyI,Ht0 )#cw.-H% fߚUs&TΪ8VniZ^y]q_e?zhm8+Z͹PGNt5ZAvYɲKm4],*FyƯUi]iY`g WN]JWL<󙆏~P:/*I96]nfnYw.#cTE>cn{j!qFR39ȹh p-^ٛ\ ?y]{#f8eѿ;[v^҅967!inKO?rZI'&}hR)C i /h!wުG}jUb"$mx sG07݋(bUA_/P7GK~w_ ߶ywXoVM1ZϵTԩ]h)^n3FFyu[L# .} ZViis7gx3fxa @k;GJ$u#MʖP!SZerx~L2NjE"Fa+>lz|˺ϣm>A~|4'+aP`G"32" 19FJ|3f hKk1+l@X`M|"ou0]Cͅ(ܙ/C$׼0Iލ2L #@ ;S"{%黔ZM1yP(a0M{*)j>-Ȧ ـ.”nLV!drQ$aoF&LEˠzՅ=-&rka c0&ؕI5FSGLPaJ7&K29u (az`0L"H=ŽȞznukui-control-center/plugins/messages-task/about/res/manufacturers/LITEON.jpg0000644000175000017500000001173713543125214026126 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1 !Aq2BQ"a$tw9 #Dd%7x: !1AQq"Ba2t7r5u8R$4D6 ?M+d\ԅ1$^U)|Ժ"M{}R vRtI/I˯0&.$Ң%r`R:eOw JX\ԅ1$^U)|Ժ"M{}R vRtI/I˯0&.$Ң%r`R:eOw JX\ԅ1$^U)|Ժ"M{}R vRtI/I˯0&.$Ң%r`R:eOw ˶tWXW#{x=/ml92A,HdzڂVU1|mpW&|3x[/6Czv2a4%y랛{VFO/ߓ􈁺֗ë{)cU/6>eKN&";r&mI!tt-t|&ĺxs>xS-A#ZDv2+W,5ohDv#@{m7 9c(fAZY$xqMD+U^ YJ5,%aD_-&- 5.۸bCfCb#k}Jo=]۱dE!zBD IjHJ=(UǴ)۬Ժf /=&tU;yt "CpG'\ɢ|89x0 #H^Q-vXՈ_@;+<5:)׃`=,*ro4f Zӎ([͏e y ]!~C>5* Z.+v!T[HJ'C{YeES~q諝3savɉW/!z݈yݸ>o}*EbXI/5)E;(^X&p9DDH,Yw/ 8hi8 & >qFº `ܥ01D'x:OCNM|-bckҽ,Vr'+G-j":J=+4?ݿ4"7ci1dW!&'i|A0"81 tp9s[FM7 q0șZ !L/n2 `ͦHG/luuCIw q11ˆsZ;u:\L V7o-/_yu@E%H&yUZZb5m"£XTK/骸k1&8Tk5{Z ꦁր H"=\N΢Y;JoDIpjKM-Rv+,v4/R1lE|pC5{n[\KmT~Uq|I &d̲g6@db[:c% #d[?YG/ h>XH4ŜfA *z3y)P1c=VJ ʻV m!c*hKMUmxJG g%rzTmWoP L}gcaN*~eU?)Oͧi8kngo+Csk{պD>~ϦL&OXv(jgGOciKRC;1/sX at$INۂh.Wn 's^oq !- nm3!4Wz"'W6RT71YpZy_X` ā9eRcwCJb٣VD5%Jii."%d4 V5JNocM~v Nj\b0e:㙕i 9 F~a_My#Yj]oˑqeW5^//oZyL?0P_afZYytU /ZұduA70xRX\j[őpRfg2b7&:rl"2F_8bʃ?)&m5c֑ؒ9zNuX.bV7MdY%86IV;_F&.Lɯ$`|F/C>Ox^-KnK6_)_9#亵#~_7ſ6+նE/aJdj28嗏 =d Gq*.D/݋NYRlh힘p$@1lKvб7m9?!#@y-u5+vDp I1mG '%JV)X @1/)|aǏ '1R9*%NYi꓎=Ў8q=[gg{^:ص_=tKtxYWuorKCNyd'%Gpzݥ8kyˑ%l59&6bav_ q={V^ZOsvghDHl:0~N..@Kl̪1a@b:""G4"$q q<;SW.m:ȷT8I͗TQ3 Ϝ队xa{ڦ?~^lmpRّ&St,"V4x\/°T5-\?RBx93δ/rVK:]Ȉca09t$@Z1k A㩻FraMc f[5=Q=9d ?2n<Ȱy"Y<6ܘ"7=$ :pEkEj^D Ӝ38Ecq5qq7-5Ns 8!JQw!&| $".by 'g~ox;xrM2j-%()K@xq%8~ݿkl'Sɹ 2]{Uȵ]wбi4UɯHSA5Q"MGK)׷AU o%)GDAP\ Qa@RrH *(2W.E(Tyjбi4UɯHSA5Q"MGK)׷AU o%)GDAP\ Qa@RrH *(2W.E(Tyjбi4UɯHSA5Q"MGK)׷AU o%)GDAP\ Qa@RrH *(2W.E(Tyjпukui-control-center/plugins/messages-task/about/res/manufacturers/G.SKILL.jpg0000644000175000017500000001360013543125214026166 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]     1 !Aq"2$QBa#4%6 RCvJ !1A"Qaq2 B$4UWr#T%57RtEGI ?4? xx&d2_X9F(9u m7C!t<ႂ} li4`#x 6 0;!ka 0]CŁ0!7AA˯8`ECl0 0 < [`I'D&VSW}W+n!Nmr\y$ 8ՍCjv̊T֡O=(o27U+P*v,u 2J5:0$$ل o$[l8J360)aBq8F\˘Vea#&RfgrUשMT31.nY:Cws33 \.эC/l#t]6 ]lA>?م ވbt@1D7CoWl޺C|E #;gܼeROUSATSUvć@NP)80.tz^͓mԪa{N)TɝSPFU@Hf9۳hwcMTmB%h@Ab{1͋7qttJя"abuEZ0*RFQlMw[Ǔ'm%) {W;Q(JSuN/&-Y/8P VG|9R+ϣ/Qezw9eq oIo /oW4w8誇;sݳ7XqKv'a/c1W<\8i<`pY)Js* 9b.֊{C9@!S=Ͼc:$j:c,P 21Fg$axKn%[l{Jù448#qe6)A@YS;1C0BP0+h4Md yȶL-#)ϰ#43E&{F-TZe-T-Mrv,)S$OݔoXLBe!|eܮ_C6'v\ƌʲ*"`D&jJ-3B]44 jPdj7IgUf"RzltOV#sJP5EA.[v{!#ΕLsODyz45"Nםj+#O {VY R#sPf5Jr-NHVHoI=UCEyU}G %+<9 ]&' +}d7mnIntI"B-ӷvW[m*ovMJ䛜DIJr(.M9tyYYUtLZtԐ%4)4 sFDӎ3'ࡊ[wۢ<$IۊIwqΕU$5[*H N^Tr-f _cP,lɇ ]3ʕkYoHV9FfJrntf VpN Ϋw1v%ܪ:);J/ c&@2˔ ;/GDct+jkOˎ[O'0$InDM7" 2"m~aqBPe ^"1d6rC&F4 RZӕ5R5 wM+!rV/6$O mzI"HBgU$FDʖTIHa #j%O]LlSi]CXoG7SӼ%# :$miR?tr>mÊ+X"Aj|B M)3:{Wj ruu{Дϛc=stx"PjNEM m?+$$I"zޑ_ɱ4LǎF<qa~HRr`87 -kvIY 5W1Fx5-~*N`-EINbQH!C&-E=`JdtɶUi/ ip$V1ҢVm L*' re̕Bi[n,HJ/ѳc E NMnS ˨s޵Z1"R Lޕ-*"O۱wFL~e{mN)tݙ-\Y)吐91Uk,14C \S;q+ te. kT\|h6_Y}}Қ /*0QQfJn2Q?@)ǣb'%X)moJ:MJJFQLFFFHRRa*U*+~;=fVjQtI?apG"[3j+&=<NNsbٸ ٳ=+7]帷Յ[) ۰B SHx4)UVSE،Z DP2c LjۃZ3Nx|6fW[v[+vۛPokD>24 "FC>JJ4H֊\ּJ6DDy$2xq@+֬;NTРJ˛U\@dWu(1X[N2:{ε_XN=B<@lyb:[k4ٽgZlPBˏ`75/l43yW( lÏx kmV+6]~!|a/Ưwi ߳~_Jכe}b8q~X0Wl44yW(ʸBl7 768/l44yW(?Nc/F-fLα%82% mȜv#gh/c>K~>Zaq ;EZʹ0ex;cF/tayi政t_%/Z.y=(eA_3'O<.chsǙ!~-+oGt|>MƱoͰ߿`z+޷rxELn(c&V0Myt<0MGɁ _ a, 6 ]y.aMi].6x`wDZM1: 95!k̈́j>Lx`}h P`L>dsPrt l:nL(B9t y#f/z?ukui-control-center/plugins/messages-task/about/res/manufacturers/B-LINK.jpg0000644000175000017500000001102213543125214026033 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1!AqQ2B a"$#3C4%v9 !1AQaq"2B#3$RcT ?&X&B *j=Ը"Mz{(#PJQ$0snL.”\bےJ ;”zS)> *U@ɯ7kʣE u.^):vRpI/*)˯0&.(Ң9tO¦)J&yP*rk) H&K)ק? AuK? r)EɆ)K- 4N]<)G2oR[Ϊ6ϷL -<[\^V9s`X2ӔgT7-X@v"WJd3_C\b- Bv<фpEYTǜ}1b(6_l73[% V1.x AݭQES+C6Fp]Kq"Vv[4u$i .'K `ΰĆ4iwqm7nTg>@^ӾPŞ̵ۡJ/f^[qWjInM6Fav7G%wO*WjRY2̙k<5>Ӛ$AXq|?pZ9)d|'*0d6]H VصssUnuku67.~}XZ"qU{iδۭhIY2rDZ蹰o!kk[ ? ɛwh1kKcxMPS#R(JP3(uQ/ZwtPdwt]c8qEngnmBUN9G  #"*lN *Xs()mP F؞Ս͌:>nur5oL[Vsd NN.aG+п¶W /*?*_"/\v.Kn}S?e$4CAql=vG7JM:gʱ~q|p/WҘs%4!2 neVwش6Һ3%[IM}.rf_Rk#Ka㏼e Ļ93{: /XX&?]FW`oF x\Bҫtvp%*$6j"dÐݜEdL9]U2Svp%E٪ j4V17'!w&HB)$V="?wDvF?x@J!{$MN_p&,rd"C}js集oTN"Fƹkre-r.eR֫ > }ipU^ :]${6=Fj[.TH7F8Kl4 2F>E0<0B)1vM @}+kj28\ik1+%EhJfY=G\N>K.W*Uү*NM}ԅ1$^Ur){pE PGH.ӲI~`PܙN]y(0 )qE$)ˠw(R}<1MUi4ʁS_u!Lo וG\A5\H&=R t(_9T7&S^aJ.L1H \QmErJ=)O?LSzZM*THSA5Q"MGR Oe~;)J8$~ ɔטR R[r@iQArpxRJe'Sޥukui-control-center/plugins/messages-task/about/res/manufacturers/MAYA.jpg0000644000175000017500000001606613543125214025663 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    !1A Qq$TVa24%B#d&F"356v7GW  !1AQ"2aBr3STUqR#bC$4D%5 ?\a57" ~L']Xݐ`5{"aLL?h9>Bmӧ!t0>8>wBoiˣ}!}t1CCw{*H`u{ ;g nҮt[IPy} "eΐ{zw:g}C4= ߧiWzCޓ_ggO~Ү['C ,"IR4Ws{'V?Ÿģ1SegWsm(+4D$jq̢B9[獔!<q{7crܾ=%a˪ K@l [l\eJyً hZUJYY.eiL7[ 84CUGD JB:hV,089V\e٩@elqz#Px6_>xƥiylaMXeNmM,cb_(8?A/ \8reպTz]K0dO,wmuf7%ߦxr8x/NT5} p (N'|ʣ*ש5y?@GG<|xs׉tTs4 5-r`aAN`Q,bb+hh B~4C%A4J{@B{?IBWw+i^ڍFت)9% mPFh3IgcHBDq9{{ΛR YPC,pU X;N\3*+E^L>znAÓu9|ej3OFxKȱlGIb۰' mjeUl6\uwa9@ӕ QcS w.w8a2Q5䶙~ՎⵅHp(,CtqڧSiIms 468Gc֊w.m*urĕ+Ch%Tq@Fk#49x0B$Ћ0w_\]CbcƱ!JG^ꜻ'Y]F˜[[EZMxݒMZpq[]NؕG=;K¹$g6.XaF`cnrR@#>\N1k} winC930Oڰ)BP7 ɴfWG bH  pJ6Yt&==TJr@lYC0c7DATbǜܝVו:zP!Xk_kp!\ZPG#oN|'iY8+o;H< ]/bZ2)5 ^V;ҀzrQdGli圎L0Z" hB=7yCFbCZ ehui4.s9iCakll(6ഇ[ 1/^[jtP)h $p!tL 0C)Q01AX#Wȣ: i6`Wv6K j'@ecԕ՚l\' J;%1eT˭6[QĶ,F qލJDO>q@*bRA&M8cn>0z9etΙ9~bkQ9 kaUs]dh:g*[ysb'xݾ [4sRۜ=ڼh5k4iAlHKOp' ND0C-usDmqx ̩~V5HCiijZ\քDU`S1 q&`XjNY)4UhL$T qivS1N/mر}S۔z9}0@e 3gx-_ޛ"vβ9֦u BS(Kk6dNUw"q&Y9e:me$C(-%B\ fy~i%dS\Ygp\b3~&UcҿiހD"UmUQI<9^D8ק+N5!uadp"0)x[;m:IIIYa#˸macOoC2ЙvO&L4֓PT4Tb}"xg4dEY ^}cF68'mK8]վ K/=ݵ"Pdt7umm5FJu %*O*=D*QFH$M@J)RRI$Й,G3$i=j3\gKǛoB8) d:qnM:Xi "Ԓ֢K~>P1l:ZȜiEuzm%`=1 E al J- f#J0ߴ=jە̵.qz͑xӔc!겐,b Mܡ"9XWyyxUB2ʨJ|pjC\\Y)-fQ.sIn,D0w65V0#PK$5nhVH6J9\sRԀ*-%! PTAPNiq6YED[ͩmuO[N$ʵA9:a(CnZ[VOӚT:IG4I{b1r-V:;=C[$.>Eظ5UdpUn*ބV<)KA]&ԙH(`ns8963=տS4u- η v DU=-AgbLٷ|J z¿JZUYB-\,+" 7tpm 8ʹ5Pj%GGeQ5.A2/Q!2_@!tf@J.X\fS씧E4 I#ˈaܓ 8rU!Q=.atM,q"VBVB Dm ٰ*wwʭIfW{%Mym8tT.9UlJrjGK.>1 @ ͢0}Mh!ĮyLMGrS=!-]ꂡ0sap5\T;bmֆ*^RqPUY~R%Wȵ~*9ȂMtÔq{ϲl+gTS&af4mqg$A)j F_TӶsG o$v% WMj*= <}]k3c5U9Y[8!/4p=[,0K_h7BG%60c~}s lis)M };ѴQPiYpc$ ~Oy-3{d{cj{2^mV60McK2X[LmPG9vjz̆Nnq3"ъٗ h6홷LW9g6ir[IJ*$ڲ Im kGЈ(pc<jP5O4U\ T$=S@̲i"3a miaڽA=빚J^%oms'2qLSͿrI7$s70|&^ʳg2o jpR 'nP[M5`z,&Tp$yzr;bu79NEج29Ze6dKJo&zwDȻkue)Km5W8L )YIhUQM>ޙ2/&@$=Yc9SlX9`^[ J^v?(AɁ?+;_T%SiJl<男oiMS̮*0 C-{A9exE15DADxq(3h -q #Z,Z9X;-b*mg\"dl+ƣƱց Q  AnI`p Ĭec2S736.n'd?H|m/=W{*99oˍ` @+,,ļS9\08x1M!TЙ(AB0ˇ )&%|! 6Q"'蟱ل!S!iNC;ހ=@?vV?^# [}^-R$H#TN+6t[>ϰʼqUy{*+D":d G95T$B2\UTݑCOb-dށ|o‹dށ|97){7p;|߄#4绗3<_\@&?M#SNܮKLTٱz{]k~GM}Q;rzh;`u0jR\{uO~nOMͷ::{l.DZZ~Tڧvpw5\eY4SR{'EߓEЏIڰ-g쾖GM mK잖WMsM`'كF#=4?Q쾒OM~LD?m?uU}vOKQ쾒OM 1]>O,5zI4Uw=~+]qTٽ$Su#G47MeޒGM^o“BKWU}C#E&oI#~=YDa57" ~L']Xݐ`5{"aLL?h AdobedF]  1 !AqQ2B"s$4#C%1A!QBaq"# ?˃_t't +@5t D/@uN, -\:a,DJ%KHV.%/+E>؋Š;\1;tiXQק!}vAeH~io"| b"Pq,l"ZF2p.xA^b)F^-p2J g= eӲ .CKgaXKca1IwK O6"9;Ym%"4J7/wHL#yȤ%JS}XÃXbXQke5YoHc KH񵴧i/z4&R)37cH8EIP-2F45,hN\3Bw6^$ i-@Th)T(I1 1yUE0RqiBQ8sNz%%b!ĖV ٷ4y:&{c?d}UsqtrQJ4§_kZ2tFJP5JAKXd2N]k"!T9qԔaeCIp\>r(*Ns&j AN=J4k% KH3*quN녝txs}M?QϣNр0v"97n IUHs0M1OiXVLRFC3!NRxFB\0zCmRYgSÁ=GWjҢG 2ls5+US΀I5&2˜kˈ%sݼ roDZ|hqWZ7)RNp APHS[?1eBXa!(e4YxջW3Q-L'CmE\\tSkHA)72bK̛ UQe){WZU6_(n6U]@JU9['=:s"MebNlE|of^7e4sƛ˙#=eݘbE:(򶊔f8ym)k,k I 3eTHGJe3SnLQ\k>r.TDq\e{o,[6 a*НJov\DQBI KNjUZO0#!3'>b-4|aXWBq9տ!/k,u5[ 'Dp6/<ڮ3gf#'T : roşr흥t{vd^d(EǛ5 Ex^9QbؗΛO ѽt47( OC;dͺm~eڻo%qm%q>훍7]YYBϢHAIεXtDtyDT&jEK4۩F[[WO,YXq= guz#ܤ'166V'I}mSV*i0:5}[8 qU+S/Xǻ.q[Wqح;L>-&t+u޽uiAx禑>T:>CPeOg .=5۷d$ O0|086ˋfvkEġTi:ӎN-ECPazP[x!r_Шj(m-Cor#}lWZt|_Шj݉} N4>U6Œw%vA4wn?,S9l]IKQPR/B23.)m%/(^^,7/;/גn͖~rMYJcT&D QJѱzvr"rI;.uC- d*g-^B^3۪&x7T.U"' p?1&_92JOfrFZܜ.;zp/UzY9ҕw&:Zw+Vqit9< [= ?\fC-lm}7-ZT@T;p 6?%rOsYkGm:QFH'e wF Ϻ z{" :˧d\.w "%%c+"NlEbi. }Ѐk4Q}p(k]; $?4FvpPU(86-#Xtt 1w#b/CH8pk]ѥbD^ȅ!3]%Aıiäyӿzukui-control-center/plugins/messages-task/about/res/manufacturers/AMD.jpg0000644000175000017500000000742213543125214025531 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 Q !Aq2Ba"$C%1A!QaBq"2brD ?L9&* NhA3Yt  _Yh$pqrr( T@Qmʰ">E}SZLeɟʃLV]"&cB&} ouZ /|+\ *BUj[d 21HG񀡄J~<~j.*8rg>H (Т n.aEK !.|BJ8ScZvt-1)&uDۺ{ZLg!zuA<5D淂e`j-̚&KrRRۚmmՁFHvC2N[tx#lҽo_w?ͯe\"|0gJZ2q4iP͇'*x j5OnaQ6Yci]9>RĚI+Y JϮJA9+ʡv~ ᬁwC-Rla S`SM\\ `~ps"z_fnq+mz(vEp 8&㿋?B~6c> |efi7 MWvƶWkʢ\}tJ0Э; u*RֆqŸ=`]¼_WlU9(Z=5?A;ZLgM]0~dQVknڒ_dv}JȽ/ qB(RjV "]iۧn[p5c[lvݽ];=dUrpE TTWAN[&Jq @ [Jȹ[-:_#^&uB}FHX͕nʒ".(}$gOW`t-i#o&CmlwDI39-zw-чZpHN2U bɵz _1eO%lV_ԃ*Z 0!1jTf-zC20TT(DxPS_S=G)/T-]]M=2%ǜQ2"l |iY7%ìḿ3wI vJ 4>\[-:5y"6 %V8K[# OA`s=ە1wyd.?!1,^؟f3+0/& Gcӧӷr^=<\}i')xv`gyؐܘ%:^E"4:0?cxҿNcrMGHpwzVe{rtXd:3AncENB/5Tʒ FX%֥kU?eLecӅKv,Ӫp(T;5ݽ9]B-DD51D#n*5 S/o3!yG ԋ_'JoKHCzx ̏U|ho^8ֺym}zO.ԚpJ'd)`?x]q&όRʓGcjcNDXbìSy10{}7{ ɨJO i,:3M;Cut.G$7#̙ٚO'*1XC`ooqk8ʧ,ckƟݕG;ri4s?JSؽ-&Up2A&|+.D1QD> \÷->B.\!* 5--MǸ<("~aR3->F-&U\19υe(f? 4(gۺ|" vQe±E˟%QFB* OǏҲ1i2し&* NhA3Yt  _Yh$pqrr( T@Qmʰ">E}Sukui-control-center/plugins/messages-task/about/res/manufacturers/ACER.jpg0000644000175000017500000001146513543125214025644 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1 !qAQ2B"#$4 DTE!1AqQa"B2$r3S4DT& ?Ld3a cxH&{"f=\H&}=):{0KCrer07$X ːvvwTw1Mi2r*) ĊR apE `#0”pI/ ɕ˞‹ R 0ܐb(.W.AQޙS7Ť?7g+H&cمg݀\ç Q$Po7&W.{ .L1H .(r@e\`waGzeO H6_\XE;v2^]](H.*J?=Arϊ8r,>`-b>G9NaErm3~cB'3EC1!¬:XPY^AQu]FZp?K @+PineoMcMz/mlpkt[[^{Q7J펍(2!qm)ES>vk};M!ɓss!BŌ]F$%F疵G:[gWɢЫ|-5ޕFxOڒ7-!(SOi5m˵:[ jz;+#@Os ]00r imw4!Y9,Ći5ڹ=k-ʋQb$2 5 pr[O Jk @7Bz0Â:|wn)Y cx1cv \,ɻHѭU ~a]P?o9wigH _2q_Do isꡭ@ck#nC'R:P_啤bQ i52w'Dq4-Ե}E37j^j/Zz˥J E{q'pM2msqf|3UBD-n .[WV#}5w(Qۉ RP)TQC 5%J(fTfVg!DxF]`j\7,XB3^bֲfduKnE۰jgSS9đNO&-x4Vֻ/xڽ>/N gs!t/lRS:fo!SdPd;U>1@Ge樞˂h- ,__'qM PiiVnf"\d4\KH06]YS:+{ə+l ZnSVڸm ˬ\IGR{EP56n]d273iK@J+nZginS FTJŽ Mv RJvWUvnPi58&Nvb/h/\6Gg7bZR+Y1+$K2$^O!IPG?&J"!v>ھz D =ڎNj\ʞY~1;/:+رrƀ;׽U>,LSx/<\yhܭfݫUρ0=C$eE0q JfF(,ؑM%BSŷPSE`n& KpĝgOXDQAkⱝ uV9sLrem>*Ee{xM)HdZ~x@,'stٙx8b-HʡHIH pDJ?rl t?Pju&ddН}ѴLl 0jB"z&90"=x̒iQy(ck-S.ڷ5T%fQy@ ?b\ϔ$NMZ|no]hល٧ґ܈'Ӑ$Rc@9BqkJsA}? ^Oc$6RtR(e4nXc!KDH/yhyM cQ*P^Z;|Tv$F.BraCߋ#x 46f% =^Y%lM,ekwGSEtwfO\fەŦbPi`?7 1[n^ߝň28et<Ţ"@*\qmЦrї-ejO3Y U o-C$i# }26ڧg9Hn=J~T =ozۭ%E79G ޝ/ Uk!u:Ux;5;$0Rp? 5RRnl\?Η1PR1/˦ &aﳔOSv.5]ܺ4aa199*D-ї*fϼmceG&f7nmEssʃf>L%7%/( RfMxd YHFֽ[: ܽ_=#%%ӥdera$?47ޏ#4'{?nktB#ˀ5+iq&Vq%1W'~k 2+gˡ},LSx/ukui-control-center/plugins/messages-task/about/res/manufacturers/SANYO.jpg0000644000175000017500000001403313543125214026015 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1! AQq"2Ba$%  !1A"Q2 aqB#Rr35 ?&䫎4rkc #LQaxQ  {xaMy1TrQ0LLTraGMD'oҵi4h41L_,GeF&L_ovLPš<) b0*aƘ /-ʘ 1* >Κ|LN4ߥji@ɯib&Xʍ0MGF& ?Q㗻**N"5ƍݑ3;H,]A:P1*f!DFg J_w~n 1@Q\s>bVsEXQW^1LN"ܦyDK`0ʸj7vQiP 1?Y1@ 99g +c=LHHćQ(e70f<3#OQ$SI_h9.~98^)²i)O>u-'[PvgMbL˚"1d+ u}P~Lnb Y|s\UT_ITJ_]Tm{t6i9ᑌ/`rbIP/TE 5jXZqI'J*htnJ72q 5Bu]hl8C(8mo_G[^]vGvV1͐\'Sn#bK?J E훼%9v+ * :mN #rF؉E"ToJqӉ4! ['Tz $V/{[fuO]6`c GG:wsbo񛒣gkW!:AV 1U(2OR^M,TUxk0L?1 *}xp$a#Z?k7~ Tnq5K#e}WKH#J$qnZnܩ4l닯*Y2&z@)к Kr @;B,[.A*>ϲ57ݪޭ-r4rm$BH⹗zQMEۋ="u܋/*MR5n:Ximw&\3"&&.B!b%#{UGݯN ǿMO.s˫Sm挝/([I'pRnAI&eiCFUX5Dy\gG =W jl:a=vRw569]'騕0 n2; c҈N:/sH{#%Hkׂ0ACˇsHp-.)h{?u_JYwNKYt[{g+A(RhxPN=ػK7w;~t쳘JrdL:dԋL폌 U CS f!檿~ }kI}৅ ^Biϸ` VO;)0195Vݾmt5~uPEԆf[e;tBڬEb^&LdS䔒w>iKB `nS~w6vLH4vMo}]ra~xT0K$NAꕩ Pj}ݫvYpc~mTVHbRKCVS/q].#.ʾYMg.blOTWur{}oEcuV5؀<ʶc)ZR4zjh*0 ssC͑%ڭG8p'I& ~ 紛4W-455Hq8^ܿ:vC7[󡖖I4V7UmfrQ@H[-1VY.cct0CBG@Tq ^tLSw}Cm۟SŻӭ(..ɻgz(bۄbOz4c-}pMr'NIE u0 5L=-t@12Nj1{}VvS{+4w>N.{ڦs-wŢ~=s d H^ӣwKr'L7$$4)fR'.cxE[C@ >*U ?u]ۭ-Ħkqb ωD¥din.n?oQhPinV@ ƣU%JZpWxWµ u}#Åj']'Mys]{39[e텁CsZ5T ;;کeOID8aDZ_LE,\ L'08[:Mo׎X"ltdN9>O+j<&M^F[>1Lاd`8|<:f).\3.wܕ!*tQyjڪ*p@@yZII$KTBwb6؄6,h{}$TPJۿXHE=#S3{</Jq a$mũO egư!a W\|=Gۻ6;H #$0ihk=A1k߼d,w$V]ZqvhR9P);AA/): LDc!8.cTr^sC;p- ]Ȁ fK=J0㭭k ԭ٪=]k3\G0#LFG9rM{埚jSį[s'E+XtK&m0ZnVLqqAne>P "뽱hӒ:kMn2#pDG9F%5S^ܝ10 e!yCDEĂNPʼ_q_!#3lVW$HmռiQˀkD$C>В٤;ɂM99Cmƶ<`nS%4R|88rՖDa0rN[|=I~"]ãFAM+4f=&{ɸq;T$Kޢwʖ9*di$FNM]JK%R q|tFXUQ+E|ntE.qBYq{m;}d&.pUH:Yh[GWq1 2v<diTQa1i鸸 J5jG#2}y)53H' M;]v k]rH:In#IkSPFl5].\5J-~`ocrIJZ{;#֎3rwT*W!P($# @ ZALađ$~c=нܶnnepF~% ❏adJ+knН@Fn˭\l2c1Z8V(9JC_9s8} %1oא?Rmom+&{xlK1$:&Dzk{담r]}˒ŤnеVhh̎2848!yIr s|<⾝Hdu5g[OKYMcdȮ1kK[$Rt+ƊܦƦj3bOZdtauVRT?2$F?q |GZYPJ@\ 2kO}g{NZFm60uHls!{y>@\\366|ZMk-'#?mW:WNdi52y)P9.-]VK n^ƏDžl~xysqtyg-J潮G4=DL]]a$~!H5qvB ܖ0BPE"r#f#3K (>XdtKt; k<dfҪ_=8slǬVlōsحCR5,g|Mz5ȅE*U:u/UL?hF Lԭk|?ww!pvpk#8#j1`1h^H5{;khlTZD@!T Ș^Mru I=`=@"3l2PJ䧈N<·Ǐއ;?}chyF%\FJ͞q%Sre A)f%yʗtnlyQ e礸ui:9'~#ä5- 86HV%)UCem^"NL<o3$8xyQӪ?8?ijyyhѧO4ׂiM~XCLs5vTij? / 5+DpZƕBu5e=jA:`pX˦Y߁*@\Sòi<,4EDѣI2ZB0JsRSqs+&:{8I*r½y1TrQ0LLTraGMD'oҵi4h41L_,GeF&L_ovLPš<) b0*aƘ /-ʘ 1* >Κ|LN4ߥji@ɯib&Xʍ0MGF& ?.4xS%A9SQ˯aFTÍ0^4[0bTQˠ|5iJukui-control-center/plugins/messages-task/about/res/manufacturers/SUNPLUS.jpg0000644000175000017500000003772213543125214026307 0ustar fengfengJFIFHHExifMM*bj(1r2iHHAdobe Photoshop CS Windows2011:12:21 10:11:46]F&(.HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOT._}v6 { {NHfu9lcdjzzRz7 d<2sc$;#?/2[?%$H)$IJI$RI$eWв#\͍ C7\Շ`wale2fӠc,k{k=J^3x-w.+#zt{q-5?ZsR rOO9?.CzBݙ,6.f1]YeCeY=V?;uluHVW[k`ִpQ)X 8( 3+fc`ߗu˸r]Vm~7iSe})̩}B=w5;]j}SUyOրA?Iԛ;2:Nh#kacm;'"pwWu_ͣ䞳zXG2uM}Wέ5v?{1[+-y;cD-[ .-INGD=[Q~IC 4rͻ䳤}fqsnǾA`HU =.ddmύ9n+FnMtsb}CwmRJy~wP6d}Ƣ[[_cƷmy^o},3nUu;lf͛Fȍ~$Uw⤒JXG)> IJLI$JOtRĞڥ'NJY:I$Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ Photoshop 3.08BIM8BIM%F &Vڰw8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIM?F]asint]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM ]FLJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOT._}v6 { {NHfu9lcdjzzRz7 d<2sc$;#?/2[?%$H)$IJI$RI$eWв#\͍ C7\Շ`wale2fӠc,k{k=J^3x-w.+#zt{q-5?ZsR rOO9?.CzBݙ,6.f1]YeCeY=V?;uluHVW[k`ִpQ)X 8( 3+fc`ߗu˸r]Vm~7iSe})̩}B=w5;]j}SUyOրA?Iԛ;2:Nh#kacm;'"pwWu_ͣ䞳zXG2uM}Wέ5v?{1[+-y;cD-[ .-INGD=[Q~IC 4rͻ䳤}fqsnǾA`HU =.ddmύ9n+FnMtsb}CwmRJy~wP6d}Ƣ[[_cƷmy^o},3nUu;lf͛Fȍ~$Uw⤒JXG)> IJLI$JOtRĞڥ'NJY:I$Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIM2http://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2011-12-21T10:11:46+08:00 2011-12-21T10:11:46+08:00 2011-12-21T10:11:46+08:00 Adobe Photoshop CS Windows uuid:d94422aa-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:d94422a9-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:f29b9da7-2b78-11e1-9c1d-e060394baa3b image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثWN*UثWb]v*UثWN*UثWb]v*UثWI4yw>];P{ MbhY&F%%?/YdY |ۡkiz:+NtRd:Pvj/ei@[H^aثWb]v*UmƧcG$D"aRRVB v݇ r}_Qc6YKb:Ox̷]-CDcOIZφ>ͽw{zHK>BX?|rH^l[_,Yj-ek!DFmfG'2t3(mU|Klp~'.//g5W[R@k1V5wSb%u]N*UثWb]v*UثWN*UثWb]v*UثWukui-control-center/plugins/messages-task/about/res/manufacturers/LENOVO.jpg0000644000175000017500000000744113543125214026133 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1!AQq2B a$"#4%1!AaQ"B$D24q ?Ǔ(.qW&$>]D DA3 ? NȒ%˟T7HӶW.AQ#TArIo-LQH&| 14gӺ*As%=K( +>!(n;m((\]D DA3 ? NȒ%˟T7H'm(D?MuO u:lFӛm6r*DQQNUj3 !I2a"c?^_^ȱ7ȼ7+#ыѺDh₤¬[j*}XیٹUmn_L]@崳dD8Mqsrq#pl#cg19vdk^ -E]tf>;&LwBOH.aӲ$I~r"E ש0zL=`Y0x!'mSD V%S̕ϗI@@N',+_VĸB (!BR5\ijf%A3Q˗3L4HyK<~E.:W#''G39|:N=x7or-޽sOӥ/jujUɢTgK\$ @C7sRDpuw{;.Al`ܝ7zۘc8Ӵx87ٴxT{ZtcE{lBiޫw^whUn^K[꫖0?5QM@OkqG,>SwQ]]Waygu1/>Մ;Ab% @}{mS{ܺ}emcTԷ;-wZ :2*YiQ1x伪6/!-بb`.@ :XBusܷ)+',%t6G' Y\;0Wٿ+5==oV۲{iCUAhʙEI}`JaM lNfk10#̔"I(n3oay.Lۤu.4 S$vnfuMogh]>*Hܭ6„U@`e:jzqؾ=s*\#F P-%s:>r,,Aw ,҂8Qݜrg"9G" y]MY&z6oȇ u?Mѱ ;M5EŢӝoJ* JM1+-ʔ6kֺ'=L,s~X֖6tf#R*RZM՟[iyu sԃ YbٕJM*KEyTRDcZ?ᝎk#1n5B%B.$ӡ Br7.18~Z^[H'Pb۾۰qsprV^ͭ tKgilK|vs9ี݅^ZAIp~Hv8~k|U[ #9T5X.5J]f/K(ѽ*ڮ>ܚ+G+"{[嬺}.°-^_t-p*mŵh1Ҕ]2j(YO 4Xo}۵a\|v719r_kE·vͷwN}٦R,gU:ymR܊f]5mƋ}܈MCs܄SD^^ ~O!0&8F-ML=bZ]h%Gߎ)nk?=PaG{w3 4G.IIyk;}y<. 9 <2cD܂*tʘJ-JY$#N$P(0%@ Ke츃Y+v^\'Sʖr!LB HwQdI$|fs4i.8:Շ dܳlyUJ, S:\Z2IJՀ !fr̗vi2i Bp8 cU$T'/G+Ayz0F4ó !M˾tM.,iT3*:)g>ZDôCw]wP=QeP%W3A9kՆ8F=D 넘HO"AG"LxD{5_l W-&Q 3DF &L'd NI:vDI/|4T\H@DH @rO {ZLyhrg*BA3M Nɤ>ГR t)_8@h\ECt;h@Er?UJo,F*Ug A3H&};'0S$PqRs"v 2<$~>?(7U_ukui-control-center/plugins/messages-task/about/res/manufacturers/AVAGO.jpg0000644000175000017500000004346513543125214025774 0ustar fengfengJFIFHH ExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:03:30 10:21:38]F&(.HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IO dz" >MѿRLjl5$ގWS'F#s];?+"ߩ~Vck1m)]G_k0)1uY:Kf6^CiH;D+$9}y ]n!k26+e@a?GRAaXJ~wK϶ʰs`oa;uUֿqiϨ`hV LW`UoFj˽knn3z2̽n$DLp{tM6^*pAo֏Ψ=7L⾮e3Zk,-mF]}[oQ^Z[CZ.2jWܱώR"3 =R}3!/ |zpieq_X7 bd1ٶ5OU3־[z Ǵ뵍ݱ.=Q$>vB\p$#7o84g'Đ=j/[{}(ݾ}ۗ?E9x.\斕nzo}(̝w"%+ՅÃa) LH*?ѽ®~zxY^4WK>ͻ~uY4u4G{Ϸ5#"ܜ ᵖ̐F~IOnIsZEϨ5L4LŒu߲F/_O3/*ΙUY间.Γk:+cSM}6Xv5yice[14sO8{.?(r"U,MѿRLjl5$ގWS'F#s];?+"ߩ~Vck1m)]G_k0)1uY:Kf6^CiH;D+$9}y ]n!k26+e@a?GRAaXJ~wK϶ʰs`oa;uUֿqiϨ`hV LW`UoFj˽knn3z2̽n$DLp{tM6^*pAo֏Ψ=7L⾮e3Zk,-mF]}[oQ^Z[CZ.2jWܱώR"3 =R}3!/ |zpieq_X7 bd1ٶ5OU3־[z Ǵ뵍ݱ.=Q$>vB\p$#7o84g'Đ=j/[{}(ݾ}ۗ?E9x.\斕nzo}(̝w"%+ՅÃa) LH*?ѽ®~zxY^4WK>ͻ~uY4u4G{Ϸ5#"ܜ ᵖ̐F~IOnIsZEϨ5L4LŒu߲F/_O3/*ΙUY间.Γk:+cSM}6Xv5yice[14sO8{.?(r"U, 1 93 70 1 72/1 72/1 2 2012-03-30T10:21:38+08:00 2012-03-30T10:21:38+08:00 2012-03-30T10:21:38+08:00 Adobe Photoshop CS Windows uuid:d94422aa-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:d94422a9-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:a5b0cfe5-7a0d-11e1-aae6-92eb3a8ba4a3 image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثWN*UثWb]v*UثW\0ZHN )cA8Ds9 {yJm,d1-H՚C nz45i5]x̣#)E:ǝsƿ4ڄWBX?9WX.+iʉ$dz+> 'Œ,dp Ge$5œ=??v o.[_i5]yK1!xPI?ܲȌlMN;K/8iu]0t(YWt#F@nU(K1 ?)CX|9c_'W?>M7ǜn}Ri>Vh8O##(daphD7,CZG5-SMGF^S"U*|ry0DFÉ2)лwDZҧ!g?8<0D:^w5Myw'0)l(?TM?!|ǭqV]Mcolq~?w?Z%XQw%V5 9yeB%$ HߋXpF%kN#,3@^]-^Q{;Cv17MJq9eN-Nj?:/5-;[hЋgEB! ҏv5йg<\I/̔1E?WWG8|Zor,Rv.LqT/.Iq䶫5[LTٚU<֭..ĒE3IWٵvPWU޵ws dF#9Z~X/RׯjցZ&hܸ=}.&<ߚ/&oϮ#Lq:=[1ELcYٯof^O+qjׇC"}Kw}4K96i<\7V`욺K~;]/hm|PVf3>7K2>>L`;v};ڋ I/"w7;tfupvE=V{]k 9IO^_UY]1*[KA/3c:Ljq}85m5'nqw=[V'T[mnn26msV(M -u>a7܄y(DJsiPTc.YerJUzGs.ķ3!+"Lѵvm]OC7ulhe&"ֶ<lvnwt5eP=\maݽ?خT`?bcN&}_鹀f=_UzwTgTkl4 k]m5آ ;ًǃ19g/ю7α}Yj32zYSrGkCvA?Hlz_[x5߻OW*븍`p*M5UXjnmc@h.a0?Gd2C 3CAc,s˄Vx.o= z?Xwbc49d[Z[=XS>Xx-1ޭkS19V92_d?kGMT/ǮȍԽG7?eԡ~=__/; =a{ݹlb?G/ٿo[zgzJ뤾/6~w.'& d8q8K;zdqb89Og?Z9ü- . w-4Sg\;ϧK/ݷ}G5ޯ~?Yԭu{Z^ևu/߶=__]GVgWFDu:~}=o]['h(gz, 1ak_}>wYj,-꿶X`D;Sgt1(l2&n_I+T,?(?m$z^FnOڽg^hyavYUbѱ+h]axY%ij\&Qc\_,ZNGWH;C!iSDzSPYC_]ԕbԎ(}wFgPʫӊǐǺ+ i {>#e~_VI: DTʩ$ꤗʩ$ꤗʩ$=~Dϻ)/RI'wꤗʩ$czݳփctwȋTI_Photoshop 3.08BIM%8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIM?F]g*h-7]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM ]FL JFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJ\_֯}CS֛]%?hݾ.yuc?}bdSE͎&t~Yb'GcкfszOh/`~`B ~ Lq] 6$I%$I)T^0nVa1z_dx߮6Շkz9Y"n;Vo6qbJ}%♿Ynǹ =Anmmk=޶xj8ܸ=}.&<ߚ/&oϮ#Lq:=[1ELcYٯof^O+qjׇC"}Kw}4K96i<\7V`욺K~;]/hm|PVf3>7K2>>L`;v};ڋ I/"w7;tfupvE=V{]k 9IO^_UY]1*[KA/3c:Ljq}85m5'nqw=[V'T[mnn26msV(M -u>a7܄y(DJsiPTc.YerJUzGs.ķ3!+"Lѵvm]OC7ulhe&"ֶ<lvnwt5eP=\maݽ?خT`?bcN&}_鹀f=_UzwTgTkl4 k]m5آ ;ًǃ19g/ю7α}Yj32zYSrGkCvA?Hlz_[x5߻OW*븍`p*M5UXjnmc@h.a0?Gd2C 3CAc,s˄Vx.o= z?Xwbc49d[Z[=XS>Xx-1ޭkS19V92_d?kGMT/ǮȍԽG7?eԡ~=__/; =a{ݹlb?G/ٿo[zgzJ뤾/6~w.'& d8q8K;zdqb89Og?Z9ü- . w-4Sg\;ϧK/ݷ}G5ޯ~?Yԭu{Z^ևu/߶=__]GVgWFDu:~}=o]['h(gz, 1ak_}>wYj,-꿶X`D;Sgt1(l2&n_I+T,?(?m$z^FnOڽg^hyavYUbѱ+h]axY%ij\&Qc\_,ZNGWH;C!iSDzSPYC_]ԕbԎ(}wFgPʫӊǐǺ+ i {>#e~_VI: DTʩ$ꤗʩ$ꤗʩ$=~Dϻ)/RI'wꤗʩ$czݳփctwȋTI_8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIMhttp://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2011-12-02T10:23:03+08:00 2011-12-02T10:23:03+08:00 2011-12-02T10:23:03+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:0e0a365b-1c8c-11e1-ae7e-db667b27342f image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@F]      u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ߺ^׽u~{ߺZ4/~SVtǭڃ0[g'عm邭s1aǂZEz䕪p@X8'};ifDQaZ+(#t/Ϸ{C{e+y#̛̲jʵZn3 HwC #[/ T$m< )?o<`*2,)TIP.yE5m9|;P + xl~`ZjPEOF=׺Bd_c&>Gs1;{ M_7E>b~&VzYbk&Pt#EM#~?c7(]ilSm=s6srEQ-JŤHמy 'v ¬M>ʜt]ɾџdC{]/ٝsؿu[[Q6>y; MYO$ Uye,z(fb Q˕+0}pr)k}mK#\cUR:x##{t$P0~c?Ʈ9_{'k`viS~Acp&tcu;& %=%d5RߺUK;il7oI>dvG^Kl nͅ׸VM5y;yTF H{)ݟϐ4{{!]Wlٙ]K?5{nJ3{K;E1YT,T1K[Y]=)6Ԣ=je$.vI\UT8颫VXrs.d Yg}}Z=} ڄOH4̔"ʊOHQX{Kn,/'x|{#ߝ]\+}h#7av6jITtZYNu ]Pxk?o!;= ~`ؚÙEe4@YG 8z Žv/&fN>"0__蝕_Ը\p3kcwک Z6NdX 'F*) B8 tH~W"sw|Z/GtP^xuٲ6,߻nd(s4{qMX詄8*:UX)=; :T/Og~a V_Q%YDW`C0P SRc)=>sޝ{ҿ*;7;vn{das{bQbTU_ܾ\Łkl5>b \$Y[y2أ%R;Z4 e-K){Cg Vtw<a{ VaZO^}}g9܎Fض8!pҵBgA2 ͡ 9{~鬗e&;c's#JŒ ,ncBɊ,tzJs1UI׬wǠc)_Mu"S{{;}yt،^ic0۫id/CѪ*+᭣#DtyZ7-7k5]MF<eݿ~w^[ڒV֝%kr3{jus|>ωaҽj]n~^Ow'0LligIOT($6,J@#z]=٦×M4,֑M,oRđV2h+\?O )ߝ&bԵ`vuÿM7,j=2{^h0|v>HFHh [X'V>ru˼7,C$VD]g}ǿq^osQubexβ9Q.-փQ|~U-~@?,aˋlޣVⲔra2remH6g-zJWf$I/inwɸo)J j4ܟ>{M5J˛;}H;$lXr̷2biDbɲ'\겿zl&.d|UQP&kjnhmgw44k歐>x;'3Ҟ{/&{Y M0LIJCA 8,%-7km];;iRIDlx)ғ HjqsZ9i)#*cɬ'54~9kq?zkK=0.%  W ^{v&ev[?:embYu;k%^R<,HԸ@{X䜟icS ß^`oyl{>f-wPO$- v"  ?W;S?/V;S%tWdMzZ}Flgggw7W^'ܟt|O;ga:Sk77%3d9W^VǒǴB=퐢iU_)#^#˾#;/-ۘ\mV7fl)*o&즆9MW`}׺m8fvN;Wz߹Nr=)Uw.ms+MRvya2\n7#8G6W^{'r-7K^ym>5nsbS 6l#CZHRZ rb7ӱ7P6$NEUڪX+eW8+aO_2kߺGߺ^׽u~{ߺ^?4Zuckֺ|_Uz-ߪ=zU+JyR)g_ߺ^+QࣗQmfY0k|SQ ZqM&8MW: ^Ww%[Tҿ\C{q{3y;n|43/ʢњ]k.ꓮƫ %"/#jm47-ݺwRbuf\kjںҮܘ )3QSaްd#ϭ4TcMj| l־?{GvT+u!>ӤPzd׉:w9hg{|Y$-1FbM@o2:.rwLsvkvSb;5kn>ԡ)iaqdx) CifV)"<"xv+tܬ/ W)o`1#žJ@y--jH;=}4.ݹ*pn[7Ȋ967 Kǵux3v٫ڽ3.zpm)jWZʲ]Jעxuj:J~ک}wtsn ī$OllMK>%mA ݣcQ%eqh6cSqص?su}K`:ZsNљXFbx-BAVOqy}?<{s%<7%_x\;Hd}e@BL/)A'ytҏ`~7_tkӣwϠ| 7kuWW׏QݴH<_ѯtqvuߺ^׽u~{ߺ^>+_?ɾ?ׯ׫WM;)|z[~kfVztyhӧ<{Hu{_ߋegO ~_ [V϶υ-t Na~>ŧgO)蛯ukui-control-center/plugins/messages-task/about/res/manufacturers/SEAGATE.jpg0000644000175000017500000001040113543125214026170 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1!AQqTa2BS$D%5 "#4&R3Cu61!AQaB$"24qbDdtT%Ee ?eY*⟳o5!L^m')DY|)DYPhxqR6"m根2~ݼJZ [T@lv<ԣ2sZElSm)"ͼD(6(6xQ*RM9|&O۷)C QKj\ 9?nuN|_rSv(͕ ~ͼԅ1xDYfRإfB"ݡJT؉/'C$ feY3f)L巳g lEhJbxpr*rrϣiTpܣ ɧ/Jy^3]*s3 [.!+E`wVy;lGFX ^s7x=] ӄ5eGznK2,f5c 9Lp0 $EG 6\ݮT8NK49#S\ÖQv $9P )WD$H̚\ljz1ΖAKSYubV|5IoAѸ˓s/ؘ͚.LK]k&J(ɵ&׺9 )k-+|qKI8zL&^{6U)6RfJ"rEGKbE|N5K>v? ?0N,ueQΦRܚǷ1Srs\9D[ एTJUK8A]%a#|ϓ ܪwOs!za&3jq^lfӵI%K:[^: s;xm3yNDjFύ>6 >ҍݨ.Fv~mtٙ VYCa%R‘jhY P=9Dvxһo/ ֽ( gC͸6yDZлV ǫdcqL4ߞy\r1fPgzDP$p-c @ƴV[_HzɚMcP>d-U„PE9j;JUdi N04\J#*bi`n`"Ѷ oiu/ nDeW;WLAHdzQԅpgbZ L& ;TTϴ X2zπJT,,[[sAM#`I 3?N+(iMTNxx. e\ʯA9sg DFeOH5#GBI,QB!@~)&W҄;r/͑J9|Gi9ؾҦNh""#%Ɨ./>AFMC,F򼐫5좻sԒvJ9MQ[H:9o2841~hV^ S_P)b7%qǔ,ET2%E4@;a4T' nAS=`֭vyxtԬY @j]X(ngCpq̮w I80JmmF`tw,q?cru>N)!{,yM%sڕ+Ҋy5VOGi_Thpr1rEcl: ╻ 4k5ڿG:2! =18,9 q^k`m5(K¡k觾xom={]w꾟KCCM[/Wz郛iSb]30! z_J&CE PaCmߌJ2\c$pDIxߊ&a/;:CWpN7$!]SM\>%[Ilx<5I[Opp/eogiw// y /%yY೼0q6 Ѣ}SɑUg_)kx. sx.;9ٿ> wwc/3y߻%&fV0qF(o }a7ߠ3f>uF( .{}Q~1\Q^oM{0Pz]G}I~4%TLaCB]OԏNn4.uzC M*Wy bo%9J"ͣ䥱J";*=ECÊo_5ɓ P@Rڦ"eO۰<i'ܢ݋ukui-control-center/plugins/messages-task/about/res/manufacturers/M-ONE.jpg0000644000175000017500000001625013543125214025742 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1 qB!AQ"2$% !1AQaq"B$24R r%#3& ?y:s% 0G1 }A:~h/P&d_?ӈ pFPClPPz?NOŶ i:rt@0:\sA:q+(x GƇ`oaA% 8PPze6e { |[`֓'D շbg=Ks*aYÄ6$yzȌqt&r(<`I#qDzplk];TOvGqYKNttER^!_9+~~-K7|S wBBV-Lh>8#&凄hDqLeV6|ɏ>`x΋RFqIBbԾۡubm 2D7/rZ☲(, t$3#D{aNtɅnC%0Gɚş{*l߮ߵnМfw"Nh{-=cΥ@篻IVl5ZsC \]gd% 'RgΑlE!Vq+l@5z98\CJIdغG1 d' ZN-ǻ9z fDHsuQJ(Laj|vy'4 MKC:CaiF%MۥŐQB|`A=NzW)za|2$6p&iAPRA NϝvNR|>fwlUI셹Q*\\3hF9X0FauE}IΧPs)JlQ]ԭʰMT.KsRHbXq2MP{6bDFul5M]4ْٽM hq8~rͭ]:9jHL>KJ-> γHcV[F!uٜI&ˑNUN*՞ue:Ha!*[8SUܿ|RJ@eoUi\I*%,P']5s3kÖHF8jL5M9#UYRXa"p26)YB%J&-FwWփuJ2IĻ$ݻ'DnuRֆ2-̳9Kg_.kFJznCnH \S\´-nk4ԺBʪYylYbݼ`dU  }mRwL19Tܒ?W)0:# 24ۻyyI͑_[q[X,)0!2A t4Ekt򊐱WeW._^xȵϕ)|@LҝY. T}Uu>T:#ČHbp> b`i x#_Ѹ.}ڙ2EAΛmX#[/,ZYJ,hJ^PǞT8g_+*#g6FN`YBs$'*q~YyzϪ,ڤ54)Zc$ntV2@b\EWcobwҭzU*mjZU$n2I{2?de򊔳`V`&YvՖNlyju؝p'Fp&&m[H)@U_LU]aX@V&xD;p_`nXO)n |A罾TcIFމq$ dV?EhD>jΌ֤Ӫ:@*K v9N&0܁Ϝ I!.3=|^ȣ /xZ[-\ѹQ _G !K5.oB65 5 d+9H&lni+?3P:MW¥q&KU(IIr{zm ))(u1932v腯kgV5oX4G]`u[{Om;6@Wx$BZ9FBISP 1.g@s~)D4Uj Vԋϕd5jd\䆄,nq٨h棞2@z$=8Dhiw-㚁QwAW}K]O+qט>ȍ$3z`՛"I@"hVi^ZYlݤEvnqU?E*{@U.:Uo * [$rI  N-X̐ݗHJ]K 靸ѭo6S .m-غTVB*),&Ո WW>m*SLD Sx+RVlAS^4 St *k_S$' - I yVXU lqs.ҷ*'TOTCd[L++ItAmR๞W99VVpTÖ3 5@.[bn/@5H2]&q&VeyURl]KNI"HKNՌU&)DVHX)t5=\X[*uJʃh ˷Tݚ9')Ls-ǯ'TL;s{c^!'NN(`ЧڎbngqJ]dNl֖FW}"qԬs6/WIA  i-5'^b.*mRww+ d>s,H;WKsIJ}38R;\hWX[s.+$ MY$f.}̶:U)N*zX\Lut#XyWtJ5lgg92)3C-Sh@<N G} Ly_Z"SR׊vC/d*d.K8'I"*!d6¥R]'bGz/u dM. BɞqI DyhsYce^ݛX[\UO﮹-%JSqT%rgmbt\IL` *gՎXqX:o4\ryLj 3tIQsد y?iv#FR=czK"؍i'LUdNSvI<3[TAlR)e\-y[mɬM^~;-J]7R-yiAEIL({w<7v׆xglbg3gpح]vd.j\ olZ$,6`VڑZ11R%*B[jP\=>*~拰ݪv3%Nʴ%0Rw&lQ8 {yXmSMd;YkmYi'e6"IEP*U6 ƹfi(s\QU="m.^lꜪyWj-M Y4x0,8hnor2<݊bkFٱ[3h18[5|[ gd+X>ui'VuZgZ"_]wKi*t4XSA9 رL i;=ၶ$J©A65]BtJϽ&ɱ=w]vr+-EnՌSLע0.W@N:_U5 )m~S*nb{ޜ3tMCe|آ{!'NN<)F" ҧZj|#Wҩl*)Oş|G)" dFq_Wmj6 },Tݵ6'DVחh ~G7JHDIM鱥Ve|յ6Ԥ5g|V$bf@"I}ۛ#Ƈbb5”lDsYY&GRbPly}˚!|p'IˍFDPLS]P޷;|&軭ct\ +p ⣜ʲ\J& ĸ cioݸABiUuVFbclȵ2sIˈlRXR7tm+gByIjy%҆Y%#Xzða:w< Q 5rUU4>aCӣ̙V<[-B%\?xr8#D߽Mq֍W:j$tAer1FxĊ{X;#y Hqisb솴9: \.9 |<N쇂 C0Az0 yG((\|Â2`NP@t2=pG }>-^kIӓ# ˉYC>x }4?{} /r8#(!tN(C(\~pPukui-control-center/plugins/messages-task/about/res/manufacturers/KINGTIGER.jpg0000644000175000017500000000737113543125214026456 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1! QqA2B$4%8X3v(aSDVHTd5&6 1AQ!aBq$"24Dt ?> < 41C4c_˙]Ɩ: ;_SEniR)Ta5uxnwCWyA<~*Wsn00_he9/\̇r4f)r(<7sJJiî`sһ 1R qC) A~. 4d?(7q0NÑA[TUsMGlsPO7_p"u<Ѧ{wL&O(3@PcndMXs4,vnLޛc}dTHmrƦm4ކUt~]_8Th\>iMr|'hv D?= \ Y~K?P!= /ugpL;q'uzKJ;}lSxև}KhbqXXoɡNJٚYymóK}}4p>S1v7e/c5ذ(8_OY}k8Y A8KW)%N \RpbC ``LL.[^'C65\Nk*T6ĮVYd^`hb/-۟:mϠec3y#,t)(@eF WGbӥXޠ7?}0vn(vk8*ӴL+k9SjHbKbsFE*c<„Cim'#YԺ1*F+eIRL )g$99*U4dӈUjԞ8UztQ7sz:q}4(rގr>Lw k_ Z^GU4T鴽\ef8*)SNLeQK0Ժ/>KMTFإ҇:%bL.,l#b3S?ͫǶퟵ2UHd֍IkX,$~$YLx,@ 2+i0*Ԇm8.Acd cpgHm%ÍL]^d;r]YL2> %?C2C X4ŕX$,6`#ؘyR0ꇇ¬)N3ž{Z}dV4ԫ!G%RG ك=`iS++ZH5]T8p+m^+ 4R3XO98r(& 103oxu޳)Է7+ԓ 6IYJEIOV~q 5 Xs 5Zp,Ye"%꿧rˬdTd.l @ӶME"gqT( 1[,MZ }4ɎoM.pCt&!@;GM_Sa$<o^KҒxw*ߦy-S((wp AdobedF] 1!AqQ2B"aR3#Cs$!1AaQB"# ?ǣjGeѿV !:(oPQ tˡ) .+[(c,NøxQ]Sx2m].Po´QQD#~ʅNe] O8VxtQX؁Ge `vŠ"Omj8to#~F纎!T/Bw;(J~a³~"\5U,SF}J!;Qw)O¶Qw \.aQL셨v#̤.ꓡ #/BX<9e2{BRIvry&{  ^Ŭ h~h Y;d|Y )QN$r%9aX\0_BQ}H Q}ݶqlٳl@꬯G*yLs,uc9xMZ3X 6,ĴsK}~vIhE%Z@}umrZ{ajscݛ W(oܟSw7-$2V1ҭ.LL@Y1rYEWlz +h)@NNN¤cp\j=f-YE*3'n |eNcJϋ K6LCyǠ7a۴ru%-dvh:^?%k,ym >Z^tbTDM#bz꬙>? [7-Fp3d>?rgcqsGeFOIK\eD(yHRXEmnZǰҜC`s07&`10h7n^]ߥiM/\A*b9aZ^O_'bk5'NK8sr(&Ij۬1uՓYm0?Xio7 %Yg r+ȹ WDlhJE BʒI:-+Eu \CM2\g507?XXG$%3ƣպ٥QX?ǔ[,.cN[Zlׯ Ԓ;J ` +G&xS<QG]:T=NtӮkUT8kFZ>`G2}?i\=Og.sySa'_~ܜ/"-U-5B~H֗nirJVL#}0\zdl.x4xvuӨr--,/bĄ׽K;'}nݣKN5T\qO䯒N?ֹĺ?+E=Tc.%":~_;Y}Q|hG:ÕYۙ [DM|uezN69 XSNo&БYjڥk특LA?N.-νbrW4Yt1􍛅y 75ñzF߉Yajo2 *ީDud:!,3!2LjĖ@}AvoSԾX7vJTӧdS7T'2m].Po´QQD#~ʅNe] O8VxtQX؁Ge `vŠ"Omj8to#~F纎!T/Bw;(J~a³~" ;,p mXӰWqx+l^ Wqˣu'!,B7=tQߧ~EBS>];V QcjX.p𢻈[bukui-control-center/plugins/messages-task/about/res/manufacturers/RALINK.jpg0000644000175000017500000004757513543125214026125 0ustar fengfengJFIFHH(ExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:03:14 14:01:45]F&(.HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOB߬=Xfb˭uKO?tΕ[mf;]qNִ{J~ 8B81ׇo|A7h1jf\%q]+~YΝ,E2M^:y]f'87a󽭫D搿&\^0}?Yv 6c1g4TwGWCWUfׅSn5S=~~sTi?:F5C?in6VP.pɭ5OpN _).A8+$x_1weK5[+{[i9y%?[zNOX▋^8l4:A쿪Ejm c\~{6? FC.)Jr KZUz,\ &f;#fZe+]sgsSV۱:+/[c7Ui]3xuY.%n7[-/5RZݭֳoZ?1e"Uz82Ü,<'v=Qժ}_.pɭ5OpN _).A8+$x_1weK5[+{[i9y%?[zNOX▋^8l4:A쿪Ejm c\~{6? FC.)Jr KZUz,\ &f;#fZe+]sgsSV۱:+/[c7Ui]3xuY.%n7[-/5RZݭֳoZ?1e"Uz82Ü,<'v=Qժ}_ 1 93 70 1 72/1 72/1 2 2012-03-14T14:01:45+08:00 2012-03-14T14:01:45+08:00 2012-03-14T14:01:45+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:208f50b3-6d9b-11e1-b399-988578345a81 image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@F]      u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~KIPmǽTW^8\~ީOn΢#w|>g '~e+ou1>_o:v'-O6C4 e!aR]W^-rxK?YIi7%3UqZ[%O$i3D:ԍ$WN ؛q+?̞lm?ôIiꪶ%,cQrc?.$Ml3ZJi8}:?xySye)qI,RIV =!|l- ܸ|f6[_tmqY,tm,D!F_ٽݶD[tiM)Rj]@KՓ[ kGLLTn GB5ݜvvW]ċV!}:fek߷l2%Tq7O4}w[%~9f ]P#K|Xu|Pᨖ2 $6|ܙu~w_"xJpP >wt乚 q$/#H%"@p {q^Tgmt',?|0uo_cr4%No𘍏Y)2KG"W=R8 9vNT"nb2̵UK~cO]At otn}-Yo6=xu+QR¨\@q:;63{Uu^km|^`){GM #CE20P/qe=D3'Ėwclj5:gmwwXWMoVŒ~B:MMzQKdk)1չ,dOGCE;JyX O+eEROͳoq+I6r#$⟙7FXެ̍j}( zmk1S *5[y]smͯO\}Fcppd%#AG&N*&s܆OnA$}>}'n\(' 8෶5JM6Tr*0պ>-:LuV\xB-p}Xn-fHJ@?exV[Kd:I4ϥ$M:G 1K+qEj^IdXc`UZ@TMHlͱ5wtyW-81iӊ]EU))ndA<+b3Ld?hc{W m֔Ofmay䲙љ]Sd1"g1  6}\&wm/)xjTL*jZˬvݤ>Kix"SFty½l/!Y71X^\wƽ-{K-04ݍ}I* '$SWRѝexR>^mIT"eJ5;2BPq'3ɶrFEo-~ڕ0|T Ѫx`W7ϊkf펾ob]ok7S9xܦ?63umy3jԧ#yxC2 '9˔ydwdVP +UaV|*z9 Ý9{j[Չnw&J KB2p444k2φ|{] .J9{O'&58UiQGOGvh"eW~Y}nm2N z@A(['ieDEV8ݼ> {IfNCߖ_>͝Yu_dzҷw6SE7U6+p2u?eZ:JXT5;%w\^&<"A2VE =˘,_6ܭhrPxRi0 j|F;?]vvc+۝g֝y4Uϓd2:} QHx]y(w?#n[͛[rĖPZPP{_߰lܥ˖\5(!I  <]?;'+1}7Oݱu}}]x .^-8zoϣcmz2$tY 1oG"V(V@~6 1\T:0گa[@yaHLj>ޠ~)]~Ȯ\r=mǜyNcʋ%)s|f/OMw3:ga0أ fSf.Bi1S*6`Wmi94k{>4+^_r5\"bEf=9r=Mz?=ֽ ^Y}Sظl >ٴ`r?k/ =*"tc!O'm{}$ԂiUzǝeZj+heR(4#:hJ*zW|;휞S_6:6_16cnw3Fշ:buĐ(C"grm -VP-\O\sou ڙ$R*`%18G?+zq{쏒uw^a#"dirLut8\nUpX^Rl!o$~ g~S?:佰tHZ sٚ Ef豭Ut)5r  E\Λ^Ѳ],єBMԓ<ʻ{8Yv⇪S6Gn7pu[0~ﬧjlm'.3mn|XR>& zH 3 ,Q!;m{庶^PXjV.i\Ҿx){gc&Xa;[9+1>`u?k٧Gb#FVCB/xc_ߞIu5U+Y _Gct^?i1=~o^9~׺SsJ@ }׺袛}~Pghk^V}oҽq1FH%"'+ǯqDE {BOEz\|Q''$:Y5=wO#ou"I֨=:_ʟ.AJyuߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ukui-control-center/plugins/messages-task/about/res/manufacturers/SYNTEK.jpg0000644000175000017500000004231113543125214026141 0ustar fengfengJFIFHHrExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:04:16 09:35:02]F&(.<HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?T?r_1?~,wSa%_'Oܗ O+IWw%C'Ju6Uhb~I;M~K;J?w%_%aO:Rn˼55lns nW|[e5^,pks5'K_WC:q kHqmmJֺY"ژ` o=A'wYe \˅Ǩ?w$N)w }r˩(5zkHzu^[W亿v?1YElsdTNiJx -\~ϭ7:)g7,Z}e8c-}_E=ٶ~=xJ%~unN9eUKfmw~]Zmv_]Mw_]?ٻoʫKժ3gS4POv;mߣU4Qm[,sDv}a;"9vZ>eO>Kꮦ8\@voorr<L/#|qnR+E76,s*C\Y;=C t_V1.5,w-sqT( (N][Z4155goYGqa GǧNQ}O?3}oc {l!ͮ67~ޗ1a5dz_ѭt 'ϧwլ3Ov~O}[@~ߴs(u41v. luMDo=A'wYe \˅Ǩ?w$N)w }r˩(5zkHzu^[W亿v?1YElsdTNiJx -\~ϭ7:)g7,Z}e8c-}_E=ٶ~=xJ%~unN9eUKfmw~]Zmv_]Mw_]?ٻoʫKժ3gS4POv;mߣU4Qm[,sDv}a;"9vZ>eO>Kꮦ8\@voorr<L/#|qnR+E76,s*C\Y;=C t_V1.5,w-sqT( (N][Z4155goYGqa GǧNQ}O?3}oc {l!ͮ67~ޗ1a5dz_ѭt 'ϧwլ3Ov~O}[@~ߴs(u41v. luMD 1 93 70 1 72/1 72/1 2 2012-04-16T09:35:02+08:00 2012-04-16T09:35:02+08:00 2012-04-16T09:35:02+08:00 Adobe Photoshop CS Windows uuid:d94422aa-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:d94422a9-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:65807ff1-8763-11e1-93bc-952fd8ae208c image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثW'NC&I?ӏZw'N em;tmmk'b1=@!,[w 0𭰻_̳]IgvԹ)q:_%8K/O8ih-,+)g[K9-[pZ~ q/?&Z/7,H.? GF+%NJoӉyG˾fP~!ŋI[rK%\%wz<6V7W*8"DNNiN*@ew$A˩F"PUs4bk$zfCs!d}Rz'厓zm_ZO\Ge~S]WlQomoΐk-m4inc.Z[CrÜNoַcaK-ﴉX$v1Ky+3Gaߒ-uI'o%Y4.B|gmH.Xc8'yeaYo4rq܅^#r>xD;LOV("qF#v (/yc"Mev(v*UثWoZ qWSqW5d8l<AXx-?o5cny?m?2O -tXam#dV>[wwH|'Տ˿ú??|0ysH?)$YwsGFI5` Ú7?xGs]qWq8U}*>ws]qWN*UثWb]v*UثWukui-control-center/plugins/messages-task/about/res/manufacturers/LINKSYS.jpg0000644000175000017500000001016313543125214026260 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1!qAQ"2 Ba#$% 1!AQaBq$"Rb#STt2rs4d%Uu ?M+\1H&U$R RA5e /)G$P2u Q$4 4tTʟǯnInX 5) c0Mz:HQkAAu_ RI%erIiK-@iQA%rJ1l?FHT!Th//+%e%] |b/|H̞|q CoSW_KĘ7t8>?~ jl҉~A:ގ HÚ w#" *xqAuo\~O\-fLr]4!f|Қ,%J=It gɼBVH[UOÑMǐG.:M 0!Ǜۑ"y,BJr+nK\T#/G%7fx FH%}@`hǼ+xzZʚ*CD1-0H6 p8Qw㇍g\3fiK!y Ρ6܄S1TOVՙɝ+ǧ /ߑq+c$qmleΤ7]ػO81I[|׭`-vb,L|Zo[$q6`i<#i9 ?f"%d9}zR~^Q@8n KZޯzQX/LW/)='k&×y81`Il}]/oC/큦<:'gi)3ːe*j\֯y”Z. \ɧ1\eEMUpg=r 7c G*CtN{~v1 {6=gDbQ̶:͑"_ m*avxxF"*z.뀢Տ;U wN2*Ek-0û%\>.rc c쁏1:[2ɛ֫}3xz?>ʅ+Z"Ti|י}n~)l|W ?fq fy[w9q_'#x/<#lSV%o 2&c*&xqY0np[ a0$wH^lz38J1_TMY3CeZ`,*FIJH T x;8,Fdɯ-)o'8g\>TTSGRP ͉?q>Rs+:ƨ 7x"Q5U=uBWL|9B:::F>-c}n\`H,8ԬC xX A5/&}7;Ow5Tꊏvݼ;Q;Q%Wu[,vi-MhX#mh]2]P]!\OV{k8?3lgpkb_<ɝhR mA9jl*YwxW6snZӜ5๸f*^>(#ds왺FHsy~Fފã9(P[n^z{0bfKKKEhly;Bӧؾoׯlk7o\˷vOt ?k8Ép_gvq/j{ѿb?}m^)使%>>-]ϧ'o[ۄ>RJܰrkRa TtH&K H&TP2G$P28#ꡦKp@|y($_hNh^O_3MԵi4W&!Lf UGIj="My|#H.JQ$puT2L]z”I0 )sEH *($];)G2fji[MJB$^)z)rE PG]C”I~d\(a@RdTPI\@vR*eOT7Rukui-control-center/plugins/messages-task/about/res/manufacturers/OMNIVISION.jpg0000644000175000017500000004123013543125214026615 0ustar fengfengJFIFHH ExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:03:31 16:39:32]F&(.HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOTI%)$_SzM:Ts} 乭-@DY4E~^[>!œ2S_ 35z8K~>ܗoȠr@2ÓrDNrN'iF~נIS}[c=Z-1A )PH)$EkzwNǕo?6\v ,ckfT7{XN3DƵ=C'"T:׳`;:m!-5v{twbcĶ́k.ۚk?Hr4lدLp y\pf7ٮM6353zWnVџsiV׋jUs[_V߫9UP6Ӗ{^N^a:}w{ zl) t:?GɊyqN9!#DY}Mz>{(<12틦?P1r0gL~0-Hsk?_VL91攱GL+?u5G3FrQ=%Gku|2ڟHbP67n{zlu#кR鹌mWeko~p:gF}_*%kk;ps_{Okѫ}7kgl3Z#wE /Apcjn\_\<ܾaLRhz_ܾղp1 8'ޝm6:^ѓokwuީSӛS1׻ԲX55VeVFVYnM\ NDZ.ӽrqKif5K=ZMȁsY?WiH䔌#)HH.~7.ۍCFg {7 7Q7]WGp8=hgM7~otKVmMc7X}Vçﲺ?@72vg wTI%)$IJI$RI$I%)$IOTʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ Photoshop 3.08BIM%8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIMGF] AtherosQSa]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM ]FLJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOTI%)$_SzM:Ts} 乭-@DY4E~^[>!œ2S_ 35z8K~>ܗoȠr@2ÓrDNrN'iF~נIS}[c=Z-1A )PH)$EkzwNǕo?6\v ,ckfT7{XN3DƵ=C'"T:׳`;:m!-5v{twbcĶ́k.ۚk?Hr4lدLp y\pf7ٮM6353zWnVџsiV׋jUs[_V߫9UP6Ӗ{^N^a:}w{ zl) t:?GɊyqN9!#DY}Mz>{(<12틦?P1r0gL~0-Hsk?_VL91攱GL+?u5G3FrQ=%Gku|2ڟHbP67n{zlu#кR鹌mWeko~p:gF}_*%kk;ps_{Okѫ}7kgl3Z#wE /Apcjn\_\<ܾaLRhz_ܾղp1 8'ޝm6:^ѓokwuީSӛS1׻ԲX55VeVFVYnM\ NDZ.ӽrqKif5K=ZMȁsY?WiH䔌#)HH.~7.ۍCFg {7 7Q7]WGp8=hgM7~otKVmMc7X}Vçﲺ?@72vg wTI%)$IJI$RI$I%)$IOTʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIMhttp://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2012-03-31T16:39:32+08:00 2012-03-31T16:39:32+08:00 2012-03-31T16:39:32+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:d8c5e77a-7b0c-11e1-873b-c4fd423be6eb image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثWN*UثWb]v*UثWN*UثWb]v*UثWN*Uث?O|ZĖJ_ִSC.HӶ.U<@LE(ߖdMo*PM?)擭UwrT,њ[28X6&K2DcdyϾY.p[ `aNBqey9zϫ\W1t5-C FB@$Q=fF,..]8e\IZ;v*^]SWgIӵ2s<)oonDݙi>f~LX8ш7ޕy_qӥ_'i1]hz$]C̣#JSÓˊ},a9Hw e~dF/u8ӧ]z uL."iS1_MJrd'q_eX&oS#\`aukq1x_UvE7䙍Y/2v݉9tyo~ `i?ހ$Vep*TK4yc__]]tzHfY8/D>T{%4=I.)z$/ٓ2z W*?Li;xx?}G5-Huiu[e在V[Ecr޻˩,_?N>̖ˠm&x8F8:1*[M>(^4Zd-0_c-yhZLqYAHc$UfLu>>fq 4%ҮnoY9I=f94:*FJ ]חc__Ҵ_\oݪi|oJ<毄>%^AѴ4]E{cY*.Μڟvsˬcs CE.'ݤ+(ۃ?k{CMoSoDxsxlrKtFTW=o2dK~Z|kygooĞ)BEQ\͞e8Og5>4e;cA'5un-nԙڠHe/ɽ0o~f`vyȎMԌOa=3o {_Ru=TcwW? l#[Sˠl5Ok+'PlOj]@;rGm/:ysuaA+}9V[XH6\JBfCּK}s(S|L|!TN*UثWb]v*UثWN*UثWb]v*UثWN*UثWb]v*UثWukui-control-center/plugins/messages-task/about/res/manufacturers/RAPOO.jpg0000644000175000017500000004004113543125214026002 0ustar fengfengJFIFHHExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:04:13 11:27:05]F&(.ZHHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOD/]oS:+ Xև=5Zc|>RU>K̿nY:6K5sm5V}[f]n3Y~uvC}%=4/OEo(h`͋}{f]zkks :}{U>u}kWc}_}!Y&kC:PXmMk'褚}Y%_Qݝ ykfk欻~}yղj('mUhv5[wؒ)4zmXp綧Om˶CdoDz3wzꤧO)xzVT/1^5ny {[{W5>~SכڙI eF~/?Wrt2%fa~ߠ$%.ԇIf@>Pe[oOC1^C݌g;_\gkѾ}_G1\n㫶γ0hap53]_椗s hjN_<k %K,jtzƿ›2n lN̆dR&ٰ&>ͭ y>UYAtًU[4">++/]8G,͛?:k+Yҩ)-+jێmn9ib"\)VmvXX 7ܺoKl9yni۱i{/=eK-de6:3xk750m08:-oB_j`7Yg}{Ⱦ.ot?6^O?wMߤIOTI%)$IN_}dwAݷpg6I$$I)I$JRI$Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ HPhotoshop 3.08BIM%8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIMGF] AtherosQSa]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM v]FLZJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOD/]oS:+ Xև=5Zc|>RU>K̿nY:6K5sm5V}[f]n3Y~uvC}%=4/OEo(h`͋}{f]zkks :}{U>u}kWc}_}!Y&kC:PXmMk'褚}Y%_Qݝ ykfk欻~}yղj('mUhv5[wؒ)4zmXp綧Om˶CdoDz3wzꤧO)xzVT/1^5ny {[{W5>~SכڙI eF~/?Wrt2%fa~ߠ$%.ԇIf@>Pe[oOC1^C݌g;_\gkѾ}_G1\n㫶γ0hap53]_椗s hjN_<k %K,jtzƿ›2n lN̆dR&ٰ&>ͭ y>UYAtًU[4">++/]8G,͛?:k+Yҩ)-+jێmn9ib"\)VmvXX 7ܺoKl9yni۱i{/=eK-de6:3xk750m08:-oB_j`7Yg}{Ⱦ.ot?6^O?wMߤIOTI%)$IN_}dwAݷpg6I$$I)I$JRI$Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIMhttp://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2012-04-13T11:27:05+08:00 2012-04-13T11:27:05+08:00 2012-04-13T11:27:05+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:2dcf6774-8517-11e1-a998-f15f6a1faa8a image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثWN*UثWb]v*UثWI#*V[*V[]*Wb_ҐAryF}!hyI8Tx퀲'屸fpZCh?[r͚Ga'mMDr9q<"s+ON}û󯐒mN_[ӥk]BBg?j9Pq ^G|LDEFo|95o6.RH3B9XikA[<TU}Y"ʡN'x-´ír.G*X#qaQ8]o7Li`f臏<*SdH0\n@8%CMYKu ] 6P+;:ʮHEj~vG['fX>KH$%YPRz ~QԿ*k VG1 ߉*b+,_z|kuq9)JY+ǖ!:Ɣ?*n~ BK5**qP=77^_G>x/慗SXKX^Ս7MO~/ޭ-Šɥ[454Fc**%?B;~O"]MUÁ(ʀ -&Wq_8w\OG}/)5y"0E/!(؂K=>l!o:%Xj`t-k\74Y#B- :C~N/#cIʽ?O/q_ύ1N*UثV&|2wh?zЯ5?`=‡b]v*UN*UثWb]v*UثWN*UثWb]v*UثWukui-control-center/plugins/messages-task/about/res/manufacturers/TP-LINK.jpg0000644000175000017500000001105213543125214026200 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1!qAQ"2B 5!1AQa"B2q#3$Rr4 ?ǓJU\) cH&;$R RA5Ґ]CI~P\ Qa@RrH *(2W.ԣSoŤҳW& B *j="Mz{#P(_9T9&W.”djܒJ ˠvu(Tyji4XG7#m,c9DS~&ĢDf<_1a).;[`0m>7U~!OcNNH\) W&vHWX"b`w])&-"kQ졢)ק?JAuR%uCer)FIK- 4\`wReOǟʦKUJSxb+'bDCfzhnpn;B m!F(LHkACK8E-y52A5Ґ]CI~P\ Qa@RrH *(2W.ԣSoOIM [/_˜]lRZ=aվóqݸ[8GJkp`6t\_ev)9HހeW.jFv޾U%mRRal3?pX_侎B m6q.d X1&NGUƛ{^RRl kp3^NzBP;k'&'A2NY&D:U˳{,8KO'qXoѨn92dO5=qFS?;'vyEc]hJ+c uq-|bQ!Y!|ʚYu =Û*E@$@gXY^Y<~5ǞX B謶$Ne*찑dPE)}"JHUhZZDM`sHS? p 5IeNmwsw1[89:2_E!nwkeɭ+aRs9DesЭX[T@!,{މ\9N0B xUG)nXt0MoK[.V-XT5%p,1 ՝JΕ50K\I1 yŠgk5*5s}ibH#Č|#piGΙ'R[hgZ…CM^ة\s^N'_ kun*gi$鏤F#we\V9QllL`I&1aܿ`ܶal7#w@ѐZX0ZEb΋At{jB_jηPg7t.ۆxaUew{S%\y3C9俥;kW}fį8цHx#[RXH7g`:ԗ5&\̜f``p>Cz=c:qYi:OGhl$ cawiR=ϲNP1`-,ck0y,iY|ڷDx .MqU&Lyk^\tg$zZvQ݁+jWNlzYpL4Cq3p̒28B%l}G4cu";q26i=nШWStX-oL<@@J&hĨ"do,$ᓁl$|;Xd{_1 45`Uɯ9w` y%QH1V"n vLQH[U @'%6=Vr4?p>k6nhRf$79~%ym۾Ʋ6ːQ\"'FHc/ ryٚkP!]Gn{Hr tqb"KXW%r]wLv< c sInbo Yxۛ.JHQA{*^G$f8ӛe wؼSr [jvՁZ 4*|R;AhDp>t!hAG:㨜s  8p!gc?Xoi&T7ِ+),{B mW$. 5 o[!M"n!.n֬ܕ49Z%1af:fߵ-J&*KaQsф0o{>71s;egYdX(ed)/dșqRY|D7=we9gRe2.āaqgGX]IgU)I2RćBniN| ;n7W HQ;0i&Y/ _t62dv7+ވ²R@ Ïï[&jrԁCnFF\~ %oܻ$)t=B`&"@\fל\{zSabfT@MNw<ɐ'0IVC7$TC{"1$R|NUxpE>f؆w!͉>J@\0}(icIinOꖎ T6?9w ginF.JpÊ hZ, >&IxovbttȚ ㍳*'"LsE0qQZw}nN :⛚Xm 6Zp 6zȸ1oq01l ٖ3&KF Z1Wzj39 / k (Ti9^ititYU; Cic-bNhʊJVXTF:$vb v+:ѽCҜ|~Oyc}ϣ|ꯙ:|oW׻~KJXe\) cH&;$R RA5Ґ]CI~P\ Qa@RrH *(2W.ԣSoŤҳW& B *j="Mz{#P(_9T9&W.”djܒJ ˠvu(Tyji4Uɯ9kʣE e.^):{)J:$}I˯0&.$Ң%rJ>)?*/ukui-control-center/plugins/messages-task/about/res/manufacturers/E-MU.jpg0000644000175000017500000000774713543125214025645 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1 !Aq2B Q"#a$Df 1!AQBa"qR2#s$45 ?&˓_ڃMyVEMGF&BDPQeI}"טQR@Q@iXEˠyEwZxWx2^UDQQ PQ<׌cƠ}p+c{t8\kX /RUBv6@qOs chN ROKw,SZzJa+E۫6[pQ%5A23Saݘ\403*B5|OgVjp%T:i:c30ct},Z-hDe_%q =6ԩo˦uEnErA cZHTKmj}&fTHrIT6:;˚&/ fA300H)G@5¿\gCsYzo&tT#ҧVCy/6F,Z.+rO| 1\xOMnĐ.-w,w?Jdkvne~n/\_ӷhQW]k=[vl,mtXf*\=w*VOL `XaV"A: |%:пUb}RQPo8^zc^>Qk_aU\NRDzmzWcMF͒Rw.wfc^:I)Eqq[#1@+U?Yp?׵sS'zv ۜG8OːkwӖp ash9O?adT!|#lֻͥƓn{6qz;Lˁȯ&_IM'KK'|^=<)@{Q3|ڿ4w*ۢ+nvq (ǓP*I6}o1E"b9cl;v=6I`c|7쥼eM’RYjT(UjF/?`#IwT-TKAF;Mlux@R#+ _d6mBCP]}@]ln,f,ϻX:vts^0n 늱di=Ƀ2Wn<90%! [{nOoۡ]n9VhkI(3OZe h c,s3Cu""9zʤEw5/+`s=@D)sqK<8 $dFyz-'}v7.hZ5FWm۳aQniږb yK*\IՉŦdo"gnm=Q5ZrĕV 贾$>J uM#q9+Y߰G& bMrʋDXܲ5R;>$nX%IUrt@걅iPO|Ȕ "{`(Rl6c+cݾr#3r^e%Z앍KV r9fˮTfJQJ\M2b훲mdǘ.;܀ܜu/*t=*{ AdobedF]   1AQ !$qB4a2D%"TX#St5&FHA1!QaBq2RbT$4d%5"U ?Cމ/x4Ĩ[" nDr)Dꄼ~ TC.)PJmb%m[w /1*" ለ4=D0JQ0iu1z/_vK T!*[X[FCsLJ5xb" a`0 A-iRL|L^Kb@D:1킕iJ"V'~7 ABk:[G~JN^i\MF@pߝ [v]gdd.r<7.kEhH߭%jdc<KDܘφ[Xچ?5ddr$<'IQ56`8#j`M^J<ѫϛs]K[_6[eL<ѫsovwiD-_35v.m g-ZN^{^nNl([9i2t?7_- g-1Z:}WaofB,ZNh2}^_>gՄ=!sۇᝌ9f!YcM4-(;alnGT)I9̒Ԙ5Q B ?J4PaBÆ;^*私L) t"-Ri0S26OMK~Bl(> RxKF Я"҅p7^2Q߀F"fS6SuRu\Hzp0ΠԒPTUm/8vppxhhxqo.{hLY걘`K2O.ȩچsD#Q4mU&P+46=z”C #s)f}qz߷dXMxOPp|S98>? n=d ??'vvt r0m" O(}0'Wpe'K0]^npG:єg|-޼4 :T6\JB^B@MD*a x1PzbD; n0F=G;6뼔scNL$/6Y )iArj( isi#Ƴ8kG@T 'qӥ  A/fqg;+n;{,SnDZTYRJ(X A ?f|Q.v9ek ئab8M\ԑ# F Q'7Nw$sffi}Yoاy]Ю|SdU +;wGkDf#ba6_g6rt+T=stkչ|2FK1 aU޹<Ԫ.npsb+T?n8;st^-RS/!0tŧG~3v(nq19az~%M~m%INT^ p% Paƒ&36LR$zTP8Q>!"~Ǽ;>0na][t;-myK/1*" ለ4=D0JQ0iu1z/_vK T!*[X[FCsLJ5xb" a`0 A-iRL|L^Kb@D:1킕iJ"Vѫ!쵷qo" l^CX A{ikT7SuP+LGd`BR+嵈ukui-control-center/plugins/messages-task/about/res/manufacturers/DELL.jpg0000644000175000017500000001104013543125214025637 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1! AqB Qa2"$4d%R#tDTu&'1!AQaq2B"r3 ?}sG?HyF-M9KO;ۖ "תEn+PG5n2).75(eW3ٮjN>F 0&g[[pA/7E2(?.s~GOHg}@[`@QZOK"hKe$nbpN%o;-wK5I|; CUD-L&u4p)ed3n[u?{Ѡ-a0n\J'#l/cbYLeХh^2ۋ;L]Z;CDyuśgeAXf̚/7^f dm:,`,yե]F }7W0s4gWwC9mʸ&8v<걈(3ݥ:qR-5_pJ۫MVWYBr /UL(K /YE~ag'3@!:9C/qV+jG`npF}UT2fQ , ^_JbtN&2=ťt3rmڮ4[ݛa[ɐ] #I5RC UV(?5XN%nr)JiOV#QH}<̞j`OwѸ݄Zo gy4sáuA[iç`kTrk)%̡nYw{9g)1]domr\"aB *[nKu..B=FF;{V n [ljyrRIKh嫈nG\}_{"_:/ο%X//}'Wc̍/=^mO~1x$ 2[Vn0zQxGbR,wl ҴQ5]U|dgW\t$pdu\]f07Vw,EMC%h % P;6zUv֭e/+[Y/,f l*-jq[ ܩZj!I)fy%mC]bkgJSskGa;Ynj1\N}Y˦8n-'Y'`heLZv ݌Z  DNƥiW-[HߑPrG2WPF*VmJ/ڦfY{*`4VCR'i8'TEt뾔F|7s6.{9g)JHșERJҼ&</idiQ{f%r pO c[1",kػU5pT]sL4'WgRvݏ sˎG5 0ڼðݒAo1IuP9R~Ot_T~;1-^2-a83eIB[͊gՃJj8韲DlU2! @sf,ӝʒ:˜rŹ[5|諵^}K%Y _.f gAM[aՖGaҜµZJkw. `] Ԩ*]!/.'¯i^Hߟ{qnM:b".ݤٙM0Y)(Y[Z%%9P*z<<@m!oNp8bwlZG^M#%4 _},*_%`5r]jvA.X3R1YS.|_"ȉ㭮L <Ӯ}>Kh嫈z9F3*e^x0MSgȃ33P`Y)ԭ]4 uiH<Ŋ%*U&R)^Wt_RȴсW氻Xmm]|nj<-}dNO6 h4WZ#ĭ?;)NF"Ƽ jU~F~0v/ZDZ@:fndlfKh嫈z9F3<f;4>DemRhE}gFgWQe^W)QS,PMP_o%;*X% 4f6YS[#hd(vsvNI3 ^)vw@E[uZ{z2;خvv'_TQCXOVqjS\:SR/f*D^ӆ{L v0V =`P ,d_&%wk~r؃fEJdQq#MTiuqf+O%btG ѓHQ=0BMKqLiLh^e͓@oo[0k*Pu%UDvOEO2z=OFv9j94[s_6cHݸ>nO2ŸY(-M^k)^M**{kn-ork躃RH%*~Ӯ6Nukui-control-center/plugins/messages-task/about/res/manufacturers/FIC.jpg0000644000175000017500000001114513543125214025526 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1 !QqAaB2XS$4"R#Dt%F7GWH  !1AQaqT"BRғ$42#3rSDdtU ?y4rkR&U&5\L_ju)G~0u#^&e0TP\]<ԣΙT7RI^T 95) cxL^\`E. 5~J`d: ɑ˯XR SK2ܘ *(.G.jQL*bEү*1#@hsnP,@ 6(i vrm0stң$ SvLQ^<bD]Gg1Ym.aJ.N.+(?'bC_h?vH~/K֙6\>(.NF^Ӵ{^-Srą0&yU+P_ n-[3'[*;lT!FY uw=`Q+h:1o%eD'$ 06[w $C.i7O5.I0fcvvOsⶖbb@B{Fڦp & RD{Ѻ2xl7.{`֝⸑rKd;D$WS$ (wFn]cvo+&efVgM󕧴k}zɫc0$`"Lܠ@GboE;6?z͵1Ʊ~J-e+7sv&`DGPm>V>h2of8Bjڻ:ioeӍ>, yHX,:oGT lWQV?z8=xߩ?&˿TbrܭI 5cf#[K/Yf7kPEk"g#"CD&0-uG[)Ig  `JZsnw[}+X[Um׺{{׿ko圻vW~ן?oG8dzdo跰w^pܤiJ%TGG3O*`5U _2fi$ SĮp س C2o\hQM`2 ﶎNTVֈ'zi*q8[_A~Y6~}^ƥS(7O<׬+rb \QiQAr0ͰnrT\Li([x8B葂CiJo%An&XC.C F6޵ۓnKmדw3t"ȶf죵liZN6rH` ;qngsSN;F1&$rfVюD̹ap[ 'w+ns61/IK6y*+s <}-vvoE 0KMn=Fjsj wV'W}+{m?SI7B^@7A|gnc1Fg[45({i-G i$ 0ZC=E Ϊ5X|(?7jrӈrC9wt> rzo0-q6%2WuHP1Ρ]CY^h0QelhZnZOsVVSr;l0 ژ[Ծ,nmFSUnR"{JÐNm1<3ÇS; 1&@p^t՜Nd_qWJ`Y6gȬemJ#/^!m޾[H@0Yfoӳ̜_$Sư} \.]p017:|Y3O6{?ꬺ/. Q #QF&+ul@|5v}?;37YzK2 F6vr U<Ibw61)ZZdU_)(@WTGc[쉃`VT5t/c)锃eR}LU2=K'/;&7L; bixژ[ KZ [8Dm;47o:N'c62Niܘmbgl@ $E)wR3:OZ@ٔɨ*O./ƛ۸.`kQ(ިwяI^Z"F#OHf6[1~[iD4KV[ AdobedF]     1 !Aq"2BQ #$aRS& !1AQq"a2BC$4DV ?M1XM}B׆#E0MGՅ50uN)GD~9&G.C 2L5LT[`4Pd](Dx15MQi4@_f95LQatE0M}?Lu0]Cӻ Q2_8I˯Œ S 1#@ >i>? MS}ZM1yP(ل)a0Mxb;$S}X]L_o3#{1D˜l݁S '_viW%ev̲rN:jUo;.0+S7vܛ\߉y,`T'o=cWu-VJ{X 73%ao[ qm/C @ÞY5}rфc9"~Y/Qrv"uh\6: nQi,'N"$ ݢ115LT[`4Pd](Dx15MQi4@֚nݯ&lMuF[7n)Ok ރR/5Z3]%MUHs7 z[J6NSO~#fqKejR T|RviWwJ[p{Q8)/ӌvܟh?FJ?u=*nPEۣ!UխF-EfsꮓJ+!m,4]%e5UU) {B>6&U'N/Bw:N=O4QP)/`vx={Co(n.2{WV5Mnetgh@E0 ּԎrTM*!n1b1W6%,-ڝX٣^W%E@G-1/;y )}JlpDZ35ē(>ZGtvlQHVs8rVDR{gg1 /)9\늳~ N#+Ư7!⍖ yB s#(d'qLsmڥS4Ͷ[.C]F b F-y/xxy{rrv=v<˦+O>ka .y{i1Hߗjb`kp{ztXđ%U+TdhR4H'%$6k;M`swB-ۙ::-c>-(s oVr:Pv8i Qێ\sI>[1n"ҳ*›" #n\_>RpKLG>a_ TgKhkͷ>ڶ={o;jOgnE^.#UD:Gq}n-Te2ȁ&5ȶjH!_"Pjֿ:FQ70ݹvÁ\ԴTC?-sፙ%MAUݝ߫+s]z6L)#Vܗ?*V\_2*1KJ*ڽjpG@LO۪޼γן -z<`B1 @`\8E[Uqrtŵ 3kN3n%!Tz#86@] nY[ζWUg懕iğ~a1yڏƼʜHrlZ,5-Kp LC1:/m?gIkdN#k"qċ mYT< R9َ{9ZV(-Zit00ûulΨUL(\پņY# 8 Tdwv]F\fKn/n2vTAoZ98Dv^Q7úeܶ?# zCgo:`keK\̽8;1__=|m*y:[e.!knU5FttH@MBGT _HhUPT tOusAāCȕ+>ŝ.ss~ܜթpqqpۭZz?"*RRgs'CaU_{ ̙ڥUDjP[xp&yQȼyfA>EQL#yy4 6Fw Ų0=A1`~Sk:d;[il3 8 xkە{n~R>̫ʡ=7Z@JGaW:#?/L#̉\kkokWmA?F8ݼV%'JQ[9V7rlD*_7Ipߕjp^a:ʁܫ1giY!)Vcwd{|xpWNNK8Ck }G.F[MaQX-.9??⯤Z5-Kk MzʚT#uԵUn:DT >er[șM/ q.ZnZVmCx@Mnu@e8NRu$tS0=II=*tdO2@3e IpWG'dn-ʺv%F7'K+IءzÝ Z9bF=<}ܵzqƕ.K2,l6 @v ŗPq+]/}؇$׈aFIrL ˠz݅4ȟo&-&rk0&1)|0$tG vtLP(/}؇$׈aFIrL ˠz݅4ȟo&-&rk0&1)j>. 透 zwaJ:&Kv!29uQa`0ܓ"$raG2'ቪoukui-control-center/plugins/messages-task/about/res/manufacturers/DFI.jpg0000644000175000017500000001475113543125214025535 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    !1 AQq"Ba2#$5w8RS4%Uu6  !1AQaq"2B5r#$4TE7R3Ddt%U6' ?y7c˓т13oEs 8&`Y7ux|)aKA̹w .c ,0],0v1\˗pzՂ3)1XݍVv2.uӝl+rhXkdT E]T1P-ARIu5d =N[TMJ[җF- :aS JX~uheLG?dz޺̔Ȓq6*,Ί@_5<=<tx? bq[MK 5YARŲ>YA[Q=jr C S Gw>U* -8&9zl3#H۩D6Do;xSgPjˇ;.e^@s⿭XU ˟ԗs~+X֟ρZyw[4e[lnjesR(9jY#"ζ>nh߈}?Ü9ӮޘZZP +T+4gmWɪ>Nm{3U4.e.C1W&ĕ4 'gV5Џd.)hiRЍ5xnd(& $drvYٗh(ǩɠF>;Dg[Euujބ\3J5ycfl#wXRNRv%FgPZzL2.w%l*jYRԎ*6S)`ØyG`Q5zHs?fyK2m#Q =q2f(!|~ O8Ea gYǹDvb%M' VxP^pw[z}Y2:vT};@/mOgy1n}9#bWM̒\c2 C};g=\iQ#A 1 =6<olm M4{ڊnUm`*-;,bkL[̝D͹4NR ^өQ),Aϛ 7]7Ĉu^]/1DKv^`rP˷kegoH;ew1}o-<~?bS7f5K_tDt712o5ZM\ c~ul8PZ=cnÊ@S5 rĬU9W3;RRxPoGo\⫭Ss%KHJXythjsLϽJ<_h #  w0Ȉ̌T M >|רH*WD ZYTdE*dPAh5g}uLyQPH`:65#%W>^qXېc| -exCP+ ^E :pWOM)\-=XɃGlvJxbrFӕSzDqJMuJ\ 7d`́UΌn)H"m}_cB!2u@kzG`(ǍH$uYk&]+Wau^U;q+V_0D`A2].@e@pj/YիDmѷ;gV?i`^;2!26:ITr4 LQ{9N!C_|g;7>O3vuWa};rPh=/Shd(իO!0D7fPb6s5Q)q1-BH ]UVN.ERqYAQXҤbczpgn{GRy$;Kx{ղǭ.+-e{΢|gPlZjlXQpN&D &`?1%h~P&G 9ƞ!eՏS. AyoToمX{&.dKI.zl]V0"̤EJTM Dy89\t[*QݍؕZuG]!g_,č9Daww<ݳfelmwM68[ -V~nm}˺gDѶNm1BB12rq*"ˈaiRR=qqO%2V}8*Nt6<ßY̘=m )nM`I-Zibj:Jk1F&BPDN#d"Uń$$ ٩8j&ԗM0ŒcQ`o7۰xN~=Yl 0,k:i$M#t`S, MUZc<"HC0=cyzW~1 kKu.wEɼMG"XyZ-Yr\T:O HXFޘSdŴ)hΞ.'C2y<ßSÅk ] 6nk0 '==o;&.ds.Se+{)d!\̕==/V+,$KT̴L&b .ޞZ-e b5ʏU0Pa.qZ}sXV[Njj'ʮة)ՍkVcA&2J)T" #5M1&0p[tD/17 @ {ڴij+y+#z:٫]MAUǷt5ycrDȸ I83z,NJc ǣf).nΰ9y;EfvRRMkW*r2qCՐ8qb}ڟvsO)%bz@)d ΋lLPϲ]1 Wy;C|/$F >P6c)k_vsj40H$n7ypzՆ-4oi7as ,7!c8&dW0oF ̀aYwɂ ÷Ռ702(4-e`-{dˆ_?ׂB5=pzՌm{},nukui-control-center/plugins/messages-task/about/res/manufacturers/SOYO.jpg0000644000175000017500000001657513543125214025732 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]      1 !AqB Q"2$&a#4b%3cTdE'7*  !1AQaq"24BRb&r#$ĒD3cd%6( ?y6bI.M6YF َhMϷnq";U&_E3Uq€ k82 +6x{5$Hg!—|(>#ΞDž liSרf_ud`h?lIgCOa ־ag> ^^H4$6mSc'Hx)XF-%X̂^c` @0ҢMM=r=nrqb;r`(B#$p=A;Zp$!UMZQDQvrń(DTF*gbMjrdW.yw}i&M3LTuӥ'P#ÛYk.,J14dNZ8Z'EVHIi~M:ͩr|1M[Z_LKav[- ^GE4B qsW;2kLJqn1z5 QXt=9y&AvZ[  KEs!@FSX^Ieɷ (eJoX)r[x6OS~b+K$^=ьXR BPCfoM`š5&lc]ebQu%H|:opBFv+B(_ARaV@%&zMɚg_,vA/[l%7} h(d!_W@\@P7Wq\&^a lon$Jֹ4mDT"w.9 Ar Z0+DUf~dJD1@Ht wЊj$fg y$ڶ%.S=_rORJl mϵZԢBvO+R+Ss:1WyJƔfy_ -{52W`zv̧ײ f3˓ö́Q0m:]ÌɩZmD[ :;X:F,4 ZXh4Wc '4ok L5,NX&("]-BAeퟅ_ :=8.KIVeͨq)/ę"X;(K`|,RSrO9޽M'?kH̸zav/w[Mw'7奐,:)sbsJ b%j9W&)%b,H HD )S ؚY9Ґu숨%~A,OR!D}S`{_~xYn B#)_G ʩ.a[_WMOqW$j'AVLhm/2S[HYwuhbge #sKXxE28pr.D'y|{/ If_p$fT9!WMY^rKMkE-1ImZd;Hd˩z+IJ)B/`f!N;&k1"(h (JWz;G?™k I}Q?eh^ 44 QɒJ䑦=Gf'k)%n'R~[ji,v6:rִ;˻ 1|O ޶]I ZlillEE[ss,{Y}vzByT= PG/&%ZbX]k)~uCEهam }oY6 67/[Hk]: -f#ƺ8ψ.Dž; ʙŸ6* X䓔҅G!7\lo4s)P E{?~ʶW2wE/@'Õ3+(h>mďvnY;/CE Oi{֪-)EH+,IfSAmJD1˳|y;)7+lPp HfR3ؼ2S0G{KkKi6a0-M=hyϩAMFZ]0Ԕd$Q!RʞQ=!sdReG%ByRV9,S#QH " []5INKg I[-!8 䂋Mc*jFDڵzgP%SQ\jljPJR&WZ,FwNaJ8B(,$O@g8yFsL9x^&2Aa.xqseԲD2P6XIXj#ey4]4vbi5xqRӒGӲ kƤN !+z` QLS&V58PqG+\haiV [@ټ';Eznl_꒫d'Gd3|BUmOv/ 4"^jpFL#XTK5L;9!MT% x=9a5D1C=ĀbIuj(Jt;SFKBJ[eL`H*T}@a rv~2DUu7`SyTɉ`'^{ZZ\m̶JN)_ZJ99VЅHT)yf#/pr~}춌ґXd5_sʛnG\/0^Yvc~b{<;1,/i|?3?{U9X|\x/*Q4'ۼo,ٻߵ{Kv`׻rPjv\'u~Nf?L&/Ż#ѮZC׏qxz=zÂ,7x.7.{kslc+N߷?w+˟16^y>@ٿ!ΰY}s]^zip?+c}}vu:_'@x-x+|Wrow}֊m};uNٿv`g/ܾv`>g"wwٳ>[4kɠOϘ?gOp|i?}uZ4v'.zzX\*kpzrs=~coukui-control-center/plugins/messages-task/about/res/manufacturers/UMC.jpg0000644000175000017500000001145113543125214025551 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]     1! AQq2 aB$"rSdRC%U& !1AQaq"B2$T5Rb#3Ddt%' ?LdB&~"3\L>):J9&K!29sQa`!sFE; <"}_&i(XB&~"3\L>):J9&K!29:#0a5 %S!:ri>NFH4{XMb#HX0MQ6A >H[OLÊ9CԏH6& Ldzn(<&5ixLB8 r0j3oB;?Z0u:a. tx/M8a&hL /nm6M,x^EOD9)yGTٌ4Wٍ~֫DzS%{vJ\߄V#:Yiȗ#<@e Ao+"OLxᓈCGQ҄E$g+~r깍:Lŵrw*Vj~4io1DMȷܖZUֈB,aIv-,<\՛7lRc5%_~bzǝ /UMBKiQJ3'fB}ͽ0jI}ǽemXuwUn5cp=K,G4Y}X݀)eU)nT_ƫF,-.P@d# yvzT6FUh?('֐:~ *J%ߟU>**N#w~i|NĠ _ >%a)>xo%v7-z鲎R0.R-+&k eS($,|uu?הݹS'FD#k\rwe4T4cH#cp՞|њT݇(뀢KQWHUĞQ0jx2"&cL3mKӄ0vY/͜B/]ɂٜ!e߆<0!ʬioBuԆlƟ>Mq-0_+C-EyA,N93H^{Ixԥf{8+ۮz35Tk>wr$?[PҪv3jv 'xBPvVnA 2t39v5ynMŢۣ&j4 ;9uƭӧ(_PSYPT32%F vۜ. +4W5%4>lt+U[QvNڃwt#dtuuAbTbȸpH#ٛJ+/Pp'{;: zXn7䏝zbcXyܬ:D*d aoEri*~YrM@o}`3/UۍvEsaZۛi˘_Vt:Y2sF̂|CU6= HcC "jΦժ\tI(,N ?00HX}KKC58 Y;%֝7/r50 %+J6?5/{v-\ Nt(P910a>]nV"ݭ*ҰED&af/aasǀStrړ2L Nn<2WV} W9GͷY}ފo l}㺓n]oYFZ]Wv{{d~G^R_M. :=RdR 81L՛N e:Re݌ЅgaÏoc=>\\;MywwU/ZP 4-ࡁymD,ْ[ &t# {v‹Vf1G0 xhRԺg,9}D}b\4_֢~%-Q^PvLҜX;@ 0*`cso&YR[_ld.p`,XY7uF# = ^c2=R =$tTPpպΘTH?넵tb77QzrIo R.aOXq+X7?I)Hmaq8zrrIҍBzNwcɕ%]ҐHᇳԅ6{1|V5t=YS4XQ5 rw/2\A*| `FT:ҺCh-xkqzkit`0 ƀn3ǪEҲY<'U`m>936ԭξ/tW-OkN#-9`wZ63:'dRڿ HQ9hė:"M$1+kB21L:nFL3_?k-51ҵQ)-V;8 Yio+6q9VŌ>䬎~q oΟ`(N`ki$=WNFo|7_k(fTv0+E6D[{O+j][)vg\ΰU4% P .|^t9wVJt AdobedF]    1! QqSXAa$2B34TH"#C%RrsDt5 !1AQUaTq"B$4D2R% ?Rİ!rAt9asFu}\m7EsQ]]Uk,Ԑ,QZSLIH\OI>WVDq0<-O |D?o6FIp'4.tDcx[_2K ͅcln~e,Lr2LL`re#}YW[@E8ܱGr -bkwo&rݛLS;%;ɗ~o7#n44N[ iʤO1}V%H׍2TO7Slq8R%^tP=<ؽSlqm.{)qz.uLp68RW /)^P}>ؽSlq6{)wz@J׽3/OV/s+Lh+MJzޛ|EB.[ZcGZmjS+j p6|eiݩO[vi~1V+s+Lh;M^JzޫUD[ZcG}kS } b=KƎ3֧;N^M8zeigiݭg\K*/,p .8ZB֍CΊ.+@I6h ۅah 8jqK5R .Tn}dԨXF1&)#FfPY}3OR {P2g\K%-ø 2Y9^KWZ\ԔohNCC<+(h0c֩DAQg5H_H9}kFQ2Q`1hF*0 X53g_cXY N&ceﱬv@ q\ŝa<-h^(-Er]z~EboQFVq8W@J4Ĝl]|UmMQ[>eִec.H)]1_SuWܙdK.P 3/Sqh/~z\/X)].N.#%7*Rf:U,~j3Xd4E(Hu< ʦ*Gol\pJ@>ъ[qXWV16j)ee1h%ӅqneByul)"LeeM.nݎ2b*"efM|"=prsTs0&"YD@?IJ9k:%(I94ˆ@w=y?SC^5V1L;1I4) fUG!Bqx,fXj_/kO]u:P)0"M|hPi@B%1-(RTu^V*^Ou7܉giD>Ya4E-t8M7s5uVz?Ճf:($n Ta<_*R@ZItɢRP/L%Tj&502OBJC1q8Dt^D,؛(oֱ>SZ>c X,et򡩋H2~ђecmu(w!;$ʭwPLH۴9aT Fed'fQ$qx4W)c]^^۽rxͨn\I[q'Lf3w/P~f\ ~p'0lZsڍ\3ncN{Qp4ANA/2ӞjGBp4Qp@p 2 Ew,2nQ8r| 5Ck!.hI=g3JiX5Bk#.I]6W^>+/5`lӺ^&֎ZqecV O˼k.{ץGK-j|R6]/ޓO-w]zTtY|M1{0PΓW-7]zTWl&ՃSvwL43:M6W^+^V_Lj]euwL4/]j+J/+/5>=f =| ץGJ헔Yg0 =| ץGJ헔6r 0Юu{l*]+^P|SnioW Ar| ץOv\kۃ7k겎 Q[L9h4M06'6wJw. 0n*Gvi icݰ7?HbKVcg, Q[L9h4M06'6wJw. 0n*Gvi icݰ7?HbKukui-control-center/plugins/messages-task/about/res/manufacturers/MAGIC-PRO.jpg0000644000175000017500000001101713543125214026401 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1!AQq "2BR$#4 !1AQaqB"$#42RrDdt%& ?Ǔ ,qW&>B dA1]H&<#JQ$0orL\w(0 )uF\ ˀvu(TwjزaWL}1$&b="LyuPGH.!ˢI~`P\ Qa@Rꌹ$+QLT7e¯*\) cH&;M){)tE ꠏ\CE)GD2q$TrH *(2W.ԣ֙SobPV7Z$];g{Z{tY 순"bN_۬M@D {"i&݄;r, M7TKPdMAwMEʴ1izxlBhٲI-Nή?5;XS'Fkmԟ B]Oi|׈^QH'l 1dӍމFf {?<3[gF%S6|rFܠct KZg줅eR%f}dZTc]i4S&0Whߗg)q >,婸5#rnMۚRv'p6S 9v+OגF1Cy׸4>&Y:WN3[KB&y0Mihz>{ndN N\wD5&zc en}y=PCw\yܲJԔәl\fO'}rf\D2iG ap"a #yF`s^/l&SћUNyڳjɜy6%$@Lڇosu@iRUQnH%G;U.2s$9KfЬ.O͸be*wAZNFmzHTgncd{F,lnah/ F0 o֫g<x3?Gd6?R_1+TMi&F%ȜʐƘ 3H<1KUkQ^5B]r|[ wBVn`'?0Lr'yC>N?<,gxvlCz4y=K|Uz>=v1Qc/=B!U:ڷ"N,|fĖboLt$cnR -X_W[Zl͌mfu4qXaK uO<9Vo]\eBo,es,A`w1 $o90/%Z_] ~s o [$wbEXwn) +bsRs+fۺ>Uff:zp >Lr1?yyÁW }kit9k3JSC4=eI%˾Ԍull)+Wtc*=h-!ݧ!3eB8yDNd_8En:oOfjSfxzLL:z>_;jvw,7Mҫ9U{H24LeZੲ~wYAdX[> }JR|yB IaZ+5+TRnڸywv9m,%,UlS(r V7ۙBUG-^Q/f300_^geRC΁jjzTN]4ͥ"nJc};ʠRT72hš %umؼ \2FD*H)bJT7\k]Sb I#Mqo]k?c>?wlG_w](L+bZW&>B dA1]H&<#JQ$0orL\w(0 )uF\ 9( >ObI^T 1R0LwT$R RA1Au .R%uCer)FIK2TPd\;G2ӿSTŖ rc)a 6Hc˪>Aq]K$xR RTe 0\`wRZeO-&yP*HSA1RlH&#K)ǗU}Ԃ)J:$ Iˎ&.˒@aQApʟNuMS{ukui-control-center/plugins/messages-task/about/res/manufacturers/TYAN.jpg0000644000175000017500000001222113543125214025674 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1! AQq"2$ aBx34Td%56w(8H  !1AQaq𑡱"2BR#C$4Dt%6rST57 ?|Fk< #LI(N1:bLvC')sP%>I}B8"G?"4 $0G TD|(Y(L9`y3@G?Q`1&ctęOS:J|2pD.~!0D3G-<8&C q ,G =PL{Y&c3݀d)3CG?Q`1&~&$ϧd3X$Ľ]:[ }B8'G?nHLw0~{4ے~f@HCxhioJfn,Vvc^y-]-LrʫskԭG;1MX_:%aJnR+;9)p<"XCdyx/YO$C~5llx5o]MKٚ._U>YXR ݦi_&hTz?0ͫv"}ج FJ+rPM.M5uCt 4l*,nX"8Dyt(гj2TZ>UyBo_5% 5%,41 0Vr9hƍ5zADN iX7BDbg0k7gΕӨd0~b&XGWm:dGNNT^ڒ֥IJvaϒhk'iϚIstKPvbcmZaP*4?QXVNg-L}4-r?2UOj;Vg~ϡEeV+VoWV/?9^gpZ~",f4]Un 4<V 

k=Jm%$*ekIc ᒆۖexJ)҄K0 Φ `֚,2vIdS\D chѮ\("o$8l%|mb>bAfx-j_Z$UboksrRio?m@uaRtaŰdun";pnb՛=1fAҘ*&p<#i^;:r(:/(G*b/Ʀf@Qî%ZϸGӽpɸ` %Xvxg_(F.*4Rm#Y{@h2YbU%CV}:{fIrJ^Ԕtdp=vּWgֱҌy]՞EI=óP5*ښ/: 2ȉ\nnb=Iӛ]=M6"ڑtkFVk\V6nyiNǑAi-RBTi cԥMBq@ahaں*(5ǂpst{DS0p,/zV.ZWR dORBd%mLv\I;~kRw BoP-$dTii$Z[ej!rv'D$quq4!I ~"U1 bm1Ҽ)M͘cF<Y[VA ^2k;holEKu' &Hf$v2Ba;#Gk޵:s4z=ow=FDPihZ7eʹVVBQum#gԴ)$P@Glly]W]b|=Y6O$>_Moq"!/~)?hQ|F`y3@G?Q`1&ctęOS:J|2pD.~!0D3Li0BH`.A։PEQlFr(g(!1&~:bLǺ$3 %:u@&e\B`fÂ?VX?8I)r@H/bukui-control-center/plugins/messages-task/about/res/manufacturers/KINGFAST.jpg0000644000175000017500000000776013543125214026343 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1!QqA2B"$ C#4%1!AQa"Bq2Rbr#$DE ?&.8_uATf *$ TA5I? OeIO$ƒ%JטT*NiIW.#RFj-& 5TFa M uNI^R tTI/(2T]yH@TdP%rR ; 0kab|[l)vv8zRI`q$8ԛڶbl"lFn%\ƱYHM77l:-Iz+UC <|k&UX/KX5ZB=с841lf}-_룽6/oq0.kKE10𤪕U8?\ZKΊV+8/urtj+kw/7&'14VLkZѦ ^᷄j@]{SKw}t˓(Oz/&MhvAW]z׿ի% cketZ:Q(e^ͷǙ)T8ү[^p5NIû ]aV͡߃ݷHA4=> F0yd7lb.72O#9BWRV:˙Ȍ[kɒK `20+/l"GpRKR*bq=  q۹B-ַXi VEM/ u#ix2_&jͻ$kmr"1,C'SV9+&9X f[J@_P,VՉK>#,`{#VbՔpbKh#Q.̑܁S`|o2T|KUK^d6g ^pwz$Q-sm|v6 8w+fT2hAqRFQw`W7ڇ(EvtfHI1Nw%fjR?F&oS$s}~C P5P&%?U旒y;3ī1JF( 8*{|}'mZyft k HUL`| C{{^iq1~wvn^ &-p>_Pu+&=us;IL*i{HGRV+[poT[?(;~ij[2$bpLqӸohM}~mĵs]Z! 8@#clja zEPܼtQo]9~n>hҥ#qkVᓉi-q K>/3ۣ2!gV L$e,D O* h%O Wƿ~;olE[YC?Ζ][(kOGTb.1MIm?*/UMnW];+0.btJn!5UYPd ٽbfCuv9Kp a\\Hn G[\eidvpgseׯ@@+SvJ Wr dpǨ[^t6^}m9Fm'0 s~cEel:G r&)yf6ޑ\JmDr@) @] q!и=Zg+ʧr7)dq/Mo,H_37oWT_0^^@*q\3Ҷ;8;V_A[V ;#iQ9R 0i@ B#LXteUq RF .%BlBD AdobedF]      1!qAQ2B $ a"R#SDb3C4Td%E')  !1AQa"B q2$U4t%5rd&v79 ?pDL594?'bA&، SQU@&AE?K ' % a ~QX鞥C:e1!ys)JPDxct ̫xw]qf1+e5vUG\fBYz1J⾛ȈHc 4hT&a.dy]OY6mwAtCJB(HLFHm9\kBֲX͔`]O*%6Jd)Ī!t$kivI) qnZLY5PW4$^?&z[xۤk%;=$X+YX[.wSʐ$?݂MۆwO0&}Ƃ)'M r|+dѐvE*tRC4VDڲֆTGևs4YN(.3D(G(2 jT ܛmvh? n[FNDY`wV:qDE=(}܄ػr[B {4qx0f=Q\tR/m47!?FIpPҕ+Ã;:Ƀ?3aG{ː+Dkc7qNeLUߙ HIZ?qM'+[zXRZ_b1e Kq#F'h{nOy~c8.Hඵw1\Su7NfG> %]+NduUjRM+R*t:un(e\m [ϧy?m>;Q'¯KO #Pݴ+QWpߔ^!NA2$BP*2\'v%W6k/ z6uG/(hyg 鼭A' l$HQtdY,z*'3W TβW"^ r8TgDŽ6yF6};1+*2yV*g;_],Nl۠ &ņ:ƘwB/\U"1ȹb}e-'YI N|_EM.4slE dB_ !mPҺ}J^[hk6^\jVpgOڣ )Tr/EiTJ as0{<@ڧyvSkJ%%H;N# %Z/NY'/@|7μ$"Sa!6o~lb;ZM1 ;3.S=Y [2uLG~!{P2u4-sgϖs=6E)ZVK&КZL߅e F˛V9q .loԇ4^-{N|u"$ rw%o[gA5HT@%3nAZAP'NA0 rf`?Tf(ȳn~chȺ]нթnWVa2k[2c::qجnx6ob"ޑ[(ZTrsSID]QO Z-Vo@Y&O#2z<~J_POnٌ2Nq `. cAzBEc/XsmL(J-;~u, B .*@ac3s2Z$:2gM Q}(ОZFI(u\D2d 4>Yi?rC~"Jxh"A**$hTo'k+Hm00|ZDsFdfa[.OI:l32$smޒ? hv\Paw#+Ln^6[p[ٝI섊i.5y5D Yߋ*"?ߺ}KQy$ ,7m¼ka4&(|?vZ6t 4HǕP];@@n"F ~|k0yrf.AjƎD.[Rִ6,\lֻ6;6Xg_Edp !޲i͐9xr:&Py#41hjv]mե׭ ޽)s{tl7kvNXdյulO_w]* m*Jibd,!$AQ0ēanÍSĄ)D@2zX1UܢiQɯU``uɦ bpM0M| AdobedF]     1!A q"Qa2Bbs$ #4T3CSt5U !1AQaq"2Br#3$ Rb4dDTt% ?Yx(. `FPAxCAAҘn0A8~PA8{~z^0xSAKc.NoK Bam՗j,. `FQRO 鯢X ǡԯP(H Pi(4^Z&ͶQ4LYUPtmaջƝG2>ww ; nYP:ǗG(3:3Wx"GdG`o0M=H5@)(X,} tGe%]q3>8)/F~Y䫱V܇~?##&Za"ѕ1T3#o2ϘFNv]sY[~GAqd?GR;OLr]YÑ87;ײ,\sҜ؏ p{3ĵoE~lNPrRm3j/G4[xem+,9 1˻0Hi~zȌD8\ߎ )B0!/Y\4 C=f}g3Nm}$tihq g5ǜVqp9Pt`2DiI *;Z30D]mA*kK{>ge> z]֊R5Җ@!ðdG)ɱO4W3wүP]f?rVgH Eb1kg[c"R݇ʵG۝-ewd%ۆbqV=E{pQ5u?Vpby@&6=7tڰu$=P͒r9Ğhe)IOA]ZLS]r;A[ CsJIgzc-w:S+ [^E;2ϛ^S3I8HOOꦮ06 w/%uh b8 Y6Ґ8/YW4KuqF`MEk%G#0?F~Oiy{g^*D<}y^WM6l|'5lS6HD>^r9g)3- dT[UEBٯKOP@/ x6iI=mhAҺDFٙQ*ٳF--۔/ NZ7Sݠ>qdW[:5ԭ E zp'L\{IXi2o+RQΐzsrcɎJa deIqk6-Ҥk'4Hp!rq|J}жj5{b(oVC~zg*¬{u5҉ǘЙUY@U31E75~6'IEs!XpL#K-ϻho.R6XOdKfjj)'B3eɅg*ff\|??5R& J"cpip0u/yڬj|F J)d'rm`R 5$ጾ1 YND`LgX #)T$Q` BAP/0yɩ3 ۃULo}KY}3Om}'`wwQSRLII LI޻=_?/u2RU—!%fI}jG 3rj^O]T** 'W7/iꭝY*JA:L%(V 2!(fh/ԟ$=W)d Cro PBӨu0ecn-qYk;7Ƈ|V&\ H||tO|ihCs>UTuy5&Sņt5цqUCwntdޛ>nHd>ֳ@_t6h ԙd6MyC(9M TybHx8ӎz/MڤSoPh١: BRs 2 3Li$d5͕LSU(MMr5xmSFːJR9q\:GMĞmO"zݽ8(o9԰nEMVj|zg\_hhEЋٕ,Cw÷l~ߟ.^I`,9br":%ӳ?+&ٍt;Jv蟋 ە4ARY$ L&w`pk@ڜA6с pr2ʥwfM?W! b{~R6ƪEn5̥ %"}iQ}LSWP&}2(R%<7n_l^m녇kЁ ômp;_9־_S-\rIT&  XB?MT|H2Vͪy}x{~?48ģ` !HBgo P>_FHME>eLjQfIxƿrwӬu2x%#Bxd%_\2+Ǝ^4|o2~ȭz |hu~(mknX[Ǜ-jIO6dHt^$˘ŵhўUa9h3|?nheEKafֱtIz$_j< ~%$1-ͩ@[r^V&`+WSˌ_m6NŔ:>Px1vZUS;e &10+oo-BH c<@L8J|Ot5{܎+ WڳR|JۄKؽ!pM#2gs=׷R s#O"%Iv}koH?ܖI5 ʬqʜр>^ %q8Y jђHO;O N9cm(Fd ?4g!0;og{\4k)- vp'7}m1& PHP! 0n(}=;fq´TG] >yu& 2"㝦eZ!y<ɔoͱpLd!f {;C^kk8Rc$kU\Y#u9# *_,{~s1>Wg-<;~Z3R0RUZ1pv7QVvU.ZmU+VGO. ; cԦrzs9Cc(T_::t@Ķ)O"|~-&˩ʳo2k]&t@jZJE\t Ȍ+mZt0GՂRMp ?A(_/wnT7JmT\2E ~C9?9D2UEr?jəc)Lci&ɣVplA+bQwٛR#0 }A۴vt`ըm4B@ Jr9vbDXsSPFd]8YgUn֗ lku-<UR!?z #У5PZ'#6{q?`'>0Hpb;}]kjk7/J6XX,)+"ݣWbg%<`y*s4^$ǐQi>*yPplu4Q3`S9s2A0lA s-a|j$ԇA9࣢1'i*{>)`N$U,".4GvpE(6$ihx o#I `rL<GоGɌjv:_oR,Q;wcv;׺R>vڲZAS(| @-M?q dEJ*ڢ?yTP n}bR閳>F$wvDzbDճ%f'Em1a9g~DanY)gh0;clWWS\A+=52WJ'P05H$@PࢼZP(;53a'ɌJ*Wt4N6a2&͂Uأp=C5e'.&( <@s3sJPJp t.90R Frg1v陆Lr%c1#nP) wÅMXX,1mPcI:؉gqFwOrU⫆2sEe *yrȀ7hhHV:\#|JznQe5l]jŚH6@>۸Cs" 1p8"vwaY ~swM h kBK֢[NR3ufG V/*W1޳PŐSc)| n*v_9+ )Lc"<˗,{;??[S}b%p?Q Y2Ǟ"~0tYA @^,kHtgtUH(H)K %6ҭ|rv˔֏|EA7gˤ PG^ߠ}$=Q9t 8>a>h[F5e1 8iD^PFP@w|4Nߪ0~Nߞ0Ax~`F s8>a>h[Fukui-control-center/plugins/messages-task/about/res/manufacturers/B&DATA.jpg0000644000175000017500000001430713543125214026011 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 !AQq"Ba2Rr3$4%S&  !1AQaq"2B#$3DRrC5 ?<5$ŧ'@X!')gb ~Z؂qiV Cݡ,1% r 0f6ypb!N^B;ؚOifj5'@X!')gb ~Z؂qiVX`'xX0wZ#;N^=1 ؀. @pd0i>AhG{I{M,ؽ͗.ewK#.f抧ـ-o>5[XƦ4 RL!!N uAPOŴKd'T"#yjr&}K7zڲu6T飊JFVOtaDw^%<:hB,ɔ4\r e1G hbR))<%"C ]3kԩ8lɸ eG8@0Hhwe.IC ņ :[ĒH46,!72Gf't7-#Y=`TQ2E#8dzvYQ3'+eɛ+f2bPb3UԹ Z^ABg1=jhR̢ٺ$sTGϘסɯŒ0׽6ԵIMX/q?GM-!~Ξߦj^ c/ytL w*2+Ø:N!epbe8x[3•y|~H@* |iPJgwU/*,)A,rIUJ&m'9M6] $o1KRQC: u.ݝ :>M!1IgI?,^}`xB}8|P]Wsjn}9I=47؊F ŨtM +q|vn#Cpj~EvSӅP9×/9yxMSwOcerZ e*5a%%. Ȗc@IHC\UO )|蟠Lh6˟5Bi:QѱSIc1=#3$M5Jʪ.HrɌܩ8]s+'tq%=m,Y/pu'MO?J!&y ?6Nm3]E(\W I$mWqu\%P۩ 9x }ĺU6JRۂO3)|fp.%7=T-44S43DDCnrcยsZb+Pڠʛ(PűAQC`ܦ%S]i^/ʗ<!ĞFI.rH{e>U{/tbJq" QƇDy$hqvSA9\J"qTz}IOU1c?TQ5U@1YGtܙ3C{Zߌ.$KQ¯lx&jL5 :_tN^eW Е38{am3YmvJfq7b?[дpd%ڙՍ^Z'X%LFVLT7.ڨʎnꕣpB;2+#%N<߀哠Ֆw`R @ڡ5ڃ[KB"*תWAB?ٮK>ӝ1w܇\$8@=Z-55]% gW08caZ9v#Pk1#CӶ@{voᯐ}P/;ͭn:-%Vsñ$NF]d6HZRK)a(G_^tE=Wntxv7.,>:SpGAu0kg͎0SNkM$zRh;DRr,wDwק=6KZ9CqTM1ݵ}ދo|:C폻xO(.P9Á<۱}:r,ϷcPylO $_*1"|ք*MA)GT<BEr? d%[]Sh\8\z 34=~)! Du 6#-*l9Gsh"p7Vث[ԄE)`R89ºUjRޙpotI.s^S(5 ԛw,aTuUTL4tx٩JI̥_S&9lu-]gY Ku0 #NNP72\-?}&`52:oO.<65-UVJSesZQ孮1ۧIKzr>}EQr9בAW7#%H©Xsm˭]AW^Ba ӧZG˓پmpE6ʖx@eVxFLSo3+,BLv/u&)IyMoT^<M{>p*LۑKl\5gH+ztkT[2zi\½zVTinkH]p l/߇(Dјif-i-ä.:Z jfKp'qFDb`kcI"A/)D9F8;v,+ۦܶI6Ifr&diD$)-I*TsvRclH}NLJ2%Z,y6%MLېh%JTS]BBS) Op=g {x{A"x 5 wى}=הƇ๯o//3wC!}tǷ&6IٺC~[(p5Ya/uVϦ9AIsUɿ%eYS9́QWNmt2cA sl}Nn.-EyqJ A7gM++ 쬽:p52ݾ_՟:nc9 N}dVؒ#̂AK듮W+u*14k{جt"Q>ѱ[]wRݞq%^`qhtBqfhs=Gc˽7i6?z> Om},$zVk yomhupkٸ5s}I{ЩV3}ޛS_E_{1ӿH]]ͤ6I^mnYo}S7[Ŧnó&{kyYe m)m$zҿ9,os ].mw3~^Y__W?_L(' Kle-qk9iiunu]˿B,~JY@:qz|=?*Kf= Tl zks;+{oޭ~}'w[ٷū/],k.Knum,z?{^1Ӿ}?n J DoN/TI%)$IK'I$Uun6ݣ#ͮSI% !xǨ96Cq{Y0$Iܩ$ITʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ Photoshop 3.08BIM%8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIM=F]sRyb]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM ]FLJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IO+.^O}=/ 94;Ӻ[]%}"[+4dYc+-f`kOؑ-> 5 wى}=הƇ๯o//3wC!}tǷ&6IٺC~[(p5Ya/uVϦ9AIsUɿ%eYS9́QWNmt2cA sl}Nn.-EyqJ A7gM++ 쬽:p52ݾ_՟:nc9 N}dVؒ#̂AK듮W+u*14k{جt"Q>ѱ[]wRݞq%^`qhtBqfhs=Gc˽7i6?z> Om},$zVk yomhupkٸ5s}I{ЩV3}ޛS_E_{1ӿH]]ͤ6I^mnYo}S7[Ŧnó&{kyYe m)m$zҿ9,os ].mw3~^Y__W?_L(' Kle-qk9iiunu]˿B,~JY@:qz|=?*Kf= Tl zks;+{oޭ~}'w[ٷū/],k.Knum,z?{^1Ӿ}?n J DoN/TI%)$IK'I$Uun6ݣ#ͮSI% !xǨ96Cq{Y0$Iܩ$ITʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIMhttp://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2012-03-13T13:26:02+08:00 2012-03-13T13:26:02+08:00 2012-03-13T13:26:02+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:fccd5f49-6ccc-11e1-818a-a659f6cdec7a image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@F]      u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~Kpo=(;om2 #c0± -/o0}ǻ$Ttl,fgkJ}Iԟ:CmOzt_ ~]mWy/ׇqu)m{+1тpK@o-EKmܑ̀]'gc>}>Pgs2yN⦓{ sW|GUV6+0'2DcpT5S'Xk]<4z:v?O1o;>˵rP!vr}@)';o+];L[wL]ِIGܻ܂%6<IiaJiXV`2y$VBO<<}6v4X+}%H.$m:@$.:++{_X>mWۻW;GlX홸ك6FsZ>$cʎG>KN||=wgϝ=., u$׭k#+Ko&, *1#6پG&2fw: v+4}{sk0o n讆ϕ{1a9Qȼ9&KY[tVBZK "hԒcqP;(}_̮ #7>W-ޑ'ne6>?ڵɿ:7nc> ݥMUBhf*qBk9o{yRĎ\3xnFG%MA,Cbi|}۲:b6뽙׻|m=1=yjy5c WB֞}lFql3E*)i`.Y`|M]vg^nk1So'߿;g]$)gSC \~E96gøNlח9sPd)m bu1A$ZE|u*{YI!9"x;Mi&clڴ)~Aaz K_œW04\^ ,ͲT[EwVG PEc~G}@=d|z>]uy{)v[Bi cD>wۆur{ZXqv cg;'6Z 1+ gY` AaEkhlW۽Zxe#ƿVjp H55i#oql8(2 ز+7fXwto.d䕥defǒ:UvyڹbwVD0ZPb0(]9CIלmӽq;osf%ތ;Tor^߮L\2FK) hY ^y=^ptQ'Qm5 )Pi+[o۵n*;&4uT?ymퟞZKIb 11ozsҋ| ^h[T&;vhZy@]Łҫ>+`V٥ҷ݁,ENݿs8f1}͹jlQe\ H)5 /Hg/V[h[[ >Xk=*铣Yc:-ո=C]6:ʮaҌNAW8s9 gQ!fըіFoV k*$kQIXRjFOW?oW [k-rC9 d}˼s'+m@yV8Օo55yrKd'!xHڨ΅Uqq+l(wg~VKq=Ԙ,-N3iGZnT_58k&}2V̅}2[I?y$۹Si Wd]o yG5m0^ҝ`|}z|nN=a֘*¯\\}]l*3}3,NBJ:zLчAʩ#1QO87?gB޾qw=|mwٔ2)oUĖ^H4@Ir NgdLm?yV;8oo>O/{ ._??֏vx U_ 窚i: wWytL88˼OzÜ-#3qRugm^6*+$Upi"P".'L-/4nKNY"1UF[(AXT:#w74[>;yrx/z/;˸*kxݛiV*Yh*yhj њ3]I׺>ޤfl&vI7.("mlH,K&DV:QlO*b=m̮>ޘڟwvGٴٍ˸sjZ*tZffU]VV]ԞCo7~xRf崊R$ǘIHMFO7p|UڝwMvWg:f;vNUvnkTZulf}OrM=ESSBdm iZ@nI^iۭMo I-c1ʫ$.a% ƌ8punx߸x%keğ{dNvUWj2 S^5pԜ5Fz?۵ŻsAuxQMnV%Ëf#=Ɣ!$Yq0f~>`xwn;v. =O}cm%FG/7FϬYLlt%1GO2cg:Gj7WoỦv];wN725qr[B N!\MSk2xqȠwX4'j-a'i=M} d =<*ٴ.Q%.Bو$,Ef?5eaw2c݃~'휎٤em`kkWTsX2e7+shզsnǶj=M5®#rq\\FTx0Z`tURT]Gw|-Uds;Ko]c3|,Yb;uAM7`%0mD!gBQo!^ov&e$^ +Jæ«bSKSPmMOMulS"3gpۙ9}S3[5ZXV5s'#銃4$VM8|4jKyjKHݞ5y<>#0TduE:OfE~ꚏK3dOy>juV_ \Z}/j~-5x|m= uzO u֑ȷ67>SրW~ߪz֕?:EO~t1״/AaT+юSOSׂ^п,~T @L{kmm}ᷰmfi1&.9I~%UA]5`AGPUsԐ^!2:RC)AK]%Ch{2gnɴvR`mH28 *դg [%j1xLB8)ȞQ>QBte'2\˿޵ dS<^Q8-FqhƭڹL*ZJxii8 aaP Q(bB ,XTJĻ;%ً19$RI9$s}#%3OO%= ta?]M4EvJJtI$U__k¬2;ol?m^O^#~cVk9q%-W )dXڥ9;H#4(4^v;w])˰\wl޵1uZ_]W qAc†xqKx/+r,qO76`yv9yݝCUk:cV yxu0<8QN nvfw@{5}b8݈Acխ0>TF׌n^?>YnG%+}#uF&Aq[ux!\CܶbVwqPr;*?'Q9m>e8Cau^pewnjLwwVfX>-m>9 HDV9Y E_M JqMrO5æS9e6~ҺpZ?֍;&Nhkc\oz/U{gRN%|Rls/vójy KIU;[T>W6qoAM;7cw[G\xӫyg}sJ!ge=+ǡEQ IQN딒I$́~S\(H`/Es#aƲo}Lu+cU=[vV_f=;uF障zikj3ޱ0~culw߁K%_J;CSlܜYvM6я[ f2XڙMuX32/7;k^>/k~%fRWbhհ/ƽYwKUWb? %I+kn֨bH魺}R_]eߛ_SG֊n_Eީ"&hs-[|^MOj{ȋn?ڨb7ZKj?"ۍ[Rqq3ֆ;FJVWYȪ>]n^MTS>F[S`ݴz~c*9_]qAn5Wr{nnSzӺ^^?֎Ԭhb2 &w7jVNO\~5 K#A65@_w򙱉)ցeUuؽ1.NEo{_wٿ;SܷK.fΡsֲ;*4a}eu[h[Af?@f'\>Փ22kSYsKuO~%7_ ~*/vYX/sSgh__}pW[}?C}/Me.d}}vV-XXڛSM4[b?bLKퟳؽo{=IOTʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$\Photoshop 3.08BIM%8BIM++8BIM&?8BIM 8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM08BIM-8BIM@@8BIM8BIMOF] logo-07_93x70]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM a]FL EJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TUzT XL6dc.r h 'A &[I.ZbclfN^+ خU0g$dxGb3$!.) o?W֝H{^ \T啐z? q}3ٗH*?hǘY>%3OO%= ta?]M4EvJJtI$U__k¬2;ol?m^O^#~cVk9q%-W )dXڥ9;H#4(4^v;w])˰\wl޵1uZ_]W qAc†xqKx/+r,qO76`yv9yݝCUk:cV yxu0<8QN nvfw@{5}b8݈Acխ0>TF׌n^?>YnG%+}#uF&Aq[ux!\CܶbVwqPr;*?'Q9m>e8Cau^pewnjLwwVfX>-m>9 HDV9Y E_M JqMrO5æS9e6~ҺpZ?֍;&Nhkc\oz/U{gRN%|Rls/vójy KIU;[T>W6qoAM;7cw[G\xӫyg}sJ!ge=+ǡEQ IQN딒I$́~S\(H`/Es#aƲo}Lu+cU=[vV_f=;uF障zikj3ޱ0~culw߁K%_J;CSlܜYvM6я[ f2XڙMuX32/7;k^>/k~%fRWbhհ/ƽYwKUWb? %I+kn֨bH魺}R_]eߛ_SG֊n_Eީ"&hs-[|^MOj{ȋn?ڨb7ZKj?"ۍ[Rqq3ֆ;FJVWYȪ>]n^MTS>F[S`ݴz~c*9_]qAn5Wr{nnSzӺ^^?֎Ԭhb2 &w7jVNO\~5 K#A65@_w򙱉)ցeUuؽ1.NEo{_wٿ;SܷK.fΡsֲ;*4a}eu[h[Af?@f'\>Փ22kSYsKuO~%7_ ~*/vYX/sSgh__}pW[}?C}/Me.d}}vV-XXڛSM4[b?bLKퟳؽo{=IOTʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!UAdobe PhotoshopAdobe Photoshop CS48BIMhttp://ns.adobe.com/xap/1.0/ Adobed@      F]    !1AQa"Bq2R #br3C !q1AQa2"B3# ?h@YVܤÔ!0qy)o 9!TLQ39D=@Y>=}7ǬϚQg DܴHQCl Go. ݑs؃,`=jʋ/ΈΝP2{$1m0yq1KujF=I9?OSov-jS}2jmHt덖UvreL̴HPTLMûɪŽ4S;}-t\u}kފ[f=h꓉SIp߅8/"'0 #mm.]*@:jBq& ?t>].4ʬȠr*5PS.F:*Q鬑(N*JTD؜Ӌ${̕@!!$HCj P;{;D߹wJ\)ʼnBBY/S'dZ^$R^:.thB]~x^p59yO?y|2('a[kKHJK tzS%VxjLܼ30ʓ!DaOəcm~o*lmt}΂yUXٜ8PtbiFI'^B6"qZBH@n7n;k["ʙ+ Dv L 3a@7OxK@uI+8]BrE0R# z]>Z+əO u+-[2۵r91cǘ(D^1ִ"ы./ٯ#"V|en YIH{5~ͻN*[Re |g. I@zU.DWdۅ7v³pIqL>okt%rnWޛ,wTC|9{g!ѣF^6Tpd?-}B[SpԎ貮Ys&^R}L@ } qdƾ/0bzZE6놝/E!9TAÝe79{'#֭̅Jp;twvEz(Uz)G1qJDm?U"ijе/ۣ_=;a꿥K߲\%w ePAĻ @TZ1U1>p d-V!rEPqnT1{$qm'K5Kag&s9zLW,]Z3nrke[Q6bc]*e5@H ݰuhԞ,G,8꫕22fMŵgL֙4 hݻu*RkpPDYB:d2ev  6O*4l(+L,E#7Vag+dL7+v%ϾQCêJХXuj>9fv KK2H2iIv(7!BQcޱd[j$VDK3i!P;Y1@ͤu2@tT78h'}b~}o??+~a_: h@4 h@ukui-control-center/plugins/messages-task/about/res/manufacturers/ONKYO.jpg0000644000175000017500000001142713543125214026027 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   !1 $TAQqb2B4Dԇa#SdFHcst%5Eu6G !1AQaq"23$%B4t56rD& ?4lɟ#xLI &88&?w1.pDJx&eAܤ.~)[  DGIPbU5ዲK5xqeYm\X>\TLUIsv9Cs"ʧtnrB{+\rk͸z. yeX,N.2s`[(s٧EB9 ^$%=rx?az}Ҹra0`˙i\a0)M n % ԶeE,2'+D6n _[״jڶI2m  ₩9Q7|vԏ+«r/Ky=M\SKy=!M/@4ODSKy=!M/@4O')fM# N߇4]l}-l~I\<^\M5wqsm,UMZ7c<9^$*EHɜSN44Rc҉$|zI71`GmG(e'6rlX 54u7Xq>5BL!RuAF3kmMqo%A>loe, ?vD 2GgMQ؛zs_&7wUj/%x29 , 4.NP'Tޖ01^ɴ_V<5Q;TyLx"/+,TLjc`Z#daRoerY!&)TSI3N ?Setrb8#R0>Q[#MNWԇLT℗4[oԭdV FjQ-QXN2gPJLpˀ@sI[f=w cͣU+1bӥԃJJvPiI*'4(floi =uXy9C( FAiViH= G{7{41mzlXwklZcF0n.T bᴲn"lvFBdWr©pS-"S+Iș?;q!|/Dt1XS9|.v K3va0kĄ)gZjI򭹛T˵zaQ4\˱Y m:ZiMi*xњ'6FVjj:ɨioV@͑QHM0TjAA/[WhN2i1.n5ArvQƊ"9[I.Z;J=gNQޙ49aX"muf OovkoUo7SUqM AƩDPuiHzWS8<90Z֊M.B,)?c={GS_).` !b A00Φ:rSd Dt"|^Q[Z1/_3AA2&UtAjƲdC#}NNS Bo Y,ٌLdt#ī/f kJOoߪ>88Uv/, Cires eyA,?.SVK^ă`>u?G7@Oϻcv/f?E漼$޳<)խO0Lۚ>*h,6/ێEC͠YB2 qB`(e-@VRSh_33.I#8c6fStZ`_e4b,kM7\JS牳EV X{e>x`-IvSUDaXQ 曬![zYrI'gM+w[+]Uu[𧅧j C>+EtʖKTº@}A$e}n: WK87Z3oT%rIBa=EE-ɉnQt:<Ȯy%qQYq*: 0#*tY2. .7إ_ZSg.^twŽ+ãn|Uq"+~* e}-al>|S%JkQk:$}S#1b7FHHU,iǏ4`ʭhߴBqI>d-cG}T$GG}IZ4Tk#WoSq5a&9]r+S}h~45gVDXSK=w<jrd݁O[Ft_Xמ :k2O0-M-ٵM1ZXOq,}:nVx\_*,*( 0&4[i^֬mW̋Q+{cd# 5w晈؟ )nm?~&Aw&M,!(SI}M#ci 9 Z։ΧNfR(+&Od~̈́ߟakqVIoېy«,  AiW9Ԛmpڈ fg l^fKYl=e-8bn}5yTv)%*G< $) $phڳӖF]1D9 {?m*UWba֎?˺wYʋ,O[8pm?'qSSIXkǣ*?ixYTamX $*2UQ9m:%fl0U۰dsC|v{'7[:^-:+?÷9VQXTZϵinQIMbk )B;>^Jt9PP׹Lfq[oXwzeŽZٲ]D6J\7:X,]Id#/+K)ɜX8' MaRXlLN 8l>) *i\[Qi%zW:G豪3Gs/?.n,>9i;cuFs5셄qrQ]2@y(c3Xx,"Z@CG>}M{%2ڏ%>Խ$rMl'<\TߟeYz徖UNY:mhu\jœBK×Oy0Qevj#ڂ\b_7GE[[v=0ݛ0=0ݛEvoovOΏ5;\`Ƿ'G~|kl>xb\vvOޏ | {ۛ۫QrL2xkFc''Y'VSuݤ#[%5nٻQZкð7nm{&xx%(g"Hg5ɦ$>( $LK; ~Pp7)#˟""!`"8fys<RD?z[&hy3o 3AgGgBO%O̿(8|r0Sr`3@r<h"| T ukui-control-center/plugins/messages-task/about/res/manufacturers/QDI.jpg0000644000175000017500000001456613543125214025554 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    !1 AQq2$a"B#4D%R3sTdt!1AQaq$"2TB4%DdE&Rb3t5U6V ?F93qi` 1oEs+F`peb(2"\}c M=;C.bŖ݌l4P{0#bi?oٌŋjmѿ#xb(ٌV"Qфe,E;́,14zw\1b,71.i`G~߳9jrVZuR7MQT搎~rk2w}l]LDz۱`cڤ x9*ytF͞maӔZ$P\;Sl!AbKkxCDrNTRIq)3H%^W3Ha=w*pL"fO:c%ՕEO/"J3J1Q?qڧF?NVYt3~slA&x897iʹ]5מXl5S,ಸO8px`np[hE>ya2S!NW74 y|b N&RL䴳dm2T/1ÖFvUFQRg`@Bq ^Z3dJxP%AÉF C\>%Zbo-IEʞ&zmeY٬q. 5d\W,h2Jl`|?X\Z)O9cЦQ*/o-H91Xas)oMn^Q+UNYNM6L͖źes8mx"]2Mɜ>Eed|HF9)|jW≛['ʬcM_𥷽go:ekK.fɺk[vK()jw8$L?(>>1-4gy*T9}Jd2IbQޕr_dS+tTH_aT39?4g$%#4cv"i Uʜr$E;p9p (hs+H ɮtU%UouG F+߫s[ȉ u@譗|`5oEXϳ/貛v[O"T## ޝ4k5eWq/zVTѥ)*ᙃn"nI+Gdk"nF@pӂjbIMP G*n>2E"dT;@iJ_-I:`PT$1pUT cAx6Hs3>'r\˯Z?#[m`-<0n@nPw%)ugu!SA/9}W{@mc J>-x `A\oA}g3^]|QTZFU}]Tf1) g,j-.y"JU@rG+_{H R0Lb"!KQʝ@39(FJO8wQ:m# .Igixۍ&PieWMYt(Qb$#8@Tb7,~a_8%gk ( ,-8!#Io >l5Rog)g>.#/p鳨#FιO qSI'*?C% {Tw4Ym0H=t Rɧ̤8%F2bO{XI?GYRXr)LV+bؾ8#!Ȥ72(N*҅R܈m!N(Kf#HL0<]D{XrIzTɬK0,#8^9և sQ8Τ snьCSYqo j~!P=PVRSQxQgUq}y9*]C*PK%^ahf(jyoV=EOy.O4|G>3dG8+{wxvrǻvc (iIEvGy5+dpr?LOb: }fVbXqvցU4kȇ5JIqsp# 찘wKK-eBK֞8QȇhK@vdMQ?n:I,-t}s4@?F(S5KM )'BZRA(iX3U'T![CՊEY֚tIf[4kMjM9!Sf\a J̕X< *U:*PPJ RX^j GH!0߃/Jk%Q]EUzQ4D* T.2hёQV#iTB*`<pje. -?ӭÌ3 XZwUkO}qo_j-i|dw[[R9Z! m)\ pEJX؎\Y.Adș"J68hl*k;7(%đpjixBWw8׌vܞKAv#e)s~,4KSt(]I/$^j٦6ݨ{8!\Q. [H8@Nt(O2~_ s2gMPבK7(ܥ<629ftd.7 :s`ʨ}f!<^G1l,;K!)E dN Yf _&CvQI]GoPS#ȓwn6;JQ8Dպ~iKZԙxCi/L=vÄѠ+9Q ~|m+u+3"ﱝyL%y.h"A ׍iQ.1H"+xi`c(T|JU gjd\񎬪7aUDMcvW ?o'>'~sd;pmN };ݏlZz7Xo E1\Q}XX7z0exyy%&x;}sON,@`qe 7c=;ؚOc1bv7@o7c"x82oa~N`K. M>v1&1 X @n6 zw=4b7ukui-control-center/plugins/messages-task/about/res/manufacturers/LITTLE TIGER.jpg0000644000175000017500000000744413543125214026764 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1!Qq$ A4%a2BrDE3cdt5&6V"RSTU71a!AQq$B4T5"bt6 ?LyN1&4&9{9ʂ gNDbBLWE>Qք>F%Ew':CE ya0}vyjW _{lИ% wZxf Xd-FYw{~T^o\Vo>x6jeSӾkZ覣zs:c?UFvGYGJIŎQ*hm'?"LeMLGu58.,MTa:&T֪W2wl]攺9:XK5}A sO`rVTiʤ9%Z58 pG+SU4NȘ4L~]<0@nÚfLQ+Ia V&= 80]Ke_0]l`aûw>=\ WcjyE2vQ@5;5q7i>p+e 櫤#ozgW35TSOʺkm֞kN^'W<P '#wqpu8p^5[XD˹=qmgRyd@ % K]DT+Q7xam&_fuyfWWRVUekUM-NiuygydnVe*Μs+eUF% W`FTKT5D{%l }-:((W!/s*#v`BѨs~K׊]%%--#r[jb:UGGCWd֪ʳ|n9o,/}jdWClU*eT #&iTY5/dt$~C\E}%;ś!^*<ۊ($7ƺ$T 'ti*`/ +Y.mkfEܭR^ faa oPS;O(\GֵFp"jŷR'-vkmYz ]&; =qA&P&G֍: q˹.# ou~ACnO R^oC+fm+l&^<Ea@QaOUPcKzun^Z[绒BBD䗕Z=pB~zc 3-{md˶Wv ӳ*΋q@z5`Gk'GꢋrVX2:e֙7Wvcy[2,.ZS'/7T ,3(mcEuCuh|e.ey\)է;ig~zfk fJ5XOFZrSҖvr62$ft0H> (Va'71M~L&ծj;W]O45m(v?OjXu&aKZuc,}Nj'0Ax!K&J] VP=*Tj?γQ[QV3ZͅYʆc]2yd5r(aYb  |$+4!7.icߧSò0@~z[2+nW*tUef]lCN1y'MqǿM6 -ud+(=V޴cXyRj 64I@<`?KPP %K]ݗ{~n`dbK)7ț+P׎'FGn;a44tV,1>3mЫ/8R- ml 2 "Q#!D4€ eszF\n4Ԡin-Qhv# ѣ偍XDt쬱V>% MIo3WiG`C91Q76N0}`ZHodXd hO:v[/s&5:B1ďd6&hS I$X11(KnD/aAǔ"U-r0@ A^}^_ |L#8aǚ!Cc bLG'`$w!#,{eAPyqaKhD <x"WWi_ukui-control-center/plugins/messages-task/about/res/manufacturers/ELSA.jpg0000644000175000017500000001071013543125214025646 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1!AQ$Wq4UaB#DT8Xd%5uf(bCStev'7  ATҔ5U!1qB$4%Q2DtEad6& ?!g48"1sCg1cP3,f 1c?,hfk+{_r,x᳃ 9r |9`N=7dw&BthCc$TI5qm.5)%%eMx=OYri2mk<{0b䤻LI X%."A j!i 4Zf\ޅMx5Qa,VnAZnsMهE96vCgxeb{@m 556^3IB&<)p)cݯ7 lsm0' {85}(Mm$څMx4O9Pm.6^sRmB&<S{P 6^sR[лIT$wm 5UEy ܷIwS'E}˟CZKWcTt`Jw2ۊr!6ݠNr +I : NR/jrs=5Q&ܘ|kdop ⛈ͭ `YTzj"Š*_1mfpMcܓQA Mc ]}[bz2Kr/cLGm,NF9TXyw$<~BmTõ5crocLG і7ZX#;{Wzj?h!br6jkN՞XjkN՞XjklCNE1.da9Sҥ*o?1YXD@b:n8A?v+hXx7 (ٻ j)B+`,OrAedI>L5qT9nFlc XZ\aw&JbG> ndX nnMnݛF(e\ gI {c}3eg Hpp`]ÎTBQdou]V~w>1l =F,p !ѹ:8UĨ'j W @.?f8vK߄( U2ϊ aѸxM&I21Sz|`g7ώ#;s 7-b,oSmOrÆYnT-qF  PTl]W|<2TӉw9n/4`Hs.1||hD=f`9IMW~{  E!Xt`KW^牔y +?u"V'qI*DKgT:Ƶ@z` j6)Mܩuk/3㗇lGcT+njz%0>pèBjT,ZAr2(B!6FX>9:v((SyэJ/0 [ZI4nqK w$bŃ1Be;L4qTU֙saw\kehNL>꓂ EYR9Q/׭e+^(-tO>4XubMVA;_#9_G h2Z$ᔆ!!蓈/Oy#`^rV0%b!"yZU.'`e?(0bLw`ف5"U9{hXx6rGvK؀º n1r`nmFwX*ꀡ9P&_'Y#: H^bFcxԇ4K["$ېGdFH71bZT!7.+@BetXj JK̆-@[`'Gi_:bUut >{$>E}7C oC%G0GWzG0}g:%jJAo=)µ$_Ї)4˞9{8蛈/"=RzIqᆂձO/S'ܚ6"q @2vPprNܤbw$Ϗ`I 2#kDL6GwTف8K!6((W+#f5ة[Xg. ܊6PKPC 3y6kV:¸-@n"\UL9H1##HWt`f06qh/5Ʊ'7ݰފ/pYd^fKJV8"tmȬM2UoZa@oԉȩZF5~r'E1v>]ʍv  rz'E VOemw7am|`CmrQDӃEVO'%N$w:O\Z)  ="TDGB ]_qds{U5~?€V& 3r;^(b`Q3q^m ,?E)n܎A EX~jh"QV6bB߼w~wV&+`1EqT(MZ*C8sp`4hTrb2]_\z8E+A]?v:%݋=Y/8Dz AdobedF]    !1Q AaqB9S$hY"4xRbr#3cD&WH)  !1A$Qaq"24TғDBRr#3b5ႢSct%& ?>IDqL;dsXM??8vh'+K7yq#nw~j g[xǯn|'z|}с13FSuμAe N䆢Ȋ3 TUKքݶ^@ۆVe Y5YHD3ޖ)x#*eZ@l$|xUs.ʶ:}Q|ؖPt\`C`ټO@>nGڑzT˭HCG@s6X&RX;-.!iN)ܧ/$YɤV)KV@ YVn`-ۑ5*R5-D@uD"f}hZ||غ:v_=%p6I'c:co`&f$ p lbJ(ѧwd>Gݽ;IpT]%AvoGTeB%)A[ZnLm(d;n[JVىm(]ЭUDyE)U.a路'c:co`'|VLO϶0ӡ{ ,81OI ꡶Ư ZZIGKlrPKoKՃm{F meN82đ,=(yGEO=Qjg7d"I8DA܈hl2Mrd:+v!inu B\.yb SѤU7NR jzEʉ^HFndDag[:5ʧYnmBKfrv'lrP2" P- hEhE~SIVxl&l>II"rL]"/PGSR8:v1]s.:i4?PZKwh~O:YQ5׏6o'g+;(gYoS#HuGhЖZJ Q& Գ+aUV6^3p]6rmejB5'pum[3k LRCˉbZ)WM}? 3!&v͚(-rcR4g5bȉ(7rΗ\LN*hXCܘ ՚1ȿt* *M*jZ5ʦrfLܐ b3Yc V\j -Z+j̍+re9,ijRtI.K- Klj#O4pG/2C!QEԠAU,WCx&VD- ڹJesaK9,GDȺN JYWsIv4Z6)c^ZbXa;o"(@SNNs|7=P[Miu@%(t N=Gj\&'jl!E@bzeSTRgvԫSBn5xڨR?&36#6@zaĞns/޷@bGKԃU'cnm:1/lGٓ iFT0_ԊSrWmUv Wl|XS%s0db3PZ>A̠l$PQ-}h͎& @?}wwI$pyU\dXL*V aV䝵uJCbؖIpBC%*zy\)-fm͚CnM~Q54&%YͻY',LAKo8)o-2+~5_Yy5cX*ow-T$sTvJ~ʐ  '4SXAk*!RWV}5$3!,[iyv;Hi(#j "j_q|J>_[K*V6 sLzvطjCc*Rp#ǿU+M_7nÊ1*Bժ;YIJUܾrlaFR,0PA=ܤj-g|UlKFDHbUSQ3Y)fIt&ȶV4Ƹ9Rm"Y6ʫI[r,LPݤ*⎤mNTӑaO[FY,r8ll+)'6%2e$.46Fz=fј;EbIߩ뤌BU@')H< cּ+6!2=sRtFP\HɖlI32L/5$[ف?#Aq>ohѽh#1@;Md;fW+.X}MֈyLBcہϳ辅v+.҂^* WfKҭ[Y1P;Cá?=iO<"aT%Xf~jRp臛 #enp@;] kAjGNw<TvVevGC~jTd*o633D @@Np+-)=R+ZMOg>EHj6۬mG1eǝ0xtqG(Eу%K x܈ijMjLkxپE+7jI9וYg)|,9J=jx~'U|zծRu7Ix5ej6Zv7Rյĉ"o)⅛y4߮ioTg3h iIFFQM[-gl8ha 9L ;Vo6-Wj$Xvme"c23n˃N#њs0ss3hqmf/w'Cz~||X|-{@9ppuotQ%vRPy5xj_܏Xz(KxxL>hu#1aOMĕ 䚚dD 4o|2 -zҬ}nқI <Nrÿ=δ~bv'1˻QN7!n_;,[F sm`$mbDGv,<%tyibJm[+ij+ڱOVjiv)uT_PP RS3?T.脸ЅӲ)(Nq4שׂbo+şWV}VK`miv~_}seXN}e9b_8}GG+<%X+ؓo?O^~W {)a pou~>k}`=_wp{e 5؊oW1!:?SW ?8p{dݟG/;jWh=O1A?j}Gd 2^~ق:W؋0> $&'TFȭFȚ[NJMdv[_^hS ,5bcH򌕪ZJd/aƞfp|4ohukui-control-center/plugins/messages-task/about/res/manufacturers/HYNIX.jpg0000644000175000017500000001411013543125214026017 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1!q AQ2"B#$w9aRu&v8H  !1A"aQq2B$4 btu#C789RSsd5Uev ?xx'as#7u7y?)YDz'Fw3|r1ީ'8& )co'(*Fރ 1;ʳ7 ͮfFT'$)&8==y["tii|r[ JoU2Mi17q $"Kmk.# +_nPVN՚k8CAEv%T!j"f)PRH Dv\T}AP=)CcP#Q$.p<©o{6ߚ"2L&텪蕬R8 8P C17eo-]^ ZH 8O|1hKӦ] j/pF:ӞYK Ow8ϡMN5Z)MTI{TJLܟ:ck/?.fdQ)f]g(ΰ.# *D  Q0ٻjq9iն=Nޔg Rf}LrxJg~t&om8GU%x)eTSHltQ@S2TE1L)~Syt(vM1J.1%KI L$~kT;t-lӨ**BfIr# d%Mn5y6֯s2*V`g˟jnRbRnlpN&-!36`8Ӯ]BiЭ|ٕN lj22P滷؍ܪ]p j;HRPW0352Y{!L H/q1U9bG09krV$2-1~+zyxlZ0:[> %}OLH9IP  VRHuSmRKKŤ6.r]6i!W6ĥEkg.ݹeVߗw-Eҙ*M#́#V( vҊ$@Dd=W#67eҿPS2D3aa(WfA~-J{ZEl9_JyK#/LY>g1y)l=KnQBVtVk݁/E%7$) r)!,Y;˼n֠(2. JH3S~-~ݼ 4+KU3.Kii!_\LĠMXa==VO1Lj#$1~Q9?b[y}7K//ǻ|=xy+_˨S_w*;TqE{-BOe&e௤=%5;{욳_޺>=TYǥyxp{Oܟz^^Lqi]➢K6ghg\+%CjZL](Z,)IX$) |0wV]/ CT$p塢~K{Y'AUiu3.]if eVNW&ڙf&%5FMF:4j*z#G7PYVEY͙rnawhp١h ⒤0R#8-qgv#k-zҨH^jOS#ժKIts7ʚìqJzV2S\@t R^* 56@"EJW Yb֌Jq'3 HTkwd\{nY5ܸԮb$J@J̥NY'=2[ aoyຐ媂;R3/vjL)DLFtHUڹ.+oEQ^\) $eK2S#۽f;YAٶ莜񽮥4-S䖡JH7I6$SJqc\܂~*'M+߲kZQV -P%qaլnNdxRn16Y@L0#+[mH-JK򦹔R›hDD|8tjnk7[^`ޙ@lHd6yRPQ!R&@u5?kc{,#:d, ؉L؂zTPFAtivI`}ϣ$'Qid\T{M'YBGLte~#|ET]Օ <*+ BPv7>)RJS9J_h|b5Ld6 Bq<ڶ5Zi{ _+F։i$JDʔ5(F<4}*pb\g48LO݋߾ݰ;%pTA@m^46v3.QWa^G+7S֟3ػǽo7=teF=~h:r}l> xO1rOoDγr?͓&^9/(-h܌Ƭ5U*DxSӤZ:WD&D+km%bFg$t:w"=Jt BT,`'2g/;α6u[&+[J](u?D'wj;$D7nd&u2\μ(RШJvtb}>UӷF_QI)L9q_;2)hZSR+LFb+p:I*s3]rfD類%n)[@3:xUJ:9\U4,7H:uC \f&Ækuv vsKluU2_MrGd~yڜ<C2πܽճ?~RUx]$=漱xebxnv_q:-g#:}Ӑs C#s{dZ®cQaCR9ennò\{niqQm!JRuiP O9H|yjlmjT*H]iY\ P"7mm3JRD9ox~޻yjiJR 7GI'*=mTL/zhp%OK D"[v-ѹRSm*[IrIP3tZ*(z{) P @1#v n*tmڒ1P5P16o-م5x!+sKOOʙ39c}ڍULSmF =B2j@tJ%:-ѽMt7R¦> qxc>S=oU/ifltp<Z`|YFHD%q~J] @00:}g=wSŮo/᧎YO1||KiN`ur_t0l$g&X&/@?YIRr9DBg e)c,Vg 63 zO]3+7y;: (_^W=rtέUCec D@vϣh[[I$fI$̒cMy^7\N۽Ҟ\OTS-A! %% (7G ׈`G! 8tL(CP|0#炂~?f8/"i0rk#C׆Czx('as#ukui-control-center/plugins/messages-task/about/res/manufacturers/PINE.jpg0000644000175000017500000000752713543125214025671 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 !AQq2B֘) "wHX9Rbr#%Y1!AQ2BRq"ab ?M+<\NA5 A5ENCM|<ԇ]CRǐ`PQr*,NcJPt@{*WYE>OoFevV.M}U T Qu !&jC.cI~0v(t(u Bb1A\=+'2 ZM+q&SM{(MGS_5!DPT$;}:he,qׇD)rLY]1mODbr)|]xZҭ;y!_|P(dw;̘M!ftXBM,f"&9mc2C/D.eJ((̮J`eɯ^.QT1H~<<,y=DD|"#E)TߒN$qjwHeiL[{9MG}=ūon`Q@ۑg 3[#i7:ثr8JEREnH؅^}nbGe = .87/4ڑ7r84\g;{lX&l1PO %3h9`B"/:?H'>18?3ISƦ>i.#~\1![1ɻlɦF&ĹN-28H܌)Rj) |-k޻ULm-džw/;8~6Y}*N چ,S>`lWoKDZ;gaeN9O9>awg޼'bۄXWcCZi+`a!Y$qljS*dVg{֦㔓7g/p?d|p1^:s}R@,hg =G!!96hp=(eNփ)q7@J B+taeowyήxyv[;XS.(DK<3H),HP,e%q!G5OJn[&~Ok4cM*&>)8X"p_(mT(d I:kl/T%P :Wm-'WP/c?$_:Ϝz=q:yo|CT=uƜtYn/l^`_5{/OOʷ"_ߓL@*E==?-Ư_籽?t ۹'ixgO+ im܋4D>X H~wm܋4:ݱN~oX-(۹ /hubT?KKnW8wOfL^68BPkGKȵ.8˴^:v'lԷm.>%--8۹'e?Fc%hhv3:ױ]G?I>[w~88Iv؆Rd;960L0[&9{ڪCiql|rWyTD 4f\NA5 A5ENCM|<ԇ]CRǐ`PQr*,NcJP=\pQ""r@=8ܺB~(}tԿJ9&SM{(MGS_5!DPT$;}:\JK1SҀT.^3(wG_uZ|Nukui-control-center/plugins/messages-task/about/res/manufacturers/TEKRAM.jpg0000644000175000017500000001004013543125214026101 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]     1 !AQq"2B# aRCS$%6v7X1!AQ"Bq2arRV ?]y(U<>`i*])UsɘHf<mo z!w*7o(II@#ҨPqp~$Z=SJ& d`z(j*+||`heës:ʋS-i urrI|YM'!(zJ~޽aֈJN I]ɕYWQayc홹vC8RZV9֙+Mo/w%/z~Mw'?ߜ]Wbqv߅fv/gU\DzrojNA7+ A7F!&m!DpjX_>~ԫ 9v@z+Oљ]-&`d2ЂoѢVn>NCM,qV>32Xȥ[pm;\}qzCeݑZn׵cا!Bˆx⌢,d*dn$sqz%Yv nڇ/GuY=_V-eZᵢv׿vWmѾIJ3pwѹ9R\SkUYc 7VhW:^p T$~JuRXmt_jmx=[iӷcXSiL[RSԤ`}|9X*pm,wnC3*=^[%WW}̦$:*^CKtoCTu[i!Ķ$m$^/Wu̇ -KwWK{Y:UX6/}ew 3:8|_~]f;ZL<˭-ZW^Բsٳ/ٲb{ragV?ո\vƹD'/MK/1dJ?u~\uG\RXwR/uX_wb0>߉77s@a lٻw$oRvSrNVݻ7~ÌԦ>魍h[;+Z \\ Th/PYV]ydͥ{'s[ceF~G2RF߿{y%40>Y?/}t߉sm cˏK6ն}dUޛ|c?n2ZeEVq&^kLkl,ͫ*AmnXuֵ.l{*IN/ɧxxQHcke`36-RgC3wec6Y]֏8]oaabpӛ!l>ogF=b[fEw4m˫}ѵ2JTI%)$IJI$RI$I%)$IOTʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ Photoshop 3.08BIM%8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIM=F]QH QIq]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM %]FL JFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IO1 G/]#auGj[-pp%cߟn=sObO,qV>32Xȥ[pm;\}qzCeݑZn׵cا!Bˆx⌢,d*dn$sqz%Yv nڇ/GuY=_V-eZᵢv׿vWmѾIJ3pwѹ9R\SkUYc 7VhW:^p T$~JuRXmt_jmx=[iӷcXSiL[RSԤ`}|9X*pm,wnC3*=^[%WW}̦$:*^CKtoCTu[i!Ķ$m$^/Wu̇ -KwWK{Y:UX6/}ew 3:8|_~]f;ZL<˭-ZW^Բsٳ/ٲb{ragV?ո\vƹD'/MK/1dJ?u~\uG\RXwR/uX_wb0>߉77s@a lٻw$oRvSrNVݻ7~ÌԦ>魍h[;+Z \\ Th/PYV]ydͥ{'s[ceF~G2RF߿{y%40>Y?/}t߉sm cˏK6ն}dUޛ|c?n2ZeEVq&^kLkl,ͫ*AmnXuֵ.l{*IN/ɧxxQHcke`36-RgC3wec6Y]֏8]oaabpӛ!l>ogF=b[fEw4m˫}ѵ2JTI%)$IJI$RI$I%)$IOTʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIMhttp://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2012-03-14T14:02:19+08:00 2012-03-14T14:02:19+08:00 2012-03-14T14:02:19+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:208f50bb-6d9b-11e1-b399-988578345a81 image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@F]      u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ޛ1qryb'Z`R SMM2HR\&v m.!5 +JZ㡍 ^emY큭&]HL+R+ViP+c՟kt?q?_gΟjOo[zqս][w힣K)f!-jieeji(r(C;\Cy76EH.ze&iP~H#H# M(/j O~b..T:ӤӮ#OyTjzޝ{Czul}%}]76/x߽Ux(w.lw Q,%\TY,nZH*xfDetRR(hz t)^׺u{{^׺뿺S_7cc6m~ǐfǘ[P@,mUFHH*TЎzٞ;lW77IhPZi9"]7ee`A n{VPhhH #=e66 yUXCQZ0 A0Ak7O۟tvwivOnTxH5mN^L)i MH${ȎTg]٭w G} Lr,8sX}Gs=ߞsعYf&- D (/"P@j'⿑s\x]{6Sv l+68٪d-S϶TI$>歷qݬw DsFV* Ǒ>K|7nZ>^l;g+E4dQЊ*~D4&[7_OON}^돬6xmTWmr9g|8mUP و`tPXm $?:6v7<^3{ӭdޒ.CrM8'A嫟WҸXeӏT*1}˲6vfv?wm|WXowش3dV|^xr4L:mAkKztf>`2;fm~ܞ/x}wEff/e4e\}Ue -:Ǥǽ&q@äl{ >2lѿ7/7wf !.2mc6K5ڒzVUb=Jgi530d{K|yE%>N-WJi%_qViymoմ7U |}z{~VUovo/ ]| ۻ+t,t˃Z]ŷVh&d*4t@A,:-A$cғlJ䧞=IS'ǵil=6FO^3{uQN$`;7] K3c *(Jci:LuO= ߝѲl9zQ`[sTT9ǝhb xBeYMow P3׺ sxo}G}3mnڌVu{ֻ5MEV0-n9!s\1s&ź‘+*悟{Cۿh#y~bZe6m#,n* kzNޓ`;7n_f8 -un.M-]%%SRF$ob.=— Do#F 5:'r(-[.a)2"ʉ* VeԼ Ҡձ=Fk?1WovJuh \r/[–qأoU[wS޻?.~ztKM?A|oبjctU:__':ޟ%r(7Kh#;+enIv|YܾrY9_2x-#HP;ګnF*8bL?ݗ-:gо;j_0QXlAxJjEGyؒI:SgiuX_"io흺+39mq{rbs5\oFE>Fd*ҞYHtw7TOT:vnO𜾊;^v/C=[uh캽ל`my%EI5Nvhҡ]!::_Dco}Cӽ=Yv7O ؝K'S:qqa:IIJ/k|U*o[1o/%ƒv7 ꬇enw|I =ef?=6׭bY+bZyfT~ j:ЩQU>]Y~?J7owo}`~>6n Smjl7pf)X)]GħUuԶϚ~P|[K؛w&#pcNOJ1Cn)2*嚧Pp8 uj{|T_ ,nݻwOw`hk[/ J*Zwe&X{^W'O#;ِ]7_y&}uO5g4F}aWP#=wv-7T e!xug {Sg!{l=ܻd6o☆z|3PM sы`q|Yjw#b3rn~;67IgrIx>67YCB/lVRmNݷ XaT, HxTw}>{Ϟ㝴Ykg-]zt/=P,:c7DoM[]Y͵2Q_QUU[G5. QήRGɇy)1*]k*;~6>ȃrVL^JHAƱrIn4滛کcqlN?D[^MwN]߳w\N_XXrx\KzL,*XQqLum?gTOxoQ3g?m\=YE`6Y-×t)ҝd2V>X3{z-ܿ'Ι i8}6{+T,fFUM[I,5, d_W_ui۟^lcB1˾sifnK2CM> Ƕ( Dy)jR*D2h[[^z; ޕGFN'7ٗdUazͥ9 JRIT3VI'ϭ s?5.CQ孠"z1Fg6/]]_C<wObbUTFާ-h;xUtb_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ukui-control-center/plugins/messages-task/about/res/manufacturers/SYMBOL.jpg0000644000175000017500000001100313543125214026123 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]     1 !AQq"2B #$4D3cdt%5֗ 1!AQaBqDE$t%u"2b45 ?>\Ff/ 7LQ57&/V};RS3OvHBjoN&mG`R:"~^߆lQmkrQE1F"ri7foOpjJw&iA\CR^ MmjGZOz-mnX =&(߳DNM1FܚbZIS^IN Jy9JB$?yT4JPdIC'ʺү+dan` xLQaz 6( %͗)Fқq]LrWƎ&)D囵8 &՘r`6ЀL~8H D͗0c&A'؏i)KRD:'-}<)+Yz܈*kT Ïws>;[3ЫGrȹ1[5.Y+2XKCEIK,ye~E =)ClQJ!1Ci7Vv~Mk+ &UG d%ƦαqYm[ .x|th"%غo4vQ)lWTmfdT ]m6QlO5N` 3=E1Jb@OV䃗 Z7 d^mӂb\a:+T? })1i&PvM$Qp 8 WWt@ XB-hx2ԳIwKhB{|#qAKUxEl[E&-DÔ ~fiG `m~Z#6C&+~JH&]V|?EVDh&PTk$[Ѵ9l KJצXQL7?jQiM1]Iƾ>ִII!-ztȌcy)(=iw<0*t@R 7E4}oWJQ G9)z:Js7?%_թq:5tqWrr.cv|O㲊qKc2_0)7/΂7EIU| 6o?5ʆ65yH4HfD$"trlCHdotpse R*j@C: :~oԎsg┿Ү,ǩ ӧ [9#|fׄ GP\&(LllGDE9^@kT:ks|TjDA~tgⴿ'Ί.)aS}w9%a*@"M_X*TѮWӾ^_.${Za1F6ZQϕ tIP[J<XkI22%eP]N;XW3ȵ\Bh_?XJ'JNJ9YaMqSVߺJʵRVY4FN\ȬLl(S1.eQ\gZ"KzA)5<7 p e;׳tu~ԚM}<3&'wSC>+g*>ud,1\侩ᮭ띱j_8T7QK՜T6zEznթI&e TQWn 3@ÇTxpizχ1 7tNq͕p6>H4ˎ.Qe4R/i>6 "u *R&{j s804ŧ!Vx jSO +Mc%vXcW*&rRڏw"7"@[s[/QR 5v'֛Zzv.XLл; RtҜHeJBVzd$眆U]Vj_N<#;ŭX0q0 gXæVK:s^m 8y^[@&FDj}R|m;T5L2_̬M] gֽN suIiVRӣUKy -T"""}!--}4BfY\6gtl<ȈI C›r1$t` @;Y'U9(tLJ ٘w M*W $rӡCוXt[Q{ATcsHr4E2>t]g4ZtOR"VBRKXYشUkѝL3Ytw:"ùxe%'IRVsNIx!+@k8j ܵ,LGa`m5EmGPUhɦ(}LQI>bѩ)ܙoArzw Hrz`57 #Ӱ{ݩj?/oE(`(oj ~94Sri7i'LSyz5%;4 h.TNT/Lr`6Ѐzv`{#R'hVѶ,AT^o٢'&qjnM1F^$)w/Frfʑߴ5!ʅޜ.LNvuD ؿukui-control-center/plugins/messages-task/about/res/manufacturers/SAMSUNG.jpg0000644000175000017500000001115213543125214026240 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 !q2AQaB$ "3#4%5RcDd6H !1AQaq2"BR3$4%b#Sd5U ?>LWy3@F=rtę4 gO%< z܉\08mɀByr`@Hd,Qw(LrQQbLBuf<8'LI?0@&eT#r$ys"C@❷&(I 9;Q"{}Eܢ2G?DDo 3 'LI@}T1@)DzRkש%4˥RIIqB ^D7_$]'U6-n=Hfں.-ʋm4 +D}.urm@"IRGm i']}j_tjbR6Nm7i>q6uy>(|]4Bߵr&5j3ب49ĜG:629ny=MĖTCjW5QHWF+6>)ٹm.-vTrqY3߭Hԋg,IZ0|=u,a Wu ɹlܲ2RI5Za@}O 0;Rpm'U*^)2?y֝{}S[&Q9@(41 fp s EM+8d>!:\ekVkTLlTj[EZ奣9s]',Q!L9RO.VIf:fmW_m>BnK#-/\<\bb[Z|ax6SRm}0_&WTƕܫ@Jo  nD1X/"yȟڋd66Z֑ uWNT'2GݐGZ̋k^W1.4qWu3JGtVڕDiz(BGIYGuIM/&X9Mz.q銬$QwV\[* N`EjWkxӍuZa SJ&G6lYhPH8C7C8rZxӵȘIXl%ؚ""pڒSs>KQ&rG4!03zr'Az]OsjU\B8ZVBJv0"/U &TD9LSRA^4ܜ>kddY"|yeIW30vmro8X@tzS~UMV֬SAH)4e䉎W~QUMxAvfNJU|FpÚh,T  ->hJkm䇎nzڦ|3ӑq Lk nDÄ5##%j0l\ɡ*Kѻ: [`h& 7eUqt@p3ƞ7u)=B"-Y(5+1b3C9C. Zl2M ]Z]u3@@ U\ى" k;Pֵu -Omʝ8]} 1}AFhpRQ(d q'چsM>YNCá1h59ǍҬ67v+][b2ie忄|;04 '((}d73Y}HNJ=DlfZ"H".8*졳T ſPJZ:Q~[2E2z7VWXe+Dt[:]eG}?$&_] ^BI~S0_Jϊ;۹$%fdԩ}8ޫ-_f2dhAjmWSRd&?O+RjؤsmB꽊,/8$m>r;4c&s &"00oOh@@ i鑑Pƣnek:V7g"dD<Rc㺓GT:~_.IhK KmDeoŏkJV-lTtZy ⱺ2o'ƹjZ8-f[s\|qXuUN[27ːs+jʉBrd'(V"^Nݍ47ҡ4nUth.mVьi)̳}#01h9O4* 5If4ȣ?Ӝw(|&F/)*ŹJK8iEfl9Ø*>D>35"0ހ֔BS OmשJ^lJ eqSj;b;\Cj2ZVnf=Vq= Fue6Iaj#"ώ1L׫q3o<>rBypM`Y!Ȇ);nLP#ːsvDv!bEe&~gN1:bL AdobedF]    1 !qAQ2BY $a4%5I1A!QBqa"2 ?&ɏ&<" &#Fh~%:y t&_h8D" l@Aٵ"X/.Wxؾ [&p2cIDIAѢ$ǧ0ߨqH, =<+[vmp 0 ˀudE=>/VɄw 1<c+`b=Pth17"\C 7BedO/.]5^ʭ٦YfR)R.reNIw';t;ܔ%ecƭW=lJR=Uj]| c )kI4IRJSʨ(il׍SJu, `$;;8ĚULQE*UXjuj25+5ʬ0i4biDgS( TckPQ&fi@yQR^؉+S6S[X-%h6eK4bVqP'}IL$|IaM0G_5ruҙ6$eVjBnAeG.td9M'(-?82h f]OыjMNyJ^{0J.Tvy(;mZ#SQ`e[Iœ*Ŝ &TKHT e-ֆj^ӨnMhuaYJ3%IGzc=ճDƩP9zRJs{#NzVˮ6&N.eH;-Fz픙w$Z]R!Dl&1oOvb.R a=TB4 z[eQ-fW$I TI#FydbˌW{\WetگR$w,! 4Sg7Zܫ}ɢvܶɨ]Y(v^pɾRim(B9RMڊh:ZDW n綆o_%a-Ts^-~*k@URBtM[ww0\6Vy[޾)UL?:wY5?"9;Q>Sj-?tӟ*^F{"o,S &g9-Pg qАHߊ*OyߐEn{Wg (᧽<"L3*zۦo{F~Pz}=oާAn{WgO>m/e3/y?CPe+?'S>WTo ?j𼿇J~(e(T}|9/C)C%UK?'yG<ڧ%x@<xJ0FC4d>y1@byB$DŽV$zcoDO$nȞ^\x-;6DK: "T[d;^L}P1h1:4DF.!2ADz'!`Kbͮyp삼j0しD'"LxEl"LG&=<цDKtAfLqELjAX؀kD^\; ")E|ukui-control-center/plugins/messages-task/about/res/manufacturers/MACY.jpg0000644000175000017500000001166713543125214025667 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1!Aq QB$"24aR#c&!1AQaq"B$4D%2TR#d ?&QZ⧓?t!Ls g$"&c )g"\çd)GDpmrL= 2L5H]Q$"%<pxBOo&(XO&~B$dIE"LǺDR$ϧ? DNR2O.{Bdj.IEJyr).߄MS{[&Q LЅ1$IȓdDt.IOd~se!2\(0 !uF\(  ]*L9`CF?M/ɌrͳUGQ cNhѠiye4>a̿u:|mC+}8xDaoB<88Uݨ^iI(70˸LT.L#k CtN(PBD$zcIkKu/.FR#lތpb(؜5OiV>ѭy9=\DPїf fP,LTNa$GMǪ{Ţ.fZ{Q=k[SiΥ/(*tާ+xxm!]zזqIĪpI$+.܈#qQ?45+ugeUL <$9:]oytgn=Jቕ$w1O+]Zں5q8-;d1Θv yAhBPiJ(( @B=i`Yy%>-*v#F$F7J|-j$P_7[)+ߕ?yp~.};6&?vfr1ᶌcB1چa,;,y!t.ked)a⁵sZTT-J:Ka;Myx̻3h>^6w`!Xv{ B-`2>=Sy_Եzϧ#W6>S{acAr"6#!0r76I'&ܱg'cә-pt#e_f7h7P-CEzPۼ;""(DTS]QryPlԘe. #$^[/ O i@Kth[Ɛƞyhfv@}d&%[>a.9& B< +q %iD*( \jwuY<v8`N t/B a4^}Y0Z}侚UvH5ϴaUgp΋?t[oG\^G\`+C:f\W4:A {yf}nO3l[Ո_y #y\Pꂫ6^Tg)a"LD$R${tEO&}=2V7*Ds*uxl 嵲MT֖,H v@rO[ f//;gKdg&=a֪lHuDb?v8gDanv،A6&AT?搰ؤj1ĞLG ť2M1-Ԁw늰hF1Vj5F\(a|>s&\<#(>]:*L9`< cH=&3]H>);!&DpmrEO.{Bdj.IEJyr).߄MS{[&Q LЅ1$IȓdDt.IOd~se!2\(0 !uF\(  ]/ukui-control-center/plugins/messages-task/about/res/manufacturers/NVIDIA.jpg0000644000175000017500000001150613543125214026100 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   !1 Q$aqB#4D A"3S%2RrCdt5u&csTEef(!1AQaq"2$4DTd5r3tE ??rGKQYގR*֍3&)j #-qYXl4jtˡeQ XJ18eg8 rT=kZ}管jb(D!EubVĜ?{ܸa|Ʈiw-Bܥ5Z;øKo[6ӆ1}șe"kD*8x"dϬ'݉h?z@i#=D2d>`:ZwQb=aW{z+i2O:B iPM"6VfJbD DBGHuh=Y}A<>KKv n VxA_%$T&q$&R#X.rMP E1 bS]`3t(TڲceB<ذQxޒ9cKl2 IUu$Ո0°L؍O;tw'<ug^UGMo|}EG#;W֟G~i19 8 \le{SؔkDOTi=:MDy5w >T :M2sefXа4" طi6{zW}8dD/NJ:o(գ2+6_! h'cin2cHݣY$I$#*"Xp| J8$Ó\Nh貣DƥzbTRh˞AGjdL·@˙N+GǗsRyx8[FU o%?5(ViJzk/*IyXҞƂ]w$n9y?'j 8I_֣y+o'67;'#QnjsS{Ӛ+ؤ7yr}2G{aIY+^I!.”՞ۙs3NE!a(HtI~,4e1lC*ۨVti:ޯoRrI)헾\paaw=&_Օx8$N3,*o"FhG$p.ݢUtM)NpVZBǾ5&59)Y?0crJѱBF;Fw``FJo|i/!.06Oo[Yq1rqiGvGM4y>ӂ(xWo1:GTj^m*o`6KLOJD嶘n3w>%< ʽOa^9o+c'2p/wҷvTdtS+5!=2d9 1(4\yg3>RV;Ez]EJTUrDPzTRRxQsnkӄh%s=.cJsh[|gyY/ U6[uuxģ%˯&F=}/պԙRR7 6k% x@$P &sm8-HR5F洅v6j$N/sJ18% 6nEDlTUmuaf͝+˂A:Op&/Et)9O*S M$ryG&Խ0U"8G8t=!(>4Ss3%Crd]jaAuo-Usu^SOq|tqp6m7b|b2^?|F.[_ n-55YVNYs|q/p#}[/쮑ochH_VՕ'~,b"=y0%I`r Wg~nIj*DIAss.LMNPytcozw¢XpN1SBp:@76A"7r]ٷ^}G)hԪM)TbnoVZU|儢AMm(L.v7 ;}.PJ yJn.V5^Vt!f=.L@gyüVTZtMT_Q%t+aέ VeLɝn2_RJ9;ivZ(zjN 8QRjp۞\򐢁5w#@%jsso&[ۿ8U3^:~ qh44H{Ki7xaX[kpj ڗnħ%а1:d`l3}mNBf曓Ƭ؛X˒!yn1+,*HGkC~!(FYzY9ys݋WHgRo M*lC p*h<&p2j@==/rP7ȼ+}v*{RtjñȨ~E&qC<c\w@f VT':t9E"C>D,Ss[.#ʸ$i]78JhX0;A|>KKv n VxAnkM2 ܍:WN2C!\&/X{ 04̗$eD=emRjsN&%Js5eȍ!9~'5R2?y/ċ~IozI3ZP:GTŒ]` RZ/RR @]`s`@GI08"0W_:2oiIY*LxWEJ#w7` )0{V}`%< kZb} rx=*>c2q|u_7>y]Y>mո սb0= c7SŌx/Rw5'"2"lt!i7v2]D6(x><^.aaBStՏ # ysalFvgb{&9FCTŃxؑ>ef髂 GQ\Az)[Q{ 8>W$T B'/:џ淩wt>zYwvi!p{V%ukui-control-center/plugins/messages-task/about/res/manufacturers/KINGSTON.jpg0000644000175000017500000001114713543125214026363 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1 !AQq "2BR#S$4t5ar3TU1!AQa"Bq2#$R4 ?M\Qɿը*B`5D }&6&$~t5#HjE 1`7k,(]f{"}ޟ[5\ZM.G&V5 o֕&jrJ`< <<%A4T]!T3L4Ɖݬ9w=Tz~lpQi7kZ& ZTJ`ѩ)ohOʘ.jJrLOXR9wQP0&vˆjGR'5Uyo˜kEM+{[9 rD|tX9+~Ʀ7GUʁGr ̾o*rĘZH1 1rį_nICbtsh7m1ksb#s [YJ1HK8w&|GSy"kқVOmG;4bEoٙ\mFc#UB v|v ^\8 | kSFzwNMGuggma2"Efc#٦W"9@V4F+QvoS5|(D-rsZSJRRg;m@J"EPM{-zU~#CF?tPpUfZ%CR9CԈG^QmZX*׶*j\@xBEi hyRUTMܹt3;Ȩks%Ÿ^wgwjl-U0x(Js}}J1ŽQm~vq2:K S qqԒG1~J"d#.@4Cmd xkDNsZ2|1V)M +i4$YVP=ɌOn[q TS6>LNwnنw~ڒ/٤9(h@"M$]+VYEa+q\TS9=8\{ia/+Ai?b%Bs*򤼿k'AmL䄟Ӧ sVR(oVi}|5R3"+ S ljX.uΏߏtx};/wܜ?=.+?g|zQ2]dw5bQcY 5jKMJ$N华 P:Sb@?^G}ImwVDjȸ%~}3vmy'To!s̴{6r/ A"dՐRs{wFbbtl{\қHUz:TU٢όI[HP!TOAٶ]GEF0 (=Nx ]uv[.uӷ}1}sR17WW7W#ᖖy  贺aRXhH˖|t2$A*lK8 _Q lN9aLD(p3A/m@r #f] sg uPZ oQ^GwmPc"߶%3:(`fUIͷ9t6cQ%9׎_ijia44NҰkJ2)T 8ʆ. |.]Ɇp̶=p$3oӴ#mƭ_LqjܗJݙ?ފ Je fjQ8t|ƚJ1 HfZ;W7`n3UOU(}+{Nf[]7 w!3U! @>^ d٧N'?YasJɦc=kݏ1ajM,\Y}" $E*B3[doP:l=`OT?}׽7 cU fH+ʇ0"$֬%,&Mv 4hA05Ï $V!TqUdYG9r{<=jU|0:Geu=ƸYKr-[jHwpfҪ}"&2}_bjɧ.l/vb#yϸYFL5+ d5(*8Mt%z Ag-W[?Ǝ/u=p>- u[U⼜9}$arw܍˸3s˟3Ȍw?UpA_pO0!t}×v!4/qJ'iV˔htQ/k]b PKMDFL@tPć9"YX2gn`#1)t:EӽUOO⺦0aZ⥖~|Q0J]l#2ylYtzDkk-%!'p%SI(#Tt!SeD3dGZ+rcJ, 74D)a΅;K * J;DF18"1Zh$qBҮEy tN̝ϒڍׇU >;p&uv `;[6MBh,Lڮ m";:3BcNl6h/d'R{c}e-7k6, 4&sPU7kJLx59%0Mm SMINIk*G.Ԋ*ScDnXQHD?Fj(\MATjѭ*%0M7y'Lxxy5%9&K٬hCR(f NiYaDr@{5#ީ٪࣢/!^'ˊh}I>ˊTvpIKX>\RyL=G ~z|BS~SC,ς9hŧU~ou$ Q0Z4T?UO}bKP%G-"mf?R j4TGU CBړpy*~/WoTFj/ukui-control-center/plugins/messages-task/about/res/manufacturers/TSSTCORP.jpg0000644000175000017500000004217013543125214026410 0ustar fengfengJFIFHHExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:01:05 13:20:46]F&(.pHHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOU_;?㜬T^A:09羹tq(c\a mܟ"SG'r YM<eM/deMy~N=[.,|vܶq>{*67¿vQ\+ 2/mc3uN̬M69 nX}?yY?ns602bj )u=vG卽N+\\Ƶ#Wk V׼r?S^|No{[~y/uDгU[NWzѾu.+ u#tHř^g,i??4g\7ƏEsxɷ qcLZaJ1KH̟"?Pr՟?̳IoSS|G+:wԾ1 ln-ŏ./ Ӷ3gdm8LX8F2'Ե$T ܖaߒMnyG\׼߳t ?)W?jv8N1Q#@ϜUoPϮlʴ{ߕ{Ǩzd&6ԯ'9s8wH]8GҊ7 DbH݇WD5X Ov֮oOQvɏ6+z>ԺUlǶ,րf 镽-{-ecN\De _#?A^˺,nv;coEIu.<X.N#EaKۙQJ5zq䇢)c|Q:G\ԻLp<)ƪ̫@?T}Q-SO;z&z-"YZG_^DbY*30[VګelѬhkGIg6UuMǮia|lվt'(HJ:^[ҩkX3?Uwi)~xV[dn *3VS0zVF9L˰nvkYѤ쑎` Vwæf~CLMos޻{*67¿vQ\+ 2/mc3uN̬M69 nX}?yY?ns602bj )u=vG卽N+\\Ƶ#Wk V׼r?S^|No{[~y/uDгU[NWzѾu.+ u#tHř^g,i??4g\7ƏEsxɷ qcLZaJ1KH̟"?Pr՟?̳IoSS|G+:wԾ1 ln-ŏ./ Ӷ3gdm8LX8F2'Ե$T ܖaߒMnyG\׼߳t ?)W?jv8N1Q#@ϜUoPϮlʴ{ߕ{Ǩzd&6ԯ'9s8wH]8GҊ7 DbH݇WD5X Ov֮oOQvɏ6+z>ԺUlǶ,րf 镽-{-ecN\De _#?A^˺,nv;coEIu.<X.N#EaKۙQJ5zq䇢)c|Q:G\ԻLp<)ƪ̫@?T}Q-SO;z&z-"YZG_^DbY*30[VګelѬhkGIg6UuMǮia|lվt'(HJ:^[ҩkX3?Uwi)~xV[dn *3VS0zVF9L˰nvkYѤ쑎` Vwæf~CLMos޻ 1 93 70 1 72/1 72/1 2 2012-01-05T13:20:46+08:00 2012-01-05T13:20:46+08:00 2012-01-05T13:20:46+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:fbac8e27-375c-11e1-96b9-84cebc0057bb image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثWN*UثWb]v*UثWN*5#BӟQծlҰfQD ۟l)LE2ƿs~Z?MS̏fow9,$iA7Ofoܿ{!|7NQ/⵳C$pÐ&ǖQ 3,,\ߖ{OqTfow^ו<4KuNrU&"ʲ駏#.E~j~^-ms."LDrqe'<T7oOy/fo܏C-?& hs~YSSqTo_CGC~uǟ*Sߦb𛮭N*_+yE,{$/ckg3C(>mԴ7P.m$hgܔ:,a! ȣLH}ťsQΉw4UxR~bO]}?6c~`׵/3k{pyGi4Hb&ĵUE?Y rd* 5$nbi&b)nc׼幦Hﵶ[15\O)G!=ƔݜnʟN*ֵ(QI1'Ê@wF>m.uv5;Fܙβr?#}}iOe?<)j| OZLtߣGّEoG_Y1WWz_3[c^zzm S~g N;?.|iSCìWj?k)Pxeɞ|k:Ⱦ&yf *8[#f> Ca叝GɲbioѿJsQy۲=:\mMZRTn|_,!}moV E ,h<E3&ͻp)S_N*}gVj~IqN?aٸ\}L>~]6M_VId萨v2*1_˖nXlϟKt.Z[c?Fc5O&Kؘo*M"H#D?i_,yGȨhw|-'>kմVS8EiTq,p吔2k94O V0߈P dp?2 'qlbPѿHZŦB,{s#ӏrpNUis>q;N*3--M,m섇hLJ|UvV0\Mf+?=j/Eoo/ؿ=j=O0' \mH4q߷/<مΑWQtD _ROO,P*>)SF9B}S_W2~Ư=Oj$mQkz?w#˕eYQ,Aas-55\%\UQN/UUZqc583a,?,B[,F.)~zԵpk55mKov*N*UثWb]v*UثWN*UثWb]v*UثWukui-control-center/plugins/messages-task/about/res/manufacturers/AUO.jpg0000644000175000017500000001165613543125214025560 0ustar fengfengJFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC  !"$"$CF]" < !1Aa2Qq"7Rt6CTr+!1Aq2Qa ?t(JR(JR(JRB(\HXo~l284uQ+ba{uMv;LT9n{b%)`5:*\-)6XA#ϒI;I=kxC&cً|A=w+fȢ/a$Tq'hۤkǐwu-%:(~5+/v-doUIYZݕ %mAI JGՀ@v]oyKnB^"s 0h5nw7H-ηKf\gFu%_Q^SOyO4m!Frp2jW足.\̹P~GE 2#V<`eݔAţ6= 95}FY]f+UMo6UJ{AR+R4Fx°nQ5C0؞{)3g! %ޮ?5%Z5h }5UO-{<_)J {]w6l~fXn6*N^ެlE )e+[ɶ =c[M&˯kLn3VRA55/D&t&Йv6qC)ܼ"Sx;zHg „Tْf7abbO~A)m=UU`#3_|-`6HIuRMcջFnoim.q:*}(oE_<5;~Wr^jiȮ9[( ؖ{^.-H-%hZOOj?iH_NT~QSe#8,l0aO }%)QT;($WLz*yY<;n}Mk:/ }u֓}8t*TĠi9wU:v`a!6M! JGڲR (JR(JR(JRukui-control-center/plugins/messages-task/about/res/manufacturers/TRANSMETA.jpg0000644000175000017500000000665413543125214026474 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1!qAQ"2Ba#C%!1AQaqB"2 ?ǓjGeɿƒMVʅMDz T/Aw,_8Vtr( \@Qqڱ `+~<~U/&p2A&+eB&FM{ Oe[ /{:wU (ܸ@mXʅ˰vuE??*Vj8ro~Dqb&= ]ç-=՝\ *Wn\h 6eB;"kL0E'B⅐HmVzI}kAe:V!i" pM|W|3_]d򶓇'`uiD -!dm ; uD]·&ބ2,0PLH {S%XF(nm3HF 芝{^OPj$/ r3Wצ N$q4j@K7/Ӳ!_zh@7ՠԃ @,%;đ XJy,*SK!'-Ni)1Rjp/@4fU_#t =±HGNݲ6g魻Ge֡ԞsO  =6G+:]@.XAQ.?i"7ǫb[+edy0-ssJ"K:K}~$&0~~s;R@o_+'Ec*ȫwȳn asGmM$4嫔5^Yi#!Zh |^pzoSs*S3w;8RZ($buYk+Uf"# %%ٍT[N+Jf&\`M"b!q4K0vn2;rHx妶]]s.#T8G&sc&9ecXg>d+j&\.MGQ-b馢N_!ۛ,"⸌DeD3-6""?PUV!҂6 >k2&B e𪔲I<L⸎]$/潾_ڱ9$L'1N9)J1Ip6mes󍹗\w3,R|_Onʮ˔YK[liji74h"y~`m;Ӌ\YC<`_gE%NԐypFP/,_fj-EaA@<336O146fye"X¢Fܖz<`GM=ijPgw3p$$ȼsbͶ5N(n 햘L+Y6 5>L+dF_ȇlFˎϮV$ XqB%cT HJ=zr sjIZL]36:5d 35n mT]Xs*nN: ibnN*2ڔ:oH89!6c+2L1EG$/շCR,hB>x?_j-JI7[v,s!2%I4TPꖙ^ P h!^iwphw?/}U|[#81m].MPo¶T(n=lSmKT1PDżi.^Ga!$uOisj*w)oY8.D5@e㖙A1a\s7ФOj h)ohre1bv%t{$&z1 05'_+m*ۄ(sT[Ne@[ @N z4.eV`ַ49S$e4k V9Uo=f[xΦHE'ɭn4;e;k*wTyjhu.,Mf"hk0F:8:cݳ(PD DX!:qUg{I( XF`Uq5'iHSFמ%x:k-k,/Ǐʼ{5i6し& NA7[*A76(oP:{(I~YE˿%qFƂjT.];)VWq˓'T eA7_=Yl$pq"߈QTrAc*.Wqx\^ ZMeɿƒMVʅMDz T/Aw,_8Vtr( \@Qqڱ `+~<~U/ukui-control-center/plugins/messages-task/about/res/manufacturers/EMPIA.jpg0000644000175000017500000004476613543125214025777 0ustar fengfengJFIFHH ExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:03:28 15:44:52]F&(.nHHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$,@@C@4'|%@uV֨;^ E`uS:ȑwԆy{_~lv-륣}y)?P<5?gG3!p'p·aˁ|<_'Ro<c տ,4?h}bW3Ձ~@iV˾WtZ[rXˈk[ ŻOe q-t?Hedd~n;[o;'OMtӽ;YSt˝վ:5yVa4R3w]AoLt걨ca7YrlA"Ǹ)O/!Ous}MLΠ>^kX7\֌ll߯Lu2[e8啴4I~Ӻ7ޡMS_[~[w4),ycqYʨO%iZW>3Vl;׼ck?;7{y4|j,1G(6e|ˣ9fgԇF-78{~#PW5qk8 +T]9~;{ְjԘuZXI~qokt]XZ2H-:8: n@ܞ[Hncņ2FxrqE2'ksN==%ޭmuB\֮׋2%ظ[5%+vV~UVV--L9Nߩ?U[[y.w[8yTKbc|B{Ӟ,Rny}绥92I4U$.N6F[^7kHݷk}ڱ'?wIn>Sp䑷j4Kco]!|U|`wWf{-c'IlKaUMծ\ӱYe6d}ġ>T*ʁ\'Ck)9#<2ӎ%@Q301rŞپWq_w}&ѭu(ƯKCkj۾r4"Yj^/QuTI%,v%T|bM!1S!ĘINk{>k?˱W-4cRb?2@ŗ9T9s O?O6< IÒ7/=WH޴K:.V*ژ<"$ P7F'2d2'âI%"Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$hPhotoshop 3.08BIM8BIM%F &Vڰw8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIM?F]asint]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM ]FLnJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$,@@C@4'|%@uV֨;^ E`uS:ȑwԆy{_~lv-륣}y)?P<5?gG3!p'p·aˁ|<_'Ro<c տ,4?h}bW3Ձ~@iV˾WtZ[rXˈk[ ŻOe q-t?Hedd~n;[o;'OMtӽ;YSt˝վ:5yVa4R3w]AoLt걨ca7YrlA"Ǹ)O/!Ous}MLΠ>^kX7\֌ll߯Lu2[e8啴4I~Ӻ7ޡMS_[~[w4),ycqYʨO%iZW>3Vl;׼ck?;7{y4|j,1G(6e|ˣ9fgԇF-78{~#PW5qk8 +T]9~;{ְjԘuZXI~qokt]XZ2H-:8: n@ܞ[Hncņ2FxrqE2'ksN==%ޭmuB\֮׋2%ظ[5%+vV~UVV--L9Nߩ?U[[y.w[8yTKbc|B{Ӟ,Rny}绥92I4U$.N6F[^7kHݷk}ڱ'?wIn>Sp䑷j4Kco]!|U|`wWf{-c'IlKaUMծ\ӱYe6d}ġ>T*ʁ\'Ck)9#<2ӎ%@Q301rŞپWq_w}&ѭu(ƯKCkj۾r4"Yj^/QuTI%,v%T|bM!1S!ĘINk{>k?˱W-4cRb?2@ŗ9T9s O?O6< IÒ7/=WH޴K:.V*ژ<"$ P7F'2d2'âI%"Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIM2http://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2012-03-28T15:44:52+08:00 2012-03-28T15:44:52+08:00 2012-03-28T15:44:52+08:00 Adobe Photoshop CS Windows uuid:d94422aa-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:d94422a9-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:a39dce46-78a9-11e1-b50d-bb64171ab44e image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثWN*UتVyR%v 򜺌xQ8cRݠBhn՛ eG2rٹ* ?xU( e}RW_0«^hy9^'*aGsA88w;O/+t/"yI;ڛ].ف~+:W:.j'og;v8c[O(ZyFPGL{)M^ ?@^)ty;g$Yq-Fm:.:K-̪>`6Mj@?y&COkQsM8 UTI**ODMNr<[QǕ˓y2 J}!{f% y!m޽ND3e<|f<~R|hGn{dUtei(\#HBNKQRg!91憛kywJ.,,iȕy·G9CK#f'0-~fs_at2IkCNM" @?\h<!bH-H9j: LFrdz} ͧn19Gr_J8޷b]Ū<܆5:$?'*9T_0{y lU 6Z,DiTٸ٦#Y<#ؖ$ԓVs^;3SRr?3LM\A;7Ib*ҍ0RsG0x;s"v|4ϋn@REy@O҈V-rZ%OǩކuKv5݉6?o8ͣ? ^2j3]z>1ʻc'zhgAr_N*W+(Lfa4=8~?-vC,2@ִT4lȍVVG`ބx>vvA):$L/ hX~Qg[S{|??]NgF_LA--#KEEw.f>Y:rwusc;ĄEuw:\H+4~.|{G8%p@R?%v!" ϒ|s5ցEaq\ROˇ1CǓnJVõ5[N*UP7zwS=l}♯vV7NF-^X}2)TDќ6|iOgS9by:V0:/oBdџ$d{R2ī/SHX3KZ;J?5P.pøUUwɎQ"qTʼn[4Td{ &od ?8[‘/>`*C,nD[/kv*N*UثWb]v*UثWN*UثWb]v*UثWukui-control-center/plugins/messages-task/about/res/manufacturers/CANON.jpg0000644000175000017500000004665413543125214026000 0ustar fengfengJFIFHH ExifMM*bj(1r2iHHAdobe Photoshop CS Windows2011:12:02 10:27:22]F&(.HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOT$RJ㳿uvX qvDN1̓˜7.R'֔%׺~>3qm;{G=;S`>1lnG} TO/ID(8Ŵr&.evـcgzFeU0LnG5v)^.n|U..tY`UۙSr-!Ż^9yؘmkm;XKv۹V;qd7 z̈́WR/nKm}MvYE@`5lN0+uk.!Sn\Q(ˊ1'E%O_~ϧ.2Low7-bX(kEq_g?lȳ}cK<{?Ř9OH/ErOMf t[nY!#(:tyk0f岓zrqp]Υqzɲ0Ǹ}V>YN0)ʴ @ß[/GꢱVU"u͗9TbZ C@uBA~LHwۊG>OsDچC?W㾲?`Uik&dUsu k[}Zݸs%u?uJknue\%jng/u06pjZ֒2:! ӔXDx WZ袎kmac9L#u0jN5ƞv45ڱt][N?Sͣ1OXkZ>}Qms6k jcOډ?Q$3qm;{G=;S`>1lnG} TO/ID(8Ŵr&.evـcgzFeU0LnG5v)^.n|U..tY`UۙSr-!Ż^9yؘmkm;XKv۹V;qd7 z̈́WR/nKm}MvYE@`5lN0+uk.!Sn\Q(ˊ1'E%O_~ϧ.2Low7-bX(kEq_g?lȳ}cK<{?Ř9OH/ErOMf t[nY!#(:tyk0f岓zrqp]Υqzɲ0Ǹ}V>YN0)ʴ @ß[/GꢱVU"u͗9TbZ C@uBA~LHwۊG>OsDچC?W㾲?`Uik&dUsu k[}Zݸs%u?uJknue\%jng/u06pjZ֒2:! ӔXDx WZ袎kmac9L#u0jN5ƞv45ڱt][N?Sͣ1OXkZ>}Qms6k jcOډ?Q$ 1 93 70 1 72/1 72/1 2 2011-12-02T10:27:22+08:00 2011-12-02T10:27:22+08:00 2011-12-02T10:27:22+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:08e90667-1c8d-11e1-ae7e-db667b27342f image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@F]      u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ƪx)i) TigFX@` Ycg*K14I$v?~|v+{h7Vs)W;9M#NU3:>>z+>w|m/5[F tkط<9z ciTmS13]Bgyfۦn[(Se}j>ZƗoE 8/{qg;\{!Mo6{ZȷӼh^Eh|v~잒"dxzwx`aXTT/JrfL^CUUA1Wx]OE5bSε8 "c1{[ܱ{+ݷ:\d6B*cԫP{cInQpC%EZm\~6oo iiy$LU]c$jYQe7zvy[%S +I= y׷ܦ~vtECj ) H n#@>{7{D޻C+d3V!=GɵJ~'tj~nr7rv[bm7MbHFEXBҔ|(̯; ckەMf2Y",ƙzr >O})S]XI#2t..%h !^Ng%NGtm]O2n{oz)*%ߌn h*hY($,hc769e\Q°*GBq}kh۟pyo?m5@`#y݊VBM@zOU0/ي'UP<-'᫷5Ng^8ώHFǏm75I h5sXv 2܉wZcICDɧ,D ̱ѯ`:ϴ>||7G~}αVț7&*e%VGA)$y4.A_%lHZ ~i= b֙ 0IjӦǽC]ϑ(73F#GxYD@Y!sQѼP_ܗa;r|_Z#;D8(S.Is4+W_㪆8I^@ 0Üܱc_6Jq>ej>}Nv[\>_il֦BЧ'z*Lcb @:7GϜ&𖆛u^-TJK6G [-c+ڰŨSٯ5i6ʒ>mA%JBc!wRp>]nS7VMFn/{nHX MDnLVK5>9ZGueB6 Zú+IeDv /q/x9E m`cYVњ QUB>3-ן˿ޔK;N ^Y0[[em*T/U CNuDy-a I՞U `YcnyeOk)dagIg/",2/|H?#;#zcP&u=avrn 28:hֶɬI(q9GlӶo0[]R9)V2c`UHks/|_Yݢ_GM$1VYUW$"?U 2n.3:;1r Pr8x-W%ZVX5ym[pn-bEI U`A4hx̟x>cڷUfxPyיvHѭ 4~|z>{q70O#JF+$:@F.P>݁Sn_cW3'՝1xɚ!nꊪy$I!anشkibA"@bbI Neln`9r6y$7<11tGl,I>lm-7U|}W~1[ok𝏶j_CͦbzGWFarfa>){P?BȇY~@:'xؽ^mț>e3?yilV9Ic:H!:b{?eUwƺz1f oTd!CMO:ؽ@1g$M[[eF-[pP( j\L>7\w\Wrol+RY+pPwwFml&'mG}O`q>.fR3caϺZ$0FEQ@?M׹rw57&ۙ%I$"]ܖc@XSsG'ٔ2 E"#ߺ =Pɏ˶{Eà~OE=nՇv,X|}~I^^iN>:rtBhzg;y-uCԣ rt|G#o' NZÕ>{U6a@.P%|hw;P]dӎhݟ&xRC MQ+S.<HV$ /ݹk)B4z4 gN?)^F׶w]f %I/ ,QfZb@#t_~[(>;<2-  p-lު(NImwv,o FE RqRwەyחl7).vIݖkXI ŌNF$P[#m7g||=ݛ{  i}~WI_%17h?%jxNM]f*)B<0STx}7_f齾d۹>ͪ9n4%Ƶcy-܆K/b**F$?n1/lc(j~1,^;nxba-uK1Uw(U"gV0nlm]z5JK}osf$\ռRCHʥ]YIVR*>V$޼W}MY[K# v pnZLeMeluiҢf߽߷+ ]X@AA$Ϣh~"#X{}aymn7o,#ɡUTXM yӡg(`Mg::-IG_.[ E;VcZ鱕G:U/vB/AWtR2)P#@O+/ܿgaorԍ#\3 W^[yT:HY$%CwtE_}[w=CY4[i(䫒}[\~?ީUVLiȐ*$}{Em""rbRh AdobedF]     1! AqQ"2Bw8R4v9 a#$%&:J  !1AQaq" 2Bt$u6v789Rrs53S4DTGI ?M1q_V0Mz0<0MGс _/ a^l O.!A0`xç(`4„2@>('|QLgF_V0Mz0<0MGс _/ b:! vܕE+LXyYі 4;N6 Լ MK#;,k=+ cwB/uX0׊"ӪE?>:V@1Qyi꘢)S@Jbf10&bb9.!A0`xç(`4„2@>('|QLgF_V0Mz0<Ze9 R9: #&I!1[ߥ;ՇRW5P7e@6C<DZDLp8(.Fφ"ڏ[1O(| 'c 3:+b;k֛E\4VP:kjPTG! WT1I wme3(\,t|ET_?϶!y%ikR6&Y~Q5ܛkm՜h@aL/5M\58ru(tTڤbjtEE&8ɿOs5V-23&C;;g(Fj]/\m %H)I6[ԯ[7t2ZJ-.Էy-|vVgdP PJuhWL 0y5Jsۘ]\ri/|+u޹u.[[˰K!( LscNw˙=ҫ 2cnJ>kǕSxl/.hƓ!26e/cz e/[;Hö~W n7 ai륉F=[ktTC)hd\pLɕoVbgz3n4LL!JА]*NM(weHyg JkU<8?mvzilݮCvtM^I PJĤ)!3mJxÞ1<;u*ϴvAX;|L)~^q~ݿˏ_hS>Mz鼿)a9[EB!}xKT$rpEftb“κ daH5 L a+ww32 3VW} 2 tVdVW#FXm۝\6nng(,Z8g!^43 sŇe ]Q-' Ϸnu-_Azwkm*PZnz=A!M4fR3;Wg; eTvGlks{urAmXӛ/&<_ߺ~OW括y_#c7lo}_?sDTvFjz Rz^,3 5 Q8 D y(ǡ9{'?~=kMQݶQJf "%6[5%U%,cu݃^}W7d*6MԫUZ=xl֦t*̐Ysomo+3[URRfteԒdmo{rF kgIĤ+x-ND9#n켥7 tƉZn2F2Oͺ7̿\o..RRS!!$T Xv7̣ۤw [5Wyaoj4UaC/BbHq\i|Fw9zZ.7ZjmBےYZ9r{c覜V׫ 4jmĸU\LзNe '!2 g(J[Sۅ;K1-:2*xdCv]Nbe}%S>|g?n^|;B}b}r;cO)cy+*k!w=$yBlfL^WD((P2ԫH2M2ݬG!N(NSۑ՜9۫3I 5,&e3# 9 GH cZ˸c:T@W jW:uG<>8ke%ÖSqc]C^65WYrfjN|1"R 姰w .ZѠQ)R)kK T%A23\Օ4{SwAlʖÇ()M}BI˙#2vf }-D.oRT Ιkz:&1!8Ij!h<n`<0-/t8D5T$02$AQS!-ҟ6gv䎔h_Mmkc+m^:@~E\̓1XyMߵΠu@.V_GĻsi4t`95` Cף YC}q8|R ,Y+^--љr]jʔҥNu֫T'91۵nd%;cmx޵r:pHOT_(3Q2g('|QLgF_V0Mz0<0MGс _/ a^l O.!A0`xç(`4„2@>('|Qukui-control-center/plugins/messages-task/about/res/manufacturers/MAXSUN.jpg0000644000175000017500000001174513543125214026146 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1!A$QqB4 a"2Ddt%eFH 35E#CcTu&'w(8 !1AQaq$4TV2BD%56"tudEUF7 ?>L"-&>!91&<+LbLG @!1@ KtqB4eֈsP)!@B`NǗ؉HmɄW ZH1&#ԅĘt%:8L2D9ˏ(BB YA `ypuKl0'cD6Pc&YcJ'yU hGhꩆT5K<}1^ }ko/⍟"@vkuz ~ R;uZ[GF{ίB L>UK9!||_t!~ aPO40rk*}ڼ#FVi8U &̚H2(Hd,%Z[m"wP> G*G|*Ymls3tNwD07uZ`m[h4VӑsK V2ӥ뽶ϘB^^%r%:w1Zw?i]fmO{X`X8p4I׹xT([u_5oưTJdigOvC*v[G$3-)*Sjw-b'z2ޤ4t/QU>BpoSGl?8)M,7b.*֘pZnwXwLAi +mNOK9S%Z'ܪ`le ;ò.oz?fZrK'ݮ\`6;9T葭;Ը)+2jNiZX.=0u܋5 n9mkƥM䤨$$ yeJ{sB.fDlalZ$ 4HЪc*+ЍW)/iIkdFL+qb[S][rvոw3t6n3A+`B"C"mQ I4an l\i9Tf7˗ \PviɤIQi5G0`:9UqO֭Dpz-ep4Gί媃*vSHKM읱.I$7'Qu01' |瞈 -,Ҭ)AAH}TIGw{Z#akT#> F{'{UԄ2flV*".%1U{NV5pT nsW˚s)usB! rz pi]Bɉ&>wt#m6'r7%ˉӖ_c=ܩ {V=8Bp%RA)EN$9X 2yd9'`_DI<bb8-3[bMA|+R>(YT9GQ>{,[2g]=SxdYYW.D,J{%t X,43n4c_N]H1R{6aN-_kyi-MUʎK&&ʥ*@ۑsh"28F|lCltpa ko%NTZ5ߧC}S4+j)gWN U usHQX̝+h1 #i$Z2;֦_x\2bQ{rŞ Հe6*/Ds4^,Ёɶb;y Z_Yi+TVHM"9QyE1V32& NT)i!I%\.J8phtErFck(t?zԻ kW6t.)Rgc$Mr y_7)i'Q<ʛ5qEo;GU|Ebb4. iECՔ\l./ŷ͋MEUμPdToWeJ7tVI&@sȆd]%C ţ^_ydݩw*]64mW6pʙRʝM\4g׆qc"'Bp[ql۪fkS_Qor$l -hsSeC|#8"G/W;,fl3d! X(Kmm&RK6#i Z=PqRUe2dһ>x&F[r*D5a0C"2^kL5k˽r:,^WLҡRIM>q\ٻ E HX;ͣLjr؆?g+?,9$6Y©*#2h7x8xs[=WIͭHL+OwEg|kR"L=rc7joY^gտF͊* MgO((:4h㿸;I X}?_aN,Kv<Sk9LdI&o)`&i=ŷ/h Kpvޑjd+0xtsztKO zB r `vަ4`l=YE>>`vަ<P% zl,"DoNoSp]hGKvK._ N ӟ hD?Ւ   l7~hDtdCD| 08}ӟ K㥫%}CDxYS%5ݧ?7-{H.TB۶h(lh5[i:S: AdobedF]  1AqB Q2!"#$!1AQa"B$q2r4 ?ǓJ-qW&j *%i{*tM ROH.ӪI ARu#%CT8Pt5J~jiY_ATs ו4j=:&Mz})'PRS$s\ @TrH (@\`wTOO? 5UYi4Uɯڠ9kʉdA5ʝH&>R t)_9PrT]yHP *uN9$ d];GR,Vr*PUA5DM eN^JI):uTI/9*W.¤dj:J2W.#SU}0bx?kp{ysTa*f榤W8P` l$I` >Rlx9crԒ7)n8D}W/|o4cs@ۏ>KFD>X Ts΅J=8<6 qrQ9X]3>ܬBYخQуjZ!Ӑp.[|RJKU-F@nh4d7 K>3l#hv1}V&vBבٍJiatr$,(T/% lKclt5O<UyHNF- d\[ʑ?z4n=}oP?k\;2aorX#x4?n,㬅w5sHf KW "ew,EVӏK>>xAW+TƖF\fQs wb@v.k<ckš3r8;B"@1 Ka7Lg܎+uR֖ɰLř0'l}V384-`_jc8{Wq ]mi#SY#!"F߸[F[d$;7^eR]nWI~ u3྇,pF1[)w)Cm(˦qK5Hsϙ7CtT,2r~mWPGP"D"L\b8cһb|5{#$ofh$a,yM2 P;Wqno!үXڨ剽)K A<]+oꚋ&-"c ϶@0%^g<.sࡩ22,B8ӌ%:pp flY~̞7+y[X\vH< V >pp]/SYj;o[-ع +_~Uj9q¯`|Nц?؟ܵ\c(nuDzqh$xCl"No$aZwr;1 A@)V6{[ Nlw.N,"=^,qNT¤۾ G سAdV៤шS@bc D;[:լY^ͮG&J։s%qe`Lc0RҞC*@lb6p2>w3[ιۮwn;]dcIK2qIvVeɸw3b<cܧ<;g]l\1d,A ,XN3.F%N<=}bMxWToTr>=-7r¬7!/-®gGKmlvȽ_j&_r<+5_7K|ٓNʢ^}B}=4qu !9Sy-1@}gQ*eKɼBeH>r]Xjl:qSǰ 긲Ye/ cPC1b@F-hE,-N(KjQtnq-1LܜD ƻoT~Lu-=Uߕa#w'\U-5}\v2[A2.Ka_&"v?z{kg{6bIu &u)ɉk\Tݮ݂tݺrh#,#,#8vf]ĶNgk9#i ۴'\Bμwdr1V..8:`exѳݩRf/v^ZSt o͋PtxV7[UW]~Rj+N-qu|yYiͲy➉} ^/sr` \U$a j䧘*w)B٤^o1n.Sh< ?4:y~ꪭq `| sxC׸{9ƒg }ľ9{'˰8"\olPܾ.b6_Me”G7X-|0DDy+=ˎό `^&$k:/H[urPr;>D|gq.Oe(<$9@"3t`]ن!UC;iJmN6Mqr2'!]u{[KFaW)ZBMX*Ymų'xiR^hj%&ݠX;w|Cf'#S/se-2!QbrW&vťj;dfJӂ5n ܨ9<+ydZ鹑q82]CAx%\#ЀzK};`@W~\Jv PIQp{yKS'nIڦʣA`Fy+ksAȂHſ2뫺%ECC_8[08(-b<|?֕0S%[Y[Gh00 »C^PUk~S~QѵTl d Vf+;xn N? mƦx$T'D.dOҳcP2I⥃pZ\{Ampjdͬ]U]4TpUsRP\ 7m8uU-KP SL?LA⾒zyW7iY_ATs ו4j=:&Mz})'PRS$s\ @TrH (@\`wTOO? 5UYi4Uɯڠ9kʉdA5ʝH&>R t)_9PrT]yHP *uN9$ d];GR,Vr*PUA5DM eN^JI):uTI/9*W.¤dj:J2W.#SU}ukui-control-center/plugins/messages-task/about/res/manufacturers/TEXAS.jpg0000644000175000017500000000611413543125214026011 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1qAQ2B !$1A!QB"aq ?ǒ˒J NA/´QDxT/AnwQeI|Ǖga-a-DK V2r7*+E=<~յp2҃K+A.;Q [Yt_0qYE~!EXKQGRՌ\ ʊOOmEew /+JK:A/BDu]yVvr߈QV@QԱc+-prS[Qz  `̢ҹ_/ujoHg:z.=OǾUS y77#çݞmw# z95H]M3SOP95`9CiNCD){@CTՏ>~b%u ¡~" pۺ.K<;o( j (X@Z9Q^b)_\a/,]+nXSp Me)3<0 9ǙcR ͫ aT;ݸx_F-~:֎w+?<xiO/.8ٔƜ' ڍ`T{~9l=N2dHE3h{>U"XǦFUEkt`+ ^ٙlr[uu(ӣ^4]:?#woG 8sYX1oͽs*־>e fK)"\ a&#(1Bz[%Of0\2q/c V D%H>6&Cdb]MGȶweȹV`3O̿S^H3cĩV[ӌ^.R%U fHfO-ڦ{q>Ǧ<ߖsOb<>&c\Q*jFTYL:gNSb1yHk0~]rH^S7F2MtyUS>F*5IUQreQrH:4W4(rčwVŬdKcrUc3q ɘV_x'}>3ȷ]8"gh~Ls)cslӓaIJh,ҏe#ۊ)ZƇ4 C 5+XJ`NQ*k+w,O !?8Ȅ-/yTV3r&f76)SB(U[S(>4m)՜`((Sl)eG($S^25(*UYh$zi?͐Ν=:Jq?N/fIrxϐYB]N\晳ƇU|uRʥӊ4,{7h5Ĵ:jZ1/#)a8b(-+`d$$XYUU qSO3i^`^EN SեDYٱfut5$9l!9^/ v4ʯg4?;)ontjJUUuIG}`8 mD R= ki2ƚR36X:)Th(ݣя ]cE[_~{j\#i7%:&K'DۢS%W+A.;Q [Yt_0qYE~!EXKQGRՌ\ ʊOOmEew /+JK:A/BDu]yVvr߈QV@QԱc+-prS[Qzi-].K(1; ұD㺎KPmEA%U\Uu,l -X`1V^ZKWq˒J NA/´QDxT/AnwQeI|Ǖga-a-DK V2r7*+E=<~յukui-control-center/plugins/messages-task/about/res/manufacturers/COMEON.jpg0000644000175000017500000001735013543125214026111 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]      !1 AQqB$a"Xx2r#%789  !1AQa"qB 2$47t%uwbr#CDdU8 ?!O GzCp}se4,{8lxW뗹YQEMq1Xaϒ] }j+]Xl&%(J' Prux4;:Uyr%GlLD q?Ӿ}#Z]f[ΥPkwMjƧ՟ijj!kW" SEljQJmvܖp:׌W3S(8$Q°աm:㫶?V所'c{G[}XR$&R JP0*8\^FѦmd*"SIv]ܘfHND&IRl SӰos[-;zp:wJLq{fVon,Mӷ8<5D-b(ȸ븚 ҚƖ[]}dӹy[Ҩ8+omDyk}n{Ut`" ,"30 IٛJgOn-q'QeNj8 $A"ZI '>dę%5=³ob>W߹êQ >}\\Qc1;ggO@4NU0ä~#8`/<akKχ40tF5YmœP0G܂b3Rkp"HfTU#%MvWڑߐl+p)wÁtGm/EJYۋ]E E J9L!<^ℰpˑ% nڝ$6w$gz/ BkFr{P. c(DfR%)b]]A}-ƅlUp}saBk|6̥W`We\1CxW] 1U6ӑh*N濊4pnUTu>e-c?61xF'?w}ߎ9DGj)UʐJ4SDcq2_c{/G4O5)Kkc}#JybVj;jki{5F:QX<$! D5er3K5ؔʀL 5 @%PP/(Mgܯh r_[Hu_< R)-/6LTL.Zm[Nԫd!@'$!,gO$ٗ՘-ˠVި춛SLPLr8bbhc=Mɍ+Υ I|gT,)Y+ۧ[ONHv5:k{w[mʳ2L@`e,YR5ۻ[5T05vV$Z%AP5U.G>#bTAQzGզq..C""z`0l$d"( HVog>y!! L?FUSӃA %j@+P11 f}#(!wŨAtlKRj1)g*X;:*֥fɥ7pP1 ȘqR˷'Pt ?u-Xo:@fZ$Dφ9d' ARZ+\ZϜ2d]*QuťxtuxA4guɑh$g8-Ρ,᳧9[o R96@Tݐ 4\W]/*ﭒ/3{M5Q#X T.v~h/cn\_ȵzΖ!҄ xD@8Dc/9< na eiҠ"PHcuq +lXR< ˁ℧6sַ"ڿ_5Q<.d""qmy"D%QV/aT\lc2N#Jm)P]"QSjcψVY(#% l 6շf,%*<>}YgSq;8n[sHL2}h{щvKOc:n,~bvo ]mZ/Xw_t!$s8=7m7zC:UCLh^;Z@KZU5$ $GJ5fLݮHR#ׁɚ4N& h*45LeiGo[S@ÎY8o~2k>RYͶ O8#LAQ \Lŭ$-lR$ߌѕwĔYM5 ĢLA(+tUB4PCQN3}X򼩄>39ÿ=SNֱ+ 1=rj<Ӗ>(D *5LY(̨eRYsFxP-6jW KhG+P ũ24E{n"/Ɣ[5ce<ǧ+ܪEw\6%ypUTH3IS!XJY`\RnbZ[%|2`3|(,kS:yr2RBGUΆu2&_W D SBc,P?omw5T^(hL c5`RɏRr63}K%+ӵex%@xDD% [aP" Au]4cP~/Gw m#k^tH>K])q!&^)2'ro1#fơ&,ce5^NwgC^|cYe0j J[/QUea] fH@ݻPaH礬6OD !F\rc'z:s:^2qW r!UHpզY0,܂sva+6cR$YnJ;IdkoQHoE鋢#EOQT^'탏It( N?GSUmAn!)JSndCLs)H$IC;G%LkRmzO(pRƪ~frRSˇ `Pz5IA3Q1Լu-])[re'{L~,S ."S̘!w;=E2ɒ!SQ u  .;T5합HE:Es&.Gh9LWeaX-ܺ+U ZM+L:p'!2#3ӹnb qUL.4r}]t,g>Y?]L nBROq+4***,OegO`.9MR'j@l:)sqV$=YInȠ ?d'Z=?P:nCKV% HS_,.UHX#fLa,+JQWn@Cg̨kDeH˱PŊ{W-[XoVmTiMc .G጖Ey1fE  *!պiԆP1ؽnU J;ƵpiOR=L ,g lc*%Gl:TK~X5$T4bU"%[ڛOGl}|d6_`e5ZWֶv,{K2D{ ѫ{BWʭcw䓁-!v\<\dX ]942!l4]4􏆺ek%PēðD@:*zVۦh䠑6GMBL('^RrHYE]̇<U BTLJ=Iz#ǎYnVdY CGa#ue]vfnR]Bs@s _FYSy*1P/,7qR%+Q])wCYVM:*O2#(=-MXR.U[N94I)<1+)FxN; "C@~REXM6X*hJ<=!CU)T-9UbTI<{ 3u/Qۏh]_l53R9AfTw ɡ3ZьS. ||_'U)b|9oqv ϛPjc.TJRotʄ| h;3av ȕO4qEQ0˽1D;-7{YQQ9+G.B5MЉ2_մ7u=x>Dd!at5}Wb۱Z0۴#Kt)%SdeR %yQl6qù+6%LI 9#!"TC+?+.RKe:j.9S>(y ;}#MGؗtfQ ..Хvp<0BC!PƏeO=BnxYn=j.ɨIe,7#ᴟJx ؾeye(9,>8&-Z;'N% drH L#D1Q%|')JN3N8~P Tlˆ@5ruf\WŴO>2k~m.x[--V3Q$,Y f<&Nni~ιM]='?m2*~Xb^uA<8:.<[(V1G!<0xa<0xa9{Jp Ghpp}:^8>`Ɣeo~7A:`yixN#,1`࿇ߡ cukui-control-center/plugins/messages-task/about/res/manufacturers/MAXTOR.jpg0000644000175000017500000001016013543125214026133 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF] !1A Qq2$"BS4aDTERbr#3Cst%5&1!AQaqс2B ?<sM&! 1oF'aw&%aAPr JKq:`7`bWA>?̓r ÓɈe

    ih/̵#Qhi3)cu$v$vZ;1D{6ژy=A!Htwc%R@P 5$Y2kPShm07JnKC1"s6A#whu5K6,~V {UDt5ժ:dr~ ?lZdr=;Zpݲo?+"# Ա|)4g5-}' r7kU'i<,w+׈Y>|:qo9p)_{;<O鹮T@gpguk EoM u@F &[2 f=vnecW%zA]WUɵpy:d-oR64n.PZ+S30.ߤ>mVTo]_ZE%y8[a ҪBҪNAλru]RdQ52T9@D9Uk\p5k,h˴QYL[:ѦlheTM8dmjj4(Bg \11^<}BϏWoջN-C\:&΅ n(A"ЕJ2!EcxǘS.QZ ՘o$tm6tTT$r@m9;y($TJUI"?,F#m|Ju/x/0r CåSH* KA'EM Ӷ܆uA+s 6iC̠ZhD-[m՞5id=R-nU ~TֻH^-.}hP6oevY5ϳ=@"[Vqh3J Ҏ,{e189reJgf4"uXf #$6NΫ_-[6rqZM`pK2r2)~OX@?.…R&|؇d_󴟰q2t]J cp(`#PdppFR2U* @2×خ iT鵂TI(Mf -i05pjQž%P9#i q$q1+vKjxXETl9;<"^J~2Yb;sʧa+;<޶@ŧI];a6΍bŃo %_uS/xON]`eK/@}:>%Ҽ" Tɳ= uOtaܱ$J;'4Mc}V2a?^bcQkV5t-[R+z^G\.іfa1K!>XbCoJJ007Ej?c Zt=en"T5>?Bt(~„ >`bV V\%rK6*/?YDMr?̓rukui-control-center/plugins/messages-task/about/res/manufacturers/SIEMENS.jpg0000644000175000017500000001163613543125214026235 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1!qAQ"2B a#r3$T5V9!1AQaq"B2Rbr$53S4U678 ?Ǔ*F8ɟ 𨫠 RLyAa:y)L!%uCt4\ Qt0MЀʤAt\`wR)TUbHaLTUa{)p&}< 0<Ǻ.\(c \`@eR .\;G xc ZLP1rg0&|**0f=A>j~AsJSI}P .|B] 1.0St 2].Aԣ놊|<}U1G}lt!N5rDS1t3<-9ح:I[T[!N޷s=U-ȷ*RѶRe?x/-JeH`o3+g&RFOp1ޝh{Ii&Hx2?P3?ɄW;z&ʉgh*=VnR`@::㶼y/[h鵪<-*jM~) )(lcV.߶FmC!f {=U;?(Ei7eƌ4y[R~`['[}+jp g!-IRIIGi\%(2(܈BLB \@1ʱNj,>UARIEKE'q?ۛkKdTRKG rJHPL u'oUo=J=N%/R[h.==N )N& #ml/-}'}mt0SFӫ]3NSA[luHo ݗ^wqGGOѦ1FL-|#aXF"\@Dk[8;R_0Q/jn.GnGr+ O1 [2Ip'Q@["*0%8znR;{StO6x%נ3IxfK>F\D>2!1CVrvݽ;sHV>e9FcRvbsS^# D%w`H@̀a>c~`KZSY۰9SckFVsՍU*29LC t9:hŗ@M3#U25ݩfJЄEgLf  Me8 :HԽ0]Far]. iݬ~3Dd!W[)hFGզyE"m?vg+tl6.+܎M%ҋ(Bd${RB{bqM|ۗV[w>5?.Gv<$OV\!G^50`ZDY" c P|T&`}z]vѤ>{r4M]͋gkHW& ~TJ6bn4@RL[GzD9mrN1"kPUu(1E2Vf1@>2v >lyArV_Msh켙lqY'Ѣz7 GNѝ6BQa#i\x#)ZD:2N¶)5li D[da<%Vxu#xpR̪S)ӐIr'1ylI 𖜦6ŻQ[h{?&6W;* ߴ 5\ub!R$Qvr4!dDAH%q{틳Րf D7=VFwg6ȮaհfC̼t5#(lRLHX@ȉ>m%$kyO"ziˆ}Iߙ>-J @Tt6<27kee]=[j'"IP[9nA]jfIv\^ةq pFr4mf֮-XqLݻ|@5˥shI=D3z yFiTZ1@ 1XikJt l0}#zt9:Ɠ[[UD9iTZ=gDhݛ@~Ǝ4@(XjqL[*/P؅*f:t(4&͖ɳ&l%M::iBvdXL󉥚b9/x/{c%toeHwⴶPCqSE7*C _Tdp b~\z𪙕,ca ꘏5H>/q4vfu*]q"Q]*F1̶&Ȧ:)jKw} ^}1>mդʯE&~C og¢&cKA300p= r)E@R7B*rJ>hSodjeW?E!7A3QWA1 P tR8BKhsa )qHr\4Sꩌ75i2@ɟ 𨫠 RLyAa:y)L!%uCt4\ Qt0MЀʤAt\`wR)Tukui-control-center/plugins/messages-task/about/res/manufacturers/PLDS.jpg0000644000175000017500000004320713543125214025673 0ustar fengfengJFIFHHExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:04:16 09:27:57]F&(.HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IO "㶺\տCٿ/:^K:*;UWǒ4g&)<}))hּIVpԯ#Wz%ճ$]_UtG!^-wJ\+e.(\79d8dž`^}u[Soq{rNOI^1)S4ȇ7 >]3&d x !4>r6? f[ZǨ WK2C >64%%ju_}goC~9Y#˂"fc)|bՏ=d %$\Zuj {k\/?3Ҳ]~λ٭Cտxv&$R^;檿s1k8`5?uϫCC÷];DOnW\ZeU=I#Q ٰa\xI[>iaɖqeLJn"Ŀ/0c[lsOk{?ȹ/>uJ%.k \%o7taj.z6UX 7N7tވݗdkykb+k0tL+EuGw 8 x//J92KgG1?*VSuzsgsSY_[Z_Q,hgܧ ybAكb"d|e/\/ǯ!$ Eo'}:?kTξ|SlpmSBv[.sdgn`aǒdhj׿ᶯofO ė\,?V/l;G¹?ZzLbT .it-*,Nf XvYp8Y5C֝:jy[,:WgW/WH.s;4{G<.j1>iJ<_zUJGˇ_S+jUkx THƹU]կk`z<ҏ4DPcA 6I(A(r3*\x> 8? UK)\GQn g]U5ps\ ܉OGtZnXL\4gyK@c)P=#[fb` fmJ<Ќq$ (B\{Kp@w-<ҏ4|VxW @ۣTʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ Photoshop 3.08BIM8BIM%F &Vڰw8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIM?F]asint]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM ]FLJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IO "㶺\տCٿ/:^K:*;UWǒ4g&)<}))hּIVpԯ#Wz%ճ$]_UtG!^-wJ\+e.(\79d8dž`^}u[Soq{rNOI^1)S4ȇ7 >]3&d x !4>r6? f[ZǨ WK2C >64%%ju_}goC~9Y#˂"fc)|bՏ=d %$\Zuj {k\/?3Ҳ]~λ٭Cտxv&$R^;檿s1k8`5?uϫCC÷];DOnW\ZeU=I#Q ٰa\xI[>iaɖqeLJn"Ŀ/0c[lsOk{?ȹ/>uJ%.k \%o7taj.z6UX 7N7tވݗdkykb+k0tL+EuGw 8 x//J92KgG1?*VSuzsgsSY_[Z_Q,hgܧ ybAكb"d|e/\/ǯ!$ Eo'}:?kTξ|SlpmSBv[.sdgn`aǒdhj׿ᶯofO ė\,?V/l;G¹?ZzLbT .it-*,Nf XvYp8Y5C֝:jy[,:WgW/WH.s;4{G<.j1>iJ<_zUJGˇ_S+jUkx THƹU]կk`z<ҏ4DPcA 6I(A(r3*\x> 8? UK)\GQn g]U5ps\ ܉OGtZnXL\4gyK@c)P=#[fb` fmJ<Ќq$ (B\{Kp@w-<ҏ4|VxW @ۣTʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIM2http://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2012-04-16T09:27:57+08:00 2012-04-16T09:27:57+08:00 2012-04-16T09:27:57+08:00 Adobe Photoshop CS Windows uuid:d94422aa-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:d94422a9-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:acba8ddb-875f-11e1-93bc-952fd8ae208c image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثWN*UثWb]v*UثWZ3]1Kkd2EQRh2PG2$"dy+"dI}?ؘBUE#4\.ʲvh 1ٷi`-[U,*I[ks4}>7+O؞Ӯ#;l 'oỰ%7ʱS=TG'Qld]w~o~^ʱE+W>|,x$kF*A eai-om,x DYc9& Ŷk0E!< & WCOl`z!ßҿFjݭ_? ֿ_̝_/|O rGUk(=J);坞03/r@igv]k{IN@B+5 Ffzr/& @G\֘×/5U!X2;P|x=zopǧ¿.,uO66YLD;5(>ȧ|kAv|܁}G<;S9 gg? ֿ_̝'_/-wKwN2@즟1v O5ܔ'/4Aq_NB׊/v9<lxAQɚW#o'y%Lu2DvdN[|YeKv^|Ig1FOCbYM7co՜$y"˿iчOu//\}ﭼ=.ʶKo/ϡRq8oq@}4+1/tNJ3ԑJ^L p}|忮Y'-KK4H:A%c^J?Lާ.;TC=Y|戭c7TdC.M#F'7qVG<_? ֿ_̝_/*"?iJ♤D=Z& >_h0Hyg?ϒt{uaAʚeW4W.4JF "#( 6;1\>r4ZLc5t-O;}.h<&#9>jơs{W0ƼyNaha$D7W<ɗ{h't>wfQԦEִO_@iJ MV\DoH?4kPJFH(Se?d3Uݡ#>$5_cK͞]EΏI ڽLtgSr=ݳ.ˋ!yS<_kfFydW_EnN{3wx̏sLؼ»R%խռ`JKn8c" le!GOa_(iq^XP2 吩H (@)c.P:갈u+8nef@WY,n$ů&LT+.o%eR iJLә"x!Q!.P%Z-O# pyN1dihpb1MerVUWQMI jrQP≱iP$݋WL(O]m8uq8ٴxlO+B,!kFo2dws]qWN*UثWb]v*UثWukui-control-center/plugins/messages-task/about/res/manufacturers/XFX.jpg0000644000175000017500000001242613543125214025575 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 !AQ"B aq2R#$3C4Tdx9 !1AQaq"2BRbrCDT% ?y8k^qK'I\ G ~ޭj CҔpDnL/ҋ Q܈ ~ZQL{Ui8krTU=I愉J@ u?-O;g2zia8`/涸@RNC9-XI[%Cok&MTّlopQ=Cq0(}^mtvY'#X*6-l:_R(ގp0kV卣WsIW" ,?UB+j *ZCk o׫, {,(CW013:1/]ܮKxiEɆ(Ҕcr\8jERq2sfq-D>ZKd1HaU;oLPPrS2)9?(kMuHDIġ_2j!UנDx=>r7?< 1 ⩞_]O5/]ܬQ (UL"Ry،]J JT\bGb!Y!z2`N%J)y}TnVEg~LOw{B{7hF[ab{"w6tک$X79L9o2LկӁ9!5tEE'"qxB4Q#=jt7uYhg hrRؤ^LR3\ #pvFxrQ=#Bt/bI[7ݷ7rЭ:za߂21!-@wf۴u4`=s؞d;9hyJq\WEɿݾ=@SL+1M6< ֡LGW'iFH'~V^Dy)VziSG8QULQ+Q/a8|G)z\3npMP?i6%ȤBT(UNi)lKPp^G僖{cAC?KW\ {{4 0m!qQ;os@Գ21XCm$ZHK25ݹ"i[$QØC],kfz6utwOnͥ8k8٭n:ج;,GEL^J_Eeo\e[%V1s͇WT$:Bx;6Cu9\SOakb1|QD8︀+wȾl Oz4ةp倥 "?p5I!N=ڲW(uTR Zbצ`'=A)q6괦 豸hDK B%IЕG("tR2&( 9*L  Qo՝ʨ=eldCAV3s:k[ڥ *n*SѨ_PkGW @Cի+emHCi A譥Rjްm~PXq۴b}>1 ̩0BCq"Cw w㯗6m v-Ҝ0v_!؆IHxx uqVtD;"":C˥טJ$f! ?ۂF:uRז}bX^=+xX}R0066FK* >Y.T;+t$AP'jQm)U /KɫS\߉D TBGeT2Es?ŃZ4{m:9V:ix`)l͉ы.iϨ?X^ n;W9K|-L]cbjeXĽ87":戃+*rcZʰPSӱ]In[ny۵r8}t:&AM:`]E}df%ti̖,oo|nGi]U5 kVE$;9UD9GYV#rMz\8|J{,lZq̣kWuĶjҦd/mJ7(J.5*(Q!9Oyas[8Wq`v[Y]7Z!dfTb2%=8e5Q$!y2B6@EI ȼn,.j]yCM1Ll) $Q>$-ʑ| akc-CrM_O`Aػc3sU[I+e+}N-57}3$< b8 l諿b,B9 ao\B G\P|͋jjdV#,-/ǵ`w ]L׏雽y>y_6+m"pYsu8cPc]]1d"y?́e /FCVx& )oj'bI[;1If)ukui-control-center/plugins/messages-task/about/res/manufacturers/PANASONIC.jpg0000644000175000017500000004312713543125214026445 0ustar fengfengJFIFHHExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:03:31 15:41:54]F&(.HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IO'Md q˪}7^u4GtZE^n|eea? 6 ׈.VGdFSWmys31؁_꾹 .7]œԿ{U=h\_N3z6FEXk[[m5UݻT0Wh*u~kM7w/  m^=5:=K_u:0lq=RmnVu|p.tl#"(Y&QC<c&s\:]2n87b9Kd=6]z?\հ]i/gge*14{=n892;<}0 oL}fqAI6aށk]!HY;psP/qWSO.*eX d˽@չwI8bVK/45pۻ K1pZDht S!#~/-V qF^uӬuL"#k%~emů>uORYv7vQmW.o[MqV7:վ8VkcgmRϞ!(*V-0Ag? nUEキ6pcO5r`u\~nٳf+ Egk[\ lw.uBS,k{u-5VpzU X۫~{\75 [@xmPzc*6:5hk~uΝw@ʩgӹ\NkZ=K9iuח gjsomtRݛZA yCU_w^dkȬvK78Z~rrzWTʯֻvK=90NfC:թht#BSu۝Um$7nnKK$꫱g.S:p$k{K[Ukxԝ{nnw[]^KqŖVj|w Gu&6 p/w^QRIHMC~Lp0Sv/VIL*X+I)Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ Photoshop 3.08BIM8BIM%F &Vڰw8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIM?F]asint]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM ]FLJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IO'Md q˪}7^u4GtZE^n|eea? 6 ׈.VGdFSWmys31؁_꾹 .7]œԿ{U=h\_N3z6FEXk[[m5UݻT0Wh*u~kM7w/  m^=5:=K_u:0lq=RmnVu|p.tl#"(Y&QC<c&s\:]2n87b9Kd=6]z?\հ]i/gge*14{=n892;<}0 oL}fqAI6aށk]!HY;psP/qWSO.*eX d˽@չwI8bVK/45pۻ K1pZDht S!#~/-V qF^uӬuL"#k%~emů>uORYv7vQmW.o[MqV7:վ8VkcgmRϞ!(*V-0Ag? nUEキ6pcO5r`u\~nٳf+ Egk[\ lw.uBS,k{u-5VpzU X۫~{\75 [@xmPzc*6:5hk~uΝw@ʩgӹ\NkZ=K9iuח gjsomtRݛZA yCU_w^dkȬvK78Z~rrzWTʯֻvK=90NfC:թht#BSu۝Um$7nnKK$꫱g.S:p$k{K[Ukxԝ{nnw[]^KqŖVj|w Gu&6 p/w^QRIHMC~Lp0Sv/VIL*X+I)Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIM2http://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2012-03-31T15:41:54+08:00 2012-03-31T15:41:54+08:00 2012-03-31T15:41:54+08:00 Adobe Photoshop CS Windows uuid:d94422aa-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:d94422a9-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:e35da45c-7b04-11e1-873b-c4fd423be6eb image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثWN*UثWb]v*UثW$0Y&m;*=rB2]Hh+#q1#PAUȥv*UثRHy"(3=QM $D=aH#9[V"0q̏~99~ tݧؾ6ec6{TE*>RT18YNzi~dB'޸ e}~|G&Fa\5יE&Ǐ,\=1̫ӗ=tĎ}ךn.y~FAndZ%~Tʣأd3 edu31m<ϫ3P]RXc~cUT^X36,y>s_q()hZ`Glmdm&oXsĤ"j[,݉O}\??" T5 Ͽ77[i2s?ttaD/ڵigLXa?(Ǯ(WmWu}7Z44ӕ,#(+0_n9qCeF'/Zə| ei%ޙ<$n&FP&q o☔GGL%&T̞a򯜼$*Y6T,r:Utc.zY# Ǣ+lͦk˾\nUxgh!S+Kgݸ`I3 W[.=_ cT2~fj-k2Gy$G"a'2(|?y˖a xloZUߕǜ͢jw6Z)@B;N|s7괧$4ipC^#t.CU@;W5ˌJDDp8 oqWGī~"1Hׯ3=>|5|˼C/i-ꞔ\$uƩǓo2qщ7㟜CMR-]l UCW<`ʸx'τM$Njq+q3ϣd0 /Ou-RZ!p]:W.\{k82r \S[Yuc|%wiiOHrl2KuSUzN*h );UIZA+@cm=}nR7buDm"ti>/RG)8ߖ*y-p+S- a.]TsV~A]Kd_y C(mSM#}vIq;QXѨ?kn bմqDjj O|UN̺ʹ1](-ڊ7i RQx 3^zS UN*X6E b1TO+yz@#QC*F>PyPӦ*WP(H l6e&P-OoYFaF? O*ҴILeъˡܛ-Q B7dZ}Gx&B)Sm- X-Ŀe*N*UثWb]v*UثWN*UثWb]v*UثWukui-control-center/plugins/messages-task/about/res/manufacturers/ZTE.jpg0000644000175000017500000001215013543125214025564 0ustar fengfengJFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC  !"$"$CF]" :!12AQa"q3BV8Ebu(!12A"qQa ?p !BB !H@&45Z7aƳ)϶DSMb -:6'ra KxqG$pA=,|vLY=g&Qm|7UM&K2XBmJI9NHUG9ˡX9G? 70_VmH?rz31:jkY^feႊ!G;7{nXҹYo> )y+a%_~KnzFZrFSd +ߝDv2Smj@OH|Fڨ'<`kt˧;rqLxyM{ncux"0$6o܅#8g |vx>;=k,֫笓6KyhIR֣:OVV%3HTJ)WB I#8#*+O6ӷrL. o~OccH,V|MAS=ۖЍ>L>HZWfje&%K%VP%;qg"&_UM 5[Yju:R\R[hAINˉH1ŸkMtO76w K$#Ǥq[qSiI8#A+/VKʥ54eUŭuKh_WZS) }"@\fnMMY̼dii:}}ZTDMMJKґR>"ٷ vvsہ9yYr}GCsepSyjo?^+ߗlU*AnFY-_uO+FK\EuNSSUToË!\ג68tۧuA9 vھ?&5S~۹`ƮUgIv/M9}Bzzmx~mvó!$6#Q\J:Aii?Y'N7:fٜryJJ^\TmB6W?_ZkɯRO|yX_:Kum9nIn y`*Ooq}--Y or~Mb9PR$u!S~Or? *i7-˵YDXjm6U> #@,V~园5/T\%0hm@(+>ɝ55lZʹ]թ¬deBuҒ(dzf9*OXveFBeX-+n(()eJOVtM:e^e5S,8SN0?.u8 I]/EYrDhHh/ ǪsӬ??ڗ-hִ3M2 h8+QgbpQz]n׍"eE,ݵ /J:&AЃk%J*UoNI4r "Qx#(F]- D5Mc%gd1^ݷʫЩlԔ)Shm/1+vNNz#>{#Шجѩ y~.Y|nӭR8>آ4Im$mh‚r:#u+&[\&ff]yyPPn$)+I Ђ=#෨vMrvH[ų#*QJ".ʻ2Ӳ̸. {4!anVUۖeRNv gLf !BB !Bukui-control-center/plugins/messages-task/about/res/manufacturers/EAGET.jpg0000644000175000017500000004222113543125214025751 0ustar fengfengJFIFHH ExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:06:15 09:59:12]F&(.HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?4I%)$IJI$RI$I%)$IO4v\:ח~7\cclcSpˇqpqǏo+w[oO7V0s)gu[xլx`s`p."arOj&obISWfS{]\cls}T@.>b@hj'Dآ37!vYY_Yz6% hkH7moF?21-/e?9-DxjGA# zR22-,uKM‘el.{\ݿIO0򭾦,?{P篤^4C]PҎ۽G>}-hiN8'{0'| s(Y?r[]bſ3ٹXok r5bv~FJ'1ِ DtnmĹėjN:VkmbeѺU.n 9#|dK|"Y%{^yû;u uvH!|<5-N,0g֛w~gU(˫ҽ$25B`>4ܑ̘a8VN!#ri.8Ly81ϋ>s&"^#!!Uk,9{ ]^QM}skQA LmSUѺuVRqi:y& Dd?*|3hrr1[ab4 1ΐr>ǑUM槵ihU1ᆱ`s2IYV7&7 cW@-'wO4WݺHiJywe?ZQ?8Hk_$I2I%t$JS$WI2I)I$J_5_5_5_5_5_5 Photoshop 3.08BIM8BIM%F &Vڰw8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIMGF] authentec]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM 8BIM ]FLJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?4I%)$IJI$RI$I%)$IO4v\:ח~7\cclcSpˇqpqǏo+w[oO7V0s)gu[xլx`s`p."arOj&obISWfS{]\cls}T@.>b@hj'Dآ37!vYY_Yz6% hkH7moF?21-/e?9-DxjGA# zR22-,uKM‘el.{\ݿIO0򭾦,?{P篤^4C]PҎ۽G>}-hiN8'{0'| s(Y?r[]bſ3ٹXok r5bv~FJ'1ِ DtnmĹėjN:VkmbeѺU.n 9#|dK|"Y%{^yû;u uvH!|<5-N,0g֛w~gU(˫ҽ$25B`>4ܑ̘a8VN!#ri.8Ly81ϋ>s&"^#!!Uk,9{ ]^QM}skQA LmSUѺuVRqi:y& Dd?*|3hrr1[ab4 1ΐr>ǑUM槵ihU1ᆱ`s2IYV7&7 cW@-'wO4WݺHiJywe?ZQ?8Hk_$I2I%t$JS$WI2I)I$J_5_5_5_5_5_58BIM!SAdobe PhotoshopAdobe Photoshop CS8BIM2http://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2012-06-15T09:59:12+08:00 2012-06-15T09:59:12+08:00 2012-06-15T09:59:12+08:00 Adobe Photoshop CS Windows uuid:14e7de79-374b-11e1-96b9-84cebc0057bb adobe:docid:photoshop:14e7de78-374b-11e1-96b9-84cebc0057bb adobe:docid:photoshop:84691d4d-b68c-11e1-b9fb-e49a17428440 image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?.*UثWb]v*UثW.*UثWb]v*UثW.*UثWb]v*UثW.,h3oz7/5Q~=*BN \,8z~&*-w&&(1I M<@3~ikf$@n_;yf=r= 0[f^,V-8NG밌?\t'HKYcF<3S .\XebôG5h\rigD|EO0h˷d }E8x8poy;&#o2egM2HO/ɚeѴ \VdX~!`1vvyvܽ.Ktt v ,6 %Zz^*ϥɈ1tY06#-U^-kV ou欼~S25Q^BWr<>3:6s}k Mj[B0᯵pN$OF-n9`<(Eh~)йz@`UAgWvĿO<6'ʡ&Kx)~O' [?=e.{kReK`T}=Έ pAuL5ecGD-%Ԁa=ɭY|tϞ0&!^''i=lidq'_OE^yrMLqSI~A&lb3ˊ?@}.> ia?%'S MBH[7Fp@)nFqv??nlg.iLf%_uB̂[{iFw.YU(͞-1L\FRጧ08tі,1L |X. e$F(Lj)EG5Z`$u11>/%Z wxfe+ę~?ܵ{E1cI߳=N%mo[K"Ti$B#%[nX 7!5yeOfU#=JpiȐ2Kדsk͡HOYAS:jmUIΎX o' @/N?ҏ~󢊏DXWy!m)8O<*Y擟NX5F?-?ߦ.O;˷-49wvy*YIYj@yG:\7UУC S}acyF {K1<[<"<#28n_W0쬵;O^D&~ T1\Q<%i m PeIf (9#ӗa*3>fGFO+/l-7cRy]2qB\Fxz4˱<}=m|k"eDnR2B,q125/a1!q<\jm"I `r[ ִS8BPsu AdobedF]   1! AQq"2B b3r#c$41A!aBQ# ?m}#2obrQ-kADQ4tQoը_Ȋw] }^-  62_b)kl] [F8z7h19B(ߖ(}:(7/E;OF.>g/NE@XkAzv`vhy5.mw oZQn>Ej"çEBif~aKbGe ;;4W؊}CVѶp#!ƩG՚ (:bc5؍3/#[U(-#7s5sgoȧQaaȓ%+ٸωR5In,5*5TrƪjsV'D uke:#go#0OuqKϿ&$c?fЖ^)kI@G#MEd"jЊu)抝+;FVlhơ/&y}\jN_Jk$ I}lݲ(M%w5 GLOvu%_^cG]?Psף~aKbGecs_.zswӓI Fdf IELU(u ïAۜ Wo+.&n+Br)I~-!$SI˷x<PT=]\5~ ]5L#xc%LD̖ )lǐi(:HBz֊yCKG4dXkn|N>ug HYi'%츃EH*N]6r׎Ska1K\ʿvgCUT8o>=!AxujC2yY=\>yŨn.7+5G 聙d,FmX#Ip.S9tbLlj< k@̚T2MOdq?|`2N{DXf2v1G_V^Y&፝֍LLkv͐)Ot-CUcl䯕a${[a+(RgҨlK MX$C(AuI-e5:Բoj=AZ׳FjNYN"R^5_o0x %lw'2\V^u aeVu6VS<_ 4Qkb?"Mw%)%aVs"QPVH9,lo?մmしv"kZ "٣~BDSthM?Psp"4T l@h쵁`fO[bj6qѿAFFDQOV"):z4Yt&9k8zw* 4vZX Ӱ{E}᭱t5mkeݠ~Zւqh(ߧP=,O5; [;-`@me=٢Sغukui-control-center/plugins/messages-task/about/res/manufacturers/SHARK.jpg0000644000175000017500000001164013543125214025775 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1!$ AQqB42RST5"r#3dt%&aCcDUX 1A!QaTq$42Bdt%"5RrD ?9*O;EĚRgYGEC;_S$c<4i>S[2K =ć ifXXMHtzf]AдlF>sL1);CWjˆe{GYGɍk?B'Z0W~)0G սPpS`~R}ϛ#2MmU&}P(k)1&Q&ĚzSk܀LKvvJ7&elL.a ,L/L-b`4](QL/MKd/*M|1&$׊$"QB܊bM{;)u)F̾8Q ׌!E逅lL#ˠw =ik&^ n\u|HIk֬ DbNRn3[Ɯ CM.mT6b:B{pE.k'c Y0J^S;&o^ /qϱ J:XTD$jG`l:Lf?*zڕYWO.uy+kB˫ͥlHl^qgCFrQ9md@@f`Ao@S2fS8&޹IcXF7,{c/G]`h* ֫ƄК۝@w̒alIA f 07.Zңa٬cry?qS Ml53>+d_>EMו5MVy=ӏ 4a@Xczʞd0-U6빗fcgѧ 5%+w3 {)FCg&&)4+`GOE,Su1|ZX40^&w03>_{w[D^cXfI nI M32٦zUBRDS& Bo/'<<.):㬋!LODJgLM>~$z4@]ΛqQ o(Eg;JϷGb?["""'5M|=u dZ^^q~m(k,Y,gqFEsAQUlQsIfmoNvʖ5$9B|$5%edYA''S$IѶ~sNU ?ZLJzTqK0ky~0E}_[דTnQ 6'liaZH}'^R\S7Qڹ.g~H^ÍDT>Gk=;bkP, mwg!3۠p:!mCHKH9-Ҕ~.6qMs@lRĤ>;ÉH%|ӝ^9{ ] Hkx^T82IQ&Pw}8c߸3ҦE &Rfˌ(i\On!YQGR^>QSBbMxMb)5-Ȧ$׳PBnL냏ؙ]xX^[іiAb<xi'QٽZ6G=S}aI:`!h۹1-{CP{$ñ aZRm:c!A0֌^ :lLQI}@hG %@Tɗ*w?/ukui-control-center/plugins/messages-task/about/res/manufacturers/MICRON.jpg0000644000175000017500000001135013543125214026112 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF] 1 !AQq"2BSTRr#$4a3CDӔ1!AQaq2B"$R#4D%5 ?8W'~&Ԩ;WIt jQ?ޫ5C$Tڔ-lLTڔb-X#?.%Qv.%0UJsW;_+@#u(R??4 Q}WˀY+V?\ Y*?07ISo7k|RQ z*$rA.1S?H>yp ҴB=3hSL6>|RBn(īH\u(G0_.0U ϣIXiZ!G*-?k h@:#2S:` #ğ4(dpZ Z]/oĻ~bk8t=bڗ u3F-y>h4ˀvA>;SewT`GL}@ә+_/ɅE.o y0. 8Y{y1Y{y1Y/x,)Ef4qQؽ6D\ qvRT5 lmiDEuSQy&9+MW% jÐ/ Z SW8dD%_♍wnu(`25wUeJHzjVTF+9Du% |tS  gԛU[ura7wp֎\ԝZQ{|{"jaԫ-W*21e%ktSy Ϋ6w<”ҚbqՋeIkWEUu¬IM$OC F,1V \nF4=JqDk`ZC[+J&_ݳ7g_]YWjhhBM$h':+PztHTsB4@vg$ⳏћjii5ә6?^#$zRψ7+Ki9)7DO>DlQXfy lp >t#7a3*jrtls9Cv3⁡:jÅ#>/ͲN֦,^kj[!aI(y, z{^]zyq D?8zV@|~S( lԍ“L֞1hĥ3[BӞ߇WKqo(eĎȻG0&ҽsrBW+w$2<`.f](YIgٖ )=)jRNto5}In[H©;Z&W5!6=$Ep vuyo]Gܿf>]p;o55޾ v8mpҶuou[~uȝSCREke RUGH9ZQ|9di@8Q]?{KvMҁ.,p{ܳ5狍r %WͲ5k>6I#|?] ,dK)ShӆN9ԥ.h4G@̝Z8 dU `:Xǧ\ϯuʘKK'S as UU/mU1 >7Ţ+MXh~'f:ަjCrNBdHpDSu~ZrϘq[GGUn ڴ0Ӌ/^]d_l53KqvĂ` \|_BpvA~UmeMz 4ItI#*;t?D:of\+u“b;6ٝX=ڻ)WIJN˘KA+b^ԏHs gD-8G_JtUc Vɺ.a;~!$zh89畜~QCƫvz;E zG˛˱5Է&^&p8ܙcem\KJ8fsVwUH+`FdJDb` }Yh.͌& p~\(Oo[ Gb^JeVd\>O<v](L):K4?{`ENɚS! _X~>w $#%8q\3HU8 {O@6Zư (}UJŔ/Bb\HՌ[B=IKԱ?eՓnXQH"E,ʌ ^n` 9tUU!=ι=5 }]8|-Iդb$ R|=uOڊ֟mlukbRe +djEu`wGQ+ HlJeg1,Wjmcӟ/FlE]/VܨiZL4l[*}ݹwŢ^%hJ*t=O[.x>j60>V 7fn_g A^ڏz[_.mTdfmXc8ʏ$0e92J;GT:V~Z ]MpO'!9m-5c,%Rf 9fkX)K3]jE3Lm)JQTsnKUſgԿ$,Dt`F%ɾes^_kwl@o{S6bMS=.H Lhuv0%ň`yC f .hlPA,(Dy~L|ZMrma c&LI`G6v)dr #o(aD ` #`wŅȞ/ىoIM!Lbɉ4Lh0"&ޮ?0]”rL_!dr (a`0,Arxޙ13M_ukui-control-center/plugins/messages-task/about/res/manufacturers/PIONEER.jpg0000644000175000017500000001063013543125214026224 0ustar fengfengJFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC  !"$"$CF]".!"1QAqa3br(!A1Qaq ?h""" ""}Du^n[l[06@\X$ѢCGzS]T-5GR>hCb׻DeosG:tvt.\19?d҈OӯYr+.kQn#-\]$k[vۢW_S7U1>ZtS&ˬ麍w$y_ߞ TPYd,e5S$pvoƾz[CT._DmZ̯E=]W$(Acw l:{j(ixp}glT -|mp?E\]/ jJ6SUA53ɳG s?}>w~B.[/u6VrNb} /ACDkkki@4d`oQ:Qؤrk,]SųOey 2冺L 4Ǧ=_<~ WӟN-TX28 'W']շJ[b_٘zSDͨcK|0ϲ:scYYpEGKJ q o}ֳEf=˩M>]ȯ,DY$LO%^DzCZ4~纴tl6qf+|I!{m+I",JܙTxڝ$-?pg4Yl*x9ak|GߕZ ٱ AdobedF]     1  !AqBQ2"$9a4tu6ַx1A!a2BQq" ?Mɿݠ~iX pQ/M\ /F˿hh d@h䱰X<_b${}Zb&897Ђo٭+A76 }]ɢˁ%Av9w a, 6kX=+Do["U]'&vM5b&DP xy4Yp$;}'.%mc+`E}kd]|巐xxAt%»rYv.0'o^Hj#I]̠61u=k⑄hyMī-+#ת/]jVު~Ÿl=BV8 IK8{J5vi|J|kJMm>[e3|D;Y=jxRہ%+Ј]fdWI J!boei9a:`jagy'qe]W6ެ^7_1CYŹ 3@0| "`(כz)FOBw?k|TxY~b#UHP1J &5>"-e+F6o4Yb.r;=ot&$I+oZbn1/w8 abW|T0xAkFd5qdʛgJr(Gp8ƇgOʨ0 A{@T1iU5\)nRZB.(qf7 ]\(jH%ӓ&Y@ED+Lʑ*\My3'\y㲌89Ëbi)^KP[r%9HRI w$L&8}L޵*TT6#lr,i >aQr.38'yhn) %-[TIzTRUb9'xdT|2s!cdo& u6$L{)/e%(us)xJ[oK&xOtoНV7C":_r,q#G\?fBx+q%)hdذQQ[KCzGSB:uE{6=FqS'c׈pbAnњ-)v. cK l;Q{{Xʕ$ARs{U=4FeZNSKb=iH&F[vo!eLS+LUv"8z^z Tf0 xZiOΆ2Xp)|vf7D?mV=@ꚩF.c [WU7 4CkX%:_VyěŮ}xJ d9;RY3PyN@V4J'RT=ӎЖR○icSˠ3ecKH% UlKF:OJD&xu16SU\phy{Ga{rmM+e|p*PkY"!2{Cug ΢ŐTȏO%ӖCE8qWUUUrJDW#u;^q!i&2ت@~J$nNZu*j(+Kyuٰ}țg#;4SJ6< 2" pn;)=!HU*d<^8VhCl2K]Y8-ǵךB#N:B l&55)+ CZ"?xIݘq, ЗLp`ہ P h +cZE2@:1v>k{qo_'j:z!6897Ђo٭+A76 }]ɢˁ%Av9w a, 6kX=+Do["U]'&vM5b&DP xy4Yp$;}'.%mc+`E}kd]kdbwB fQ|8(ojAw&.oYDߴ4U 4rX@mebr`h{lukui-control-center/plugins/messages-task/about/res/manufacturers/ENLON.jpg0000644000175000017500000001115013543125214025774 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 !qAQ"B 2#r$4֗8  !1AQaqB"2Rb#$%34& ?y6פMZB& -J`vSѠ0]ͥ(/~C$ߘiD Sd G.(LjbEWMZB& -J`vSѠ0]ͥ(/~C$ߘiD Sd G.(LjbEWMZB(cym Z7x S JSI^-P0JGD&0gծ_^QmoǬՠܫaeC2"\'2<iT@QX9#mtP`ܫaSQ7jTr~nT7~G&r5 Sd G.c1Dyئ\wgq2M/O LޕSKKXWYf_Nf$0c)~Ŋg֧3` ,l@d7:r#n\bSd @uHH§׏䌗&Z'gWn(X86mF \sp3o4˳eu] 40yme)~Wy mUL˘̋OӐ@-.OҪ5:Ou>2;5džknW}THx]I^T4v#L;r4Qh5ͩ8dr# m@g`M;vAuifNZvb{<U%TC;6zg;&XUPZgM9*8$ݮ o,o(fJp˟aV:d04ML{ Q}Ak+[7{&+$6)Ш%sYsOM<1TRsnJ"_z;OBM.?揱a'룲 ? +Z'8KCoj̥Ur&H\Q^eVȗ3Wc% R8p~_mMo|8K`\uܘRGFwr ADқD9aPM{Qp%驱'Rc *%/q":ϥ@ªGsM(?&u=@K#Oqh~Hy#gY<* nmrٔh)@mdh ZP}w" x6 =G^__ٛ*?/s\WMz^Iݥ_ /#B@(K4l0dA"8ҙިͬ|Pl!.ЌpYTuw40 m g-JifwTڹ}IօݡxWA=?4mPmש q.Ib}*z]IT,TnC#HH^ ",hjH^(Wh5f9稙1˩c=!&K.|yr;VglMal.Pk]Uj#D6-H87+oa0U$:^]Oye4=J0re/?v~+?Φ-qEon-" H誗MR…ØVX%Q(!Dwm)m! ̺韚O@T@?/)w0Y(t o5#VKQ}TR2 6߮]O?h=j(v5}C(ϼ bA}o na)A+=j-ýfO7~'; G`4~z 嶂%#?(j_QBT?gr8+1a,xFصO0+;ѳ$̑@$iLX*S*g@J*GӘ)kQ6Naj~ .K'(g[ kx:C;_ҬT [*}vejXԊԌܗ7ID  v֩5kNkU&`hv^~LSx(jQɿHS7TLq`z4 yy%A٨d (a`4LH;٥>^~LSx(jQɿHS7TLq`z4 yy%A٨d (a`4LH;٥>^~LSx/ukui-control-center/plugins/messages-task/about/res/manufacturers/MMC.jpg0000644000175000017500000001047113543125214025542 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1 q!AQ"2B #%!1AQa"q2BR$4%56 ?&.qW&-H&Ei{pVM|5JT%^ %Jߘh$1H U;DxjbŤ[@H$~Zn=8+H&*AwAP%r4E*DQAErY [@g8$H: BDLw~NLzễ+&FIb}\sG\dVq]"1 TA:js=sSkGۻ,~ $(zN,y:=0=W{N2CJJ Ȼ-M+J1 f绝p"X!J11ND8$[<ښ69cqn,h67B }bd`yԯ*Cyv!/_kRLGg T^P[[HޤW7U+NaaT>u{-y{fz#K2ؐ.@$H Z7YFȆ.qˬԚ:N^w herdZE=ˆ58pL,=Zvغ}8٘]ǩL b*#D>Dux0~d+g8k4эyYLzenəT w~E>K;t[s-큑`F\ m4t?517Wh\<0 )3WU :F7. Dܜo#:o!Νwnv9Gq$B$9ei<5oǹi/^[-Dg3w1%S+fTk+19RC*ku}l6qߵX}SI;#VX\,6̤̏L*AsR#oo1Z֊}.Kcr9ë*.ꛖqBU`U'UP8[4CB#c^W⣍)0\Jk}#_-nعX ռI & &/>xU$#I #m[`i:GdXR+iJI]$VH)]K~L? ۻ{"%y$)I2_g}Q9_He B_jϥgqprrꪳQ?q SAE+9`B\k nHp048puGƽ'܇ "^K{ nCL+,[&4NHZ4Jb'ՅPbyy-ᮾϸ&`yxho lagkpO=XwJԂ[R%x̝+RW *2E9&5E(K]*PC:ziS%1'0pխզe]& \5WuN]U)x9ڕBq?Q0E Z~>*qNmfe2y{7 doz"v4B& Ӌ>D҉9D8LaausnC&aeļ0W '8=SoFt@hfNӃkq9Ju"O0:\ܛ|Dǧ^ZK[&Ogf;fnj Rؼ70ݼDK~Hi4Z-o7?QU J!N *[6Jc9q ~=k=RWȓvYk_1;ShP5֖^TuD*c8ց~RmVRh}.pAl P-,;H-gc@3ec a&]QRGVx|tR`JIcyiS! O~7-n]  bb!31XFK-(:cӭv5@mv)*~i6*R5 ߖ v o_ʐ]÷D$s4I\ D) 6PQ\pxh?^MLRXkyhro)oQVMǻGi߷TH.ݢU_9j$]C[hj((]<4GJ?)y,ZM 7hBA7+H&ݣoWp*I/5 W.DQ!@h⭴H W.#%OןSukui-control-center/plugins/messages-task/about/res/manufacturers/QIMONDA.jpg0000644000175000017500000001406013543125214026214 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]      !1AQa֗q"2$4t%5uG(HXBTdeRDE&vw8x  !1AQ"2BTaqS4R%Ub3s$5#Crc ?&FBcxoDuaě̅IL8xurB;!̾;>Ct4]P0E C1K< ~ `joFwJ<3n>L=\HkvBG?Y=k.dtYut7ݡOۃM {CYS:X,i6HO$b'Y? jdy5d7ݱw _t jީdYu\mۑ7pI`{GYw:=`!#j@=v_t=k$?;#夠W@=fXu?;#˯@?'y#;$4AdtPIojz'GgڼC:H0kE 3O=b#^dPHzGp|W܏j'O~vGIGv#no.0=vПϤ.:H+0{ۇPIȐmBMa3DA4k>vwi)(*_CW3,N *bI:oȱ2.&+5;p5UBd&\TՊCqgQ%%/8HI$)N9BiYgY&`<Ӛ/Z} RR h[UQ\ uOT:뉗r\ P6llkl`~g4+?MX' .CyAȧ%l= p˪lפn҄ݧaudH/u6Eu-5SR*we+)F:hMȲ.YwL!?‘#Ճ=_;d%1\Ut1hr܅j\Jrp296P(TeY@f |]vO/U3@H gpeF\ vJ4ݴzUR=L"(Nn"|s]v+LILWrMe1p :XͻSz3;+O %`qEąuuP&^C.kr-yWM36\urZJk#9ɯK85|ze"$0 ;4h*ƲlivZ  qC?kkƽ* qOZ#f7&.r0GgoGOCw+=-]+ 2_S(HT/YUQ XÓ\eS*z%w*ؠTThNU%eE4x+Dd Ex5<3tMSt2.w:D8@B Z.h.qF ֢EQu`ٲ%i(P8Lו,Fjءz"Ȯsӄ9|YDd2R:+̎R:A&IH9's:rvpPM򙮓Lr56+6~%_#p$~ٕK g9А0@P[beYm*kv/~:I]t Ua~zte%7aY 3 K8M'JYfֺ&߲j?݉(8P45J4g;Xs|[uC\=[!*.#NZKr&5Xs ]Ncwi=5T  L" ;P׻ yɧ2*iWθ1@rXMS̨6Veg -A`=' 3KεIa??ǦKʲ 7>LJʙɷa;Or;t.ק(싋ZTE@~3kYp3?K$Ee94ydZIf5ץD^Qş%'MOs] ȝu;7`3@f "4ܰ6~(¨X-@Qty=q°H;\' }LEmHClCwSgnDjxvFVefRh rPd)gH}ީ4/O} Wo2q߇O;cUOR/(NgOQ7u~1۪8 eGx6O; 2ئv335e}-yϝGX.l WQ؃Fcl80dׯ= Ѷ-r4;ʣౘ"n\>SN)9l[w>_BW|l"N a'yoD/wc>[=UE-++Đ*U‰ʄxqіQ%e$6ƓT.}xp+s"($n-[uG|E]EWsV8N#)S<2$HE)ͦn8&ShKd.}J)#'rMH@)vc v?,tXyE1L _XE ;x&9{ ;x&9{ ;x&9{ ;x&9{ ;x&9{,Od?q8b$- }T!?ʭ2yJ@#?u~^?~9KŅ%O>۹[Ü5a8 NΐxG8m_~'EH`~?2j7j߆i&#O+dVr>G;~9zDߤ`ᧅRG9RAuvl~˧uԂѿT! =. ׬MF .mrBaS>s uioÕ B,}.#:S&~0iӧrѿTQ~γT< 9>v>TRgjm^g`=v:GZC=Bd*OmʜMMяɿ΄0$؈É7 8W4'I:-zy^׮U(;],R咱QEyXQEQEW|rפQУr!>0?*X;~Z\v]*9qrjý#gZ].裗ϓj|H񭯌OWBp[ԟ uK i5glO# [> լ>*isBwNRp{Bҽ ԒZ]^Rׄ!-1GPkl=ocQLέ?iMR 4m#Nro7~TV:ޚ=M &?`cXĒfrJG*s"jQ0fu{9lyw1́NL?\fX^jWKmcm-8?{o'򦱬mK $oׅ芣JUw!t X hB uckV+rwgQEdVO,|1\ZC,+n 1r0W/ 3K4a Gp39:ݏsz(PUSnV1U+GUIWWPЃtK-5cj3xn;1,[F>ۘHAzм&/sxbTk:#;FH?]ҭᢕJ۵bn<;ۂ:F4Iדh^}.iiws;wcSM-GN9dGgI#6>rN:a֖)Yu]}ǹYZ|~]c? * IZ N_M ;0s .20W~׺E텿h5[ -8ы smW*xU Y)X0=:m7S5JE-m7/#3.r@h(M@X.,ґIrIWqwfD^ |G|Em[MS[H.nĨd$ɐ^Y֦ܪsWjF(4 Q(\Rb(qF( (?ukui-control-center/plugins/messages-task/about/res/manufacturers/TOSHIBA.jpg0000644000175000017500000001156213543125214026221 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1! AQq2Ba"RS4FW   !1AQaq"2BR r%b34DTU ?&q_u!7A5QWAQR&T 0I~n^aJ.aK n" =hS75i4@ɯ 򨫠 )xA^ު~AuފS$PsT7CE˯0C07BJrRL4SUbHaMyTUa} oU? oE)_9*טR@R񂛡Ht`|)G)T 4mPԐj%moLO_XKVssrg(Gi 8ٰ}RpJ#- Z̯R 2F\Ӈ?gEkk??mmwEQI25نAEmGKcEt[LIߩK39Av)D[ci:;XiEQfͳs V 4diFhLvTSt7~PߌkT=B`-_3~LAXY4Q2wOs)sK`J;&DbbOލmr_0~}$.R(&<ԅZ*\DMY$(3Z5e |$~ƝmO;Ks|YܒWh)*|نTݶ>\jT]-'[É@'84G2_d$a vr?͞`ɟY]s|sBւSWq*P0v{v( |SƷLU+:+\YL'!*Tp/?Qibdq)#0:$:\RܢP9&mԕA RG%w+ z2׷X%R% +E {0(0֡AgI߿s IHy >&=t̮(=JR0 ^Hإ'8f}ߖHUNS#%1ȠSoE;pZGeI>/)n[μ~U%R`MMh@)"Cfe?'!ly'UgP'_z7%mYo Mr* aJuҐ2Mf|?hO*U Q|h|Knq&[,hQ{5G/a36,҂,JVA DA]ùu`tV;6Q@ 2[t|_lm :wAUMJX+SRJGhx7_M|=Cgs؆bGU(CHj]_svFtǒ42UN"+ʽ->)zVJ ya8z9zMV+Q"ihYbx4}ޏ8R^ @ryYVpzu}9qH9Nf R HH왱2[n=ܤ:e}w)H^q%q"6"k#zhm E <BzjZ:Ԍj)"SZ}fk6M7܌ʊ*g- G Bю3^*OQnϪ'T'AhT`Ytو;Vɷ)6g¹"X#lי#mNȒ~ZrOo7/pQV}#Lj7 avْ{l:-o&MU+k:7RZP P٥&g|*Sv6@3˜5ms*"ҘߌD*7lԝUu,&\ >S1ԝunfTj$;YR*y/d0Ȅ6 f Z>*1TjiW_u!7A5QWAQR&T 0I~n^aJ.aK n" =hS75i4@ɯ 򨫠 )xA^ު~AuފS$PsT7CE˯0C07BJrRL4SUbHaMyTUa} oU? oE)_9*טR@R񂛡Ht`|)G)T ukui-control-center/plugins/messages-task/about/res/manufacturers/LG.jpg0000644000175000017500000004537413543125214025442 0ustar fengfengJFIFHHExifMM*bj(1r2iHHAdobe Photoshop CS Windows2011:12:02 10:19:25]F&(.HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOU:i8.~KLYcc2\~M\讣w?\CU]2^kmWKoW%Gڹo(|G~}ku{~ϝHg}N*RvIcc=1r+ƫ&k @y1&~*K̾ߐϬ ecC+>+zy'$'AL\>u:> @%뵣?bwEX=\l 0nygIO:cmF;k基%zJ~;gMfwͶ0sW9׬-$潟svgť}Oōj@t躗oCN< fQa'x6_WoPiYx.7eX\K^ۍ`7v /= 5 K+e$pvgԵlEXg+X3~j:fvM.~3Xcuhfo^]oΚ׈?fC αzhy8VsjkymkWU[k`0x \dHr|<>󞹾cY?ԯzGNkj~\9nLcm/k]a@}_[|?k݄5<pg;9R\ΐ]ZA@twVՌޣ^LkX{u˝{ױs؝/K𨾢kx;wJC׾;#2+$;]>pY}mx{Oq=zn#SUM[4e"xwF] Ld::Hey8FÐ^yϩ=Sϫ*1DH[i>.$ms!_'?>1~ˁ^uëzǭA)JDDRI$I$$I)Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ Photoshop 3.08BIM%8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIM?F]g*h-7]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM ]FLJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOU:i8.~KLYcc2\~M\讣w?\CU]2^kmWKoW%Gڹo(|G~}ku{~ϝHg}N*RvIcc=1r+ƫ&k @y1&~*K̾ߐϬ ecC+>+zy'$'AL\>u:> @%뵣?bwEX=\l 0nygIO:cmF;k基%zJ~;gMfwͶ0sW9׬-$潟svgť}Oōj@t躗oCN< fQa'x6_WoPiYx.7eX\K^ۍ`7v /= 5 K+e$pvgԵlEXg+X3~j:fvM.~3Xcuhfo^]oΚ׈?fC αzhy8VsjkymkWU[k`0x \dHr|<>󞹾cY?ԯzGNkj~\9nLcm/k]a@}_[|?k݄5<pg;9R\ΐ]ZA@twVՌޣ^LkX{u˝{ױs؝/K𨾢kx;wJC׾;#2+$;]>pY}mx{Oq=zn#SUM[4e"xwF] Ld::Hey8FÐ^yϩ=Sϫ*1DH[i>.$ms!_'?>1~ˁ^uëzǭA)JDDRI$I$$I)Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIMhttp://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2011-12-02T10:19:25+08:00 2011-12-02T10:19:25+08:00 2011-12-02T10:19:25+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:aedbd568-1c8b-11e1-ae7e-db667b27342f image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@F]      u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺU߿5wE|y/u2c7WWmH"ࠪwo,e5BYL*+k1D4_PuH@ZubG$PQQY؛diͽhDw~Y1?ʸ)k25.UGh8q4}F:9ڛ=ג-Z-۪H& MT:k5^`<?T|T Q3Z玞0y6W&ExSLhXǚܠaɷnE.#*|9tdCPʶ펱ӯ{^׺uVRUt(**"RGRu#ІVVVVR{^뗿uve:f:M {Q*ߙJm̘KׂlC r%Oԡ&>{-e/qr+]+e*RQO`1}EzXK dE{ecpq(|C"Cܣ-Z2q>_YZK{5{mj @0-uJ$2,B# h3N}/c1j)!2HܡgdyWo;KXcx(:GYxq~2%@5n]ew ͯR6]Ёs~tTYܽ7!8U18`zb;?%\v/rI4c>ʪZVۦjۆIopʬ,񇍔_:s׷{OoܛۇIѽ5E"'J:Q鎾c]6m+kU۳ CƗ+/u{qdL Sq`޷}i{es,Ɣߛ{ߛdÎoɈj)%xhq:jXY*upsMQ%QQ4[M=EDOrdNF#@jg2:ѷXO v2!;[m*h2;';MouKF}rZx`=`tg_t[wd;%x:vɛx|dbn j\=÷ E,5PG x^"oqkZ׽Z: d_ 3m=7^&N]e!7;3lc:(C\y]j3#utsy'1]˷/R%<0z9(y*9;rU#hhTmʈ.}t!1_ǵq SblR$MuLk5Mz ?v|ZZH)i"ryiI;i^VX۟v~oǹ{lS~o]-պ{rTn:Ng(<$lf˦Jd5M"6=6KV@^=Js͋jMoZIVBl*[c{Sv_Y}-鍿״kwf{w5.KwoM*谸RJLP2,|Eu :9{{WGl̻IkoEm ĞS)EQjH'[+vOPਦ?QHE]U r+i0#61- .(f5E>=o# Ro o1x:lun= 0A6^}T=j >'x|gH W?nي]ۏ'ZrI_z=mzWw~( E'ۙ fW(,y)J$I +>®!T$=׿xuPbeDzHW/Av1*1uU)GWu3h(SGVHuXفoo_Ͽv>x}7m~_W{O__%_~O7 ZMDZ:CO7v"~&[D7W]Hs߶^rN溯VVEnjm^ڍ?+2lȼ5*ASs^{m r o\QӼtF IsFlCoYU|{CW%5vݙi)7j<Ϙ`z頎GZjhc7d%f XO<21DDp*M] :7<׺u{{^׺uߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ukui-control-center/plugins/messages-task/about/res/manufacturers/KINGSPEC.jpg0000644000175000017500000001275013543125214026333 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1!AQq a"2B$%U&V#DT5  !1AQaq"2BR#3$4brT%&' ?M1%M~l9`aM<0MGс&^l4?݆ yv`L>~wPPr  PPr`GF^I3ɯ̀0G1 ^) 0:C͆u. /V ]{2\ ]`w J 3JPFF˫+5@y7)xq]YEq]1ڃzb.M5iTS}bQsT嗴Hjyz ģv#6X,kּx^6Po^Kkj+Zܽ`;!XU9NdQ#TI'1J2mEPqN)0"E ?zxz")'cc-p\{ B=l#\qaP=(z#M.ߗ .$ξ{de8W ۋ$F? gt֍5̩UĊ)P>!G;h(8tڴ**x092Z~O< 7|M&bi3 ;s1.Q\da}4^U U#7A"|Uz ' |9n-w$8d$J1S:ocq9LZFj%*hSPdTP v=cMg7D ek9^.eʋwƂ@])Ǭr{rVƷG(sU*RPk"KlMaٍMe\}kfN'Sb#9QwyoN4e(uQ U"B Z;x )bj&Rnd>^^kkP:=ɪ@sP޼g*- LN}](mb sҧ~'X-mm>ZDpV̙ysH$xuϷ""fr>a#Qõ>/ 4ϡ&bcF 'VWG)iEUGf!ϊ[t}&'3S ^AL:;c>Ux\|SkɄ4L*t~߬"ŵB'EBe7/$ȹW.=/b=!Jt֊A'궭YynGe\5uؼbe(u;nLUR%! 1{suB/+VY[ 0'yVcPBԏ7*@LI=#" HvnUbQׇzXjꕶ= } H`}Az'gGrO7M. de+dPbQJ⥧( KQ4PW\e e LLQvդbJۼLd|?fUNEN6Yn-s4lalc+ 13H ~~ЏAZܦ 4BeN ^z{cZUlvC21]N"C$ZS{׎ x +opV s'Eyl_2~+)n-RS.Yt ۳;zrqxzNg>nvl! Wpt eb V]T <~^*S\W]G76GrH2:9v۾̓v֤$ڕ͕x "<ck˻}*+>qjrNaѪthAyƺn{6oՕ mojE@ 9aQZ@z%W@C[V)[i-Q<2f⟼''bKi֯ItGNPebxù.חGa X-j-^(o9Obi`eDW]כ Y7JZ;;d1X]K+}M#YI3¹ "Be@&R=Wcd?eZdyS/HWTɯr5Ԛ*JqHC0 JVEuQxE4"RÈkxrtY捾LB{u@,s11!8ֽ $am[S> ?PKR^0817Mm?)%;%J`p*J/N9͜вZG;=Z Lŏp`fkql2T:Q,K,/+\%?ǏЬ{zϊZtA$T.:!xYj =AE[T"W},g~* )өx?fĢ=;+jdzjĩpO(^%-UXx:)ծ~OE`.T~uw#,i>w6% Jk=FH "#N}J^+qZiiS-O)N\h\eN|w[|SWf<%4e1 ҭa3) Cčv7/}mw# 8br۷hw0kXǢFlmMid[/zt=9>~~s1^c~qÉ?WO uW) JbŅ;TFyI:ϥ݀`VUi[ZΤPN#*Qw +3I,JW E塰o#%Ii Idq k$s|Y(|RHl04UBl詰߆r JĬ9m]$>;1:X"89ͽ9n=_M&za$Vg"%j\qiV5L; $bq@䀠Jn`jMݖn^-+pP$*V2! [Ls^1v.zA\ 6yt:0"x`(v+ܥ#¹eZԘCpG%m㊉7-7=a*K$ߴZ Ϳf1Oi Yi|>%{od}gSh3=E-Hs5Q/mLF@Zh\08->CǕfSmK‚jgYPTH q*Wݼqq;R!Gd)!Ta2-=ܽZ9b7#8MܭY+ֺ+ d*Lu[ A7N!VnvmRݸ"\0e0vJB\enS =IxN  qXKi$4eɓUTmJC"޳y ]z'4Q:xSDžH:TZl&3FvBG/Uٽr}N.ʚhY.ОtM$VC<뉹9Z9bghydk٣OqpE[sTnpGiTry"`vkT~1Zj+fT"RU.xQ֫KLUN3 s Cӊ?׃"G+Fؠ0i%$/~ْ~[T8τ4ںQwxnJѕbB TvVĹBS}8>r.G'̨aDL첔R},0`\dW:y1u:$7+TB)Ö}PgR_gٌb<>}+i)0D v [ѺA%  cD:S{Rtk?J*"`p&c]W-3D]"&0rk` C׻ lj> akC`f >w&PPu - `u(`4„2V<̼C |t 芴c>0 s5›(x`<0M|h P}!a׼0#(!0a 0 = {-`VLgF_`b&Se Q`t a]2_#e5х?ukui-control-center/plugins/messages-task/about/res/manufacturers/IBM.jpg0000644000175000017500000001521513543125214025536 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 !AQq2Ba"b#C$4d'  !1AQaq"2B$Rbr4U#T%3CtE& ?M1qɯ0G1^%eQ`t `^l /#N]{0  0 r`G|-`hI3# v!4s' `^l / 1J`P0$(0Z -c9Dr30VRq)j%-ZcG Տ@ ȏ1O(V0Gk4`}nE-vmHKVnMs<C]T-gH BD(MىLMb)Ls9ODՔwV L {η AFb|pህM#kX|_{7<\Mb"r3}ܴԙnDf=-<,.LPA-<^R'Ԫ8L^q{Mi=˵7Ȟq#G.d9ׅQJ}zxǣ^=II2.A__{toPzp,+5/#?ǿun}6ܷX7 M>?T*`x-TEDԦ)(1IuJGq  }WzEXl_z2"y1|bl.:մjRɣoSWq^in ^Xc: {0{kq΅iJѦu"[C{Ѵij0T(;Hk̞2+XV9(J  r=L9c{ܽ HGz]+]m^ɶqSV0&K]>R"1}tU zڽS3S2%9%1qID£yr%JerɖDuß|F#RwFvFnӷ56Ne*W+UPHcÑC)fOp:q'(7%BSyQU,[HǦ9w*\Sn;$ :-+x=׋0On7{)!*7BRZj~*0k"aZ6R.FfcIC:e OK+h1_nNG]4fk-aPHŽpNAb!i䖝ZI4S zDp)qЗ)[m.d`pvHFѩd%kW2qW;:1]x#DƕR8}L<6YcTۻ]FVK4:MI"ۍN}'!A6(ScVE;19OƛۤJwFlN JPӪ-B9b5ݺW\I3âY9c9".eDd(f%IH#!'\qH,)hLn# jz.S+t`3"Z^bZD YsT|iRVoKĶJJ@'fX h/,٧zmo6 nv̆[8y۝aN̤XVTw h80T`@棿BܵQމ3YLfz5u7%>k˘(vDw% vmj?}obnq$323])lgTa/M:tqAG(cԶmWEaBxLT2H1 6昺eE]t%=s28Sg\*?QF6d?gݎD}6W}Uʻ-hV5lvKsXTͮeM+D̪L[6d&J  :UBiflK4 33Rqs>ޮВUGt$]$ x,KAm*ӧV-tE;iD^Jv/E9Uu)Z:m3YMkO.cD>Fl]A7?gJ -ҧY(wKR>!rtjTƨ5Y pIgtmi-Re-N%Á4w&_4Uрako9U45whRTw6JFs5G GkLy٪:*nBt2u&GmS&qzG VUYk^Rg cK;ZK!=QP{l/Bc0)%H>e6AG*: Q||iN|jBpKPGQ a6\6ths >]J8t&c8e{ŊƛrD}Ƒ҉C"@԰ik[ L&*@Qfݧ 7\'&IF1i^#rs&H$8jt#3pmHخW{,ALR+CyVtHd {3nmO+E!XmuwFX^J evlBmмsT:I 'js99J'7 =)j#tG)v%fjZ[`Ԧ0 7Ԇ0LȘP;|x֯ږ޹&@IBx 3I9;3OQI?nn&.^751xh-yIRТ0/ x31uKIHŚLza15rfRJL gl_m;TVlJʆ~{6T)+rvUhxRB*GAC/zO*j8gdXu+ , x,{b?1{N_~Oţ/*MmnzIE C&N1IKE֛zE+)9T̠lr6%vP (˾&y#r[tۥjE29#8/GDgqZe xUi@䕒W쩿ݱǶH)\QKu&5.N5hҧ8%Ì\E3m7?YM0H1+ʫVy.&X<7foWu_ݱ_w>ƍTFw[#{kxj?ѽ_;H䝕)k[ t%ʌ/4ixdKzE2 ˓`(S1)qa+ے]oSN} Cgzbkoki~sOҹvEu^r\]ӚҺƕL̗zj*i#gDDH!(dP?Od}m iՎ-[JfOI:cI^ܸ}uIOL;>Z,l2m^\:4?HcqmȔs:uT+~ygxWb񒪟Ww`l|IOg5&%^|;rԨ-Qw!)UEʡHhJjX@Gb4wV[xL>1OkG(Ʒæw rnŧs_"JБ3}&6LfHҏ&aLf]VT592坳qU}R?sHv8 ]"X(akEZM1'&M{<MGՁ&^4?т yy&H$w0PQ9u CX 0:ç( 4„2ˠzف,Iukui-control-center/plugins/messages-task/about/res/manufacturers/WINBOND.jpg0000644000175000017500000000737713543125214026241 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1AQq2!B$# 3%1A!QaBq2"#$4DRr5' ?$d\R8OtG` 9+H$tE+R 0$`g շE utIS^喒Q 'q ZA&=PrVIWa˚ WI|!%rxA$3H9n (  #ڒӿ4-$9`rOH =Lz H,×4$tCJ0HfsVQ+AG%O&i{ZIFr*d*+zukרZThRZSS(C~)Q`wT=h>lL9D4Wt#ս YAEt)*Yu0- 0Ե n6@BiX/z=p;Crҳ;4.X 9I#\4W."V'ˢ37W;95mzii5r|Qm0E.i߭(4jqX yiTRƫ^Bsm՚h459q]V>nשtm}C@olߗ4_0orrxA$3H9n ( n ?z'qkԸOOۉ?n5Yv'dmǖ^'r[4vWqwet=k|XO+Bh(4=ᦝR4[ޠr(֞4R_t].e߫ HEpPYUVQ; a݄K6U2 mm>ZZrR] Wvܖ[41ø4FvpMڀXѨb4ƌ \\h*8-2̹e=og,\G pd‡*\ ,3dު)mhiه+;DK;&j3WO5wqT\øon­ƳdlSopX;ix+<Wo7;65a[bGv @MRZ5FxsՖ Bg7qA^ն5"k[pǼm?QE3axv"{n۳OY\kkŸ_ ܞGy;[lS'{EwKPb RZ9%ƅ#UuN~N͍/X+0r3ŊkʬN>㦤iworKO0ll ׫仆ۄ)85?Wo/3~ho7Ӭ[ %<;bFv,f布ƹslu5NG=Nq.vCEh/'>Qp|U=nM|8j1^]J9sA*I/7D8$Y#i5m %AdA{RTwfeg,I@)BA'#VIT|")rU_0opI\F jۂ@J"r:D/rI(X\R8OtG` 9+H$tE+R 0$`g շE utIS^喒Q 'q ZA&=PrVIWa˚ WI|!%rxA$3H9n (  #ڒӿ4ukui-control-center/plugins/messages-task/about/res/manufacturers/ATI.jpg0000644000175000017500000001573513543125214025553 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]       !1  AQq8a2$XxJ"b#3Dd%5&7(HhBCs4fvw)9i* !1Aa Q"2qBb#5Uu6v7(3c$4T8H)EWRSstV'ghI ?|ŷw^՜.;ZrhJUKٱ*4AmѬ&8E9f!.l 4مx )cƔ+dT GzwDXƼ ,f1ʻ}N:NJVnM a3u5g!%4,10;M#o6y%G8|] _$C&14I|X>-Iﷰ`7@C$Ciz :DK~o`pGlyN})}SxwW~<D/s0r3xw;&0ΰcK<|\}>xM"αr>.{}S?b;M#_6yr (Ae>;S?/<9hAe?JM&s/<9hc >~2wq 1;A_u'Pro廣zRWg'an~=`wL\_ YTf{l2F{mMߗ\jW^{DE Y}L :#׌F;tu1iRl7N(0Zc&ўzwajW^{DE MG+̂g!s:ЛM(()ʖ*TauHiCK=> %-'xw;a5qNt;cCh%JEJ 2l^ml6 kI5љwBpJpK*eLTLgj5'&uMTTՆ22Ж3M̥)S:c;L rfi:&]+{ߘod3eO&4| ?ʼ<5/TV,1X\FXʗdCmK7zW-rmF+璭l*nk|nk?~D,TE$^r$Tu&khQ ݡn|thݛPM[izLpUҟ BYNZlX(m֏Yg*rh* Uo5}ighmۻo Օ`~y8xe< n܅HtǦPԛ9=է4Wtdҕu^4hMZ 郭<٦[3MHz '{iٟm9np~R)(SvѹPIQHfhJ;6T3Kӟ\L}]i$ܺJy'c+*[983nL~LP5<iWN)ioWNns"DRG 3f9ZY C=RFȑ=%.Njmg[FYPtDm'q_/%Lؕb]2S V-7V=͕1i՚戾rݤ;nL,B^Kei$֡*`ʹ@'@ .Ў0OVeܹ^Ia8d\]bʓUu/(Ԅ]ּy9fтWZkLmRkee1V Oh9BLḛ;.@'[9Kz[ S̿s=q{5|Uŧ9p\ ̬SUfZf8.pvUƶR9tF 5LyĒI]:Dfc&'bJҪUk_`s.vrK#0Fϙ|/ᨺLԥunoW̥f`G斠POppAoN9#Av [Nj U` Y$rHQϑO(2^#,eQfM3uGFʂ7T T(i\SI ,}ҵdZ9C +@YUڂu$+fg)>gy;O>ljn[Sj/ mTksJML锲J@$hP14ӈqf ,e|Ս8Mk2'ad%Kvbm|K^4"+nTCu/Pp^,L2@e 9@a⊩e'ժʬU-gD{r8 Sw8ukui-control-center/plugins/messages-task/about/res/manufacturers/REALTEK.jpg0000644000175000017500000001351513543125214026217 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1 !Aq"BQ2#$4%a!1AQaq"B3$2R5r4DE&6 ?<5mqc@X0N=ZUI4:6Yq5f ==Zљ/#&&9xIjV2f!&9x;4#͉4b4ZN| }fs _a^b}ӌTXwdqM @/s{6pӝ)QJnetu$kDk"{Kݠw|iQ[kЮXsr9Vw2iBu(w W2zsQ~.,K=9 rCǮKkhzeey#6 AU٧-ݔ+rqCխImpui16Osŋc ߢw)1Q)Bq@WN&Wknw7W wCsclnz{σU9`g0 ؤytlFP Z8&D&oB4#f/:DCip߽zW{dDZ+S#+CoVg75:xUtjStk@=VO!%S3?6Eְyщ4b4ZN| }fbP\j#UHQ=!6Y{w[y$_Z9~ĶOlmVfy<ֹ@r"wfu'VX  }H\,- \A!2&q% ![L-a`ԯ3oD [|2 DcQLZNqHZ+D b8ejOoke(2@L :wGK՗K#)hnCwu=Ym5aeM[q2О3]2E:uH}ۘtQxw*c+?*7Us>~KpOOMQ'q6uJ9E c6r>wPmdi%de~G,%_MJۂ J=}bi.}8J<pc(AoXtߵO/]1 E`dk&sPͫ$DPwU ?*f(o Ydb a52+d?ے݀pkj$/fy1>^IOc@X0N=ZUIBfp'ˡ$J$ w9iYY:ֱ,9qǤ5rCv2۟#HZ5U8L{çi݄)֚GR*N [ ߻s#/mЄZ 8NdHX:lv*!^zE6X#GhJ'\o=Gf/vkJԮYK:mi#-rk-z{0ڧSV3>GɣW1 c oRzkeDvԶTph@^֑$PԁB#Cc3{4$9@[C41cbk+sÝue sW/Rz1h})pi1ӎ6qSTxi3ķ9v7莚:>p!PfMNt[\rF.p#7h([d~TGA[1 Tm Z Eglt 7xՒw_?uQ~?\YulmQ %pS+5(,u:*}CWk›j~>[|-o,Hm 4i<s6I^bb}= -X3'h nY$*94 ᒗkdekpƵ% e5I."(7xǻJZnMj*Un-Y4 *p[Rv%,0[J_mIYҾJ \;ԁ7a3eu<6 WtJ Z^<-H?E-WUtM6r{Ȃk+XYմi2R7xGck6Xm21(ʩZt˄7* &YqJkb53J<\DCǹO/wUW_A斗ңE\VxFo~{\yFb}= -X3(nG}y"qc/&(%l7/yeͷt fݩVEqH7"e ~RV2k͗2 yh( =ɢ#qh~jϱ񞊪H7UzG4;{vv zĉc m [yrN#F"XEփ5^T آ#ۦIZ  o@&Dz@-BsжzRtqDzeQ>.qt7.Ny|Ι.}-`f_.[ y  *l3 8|D{sbjA[͔V"di~,V \ q1I^O؍n P.rGQDIk[.|Z4>!O41"RzGPN-]IaԌKG KP_Dww`wP>duu,ǭ޺t/Jk>T-t6)'max;5u'Ջi8i0,rqh oN x`erI]FifBhkB /K_H|*?$ݭK$J1q{q6l\J; ԤL?}g 5'OZ6`Cա-2bcXhDF p幻+p2ѭ~1ҥJWƶ*R;kQIoZ=NiҒkCNq_4&k} %c{B<ؘO_KV/sEݠ,Fa'*f },8~g l̗_fzB$5fCf3IzZ{ukui-control-center/plugins/messages-task/about/res/manufacturers/SMP.jpg0000644000175000017500000004103113543125214025561 0ustar fengfengJFIFHHExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:03:05 13:41:08]F&(.HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TB9X%.$ ԕ$bg/bg!&d 5K혟8z\CUɒAf'jޗ1?Wpp=$O?/bqT{&I 8pk,cxT"Uu!=K(Mݮ.__{ qq?*8,@]\4d|Qk:s)% 7bVm,j]/;:]hua+Z'}%Jh}Wmߜ B:J2]%``w;`  K꩜t<"r_L1vQ88joWqӇOYY{dƥC+LnQFw8btQ/wڟ5Rf;'8*CK{wz?kCf}b>b8]rFAVd?UP܎},uI.YDhEσS FٟoM̺:HSl-^\ѥg,]B;mh7 9]d0 ja⢎\q ~zO'鼹5cag`9ǀ;?Q~UDzNkgEuvi8L.]$mU>UU :MyH#MqlMllDpFQ0#LqEAz^z{i4Px #RY{kBX oS WvUMJR<2"'"^5^Cdwڟ5Rf;'8*CK{wz?kCf}b>b8]rFAVd?UP܎},uI.YDhEσS FٟoM̺:HSl-^\ѥg,]B;mh7 9]d0 ja⢎\q ~zO'鼹5cag`9ǀ;?Q~UDzNkgEuvi8L.]$mU>UU :MyH#MqlMllDpFQ0#LqEAz^z{i4Px #RY{kBX oS WvUMJR<2"'"^5^Cd 1 93 70 1 72/1 72/1 2 2012-03-05T13:41:08+08:00 2012-03-05T13:41:08+08:00 2012-03-05T13:41:08+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:909f7134-6685-11e1-91d2-fc4f58cca079 image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثWN*}SMGd{UԐdPAAYp忥lF/ǽxsK__돋=/d1?>,{׀;-^WA#ǽxsK_O돋=/d1?>,{׀;-^ܾGOA71I#tDubi@p&S6/N*2|ǪR`nI.vWSrʿ]*=Շ宷qn\K jZƛfN= lh!u!zd r8&גC6Qxa5Ivnia%ޡ mp);nɖ0 [ c1~s3͎,џEuMm&{`!_y6fJz oDq ݰC̗< *@( jxTt4Љ/.M&%:/d΍ԿN*2G HaWW3ʶ;Q=ɶHD2Ȩt5?= Yy_۫Gk 8xTÓ\yXnR^4IdĢ!AbaJ ٓ fOcM[T5? rj:jʲ|?*(6r'S#.#*0Fjz.tTܧEp5sj q+k^guo`$5ÛPrhńCWRe?./d΍ԿN*]_Ujש>L%9cV%3e99(ԸbOg^Pq?{w(Ըx! AdobedF]    1 !AqB Q"2aRwb#4%&89 !1AQaBq"2r4RbD3%5eu67 ?L$\ cxH&|":R BA3쀏u .R %dCrer!EɆ) - 2\PvBʞ?XE@?t!Lo τG\A3\H&|0 Q$PqnL\(0 !qE$Q+ Q֙S݋(rg) H&c )ϗ=Ԃ!J8$=X\ܮ^'2 XPD*?|Sv-;è-&o}ѤzZްa+kZ~\ɗ99%þ+Q`RTBa=kۭh %܍#CFifu- VRB$A[,rPt)z>pAn$gn_Wvc{Sۿpk'ňnX;:vmܕȝSZҌyor!e>|j~״4`0EaKLiL.sot5 ;٨5Xc''@F)BZ)É,;CBk.j6Y׫S;؅Ę_D. jtJnxouYZE>:.'KOZ6! ~w*U {\ӆ ي78ʀ,lD=*5*J`04޿=F:쳩ワ_m UIt?5J͖00,s 1+8o!kj@':yLɪ6Fm9?Upj<!ެ#L4~m^#=inZlqu4+Z:[+Jk]1n dJ 1if﵋2N3.9ɒa@ aE"i\%tZ9317!v+~İ•"W"?:`*\N>=ItEdY96b@&IcdV&^9ULWW.A+{!ąJ;0Q;Zȩ9?QڮviS,دxU]]v]pJUw5f ֝!0 G gGuc|)p3vD6 {|<~v-/17] 󅊙Ҽ=hhkp.EFO%,(UB\G k@p.&/mK*T KT̋m#hnm lv^@NW-4[mG}cT{=Qojhd:U4 %VJ4{je}|%D)ScE,y:^lH#Iy]+V/;UЁ+3փa_(}G#38੒/7vkČ=b3<ݗAwI. !jF{lIֳ LZ1h8kyl9GO2@y!c~E˟^xu:Vu PvCU<<~1MشUT-GsmS[\ZKSg)RaLP]8d8+Ggs+9GHZL#.al AhEOR4Z:[wjʦC::($j|G08wDCx%[0i@8!wbI2R:F倷> MDM3Jj"d+/z|wr Lu@^R r(_8@tabeb͏Tpxc9a !ے(_r0udqxQtbU|<~ˊnŋI^T 3BLDuȤ1gAs]KȆψB R[r@eArri<<~1Mرi2ʁW&~B f=P"L{ #H.aˢI~ܙ\Qra@BnH (.W.A2&)ukui-control-center/plugins/messages-task/about/res/manufacturers/VIA.jpg0000644000175000017500000001511113543125214025541 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 !QqB$A"2%՗Xa34& !1AQa"q2B$R4Vb%rt ?y8jJ#.N?vDN=N'hxCC CИ~I0wPxi8 i zա\)4{' gF# ǻIC>x |hy} /V /Ѝ XNZe1b)@8&aۤFft' |q}.ʌSy~/?vd,ުq9v6]#"[; /fVFe SmGUr(0"DsI@ۘ7EYBYnQ/hb߭nbWD&S"~r1}֓uOVUL_"uqKnab{"mbɍP3$@Ѝm$ht5C˰--?yPm=4W֊:HSp_sIiMx)gis\6tUTcC^/2FcB^7"g%FC3gr7Vjm֯+ۜ)*VeȶDޣ65 PAH S|Aqia$ 9ƪ2f`4o*cT5E ;SvNC+M:~@VHSRy>T)l Il}u0 vΣX™=$2[3sHR!O|D/6K2נ_igG?۷y9b2?!1c'ٍE˸7&|\雬%1eqyq4Q%P .5Zr3 rmpE%Ե7ZVO>X?DO I:-٪.՗ֺZ`j(]Vb,o6EVWl۹y=c; [Yuw\@XF-gi Vf %wcp= `Bevn&(R]*iB)L ""J"bi7W޺!-jh 'Š !?EtHTQdq퀓k>4nWkkH*@VޔU B, p}:=6\]RdIj,^Zn~%}Vԫ/1Pe *fDRWP|]Ԋq mq#ڷ$f(d3I"2DH[&;20[(z; 7sK_V%S۪ՓĒ7-ϝ5VWCD<4N 2p5:XF0"{r7Nᾪ!\jU[f|EPbTX`55z],Ca:qI:rHɹeӽk/ڬtqOqUZ/t50WoiH|Rx>DjTՓ$9BdԊ?f~3{[]MiDD;D rٖتq9]2##~D&;e;!\T>ASVܳmA}+"׫vOQ* ҬH9C(tMn)|:J f:ԧ+ZZQdLQeMAc;iJ`(^iإސGG}[c 9]ITTRCJ(@(zܺL0V44J@inD%J{!Vs̋[ZV!/OIDQı(o) Go&Nn}Gu]_qJM?)܉[Vp݇d(;S*@!0bc@0G!36 "'Q^P:Ze),-MJJp@bdm):v@)5B`h-W'C}PXp§buTu=Zֵ-0D9HR;bg5:}7Zr6⛘-bYRNvRx3Gjis7yo1bbMq|u[l|I%3c-LE8-+j"$FJ_R^|RNTu3SEv@YUZT (Ƈ\ sޜTHau6)ol^Vλ+AE4ܥGN ?8/N]W{h = SS촉qΜsҸ%h];)De+>"yJJ܋,ZLrKJ&AtD7h6?ڻ3jQR?b6I.B-wJ=. ೬Q) [T;Ѭ{V *?+,iRg4S[M/>,{?2m--Spn}D:R \ KApwlVWtۋX7>_k[4DKiByc^Tdl⑹|BaflNO4aEp~@,~5p50[EŨ+͒DKV^7IA2:96®y# ( X0<.ګK)DB{ c~vzt`Q#4сD#bWwiXB+@uYfT 3LΝ^q݂GYtjskL>[|֎t]x\XӸ-ڱ##AE 0!ye ax:`HPAiآ4< ?Ʋީ-T G!N \Q:4nQIR5(e*Hڸ jf!Tz݋Ht=:~Lqg- UJ?LY FAXm 5ȧ4jVZW0k\Wku:>TnZ-->x ~rJ#5 sGdUݶNH5rP7vԒFG- ӡPG(&Y>m" 2 ąJ.(EC[яI(W*FvcbFSR(N1w$wKcK7lW|Ki9&f#7XK\`lY+dss *uRjf# Vk$HTE՘d;A⠖h$z'Kʤo.N %#aקRsԑ#%x8% ax:ҳs"cېG@CU \eL@yPGC.'&<el3pܓW4-mvLir4&*P=@@!ɦG*B9ΣU9y=a\ucshl2ZM.tma.K7X*@ yÎ^6ZƻFi5 S>@gR5hGSZw[s%oRIYӧ7ZjLcE"R{^kIYрarq qvA8C'/6_fKդtǼ4#H! v (CH\Ow٥ i8k:0 .N?vDN=N'hxCC CИ~I0wPxi8 i zա\)4{ukui-control-center/plugins/messages-task/about/res/manufacturers/SONIX.jpg0000644000175000017500000001227513543125214026032 0ustar fengfengJFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC  !"$"$CF]"1!1"AQqRa#23-!1AQaq2R ?t(JR(JR(JRnuSH) DI}ٮLhp'W yyy5wWޖnuxnQ",cm(gn *"wAVIHjbR2HQi won-fpۇ_{2 KW==Nh.o<=·#VZu~gPȄXO )98Vg-.:SQ恲4OsajCgJYRe /ɳv8quzK30h'69U0ӃwttfE~#uR{cQ +GZ-m7#a27%Dei;ꖘB+ȴ猎A֖#ߓ!Q=uCnq~䚺A\0ja~UuIڬy0nlMm/+Zx tk=2/eŸS iRq$z]<}վnR{c<15#Cj[',1vy*BUwA$V5>;nugoF?>XhX$;m4p{W~ҖK=j\7˩Zqk;޵i (r' Q+q9)#FMr9@FvpSGEDXܮ7m/ua[a-{j;I{v:mʙu $WU]{lv3m + s 9S8з b-iCZQ|#KFض({u9'fʃLϋ9@ fκ]v[%]4:T1=c:ˡ-mG)6{Qb i^# %;qssfjXVEn"HS Uҵ{׹mC"_=tE iG!}qViG%u651[Dt>6"ͶCs.$:džII9\wR `-F"2MSa' !]WtmEvI IKVϽ\Qd&Zq\c?Edn!8T0`pTkqSHr-EA/nse=kvnOjma`Y.,[6DgR )WVq+aJ4MGFsѬRLG SR[FIKHpVy*,T"psAӺ~2W+Hc!26+'ʷ*+iN}וзPPrJVNHiy[VM H1[s&/kENrqv8ߊe y% xDm° sV]& HqB<%̡R %D탌dLS_ek[ekR샕2 n>]))JT)JQ)JQ)JQukui-control-center/plugins/messages-task/about/res/manufacturers/LOGITECH.jpg0000644000175000017500000001227213543125214026325 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1! qBA2Qa$Rb#3D%v8!1AQ"aq24$DB3st%5 ?NQơH'^GQ G٥73Ƿ;WfOl/ȶuUn&=#ē]yNw *}Cp^`c."fpH"zg7Eڣm-UI`5"2)\EЯBD Ģq0D;)'Ut٣Fi.Oq= Jݤ4[2Úh㌑nq3ȝ'g+ LR&=YԷ^\=F3HX{Wp殕w=>No-h."8!7%1NR) Sh D@@,WP(:j((^vwD{Jt@)BNڎ+:9|NO$g^FGd-\"R,7'؜p9[.MvEYʕ6`;3΋UzӬ\<&pA>j.s1 S~u-f쨓ITLx`ڏ$c( Ɨ:i/;Ni} "o-t\|R0&2 L=KQzѵv |r/ F,c0k0"\u #-X}jz]۟n!Elr/Ԛ.. 2`3LjhRpZYꍍIf'/ c:\FN6l !X- -zS;్.h6rנ5*ŎQx˝3aW%Nׅ9Yqnbayp=o׷swW݊:~-vsGc,ۋpLj#] "7 55G/@J;"| LSx%i:jQơH'^GQVz!ޭ%o)W" \a,4 B>,G `Conn[y P~;:ﹾpFu}aAYH-EXMB,Omx%3ZxDP}nL;xOjpscnXn{lzH1[?kg G.dcnEmdC#L>^ ErJ$ 63 GB„:I$Q~.zpWsEvaZ.GǤ6TqNGfRli+,"܈T>7~錵cXT n(A4SO+L8+ahPr'$p*A^YV9׫V(˱{f"9~Ŝ!Y^V :q2GDͨ:-̔m . 2dw.p%@J(^vwD{Jt@)BNڎ+W>)\Lԋx=(DQ!ld"[ݼ:A|ַ&ӯa OWW(W1+ºD9㔮=f`aj([<,Ƚv:F>B&8S>xܻgj^82KʉL֡M7+#>H|nlT%Y)ʧSh_Mz5`tۦ g @`0DjzҥJi2YdlFmJҡ-8ATJ pK݊ͺwV ekVXWs^:Q*Z5Vں["մ<$qF2 _\g#,q&'"wi%KStM=T.qW+Xt%b! Qf1o_$t@Q(L51MʁG'_HS {DV_pyY^r""Oѹ/T |"ZYրd hY3gQC%f1~rrxXk :Q/$d䘘Iq\zU .fԱ:]kI|6=D Jb8R9o^}-6~೽cK}#jI/ĢDJҰdd9X>oPpcZG@Q>\V7jo_i{HV] }q֋FYpyZ_p+}GoP_OYPUQNqiqqAyCLDZ䁏Q"e0 [RJO1el!ZNޅmvJխZ/~#n crH\J"&vH1BlM=Ҏȟ/S ZNZN5Qs<~ESV9 6U8Q̤ر\fR =XCfhUs`6(b`@@ Bb"(RI}"O(4J%rdRLD[H#/ PFT#.oH\mkoqL<خ̓aDD;'pnslfc}h"u$Z^)5yP)=Z{ Kϩ lS͆`n#fLЊۑcy9~͇8VF&eby9FcD=rBmvnpIfDSNDL`m(U_rVkDgQ2K֑ Wv5\$e[qun~8I*Vy$̪4@jM^G[n]5~[;E@nJ+ zDTx`+Vt)?ns<;tJ f$HҦwuێ \ wԘr7ѧÇA!%}ᣊ> ZNru1R ׻QEH'QipE_yy{x>&*az4 )%A4L^L1RK-5G/@J;"| LSx/ukui-control-center/plugins/messages-task/about/res/manufacturers/ASINT.jpg0000644000175000017500000004200513543125214026002 0ustar fengfengJFIFHHExifMM*bj(1r2iHHAdobe Photoshop CS Windows2011:12:21 09:59:00]F&(.RHHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOTY_Y=ƍϵͳ4@$7*&cg9=I*=sAkϨ{nեmQS {CZl/q.sx>g2LgQ'tNIhgVO*8#/I#Q] #Q^_~1ŧVHk>Ncl?VS0s}'NO{Z,.d{6Viĉt5Qt= E>}X 0kƀ\ NJQgO~]YuuKCkQqrkū*cldaseExxu~+޵t$r(~NUľǐց%W#W^FC*} Cn.;X~i%?U_>c5>Mn.tUF7hΑ_pv0;Gݺߠߡ z-yw<.=WDΧΫw2[knl?}iϫ=S'5S q`Zݯ_c|}.8YG7icBR Zd:>$Kx+ %jkyd$6m1HMf8yt"s6QY[%jYkD4<I?Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ @Photoshop 3.08BIM%8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIMGF] AtherosQSa]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM n]FLRJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOTY_Y=ƍϵͳ4@$7*&cg9=I*=sAkϨ{nեmQS {CZl/q.sx>g2LgQ'tNIhgVO*8#/I#Q] #Q^_~1ŧVHk>Ncl?VS0s}'NO{Z,.d{6Viĉt5Qt= E>}X 0kƀ\ NJQgO~]YuuKCkQqrkū*cldaseExxu~+޵t$r(~NUľǐց%W#W^FC*} Cn.;X~i%?U_>c5>Mn.tUF7hΑ_pv0;Gݺߠߡ z-yw<.=WDΧΫw2[knl?}iϫ=S'5S q`Zݯ_c|}.8YG7icBR Zd:>$Kx+ %jkyd$6m1HMf8yt"s6QY[%jYkD4<I?Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIMhttp://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2011-12-21T09:59:00+08:00 2011-12-21T09:59:00+08:00 2011-12-21T09:59:00+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:d94422a9-2b73-11e1-9c1d-e060394baa3b image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثWN*UثWb]v*UثWN*UߙD|Yգ}v7')*8x+-]y/Y|#d5{;K;i.K{hTwfj2 4fVnY Dd#C^<;ѺƿCh$ª՘I"Ƞ4 2vb]v*N*ſ3lt!~DW=={\)QJ~.#6y> q$z:.=ռ̶$S,U80a9e?Flx$EjVi[rn(eއ!O8X'!H46]چsf  ҬaF&F4\кOk6ޕ[E*W3"N*Ng -̋M-? .j2~7E8_'z>jv/.=֖ & KCn@FFC œIwG$xC$t:i嗛#tI/YPx]G j9-d֜ HpI'-jֿ3/DW̗m#ͦj;#8ErxG&:hLDk!7r7YU<ͩb$(dIyIUV9ggR1H= $h^eb/ !+Py(zGrI3ᅳ^kɗyV֮Hd!gc,x%m58yvk;iV, y'}35zT 8_~B5Դmn!Rus z#a89~fTyMӗ^DER&Y^de=6ɊBWWr[?_) wiK/5Ea 4N _$!8O:QyKvY]l}Y##4W͘MPLMqz /?-<}YMmdgcL8aP):O 'ɘGy?imn70ߤ#I@ E)GVc .D sg~ae?tKx㼵dmo.a 'eLEtzC˩/4tB) +oo2#F_c`D'77dK744M„aP֖r#$d&=m"S֯ƞJ6t!*Bipq rV Q2*6F!T[ƛ`z)O%KAuzTM) wzzAGT)JTqk*AdRN*UثWb]v*UثWN*UثWb]v*UثWukui-control-center/plugins/messages-task/about/res/manufacturers/SUPERGRAPHIC.jpg0000644000175000017500000001240013543125214027014 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 !AqQ2B$4"#3D b%  1!AQaqB$"D52TdR34%U ?y8k\qG'PU8h$>NI OLz{5%<%dzR$f Ni`8h@9x>TzQi8k9`rqQLVRM0N#`}>M$xRS2_ JǬ5"Ji枙& #{HgњU' VtKӑ|\G,d U F9~R1J&+0tklJQ]A8{چ'wXj [yЫ Fo<=m~aA ro+>J :hTkL`*YmlvZ= zص rcC tgp}sѧ]jיzzOybJ6ljv2`&[Xd=LFIc#SB8vWz5oo3hMz=pɲx?[{{;!wvvSmbnm%9QֹD|3Nz{42L_Ar H`59IHjGR'4fQO7骎%En*.V$%,&E,-Ep]ʙccZE_~^wZ]l{ަn: .hxT`,{žZ9 me Qf՘cim-2la9B=Dbbu4R[eCq7܈USYIEY1L%Ӊ|Yꩌ:i5sw9cwM+м]ovŁq4d\Uo-M0rBjoظ#i|2 r*[P.xd6jF;^w#tN0ցjsx7;A}!`&7d=@P`kj*D;2Goy[<`^zښd>H\Wxm!Z4 v-,JPFC"x/iw5>eٱ=M*G*9Jdՙ#|he8.k*I$꣰c($+晸WwB0t 3)$~s U $N#VҬ~+gZ)dFHJډ#*)UWBuV:Q(W}k?G/˽dY!v'0ON9Bȗ3M%,KDֲ̙﷯X;v,B;K1K"0^ٟìLJC+_\Ƹec6TIS%N1kTڂu  >J>z-s>[H/./uR1l׵gn=u \4tQAkW*;]0% 9|_~09}xH޽6ĽHQ12{gY?+nM]s 5W4XU2Iq4Gq7Q/UYeW(Z PVH@!8g% kZ1`cY!iɭNǸŁ'ݲ&5) z*A'0OeW"?5!9rK=&jk4t!8Ǖǣziaӧ74fA4#G<"9n4x w7V $tj(/#M];u3&_O%@?Jtկ5`\c&<_􆮾#0T*'5zKnyn X+V3yUU4zH(l0]aZZy_;旛+UuU@y/ș+7W2-2I"Fۍ+~V8[^l:u )eY"`^D}|z`%hg8%r[ ɍLk|w-Zs3"5ݞ][\u膝 }\Zg>Z:u|mږH4٥^@I앱 t5Klm6+ל&JD#@cQsVVS) iU-#=+ ʤbǣK$X I@9q)LG^k`\{9|앶/R^Yj x5έܾ$+_d+P=}b, R^ &SQڊmbYw,ݧdKViqĖ12+ZfDbciGS !1l)[Cga|fC֚'4fEQFa0N=Z5I48Siq4SIO$~u4*G/ԉ*Szd$^z"}FjZNX~mATfգTL9&'OI?u0^!ԔL_Ar H`59IHjGR'4fukui-control-center/plugins/messages-task/about/res/manufacturers/GEIL.jpg0000644000175000017500000001145313543125214025647 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1 !AQqV a"2B#SR3$%EUu45&F7x!1AQaq32B$"b4TD5 ?&-qG&z76Q)m. SܨSSR~Pq(7&G.0&9nL.G.|S"|?F)KL_ %LR×9dIrƽ0^-@8l^EsMn.^˜:b&N;?T;~EA!§tuKN[?S; F; ӫhF#\To { 6r>#s})#^§t 0Wк{~Ϡ v0:?v_>ΥC `{G.o}QSb8>"7̨@?r/S;@KwVsܿ֜FΏJ{=6IɇL -U4io+ntfNo-P1ia"JҮgqH<R pIC1>|գ>5p۹|NR3uz@̙f{$ keM8\o[^v|$\XR5F ybE5NwWZ'T>1_I9-j6RR.ح{B䲻>!tsrFeM*T$wby.)UpxFƤa/7 uv'?Dj^WX F:EZ18u~?mE^3FcS G$}hVYуƫ3Iؐ0g?@]vʤ^TN#@of:R- G2?TI`rL'%Hre̱mG4n͛6Xcac0)7 *&*ycl:q~Ia|Gcx"ɜTwq p B%jn h}`Zԗ);X(K̳(} z˗?a7rnX`ݚij%n{^vnd"s\tL H8'o?g(D3\6&˭V}:trCI LM%vlTk|xfm~ao)m6ڔ9-XҧuQx.s.ZթpۙEZvT&0!VWJFM>uEҹ.V!d ykNl Mpǂ?I>UiygګzhduR`Mh/1d*SDo$8r<[ĺwR9n^H#oxeVҮF7Ֆo <~yA'E&Jgex;LblH3Pԩ11Qҹ+.lKci!}5F Q2tS .F,&)]F]𻷯Ě&ܝ=Jd,Mp{!,4b+ B|v`o]NjoE3C*oh R)i2ۂWD.L+g$ Z3I-0ta+yԿG п{ @/w`1=0SяNVLS!T9cZjR #LJf;>HB0۫:DT9a'lN6߂D1"Vܩ R6~Re ̥ ܰp̴7޹3~m0L[f p+Ko3B$y;C]!RT!y\KT@aR߅e1Ҧk8s$͜p &\Ҝ[0x{ʵث)Ӈ`b6 qYX_L,֮+;ԳMcԔ_5Vm8ܪPړ=$dnȝZWFCqȻeS +':@g na.C>G2ԃ#T*j# jy{;A9@j!W]em/fR<<*1`?wd)>Fy, -@-4y Lg\GXN*Aq5ţezjԞwZ赘,bjI*Z:군9Bە:C|d  4PT({W4Bvw\ޫ ɵ\hH_Ů ߧW' 9=ʹSr%(WHTȉ`J2bH6Չ!!jڥyB캘[i@X\^זN..u-p \3a0ۑG+Ck0g#EfV6"aFj^Nfgt^kTk::]4e@BbMt_zQn׶:OC qcQ.#,d0cp_=ޮ'3'f9#0 Ϲshu*1ƽLU9\"id]qdTV{J\ٷ8sR5D .9f_ל[m1S~yTźU=fוMo= :Vʦ7瞏Ѻ^U;vpi+Vʆ7_`Q=fmו-oN 4ݻnryV=g-ǕmoO}p!(Qr|ԡ6nGΏG~`; Be.w+1 g/,]Y8B-C4@/„=ʜua6WjJ96ԅ1& )LhpR&Bʘ.R8&KA29v(00r`6Pr9vx<1M\+ܼ}BFk {Ը)LogrOLhvvJ%Aܙx”\b \T0(@ QLx/ukui-control-center/plugins/messages-task/about/res/manufacturers/BIOSTAR.jpg0000644000175000017500000001014713543125214026231 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1! AQq2B"$aRr341!AQaq"B2$#& ?NI_OfJAuOV$I~`h\ H@bsN4H 0 Q\>ީS`WŤ@_UkA5v'$ ? S$0q`4T]x$QP 19$(] HTfbiUɯ*BA5TM iلҐ]CՉ)_80*W.C(fӍLW.$wTx3U㫻\}zFfd \"dMRŪUӢ2zF9a)@Gstg2Z:vv3ՔcR,+m^gF<\IU4"qFjDȬ ;s&]MR*!D@8.;FpDn`d ݖ'/mz<ӥHZ 9ьDDtK"WDl(IhGjVJsR6G {#T!r涭ץJ7:z`F^ g؈0(ww͟E.˜Z ' T?0` R`^XNC!G>LUYJԒ.UU"cfHĒ)lz_%GY~>) U2!wsD r%zL0H1T4\EiS) S{C1.0 +VW7L:AjuGnˎL)kQL*PN3gRP({ WⓛmS'5j?:jiKPL8@ب}w4w> 񮛫^?鿟q'/nXOu7LCV׃3Ac/eӺ[:kb %՛>(XN(FFR$.}kGRoim(*aNыn[_GocpwZ;V׶qi]71sZuW ~,>M[Mdnd)[niZWHKu,gݑ29%d1BX@L[ǤqA|ݧ?,Z 6 Uf^ {-wdwE-cYHP0(;$J>LW `.j 37o=k.O19c<4z`d^6F^8-΀Ʀ'G}5M_Qb\EJH!.VX}nެ͎H0=/1!8uciJ:r:Ehf†ω|F]6e)KY:KDcPJ|^}ێ| a|{OU5ί1ߺN큫tlVVhmL2ܺN*#,[lKDJw59wAKAAh.6X[R+{{r^uμ̛k+.qnteqq.$h,]_2/*?-E;lSjIP+ycËӲVbmE*ـ{{3ϔ0D ^n=o;BZē% zZySD lhw<յm҇I# 2_V'>`pYLGRݱJM73k-{ jK:ZfnVJ۳>dM]GtP \rep`V,n\Ԛ. * 4E:5i׍a TN0Mn >Lkq⋂]:mdշIJ](1! ]})c+*;sV3 Q A<a1 Lw]CIp/ KnwZӲk@gkX$iIfǴ++RbLlLI0] hyjݷڦ{"#Y MX]^)Q{R%p(PřV/)#62~OxOne_8lLr *F *&MG݉4kOH.ĔI/~ +^!T3H NiƉ +@;*}<lXcyhrkb PMx`H&A5a'PbJy$? ˯Ċ*'4Dˠ{>? x,ZM1 51QH&0JQbrM {0R zz% AdobedF]   1 !Q$՗Aq4%F 2BDVE&63TdtU'Gw1Aa!QB ?FhtFbZ3C+)3LQ"LS]̮iBlf,jbQWha/hOCVKSx1F~Hee1Fy#:)3qD_s˻?:\HMŚLJ3c,=93 y~Hj׳Էͮ, Xx>}ü-{uWKcӖv ꮘOet徍,&*b'6TCҖk~a˖ō)9op%Y}5-2[g2! (q :&3D ̀d`.Oʾ$7i:A#aaQA*r>d0R fpO`o@Q׍]״'j[2X8 \ ^LeV^7AF5mƯ-*D ٱX5̟f0qM=HM| R]\f0+F5P\Y 5JX=RVYe\e)ŭ?)1_¢ںn&I\"]-6mɽVܰP~j܍ Ø#מVi]p#$UMM017V4LsUdT9sYJCM[|Q[6eAO讦`=a] }qwMU@tE24IX2e'R"HE] KwգO)YicVKGթ@ߡԧƮȅ"̦jA<_0x׮nZ^ĻX{Bӣwr,~gQOyT9ۻsyn6XL,`\(N3`2eKSAEn7M\u#.N&W]NpNo`;mpwܾS5Rtt-q^:՛c%ygXiK㡤rxe!S┸)Spֺo?U1 Q8#h@aTyV{Pa"{g<{r*Tֲ8 5KM䆇?u%V cGr\'A>>MC ~B!3M z/ <ހm۹ ZsO* Fku&&0`Ί=6/T?b;ؖO^j}K^O概3oT|b ڌ`aOۂldRgi8'8NTH{C4>T1`QhAlCaAy,`~a)wEҌA^PlZ],Bפ%b=NLF00{snbaSmBȤ*fRM`^PoL kq֯jH-.|ibtP 853j*~ w^[ G!)tFjQI80dØ'~mB/zl֨彶gPMz$dSkAJ\(9dg0ؾQn&ɢQB&>'m- Sp`4ͽ6ZqR3 3+tGSai~vjndyrOߟhNvn3Î?v[ OٻrsɵS֚+Oӌw^lJv.8ҽW-bݳ9OYduʕ蔾cuj%׎&TAeԜmuNSݥ?kMV3ev]k!;#Xd_MݡAE#)_ VS 9r$c )*Fܙv:o1Z-ǡ 3GKSx1F~Hee1Fy#:)3qD_s˻?:\HMŚLJ3c,=93 y~Hj׳њ;=Qjo( (?gE1F~(1Nyww2K CӟQQFu\lbYE4Fcա>/ Zukui-control-center/plugins/messages-task/about/res/manufacturers/INNOVISION.jpg0000644000175000017500000001534513543125214026626 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]      1 !AQaq"B#$2SD%& RbC5E!1AQaq"2B$%#3C4D&bcTd5E ?y8kd˓ՠ3qj ~8'՚uZ kK5h.^>Յ!8 72`k΃&3> xOja{-' b'@,#xgEs]I҅-($;髕- ˜UJP:$F)} j΍K_^- rmKIOғgN\1Ad}m$a{l5yfYIcrAY2"%ZfҪ$zL%)E2P(bp~A/@V4K`0/<,Oj$ FX?ypN3?iP6>[ *b&{QKͤF|-87LC‹50VDSkNg֡]A51eEIKs1)n^P]2Z3Jf:8$"Qv3uwzZu_ Q][U|gcߣٕ[iy"̕_ZnV1AuBuPZ*sXQZ_ {`aGVC!b@*bg3 mV#roJov$*ya% u 秉4G.+OiCb4ZN< .N?VXF ٪ Ku.Mm8 k=x]2#G`uE)/JZSB /J9DDhYVei<3T|'`vi $Ӟs"tR7As_;_GԣQZ$՞Rø4g8tGKR "͜shV;ֵ5EDȍoi Cԅ,j&\}C9w,VӑUKSMܡ\ϒUqte*@e+rd zoThJ) 0xv.-lOMLqߺlc^xYKg}uލ^Vu!zRrg|۰A@`=6Ͷ@ pK )(ۯEUk)K~e:˼ G<)q}}H[Gh4y\~ᅗx,tLFq[ f:Zj+kt-1weM5Ӫ9 R%)jLܢ,nG,Θ*.ˆleAF!vaV8X y;/^(l5,BƙW͟3DJSdIz" :HPU\u5Qvc=~^mRY )!s*]Hys9W_0k} \wV:HeS-ew8%BRG/)h6)ע0^RG^j"]rir$2(y86Xda?dLE2XZ0+xxg<:YaNp)r9ТR` W"q(psw,rҘVd;;ml{.ʽwAYu-|^HgW_q@zҩ P֕V @9\aQҜ"yMH QdmMBb8 /I lĵCnv oo\qkkrֈAH:a.!܄))Q%PG$n@E @#( y̲.W@Ӫ2mv l6='Zoe; @Z_GиEs`k!bKOU!- qV+ܢ)VPy5<5MSinaPW:iw]+}AHSk[AU ]ţΰJc_1U) .厌˚͓f/iK8P2Qa齴a⽺;k \z̯ߛ)8$C,'WZQ`V)Ϲict5}n1 BH/s6p9)CeӧmпW58̬&]*r+ָ_!6`t!Ba+IJe&_;JVHiE6_ $]o"tbXٶAknmzcl⍉Xbv+T}'H%RB*ͪYWĖx4#zƽHHX/-Uտ9}n&=sxAA%P2Rٰt=E:Q8W {E/ԗ,e?ݪŅh4ysC a=һ,UHQ6- ^ eA(^QNbZɢ"QzUGLqU~gA[%ȹ wy2eO6 3q[V-Q-jSڎTEmect ;YZM)j9'Y՝ ~{d,!k.ܲ7RBr4)pZh!3 GqB|׳QM5IT?BE1p;a]iR5B\dԙ=-ZUKQ[ƯV:[ݦZkyEV+opHk'$zgV?r$VlZV0]1bMZ@]e@`KmQes~vDڕՆdVJ4B.3~2TftBQKEBU4OJC D@*ʛ*$C6qnukͽZ~ {T[p(kHZo [k΢.AKh:E(䒰nbYʨP%Ѫx=},M0Dmʷ۞5_.W(%<**|vW:BK`i ?{ԭ~~$w2l\r^٬ũ>vp X }_lE̙f6$%>Zس$mSmoU034=*Jf!2:;KgHfEO'qp `m5I55 |N08Ym\pӵuŝ[LʜZso_I'󮵨W?2+FU8GaM&VMR.|"R' *Uo D$wx4ܶmg~9Bw+yab75uHA\D'#GȠ3u-цZ<ҕʌ%)@iMԤ*䒅 o2#J`}'rW"yBh t.[WVɨDx&ZFNgPV@d+ A2ebS4JeqoJiy# KX;j^#fTDF1PEP׻* ̩*U[cJ[9H#ư)UXS_fK3"ⴍs.sؑA e٣t:[6+DU v)NN*x9 @Lc+'OD\Ln9ӿ/\)˿W*Jr/8`f5-cT .6uN)-.ۚ% ,ZOQS} ,IlC D fJm/) B)zQ-&?6sîwe꣗]VtwupjPy;bdXs1)L9IkfqI,PcW)1LA:%f+.gk#uG$GUDVCwP, ˨sbݯ(J7d28bTNcx]j,/-5@B-DQ`ғ۾|i]C(e]:pw~~oI[{h4yQ-]-Zhzp[zjZ *O"I-C/c{1zJ|"#7r(StdCJbR%lLXd1w[$ܻt+LߩMQFw.S.YL%}],bvi:~{Eݽb-ęeZfčm,r6>f˾;k&R?YL䝘=5jCØy[[\ĻH\\hZ,F;-ST2廸ڙt{ZT |-9fLZ,?+wE*k9wC DZyl/nwbz}%ƦHP'xV*A ةO K6tzYCb`wa x 6h#3;_.rܖkZh$JbDVvi*jgIV$QB!^-@'c˘0nY>%tZ{n&"Û̒Fab]|#!Fh @!j,JJ*1-p 4:}/*Y*qU߱wo,Z>S6r}:P_HLd%~?D1Jg%cMYѡFJCa:]z}' ʑV~C̕_Id[,}:`pX-8{Z8ebnKxw:/y~JQGa Ȗ\L@꺔Gg7>G$5jo/*z]gs'su(ۻ Mw.` a-isfcHEH*(VW-5}@SPu8]YkHj*IN)0z[oHTW08Ѡe˷ܻɶ}[j~8w23ޟy}/K}OSrq k7|;𾋣}>wǓ_;r'ps۝J_|_z>=/Uxj\\_e Ty;o//~/kXdN?<3'{X+|/>5xVS}ڬX^ukui-control-center/plugins/messages-task/about/res/manufacturers/MUSILAND .jpg0000644000175000017500000001124713543125214026404 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 !qAQ"2B#a43C$5  !1AQaq"2B4$Rb3%&#d5EG ?&XYNLB IE FR /v? As^)GܙN\\b\QAr@uaGze'削oV,^T 01$=ؓ\A3.>^~R %V!2 (0 0-"9rŽO &X93a cxH&{&f=\H&|)9{0KCre9sQra@aqF[,ErՅ锟&)%53>]i?LxStIOsEHC6kzZD?8xzU")Q %CQiZfLu Cgzz:dKIyŴ[x—TJK!QRtb,V r Fk`G柢;uV_20J=dm|&ϚDVHѿZvW.Apꔰ퍊%BCU@('&ʎT$rAӌ^.MN Lfڅ0'<*][q0nҕػepѫޭ `nX`> ۻUfr1KaLޣ{Y%wT "@16}zWYmeL" -n&R- ExLS hetquY|"mΦiƐ: 9~WGTS/xQ{TmL^qhd/|D#,˃04ݱkVn E- u*f'7RX@! tv.e{01 Eɩe՟-d{κ:n:%|}xb׆k{LBt^"Ͳ4¿DAs-)ݑ쉻izq[V%!ц wvnJݹrmKn0cФwJCY鯻.Zj5rtZF#bPZ_+'wQ|. _7ݦ#=jq -11K^(Uy$T-yrںQo-1("@>jSmI~Z osű}7c5e[Ƭ1&Xv~njcr=7_cxڍ52Dޠ^Dw @f&6҂ce DZ2@oM"1"+nJ 0qsדe<*$ehy>$kD-RF @MO?~; hkCOLŐt{VVMiCٚMu_ݧ6;/ھONzW=wywvsMUF̷ۧ[ěnWϯ=85 [4Q S@^PJ.$14 *  -3E)qjA8}TKntvrvUѤ LI'YR{9+}h(b Kwʽvݫ{b`12+(bZ] ]S7Rں$gz5]||@ vZ|(..&'əJfSfϤ ԊڔЪ7d `."8LhƚƵs-?+MޓgrQ.VԌ.oӼ~$op/]JH[FS+UDTJu) ;ӯh3J jp]L,736<[чU?֕ϋRm\!1ͤ{[Ď. 5Q2Ǘs?H pH!=4WAkmN)ϴl~T"Uluh=T\ga'Z]ߧUDL9!VRdpbPaÃ1.w-$kV"bO`R+k[k[*'[Eײ k)VFj c(?QMG9ߑw8UE`,#g=l:WK(tC++Zܼ| T@mDmLEތA!Kr鯦R*^ސD6:Jϋ[ilTa|5]F8md  ~M!.onLQ e}hLřZ1ٛ_RFD}j|޶vam3bz6su#[L>/ܾ׋Ymz8E5`B߭=^{ i00+##Mtj;ڮhEYnjVQ=I]p/C'OCI#YJqhڤ]7̔Ɏ n`0o|N3~l]OL#~ h9Wy{6nbfV?𿰺`$۽AH!o`E띨0M(o;t(ST'bfA(|*Tȥgra4 L2ch .2I4lEyh4{+kٙuN"ǒUcK:rZYp$\j=^jYs<4`F6Y}b f osM>!\۶ UaP)pZ¡Kž"V좡U,6vt)kVX3e޳?agVD0uͼ:g\N֚[{[>3ۖ]f&곂h(QiP )UNn٦}>!mVW#.Hr{l/ Q 5o]:TTK^>}gG ©?|VrǭH=<ڤ5e/JJMx-3LuGT ЧGD{e0l'~qIݭ9IZD3,7YqNZN ] |]3@jru%9CTH}+)ӣNERBS@Ȕ B)Cf>f.ToCj]gZ+V@]F\,Z." /yj/ ,P~XA8yօs.˺;D>Vq}R2>730/1VMWe)k@.0՚&w@.ڳԼwf٥c,[W9"WuTN+,H.;g AdobedF]  1!AQq a2B"#$b3TS45  1!AQaq2B$"R4#Tt%5 ?(Y^LЅ1H=*)f=P"&| #Kr(/"&W= $fL( +ːud(Tw"fb2ʁW?t!Lf$tJDT.HI.J9$ȆIxB&.h$"JA =>XLUS3"&c )gˢ?*D.hRI2!eysIi 4 2PvBzeO&ijXGH W\Qe~S=I2xӧPd$B-J򔒴VI$6xlmKE5juT2, ՍHj<NkO>lgsm4ี˗al2ERYHr*,weۈмe{f_Bӎ12Y{{>}Q}/gRe?cUT%HH3clߒT OjTva%ILa u '*5Wý7Ot}b[HF2pe;i5\"Hbul!!y ?Y7qپ5oR`{)⼸RJQ$)Q9D/Jt;0S|'jGOxz1&hu/oQT6'G5ȹKd)/,O-6[p"Nqa*8M`GO:n8lm4`'"P n j<++zٛlZΫ뾍)A-Ylm4k*IDjMCx#&qψZxlV{p녬&a=]%3Ιu+(+)A+FK),1 {tZ^p\ChЭ"kbw;Eֹ:٫M6GiŮY_ɳ6# &ٻY:~dZ\$}r#z345[3qd#Ȉ쥶rjMGwR6*QQ~_m2le"1:mJ BR' #fp˫n1dX]Y4KĀOl5=v Cń/CڄR+h]j5 u ~S @gmooM˷4dm3I_Ck;q{w*A=m+jN먲-pɐ;>%_=!\ |6tG57ێ0M!8C8@ZsaKHf+W/[zM2mn!n\&LjT?J<؄u}exbR>Gu6j#Zwڻ-5lGjի7-cރLMEo,-ISy Q,l%х?cjrћGudz.ռV}Pi\?4tP]Z~o9x)VH 3w #x~0l+PAz<D[9q~*; W>"b_FfM`.#Vi +(jgITP2z@ JюwX Σw:zw %fn)R痢?iDvm:O??Ւv)cG/t|sʊenh*Pr,Z֬Y-pu N>s5Fa1}{/ZԧU@c@iŊ䏨Owcb i9o_cD̬jNuUu3ЖDCwAVWӎŊ"ŏ@Zm(UfeT)ItN'B!e4nӼ/ԀK ~G9x:}>4|`[`-&uM8mKyAq`*O],!M,4;ѓ|Ƴ p<2䦽%ޏ|pJkwh̸dKMgao$¢@ ʒ90(6G[yxWГI `He)#fE ^}= ǫVб61]`6}rF) "-9U& Rp(Wo>f[1>o^*H~OɎGڽ=jTW[+XռR7mXBImHafd]R%9sBrI +˞L3H\ѦIE:{*};3Mukui-control-center/plugins/messages-task/about/res/manufacturers/SONY.jpg0000644000175000017500000000742113543125214025717 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 !AQq2B" $4a3S%5!1AQ"Ba2qR ?MÓV&F 4tQo/`EC%٬ ߴ4V0;,p0k`9v@{4W|mmw 97h1 *FuZBRNDG9N8C+=JffQv-msන]Zb*pxskUQ+r[(/ٍYݩ%U%Y{TU+t`w 18Ԫ$  :j<>&jzxbw*`;]Dm}Hu!+:TTmBFOTP9ǷUWds/7Q #ok]UUfBg K0rthTVE%R5ELq >}rWhJvLr4̲ZdWEпv8ՙ71$3)A}&DJ%'+r( <<)w:L–n&m5#|PcGƇyQw I4uIYLSԕЇ+ {8U*@7}٪ 뵍 ~J7_vaV^G U~o[tK^ EecF>99xPKrqD:swVӞّ-ܢ,2:WEg̅!D‘MB-=C[ij :D3S)N#w͂&xxQTCxg<-^GWHTC(Zq%La)6G^ lE"Z)Q͝tjer Yno8xR-,jW9߈_}>?ğ]k}n{{|խoxF,t[vV?r-%6z.ggRv6ιNsqӂٯ;/!k۪DI,G@"S$W`7bs^+.ULٷR$[s3FI!/tvE;1ofpѶYO] UK>AГG?3N)ªEdW6?G^[M{.7pfLNۧVi*#[B1Q1AC:?q5vJ]kgg-̢]ydz%n kޤR4hL-!V?a׳R8N5<8tFJٜ*:]J{#O|:׫$ﭥtyHCRve(q|;*7* <8p!r9VnExwMK' j4W&zDzPUDL;(I6XQV*^37ci=L5Obߓ1 'LZ4unqFk:tlm Y"=7WkteD&ZMBIqqTnOTJ^}*AS"2:P_Mmj^@PZ(hE+ _tCWk.ݿZ2yQL7Q#jQ9xq<5M\m``phE - FƪcE54mͨbJH^"# x&=M``=ԡ>^vЋIP7֖ 0Mѣ6~#<<,/g.%cX˰z٢Dkl]kaɿA ~i`}:(7j0]ɢˡAxr+[ 8 =+A>^vukui-control-center/plugins/messages-task/about/res/manufacturers/UBUNTUKYLIN.jpg0000644000175000017500000007071213543125214026763 0ustar fengfengdExifMM*bj(1r2i ' 'Adobe Photoshop CC (Macintosh)2014:11:13 20:09:42jj"*(2*HH Adobe_CMAdobed            jj"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?#sݣ1>.?jûe8a,ÿ̇;Xtklъzx r+J<1u-ѕ[??ɻ-QSRL!F )|["۶D,lҊGyy@Y)b5lq]L #˄8IggK׷%QQ~8|8Oڡƹ2hq12f.9!/)QnYnYNMl,Ҋ<ơ"& (xt\b< p{K&ʼܳJ+c"a6e5^^8a!DYblH^ƌYYPޅEϤk4үregGiS7=ԩf~c<3O׫ddOF×#˘,X`?R=[seB?z}rxqkY0e'Ⱥr93K[s0_['6#*~\Q懳$N(ʍqpW~)&Ox.ğ fdWd:AХ[obvoiN\3W)}χ6NP90y<'O#b?7NqgU}_3W]m?o{g+Xg'u* < 8A\ga-c/K)$RP_k+ntjJoQ0 .C2d(rgw9xF|a)×N$qѫ]tkM2|ܶ'NfC]sKLT#Z1ǟ)ɏj|IX92 {R[cZ4:vΓ ={?ZXu12|6||ѹU8Fr`KoC'zeprQ(T~oZ- OD%ZxhqN)P&4<< YybNX??Ǝ\Oja}p;WL;vܸFZ[7/޵:ju,~[Gܞ[u,]"di ű$9#<DN9dB\-5#C GP8? '1Ǒ^R@?[Rޛ>3˟.f122U<8I-nԃ.g6",~ݏ$Ƈː.sHp彏J̓GRytynsQxhz{<5}zfC_=WzzVnA¶;H2GmgX_n$SPΑ}%eWsC]tq6^Y}L[;K6YQ|Qǯ-ӏ+XYg{+{faInhs$q23sH|Gj7ÎŹ>_y1 Ik|yiHKc;){P 4~e$lthFx0\eω r?~Q'YpU]ugˉi~n;mˠܼA?ӿr dK'qVzc2@<ϖ$.2#!26IħRN(Ҍn%VGkUG8 ~'~ |/ Lia?~k_·w ֒ƎDTW3),ɦs1YwCL(mnB2!mB'QR~\0NwbGx> ${x i+VRU|OD޻\^X j|c{߹<n/{m-p\Qc؏զwIܿ_d5w?T]?M&$˝mIv)SLYDW5'\G.w%LY'4ZoΏkj_3gP 9T\8sͯI.ԿKg_?xEW ŲGOTLqZW/^CvJgXPhotoshop 3.08BIM%8BIM: printOutputPstSboolInteenumInteImg printSixteenBitbool printerNameTEXTprintProofSetupObjch!h7n proofSetupBltnenum builtinProof proofCMYK8BIM;-printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@YcropWhenPrintingboolcropRectBottomlong cropRectLeftlong cropRectRightlong cropRectToplong8BIMHH8BIM&?8BIM 8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM08BIM-8BIM@@8BIM8BIMKjj ubuntukylinjjnullboundsObjcRct1Top longLeftlongBtomlongjRghtlongjslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongjRghtlongjurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM Fjj@* Adobe_CMAdobed            jj"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?#sݣ1>.?jûe8a,ÿ̇;Xtklъzx r+J<1u-ѕ[??ɻ-QSRL!F )|["۶D,lҊGyy@Y)b5lq]L #˄8IggK׷%QQ~8|8Oڡƹ2hq12f.9!/)QnYnYNMl,Ҋ<ơ"& (xt\b< p{K&ʼܳJ+c"a6e5^^8a!DYblH^ƌYYPޅEϤk4үregGiS7=ԩf~c<3O׫ddOF×#˘,X`?R=[seB?z}rxqkY0e'Ⱥr93K[s0_['6#*~\Q懳$N(ʍqpW~)&Ox.ğ fdWd:AХ[obvoiN\3W)}χ6NP90y<'O#b?7NqgU}_3W]m?o{g+Xg'u* < 8A\ga-c/K)$RP_k+ntjJoQ0 .C2d(rgw9xF|a)×N$qѫ]tkM2|ܶ'NfC]sKLT#Z1ǟ)ɏj|IX92 {R[cZ4:vΓ ={?ZXu12|6||ѹU8Fr`KoC'zeprQ(T~oZ- OD%ZxhqN)P&4<< YybNX??Ǝ\Oja}p;WL;vܸFZ[7/޵:ju,~[Gܞ[u,]"di ű$9#<DN9dB\-5#C GP8? '1Ǒ^R@?[Rޛ>3˟.f122U<8I-nԃ.g6",~ݏ$Ƈː.sHp彏J̓GRytynsQxhz{<5}zfC_=WzzVnA¶;H2GmgX_n$SPΑ}%eWsC]tq6^Y}L[;K6YQ|Qǯ-ӏ+XYg{+{faInhs$q23sH|Gj7ÎŹ>_y1 Ik|yiHKc;){P 4~e$lthFx0\eω r?~Q'YpU]ugˉi~n;mˠܼA?ӿr dK'qVzc2@<ϖ$.2#!26IħRN(Ҍn%VGkUG8 ~'~ |/ Lia?~k_·w ֒ƎDTW3),ɦs1YwCL(mnB2!mB'QR~\0NwbGx> ${x i+VRU|OD޻\^X j|c{߹<n/{m-p\Qc؏զwIܿ_d5w?T]?M&$˝mIv)SLYDW5'\G.w%LY'4ZoΏkj_3gP 9T\8sͯI.ԿKg_?xEW ŲGOTLqZW/^CvJg8BIM!SAdobe PhotoshopAdobe Photoshop CC8BIMhttp://ns.adobe.com/xap/1.0/ Adobed@jj     u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?n%[Kgpf$ۻu+#jƧT!h$b#>!C hO0ۑyqլm´CK)R¨ #teVbBon)7I`̅jw|}W,;g8ݥl] ժԣldhn?2~g{G,zeTD?DK~\H}гjP(ޝf F׷{7g'#9~훢HYݟtb&ӫ{v1m`h[cdv_ь~yc7g:ſcZϱO+rw/%7KſM9?S|n9]L@Ga6[*=-ɉ}=aQؿedv?k?7a|n=;˱/bn/(l$e;eoGa7?MڃnsgNv;#nK>-i_q[jNaow-?Gd|Flٺ/_pA0?;?}ɿ;!n:2)=^Fg_Yt G2Mt3UzX\~^jfa7%MTV hi.}E+7t?|+ܠy15(u8cQznwŷ+d֢ cԭcuRjjyU)dEduVR$\]\Y^BD]Oe4 }g%ͽvҠea t{|j4F-qs{wE *k{y-l[r 摏Idc,=55>#^l}㟭y}aiin-qWUz׿ABM߹k3Khsn+f(s?B-[JcHqQWU4\Hn*,n]ǀ/9_ܹ_o[lZY"5nBASRhI[;nͻ|n\v!V `QEKzM2"+sXu/Xfjonb{rf?2nqSpmlABT:D>umi{Qr僀ElWLjʭrjTg)?;"|<͵nnh6+7.yW>\ K}WM_lvkk͚{FV]CZ{*[R}>.T5#`uf4jAz%֩oL.J/XPA!tF>^r/3/+` * e?:xNb~f<[uu ODOџdKs,Nn9[!@u{'b8-څj*z'_ݫ׻),R ; 6lηFO$|é2#XIb97D VV %k W0so*o"GR]XUYXT2 du紸X!HxM`E0>?"tM5$?S75̢|xGmCwŨZIvWpc}6k @Lu]=sIy7 W;C=i76Y16y)wxA?1aѺ/9_IoSV}?O =_2Qd+Izɉ6=N\T=nI[o?C[~ܟ_RzۛӦ<ਛ!JZo"Ii)WrN .H{s={֜.\n0," *وH_ʣ̊tkyf}K]m..JcD@gws5yJn?9VGYO6>iP)\lIHa}"nCn6ջ&]4h^H-FըT){q,VuHZAt/:{m3I(Ym5B|MlO u|_ɹ?,A{$*XA"I*Qnhn `e|"D%Q], HHGG,N aoL\ϼs'n@񓬸Ҷofė?GY>mrZGm]u߽tKmVcSeB]*r &KkK{˹+HGrK;8 1<=cuխO*Gh 'fO<]_Viq0$,^/Z1K;g3߷r= 2\G,aX8+BdmJA?{忺8{~ŒE+K ; ӯH1^DXе־ca''X}.=ntܩ|qK7[=ɀXZ%1I}̭GW*ZXԗR4eG5ZoO+-VL~6 uF"3 &'e'9cuS-ոؿgӴ>̷{[߻~}ye\ۧՈ(T ꠅEY2hi4YdV?ޙsߴx\7 BA,+Iz&u'Tx&6("jܭ;5dS\ulI,Yf$I$}N@bjOKM 5#T5MX1r}&̻%{:C 1gI*",@tAn[O.m_CkM48K(,M|j$ޥy 1xSxsE1ZVr 'Г#IuľZn_t7޼V][ "p2{tDGm;.#'Yiy-I0Ĕꌖ?b=NJO_&\|b㠓!,UTRROwԮ~<6c=hnfel#Tw?LF[QZ;/'2ǖ_i,ZY3$^)uJ *6kӤAfj/GU6kWEZ(Q!e2MGQ E*()}}>{?|o6w,mͣm#༁Yziڗ9HIqW_;+r~sr^2HOlS4 PC{ -u6ܸZ^I㤊(!|Mc$xA ßq^O7ԛA$I-("~% }[}?~ڢ7H6XZ`"o:KBP9D5Ε\L++e'e$y (TtBdY#?I"pRT#D>GmۅՅ %Ѳ: hG),MJ;HOEO^h=O}>$ᶢ]؛{ci) ҽ|'+׵l;MbQuf?Rkc$Pua˺_/o(ٿx獋Ṟ?+'[z˾Բ%)_мzsS]\~}@qi]rf?1m}L-@fHR&:[V{ pI_|;kw|^{XmMG׮p&C翜Щm,UZYAk'ԨNgsbuiUcOGIGV̊UhurH9O5^lb[quyn {QrE&v <,eV /#5tZ؛pT`SI2Tk]S26 4T3FgϸޓfTwJ;5̺cg/mhtV2Y^?_R(kݺH.m-1 Q/#sFf|HTْiJSQGQQ11"y@=/7>{1M-$t=˶[u3$u*&O}s/|`d9)#`Jr⳶W`+Tx_,'LGc]yxqYH6& CwF0Rd)b W[v?fvkkiRSI;ƘP ]Ϲrg,nnoBP%=kcEUg+vGv. GμhwUUѵN_?WlhXc Y,K/,K)'qQm!/ԬAjoVUA5nɼ[r_8nW&w'QPR]+crR '[h28ە[ fJ~ J4 C%SIGML6URIlUkc#r8տ'4֑]cHTTi8V4=d{ZlVsG*4r%p#xJpN< ˩b5ӑ`6>SB7Z}<s6Mזl+R7=]cʇmmUzRE FQՌ.ۙsfasS 3kO['*u}հK|- qfv{O:}.Xi/vgX)BK\켺z %d3>9*#~$"' nޟg/vf@Fjv? z`}M|2$vFR9e)OCZjZ9gD9֦ ԅ$ w!"?꯽W_wc =ھ]kZ7x<R,` ?q/?gv7ME XuFH܈eܨ֟ =N譃aUQʞ ֘ d`P܍7 d_Gs?5\s WSE! $dB@Y[@?H_2Cʰrgs<_Q*ܼ$r:+3C_N6yMa;1-.m=5Z.>5~縤y[Midx4O19F܃ǿK8ۮ`BkຏQo,Q ^^m[qrmC%Um5%5>++K3dAHjrUdeS ZdKh 0P# KfrGyMDu?{_m.}iv/*33Ha* ~P q_{~;Ol\𤬓 5.d*eo`%HJsV†F%Awq߶ r3>."&@#_{==l 1’c$q\xfs||ߛ:}:dRdĈ3{xb]㘎'YYUqE5$. =-nbil#pҡY[u3:р(v{9cc7ܹwhB{U]QZ[SJ@%u_[{u۰e`y+5'j`V8icyG>s.=PS8aYT.)CVRk JyKS~\L3:i1H(NA/[dqx܅rÎEt*#cFOU>kn{%2h&кu)Ǯ{ ]odI0-k*#IF]LA<댹.$(N.zB-NޚoOYTSS:ϿOEn\AjE-U?_EqORe\ʀ}S[<}Mr*&Zz%@ѭn.S'/GQ)6}jղw)g 7DmA8ų&J w mm)]V~9$!$Q+Wm5uOQi#=? '(rTYtmlO^yRq{ɾxWOq_&hϔˬf}ݶ|&"woNE~O5YUVAHTY6%KjSU;͏2gdU60?Ͼwc7(n9s,"/UCx7:uI@j&W10X"|x{Wql[s/.n$R. Œ Y&B t<{&-1TR#{ 9+E|z)Oc!O;6^PM i"}]bXyw 2̲=PMȣĵxnCܽl{ȟn6B|-nb";ԎC+xI 0(KCۛ!jPIUKSG+0USnj$m<*ud2Ȥܓa/<cVgfm0NOniu4juCPX)k/6#gWg?_sL-_ :)XmsFp8w8i{6}9omakSŌ=*ܴd0 ['xw1%3!aM ̕$VcLJ+xQQJpۖ>^>;;Ao2r'5=0Wxة"5+pe!wr+9(sv P9P:&/`T:˨{ Wa%ˏߑ&H%ХA@Q&0}8N"oܵ/ډ_uۭf[Y+GiC#9U@::F&<ɿ+>ڧ3YHPg-:(9ܟs ]MO(0NGȒ*u-ՀWݭĹM)šP?P~&ϼ#ejjqFYj*QT;44 fwGlq{- rXgP+QHQŒCY1,Ɂ^{Uo~}rOqmX1 ID_S8QY[~=Su<Q*j|xd:M3F6 Ci؟['n~q<GiuʖG$Sh@Al?0_y]M%[-[[so9m$=A pY(XZ]Tzlfr(RO+ HaAL/{d8='s؍_%eDd)+mes3L`dQc޿^>ҡdQyHJHzaCBcf!+I#3Vc&Y):9%b_q{eygeٹwdH6 HE`5$E.c߷~l7Ƹ7+ɮ%cS$4{rZI$M^uQ~; 2XdPlO|ӦcosӅ9|ҟge/_3_fuyV]("=/Z&Gn9uONk@]W5?sv7p<l<}Ws\5fr 3[6#)|OPhjvJcڹᬎ`lu̸쵤U~3y2ޛ }kY=(KwnHJj j衻yeǻ~nCu<=V:F$yً9*EHdI9ݧ4B56f[ }}ofn'm%ܡ -[%Q# HU@UUI+k߽+m=k=㹑\\K 1"R(fwWQ-=EmeLT4qy+'` 9(B$*1s0<{<}:Cy$U@xRH͜|˻6vo养=#(ݛ@$(ɖ)ڔ 5:d1WQNduh.R¨5?]cR[`H'syD{Ҍ HۺW^eTD'>w{r!y^Iuz*HElKE %$JȆU\GzJVr!Bm>Jb<ǡ>]\){uQ=?ZgMo q_|J^v_V37?"gZVajOn1͙jj52Vi"ˤ ޯofvEǾ}$ , Cw?_y(4| GUM;B%!џٌVBpxE}/ۓǼc~3CCuyݢijIY54t5-, 84}ʎ OWCW^wg64mӷcIiK j,M#DNo| &|,Hįu +fXʎr:%OrPmTw,AcQ@fqKyhQcjۻknˀUU*1U$P)[J VT *o7ϻ=A!/bC=KG+qZ2~{m>n,G_BHY-e(+YU4vN%dWdFF#UHqT`G׮:zOY#I%69$#?,ݑdFSm"uQ tvCULfB ]_#Z&G?O/ .9f9AkܯխU|=K\pXQiRXO/_ݺg7qNodfY÷2D@W57Dt%nnQ!`U_#il[;([Ъ.='}v}nMID@+HМPNwEf%BQ11}/o0B`cU\SBG: ~C\aSRz,qB3*X=bbozt@I?O}$/O^Gmީs:$=2`j|'F_U9XʳKYSB;sz(?gd_ҹe33C:Hh]MC88=UW+0LhS`-LWcK-wۥC%C-@?,QN)}佴m9ciocEEZ BzY ^-M5 4M&>h2`.o +")}`BA>uI٪UB)ٍ%oo>@$"7g\֥8o&K P6$I :X܏BM;WP:fa1`-=>ʟy-V{M޺ٹZ8Q^r}._|kKc&$8§uvxTUv#yJI~`=\|_>F*6ȋJFGM6SEdԞ*ڪ9E)Sr+x_'ojB$T=cFS9B ́r9AA,'?UpMcj2 V`"ꍡik+* 4Ay,~}o}oi fr>Hhٷ.`-ܥp''du,Wd䧯TǕG#yZ:v09|/suOqyu-,F•_BZBP|2҂0Ҿ\ƒ?}+7yy vc+h!0!,A7|R}s䶕f;T-.LS╉-j]q;nc^}[dPʲߩ@0^8bk۞g{˗c[5g,#!I>dOE&^#>{t5i6S>7OOb(} gqeRY)79$hN펢m^{qses)lNQS%I:y&޿ctg`DY&SYjϛʀ CG zwݏ:A8׿qw?S/'Sى gZ ?wL[JHa\ 6>Ѯeo.3VC=4_P*q?Z5DXRX#1CqK|),,'qgsep):2CѣL)$XG?ޖ}x}9;UK~Akǝ)>pR׶t 86#ߏރݢo8n>>_kz'aᶖV!.&I)/ @%J*x m@ͿMqjxH*j5ZORO,r7)lM.l3 3ZF#|S_Vb:OEGO:F̪~9 Yп{ߺP?AߺI?W}u<~׺xu^׿{ߺ^u/c=tE}?}}t{{^ukui-control-center/plugins/messages-task/about/res/manufacturers/VIMICRO.jpg0000644000175000017500000005307413543125214026244 0ustar fengfengJFIFHH ExifMM*bj(1r2iHHAdobe Photoshop CS Windows2011:12:02 10:29:03]F&(.zHHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?T۝,1i~aoWNox}۝,1i~aoWK~qIQ?ޯ&Ή4'Wx}۝,1i~aoWK~qIQ?ޯ&Ή4'Wx}۝,1i~aoWK~qܖ-o]}P_X[_M*.{6Wpۭks/OT*qa;swuY\zRIŮS};}nrk-vaemUٷYw 82L^iMF#F\PAWOw hÌLJ9K7;b^.6)I}2wkkc[+'q &+yin]I%6f;,u=7?#JH^~C۩%;qGtdaZݤܛr|/7r[Dp6fA^I!n":zGR~);2+ٌ;[;w~h޵e_U;7y%6luElQausJ960c^fي 6J]p\el=kT)s2k^kC^3ZڟwF ,>cdzXzi>wܬ??cm?"?X9+Zl[|'.~&.UOS)|.mӳ艹_Om}7{8S?+^̒󑑳c_4dTm w߯fEgҳ'w%[6?z~~^ܿ|9}h>N&EYX᭩-5 ;}4jr~wUNPq}}]}?u5kI8;o+ۗ~7z]k{;wZ^X־loe։$u'E{HǞq}"w'np2RֿO'^Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$jPhotoshop 3.08BIM%8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIM?F]g*h-7]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM ]FLzJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?T۝,1i~aoWNox}۝,1i~aoWK~qIQ?ޯ&Ή4'Wx}۝,1i~aoWK~qIQ?ޯ&Ή4'Wx}۝,1i~aoWK~qܖ-o]}P_X[_M*.{6Wpۭks/OT*qa;swuY\zRIŮS};}nrk-vaemUٷYw 82L^iMF#F\PAWOw hÌLJ9K7;b^.6)I}2wkkc[+'q &+yin]I%6f;,u=7?#JH^~C۩%;qGtdaZݤܛr|/7r[Dp6fA^I!n":zGR~);2+ٌ;[;w~h޵e_U;7y%6luElQausJ960c^fي 6J]p\el=kT)s2k^kC^3ZڟwF ,>cdzXzi>wܬ??cm?"?X9+Zl[|'.~&.UOS)|.mӳ艹_Om}7{8S?+^̒󑑳c_4dTm w߯fEgҳ'w%[6?z~~^ܿ|9}h>N&EYX᭩-5 ;}4jr~wUNPq}}]}?u5kI8;o+ۗ~7z]k{;wZ^X־loe։$u'E{HǞq}"w'np2RֿO'^Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIMhttp://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2011-12-02T10:29:03+08:00 2011-12-02T10:29:03+08:00 2011-12-02T10:29:03+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:56f21e22-1c8d-11e1-ae7e-db667b27342f image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@F]      u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ߺ^׽u~{ߺ^׽u~{ߺ^׽u~W/_?:co d7_7;?λg_(߿'֮|Me'•?Ͻ?u elQ0>.G jG.Aygm[:P>0~-@0m}y{?u>_\?|sooCuZ?[ν¯POooCuZ7?λggQɷ߿'֮|MeO[i?nW^\.@go_|*{ ux`|\Ҁ}l j_?lYm[:<_ /.@u?e?un6-ѫc${$W_S}#y6f_oBh==#`<|o2<{w7vmzLn.OegZFӴ $,YU-{3r$V DuAhghyq)-ͱQCU[E xyb_/_};^ܛno/6,Ԙ}`$<& +̳U7[PWE~iZ?P4MO=v8v~Yi^V%ҵt9,!ߝ[%q}SGgzbvFO֙^W!1KREi$,3cq}yLnJ;20 K 4O|/w4m"{FR'L&(j;ű{~6u?eQy YlR=5e4IET+ufE77|ߺzhE8XaBK鬎h@~?jk 휱GW3Idzhڰq 2`@Ł33}EnĴ˫(e2 s}=4 *#kfC\,)q߃xSuް:rlxO/AiOzAUX}v־iˬ~o}M{_NN&}']-ipO -mZ)lFO}O/6mͪ pѼ<}9Epn,9ESMiy sdo-`f0ju}OCNCy7 V(GEa5UM-{; N/h&nzӋ q$S񅯦2Rʡ'{=~lY?AL5tEd5uj"i/^g]lh#:#ʰT@Cn6޽A۟sy?3s;m$u؛j6':u2SWfRTd֥sgn~~}ivs̗+D2h=@FG¢V GQ?*+7{&EĺΔԇKcXz :Ck|~8>؝)3,7v/t[۟iz;( _fMQQCBLe, Oi㞹ޤ{Ne6F(D.feFԎB9JԚt9c~Twnf9F $j2NELevA"=;!+s{pFpPpborY*$JO_7_*k[Y6Cya6vC7iFr|:z|=d$T@%is_$!@wC yTBTEBWQiۛ9M1;k2I9*@'[F/zgvc->$?CiuEGclvYrݵ ROEm 8?\N) -5[OJdi:b#;E]QnUo~|fڛ{ /N|6s}u&W5>cf2l.{)ߊ(/MK6{[ywsFu$Wb.1]8PYrߕ6gs$ ,r1 IE4ԚMzʏocn =7򷴱_=Z}Ccebv= x{eY)`OK(|{{msSq4DFu2X8j6ܗ[Imu4MtВ$mP vGRݴ+f{7vE+ܘFjDf(钥4 2 [5Nwqy`f@JM?.kHo.ExF3[ŸfNO<7q_{N+s?XvvuUowO:q6J{`oκ9}-[ ntQEAV*wC%)WIm7}Y[F8\\!1:@8S v._(%2E)Wؿ?zr|wN;c7uۃq*R#W >'`H@bdjfZ]ȯ4^$ȧTQz6ܶn-YhةAcqL4w&oz6݃7_Elڸ4ٝpԋ*A5TJQ boemn?P/%HX!`tuZF\JĐҺX:d}jo/{2ùh+hr͜M6\.C/VjQ&JI(!ru#$+&`C*=5ڵP.ps9ZK]51~*H4~I'aoo}㻲gm*.ĨppC/I)jja<"0.eiG[fF&.b@dcF+>s4䕙c2bIa@ݔ'Z58=i{[7>G4gogtݛ=WSY]݆LF2'y3OSK’!}-DžQw5@D.悺J-: M0A5*@uw)}C>w3ݿ!:?1{i#wGjwNX}ϼ{c 2[KvC;X~ɜdXLtp'Iw"ܷ}y:K)T6tHJU閕t謌x%xu{"Y0!ָU>Ɲޟ\L`w3cfhh捈92 hVHU5mWۙɷdzLX_ި}:{{pգ6f!zW ]=8f0k9SbmuAud0eW ӥZ6Xmf PO_ޏ1r\5=i^[r'||oLG~uvbz#d6ЯgxUR}EfC TUol HBJ s&[ZuaJ̔TjT}iՇ2mfZ%Npytq3?)~~~3]y}vf6cUl\F~ejI2=W}TEJxH Dl J^ 8~=5FmϪ@ۭ,j{g{w-72o|1EUlQlڙvvwA#4{imC/(XQ8'u |Qcqc?>}`;+lv..6x]>emn+huc2ϑU̔1=l䵞=VAO/4 @J+ъkZ2 4 tJ[om뿓;/MWۘ_1T[glϠ[wmMfݖH2Ե3=[$ !l; k.3:v!`B J(ShR=f@!V}Γ`Uˑo+S{u~f{w;sζ7&sph XUp~^B( HHCjD=OE m;K3W\u,xt&Q|z+'$3; G<+3q](E_b$K[\1J zRʊ%RѸ5Fj4ɯvw]Qm$paSB2+NgM5MO52QQ<m$,k]I$c[4DlBM ;[}]kv8[D?\?6e/Ͽo˟~]9{u+rߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ukui-control-center/plugins/messages-task/about/res/manufacturers/KINGSTEK.jpg0000644000175000017500000001202213543125214026337 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1 q!A$Q"2BS4Rr#DT% dE67  1!AQa2RqB4T"r$dU#3Cc ?>?a>lHbǓ P!30C^)PfCp`zs )81V -`e!8=XR ylJtxP0z3A3ĉ(y0?/41Na˜5i7>p“a . X9Յ.pgĬ7@ҝ@7pl]VJfG,r?l֓JQ2:]>YN)le-Mn8XҲ(̚4#2q4kqpzVrem :f-7[.9Hn=xxprNSf3O]q5rXźRc6J*ǾixWH԰9My%mp?D2r0T815w:;\Ig"5QRT4h 1,oqN7k&7 'xtawBʊnJ^lWGJ\lp iq!i1ۚy9]E,dTma q_i13˖khnM/gn]?XG!7z~|[x1NY]dg>nhT0mjo*_P*&i#=C Jƥl7M p_?Vp[lJ8eYc판dMd T.D-&m*Ӵth,&wIe+aU JY/kzי!d>~HqGhP#UDNo"*weHL ,qV[Fd Pv'HTv`X(r6 +L`~'DRYUTΧ %4lōwvW|hvhM $11Muw6s=ea;6kYSCh3#ye=Z#9~2O ߷-9Y1<^-~'ۅʠ"@,$SNt7' uroV &ߵ}Zj`6WIrL0[JCuE66[9=<X)|g%5 B3f5gȟ5PXŹe2)yYI!Γ2Wmհ "VKp@vPM8au[r7&vJYU~ M5e64Yɤ;|-V0ˬ&v${> N%KM%8^t}< tN=4!@ç)Aqw}sh.i#<jshnXTPN߷_dXrcȋW1333"LCѿ&'pyZ﹊{ie;za;KѲi8(C4g@6Vvp<`hN!ABp8qO*8z/ [ē k $8Al[R@[Il*k-13^ {DjGGa"1)Xily=eWPZY%RޑXZEw7-nYa- (ljrlz3[? )"ux`8o`%|qUNd;~MT2UƐf1ơ5%QWMM$ YeT,A$"bDi2_n+leZT{1?6z,CUqYu2˭MUMF"2 䕝ɤx_yd8btN$-܋3hV2kJ lO~R؍ړLs'" m+kd8$o%2ຌVcow{πL>=u/4{a=wؽ;Wnnճx|q53·55ssC+<7aOktFX0z3A3ĉ(y0?/41Na˜5i7>p“a . X9Յ.pgĬ7@h?a>lHbǓ P!30C^)PfCp`zs )81V -`e!8=XR ylJtxP0z3A3ĉ(y0?/41Na˜5i7>p“a . X9Յ.pgĬ7@ukui-control-center/plugins/messages-task/about/res/manufacturers/HITACHI.jpg0000644000175000017500000001365713543125214026210 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    !1  AQ"BqVGa2WiRr#$46h)I!1AђQaqT"2Ee&Vg)4DGBRbr3F#f ?N=%ruGSN'"'  #*Az|)G_qɑLaR‹fRApu2'l)%i:@Ufm?13pgi\@5Fr&ghQ*!G&Rsq ̜4'F{`qhjM5ǫM)UΞ--q̋ ωYTY0b#amXiQªvitH2O+fpb+Űcm@wUr:_cq>Ea?.,)q|t.>k [ް.42k{ bVn46X8BU!S=9Lx DKs:1Fc"yBWM8ߓ0K3d`r#5@`k$Qh Xixj,AG N% 3Hډ6uj 9%&S'j[fWb)lh:]4δ+e;@S=pajp#s2nA>T/aQ2C6 h3#FZ8yx@0S+kZc,(]ڿY rVy[bucX %0l~a>>D>_IZN.Px|XE㊭݃AnmªSct.iϊ:m]hh>T\aS{*94k#qǑƾ>L/`5A8J eh:R. \c{SxO,n~fG yƊX*%8' `9$b)DD~qJ<i]eJ=ԃu[RAVbp`D_]C}.3I-!zy0({=1iO ńEUǏ_pĕ\ѹ9V}̈3U5}TӓD̝ L"ϑXfKv$y7 J\˒6R#ϑ2.ZǒK:1aI DCh0f^>3 FuddɚS6gS."n0O (sǹX6/ZХ… by3#2%T+.ϒ1ybCkNR)LP"H}>ހ #:I(m7^dJƃM!R!izȑa)dU"=Kp :ΐ톽ǣ3ӬۼeUĆi3-rmzLܝPB$k,쒑k7՗64aS]=tٴouٕEQ82LUWCkS#d,0ivĎ:d+wݯ9Ƥ҄Wa !M]1m"9JHf(x\4 q+efN" IcFML* N;\iW[3J[g;cVk49γVl]dM)y(sENlvkfݲx:oMf) d$p LWa+ĕ\>9Y7$C]t%K%mSXo4HF0Ʌy!I=(\*^sLDD|͚i l}[߲ZA880gG Quޒxjضu4g]4Z׷ml *RXm/zV9Ajl牔G$!R>`6i#KekctQ]a͞^eȁLЇs0dKdzv(REDVxq[S0-Hӻ#K]~ %m^!ad-*$UmjqrNNS n!vF?nig*^(o}3kY6n3M R5aXfȦzܹ"(s?g샘s`me&Q73skLֺXug\Uӽm]+z>5HL+}a{k0WvψQ| M60sG$'W( 9!pYgS(Πؚeϐ>lN "acg&%:AzXZA@Z)LEAɱ^gx̑u ˭mY*ٖL%DEEFv&|v,mj sAɻ=CuUXdC[`olma;䶓mN@;OMTD%,dD[0B$RSV}jY~]2^7zv1;=]]lSI$s-S+30o,n^Բ컳s[7D~{r]Ӷ̗ck٫!+-6̐O/1ku-xh,s}*s2h$x/zs'q:6?Qv5vmc1X^XNݿg\/]LZSn. $@n3oEjًԽ!]NJَ ߷j/>3lq/;jcTg~ʸخTbd9ޯN ]Mf+2Z=ѻ#=$>@Z*õDzezgW>Ùwu'Q?bo֓Zִ55'/ҺH2f_GӹY)TZs1Ծ?SY,:5G6goPeHүOI9O :QV2qCm8k(v2FE=NWs }-{.egV̯G:U$T波nFGÝk[K2clRgMnWw%#?1ڿenI%?B'CϿGhq[PZRBQ`nqI5㴓Z֍p:IF1RI$TI%)$IJI$STʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ Photoshop 3.08BIM8BIM%F &Vڰw8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM 8BIM@@8BIM8BIMCF]sunplus]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM ]FLJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IOTl\ .cUhߋ^='%q>ikS.T[9=koǯ&3x"~fc5g{j.sco"`DۦJgvCX:sZɟчԬOgڜIA'IJIVCc9K ?GCl>~]2^7zv1;=]]lSI$s-S+30o,n^Բ컳s[7D~{r]Ӷ̗ck٫!+-6̐O/1ku-xh,s}*s2h$x/zs'q:6?Qv5vmc1X^XNݿg\/]LZSn. $@n3oEjًԽ!]NJَ ߷j/>3lq/;jcTg~ʸخTbd9ޯN ]Mf+2Z=ѻ#=$>@Z*õDzezgW>Ùwu'Q?bo֓Zִ55'/ҺH2f_GӹY)TZs1Ծ?SY,:5G6goPeHүOI9O :QV2qCm8k(v2FE=NWs }-{.egV̯G:U$T波nFGÝk[K2clRgMnWw%#?1ڿenI%?B'CϿGhq[PZRBQ`nqI5㴓Z֍p:IF1RI$TI%)$IJI$STʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIM2http://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2012-01-05T11:13:11+08:00 2012-01-05T11:13:11+08:00 2012-01-05T11:13:11+08:00 Adobe Photoshop CS Windows uuid:f29b9da8-2b78-11e1-9c1d-e060394baa3b adobe:docid:photoshop:f29b9da7-2b78-11e1-9c1d-e060394baa3b adobe:docid:photoshop:14e7de78-374b-11e1-96b9-84cebc0057bb image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثWN*UثWb]v*UثWN*UثWb]v*UثWιi%%wvT^*͚8CmWm7JOmPvv"8NcG6illSj^sտ uF;+L@HCGpxRN_~<_>~= FXGԢ [ Ž~ qQ2?D3kcyrP5]+V۽̏? 22+Il }L8mæy癬T(Q8;+J8?gG_E%@[g53Xм?P@䙍XX?dXlzlģwXc/Y?Iy(88$h(l2kWb]I;qV=}YFݚ"TYKs&3^RәN՚_Sz AdobedF]  1 !AQq2Ba"$ђ#4Td 1!AQBa"$q2Tt%5E ?M5̹75 4 hCMb H~==<oCE˿hjTY NcBm\>ZQOљ^F&0rojNhA7T SOv" z{5,y /ߖ"~ԩLHv|+Ģ2ZM`22Ђo٢ A7!&!DpjX_-E.R)f 59 rjWE?OoFey;=_Msj@s,P7_[$h(+zcAOJ6SDC79,@@ BXv c!v)r3= ўZ^U_} xmZƗ[8,,bJ#1=F)aiRR Gsŀ~]h68J–[6$i!~aW"""NgLeTa5iE@n=+\SV$eT͇)X9 qËZW9e"2SKS,XUfUSHf>auL}=w5䲛y$R"}A =&*U _͔[!=tjad}*\-{3OrF"uLW:W i@E1ERszpb(]Yק_V8M5?3QlIlĞwwZX^܊$dRUF&r•BnNs&'0|\Vxc!{':Mnګ=h_8URֈAEA`ѕz#*4;ƟX<ɲ4+"@nN{m]qJw-enKd~gܟy&E7kZbU|w䜏hk`3+95a VlhY nyC.)W Njr:VRt D1|hߘ\J,E) oZpcucZtBݴ5o75DĮeSQ3:"f6JRϹEmRx܊Ψ &4ly{Uvk4u;gǺI2TbAQWPB!Xv=†(Lo[*(B D3^VN@dlm RTGMm_uoHt;:icjd3X4IbY"LGB+}LN CxHPk볕}7rnkG) *rb6Q\aglIqtz(d- UP2gC'[$Zaj׫K_fI+>$G6cƴw8ҽ*6@Tic1~YWKgEU9aU=j?̬ʨUZw.U,QJ 3 ݚںx=I3{N| _aqT֫I1I᎖,>@ 6L.Ki{;tߌ̱s_`I`-JԌ>R[=%ݴF2G(swQX$"J:z4F9 dEXW5D1%S8b&_agj7Z>A Ց0"V QQk5Y^F&0rojNhA7T SOv" z{5,y0)/ÉF#z͋>2eaX J+jCKhi)LHv|+Ģ2ZM`22Ђo٢ A7!&!DpjX_-E.R)f 59 rjWE?OoFeyk8eɿe9߳ERn? NCM=C.Ա$;~Z.]CRR@js2h">ԯ~ߦ?ukui-control-center/plugins/messages-task/about/res/manufacturers/ADATA.jpg0000644000175000017500000001162113543125214025736 0ustar fengfengJFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC  !"$"$CF]"4 !1A"QaB2q#$br-!1AQ"aq2 ?Uɐ1||cj+K\Um+:GkGcu{RCmHZlJ׽$~Ҥ~* ލ{Z2HϳBqZ$Fș{%_F88HVcOV4> JR)J"R%)J"=dXf!):|%K&.mQJhΤ{NF~܃b-3%_PQVo3lW=y pضD?w '+h"4%@ޔ7Ҹt54ݮt8%JHi($#ۡs!qk.c-Pq >j#Mm,EH B${4?:N&*_, $k<}+_vwo F"x-'Y- ΰB>mSg[)"Nhlo;tjZ¡ŞLKWd(-m%'y$${j2- J`F&[L>i~)UJR(Q/2 DZ']@b*}"3'$ kInRbws ]3kQ/?!VJxܑmrVǞ) O]Ugq*Y 2PPUO_) G_f8:%->J: }ݳ{ 2IA,;m[Hf"٢k+.p͊ol8MےE)ށI5s)exbD6W@Cjh ucq͵\vf*wҪN!nwɟ_n\Syiu2$c6;bR^a|,r/ dcL]GIGϦm4^i6zVczBXH_*Q>OE6sFn$ YnG+]xO{r-{kFq'WAc?n1_e `c`o~71ϣcy☏1?c"eQɓC1eun- 9i˚E4fSCUMXD]_Wq/e@&YC=kZֹ{dt |/}EhK?qӆh+N)./uy00#LևDa;%Ճs?߹iOcZÎNj{G]T;:I]]8ЌW0oG^-r0k) qzg"Vv{=/Ju[!?gm2o5:lٲz.{F]ddYMQB2WHe15;Q;߸W11rfM,cC?j~RmhGZΝб}캗ŕ:.wKyT:&{o̤gS[AyvQdw6cCd{2 [ѭu_ >(Sv S^+%+k7S߹Y_;g;_l== ":;@D$I$$I)IKɬ[Ss!${cOW{GvFjIr5r&hE@Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ .Photoshop 3.08BIM8BIM%F &Vڰw8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIMCF]sunplus]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM G]FL+JFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IO7]bl{Xʡ_?rVukxcriĥ0Zʫv?5gK,kh`iS{PqN݋ܙ'Fz!uF!3S\U?\V.F lChgcKn[tۍu6>m4^i6zVczBXH_*Q>OE6sFn$ YnG+]xO{r-{kFq'WAc?n1_e `c`o~71ϣcy☏1?c"eQɓC1eun- 9i˚E4fSCUMXD]_Wq/e@&YC=kZֹ{dt |/}EhK?qӆh+N)./uy00#LևDa;%Ճs?߹iOcZÎNj{G]T;:I]]8ЌW0oG^-r0k) qzg"Vv{=/Ju[!?gm2o5:lٲz.{F]ddYMQB2WHe15;Q;߸W11rfM,cC?j~RmhGZΝб}캗ŕ:.wKyT:&{o̤gS[AyvQdw6cCd{2 [ѭu_ >(Sv S^+%+k7S߹Y_;g;_l== ":;@D$I$$I)IKɬ[Ss!${cOW{GvFjIr5r&hE@Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIM2http://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2012-01-05T11:12:21+08:00 2012-01-05T11:12:21+08:00 2012-01-05T11:12:21+08:00 Adobe Photoshop CS Windows uuid:f29b9da8-2b78-11e1-9c1d-e060394baa3b adobe:docid:photoshop:f29b9da7-2b78-11e1-9c1d-e060394baa3b adobe:docid:photoshop:14e7de70-374b-11e1-96b9-84cebc0057bb image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?N*UثWb]v*UثWN*UثWb]v*UثW,6(iH' WK?b\.ǎ=yhVY\n/颳 !7xG9'T6WZ~bi^Z\麎{{ftw5ZIH14u@o%1n,ЉvuW بujrS-: (-C]{7)2L{)khnt T^H*9!nU揕Q_m+es|mL!Mq9!pq|6áCsŦtE ~?V'Az]y[2"u(ms=Na;⬿Wx\go5ߗ:Nkv06DM,sƲ(oҮ* d3],#) 4JmBe`*k%QAKTyT~M^D,<*%^ mqo?Q/vk7_%77)bc ,l~<+PBCW.L?ʟtt'˿w,M?a]i hKX$8'W"*J?h*l/ nV[#P mg}|1C҂I_xػ$sgτ6I:^K> *KdGi]wrK3dI`|k##J5,Zbmo {lb$ш xGO1qI6+IO(~oC~ӯCx|?l_N>/|GM*UثWb]LUT&ڭj0-ͤ5=J07E$(H叐j -e,6s#󹿜Z?'%8~=8jf5GN*UثWb]v*UثWN*UثWb]v*UثWukui-control-center/plugins/messages-task/about/res/manufacturers/HASEE.jpg0000644000175000017500000000665413543125214025763 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF] 1 !qAQ"2Bar$4%5!1AqQaB2 ?&˓'t A7_hYp$pq"߈AVȀac+.PW~<~Q.ZMeɿMFM D/Aw,_8Fvr d@Au1`(+E??(c-&p2&#mb&M{ od\ /|;wU @m˰x"lܪ̽G]GU],Hjii>D`):Fqk6]4j3髟m5UZ)yZAYM>V%WZnGF[6*Dic4M5 9||ajtL ,V,͊Onve )ȧּovWMS\ˇeS|M(TxP#CQ ʬiܜPU\[.]6a Q_fK\uԉb~ܡ@j]*NZS0F&$S`sOoVqNRmoSw'I|F\oiڕz˪z~RA5U-J2d%',fpOgUG =y[C$8Ւ&7S ;M!%}U`P*Oy%L*f!sHbf=`DTzL;8-u῭LY&&NiUCiOGTP֗STLF&A㻩 MkWWuTm+fdQrI7eK˷ζ+uzܻBRK.r:a=Er}N7zrT2b,2VaY& ( UyC`RZƖI),7~V6Bq-ԕpssm\Tnq6_tM;W e4t۟*UUIk -Qrf}~<~PN\6N#V%*R BOVIpug7Gfѯ&q*lCƬPjИT-*u@،]z^-i =w,R}?HjGk?F#7vZuK,@e+%gjTWjb=PYfmvҖu]7,p1'^͒[?*JIpۂwO$L U3 O%?8Yy6u7&MZHau#+o^jW|u~UMiĿ*M9Xjzʚ@F*Jb1ZbUJeL|!|PB DEjNR%ǩ.`B*ժdө$9 9'E3f P8{/lK4oލO#;@96Mg5Wu:^RJ閏¹Z v}%]Qեk,ZA`(,ز+e =P\֗be5\n5kJ\meQQz:IMDÕ̓?,h8bmiݧtyqРm!K(hp{c=u2P5Ӹ6⒕rjK*Y@7k*PL$(a4e`!(*`M!}9yO#ETD)%^1}1iy,42fPG]>#.[H1&Գ~UeŽTP4sC^FZy1\h8ro~Dq& ]÷ .>Q\*Yr]l 6eb< OǏ6EIw 7@bwB X AD~.K(.]a,9.F2rz"e;\ 1;߄mQ| otBDpˁ%ga.B D[ XvDSv?ukui-control-center/plugins/messages-task/about/res/manufacturers/CORSAIR.jpg0000644000175000017500000001072513543125214026232 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1!AQB q$"2#34C  !1AQ2Baq"R3$t%rC4DT ?/\y\TTv$NA:$:A8 ‰drxVjuO^EH*ON5UXmg,W'>U: I:tN΄N=;¤)$Y%\?*4UA{?SW$dR2JӾUx,/YϕNH'mN4A9s:$N*I8<(IW'ʍh^ƧTUI$TU^%@DDDt 9,>ts|_wSs`k'ƍwEk#:$֒L Uuz{":ل=a#[-l|e7a#֮9+u!WbA?HlH _ܻ}z/,y5,:L3G\2B7IXJw'ER`CܳzcX@#*Q?:"6H  d\侤Ik#Ek'%b Jr S"* 5{m=A9NQ$FiY%V!NS؀0 "u(pև ʛTV;hp $2JӾUxoj2&0D1Ӧ/0ɗ[yb=aKY$9 pMZp(6Mp`>WWzTU[eG13@`I&L_fk⩽k8m3)}%s\l0RBSy-spĞWHdF=X;hN"XM*1f6&Պw$tU(-syOk)lH"#/0km pHɗd:OwmԴ{%5oNF }^S|Q"vVfO=xMGR57R~3Ȯ# t/;{*c.mJ7-WYY#qQYq1#Q&bZ8 ʻ%Zz:̗Dvm=d\[;C' m1e-enWۚnkչQ/8EX\`?~hX8W)6iKg 0ݕ ;Zɓ8F1Dw, r_$YU]R(K bZXzAtUnƌ!x0Ki:4q6~edcL6ls1;*l"}emw}ꕦ8{d]4먩)?&t߇]".:ݿ6N-Ejj/-xfÏΞAEś`]D+9mjپsW^i:DuD>?(16&F>lAy[{P_baRIwX/{/o=Gn>%q%+9IFK>"ZT,tW F ZHS,vB{g\)3.d;9Hg^grl1߫錉f$c8W~=\*q;p vnFD+IɠA= bB%XrRj1xM1]aw˧1N 'y- F$[[K,5]i3{03*;lݰ*R`Z E&E*̮T51pؿk dhz?x%M5w*ۇ 1mͱ{ YCSĢЍqa0:.ɑͅ%"Ui[Uhs]]h+Mʋ~p.Lēہw1aBYM;^hlq9iVGfWl-f764̉=R퐜$MwEK"7˄BFU*4L kprKwT*f76C5.lE \%nM6,/+I,R }DWBhHdo W&6»HG^3Sbê@&9, 04mTߙ-َRiپِ9H_z BBy"37Ycʌʛ⏨63Ҥ |F^osxl=ܶ8'r˾Fez| ƻ:Q^AY'sSuH'mN4A9s:$N*I8<(IW'ʍh^ƧTUI$T>ǵO=?O|o>uZf^Ӷ+*UjN$R h:'DrBtH'RUqxQ,O* N֒2H%WFKt{ʧUZ'Tp Н ǧxTE$~K$FH/gS|**FIUzwѪukui-control-center/plugins/messages-task/about/res/manufacturers/D-LINK.jpg0000644000175000017500000001214613543125214026045 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF] 1 q!AQ"2B$#4tw9  !1AQaB"q2$R#Dbr34tE7 ?Au)$pq8CE˯Œ!pBLHt)13F-&Ό&,!8A5 ar&|0S(I~p^!C  prl4Sbg W:Ky?ef7<^2V6K]oP%PyOE%.eqdxZwe]ukiPx?x2D Quo}vX.}5#ZP8 ˰or6mwn7,`ѻr5lq]) *@̢ L/Rۥ|S֑Jή;*)! Аt>8! oQh3P RgԾkGKo@dѦJԊĪ+8؜BUIW#J%Q2"x6 .?psCS9x[V)r-nj'P8;)x(CcmY-erTzj ☛57H [3ZXBQ')[KJ~H:mT_h(w*z Zzo/VD^ڇ\B;6ջW|ii_|C 5J*PHf+ԑՑE~AW<[M˶6dkӳ#KD3O Q͵9"TApll}/2W2&#H!gfF4IejǑ:jAS\ Br U jqu6L7@TT0oQa $ I"۬}OUjROT.!I*at6wk0ۘ춆6nYlԌ.j\kWrŢ)hokSWuH?)r7)zG&lz~Ǹv*XOTMIJ.'Ԑ7, Q iqzQFSyH ,ɲ0(Y~Lݞ8#~@z먤'mI. M~7C-1kc)ci ⍡WR'Y] pNզyOSH@Q.nrM.ҪkmE9TR1T֬J@=sY{L#XP{fHK_6sik?O͟6Oh6n=),λQ["2/OE]TB- GyT'iӎ~R/y[k[m ^C)t(*mx [/QL˕9 \FHUFhZ2f Sޒ0T0/k(|~- ̸0' BT򱯳(ҊWpL mscpI.nwr-jC@"Č+xxejTeLTT-sS':4Bp]Wa\~RR3'_h57]~v-i$K3@ sӓpR8TR_Sr&ۧy${gR ;M+%CmsbzE%* DEd3c!{;4wq+:4>G.w A;#@֝b/ͤѪ ć(!W=JV2]!I%L}TVw⊺|l B ޫۘչXt&nemP/#~y_eC3!Ll#WMH2d;e8xxܼW@ۭngP\fPBʽ:g󅎩vӤ 3nZ +VකBO6b3>צ^!C,h=6m{}~i}H&x(Wt+ݢeU ~R`CW!3r&hKW܅/C8Ƙ*3F7=՛W1YJ~bNQ>꬧T]뽉Dm&Ԟ@ݣ2 8A}aXM{㍶4m UUȒ~BĤh$FNYݵWRʋTNc22RKudy4}?(y>|OXAQs^Q":_rP=7,oRF'qr$ʏ|P_(L 9q#6%6R?R Q(ÐSߕx'[^ rĞRRJ(7/.퉵{h^Zⰶ1 d΅lD}&`19D,תEeI@(&pz[ﶩ6}v6*oE "aRSS(~v7ofDM,9ԑ{;SDrzt*$YXgd@J(֪)g69w-xu•5!{L ̞ǖQhSdI=S3'8DݿEg!WcHYdפU%J<B!@uZsNf:OPwآ7::Q.kj~{~Jt<-mn$ISZǩ)=EQB\I* ;nd ,*\r^n=E {>6!qJf\[MRj0bKjuҷYKom$Tⅲ3!b#-xyS:TA ^îAw5j%J7؋tA91i L4ʖUJ'H!~oUۻ→̃).-8PFp]†H7-;ׅ7.,ݞFh'KM2xS&It7=л!5N r hc:0 \!׆#&݅ `A vaL%!.]xa 38-bDEˠw}OǏ鉜7?ukui-control-center/plugins/messages-task/about/res/manufacturers/PRIMAX.jpg0000644000175000017500000004204213543125214026125 0ustar fengfengJFIFHH$ExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:03:05 13:43:13]F&(.HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I9bI$I%)$IJI$RI$Zgַf\ыKir˧}`]R^'n:?9L1,t5'FBq?8@ xs-8Oh.7@S?Xlߩc sߠ佳V4._z8qQq3< .wT}FWA kcc[o&e^?yHevrnr"I]_c9"r3rcc|1q%S oy $d{/]k`Zqpnem;v7ɸ%V/VNw2&b7Zzė3oUvt@i> $ju^]z/ :H;nxkF Ԁx=2KZ1qzˀ/tw/xw_>~ٳD76/%1χd':?[n&Ck͵79OYϯ+ZMtp2ZK]CW]{u{!gV@#աRS˒Y8Nj!ӭV Kt,1ro2̬r6e[cSf5U-pi%Q`TI 1^_0Tif95;2j'3w+ͻtIt:y-~WOAee2X%D{u{z2Mm;J?q1m/.@S~#܏WOK镑.vM^Dz'eLtxWIԾu*ss} *  qj=c]S>PkCCAi/($G"3rqˋcW՚zo-C;d47{Ys~sZgPVDZsAk Y B]މ"gf8\V8Mǯ.tnbG[ S*՘3j]o^O[DN{?*/=[=I7HC& 7 x2|zI:I)dI:I)dI:I))"d)$d)$d)$d)$d)$ Photoshop 3.08BIM%8BIMHNHN8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIM;F]eyfn]FnullboundsObjcRct1Top longLeftlongBtomlongFRghtlong]slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongFRghtlong]urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM  ]FLJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I9bI$I%)$IJI$RI$Zgַf\ыKir˧}`]R^'n:?9L1,t5'FBq?8@ xs-8Oh.7@S?Xlߩc sߠ佳V4._z8qQq3< .wT}FWA kcc[o&e^?yHevrnr"I]_c9"r3rcc|1q%S oy $d{/]k`Zqpnem;v7ɸ%V/VNw2&b7Zzė3oUvt@i> $ju^]z/ :H;nxkF Ԁx=2KZ1qzˀ/tw/xw_>~ٳD76/%1χd':?[n&Ck͵79OYϯ+ZMtp2ZK]CW]{u{!gV@#աRS˒Y8Nj!ӭV Kt,1ro2̬r6e[cSf5U-pi%Q`TI 1^_0Tif95;2j'3w+ͻtIt:y-~WOAee2X%D{u{z2Mm;J?q1m/.@S~#܏WOK镑.vM^Dz'eLtxWIԾu*ss} *  qj=c]S>PkCCAi/($G"3rqˋcW՚zo-C;d47{Ys~sZgPVDZsAk Y B]މ"gf8\V8Mǯ.tnbG[ S*՘3j]o^O[DN{?*/=[=I7HC& 7 x2|zI:I)dI:I)dI:I))"d)$d)$d)$d)$d)$8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIM2http://ns.adobe.com/xap/1.0/ 1 93 70 1 72/1 72/1 2 2012-03-05T13:43:13+08:00 2012-03-05T13:43:13+08:00 2012-03-05T13:43:13+08:00 Adobe Photoshop CS Windows uuid:909f7135-6685-11e1-91d2-fc4f58cca079 adobe:docid:photoshop:909f7134-6685-11e1-91d2-fc4f58cca079 adobe:docid:photoshop:ef3e3a7f-6685-11e1-91d2-fc4f58cca079 image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?ZUثWb]v*UثWZUثWb]v*UثWZUت7pT_i'~\~aZݎd#:HW+^^aAt}Ysd1^C8Wb]^uY|".  Rٝstz8rGgxokkW7Y`z[SU-b1Yf&L##~{|.M tkgu%V@o\^#B2cC2OBirnegD7 ;`ѓ#͗x8ac/I?5|VfwGqdFR6#/WVbL=͏03܋/5{-uDf)"u9Fy6vohS8VK+_C{VFQ/./':xBb/i5y#5.O殧zg$"Q~(ǜ8jzŦ6_kNrps5_HK:#Å~g0uwO MӜ~j͖>vL&Nwͦ ,mVhj8!#Vп,kڗKAeN?PzF5x;/>\YL7tR4Ol:}=L\0ˎ/ &q-MNUxgW? 4W]1/r?S{SO6O:/c6ڽ;\` [40Sj:?z_#=ZPHŸ~ir7ϋ12~]KMn}FXŗZRr4$=q˦㘕]l_O,"\Szة̺-[""ĨM֤lj8#T p -HգJH 2B1٘(/]=MnjT** W陇Zjgῧ"徑收fscuiDxTmr:77]ِWji/X AdobedF]    1Qq !A$X 2B4Dtv(8HSd%5&6FV"cG1A!QRa2qB$4 ?&QsL j(>(3X23Q&{(0ډc_|; \%XR"o[ (X<rD~b2<"NQ&|Pfef<7 LoBQ.aqL8 v]JӸxl\I=6-;ґ^H6r~n&ѫ-;ґ+^{p6ZRkO"uk^0p-)tZ WU͇ۚef_=AkۖEQ!׋  +)Z Nyf+`@rǝ{}} wa4nڳWi& Tp;L_Z Jȷ*I@8yl*Cpw[EWO.ž:_FyaV"~2ē}880Lk0@qb䫻42;n72RO%*(M@zul 䥋mÞ? /EmZW[qu_Q&tMMSUGMvGj#N4_.Ph1Cw׋+(&ch*{* K6ܕA=?bhTb"xY%Ͱ* &,]|ߨTYI|1q=Dl +|?An 'ThJ2թPͣv0_nDs'HNg/q h#q7M ~dgX8| [/ˈzHy%]٧y+ݣd&?ZWtުEMuk4I<ͳɳa|ȉ2~3_~4Ͽv@a\hAk=n|AAr',#{4{s{_q]TkwckN*MVZoJQ5wɐ'!6:N5Nr:\t&8J3HTTk+o4-֝M5iyLW}I`jm~6Eg$D2TjTMUGxJ@`vCjOsUM]ת*&K9.vvR!m]ޮJjvC[pɤ[*z~8OxL9cv|;ΓyU Զ]%8^V8qUj Ȥu8 E2J<6P0zȩO6 a*+Cu2M=FW5VCA;jᯭ9Fp]fR&}JPS1e$l-kmEQt{lgQ{c& VFNTѶ^cg89JB"=\av:Cڥ欠PZ⾪8kWۙԥ]c\n&lӮ]ͦEuR&]NU`uLEuJÈj#34ݫV-* 무ռ}|=G3LQB.3wބ<஑X_OA=5Vyi뉄(]O6 T'g.J:P)&aP[_H}}=Ci@J ;ڎV'f)qZ5Vmb=bϷdΩfehS:p- d:T: v4cmPoJz}f҉򞍆``7/ɀ =>;lD[9'QSSt%M(n:"Y9If 4vle7#tiŞPv(`Lup/}ZQZzN#iL|ЧhBU+Í Ж$rF 1Li|54{:#:hOA>SXKbK=_)/1I}3ɓbilZ=m_{(97by2lX-?sVx2ذ2lX%f#Bl=Yc2lX%Y=^iwbJylFDZR-.lزrX"l>qz9a͋^\uc2H|OS՛5.^\a5cjԃ4رR˂,.} -?֐xN͋*!¬cvAt'D3b•/c^3uSs5fŕ͈eLy3D2L`$x"nDބ?\wj%~q@(ysaJ򀉼yl( `Wd7g܈e;QDAID23ݽDK2 P*•xP@ 8%x' #ukui-control-center/plugins/messages-task/about/res/manufacturers/FOUNDER.jpg0000644000175000017500000001140113543125214026222 0ustar fengfengJFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC  !"$"$CF]" 5!W1QARa"2q,!1AQ"aRq2 ?`~fbx^wk+ O?Q o ƔḢ^'guv!JGRRkFz1?pӱŤ{Lezt}eVc zc;53\1_f|Og;u8%OTfi x`oGIzB8T6duZImi.ZB\6rHvZΎi7%gݨvO>f|O;'ڟ 3>E'8o\#_P@iI*[ۥ&HnV6EE'O"+Zqcn4>EܛϤi7R/qNTFi夐 O9s!yrdIpҍ\"&O򗆄Ef;'ڟ 3>E'O"mLO@3쭸S:`͉Me}eukui-control-center/plugins/messages-task/about/res/manufacturers/EXCELSTOR.jpg0000644000175000017500000004532113543125214026500 0ustar fengfengJFIFHHExifMM*bj(1r2iHHAdobe Photoshop CS Windows2011:12:02 10:26:26]F&(.hHHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IODONއMޏshe{ vx#t̫zUm\ǵZ#]utRM(ycQfEU-sq֍)Hs7ELS~#mź̈́6朊;~~.eQtbjZ ]Wcl˵>tNOȭ[]c6[9]b0Mӌ籮k⬊-guͫKgEӤ2JӠ[5=fNOAƳhqu;kfʚ]hG}ƽ+5Vzl^n]*I{\qABl{eE^3ԉ{^H8lg{]iaW>tNOȭ[]c6[9]b0Mӌ籮k⬊-guͫKgEӤ2JӠ[5=fNOAƳhqu;kfʚ]hG}ƽ+5Vzl^n]*I{\qABl{eE^3ԉ{^H8lg{]iaW 1 93 70 1 72/1 72/1 2 2011-12-02T10:26:26+08:00 2011-12-02T10:26:26+08:00 2011-12-02T10:26:26+08:00 Adobe Photoshop CS Windows adobe:docid:photoshop:cf644b2a-1c8c-11e1-ae7e-db667b27342f image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@F]      u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~Բ uBc ( oz*S֚M47:}9׽uZmZ+/nuDxu~Nl.rw&qDc'ȦJn Ey(NleandQP++9 i] +B|@?"k?;Q7- aveV+tb0/ệP,MMW Eqw Doxѕi:X(Ej^ܬk>aBx|@bm|nz~QlNߘްٹܽjm}2mԒÏj)઩Oxm;/f4\ j50QZduo۞/n3+Rx<|^12ޟrAH }P˪Νۗ|gZq.ur=br|+ƕ!5*-g|wϻm}-ۼ2D%MEG{sͣm$3nЍ󾻏7ۻϧo쭫iu?~}DcPlviS=D O%5e?HBM c]+a'16SS 8FVr-pTmk9:l#^?K$]>X8ˣVr#ҺqW%7`m^˱Mp7`mmfj)^Fo%,pʔX9$+oj-濺JN0*@UɥI#uIg%ƈXq~@*`} }Wٕ&hTj0Qlt+`6hR=S)23~ܯ+KenE%3PsVH#F $7{E4 d,[{<.lO_5c^'l^R0_m-]!')ű#* QOkk^N;WQhÚS;/q^jضq}PxP5=͛vǎy݉л#nّb${ٰ\vG)ڝ9v[*aj7<)iH;w윋q70acVHբ B*iGD{򽥒 )PNAJSye}>_@}ożV?oOxi]NNgϬ~J}}+ٯ)>ۻwwB]{ 7ioՎlDeqcpPmMGM,)Pb$5L\*~$qoG)1č&D5n>Xܷ`S m6]ɫ> i"~|mKoT򝫂_o͵dlnݛcjmU^95 }>^Le5 4Ž|K{2_7Qf-KCG4CQ $_lYxmUg#B4)ANπ'77T¯Uڏ{}옷\mMv.Kj՛)u01uRYzkfxm6CY `d3)s]Y" KJf}Pjk1-NM=GNzK“RR:IjvG6qC@k.j{ϫ{'~G&I.ࡇzo῰ݽۘTlcpSdc3bB zX᭑ܯhl,I-gT5j rɥ* t˗vwϺLZʅ&P"SꋿƦ'67Ŏ鍧va$Ϋwa$؝mz'<'%}:]F]WP:N^s\mo./YX-9 ,¢2I:EGQ<}6n'+UIJ>($Sý{l(6퍡mnt6Z~=7'U  )55(5]ls^K{dgӈ^yj@rjr3.F [&<0z(_)o9B쯘!vWgq]nޙ^vm>s %DY)W3M(C}?eg6QĆFF& - 8U5 gvۺcpCJƎ2h3Ǣ[n;+Fn={~efrmL&'uݼ'C%Jcq42VGP\W$ͳmװmVpSOBn`6.p?t),Tʔxi)ZFر$fB\Iw;NgbY*MxytDX@`~^߲mw{]hI>Su$.|Sas᫦1X{S\%ԐxUVCQ96[c!;jM`qǧK3 lڬUHyS W#5VRˬVְ}ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ukui-control-center/plugins/messages-task/about/res/manufacturers/ONDA.jpg0000644000175000017500000000626213543125214025652 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF] 1AqB !Q2"a3C% !1AQqB"2$ ?&\˓_'T eA5^Ȃ:I~YE˯0%qFƂJT.];Vi4し& NA5[*A56(kP:uQeAϺ^aEPJˍ\`wQ]b)ql2i].M~PkʶT(j=lQק{" ta%ugA.Š +PtSZd [*su\/Se"$ivJn͋6D0vz:oWUtSnkw{S:.(C-䀘<+p1ϏG 1I&7gqMz׊KdATrL{2Pfx+b 7M(Ԋ*M(\b9O_b%ҘY+xࣔc*;O~㾌_OdF/[JԔ]]<+6-wK<^Xtmj>wD? ;M>GG>?㛰3rv4kMn(dH@ e[vgM G^+s$ľ({aԗ3 Oq~Nj/֟"P:1bfw7Kb%ؾؘIX>bHJsc|fmH̭tMv >%3Uf|ml}{-z}chE_TVZD"d8;wx-TkBgyQS(>5)魸  O]i ñ>az1^Eݶ$9'dFfq cp)Zi˔derg=n!z==sqzC.bx&"ujU"y\g(P}]o[*qNuL+?CYKoJ M 2LY3Rx@,fir cwO6n-FCE3H4C(I J"ط8=Mt-;ȰGtboVL)iM2knpXƢ9Co\lW4k]qeZow7oFnoNǎ쵕1n.|'&Ưvls -aD,=*S6i4し& NA5[*A56(kP:uQeAϺ^aEPJˍ\`QB)ql2i].M~PkʶT(j=lQק{" ta%ugA.Š +PtSZeһ\(1:וlQ{(آ OuBDPEK>΂.]yA+ 7.4V2rEuʵŰIw 5PbuB *P QD^.Ӫ-}՝\ *Wn\h 4eB;O/?kaukui-control-center/plugins/messages-task/about/res/manufacturers/SPARK.jpg0000644000175000017500000001233113543125214026003 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    !1 AQq"$2B%aSR#s4TdtEeH   !1AQaqB$"4DT%&2dRb35EU6 ?FY*F57:b1F?xxtXJ|4 Y#ӿ,"CXqO-ɀdEyQ"}^]J-u(kDo 7YMrta:b+2U1N谔&iA7"GXXEȆ)[!r=;D%(YHCiy%1GLܽ)lFly+誫5?s3!y`*riɘ6`p* < CmCH`ݛ/i6tyAU+)*śi>#. AHoX|R5H!A[=ݭ4jԊ~a A4WhKfót-^8F1C nzR{\_ZbX 0s6 e\fL p~ϵ.̡s3,}2xy^}vBMw ݛ2P WA;\u[ѻMxY-I"MAJHQ M;3ᦉZ{`"E !`!wWJ,fMi<ό.2 nǭmh(t5wLn?ź]cYO T}ɤM*,h\p j ie-Ϥ-5:PLYI_=fJ\<&D6=*kKSjadlWtᢪwIj>G>_.O1&zEfлӧ 񧉬ԢىCu^p'far剤]A%Q?FBƘ@!iFXiQã$P~9FC-ܞ-?Y . h7Km6rR1fJHazV6VMk30&??x<\yjO&bU du27N,@|HKpM]z%m'0u7WvmnZ]j-Fu³s^$*W/Gr& gGh/ ]=0$H8LܠBϡ4&-m'2L|W|і*|vV\[Ú~ZJO4xI^EړdfM5ȉ׉54:mWt+:.jQug7_?'>aG:-1kVZīV|p>!(:6) z-BkK*ͦ3'Z)޾>IgP|l_[9 m#2u",ѹ\Ym{~X&0(JEf;3Ԛl+4@n: 3u-Te@ !ͰǟU:/`G,D{^y!Ϗ[UZKX8rQSC:=`[fǠuvQ"wzpMr'cQvqE fq˼5It#DuP..CteB;v0Xn[TroV OK>8+H(~j>xn??t_.}x}4#}1jW>bVB]uBQT"(U<'eND` #vծu |Qݖ_}>^pO>PuX17mDz$\9h&7B|h_&=4"Uۭ!wi0FrT -^~W I<ԯJ&0$Gl,JjXKSNqqMI">R/UɕP8CǍ*e 4;.ݵ wWTqYGԟzL~\L"7+]F=ts֜ jQP Lu6)\(t"U*k\=Z=Exjr7W.Վ] =2O:u6̻t&M-ǽ5*"&B69v%JdζDEZ9.HOJl 7=R1Խ?8Tv9 TG@[\w+v)ŨE=ud3*l{n fέt}ٶ=Gκ8íve5y[" Z ~/ V.V S 1Tw4zr7.UUYό\y3܎4zP[dCUiVTz+ʅ;}_1go[릸隩ZobM#"4&W&-,<ݛYycao<013"x˔8u)%44GW䅘4'8M O5֊spB_S{ u֥iɢ(/#mo\﷾Zon<"m=E< UJgM+4bQFpnZO9p|Hc>%?wgp\մ >8]7ZF(lfDD _簜/5m+G-/".e RPL|r=8ua~ wy6l-orõzA8 AdobedF]   1!qAQ2B a#"Rr3s$1!AQaq"BR2$DdS4T% ?Ǔj-qW&!Lf JIn=Թ"M=R zzJ9$I˿PL3H \ѦIE˰w|S*}=~3Mرi6ʁW&!Lf JIn=Թ"M=R zzJ9$I˿PL3H \ѦIE˰w|S*}=~3Mرi6ʁW&!Lf JIn=Թ"M=R zzJ9$I˿PL3W U]QI!2JubOnŁ3( 6mDtF9~l5šFf}-CZ "O޼drG^8p7-;uޝ0#zet ∆ku&Z[DcQ1GrF|ܮmKKQMP *>վss!3[9 VPshGi7&-.%_o6+rA梂1agÂ;roFZu*10.n?$޷E?nִ:\*~ -.TaFT;W8K,*}gK~9v_)(isX:Z#ui5: e/%_{C_0c5k|^'c:>ާ„ジ6[HG9U1nvR'SiNQ=Mix~?xx\cJ:*dhPY>Md}F]/ŒF nT&wJSaANfKzPצ0<}(j;mQAHa >奜|?Gŏ1MC?&:-W?< hx)@5^\UӺu\#I9+r 7ղ~ߞR[='& #cF(4Fz FFV~|+kET bvJz}T%ÄVlz*kyؼBfY?FLzA}̝k V\$L/,w6}%n73-W+:L1Nixd28O\[i&ScxKa27F{ x¨zt[mJ7k}BU( Q;w7t}p}*1.Fq>Uꊬ[ kWCҥm{Y3#7/䤑d>*Љ[^9H KklDUoP\r&tP#m7.,pK psY?WOrc11ͮDaTzּ7*g2\׵>v?G`~ 5WbŤگ*k <@y Sqb%P*Ux4MӞ0^LMnnӇ=޼ξNyk{b30.h;LsZ#EaQ5&@D.WRX 7 AJwo<!l3Qpee|0qqG"Z;^ܭ;Y- |?!>ִvI Fbl. ELi]ѯE2D:^07M$D|KVa#rO U= }/:-|a{{&C\ia&NYY-LkSE3.s $:v;mq(`gq4J6V=륾qU' c̮@PD"!XgH̆`>'!1J5.UMF$9ퟠƣAH5F' pOXJ2q [0,?mntGMvEU:cs{˄}#Agavũ& 0z{GE09cX󋑞2Z57)t#.=]R]}QzV+._g^ߠPNcĞ+&v'-LA*$Y`HMnEc5sUVKx{vk c ⍮hۛSENLj'Yzmz*kuرi6ʁW&!Lf JIn=Թ"M=R zzJ9$I˿PL3H \ѦIE˰w|S*}=~3Mرi6ʁW&!Lf JIn=Թ"M=R zzJ9$I˿PL3H \ѦIE˰w|S*}=~3Mرi6ʁW&!Lf JIn=Թ"M=R zzJ9$I˿PL3H \ѦIE˰w|S*}=~3Mؿukui-control-center/plugins/messages-task/about/res/manufacturers/NETGEAR.jpg0000644000175000017500000001054213543125214026212 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1! AQq"2B$5 aR#3% 1!AQaq2B"R$b5#346 ?L.8? 5 ϻA3'$ ovJAsIO$Ah\$QP 19$X(\LHT |-&XZ\QH&}%D 19&L{R vbJy$EJϼ1"i8 2ErbGR0fi2**BA3*&L4g݄Ґ\÷S$w0*W.}T3H NiƉ + =?o5_/oKp֤RE8*^:W9<̥q<@2";ɼɼl\[KSm$RzcV,L_2R eX:(x}{nUuFQJLeTʈ$XBƕh` nߍ=.Zݵv4N1|^DD0f#ΐМ+z|k/&VYxTޫdrM%Iy3+&hEpgyl˥C50JSXqE,oR,fYC^,RǏo 2"' CKz+@S Gb~aMd _ i1,4 ףQ yR!qTo6u|ݦDF$. (QQUރA֐ GMp֨ƣ" vȼɱЖ /NzSշ^LϒNIi?܌qޭ{íۍIJy"Zz ?n涟 yycE&Le% qBdVbz<\ |6TI\Rڜ_'EJWɾ]rUF4ʨ)#"dvWp̈OC a.ٮi#C޻ ,ΟKNd|*v37ƷXylNƤ.;vNeۚF!fHà:;y, xi@V=s5'*tG%2C㴘cǷGk\\32R9V]c~R޹rQh]Z:R>uw=H.Ah> UiyL 4#f,U(S6ͻCnV3 81*j9=1^gi,8ט*u} PΠt+eLW *=| &Y}l+ֶ䄞\[}+klj'Cŏ7GN(q;;+]^}kfQۏ{MHPGc2i,BSE1ʛ, cLa(6y7Z|@:1N r_X?CMP-՚ZR.].9V { `sjk_qC&+{&{/7(ܷAo1BɖkB[w[U\д޶TuChh0S{:/PU4(Eµ~fpMp >Y 7Ɔu5BvIwoz[^8J\H\*2hV={ (K\ H+pdžl:?cm-Od7D{xִ-_z돡b^R\Tt b9UWk(T*ݎsŽA/ jƹaë>U 4y~a'.}6VJߩnԕzZhaMLbSJND@[QL%e/6[&w(K,K=(@.[HLl=\\afewm|&W ʤV_S6 v>f]D :r.3کgCosmϷka:Ҳ2&RpDQ0r ^ZEUKcfk@sh;ie(M -.v$Yr"V`D aCE/ۃN~if}v.$r%Mu)83^ ܗkI'DvC-FWb4o 1nlߙ6;n0GH| ݄WP^M"d9/͗Yܺ hzv鵢w{{VJa2RCU,}p,!bTYaUXuKoK#5~_.g ^o- |fw|N^/6J공T}Lӽ!ݨ$KEEe$)v3f|frU⌂3UGɌ3FgwNj$j"jaSnu58~|= !Z k}X'(-R%zD;Ra#؟_LV@-FBZOMDP  p}6n#9jKoBԱ\4җ/,ArjmSp}w~"NW7垈Gt ^%pn88wl.,|,nLX$>i~H&}I);{1%Ċ*'4Dː|JŤ@? 5 ϻA3'$ ovJAsIO$Ah\$QP 19$X(\LHT |ukui-control-center/plugins/messages-task/about/res/manufacturers/MEGASTAR.jpg0000644000175000017500000001171413543125214026332 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]    1 !$4AQq "2B%5UWaR#DE(XTdteu&Vv'7H !1AQTaq4"B$D5U6VRd2#t%E ?>K"-%!91%+LbKG @!-րԅ0h  -! S*C H5f );څ/`O{܉HmdW b1%؅Ė@ KhnB4eAڈs)!ȂB0'D6^_X- ~z(Pv7b;Бr#Q_ /WK-֟=r={ճ<_|H;ہ[;3lNۭZ!$6et1B鳧UKN*ֶP I"7<$UҶY!VәLpҧOcEYuk( TZ.&M*d $mn䙥 D8N&*ފ3nc2sTL=m+*&Uẉvy3UٴB0Ɇ."bBsAO.Pje8yM&:\}qE@ ˭﷭﯀UURD7M&`k)dCDpk:6D)7TL-FZ=aF\ Gw9AT*(*E8kn {ӕf7!ia = %d&[SsU 2_4Ʋ鄉//&3r߀=n AIo=(2խXu#c7~KwDf;5C^J6od)ImPla4|BVq՚].7=^z*ZӴ٥e[@gzIS@oC }^$,%d:;ۃ%euM56ea0<+?*ZX s_nuSih<^'16ōOUm":K|/7RNEd :cI$6 v{^ۛnKʕ(XLZ:!ަ7żijLsSmSb_zbJ{%,k+w}dw7Si 5T$Φ!8nSF5-C ᅝEkskQanc(}O" ׃_1$`!lS0iۍN]MʘW6KLIK+K 6x0ց=wS٦t)w=C7^ w 5$Lo)e5E0glJH[;pчnbf fs+3!Xy8JSsXESt`˶ @8i5,:V8۬W`H,jRHgc]E)"3/53sVᴦӬ϶~,{r.zr4,_T*Zf?3]I7F|4hh:5!sDJd+$7L FNH^h!xJylxcb C_)^* Hl\]ꚲؽAM5MdtB{d_UqոrVI )M#H=g[K;61sZȟf I}t徬T* u%yΪ[]"LA}e;4qTzzG AdobedF]     !1AQq"2B$5 aRbr4%#SsEe6v7!1AQa"q2B3$4҄7 ?<-qKi cD٢X)D~m.JQ|?^|ZR$I~{~rCJ0L3D510K>`4ڙ)}V{ZN^T 3R<[z\0P6 Q< HB~ K&zgSӻ6Pp +&S2l v'xLȑ+JΫ@Eb\ʕLR;?GCj,{i 2DpL@ăr5`)SV2>o&b1Y. R R .*cnNu˚S(ͬ|.mre$@Fts9WFQ? y>`5{T?њorIݫʁ_=ηُY 2$$lJ0/xl+n\#Z*Tg/8XwU7.TFҫ&{:A@njQRuV-hM:FYľ|K*n~MJH!'{5Yz/{03vzS\6"*Bm%Z>L`R!jT N*aF"!am}oזƕgh'uZ|DQ.d`fh0Z4~I+ܡWۚYHz^WK@K0A֢ؗ\9. ?G:hc\; +~wӿ܎ZYuJ$Ɲ1ǘآ* S7 Qc*q9Mٲt{n :\k@c\U{S _vmܤڨ0i&2I:n*^[jhPUqkqmgl_) PmXT pnT;i~E&YX5Dmz\Ȥ 텝ۇ85W#hc* 1 *gf7}mC"ecwm\*{=#i}. ~B*#fD+8sb:zs6y*~L a1֧ܣt0MIv Śi5K,dlot:y ʤThKmNτr+G Tg>(cQ|4zۻymOk2ލq%! '50HƳٚغMЦB$`= \'ZLQi;yP+֏ WZ[W?)W|ڲ[-b|E^W嚪 *ogng?{IJ. йoW&əH7 2f|+nGFUk0Y+yX/2U$[Ήo[bw}#KQZ3TslXط9e04iYls/ ^Sڎˁy1݃!ZX0x=NzX]7~Pլ{÷{$YO6};tir%YXAzY,kjSXک2}6X|W{xPfj^hX Օ َlgdV~^aTlBȗyKH5 (}rE;r֭@'D~h)PowR???)yzֽ:]gM,b]oHX }tv۴b.P /ȑ{Z~w)\ƨDI0T|Aߝ"{G,ͥ;zNx]al~]GlM1C4Gh TI. +_Ց*TbW8x{|=+{_k7&L^ 2lSs[ =wOKu| y $ $JSK=_-HD &@VzY^k6~±Ap+h(ڼ7KkȮҊ$Ε&`H%5g0,̘31E!1cvDxv݈t\T2IegDJJ p $8ssaQi(Ç X(5V/;_'~ltO_m.*FфUlu3}N<4e1ە^L 9aGoon:sFSXđGGɛ߮d,V.'>w7ik .OH>&Zӥj:ˤk 4h O.7iR4sAezֿ(FcʼnTÊv-l<>تu`$1 0DW݀MǼLlpašE0E0q\:6-2p\I8via2`w/ݴo$:+j1̱X!|-πJֵIA"^.8hMǮ}]N۝~oxDKͮ?2>+l`317v Z{xݕ'X )ֶȜ[هiW%^鵺^9q k*nr.=m&g-6_/Dp@MnfUcrU%K6 PG跃gYn Fd:ewZ4I ݫ ʷ܁'Kg>Uq EB|(Ӵyrm H -Pʫ*B,TX䅑Ka !PW8!ۭDDJǵ*3e{LӜNSGmLL ZVR/ρiȻ&70!m4(Щ0,Zҗ)r@*ɝb|$ Txd)}ɼ#txn F]{+(FAwk hБYz@"V̸{01˘1J"PO ɓj<5S1\'2/ ?v&:R c,L.łXF\,d+4>2w?&?~uŸ&2!O$lé/rܱ-]2Zځ<ƏcFDUI]KFoa*:p9(1]Eׯ5{=:\r4L-E{M-b̙JXP<6.2ܪD)RcːHNuO<ɸI Ҁ[֚1KYL<҆72JZX7'4͡2uGʲ:](>9xY[G.FCCnIkж eX VΈupnUA-q& Tkw!YD|^{<S̹Ox<^/y~fx͗ڊ}Vۭr|վk^\*NʌrG`X/YY$ۢ'TCS8~1-Z]弮sl.O>0gi ڛ~pd׹**vvgkFKx$jZ:˕[tdE^CcJ7tnV|e+;9F0⻸Rjl$Rr+ ]ke˦$0檷cܚ?à6¢sm,A^g$q3$O99Ȣtɒޥl#㽁r.Ԙ]K!.#d=>*~ʝznsM75.$ѩqUN]Pu $Nl䛶<-r]ɸ7vzlabIA<#4(1[ҺdQ0d ;y"փ^M:x̘ uZ㤵4DƔ&X#fDy}E\Kr H3҈ =LbbH/C$ rtYPɔ)k(]Ze:5"]ܷw,7$ iXF4'cLτQ`:D4y;v&G%rI1Za$8⮞+ 2 (w!c^[B9j9& \%UqT-MMDr$Na(ymgSom'%ko""2 ';9" Tg҂Y3GgLsleB,l7n *܌Ȩ);Zi*pK+b>Bse̞Yvv7}N疓8_~}+( %EJ0V#oiR 5xhv# _2컷$aSFX&]2k]v#ZMN y޼}Znk2Y$y!ҲNȪHr[nG23*:Ѽ ^'sAj_bI ؐ٩VÓM79 ~p3wcg1gR(-12>Mc fO$ZR@MBʈ/x|>-)S$x=Fd{&K%0}QL>߫Fiukui-control-center/plugins/messages-task/about/res/manufacturers/IOMEGA.jpg0000644000175000017500000001302713543125214026067 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1!q BAQ"w826vx9#  !1AQaq"2B345uRs$t7#8% ?y8J1N}s9VP9x`>4?ъte,=Zi\d n ͅP"W+JrMht7kot93N6567vU`\@NhBXYf'nEc& 24+iI1 EHwo3~cz zMM)̽mu\Т V^{CL2004 :ա('ꈴjt@0rs# f hxC./.X[!S?HtS=+H+d[ v(lѸ\urj*e|Onf6)5;9p4̸:LSR]zo\ܒKY i+BTĞA|hOxzuk=*röDϘY.ۻn㵓MQce:j1#Q>/ՎLQkDqmlkXTr #!xY 6@02T|oƓG0{J\ڠ1'2N|cIYBI]2TЭL@ѪP=:0rS@C[P:X) (X d PPrAЏLiqDZN5: 99h CIYCz(oŏT:ӷm1◊td~N(՗!wxj{DZ>lZŏG{ ~ Wf'>(ή6oTf PPrAЏLiqDZN5: 99h CIYCz:dȇbU?MS,N hNJ^*=8V^~r᪙ǸW%k=m$'J52-]_T :浾QbӔ0iBAuB=0POw٥ i8cP/^^&3悜0eQXA@~Nj¦ڡY * c/']uU_g]fz.)e2^mZt 9Ri`RdBbr~FR$mŴfOfiƔUHܣ+D\Mj/kH#^s)#;|mxz--ґ.kԀ۠K]GjSI uOx w"IЬek>F4$;_Dٖixx}+UmVӚ뼡jyӘ u@L9d0, jUqP 0@]c U(/TRbqZ5릝QWZJg1S숕ڽu-J_uSb:Q @KbsD$۝溰gtќ0PЮK$UPTi˄Dype϶, `V{`(jZǦ|yľ91/Xm'm1/|QF8KUM8Q,2a2GS]W3D&CC"٫n6 Ct+W^\ڔT|ߜu;Ic!yxdNd=!a9ԑYiOl鹻6M-z`NdyD#G~/i9(HL3QI&aFvKaKgSt*`5TҮ2: ´{Le.MF;%X71T7ҝK> Q wI/g!e\nywҎ-TL̗scܛVs^(]'7תwLꘒ $icΘ̨0jn[ny"zN:Iu.^6e`,('X0F\Jo\c_DZN5: fjb齙{-|y\珲͎ RRP"r9 6RLvKH;kd;'Y& ut1XZ,emGgج<ΜsB4UHշ)$HS7~@R"q2=2Q[D^(7%= j(v) 2t-SG .m~# Udw!/Qadz UgMy 5L kl;N89gO^X1lGwߚY ei *X$)@RJED74ޜ纐`ӹjr=镁^7]e91.6g~X{kf.Jf1d1b fy[ Fm 5n);cc]M騵W-]Z5=IU'9f-V +(YlOt./ԜVd2xYq&5@%S>`)C$c<< 9r-Yvv*x֫vYZ:W-Y$FEE'\LkMscg|RټI'7攔2ClCL _Upy@7kՆjZ?ϔYTm_`׍īɺXjޫ򋦎D$3$)9FXsk2*!VԷk]hβޥF@D2! Ro*WYj@t`eoͭӬwS-=9})r#:խzcOw٥ i8`Ѡ0G1 %e  C`И~;}ZG((|R?)d"7 x)mv@HSScš4)eu#70qBt5SKbQ:|(8L:=n7FI49OMzD%zhJj2"FlVd\N=] 4>(&Xԯ؎0D)XQƋA[ AdobedF]    1 !Aq"2B Q$a#34 1!AQaq𑡱"BR2b3% ?M71H&ړAn>.H/A JQ$w +~҈&4e@mv@zSjfi6@HSoݩ4H&A74R yyKP2w (a@isFX$ڊ+`J>)>^fiKm^T 71H&ړAn>.H/A JQ$w +~҈&4e@mv@zSjfafRyexD1穆#EOصx-[Ԃ }ǐvS"FS}5sn2ߪ%((^vmK{OȐ'Kuv:: }=ٮ-5_$|+a$ўKxHn"7W׸L8?|jy)B4@5`YRZ)+pL wCfEy5_rH`a'ػ^}8-ڃɊuR9`h3$fܒQM$NCv=fכ:vZig ?7ͮ9i|bX;Gָg qR][׊+ZU 2:k) Ԙx'TӪL-DZfxe{"iCR g.@[Ht* !_W,@]W Kӯ2n3m5s_G]h\]r$F_CM+"/Vݣ )9<0>ʍwmWEEPb8d+C36<&PI8!U1JER8IP^c*7% v͙OC!au[~U%PgM1fq:tдI}Gf-4r:bi4TZ8uK^d÷RcqkyD`&fVQVˉ8[x{1Kľi?P8~7vGٓO)<Ŝwzw]dh9]7 *vv @Zu+ǣ[xA+=%(꽘+$;\>/^U2Xv`;֟]lR@ɪG#UgZX&bo¡FVS?oQnĵ0rʼn-š TS=ʜ?2+tgWS{/Zׇ]d/26O@ֱVPlZQWc]D* 0dpUMx};%sp8;A}Zbv\%HZ:#anPlUkOm0A5g +}gn&y}=l#fiY;Ǣ$aqcfX0meՎR徭ZWę:DݠDxy[tWVRYUqp{Xze((/ziH8ĸ|#k3inN].T#-<ƜE'2jz̸UEr:-bRgњo]5vrG|η'=Hm'b*X[X:4aћ-J2M畢@ 4^d|>'4 PWzJ'.]mYp'#7 ) ME(cq88$b ڝk1A+ܲr^B'.53ZʸTgH PP#F/T㎢ۘlj':;.A-0PR #)ʩ;oޖO:^~r1`fӯyًC5g;d2Ko*]>tS#A@RO-ԡy³zY= wk JHޤӮQ i*qfh?Վ)]LK~a$ ֊-oBX%n Ӝ.,_8lN~5!%}}Ajr<>-i)+:sSC?kH|7+r+!&IH`х DGy$C*d QS۞g69͍Wx`r/i?_Ͻ6fDJ/=n[>٩3`I& {%xђzNRp8k%]mޥbx]^f5_%I*\B$~IA7F$R 頏ڐ]ͥ(_;Z ˿xiD K2 6PA\=ZQL53MXjUɿ)BA7ԚqirE ~ AdobedF]  1 qAQ2B!"#4% 1A!BQaq ?Ǔm}#2&MǻGEM| o.~\ [;-`@me˰w"?Ť].M NPoZQ{tQ߷P vhI E˿0P%P\pxh)kl]ZMp2&MǻGEM| o.~\ [;-`@me˰w"?Ť]<1֓ z\-& vF-)$&wZLd}끪8=^<<EG{WkvUoÝw ttcG.tC }q"FF* Jm2UpX~]c%ҋ26NKkVDճҩӡr[۪Z$iL8rZ3GU &ZA]÷EBK? g.]- yDקSE%W2X7Adh;qԳddEڷ`d2*hy!X*Ujz&=_)PHpL<C^mmI~g-D}T.U(E:sm:tSZuތ[OG\ ' <?\?G՚w7(t,T$5eJcXœEIY>T yVqX">c6;2#)|*Ɯʛ`T߼W}ݾs]) rGӣ oI=;1Rjiv'CgnoI#?U43%䫑Y~=!C ncE둩SR{Se;CNNtMG $XY6yHK-ӧ;gq;êFWUJXӻ-Z1ݺ8z#e:d3=D-/f0d Ƃ̯%F֊q4=QJ#bD5"L6p5-%GnEQ- U}17Xղ]G|coU>gE%*Ʒ@H(JnB~nT}WyZr2ǩW#|J?I"TX;T=,W> /yU2|A܆)B[Կ6[%"6)vG,[&.pD$O_OJX.>ۨ]dc4.ھ]+| U<-QU{TR2& 6fןWebmずzwGZ.n9=A] nR4Ƒ&xIR*. SS-^`s=`~ ߙd|S,lt99Abg<3zd4!H@FÁxpI%dۦf\!o1q>Ace) o]T=ȫC";(W *#|RUxb+ي)% oXۭ$7$rP#IE#dsAeW!B2j '±7y!=80K0fqۇXg4.#cDc(VJG+pP̥q0Zʭe^韀y; :q́ oSqn:0Ec:z9x/gJaݍ5VZ /o(QFe!fF ꦵG.)ią+7ZcMŲ6lV&"U G5N\̹R@N"J+!|* ܝ_ӻ. &[y#c`RAd ]ughl\ڤ$qVʔJ MLS"u wb?Ť].M NPoZQ{tQ߷P vhI E˿0P%P\pxh)kl]ZMp2&MǻGEM| o.~\ [;-`@me˰w"?Ť].M NPoZQ{tQ߷P vhI E˿0P%P\pxh)kl]ukui-control-center/plugins/messages-task/about/res/manufacturers/DTK.jpg0000644000175000017500000001222413543125214025546 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1!AQq 2B$3%aRbr#S4DTU&H !1AQaqB$"2R4%tFbr#3DTE ?>LWy3@G0>Sd1&c:bL:!)sNhbf_;}Hϴ FH@O.IC$yr@Z$O j.ɔNP < #LId)N1؝1&~Ĺ4 O3/G$H#$Cj` v$e !<P{ G'rݵUT⏊SOR)":M 5J5a ?;/,;rsZmM+~ӛtIl+@/Je.@&To{]kQ%Vkk1hJbJI=RӖИe0:U rwp ]#6AZ;vJLOaSV-tvBfW.RP@vrD% f0ϖ5%JKO)?#;U̚%1fS Ee+qEi4AV1 \f멑6UI,42T$` #|yJՓzĢ%R=N@0F,厛Lέ,3:A9fJ&d1- e&8T;K&tÚ9ulAN[@gT:vݓ7Fm1*nN{SWG#ݩ0MKx2A}e_ #M(w"wS!QԔE2FDHAH/o]˕_=ćŽ3ʼnҭoH&0<46߫u67^QwjTY/xMsW{nʬ ߟl(Ǒ8~Cwf))d\}Aջ0{SVB84:W?6ͱdˢ1NF{;-myDf˨M1 Gr]fWo@CGJ (u,xՔ 6Té0"]+:֏@<5;Wpwwڻ{q72ZKnp7_F.sfQe)p$ktAV+{vCpՎDa8uA,f^zsԵo3;KptS-{rXy++hq3(w7P vUG䛃AXuv5qN<ޮȌE{sa[Ni.-܊i>psMUšʱ*U8rqd⊽ZZVgi(YFCaчԻf$L} "2G dD{}жZms7`Ԗȭ_em)iη ݩBg&"L=1^X\t߭< sr;1.OgX=DR`$i5rݮ]mɬb叶&L"D`Lq%,%&Eh !U;Ӫp's H5A]7Ѳr[tZի74Qԋ@텩I0K 0^9۶`Ůlpy :r U]!֟ޖf u*m $Y?67qDo=PjSn̺ &O)x;G1q兹ۖMG;e f154{=v2Ֆ9}o"½bE(ErZ—E)sln;96T2 9 I#ߚܼjI,%ќ4O`o@p#U'TdkGymR\rà|]aCy5i)2#݊[RV_E|ܤQe2uoHx\ᦆ,D D:b=^n&:\Q)>gLmJtXFb"L#8VdV'=I)t] Uuf^;O&"$1.sVzhǁp0&:8e ém fKt뎚f$#jJ )U1)jE3(yf4i&m11O^Ϫ}ygy`C6wQi,i2Se2LP5Li&L4& uFۭ2ԚH|ItmZ:ZHYg,` kIRjW GϿ {!>={/.@|A_Ng=.?7}29)[P>Xy=6̸LGk=,k-3g-(M^u|MJuIjcQ}Rg^Vj6 Jn܋SnD'RfJM֬^?ޕ tP#g^S/.fTC5ZgDS Accu~^3h2 Ff!)k]v Ƽi^_o8-j Sg̛Ǖ%9'(x_@۶`F0Po|ʳT+?snm|+;J۶)!ҿ6r)ʹ)%L .>zThK(^\S\ ^W?L[h~J,P\8 vW?{–V`Tܟ>6Xmmo:XƅxJ6Qu%%C%M3'Ө268D9kO&2KGKFR4)ИXiH50Bi$L T錰%y*OVBeeW' |26'3MNJL!QK0fc }J1UI-*l;\G($0YT0;1<pJY`ߩW@SVY1XǺ% )rBQ%_ j.ɔOP < #LId)N1؝1&~Ĺ4 O3/G$H#$Cj` v$e !<P{ G'rd'(LP&$ϲ'LI@N?Ndb\Ӛؙd#$ys!0;S˒`2\=#։Bڋukui-control-center/plugins/messages-task/about/res/manufacturers/ABIT.jpg0000644000175000017500000000537713543125214025656 0ustar fengfengJFIFddDucky<Adobed       F] !1QғTA"Ӥaq2Ue'REb3DFfQ!1Aq2"CaRr3D$B#S ?P @(P @sm"/qچ.dyL ɫQݹS*\u^ݿΖ+jO]aښZjO]aښZjO]aښZjO]aښZjO]aښZjO]aښZjO]aښZjO]aښZjO]a孝ښZRxVԟ92;l6͟7¡jKOƴ(ޫwW>r9ҵC<|MΕ+NSǰ5sr6Ӄ _ں`<f_[7b^s<Ko˻M`@!Z܏4wݶ-_Zi!gu:PPH3C,zk;?meb͕;.'-d4I1'GfzsT9nx֕Xe'DFjҷא8>ӈd%QNTEkB]M[t 7:V|ݮzٟ^gZ1q)eU1·]W"qrȼˏ_8>gg>6~AڿחV}u $o*#.b:l85Ly޵ZZzv w=WZ8+*y?~/Oj$Y/D%B6.aR.REâno\0WzDaqI@0F*J\$~" :߯gE]Ċ .*"tkd2jI3swL?]j WaEl$6T&nUEE+RQRG1)Hl oN20#kr}AK$DƫJvR~ %qԳ/E=j?u>(XFn ZXM˦ةmTLkWڌUg8Ή䮶ϙ:ㆪDDʪJa]KG&,}Ωgķ= VjE4Ov~|/q/̴2oM6̇6W"2taTsg-4M*l :*[?Ӈ- Ns/t=AC2L7DI UO-CJ,FmGD`ԛaa3 3& .z3ԙ;)=9W.:n-p·&3rFub;A}IUy9[r%4*3x۬sU#cLp HUW_Yj\wj3:Fp۽Y 8o$J )oZ$c\,->{&DZJ_}KC淚*o%>Pe֍h*'ԩZ TCsWe.Ҏ|J:CHEQ gJNDyDUmugF᪑**:*K8nW,ɇ}ڪcĵ=4%P]Y[mTqC";)_%rUMn+ yg;kR O8A|Qzv+N1O8A|Qzv+N1O8A|Qzv)4/j/Y58`Ɲ AdobedF]    1  !AQqTG"2B$ђWw(X#S1AQa!BR2 ?>L#>t&>ĵ5c Sb>bL|b\C̿h8К4BI^Z5m /:m5m$NE(k(}(K>~j>C66~_Q6'r??/xVƧɯڽZEz:ii+yP)Jj8؋EXPm &ČN'q>AK9Icx` ݾ^ @Wo0ײ|?񆽐~v񦽡 5Tv >I=-cN_mڊ$5s&q $͘ MRil@ɽgx6ܥm{vWJ3)SVW)y&B5SyUy-bʚD*C0,cB0ȏ iDQ4VӰ\4q;M6X 6xytJGy6c%R֍ng5q׶ʈ٪dRh R˘\)d٧f}F96%Bnq[&afeh-/Rjj@a&TifZ3l`2 eNS]MPb4cn[J-U֤PЩhtҟ.r,mf&]rS%DUj`jE!aXEuM2jz*tƓ vͶ:LZi18N&5p(RZ/Z-< Ν],{EO3⬓Ux2ן*4pbV*PoF] %UKBf Vml+,?L\JcMLT*ա:OhCdAtJԭ)XEͤ p,]˞8Ih\r1:ў |di›Bx^6z'i ƨJ&V9y,iRc s`>Y۾>70͙O?/6i}y8x*qGgO?:.wG<7ŨiYĻ=ٚ'{ 'KNyawG̑;߸_mduXGAGQ;߸_mgZt7yt r3:y8/ֲGADl 7!:y,n8GE8j&!<]ٖ,k ?N+蝱jF{*8nh"wq^/Dk\ n b&;z$e{W*D丿G~'lZ=Z#ɏ1-M`ĘC5Ę3r/DEFen3/?t&.ĵ5c Sb>bL|b\C̿h8К4 AdobedF]   1q!AQ2B "3% !1AQ"Baq2$Rr3c ?ɵl!Ls ߥIE e.Ou|)==K^$ߨR RTe 6\`wReOʦ-&yP*HSA7RlH&K)A AwOe)GDA׺2w$TrH (2W.ԣSoI^T 7R0;qsg?cyYtRq,ǯWܷpb[-kl)))7J~{ݼMQ霓3Kq Fe`zto I~P\ Qa@Rꌹ$+`QLT7eگ*t DW(+G%ΤYюY,]:8;9>) x չsɳêagl^&P5ʌMW0D{n ̎ pso59'jO {yj Kѭ2dnG1 m e˨kd던Jeg.eϐ447({H/y/a^HrcWĚ-(&I)SL cfrl(|bf2+[t0>+\}ⶮ)\.BXmm,}(`DL]̼pna\RK]`ZyZ=?<3=*"jRM}xaQõx_B:n*Ԟv$kA甝cBq׷&82 z?pO~4 ;Su[WHg)QZ?(2MQnnhDcR|+3VfF1"pqH2g Ο|ؿ(>Cq-LGvbw &v—ɂO&DH/i[y2ďq"z-w=Y__^ f:DG9DNb`@ɾrX0V?5/ӆW'`U"9Xw95nyIb(RgZv ]Of)Rkyq JILG38Zfi dF.Jƶ7;5nj :B7YT]$ZPPDڈAFs(ÏH}5/*j#f$ˑk[.Ո|SoI^T 7R0MT$WY8iǶ<пl6\i3SlZ'4e~z`Ƶ}_Uϔ򠏴}>8:Uc7MQtI扏{?1vb9wukna1d@.(!L?Ŀܤk^J|Ep7?.FhGAߜeyzŢ3\G8!lJD:WS827 cS@>޽o洂jl%R%uCer)FIK2TPd];G2STEjro)a 6Hqo I~P\ Qa@Rꌹ$+`QLT7ukui-control-center/plugins/messages-task/about/res/manufacturers/TERRATEC.jpg0000644000175000017500000000750113543125214026337 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   1 !q$ AQ2B"Ga4&W'w 1AR!BQaq$D%"24T ?&Q5^L RI`ID1g|%8y"Ts + /.{B%RN "g@)A9TL8RgR"L@"Lǒ&a>hC.aLmXQys(’q8`F hQOwo ʠղe?DBAg1f<3 DB(sHeo4 ‹˞ЉFP0 sD{}PNU4oje4ɝ ̮R(:]GDlե;<̅M"p%L#$uKOlb8}iAVE}_UwWƁAQ?C}V@1Hx5A@Y)U?<$H2ņP:8ћ/iʪIRG. >ۦZ%T̴{07hp[ nKrfzI2g!>EiF] 9!6 SB"SjLs]TtݿRW$ZE\ds*X "\~1ϭ[Xx286{ Ia|J̌ RK9&7 TK+#!קdQeW4ǣG)J欦%D (0Ale3ʁ9hM-:O*hЅ iO؏w%hp.M"))ķrBBH w'ր2RqՅa=.ECOLSƉ2.KLxyT'B#ȧeHJ|mH1P"~O$ӼlI!HKo2ϚTlޞ;*fna}RB- #NU-kO&Y!e?&-/?5n=[!<\څuMgV鹍S9MZX$>O&靚=4Jnc?PL)= 㐀FQJk8zuֆwPO5ʚ|{StVyTӬ Bm\ͷt&IN $.)8L11\]ZjPwZ Q/IvW}Uzަ$)e֢ѣKes)fǵ0 `#\{RN4}DMU.dO҆uv7(3KJ4tBFN3d{Pp]`7(o )=/P#GVGPlRDi>h?Ϋ8CQJWwYoooE;G7V͢(m% ;XRwO.lAI3 IG҃juUٸn8Kj+w'eByXJͨxQ^WUZ?D(eoaD 9۷S2IIV&!@:й,!!o*$hDI&ͿLab-{.1IwREKSK5(Vq2a!EkEtœ[%{%g;@qMXXz/׶)?>4ScY+zmK.:N= 1n'M¯S'kV[Ov) or>ebhK2АЎҷ*=gUl0kwaނ(?hrU(dyu ;-g'geet/&~)Z$d0b$y"f3>Q<*9h=)'3 ayr@Mv [&Q`)y3D)J&{ y&c0I4!0Q&_h6@(aI8n@e# ːr4Jo(Pj2Kɟ!JV33H"LyD$Ja2AaEhD ILu(^\9SyE=ݾ'*ukui-control-center/plugins/messages-task/about/res/manufacturers/TAIYANFA.jpg0000644000175000017500000001266313543125214026327 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]      1 !AQq"2B a#3$%RrS4Dt5' !1AQaq"B23$Rb#4D ?<5.8'HEN# ~~Ax٥(/PܙN^=&K0܈ 42ژZ5yP*rq1" ǻR+D4"'A^!iJ8"K7&SxiEɆ(7"H%{Rd2Ɛ) s:oG Ύʒ" `ݣ;/ͱ@י~YU|=kO}{w{]3{.\fTM :Yl@"m (Ю^CM[PCmȌs NJ+/ v.W wL.÷.!҈pjdovJM.ns',Y) dJydmH ( MqvmWK@og_} '}ko!ԑ7OK܉JZ-fRP63L~i:Stf!|oŪz/9OR23[Ê֝:逷m%(藨]&JJn!nT_Z>j:"}:#Zz C$da?LXxK ^+"fɛ3q;ۈɕ$}!ƗhD=E 5٭}wR0< }%hz] e)#5?%+榅,44e+Vాry+lXMlF]=s͠xp<5i5zJqb ,7q+c?B:/X<WƷc.-\ цӑwܥlELy2yj`eJ |5"fb:8AYc2,z<̭g;c}޺.x@mMd׸ p1Gnr~NR&I/4n u3u02$$ d-|ɄCvq!1NtsF2Hej U(X(!,&Q^x\xj!{e]ߥVaO7."VY$jR5XVRtN^P\!(ˤvJTUGZVUbTGCa7on {W/rr'/ڍj/I:Ag_.8HglUL`58ӎ)^\V|$4jʀ ݉Ugg]ZԴmM7 |f6d}a馭2oNnZ2Oin=[$roXl^5ؔw'$sT P06vtGuPɁA{8Imc)uS)lZnrv[FR6qn-ثo mu<%5 R:U;Lh0nuPְ<ڂh1Xm ]9鴇4d愐Yy$[v^zƉU͈+na˷wmg'~S =O}f A 7W' ?z?twu,z3>V/O3 mڠj$վ aQrDgBbwb$6B:_~煕kؾj&6mE \h'$$+oknEMt/$\&[E`\7c$~ވ e͇p(஥#IoLhR~G|5lrfz3.2a Yq'퍞m#pW&t%DJJ'~̀D,nLpbzBt7[LD7y[`|mQj)V*+W偕iS/gojTԡF6gc;x.zF?HI3җ=cRng^R^YFǗy$c'Ց5|EL̫ %X{֫PR-+#;&"Z{- ]}+-=Wtp&J oUխR`0P!p$5B^ەSp>]G-f,m|MbrJao-cvWF*#@/+XW1~`YxN)?OݩoIW'HS {"A8K(q{QOf$;Cre9x\b .(r9v۳ݠA7/٠;R~S V*NN?V7A8jEr(qQh# >)GI0wr (0\Q@pP\/٥锟7ukui-control-center/plugins/messages-task/about/res/manufacturers/MARVELL.jpg0000644000175000017500000004417613543125214026241 0ustar fengfengJFIFHH IExifMM*bj(1r2iHHAdobe Photoshop CS Windows2012:04:16 09:36:14]F&(.HHJFIFHH Adobe_CMAdobed            F]"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?8_?R+j[RSG 'R+j[RSG 'R+XX.gct~zqSIEhQwVhp ))~IE}8$4y C%='/]KO.Ȯ]cȿn'$>1;RSj[RR=?|~UWw/Y'qcˏEy~~OPvNK=)lە[z5d6?t]ZJ[N7N w&>W[nnN\ O$[ۙuovX8T,>*$[淽O?Z,?r uѩ)ﶪ=cbCy*}']ǡmLyUݓl=of1%9}Keu,ed\Zb6=7l `t}][j>lNG`6f?If I-6}]tk-65m"CD5^Fs^@ -X]OH`Z7;ԣH[\ůI\NE6<[.%6=F]I.V&9s i2IM|N1ߓ| X:ie $Ab_vqC,w k&w[4oPc U[p3:}nKOseog>g;g}I%?zyg$Wd9Wd fP<7{a^ï2U{lŧt*]Qv̈́}N̏bC'#Kmc̻1׶v{W~Ϊk Ѥsȸ3+#*}L/?亇Of{+kuFc#OΔ+'-Ĉ^㑍] ixc/PET[s3@|%E K='_Uzgfc2,hFcfnG=r٭oy캆gتe7ﱕDo;w+Q*C ^W{^Ȑ[yKiw8֋OD1;RSj[RR=?|~UWw/Y'qcˏEy~~OPvNK=)lە[z5d6?t]ZJ[N7N w&>W[nnN\ O$[ۙuovX8T,>*$[淽O?Z,?r uѩ)ﶪ=cbCy*}']ǡmLyUݓl=of1%9}Keu,ed\Zb6=7l `t}][j>lNG`6f?If I-6}]tk-65m"CD5^Fs^@ -X]OH`Z7;ԣH[\ůI\NE6<[.%6=F]I.V&9s i2IM|N1ߓ| X:ie $Ab_vqC,w k&w[4oPc U[p3:}nKOseog>g;g}I%?zyg$Wd9Wd fP<7{a^ï2U{lŧt*]Qv̈́}N̏bC'#Kmc̻1׶v{W~Ϊk Ѥsȸ3+#*}L/?亇Of{+kuFc#OΔ+'-Ĉ^㑍] ixc/PET[s3@|%E K='_Uzgfc2,hFcfnG=r٭oy캆gتe7ﱕDo;w+Q*C ^W{^Ȑ[yKiw8֋OD 1 93 70 1 72/1 72/1 2 2012-04-16T09:36:14+08:00 2012-04-16T09:36:14+08:00 2012-04-16T09:36:14+08:00 Adobe Photoshop CS Windows uuid:d94422aa-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:d94422a9-2b73-11e1-9c1d-e060394baa3b adobe:docid:photoshop:6307520c-8764-11e1-93bc-952fd8ae208c image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         F]   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?FGqWohwFGqWohwFGqWohwFGqWohwFGqWohwFGqWoh1Wzxk?3ūIZEvU> uRqwh4[R. AdobedF]   !1 AQ"Baq2$#4t8xr3sD6V'HX   !1AQaq"2r$4Bb#T%UuRD57te&Vv ?-3"YK.!Һ^T TZT6rl̼jկ.kMWK&ؽ3G6K[{CٓǏ>!1CFiZBf \vE(P!7SZr#x# $W7!anvlYc=^3SrIzKQ'?hm`( zM"Q5 Uo_j4-&<$l*Lm Ye7 tVdU!J ַkݎF 8byu]6}$(l5kOjp˜A' =22~˜l$Sht<Y+FApBف(NLn@|tPXyb{TS:NEj g5攱*x57l(wp"%P;x埽f.hu.]M_}=`H}p@jhx41dy .S1DJc R:!H3VL'>H:8ȐbWTrt4G0>|c>U=uOtw}]_k~g׎9?_(鎰D!GqW{LAՔQֵ.қoǧ5[\3:fHG{Lr.N5;<]D|rr9ObXF1a`3iƨNA;pVߊcB*nș' 휁TT&_*Bo $9i-0dCfUG7z}6 L.Y4؍-@h?Eov)DjXSK]_^5wG µ$q@d+3zuJs7ݿeJXIs;[I2KR3?og ([neX'5+/ J!:gepVnW`=ZplqL0 =elwb?,f9Z5> dDpNC1tƖ'#%G|mlYU:}j$fJ b-1_QVV#d=gzJ?ch}ԩUIE*Fc1Zb Ωh-xNA:X2uag:A" ghUqgꚾh=G^D~ވ, 9\3<>M+T{pqrX35du#Tr2两Jb(DRqB {{Q Fy C>Ѫ I{쓪sZ&v0].Þ7sA lqI٢ -VЩѓ ⳵! ׸xXyJO7N.vՒZxuK9 Nvsd㾒V2:`˜0 Jð9[&sF( 4sy)ΥS{%RFH%Vb%lo>^~^:$bXyͨd3|_O0ƕzr~'@3rm ڬWpJ:˚IP*ɋnt|9"Fp|vkJj,J[l;[mG匣J]]<|f+h0"VxZegL""2ZLZ?TW]H&JL+ 23 CJ1XRĭMP)E8Ǫo1K[d \R_wZ@uā0wbHE>rtAyA$d1ys9㩟=b't/:Kw٬zԮ&pkpl ʭ:ګWz*()XrK-g ~z֨bɘm W(r'z8nڒ3W2nʒ6"pJ7*#4;I3`j*v\ b1"d^)|ku",m6j˓IB{a7;8xiE)}g<$_S.EPSHR );l/y|2K!'˶$8[cMQsԶ:ʀJ(;[9MlICCp S3RA#p9y=yAɨY*H:f%S3ʜZ>(_+1[}b]9%2SFߏߠyDND~^Ӹ}ܬ%CW&+b,Yp &0YU@=H`N)0zƲq%ÚjT jdiE4u3c@|ΜJ}|CW98UtVjeZbk&TOiD㗚lYByqxrߦ0&VvY%dnxR zK2andZNQon5f :rԬU.j@J ۅ(q 'f1an!Ʀ-6`g(ߒBȒFЭ{r\>p+gm;DP5]`P+ Q2eW F#FY,|ȩVJZ#'DM,!:+wfO(=L'r"I)E{#CU۽?.|9ۆLG~DN R,AFy0mS2[@2`쀏V[ui>I*Wt8]VvϮڑ HBd%)=>O)GU EmRykij)-ܺrJ.0^q"*[7GWBLxXul1L9%9U]QdC<I݁l&b\?TIn|Hz_n֩4zɨ5x^\Ѽ~SSgU.}PwkWɭ,ؾ6jL$eI.o"rD}|5"p$.`=Sy(9[]ؠ݀JmٔT6yɚ7ym'0L]C31r\GD'MhI4'_wOYƚp k.Kr¼,]ݫ:X6wIR(f6TA,&o`"C4OA( @mtMvYx6+ay&}բis(e-.N P z. e)Dy=| hbԔQosH PR#B* \XChi4\w24I[@8szcGkf|+gwm>ljB,jR]+#WC~V1w ~S:+H)}˲. e<&:ˠjbv6͍,4HmN-)rQe"xG' ]`DDV%?^|CDZ &#SX AdobedF]    1 !AqQa"2B$4 W8XxRb#3CDՖG(  !1AQaqBU"2$4D3Tdt5'R#C%Ee6 ?>LWy3 #xLIT)N1:bLTĹ4 Of_~FH"C@[$H7.ղe&~Do 35f=8'LI?0)L܉\\bSr`2\=#EU!8 B;MnTc-yUEA"EIk3NhQC-JNLDe3 oX֯z{:VymgDkA{ @Ug U=gyލ^8|,yu^a{"xyzuu,węָ/+n>9띶Ir#XRHX^)eyN7DLE'OHܣK%bu)ԥSW'gﶅfJ3}زr#r$*ns69o>Oyj=it~LU߸T}h3[QL9{hn" #eg SCURf (;ɎTn |Vˤ}%IhohyDl 8/_+-X2@ADa('/SlVL^;.>l pQ;Tq\J̼˷6멹/A?@Ho-ڰ$J] J3qoI@"Y? $]}lؚ*l%(FHLaaK6c\Bϡ3];L Z@a !aO }9߷M>7R"}TL7r BK6oysz%e_407%|l&ЪQ:h6a!0̵ovdS)o[ۀ/\QrZ±bB'9c}ni,k-rG/j)~VSxr+qn~*[s7m[wk&o_^:;,:ۯb?3b֍ɉ}@X~7יZM+ w>[U/[޹.e"^!zVkdJWr<$KbsK+Q0l#hDb1064N'$ nq$xaB(^LixE8#v,}B]BZb~`@ԻoƓ,;VIiiMl8AZ5NO($_(alHM\l;hkxM< 8n FKrN%OT L=HK-y{\ŝ^f2P4#)̥M`sE7)HV՝3qx,1&ؑj~ֲ蛆ˉ I'RmCeV<"#]j7OULryF` 0 ʣi=O fVA(O@[58n16l?8X %;~_>8aewt7SlnYu˷F|ݜ J0V+c k}.֠Y֬跤jQ Q>9[k P*;18m@"!z[-*s0* -έmKA 0m؁#:bmKU3MqxEtRL i2 USH4Ҍ81cJZ2w-0X)q|AMcj;fFɞ\ Ydamي:mc L a#dKxt̵N62o1>yB@[xfۉՆԬHv¨K,BޡXUcZphZ{@n!qR`z*p pnR>(!+00Id9Wzo/-,'5> A-<<#l@ G)W;Ƥe^:cMsI1V7ߪ MGzZ:_PdLPp/rfUNϣUX54K0S\?w?/xo=w{/o-J6ѿ%|-*-HEBIQ>2 fH;'(Mˏ@Ŷ q/XئuK-chM,ԔMAM72]2CX(ɟJXZ5:8GQn\ ~Pu!#˟X@ SynLP#ːtwQ"|޿(ukui-control-center/plugins/messages-task/about/res/manufacturers/HP.jpg0000644000175000017500000002026413543125214025436 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]   ! 1ABQq"u8x9 a2S$Rb3CD%VG(X  !1AQaq"2su67R#5UBbr3$4T%ႃdE ?}ոm6ܫR+c\'\p'FSm9io MBB)U D]4Zt[P]U 'ڈdL>>vbt-D%RTdR":L!S%:b#L}tFwʥQOd" >׎ޕ[ų0r(=L׏Ty<:$֓海mwsa;!}Q4;ۧg% ۛ[-+{ʝdH*,=N=R.}6Ŷ;#FћnԴ5C|p:0=IGnFcї))"R}"Ր=6j6XDmb`04njMyg[xS-|PG$0NY+j~)=QISr2#a<˗FQ '+{s&NN/_fE~3DZWQ2e /JhM!if!!NԬS29$2"Xٵگq5~w~ɧ!P ' 1/l B,Aԩq|V+s($L TsdMSE$߆lzcP3bVL2&g9'~>㶔"ǥ3 `:%kXՇN__t9kWi>j~4ֿlzF;8&O+5չsQ-bpiӺ&CwT {9h䞞bOg|G[i}K;.N@%%o2v(X8J8IX$H#IM2dUThD(n DOVtWUHK>"0øDL4MC}#0x/6a}V ,GśVH[CϣԊugqSddN3,/hB]w i)ֲGR(EWZ\ɾXukPjeRup#yF=NjJAAZDÔJY l[d : r@j3$`%( u].RBҢFUN)?u7@dz]W]`^'RzRd?)R=OiGNW/dg%'K׋e3_aP-bpRt=}wJڎ:[T7z*d; ĕz-,!.RzI$ڂT?sC('s!pQcE<~JgpZioS+hwו@΄)z$D=tj<;XSf7vIji.I'ؓYgǖ@FٖZYaINJAZDϬ9K3nLWsY N2Ǭ{n<h[ek0oɦ;(3M_UK-ƄfU)}ý"YTܶl}hR%R6 :2[t%١Y@M UH2*Ln~ S'㚘u22Dt݋ 0(0JR;qVbфAm.3WolFnj*ַXvweeZ(ۆKgvd*PJfsSKڐrwu\Sk Y[ 71#|eB9`vXZK%@6uGeGeǏ2:+X D rPqY,􅜭$J8<~T0 Σ{n^8-qpL2|ɞ`W{&^וdDY fnM󐬷:LhMcYQ=546.f`BcMǸ+%흟l=vC9\9L̞\[]4s4u:N ߻qrR v]ۛ<xK\{pd.\֦@UGH{5Bo iME6ʜsH3}vTxË"FDLL)͎yt qPŨOBaoJQ"6;;NҌ"%+bq}5Z +I2II2`j#ؚitbr KVjbIfV282qomG- c |&c4sFq} 교^e8П~,jE8w}V;=,is#G'zgF&6eg'OBdELKͳDҴ/G@blLW2e$K˛G !ymᵅ称IpҮop\Dvԣ>Ρ铪5&՛T8<NCI7SfP;$Dpl:Ynޓ ~}SYR"gM Ȧ vἕske`AnNHd{d61h}{~?o gq3csyOnk?$b$9upI69 l92ImPݷe2Hܒ@<ۦۆ1Q|u.< jKd!:RFkoZ:v=:N+ΈĒ6Iyd*WIKɒCLլ^[-i0RP)kP soP)!=UH4aIfV282qomG- c |&c4sFq} 교^e8П~,jE8w}V;K?AeQd=19 ũ.fr@}껐 AA )Z/\YO6T1;ysktMKy5HۮȁX'OܝZ7֨vUN_}GU R \A*%&da _\f6صdVBfI=3ӈffeQ0V.4%s`kqR9f FQ϶3&mPJ!# J@ILCcZ[=s"pTԐ0$s6!i-DuǙb$+~ zʙj6V>jxù /㏓ HHaSܖU7eCK\l͍ h|{t94_7eOMTLJka9 jwv?]S%P~+B7T{*gS$קO_˭]_m<pl̉1T3 j`1R'~iF/Q *~0Au@4jO0Gx"M ZojwgT$+Nd85>ov{/ߘ3Xkv9TƝ;.I][tXמuMjqgo6͐pTu*LrgD;fwBZ<)I')# wCU|g~(3ì{ûZ©BXZaLrđ lD dP @_R6϶V҃b8ԁ9fb?Q~73 mSL(/Y$ (K(u;0Ҥ- Uƿìޅ$qŻ O9.&h\?ME\#4iNYs 2q=w>ZqR̗/!u{,[<6c`4 .e`@Vv+3qJRul+t&̲yU2#'2D;׻{yޜBR'|O+ zItCiʮmO躼1co((\ˋuꐧwhqLTZ,>*qTVꞸuZ[rHy A~?J)XI##3/|~M7\aBZNwGEx2~tKJw~Wgw5 jUԨY\1"":!k{K7H ;$8wk!ӻ[4iČn;%>jOϛQ#ӈ+nge>gAƶ|ڏ7Qk h#F AS:) rvTMT[ J4l>ΑMD޸[EdIlYV`͕ laQ!8,u3j &iXֹ`m*(1դ1tNr)TSIxO ';F|B7vL JbM"F]|ҙL)qazr֊(sqI"TKؚT;,0sFc)'BZ %Jt&X;+{bQ²^ ;f:vza #jnDSέ$1OLk Kkm[s+ԤVzG'%˅ʙ>AEtf= |ܙݙW'su1ȒXPQQSb !,M"BBS@^z@l,w+/PUOIWЦ@br? %U/&E/Jgwpf/H/ *6d刼3<ܸ]3̰&%j%C(jcնZTn9jV.zrkbҦ *dHLp=vQ`]Wh gG.yBqTB_=ʒCdH$=6攪V&o]Y钡L& %_: @0p3[jLL[msP6Hݢo5<:IJnlL2ƇPjS zZZ]z #FGUՕx\I#ǻ 襺~&5r{sݙSi[vS~0& SiW=:Q'['| 0 SEjSi@䤌d (˳2;)zsC߂1 i:5f{aO1'oe"q/pjmܫ9)Hv"P'X薲zkRPL\qVtZF1`ܐUM6I)*LJsI v1]TMEJmA[9H2U39l70om;(sF^qqBЁKvvW脒 Ƨ('3:[flͷȶ\/J瓷{QٹCqQT5'%RuqpiԐRA܊*aڢXqDS 6'X"S3dGG/NԄ?_5ɫ4\0 @G1.YJdvZvZb`()D-vFp{ƺ @2$LAj)kvtR޶rty 1ʳ&AQZĽ儊]RUwa%uMOfe!ol;ѶwVX>28i_p,;KUcw-m.FB"+rU!Z{[d5ޘ=ژ7Ӣ'"+35S:n+hHJIA-R2 ӟ3 4mT%<5B\h25\vk1s`I/gjV4'qu,cʵ@Tꦨ-Q9)D+ݛu,ty%S*)LxA泣jq]ҽV] i@ZR&%A'd;qv[b.Eb*y|7{u]= +Wjkdb]1 bөkj7 %C)'TBg <%Mҳ!ڪn \9W/4LcHðNZUg5bd]+KFԡSݙ=r;;&fVFMbD:jqwNSd̥4rG9L %BZ*\kwV b qc=42=2oɬQukui-control-center/plugins/messages-task/about/res/manufacturers/TONGFANG.jpg0000644000175000017500000001140013543125214026322 0ustar fengfengJFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC  !"$"$CF]" 0!"1AQ2aq#BRb$1!QAa#2 ?t()JJRR()JJŗYEe RTt>욬#[_c:%f_CWo#KAHhz׉%(m_]i.~i)_>xsLk5nvJ.jn6Q:=}]sdMV8]BZ~@ujڒV =DZ);L.9IbP-~9#MCl6M |||T<'BBGG4aU}܎.(%J.k֟-ױZ6dJPV<#D#4e ;x&JTKiu=Wܭ;bCG*u%. hh8|]썎*L@8ԥuzH>A$4h/$ńuCBն~ y+ UEY\t-KRul"{kgm"M-Kk=vڵGG. 'qokzuw ?j5U'g[S>i7V+wIYsZAvo$$v{'C]_ԛxܗ YPq؝ԄQqj@*H>}'Vm!iJRVO 4[WM.夂Tz #c͞fxK\xƗ?';l}?6[qؔ%F뺵c08LIhY_yr4CwR~QfM3ȅ!VV}ĥ H$(> 5֥!) H@VNVQ_T90mQ2 JA*SoSI]_dOC5 !7Lp$]x#^KB{|}׏D əa&dc$e#XxbÄh?Ϊhn*^;qMcihuzZelֳhkv^%GzN3b?MXG)mf;d儕?jGE1,9ۂ$$t2put2}m  pvTC;v[f2NZN.T!?. ֽVW߽NE.މq_pŒ|I$Mzg|qg&7I1R))G$Hu1klյ-( $ u$ҔIR()JJRR()JJRR()Jukui-control-center/plugins/messages-task/about/res/manufacturers/ASUS.jpg0000644000175000017500000000750313543125214025703 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]  1A !Qq $4Dda2BW#t%նG  1A!QqTa2B$UEbr#34D%e ?4d+RS\ xԈI )ALH (HHcRw")‚L8oT+kX5a\\CIOQrnH.!R U$4&X2 0A" !HT"] DJ0R4]boՅrq5%>@nEɹ HTЙb$5!PwxPR"L()*ÏJҹvIۺV[^-۶Cd] ՎdN9ZG'* ygwq[>l^f[ou MjvK1& cu>@/aU#ϊɘZ%76*EVv@-}Kkn 6wIX 얶@. Sf9 `L;Ʊ)owIIhT列 fλ-Բ<#|+,qx¦]Ի>ō聆&lPI(ʜ(5!*^hsѕѧ.7dyU}2OGgUp"[9GIr4L6e3\WYd@.@8ߘ(f8E@~`IB&AsկS}EmORVh݄ƛF6.BoVɓ,nI>j4^鄊Rf߱峓N &α[`\٪p6hpZtu\9 C\mMLy+f^%wGfi@%'iε83#l y;QLj+-4eRcI?u*?2t/:upvˣ|35!T:ę P hkO`_7U]:wcJ1}g]*^kԯ)[O|?~^_6y;+՗y֧ ^ʖe(*Tulh6˔e W0ŚaaCrIf W;-mɒ'HR)O7Yd6ȡ0I_xަciM-3||EDO?zC{*N%5Ѽݒ]K+.em6L[C([TǍ=w|!)5U 0 T[]ʵ2hjJ'Hn:|[.X(%SZTY=F%XPDLfe~T%:YG^|Ikd W8]SuGbRh->Wgȴj\Ӣ`jUz*p#iU0C{k피YaO1IZIݱqWDbwzpM_fG>OdJǔ0Z?BPL fƺiX&L?+xa` pvυn57U?XSk_5>q7p>VxSl]Z7}|nu{oP*ͤw_"ɿ[*ZJ1;Z 7qđhCYՇ9->Ҕ6~{V]e r-Nk% ]@n_([Z B™"9 !#3[Bf2%B?(y Y[LY4t pifѭ]F*$Laa!\$Y=`ux^e5C ck!sN mx9-2fm$Muc0`{8HZV,Fdz~&//?BYvwz: wyj]t!zw[{WdnF[¤` E Hc! ْGL6 y46j\vhz͋0J}:ԯ~)I^>'>..Քmwcx"mϘ,z[\d&G|Ǩ͢dGVV|vUڞɶ%6joKB|χ{orFVCn"üoϰtZ;,W>W]0z?}XI%˵}ЗO lYD#9?2W<Pr:J!chvl34J%2nֱi7wVj¹\U 7pܐ\CƤ@H hLH e@a@DCE\()H&raSzMi\ZŤY rjJ}T‹rAq 12 ()  I jBrE PR"UɇuM7qrkuf+ˈq)Rw .M AdobedF]    1!AQq"2$WXBR3DE&#S4Tt%w9d5H  !1AQaq"$TU2Bd5R4t%7D& ?>M$<{&$ӽ i iC')tGJ3/|FHb!z` oOh]D+t. % [BK m.M.9 $w|"bLgP'Q'XFݽL#5}ɬ&$5uL!_<4 |}k򝹴;0=˨-v͡OѡE;Mh򟸷T~kӀQBgK@AK VҖ_0d)8\(WmqV]mm0Eȱ^$_Pm]*ڨF&bcq%{΋ʪ _SM.ie}` p<7ejW$LUŧ}]ClZzfKmQ\tn{^-o{r̋e?22v~Z\EΥ<_Ԏ-F#N1qޓZJs]z֗.#{kRw|ɽjWu3 #vzZ_YJy*ĩ1ay ?i1޳ZfYSd:guԲk{~RJ\ji}"n +Xċ ~ QdZ`EV"XmN+׮n%JmNR5wuBє75SOKo jٚ,MXlb|.pk5B+cTuLpPQr|Q*!'-o:WH5<-9Em]0ؔĐg'%) f<@1bav٥E?zjT?T q;maǁ!n|w ^̚mquAZȠWC4-7$l7=/|Wڽ~MlJW\_c?{9>Hu\a\;m|xxrxv%sU[hRӵ68S%LCo:~h& 1su?= 7Gyou圡M\3JOS>n'0t\B,U3fU~JH*KMztH@[X*&@In ɣ"h@k{.+I7s^apAߚ4lFTeJ M,*U);a(uIZA%ռ[146@ 454wzTTbrsrF!UC ,SW(r ;6*5˥!M)w9c);*.S,NhT9<̀4ꑟ8#r&h)hdXij~ʃ`֙Yq<426 }/Hy},Xܾݗ Rkē\)a\ތ<59ph2Yyɫ 4X nmKcx-mt|>GovMpnٶR'9'RͫXtS[1j3E93qY ŝ]ک];\$w@Xu)1)p=>\,bT%LAB!z[Y-?έ sgX8_}w1ܺd/ML+ IJ:BCaCx\6xea'oLq&790;\Q┩Fj*;޴V`|2_\vl3hͲă9YS4ki"IhBZ9Rt8$l_z1lFp~LWj$ڴC{Elo?6'=,_ws\«%M:A̲^8VcRi۶|r=ߡk3Cyy5kUʼ.Ug{\NhpN[[*Wz%w%:Z{)W w:<ƭٳYJ@7ҴcE98f_cܮTӭIpDo_6[p[o$mmWW*Q֥~ᘼOD1OdPj8(VC(a5E)]22Qἒc(6%{Îl(,ǖ$s#سX#N"AXc 2 Tϩƾ\2.?uO1[1Wk^vsBwQkVq (Cדc92![; /NCnЧ-JxSлo7~/|gO1[1U ^voJ_, Lм4{Ҧ*k7m=Og:gkZ~,]X>[2gQr_Sџ_-9d0_8Hյ]_xg_TU-hmY" v" {/:e dܡYM@F's,'.9ȝG$9Ml|5sr+]Ei I6ֹGOb6Ěwb:bM#ց:bM=Hde1.@&e؉];,D/L ؘ #ˠ:ځTH܅z.ղhQ؀(1&XNHnNOGR?LK::P%=ə{B6"GN@ z|6&D$vG'!^ukui-control-center/plugins/messages-task/about/res/manufacturers/A-DATA.jpg0000644000175000017500000001211413543125214026011 0ustar fengfengExifII*Duckyd)http://ns.adobe.com/xap/1.0/ AdobedF]     1 !AQq "2B3aRr#sbS$4Td%5& !1AQaq"B#$C2b3Tt ?M1ZM~L!Lm k݉5 "&~TuOVrdh;lCbdrQbaz`0-Ab9tp|QڙQi4@_SB`bMb)j>-Ȧ 0]CՅ(ܙ/ؙX^ -b`4p2=xWxu }p黔\M1}P+ݵbnͪ Y˥nE.%TLu cjv$.~ Aгa5$*VrLܹ@QA&9 șf ɨ.Q0M}=UlrML3Qe"I4(%!C1bDY1;N޷ L@d0L8wbʳI)= ē,%&. N\$,ޏ*e/"b\,Y{:f鄥HGǍUb%|#KF11vbǔ[S #isܪdFMGTI{#.WĦǶB,= K,cWth֍\|y+EyC h_(˿9R27 -|0^7&ku~ϼ:0M1qT+_xګ!fZL:T󕤺 pN$FIg}96q_S|`ZǏ>䊓-V]k-#P3ZW߼,L=OP859M"[ieH̲ uF))4M)2h%]%TirZ j'uz#2._erhZsi. 2N\~`cuf{8p t}Wk<5:Jijeۀ [AN])j>A:Ju=KN-q-6E:i6@0DjY^>klEeR3b"Ғ? m[]suyϹK|NWσY=ϧ?#>W cRuUj'I : l˸yHj6NՌl$/y@> }W&ΙKEq(lUcԉM-j svzTW/jv44}QIwpp/!JPQIx{tFOf[>yϧJtߡЂ4z(VʬfVʟ ,!8*0G2X/Ukl[V 23%6l}a0j엧܅uO3 qTAQu,$5uE94Ժ%-GFC4۲ΩG^Ksa+afž5]qB=i$5$py^p"31KِM6fk?oIw=llUyO.SJI4b"\\N;e]5"8hУJ=ZZNK5UVCHޟ)qs8k{֖4^Ϫ+3jL<"f.l|W06kw-zܵqWn_zT+Im++$3˦ɳreܽYR!CS1&k0[{`v*t(f5Q3twZ.]9wNZL э6F!f.U.'M)8~ޟ@&/rL_> [J P+65;Ry ~&4J/M}\}vw>x ꚦZz iA1aCTQmx@~@W,Rk4ηseO)1b];փ1z`Gb ƂZiQFo$GxD26`YPDzlY'eըuMˉjΟV"@WL71UFhXM$]1íKt5g5/l#5X<k9<7/h;-J1-lQ`XGsCB%4f)؇g1IA2L^e4:JDw0!vOxK}jG͔jwV;E7 /`:g.~ lկr,"iAXabbqx)qIobzIO4rj[9ndAdʢJ`L%9A iek.e7w{T/ GP$CQq=c#~O>&$$~fb`)ʮ-QRB=+yN 8h p'92bܺޱ Aii4icot@A)X*6O0}gX|Z`F.$cޘ3Z%y܋9WPdH%_2OS.M fG~m94(ˤ/*_͑l\艦LFYHhK7k#(-$#v À?ű1dv=գ!G+$㛐; Ϝ|?Iy(Ȟh iTA&9D~p~~cl_*aßս0t\=&rka chL^IE0MG݅5`# zz%Ab#^‹ lL ˠ{ŽȟwĽ7rI/*B׻kLQanE0M}=)F~w؆׼0aoF["r2'1/Mܿukui-control-center/plugins/messages-task/about/res/img.qrc0000644000175000017500000001766113543125214023040 0ustar fengfeng manufacturers/3COM.jpg manufacturers/A-DATA.jpg manufacturers/ABIT.jpg manufacturers/ACER.jpg manufacturers/ADATA.jpg manufacturers/AEXEA.jpg manufacturers/ALI.jpg manufacturers/AMD.jpg manufacturers/AMI.jpg manufacturers/AOC.jpg manufacturers/AOPEN.jpg manufacturers/APACER.jpg manufacturers/APPLE.jpg manufacturers/ASINT.jpg manufacturers/ASROCK.jpg manufacturers/ASUS.jpg manufacturers/ASZ.jpg manufacturers/ATHEROS.jpg manufacturers/ATI.jpg manufacturers/AUO.jpg manufacturers/AUTHENTEC.jpg manufacturers/AVAGO.jpg manufacturers/AVEO.jpg manufacturers/B&DATA.jpg manufacturers/B-LINK.jpg manufacturers/BENQ.jpg manufacturers/BIOSTAR.jpg manufacturers/BROADCOM.jpg manufacturers/CANON.jpg manufacturers/CHAINTECH.jpg manufacturers/CHICONY.jpg manufacturers/CISCO.jpg manufacturers/COLORFUL.jpg manufacturers/COMEON.jpg manufacturers/CORSAIR.jpg manufacturers/CREATIVE.jpg manufacturers/D-LINK.jpg manufacturers/DELL.jpg manufacturers/DFI.jpg manufacturers/DTK.jpg manufacturers/E-MU.jpg manufacturers/EAGET.jpg manufacturers/EAST.jpg manufacturers/ECS.jpg manufacturers/ELEPHANT.jpg manufacturers/ELIXIR.jpg manufacturers/ELSA.jpg manufacturers/EMPIA.jpg manufacturers/ENLON.jpg manufacturers/ENNYAH.jpg manufacturers/ETRON.jpg manufacturers/EXCELSTOR.jpg manufacturers/FIC.jpg manufacturers/FOUNDER.jpg manufacturers/FUJITSU.jpg manufacturers/G.SKILL.jpg manufacturers/GAINWARO.jpg manufacturers/GALAXY.jpg manufacturers/GAMEN.jpg manufacturers/GEIL.jpg manufacturers/GIGABYTE.jpg manufacturers/GREAT WALL.jpg manufacturers/HASEE.jpg manufacturers/HITACHI.jpg manufacturers/HOMKEY.jpg manufacturers/HP.jpg manufacturers/HYNIX.jpg manufacturers/HYUNDAI.jpg manufacturers/IBM.jpg manufacturers/INNOVISION.jpg manufacturers/INTEL.jpg manufacturers/IOMEGA.jpg manufacturers/J&W.jpg manufacturers/JETWAY.jpg manufacturers/JJM.jpg manufacturers/KINGBOX.jpg manufacturers/KINGFAST.jpg manufacturers/KINGMAX.jpg manufacturers/KINGSPEC.jpg manufacturers/KINGSTEK.jpg manufacturers/KINGSTON.jpg manufacturers/KINGTIGER.jpg manufacturers/LEADTEK.jpg manufacturers/LENOVO.jpg manufacturers/LG.jpg manufacturers/LINKSYS.jpg manufacturers/LITEON.jpg manufacturers/LITTLE TIGER.jpg manufacturers/LOGITECH.jpg manufacturers/M-ONE.jpg manufacturers/M_AUDIO.jpg manufacturers/MACY.jpg manufacturers/MAGIC-PRO.jpg manufacturers/MARVELL.jpg manufacturers/MATROX.jpg manufacturers/MAXSUN.jpg manufacturers/MAXTOR.jpg manufacturers/MAYA.jpg manufacturers/MEGASTAR.jpg manufacturers/MICRON.jpg manufacturers/MICROSOFT.jpg manufacturers/MMC.jpg manufacturers/MOTOROLA.jpg manufacturers/MSI.jpg manufacturers/MUSILAND .jpg manufacturers/NEC.jpg manufacturers/NETGEAR.jpg manufacturers/NOKIA.jpg manufacturers/NVIDIA.jpg manufacturers/OCZ.jpg manufacturers/OMEGA.jpg manufacturers/OMNIVISION.jpg manufacturers/OMRON.jpg manufacturers/ONDA.jpg manufacturers/ONKYO.jpg manufacturers/PANASONIC.jpg manufacturers/PHILIPS.jpg manufacturers/PHOENIX.jpg manufacturers/PINE.jpg manufacturers/PIONEER.jpg manufacturers/PIXART.jpg manufacturers/PLDS.jpg manufacturers/POWERCOLOR.jpg manufacturers/PRIMAX.jpg manufacturers/QDI.jpg manufacturers/QIMONDA.jpg manufacturers/QUANTUM.jpg manufacturers/RALINK.jpg manufacturers/RAPOO.jpg manufacturers/RAZER.jpg manufacturers/REALTEK.jpg manufacturers/SAMSUNG.jpg manufacturers/SANYO.jpg manufacturers/SAPPHIRE.jpg manufacturers/SEAGATE.jpg manufacturers/SHARK.jpg manufacturers/SIEMENS.jpg manufacturers/SIS.jpg manufacturers/SMP.jpg manufacturers/SONIX.jpg manufacturers/SONY.jpg manufacturers/SOYO.jpg manufacturers/SPARK.jpg manufacturers/SUNPLUS.jpg manufacturers/SUPERGRAPHIC.jpg manufacturers/SUPOX.jpg manufacturers/SYMBOL.jpg manufacturers/SYNTEK.jpg manufacturers/T&W.jpg manufacturers/TAIYANFA.jpg manufacturers/TDK.jpg manufacturers/TEKRAM.jpg manufacturers/TERRATEC.jpg manufacturers/TEXAS.jpg manufacturers/TONGFANG.jpg manufacturers/TOSHIBA.jpg manufacturers/TOYOTA.jpg manufacturers/TP-LINK.jpg manufacturers/TRANSMETA.jpg manufacturers/TRUST.jpg manufacturers/TSSTCORP.jpg manufacturers/TYAN.jpg manufacturers/UBUNTUKYLIN.jpg manufacturers/UMC.jpg manufacturers/UNIKA.jpg manufacturers/VIA.jpg manufacturers/VIMICRO.jpg manufacturers/VIRTUALBOX.jpg manufacturers/WESTERN DIGITAL.jpg manufacturers/WINBOND.jpg manufacturers/XFX.jpg manufacturers/YESTON.jpg manufacturers/ZOTAC.jpg manufacturers/ZTE.jpg logo.svg logo.png ukui-control-center/plugins/messages-task/about/about.cpp0000644000175000017500000001654613635333016022606 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include "about.h" #include "ui_about.h" #include #include About::About() { ui = new Ui::About; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("about"); pluginType = NOTICEANDTASKS; pluginWidget->setStyleSheet("background: #ffffff;"); ui->systemWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->deviceWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); // qDebug() << "--------start------->"; // qDebug() << QSysInfo::kernelType(); // qDebug() << QSysInfo::kernelVersion(); // qDebug() << "---------1---------->"; // qDebug() << QSysInfo::machineHostName(); // qDebug() << QSysInfo::currentCpuArchitecture(); // qDebug() << "----------2----------->"; // qDebug() << QSysInfo::prettyProductName(); // qDebug() << QSysInfo::productType(); // qDebug() << QSysInfo::productVersion(); // qDebug() << "-------end---------->"; _call_dbus_get_computer_info(); _data_init(); setupComponent(); } About::~About() { delete ui; // delete interface; } QString About::get_plugin_name(){ return pluginName; } int About::get_plugin_type(){ return pluginType; } QWidget *About::get_plugin_ui(){ return pluginWidget; } void About::plugin_delay_control(){ } void About::_data_init(){ QStringList infoList = computerinfo.split("\n\n"); QString available; if (infoList.length() > 1){ available = infoList.at(1); } else { available = ""; } if (available != ""){ for (QString line : available.split("\n")){ if (!line.contains(":")) continue; QStringList lineList = line.split(":"); infoMap.insert(lineList.at(0).simplified(), lineList.at(1).simplified()); } } } void About::setupComponent(){ //设置桌面环境LOGO ui->logoLabel->setPixmap(QPixmap("://img/plugins/about/logo.png")); //获取当前桌面环境 QString dEnv; foreach (dEnv, QProcess::systemEnvironment()){ if (dEnv.startsWith("XDG_CURRENT_DESKTOP")) break; } //设置当前桌面环境信息 QLabel * dEnvLabel = new QLabel(tr("UNKNOWN")); if (!dEnv.isEmpty()) dEnvLabel->setText(dEnv.section("=", -1, -1)); ui->systemFormLayout->addRow(tr("Current desktop env:"), dEnvLabel); /** * 设置当前操作系统信息 */ //设置操作系统版本 // qDebug() << QSysInfo::prettyProductName() << QSysInfo::productType() << QSysInfo::productVersion(); QLabel * osVersionLabel = new QLabel(tr("UNKNOWN")); osVersionLabel->setText(QSysInfo::productVersion()); ui->systemFormLayout->addRow(tr("OS Version:"), osVersionLabel); //设置CPU平台 QLabel * cpuArch = new QLabel(tr("UNKNOWN")); cpuArch->setText(QSysInfo::currentCpuArchitecture()); ui->systemFormLayout->addRow(tr("CPU Arch:"), cpuArch); //设置内核版本号 // qDebug() << QSysInfo::kernelType() << QSysInfo::kernelVersion(); QLabel * kernelLabel = new QLabel(tr("UNKNOWN")); kernelLabel->setText(QSysInfo::kernelType() + " " + QSysInfo::kernelVersion()); ui->systemFormLayout->addRow(tr("Kernel Version"), kernelLabel); /** * 设置硬件详情的信息项目 */ QLabel * manufacturers = new QLabel(tr("UNKNOWN")); if (infoMap.contains(MANUFACTURER)) manufacturers->setText(QString(infoMap.find(MANUFACTURER).value())); QLabel * productname = new QLabel("UNKNOWN"); if (infoMap.contains(PRODUCTNAME)) productname->setText(QString(infoMap.find(PRODUCTNAME).value())); QLabel * version = new QLabel("UNKNOWN"); if (infoMap.contains(VERSION)) version->setText(QString(infoMap.find(VERSION).value())); QLabel * serialnumber = new QLabel("UNKNOWN"); if (infoMap.contains(SERIALNUMBER)) serialnumber->setText(QString(infoMap.find(SERIALNUMBER).value())); ui->devicesFormLayout->setHorizontalSpacing(70); ui->devicesFormLayout->addRow(tr("Manufacturers:"), manufacturers); ui->devicesFormLayout->addRow(tr("Product Name:"), productname); ui->devicesFormLayout->addRow(tr("Version:"), version); ui->devicesFormLayout->addRow(tr("Serial Number:"), serialnumber); // ui->devicesFormLayout->addRow(tr("hostname:"), "hostname"); // ui->devicesFormLayout->addRow(tr("running time:"), "running time"); // ui->devicesFormLayout->addRow(tr("os type:"), "os type"); // ui->devicesFormLayout->addRow(tr("os version"), "os version"); // ui->devicesFormLayout->addRow(tr("system bit"), "system bit"); // ui->devicesFormLayout->addRow(tr("kernel version"), "kernel version"); // ui->devicesFormLayout->addRow(tr("architecture"), "architecture"); } void About::_call_dbus_get_computer_info(){ interface = new QDBusInterface("com.control.center.qt.systemdbus", "/", "com.control.center.interface", QDBusConnection::systemBus()); if (!interface->isValid()){ qCritical() << "Create Client Interface Failed When Get Computer info: " << QDBusConnection::systemBus().lastError(); return; } // QDBusConnection::systemBus().connect("com.control.center.qt.systemdbus", // "/", // "com.control.center.interface", // "computerinfo", this, // SLOT(get(QString))); QDBusReply reply = interface->call("GetComputerInfo"); if (reply.isValid()){ computerinfo = reply.value(); } else { qCritical() << "Call 'GetComputerInfo' Failed!" << reply.error().message(); } //async // QDBusPendingCall async = interface->asyncCall("GetComputerInfo"); // QDBusPendingCallWatcher * watcher = new QDBusPendingCallWatcher(async, this); // connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(call_finished_slot(QDBusPendingCallWatcher*))); } //void About::call_finished_slot(QDBusPendingCallWatcher * call){ // qDebug() << "----------------start------------>"; // QDBusPendingReply reply = *call; // if (!reply.isError()){ // QString info = reply.argumentAt<0>(); // qDebug() << "-----------0--->" << "\n" << info; // } // else{ // qDebug() << reply.error().message(); // } // call->deleteLater(); //} ukui-control-center/plugins/messages-task/multitask/0000755000175000017500000000000013556706375021675 5ustar fengfengukui-control-center/plugins/messages-task/multitask/multitask.cpp0000644000175000017500000000265013556706375024421 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "multitask.h" #include "ui_multitask.h" Multitask::Multitask() { ui = new Ui::Multitask; pluginWidget = new CustomWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("multitask"); pluginType = MESSAGES_TASK; } Multitask::~Multitask() { delete ui; } QString Multitask::get_plugin_name(){ return pluginName; } int Multitask::get_plugin_type(){ return pluginType; } CustomWidget * Multitask::get_plugin_ui(){ return pluginWidget; } void Multitask::plugin_delay_control(){ } ukui-control-center/plugins/messages-task/multitask/multitask.h0000644000175000017500000000311313556706375024061 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MULTITASK_H #define MULTITASK_H #include #include #include #include "mainui/interface.h" #include "../../pluginsComponent/customwidget.h" namespace Ui { class Multitask; } class Multitask : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Multitask(); ~Multitask(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; CustomWidget *get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; private: Ui::Multitask *ui; QString pluginName; int pluginType; CustomWidget * pluginWidget; }; #endif // MULTITASK_H ukui-control-center/plugins/messages-task/multitask/multitask.pro0000644000175000017500000000106713543125214024417 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-29T15:22:24 # #------------------------------------------------- QT += widgets TARGET = $$qtLibraryTarget(multitask) TEMPLATE = lib CONFIG += plugin INCLUDEPATH += ../../.. DESTDIR = ../.. include(../../pluginsComponent/pluginsComponent.pri) #DEFINES += QT_DEPRECATED_WARNINGS target.path = $$[QT_INSTALL_PREFIX]/lib/control-center/plugins/ INSTALLS += target SOURCES += \ multitask.cpp HEADERS += \ multitask.h FORMS += \ multitask.ui ukui-control-center/plugins/messages-task/multitask/multitask.ui0000644000175000017500000000233613543125214024234 0ustar fengfeng Multitask 0 0 756 574 756 574 756 574 Multitask 0 Multitask ukui-control-center/plugins/messages-task/notice/0000755000175000017500000000000013641405665021132 5ustar fengfengukui-control-center/plugins/messages-task/notice/notice.pro0000644000175000017500000000214213641405665023134 0ustar fengfengQT += widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(notice) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lgsettings-qt CONFIG += c++11 # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ notice.cpp HEADERS += \ notice.h FORMS += \ notice.ui ukui-control-center/plugins/messages-task/notice/notice.ui0000644000175000017500000002737713641405665022772 0ustar fengfeng Notice 0 0 800 600 Notice 0 0 0 32 48 550 0 960 16777215 0 0 0 0 0 16 0 0 0 Notice Settings 0 0 Set the type of notice in the operation center 2 0 0 56 16777215 56 0 0 0 0 0 0 16 16 0 0 Show new feature ater system upgrade Qt::Horizontal 40 20 0 56 16777215 56 0 0 0 0 0 0 16 16 0 0 Get notifications from the app Qt::Horizontal 40 20 0 56 16777215 56 0 0 0 0 0 0 16 16 0 0 Show notifications on the lock screen Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 32 0 0 Notice Origin 0 Qt::Vertical 20 40 ukui-control-center/plugins/messages-task/notice/notice.cpp0000644000175000017500000000711713641405665023125 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "notice.h" #include "ui_notice.h" #define NOTICE_SCHEMA "org.ukui.control-center.notice" #define NEW_FEATURE_KEY "show-new-feature" #define ENABLE_NOTICE_KEY "enable-notice" #define SHOWON_LOCKSCREEN_KEY "show-on-lockscreen" #define NOTICE_ORIGIN_SCHEMA "org.ukui.control-center.noticeorigin" #define NOTICE_ORIGIN_PATH "/org/ukui/control-center/noticeorigin/" Notice::Notice() { ui = new Ui::Notice; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("notice"); pluginType = NOTICEANDTASKS; pluginWidget->setStyleSheet("background: #ffffff;"); ui->newfeatureWidget->setStyleSheet("QWidget{background: #F4F4F4; border: none; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); ui->enableWidget->setStyleSheet("QWidget{background: #F4F4F4; border: none;}"); ui->lockscreenWidget->setStyleSheet("QWidget{background: #F4F4F4; border: none; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"); QByteArray id(NOTICE_SCHEMA); nSetting = new QGSettings(id); setupComponent(); initNoticeStatus(); } Notice::~Notice() { delete ui; delete nSetting; } QString Notice::get_plugin_name(){ return pluginName; } int Notice::get_plugin_type(){ return pluginType; } QWidget * Notice::get_plugin_ui(){ return pluginWidget; } void Notice::plugin_delay_control(){ } void Notice::setupComponent(){ newfeatureSwitchBtn = new SwitchButton(pluginWidget); enableSwitchBtn = new SwitchButton(pluginWidget); lockscreenSwitchBtn = new SwitchButton(pluginWidget); ui->newfeatureHorLayout->addWidget(newfeatureSwitchBtn); ui->enableHorLayout->addWidget(enableSwitchBtn); ui->lockscreenHorLayout->addWidget(lockscreenSwitchBtn); connect(newfeatureSwitchBtn, &SwitchButton::checkedChanged, [=](bool checked){ nSetting->set(NEW_FEATURE_KEY, checked); }); connect(enableSwitchBtn, &SwitchButton::checkedChanged, [=](bool checked){ nSetting->set(ENABLE_NOTICE_KEY, checked); }); connect(lockscreenSwitchBtn, &SwitchButton::checkedChanged, [=](bool checked){ nSetting->set(SHOWON_LOCKSCREEN_KEY, checked); }); } void Notice::initNoticeStatus(){ newfeatureSwitchBtn->blockSignals(true); enableSwitchBtn->blockSignals(true); lockscreenSwitchBtn->blockSignals(true); newfeatureSwitchBtn->setChecked(nSetting->get(NEW_FEATURE_KEY).toBool()); enableSwitchBtn->setChecked(nSetting->get(ENABLE_NOTICE_KEY).toBool()); lockscreenSwitchBtn->setChecked(nSetting->get(SHOWON_LOCKSCREEN_KEY).toBool()); newfeatureSwitchBtn->blockSignals(false); enableSwitchBtn->blockSignals(false); lockscreenSwitchBtn->blockSignals(false); } ukui-control-center/plugins/messages-task/notice/notice.h0000644000175000017500000000347713641405665022577 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef NOTICE_H #define NOTICE_H #include #include #include #include #include "SwitchButton/switchbutton.h" QT_BEGIN_NAMESPACE namespace Ui { class Notice; } QT_END_NAMESPACE class Notice : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Notice(); ~Notice(); public: QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupComponent(); void initNoticeStatus(); private: Ui::Notice *ui; private: QString pluginName; int pluginType; QWidget * pluginWidget; private: SwitchButton * newfeatureSwitchBtn; SwitchButton * enableSwitchBtn; SwitchButton * lockscreenSwitchBtn; QGSettings * nSetting; }; #endif // NOTICE_H ukui-control-center/plugins/messages-task/experienceplan/0000755000175000017500000000000013635356010022643 5ustar fengfengukui-control-center/plugins/messages-task/experienceplan/experienceplan.h0000644000175000017500000000345313635333016026024 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef EXPERIENCEPLAN_H #define EXPERIENCEPLAN_H #include #include #include #include "shell/interface.h" #include "SwitchButton/switchbutton.h" QT_BEGIN_NAMESPACE namespace Ui { class ExperiencePlan; } QT_END_NAMESPACE class ExperiencePlan : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: ExperiencePlan(); ~ExperiencePlan(); public: QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupComponent(); void initEpStatus(); private: Ui::ExperiencePlan *ui; private: QString pluginName; int pluginType; QWidget * pluginWidget; private: SwitchButton * joinSwitchBtn; QGSettings * eSettings; }; #endif // EXPERIENCEPLAN_H ukui-control-center/plugins/messages-task/experienceplan/experienceplan.pro0000644000175000017500000000220113635356010026362 0ustar fengfengQT += widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(experienceplan) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lgsettings-qt CONFIG += c++11 # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ experienceplan.cpp HEADERS += \ experienceplan.h FORMS += \ experienceplan.ui ukui-control-center/plugins/messages-task/experienceplan/experienceplan.ui0000644000175000017500000001443413635333016026213 0ustar fengfeng ExperiencePlan 0 0 800 600 ExperiencePlan 0 0 0 32 30 550 0 960 16777215 0 0 0 0 0 16 0 0 0 User Experience 0 50 16777215 50 0 0 0 0 0 16 16 0 0 Join in user Experience plan Qt::Horizontal 40 20 0 16 16 0 0 User experience plan terms, see 《User Experience plan》 Qt::Horizontal 40 20 Qt::Vertical 20 40 ukui-control-center/plugins/messages-task/experienceplan/experienceplan.cpp0000644000175000017500000000510713635333016026355 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "experienceplan.h" #include "ui_experienceplan.h" #define E_PLAN_SCHEMA "org.ukui.control-center.experienceplan" #define JOIN_KEY "join" ExperiencePlan::ExperiencePlan() { ui = new Ui::ExperiencePlan; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("experienceplan"); pluginType = NOTICEANDTASKS; pluginWidget->setStyleSheet("background: #ffffff;"); ui->joinWidget->setStyleSheet("QWidget{background: #F4F4F4; border: none; border-radius: 6px;}"); ui->termsBtn->setStyleSheet("QPushButton{background: #ffffff; color: #3D6BE5;}" "QPushButton:hover:!pressed{background: #ffffff; color: #ffffff;}" "QPushButton:hover:pressed{background: #ffffff; color: #ffffff;}"); QByteArray id(E_PLAN_SCHEMA); eSettings = new QGSettings(id); setupComponent(); initEpStatus(); } ExperiencePlan::~ExperiencePlan() { delete ui; delete eSettings; } QString ExperiencePlan::get_plugin_name(){ return pluginName; } int ExperiencePlan::get_plugin_type(){ return pluginType; } QWidget * ExperiencePlan::get_plugin_ui(){ return pluginWidget; } void ExperiencePlan::plugin_delay_control(){ } void ExperiencePlan::setupComponent(){ joinSwitchBtn = new SwitchButton(pluginWidget); ui->joinHorLayout->addWidget(joinSwitchBtn); connect(joinSwitchBtn, &SwitchButton::checkedChanged, [=](bool checked){ eSettings->set(JOIN_KEY, checked); }); } void ExperiencePlan::initEpStatus(){ joinSwitchBtn->blockSignals(true); joinSwitchBtn->setChecked(eSettings->get(JOIN_KEY).toBool()); joinSwitchBtn->blockSignals(false); } ukui-control-center/plugins/plugins.pro0000644000175000017500000000144413641405665017310 0ustar fengfengTEMPLATE = subdirs SUBDIRS = \ devices/shortcut \ messages-task/experienceplan \ messages-task/notice \ system/defaultapp \ system/power \ system/autoboot \ system/display \ devices/printer \ devices/mouse \ devices/keyboard \ devices/touchpad \ personalized/wallpaper \ personalized/theme \ personalized/screenlock \ personalized/fonts \ personalized/screensaver \ personalized/desktop \ network/netconnect \ network/vpn \ network/proxy \ account/userinfo \ security-updates/backup \ messages-task/about \ time-language/datetime \ time-language/area \ ukui-control-center/plugins/system/0000755000175000017500000000000013621411724016415 5ustar fengfengukui-control-center/plugins/system/autoboot/0000755000175000017500000000000013642553044020256 5ustar fengfengukui-control-center/plugins/system/autoboot/autoboot.cpp0000644000175000017500000006550513640364120022622 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "autoboot.h" #include "ui_autoboot.h" #include #include #include "SwitchButton/switchbutton.h" #include "HoverWidget/hoverwidget.h" #include "autobootworker.h" #include /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include #include #include } #define ITEMWIDTH 522 #define ITEMHEIGHT 62 #define HEADHEIGHT 38 struct SaveData : QObjectUserData { QString bname; }; AutoBoot::AutoBoot(){ ui = new Ui::AutoBoot; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("autoboot"); pluginType = SYSTEM; pluginWidget->setStyleSheet("background: #ffffff;"); ui->addWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->listWidget->setStyleSheet("QListWidget#listWidget{background: #ffffff; border: none;}" ""); ui->addBtn->setIcon(QIcon("://img/plugins/autoboot/add.png")); ui->addBtn->setIconSize(QSize(48, 48)); ui->listWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->listWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->listWidget->setSpacing(0); localconfigdir = g_build_filename(g_get_user_config_dir(), "autostart", NULL); //初始化添加界面 dialog = new AddAutoBoot(); initUI(); connect(ui->addBtn, &QPushButton::clicked, this, [=]{dialog->exec();}); connect(dialog, SIGNAL(autoboot_adding_signals(QString, QString,QString,QString)), this, SLOT(add_autoboot_realize_slot(QString ,QString,QString,QString))); } AutoBoot::~AutoBoot() { delete ui; delete dialog; g_free(localconfigdir); } QString AutoBoot::get_plugin_name(){ return pluginName; } int AutoBoot::get_plugin_type(){ return pluginType; } QWidget *AutoBoot::get_plugin_ui(){ return pluginWidget; } void AutoBoot::plugin_delay_control(){ } void AutoBoot::initUI(){ _walk_config_dirs(); appgroupMultiMaps.clear(); int num = statusMaps.count(); //显示全部ITEM,设置高 ui->listWidget->setFixedHeight(num * ITEMHEIGHT + HEADHEIGHT); //构建行头基础Widget QWidget * headbaseWidget = new QWidget; headbaseWidget->setAttribute(Qt::WA_DeleteOnClose); QVBoxLayout * headbaseVerLayout = new QVBoxLayout(headbaseWidget); headbaseVerLayout->setSpacing(0); headbaseVerLayout->setContentsMargins(0, 0, 0, 2); //构建行头 QWidget * headWidget = new QWidget; headWidget->setMinimumWidth(550); headWidget->setMaximumWidth(960); headWidget->setMinimumHeight(36); headWidget->setMaximumHeight(36); headWidget->setAttribute(Qt::WA_DeleteOnClose); headWidget->setObjectName("headWidget"); // headWidget->setFixedHeight(36); headWidget->setStyleSheet("QWidget#headWidget{background: #F4F4F4; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); QHBoxLayout * headHorLayout = new QHBoxLayout(headWidget); headHorLayout->setSpacing(16); headHorLayout->setContentsMargins(64, 0, 32, 0); QLabel * nameLabel = new QLabel(headWidget); // QSizePolicy nameSizePolicy = nameLabel->sizePolicy(); // nameSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); // nameLabel->setSizePolicy(nameSizePolicy); nameLabel->setFixedWidth(220); nameLabel->setText(tr("Name")); nameLabel->setStyleSheet("background: #F4F4F4;"); QLabel * statusLabel = new QLabel(headWidget); // QSizePolicy statusSizePolicy = statusLabel->sizePolicy(); // statusSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); // statusLabel->setSizePolicy(statusSizePolicy); statusLabel->setFixedWidth(68); statusLabel->setText(tr("Status")); statusLabel->setStyleSheet("background: #F4F4F4;"); headHorLayout->addWidget(nameLabel); headHorLayout->addStretch(); headHorLayout->addWidget(statusLabel); headHorLayout->addStretch(); headWidget->setLayout(headHorLayout); headbaseVerLayout->addWidget(headWidget); headbaseVerLayout->addStretch(); headbaseWidget->setLayout(headbaseVerLayout); QListWidgetItem * hItem = new QListWidgetItem(ui->listWidget); hItem->setSizeHint(QSize(ITEMWIDTH, HEADHEIGHT)); ui->listWidget->setItemWidget(hItem, headbaseWidget); //构建每个启动项 QSignalMapper * checkSignalMapper = new QSignalMapper(this); QMap::iterator it = statusMaps.begin(); for (int index = 0; it != statusMaps.end(); it++, index++){ QString bname = it.value().bname; QWidget * baseWidget = new QWidget; baseWidget->setAttribute(Qt::WA_DeleteOnClose); QVBoxLayout * baseVerLayout = new QVBoxLayout(baseWidget); baseVerLayout->setSpacing(0); baseVerLayout->setContentsMargins(0, 0, 0, 2); HoverWidget * widget = new HoverWidget(bname); // widget->setFixedHeight(60); // widget->setMinimumWidth(550); widget->setMaximumWidth(960); widget->setMinimumHeight(60); widget->setMaximumHeight(60); widget->setAttribute(Qt::WA_DeleteOnClose); widget->setStyleSheet("background: #F4F4F4;"); QHBoxLayout * mainHLayout = new QHBoxLayout(widget); mainHLayout->setContentsMargins(16, 0, 32, 0); mainHLayout->setSpacing(16); QLabel * iconLabel = new QLabel(widget); iconLabel->setFixedSize(32, 32); iconLabel->setPixmap(it.value().pixmap); iconLabel->setStyleSheet("background: #F4F4F4"); QLabel * textLabel = new QLabel(widget); textLabel->setStyleSheet("background: #F4F4F4"); textLabel->setFixedWidth(250); textLabel->setText(bname); SwitchButton * button = new SwitchButton(); button->setAttribute(Qt::WA_DeleteOnClose); // button->setChecked(it.value().enable); button->setChecked(!it.value().hidden); connect(button, SIGNAL(checkedChanged(bool)), checkSignalMapper, SLOT(map())); checkSignalMapper->setMapping(button, it.key()); appgroupMultiMaps.insert(it.key(), button); QPushButton * dBtn = new QPushButton(widget); dBtn->setFixedSize(QSize(32, 32)); dBtn->setText("Del"); dBtn->setHidden(true); connect(dBtn, &QPushButton::clicked, this, [=]{ del_autoboot_realize(bname); }); dBtn->setStyleSheet("" "QPushButton{background: #FA6056; border-radius: 2px;}" "QPushButton:hover:pressed{background: #E54A50; border-radius: 2px;}"); QLabel * pLabel = new QLabel(widget); pLabel->setFixedSize(QSize(32, 32)); pLabel->setHidden(false); mainHLayout->addWidget(iconLabel); mainHLayout->addWidget(textLabel); mainHLayout->addStretch(1); mainHLayout->addWidget(button); mainHLayout->addStretch(1); mainHLayout->addWidget(pLabel); mainHLayout->addWidget(dBtn); widget->setLayout(mainHLayout); if (it.value().xdg_position == LOCALPOS){ connect(widget, &HoverWidget::enterWidget, this, [=](QString name){ Q_UNUSED(name) dBtn->setHidden(false); pLabel->setHidden(true); // widget->setStyleSheet("background: #EEF2FD;"); }); connect(widget, &HoverWidget::leaveWidget, this, [=](QString name){ Q_UNUSED(name) dBtn->setHidden(true); pLabel->setHidden(false); // widget->setStyleSheet("background: #F4F4F4;"); }); } baseVerLayout->addWidget(widget); baseVerLayout->addStretch(); baseWidget->setLayout(baseVerLayout); QListWidgetItem * item = new QListWidgetItem(ui->listWidget); item->setSizeHint(QSize(ITEMWIDTH, ITEMHEIGHT)); ui->listWidget->setItemWidget(item, baseWidget); } connect(checkSignalMapper, SIGNAL(mapped(QString)), this, SLOT(checkbox_changed_cb(QString))); } bool AutoBoot::_copy_desktop_file_to_local(QString bname){ GFile * srcfile; GFile * dstfile; char * dstpath, * srcpath; //不存在则创建~/.config/autostart/ if (!g_file_test(localconfigdir, G_FILE_TEST_EXISTS)){ GFile * dstdirfile; dstdirfile = g_file_new_for_path(localconfigdir); g_file_make_directory(dstdirfile, NULL, NULL); } QMap::iterator it = appMaps.find(bname); dstpath = g_build_filename(localconfigdir, bname.toUtf8().data(), NULL); srcpath = it.value().path.toUtf8().data(); srcfile = g_file_new_for_path(srcpath); dstfile = g_file_new_for_path(dstpath); if (!g_file_copy(srcfile, dstfile, G_FILE_COPY_NONE, NULL, NULL, NULL, NULL)){ qDebug() << "Could not copy desktop file for autoboot"; g_object_unref(srcfile); g_object_unref(dstfile); g_free(dstpath); return false; } //更新数据 AutoApp addapp; addapp = _app_new(dstpath); addapp.xdg_position = ALLPOS; localappMaps.insert(addapp.bname, addapp); QMap::iterator updateit = statusMaps.find(bname); updateit.value().xdg_position = ALLPOS; updateit.value().path = QString(dstpath); g_object_unref(srcfile); g_object_unref(dstfile); g_free(dstpath); return true; } bool AutoBoot::_delete_local_autoapp(QString bname){ char * dstpath; dstpath = g_build_filename(localconfigdir, bname.toUtf8().data(), NULL); if (g_remove(dstpath) == -1){ g_free(dstpath); return false; } //更新数据 localappMaps.remove(bname); QMap::iterator updateit = statusMaps.find(bname); if (updateit == statusMaps.end()) qDebug() << "statusMaps Data Error when delete local file"; else{ if (updateit.value().xdg_position == LOCALPOS){ statusMaps.remove(bname); } else if (updateit.value().xdg_position == ALLPOS){ QMap::iterator appit = appMaps.find(bname); if (appit == appMaps.end()) qDebug() << "appMaps Data Error when delete local file"; else{ updateit.value().hidden = appit.value().hidden; updateit.value().path = appit.value().path; } updateit.value().xdg_position = SYSTEMPOS; } } g_free(dstpath); return true; } bool AutoBoot::_enable_autoapp(QString bname, bool status){ char * dstpath; dstpath = g_build_filename(localconfigdir, bname.toUtf8().data(), NULL); //获取并修改值 GKeyFile * keyfile; GError * error; keyfile = g_key_file_new(); error = NULL; g_key_file_load_from_file(keyfile, dstpath, G_KEY_FILE_KEEP_COMMENTS, &error); if (error){ g_error_free(error); qDebug() << "Start autoboot failed because keyfile load from file error"; g_free(dstpath); return false; } g_key_file_set_boolean(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_HIDDEN, !status); if (!_key_file_to_file(keyfile, dstpath)){ qDebug() << "Start autoboot failed because could not save desktop file"; g_free(dstpath); return false; } g_key_file_free(keyfile); //更新数据 QMap::iterator updateit = statusMaps.find(bname); if (updateit == statusMaps.end()) qDebug() << "Start autoboot failed because autoBoot Data Error"; else{ updateit.value().hidden = !status; } g_free(dstpath); return true; } bool AutoBoot::_delete_autoapp(QString bname){ char * dstpath; dstpath = g_build_filename(localconfigdir, bname.toUtf8().data(), NULL); //获取并修改值 GKeyFile * keyfile; GError * error; keyfile = g_key_file_new(); error = NULL; g_key_file_load_from_file(keyfile, dstpath, G_KEY_FILE_KEEP_COMMENTS, &error); if (error){ g_error_free(error); qDebug() << "Delete autoboot failed because keyfile load from file error"; g_free(dstpath); return false; } g_key_file_set_boolean(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_HIDDEN, true); if (!_key_file_to_file(keyfile, dstpath)){ qDebug() << "Delete autoboot failed because could not save desktop file"; g_free(dstpath); return false; } //刷新界面 ui->listWidget->clear(); initUI(); g_free(dstpath); return true; } bool AutoBoot::_stop_autoapp(QString bname){ char * dstpath; dstpath = g_build_filename(localconfigdir, bname.toUtf8().data(), NULL); //获取并修改值 GKeyFile * keyfile; GError * error; keyfile = g_key_file_new(); error = NULL; g_key_file_load_from_file(keyfile, dstpath, G_KEY_FILE_KEEP_COMMENTS, &error); if (error){ g_error_free(error); qDebug() << "Stop autoboot failed because keyfile load from file error"; g_free(dstpath); return false; } g_key_file_set_boolean(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_HIDDEN, true); if (!_key_file_to_file(keyfile, dstpath)){ qDebug() << "Stop autoboot failed because could not save desktop file"; g_free(dstpath); return false; } g_key_file_free(keyfile); //更新数据 QMap::iterator updateit = statusMaps.find(bname); if (updateit == statusMaps.end()) qDebug() << "Stop autoboot failed because AutoBoot Data Error"; else{ updateit.value().hidden = true; } g_free(dstpath); return true; } gboolean AutoBoot::_key_file_to_file(GKeyFile *keyfile, const gchar *path){ GError * werror; gchar * data; gsize length; gboolean res; werror = NULL; data = g_key_file_to_data(keyfile, &length, &werror); if (werror) return FALSE; res = g_file_set_contents(path, data, length, &werror); g_free(data); if (werror) return FALSE; return res; } gboolean AutoBoot::_key_file_get_shown(GKeyFile *keyfile, const char *currentdesktop){ char ** only_show_in, ** not_show_in; gboolean found; if (!currentdesktop) return TRUE; only_show_in = g_key_file_get_string_list(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN, NULL, NULL); if (only_show_in){ found = FALSE; for (int i = 0; only_show_in[i] != NULL; i++){ if (g_strcmp0(currentdesktop, only_show_in[i]) == 0){ found = TRUE; break; } } g_strfreev(only_show_in); if (!found) return FALSE; } not_show_in = g_key_file_get_string_list(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN, NULL, NULL); if (not_show_in){ found = FALSE; for (int i = 0; not_show_in[i] != NULL; i++){ if (g_strcmp0(currentdesktop, not_show_in[i]) == 0){ found = TRUE; break; } } g_strfreev(not_show_in); if (found) return FALSE; } return TRUE; } gboolean AutoBoot::_key_file_get_boolean(GKeyFile *keyfile, const gchar *key, gboolean defaultvalue){ GError * error; gboolean retval; error = NULL; retval = g_key_file_get_boolean(keyfile, G_KEY_FILE_DESKTOP_GROUP, key, &error); if (error != NULL){ retval = defaultvalue; g_error_free(error); } return retval; } AutoApp AutoBoot::_app_new(const char *path){ AutoApp app; GKeyFile * keyfile; char * bname, * obpath, *name, * comment, * exec, * icon; bool hidden, no_display, enable, shown; app.bname = ""; keyfile = g_key_file_new(); if (!g_key_file_load_from_file(keyfile, path, G_KEY_FILE_NONE, NULL)){ g_key_file_free (keyfile); return app; } bname = g_path_get_basename(path); obpath = g_strdup(path); hidden = _key_file_get_boolean(keyfile, G_KEY_FILE_DESKTOP_KEY_HIDDEN, FALSE); no_display = _key_file_get_boolean(keyfile, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, FALSE); // enable = _key_file_get_boolean(keyfile, APP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLE, TRUE); shown = _key_file_get_shown(keyfile, g_getenv("XDG_CURRENT_DESKTOP")); name = g_key_file_get_locale_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, NULL, NULL); comment = g_key_file_get_locale_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_COMMENT, NULL, NULL); exec = g_key_file_get_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL); icon = g_key_file_get_locale_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, NULL, NULL); app.bname = QString::fromUtf8(bname); app.path = QString::fromUtf8(obpath); app.hidden = hidden; app.no_display = no_display; app.shown = shown; // app.enable = enable; app.name = QString::fromUtf8(name); app.comment = QString::fromUtf8(comment); app.exec = QString::fromUtf8(exec); if (!QString(icon).isEmpty() && QIcon::hasThemeIcon(QString(icon))){ QIcon currenticon = QIcon::fromTheme(QString(icon)); app.pixmap = currenticon.pixmap(QSize(32, 32)); } else{ app.pixmap = QPixmap(QString(":/img/plugins/autoboot/desktop.png")); } g_free(bname); g_free(obpath); g_key_file_free(keyfile); return app; } void AutoBoot::_walk_config_dirs(){ const char * const * systemconfigdirs; GDir * dir; const char * name; appMaps.clear(); systemconfigdirs = g_get_system_config_dirs(); //获取系统配置目录 for (int i = 0; systemconfigdirs[i]; i++){ char * path; path = g_build_filename(systemconfigdirs[i], "autostart", NULL); dir = g_dir_open(path, 0, NULL); if (!dir) continue; while ((name = g_dir_read_name(dir))) { AutoApp app; char * desktopfilepath; if (!g_str_has_suffix(name, ".desktop")) continue; desktopfilepath = g_build_filename(path, name, NULL); app = _app_new(desktopfilepath); // if (app.bname == "" || app.hidden || app.no_display || !app.shown || // app.exec == "/usr/bin/ukui-settings-daemon") //gtk控制面板屏蔽ukui-settings-daemon,猜测禁止用户关闭 // continue; app.xdg_position = SYSTEMPOS; appMaps.insert(app.bname, app); g_free (desktopfilepath); } g_dir_close(dir); } localappMaps.clear(); dir = g_dir_open(localconfigdir, 0, NULL); if (dir){ while ((name = g_dir_read_name(dir))) { AutoApp localapp; char * localdesktopfilepath; if (!g_str_has_suffix(name, ".desktop")) continue; localdesktopfilepath = g_build_filename(localconfigdir, name, NULL); localapp = _app_new(localdesktopfilepath); localapp.xdg_position = LOCALPOS; localappMaps.insert(localapp.bname, localapp); g_free(localdesktopfilepath); } g_dir_close(dir); } update_app_status(); } void AutoBoot::update_app_status(){ statusMaps.clear(); QMap::iterator it = appMaps.begin(); for (; it != appMaps.end(); it++){ if (/*it.value().hidden || */it.value().no_display || !it.value().shown || it.value().exec == "/usr/bin/ukui-settings-daemon") //gtk控制面板屏蔽ukui-settings-daemon,猜测禁止用户关闭 continue; statusMaps.insert(it.key(), it.value()); } QMap::iterator localit = localappMaps.begin(); for (; localit != localappMaps.end(); localit++){ if (/*localit.value().hidden || */localit.value().no_display || !localit.value().shown){ statusMaps.remove(localit.key()); continue; } if (statusMaps.contains(localit.key())){ //整合状态 QMap::iterator updateit = statusMaps.find(localit.key()); // if (localit.value().enable != updateit.value().enable){ // updateit.value().enable = localit.value().enable; // updateit.value().path = localit.value().path; // if (appMaps.contains(localit.key())) // updateit.value().xdg_position = ALLPOS; // } if (localit.value().hidden != updateit.value().hidden){ updateit.value().hidden = localit.value().hidden; updateit.value().path = localit.value().path; if (appMaps.contains(localit.key())){ updateit.value().xdg_position = ALLPOS; } } } else{ statusMaps.insert(localit.key(), localit.value()); } } } void AutoBoot::add_autoboot_realize_slot(QString path, QString name, QString exec, QString comment){ if (path.isEmpty()) return; char * filename, * filepath; filename = path.section("/", -1, -1).toUtf8().data(); if (!g_file_test(localconfigdir, G_FILE_TEST_EXISTS)){ GFile * dstdirfile; dstdirfile = g_file_new_for_path(localconfigdir); g_file_make_directory(dstdirfile, NULL, NULL); } filepath = g_build_filename(localconfigdir, filename, NULL); GKeyFile * keyfile; keyfile = g_key_file_new(); const char * locale = const_cast(QLocale::system().name().toUtf8().data()); char * type = QString("Application").toUtf8().data(); g_key_file_set_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TYPE, type); // g_key_file_set_boolean(keyfile, G_KEY_FILE_DESKTOP_GROUP, APP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLE, true); g_key_file_set_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, exec.toUtf8().data()); g_key_file_set_boolean(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_HIDDEN, false); g_key_file_set_boolean(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, false); g_key_file_set_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, name.toUtf8().data()); g_key_file_set_locale_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, locale, name.toUtf8().data()); g_key_file_set_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_COMMENT, comment.toUtf8().data()); // g_key_file_set_locale_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_COMMENT, locale, comment.toUtf8().data()); if (!_key_file_to_file(keyfile, filepath)) qDebug() << "Could not save desktop file"; g_key_file_free(keyfile); g_free(filepath); //refresh ui->listWidget->clear(); initUI(); } void AutoBoot::del_autoboot_realize(QString bname){ QMap::iterator it = statusMaps.find(bname); if (it == statusMaps.end()){ qDebug() << "AutoBoot Data Error"; return; } // if (it.value().xdg_position == SYSTEMPOS){ //复制改值 // if (_copy_desktop_file_to_local(bname)){ // _delete_autoapp(bname); // } // } // else if (it.value().xdg_position == ALLPOS){ //改值 // _delete_autoapp(bname); // } // else if (it.value().xdg_position == LOCALPOS){ //删除 _delete_local_autoapp(bname); ui->listWidget->clear(); initUI(); // } } void AutoBoot::checkbox_changed_cb(QString bname){ foreach (QString key, appgroupMultiMaps.keys()) { if (key == bname){ QMap::iterator it = statusMaps.find(bname); if (it == statusMaps.end()){ qDebug() << "AutoBoot Data Error"; return; } if (((SwitchButton *)appgroupMultiMaps.value(key))->isChecked()){ //开启开机启动 if (it.value().xdg_position == SYSTEMPOS){ // } else if (it.value().xdg_position == ALLPOS){ //删除 QMap::iterator appit = appMaps.find(bname); if (!appit.value().hidden){ //直接删除 _delete_local_autoapp(bname); //更新状态 QMap::iterator updateit = statusMaps.find(bname); if (updateit != statusMaps.end()){ updateit.value().hidden = false; updateit.value().xdg_position = SYSTEMPOS; updateit.value().path = appit.value().path; } else qDebug() << "Update status failed when start autoboot"; } // QMap::iterator statusit = statusMaps.begin(); // for (; statusit != statusMaps.end(); statusit++){ // qDebug() << statusit.value().xdg_position << statusit.value().path; // } } else if (it.value().xdg_position == LOCALPOS){//改值 _enable_autoapp(bname, true); } } else{ //关闭 if (it.value().xdg_position == SYSTEMPOS){ //复制后改值 if (_copy_desktop_file_to_local(bname)){ _stop_autoapp(bname); } } else if (it.value().xdg_position == ALLPOS){//正常逻辑不应存在该情况,预防处理 QMap::iterator appit = appMaps.find(bname); if (appit.value().hidden) _delete_local_autoapp(bname); } else if (it.value().xdg_position == LOCALPOS){//改值 // _enable_autoapp(bname, false); _stop_autoapp(bname); } } } } } ukui-control-center/plugins/system/autoboot/autoboot.h0000644000175000017500000000553713635333016022272 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef AUTOBOOT_H #define AUTOBOOT_H #include #include #include "shell/interface.h" #include "datadefined.h" #include "addautoboot.h" namespace Ui { class AutoBoot; } //typedef struct _AutoApp{ // QString bname; // QString path; // bool enable; // bool no_display; // bool shown; // bool hidden; // QString name; // QString comment; // QPixmap pixmap; // QString exec; // QString description; // int xdg_position; //}AutoApp; class AutoBoot : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: AutoBoot(); ~AutoBoot(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; void initUI(); void update_app_status(); void del_autoboot_realize(QString bname); private: Ui::AutoBoot *ui; QString pluginName; int pluginType; QWidget * pluginWidget; AddAutoBoot * dialog; QMap appMaps; QMap localappMaps; QMap statusMaps; QMultiMap appgroupMultiMaps; char * localconfigdir; void _walk_config_dirs(); AutoApp _app_new(const char * path); gboolean _key_file_get_boolean(GKeyFile * keyfile, const gchar * key, gboolean defaultvalue); gboolean _key_file_get_shown(GKeyFile * keyfile, const char * currentdesktop); bool _stop_autoapp(QString bname); bool _delete_autoapp(QString bname); bool _enable_autoapp(QString bname, bool status); bool _delete_local_autoapp(QString bname); gboolean _key_file_to_file(GKeyFile * keyfile, const gchar * path); bool _copy_desktop_file_to_local(QString bname); public slots: void checkbox_changed_cb(QString bname); void add_autoboot_realize_slot(QString path, QString name, QString exec, QString comment); }; #endif // AUTOBOOT_H ukui-control-center/plugins/system/autoboot/datadefined.h0000644000175000017500000000255113635333016022657 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef DATADEFINED_H #define DATADEFINED_H #include #include #define SYSTEMPOS 2 #define ALLPOS 1 #define LOCALPOS 0 #define APP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLE "X-UKUI-Autostart-enabled" typedef struct _AutoApp{ QString bname; QString path; // bool enable; bool no_display; bool shown; bool hidden; QString name; QString comment; QPixmap pixmap; QString exec; QString description; int xdg_position; }AutoApp; #endif // DATADEFINED_H ukui-control-center/plugins/system/autoboot/addautoboot.ui0000644000175000017500000003132213642553044023123 0ustar fengfeng AddAutoBoot 0 0 482 360 430 360 482 360 Add AutoBoot 0 0 0 0 0 0 90 QFrame::StyledPanel QFrame::Raised 0 0 0 0 0 0 0 Qt::Horizontal 40 20 48 32 48 32 8 32 16 32 32 0 0 Add autoboot program Qt::Vertical QSizePolicy::Fixed 20 32 0 0 0 110 0 110 16777215 Program name true 258 28 258 28 0 0 0 110 0 110 16777215 Program exec true 182 28 182 28 60 28 60 28 Open 0 0 0 110 0 110 16777215 Program comment true 258 28 258 28 Qt::Vertical QSizePolicy::Fixed 20 48 Qt::Horizontal 40 20 120 36 120 36 Cancel true 120 36 120 36 Certain Qt::Vertical 20 40 ukui-control-center/plugins/system/autoboot/autobootworker.cpp0000644000175000017500000000205713621411724024047 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "autobootworker.h" #include #include AutobootWorker::AutobootWorker(QObject *parent) { } //AutobootWorker::~AutobootWorker() //{ //} void AutobootWorker::doWork(){ } ukui-control-center/plugins/system/autoboot/autoboot.pro0000644000175000017500000000232313621411724022627 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-03-06T14:45:57 # #------------------------------------------------- QT += widgets svg TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(autoboot) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) include($$PROJECT_COMPONENTSOURCE/hoverwidget.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ ##加载gio库和gio-unix库,用于处理desktop文件 CONFIG += link_pkgconfig \ C++11 PKGCONFIG += gio-2.0 \ gio-unix-2.0 # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ autoboot.cpp \ addautoboot.cpp \ autobootworker.cpp HEADERS += \ autoboot.h \ addautoboot.h \ datadefined.h \ autobootworker.h FORMS += \ autoboot.ui \ addautoboot.ui ukui-control-center/plugins/system/autoboot/addautoboot.cpp0000644000175000017500000001137713642553044023300 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "addautoboot.h" #include "ui_addautoboot.h" #include //#define DESKTOPPATH "/etc/xdg/autostart/" #define DESKTOPPATH "/usr/share/applications/" AddAutoBoot::AddAutoBoot(QWidget *parent) : QDialog(parent), ui(new Ui::AddAutoBoot) { ui->setupUi(this); setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground); selectFile = ""; ui->frame->setStyleSheet("QFrame{background: #ffffff; border: none; border-radius: 6px;}"); //关闭按钮在右上角,窗体radius 6px,所以按钮只得6px ui->closeBtn->setStyleSheet("QPushButton#closeBtn{background: #ffffff; border: none; border-radius: 6px;}" "QPushButton:hover:!pressed#closeBtn{background: #FA6056; border: none; border-top-left-radius: 2px; border-top-right-radius: 6px; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px;}" "QPushButton:hover:pressed#closeBtn{background: #E54A50; border: none; border-top-left-radius: 2px; border-top-right-radius: 6px; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px;}"); QString lineEditQss = QString("QLineEdit{background: #E9E9E9; border: none; border-radius: 4px;}"); ui->nameLineEdit->setStyleSheet(lineEditQss); ui->execLineEdit->setStyleSheet(lineEditQss); ui->commentLineEdit->setStyleSheet(lineEditQss); QString btnQss = QString("QPushButton{background: #E9E9E9; border-radius: 4px;}" "QPushButton:checked{background: #3d6be5; border-radius: 4px;}" "QPushButton:hover:!pressed{background: #3d6be5; border-radius: 4px;}" "QPushButton:hover:pressed{background: #415FC4; border-radius: 4px;}"); ui->cancelBtn->setStyleSheet(btnQss); ui->certainBtn->setStyleSheet(btnQss); ui->closeBtn->setIcon(QIcon("://img/titlebar/close.png")); connect(ui->openBtn, SIGNAL(clicked(bool)), this, SLOT(open_desktop_dir_slots())); connect(ui->cancelBtn, SIGNAL(clicked(bool)), this, SLOT(close())); connect(ui->certainBtn, &QPushButton::clicked, this, [=]{emit autoboot_adding_signals(selectFile, ui->nameLineEdit->text(), ui->execLineEdit->text(), ui->commentLineEdit->text());close();}); connect(ui->closeBtn, &QPushButton::clicked, [=]{ close(); }); } AddAutoBoot::~AddAutoBoot() { delete ui; } void AddAutoBoot::open_desktop_dir_slots(){ QString filters = "Desktop files(*.desktop)"; QFileDialog fd; fd.setDirectory(DESKTOPPATH); fd.setAcceptMode(QFileDialog::AcceptOpen); fd.setViewMode(QFileDialog::List); fd.setNameFilter(filters); fd.setFileMode(QFileDialog::ExistingFile); fd.setWindowTitle(tr("selsect autoboot desktop")); fd.setLabelText(QFileDialog::Accept, "Select"); if (fd.exec() != QDialog::Accepted) return; QString selectedfile; selectedfile = fd.selectedFiles().first(); selectFile = selectedfile; QByteArray ba; ba = selectedfile.toUtf8(); //解析desktop文件 GKeyFile * keyfile; char *name, * comment, * exec; keyfile = g_key_file_new(); if (!g_key_file_load_from_file(keyfile, ba.data(), G_KEY_FILE_NONE, NULL)){ g_key_file_free (keyfile); return; } name = g_key_file_get_locale_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, NULL, NULL); comment = g_key_file_get_locale_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_COMMENT, NULL, NULL); exec = g_key_file_get_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL); // if (ui->nameLineEdit->text().isEmpty()) ui->nameLineEdit->setText(QString(name)); // if (ui->execLineEdit->text().isEmpty()) ui->execLineEdit->setText(QString(exec)); // if (ui->commentLineEdit->text().isEmpty()) ui->commentLineEdit->setText(QString(comment)); g_key_file_free(keyfile); } ukui-control-center/plugins/system/autoboot/autoboot.ui0000644000175000017500000001273713640373121022455 0ustar fengfeng AutoBoot 0 0 800 710 0 0 16777215 16777215 AutoBoot 2 0 20 32 48 0 0 0 0 0 0 0 16 0 0 0 Autoboot Settings true 0 60 16777215 60 0 0 0 0 0 8 16 48 48 48 48 0 0 Add autoboot app true Qt::Horizontal 40 20 ukui-control-center/plugins/system/autoboot/addautoboot.h0000644000175000017500000000317513635333016022737 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef ADDAUTOBOOT_H #define ADDAUTOBOOT_H #include #include /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include #include #include } namespace Ui { class AddAutoBoot; } class AddAutoBoot : public QDialog { Q_OBJECT public: explicit AddAutoBoot(QWidget *parent = 0); ~AddAutoBoot(); private: Ui::AddAutoBoot *ui; private: QString selectFile; private slots: void open_desktop_dir_slots(); Q_SIGNALS: void autoboot_adding_signals(QString path, QString name, QString exec, QString comment); }; #endif // ADDAUTOBOOT_H ukui-control-center/plugins/system/autoboot/autobootworker.h0000644000175000017500000000230713621411724023512 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef AUTOBOOTWORKER_H #define AUTOBOOTWORKER_H #include //#include "datadefined.h" class AutobootWorker : public QObject { Q_OBJECT public: explicit AutobootWorker(QObject * parent = 0); // ~AutobootWorker(); public: Q_SIGNALS: void threadComplete(); public slots: void doWork(); }; #endif // AUTOBOOTWORKER_H ukui-control-center/plugins/system/display/0000755000175000017500000000000013642662174020074 5ustar fengfengukui-control-center/plugins/system/display/qml.qrc0000644000175000017500000000017713630066010021361 0ustar fengfeng qml/Output.qml qml/main.qml ukui-control-center/plugins/system/display/unifiedoutputconfig.cpp0000644000175000017500000002370013630066010024654 0ustar fengfeng#include "unifiedoutputconfig.h" #include "resolutionslider.h" #include "utils.h" //#include "kcm_screen_debug.h" #include #include //#include #include #include #include #include #include #include #include #include #include #include #include bool operator<(const QSize &s1, const QSize &s2) { return s1.width() * s1.height() < s2.width() * s2.height(); } template<> bool qMapLessThanKey(const QSize &s1, const QSize &s2) { return s1 < s2; } UnifiedOutputConfig::UnifiedOutputConfig(const KScreen::ConfigPtr &config, QWidget *parent) : OutputConfig(parent) , mConfig(config) { } UnifiedOutputConfig::~UnifiedOutputConfig() { } void UnifiedOutputConfig::setOutput(const KScreen::OutputPtr &output) { mOutput = output; mClones.clear(); mClones.reserve(mOutput->clones().count()); Q_FOREACH (int id, mOutput->clones()) { mClones << mConfig->output(id); } mClones << mOutput; OutputConfig::setOutput(output); } void UnifiedOutputConfig::initUi() { QFont ft; ft.setPointSize(14); QVBoxLayout *vbox = new QVBoxLayout(this); vbox->setContentsMargins(0,0,0,0); //mTitle = new QLabel(this); // mTitle->setAlignment(Qt::AlignHCenter); // vbox->addWidget(mTitle); // setTitle(i18n("统一输出")); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); //vbox->addStretch(0); KScreen::OutputPtr fakeOutput = createFakeOutput(); mResolution = new ResolutionSlider(fakeOutput, this); //统一输出分辨率下拉框 mResolution->setFont(ft); mResolution->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); mResolution->setMinimumSize(402,30); // mResolution->setMaximumSize(402,30); QLabel *resLabel = new QLabel(this); resLabel->setText(tr("resolution")); resLabel->setFont(ft); resLabel->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); resLabel->setMinimumSize(118,30); resLabel->setMaximumSize(118,30); QHBoxLayout *resLayout = new QHBoxLayout(); resLayout->addWidget(resLabel); resLayout->addWidget(mResolution); // resLayout->addStretch(); QWidget *resWidget = new QWidget(this); resWidget->setLayout(resLayout); resWidget->setStyleSheet("background-color:#F4F4F4;border-radius:6px"); mResolution->setStyleSheet("background-color:#F8F9F9"); resWidget->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); resWidget->setMinimumSize(552,50); resWidget->setMaximumSize(960,50); vbox->addWidget(resWidget); connect(mResolution, &ResolutionSlider::resolutionChanged, this, &UnifiedOutputConfig::slotResolutionChanged); slotResolutionChanged(mResolution->currentResolution()); //方向下拉框 mRotation = new QComboBox(); connect(mRotation, static_cast(&QComboBox::currentIndexChanged), this, &UnifiedOutputConfig::slotRotationChanged); mRotation->setFont(ft); mRotation->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); mRotation->setMinimumSize(402,30); mRotation->setMaximumSize(16777215,30); mRotation->setStyleSheet(qss); mRotation->setItemDelegate(itemDelege); mRotation->setMaxVisibleItems(5); QLabel *rotateLabel = new QLabel(this); rotateLabel->setText(tr("orientation")); rotateLabel->setFont(ft); rotateLabel->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); rotateLabel->setMinimumSize(118,30); rotateLabel->setMaximumSize(118,30); connect(mRotation, static_cast(&QComboBox::currentIndexChanged), this, &UnifiedOutputConfig::slotRotationChangedDerived); mRotation->addItem(tr("arrow-up"), KScreen::Output::None); mRotation->addItem(tr("90° arrow-right"), KScreen::Output::Right); mRotation->addItem(tr("arrow-down"), KScreen::Output::Inverted); mRotation->addItem(tr("90° arrow-left"), KScreen::Output::Left); QHBoxLayout *roatateLayout = new QHBoxLayout(); roatateLayout->addWidget(rotateLabel); roatateLayout->addWidget(mRotation); QWidget *rotateWidget = new QWidget(this); rotateWidget->setLayout(roatateLayout); rotateWidget->setStyleSheet("background-color:#F4F4F4;border-radius:6px"); // mRotation->setStyleSheet("background-color:#F8F9F9"); rotateWidget->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); rotateWidget->setMinimumSize(552,50); rotateWidget->setMaximumSize(960,50); vbox->addWidget(rotateWidget); //统一输出刷新率下拉框 mRefreshRate = new QComboBox(this); mRefreshRate->setFont(ft); mRefreshRate->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); mRefreshRate->setMinimumSize(402,30); mRefreshRate->setMaximumSize(16777215,30); QString cqss = "QComboBox{" "background: rgba(244,244,244);" "border-radius:6px;" "font-size:12px;" "color: black;" "}" "QComboBox::down-arrow {" "image:url(:/images/downpx.png);" "}" "QComboBox::drop-down {" "width: 30px;" "border: none;" "}"; mRefreshRate->setStyleSheet(cqss); QLabel *freshLabel = new QLabel(this); freshLabel->setText(tr("refresh rate")); freshLabel->setFont(ft); freshLabel->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); freshLabel->setMinimumSize(118,30); freshLabel->setMaximumSize(118,30); mRefreshRate->addItem(tr("auto"), -1); mRefreshRate->addItem(tr("aa"), -1); QHBoxLayout *freshLayout = new QHBoxLayout(); freshLayout->addWidget(freshLabel); freshLayout->addWidget(mRefreshRate); QWidget *freshWidget = new QWidget(this); freshWidget->setLayout(freshLayout); freshWidget->setStyleSheet("background-color:#F4F4F4;border-radius:6px"); vbox->addWidget(freshWidget); freshWidget->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); freshWidget->setMinimumSize(552,50); freshWidget->setMaximumSize(960,50); mRefreshRate->setEnabled(false); } KScreen::OutputPtr UnifiedOutputConfig::createFakeOutput() { // Find set of common resolutions QMap commonSizes; Q_FOREACH (const KScreen::OutputPtr &clone, mClones) { QList processedSizes; Q_FOREACH (const KScreen::ModePtr &mode, clone->modes()) { // Make sure we don't count some modes multiple times because of different // refresh rates if (processedSizes.contains(mode->size())) { continue; } processedSizes << mode->size(); if (commonSizes.contains(mode->size())) { commonSizes[mode->size()]++; } else { commonSizes.insert(mode->size(), 1); } } } KScreen::OutputPtr fakeOutput(new KScreen::Output); // This will give us list of resolution that are shared by all outputs QList commonResults = commonSizes.keys(mClones.count()); // If there are no common resolution, fallback to smallest preferred mode if (commonResults.isEmpty()) { QSize smallestMode; Q_FOREACH (const KScreen::OutputPtr &clone, mClones) { //qCDebug(KSCREEN_KCM) << smallestMode << clone->preferredMode()->size(); if (!smallestMode.isValid() || clone->preferredMode()->size() < smallestMode) { smallestMode = clone->preferredMode()->size(); } } commonResults << smallestMode; } std::sort(commonResults.begin(), commonResults.end()); KScreen::ModeList modes; Q_FOREACH (const QSize &size, commonResults) { KScreen::ModePtr mode(new KScreen::Mode); mode->setSize(size); mode->setId(Utils::sizeToString(size)); mode->setName(mode->id()); modes.insert(mode->id(), mode); } fakeOutput->setModes(modes); fakeOutput->setCurrentModeId(Utils::sizeToString(commonResults.last())); return fakeOutput; } void UnifiedOutputConfig::slotResolutionChanged(const QSize &size) { // Ignore disconnected outputs if (!size.isValid()) { return; } Q_FOREACH (const KScreen::OutputPtr &clone, mClones) { const QString &id = findBestMode(clone, size); if (id.isEmpty()) { // FIXME: Error? return; } clone->setCurrentModeId(id); } Q_EMIT changed(); } QString UnifiedOutputConfig::findBestMode(const KScreen::OutputPtr &output, const QSize &size) { float refreshRate = 0; QString id; Q_FOREACH (const KScreen::ModePtr &mode, output->modes()) { if (mode->size() == size && mode->refreshRate() > refreshRate) { refreshRate = mode->refreshRate(); id = mode->id(); } } return id; } //统一输出方向信号改变 void UnifiedOutputConfig::slotRotationChangedDerived(int index){ KScreen::Output::Rotation rotation = static_cast(mRotation->itemData(index).toInt()); auto mainOutput = mConfig->primaryOutput(); //qDebug()<<"首屏幕输出--->"<isConnected()&&clone->isEnabled()){ //mOutput = clone; mainOutput->setRotation(rotation); // clone->setRotation(rotation); //qDebug()<<"是不是首屏------->"<isPrimary()<isPrimary()){ // qDebug()<<"非首屏------>"<setRotation(rotation); //output->apply(mainOutput); //clone->apply(mainOutput); } } } Q_EMIT changed(); } ukui-control-center/plugins/system/display/display.ui0000644000175000017500000002710213642662174022102 0ustar fengfeng DisplayWindow 0 0 945 694 Form 550 200 960 200 550 200 550 200 QQuickWidget::SizeRootObjectToView 550 50 960 50 118 30 118 30 Noto Sans CJK SC 11 monitor 200 0 16777215 30 QComboBox{ background: rgba(255, 255, 255); border: 1px solid rgb(255, 255, 255); font-size:14px; padding-left: 8px; color: black; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; padding-left: 5px; background-color: rgba(255, 255, 255); } QComboBox QAbstractItemView::item:hover { background: #EEF2FD; } QComboBox QAbstractItemView::item:selected{ background: #3D6BE5; } QComboBox::drop-down{ width: 30px; border: none; } 120 30 120 30 9 set as home screen 0 QLayout::SetNoConstraint true 0 0 550 50 960 50 118 30 16777215 30 open monitor Qt::Horizontal 78 29 550 50 960 50 9 unify output Qt::Horizontal 98 17 550 50 960 50 118 30 16777215 30 screen brightness adjustment dark 0 0 QSlider{ width: 178px; height: 20px; } QSlider::groove:horizontal { border: 0px solid #bbb; } QSlider::sub-page:horizontal { background: #3D6BE5; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::add-page:horizontal { background: rgba(52,70,80,90%); border: 0px solid #777; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::handle:horizontal { width: 20px; height: 20px; background: #3D6BE5; border-radius:10px; } 1 Qt::Horizontal bright 550 50 960 50 120 30 16777215 30 apply Qt::Horizontal 40 20 Qt::Vertical 20 40 QQuickWidget QWidget
    QtQuickWidgets/QQuickWidget
    ukui-control-center/plugins/system/display/unifiedoutputconfig.h0000644000175000017500000000152313630066010024320 0ustar fengfeng#ifndef UNIFIEDOUTPUTCONFIG_H #define UNIFIEDOUTPUTCONFIG_H #include "outputconfig.h" namespace KScreen { class Output; class Config; } class UnifiedOutputConfig : public OutputConfig { Q_OBJECT public: explicit UnifiedOutputConfig(const KScreen::ConfigPtr &config, QWidget *parent); ~UnifiedOutputConfig() override; void setOutput(const KScreen::OutputPtr &output) override; private Q_SLOTS: void slotResolutionChanged(const QSize &size); //统一输出后调整屏幕方向统一代码 void slotRotationChangedDerived(int index); private: void initUi() override; KScreen::OutputPtr createFakeOutput(); QString findBestMode(const KScreen::OutputPtr &output, const QSize &size); private: KScreen::ConfigPtr mConfig; QList mClones; }; #endif // UNIFIEDOUTPUTCONFIG_H ukui-control-center/plugins/system/display/utils.h0000644000175000017500000000061113630066010021363 0ustar fengfeng#ifndef KSCREEN_KCM_UTILS_H #define KSCREEN_KCM_UTILS_H #include #include #include #include //获取显示器名字和ID类 namespace Utils { QString outputName(const KScreen::Output *output); QString outputName(const KScreen::OutputPtr &output); QString sizeToString(const QSize &size); } #endif ukui-control-center/plugins/system/display/resolutionslider.h0000644000175000017500000000172213635333016023645 0ustar fengfeng#ifndef RESOLUTIONSLIDER_H #define RESOLUTIONSLIDER_H #include #include #include class QSlider; class QLabel; class QComboBox; class QStyledItemDelegate; class ResolutionSlider : public QWidget { Q_OBJECT public: explicit ResolutionSlider(const KScreen::OutputPtr &output, QWidget *parent = nullptr); ~ResolutionSlider() override; QSize currentResolution() const; QSize getMaxResolution() const; Q_SIGNALS: void resolutionChanged(const QSize &size); private Q_SLOTS: void slotValueChanged(int); void slotOutputModeChanged(); private: void init(); KScreen::OutputPtr mOutput; QList mModes; QLabel *mSmallestLabel = nullptr; QLabel *mBiggestLabel = nullptr; QLabel *mCurrentLabel = nullptr; QSlider *mSlider = nullptr; QComboBox *mComboBox = nullptr; QString qss; QStyledItemDelegate *itemDelege; }; #endif // RESOLUTIONSLIDER_H ukui-control-center/plugins/system/display/widget.h0000644000175000017500000001172613642662174021537 0ustar fengfeng#ifndef WIDGET_H #define WIDGET_H #include #include #include #include #include #include "outputconfig.h" #include "slider.h" #include "SwitchButton/switchbutton.h" class QLabel; class QMLOutput; class QMLScreen; class ControlPanel; class PrimaryOutputCombo; class QPushButton; class QComboBox; class QQuickView; class QQuickWidget; class QStyledItemDelegate; typedef struct xml{ QString isClone; QString outputName; QString vendorName; QString productName; QString serialNum; QString widthValue; QString heightValue; QString rateValue; QString posxValue; QString posyValue; QString rotationValue; QString isPrimary; bool isEnable; }xmlFile; namespace KScreen { class ConfigOperation; } namespace Ui { class DisplayWindow; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget() override; void setConfig(const KScreen::ConfigPtr &config); KScreen::ConfigPtr currentConfig() const; void slotFocusedOutputChangedNoParam(); //亮度调节UI void initBrightnessUI(); QString getScreenName(QString name = ""); //获得显示器名称(shell获得) QStringList getscreenBrightnesName(); //获得显示器名称(shell获得) QStringList getscreenBrightnesValue(); //获取配置文件位置 void setBrigthnessFile(); //获取屏幕xml文件 void writeScreenXml(int count); //初始化屏幕配置文件 void initScreenXml(int count); //获取edid信息 void getEdidInfo(QString monitorName,xmlFile *xml); void setIsNightMode(bool isNightMode); QStringList readFile(const QString& filepath); void writeFile(const QString& filepath, const QStringList& content); float converToScale(const int value); int scaleToSlider(const float value); protected: bool eventFilter(QObject *object, QEvent *event) override; Q_SIGNALS: void changed(); void nightModeChanged(const bool nightMode) const; void redShiftValidChanged(const bool isValid) const; private Q_SLOTS: void slotFocusedOutputChanged(QMLOutput *output); void slotOutputEnabledChanged(); void slotOutputConnectedChanged(); void slotUnifyOutputs(); void slotIdentifyButtonClicked(bool checked = true); void slotIdentifyOutputs(KScreen::ConfigOperation *op); void clearOutputIdentifiers(); void outputAdded(const KScreen::OutputPtr &output); void outputRemoved(int outputId); void primaryOutputSelected(int index); void primaryOutputChanged(const KScreen::OutputPtr &output); //按钮选择主屏确认按钮 void primaryButtonEnable(); //是否禁用设置主屏按钮 void mainScreenButtonSelect(int index); //是否禁用屏幕 void checkOutputScreen(bool judge); //设置屏幕亮度 void setBrightnessScreen(int brightnessValue); //设置亮度滑块数值 void setBrightnesSldierValue(QString screeName); //保存屏幕亮度配置 void saveBrigthnessConfig(); void setPowerGSetttings(); //设置夜间模式 void setNightMode(const bool nightMode); //redshitf是否合法 void setRedShiftIsValid(bool redshiftIsValid); //更新夜间模式状态 void updateNightStatus(); //初始化夜间模式 void initNightStatus(); public Q_SLOTS: void save(); void scaleChangedSlot(int index); private: void loadQml(); void resetPrimaryCombo(); void addOutputToPrimaryCombo(const KScreen::OutputPtr &output); KScreen::OutputPtr findOutput(const KScreen::ConfigPtr &config, const QVariantMap &info); float scaleRet(); void writeScale(float scale); void initGSettings(); bool getNightModeGSetting(const QString &key); void setNightModebyPanel(bool judge); void setSessionScale(int scale); private: Ui::DisplayWindow *ui; QMLScreen *mScreen = nullptr; KScreen::ConfigPtr mConfig = nullptr; KScreen::ConfigPtr mPrevConfig = nullptr; ControlPanel *mControlPanel = nullptr; //这里是去设置主显示器相关控件 OutputConfig *mOutputConfig = nullptr; QList mOutputIdentifiers; QTimer *mOutputTimer = nullptr; //这是outPutptr结果 KScreen::OutputPtr res = nullptr; bool m_blockChanges = false; QString brightnessFile = nullptr;//亮度配置文件位置 xmlFile inputXml[100];//xml文件 SwitchButton *nightButton = nullptr; SwitchButton *closeScreenButton = nullptr; SwitchButton *m_unifybutton = nullptr; QLabel *nightLabel = nullptr; bool m_isNightMode = false;//是否为夜间模式 bool m_redshiftIsValid = false; QStyledItemDelegate *itemDelege; QStringList proRes; //profile文件内容 Slider *slider; QGSettings *m_gsettings = nullptr; QGSettings *scaleGSettings = nullptr; QSettings *m_qsettings = nullptr; int screenScale = 1; }; #endif // WIDGET_H ukui-control-center/plugins/system/display/controlpanel.h0000644000175000017500000000172713635333016022744 0ustar fengfeng#ifndef CONTROLPANEL_H #define CONTROLPANEL_H #include #include class QVBoxLayout; class OutputConfig; class UnifiedOutputConfig; class QLabel; class QCheckBox; class QSlider; class QComboBox; class ControlPanel : public QFrame { Q_OBJECT public: explicit ControlPanel(QWidget *parent = nullptr); ~ControlPanel() override; void setConfig(const KScreen::ConfigPtr &config); void setUnifiedOutput(const KScreen::OutputPtr &output); public Q_SLOTS: void activateOutput(const KScreen::OutputPtr &output); public: void activateOutputNoParam(); Q_SIGNALS: void changed(); void scaleChanged(int index); private Q_SLOTS: void addOutput(const KScreen::OutputPtr &output); void removeOutput(int outputId); private: KScreen::ConfigPtr mConfig; QList mOutputConfigs; QVBoxLayout *mLayout; UnifiedOutputConfig *mUnifiedOutputCfg; }; #endif // CONTROLPANEL_H ukui-control-center/plugins/system/display/resolutionslider.cpp0000644000175000017500000001452513635333016024205 0ustar fengfeng#include "resolutionslider.h" #include "utils.h" #include #include #include #include #include #include //#include #include static bool sizeLessThan(const QSize &sizeA, const QSize &sizeB) { return sizeA.width() * sizeA.height() < sizeB.width() * sizeB.height(); } ResolutionSlider::ResolutionSlider(const KScreen::OutputPtr &output, QWidget *parent) : QWidget(parent) , mOutput(output) { itemDelege = new QStyledItemDelegate(); QFile QssFile("://combox.qss"); QssFile.open(QFile::ReadOnly); if (QssFile.isOpen()){ qss = QLatin1String(QssFile.readAll()); QssFile.close(); } connect(output.data(), &KScreen::Output::currentModeIdChanged, this, &ResolutionSlider::slotOutputModeChanged); connect(output.data(), &KScreen::Output::modesChanged, this, &ResolutionSlider::init); init(); } ResolutionSlider::~ResolutionSlider() { } void ResolutionSlider::init() { this->setMinimumSize(402,30); this->setMaximumSize(1677215, 30); mModes.clear(); Q_FOREACH (const KScreen::ModePtr &mode, mOutput->modes()) { if (mModes.contains(mode->size())) { continue; } mModes << mode->size(); } std::sort(mModes.begin(), mModes.end(), sizeLessThan); delete layout(); delete mSmallestLabel; mSmallestLabel = nullptr; delete mBiggestLabel; mBiggestLabel = nullptr; delete mCurrentLabel; mCurrentLabel = nullptr; delete mSlider; mSlider = nullptr; delete mComboBox; mComboBox = nullptr; QGridLayout *layout = new QGridLayout(this); int margin = layout->margin(); // Avoid double margins layout->setContentsMargins(0, 0, 0, 0); if (mModes.count() <= 60&&!mModes.empty()) { std::reverse(mModes.begin(), mModes.end()); mComboBox = new QComboBox(); mComboBox->setMinimumSize(402,30); mComboBox->setMaximumSize(1677215, 30); // mComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); // mComboBox->setEditable(false); mComboBox->setStyleSheet(qss); mComboBox->setItemDelegate(itemDelege); mComboBox->setMaxVisibleItems(5); int currentModeIndex = -1; int preferredModeIndex = -1; Q_FOREACH (const QSize &size, mModes) { mComboBox->addItem(Utils::sizeToString(size)); if (mOutput->currentMode() && (mOutput->currentMode()->size() == size)) { currentModeIndex = mComboBox->count() - 1; } else if (mOutput->preferredMode() && (mOutput->preferredMode()->size() == size)) { preferredModeIndex = mComboBox->count() - 1; } } if (currentModeIndex != -1) { mComboBox->setCurrentIndex(currentModeIndex); } else if (preferredModeIndex != -1) { mComboBox->setCurrentIndex(preferredModeIndex); } layout->addWidget(mComboBox, 0, 0, 1, 1); connect(mComboBox, static_cast(&QComboBox::currentIndexChanged), this, &ResolutionSlider::slotValueChanged, Qt::UniqueConnection); Q_EMIT resolutionChanged(mModes.at(mComboBox->currentIndex())); } else { mCurrentLabel = new QLabel(this); mCurrentLabel->setAlignment(Qt::AlignCenter); layout->addWidget(mCurrentLabel, 1, 0, 1, 3); if (mModes.isEmpty()) { mCurrentLabel->setText(tr("No available resolutions")); } else if (mModes.count() == 1) { mCurrentLabel->setText(Utils::sizeToString(mModes.first())); } else { // No double margins left and right, but they are needed on top and bottom layout->setContentsMargins(0, margin, 0, margin); mSlider = new QSlider(Qt::Horizontal, this); mSlider->setTickInterval(1); mSlider->setTickPosition(QSlider::TicksBelow); mSlider->setSingleStep(1); mSlider->setPageStep(1); mSlider->setMinimum(0); mSlider->setMaximum(mModes.size() - 1); mSlider->setSingleStep(1); if (mOutput->currentMode()) { mSlider->setValue(mModes.indexOf(mOutput->currentMode()->size())); } else if (mOutput->preferredMode()) { mSlider->setValue(mModes.indexOf(mOutput->preferredMode()->size())); } else { mSlider->setValue(mSlider->maximum()); } layout->addWidget(mSlider, 0, 1); connect(mSlider, &QSlider::valueChanged, this, &ResolutionSlider::slotValueChanged); mSmallestLabel = new QLabel(this); mSmallestLabel->setText(Utils::sizeToString(mModes.first())); layout->addWidget(mSmallestLabel, 0, 0); mBiggestLabel = new QLabel(this); mBiggestLabel->setText(Utils::sizeToString(mModes.last())); layout->addWidget(mBiggestLabel, 0, 2); const auto size = mModes.at(mSlider->value()); mCurrentLabel->setText(Utils::sizeToString(size)); Q_EMIT resolutionChanged(size); } } } QSize ResolutionSlider::currentResolution() const { if (mModes.isEmpty()) { return QSize(); } if (mModes.size() < 2) { return mModes.first(); } if (mSlider) { return mModes.at(mSlider->value()); } else { const int i = mComboBox->currentIndex(); return i > -1 ? mModes.at(i) : QSize(); } } QSize ResolutionSlider::getMaxResolution() const { if (mModes.isEmpty()) { return QSize(); } return mModes.first(); } void ResolutionSlider::slotOutputModeChanged() { if (!mOutput->currentMode()) { return; } if (mSlider) { mSlider->blockSignals(true); mSlider->setValue(mModes.indexOf(mOutput->currentMode()->size())); mSlider->blockSignals(false); } else if (mComboBox) { mComboBox->blockSignals(true); mComboBox->setCurrentIndex(mModes.indexOf(mOutput->currentMode()->size())); mComboBox->blockSignals(false); } } void ResolutionSlider::slotValueChanged(int value) { const QSize &size = mModes.at(value); if (mCurrentLabel) { mCurrentLabel->setText(Utils::sizeToString(size)); } Q_EMIT resolutionChanged(size); } ukui-control-center/plugins/system/display/utils.cpp0000644000175000017500000000231413630066010021720 0ustar fengfeng#include "utils.h" #include #include //#include QString Utils::outputName(const KScreen::OutputPtr& output) { //qDebug()<<"显示器名称-------->"<type() == KScreen::Output::Panel) { // return i18n("Laptop Screen"); // } if (output->edid()) { // The name will be "VendorName ModelName (ConnectorName)", // but some components may be empty. QString name; if (!(output->edid()->vendor().isEmpty())) { name = output->edid()->vendor() + QLatin1Char(' '); } if (!output->edid()->name().isEmpty()) { name += output->edid()->name() + QLatin1Char(' '); } if (!name.trimmed().isEmpty()) { return name + QLatin1Char('(') + output->name() + QLatin1Char(')'); } } //qDebug()<<"显示器名称-------->"<name(); return output->name(); } QString Utils::sizeToString(const QSize &size) { return QStringLiteral("%1x%2").arg(size.width()).arg(size.height()); } ukui-control-center/plugins/system/display/qml/0000755000175000017500000000000013630066010020645 5ustar fengfengukui-control-center/plugins/system/display/qml/Output.qml0000644000175000017500000002214313630066010022662 0ustar fengfeng/* Copyright (C) 2012 Dan Vratil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ import QtQuick 2.1 import QtGraphicalEffects 1.0 import org.kde.kscreen 1.0 QMLOutput { id: root; signal clicked(); signal primaryTriggered(string self); signal enabledToggled(string self); signal mousePressed(); signal mouseReleased(); property bool isDragged: monitorMouseArea.drag.active; property bool isDragEnabled: true; property bool isToggleButtonVisible: false; property bool hasMoved: false; width: monitorMouseArea.width; height: monitorMouseArea.height; visible: (opacity > 0); opacity: output.connected ? 1.0 : 0.0; Component.onCompleted: { root.updateRootProperties(); } SystemPalette { id: palette; } MouseArea { id: monitorMouseArea; width: root.currentOutputWidth * screen.outputScale; height: root.currentOutputHeight * screen.outputScale anchors.centerIn: parent; //是否激活时的透明度 opacity: root.output.enabled ? 1.0 : 0.3; transformOrigin: Item.Center; rotation: { if (output.rotation === KScreenOutput.None) { return 0; } else if (output.rotation === KScreenOutput.Left) { return 270; } else if (output.rotation === KScreenOutput.Inverted) { return 180; } else { return 90; } } hoverEnabled: true; preventStealing: true; drag { target: root.isDragEnabled && !root.isCloneMode ? root : null; axis: Drag.XandYAxis; minimumX: 0; maximumX: screen.maxScreenSize.width - root.width; minimumY: 0; maximumY: screen.maxScreenSize.height - root.height; filterChildren: false; } drag.onActiveChanged: { /* If the drag is shorter then the animation then make sure * we won't end up in an inconsistent state */ // console.log("宽度------>"+width) // console.log("高度------>"+height) if (dragActiveChangedAnimation.running) { dragActiveChangedAnimation.complete(); } dragActiveChangedAnimation.running = true; } onPressed: root.clicked(); /* FIXME: This could be in 'Behavior', but MouseArea had * some complaints...to tired to investigate */ PropertyAnimation { id: dragActiveChangedAnimation; target: monitor; property: "opacity"; from: monitorMouseArea.drag.active ? 0.7 : 1.0 to: monitorMouseArea.drag.active ? 1.0 : 0.7 duration: 100; easing.type: "OutCubic"; } Behavior on opacity { PropertyAnimation { property: "opacity"; easing.type: "OutCubic"; duration: 250; } } Behavior on rotation { RotationAnimation { easing.type: "OutCubic" duration: 250; direction: RotationAnimation.Shortest; } } Behavior on width { PropertyAnimation { property: "width"; easing.type: "OutCubic"; duration: 150; } } Behavior on height { PropertyAnimation { property: "height"; easing.type: "OutCubic"; duration: 150; } } Rectangle { id: monitor; anchors.fill: parent; //圆角 radius: 8; //是否点击到屏幕 color: root.focus? "#3D6BE5" : "#AEACAD"; smooth: true; clip: true; border { color: root.focus ? "#3498DB" : "#AED6F1"; width: 1; Behavior on color { PropertyAnimation { duration: 150; } } } Rectangle { id: posLabel; y: 4; x: 4; width: childrenRect.width + 5; height: childrenRect.height + 2; radius: 8; opacity: root.output.enabled && monitorMouseArea.drag.active ? 1.0 : 0.0; visible: opacity != 0.0; color: "#101010"; Text { id: posLabelText; text: root.outputX + "," + root.outputY; color: "white"; y: 2; x: 2; } } Item { //文字位置 y: ((parent.height - orientationPanel.height) / 2) - (implicitHeight / 2) anchors { left: parent.left; right: parent.right; leftMargin: 5; rightMargin: 5; } Text { id: nameLabel text: if (root.isCloneMode === true) { return ""; } else if (root.output.type !== KScreenOutput.Panel && root.output.edid && root.output.edid.name) { return root.output.edid.name; } else { return ""; } //上面文字颜色 color: "#FFFFFF"; font.pixelSize: 12; anchors { horizontalCenter: parent.horizontalCenter; bottom: labelVendor.top; topMargin: 5; } } Text { id: labelVendor; text: if (root.isCloneMode) { return ("Unified Outputs"); } else if (root.output.type === KScreenOutput.Panel) { return ("Laptop Screen"); } else if (root.output.edid && root.output.edid.vendor) { return root.output.edid.vendor; } else { return root.output.name; } anchors { verticalCenter: parent.verticalCenter; left: parent.left; right: parent.right; } horizontalAlignment: Text.AlignHCenter; //下面文字颜色 //color: palette.text; color: "#FFFFFF"; font.pixelSize: 10; elide: Text.ElideRight; } Text { id: label text: (labelVendor.text === root.output.name) ? "" : root.output.name color: palette.text; font.pixelSize: 10; anchors { horizontalCenter: parent.horizontalCenter; top: labelVendor.bottom; topMargin: 5; } } } } Item { id: orientationPanelContainer; anchors.fill: monitor; visible: false Rectangle { id: orientationPanel; //注释底部不会变色拖动时候 // anchors { // left: parent.left; // right: parent.right; // bottom: parent.bottom; // } height: 10; //color: root.focus ? palette.highlight : palette.shadow; //底部颜色 color: palette.highlight ; smooth: true; Behavior on color { PropertyAnimation { duration: 150; } } } } OpacityMask { anchors.fill: orientationPanelContainer; source: orientationPanelContainer; maskSource: monitor; } } Behavior on opacity { PropertyAnimation { duration: 200; easing.type: "OutCubic"; } } } ukui-control-center/plugins/system/display/qml/main.qml0000644000175000017500000000445613630066010022315 0ustar fengfeng/* Copyright (C) 2012 Dan Vratil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ import QtQuick 2.1 import QtQuick.Controls 1.1 as Controls //import org.kde.plasma.core 2.0 as PlasmaCore //import org.kde.kquickcontrols 2.0 import org.kde.kscreen 1.0 Item { id: root; property variant virtualScreen: null; objectName: "root"; focus: true; SystemPalette { id: palette; } Rectangle { id: background; anchors.fill: parent; focus: true; color: "#F4F4F4"; radius: 6 //设置矩形圆角弧度 FocusScope { id: outputViewFocusScope; anchors.fill: parent; focus: true; QMLScreen { id: outputView; anchors.fill: parent; clip: true; objectName: "outputView"; } } Column { anchors { left: parent.left; //right: identifyButton.left; bottom: parent.bottom; margins: 5; } spacing: 5; } //对识别按钮注释 Controls.ToolButton { // id: identifyButton // objectName: "identifyButton"; // anchors { // right: parent.right // bottom: parent.bottom // margins: 5 // } // height: width // width: theme.largeIconSize; // iconName: "kdocumentinfo" // tooltip: i18nd("kcm_displayconfiguration", "Identify outputs"); } } } ukui-control-center/plugins/system/display/outputconfig.h0000644000175000017500000000356613640364120022771 0ustar fengfeng#ifndef OUTPUTCONFIG_H #define OUTPUTCONFIG_H #include #include #include #include #include class QCheckBox; class ResolutionSlider; class QLabel; class QStyledItemDelegate; namespace Ui { class KScreenWidget; } class OutputConfig : public QWidget { Q_OBJECT public: explicit OutputConfig(QWidget *parent); explicit OutputConfig(const KScreen::OutputPtr &output, QWidget *parent = nullptr); ~OutputConfig() override; virtual void setOutput(const KScreen::OutputPtr &output); KScreen::OutputPtr output() const; void setTitle(const QString &title); void setShowScaleOption(bool showScaleOption); bool showScaleOption() const; //拿取配置 void initConfig(const KScreen::ConfigPtr &config); QStringList readFile(const QString& filepath); int scaleRet(); public: QStyledItemDelegate *itemDelege; protected Q_SLOTS: void slotResolutionChanged(const QSize &size); void slotRotationChanged(int index); void slotRefreshRateChanged(int index); void slotScaleChanged(int index); Q_SIGNALS: void changed(); void scaleChanged(int index); protected: virtual void initUi(); int getMaxReslotion(); int getScreenScale(); protected: QLabel *mTitle = nullptr; KScreen::OutputPtr mOutput; QCheckBox *mEnabled = nullptr; ResolutionSlider *mResolution = nullptr; QComboBox *mRotation = nullptr; QComboBox *mScale = nullptr; QComboBox *mRefreshRate = nullptr; QComboBox *mMonitor = nullptr; QComboBox *tmpResolution = nullptr; QComboBox *scaleCombox = nullptr; bool mShowScaleOption = false; KScreen::ConfigPtr mConfig = nullptr; QString qss; QStringList proRes; //profile文件内容 QGSettings *m_gsettings = nullptr; }; #endif // OUTPUTCONFIG_H ukui-control-center/plugins/system/display/display.cpp0000644000175000017500000000345413635333016022243 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include "display.h" #include "ui_display.h" #include #include #include DisplaySet::DisplaySet(){ pluginWidget = new Widget; pluginWidget->setStyleSheet("background: #ffffff;"); pluginName = tr("display"); QObject::connect(new KScreen::GetConfigOperation(), &KScreen::GetConfigOperation::finished, [&](KScreen::ConfigOperation *op) { pluginWidget->setConfig(qobject_cast(op)->config()); pluginWidget->initBrightnessUI(); }); pluginType = SYSTEM; } DisplaySet::~DisplaySet(){ } QWidget *DisplaySet::get_plugin_ui(){ return pluginWidget; } QString DisplaySet::get_plugin_name(){ return pluginName; } int DisplaySet::get_plugin_type(){ return pluginType; } void DisplaySet::plugin_delay_control(){ } ukui-control-center/plugins/system/display/slider.cpp0000644000175000017500000000207213635333016022053 0ustar fengfeng#include "slider.h" #include #include #include #include Slider::Slider() : QSlider(Qt::Horizontal) { scaleList << "1.0" << "1.25" << "1.5" << "1.75" << "2.0"; this->setMinimumHeight(50); } void Slider::paintEvent(QPaintEvent *e) { QSlider::paintEvent(e); auto painter = new QPainter(this); painter->setPen(QPen(Qt::black)); auto rect = this->geometry(); int numTicks = (maximum() - minimum())/tickInterval(); QFontMetrics fontMetrics = QFontMetrics(this->font()); if (this->orientation() == Qt::Horizontal) { int fontHeight = fontMetrics.height(); for (int i=0; i<=numTicks; i++) { int tickNum = minimum() + (tickInterval() * i); int tickX = (((rect.width()/numTicks) * i) - (fontMetrics.width(QString::number(tickNum))/2)); int tickY = rect.height()/2 + fontHeight + 2; painter->drawText(QPoint(tickX + 0.1, tickY), this->scaleList.at(i)); } } painter->end(); } ukui-control-center/plugins/system/display/display.pro0000644000175000017500000000241513635333016022255 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-02-20T15:36:43 # #------------------------------------------------- QT += widgets core gui quickwidgets quick xml KScreen KI18n KConfigCore KConfigWidgets KWidgetsAddons TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(display) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lgsettings-qt SOURCES += \ display.cpp \ declarative/qmloutput.cpp \ declarative/qmloutputcomponent.cpp \ declarative/qmlscreen.cpp \ controlpanel.cpp \ outputconfig.cpp \ resolutionslider.cpp \ slider.cpp \ unifiedoutputconfig.cpp \ utils.cpp \ widget.cpp HEADERS += \ display.h \ declarative/qmloutput.h \ declarative/qmloutputcomponent.h \ declarative/qmlscreen.h \ controlpanel.h \ outputconfig.h \ resolutionslider.h \ slider.h \ unifiedoutputconfig.h \ utils.h \ widget.h FORMS += \ display.ui #DISTFILES += \ # qml/main.qml \ # qml/Output.qml RESOURCES += \ qml.qrc DISTFILES += ukui-control-center/plugins/system/display/outputconfig.cpp0000644000175000017500000003511513641405665023332 0ustar fengfeng#include "outputconfig.h" #include "resolutionslider.h" #include "utils.h" //#include "kcm_screen_debug.h" #include #include #include #include #include #include #include #include //#include #include #include #include #include #include "ComboBox/combobox.h" #define SCRENN_SCALE_SCHMES "org.ukui.session" #define GDK_SCALE_KEY "gdk-scale" OutputConfig::OutputConfig(QWidget *parent) : QWidget(parent) , mOutput(nullptr) { //加载qss样式文件 QByteArray idScale(SCRENN_SCALE_SCHMES); if (QGSettings::isSchemaInstalled(idScale)) { // qDebug()<<"initGSettings-------------------->"<setText(title); } void OutputConfig::initUi() { connect(mOutput.data(), &KScreen::Output::isConnectedChanged, this, [=]() { if (!mOutput->isConnected()) { setVisible(false); } }); // connect(mOutput.data(), &KScreen::Output::isEnabledChanged, // this, [=]() { // mEnabled->setChecked(mOutput->isEnabled()); // }); connect(mOutput.data(), &KScreen::Output::rotationChanged, this, [=]() { const int index = mRotation->findData(mOutput->rotation()); mRotation->setCurrentIndex(index); }); connect(mOutput.data(), &KScreen::Output::scaleChanged, this, [=]() { const int index = mScale->findData(mOutput->scale()); mScale->setCurrentIndex(index); }); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); QVBoxLayout *vbox = new QVBoxLayout(this); vbox->setContentsMargins(0,0,0,0); //注释显示器上方标签 // mTitle = new QLabel(this); // mTitle->setAlignment(Qt::AlignHCenter); // vbox->addWidget(mTitle); // setTitle(Utils::outputName(mOutput)); //QFormLayout *formLayout = new QFormLayout(); // mEnabled = new QCheckBox(i18n("已启用"), this); // //mEnabled->setVisible(false); // mEnabled->setChecked(mOutput->isEnabled()); // qDebug()<<"是否开启---->mEnable"<mEnable"<setEnabled(checked); // qDebug() << "上层勾选---->"<name() << mOutput->isEnabled(); // Q_EMIT changed(); // }); // formLayout->addRow(i18n("显示:"), mEnabled); // mMonitor = new QComboBox(this); // formLayout->addRow(i18n("主显示器"),mMonitor); QFont ft; ft.setPointSize(14); //分辨率下拉框 mResolution = new ResolutionSlider(mOutput, this); mResolution->setFont(ft); mResolution->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); mResolution->setMinimumSize(402,30); mResolution->setMaximumSize(16777215,30); QLabel *resLabel = new QLabel(this); resLabel->setText(tr("resolution")); resLabel->setFont(ft); resLabel->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); resLabel->setMinimumSize(118,30); resLabel->setMaximumSize(118,30); QHBoxLayout *resLayout = new QHBoxLayout(); //resLayout->setContentsMargins(0,5,0,5); resLayout->addWidget(resLabel); resLayout->addWidget(mResolution); // resLayout->addStretch(); QWidget *resWidget = new QWidget(this); resWidget->setLayout(resLayout); resWidget->setStyleSheet("background-color:#F4F4F4;border-radius:6px"); // mResolution->setStyleSheet("background-color:#F8F9F9"); resWidget->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); resWidget->setMinimumSize(552,50); resWidget->setMaximumSize(960,50); vbox->addWidget(resWidget); connect(mResolution, &ResolutionSlider::resolutionChanged, this, &OutputConfig::slotResolutionChanged); //方向下拉框 mRotation = new QComboBox(); mRotation->setFont(ft); mRotation->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); mRotation->setMinimumSize(402,30); mRotation->setMaximumSize(16777215,30); mRotation->setStyleSheet(qss); mRotation->setItemDelegate(itemDelege); QLabel *rotateLabel = new QLabel(); rotateLabel->setText(tr("orientation")); rotateLabel->setFont(ft); rotateLabel->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); rotateLabel->setMinimumSize(118,30); rotateLabel->setMaximumSize(118,30); QHBoxLayout *rotateLayout = new QHBoxLayout(); rotateLayout->addWidget(rotateLabel); rotateLayout->addWidget(mRotation); // rotateLayout->addStretch(); QWidget *rotateWidget = new QWidget(); rotateWidget->setLayout(rotateLayout); rotateWidget->setStyleSheet("background-color:#F4F4F4;border-radius:6px"); // mRotation->setStyleSheet("background-color:#F8F9F9"); rotateWidget->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); rotateWidget->setMinimumSize(550,50); rotateWidget->setMaximumSize(960,50); mRotation->addItem( tr("arrow-up"), KScreen::Output::None); mRotation->addItem( tr("90° arrow-right"), KScreen::Output::Right); mRotation->addItem( tr("arrow-down"), KScreen::Output::Inverted); mRotation->addItem(tr("90° arrow-left"), KScreen::Output::Left); connect(mRotation, static_cast(&QComboBox::activated), this, &OutputConfig::slotRotationChanged); mRotation->setCurrentIndex(mRotation->findData(mOutput->rotation())); //formLayout->addRow(rotateLabel, mRotation); vbox->addWidget(rotateWidget); //缩放暂时用不到 // if (!mShowScaleOption) { // mScale = new QComboBox(this); // mScale->addItem(i18nc("Scale multiplier, show everything at 1 times normal scale", "1x"), 1); // mScale->addItem(i18nc("Scale multiplier, show everything at 2 times normal scale", "2x"), 2); // connect(mScale, static_cast(&QComboBox::activated), // this, &OutputConfig::slotScaleChanged); // mScale->setCurrentIndex(mScale->findData(mOutput->scale())); // formLayout->addRow(i18n("缩放:"), mScale); // formLayout->addItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); // } //刷新率下拉框 mRefreshRate = new QComboBox(); mRefreshRate->setFont(ft); // mRefreshRate->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); mRefreshRate->setMinimumSize(402,30); mRefreshRate->setMaximumSize(16777215,30); mRefreshRate->setStyleSheet(qss); mRefreshRate->setItemDelegate(itemDelege); mRefreshRate->setMaxVisibleItems(5); QLabel *freshLabel = new QLabel(); freshLabel->setText(tr("refresh rate")); freshLabel->setFont(ft); freshLabel->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); freshLabel->setMinimumSize(118,30); freshLabel->setMaximumSize(118,30); QHBoxLayout *freshLayout = new QHBoxLayout(); freshLayout->addWidget(freshLabel); freshLayout->addWidget(mRefreshRate); // freshLayout->addStretch(); QWidget *freshWidget = new QWidget(this); freshWidget->setLayout(freshLayout); freshWidget->setStyleSheet("background-color:#F4F4F4;border-radius:6px"); freshWidget->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); freshWidget->setMinimumSize(550,50); freshWidget->setMaximumSize(960,50); mRefreshRate->addItem(tr("auto"), -1); vbox->addWidget(freshWidget); slotResolutionChanged(mResolution->currentResolution()); connect(mRefreshRate, static_cast(&QComboBox::activated), this, &OutputConfig::slotRefreshRateChanged); scaleCombox = new QComboBox(); // mRefreshRate->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); scaleCombox->setMinimumSize(402,30); scaleCombox->setMaximumSize(16777215,30); scaleCombox->setStyleSheet(qss); scaleCombox->setItemDelegate(itemDelege); scaleCombox->setMaxVisibleItems(5); scaleCombox->addItem(tr("100%")); int maxReslu = mResolution->getMaxResolution().width(); if (maxReslu >= 2000 && maxReslu <= 3800) { scaleCombox->addItem(tr("200%")); } else if (maxReslu >= 3800 || maxReslu >= 4000) { scaleCombox->addItem(tr("200%")); scaleCombox->addItem(tr("300%")); } QLabel *scaleLabel = new QLabel(); scaleLabel->setText(tr("screen zoom")); scaleLabel->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); scaleLabel->setMinimumSize(118,30); scaleLabel->setMaximumSize(118,30); QHBoxLayout *scaleLayout = new QHBoxLayout(); scaleLayout->addWidget(scaleLabel); scaleLayout->addWidget(scaleCombox); // freshLayout->addStretch(); QWidget *scaleWidget = new QWidget(this); scaleWidget->setLayout(scaleLayout); scaleWidget->setStyleSheet("background-color:#F4F4F4;border-radius:6px"); scaleWidget->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); scaleWidget->setMinimumSize(550,50); scaleWidget->setMaximumSize(960,50); vbox->addWidget(scaleWidget); connect(scaleCombox, static_cast(&QComboBox::activated), this, &OutputConfig::slotScaleChanged); int scale = this->scaleRet(); scaleCombox->setCurrentIndex(0); if (scale <= scaleCombox->count() && scale > 0) { scaleCombox->setCurrentIndex(scale - 1); } slotScaleChanged(scale - 1); // int gScale = getScreenScale(); // if (gScale <= scaleCombox->count() && gScale > 0) { // scaleCombox->setCurrentIndex(gScale - 1); // } } int OutputConfig::getMaxReslotion() { } int OutputConfig::getScreenScale() { if (!m_gsettings) { return 1; } const QStringList list = m_gsettings->keys(); if (!list.contains("gdkScale")) { return 1; } int scale = m_gsettings->get(GDK_SCALE_KEY).toBool(); return scale; } void OutputConfig::setOutput(const KScreen::OutputPtr &output) { mOutput = output; initUi(); } KScreen::OutputPtr OutputConfig::output() const { return mOutput; } void OutputConfig::slotResolutionChanged(const QSize &size) { // Ignore disconnected outputs if (!size.isValid()) { return; } KScreen::ModePtr selectedMode; QList modes; Q_FOREACH (const KScreen::ModePtr &mode, mOutput->modes()) { if (mode->size() == size) { modes << mode; if (!selectedMode || selectedMode->refreshRate() < mode->refreshRate()) { selectedMode = mode; } } } Q_ASSERT(selectedMode); mOutput->setCurrentModeId(selectedMode->id()); // Don't remove the first "Auto" item - prevents ugly flicker of the combobox // when changing resolution for (int i = 1; i < mRefreshRate->count(); ++i) { mRefreshRate->removeItem(i); } for (int i = 0, total = modes.count(); i < total; ++i) { const KScreen::ModePtr mode = modes.at(i); mRefreshRate->addItem(tr("%1 Hz").arg(QLocale().toString(mode->refreshRate())), mode->id()); // If selected refresh rate is other then what we consider the "Auto" value // - that is it's not the highest resolution - then select it, otherwise // we stick with "Auto" if (mode == selectedMode && i > 1) { // i + 1 since 0 is auto mRefreshRate->setCurrentIndex(i + 1); } } Q_EMIT changed(); } void OutputConfig::slotRotationChanged(int index) { KScreen::Output::Rotation rotation = static_cast(mRotation->itemData(index).toInt()); mOutput->setRotation(rotation); Q_EMIT changed(); } void OutputConfig::slotRefreshRateChanged(int index) { QString modeId; if (index == 0) { // Item 0 is "Auto" - "Auto" is equal to highest refresh rate (at least // that's how I understand it, and since the combobox is sorted in descending // order, we just pick the second item from top modeId = mRefreshRate->itemData(1).toString(); } else { modeId = mRefreshRate->itemData(index).toString(); } mOutput->setCurrentModeId(modeId); Q_EMIT changed(); } void OutputConfig::slotScaleChanged(int index) { // auto scale = mScale->itemData(index).toInt(); // mOutput->setScale(scale); Q_EMIT scaleChanged(index); } void OutputConfig::setShowScaleOption(bool showScaleOption) { mShowScaleOption = showScaleOption; if (mOutput) { initUi(); } } bool OutputConfig::showScaleOption() const { return mShowScaleOption; } //拿取配置 void OutputConfig::initConfig(const KScreen::ConfigPtr &config){ qDebug()<<"initCofnig--->"<proRes<proRes; } else { qWarning() << filepath << " not found"<readFile(filepath); QRegExp re("export( GDK_SCALE)?=(.*)$"); for(int i = 0; i < res.length(); i++) { int pos = 0; // qDebug()<"< #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #define QML_PATH "kcm_kscreen/qml/" #define UKUI_CONTORLCENTER_PANEL_SCHEMAS "org.ukui.control-center.panel.plugins" #define NIGHT_MODE_KEY "nightmode" #define SCRENN_SCALE_SCHMES "org.ukui.session" #define GDK_SCALE_KEY "gdk-scale" #define QT_SCALE_KEY "qt-scale-factor" #define USER_SACLE_KEY "hidpi" #define POWER_SCHMES "org.ukui.power-manager" #define POWER_KEY "brightness-ac" Q_DECLARE_METATYPE(KScreen::OutputPtr) Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::DisplayWindow()), slider(new Slider()) { qRegisterMetaType(); itemDelege= new QStyledItemDelegate(this); ui->setupUi(this); ui->quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); ui->quickWidget->setContentsMargins(0,0,0,9); ui->mainwidget->setStyleSheet("background-color:#F4F4F4;border-radius:6px"); ui->screenwidget->setStyleSheet("background-color:#F4F4F4;border-radius:6px"); ui->nightwidget->setStyleSheet("background-color:#F4F4F4;border-radius:6px"); ui->unionwidget->setStyleSheet("background-color:#F4F4F4;border-radius:6px"); ui->mainScreenButton->setStyleSheet("QPushButton{background-color:#F8F9F9;border-radius:6px;font-size:14px;}" "QPushButton:hover{background-color: #3D6BE5;};border-radius:6px"); // ui->primaryCombo->setStyleSheet("background-color:#F8F9F9"); // ui->primaryCombo->setMaxVisibleItems(1); ui->showMonitorwidget->setStyleSheet("background-color:#F4F4F4;border-radius:6px"); ui->applyButton->setStyleSheet("QPushButton{background-color:#F4F4F4;border-radius:6px}" "QPushButton:hover{background-color: #3D6BE5;color:white};border-radius:6px"); ui->primaryCombo->setContentsMargins(8,0,0,0); ui->primaryCombo->setItemDelegate(new QStyledItemDelegate()); closeScreenButton = new SwitchButton; ui->showScreenLayout->addWidget(closeScreenButton); m_unifybutton = new SwitchButton; // m_unifybutton->setEnabled(false); ui->unionLayout->addWidget(m_unifybutton); QHBoxLayout *nightLayout = new QHBoxLayout(ui->nightwidget); nightLabel = new QLabel(tr("night mode")); nightButton = new SwitchButton; nightLayout->addWidget(nightLabel); nightLayout->addStretch(); nightLayout->addWidget(nightButton); initNightStatus(); // nightButton->setVisible(this->m_redshiftIsValid); ui->nightwidget->setVisible(this->m_redshiftIsValid); // qDebug()<<"set night mode here ---->"<m_isNightMode<setChecked(this->m_isNightMode); connect(this,&Widget::nightModeChanged,nightButton,&SwitchButton::setChecked); // connect(this,&Widget::redShiftValidChanged,nightButton,&SwitchButton::setVisible); connect(nightButton,&SwitchButton::checkedChanged,this,&Widget::setNightMode); //这里是设置主显示器(已经废弃重写了) // connect(ui->primaryCombo, QOverload::of(&QComboBox::currentIndexChanged), // this, &Widget::primaryOutputSelected); //是否禁用主显示器确认按钮 connect(ui->primaryCombo, static_cast(&QComboBox::currentIndexChanged), this, &Widget::mainScreenButtonSelect); //主屏确认按钮 connect(ui->mainScreenButton, SIGNAL(clicked()), this, SLOT(primaryButtonEnable())); mControlPanel = new ControlPanel(this); connect(mControlPanel, &ControlPanel::changed, this, &Widget::changed); connect(mControlPanel, &ControlPanel::scaleChanged, this, &Widget::scaleChangedSlot); //ui->formLayout_2->addWidget(mControlPanel); ui->controlPanelLayout->addWidget(mControlPanel); //ui->controlPanelLayout->setContentsMargins(0,0,60,10); connect(ui->applyButton,SIGNAL(clicked()),this,SLOT(save())); connect(ui->applyButton,SIGNAL(clicked()),this,SLOT(setPowerGSetttings())); // connect(ui->applyButton,SIGNAL(clicked()),this,SLOT(saveBrigthnessConfig())); //统一输出按钮 // connect(ui->unifyButton, &QPushButton::released, // [this]{ // slotUnifyOutputs(); // }); connect(m_unifybutton,&SwitchButton::checkedChanged, [this]{ // if(checked) slotUnifyOutputs(); }); // connect(ui->checkBox, &QCheckBox::clicked, // this, [=](bool checked) { // checkOutputScreen(checked); // }); //TODO----->bug // ui->showMonitorwidget->setVisible(false); connect(closeScreenButton,&SwitchButton::checkedChanged, this,[=](bool checked){ checkOutputScreen(checked); }); //缩放按钮注释 // connect(ui->scaleAllOutputsButton, &QPushButton::released, // [this] { // QPointer dialog = new ScalingConfig(mConfig->outputs(), this); // dialog->exec(); // delete dialog; // }); mOutputTimer = new QTimer(this); connect(mOutputTimer, &QTimer::timeout, this, &Widget::clearOutputIdentifiers); initGSettings(); loadQml(); setBrigthnessFile(); //亮度调节UI // initBrightnessUI(); QString filename = QDir::homePath() + "/.config/clone.ini"; m_qsettings = new QSettings(filename, QSettings::IniFormat); m_qsettings->beginGroup("Clone");; bool judge = m_qsettings->value("switch", judge).toBool(); m_unifybutton->setChecked(judge); m_qsettings->endGroup(); } Widget::~Widget() { clearOutputIdentifiers(); delete ui; } bool Widget::eventFilter(QObject* object, QEvent* event) { if (event->type() == QEvent::Resize) { if (mOutputIdentifiers.contains(qobject_cast(object))) { QResizeEvent *e = static_cast(event); const QRect screenSize = object->property("screenSize").toRect(); QRect geometry(QPoint(0, 0), e->size()); geometry.moveCenter(screenSize.center()); static_cast(object)->setGeometry(geometry); // Pass the event further } } return QObject::eventFilter(object, event); } void Widget::setConfig(const KScreen::ConfigPtr &config) { if (mConfig) { KScreen::ConfigMonitor::instance()->removeConfig(mConfig); for (const KScreen::OutputPtr &output : mConfig->outputs()) { output->disconnect(this); } mConfig->disconnect(this); } mConfig = config; KScreen::ConfigMonitor::instance()->addConfig(mConfig); resetPrimaryCombo(); connect(mConfig.data(), &KScreen::Config::outputAdded, this, &Widget::outputAdded); connect(mConfig.data(), &KScreen::Config::outputRemoved, this, &Widget::outputRemoved); connect(mConfig.data(), &KScreen::Config::primaryOutputChanged, this, &Widget::primaryOutputChanged); //上面屏幕拿取配置 mScreen->setConfig(mConfig); mControlPanel->setConfig(mConfig); // ui->unifyButton->setEnabled(mConfig->outputs().count() > 1); m_unifybutton->setEnabled(mConfig->outputs().count() > 1); //ui->scaleAllOutputsButton->setVisible(!mConfig->supportedFeatures().testFlag(KScreen::Config::Feature::PerOutputScaling)); for (const KScreen::OutputPtr &output : mConfig->outputs()) { outputAdded(output); } // 选择主屏幕输出 QMLOutput *qmlOutput = mScreen->primaryOutput(); if (qmlOutput) { mScreen->setActiveOutput(qmlOutput); } else { if (!mScreen->outputs().isEmpty()) { mScreen->setActiveOutput(mScreen->outputs().at(0)); //选择一个主屏幕,避免闪退现象 primaryButtonEnable(); } } slotOutputEnabledChanged(); } KScreen::ConfigPtr Widget::currentConfig() const { return mConfig; } void Widget::loadQml() { qmlRegisterType("org.kde.kscreen", 1, 0, "QMLOutput"); qmlRegisterType("org.kde.kscreen", 1, 0, "QMLScreen"); qmlRegisterType("org.kde.kscreen", 1, 0, "KScreenOutput"); qmlRegisterType("org.kde.kscreen", 1, 0, "KScreenEdid"); qmlRegisterType("org.kde.kscreen", 1, 0, "KScreenMode"); //这里的qml路径还需要更改 //auto tmpfile = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation); // QString tmpfile = QCoreApplication::applicationDirPath(); // qDebug()<<"路径----------------->"; const QString file = QStringLiteral(":/qml/main.qml"); ui->quickWidget->setSource(QUrl::fromLocalFile(file)); QQuickItem* rootObject = ui->quickWidget->rootObject(); mScreen = rootObject->findChild(QStringLiteral("outputView")); if (!mScreen) { return; } connect(mScreen, &QMLScreen::focusedOutputChanged, this, &Widget::slotFocusedOutputChanged); //识别按钮注释 // connect(rootObject->findChild(QStringLiteral("identifyButton")), SIGNAL(clicked()), // this, SLOT(slotIdentifyButtonClicked())); } void Widget::resetPrimaryCombo() { //qDebug()<<"resetPrimaryCombo----->"<supportedFeatures().testFlag(KScreen::Config::Feature::PrimaryDisplay); ui->primaryLabel->setVisible(isPrimaryDisplaySupported); ui->primaryCombo->setVisible(isPrimaryDisplaySupported); // Don't emit currentIndexChanged when resetting bool blocked = ui->primaryCombo->blockSignals(true); ui->primaryCombo->clear(); //ui->primaryCombo->addItem(i18n("无主显示输出")); ui->primaryCombo->blockSignals(blocked); if (!mConfig) { return; } for (auto &output: mConfig->outputs()) { addOutputToPrimaryCombo(output); } } void Widget::addOutputToPrimaryCombo(const KScreen::OutputPtr &output) { //注释后让他显示全部屏幕下拉框 if (!output->isConnected()) { return; } ui->primaryCombo->addItem(Utils::outputName(output), output->id()); if (output->isPrimary()) { Q_ASSERT(mConfig); int lastIndex = ui->primaryCombo->count() - 1; ui->primaryCombo->setCurrentIndex(lastIndex); } } //这里从屏幕点击来读取输出 void Widget::slotFocusedOutputChanged(QMLOutput *output) { mControlPanel->activateOutput(output->outputPtr()); //读取屏幕点击选择下拉框 Q_ASSERT(mConfig); int index = output->outputPtr().isNull() ? 0 : ui->primaryCombo->findData(output->outputPtr()->id()); if (index == -1 || index == ui->primaryCombo->currentIndex()) { return; } //qDebug()<<"下拉框id----->"<primaryCombo->setCurrentIndex(index); } void Widget::slotFocusedOutputChangedNoParam() { //qDebug()<<"slotFocusedOutputChangedNoParam-------->"<activateOutput(res); } void Widget::slotOutputEnabledChanged() { //这里为点击禁用屏幕输出后的改变 resetPrimaryCombo(); int enabledOutputsCount = 0; Q_FOREACH (const KScreen::OutputPtr &output, mConfig->outputs()) { if (output->isEnabled()) { ++enabledOutputsCount; } if (enabledOutputsCount > 1) { break; } } // ui->unifyButton->setEnabled(enabledOutputsCount > 1); m_unifybutton->setEnabled(enabledOutputsCount > 1); } void Widget::slotOutputConnectedChanged() { resetPrimaryCombo(); } void Widget::slotUnifyOutputs() { QMLOutput *base = mScreen->primaryOutput(); //qDebug()<<"primaryOutput---->"< clones; if (!base) { for (QMLOutput *output: mScreen->outputs()) { if (output->output()->isConnected() && output->output()->isEnabled()) { base = output; break; } } if (!base) { // WTF? return; } } if (base->isCloneMode() && !m_unifybutton->isChecked()) { qDebug()<<"取消clone------------>"<connectedOutputs(); QMap::iterator it = screens.begin(); while (it != screens.end()) { KScreen::OutputPtr screen= it.value(); // qDebug()<<"screens is-------->"<isPrimary()) { secPoint = QPoint(screen->size().width(),0); } it++; } QMap::iterator secIt = screens.begin(); while (secIt != screens.end()) { KScreen::OutputPtr screen= secIt.value(); qDebug()<<"screens is-------->"<isPrimary()) { screen->setPos(secPoint); } secIt++; } setConfig(mPrevConfig); mPrevConfig.clear(); ui->primaryCombo->setEnabled(true); //开启开关 // ui->checkBox->setEnabled(true); closeScreenButton->setEnabled(true); ui->primaryCombo->setEnabled(true); // ui->unifyButton->setText(tr("统一输出")); } else if (!base->isCloneMode() && m_unifybutton->isChecked()){ // Clone the current config, so that we can restore it in case user // breaks the cloning qDebug()<<"点击统一输出---->"<clone(); for (QMLOutput *output: mScreen->outputs()) { if (!output->output()->isConnected()) { continue; } if (!output->output()->isEnabled()) { output->setVisible(false); continue; } if (!base) { base = output; } output->setOutputX(0); output->setOutputY(0); output->output()->setPos(QPoint(0, 0)); output->output()->setClones(QList()); if (base != output) { clones << output->output()->id(); output->setCloneOf(base); output->setVisible(false); } } base->output()->setClones(clones); base->setIsCloneMode(true); mScreen->updateOutputsPlacement(); //关闭开关 // ui->checkBox->setEnabled(false); closeScreenButton->setEnabled(false); ui->primaryCombo->setEnabled(false); ui->mainScreenButton->setEnabled(false); //qDebug()<<"输出---->"<outputPtr()<setUnifiedOutput(base->outputPtr()); // ui->unifyButton->setText(tr("取消统一输出")); } Q_EMIT changed(); } // FIXME: Copy-pasted from KDED's Serializer::findOutput() KScreen::OutputPtr Widget::findOutput(const KScreen::ConfigPtr &config, const QVariantMap &info) { KScreen::OutputList outputs = config->outputs(); Q_FOREACH(const KScreen::OutputPtr &output, outputs) { if (!output->isConnected()) { continue; } const QString outputId = (output->edid() && output->edid()->isValid()) ? output->edid()->hash() : output->name(); if (outputId != info[QStringLiteral("id")].toString()) { continue; } QVariantMap posInfo = info[QStringLiteral("pos")].toMap(); QPoint point(posInfo[QStringLiteral("x")].toInt(), posInfo[QStringLiteral("y")].toInt()); output->setPos(point); output->setPrimary(info[QStringLiteral("primary")].toBool()); output->setEnabled(info[QStringLiteral("enabled")].toBool()); output->setRotation(static_cast(info[QStringLiteral("rotation")].toInt())); QVariantMap modeInfo = info[QStringLiteral("mode")].toMap(); QVariantMap modeSize = modeInfo[QStringLiteral("size")].toMap(); QSize size(modeSize[QStringLiteral("width")].toInt(), modeSize[QStringLiteral("height")].toInt()); const KScreen::ModeList modes = output->modes(); Q_FOREACH(const KScreen::ModePtr &mode, modes) { if (mode->size() != size) { continue; } if (QString::number(mode->refreshRate()) != modeInfo[QStringLiteral("refresh")].toString()) { continue; } output->setCurrentModeId(mode->id()); break; } return output; } return KScreen::OutputPtr(); } float Widget::scaleRet() { QString filepath = getenv("HOME"); QString scale; filepath += "/.profile"; QStringList res = this->readFile(filepath); QRegExp re("export( GDK_DPI_SCALE)?=(.*)$"); for(int i = 0; i < res.length(); i++) { int pos = 0; // qDebug()<proRes.append(strGDK + QString::number(scale)); this->proRes.append(strQT + QString::number(scale)); this->proRes.append(strAutoQT); } writeFile(filepath, this->proRes); setSessionScale(static_cast(scale)); } void Widget::initGSettings() { QByteArray id(UKUI_CONTORLCENTER_PANEL_SCHEMAS); if(QGSettings::isSchemaInstalled(id)) { // qDebug()<<"initGSettings-------------------->"<"<getNightModeGSetting(key); // setNightModebyPanel(value); // } // }); QByteArray scaleId(SCRENN_SCALE_SCHMES); if(QGSettings::isSchemaInstalled(scaleId)) { // qDebug()<<"initGSettings-------------------->"<keys(); if (!list.contains(key)) { return ""; } bool res = m_gsettings->get(key).toBool(); return res; } void Widget::setNightModebyPanel(bool judge) { // QProcess *process = new QProcess; // if(judge == true) { // process->startDetached("redshift -t 5700:3600 -g 0.8 -m randr -v"); // } else { // QProcess::execute("killall redshift"); // } } void Widget::setSessionScale(int scale) { if (!scaleGSettings) { return; } QStringList keys = scaleGSettings->keys(); if (keys.contains("hidpi")){ scaleGSettings->set(USER_SACLE_KEY, true); } if (keys.contains("gdkScale")){ scaleGSettings->set(GDK_SCALE_KEY, scale); } if (keys.contains("qtScaleFactor")) { scaleGSettings->set(QT_SCALE_KEY, scale); } } void Widget::clearOutputIdentifiers() { mOutputTimer->stop(); qDeleteAll(mOutputIdentifiers); mOutputIdentifiers.clear(); } void Widget::outputAdded(const KScreen::OutputPtr &output) { connect(output.data(), &KScreen::Output::isConnectedChanged, this, &Widget::slotOutputConnectedChanged); connect(output.data(), &KScreen::Output::isEnabledChanged, this, &Widget::slotOutputEnabledChanged); connect(output.data(), &KScreen::Output::posChanged, this, &Widget::changed); addOutputToPrimaryCombo(output); } void Widget::outputRemoved(int outputId) { KScreen::OutputPtr output = mConfig->output(outputId); if (!output.isNull()) { output->disconnect(this); } const int index = ui->primaryCombo->findData(outputId); if (index == -1) { return; } if (index == ui->primaryCombo->currentIndex()) { // We'll get the actual primary update signal eventually // Don't emit currentIndexChanged const bool blocked = ui->primaryCombo->blockSignals(true); ui->primaryCombo->setCurrentIndex(0); ui->primaryCombo->blockSignals(blocked); } ui->primaryCombo->removeItem(index); } void Widget::primaryOutputSelected(int index) { //qDebug()<<"选中主显示器--->"<output(ui->primaryCombo->itemData(index).toInt()); if (newPrimary == mConfig->primaryOutput()) { return; } mConfig->setPrimaryOutput(newPrimary); Q_EMIT changed(); } //主输出 void Widget::primaryOutputChanged(const KScreen::OutputPtr &output) { Q_ASSERT(mConfig); int index = output.isNull() ? 0 : ui->primaryCombo->findData(output->id()); if (index == -1 || index == ui->primaryCombo->currentIndex()) { return; } ui->primaryCombo->setCurrentIndex(index); } void Widget::slotIdentifyButtonClicked(bool checked) { Q_UNUSED(checked); connect(new KScreen::GetConfigOperation(), &KScreen::GetConfigOperation::finished, this, &Widget::slotIdentifyOutputs); } void Widget::slotIdentifyOutputs(KScreen::ConfigOperation *op) { if (op->hasError()) { return; } const KScreen::ConfigPtr config = qobject_cast(op)->config(); const QString qmlPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral(QML_PATH "OutputIdentifier.qml")); mOutputTimer->stop(); clearOutputIdentifiers(); /* Obtain the current active configuration from KScreen */ Q_FOREACH (const KScreen::OutputPtr &output, config->outputs()) { if (!output->isConnected() || !output->currentMode()) { continue; } const KScreen::ModePtr mode = output->currentMode(); QQuickView *view = new QQuickView(); view->setFlags(Qt::X11BypassWindowManagerHint | Qt::FramelessWindowHint); view->setResizeMode(QQuickView::SizeViewToRootObject); view->setSource(QUrl::fromLocalFile(qmlPath)); view->installEventFilter(this); QQuickItem *rootObj = view->rootObject(); if (!rootObj) { qWarning() << "Failed to obtain root item"; continue; } QSize deviceSize, logicalSize; if (output->isHorizontal()) { deviceSize = mode->size(); } else { deviceSize = QSize(mode->size().height(), mode->size().width()); } if (config->supportedFeatures() & KScreen::Config::Feature::PerOutputScaling) { // no scale adjustment needed on Wayland logicalSize = deviceSize; } else { logicalSize = deviceSize / devicePixelRatioF(); } rootObj->setProperty("outputName", Utils::outputName(output)); rootObj->setProperty("modeName", Utils::sizeToString(deviceSize)); view->setProperty("screenSize", QRect(output->pos(), logicalSize)); mOutputIdentifiers << view; } for (QQuickView *view: mOutputIdentifiers) { view->show(); } mOutputTimer->start(2500); } void Widget::save() { //readScreenXml(); //qDebug()<<"save------------>"<beginGroup("Clone"); m_qsettings->setValue("switch", m_unifybutton->isChecked()); m_qsettings->endGroup(); m_qsettings->sync(); const KScreen::ConfigPtr &config = this->currentConfig(); const int countOutput = config->connectedOutputs().count(); bool atLeastOneEnabledOutput = false; int i = 0; int connectedScreen = 0; Q_FOREACH(const KScreen::OutputPtr &output, config->outputs()) { KScreen::ModePtr mode = output->currentMode(); if (output->isEnabled()) { // qDebug()<<"atLeastOneEnabledOutput------------>"<isConnected()) continue; QMLOutput *base = mScreen->primaryOutput(); // qDebug()<<"primaryOutput---->"<outputs()) { if (output->output()->isConnected() && output->output()->isEnabled()) { base = output; break; } } if (!base) { // WTF? return; } } // qDebug()<<" clone mode--------->"<isCloneMode() == true?"true":"false"; inputXml[i].outputName = output->name(); inputXml[i].widthValue = QString::number(mode->size().width()); inputXml[i].heightValue = QString::number(mode->size().height()); inputXml[i].rateValue = QString::number(mode->refreshRate()); inputXml[i].posxValue = QString::number(output->pos().x()); inputXml[i].posyValue = QString::number(output->pos().y()); inputXml[i].vendorName = output->edid()->pnpId(); auto rotation = [&] ()->QString { if(1 == output->rotation()) return "normal"; else if(2 == output->rotation()) return "left"; else if(4 == output->rotation()) return "upside_down"; else if(8 == output->rotation()) return "right"; }; inputXml[i].rotationValue = rotation(); inputXml[i].isPrimary = (output->isPrimary() == true?"yes":"no"); inputXml[i].isEnable = output->isEnabled(); getEdidInfo(output->name(),&inputXml[i]); i++; } if (!atLeastOneEnabledOutput) { KMessageBox::error(this,tr("please insure at least one output!"), tr("Warning"),KMessageBox::Notify); closeScreenButton->setChecked(true); return ; } initScreenXml(countOutput); writeScreenXml(countOutput); writeScale(static_cast(this->screenScale)); if (!KScreen::Config::canBeApplied(config)) { KMessageBox::information(this, tr("Sorry, your configuration could not be applied.\nCommon reasons are that the overall screen size is too big, or you enabled more displays than supported by your GPU."), tr("@title:window", "Unsupported Configuration")); return; } m_blockChanges = true; /* Store the current config, apply settings */ auto *op = new KScreen::SetConfigOperation(config); /* Block until the operation is completed, otherwise KCMShell will terminate * before we get to execute the Operation */ op->exec(); // The 1000ms is a bit "random" here, it's what works on the systems I've tested, but ultimately, this is a hack // due to the fact that we just can't be sure when xrandr is done changing things, 1000 doesn't seem to get in the way QTimer::singleShot(1000, this, [this] () { m_blockChanges = false; } ); } void Widget::scaleChangedSlot(int index) { qDebug()<<"scale changed----------->"<screenScale = 1; break; case 1: this->screenScale = 2; break; case 2: this->screenScale = 3; break; default: this->screenScale = 1; break; } } //是否禁用主屏按钮 void Widget::mainScreenButtonSelect(int index){ //qDebug()<<"index is----->"<primaryOutput()<output(ui->primaryCombo->itemData(index).toInt()); //qDebug()<<"newPrimary----->"<primaryOutput()) { ui->mainScreenButton->setEnabled(false); }else{ ui->mainScreenButton->setEnabled(true); } // if(index == 0){ // ui->mainScreenButton->setEnabled(false); // ui->checkBox->setEnabled(false); // return ; // } //设置是否勾选 // ui->checkBox->setEnabled(true); closeScreenButton->setEnabled(true); // ui->checkBox->setChecked(newPrimary->isEnabled()); closeScreenButton->setChecked(newPrimary->isEnabled()); mControlPanel->activateOutput(newPrimary); } //设置主屏按钮 void Widget::primaryButtonEnable(){ if (!mConfig) { return; } int index = ui->primaryCombo->currentIndex(); ; ui->mainScreenButton->setEnabled(false); const KScreen::OutputPtr newPrimary = mConfig->output(ui->primaryCombo->itemData(index).toInt()); // qDebug()<<"按下主屏按钮---->"<setPrimaryOutput(newPrimary); Q_EMIT changed(); } void Widget::checkOutputScreen(bool judge){ // qDebug()<<"is enable screen---->"<primaryCombo->currentIndex(); const KScreen::OutputPtr newPrimary = mConfig->output(ui->primaryCombo->itemData(index).toInt()); // if(ui->primaryCombo->count()<=1&&judge ==false) // return ; // qDebug()<<"newPrimary---------->"<primaryOutput(); // qDebug()<<"mainScreen is------------>"<setPrimaryOutput(newPrimary); } newPrimary->setEnabled(judge); ui->primaryCombo->setCurrentIndex(index); Q_EMIT changed(); } //亮度调节UI void Widget::initBrightnessUI(){ //亮度调节 ui->brightnesswidget->setStyleSheet("background-color:#F4F4F4;border-radius:6px"); // ui->brightnessSlider->setRange(0.2*100,100); ui->brightnessSlider->setTracking(true); QString screenName = getScreenName(); setBrightnesSldierValue(screenName); connect(ui->brightnessSlider,&QSlider::valueChanged, this,&Widget::setBrightnessScreen); connect(ui->primaryCombo, &QComboBox::currentTextChanged, this, &Widget::setBrightnesSldierValue); } QString Widget::getScreenName(QString screenname){ if("" == screenname ) screenname = ui->primaryCombo->currentText(); int startPos = screenname.indexOf('('); int endPos = screenname.indexOf(')'); return screenname.mid(startPos+1,endPos-startPos-1); } QStringList Widget::getscreenBrightnesName(){ QByteArray ba; FILE * fp = NULL; char cmd[1024]; char buf[1024]; sprintf(cmd, "xrandr | grep \" connected\" | awk '{ print$1 }'"); if ((fp = popen(cmd, "r")) != NULL){ rewind(fp); while(!feof(fp)){ fgets(buf, sizeof (buf), fp); ba.append(buf); } pclose(fp); fp = NULL; }else{ qDebug()<<"popen文件打开失败"<"<"<keys(); if (keys.contains("brightnessAc")) { powerSettings->set(POWER_KEY, index); } } if (!powerSettings) { delete powerSettings; } /* QStringList nameList = getscreenBrightnesName(); QString sliderValue = QString::number(ui->brightnessSlider->value()/100.0); QString screenName = getScreenName(); float value = index/100.0 >0.2?index/100.0:0.2; QString brightnessValue = QString::number(value); QProcess *process = new QProcess; QMLOutput *base = mScreen->primaryOutput(); //qDebug()<<"primaryOutput---->"<outputs()) { if (output->output()->isConnected() && output->output()->isEnabled()) { base = output; break; } } if (!base) { // WTF? return; } } if(base->isCloneMode() == false) { process->start("xrandr",QStringList()<<"--output"<waitForFinished(); const QString &cmd = "xrandr --output "+ screenName+" --brightness "+ brightnessValue; } else { for(int i = 0; i < nameList.length(); i++ ){ if(nameList.at(i) != ""){ process->start("xrandr",QStringList()<<"--output"<waitForFinished(); } } } */ } //保存屏幕亮度配置 void Widget::saveBrigthnessConfig(){ QStringList cmdList; QStringList nameList = getscreenBrightnesName(); QStringList valueList = getscreenBrightnesValue(); QString sliderValue = QString::number(ui->brightnessSlider->value()/100.0); int len = std::min(nameList.length(),valueList.length()); // qDebug()<<"QStringList------------------>"<isClone == "false"){ tmpcmd = "xrandr --output "+ nameList.at(i)+" --brightness "+ valueList.at(i); } else { tmpcmd = "xrandr --output "+ nameList.at(i)+" --brightness "+ sliderValue; } cmdList.append(tmpcmd); } QFile fp(brightnessFile); if(!fp.open(QIODevice::WriteOnly | QIODevice::Append)){ qDebug()<<"写入文件失败"<brightnessSlider->value(); if (QGSettings::isSchemaInstalled(POWER_SCHMES)) { QByteArray id(POWER_SCHMES); powerSettings = new QGSettings(id); QStringList keys = powerSettings->keys(); if (keys.contains("brightnessAc")) { powerSettings->set(POWER_KEY,QString::number(sliderValue)); } } if (!powerSettings) { delete powerSettings; } } //滑块改变 void Widget::setBrightnesSldierValue(QString name){ // // qDebug()<<"setBrightnesSldierValue---->"<"< brightnessMap; // for(int i = 0;i < len;i++){ // brightnessMap.insert(nameList.at(i).trimmed(),valueList.at(i).toFloat()); // } // ui->brightnessSlider->setValue(brightnessMap[screename]*100); QGSettings *powerSettings; int value = 99; if (QGSettings::isSchemaInstalled(POWER_SCHMES)) { QByteArray id(POWER_SCHMES); powerSettings = new QGSettings(id); QStringList keys = powerSettings->keys(); if (keys.contains("brightnessAc")) { value = powerSettings->get(POWER_KEY).toInt(); } } if (!powerSettings) { delete powerSettings; } ui->brightnessSlider->setValue(value); } //亮度配置文件位置 void Widget::setBrigthnessFile(){ brightnessFile = getenv("HOME"); brightnessFile += "/.xinputrc"; } void Widget::writeScreenXml(int count){ Q_UNUSED(count) QString homePath = getenv("HOME"); QString monitorFile = homePath+"/.config/monitors.xml"; //qDebug()<"<"< 3){ // qDebug()<<"e2 count is---->"< 3) { for(; e2.count()>3;){ QDomNode node2 = e2.at(2); qDebug() << " "<< node2.toElement().tagName() <"<"<productName = "0x"+QString("%1").arg(modelDec,4,16,QLatin1Char('0')); QString serialStr = res.mid(serialIndex+14,res.length()-serialIndex-14); int serialDec = serialStr.toInt(); xml->serialNum = "0x"+QString("%1").arg(serialDec,4,16,QLatin1Char('0')); } void Widget::setNightMode(const bool nightMode){ QProcess process; QString cmd; QString serverCmd; if(nightMode) { cmd = "start"; serverCmd = "enable"; } else { cmd = "stop"; serverCmd = "disable"; } process.startDetached("systemctl", QStringList() << "--user" << serverCmd << "redshift.service"); process.startDetached("systemctl", QStringList() << "--user" << cmd << "redshift.service"); updateNightStatus(); } void Widget::updateNightStatus(){ QProcess *process = new QProcess; connect(process, &QProcess::readyRead, this, [=] { setIsNightMode(process->readAll().replace("\n","") == "active"); process->deleteLater(); }); process->start("systemctl", QStringList() << "--user" << "is-active" << "redshift.service"); process->close(); } void Widget::setIsNightMode(bool isNightMode) { if(m_isNightMode == isNightMode){ return ; } qDebug()<<"isNightMode----->"<proRes<proRes; } else { qWarning() << filepath << " not found"<"<execute("which",QStringList() << "redshift")); // qDebug()<<"isRedshitValid-------------->"<start("systemctl", QStringList() << "--user" << "is-active" << "redshift.service"); process_2->waitForFinished(); QByteArray qbaOutput = process_2->readAllStandardOutput(); QString tmpNight = qbaOutput; m_isNightMode = (tmpNight=="active\n" ? true : false); if (isRedShiftValid){ updateNightStatus(); } setRedShiftIsValid(isRedShiftValid); } ukui-control-center/plugins/system/display/slider.h0000644000175000017500000000041713635333016021521 0ustar fengfeng#ifndef SLIDER_H #define SLIDER_H #include #include #include #include class Slider : public QSlider { public: Slider(); void paintEvent(QPaintEvent *ev); private: QStringList scaleList; }; #endif // SLIDER_H ukui-control-center/plugins/system/display/declarative/0000755000175000017500000000000013630066010022337 5ustar fengfengukui-control-center/plugins/system/display/declarative/qmlscreen.cpp0000644000175000017500000002755213630066010025047 0ustar fengfeng/* Copyright (C) 2012 Dan Vratil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "qmlscreen.h" #include "qmloutputcomponent.h" #include "qmloutput.h" #include #include #include #include Q_DECLARE_METATYPE(KScreen::OutputPtr) QMLScreen::QMLScreen(QQuickItem *parent) : QQuickItem(parent) { connect(this, &QMLScreen::widthChanged, this, &QMLScreen::viewSizeChanged); connect(this, &QMLScreen::heightChanged, this, &QMLScreen::viewSizeChanged); } QMLScreen::~QMLScreen() { qDeleteAll(m_outputMap); m_outputMap.clear(); } KScreen::ConfigPtr QMLScreen::config() const { return m_config; } void QMLScreen::setConfig(const KScreen::ConfigPtr &config) { qDeleteAll(m_outputMap); m_outputMap.clear(); m_manuallyMovedOutputs.clear(); m_bottommost = m_leftmost = m_rightmost = m_topmost = nullptr; m_connectedOutputsCount = 0; m_enabledOutputsCount = 0; if (m_config) { m_config->disconnect(this); } m_config = config; connect(m_config.data(), &KScreen::Config::outputAdded, this, [this](const KScreen::OutputPtr &output) { addOutput(output); updateOutputsPlacement(); }); connect(m_config.data(), &KScreen::Config::outputRemoved, this, &QMLScreen::removeOutput); //qDebug()<<"所要拿取的配置为------>"<outputs()) { // qDebug()<<"\noutput类型----debug------>"<"<(output))<<" "<output()->isConnected() && qmlOutput->output()->isEnabled()) { //qDebug()<<"qmlOutput---->"<dockToNeighbours(); } } } void QMLScreen::addOutput(const KScreen::OutputPtr &output) { //qDebug()<<"qmlscreen.cpp-------> output类型------->"<setParentItem(this); qmloutput->setZ(m_outputMap.count()); connect(output.data(), &KScreen::Output::isConnectedChanged, this, &QMLScreen::outputConnectedChanged); connect(output.data(), &KScreen::Output::isEnabledChanged, this, &QMLScreen::outputEnabledChanged); connect(output.data(), &KScreen::Output::posChanged, this, &QMLScreen::outputPositionChanged); connect(qmloutput, &QMLOutput::yChanged, [this, qmloutput]() { qmlOutputMoved(qmloutput); }); connect(qmloutput, &QMLOutput::xChanged, [this, qmloutput]() { qmlOutputMoved(qmloutput); }); //在这里点击上面小屏幕 connect(qmloutput, SIGNAL(clicked()), this, SLOT(setActiveOutput())); qmloutput->updateRootProperties(); } void QMLScreen::removeOutput(int outputId) { for (const KScreen::OutputPtr &output : m_outputMap.keys()) { if (output->id() == outputId) { QMLOutput *qmlOutput = m_outputMap.take(output); qmlOutput->setParentItem(nullptr); qmlOutput->setParent(nullptr); qmlOutput->deleteLater(); return; } } } int QMLScreen::connectedOutputsCount() const { return m_connectedOutputsCount; } int QMLScreen::enabledOutputsCount() const { return m_enabledOutputsCount; } QMLOutput *QMLScreen::primaryOutput() const { Q_FOREACH (QMLOutput *qmlOutput, m_outputMap) { if (qmlOutput->output()->isPrimary()) { return qmlOutput; } } return nullptr; } QList QMLScreen::outputs() const { return m_outputMap.values(); } void QMLScreen::setActiveOutput(QMLOutput *output) { Q_FOREACH (QMLOutput *qmlOutput, m_outputMap) { if (qmlOutput->z() > output->z()) { qmlOutput->setZ(qmlOutput->z() - 1); } } output->setZ(m_outputMap.count()); //选中屏幕 output->setFocus(true); Q_EMIT focusedOutputChanged(output); } QSize QMLScreen::maxScreenSize() const { //qDebug()<<"m_config->screen()->maxSize()--->"<screen()->maxSize()<screen()->maxSize(); } float QMLScreen::outputScale() const { return m_outputScale; } void QMLScreen::outputConnectedChanged() { int connectedCount = 0; Q_FOREACH (const KScreen::OutputPtr &output, m_outputMap.keys()) { if (output->isConnected()) { ++connectedCount; } } if (connectedCount != m_connectedOutputsCount) { m_connectedOutputsCount = connectedCount; Q_EMIT connectedOutputsCountChanged(); updateOutputsPlacement(); } } void QMLScreen::outputEnabledChanged() { const KScreen::OutputPtr output(qobject_cast(sender()), [](void *){}); if (output->isEnabled()) { updateOutputsPlacement(); } int enabledCount = 0; Q_FOREACH (const KScreen::OutputPtr &output, m_outputMap.keys()) { if (output->isEnabled()) { ++enabledCount; } } if (enabledCount == m_enabledOutputsCount) { m_enabledOutputsCount = enabledCount; Q_EMIT enabledOutputsCountChanged(); } } void QMLScreen::outputPositionChanged() { /* TODO: Reposition the QMLOutputs */ } void QMLScreen::qmlOutputMoved(QMLOutput *qmlOutput) { //qDebug()<<"qmlOutputMoved------>"<isCloneMode()) { return; } if (!m_manuallyMovedOutputs.contains(qmlOutput)) m_manuallyMovedOutputs.append(qmlOutput); updateCornerOutputs(); if (m_leftmost) { m_leftmost->setOutputX(0); } if (m_topmost) { m_topmost->setOutputY(0); } if (qmlOutput == m_leftmost) { Q_FOREACH (QMLOutput *other, m_outputMap) { if (other == m_leftmost) { continue; } if (!other->output()->isConnected() || !other->output()->isEnabled()) { continue; } other->setOutputX(float(other->x() - m_leftmost->x()) / outputScale()); } } else if (m_leftmost) { qmlOutput->setOutputX(float(qmlOutput->x() - m_leftmost->x()) / outputScale()); } if (qmlOutput == m_topmost) { Q_FOREACH (QMLOutput *other, m_outputMap) { if (other == m_topmost) { continue; } if (!other->output()->isConnected() || !other->output()->isEnabled()) { continue; } other->setOutputY(float(other->y() - m_topmost->y()) / outputScale()); } } else if (m_topmost) { qmlOutput->setOutputY(float(qmlOutput->y() - m_topmost->y()) / outputScale()); } } void QMLScreen::viewSizeChanged() { updateOutputsPlacement(); } void QMLScreen::updateCornerOutputs() { m_leftmost = nullptr; m_topmost = nullptr; m_rightmost = nullptr; m_bottommost = nullptr; Q_FOREACH (QMLOutput *output, m_outputMap) { if (!output->output()->isConnected() || !output->output()->isEnabled()) { continue; } QMLOutput *other = m_leftmost; if (!other || output->x() < other->x()) { m_leftmost = output; } if (!other || output->y() < other->y()) { m_topmost = output; } if (!other || output->x() + output->width() > other->x() + other->width()) { m_rightmost = output; } if (!other || output->y() + output->height() > other->y() + other->height()) { m_bottommost = output; } } } void QMLScreen::setOutputScale(float scale) { if (qFuzzyCompare(scale, m_outputScale)) return; m_outputScale = scale; emit outputScaleChanged(); } //应该是画坐标的地方? void QMLScreen::updateOutputsPlacement() { //qDebug()<<"updateOutputsPlacement---->"<(item); if (!qmlOutput->output()->isConnected() || !qmlOutput->output()->isEnabled()) { continue; } if (qmlOutput->outputX() + qmlOutput->currentOutputWidth() > initialActiveScreenSize.width()) { // qDebug()<outputX()<currentOutputWidth()<outputX() + qmlOutput->currentOutputWidth()); } if (qmlOutput->outputY() + qmlOutput->currentOutputHeight() > initialActiveScreenSize.height()) { initialActiveScreenSize.setHeight(qmlOutput->outputY() + qmlOutput->currentOutputHeight()); } } auto initialScale = outputScale(); //qDebug() << " -----debug0--->outputScale" << initialScale; auto scale = initialScale; qreal lastX = -1.0; do { auto activeScreenSize = initialActiveScreenSize * scale; const QPointF offset((width() - activeScreenSize.width()) / 2.0, (height() - activeScreenSize.height()) / 2.0); // qDebug() << " ----------debug1--->offset-->" << offset; lastX = -1.0; qreal lastY = -1.0; Q_FOREACH (QQuickItem *item, childItems()) { QMLOutput *qmlOutput = qobject_cast(item); if (!qmlOutput->output()->isConnected() || !qmlOutput->output()->isEnabled() || m_manuallyMovedOutputs.contains(qmlOutput)) { continue; } qmlOutput->blockSignals(true); qmlOutput->setPosition(QPointF(offset.x() + (qmlOutput->outputX() * scale), offset.y() + (qmlOutput->outputY() * scale))); lastX = qMax(lastX, qmlOutput->position().x() + qmlOutput->width() / initialScale * scale); lastY = qMax(lastY, qmlOutput->position().y()); // qDebug()<<"坐标---->"<blockSignals(false); } Q_FOREACH (QQuickItem *item, childItems()) { QMLOutput *qmlOutput = qobject_cast(item); if (qmlOutput->output()->isConnected() && !qmlOutput->output()->isEnabled() && !m_manuallyMovedOutputs.contains(qmlOutput)) { qmlOutput->blockSignals(true); qmlOutput->setPosition(QPointF(lastX, lastY)); lastX += qmlOutput->width() / initialScale * scale; qmlOutput->blockSignals(false); } } // calculate the scale dynamically, so all screens fit to the dialog if (lastX > width()) { scale *= 0.8; } } while (lastX > width()); // Use a timer to avoid binding loop on width() QTimer::singleShot(0, this, [scale, this] { setOutputScale(scale); }); } ukui-control-center/plugins/system/display/declarative/qmlscreen.h0000644000175000017500000000606313630066010024506 0ustar fengfeng/* Copyright (C) 2012 Dan Vratil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef QMLSCREEN_H #define QMLSCREEN_H #include #include #include "qmloutput.h" class QQmlEngine; namespace KScreen { class Output; class Config; } class QMLScreen : public QQuickItem { Q_OBJECT Q_PROPERTY(QSize maxScreenSize READ maxScreenSize CONSTANT) Q_PROPERTY(int connectedOutputsCount READ connectedOutputsCount NOTIFY connectedOutputsCountChanged) Q_PROPERTY(int enabledOutputsCount READ enabledOutputsCount NOTIFY enabledOutputsCountChanged) Q_PROPERTY(float outputScale READ outputScale NOTIFY outputScaleChanged) public: explicit QMLScreen(QQuickItem *parent = nullptr); ~QMLScreen() override; int connectedOutputsCount() const; int enabledOutputsCount() const; QMLOutput* primaryOutput() const; QList outputs() const; QSize maxScreenSize() const; float outputScale() const; KScreen::ConfigPtr config() const; void setConfig(const KScreen::ConfigPtr &config); void updateOutputsPlacement(); void setActiveOutput(QMLOutput *output); public Q_SLOTS: void setActiveOutput() { setActiveOutput(qobject_cast(sender())); } Q_SIGNALS: void connectedOutputsCountChanged(); void enabledOutputsCountChanged(); void outputScaleChanged(); void focusedOutputChanged(QMLOutput *output); private Q_SLOTS: void addOutput(const KScreen::OutputPtr &output); void removeOutput(int outputId); void outputConnectedChanged(); void outputEnabledChanged(); void outputPositionChanged(); void viewSizeChanged(); private: void qmlOutputMoved(QMLOutput *qmlOutput); void updateCornerOutputs(); void setOutputScale(float scale); KScreen::ConfigPtr m_config; QHash m_outputMap; QVector m_manuallyMovedOutputs; int m_connectedOutputsCount = 0; int m_enabledOutputsCount = 0; float m_outputScale = 1.0 / 11.0;//缩放比例 QMLOutput *m_leftmost = nullptr; QMLOutput *m_topmost = nullptr; QMLOutput *m_rightmost = nullptr; QMLOutput *m_bottommost = nullptr; }; #endif // QMLSCREEN_H ukui-control-center/plugins/system/display/declarative/qmloutputcomponent.cpp0000644000175000017500000000471513630066010027047 0ustar fengfeng/* Copyright (C) 2012 Dan Vratil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "qmloutputcomponent.h" #include "qmloutput.h" #include "qmlscreen.h" #include #include #include #include #include #include //这里注册的类型为什么不起作用 Q_DECLARE_METATYPE(KScreen::OutputPtr) Q_DECLARE_METATYPE(QMLScreen*) QMLOutputComponent::QMLOutputComponent(QQmlEngine *engine, QMLScreen *parent): QQmlComponent(engine, parent), m_engine(engine) { //const QString qmlPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kcm_kscreen/qml/Output.qml")); const QString qmlpath = QStringLiteral(":/qml/Output.qml"); //qDebug()<<"qmlPath is ------>"<rootContext()); if (!instance) { qWarning() << errorString(); return nullptr; } bool success = instance->setProperty("outputPtr", QVariant::fromValue(qobject_cast(output))); // qDebug()<<"qmloutcomponent.cpp---->instance类型---->"<"<"<(output))<<" "<setProperty("screen", QVariant::fromValue(qobject_cast(parent()))); Q_ASSERT(success); Q_UNUSED(success); completeCreate(); return qobject_cast(instance); } ukui-control-center/plugins/system/display/declarative/qmloutputcomponent.h0000644000175000017500000000242113630066010026504 0ustar fengfeng/* Copyright (C) 2012 Dan Vratil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef QMLOUTPUTCOMPONENT_H #define QMLOUTPUTCOMPONENT_H #include #include class QMLScreen; class QMLOutput; class QMLOutputComponent : public QQmlComponent { Q_OBJECT public: explicit QMLOutputComponent(QQmlEngine *engine, QMLScreen *parent); ~QMLOutputComponent() override; QMLOutput* createForOutput(const KScreen::OutputPtr &output); private: QQmlEngine *m_engine; }; #endif // QMLOUTPUTCOMPONENT_H ukui-control-center/plugins/system/display/declarative/qmloutput.h0000644000175000017500000001234313630066010024565 0ustar fengfeng/* Copyright (C) 2012 Dan Vratil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef QMLOUTPUT_H #define QMLOUTPUT_H #include #include class QStandardItemModel; class QAbstractItemModel; class ModesProxyModel; class QMLScreen; class QMLOutput : public QQuickItem { Q_OBJECT Q_PROPERTY(KScreen::Output* output READ output NOTIFY outputChanged) Q_PROPERTY(KScreen::OutputPtr outputPtr READ outputPtr WRITE setOutputPtr NOTIFY outputChanged) Q_PROPERTY(bool isCloneMode READ isCloneMode WRITE setIsCloneMode NOTIFY isCloneModeChanged) Q_PROPERTY(QMLScreen* screen READ screen WRITE setScreen NOTIFY screenChanged) Q_PROPERTY(QMLOutput* cloneOf READ cloneOf WRITE setCloneOf NOTIFY cloneOfChanged) Q_PROPERTY(QMLOutput* leftDockedTo READ leftDockedTo WRITE setLeftDockedTo RESET undockLeft NOTIFY leftDockedToChanged) Q_PROPERTY(QMLOutput* topDockedTo READ topDockedTo WRITE setTopDockedTo RESET undockTop NOTIFY topDockedToChanged) Q_PROPERTY(QMLOutput* rightDockedTo READ rightDockedTo WRITE setRightDockedTo RESET undockRight NOTIFY rightDockedToChanged) Q_PROPERTY(QMLOutput* bottomDockedTo READ bottomDockedTo WRITE setBottomDockedTo RESET undockBottom NOTIFY bottomDockedToChanged) Q_PROPERTY(int currentOutputHeight READ currentOutputHeight NOTIFY currentOutputSizeChanged) Q_PROPERTY(int currentOutputWidth READ currentOutputWidth NOTIFY currentOutputSizeChanged) /* Workaround for possible QML bug when calling output.pos.y = VALUE works, * but output.pos.x = VALUE has no effect */ Q_PROPERTY(int outputX READ outputX WRITE setOutputX NOTIFY outputXChanged) Q_PROPERTY(int outputY READ outputY WRITE setOutputY NOTIFY outputYChanged) public: enum { ModeRole = Qt::UserRole, ModeIdRole, SizeRole, RefreshRateRole }; explicit QMLOutput(QQuickItem *parent = nullptr); KScreen::Output* output() const; // For QML KScreen::OutputPtr outputPtr() const; void setOutputPtr(const KScreen::OutputPtr &output); QMLScreen* screen() const; void setScreen(QMLScreen *screen); QMLOutput* leftDockedTo() const; void setLeftDockedTo(QMLOutput *output); void undockLeft(); QMLOutput* topDockedTo() const; void setTopDockedTo(QMLOutput *output); void undockTop(); QMLOutput* rightDockedTo() const; void setRightDockedTo(QMLOutput *output); void undockRight(); QMLOutput* bottomDockedTo() const; void setBottomDockedTo(QMLOutput *output); void undockBottom(); Q_INVOKABLE bool collidesWithOutput(QObject *other); Q_INVOKABLE bool maybeSnapTo(QMLOutput *other); void setCloneOf(QMLOutput *other); QMLOutput* cloneOf() const; int currentOutputHeight() const; int currentOutputWidth() const; int outputX() const; void setOutputX(int x); int outputY() const; void setOutputY(int y); void setIsCloneMode(bool isCloneMode); bool isCloneMode() const; void dockToNeighbours(); public Q_SLOTS: void updateRootProperties(); Q_SIGNALS: void changed(); void moved(const QString &self); /* Property notifications */ void outputChanged(); void screenChanged(); void cloneOfChanged(); void currentOutputSizeChanged(); void leftDockedToChanged(); void topDockedToChanged(); void rightDockedToChanged(); void bottomDockedToChanged(); void outputYChanged(); void outputXChanged(); void isCloneModeChanged(); private Q_SLOTS: void moved(); void currentModeIdChanged(); private: /** * Returns the biggest resolution available assuming it's the preferred one */ KScreen::ModePtr bestMode() const; KScreen::OutputPtr m_output; QMLScreen *m_screen; QMLOutput *m_cloneOf; QMLOutput *m_leftDock; QMLOutput *m_topDock; QMLOutput *m_rightDock; QMLOutput *m_bottomDock; bool m_isCloneMode; }; #endif // QMLOUTPUT_H ukui-control-center/plugins/system/display/declarative/qmloutput.cpp0000644000175000017500000004041213630066010025116 0ustar fengfeng/* Copyright (C) 2012 Dan Vratil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "qmloutput.h" #include "qmlscreen.h" #include #include #include #include #include const static int sMargin = 0; const static int sSnapArea = 20; const static int sSnapAlignArea = 6; Q_DECLARE_METATYPE(KScreen::ModePtr) bool operator>(const QSize &sizeA, const QSize &sizeB) { return ((sizeA.width() > sizeB.width()) && (sizeA.height() > sizeB.height())); } QMLOutput::QMLOutput(QQuickItem *parent): QQuickItem(parent), m_screen(nullptr), m_cloneOf(nullptr), m_leftDock(nullptr), m_topDock(nullptr), m_rightDock(nullptr), m_bottomDock(nullptr), m_isCloneMode(false) { connect(this, &QMLOutput::xChanged, this, static_cast(&QMLOutput::moved)); connect(this, &QMLOutput::yChanged, this, static_cast(&QMLOutput::moved)); } KScreen::Output* QMLOutput::output() const { return m_output.data(); } KScreen::OutputPtr QMLOutput::outputPtr() const { return m_output; } void QMLOutput::setOutputPtr(const KScreen::OutputPtr &output) { //qDebug()<<"setOutputPtr------> qmloutput"<currentMode(); if (!mode) { if (m_output->isConnected()) { mode = bestMode(); if (!mode) { return 1000; } m_output->setCurrentModeId(mode->id()); } else { return 1000; } } //qDebug()<<"mode->size().height()---->"<size()<size().height() / m_output->scale(); } //返回上面小屏幕宽度 int QMLOutput::currentOutputWidth() const { if (!m_output) { return 0; } KScreen::ModePtr mode = m_output->currentMode(); if (!mode) { if (m_output->isConnected()) { mode = bestMode(); if (!mode) { return 1000; } m_output->setCurrentModeId(mode->id()); } else { return 1000; } } return mode->size().width() / m_output->scale(); } void QMLOutput::currentModeIdChanged() { //qDebug()<<"currentModeIdChanged---->"<outputScale(); setX((m_screen->width() - newWidth) / 2); const float newHeight = currentOutputHeight() * m_screen->outputScale(); setY((m_screen->height() - newHeight) / 2); } else { if (m_rightDock) { QMLOutput *rightDock = m_rightDock; float newWidth = currentOutputWidth() * m_screen->outputScale(); setX(rightDock->x() - newWidth); setRightDockedTo(rightDock); } if (m_bottomDock) { QMLOutput *bottomDock = m_bottomDock; float newHeight = currentOutputHeight() * m_screen->outputScale(); setY(bottomDock->y() - newHeight); setBottomDockedTo(bottomDock); } } Q_EMIT currentOutputSizeChanged(); } int QMLOutput::outputX() const { //qDebug()<<"outputX--->"<pos().x()<pos().x(); } void QMLOutput::setOutputX(int x) { //qDebug()<<"setOutputX--->"<pos().rx() == x) { return; } QPoint pos = m_output->pos(); pos.setX(x); m_output->setPos(pos); Q_EMIT outputXChanged(); } int QMLOutput::outputY() const { //qDebug()<<"outputY--->"<pos().y()<pos().y(); } void QMLOutput::setOutputY(int y) { //qDebug()<<"setOutputY--->"<pos().ry() == y) { return; } QPoint pos = m_output->pos(); pos.setY(y); m_output->setPos(pos); Q_EMIT outputYChanged(); } bool QMLOutput::isCloneMode() const { return m_isCloneMode; } void QMLOutput::setIsCloneMode(bool isCloneMode) { if (m_isCloneMode == isCloneMode) { return; } m_isCloneMode = isCloneMode; Q_EMIT isCloneModeChanged(); } void QMLOutput::dockToNeighbours() { //qDebug()<<"dockToNeighbours---->"<outputs()) { if (otherQmlOutput == this) { continue; } if (!otherQmlOutput->output()->isConnected() || !otherQmlOutput->output()->isEnabled()) { continue; } const QRect geom = m_output->geometry(); const QRect otherGeom = otherQmlOutput->output()->geometry(); //qDebug()<<"geom is ------>"<modes(); KScreen::ModePtr bestMode; Q_FOREACH (const KScreen::ModePtr &mode, modes) { if (!bestMode || (mode->size() > bestMode->size())) { bestMode = mode; } } return bestMode; } bool QMLOutput::collidesWithOutput(QObject *other) { QQuickItem* otherItem = qobject_cast(other); return boundingRect().intersects(otherItem->boundingRect()); } bool QMLOutput::maybeSnapTo(QMLOutput *other) { //qDebug()<<"maybeSnapTo---->"<x(); const qreal y2 = other->y(); const qreal height2 = other->height(); const qreal width2 = other->width(); const qreal centerX2 = x2 + (width2 / 2.0); const qreal centerY2 = y2 + (height2 / 2.0); /* left of other */ if ((x() + width() > x2 - sSnapArea) && (x() + width() < x2 + sSnapArea) && (y() + height() > y2) && (y() < y2 + height2)) { setX(x2 - width() + sMargin); centerX = x() + (width() / 2.0); setRightDockedTo(other); other->setLeftDockedTo(this); //output.cloneOf = null; /* output is snapped to other on left and their * upper sides are aligned */ if ((y() < y2 + sSnapAlignArea) && (y() > y2 - sSnapAlignArea)) { setY(y2); return true; } /* output is snapped to other on left and they * are centered */ if ((centerY < centerY2 + sSnapAlignArea) && (centerY > centerY2 - sSnapAlignArea)) { setY(centerY2 - (height() / 2.0)); return true; } /* output is snapped to other on left and their * bottom sides are aligned */ if ((y() + height() < y2 + height2 + sSnapAlignArea) && (y() + height() > y2 + height2 - sSnapAlignArea)) { setY(y2 + height2 - height()); return true; } return true; } /* output is right of other */ if ((x() > x2 + width2 - sSnapArea) && (x() < x2 + width2 + sSnapArea) && (y() + height() > y2) && (y() < y2 + height2)) { setX(x2 + width2 - sMargin); centerX = x() + (width() / 2.0); setLeftDockedTo(other); other->setRightDockedTo(this); //output.cloneOf = null; /* output is snapped to other on right and their * upper sides are aligned */ if ((y() < y2 + sSnapAlignArea) && (y() > y2 - sSnapAlignArea)) { setY(y2); return true; } /* output is snapped to other on right and they * are centered */ if ((centerY < centerY2 + sSnapAlignArea) && (centerY > centerY2 - sSnapAlignArea)) { setY(centerY2 - (height() / 2.0)); return true; } /* output is snapped to other on right and their * bottom sides are aligned */ if ((y() + height() < y2 + height2 + sSnapAlignArea) && (y() + height() > y2 + height2 - sSnapAlignArea)) { setY(y2 + height2 - height()); return true; } return true; } /* output is above other */ if ((y() + height() > y2 - sSnapArea) && (y() + height() < y2 + sSnapArea) && (x() + width() > x2) && (x() < x2 + width2)) { setY(y2 - height() + sMargin); centerY = y() + (height() / 2.0); setBottomDockedTo(other); other->setTopDockedTo(this); //output.cloneOf = null; /* output is snapped to other on top and their * left sides are aligned */ if ((x() < x2 + sSnapAlignArea) && (x() > x2 - sSnapAlignArea)) { setX(x2); return true; } /* output is snapped to other on top and they * are centered */ if ((centerX < centerX2 + sSnapAlignArea) && (centerX > centerX2 - sSnapAlignArea)) { setX(centerX2 - (width() / 2.0)); return true; } /* output is snapped to other on top and their * right sides are aligned */ if ((x() + width() < x2 + width2 + sSnapAlignArea) && (x() + width() > x2 + width2 - sSnapAlignArea)) { setX(x2 + width2 - width()); return true; } return true; } /* output is below other */ if ((y() > y2 + height2 - sSnapArea) && (y() < y2 + height2 + sSnapArea) && (x() + width() > x2) && (x() < x2 + width2)) { setY(y2 + height2 - sMargin); centerY = y() + (height() / 2.0); setTopDockedTo(other); other->setBottomDockedTo(this); //output.cloneOf = null; /* output is snapped to other on bottom and their * left sides are aligned */ if ((x() < x2 + sSnapAlignArea) && (x() > x2 - sSnapAlignArea)) { setX(x2); return true; } /* output is snapped to other on bottom and they * are centered */ if ((centerX < centerX2 + sSnapAlignArea) && (centerX > centerX2 - sSnapAlignArea)) { setX(centerX2 - (width() / 2.0)); return true; } /* output is snapped to other on bottom and their * right sides are aligned */ if ((x() + width() < x2 + width2 + sSnapAlignArea) && (x() + width() > x2 + width2 - sSnapAlignArea)) { setX(x2 + width2 - width()); return true; } return true; } return false; } void QMLOutput::moved() { //qDebug()<<"moved----->"< siblings = screen()->childItems(); // First, if we have moved, then unset the "cloneOf" flag setCloneOf(nullptr); disconnect(this, &QMLOutput::xChanged, this, static_cast(&QMLOutput::moved)); disconnect(this, &QMLOutput::yChanged, this, static_cast(&QMLOutput::moved)); Q_FOREACH (QQuickItem *sibling, siblings) { QMLOutput *otherOutput = qobject_cast(sibling); if (!otherOutput || otherOutput == this) { continue; } if (!maybeSnapTo(otherOutput)) { if (m_leftDock == otherOutput) { m_leftDock->undockRight(); undockLeft(); } if (m_topDock == otherOutput) { m_topDock->undockBottom(); undockTop(); } if (m_rightDock == otherOutput) { m_rightDock->undockLeft(); undockRight(); } if (m_bottomDock == otherOutput) { m_bottomDock->undockTop(); undockBottom(); } } } connect(this, &QMLOutput::xChanged, this, static_cast(&QMLOutput::moved)); connect(this, &QMLOutput::yChanged, this, static_cast(&QMLOutput::moved)); Q_EMIT moved(m_output->name()); } /* Transformation of an item (rotation of the MouseArea) is only visual. * The coordinates and dimensions are still the same (when you rotated * 100x500 rectangle by 90 deg, it will still be 100x500, although * visually it will be 500x100). * * This method calculates the real-visual coordinates and dimensions of * the MouseArea and updates root item to match them. This makes snapping * work correctly regardless off visual rotation of the output */ //旋转时计算坐标更改方向 void QMLOutput::updateRootProperties() { //qDebug()<<"updateRootProperties----->"<isHorizontal() ? currentOutputWidth() : currentOutputHeight()) * m_screen->outputScale(); const float transformedHeight = (m_output->isHorizontal() ? currentOutputHeight() : currentOutputWidth()) * m_screen->outputScale(); const float transformedX = x() + (width() / 2.0) - (transformedWidth / 2.0); const float transformedY = y() + (height() / 2.0) - (transformedHeight / 2.0); //qDebug()<<"transformedWidth: "< #include #include #include ControlPanel::ControlPanel(QWidget *parent) : QFrame(parent) , mUnifiedOutputCfg(nullptr) { // setMinimumSize(553,150); // setMaximumSize(16777215,150); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); // setFrameStyle(QFrame::NoFrame | QFrame::Sunken); // this->setStyleSheet("border: 1px solid #ff0000"); mLayout = new QVBoxLayout(this); mLayout->setContentsMargins(0,0,0,0); } ControlPanel::~ControlPanel() { } void ControlPanel::setConfig(const KScreen::ConfigPtr &config) { qDeleteAll(mOutputConfigs); mOutputConfigs.clear(); delete mUnifiedOutputCfg; mUnifiedOutputCfg = nullptr; if (mConfig) { mConfig->disconnect(this); } mConfig = config; connect(mConfig.data(), &KScreen::Config::outputAdded, this, &ControlPanel::addOutput); connect(mConfig.data(), &KScreen::Config::outputRemoved, this, &ControlPanel::removeOutput); for (const KScreen::OutputPtr &output : mConfig->outputs()) { //qDebug()<<"output is----->"<setVisible(false); outputCfg->setShowScaleOption(mConfig->supportedFeatures().testFlag(KScreen::Config::Feature::PerOutputScaling)); outputCfg->setOutput(output); connect(outputCfg, &OutputConfig::changed, this, &ControlPanel::changed); connect(outputCfg, &OutputConfig::scaleChanged, this, &ControlPanel::scaleChanged); mLayout->addWidget(outputCfg); mOutputConfigs << outputCfg; } void ControlPanel::removeOutput(int outputId) { for (OutputConfig *outputCfg : mOutputConfigs) { if (outputCfg->output()->id() == outputId) { mOutputConfigs.removeOne(outputCfg); delete outputCfg; return; } } } void ControlPanel::activateOutput(const KScreen::OutputPtr &output) { // Ignore activateOutput when in unified mode if (mUnifiedOutputCfg) { return; } //qCDebug(KSCREEN_KCM) << "Activate output" << output->id(); //qDebug()<<"activateOutput---->"<output()->id()<<" "<id(); cfg->setVisible(cfg->output()->id() == output->id()); //cfg->setVisible(cfg->output()->id() == 66) } } void ControlPanel::activateOutputNoParam() { // Ignore activateOutput when in unified mode if (mUnifiedOutputCfg) { return; } qDebug()<<"activateOutputNoParam ------>"<id(); Q_FOREACH (OutputConfig *cfg, mOutputConfigs) { qDebug()<output()->id()<<" id"; //cfg->setVisible(cfg->output()->id() == output->id()); cfg->setVisible(cfg->output()->id() == 66); } } void ControlPanel::setUnifiedOutput(const KScreen::OutputPtr &output) { Q_FOREACH (OutputConfig *config, mOutputConfigs) { if (!config->output()->isConnected()) { continue; } //qDebug()<<"config is---->"<output()<<"--------"<setVisible(output == nullptr); } if (output.isNull()) { mUnifiedOutputCfg->deleteLater(); mUnifiedOutputCfg = nullptr; } else { //qDebug()<<"config is---->"<setOutput(output); mUnifiedOutputCfg->setVisible(true); mLayout->insertWidget(mLayout->count() - 2, mUnifiedOutputCfg); connect(mUnifiedOutputCfg, &UnifiedOutputConfig::changed, this, &ControlPanel::changed); } } ukui-control-center/plugins/system/display/display.h0000644000175000017500000000310113630066010021665 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef DISPLAYSET_H #define DISPLAYSET_H #include #include #include #include "shell/interface.h" #include "widget.h" namespace Ui { class DisplayWindow; } class DisplaySet : public QObject, CommonInterface{ Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: DisplaySet(); ~DisplaySet(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; private: Ui::DisplayWindow * ui; QString pluginName; int pluginType; Widget * pluginWidget; }; #endif // DISPLAYSET_H ukui-control-center/plugins/system/defaultapp/0000755000175000017500000000000013642553044020547 5ustar fengfengukui-control-center/plugins/system/defaultapp/addappdialog.cpp0000644000175000017500000000372113556706375023702 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "addappdialog.h" #include "ui_addappdialog.h" #include AddAppDialog::AddAppDialog(QWidget *parent) : QDialog(parent), ui(new Ui::AddAppDialog) { ui->setupUi(this); connect(ui->cancelPushBtn, SIGNAL(clicked(bool)), this, SLOT(close())); apps = QDir("/usr/share/applications/"); QStringList filters; filters << "*.desktop"; apps.setNameFilters(filters); foreach (QString name, apps.entryList(QDir::Files)) { qDebug() << name; QByteArray ba = apps.absoluteFilePath(name).toUtf8(); GDesktopAppInfo * appinfo = g_desktop_app_info_new_from_filename(ba.constData()); QString appname = g_app_info_get_name(G_APP_INFO(appinfo)); const char * iconname = g_icon_to_string(g_app_info_get_icon(G_APP_INFO(appinfo))); QIcon appicon; if (QIcon::hasThemeIcon(QString(iconname))) appicon = QIcon::fromTheme(QString(iconname)); QListWidgetItem * item = new QListWidgetItem(appicon, appname, ui->appListWidget); ui->appListWidget->addItem(item); } } AddAppDialog::~AddAppDialog() { delete ui; } ukui-control-center/plugins/system/defaultapp/defaultapp.pro0000644000175000017500000000151113630066010023401 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-02-20T15:36:43 # #------------------------------------------------- QT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(defaultapp) DESTDIR = ../../../pluginlibs ##加载gio库和gio-unix库,用于处理desktop文件 CONFIG += link_pkgconfig \ C++11 PKGCONFIG += gio-2.0 \ gio-unix-2.0 include(../../../env.pri) INCLUDEPATH += \ $$PROJECT_ROOTDIR \ #LIBS += -L/usr/lib/ -ldefaultprograms \ SOURCES += \ defaultapp.cpp \ addappdialog.cpp \ # component/custdomcombobox.cpp HEADERS += \ defaultapp.h \ addappdialog.h \ # component/custdomcombobox.h FORMS += \ defaultapp.ui \ addappdialog.ui ukui-control-center/plugins/system/defaultapp/defaultapp.h0000644000175000017500000000557013630066010023041 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef DEFAULTAPP_H #define DEFAULTAPP_H #include #include #include #include #include #include "shell/interface.h" /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include #include } typedef struct _Applist { char *appid; }AppList;//用于存放应用列表 typedef struct _AppInfo { GAppInfo *item; }Appinfo;//用于存放应用列表信息 namespace Ui { class DefaultAppWindow; } class DefaultApp : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: DefaultApp(); ~DefaultApp(); public: QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void initUI(); bool setWebBrowsersDefaultProgram(char * appid); bool setMailReadersDefaultProgram(char * appid); bool setImageViewersDefaultProgram(char * appid); bool setAudioPlayersDefaultProgram(char * appid); bool setVideoPlayersDefaultProgram(char * appid); bool setTextEditorsDefautlProgram(char * appid); private: Ui::DefaultAppWindow * ui; private: QWidget * pluginWidget; private: QString pluginName; int pluginType; QStyledItemDelegate *itemDelege; private: char * getDefaultAppId(const char * contentType); AppList * getAppIdList(const char * contentType); static Appinfo * _getAppList(const char *contentType); public slots: void browserComBoBox_changed_cb(int index); void mailComBoBox_changed_cb(int index); void imageComBoBox_changed_cb(int index); void audioComBoBox_changed_cb(int index); void videoComBoBox_changed_cb(int index); void textComBoBox_changed_cb(int index); }; #endif // DEFAULTAPP_H ukui-control-center/plugins/system/defaultapp/component/0000755000175000017500000000000013564473475022565 5ustar fengfengukui-control-center/plugins/system/defaultapp/component/custdomcombobox.h0000644000175000017500000000234113556706375026144 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CUSTDOMCOMBOBOX_H #define CUSTDOMCOMBOBOX_H #include #include class CustdomComboBox : public QComboBox { Q_OBJECT public: explicit CustdomComboBox(QWidget *parent = 0); ~CustdomComboBox(); public slots: void itemchangedSlot(int itemindex); Q_SIGNALS: void itemchangedSignal(int index); }; #endif // CUSTDOMCOMBOBOX_H ukui-control-center/plugins/system/defaultapp/component/custdomcombobox.cpp0000644000175000017500000000264013564473475026502 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "custdomcombobox.h" #include CustdomComboBox::CustdomComboBox(QWidget *parent) : QComboBox(parent) { QSize maxSize(422, 62); QSize minSize(320, 50); this->setMinimumSize(minSize); // this->setMaximumSize(maxSize); connect(this, SIGNAL(currentIndexChanged(int)), this, SLOT(itemchangedSlot(int))); } CustdomComboBox::~CustdomComboBox() { } void CustdomComboBox::itemchangedSlot(int itemindex){ if (CustdomComboBox::currentText() == "add") qDebug() << "---------------->"; emit itemchangedSignal(itemindex); } ukui-control-center/plugins/system/defaultapp/defaultapp.ui0000644000175000017500000004452613635333016023243 0ustar fengfeng DefaultAppWindow 0 0 800 710 0 0 16777215 16777215 Form 2 0 0 32 0 0 0 Select Default Application true Qt::Vertical QSizePolicy::Fixed 20 14 550 60 960 60 48 16 0 16 0 0 0 100 0 100 16777215 Browser true 400 30 16777215 40 -1 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; padding-left: 8px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); padding-left: 5px; } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } 550 60 960 60 48 16 0 16 0 0 0 100 0 100 16777215 Mail true 400 30 16777215 40 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; padding-left: 8px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); padding-left: 5px; } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } 550 60 960 60 48 16 0 16 0 0 0 100 0 100 16777215 Image Viewer true 400 30 16777215 40 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; padding-left: 8px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); padding-left: 5px; } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } 550 60 960 60 48 16 0 16 0 0 0 100 0 100 16777215 Audio Player true 400 30 16777215 40 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; padding-left: 8px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); padding-left: 5px; } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } 550 60 960 60 48 16 0 16 0 0 0 100 0 100 16777215 Video Player true 400 30 16777215 40 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; padding-left: 8px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); padding-left: 5px; } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } 550 60 960 60 48 16 0 16 0 0 0 100 0 100 16777215 Text Editor true 400 30 16777215 40 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; padding-left: 8px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); padding-left: 5px; } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Vertical 20 40 ukui-control-center/plugins/system/defaultapp/addappdialog.h0000644000175000017500000000271613556706375023352 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef ADDAPPDIALOG_H #define ADDAPPDIALOG_H #include #include #include /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include #include } namespace Ui { class AddAppDialog; } class AddAppDialog : public QDialog { Q_OBJECT public: explicit AddAppDialog(QWidget *parent = 0); ~AddAppDialog(); private: Ui::AddAppDialog *ui; QDir apps; }; #endif // ADDAPPDIALOG_H ukui-control-center/plugins/system/defaultapp/addappdialog.ui0000644000175000017500000000514413621411724023516 0ustar fengfeng AddAppDialog 0 0 377 418 Dialog 0 0 0 0 0 0 0 16777215 16777215 6 Qt::Vertical QSizePolicy::Preferred 20 40 OK Cancel Qt::Vertical 20 40 ukui-control-center/plugins/system/defaultapp/defaultapp.cpp0000644000175000017500000005134413642553044023407 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include "defaultapp.h" #include "ui_defaultapp.h" #include "addappdialog.h" #define BROWSERTYPE "x-scheme-handler/http" #define MAILTYPE "x-scheme-handler/mailto" #define IMAGETYPE "image/png" #define AUDIOTYPE "audio/x-vorbis+ogg" #define VIDEOTYPE "video/x-ogm+ogg" #define TEXTTYPE "text/plain" #define DESKTOPPATH "/usr/share/applications/" DefaultApp::DefaultApp(){ ui = new Ui::DefaultAppWindow; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); itemDelege = new QStyledItemDelegate(); pluginName = tr("defaultapp"); pluginType = SYSTEM; pluginWidget->setStyleSheet("background: #ffffff;"); ui->browserWidget->setStyleSheet("QWidget#browserWidget{background: #F4F4F4; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); ui->browserLabel->setStyleSheet("QLabel#browserLabel{background: #F4F4F4;}"); ui->mailWidget->setStyleSheet("QWidget#mailWidget{background: #F4F4F4;}"); ui->mailLabel->setStyleSheet("QLabel#mailLabel{background: #F4F4F4;}"); ui->imageWidget->setStyleSheet("QWidget#imageWidget{background: #F4F4F4;}"); ui->imageLabel->setStyleSheet("QLabel#imageLabel{background: #F4F4F4;}"); ui->audioWidget->setStyleSheet("QWidget#audioWidget{background: #F4F4F4;}"); ui->audioLabel->setStyleSheet("QLabel#audioLabel{background: #F4F4F4;}"); ui->videoWidget->setStyleSheet("QWidget#videoWidget{background: #F4F4F4;}"); ui->videoLabel->setStyleSheet("QLabel#videoLabel{background: #F4F4F4;}"); ui->textWidget->setStyleSheet("QWidget#textWidget{background: #F4F4F4; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"); ui->textLabel->setStyleSheet("QLabel#textLabel{background: #F4F4F4;}"); initUI(); // ui->resetPushBtn->hide(); } DefaultApp::~DefaultApp(){ delete ui; } QString DefaultApp::get_plugin_name(){ return pluginName; } int DefaultApp::get_plugin_type(){ return pluginType; } QWidget *DefaultApp::get_plugin_ui(){ return pluginWidget; } void DefaultApp::plugin_delay_control(){ } void DefaultApp::initUI(){ // ui->browserComBoBox->setView(new QListView()); ui->browserComBoBox->setItemDelegate(itemDelege); ui->browserComBoBox->setMaxVisibleItems(5); ui->mailComBoBox->setItemDelegate(itemDelege); ui->mailComBoBox->setMaxVisibleItems(5); ui->imageComBoBox->setItemDelegate(itemDelege); ui->imageComBoBox->setMaxVisibleItems(5); ui->audioComBoBox->setItemDelegate(itemDelege); ui->audioComBoBox->setMaxVisibleItems(5); ui->videoComBoBox->setItemDelegate(itemDelege); ui->videoComBoBox->setMaxVisibleItems(5); ui->textComBoBox->setItemDelegate(itemDelege); ui->textComBoBox->setMaxVisibleItems(5); // BROWSER int browserindex = -1; QString currentbrowser(getDefaultAppId(BROWSERTYPE)); //获取当前 AppList * list = getAppIdList(BROWSERTYPE); //获取可选列表 if (list){ for (int i = 0; list[i].appid != NULL; i++){ QString single(list[i].appid); QByteArray ba = QString(DESKTOPPATH + single).toUtf8(); GDesktopAppInfo * browserinfo = g_desktop_app_info_new_from_filename(ba.constData()); QString appname = g_app_info_get_name(G_APP_INFO(browserinfo)); // qDebug() << appname ; const char * iconname = g_icon_to_string(g_app_info_get_icon(G_APP_INFO(browserinfo))); QIcon appicon; if (QIcon::hasThemeIcon(QString(iconname))) appicon = QIcon::fromTheme(QString(iconname)); ui->browserComBoBox->addItem(appicon, appname, single); if (currentbrowser == single) browserindex = i; free(list[i].appid); } free(list); } // ui->browserComBoBox->addItem("add", "add"); ui->browserComBoBox->setCurrentIndex(browserindex); connect(ui->browserComBoBox, SIGNAL(currentIndexChanged(int)), this, SLOT(browserComBoBox_changed_cb(int))); // MAIL int mailindex = -1; QString currentmail(getDefaultAppId(MAILTYPE)); AppList * maillist = getAppIdList(MAILTYPE); if (maillist){ for (int i = 0; maillist[i].appid != NULL; i++){ QString single(maillist[i].appid); QByteArray ba = QString(DESKTOPPATH + single).toUtf8(); GDesktopAppInfo * mailinfo = g_desktop_app_info_new_from_filename(ba.constData()); QString appname = g_app_info_get_name(G_APP_INFO(mailinfo)); const char * iconname = g_icon_to_string(g_app_info_get_icon(G_APP_INFO(mailinfo))); QIcon appicon; if (QIcon::hasThemeIcon(QString(iconname))) appicon = QIcon::fromTheme(QString(iconname)); ui->mailComBoBox->addItem(appicon, appname, single); if (currentmail == single) mailindex = i; free(maillist[i].appid); } free(maillist); } ui->mailComBoBox->setCurrentIndex(mailindex); connect(ui->mailComBoBox, SIGNAL(currentIndexChanged(int)), this, SLOT(mailComBoBox_changed_cb(int))); // IMAGE int imageindex = -1; QString currentimage(getDefaultAppId(IMAGETYPE)); AppList * imagelist = getAppIdList(IMAGETYPE); if (imagelist){ for (int i = 0; imagelist[i].appid != NULL; i++){ QString single(imagelist[i].appid); QByteArray ba = QString(DESKTOPPATH + single).toUtf8(); GDesktopAppInfo * imageinfo = g_desktop_app_info_new_from_filename(ba.constData()); QString appname = g_app_info_get_name(G_APP_INFO(imageinfo)); const char * iconname = g_icon_to_string(g_app_info_get_icon(G_APP_INFO(imageinfo))); QIcon appicon; if (QIcon::hasThemeIcon(QString(iconname))) appicon = QIcon::fromTheme(QString(iconname)); ui->imageComBoBox->addItem(appicon, appname, single); if (currentimage == single) imageindex = i; free(imagelist[i].appid); } free(imagelist); } ui->imageComBoBox->setCurrentIndex(imageindex); connect(ui->imageComBoBox, SIGNAL(currentIndexChanged(int)), this, SLOT(imageComBoBox_changed_cb(int))); // AUDIO int audioindex = -1; QString currentaudio(getDefaultAppId(AUDIOTYPE)); AppList * audiolist = getAppIdList(AUDIOTYPE); if (audiolist){ for (int i = 0; audiolist[i].appid != NULL; i++){ QString single(audiolist[i].appid); QByteArray ba = QString(DESKTOPPATH + single).toUtf8(); GDesktopAppInfo * audioinfo = g_desktop_app_info_new_from_filename(ba.constData()); QString appname = g_app_info_get_name(G_APP_INFO(audioinfo)); const char * iconname = g_icon_to_string(g_app_info_get_icon(G_APP_INFO(audioinfo))); QIcon appicon; if (QIcon::hasThemeIcon(QString(iconname))) appicon = QIcon::fromTheme(QString(iconname)); ui->audioComBoBox->addItem(appicon, appname, single); if (currentaudio == single) audioindex = i; free(audiolist[i].appid); } free(audiolist); } ui->audioComBoBox->setCurrentIndex(audioindex); connect(ui->audioComBoBox, SIGNAL(currentIndexChanged(int)), this, SLOT(audioComBoBox_changed_cb(int))); // VIDEO int videoindex =-1; QString currentvideo(getDefaultAppId(VIDEOTYPE)); AppList * videolist = getAppIdList(VIDEOTYPE); if (videolist){ for (int i = 0; videolist[i].appid != NULL; i++){ QString single(videolist[i].appid); QByteArray ba = QString(DESKTOPPATH + single).toUtf8(); GDesktopAppInfo * videoinfo = g_desktop_app_info_new_from_filename(ba.constData()); QString appname = g_app_info_get_name(G_APP_INFO(videoinfo)); const char * iconname = g_icon_to_string(g_app_info_get_icon(G_APP_INFO(videoinfo))); QIcon appicon; if (QIcon::hasThemeIcon(QString(iconname))) appicon = QIcon::fromTheme(QString(iconname)); ui->videoComBoBox->addItem(appicon, appname, single); if (currentvideo == single) videoindex = i; free(videolist[i].appid); } free(videolist); } ui->videoComBoBox->setCurrentIndex(videoindex); connect(ui->videoComBoBox, SIGNAL(currentIndexChanged(int)), this, SLOT(videoComBoBox_changed_cb(int))); // TEXT int textindex = -1; QString currenttext(getDefaultAppId(TEXTTYPE)); AppList * textlist = getAppIdList(TEXTTYPE); if (textlist){ for (int i = 0; textlist[i].appid != NULL; i++){ QString single(textlist[i].appid); QByteArray ba = QString(DESKTOPPATH + single).toUtf8(); GDesktopAppInfo * textinfo = g_desktop_app_info_new_from_filename(ba.constData()); QString appname = g_app_info_get_name(G_APP_INFO(textinfo)); const char * iconname = g_icon_to_string(g_app_info_get_icon(G_APP_INFO(textinfo))); QIcon appicon; if (QIcon::hasThemeIcon(QString(iconname))) appicon = QIcon::fromTheme(QString(iconname)); ui->textComBoBox->addItem(appicon, appname, single); if (currenttext == single) textindex = i; free(textlist[i].appid); } free(textlist); } ui->textComBoBox->setCurrentIndex(textindex); connect(ui->textComBoBox, SIGNAL(currentIndexChanged(int)), this, SLOT(textComBoBox_changed_cb(int))); } void DefaultApp::browserComBoBox_changed_cb(int index){ // QString appid = ui->browserComBoBox->currentData().toString(); QString appid = ui->browserComBoBox->itemData(index).toString(); if (appid == "add"){ // AddAppDialog * dialog = new AddAppDialog(); // dialog->show(); qDebug() << "add clicked"; } else{ QByteArray ba = appid.toUtf8(); // QString to char * setWebBrowsersDefaultProgram(ba.data()); } } void DefaultApp::mailComBoBox_changed_cb(int index){ QString appid = ui->mailComBoBox->itemData(index).toString(); if (appid == "add"){ qDebug() << "add clicked"; } else{ QByteArray ba = appid.toUtf8(); // QString to char * setMailReadersDefaultProgram(ba.data()); } } void DefaultApp::imageComBoBox_changed_cb(int index){ QString appid = ui->imageComBoBox->itemData(index).toString(); if (appid == "add"){ qDebug() << "add clicked"; } else{ QByteArray ba = appid.toUtf8(); // QString to char * setImageViewersDefaultProgram(ba.data()); } } void DefaultApp::audioComBoBox_changed_cb(int index){ QString appid = ui->audioComBoBox->itemData(index).toString(); if (appid == "add"){ qDebug() << "add clicked"; } else{ QByteArray ba = appid.toUtf8(); // QString to char * setAudioPlayersDefaultProgram(ba.data()); } } void DefaultApp::videoComBoBox_changed_cb(int index){ QString appid = ui->videoComBoBox->itemData(index).toString(); if (appid == "add"){ qDebug() << "add clicked"; } else{ QByteArray ba = appid.toUtf8(); // QString to char * setVideoPlayersDefaultProgram(ba.data()); } } void DefaultApp::textComBoBox_changed_cb(int index){ QString appid = ui->textComBoBox->itemData(index).toString(); if (appid == "add"){ qDebug() << "add clicked"; } else{ QByteArray ba = appid.toUtf8(); // QString to char * setTextEditorsDefautlProgram(ba.data()); } } char * DefaultApp::getDefaultAppId(const char * contentType){ GAppInfo * app = g_app_info_get_default_for_type(contentType, false); if(app != NULL){ const char * id = g_app_info_get_id(app); if(id != NULL){ gint len = strlen(id); char * appid = (char *)malloc(sizeof(char)*(len+1)); strcpy(appid,id); return appid; } else { return NULL; } } else { return NULL; } } AppList * DefaultApp::getAppIdList(const char *contentType){ Appinfo *appinfo = _getAppList(contentType); if(appinfo != NULL){ int i = 0; while(appinfo[i].item != NULL) i++; AppList *list = (AppList *)malloc(sizeof(AppList)*(i+1)); int count = i; int index = 0; for(gint j = 0;appinfo[j].item != NULL;j++){ const char *id = g_app_info_get_id(appinfo[j].item); if(id != NULL){ int len = strlen(id); list[index].appid = (char *)malloc(sizeof(char)*(len+1)); strcpy(list[index].appid,id); index++; } else { free(list+count); count--; } } list[count].appid=NULL; free(appinfo); return list; } else { return NULL; } } Appinfo * DefaultApp::_getAppList(const char *contentType){ GList *applist; applist = g_app_info_get_all_for_type(contentType); GAppInfo * item; if(applist != NULL){ int len = g_list_length(applist); Appinfo * appinfo=(Appinfo *)malloc(sizeof(Appinfo)*(len+1)); //获取应用列表 for (int index=0; index < len; index++){ item = (GAppInfo*) g_list_nth_data(applist, index); appinfo[index].item=item; } appinfo[len].item=NULL; return appinfo; } else { return NULL; } } bool DefaultApp::setWebBrowsersDefaultProgram(char * appid){ const char * content_type = "x-scheme-handler/http"; Appinfo * appinfo = _getAppList(content_type); bool judge = false; if(appinfo != NULL){ for(int i = 0; appinfo[i].item != NULL; i++){ const char *id = g_app_info_get_id(appinfo[i].item); int result = strcmp(id,appid); if(0 == result){ GAppInfo *appitem=appinfo[i].item; gboolean ret1=g_app_info_set_as_default_for_type(appitem, "x-scheme-handler/http", NULL); gboolean ret2=g_app_info_set_as_default_for_type(appitem, "x-scheme-handler/https", NULL); gboolean ret3=g_app_info_set_as_default_for_type(appitem, "x-scheme-handler/about", NULL); if(ret1 && ret2 && ret3) judge=true; break; } } free(appinfo); } return judge; } bool DefaultApp::setMailReadersDefaultProgram(char *appid){ const char *content_type="x-scheme-handler/mailto"; Appinfo *appinfo=_getAppList(content_type); bool judge = false; if(appinfo != NULL){ for(int i = 0; appinfo[i].item != NULL; i++){ const char * id = g_app_info_get_id(appinfo[i].item); int result=strcmp(id,appid); if(0 == result){ GAppInfo *appitem=appinfo[i].item; gboolean ret1=g_app_info_set_as_default_for_type(appitem, "x-scheme-handler/mailto", NULL); gboolean ret2=g_app_info_set_as_default_for_type(appitem, "application/x-extension-eml", NULL); gboolean ret3=g_app_info_set_as_default_for_type(appitem, "message/rfc822", NULL); if(ret1 && ret2 && ret3) judge=true; break; } } free(appinfo); } return judge; } bool DefaultApp::setImageViewersDefaultProgram(char *appid){ const char *content_type="image/png"; Appinfo *appinfo = _getAppList(content_type); bool judge = false; if(appinfo != NULL){ for(int i=0;appinfo[i].item!=NULL;i++){ const char *id = g_app_info_get_id(appinfo[i].item); int result = strcmp(id, appid); if(0 == result){ GAppInfo *appitem=appinfo[i].item; gboolean ret1 = g_app_info_set_as_default_for_type(appitem, "image/bmp", NULL); gboolean ret2 = g_app_info_set_as_default_for_type(appitem, "image/gif", NULL); gboolean ret3 = g_app_info_set_as_default_for_type(appitem, "image/jpeg", NULL); gboolean ret4 = g_app_info_set_as_default_for_type(appitem, "image/png", NULL); gboolean ret5 = g_app_info_set_as_default_for_type(appitem, "image/tiff", NULL); if(ret1 && ret2 && ret3 && ret4 && ret5) judge=true; break; } } free(appinfo); } return judge; } bool DefaultApp::setVideoPlayersDefaultProgram(char *appid){ const char *content_type = "video/x-ogm+ogg"; Appinfo * appinfo = _getAppList(content_type); bool judge = false; if(appinfo != NULL){ for(int i = 0; appinfo[i].item != NULL; i++){ const char *id = g_app_info_get_id(appinfo[i].item); int result = strcmp(id,appid); if(0 == result){ GAppInfo *appitem = appinfo[i].item; gboolean ret1 = g_app_info_set_as_default_for_type(appitem, "video/mp4", NULL); gboolean ret2 = g_app_info_set_as_default_for_type(appitem, "video/mpeg", NULL); gboolean ret3 = g_app_info_set_as_default_for_type(appitem, "video/mp2t", NULL); gboolean ret4 = g_app_info_set_as_default_for_type(appitem, "video/msvideo", NULL); gboolean ret5 = g_app_info_set_as_default_for_type(appitem, "video/quicktime", NULL); gboolean ret6 = g_app_info_set_as_default_for_type(appitem, "video/webm", NULL); gboolean ret7 = g_app_info_set_as_default_for_type(appitem, "video/x-avi", NULL); gboolean ret8 = g_app_info_set_as_default_for_type(appitem, "video/x-flv", NULL); gboolean ret9 = g_app_info_set_as_default_for_type(appitem, "video/x-matroska", NULL); gboolean ret10 = g_app_info_set_as_default_for_type(appitem, "video/x-mpeg", NULL); gboolean ret11 = g_app_info_set_as_default_for_type(appitem, "video/x-ogm+ogg", NULL); if(ret1 && ret2 && ret3 && ret4 && ret5 && ret6 && ret7 && ret8 && ret9 && ret10 && ret11) judge=true; break; } } free(appinfo); } return judge; } bool DefaultApp::setAudioPlayersDefaultProgram(char *appid){ const char *content_type = "audio/x-vorbis+ogg"; Appinfo * appinfo = _getAppList(content_type); bool judge = false; if(appinfo != NULL){ for(int i = 0; appinfo[i].item != NULL ;i++){ const char *id = g_app_info_get_id(appinfo[i].item); int result = strcmp(id,appid); if(0 == result) { GAppInfo *appitem=appinfo[i].item; gboolean ret1 = g_app_info_set_as_default_for_type(appitem, "audio/mpeg", NULL); gboolean ret2 = g_app_info_set_as_default_for_type(appitem, "audio/x-mpegurl", NULL); gboolean ret3 = g_app_info_set_as_default_for_type(appitem, "audio/x-scpls", NULL); gboolean ret4 = g_app_info_set_as_default_for_type(appitem, "audio/x-vorbis+ogg", NULL); gboolean ret5 = g_app_info_set_as_default_for_type(appitem, "audio/x-wav", NULL); if(ret1 && ret2 && ret3 && ret4 && ret5) judge=true; break; } } free(appinfo); } return judge; } bool DefaultApp::setTextEditorsDefautlProgram(char *appid){ const char * content_type = "text/plain"; Appinfo * appinfo = _getAppList(content_type); bool judge = false; if(appinfo != NULL){ for(int i = 0; appinfo[i].item != NULL; i++){ const char * id = g_app_info_get_id(appinfo[i].item); int result = strcmp(id,appid); if(0 == result){ GAppInfo *appitem = appinfo[i].item; gboolean ret1 = g_app_info_set_as_default_for_type(appitem, "text/plain", NULL); if(ret1) judge=true; break; } } free(appinfo); } return judge; } ukui-control-center/plugins/system/power/0000755000175000017500000000000013642553044017556 5ustar fengfengukui-control-center/plugins/system/power/power.pro0000644000175000017500000000052713621411724021433 0ustar fengfengQT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(power) DESTDIR = ../../../pluginlibs include(../../../env.pri) INCLUDEPATH += \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lgsettings-qt FORMS += \ power.ui HEADERS += \ power.h \ powermacrodata.h SOURCES += \ power.cpp ukui-control-center/plugins/system/power/power.ui0000644000175000017500000007456313636025744021274 0ustar fengfeng Power 0 0 800 722 0 0 16777215 16777215 Form 0 0 0 30 48 550 0 960 16777215 0 0 0 0 0 8 20 0 0 select power plan true Qt::Vertical QSizePolicy::Fixed 20 8 0 50 16777215 50 0 0 0 0 0 10 16 16 0 0 Balance (suggest) true 0 0 Autobalance energy and performance with available hardware true Qt::Horizontal 40 20 0 0 powerModeBtnGroup 0 50 16777215 50 0 0 0 0 0 10 16 16 0 0 Saving true 0 0 Minimize performance true Qt::Horizontal 40 20 0 0 powerModeBtnGroup 2 0 50 16777215 50 0 0 0 0 0 10 16 16 0 0 Custom true 0 0 Users develop personalized power plans true Qt::Horizontal 40 20 0 0 powerModeBtnGroup 0 118 16777215 118 16 0 0 0 0 24 16 16 0 0 120 36 120 36 Power supply true true powerTypeBtnGroup 0 0 120 36 120 36 Battery powered true true powerTypeBtnGroup Qt::Horizontal 40 20 48 16 16 0 0 200 0 200 16777215 Change pc sleep time: false 0 0 0 32 16777215 32 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } 0 50 16777215 50 0 0 0 0 0 48 16 16 0 0 200 0 200 16777215 Change dp close time: false 0 0 0 32 16777215 32 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Vertical QSizePolicy::Fixed 20 40 0 0 Power Icon Settings 0 50 16777215 50 0 0 0 0 0 48 16 16 0 0 200 0 200 16777215 Power icon: 0 30 16777215 32 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Vertical 20 40 ukui-control-center/plugins/system/power/power.cpp0000644000175000017500000003144413642553044021424 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "power.h" #include "ui_power.h" #include "powermacrodata.h" #include typedef enum { BALANCE, SAVING, CUSTDOM }MODE; typedef enum { PRESENT, ALWAYS }ICONDISPLAY; /** * 平衡:关闭显示器10分钟;计算机进入睡眠30分钟 * 节能:关闭显示器20分钟;计算机进入睡眠2小时 * 自定义 */ #define DISPLAY_BALANCE 10 * 60 #define COMPUTER_BALANCE 30 * 60 #define DISPLAY_SAVING 20 * 60 #define COMPUTER_SAVING 2 * 60 * 60 Power::Power() { ui = new Ui::Power; itemDelege = new QStyledItemDelegate(); pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("power"); pluginType = SYSTEM; settingsCreate = false; const QByteArray id(POWERMANAGER_SCHEMA); setupStylesheet(); setupComponent(); if (QGSettings::isSchemaInstalled(id)){ settingsCreate = true; settings = new QGSettings(id); setupConnect(); initModeStatus(); initIconPolicyStatus(); } else { qCritical() << POWERMANAGER_SCHEMA << "not installed!\n"; } } Power::~Power() { delete ui; if (settingsCreate) delete settings; } QString Power::get_plugin_name(){ return pluginName; } int Power::get_plugin_type(){ return pluginType; } QWidget * Power::get_plugin_ui(){ return pluginWidget; } void Power::plugin_delay_control(){ } void Power::setupStylesheet(){ pluginWidget->setStyleSheet("background: #ffffff;"); ui->balanceWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->savingWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->customWidget->setStyleSheet("QWidget{background: #F4F4F4; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); ui->custom1Widget->setStyleSheet("QWidget{background: #F4F4F4;}"); ui->custom2Widget->setStyleSheet("QWidget{background: #F4F4F4;}" "QWidget#custom2Widget{border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"); ui->acBtn->setStyleSheet("QPushButton#acBtn:checked{background: #3D6BE5; border-radius: 4px; color: #ffffff;}" "QPushButton#acBtn:!checked{background: #ffffff; border-radius: 4px;}"); ui->batteryBtn->setStyleSheet("QPushButton#batteryBtn:checked{background: #3D6BE5; border-radius: 4px; color: #ffffff;}" "QPushButton#batteryBtn:!checked{background: #ffffff; border-radius: 4px; color: #000000;}"); ui->iconWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); } void Power::setupComponent(){ // ui->powerModeBtnGroup->setId(ui->balanceRadioBtn, BALANCE); ui->powerModeBtnGroup->setId(ui->savingRadioBtn, SAVING); ui->powerModeBtnGroup->setId(ui->custdomRadioBtn, CUSTDOM); //电脑睡眠延迟 sleepStringList << tr("never") << tr("10 min") << tr("20 min") << tr("30 min") << tr("60 min") << tr("120 min") << tr("300 min"); // ui->sleepComboBox->addItems(sleepStringList); ui->sleepComboBox->setItemDelegate(itemDelege); ui->sleepComboBox->setMaxVisibleItems(7); ui->sleepComboBox->insertItem(0, sleepStringList.at(0), QVariant::fromValue(0)); ui->sleepComboBox->insertItem(1, sleepStringList.at(1), QVariant::fromValue(10)); ui->sleepComboBox->insertItem(2, sleepStringList.at(2), QVariant::fromValue(20)); ui->sleepComboBox->insertItem(3, sleepStringList.at(3), QVariant::fromValue(30)); ui->sleepComboBox->insertItem(4, sleepStringList.at(4), QVariant::fromValue(60)); ui->sleepComboBox->insertItem(5, sleepStringList.at(5), QVariant::fromValue(120)); ui->sleepComboBox->insertItem(6, sleepStringList.at(6), QVariant::fromValue(300)); //显示器关闭延迟 closeStringList << tr("never") << tr("1 min") << tr("5 min") << tr("10 min") << tr("20 min") << tr("30 min") << tr("60 min") << tr("120 min"); // ui->closeComboBox->addItems(closeStringList); ui->closeComboBox->setItemDelegate(itemDelege); ui->closeComboBox->setMaxVisibleItems(8); ui->closeComboBox->insertItem(0, closeStringList.at(0), QVariant::fromValue(0)); ui->closeComboBox->insertItem(1, closeStringList.at(1), QVariant::fromValue(1)); ui->closeComboBox->insertItem(2, closeStringList.at(2), QVariant::fromValue(5)); ui->closeComboBox->insertItem(3, closeStringList.at(3), QVariant::fromValue(10)); ui->closeComboBox->insertItem(4, closeStringList.at(4), QVariant::fromValue(20)); ui->closeComboBox->insertItem(5, closeStringList.at(5), QVariant::fromValue(30)); ui->closeComboBox->insertItem(6, closeStringList.at(6), QVariant::fromValue(60)); ui->closeComboBox->insertItem(7, closeStringList.at(7), QVariant::fromValue(120)); //默认电源 ui->acBtn->setChecked(true); //电源图标 iconShowList << tr("always") << tr("present"); ui->iconComboBox->setItemDelegate(itemDelege); ui->iconComboBox->setMaxVisibleItems(6); ui->iconComboBox->insertItem(0, iconShowList.at(0), "always"); ui->iconComboBox->insertItem(1, iconShowList.at(1), "present"); //lid // lidStringList << tr("nothing") << tr("blank") << tr("suspend") << tr("shutdown"); // ui->aclidComboBox->addItems(lidStringList); // ui->batlidComboBox->addItems(lidStringList); //button // buttonStringList << tr("interactive") << tr("suspend") << tr("shutdown"); // ui->powerbtnComboBox->addItems(buttonStringList); // ui->suspendComboBox->addItems(buttonStringList); // // ui->icondisplayBtnGroup->setId(ui->presentRadioBtn, PRESENT); // ui->icondisplayBtnGroup->setId(ui->alwaysRadioBtn, ALWAYS); refreshUI(); } void Power::setupConnect(){ connect(ui->powerModeBtnGroup, QOverload::of(&QButtonGroup::buttonClicked), [=](int id){ refreshUI(); if (id == BALANCE){ //设置显示器关闭 settings->set(SLEEP_DISPLAY_AC_KEY, DISPLAY_BALANCE); settings->set(SLEEP_DISPLAY_BATT_KEY, DISPLAY_BALANCE); //设置计算机睡眠 settings->set(SLEEP_COMPUTER_AC_KEY, COMPUTER_BALANCE); settings->set(SLEEP_COMPUTER_BATT_KEY, COMPUTER_BALANCE); } else if (id == SAVING){ //设置显示器关闭 settings->set(SLEEP_DISPLAY_AC_KEY, DISPLAY_SAVING); settings->set(SLEEP_DISPLAY_BATT_KEY, DISPLAY_SAVING); //设置计算机睡眠 settings->set(SLEEP_COMPUTER_AC_KEY, COMPUTER_SAVING); settings->set(SLEEP_COMPUTER_BATT_KEY, COMPUTER_SAVING); } else { resetCustomPlanStatus(); } }); connect(ui->powerTypeBtnGroup, QOverload::of(&QButtonGroup::buttonClicked), this, [=]{ initCustomPlanStatus(); }); connect(ui->sleepComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index){ Q_UNUSED(index) int value = ui->sleepComboBox->currentData(Qt::UserRole).toInt() * 60; if (ui->acBtn->isChecked()){ settings->set(SLEEP_COMPUTER_AC_KEY, QVariant(value)); } if (ui->batteryBtn->isChecked()){ settings->set(SLEEP_COMPUTER_BATT_KEY, QVariant(value)); } }); connect(ui->closeComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index){ Q_UNUSED(index) int value = ui->closeComboBox->currentData(Qt::UserRole).toInt() * 60; if (ui->acBtn->isChecked()){ settings->set(SLEEP_DISPLAY_AC_KEY, QVariant(value)); } if (ui->batteryBtn->isChecked()){ settings->set(SLEEP_DISPLAY_BATT_KEY, QVariant(value)); } }); connect(ui->iconComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index){ Q_UNUSED(index) QString value = ui->iconComboBox->currentData(Qt::UserRole).toString(); settings->set(ICONPOLICY, value); }); } void Power::initModeStatus(){ int acsleep = settings->get(SLEEP_COMPUTER_AC_KEY).toInt(); int acclose = settings->get(SLEEP_DISPLAY_AC_KEY).toInt(); int batsleep = settings->get(SLEEP_COMPUTER_BATT_KEY).toInt(); int batclose = settings->get(SLEEP_DISPLAY_BATT_KEY).toInt(); if (acsleep == COMPUTER_BALANCE && batsleep == COMPUTER_BALANCE && acclose == DISPLAY_BALANCE && batclose == DISPLAY_BALANCE){ ui->balanceRadioBtn->setChecked(true); } else if (acsleep == COMPUTER_SAVING && batsleep == COMPUTER_SAVING && acclose == DISPLAY_SAVING && batclose == DISPLAY_SAVING){ ui->savingRadioBtn->setChecked(true); } else { ui->custdomRadioBtn->setChecked(true); // ui->acBtn->setChecked(true); initCustomPlanStatus(); } refreshUI(); } void Power::initIconPolicyStatus(){ QString value = settings->get(ICONPOLICY).toString(); ui->iconComboBox->blockSignals(true); ui->iconComboBox->setCurrentIndex(ui->iconComboBox->findData(value)); ui->iconComboBox->blockSignals(false); } void Power::resetCustomPlanStatus(){ //当其他电源计划切换至自定义时,默认状态为从不 //设置显示器关闭 settings->set(SLEEP_DISPLAY_AC_KEY, 0); settings->set(SLEEP_DISPLAY_BATT_KEY, 0); //设置计算机睡眠 settings->set(SLEEP_COMPUTER_AC_KEY, 0); settings->set(SLEEP_COMPUTER_BATT_KEY, 0); ui->acBtn->setChecked(true); initCustomPlanStatus(); } void Power::initCustomPlanStatus(){ //信号阻塞 ui->sleepComboBox->blockSignals(true); ui->closeComboBox->blockSignals(true); if (ui->acBtn->isChecked()){ //计算机睡眠延迟 int acsleep = settings->get(SLEEP_COMPUTER_AC_KEY).toInt() / FIXES; ui->sleepComboBox->setCurrentIndex(ui->sleepComboBox->findData(acsleep)); //显示器关闭延迟 int acclose = settings->get(SLEEP_DISPLAY_AC_KEY).toInt() / FIXES; ui->closeComboBox->setCurrentIndex(ui->closeComboBox->findData(acclose)); } if (ui->batteryBtn->isChecked()){ //计算机睡眠延迟 int batsleep = settings->get(SLEEP_COMPUTER_BATT_KEY).toInt() / FIXES; ui->sleepComboBox->setCurrentIndex(ui->sleepComboBox->findData(batsleep)); //显示器关闭延迟 int batclose = settings->get(SLEEP_DISPLAY_BATT_KEY).toInt() / FIXES; ui->closeComboBox->setCurrentIndex(ui->closeComboBox->findData(batclose)); } //信号阻塞解除 ui->sleepComboBox->blockSignals(false); ui->closeComboBox->blockSignals(false); //lid 枚举类型但是toint为零只能toString // QString aclidString = settings->get(BUTTON_LID_AC_KEY).toString(); // ui->aclidComboBox->setCurrentText(aclidString); // QString batlidString = settings->get(BUTTON_LID_BATT_KET).toString(); // ui->batlidComboBox->setCurrentText(batlidString); //power button // QString powerbtn = settings->get(BUTTON_POWER_KEY).toString(); // ui->powerbtnComboBox->setCurrentText(powerbtn); // QString suspentbtn = settings->get(BUTTON_SUSPEND_KEY).toString(); // ui->suspendComboBox->setCurrentText(suspentbtn); //电池图标 枚举类型但是toint为零只能toString // QString ipvalue = settings->get(ICONPOLICY).toString(); // if (ipvalue == PRESENT_VALUE) // ui->presentRadioBtn->setChecked(true); // else if (ipvalue == ALWAYS_VALUE) // ui->alwaysRadioBtn->setChecked(true); } void Power::refreshUI(){ if (ui->powerModeBtnGroup->checkedId() != CUSTDOM){ // ui->custom1Widget->setEnabled(false); // ui->custom2Widget->setEnabled(false); ui->custom1Widget->hide(); ui->custom2Widget->hide(); ui->customWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); } else { // ui->custom1Widget->setEnabled(true); // ui->custom2Widget->setEnabled(true); ui->custom1Widget->show(); ui->custom2Widget->show(); ui->customWidget->setStyleSheet("QWidget{background: #F4F4F4; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); } } ukui-control-center/plugins/system/power/powermacrodata.h0000644000175000017500000000274013621411724022735 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef POWERMACRODATA_H #define POWERMACRODATA_H #define POWERMANAGER_SCHEMA "org.ukui.power-manager" #define ICONPOLICY "icon-policy" #define SLEEP_COMPUTER_AC_KEY "sleep-computer-ac" #define SLEEP_COMPUTER_BATT_KEY "sleep-computer-battery" #define SLEEP_DISPLAY_AC_KEY "sleep-display-ac" #define SLEEP_DISPLAY_BATT_KEY "sleep-display-battery" #define BUTTON_LID_AC_KEY "button-lid-ac" #define BUTTON_LID_BATT_KET "button-lid-battery" #define BUTTON_SUSPEND_KEY "button-suspend" #define BUTTON_POWER_KEY "button-power" #define PRESENT_VALUE "present" #define ALWAYS_VALUE "always" #define FIXES 60 #endif // POWERMACRODATA_H ukui-control-center/plugins/system/power/power.h0000644000175000017500000000407213642553044021066 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef POWER_H #define POWER_H #include #include #include #include #include "shell/interface.h" namespace Ui { class Power; } class Power : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: explicit Power(); ~Power(); public: QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupStylesheet(); void setupComponent(); void setupConnect(); void initModeStatus(); void initCustomPlanStatus(); void resetCustomPlanStatus(); void initIconPolicyStatus(); void refreshUI(); private: Ui::Power *ui; private: QWidget * pluginWidget; private: QGSettings * settings; QString pluginName; int pluginType; QStringList sleepStringList; QStringList closeStringList; QStringList lidStringList; QStringList buttonStringList; QStringList iconShowList; QStyledItemDelegate *itemDelege; private: bool settingsCreate; }; #endif // POWER_H ukui-control-center/plugins/personalized/0000755000175000017500000000000013621411724017570 5ustar fengfengukui-control-center/plugins/personalized/fonts/0000755000175000017500000000000013642652167020734 5ustar fengfengukui-control-center/plugins/personalized/fonts/fonts.ui0000644000175000017500000012760013642652167022432 0ustar fengfeng Fonts 0 0 817 1138 0 0 16777215 16777215 Fonts 10 0 0 32 30 0 0 Fonts true Qt::Vertical QSizePolicy::Fixed 20 6 550 80 960 80 0 0 0 0 0 0 16 0 0 140 0 140 16777215 Font size 400 0 400 16777215 11 16 1 1 11 Qt::Horizontal Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 2 550 100 960 100 0 0 0 0 0 9 16 0 16 0 0 0 0 140 0 140 16777215 Fonts select 400 30 16777215 32 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } 541 0 1677215 16777215 Qt::Horizontal 0 0 0 140 0 140 16777215 Monospace font 400 30 1677215 32 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Vertical QSizePolicy::Fixed 20 14 0 120 36 120 36 Advanced settings true Qt::Horizontal 40 20 550 250 960 250 0 0 0 0 0 9 16 0 10 0 0 0 0 140 0 140 16777215 Gtk default font 240 30 240 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Horizontal QSizePolicy::Fixed 16 20 144 30 240 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Horizontal 40 20 541 0 541 16777215 Qt::Horizontal 0 0 0 140 0 140 16777215 Document font 240 30 240 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Horizontal QSizePolicy::Fixed 16 20 144 30 144 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Horizontal 40 20 541 0 541 16777215 Qt::Horizontal 0 0 0 140 0 140 16777215 Monospace font 240 30 240 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Horizontal QSizePolicy::Fixed 16 20 144 30 144 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Horizontal 40 20 541 0 541 16777215 Qt::Horizontal 0 0 0 140 0 140 16777215 Peony font 240 30 240 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Horizontal QSizePolicy::Fixed 16 20 144 30 144 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Horizontal 40 20 541 0 541 16777215 Qt::Horizontal 0 0 0 140 0 140 16777215 titlebar font 240 30 240 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Horizontal QSizePolicy::Fixed 16 20 144 30 144 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 38 0 0 Select text sample that looks clearest true Qt::Vertical QSizePolicy::Fixed 20 6 16 267 110 267 110 true sampleBtnGroup 267 110 267 110 true sampleBtnGroup Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 6 16 267 110 267 110 true sampleBtnGroup 267 110 267 110 true sampleBtnGroup Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 38 0 120 36 120 36 Reset to default Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 40 Qt::Vertical 20 40 ukui-control-center/plugins/personalized/fonts/fonts.cpp0000644000175000017500000006336513642652167022606 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "fonts.h" #include "ui_fonts.h" #include #include #define N 3 #define SMALL 1.00 #define MEDIUM 1.25 #define LARGE 1.50 #define INTERFACE_SCHEMA "org.mate.interface" #define DOC_FONT_KEY "document-font-name" //用于阅读文档的默认字体的名称 #define GTK_FONT_KEY "font-name" //gkt+使用的默认字体 #define MONOSPACE_FONT_KEY "monospace-font-name" //用于终端等处的等宽字体 #define MARCO_SCHEMA "org.gnome.desktop.wm.preferences" #define TITLEBAR_FONT_KEY "titlebar-font" //描述窗口标题栏字体的字符串。只有在"titlebar-uses-system-font"为false时有效 #define PEONY_SCHEMA "org.ukui.style" #define PEONY_FONT_KEY "system-font" //桌面上图标描述所用的字体 #define PEONY_FONT_SIZE_KEY "system-font-size" #define FONT_RENDER_SCHEMA "org.ukui.font-rendering" #define ANTIALIASING_KEY "antialiasing" //绘制字形时使用反锯齿类型 #define HINTING_KEY "hinting" //绘制字形时使用微调的类型 #define RGBA_ORDER_KEY "rgba-order" //LCD屏幕上次像素的顺序;仅在反锯齿设为"rgba"时有用 #define DPI_KEY "dpi" //将字体尺寸转换为像素值时所用的分辨率,以每英寸点数为单位 /* 设置字体,每套字体包括5个部件,应用程序字体、文档字体、等宽字体、桌面字体和窗口标题字体。 字体设置为预设值,每套字体除大小不固定,其他字体类别固定。 */ typedef struct _FontInfo FontInfo; struct _FontInfo{ QString type; QString gtkfont; QString docfont; QString monospacefont; QString peonyfont; QString titlebarfont; int gtkfontsize; int docfontsize; int monospacefontsize; int peonyfontsize; int titlebarfontsize; }; FontInfo defaultfontinfo; //字体效果 typedef enum{ ANTIALIASING_NONE, ANTIALIASING_GRAYSCALE, ANTIALIASING_RGBA }Antialiasing; typedef enum{ HINT_NONE, HINT_SLIGHT, HINT_MEDIUM, HINT_FULL }Hinting; struct FontEffects : QObjectUserData { Antialiasing antial; Hinting hinting; }; QList defaultsizeList = {6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72}; Fonts::Fonts() { ui = new Ui::Fonts; itemDelege = new QStyledItemDelegate(); pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("fonts"); pluginType = PERSONALIZED; settingsCreate = false; setupStylesheet(); const QByteArray id(INTERFACE_SCHEMA); const QByteArray idd(MARCO_SCHEMA); const QByteArray iid(FONT_RENDER_SCHEMA); const QByteArray iddd(PEONY_SCHEMA); if (QGSettings::isSchemaInstalled(id) && QGSettings::isSchemaInstalled(iid) && QGSettings::isSchemaInstalled(idd) && QGSettings::isSchemaInstalled(iddd)){ settingsCreate = true; marcosettings = new QGSettings(idd); ifsettings = new QGSettings(id); rendersettings = new QGSettings(iid); peonysettings = new QGSettings(iddd); _getDefaultFontinfo(); setupComponent(); setupConnect(); initFontStatus(); } } Fonts::~Fonts() { delete ui; if (settingsCreate){ delete ifsettings; delete marcosettings; delete peonysettings; delete rendersettings; } } QString Fonts::get_plugin_name(){ return pluginName; } int Fonts::get_plugin_type(){ return pluginType; } QWidget *Fonts::get_plugin_ui(){ return pluginWidget; } void Fonts::plugin_delay_control(){ } void Fonts::setupStylesheet(){ pluginWidget->setStyleSheet("background: #ffffff;"); ui->fontSizeWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 4px;}"); // ui->fontSizeLabel->setStyleSheet("QLabel{background: #F4F4F4;}"); ui->fontTypeWidget->setStyleSheet("QWidget#fontTypeWidget{background: #F4F4F4; border-radius: 4px;}"); ui->fontSelectLabel->setStyleSheet("QLabel{background: #F4F4F4;}"); ui->monoSelectLabel->setStyleSheet("QLabel{background: #F4F4F4;}"); ui->fontSizeSlider->setStyleSheet("QSlider{height: 20px;}" "QSlider::groove:horizontal{border: none;}" "QSlider::add-page:horizontal{background: #808080; border-radius: 2px; margin-top: 8px; margin-bottom: 9px;}" "QSlider::sub-page:horizontal{background: #3D6BE5; border-radius: 2px; margin-top: 8px; margin-bottom: 9px;}" "QSlider::handle:horizontal{width: 20px; height: 20px; border-image: url(:/img/plugins/fonts/bigRoller.png);}" ""); ui->advancedBtn->setStyleSheet("QPushButton#advancedBtn{background: #F4F4F4; border: none; border-radius: 4px;}"); ui->advancedWidget->setStyleSheet("QWidget#advancedWidget{background: #F4F4F4; border-radius: 4px;}"); ui->defaultFontLabel->setStyleSheet("QLabel{background: #F4F4F4;}"); ui->monoFontLabel->setStyleSheet("QLabel{background: #F4F4F4;}"); ui->docFontLabel->setStyleSheet("QLabel{background: #F4F4F4;}"); ui->peonyFontLabel->setStyleSheet("QLabel{background: #F4F4F4;}"); ui->titleFontLabel->setStyleSheet("QLabel{background: #F4F4F4;}"); ui->sampleBtn1->setStyleSheet("QPushButton{background: #F0F0F0; border-radius: 4px;}" "QPushButton:checked{background: #F0F3FD; border-radius: 4px;}"); ui->sampleBtn2->setStyleSheet("QPushButton{background: #F0F0F0; border-radius: 4px;}" "QPushButton:checked{background: #F0F3FD; border-radius: 4px;}"); ui->sampleBtn3->setStyleSheet("QPushButton{background: #F0F0F0; border-radius: 4px;}" "QPushButton:checked{background: #F0F3FD; border-radius: 4px;}"); ui->sampleBtn4->setStyleSheet("QPushButton{background: #F0F0F0; border-radius: 4px;}" "QPushButton:checked{background: #F0F3FD; border-radius: 4px;}"); } void Fonts::setupComponent(){ ui->fontSelectComBox->setItemDelegate(itemDelege); ui->fontSelectComBox->setMaxVisibleItems(5); ui->monoSelectComBox->setItemDelegate(itemDelege); ui->monoSelectComBox->setMaxVisibleItems(5); ui->defaultFontComBox->setItemDelegate(itemDelege); ui->defaultFontComBox->setMaxVisibleItems(5); ui->docFontComBox->setItemDelegate(itemDelege); ui->docFontComBox->setMaxVisibleItems(5); ui->peonyFontComBox->setItemDelegate(itemDelege); ui->peonyFontComBox->setMaxVisibleItems(5); ui->monoFontComBox->setItemDelegate(itemDelege); ui->monoFontComBox->setMaxVisibleItems(5); ui->titleFontComBox->setItemDelegate(itemDelege); ui->titleFontComBox->setMaxVisibleItems(5); ui->defaultSizeComBox->setItemDelegate(itemDelege); ui->defaultSizeComBox->setMaxVisibleItems(5); ui->docSizeComBox->setItemDelegate(itemDelege); ui->docSizeComBox->setMaxVisibleItems(5); ui->MonoSizeComBox->setItemDelegate(itemDelege); ui->MonoSizeComBox->setMaxVisibleItems(5); ui->peonySizeComBox->setItemDelegate(itemDelege); ui->peonySizeComBox->setMaxVisibleItems(5); ui->titleSizeComBox->setItemDelegate(itemDelege); ui->titleSizeComBox->setMaxVisibleItems(5); // ui->fontSizeSlider->setMinimum(100); // ui->fontSizeSlider->setMaximum(275); // ui->fontSizeSlider->setSingleStep(25); // ui->fontSizeSlider->setPageStep(25); ui->fontSizeSlider->setTickPosition(QSlider::TicksBelow); //导入系统字体列表 QStringList fontfamiles = fontdb.families(); for (QString font : fontfamiles){ ////通用设置 //字体 ui->fontSelectComBox->addItem(font); //等宽字体 ui->monoSelectComBox->addItem(font); ////高级设置 // gtk default ui->defaultFontComBox->addItem(font); //doc font ui->docFontComBox->addItem(font); // peony font ui->peonyFontComBox->addItem(font); //monospace font ui->monoFontComBox->addItem(font); //title font ui->titleFontComBox->addItem(font); } ////导入字体大小列表 //获取当前字体 QStringList gtkfontStrList = _splitFontNameSize(ifsettings->get(GTK_FONT_KEY).toString()); QStringList docfontStrList = _splitFontNameSize(ifsettings->get(DOC_FONT_KEY).toString()); QStringList monospacefontStrList = _splitFontNameSize(ifsettings->get(MONOSPACE_FONT_KEY).toString()); // QStringList peonyfontStrList = _splitFontNameSize(peonysettings->get(PEONY_FONT_KEY).toString()); QStringList titlebarfontStrList = _splitFontNameSize(marcosettings->get(TITLEBAR_FONT_KEY).toString()); QList gtksizeList = fontdb.pointSizes(gtkfontStrList.at(0)); QList docsizeList = fontdb.pointSizes(docfontStrList.at(0)); QList monosizeList = fontdb.pointSizes(monospacefontStrList.at(0)); QList peonysizeList = fontdb.pointSizes(peonysettings->get(PEONY_FONT_KEY).toString()); QList titlesizeList = fontdb.pointSizes(titlebarfontStrList.at(0)); if (gtksizeList.length() == 0) gtksizeList = defaultsizeList; for (int size : gtksizeList) ui->defaultSizeComBox->addItem(QString::number(size)); if (docsizeList.length() == 0) docsizeList = defaultsizeList; for (int size : docsizeList) ui->docSizeComBox->addItem(QString::number(size)); if (monosizeList.length() == 0) monosizeList = defaultsizeList; for (int size : monosizeList) ui->MonoSizeComBox->addItem(QString::number(size)); if (peonysizeList.length() == 0) peonysizeList = defaultsizeList; for (int size : peonysizeList) ui->peonySizeComBox->addItem(QString::number(size)); if (titlesizeList.length() == 0) titlesizeList = defaultsizeList; for (int size : titlesizeList) ui->titleSizeComBox->addItem(QString::number(size)); //设置高级配置是否显示 ui->advancedWidget->setVisible(ui->advancedBtn->isChecked()); //init sample button FontEffects * example1 = new FontEffects(); FontEffects * example2 = new FontEffects(); FontEffects * example3 = new FontEffects(); FontEffects * example4 = new FontEffects(); example1->antial = ANTIALIASING_NONE; example1->hinting = HINT_FULL; example2->antial = ANTIALIASING_GRAYSCALE; example2->hinting = HINT_FULL; example3->antial = ANTIALIASING_GRAYSCALE; example3->hinting = HINT_MEDIUM; example4->antial = ANTIALIASING_RGBA; example4->hinting = HINT_FULL; ui->sampleBtn1->setUserData(Qt::UserRole, example1); ui->sampleBtn2->setUserData(Qt::UserRole, example2); ui->sampleBtn3->setUserData(Qt::UserRole, example3); ui->sampleBtn4->setUserData(Qt::UserRole, example4); // setSampleButton(ui->sampleBtn1); } void Fonts::setSampleButton(QPushButton *button){ QVBoxLayout * base1VerLayout = new QVBoxLayout(button); base1VerLayout->setSpacing(12); base1VerLayout->setMargin(0); // QFont font; // font.setHintingPreference(QFont::PreferNoHinting); QLabel * enLabel = new QLabel(button); enLabel->setText("Thanks For Using The ukcc"); enLabel->setAlignment(Qt::AlignCenter); QLabel * cnLabel = new QLabel(button); cnLabel->setText(tr("Thanks For Using The ukcc")); cnLabel->setAlignment(Qt::AlignCenter); base1VerLayout->addWidget(enLabel); base1VerLayout->addWidget(cnLabel); button->setLayout(base1VerLayout); } void Fonts::setupConnect(){ // connect(ui->fontSizeSlider, &QSlider::sliderReleased, [=]{ // int value = ui->fontSizeSlider->value(); // int setup = value / 25; int overage = value % 25; // if (overage > 12) // ui->fontSizeSlider->setSliderPosition(ui->fontSizeSlider->singleStep() * (setup + 1)); // else // ui->fontSizeSlider->setSliderPosition(ui->fontSizeSlider->singleStep() * setup); // }); connect(ui->fontSizeSlider, &QSlider::valueChanged, [=](int value){ //获取当前字体信息 _getCurrentFontInfo(); //设置字体大小 ifsettings->set(GTK_FONT_KEY, QVariant(QString("%1 %2").arg(gtkfontStrList.at(0)).arg(QString::number(value)))); ifsettings->set(DOC_FONT_KEY, QVariant(QString("%1 %2").arg(docfontStrList.at(0)).arg(QString::number(value)))); ifsettings->set(MONOSPACE_FONT_KEY, QVariant(QString("%1 %2").arg(monospacefontStrList.at(0)).arg(QString::number(value)))); // peonysettings->set(PEONY_FONT_KEY, QVariant(QString("%1 %2").arg(peonyfontStrList[0]).arg(defaultfontinfo.monospacefontsize * level))); peonysettings->set(PEONY_FONT_SIZE_KEY, QString::number(value)); marcosettings->set(TITLEBAR_FONT_KEY, QVariant(QString("%1 %2").arg(titlebarfontStrList.at(0)).arg(QString::number(value)))); //给更新高级字体配置 initAdvancedFontStatus(); }); connect(ui->fontSelectComBox, &QComboBox::currentTextChanged, [=](QString text){ //获取当前字体信息 _getCurrentFontInfo(); ifsettings->set(GTK_FONT_KEY, QVariant(QString("%1 %2").arg(text).arg(gtkfontStrList.at(1)))); ifsettings->set(DOC_FONT_KEY, QVariant(QString("%1 %2").arg(text).arg(docfontStrList.at(1)))); // peonysettings->set(PEONY_FONT_KEY, QVariant(QString("%1 %2").arg(text).arg(peonyfontStrList.at(1)))); peonysettings->set(PEONY_FONT_KEY, text); marcosettings->set(TITLEBAR_FONT_KEY, QVariant(QString("%1 %2").arg(text).arg(titlebarfontStrList.at(1)))); //给更新高级字体配置 initAdvancedFontStatus(); }); connect(ui->monoSelectComBox, &QComboBox::currentTextChanged, [=](QString text){ //获取当前字体信息 _getCurrentFontInfo(); ifsettings->set(MONOSPACE_FONT_KEY, QVariant(QString("%1 %2").arg(text).arg(monospacefontStrList.at(1)))); //更新高级字体配置 initAdvancedFontStatus(); }); //高级字体按钮状态 connect(ui->advancedBtn, &QPushButton::clicked, this, [=]{ ui->advancedWidget->setVisible(ui->advancedBtn->isChecked()); }); connect(ui->defaultFontComBox, &QComboBox::currentTextChanged, [=](QString text){ _getCurrentFontInfo(); ifsettings->set(GTK_FONT_KEY, QVariant(QString("%1 %2").arg(text).arg(gtkfontStrList.at(1)))); }); connect(ui->docFontComBox, &QComboBox::currentTextChanged, [=](QString text){ _getCurrentFontInfo(); ifsettings->set(DOC_FONT_KEY, QVariant(QString("%1 %2").arg(text).arg(docfontStrList.at(1)))); }); connect(ui->monoFontComBox, &QComboBox::currentTextChanged, [=](QString text){ _getCurrentFontInfo(); ifsettings->set(MONOSPACE_FONT_KEY, QVariant(QString("%1 %2").arg(text).arg(monospacefontStrList.at(1)))); }); connect(ui->peonyFontComBox, &QComboBox::currentTextChanged, [=](QString text){ peonysettings->set(PEONY_FONT_KEY, QVariant(text)); }); connect(ui->titleFontComBox, &QComboBox::currentTextChanged, [=](QString text){ _getCurrentFontInfo(); marcosettings->set(TITLEBAR_FONT_KEY, QVariant(QString("%1 %2").arg(text).arg(titlebarfontStrList.at(1)))); }); connect(ui->defaultSizeComBox, &QComboBox::currentTextChanged, [=](QString text){ _getCurrentFontInfo(); ifsettings->set(GTK_FONT_KEY, QVariant(QString("%1 %2").arg(gtkfontStrList.at(0)).arg(text))); }); connect(ui->docSizeComBox, &QComboBox::currentTextChanged, [=](QString text){ _getCurrentFontInfo(); ifsettings->set(DOC_FONT_KEY, QVariant(QString("%1 %2").arg(docfontStrList.at(0)).arg(text))); }); connect(ui->titleSizeComBox, &QComboBox::currentTextChanged, [=](QString text){ _getCurrentFontInfo(); marcosettings->set(TITLEBAR_FONT_KEY, QVariant(QString("%1 %2").arg(titlebarfontStrList.at(0)).arg(text))); }); connect(ui->peonySizeComBox, &QComboBox::currentTextChanged, [=](QString text){ peonysettings->set(PEONY_FONT_SIZE_KEY, QVariant(text)); }); connect(ui->MonoSizeComBox, &QComboBox::currentTextChanged, [=](QString text){ _getCurrentFontInfo(); ifsettings->set(MONOSPACE_FONT_KEY, QVariant(QString("%1 %2").arg(monospacefontStrList.at(0)).arg(text))); }); ////绑定信号 //字体效果按钮 connect(ui->sampleBtnGroup, QOverload::of(&QButtonGroup::buttonClicked), [=](QAbstractButton * button){ setFontEffect(button); }); //重置按钮 connect(ui->resetBtn, &QPushButton::clicked, [=](bool checked){ Q_UNUSED(checked) resetDefault(); }); } void Fonts::initFontStatus(){ //初始化字体ComBox状态 initGeneralFontStatus(); //初始化高级字体ComBox状态 initAdvancedFontStatus(); //初始化示例按钮状态 initSampleFontStatus(); } void Fonts::initGeneralFontStatus(){ //获取当前字体信息 _getCurrentFontInfo(); //初始化字体选择ComBox(选择gtk默认字体作为标准) QString currentfonts = gtkfontStrList[0]; ui->fontSelectComBox->blockSignals(true); ui->fontSelectComBox->setCurrentText(currentfonts); ui->fontSelectComBox->blockSignals(false); //初始化等宽字体ComBox QString currentmonofont = monospacefontStrList[0]; ui->monoSelectComBox->blockSignals(true); ui->monoSelectComBox->setCurrentText(currentmonofont); ui->monoSelectComBox->blockSignals(false); //获取字体大小倍率,选择文档字体大小作为标准,来自gtk控制面板的逻辑 // float res = QString(docfontStrList[1]).toFloat() / (float)defaultfontinfo.docfontsize; // int value = int(res * 100); int value = QString(docfontStrList.at(1)).toInt(); ui->fontSizeSlider->blockSignals(true); ui->fontSizeSlider->setValue(value); ui->fontSizeSlider->blockSignals(false); } void Fonts::initAdvancedFontStatus(){ //获取当前字体信息 _getCurrentFontInfo(); //阻塞信号 ui->defaultFontComBox->blockSignals(true); ui->docFontComBox->blockSignals(true); ui->monoFontComBox->blockSignals(true); ui->peonyFontComBox->blockSignals(true); ui->titleFontComBox->blockSignals(true); //初始化高级字体ComBox ui->defaultFontComBox->setCurrentText(gtkfontStrList.at(0)); ui->docFontComBox->setCurrentText(docfontStrList.at(0)); ui->monoFontComBox->setCurrentText(monospacefontStrList.at(0)); ui->peonyFontComBox->setCurrentText(peonysettings->get(PEONY_FONT_KEY).toString()); ui->titleFontComBox->setCurrentText(titlebarfontStrList.at(0)); //释放信号 ui->defaultFontComBox->blockSignals(false); ui->docFontComBox->blockSignals(false); ui->monoFontComBox->blockSignals(false); ui->peonyFontComBox->blockSignals(false); ui->titleFontComBox->blockSignals(false); //阻塞字体大小ComBox信号 ui->defaultSizeComBox->blockSignals(true); ui->docSizeComBox->blockSignals(true); ui->MonoSizeComBox->blockSignals(true); ui->peonySizeComBox->blockSignals(true); ui->titleSizeComBox->blockSignals(true); ui->defaultSizeComBox->setCurrentText(gtkfontStrList.at(1)); ui->docSizeComBox->setCurrentText(docfontStrList.at(1)); ui->MonoSizeComBox->setCurrentText(monospacefontStrList.at(1)); ui->peonySizeComBox->setCurrentText(peonysettings->get(PEONY_FONT_SIZE_KEY).toString()); ui->titleSizeComBox->setCurrentText(titlebarfontStrList.at(1)); //阻塞字体大小ComBox信号 ui->defaultSizeComBox->blockSignals(false); ui->docSizeComBox->blockSignals(false); ui->MonoSizeComBox->blockSignals(false); ui->peonySizeComBox->blockSignals(false); ui->titleSizeComBox->blockSignals(false); } void Fonts::initSampleFontStatus(){ //初始化字体效果按钮 GSettings * settings = g_settings_new(FONT_RENDER_SCHEMA); int currentantial = g_settings_get_enum(settings, ANTIALIASING_KEY); int currenthinting = g_settings_get_enum(settings, HINTING_KEY); QList buttonsList = ui->sampleBtnGroup->buttons(); for (int num = 0; num < buttonsList.size(); num++){ FontEffects * btnFontEffects = (FontEffects *)((QPushButton *)buttonsList[num])->userData(Qt::UserRole); if (currentantial == btnFontEffects->antial && currenthinting == btnFontEffects->hinting){ QPushButton * button = ((QPushButton *)buttonsList[num]); button->blockSignals(true); button->setChecked(true); button->blockSignals(false); } } g_object_unref(settings); } void Fonts::_getDefaultFontinfo(){ GVariant * value; const char * font_value; gsize size; gint length; //GTK FONT GSettings * ifgsettings; ifgsettings = g_settings_new(INTERFACE_SCHEMA); value = g_settings_get_default_value(ifgsettings, GTK_FONT_KEY); size = g_variant_get_size(value); font_value = g_variant_get_string(value, &size); length = (gint)strlen(font_value); if (font_value[length-2] == ' '){ defaultfontinfo.gtkfontsize = atoi(&font_value[length - 1]); } else defaultfontinfo.gtkfontsize = atoi(&font_value[length - 2]); g_variant_unref(value); //DOC FONT value = g_settings_get_default_value(ifgsettings, DOC_FONT_KEY); size = g_variant_get_size(value); font_value = g_variant_get_string(value, &size); length = (gint)strlen(font_value); if (font_value[length -2] == ' ') defaultfontinfo.docfontsize = atoi(&font_value[length -1]); else defaultfontinfo.docfontsize = atoi(&font_value[length -2]); g_variant_unref(value); //MON value = g_settings_get_default_value(ifgsettings, MONOSPACE_FONT_KEY); size = g_variant_get_size(value); font_value = g_variant_get_string(value, &size); length = (gint)strlen(font_value); if (font_value[length -2] == ' ') defaultfontinfo.monospacefontsize = atoi(&font_value[length -1]); else defaultfontinfo.monospacefontsize = atoi(&font_value[length -2]); g_variant_unref(value); //PEONY GSettings * peonygsettings; peonygsettings = g_settings_new(PEONY_SCHEMA); defaultfontinfo.peonyfontsize = g_settings_get_int(peonygsettings, PEONY_FONT_SIZE_KEY); // value = g_settings_get_default_value(peonygsettings, PEONY_FONT_KEY); // size = g_variant_get_size(value); // font_value = g_variant_get_string(value, &size); // length = (gint)strlen(font_value); // if (font_value[length -2] == ' ') // defaultfontinfo.peonyfontsize = atoi(&font_value[length -1]); // else // defaultfontinfo.peonyfontsize = atoi(&font_value[length -2]); // g_variant_unref(value); //TITLE GSettings * marcogsettings; marcogsettings = g_settings_new(MARCO_SCHEMA); value = g_settings_get_default_value(marcogsettings, TITLEBAR_FONT_KEY); size = g_variant_get_size(value); font_value = g_variant_get_string(value, &size); length = (gint)strlen(font_value); if (font_value[length -2] == ' ') defaultfontinfo.titlebarfontsize = atoi(&font_value[length -1]); else defaultfontinfo.titlebarfontsize = atoi(&font_value[length -2]); g_variant_unref(value); g_object_unref(ifgsettings); g_object_unref(peonygsettings); g_object_unref(marcogsettings); } void Fonts::_getCurrentFontInfo(){ gtkfontStrList = _splitFontNameSize(ifsettings->get(GTK_FONT_KEY).toString()); docfontStrList = _splitFontNameSize(ifsettings->get(DOC_FONT_KEY).toString()); monospacefontStrList = _splitFontNameSize(ifsettings->get(MONOSPACE_FONT_KEY).toString()); // peonyfontStrList = _splitFontNameSize(peonysettings->get(PEONY_FONT_KEY).toString()); titlebarfontStrList = _splitFontNameSize(marcosettings->get(TITLEBAR_FONT_KEY).toString()); } QStringList Fonts::_splitFontNameSize(QString value){ QStringList valueStringList; if (value.right(1) >= '0' && value.right(1) <= '9'){ QStringList tmpStringList = value.split(' '); QString::SectionFlag flag = QString::SectionSkipEmpty; valueStringList << value.section(' ', 0, tmpStringList.length() - 2, flag); valueStringList << value.section(' ', tmpStringList.length() - 1, tmpStringList.length() - 1, flag); } else{ valueStringList << value << "10"; } return valueStringList; } void Fonts::setFontEffect(QAbstractButton *button){ QPushButton * btnclicked = (QPushButton *)button; FontEffects * setFontEffects = (FontEffects *)(btnclicked->userData(Qt::UserRole)); GSettings * settings = g_settings_new(FONT_RENDER_SCHEMA); g_settings_set_enum(settings, ANTIALIASING_KEY, setFontEffects->antial); g_settings_set_enum(settings, HINTING_KEY, setFontEffects->hinting); g_object_unref(settings); } void Fonts::resetDefault(){ //reset font ifsettings->reset(GTK_FONT_KEY); ifsettings->reset(DOC_FONT_KEY); ifsettings->reset(MONOSPACE_FONT_KEY); peonysettings->reset(PEONY_FONT_KEY); peonysettings->reset(PEONY_FONT_SIZE_KEY); marcosettings->reset(TITLEBAR_FONT_KEY); //reset font render rendersettings->reset(ANTIALIASING_KEY); rendersettings->reset(HINTING_KEY); //更新全部状态 initFontStatus(); } ukui-control-center/plugins/personalized/fonts/fonts.h0000644000175000017500000000530613640373121022226 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef FONTS_H #define FONTS_H #include #include #include #include #include #include #include #include "shell/interface.h" /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include #include } namespace Ui { class Fonts; } class Fonts : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Fonts(); ~Fonts(); public: QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupStylesheet(); void setupComponent(); void setupConnect(); void initFontStatus(); void initGeneralFontStatus(); void initAdvancedFontStatus(); void initSampleFontStatus(); void setFontEffect(QAbstractButton * button); void resetDefault(); void setSampleButton(QPushButton * button); void _getDefaultFontinfo(); void _getCurrentFontInfo(); QStringList _splitFontNameSize(QString value); private: Ui::Fonts *ui; QWidget * pluginWidget; QString pluginName; int pluginType; QGSettings * ifsettings; QGSettings * marcosettings; QGSettings * peonysettings; QGSettings * rendersettings; QStringList gtkfontStrList; QStringList docfontStrList; QStringList monospacefontStrList; QStringList peonyfontStrList; QStringList titlebarfontStrList; QStyledItemDelegate *itemDelege; QFontDatabase fontdb; private: bool settingsCreate; }; #endif // FONTS_H ukui-control-center/plugins/personalized/fonts/fonts.pro0000644000175000017500000000130313621411724022571 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-25T12:51:26 # #------------------------------------------------- QT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(fonts) DESTDIR = ../../../pluginlibs ##加载gio库和gio-unix库,用于获取gsettings的默认值 CONFIG += link_pkgconfig \ C++11 PKGCONFIG += gio-2.0 \ gio-unix-2.0 include(../../../env.pri) INCLUDEPATH += \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lgsettings-qt #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ fonts.cpp HEADERS += \ fonts.h FORMS += \ fonts.ui ukui-control-center/plugins/personalized/screenlock/0000755000175000017500000000000013636025744021731 5ustar fengfengukui-control-center/plugins/personalized/screenlock/pictureunit.cpp0000644000175000017500000000270313635333016025003 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "pictureunit.h" #include "MaskWidget/maskwidget.h" PictureUnit::PictureUnit() { _filename = ""; setAttribute(Qt::WA_DeleteOnClose); setFixedSize(QSize(166, 110)); setScaledContents(true); MaskWidget * maskWidget = new MaskWidget(this); maskWidget->setGeometry(0, 0, this->width(), this->height()); } PictureUnit::~PictureUnit() { } void PictureUnit::setFilenameText(QString fn){ _filename = fn; } void PictureUnit::mousePressEvent(QMouseEvent *e){ if (e->button() == Qt::LeftButton) emit clicked(_filename); // QLabel::mousePressEvent(event); } ukui-control-center/plugins/personalized/screenlock/screenlock.cpp0000644000175000017500000001306013636025744024565 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "screenlock.h" #include "ui_screenlock.h" #include #define BGPATH "/usr/share/backgrounds/" #define SCREENLOCK_BG_SCHEMA "org.ukui.screensaver" #define SCREENLOCK_BG_KEY "background" #define SCREENLOCK_DELAY_KEY "lock-delay" #include "bgfileparse.h" #include "pictureunit.h" #include "MaskWidget/maskwidget.h" Screenlock::Screenlock() { ui = new Ui::Screenlock; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("screenlock"); pluginType = PERSONALIZED; pluginWidget->setStyleSheet("background: #ffffff;"); ui->loginWidget->setStyleSheet("QWidget{background: #F4F4F4; border: none; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); ui->enableWidget->setStyleSheet("QWidget{background: #F4F4F4; border: none; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"); QString btnQss = QString("background: #E9E9E9; border: none; border-radius: 4px;"); ui->browserLocalwpBtn->setStyleSheet(btnQss); ui->browserOnlinewpBtn->setStyleSheet(btnQss); ui->delaySlider->setStyleSheet("QSlider{height: 20px;}" "QSlider::groove:horizontal{border: none;}" "QSlider::add-page:horizontal{background: #808080; border-radius: 2px; margin-top: 8px; margin-bottom: 9px;}" "QSlider::sub-page:horizontal{background: #3D6BE5; border-radius: 2px; margin-top: 8px; margin-bottom: 9px;}" "QSlider::handle:horizontal{width: 20px; height: 20px; border-image: url(:/img/plugins/fonts/bigRoller.png);}" ""); const QByteArray id(SCREENLOCK_BG_SCHEMA); lSetting = new QGSettings(id); setupComponent(); initScreenlockStatus(); lockbgSize = QSize(400, 240); } Screenlock::~Screenlock() { delete ui; delete lSetting; } QString Screenlock::get_plugin_name(){ return pluginName; } int Screenlock::get_plugin_type(){ return pluginType; } QWidget *Screenlock::get_plugin_ui(){ return pluginWidget; } void Screenlock::plugin_delay_control(){ } void Screenlock::setupComponent(){ ui->browserLocalwpBtn->hide(); ui->browserOnlinewpBtn->hide(); loginbgSwitchBtn = new SwitchButton(pluginWidget); ui->loginbgHorLayout->addWidget(loginbgSwitchBtn); //设置布局 flowLayout = new FlowLayout; flowLayout->setContentsMargins(0, 0, 0, 0); ui->backgroundsWidget->setLayout(flowLayout); } void Screenlock::setupConnect(){ connect(ui->delaySlider, &QSlider::valueChanged, [=](int value){ lSetting->set(SCREENLOCK_DELAY_KEY, value); }); } void Screenlock::initScreenlockStatus(){ //获取当前锁屏壁纸 QString bgStr = lSetting->get(SCREENLOCK_BG_KEY).toString(); // if (bgStr.isEmpty()) ui->previewLabel->setPixmap(QPixmap("://img/plugins/screenlock/none.png")); // else // ui->previewLabel->setPixmap(QPixmap(bgStr).scaled(ui->previewLabel->size())); //遮罩 MaskWidget * maskWidget = new MaskWidget(ui->previewLabel); maskWidget->setGeometry(0, 0, ui->previewLabel->width(), ui->previewLabel->height()); //使用线程解析本地壁纸文件;获取壁纸单元 pThread = new QThread; pWorker = new BuildPicUnitsWorker; connect(pWorker, &BuildPicUnitsWorker::pixmapGeneral, this, [=](QPixmap pixmap, BgInfo bgInfo){ //设置当前锁屏壁纸的预览 if (bgInfo.filename == bgStr){ ui->previewLabel->setPixmap(pixmap); } //线程中构建控件传递会报告event无法install 的警告 PictureUnit * picUnit = new PictureUnit; picUnit->setPixmap(pixmap); picUnit->setFilenameText(bgInfo.filename); connect(picUnit, &PictureUnit::clicked, [=](QString filename){ ui->previewLabel->setPixmap(pixmap); lSetting->set(SCREENLOCK_BG_KEY, filename); }); flowLayout->addWidget(picUnit); }); connect(pWorker, &BuildPicUnitsWorker::workerComplete, [=]{ pThread->quit(); //退出事件循环 pThread->wait(); //释放资源 }); pWorker->moveToThread(pThread); connect(pThread, &QThread::started, pWorker, &BuildPicUnitsWorker::run); connect(pThread, &QThread::finished, this, [=]{ }); connect(pThread, &QThread::finished, pWorker, &BuildPicUnitsWorker::deleteLater); pThread->start(); //设置登录界面背景开关 //设置锁屏时间,屏保激活后多久锁定屏幕 int lDelay = lSetting->get(SCREENLOCK_DELAY_KEY).toInt(); ui->delaySlider->blockSignals(true); ui->delaySlider->setValue(lDelay); ui->delaySlider->blockSignals(false); } ukui-control-center/plugins/personalized/screenlock/buildpicunitsworker.cpp0000644000175000017500000000261113636025744026545 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "buildpicunitsworker.h" #include BuildPicUnitsWorker::BuildPicUnitsWorker() { //自定义结构提,线程传递时无法放入列表,注册解决 qRegisterMetaType("BgInfo"); } BuildPicUnitsWorker::~BuildPicUnitsWorker() { } void BuildPicUnitsWorker::run(){ //获取本地壁纸列表 QMap wholeBgInfo = BgFileParse::bgFileReader(); for (BgInfo sinBfInfo : wholeBgInfo){ emit pixmapGeneral(QPixmap(sinBfInfo.filename).scaled(QSize(166, 110)), sinBfInfo); } } ukui-control-center/plugins/personalized/screenlock/bgfileparse.cpp0000644000175000017500000001346613635333016024723 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "bgfileparse.h" #include #include #include #include QMap wholeBgInfo; BgFileParse::BgFileParse() { } BgFileParse::~BgFileParse() { } QMap BgFileParse::bgFileReader(){ QString filename = QString("%1/%2/%3").arg(QDir::homePath()).arg(".config/ukui").arg("wallpaper.xml"); QFile file(filename); if (!file.open(QFile::ReadOnly | QFile::Text)){ QMap nMap; qDebug() << "Error Open XML File When Reader Xml: " << file.errorString(); return nMap; } QXmlStreamReader reader; reader.setDevice(&file); while (!reader.atEnd()) { QXmlStreamReader::TokenType nType = reader.readNext(); switch (nType) { case QXmlStreamReader::StartDocument: { QString versionStr = reader.documentVersion().toString(); QString encodingStr = reader.documentEncoding().toString(); // bool aloneBool = reader.isStandaloneDocument(); // qDebug() << QString::fromLocal8Bit("Version: %1 encoding: %2 standalone: %3").arg(versionStr).arg(encodingStr).arg(aloneBool); break; } case QXmlStreamReader::DTD: { QString dtdStr = reader.text().toString(); QString dtdnameStr = reader.dtdName().toString(); QString dtdsystemidStr = reader.dtdSystemId().toString(); // qDebug() << QString::fromLocal8Bit("DTD:%1; DTD name:%2; systemid:%3").arg(dtdStr).arg(dtdnameStr).arg(dtdsystemidStr); break; } case QXmlStreamReader::Comment: { QString commentStr = reader.text().toString(); break; } case QXmlStreamReader::StartElement: { QString elementnameStr = reader.name().toString(); if (elementnameStr == "wallpapers"){ //根元素 parseWallpaper(reader); } break; } case QXmlStreamReader::EndDocument: { break; } default: break; } } if (reader.hasError()){ qDebug() << QString::fromLocal8Bit("msg: %1; line: %2; column: %3; char shift: %4").arg(reader.errorString()).arg(reader.lineNumber()).arg(reader.columnNumber()).arg(reader.characterOffset()); } file.close(); return wholeBgInfo; } void BgFileParse::parseWallpaper(QXmlStreamReader &reader){ BgInfo oneBgInfo; while (!reader.atEnd()) { reader.readNext(); if (reader.isStartElement()){ QString elementnameStr = reader.name().toString(); if (elementnameStr == "wallpaper"){ // qDebug() << QString::fromLocal8Bit("******开始元素***"); QXmlStreamAttributes wp_attributes = reader.attributes(); if (wp_attributes.hasAttribute("deleted")){ QString deletedStr = wp_attributes.value("deleted").toString(); oneBgInfo.status = deletedStr; } } else if (elementnameStr == "name"){ QXmlStreamAttributes name_attributes = reader.attributes(); if (name_attributes.hasAttribute("xml:lang")){ QString langStr = name_attributes.value("xml:lang").toString(); // qDebug() << QString::fromLocal8Bit("name zh_CN: %1").arg(reader.readElementText()); oneBgInfo.i18nName = reader.readElementText(); } else { oneBgInfo.name = reader.readElementText(); } } else if (elementnameStr == "artist"){ oneBgInfo.artist = reader.readElementText(); } else if (elementnameStr == "filename"){ oneBgInfo.filename = reader.readElementText(); } else if (elementnameStr == "options"){ oneBgInfo.option = reader.readElementText(); } else if (elementnameStr == "pcolor"){ oneBgInfo.pColor = reader.readElementText(); } else if (elementnameStr == "scolor"){ oneBgInfo.sColor = reader.readElementText(); } else if (elementnameStr == "shade_type"){ oneBgInfo.shadeType = reader.readElementText(); } } else if (reader.isEndElement()){ QString elementnameStr = reader.name().toString(); if (elementnameStr == "wallpaper"){ QString filename = oneBgInfo.filename; QFile file(filename); //slide show not append and file must exist! if (!filename.endsWith("xml") && file.exists()) wholeBgInfo.insert(oneBgInfo.filename, oneBgInfo); // qDebug() << QString::fromLocal8Bit("******结束元素***") << wpList.length(); } else if (elementnameStr == "wallpapers"){ // qDebug() << QString::fromLocal8Bit("*******结束元素****"); break; } } } } ukui-control-center/plugins/personalized/screenlock/screenlock.pro0000644000175000017500000000204413635333016024574 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-26T08:25:40 # #------------------------------------------------- QT += widgets xml TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(screenlock) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) include($$PROJECT_COMPONENTSOURCE/flowlayout.pri) include($$PROJECT_COMPONENTSOURCE/maskwidget.pri) INCLUDEPATH += \ $$PROJECT_ROOTDIR \ $$PROJECT_COMPONENTSOURCE \ LIBS += -L/usr/lib/ -lgsettings-qt ##加载gio库和gio-unix库 #CONFIG += link_pkgconfig \ # C++11 #PKGCONFIG += gio-2.0 \ # gio-unix-2.0 #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ bgfileparse.cpp \ buildpicunitsworker.cpp \ pictureunit.cpp \ screenlock.cpp HEADERS += \ bgfileparse.h \ buildpicunitsworker.h \ pictureunit.h \ screenlock.h FORMS += \ screenlock.ui ukui-control-center/plugins/personalized/screenlock/bgfileparse.h0000644000175000017500000000271413635333016024362 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef BGFILEPARSE_H #define BGFILEPARSE_H #include #include class QXmlStreamReader; typedef struct _BgInfo{ QString status; QString name; QString i18nName; QString artist; QString filename; QString option; QString pColor; QString sColor; QString shadeType; }BgInfo; class BgFileParse { public: explicit BgFileParse(); ~BgFileParse(); public: static QMap bgFileReader(); static void parseWallpaper(QXmlStreamReader &reader); //private: // static QMap wholeBgInfo; }; #endif // BGFILEPARSE_H ukui-control-center/plugins/personalized/screenlock/screenlock.ui0000644000175000017500000003206413635333016024416 0ustar fengfeng Screenlock 0 0 562 606 0 0 16777215 16777215 Screenlock 0 0 0 32 30 0 0 0 0 0 16 0 0 0 Screenlock Interface 0 0 300 180 300 180 true Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 8 0 0 Select screenlock background Qt::Vertical QSizePolicy::Fixed 20 8 16 132 36 132 36 Browser online wp 132 36 132 36 Browser local wp Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 32 2 0 0 50 16777215 50 0 16 0 16 0 0 0 0 Show picture of screenlock on screenlogin Qt::Horizontal 40 20 0 69 16777215 69 0 16 0 16 0 0 0 0 Enabel screenlock Qt::Horizontal 40 20 320 0 320 16777215 60 10 0 0 Qt::Horizontal ukui-control-center/plugins/personalized/screenlock/pictureunit.h0000644000175000017500000000237413635333016024454 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef PICTUREUNIT_H #define PICTUREUNIT_H #include #include class PictureUnit : public QLabel { Q_OBJECT public: explicit PictureUnit(); ~PictureUnit(); public: void setFilenameText(QString fn); protected: void mousePressEvent(QMouseEvent * e); private: QString _filename; Q_SIGNALS: void clicked(QString filename); }; #endif // PICTUREUNIT_H ukui-control-center/plugins/personalized/screenlock/screenlock.h0000644000175000017500000000375213635333016024232 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SCREENLOCK_H #define SCREENLOCK_H #include #include #include #include #include #include "shell/interface.h" #include "SwitchButton/switchbutton.h" #include "FlowLayout/flowlayout.h" #include "buildpicunitsworker.h" namespace Ui { class Screenlock; } class Screenlock : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Screenlock(); ~Screenlock(); public: QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupComponent(); void setupConnect(); void initScreenlockStatus(); private: Ui::Screenlock *ui; private: QString pluginName; int pluginType; QWidget * pluginWidget; private: QGSettings * lSetting; SwitchButton * loginbgSwitchBtn; FlowLayout * flowLayout; QSize lockbgSize; private: QThread * pThread; BuildPicUnitsWorker * pWorker; }; #endif // SCREENLOCK_H ukui-control-center/plugins/personalized/screenlock/buildpicunitsworker.h0000644000175000017500000000240413635333016026203 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef BUILDPICUNITSWORKER_H #define BUILDPICUNITSWORKER_H #include #include #include "bgfileparse.h" class BuildPicUnitsWorker : public QObject { Q_OBJECT public: explicit BuildPicUnitsWorker(); ~BuildPicUnitsWorker(); public: void run(); Q_SIGNALS: void pixmapGeneral(QPixmap pixmap, BgInfo bginfo); void workerComplete(); }; #endif // BUILDPICUNITSWORKER_H ukui-control-center/plugins/personalized/desktop/0000755000175000017500000000000013635333016021243 5ustar fengfengukui-control-center/plugins/personalized/desktop/desktop.cpp0000644000175000017500000001747613635333016023437 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "desktop.h" #include "ui_desktop.h" #include #include "SwitchButton/switchbutton.h" #include //#define DESKTOP_SCHEMA "org.ukui.peony.desktop" #define DESKTOP_SCHEMA "org.ukui.control-center.desktop" #define COMPUTER_VISIBLE_KEY "computer-icon-visible" #define HOME_VISIBLE_KEY "home-icon-visible" #define NETWORK_VISIBLE_KEY "network-icon-visible" #define TRASH_VISIBLE_KEY "trash-icon-visible" #define VOLUMES_VISIBLE_KEY "volumes-visible" #define COMPUTER_LOCK_KEY "computer-icon-locking" #define FILESYSTEM_LOCK_KEY "filesystem-icon-locking" #define SETTINGS_LOCK_KEY "settings-icon-locking" #define TRASH_LOCK_KEY "trash-icon-locking" Desktop::Desktop() { ui = new Ui::Desktop; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("desktop"); pluginType = PERSONALIZED; pluginWidget->setStyleSheet("background: #ffffff;"); ui->deskComputerWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->deskTrashWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->deskHomeWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->deskVolumeWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->deskNetworkWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->menuComputerWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->menuTrashWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->menuFilesystemWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->menuSettingWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); const QByteArray id(DESKTOP_SCHEMA); dSettings = new QGSettings(id); setupComponent(); setupConnect(); initVisibleStatus(); initLockingStatus(); } Desktop::~Desktop() { delete ui; delete dSettings; } QString Desktop::get_plugin_name(){ return pluginName; } int Desktop::get_plugin_type(){ return pluginType; } QWidget *Desktop::get_plugin_ui(){ return pluginWidget; } void Desktop::plugin_delay_control(){ } void Desktop::setupComponent(){ ui->deskComputerLabel->setPixmap(QPixmap("://img/plugins/desktop/computer.png")); ui->deskHomeLabel->setPixmap(QPixmap("://img/plugins/desktop/homefolder.png")); ui->deskTrashLabel->setPixmap(QPixmap("://img/plugins/desktop/trash.png")); ui->deskNetworkLabel->setPixmap(QPixmap("://img/plugins/desktop/default.png")); ui->deskVolumeLabel->setPixmap(QPixmap("://img/plugins/desktop/default.png")); deskComputerSwitchBtn = new SwitchButton(pluginWidget); ui->deskComputerHorLayout->addWidget(deskComputerSwitchBtn); deskTrashSwitchBtn = new SwitchButton(pluginWidget); ui->deskTrashHorLayout->addWidget(deskTrashSwitchBtn); deskHomeSwitchBtn = new SwitchButton(pluginWidget); ui->deskHomeHorLayout->addWidget(deskHomeSwitchBtn); deskVolumeSwitchBtn = new SwitchButton(pluginWidget); ui->deskVolumeHorLayout->addWidget(deskVolumeSwitchBtn); deskNetworkSwitchBtn = new SwitchButton(pluginWidget); ui->deskNetworkHorLayout->addWidget(deskNetworkSwitchBtn); ui->menuComputerLabel->setPixmap(QPixmap("://img/plugins/desktop/computer.png")); ui->menuFilesystemLabel->setPixmap(QPixmap("://img/plugins/desktop/default.png")); ui->menuSettingsLabel->setPixmap(QPixmap("://img/plugins/desktop/default.png")); ui->menuTrashLabel->setPixmap(QPixmap("://img/plugins/desktop/trash.png")); menuComputerSwitchBtn = new SwitchButton(pluginWidget); ui->menuComputerHorLayout->addWidget(menuComputerSwitchBtn); menuTrashSwitchBtn = new SwitchButton(pluginWidget); ui->menuTrashHorLayout->addWidget(menuTrashSwitchBtn); menuFilesystemSwitchBtn = new SwitchButton(pluginWidget); ui->menuFilesystemHorLayout->addWidget(menuFilesystemSwitchBtn); menuSettingSwitchBtn = new SwitchButton(pluginWidget); ui->menuSettingHorLayout->addWidget(menuSettingSwitchBtn); } void Desktop::setupConnect(){ connect(deskComputerSwitchBtn, &SwitchButton::checkedChanged, this, [=](bool checked){dSettings->set(COMPUTER_VISIBLE_KEY, checked);}); connect(deskTrashSwitchBtn, &SwitchButton::checkedChanged, this, [=](bool checked){dSettings->set(TRASH_VISIBLE_KEY, checked);}); connect(deskHomeSwitchBtn, &SwitchButton::checkedChanged, this, [=](bool checked){dSettings->set(HOME_VISIBLE_KEY, checked);}); connect(deskVolumeSwitchBtn, &SwitchButton::checkedChanged, this, [=](bool checked){dSettings->set(VOLUMES_VISIBLE_KEY, checked);}); connect(deskNetworkSwitchBtn, &SwitchButton::checkedChanged, this, [=](bool checked){dSettings->set(NETWORK_VISIBLE_KEY, checked);}); connect(menuComputerSwitchBtn, &SwitchButton::checkedChanged, [=](bool checked){ dSettings->set(COMPUTER_LOCK_KEY, checked); }); connect(menuFilesystemSwitchBtn, &SwitchButton::checkedChanged, [=](bool checked){ dSettings->set(FILESYSTEM_LOCK_KEY, checked); }); connect(menuSettingSwitchBtn, &SwitchButton::checkedChanged, [=](bool checked){ dSettings->set(SETTINGS_LOCK_KEY, checked); }); connect(menuTrashSwitchBtn, &SwitchButton::checkedChanged, [=](bool checked){ dSettings->set(TRASH_LOCK_KEY, checked); }); } void Desktop::initVisibleStatus(){ deskComputerSwitchBtn->blockSignals(true); deskHomeSwitchBtn->blockSignals(true); deskTrashSwitchBtn->blockSignals(true); deskVolumeSwitchBtn->blockSignals(true); deskNetworkSwitchBtn->blockSignals(true); deskComputerSwitchBtn->setChecked(dSettings->get(COMPUTER_VISIBLE_KEY).toBool()); deskHomeSwitchBtn->setChecked(dSettings->get(HOME_VISIBLE_KEY).toBool()); deskTrashSwitchBtn->setChecked(dSettings->get(TRASH_VISIBLE_KEY).toBool()); deskVolumeSwitchBtn->setChecked(dSettings->get(VOLUMES_VISIBLE_KEY).toBool()); deskNetworkSwitchBtn->setChecked(dSettings->get(NETWORK_VISIBLE_KEY).toBool()); deskComputerSwitchBtn->blockSignals(false); deskHomeSwitchBtn->blockSignals(false); deskTrashSwitchBtn->blockSignals(false); deskVolumeSwitchBtn->blockSignals(false); deskNetworkSwitchBtn->blockSignals(false); } void Desktop::initLockingStatus(){ menuComputerSwitchBtn->blockSignals(true); menuFilesystemSwitchBtn->blockSignals(true); menuSettingSwitchBtn->blockSignals(true); menuTrashSwitchBtn->blockSignals(true); menuComputerSwitchBtn->setChecked(dSettings->get(COMPUTER_LOCK_KEY).toBool()); menuFilesystemSwitchBtn->setChecked(dSettings->get(FILESYSTEM_LOCK_KEY).toBool()); menuSettingSwitchBtn->setChecked(dSettings->get(SETTINGS_LOCK_KEY).toBool()); menuTrashSwitchBtn->setChecked(dSettings->get(TRASH_LOCK_KEY).toBool()); menuComputerSwitchBtn->blockSignals(false); menuFilesystemSwitchBtn->blockSignals(false); menuSettingSwitchBtn->blockSignals(false); menuTrashSwitchBtn->blockSignals(false); } ukui-control-center/plugins/personalized/desktop/desktop.pro0000644000175000017500000000117613621411724023441 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-26T10:59:46 # #------------------------------------------------- QT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(desktop) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lgsettings-qt #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ desktop.cpp HEADERS += \ desktop.h FORMS += \ desktop.ui ukui-control-center/plugins/personalized/desktop/desktop.ui0000644000175000017500000006120113635333016023253 0ustar fengfeng Desktop 0 0 795 797 0 0 16777215 16777215 Desktop 8 0 0 32 60 0 0 Icon Show On Desktop Qt::Vertical QSizePolicy::Fixed 20 8 550 50 960 50 0 0 0 0 0 8 16 16 0 0 true 0 0 Computerdesktop Qt::Horizontal 40 20 550 50 960 50 0 0 0 0 0 8 16 16 0 0 true 0 0 Trashdesktop Qt::Horizontal 40 20 550 50 960 50 0 0 0 0 0 8 16 16 0 0 true 0 0 Homedesktop Qt::Horizontal 40 20 550 50 960 50 0 0 0 0 0 8 16 16 0 0 true 0 0 Volumedesktop Qt::Horizontal 40 20 550 50 960 50 0 0 0 0 0 8 16 16 0 0 true 0 0 Networkdesktop Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 40 0 0 Icon Lock on Menu 550 50 960 50 0 0 0 0 0 8 16 16 0 0 true 0 0 Computermenu Qt::Horizontal 40 20 550 50 960 50 0 0 0 0 0 8 16 16 0 0 true 0 0 Trashmenu Qt::Horizontal 40 20 550 50 960 50 0 0 0 0 0 8 16 16 0 0 true 0 0 Filesystemmenu Qt::Horizontal 40 20 550 50 960 50 0 0 0 0 0 8 16 16 0 0 true 0 0 Settingmenu Qt::Horizontal 40 20 Qt::Vertical 20 40 ukui-control-center/plugins/personalized/desktop/desktop.h0000644000175000017500000000404513635333016023070 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef DESKTOP_H #define DESKTOP_H #include #include #include "shell/interface.h" class SwitchButton; class QGSettings; namespace Ui { class Desktop; } class Desktop : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Desktop(); ~Desktop(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupComponent(); void setupConnect(); void initVisibleStatus(); void initLockingStatus(); private: SwitchButton * deskComputerSwitchBtn; SwitchButton * deskTrashSwitchBtn; SwitchButton * deskHomeSwitchBtn; SwitchButton * deskVolumeSwitchBtn; SwitchButton * deskNetworkSwitchBtn; SwitchButton * menuComputerSwitchBtn; SwitchButton * menuTrashSwitchBtn; SwitchButton * menuFilesystemSwitchBtn; SwitchButton * menuSettingSwitchBtn; QGSettings * dSettings; private: Ui::Desktop *ui; QString pluginName; int pluginType; QWidget * pluginWidget; }; #endif // DESKTOP_H ukui-control-center/plugins/personalized/screensaver/0000755000175000017500000000000013635333016022112 5ustar fengfengukui-control-center/plugins/personalized/screensaver/screensaver.pro0000644000175000017500000000143613621411724025156 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-25T13:24:04 # #------------------------------------------------- QT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(screensaver) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lgsettings-qt ##加载gio库和gio-unix库 CONFIG += link_pkgconfig \ C++11 PKGCONFIG += gio-2.0 \ gio-unix-2.0 #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ screensaver.cpp HEADERS += \ screensaver.h FORMS += \ screensaver.ui ukui-control-center/plugins/personalized/screensaver/screensaver.cpp0000644000175000017500000005102413635333016025140 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "screensaver.h" #include "ui_screensaver.h" #include #include #define SSTHEMEPATH "/usr/share/applications/screensavers/" #define ID_PREFIX "screensavers-ukui-" #define SCREENSAVER_SCHEMA "org.ukui.screensaver" #define MODE_KEY "mode" #define THEMES_KEY "themes" #define LOCK_KEY "lock-enabled" #define ACTIVE_KEY "idle-activation-enabled" #define SESSION_SCHEMA "org.ukui.session" #define IDLE_DELAY_KEY "idle-delay" #define IDLEMIN 1 #define IDLEMAX 120 #define IDLESTEP 1 typedef enum { MODE_BLANK_ONLY, MODE_RANDOM, MODE_SINGLE, MODE_IMAGE, MODE_DEFAULT_UKUI, }SaverMode; void PreviewWidget::paintEvent(QPaintEvent *e){ // QPainter painter(this); // painter.setCompositionMode(QPainter::CompositionMode_DestinationOver); // qDebug() << Q_FUNC_INFO << this->rect(); // painter.fillRect(this->rect(), Qt::red); } Screensaver::Screensaver() { ui = new Ui::Screensaver; itemDelege = new QStyledItemDelegate(); pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("screensaver"); pluginType = PERSONALIZED; pluginWidget->setStyleSheet("background: #ffffff;"); ui->previewWidget->setStyleSheet("#previewWidget{background: black; border-radius: 6px;}"); ui->previewWidget->setAutoFillBackground(true); mPreviewWidget = new PreviewWidget; mPreviewWidget->resize(400,222); QBoxLayout *mPreviewLayout = new QBoxLayout(QBoxLayout::TopToBottom); mPreviewLayout->addWidget(mPreviewWidget); ui->previewWidget->setLayout(mPreviewLayout); ui->enableWidget->setStyleSheet("QWidget{background: #F4F4F4; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); ui->programWidget->setStyleSheet("QWidget#programWidget{background: #F4F4F4;}"); ui->programLabel->setStyleSheet("QLabel{background: #F4F4F4;}"); ui->idleWidget->setStyleSheet("QWidget{background: #F4F4F4; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"); ui->idleLineEdit->setStyleSheet("QLineEdit{background: #ffffff; border-radius: 0px;}"); ui->lockWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); process = new QProcess(); _acquireThemeinfoList(); initComponent(); initEnableBtnStatus(); initThemeStatus(); initIdleSliderStatus(); init_theme_info_map(); component_init(); status_init(); } Screensaver::~Screensaver() { delete ui; delete process; process = nullptr; } QString Screensaver::get_plugin_name(){ return pluginName; } int Screensaver::get_plugin_type(){ return pluginType; } QWidget *Screensaver::get_plugin_ui(){ return pluginWidget; } void Screensaver::plugin_delay_control(){ // 初始化屏保预览Widget initPreviewWidget(); } void Screensaver::initComponent(){ //添加开启屏保按钮 enableSwitchBtn = new SwitchButton(ui->enableWidget); ui->enableHorLayout->addStretch(); ui->enableHorLayout->addWidget(enableSwitchBtn); //添加锁定屏幕开关按钮 lockSwitchBtn = new SwitchButton(ui->lockWidget); ui->lockHorLayout->addStretch(); ui->lockHorLayout->addWidget(lockSwitchBtn); //初始化屏保程序下拉列表 ui->comboBox->setItemDelegate(itemDelege); ui->comboBox->setMaxVisibleItems(5); ui->comboBox->addItem(tr("Default_ukui")); ui->comboBox->addItem(tr("Blank_Only")); ui->comboBox->addItem(tr("Random")); QMap::iterator it = infoMap.begin(); for (int index = 3; it != infoMap.end(); it++, index++){ SSThemeInfo info = (SSThemeInfo)it.value(); ui->comboBox->addItem(info.name); ui->comboBox->setItemData(index, QVariant::fromValue(info)); } //初始化滑动条 ui->idleSlider->setMinimum(IDLEMIN); ui->idleSlider->setMaximum(IDLEMAX); ui->idleSlider->setSingleStep(IDLESTEP); ui->idleSlider->setPageStep(IDLESTEP); connect(enableSwitchBtn, &SwitchButton::checkedChanged, this, [=](bool checked){ screensaver_settings = g_settings_new(SCREENSAVER_SCHEMA); g_settings_set_boolean(screensaver_settings, ACTIVE_KEY, checked); //刷新LockWidget状态 ui->lockWidget->setVisible(checked); g_object_unref(screensaver_settings); }); connect(lockSwitchBtn, &SwitchButton::checkedChanged, this, [=](bool checked){ //REVIEW*** g_object_unref faild // screensaver_settings = g_settings_new(SCREENSAVER_SCHEMA); // g_settings_set_boolean(screensaver_settings, LOCK_KEY, status); // if (screensaver_settings) // g_object_unref(screensaver_settings); const QByteArray ba(SCREENSAVER_SCHEMA); QGSettings * settings = new QGSettings(ba); settings->set(LOCK_KEY, checked); delete settings; }); connect(ui->idleSlider, &QSlider::valueChanged, this, [=](int value){ //刷新分钟显示 ui->idleLineEdit->blockSignals(true); ui->idleLineEdit->setText(QString::number(value)); ui->idleLineEdit->blockSignals(false); }); connect(ui->idleSlider, &QSlider::sliderReleased, this, [=]{ int value = ui->idleSlider->value(); session_settings = g_settings_new(SESSION_SCHEMA); g_settings_set_int(session_settings, IDLE_DELAY_KEY, value); g_object_unref(session_settings); }); } void Screensaver::initPreviewWidget(){ startupScreensaver(); } void Screensaver::initEnableBtnStatus(){ const QByteArray ba(SCREENSAVER_SCHEMA); QGSettings * settings = new QGSettings(ba); //初始化EnableBtn状态 bool active; active = settings->get(ACTIVE_KEY).toBool(); enableSwitchBtn->blockSignals(true); enableSwitchBtn->setChecked(active); enableSwitchBtn->blockSignals(false); //初始化LockWidget状态 ui->lockWidget->setVisible(active); bool locked; locked = settings->get(LOCK_KEY).toBool(); initLockBtnStatus(locked); delete settings; } void Screensaver::initLockBtnStatus(bool status){ lockSwitchBtn->blockSignals(true); lockSwitchBtn->setChecked(status); lockSwitchBtn->blockSignals(false); } void Screensaver::initThemeStatus(){ int mode; char * name; ui->comboBox->blockSignals(true); screensaver_settings = g_settings_new(SCREENSAVER_SCHEMA); mode = g_settings_get_enum(screensaver_settings, MODE_KEY); if (mode == MODE_DEFAULT_UKUI){ ui->comboBox->setCurrentIndex(0); //UKUI } else if (mode == MODE_BLANK_ONLY){ ui->comboBox->setCurrentIndex(1); //Black_Only } else if (mode == MODE_RANDOM){ ui->comboBox->setCurrentIndex(2); //Random } else{ gchar ** strv; strv = g_settings_get_strv(screensaver_settings, THEMES_KEY); if (strv != NULL){ name = g_strdup(strv[0]); QString nameqt = QString(name); SSThemeInfo info = (SSThemeInfo)infoMap.find(name).value(); ui->comboBox->setCurrentText(info.name); } else ui->comboBox->setCurrentIndex(0); //no data, default Blank_Only g_strfreev(strv); } g_object_unref(screensaver_settings); ui->comboBox->blockSignals(false); } void Screensaver::initIdleSliderStatus(){ int minutes; session_settings = g_settings_new(SESSION_SCHEMA); minutes = g_settings_get_int(session_settings, IDLE_DELAY_KEY); ui->idleSlider->blockSignals(true); ui->idleSlider->setValue(minutes); ui->idleSlider->blockSignals(false); ui->idleLineEdit->blockSignals(true); ui->idleLineEdit->setText(QString::number(minutes)); ui->idleLineEdit->blockSignals(true); g_object_unref(session_settings); } void Screensaver::component_init(){ //设置屏保预览widget的背景为黑色 // mPreviewWidget->setStyleSheet("#previewWidget{background: black}"); // // activeswitchbtn = new SwitchButton(); // activeswitchbtn->setAttribute(Qt::WA_DeleteOnClose); // ui->activeHLayout->addWidget(activeswitchbtn); // ui->activeHLayout->addStretch(); // lockswitchbtn = new SwitchButton(); // lockswitchbtn->setAttribute(Qt::WA_DeleteOnClose); // ui->lockHLayout->addWidget(lockswitchbtn); // ui->lockHLayout->addStretch(); // ui->comboBox->addItem(tr("Blank_Only")); // ui->comboBox->addItem(tr("Random")); // QMap::iterator it = infoMap.begin(); // for (int itemsindex = 2; it != infoMap.end(); it++, itemsindex++){ // SSThemeInfo info = (SSThemeInfo)it.value(); // ui->comboBox->addItem(info.name); // ui->comboBox->setItemData(itemsindex, QVariant::fromValue(info)); // } //init slider // int min = 1; // int max = 120; // int singlestep = 1; // ui->idleSlider->setMinimum(min); // ui->idleSlider->setMaximum(max); // ui->idleSlider->setSingleStep(singlestep); // ui->idleSlider->installEventFilter(this); // connect(this, SIGNAL(kill_signals()), this, SLOT(kill_screensaver_preview())); } void Screensaver::status_init(){ int mode; char * name; screensaver_settings = g_settings_new(SCREENSAVER_SCHEMA); mode = g_settings_get_enum(screensaver_settings, MODE_KEY); if (mode == MODE_DEFAULT_UKUI){ ui->comboBox->setCurrentIndex(0); //UKUI } else if(mode == MODE_BLANK_ONLY){ ui->comboBox->setCurrentIndex(1); //Black_Only } else if (mode == MODE_RANDOM){ ui->comboBox->setCurrentIndex(2); //Random } else{ gchar ** strv; strv = g_settings_get_strv(screensaver_settings, THEMES_KEY); if (strv != NULL){ name = g_strdup(strv[0]); QString nameqt = QString(name); SSThemeInfo info = (SSThemeInfo)infoMap.find(name).value(); ui->comboBox->setCurrentText(info.name); } else ui->comboBox->setCurrentIndex(0); //no data, default Blank_Only g_strfreev(strv); } //init // bool activation; bool lockable; // activation = g_settings_get_boolean(screensaver_settings, ACTIVE_KEY); // activeswitchbtn->setChecked(activation); // if (activation){ // lockable = g_settings_get_boolean(screensaver_settings, LOCK_KEY); // lockswitchbtn->setChecked(lockable); // ui->widget->show(); // } // else{ // lockswitchbtn->setChecked(false); // ui->widget->hide(); // } g_object_unref(screensaver_settings); //获取空闲时间 int minutes; session_settings = g_settings_new(SESSION_SCHEMA); minutes = g_settings_get_int(session_settings, IDLE_DELAY_KEY); // ui->idleSlider->setValue(minutes); // ui->idleLabel->setText(QString("%1%2").arg(minutes).arg(tr("minutes"))); g_object_unref(session_settings); //获取功能列表 // PublicData * publicdata = new PublicData(); // QStringList tmpList = publicdata->subfuncList[SYSTEM]; //connect // connect(ui->powerBtn, &QPushButton::clicked, this, [=]{pluginWidget->emitting_toggle_signal(tmpList.at(2), SYSTEM, 0);}); connect(ui->idleSlider, SIGNAL(sliderReleased()), this, SLOT(slider_released_slot())); //改gsettings // connect(activeswitchbtn, SIGNAL(checkedChanged(bool)), this, SLOT(activebtn_changed_slot(bool))); // connect(lockswitchbtn, SIGNAL(checkedChanged(bool)), this, SLOT(lockbtn_changed_slot(bool))); connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(combobox_changed_slot(int))); connect(mPreviewWidget, SIGNAL(destroyed(QObject*)), this, SLOT(kill_screensaver_preview())); // delete publicdata; } #define UKUI_SCREENSAVER_BIN "/usr/lib/ukui-screensaver/ukui-screensaver-default" void Screensaver::startupScreensaver(){ //关闭屏保 closeScreensaver(); qDebug() << Q_FUNC_INFO << mPreviewWidget->winId(); if (ui->comboBox->currentIndex() == 0){//UKUI QStringList args; args << "-window-id" << QString::number(mPreviewWidget->winId()); //启动屏保 process->startDetached(UKUI_SCREENSAVER_BIN, args); runStringList.append(UKUI_SCREENSAVER_BIN); } else if (ui->comboBox->currentIndex() == 1){//黑屏 mPreviewWidget->update(); } else if (ui->comboBox->currentIndex() == 2){//随机 mPreviewWidget->update(); } else{//屏保 SSThemeInfo info = ui->comboBox->currentData().value(); QStringList args; args << "-window-id" << QString::number(mPreviewWidget->winId()); //启动屏保 process->startDetached(info.exec, args); runStringList.append(info.exec); } } void Screensaver::closeScreensaver(){ //杀死分离启动的屏保预览程序 if (!runStringList.isEmpty()){ process->start(QString("killall"), runStringList); process->waitForStarted(); process->waitForFinished(2000); runStringList.clear(); } } void Screensaver::kill_and_start(){ emit kill_signals(); //如果有屏保先杀死 if (ui->comboBox->currentIndex() == 0){//UKUI QStringList args; args << "-window-id" << QString::number(mPreviewWidget->winId()); //启动屏保 process->startDetached(UKUI_SCREENSAVER_BIN, args); runStringList.append(UKUI_SCREENSAVER_BIN); } else if (ui->comboBox->currentIndex() == 1){//黑屏 mPreviewWidget->update(); } else if (ui->comboBox->currentIndex() == 2){//随机 mPreviewWidget->update(); } else{//屏保 SSThemeInfo info = ui->comboBox->currentData().value(); QStringList args; args << "-window-id" << QString::number(mPreviewWidget->winId()); //启动屏保 process->startDetached(info.exec, args); killList.clear(); killList.append(info.exec); } } void Screensaver::set_idle_gsettings_value(int value){ session_settings = g_settings_new(SESSION_SCHEMA); g_settings_set_int(session_settings, IDLE_DELAY_KEY, value); } void Screensaver::slider_released_slot(){ int minutes; minutes = ui->idleSlider->value(); set_idle_gsettings_value(minutes); } void Screensaver::lockbtn_changed_slot(bool status){ //REVIEW*** setchecked(false) -> g_object_unref faild // screensaver_settings = g_settings_new(SCREENSAVER_SCHEMA); // g_settings_set_boolean(screensaver_settings, LOCK_KEY, status); // if (screensaver_settings) // g_object_unref(screensaver_settings); const QByteArray ba(SCREENSAVER_SCHEMA); QGSettings * settings = new QGSettings(ba); settings->set(LOCK_KEY, status); delete settings; } void Screensaver::activebtn_changed_slot(bool status){ screensaver_settings = g_settings_new(SCREENSAVER_SCHEMA); g_settings_set_boolean(screensaver_settings, ACTIVE_KEY, status); // if (status){ // ui->widget->show(); // } // else{ // lockswitchbtn->setChecked(false); // ui->widget->hide(); // } g_object_unref(screensaver_settings); } void Screensaver::combobox_changed_slot(int index){ char ** strv = NULL; screensaver_settings = g_settings_new(SCREENSAVER_SCHEMA); if (index == 0){ //ukui g_settings_set_enum(screensaver_settings, MODE_KEY, MODE_DEFAULT_UKUI); } else if (index == 1){ //Blank_Only g_settings_set_enum(screensaver_settings, MODE_KEY, MODE_BLANK_ONLY); } else if (index == 2){ //Random // int mode = MODE_RANDOM; g_settings_set_enum(screensaver_settings, MODE_KEY, MODE_RANDOM); //REVIEW*** 二维字符数组赋值字符串段错误? // QMap::iterator it = infoMap.begin(); // for (guint num = 0; it != infoMap.end(); it++){ // QString id = QString(it.key()); // QByteArray ba = id.toLatin1(); // char * info_id = ba.data(); // strv[num++] = g_strdup)(info_id); // } //改用qt的gsetting QStringList valueStringList; const QByteArray ba(SCREENSAVER_SCHEMA); QGSettings * settings = new QGSettings(ba); QMap::iterator it = infoMap.begin(); for (; it != infoMap.end(); it++){ QString id = QString(it.key()); valueStringList.append(id); } settings->set(THEMES_KEY, QVariant(valueStringList)); delete settings; } else{ g_settings_set_enum(screensaver_settings, MODE_KEY, MODE_SINGLE); //获取当前屏保的id QVariant variant = ui->comboBox->itemData(index); SSThemeInfo info = variant.value(); QByteArray ba = info.id.toLatin1(); strv = g_strsplit(ba.data(), "%%%", 1); qDebug() << Q_FUNC_INFO << "wxy-----------" <start(QString("killall"), killList); // process->waitForStarted(); // process->waitForFinished(2000); // killList.clear(); // } } SSThemeInfo Screensaver::_info_new(const char *path){ SSThemeInfo info; GKeyFile * keyfile; char * name, * exec; keyfile = g_key_file_new(); if (!g_key_file_load_from_file(keyfile, path, G_KEY_FILE_NONE, NULL)){ g_key_file_free (keyfile); return info; } name = g_key_file_get_locale_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, NULL, NULL); exec = g_key_file_get_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC, NULL); info.name = QString::fromUtf8(name); info.exec = QString::fromUtf8(exec); info.id = ID_PREFIX + info.name.toLower(); g_key_file_free(keyfile); return info; } SSThemeInfo Screensaver::_newThemeinfo(const char * path){ SSThemeInfo info; GKeyFile * keyfile; char * name, * exec; keyfile = g_key_file_new(); if (!g_key_file_load_from_file(keyfile, path, G_KEY_FILE_NONE, NULL)){ g_key_file_free (keyfile); return info; } name = g_key_file_get_locale_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, NULL, NULL); exec = g_key_file_get_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC, NULL); info.name = QString::fromUtf8(name); info.exec = QString::fromUtf8(exec); info.id = ID_PREFIX + info.name.toLower(); g_key_file_free(keyfile); return info; } void Screensaver::_acquireThemeinfoList(){ GDir * dir; const char * name; infoMap.clear(); dir = g_dir_open(SSTHEMEPATH, 0, NULL); if (!dir) return; while ((name = g_dir_read_name(dir))) { SSThemeInfo info; char * desktopfilepath; if (!g_str_has_suffix(name, ".desktop")) continue; desktopfilepath = g_build_filename(SSTHEMEPATH, name, NULL); info = _newThemeinfo(desktopfilepath); infoMap.insert(info.id, info); g_free (desktopfilepath); } g_dir_close(dir); } void Screensaver::init_theme_info_map(){ GDir * dir; const char * name; infoMap.clear(); dir = g_dir_open(SSTHEMEPATH, 0, NULL); if (!dir) return; while ((name = g_dir_read_name(dir))) { SSThemeInfo info; char * desktopfilepath; if (!g_str_has_suffix(name, ".desktop")) continue; desktopfilepath = g_build_filename(SSTHEMEPATH, name, NULL); info = _info_new(desktopfilepath); infoMap.insert(info.id, info); g_free (desktopfilepath); } g_dir_close(dir); } ukui-control-center/plugins/personalized/screensaver/screensaver.h0000644000175000017500000000737213635333016024614 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SCREENSAVER_H #define SCREENSAVER_H #include #include #include #include #include #include #include #include #include #include #include #include "shell/interface.h" #include "SwitchButton/switchbutton.h" /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include #include } typedef struct _SSThemeInfo{ QString name; QString exec; QString id; }SSThemeInfo; //自定义数据类型,如果要使用QVariant,就必须使用Q_DECLARE_METATYPE注册。 Q_DECLARE_METATYPE(SSThemeInfo) namespace Ui { class Screensaver; } class PreviewWidget : public QWidget { Q_OBJECT public: PreviewWidget() { } ~PreviewWidget(){ } protected: void paintEvent(QPaintEvent *e); // void showEvent(QShowEvent *e); // void moveEvent(QMoveEvent *e); // void hideEvent(QHideEvent *e); }; class Screensaver : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Screensaver(); ~Screensaver(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void initComponent(); void initPreviewWidget(); void initEnableBtnStatus(); void initThemeStatus(); void initIdleSliderStatus(); void initLockBtnStatus(bool status); void startupScreensaver(); void closeScreensaver(); void _acquireThemeinfoList(); SSThemeInfo _newThemeinfo(const char *path); void component_init(); void status_init(); void set_idle_gsettings_value(int value); void screensaver_switch(); void kill_and_start(); private: Ui::Screensaver *ui; QString pluginName; int pluginType; QWidget * pluginWidget; PreviewWidget * mPreviewWidget; private: SwitchButton * enableSwitchBtn; SwitchButton * lockSwitchBtn; SSThemeInfo _info_new(const char * path); void init_theme_info_map(); QStringList runStringList; QMap infoMap; GSettings * screensaver_settings; GSettings * session_settings; // SwitchButton * activeswitchbtn; // SwitchButton * lockswitchbtn; QProcess * process; QStringList killList; QStyledItemDelegate *itemDelege; private slots: void combobox_changed_slot(int index); void activebtn_changed_slot(bool status); void lockbtn_changed_slot(bool status); void slider_released_slot(); void kill_screensaver_preview(); Q_SIGNALS: void kill_signals(); }; #endif // SCREENSAVER_H ukui-control-center/plugins/personalized/screensaver/screensaver.ui0000644000175000017500000003672713635333016025010 0ustar fengfeng Screensaver 0 0 800 710 0 0 16777215 16777215 Screensaver 2 0 0 32 40 0 0 Screensaver Qt::Vertical QSizePolicy::Fixed 20 14 0 9 400 222 400 222 Qt::Horizontal QSizePolicy::Expanding 40 20 Qt::Vertical QSizePolicy::Fixed 20 22 550 50 960 50 0 0 0 0 0 0 16 16 0 0 Enable screensaver 550 50 960 50 0 0 0 0 0 0 16 16 0 0 182 0 182 16777215 Screensaver program 345 30 345 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } Qt::Horizontal 40 20 550 50 960 50 0 0 0 0 0 0 16 16 0 0 182 0 182 16777215 idle time 250 0 250 16777215 QSlider{ width: 178px; height: 20px; } QSlider::groove:horizontal { border: 0px solid #bbb; } QSlider::sub-page:horizontal { background: #3D6BE5; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::add-page:horizontal { background: rgba(52,70,80,90%); border: 0px solid #777; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::handle:horizontal { width: 20px; height: 20px; background: #3D6BE5; border-radius:10px; } Qt::Horizontal Qt::Horizontal QSizePolicy::Fixed 24 20 48 30 48 30 Qt::Horizontal QSizePolicy::Fixed 2 20 0 0 Min Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 14 550 50 960 50 0 0 0 0 0 0 16 16 0 0 Lock screen when screensaver boot Qt::Vertical 20 40 ukui-control-center/plugins/personalized/wallpaper/0000755000175000017500000000000013642652167021572 5ustar fengfengukui-control-center/plugins/personalized/wallpaper/pictureunit.cpp0000644000175000017500000000300113640364120024626 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "pictureunit.h" #include "MaskWidget/maskwidget.h" PictureUnit::PictureUnit() { _filename = ""; setAttribute(Qt::WA_DeleteOnClose); setFixedSize(QSize(166, 110)); setScaledContents(true); MaskWidget * maskWidget = new MaskWidget(this); maskWidget->setGeometry(0, 0, this->width(), this->height()); } PictureUnit::~PictureUnit() { } void PictureUnit::setFilenameText(QString fn){ _filename = fn; } QString PictureUnit::filenameText(){ return _filename; } void PictureUnit::mousePressEvent(QMouseEvent *e){ if (e->button() == Qt::LeftButton) emit clicked(_filename); // QLabel::mousePressEvent(event); } ukui-control-center/plugins/personalized/wallpaper/wallpaper.ui0000644000175000017500000005160313642652167024125 0ustar fengfeng Wallpaper 0 0 800 710 0 0 16777215 16777215 Wallpaper 0 0 0 32 48 550 0 960 16777215 0 0 0 0 0 24 10 0 0 Desktop Background 0 180 16777215 180 0 0 0 0 0 0 0 300 180 300 180 Qt::Horizontal 40 20 0 0 0 0 0 300 0 300 16777215 Qt::Horizontal 40 20 0 50 16777215 50 0 0 0 0 0 8 16 16 0 0 Select form 144 30 16777215 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } 0 0 Picture options 144 30 16777215 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } 0 0 16777215 16777215 0 48 0 20 0 0 0 0 16777215 16777215 0 24 132 36 132 36 Browser online wp 132 36 132 36 Browser local wp Qt::Horizontal 434 33 132 36 132 36 Restore default wp 0 0 0 0 0 2 24 9 0 60 16777215 60 0 60 16777215 60 0 60 16777215 60 100 36 100 36 Cancel 100 36 100 36 Ok Qt::Horizontal 40 20 ukui-control-center/plugins/personalized/wallpaper/wallpaper.pro0000644000175000017500000000214413640364120024267 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-17T11:16:02 # #------------------------------------------------- QT += widgets xml dbus TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(wallpaper) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/flowlayout.pri) include($$PROJECT_COMPONENTSOURCE/maskwidget.pri) INCLUDEPATH += \ $$PROJECT_ROOTDIR \ $$PROJECT_COMPONENTSOURCE \ LIBS += -L/usr/lib/ -lgsettings-qt ##加载gio库和gio-unix库,用于获取和设置enum类型的gsettings CONFIG += link_pkgconfig \ C++11 PKGCONFIG += gio-2.0 \ gio-unix-2.0 #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ pictureunit.cpp \ wallpaper.cpp \ xmlhandle.cpp \ component/custdomitemmodel.cpp \ simplethread.cpp \ workerobject.cpp HEADERS += \ pictureunit.h \ wallpaper.h \ xmlhandle.h \ component/custdomitemmodel.h \ simplethread.h \ workerobject.h FORMS += \ wallpaper.ui ukui-control-center/plugins/personalized/wallpaper/simplethread.cpp0000644000175000017500000000405513640364120024746 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "simplethread.h" #include #include #include SimpleThread::SimpleThread(QMap > _wpinfo, QObject *parent) : QThread(parent), wallpaperinfosMap(_wpinfo) { } SimpleThread::~SimpleThread() { } void SimpleThread::run(){ QSize IMAGE_SIZE(160, 120); QMap >::iterator iters = wallpaperinfosMap.begin(); for (int row = 0; iters != wallpaperinfosMap.end(); iters++, row++){ //跳过xml的头部信息 if (QString(iters.key()) == "head") continue; //跳过被删除的壁纸 QMap wpMap = (QMap)iters.value(); QString delstatus = QString(wpMap.find("deleted").value()); if (delstatus == "true") continue; QString filename = QString(iters.key()); QPixmap pixmap = QPixmap(filename)/*.scaled(IMAGE_SIZE)*/; emit widgetItemCreate(pixmap, filename); // QPixmap pixmap(filename); // QListWidgetItem * item = new QListWidgetItem(QIcon(pixmap.scaled(IMAGE_SIZE)), ""); // item->setSizeHint(ITEM_SIZE); // item->setData(Qt::UserRole, filename); } } ukui-control-center/plugins/personalized/wallpaper/simplethread.h0000644000175000017500000000251513621411724024414 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SIMPLETHREAD_H #define SIMPLETHREAD_H #include #include #include class SimpleThread : public QThread { Q_OBJECT public: explicit SimpleThread(QMap> _wpinfo, QObject * parent); ~SimpleThread(); protected: void run(); private: QMap> wallpaperinfosMap; Q_SIGNALS: void widgetItemCreate(QPixmap pixmap, QString filename); }; #endif // SIMPLETHREAD_H ukui-control-center/plugins/personalized/wallpaper/wallpaper.h0000644000175000017500000000642713642652167023743 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef WALLPAPER_H #define WALLPAPER_H #include #include #include #include #include #include #include #include #include "shell/interface.h" #include "FlowLayout/flowlayout.h" #include "xmlhandle.h" #include "component/custdomitemmodel.h" #include "simplethread.h" #include "workerobject.h" /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include } #define BACKGROUND "org.mate.background" //图片文件路径 #define FILENAME "picture-filename" //图片不透明度 #define OPACITY "picture-opacity" //图片放置方式 #define OPTIONS "picture-options" //主色 #define PRIMARY "primary-color" //副色 #define SECONDARY "secondary-color" namespace Ui { class Wallpaper; } class Wallpaper : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Wallpaper(); ~Wallpaper(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupQStylesheet(); void setupComponent(); void setupConnect(); void initBgFormStatus(); int _getCurrentBgForm(); void initPreviewStatus(); void showLocalWpDialog(); void showComponent(int index); private: Ui::Wallpaper *ui; QString pluginName; int pluginType; QWidget * pluginWidget; private: FlowLayout * picFlowLayout; FlowLayout * colorFlowLayout; private: QMap > wallpaperinfosMap; XmlHandle * xmlhandleObj; QGSettings * bgsettings; QString localwpconf; QMap delItemsMap; CustdomItemModel wpListModel; //尝试mode view void setlistview(); void setModeldata(); private: QThread * pThread; WorkerObject * pObject; QMap picWpItemMap; QStyledItemDelegate *itemDelege; private: bool settingsCreate; public slots: void resetDefaultWallpaperSlot(); void wpOptionsChangedSlot(QString op); public slots: void add_custom_wallpaper(); void del_wallpaper(); }; #endif // WALLPAPER_H ukui-control-center/plugins/personalized/wallpaper/wallpaper.cpp0000644000175000017500000004377413642652167024304 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "wallpaper.h" #include "ui_wallpaper.h" #include #include #include "pictureunit.h" #include "MaskWidget/maskwidget.h" #include enum{ PICTURE, //图片背景 COLOR, //纯色背景 SLIDESHOW //幻灯片背景 }; #define ITEMWIDTH 182 #define ITEMHEIGH 126 #define COLORITEMWIDTH 56 #define COLORITEMHEIGH 56 Wallpaper::Wallpaper() { ui = new Ui::Wallpaper; itemDelege = new QStyledItemDelegate(); pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("background"); pluginType = PERSONALIZED; settingsCreate = false; //设置样式 setupQStylesheet(); //初始化控件 setupComponent(); //初始化gsettings const QByteArray id(BACKGROUND); if (QGSettings::isSchemaInstalled(id)){ settingsCreate = true; bgsettings = new QGSettings(id); setupConnect(); initBgFormStatus(); } //构建xmlhandle对象 xmlhandleObj = new XmlHandle(); } Wallpaper::~Wallpaper() { delete ui; if (settingsCreate){ delete bgsettings; } delete xmlhandleObj; } QString Wallpaper::get_plugin_name(){ return pluginName; } int Wallpaper::get_plugin_type(){ return pluginType; } QWidget *Wallpaper::get_plugin_ui(){ return pluginWidget; } void Wallpaper::plugin_delay_control(){ } void Wallpaper::setupQStylesheet(){ pluginWidget->setStyleSheet("background: #ffffff;"); ui->previewLabel->setStyleSheet("QLabel#previewLabel{border-radius: 6px;}"); ui->switchWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); // ui->listWidget->setStyleSheet("QListWidget#listWidget{background: #ffffff; border: none;}"); // ui->colorListWidget->setStyleSheet("QListWidget#colorListWidget{background: #ffffff; border: none;}"); QString btnQss = QString("QPushButton{background: #E9E9E9; border-radius: 4px;}" "QPushButton:hover:!pressed{background: #3d6be5; border: none; border-radius: 4px;}" "QPushButton:hover:pressed{background: #415FC4; border: none; border-radius: 4px;}"); ui->browserLocalwpBtn->setStyleSheet(btnQss); ui->browserOnlinewpBtn->setStyleSheet(btnQss); ui->resetBtn->setStyleSheet(btnQss); } void Wallpaper::setupComponent(){ // ui->browserLocalwpBtn->hide(); ui->browserOnlinewpBtn->hide(); //背景形式 QStringList formList; formList << tr("picture") << tr("color")/* << tr("slideshow")*/ ; ui->formComBox->setItemDelegate(itemDelege); ui->formComBox->setMaxVisibleItems(5); // ui->formComBox->addItems(formList); ui->formComBox->addItem(formList.at(0), PICTURE); ui->formComBox->addItem(formList.at(1), COLOR); // ui->formComBox->addItem(formList.at(2), SLIDESHOW); ui->picOptionsComBox->setItemDelegate(itemDelege); ui->picOptionsComBox->setMaxVisibleItems(5); //预览遮罩 MaskWidget * maskWidget = new MaskWidget(ui->previewLabel); maskWidget->setGeometry(0, 0, ui->previewLabel->width(), ui->previewLabel->height()); ///图片背景 picFlowLayout = new FlowLayout(ui->picListWidget); picFlowLayout->setContentsMargins(0, 0, 0, 0); ui->picListWidget->setLayout(picFlowLayout); //纯色背景 colorFlowLayout = new FlowLayout(ui->colorListWidget); colorFlowLayout->setContentsMargins(0, 0, 0, 0); ui->colorListWidget->setLayout(colorFlowLayout); //壁纸放置方式 ui->picOptionsComBox->addItem(tr("wallpaper"), "wallpaper"); ui->picOptionsComBox->addItem(tr("centered"), "centered"); ui->picOptionsComBox->addItem(tr("scaled"), "scaled"); ui->picOptionsComBox->addItem(tr("stretched"), "stretched"); ui->picOptionsComBox->addItem(tr("zoom"), "zoom"); ui->picOptionsComBox->addItem(tr("spanned"), "spanned"); //屏蔽背景放置方式无效 ui->picOptionsComBox->hide(); ui->picOptionsLabel->hide(); //屏蔽纯色背景的确定按钮 ui->cancelBtn->hide(); ui->certainBtn->hide(); } void Wallpaper::setupConnect(){ //使用线程构建本地壁纸文件;获取壁纸压缩QPixmap pThread = new QThread; pObject = new WorkerObject; connect(pObject, &WorkerObject::pixmapGenerate, this, [=](QPixmap pixmap, QString filename){ PictureUnit * picUnit = new PictureUnit; picUnit->setPixmap(pixmap); picUnit->setFilenameText(filename); connect(picUnit, &PictureUnit::clicked, [=](QString fn){ // ui->previewLabel->setPixmap(pixmap.scaled(ui->previewLabel->size())); bgsettings->set(FILENAME, fn); ui->previewStackedWidget->setCurrentIndex(PICTURE); }); picFlowLayout->addWidget(picUnit); }); connect(pObject, &WorkerObject::workComplete, this, [=](QMap> wpInfoMaps){ wallpaperinfosMap = wpInfoMaps; pThread->quit(); //退出事件循环 pThread->wait(); //释放资源 }); pObject->moveToThread(pThread); connect(pThread, &QThread::started, pObject, &WorkerObject::run); connect(pThread, &QThread::finished, this, [=]{ // if (ui->formComBox->currentIndex() == PICTURE){ //设置当前壁纸放置方式 // if (wallpaperinfosMap.contains(filename)){ // QMap currentwpMap = wallpaperinfosMap.value(filename); // if (currentwpMap.contains("options")){ // QString opStr = QString::fromLocal8Bit("%1").arg(currentwpMap.value("options")); // ui->picOptionsComBox->blockSignals(true); // ui->picOptionsComBox->setCurrentText(tr("%1").arg(opStr)); // ui->picOptionsComBox->blockSignals(false); // } // } // } }); connect(pThread, &QThread::finished, pObject, &WorkerObject::deleteLater); pThread->start(); connect(ui->picOptionsComBox, SIGNAL(currentTextChanged(QString)), this, SLOT(wpOptionsChangedSlot(QString))); connect(ui->browserLocalwpBtn, &QPushButton::clicked, [=]{ showLocalWpDialog(); }); connect(ui->resetBtn, SIGNAL(clicked(bool)), this, SLOT(resetDefaultWallpaperSlot())); ///纯色背景 QStringList colors; colors << "#2d7d9a" << "#018574" << "#107c10" << "#10893e" << "#038387" << "#486860" << "#525e54" << "#7e735f" << "#4c4a48" << "#000000"; colors << "#ff8c00" << "#e81123" << "#d13438" << "#c30052" << "#bf0077" << "#9a0089" << "#881798" << "#744da9" << "#8764b8" << "#e9e9e9"; for (QString color : colors){ QPushButton * button = new QPushButton(ui->colorListWidget); button->setFixedSize(QSize(48, 48)); QString btnQss = QString("QPushButton{background: %1; border: none; border-radius: 4px;}").arg(color); button->setStyleSheet(btnQss); connect(button, &QPushButton::clicked, [=]{ QString widgetQss = QString("QWidget{background: %1; border-radius: 6px;}").arg(color); ui->previewWidget->setStyleSheet(widgetQss); ///设置系统纯色背景 bgsettings->set(FILENAME, ""); bgsettings->set(PRIMARY, QVariant(color)); ui->previewStackedWidget->setCurrentIndex(COLOR); }); colorFlowLayout->addWidget(button); } connect(ui->formComBox, QOverload::of(&QComboBox::currentIndexChanged), [=](int index){ Q_UNUSED(index) //切换 int currentPage = ui->formComBox->currentData(Qt::UserRole).toInt(); ui->substackedWidget->setCurrentIndex(currentPage); if (currentPage == PICTURE){ } else if (currentPage == COLOR){ } }); //壁纸变动后改变用户属性 connect(bgsettings, &QGSettings::changed, [=](QString key){ initBgFormStatus(); //GSettings key picture-filename 这里收到 pictureFilename的返回值 if (!QString::compare(key, "pictureFilename")){ QString curPicname = bgsettings->get(key).toString(); QDBusInterface * interface = new QDBusInterface("org.freedesktop.Accounts", "/org/freedesktop/Accounts", "org.freedesktop.Accounts", QDBusConnection::systemBus()); if (!interface->isValid()){ qCritical() << "Create /org/freedesktop/Accounts Client Interface Failed " << QDBusConnection::systemBus().lastError(); return; } QDBusReply reply = interface->call("FindUserByName", g_get_user_name()); QString userPath; if (reply.isValid()){ userPath = reply.value().path(); } else { qCritical() << "Call 'GetComputerInfo' Failed!" << reply.error().message(); return; } QDBusInterface * useriFace = new QDBusInterface("org.freedesktop.Accounts", userPath, "org.freedesktop.Accounts.User", QDBusConnection::systemBus()); if (!useriFace->isValid()){ qCritical() << QString("Create %1 Client Interface Failed").arg(userPath) << QDBusConnection::systemBus().lastError(); return; } QDBusMessage msg = useriFace->call("SetBackgroundFile", curPicname); if (!msg.errorMessage().isEmpty()) qDebug() << "update user background file error: " << msg.errorMessage(); } }); } int Wallpaper::_getCurrentBgForm(){ QString filename = bgsettings->get(FILENAME).toString(); int current = 0; //设置当前背景形式 if (filename.isEmpty()){ current = COLOR; } else if (filename.endsWith("xml")){ current = SLIDESHOW; } else { current = PICTURE; } return current; } void Wallpaper::initBgFormStatus(){ initPreviewStatus(); int currentIndex = _getCurrentBgForm(); //设置当前背景形式 ui->formComBox->blockSignals(true); ui->formComBox->setCurrentIndex(currentIndex); ui->formComBox->blockSignals(false); ui->substackedWidget->setCurrentIndex(currentIndex); ui->previewStackedWidget->setCurrentIndex(currentIndex); //根据背景形式选择显示组件 showComponent(currentIndex); } void Wallpaper::showComponent(int index){ if (PICTURE == index){ //图片 // ui->picOptionsComBox->show(); // ui->picOptionsLabel->show(); } else if (COLOR == index){ //纯色 // ui->picOptionsComBox->hide(); // ui->picOptionsLabel->hide(); } else { //幻灯片 } } void Wallpaper::initPreviewStatus(){ //设置图片背景的预览效果 QString filename = bgsettings->get(FILENAME).toString(); QByteArray ba = filename.toLatin1(); if (g_file_test(ba.data(), G_FILE_TEST_EXISTS)){ ui->previewLabel->setPixmap(QPixmap(filename).scaled(ui->previewLabel->size())); } else { ui->previewLabel->setPixmap(QPixmap("://img/plugins/wallpaper/none.png").scaled(ui->previewLabel->size())); } //设置纯色背景的预览效果 QString color = bgsettings->get(PRIMARY).toString(); if (!color.isEmpty()){ QString widgetQss = QString("QWidget{background: %1; border-radius: 6px;}").arg(color); ui->previewWidget->setStyleSheet(widgetQss); } } void Wallpaper::wpOptionsChangedSlot(QString op){ //获取当前选中的壁纸 // QListWidgetItem * currentitem = ui->listWidget->currentItem(); // QString filename = currentitem->data(Qt::UserRole).toString(); bgsettings->set(OPTIONS, ui->picOptionsComBox->currentData().toString()); //更新xml数据 // if (wallpaperinfosMap.contains(filename)){ // wallpaperinfosMap[filename]["options"] = op; // } //将改动保存至文件 xmlhandleObj->xmlUpdate(wallpaperinfosMap); } void Wallpaper::setlistview(){ //初始化listview // ui->listView->setFocusPolicy(Qt::NoFocus); // ui->listView->setAutoFillBackground(true); // ui->listView->setIconSize(QSize(160, 100)); // ui->listView->setResizeMode(QListView::Adjust); // ui->listView->setModel(&wpListModel); // ui->listView->setViewMode(QListView::IconMode); // ui->listView->setSpacing(5); } void Wallpaper::setModeldata(){ QMap >::iterator iters = wallpaperinfosMap.begin(); for (int row = 0; iters != wallpaperinfosMap.end(); iters++, row++){ if (QString(iters.key()) == "head") //跳过xml的头部信息 continue; QMap wpMap = (QMap)iters.value(); QString delstatus = QString(wpMap.find("deleted").value()); if (delstatus == "true") //跳过被删除的壁纸 continue; QString filename = QString(iters.key()); QPixmap pixmap(filename); wpListModel.insertRows(row, 1, QModelIndex()); QModelIndex wpindex = wpListModel.index(row, 0, QModelIndex()); wpListModel.setData(wpindex, QIcon(pixmap.scaled(QSize(160,100))), Qt::DecorationRole); wpListModel.setData(wpindex, QString("%1\nfolder: %2\n").arg(wpMap.find("name").value()).arg(filename), Qt::ToolTipRole); } } void Wallpaper::resetDefaultWallpaperSlot(){ GSettings * wpgsettings; wpgsettings = g_settings_new(BACKGROUND); GVariant * variant = g_settings_get_default_value(wpgsettings, FILENAME); gsize size = g_variant_get_size(variant); const char * dwp = g_variant_get_string(variant, &size); g_object_unref(wpgsettings); bgsettings->set(FILENAME, QVariant(QString(dwp))); } void Wallpaper::showLocalWpDialog(){ QString filters = "Wallpaper files(*.png *.jpg)"; QFileDialog fd; fd.setDirectory(QString(const_cast(g_get_user_special_dir(G_USER_DIRECTORY_PICTURES)))); fd.setAcceptMode(QFileDialog::AcceptOpen); fd.setViewMode(QFileDialog::List); fd.setNameFilter(filters); fd.setFileMode(QFileDialog::ExistingFile); fd.setWindowTitle(tr("selsect custom wallpaper file")); fd.setLabelText(QFileDialog::Accept, tr("Select")); fd.setLabelText(QFileDialog::LookIn, tr("Position: ")); fd.setLabelText(QFileDialog::FileName, tr("FileName: ")); fd.setLabelText(QFileDialog::FileType, tr("FileType: ")); fd.setLabelText(QFileDialog::Reject, tr("Cancel")); if (fd.exec() != QDialog::Accepted) return; QString selectedfile; selectedfile = fd.selectedFiles().first(); ///TODO: chinese and space support if (g_file_test(selectedfile.toLatin1().data(), G_FILE_TEST_EXISTS)) bgsettings->set(FILENAME, QVariant(selectedfile)); else bgsettings->reset(FILENAME); } void Wallpaper::add_custom_wallpaper(){ QString filters = "Wallpaper files(*.png *.jpg)"; QFileDialog fd; fd.setDirectory(QString(const_cast(g_get_user_special_dir(G_USER_DIRECTORY_PICTURES)))); fd.setAcceptMode(QFileDialog::AcceptOpen); fd.setViewMode(QFileDialog::List); fd.setNameFilter(filters); fd.setFileMode(QFileDialog::ExistingFile); fd.setWindowTitle(tr("selsect custom wallpaper file")); fd.setLabelText(QFileDialog::Accept, tr("Select")); fd.setLabelText(QFileDialog::LookIn, tr("Position: ")); fd.setLabelText(QFileDialog::FileName, tr("FileName: ")); fd.setLabelText(QFileDialog::FileType, tr("FileType: ")); fd.setLabelText(QFileDialog::Reject, tr("Cancel")); if (fd.exec() != QDialog::Accepted) return; QString selectedfile; selectedfile = fd.selectedFiles().first(); QSize IMAGE_SIZE(160, 120); QPixmap pixmap = QPixmap(selectedfile).scaled(IMAGE_SIZE); // append_item(pixmap, selectedfile); if (wallpaperinfosMap.contains(selectedfile)){ wallpaperinfosMap[selectedfile]["deleted"] = "false"; } else{ QMap tmpinfo; tmpinfo.insert("artist", "(none)"); tmpinfo.insert("deleted", "false"); tmpinfo.insert("filename", selectedfile); tmpinfo.insert("name", selectedfile.split("/").last()); tmpinfo.insert("options", "zoom"); tmpinfo.insert("pcolor", "#000000"); tmpinfo.insert("scolor", "#000000"); tmpinfo.insert("shade_type", "solid"); wallpaperinfosMap.insert(selectedfile, tmpinfo); } xmlhandleObj->xmlUpdate(wallpaperinfosMap); if (picWpItemMap.contains(selectedfile)){ // ui->listWidget->setCurrentItem(picWpItemMap.find(selectedfile).value()); } } void Wallpaper::del_wallpaper(){ //获取当前选中的壁纸 // QListWidgetItem * currentitem = ui->listWidget->currentItem(); // QString filename = currentitem->data(Qt::UserRole).toString(); //更新xml数据 // if (wallpaperinfosMap.contains(filename)){ // wallpaperinfosMap[filename]["deleted"] = "true"; // int row = ui->listWidget->row(currentitem); // int nextrow = ui->listWidget->count() - 1 - row ? row + 1 : row - 1; // ui->listWidget->setCurrentItem(ui->listWidget->item(nextrow)); // ui->listWidget->takeItem(row); // } // 将改动保存至文件 xmlhandleObj->xmlUpdate(wallpaperinfosMap); } ukui-control-center/plugins/personalized/wallpaper/component/0000755000175000017500000000000013556706375023601 5ustar fengfengukui-control-center/plugins/personalized/wallpaper/component/custdomitemmodel.h0000644000175000017500000000422613556706375027334 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CUSTDOMITEMMODEL_H #define CUSTDOMITEMMODEL_H #include #include //#include class CustdomItemModel : public QAbstractTableModel { public: CustdomItemModel(); ~CustdomItemModel(); // virtual QModelIndex index(int row, int column = 0, const QModelIndex & parent = QModelIndex()) const; // virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) const; // void setCurrentMap(const QMap > &map); virtual QModelIndex index(int row, int column, const QModelIndex &parent) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; // bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()); bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()); private: // QString current_key(int offset) const; QStringList rowStringList; // QMap > currentMap; QList itemList; }; #endif // CUSTDOMITEMMODEL_H ukui-control-center/plugins/personalized/wallpaper/component/custdomitemmodel.cpp0000644000175000017500000000626413556706375027673 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "custdomitemmodel.h" #include CustdomItemModel::CustdomItemModel() { } CustdomItemModel::~CustdomItemModel() { } QModelIndex CustdomItemModel::index(int row, int column, const QModelIndex &parent) const { Q_UNUSED(parent); if (row >= 0 && row < rowCount() && column >= 0 && column < columnCount()){ QStandardItem * item = itemList.at(row); return createIndex(row, column, (void *)(item)); } return QModelIndex(); } int CustdomItemModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); return 1; } int CustdomItemModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent); return itemList.count(); } QVariant CustdomItemModel::data(const QModelIndex &index, int role) const { qDebug() << role << "**********role***"; if (!index.isValid()) return QVariant(); if (role == Qt::DisplayRole){ QStandardItem * item = itemList.at(index.row()); return QVariant(item->text()); } else if (role == Qt::DecorationRole){ QStandardItem * item = itemList.at(index.row()); return QVariant(item->icon()); } else if (role == Qt::ToolTipRole){ QStandardItem * item = itemList.at(index.row()); return item->toolTip(); } else return QVariant(); } bool CustdomItemModel::setData(const QModelIndex &index, const QVariant &value, int role){ if (index.isValid() && role == Qt::EditRole){ QStandardItem * item = itemList.at(index.row()); item->setText(value.toString()); emit dataChanged(index, index); return true; } else if (role == Qt::DecorationRole){ QStandardItem * item = itemList.at(index.row()); item->setIcon(value.value()); return true; } else if (role == Qt::ToolTipRole){ QStandardItem * item = itemList.at(index.row()); item->setToolTip(value.toString()); return true; } else return false; } bool CustdomItemModel::insertRows(int row, int count, const QModelIndex &parent){ Q_UNUSED(parent); beginInsertRows(QModelIndex(), row, row + count - 1); for (int i = 0; i < count; i++){ QStandardItem * item = new QStandardItem(); item->setSizeHint(QSize(160, 160)); itemList.insert(row, item); } endInsertRows(); return true; } ukui-control-center/plugins/personalized/wallpaper/xmlhandle.cpp0000644000175000017500000002530113635333016024242 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "xmlhandle.h" #include XmlHandle::XmlHandle() { localconf = QString("%1/%2/%3").arg(QDir::homePath()).arg(".config/ukui").arg("wallpaper.xml"); } XmlHandle::~XmlHandle() { } void XmlHandle::init(){ // wallpapersMap.clear(); QFile file(localconf); //如果用户本地壁纸XML文件不存在,创建 if (!file.exists()){ QStringList files = _getXmlFiles(WALLPAPERDIR); for (int num = 0; num < files.length(); num++){ xmlreader(files[num]); } _xmlGenerate(); //创建完成,清空QMap wallpapersMap.clear(); } //重新解析本地壁纸信息,并填充QMap xmlreader(localconf); } QStringList XmlHandle::_getXmlFiles(QString path){ xmlDir = QDir(path); QStringList xmlfilesStringList; foreach (QString filename, xmlDir.entryList(QDir::Files)) { if (filename.endsWith(".xml")) xmlfilesStringList.append(QString("%1/%2").arg(WALLPAPERDIR).arg(filename)); } return xmlfilesStringList; } void XmlHandle::xmlreader(QString filename){ QFile file(filename); if (!file.open(QFile::ReadOnly | QFile::Text)){ QMap > tmpMap; qDebug() << "Error Open XML File When Reader Xml: " << file.errorString(); // return tmpMap; return; } //旧清理数据 // wpMap.clear(); // headMap.clear(); QMap headMap; QXmlStreamReader reader; reader.setDevice(&file); while (!reader.atEnd()) { QXmlStreamReader::TokenType nType = reader.readNext(); switch (nType) { case QXmlStreamReader::StartDocument: { QString versionStr = reader.documentVersion().toString(); QString encodingStr = reader.documentEncoding().toString(); headMap.insert("version", versionStr); headMap.insert("encoding", encodingStr); // bool aloneBool = reader.isStandaloneDocument(); // qDebug() << QString::fromLocal8Bit("Version: %1 encoding: %2 standalone: %3").arg(versionStr).arg(encodingStr).arg(aloneBool); break; } case QXmlStreamReader::DTD: { QString dtdStr = reader.text().toString(); QString dtdnameStr = reader.dtdName().toString(); QString dtdsystemidStr = reader.dtdSystemId().toString(); headMap.insert("doctype", dtdnameStr); headMap.insert("system", dtdsystemidStr); // qDebug() << QString::fromLocal8Bit("DTD:%1; DTD name:%2; systemid:%3").arg(dtdStr).arg(dtdnameStr).arg(dtdsystemidStr); break; } case QXmlStreamReader::Comment: { QString commentStr = reader.text().toString(); break; } case QXmlStreamReader::StartElement: { QString elementnameStr = reader.name().toString(); if (elementnameStr == "wallpapers"){ //根元素 _parseWallpaper(reader); } break; } case QXmlStreamReader::EndDocument: { break; } default: break; } } wallpapersMap.insert("head", headMap); if (reader.hasError()){ qDebug() << QString::fromLocal8Bit("msg: %1; line: %2; column: %3; char shift: %4").arg(reader.errorString()).arg(reader.lineNumber()).arg(reader.columnNumber()).arg(reader.characterOffset()); } file.close(); // return wallpapersMap; } QMap > XmlHandle::requireXmlData(){ return wallpapersMap; } void XmlHandle::_parseWallpaper(QXmlStreamReader &reader){ QMap wpMap; while (!reader.atEnd()) { reader.readNext(); if (reader.isStartElement()){ QString elementnameStr = reader.name().toString(); if (elementnameStr == "wallpaper"){ wpMap.clear(); // qDebug() << QString::fromLocal8Bit("******开始元素***"); QXmlStreamAttributes wp_attributes = reader.attributes(); if (wp_attributes.hasAttribute("deleted")){ QString deletedStr = wp_attributes.value("deleted").toString(); wpMap.insert("deleted", deletedStr); } } else if (elementnameStr == "name"){ QXmlStreamAttributes name_attributes = reader.attributes(); if (name_attributes.hasAttribute("xml:lang")){ QString langStr = name_attributes.value("xml:lang").toString(); // qDebug() << QString::fromLocal8Bit("name zh_CN: %1").arg(reader.readElementText()); wpMap.insert("name.zh_CN", reader.readElementText()); } else wpMap.insert("name", reader.readElementText()); } else wpMap.insert(elementnameStr, reader.readElementText()); } else if (reader.isEndElement()){ QString elementnameStr = reader.name().toString(); if (elementnameStr == "wallpaper"){ // QMap tmpMap; // QMap::iterator it=wpMap.begin(); // for (;it!=wpMap.end(); it++){ // tmpMap.insert(it.key(),it.value()); //// qDebug() << QString::fromLocal8Bit("key: %1\t value: %2\n").arg(it.key()).arg(it.value()); // } QString filename = QString(wpMap.find("filename").value()); QFile file(filename); if (!filename.endsWith("xml") && file.exists()) //slide show not append and file must exist! wallpapersMap.insert(QString(wpMap.find("filename").value()), wpMap); // qDebug() << QString::fromLocal8Bit("******结束元素***") << wpList.length(); } else if (elementnameStr == "wallpapers"){ // qDebug() << QString::fromLocal8Bit("*******结束元素****"); break; } } } } void XmlHandle::_xmlGenerate(){ QFile file(localconf); if (!file.open(QFile::WriteOnly | QFile::Text)){ qDebug() << "Error Open XML file when generate local xml: " << file.errorString(); return; } QMap currentheadMap; currentheadMap = (QMap)wallpapersMap.find("head").value(); QXmlStreamWriter writer; writer.setDevice(&file); writer.setAutoFormatting(true); //自动格式化 // writer.setCodec(headMap.find("encoding")); writer.writeStartDocument(QString(currentheadMap.find("version").value()), false); //DTD writer.writeDTD(QString::fromLocal8Bit("").arg(currentheadMap.find("doctype").value()).arg(currentheadMap.find("system").value())); //BODY writer.writeStartElement("wallpapers"); QMap >::iterator its = wallpapersMap.begin(); for (; its != wallpapersMap.end(); its++){ if (QString(its.key()) == "head") //跳过xml的头信息 continue; QMap sourceMap = (QMap)its.value(); QMap::iterator it = sourceMap.begin(); writer.writeStartElement("wallpaper"); if (sourceMap.contains("deleted")) writer.writeAttribute("deleted", QString(sourceMap.find("deleted").value())); else writer.writeAttribute("deleted", "false"); if (sourceMap.contains("artist")) writer.writeTextElement("artist", QString(sourceMap.find("artist").value())); else writer.writeTextElement("artist", "(none)"); for(; it != sourceMap.end(); it++){ if (it.key() == "deleted") continue; if (it.key() == "name") continue; if (it.key() == "name.zh_CN") writer.writeTextElement("name", QString(it.value())); else writer.writeTextElement(QString(it.key()), QString(it.value())); } writer.writeEndElement(); } writer.writeEndElement(); writer.writeEndDocument(); file.close(); } void XmlHandle::xmlUpdate(QMap > wallpaperinfosMap){ QFile file(localconf); if (!file.open(QFile::WriteOnly | QFile::Text)){ qDebug() << "Error Open XML File When Update Local Xml: " << file.errorString(); return; } if (0 == wallpaperinfosMap.count()){ qDebug() << "Error QMap Empty"; return; } QMap currentheadMap; currentheadMap = wallpaperinfosMap.find("head").value(); QXmlStreamWriter writer; writer.setDevice(&file); writer.setAutoFormatting(true); //自动格式化 // writer.setCodec(headMap.find("encoding")); writer.writeStartDocument(QString(currentheadMap.find("version").value()), false); //DTD writer.writeDTD(QString::fromLocal8Bit("").arg(currentheadMap.find("doctype").value()).arg(currentheadMap.find("system").value())); //BODY writer.writeStartElement("wallpapers"); QMap >::iterator its = wallpaperinfosMap.begin(); for (; its != wallpaperinfosMap.end(); its++){ if (QString(its.key()) == "head") continue; QMap sourceMap = (QMap)its.value(); QMap::iterator it = sourceMap.begin(); writer.writeStartElement("wallpaper"); writer.writeAttribute("deleted", QString(sourceMap.find("deleted").value())); for(; it != sourceMap.end(); it++){ if (it.key() == "deleted") continue; writer.writeTextElement(QString(it.key()), QString(it.value())); } writer.writeEndElement(); } writer.writeEndElement(); writer.writeEndDocument(); file.close(); } ukui-control-center/plugins/personalized/wallpaper/pictureunit.h0000644000175000017500000000243213640364120024302 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef PICTUREUNIT_H #define PICTUREUNIT_H #include #include class PictureUnit : public QLabel { Q_OBJECT public: explicit PictureUnit(); ~PictureUnit(); public: void setFilenameText(QString fn); QString filenameText(); public: QString _filename; protected: void mousePressEvent(QMouseEvent * e); Q_SIGNALS: void clicked(QString filename); }; #endif // PICTUREUNIT_H ukui-control-center/plugins/personalized/wallpaper/workerobject.h0000644000175000017500000000256113635333016024436 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef WORKEROBJECT_H #define WORKEROBJECT_H #include #include #include "xmlhandle.h" class WorkerObject : public QObject { Q_OBJECT public: explicit WorkerObject(); ~WorkerObject(); public: void run(); private: XmlHandle * xmlHandleObj; QMap > wallpaperinfosMap; Q_SIGNALS: void pixmapGenerate(QPixmap pixmap, QString filename); void workComplete(QMap> wpInfoMaps); }; #endif // WORKEROBJECT_H ukui-control-center/plugins/personalized/wallpaper/workerobject.cpp0000644000175000017500000000433613641356275025004 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "workerobject.h" #include "xmlhandle.h" #include #include WorkerObject::WorkerObject() { //自定义结构提,线程传递时无法放入列表,注册解决 qRegisterMetaType>>("QMap>"); } WorkerObject::~WorkerObject() { delete xmlHandleObj; } void WorkerObject::run(){ //构建xmlhandle对象 xmlHandleObj = new XmlHandle(); //解析壁纸数据,如果本地xml文件不存在则自动构建 xmlHandleObj->init(); //获取壁纸数据 wallpaperinfosMap = xmlHandleObj->requireXmlData(); //压缩壁纸 QSize IMAGE_SIZE(166, 110); QMap >::iterator iters = wallpaperinfosMap.begin(); for (int row = 0; iters != wallpaperinfosMap.end(); iters++, row++){ //跳过xml的头部信息 if (QString(iters.key()) == "head") continue; //跳过被删除的壁纸 QMap wpMap = (QMap)iters.value(); QString delstatus = QString(wpMap.find("deleted").value()); if (delstatus == "true") continue; QString filename = QString(iters.key()); QPixmap pixmap = QPixmap(filename).scaled(IMAGE_SIZE); emit pixmapGenerate(pixmap, filename); } emit workComplete(wallpaperinfosMap); } ukui-control-center/plugins/personalized/wallpaper/xmlhandle.h0000644000175000017500000000314613621411724023710 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef XMLHANDLE_H #define XMLHANDLE_H #include #include #include #include #include #include #define WALLPAPERDIR "/usr/share/ukui-background-properties/" class XmlHandle{ public: XmlHandle(); ~XmlHandle(); public: void init(); void xmlreader(QString filename); void xmlUpdate(QMap> wallpaperinfosMap); QMap > requireXmlData(); public: QString localconf; private: QDir xmlDir; private: QStringList _getXmlFiles(QString path); void _parseWallpaper(QXmlStreamReader &reader); void _xmlGenerate(); QMap> wallpapersMap; }; #endif // XMLHANDLE_H ukui-control-center/plugins/personalized/theme/0000755000175000017500000000000013641405665020703 5ustar fengfengukui-control-center/plugins/personalized/theme/widgetgroup.cpp0000644000175000017500000000275713635333016023753 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "widgetgroup.h" #include "themewidget.h" #include WidgetGroup::WidgetGroup(QObject *parent) : QObject(parent) { _preWidget = nullptr; _curWidget = nullptr; } WidgetGroup::~WidgetGroup() { } void WidgetGroup::addWidget(ThemeWidget *widget, int id){ Q_UNUSED(id) connect(widget, &ThemeWidget::clicked, [=]{ _preWidget = _curWidget; _curWidget = widget; emit widgetChanged(_preWidget, _curWidget); }); } void WidgetGroup::removeWidget(ThemeWidget *widget){ disconnect(widget, 0, 0, 0); } void WidgetGroup::setCurrentWidget(ThemeWidget *widget){ _curWidget = widget; } ukui-control-center/plugins/personalized/theme/themewidget.h0000644000175000017500000000327613635333016023363 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef THEMEWIDGET_H #define THEMEWIDGET_H #include #include #include #include class QLabel; class ThemeWidget : public QWidget { Q_OBJECT public: explicit ThemeWidget(QSize iSize, QString name, QStringList iStringList , QWidget *parent = 0); explicit ThemeWidget(QSize iSize, QString name, const QList &listMap , QWidget *parent = 0); ~ThemeWidget(); public: void setSelectedStatus(bool status); void setValue(QString value); QString getValue(); public: QLabel * selectedLabel; QLabel * placeHolderLabel; protected: virtual void paintEvent(QPaintEvent * event); virtual void mousePressEvent(QMouseEvent * event); private: QString pValue; QList listMap; bool isCursor; Q_SIGNALS: void clicked(); }; #endif // THEMEWIDGET_H ukui-control-center/plugins/personalized/theme/theme.pro0000644000175000017500000000163413635333016022524 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-21T10:50:19 # #------------------------------------------------- QT += widgets KConfigCore KI18n x11extras TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(theme) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lgsettings-qt -lX11 -lXfixes -lXcursor #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ cursor/cursortheme.cpp \ cursor/xcursortheme.cpp \ theme.cpp \ themewidget.cpp \ widgetgroup.cpp HEADERS += \ cursor/config-X11.h \ cursor/cursortheme.h \ cursor/xcursortheme.h \ theme.h \ themewidget.h \ widgetgroup.h FORMS += \ theme.ui RESOURCES += ukui-control-center/plugins/personalized/theme/theme.h0000644000175000017500000000445513641405665022166 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef THEME_H #define THEME_H #include #include #include #include #include #include "shell/interface.h" class QPushButton; class SwitchButton; class QGSettings; class WidgetGroup; namespace Ui { class Theme; } class Theme : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Theme(); ~Theme(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupStylesheet(); void setupComponent(); void initThemeMode(); void initIconTheme(); void setupControlTheme(); void initCursorTheme(); void initEffectSettings(); void initConnection(); void buildThemeModeBtn(QPushButton * button, QString name, QString icon); QString dullTranslation(QString str); QStringList _getSystemCursorThemes(); private: void clearLayout(QLayout* mlayout, bool deleteWidgets); private: Ui::Theme *ui; QString pluginName; int pluginType; QWidget * pluginWidget; private: QGSettings * gtkSettings; QGSettings * qtSettings; QGSettings * curSettings; SwitchButton * effectSwitchBtn; WidgetGroup * iconThemeWidgetGroup; bool settingsCreate; private slots: void resetBtnClickSlot(); }; #endif // THEME_H ukui-control-center/plugins/personalized/theme/widgetgroup.h0000644000175000017500000000267513635333016023417 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef WIDGETGROUP_H #define WIDGETGROUP_H #include class ThemeWidget; class WidgetGroup : public QObject { Q_OBJECT public: explicit WidgetGroup(QObject *parent = nullptr); ~WidgetGroup(); public: void addWidget(ThemeWidget * widget, int id = -1); void removeWidget(ThemeWidget * widget); void setCurrentWidget(ThemeWidget * widget); private: ThemeWidget * _preWidget; ThemeWidget * _curWidget; QList widgets; Q_SIGNALS: void widgetChanged(ThemeWidget * preWidget, ThemeWidget * curWidget); }; #endif // WIDGETGROUP_H ukui-control-center/plugins/personalized/theme/theme.cpp0000644000175000017500000004002513641405665022512 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "theme.h" #include "ui_theme.h" #include #include "SwitchButton/switchbutton.h" #include "themewidget.h" #include "widgetgroup.h" #include "cursor/xcursortheme.h" #include /** * GTK主题 */ #define THEME_GTK_SCHEMA "org.mate.interface" #define MODE_GTK_KEY "gtk-theme" /* GTK图标主题 */ #define ICON_GTK_KEY "icon-theme" /** * QT主题 */ #define THEME_QT_SCHEMA "org.ukui.style" #define MODE_QT_KEY "style-name" /* QT图标主题 */ #define ICON_QT_KEY "icon-theme-name" /** * 窗口管理器Marco主题 */ #define MARCO_SCHEMA "org.gnome.desktop.wm.preferences" #define MARCO_THEME_KEY "theme" #define ICONTHEMEPATH "/usr/share/icons/" #define SYSTHEMEPATH "/usr/share/themes/" #define CURSORS_THEMES_PATH "/usr/share/icons/" #define CURSOR_THEME_SCHEMA "org.ukui.peripherals-mouse" #define CURSOR_THEME_KEY "cursor-theme" #define ICONWIDGETHEIGH 74 namespace { // Preview cursors const char * const cursor_names[] = { "left_ptr", "left_ptr_watch", "wait", "pointing_hand", "whats_this", "ibeam", "size_all", "size_fdiag", "cross", "split_h", "size_ver", "size_hor", "size_bdiag", "split_v", }; const int numCursors = 9; // The number of cursors from the above list to be previewed } Theme::Theme() { ui = new Ui::Theme; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("theme"); pluginType = PERSONALIZED; settingsCreate = false; const QByteArray id(THEME_GTK_SCHEMA); const QByteArray idd(THEME_QT_SCHEMA); const QByteArray iid(CURSOR_THEME_SCHEMA); //设置样式 setupStylesheet(); //设置组件 setupComponent(); if (QGSettings::isSchemaInstalled(id) && QGSettings::isSchemaInstalled(idd) && QGSettings::isSchemaInstalled(iid)){ gtkSettings = new QGSettings(id); qtSettings = new QGSettings(idd); curSettings = new QGSettings(iid); settingsCreate = true; initThemeMode(); initIconTheme(); initCursorTheme(); initEffectSettings(); initConnection(); } else { qCritical() << THEME_GTK_SCHEMA << "or" << THEME_QT_SCHEMA << "or" << CURSOR_THEME_SCHEMA << "not installed\n"; } } Theme::~Theme() { delete ui; if (settingsCreate){ delete gtkSettings; delete qtSettings; delete curSettings; } } QString Theme::get_plugin_name(){ return pluginName; } int Theme::get_plugin_type(){ return pluginType; } QWidget *Theme::get_plugin_ui(){ return pluginWidget; } void Theme::plugin_delay_control(){ } void Theme::setupStylesheet(){ pluginWidget->setStyleSheet("background: #ffffff;"); ui->controlWidget->setStyleSheet("QWidget#controlWidget{background: #F4F4F4; border-radius: 6px;}"); ui->effectWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->line->setStyleSheet("QFrame{border-top: 1px solid #CCCCCC; border-left: none; border-right: none; border-bottom: none;}"); ui->resetBtn->setStyleSheet("QPushButton#resetBtn{background: #F4F4F4; border: none; border-radius: 4px;}" "QPushButton:hover:!pressed#resetBtn{border: none; background: #3D6BE5; border-radius: 2px;}" "QPushButton:hover:pressed#resetBtn{border: none; background: #2C5AD6; border-radius: 2px;}"); ui->transparencySlider->setStyleSheet("QSlider{height: 20px;}" "QSlider::groove:horizontal{border: none;}" "QSlider::add-page:horizontal{background: #808080; border-radius: 2px; margin-top: 8px; margin-bottom: 9px;}" "QSlider::sub-page:horizontal{background: #3D6BE5; border-radius: 2px; margin-top: 8px; margin-bottom: 9px;}" "QSlider::handle:horizontal{width: 20px; height: 20px; border-image: url(:/img/plugins/fonts/bigRoller.png);}" ""); } void Theme::setupComponent(){ ui->lightButton->hide(); //无用的控制主题 ui->label_3->hide(); ui->controlWidget->hide(); ui->defaultButton->setProperty("value", "ukui-white"); ui->lightButton->setProperty("value", "ukui-default"); ui->darkButton->setProperty("value", "ukui-black"); buildThemeModeBtn(ui->defaultButton, tr("Default"), "default"); buildThemeModeBtn(ui->lightButton, tr("Light"), "light"); buildThemeModeBtn(ui->darkButton, tr("Dark"), "dark"); setupControlTheme(); ui->effectLabel->hide(); ui->effectWidget->hide(); //构建并填充特效开关按钮 effectSwitchBtn = new SwitchButton(pluginWidget); ui->effectHorLayout->addWidget(effectSwitchBtn); } void Theme::buildThemeModeBtn(QPushButton *button, QString name, QString icon){ //设置默认按钮 button->setStyleSheet("QPushButton{background: #ffffff; border: none;}"); QVBoxLayout * baseVerLayout = new QVBoxLayout(button); baseVerLayout->setSpacing(8); baseVerLayout->setMargin(0); QLabel * iconLabel = new QLabel(button); iconLabel->setFixedSize(QSize(176, 105)); iconLabel->setScaledContents(true); QString fullicon = QString("://img/plugins/theme/%1.png").arg(icon); iconLabel->setPixmap(QPixmap(fullicon)); QHBoxLayout * bottomHorLayout = new QHBoxLayout; bottomHorLayout->setSpacing(8); bottomHorLayout->setMargin(0); QLabel * statusLabel = new QLabel(button); statusLabel->setFixedSize(QSize(16, 16)); statusLabel->setScaledContents(true); connect(ui->themeModeBtnGroup, QOverload::of(&QButtonGroup::buttonClicked), [=](QAbstractButton * eBtn){ if (eBtn == button) statusLabel->setPixmap(QPixmap("://img/plugins/theme/selected.png")); else statusLabel->clear(); }); QLabel * nameLabel = new QLabel(button); QSizePolicy nameSizePolicy = nameLabel->sizePolicy(); nameSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); nameSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); nameLabel->setSizePolicy(nameSizePolicy); nameLabel->setText(name); bottomHorLayout->addStretch(); bottomHorLayout->addWidget(statusLabel); bottomHorLayout->addWidget(nameLabel); bottomHorLayout->addStretch(); baseVerLayout->addWidget(iconLabel); baseVerLayout->addLayout(bottomHorLayout); button->setLayout(baseVerLayout); } void Theme::initThemeMode(){ //获取当前主题 QString currentThemeMode = qtSettings->get(MODE_QT_KEY).toString(); //设置界面 for (QAbstractButton * button : ui->themeModeBtnGroup->buttons()){ QVariant valueVariant = button->property("value"); if (valueVariant.isValid() && valueVariant.toString() == currentThemeMode) button->click(); // button->setChecked(true); } connect(ui->themeModeBtnGroup, QOverload::of(&QButtonGroup::buttonClicked), this, [=](QAbstractButton * button){ //设置主题 QString themeMode = button->property("value").toString(); QString currentThemeMode = qtSettings->get(MODE_QT_KEY).toString(); if (QString::compare(currentThemeMode, themeMode)){ qtSettings->set(MODE_QT_KEY, themeMode); gtkSettings->set(MODE_GTK_KEY, themeMode); } }); } void Theme::initIconTheme(){ //获取当前图标主题(以QT为准,后续可以对比GTK两个值) QString currentIconTheme = qtSettings->get(ICON_QT_KEY).toString(); //构建图标主题Widget Group,方便更新选中/非选中状态 WidgetGroup * iconThemeWidgetGroup = new WidgetGroup; connect(iconThemeWidgetGroup, &WidgetGroup::widgetChanged, [=](ThemeWidget * preWidget, ThemeWidget * curWidget){ if (preWidget) preWidget->setSelectedStatus(false); curWidget->setSelectedStatus(true); QString value = curWidget->getValue(); //设置图标主题 qtSettings->set(ICON_QT_KEY, value); gtkSettings->set(ICON_GTK_KEY, value); }); //构建图标主题QDir QDir themesDir = QDir(ICONTHEMEPATH); foreach (QString themedir, themesDir.entryList(QDir::Dirs)) { if (themedir.startsWith("ukui-icon-theme-")){ QDir appsDir = QDir(ICONTHEMEPATH + themedir + "/48x48/apps/"); appsDir.setFilter(QDir::Files | QDir::NoSymLinks); QStringList appIconsList = appsDir.entryList(); QStringList showIconsList; for (int i = 0; i < appIconsList.size(); i++){ if (i%64 == 0 && i < 6 * 64){ showIconsList.append(appsDir.path() + "/" + appIconsList.at(i)); } } ThemeWidget * widget = new ThemeWidget(QSize(48, 48), dullTranslation(themedir.section("-", -1, -1, QString::SectionSkipEmpty)), showIconsList); widget->setValue(themedir); //加入Layout ui->iconThemeVerLayout->addWidget(widget); //加入WidgetGround实现获取点击前Widget iconThemeWidgetGroup->addWidget(widget); if (themedir == currentIconTheme){ iconThemeWidgetGroup->setCurrentWidget(widget); widget->setSelectedStatus(true); } else { widget->setSelectedStatus(false); } } } } void Theme::setupControlTheme(){ QStringList colorStringList; colorStringList << QString("#3D6BE5"); colorStringList << QString("#FA6C63"); colorStringList << QString("#6cd472"); colorStringList << QString("#f9a959"); colorStringList << QString("#BA7Bd8"); colorStringList << QString("#F8D15D"); colorStringList << QString("#E7BBB0"); colorStringList << QString("#176F57"); QButtonGroup * colorBtnGroup = new QButtonGroup(); for (QString color : colorStringList){ QPushButton * button = new QPushButton(ui->controlWidget); button->setFixedSize(QSize(48, 48)); button->setCheckable(true); QString btnStyle = QString("QPushButton{background: %1; border-radius: 4px;}").arg(color); button->setStyleSheet(btnStyle); colorBtnGroup->addButton(button, colorStringList.indexOf(color)); QVBoxLayout * colorVerLayout = new QVBoxLayout(); colorVerLayout->setSpacing(0); colorVerLayout->setMargin(0); QHBoxLayout * colorHorLayout = new QHBoxLayout(); colorHorLayout->setSpacing(0); colorHorLayout->setMargin(0); QLabel * selectedColorLabel = new QLabel(button); QSizePolicy scSizePolicy = selectedColorLabel->sizePolicy(); scSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); scSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); selectedColorLabel->setSizePolicy(scSizePolicy); selectedColorLabel->setScaledContents(true); selectedColorLabel->setPixmap(QPixmap("://img/plugins/theme/selected.png")); //初始化选中图标状态 selectedColorLabel->setVisible(button->isChecked()); connect(colorBtnGroup, QOverload::of(&QButtonGroup::buttonClicked), this,[=]{ selectedColorLabel->setVisible(button->isChecked()); //设置控件主题 }); colorHorLayout->addStretch(); colorHorLayout->addWidget(selectedColorLabel); colorVerLayout->addLayout(colorHorLayout); colorVerLayout->addStretch(); button->setLayout(colorVerLayout); ui->controlHorLayout->addWidget(button); } } void Theme::initCursorTheme(){ QStringList cursorThemes = _getSystemCursorThemes(); // qDebug() << cursorThemes; //获取当前指针主题 QString currentCursorTheme; currentCursorTheme = curSettings->get(CURSOR_THEME_KEY).toString(); WidgetGroup * cursorThemeWidgetGroup = new WidgetGroup; connect(cursorThemeWidgetGroup, &WidgetGroup::widgetChanged, [=](ThemeWidget * preWidget, ThemeWidget * curWidget){ if (preWidget) preWidget->setSelectedStatus(false); curWidget->setSelectedStatus(true); QString value = curWidget->getValue(); //设置光标主题 curSettings->set(CURSOR_THEME_KEY, value); }); for (QString cursor : cursorThemes){ QList cursorVec; QString path = CURSORS_THEMES_PATH + cursor; XCursorTheme *cursorTheme = new XCursorTheme(path); for(int i = 0; i < numCursors; i++){ QImage image = cursorTheme->loadImage(cursor_names[i],20); cursorVec.append(QPixmap::fromImage(image)); } ThemeWidget * widget = new ThemeWidget(QSize(24, 24), cursor, cursorVec); widget->setValue(cursor); //加入Layout ui->cursorVerLayout->addWidget(widget); //加入WidgetGround实现获取点击前Widget cursorThemeWidgetGroup->addWidget(widget); //初始化指针主题选中界面 if (currentCursorTheme == cursor){ cursorThemeWidgetGroup->setCurrentWidget(widget); widget->setSelectedStatus(true); } else { widget->setSelectedStatus(false); } } } void Theme::initEffectSettings(){ // ui->effectLabel->hide(); // ui->effectWidget->hide(); } void Theme::initConnection() { connect(ui->resetBtn, &QPushButton::clicked, this, &Theme::resetBtnClickSlot); } QStringList Theme::_getSystemCursorThemes(){ QStringList themes; QDir themesDir(CURSORS_THEMES_PATH); if (themesDir.exists()){ foreach (QString dirname, themesDir.entryList(QDir::Dirs)){ if (dirname == "." || dirname == "..") continue; // QString fullpath(CURSORS_THEMES_PATH + dirname); QDir themeDir(CURSORS_THEMES_PATH + dirname + "/cursors/"); if (themeDir.exists()) themes.append(dirname); } } return themes; } QString Theme::dullTranslation(QString str){ if (!QString::compare(str, "basic")){ return QObject::tr("basic"); } else if (!QString::compare(str, "classical")){ return QObject::tr("classical"); } else if (!QString::compare(str, "default")){ return QObject::tr("default"); } else return QObject::tr("Unknown"); } void Theme::resetBtnClickSlot() { // reset theme(because MODE_QT_KEY's default is null, use "SET" to reset default key ) QString theme = "ukui-white"; qtSettings->set(MODE_QT_KEY, theme); gtkSettings->set(MODE_GTK_KEY, theme); // reset cursor default theme QString cursorTheme = "breeze_cursors"; curSettings->set(CURSOR_THEME_KEY,cursorTheme); //reset icon default theme qtSettings->reset(ICON_QT_KEY); gtkSettings->reset(ICON_GTK_KEY); clearLayout(ui->iconThemeVerLayout->layout(), true); clearLayout(ui->cursorVerLayout->layout(), true); initThemeMode(); initIconTheme(); initCursorTheme(); } void Theme::clearLayout(QLayout* mlayout, bool deleteWidgets) { if ( mlayout->layout() != NULL ) { QLayoutItem* item; while ( ( item = mlayout->layout()->takeAt( 0 ) ) != NULL ) { delete item->widget(); delete item; } } } ukui-control-center/plugins/personalized/theme/theme.ui0000644000175000017500000004771313640364120022345 0ustar fengfeng Theme 0 0 854 1162 0 0 16777215 16777215 Theme 0 0 0 32 48 0 0 0 0 0 16 10 0 0 Theme Mode 0 145 16777215 145 16 0 0 0 0 0 0 176 0 176 16777215 true themeModeBtnGroup Qt::Horizontal QSizePolicy::Maximum 64 20 0 0 176 0 176 16777215 true themeModeBtnGroup Qt::Horizontal QSizePolicy::Maximum 64 20 0 0 176 0 176 16777215 true themeModeBtnGroup Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 32 0 0 Icon theme 0 0 0 0 0 8 Qt::Vertical QSizePolicy::Fixed 20 32 0 0 Control theme 0 66 16777215 66 0 0 0 0 0 16 24 24 Qt::Vertical QSizePolicy::Fixed 20 32 0 0 Cursor theme 0 0 0 0 0 8 Qt::Vertical QSizePolicy::Fixed 20 32 0 0 Effect setting 0 110 16777215 110 10 10 0 10 0 0 6 6 0 0 Transparent Qt::Horizontal 40 20 Qt::Horizontal 16 6 6 0 0 Low Qt::Horizontal 0 0 High Qt::Vertical QSizePolicy::Fixed 20 32 120 36 120 36 Reset to default Qt::Horizontal 40 20 ukui-control-center/plugins/personalized/theme/cursor/0000755000175000017500000000000013635333016022211 5ustar fengfengukui-control-center/plugins/personalized/theme/cursor/config-X11.h0000644000175000017500000000007713635333016024202 0ustar fengfeng#ifndef CONFIGX11_H #define CONFIGX11_H #endif // CONFIGX11_H ukui-control-center/plugins/personalized/theme/cursor/xcursortheme.h0000644000175000017500000000444113635333016025115 0ustar fengfeng/* * Copyright © 2006-2007 Fredrik Höglund * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License version 2 or at your option version 3 as published by * the Free Software Foundation. * * 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef XCURSORTHEME_H #define XCURSORTHEME_H #include #include "cursortheme.h" class QDir; struct _XcursorImage; struct _XcursorImages; typedef _XcursorImage XcursorImage; typedef _XcursorImages XcursorImages; /** * The XCursorTheme class is a CursorTheme implementation for Xcursor themes. */ class XCursorTheme : public CursorTheme { public: /** * Initializes itself from the @p dir information, and parses the * index.theme file if the dir has one. */ XCursorTheme(const QDir &dir); ~XCursorTheme() override {} const QStringList inherits() const { return m_inherits; } QImage loadImage(const QString &name, int size = 0) const override; qulonglong loadCursor(const QString &name, int size = 0) const override; /** Returns the size that the XCursor library would use if no cursor size is given. This depends mainly on Xft.dpi. */ int defaultCursorSize() const override; protected: XCursorTheme(const QString &title, const QString &desc) : CursorTheme(title, desc) {} void setInherits(const QStringList &val) { m_inherits = val; } private: XcursorImage *xcLoadImage(const QString &name, int size) const; XcursorImages *xcLoadImages(const QString &name, int size) const; void parseIndexFile(); QString findAlternative(const QString &name) const; QStringList m_inherits; static QHash alternatives; }; #endif // XCURSORTHEME_H ukui-control-center/plugins/personalized/theme/cursor/cursortheme.h0000644000175000017500000001402213635333016024721 0ustar fengfeng/* * Copyright © 2006-2007 Fredrik Höglund * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License version 2 or at your option version 3 as published * by the Free Software Foundation. * * 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef CURSORTHEME_H #define CURSORTHEME_H #include #include /** * This is the abstract base class for all cursor themes stored in a * CursorThemeModel and previewed in a PreviewWidget. * * All cursor themes have a title, a description, an icon, and an internal * name, all of which, except for the internal name, CursorThemeModel * supplies to item views. * * A cursor theme may also have a path to the directory where the theme * is located in the filesystem. If isWritable() returns true, This directory * may be deleted in order to remove the theme at the users request. * * Subclasses must reimplement loadImage() and loadCursor(), which are * called by PreviewWidget to load cursors and cursor images. Subclasses may * optionally reimplement loadPixmap(), which in the default implementation * calls loadImage(), and converts the returned image to a pixmap. * Subclasses may also reimplement the protected function createIcon(), * which creates the icon pixmap that's supplied to item views. The default * implementation calls loadImage() to load the sample cursor, and creates * the icon from that. */ class CursorTheme { public: enum ItemDataRole { // Note: use printf "0x%08X\n" $(($RANDOM*$RANDOM)) // to define additional roles. DisplayDetailRole = 0x24A3DAF8, IsWritableRole }; CursorTheme() {} CursorTheme(const QString &title, const QString &description = QString()); virtual ~CursorTheme() {} const QString title() const { return m_title; } const QString description() const { return m_description; } const QString sample() const { return m_sample; } const QString name() const { return m_name; } const QString path() const { return m_path; } /** @returns A list of the available sizes in this cursor theme, @warning This list may be empty if the engine doesn't support the recognition of the size. */ const QList availableSizes() const { return m_availableSizes; } bool isWritable() const { return m_writable; } bool isHidden() const { return m_hidden; } QPixmap icon() const; /// Hash value for the internal name uint hash() const { return m_hash; } /// Loads the cursor image @p name, with the nominal size @p size. /// The image should be autocropped to the smallest possible size. /// If the theme doesn't have the cursor @p name, it should return a null image. virtual QImage loadImage(const QString &name, int size = 0) const = 0; /// Convenience function. Default implementation calls /// QPixmap::fromImage(loadImage()); virtual QPixmap loadPixmap(const QString &name, int size = 0) const; /// Loads the cursor @p name, with the nominal size @p size. /// If the theme doesn't have the cursor @p name, it should return /// the default cursor from the active theme instead. virtual qulonglong loadCursor(const QString &name, int size = 0) const = 0; virtual int defaultCursorSize() const = 0; /** Creates the icon returned by @ref icon(). Don't use this function directly but use @ref icon() instead, because @ref icon() caches the icon. @returns A pixmap with a cursor (usually left_ptr) that can be used as icon for this theme. The size is adopted to standard icon sizes.*/ virtual QPixmap createIcon() const; /** @returns A pixmap with a cursor (usually left_ptr) that can be used as icon for this theme. */ virtual QPixmap createIcon(int size) const; static bool haveXfixes(); protected: void setTitle( const QString &title ) { m_title = title; } void setDescription( const QString &desc ) { m_description = desc; } void setSample( const QString &sample ) { m_sample = sample; } inline void setName( const QString &name ); void setPath( const QString &path ) { m_path = path; } void setAvailableSizes( const QList &availableSizes ) { m_availableSizes = availableSizes; } void setIcon( const QPixmap &icon ) { m_icon = icon; } void setIsWritable( bool val ) { m_writable = val; } void setIsHidden( bool val ) { m_hidden = val; } /// Convenience function for cropping an image. QImage autoCropImage( const QImage &image ) const; // Convenience function that uses Xfixes to tag a cursor with a name void setCursorName(qulonglong cursor, const QString &name) const; QString m_title; QString m_description; QString m_path; QList m_availableSizes; QString m_sample; mutable QPixmap m_icon; bool m_writable:1; bool m_hidden:1; private: QString m_name; uint m_hash; friend class CursorThemeModel; }; void CursorTheme::setName(const QString &name) { m_name = name; m_hash = qHash(name); } #endif // CURSORTHEME_H ukui-control-center/plugins/personalized/theme/cursor/cursortheme.cpp0000644000175000017500000001002313635333016025251 0ustar fengfeng/* * Copyright © 2006-2007 Fredrik Höglund * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License version 2 or at your option version 3 as published * by the Free Software Foundation. * * 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "cursortheme.h" #include "config-X11.h" #ifdef HAVE_XFIXES #include #include #endif CursorTheme::CursorTheme(const QString &title, const QString &description) { setTitle(title); setDescription(description); setSample(QStringLiteral("left_ptr")); setIsHidden(false); setIsWritable(false); } QPixmap CursorTheme::icon() const { if (m_icon.isNull()) m_icon = createIcon(); return m_icon; } QImage CursorTheme::autoCropImage(const QImage &image) const { // Compute an autocrop rectangle for the image QRect r(image.rect().bottomRight(), image.rect().topLeft()); const quint32 *pixels = reinterpret_cast(image.bits()); for (int y = 0; y < image.height(); y++) { for (int x = 0; x < image.width(); x++) { if (*(pixels++)) { if (x < r.left()) r.setLeft(x); if (x > r.right()) r.setRight(x); if (y < r.top()) r.setTop(y); if (y > r.bottom()) r.setBottom(y); } } } // Normalize the rectangle return image.copy(r.normalized()); } QPixmap CursorTheme::loadPixmap(const QString &name, int size) const { QImage image = loadImage(name, size); if (image.isNull()) return QPixmap(); return QPixmap::fromImage(image); } static int nominalCursorSize(int iconSize) { for (int i = 512; i > 8; i /= 2) { if (i < iconSize) return i; if ((i * .75) < iconSize) return int(i * .75); } return 8; } QPixmap CursorTheme::createIcon() const { int iconSize = QApplication::style()->pixelMetric(QStyle::PM_LargeIconSize); int cursorSize = nominalCursorSize(iconSize); QSize size = QSize(iconSize, iconSize); QPixmap pixmap = createIcon(cursorSize); if (!pixmap.isNull()) { // Scale the pixmap if it's larger than the preferred icon size if (pixmap.width() > size.width() || pixmap.height() > size.height()) pixmap = pixmap.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation); } return pixmap; } QPixmap CursorTheme::createIcon(int size) const { QPixmap pixmap; QImage image = loadImage(sample(), size); if (image.isNull() && sample() != QLatin1String("left_ptr")) image = loadImage(QStringLiteral("left_ptr"), size); if (!image.isNull()) { pixmap = QPixmap::fromImage(image); } return pixmap; } void CursorTheme::setCursorName(qulonglong cursor, const QString &name) const { #ifdef HAVE_XFIXES if (haveXfixes()) { XFixesSetCursorName(QX11Info::display(), cursor, QFile::encodeName(name)); } #endif } bool CursorTheme::haveXfixes() { bool result = false; #ifdef HAVE_XFIXES if (!QX11Info::isPlatformX11()) { return result; } int event_base, error_base; if (XFixesQueryExtension(QX11Info::display(), &event_base, &error_base)) { int major, minor; XFixesQueryVersion(QX11Info::display(), &major, &minor); result = (major >= 2); } #endif return result; } ukui-control-center/plugins/personalized/theme/cursor/xcursortheme.cpp0000644000175000017500000002076213635333016025454 0ustar fengfeng/* * Copyright © 2006-2007 Fredrik Höglund * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License version 2 or at your option version 3 as published * by the Free Software Foundation. * * 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include "xcursortheme.h" // Static variable holding alternative names for some cursors QHash XCursorTheme::alternatives; XCursorTheme::XCursorTheme(const QDir &themeDir) : CursorTheme(themeDir.dirName()) { // Directory information setName(themeDir.dirName()); setPath(themeDir.path()); setIsWritable(QFileInfo(themeDir.path()).isWritable()); // ### perhaps this shouldn't be cached if (themeDir.exists(QStringLiteral("index.theme"))) parseIndexFile(); QString cursorFile = path() + "/cursors/watch"; // qDebug()<<"cursorFile is---------->"< sizeList; XcursorImages *images = XcursorFilenameLoadAllImages(qPrintable(cursorFile)); if (images) { for (int i = 0; i < images->nimage; ++i) { // qDebug()<<"images->nimage is---------->"<images[i]->size<images[i]->size)) sizeList.append(images->images[i]->size); }; XcursorImagesDestroy(images); std::sort(sizeList.begin(), sizeList.end()); m_availableSizes = sizeList; } if (!sizeList.isEmpty()) { QString sizeListString = QString::number(sizeList.takeFirst()); while (!sizeList.isEmpty()) { sizeListString.append(", "); sizeListString.append(QString::number(sizeList.takeFirst())); }; QString tempString = i18nc( "@info The argument is the list of available sizes (in pixel). Example: " "'Available sizes: 24' or 'Available sizes: 24, 36, 48'", "(Available sizes: %1)", sizeListString); if (m_description.isEmpty()) m_description = tempString; else m_description = m_description + ' ' + tempString; }; } void XCursorTheme::parseIndexFile() { KConfig config(path() + "/index.theme", KConfig::NoGlobals); KConfigGroup cg(&config, "Icon Theme"); m_title = cg.readEntry("Name", m_title); m_description = cg.readEntry("Comment", m_description); m_sample = cg.readEntry("Example", m_sample); m_hidden = cg.readEntry("Hidden", false); m_inherits = cg.readEntry("Inherits", QStringList()); } QString XCursorTheme::findAlternative(const QString &name) const { if (alternatives.isEmpty()) { alternatives.reserve(18); // Qt uses non-standard names for some core cursors. // If Xcursor fails to load the cursor, Qt creates it with the correct name using the // core protcol instead (which in turn calls Xcursor). We emulate that process here. // Note that there's a core cursor called cross, but it's not the one Qt expects. alternatives.insert(QStringLiteral("cross"), QStringLiteral("crosshair")); alternatives.insert(QStringLiteral("up_arrow"), QStringLiteral("center_ptr")); alternatives.insert(QStringLiteral("wait"), QStringLiteral("watch")); alternatives.insert(QStringLiteral("ibeam"), QStringLiteral("xterm")); alternatives.insert(QStringLiteral("size_all"), QStringLiteral("fleur")); alternatives.insert(QStringLiteral("pointing_hand"), QStringLiteral("hand2")); // Precomputed MD5 hashes for the hardcoded bitmap cursors in Qt and KDE. // Note that the MD5 hash for left_ptr_watch is for the KDE version of that cursor. alternatives.insert(QStringLiteral("size_ver"), QStringLiteral("00008160000006810000408080010102")); alternatives.insert(QStringLiteral("size_hor"), QStringLiteral("028006030e0e7ebffc7f7070c0600140")); alternatives.insert(QStringLiteral("size_bdiag"), QStringLiteral("fcf1c3c7cd4491d801f1e1c78f100000")); alternatives.insert(QStringLiteral("size_fdiag"), QStringLiteral("c7088f0f3e6c8088236ef8e1e3e70000")); alternatives.insert(QStringLiteral("whats_this"), QStringLiteral("d9ce0ab605698f320427677b458ad60b")); alternatives.insert(QStringLiteral("split_h"), QStringLiteral("14fef782d02440884392942c11205230")); alternatives.insert(QStringLiteral("split_v"), QStringLiteral("2870a09082c103050810ffdffffe0204")); alternatives.insert(QStringLiteral("forbidden"), QStringLiteral("03b6e0fcb3499374a867c041f52298f0")); alternatives.insert(QStringLiteral("left_ptr_watch"), QStringLiteral("3ecb610c1bf2410f44200f48c40d3599")); alternatives.insert(QStringLiteral("hand2"), QStringLiteral("e29285e634086352946a0e7090d73106")); alternatives.insert(QStringLiteral("openhand"), QStringLiteral("9141b49c8149039304290b508d208c40")); alternatives.insert(QStringLiteral("closedhand"), QStringLiteral("05e88622050804100c20044008402080")); } return alternatives.value(name, QString()); } XcursorImage *XCursorTheme::xcLoadImage(const QString &image, int size) const { QByteArray cursorName = QFile::encodeName(image); QByteArray themeName = QFile::encodeName(name()); return XcursorLibraryLoadImage(cursorName, themeName, size); } XcursorImages *XCursorTheme::xcLoadImages(const QString &image, int size) const { QByteArray cursorName = QFile::encodeName(image); QByteArray themeName = QFile::encodeName(name()); return XcursorLibraryLoadImages(cursorName, themeName, size); } int XCursorTheme::defaultCursorSize() const { //TODO: manage Wayland if (!QX11Info::isPlatformX11()) { return 32; } /* This code is basically borrowed from display.c of the XCursor library We can't use "int XcursorGetDefaultSize(Display *dpy)" because if previously the cursor size was set to a custom value, it would return this custom value. */ int size = 0; int dpi = 0; Display *dpy = QX11Info::display(); // The string "v" is owned and will be destroyed by Xlib char *v = XGetDefault(dpy, "Xft", "dpi"); if (v) dpi = atoi(v); if (dpi) size = dpi * 16 / 72; if (size == 0) { int dim; if (DisplayHeight(dpy, DefaultScreen(dpy)) < DisplayWidth(dpy, DefaultScreen(dpy))) { dim = DisplayHeight(dpy, DefaultScreen(dpy)); } else { dim = DisplayWidth(dpy, DefaultScreen(dpy)); } size = dim / 48; } return size; } qulonglong XCursorTheme::loadCursor(const QString &name, int size) const { //TODO: manage Wayland if (!QX11Info::isPlatformX11()) { return None; } if (size <= 0) size = defaultCursorSize(); // Load the cursor images XcursorImages *images = xcLoadImages(name, size); if (!images) images = xcLoadImages(findAlternative(name), size); if (!images) return None; // Create the cursor Cursor handle = XcursorImagesLoadCursor(QX11Info::display(), images); XcursorImagesDestroy(images); setCursorName(handle, name); return handle; } QImage XCursorTheme::loadImage(const QString &name, int size) const { if (size <= 0) size = defaultCursorSize(); // Load the image XcursorImage *xcimage = xcLoadImage(name, size); if (!xcimage) xcimage = xcLoadImage(findAlternative(name), size); if (!xcimage) { return QImage(); } // Convert the XcursorImage to a QImage, and auto-crop it QImage image((uchar *)xcimage->pixels, xcimage->width, xcimage->height, QImage::Format_ARGB32_Premultiplied ); image = autoCropImage(image); XcursorImageDestroy(xcimage); return image; } ukui-control-center/plugins/personalized/theme/themewidget.cpp0000644000175000017500000001377513635333016023723 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "themewidget.h" #include #include #include #include #include #include ThemeWidget::ThemeWidget(QSize iSize, QString name, QStringList iStringList, QWidget *parent) : QWidget(parent) { setFixedHeight(66); setAttribute(Qt::WA_DeleteOnClose); setStyleSheet("background: #F4F4F4; border-radius: 6px;"); pValue = ""; QHBoxLayout * mainHorLayout = new QHBoxLayout(this); mainHorLayout->setSpacing(16); mainHorLayout->setContentsMargins(16, 0, 16, 0); //占位Label,解决隐藏选中图标后文字Label位置的变化 placeHolderLabel = new QLabel(this); QSizePolicy phSizePolicy = placeHolderLabel->sizePolicy(); phSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); phSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); placeHolderLabel->setSizePolicy(phSizePolicy); placeHolderLabel->setFixedSize(QSize(16, 16)); //选中图标的大小为16*16 selectedLabel = new QLabel(this); QSizePolicy sSizePolicy = selectedLabel->sizePolicy(); sSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); sSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); selectedLabel->setSizePolicy(sSizePolicy); selectedLabel->setScaledContents(true); selectedLabel->setPixmap(QPixmap("://img/plugins/theme/selected.png")); QLabel * nameLabel = new QLabel(this); QSizePolicy nameSizePolicy = nameLabel->sizePolicy(); nameSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); nameSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); nameLabel->setSizePolicy(nameSizePolicy); nameLabel->setFixedWidth(102); nameLabel->setText(name); QHBoxLayout * iconHorLayout = new QHBoxLayout; iconHorLayout->setSpacing(16); iconHorLayout->setMargin(0); for (QString icon : iStringList){ QLabel * label = new QLabel(this); label->setFixedSize(iSize); label->setPixmap(QPixmap(icon)); iconHorLayout->addWidget(label); } mainHorLayout->addWidget(placeHolderLabel); mainHorLayout->addWidget(selectedLabel); mainHorLayout->addWidget(nameLabel); mainHorLayout->addStretch(); mainHorLayout->addLayout(iconHorLayout); setLayout(mainHorLayout); } ThemeWidget::ThemeWidget(QSize iSize, QString name, const QList &listMap, QWidget *parent) : QWidget(parent) { setFixedHeight(66); setAttribute(Qt::WA_DeleteOnClose); setStyleSheet("background: #F4F4F4; border-radius: 6px;"); pValue = ""; QHBoxLayout * mainHorLayout = new QHBoxLayout(this); mainHorLayout->setSpacing(16); mainHorLayout->setContentsMargins(16, 0, 16, 0); //占位Label,解决隐藏选中图标后文字Label位置的变化 placeHolderLabel = new QLabel(this); QSizePolicy phSizePolicy = placeHolderLabel->sizePolicy(); phSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); phSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); placeHolderLabel->setSizePolicy(phSizePolicy); placeHolderLabel->setFixedSize(QSize(16, 16)); //选中图标的大小为16*16 selectedLabel = new QLabel(this); QSizePolicy sSizePolicy = selectedLabel->sizePolicy(); sSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); sSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); selectedLabel->setSizePolicy(sSizePolicy); selectedLabel->setScaledContents(true); selectedLabel->setPixmap(QPixmap("://img/plugins/theme/selected.png")); QLabel * nameLabel = new QLabel(this); QSizePolicy nameSizePolicy = nameLabel->sizePolicy(); nameSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); nameSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); nameLabel->setSizePolicy(nameSizePolicy); nameLabel->setFixedWidth(102); nameLabel->setText(name); QHBoxLayout * iconHorLayout = new QHBoxLayout; iconHorLayout->setSpacing(25); iconHorLayout->setMargin(0); for (QPixmap icon : listMap){ QLabel * label = new QLabel(this); label->setFixedSize(iSize); label->setPixmap(icon); iconHorLayout->addWidget(label); } mainHorLayout->addWidget(placeHolderLabel); mainHorLayout->addWidget(selectedLabel); mainHorLayout->addWidget(nameLabel); mainHorLayout->addStretch(1); mainHorLayout->addLayout(iconHorLayout); mainHorLayout->addStretch(2); setLayout(mainHorLayout); } ThemeWidget::~ThemeWidget() { } void ThemeWidget::setSelectedStatus(bool status){ placeHolderLabel->setHidden(status); selectedLabel->setVisible(status); } void ThemeWidget::setValue(QString value){ pValue = value; } QString ThemeWidget::getValue(){ return pValue; } void ThemeWidget::mousePressEvent(QMouseEvent *event){ if (event->button() == Qt::LeftButton){ emit clicked(); } QWidget::mousePressEvent(event); } //子类化一个QWidget,为了能够使用样式表,则需要提供paintEvent事件。 //这是因为QWidget的paintEvent()是空的,而样式表要通过paint被绘制到窗口中。 void ThemeWidget::paintEvent(QPaintEvent *event){ Q_UNUSED(event) QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } ukui-control-center/plugins/time-language/0000755000175000017500000000000013544017042017607 5ustar fengfengukui-control-center/plugins/time-language/datetime/0000755000175000017500000000000013641405665021415 5ustar fengfengukui-control-center/plugins/time-language/datetime/changtime.ui0000644000175000017500000004277713640364120023721 0ustar fengfeng changtimedialog 0 0 401 440 0 0 401 440 420 440 Dialog 0 0 0 0 0 QFrame::StyledPanel QFrame::Raised 9 Qt::Horizontal 40 20 48 32 48 32 20 0 0 190 24 190 24 current date Qt::Vertical 20 41 1 20 31 336 50 336 50 0 0 0 34 14 34 14 time 0 0 83 0 83 16777215 0 0 80 0 80 32 0 0 80 32 80 32 0 0 336 50 336 50 0 0 27 14 27 14 year 0 0 258 0 257 16777215 0 0 336 50 336 50 0 0 27 14 27 14 month 0 0 258 32 258 16777215 0 0 336 50 336 50 0 0 27 14 27 16777215 day 0 0 258 32 258 16777215 Qt::Vertical 17 34 0 0 345 50 345 50 Qt::Horizontal 40 20 120 30 120 30 120 30 cancel 120 30 120 30 confirm Qt::Vertical 17 34 ukui-control-center/plugins/time-language/datetime/datetime.h0000644000175000017500000000624713640364120023360 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef DATETIME_H #define DATETIME_H #include #include #include "shell/interface.h" #include "changtime.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "worldMap/timezonechooser.h" #include "worldMap/zoneinfo.h" #include "SwitchButton/switchbutton.h" /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include } #define TZ_DATA_FILE "/usr/share/zoneinfo/zoneUtc" #define DEFAULT_TZ "Asia/Shanghai" namespace Ui { class DateTime; } class DateTime : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: DateTime(); ~DateTime(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; void component_init(); void status_init(); bool fileIsExits(const QString& filepath); private: Ui::DateTime *ui; QString pluginName; int pluginType; QWidget * pluginWidget; QGSettings * m_formatsettings = nullptr; QDBusInterface *m_datetimeiface = nullptr; QDBusInterface *m_datetimeiproperties = nullptr; QMap tzindexMapEn; QMap tzindexMapCN; SwitchButton *m_formTimeBtn = nullptr; QLabel *m_formTimeLabel = nullptr; QTimer * m_itimer = nullptr; TimeZoneChooser *m_timezone; ZoneInfo* m_zoneinfo; QDateTime current; // bool m_EFHour = true;//默认为24小时制 Q_SIGNALS: void changed(); private slots: void datetime_update_slot(); void changetime_slot(); void changezone_slot(); void changezone_slot(QString ); void time_format_clicked_slot(bool); void rsync_with_network_slot(); void showendLabel(); void hidendLabel(); private: void loadHour(); void connectGSetting(); }; #endif // DATETIME_H ukui-control-center/plugins/time-language/datetime/datetime.pro0000644000175000017500000000236413635356010023730 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-29T15:08:41 # #------------------------------------------------- QT += widgets dbus x11extras TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(datetime) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lgsettings-qt ##加载gio库和gio-unix库,用于处理时间 CONFIG += link_pkgconfig \ C++11 PKGCONFIG += gio-2.0 \ gio-unix-2.0 #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ datetime.cpp \ changtime.cpp \ worldMap/zoneinfo.cpp \ worldMap/toolpop.cpp \ worldMap/timezonemap.cpp \ worldMap/timezonechooser.cpp \ worldMap/poplistdelegate.cpp \ worldMap/poplist.cpp HEADERS += \ datetime.h \ changtime.h \ worldMap/zoneinfo.h \ worldMap/toolpop.h \ worldMap/timezonemap.h \ worldMap/timezonechooser.h \ worldMap/poplistdelegate.h \ worldMap/poplist.h FORMS += \ datetime.ui \ changtime.ui RESOURCES += \ tz.qrc DISTFILES += ukui-control-center/plugins/time-language/datetime/datetime.cpp0000644000175000017500000002604113641405665023720 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "datetime.h" #include "ui_datetime.h" #include #include #include #include #include #define FORMAT_SCHEMA "org.ukui.control-center.panel.plugins" #define TIME_FORMAT_KEY "hoursystem" #define DATE_KEY "date" DateTime::DateTime() { ui = new Ui::DateTime; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); pluginWidget->setStyleSheet("background: #ffffff;"); ui->setupUi(pluginWidget); pluginName = tr("datetime"); pluginType = DATETIME; // qDebug()<<"进入时间日期UI------------------》"<start(1000); connect(m_itimer,SIGNAL(timeout()), this, SLOT(datetime_update_slot())); m_formTimeBtn = new SwitchButton; m_formTimeLabel = new QLabel(tr("24-hour clock")); //初始化gsettings const QByteArray id(FORMAT_SCHEMA); if(QGSettings::isSchemaInstalled(id)) { const QByteArray id(FORMAT_SCHEMA); m_formatsettings = new QGSettings(id); } connectGSetting(); //初始化dbus m_datetimeiface = new QDBusInterface("org.freedesktop.timedate1", "/org/freedesktop/timedate1", "org.freedesktop.timedate1", QDBusConnection::systemBus()); m_datetimeiproperties = new QDBusInterface("org.freedesktop.timedate1", "/org/freedesktop/timedate1", "org.freedesktop.DBus.Properties", QDBusConnection::systemBus()); component_init(); status_init(); connect(ui->chgtimebtn,SIGNAL(clicked()),this,SLOT(changetime_slot())); connect(ui->chgzonebtn,SIGNAL(clicked()),this,SLOT(changezone_slot())); connect(m_formTimeBtn, SIGNAL(checkedChanged(bool)),this,SLOT(time_format_clicked_slot(bool))); connect(m_timezone, &TimeZoneChooser::confirmed, this, [this] (const QString &timezone) { qDebug()<<"timezone is---------->"<hide(); ui->timezoneLabel->setText(timezone); }); connect(ui->synsystimeBtn,SIGNAL(clicked()),this,SLOT(rsync_with_network_slot())); } DateTime::~DateTime() { delete ui; delete m_formatsettings; delete m_datetimeiface; delete m_datetimeiproperties; } QString DateTime::get_plugin_name(){ return pluginName; } int DateTime::get_plugin_type(){ return pluginType; } QWidget *DateTime::get_plugin_ui(){ return pluginWidget; } void DateTime::plugin_delay_control(){ } void DateTime::component_init(){ ui->titleLabel->setContentsMargins(0,0,0,16); ui->timeClockLable->setContentsMargins(0,0,0,16); ui->synsystimeBtn->setStyleSheet("QPushButton{background-color:#E9E9E9;border-radius:4px}" "QPushButton:hover{background-color: #3D6BE5;color:white;};border-radius:4px"); ui->synsystimeBtn->setText(tr("Sync system time")); ui->chgtimebtn->setStyleSheet("QPushButton{background-color:#E5E7E9;border-radius:4px}" "QPushButton:hover{background-color: #3D6BE5;color:white;};border-radius:4px"); ui->chgtimebtn->setText(tr("Change time")); ui->chgzonebtn->setStyleSheet("QPushButton{background-color:#E5E7E9;border-radius:4px}" "QPushButton:hover{background-color: #3D6BE5;color:white;};border-radius:4px"); ui->chgzonebtn->setText(tr("Change time zone")); ui->chgLayout->setSpacing(16); ui->hourWidget->setStyleSheet("background-color:#E5E7E9;border-radius:6px"); ui->syslabel->setStyleSheet("QLabel#syslabel{background: #3D6BE5;border-radius:4px;}"); ui->syslabel->setVisible(false); ui->endlabel->setStyleSheet("QLabel#endlabel{background: #3D6BE5;border-radius:4px;}"); ui->endlabel->setVisible(false); // m_formTimeBtn->setChecked(false); QHBoxLayout *hourLayout = new QHBoxLayout(ui->hourWidget); hourLayout->addWidget(m_formTimeLabel); hourLayout->addWidget(m_formTimeBtn); // ui->hourwidget->addWidget(formTimeLabel); QDateTime currentime = QDateTime::currentDateTime(); QString timeAndWeek = currentime.toString("yyyy/MM/dd ddd"); ui->dateLabel->setText(timeAndWeek); //因为ntpd和systemd的网络时间同步会有冲突,所以安装了ntp的话,禁止使用控制面板设置网络时间同步 QFileInfo fileinfo("/usr/sbin/ntpd"); if (fileinfo.exists()){ ui->synsystimeBtn->setVisible(false); } QFile tzfile("://zoneUtc"); if(!tzfile.open(QIODevice::ReadOnly | QIODevice::Text)){ qDebug("TZ File Open Failed"); } else { QTextStream txt(&tzfile); int index = 0; qDebug()<<"TODO------->language problem"< tz = m_datetimeiface->call("Get", "org.freedesktop.timedate1", "Timezone"); QMap::iterator it = tzindexMapEn.find(tz.value().toString()); // qDebug()<<"TODO-------》"<::iterator itc = tzindexMapCN.begin();itc!=tzindexMapCN.end();itc++) { if(itc.value() == it.value()){ ui->timezoneLabel->setText(itc.key()); break; } } } else { QMap::iterator defaultit = tzindexMapEn.find(DEFAULT_TZ); ui->timezoneLabel->setText(defaultit.key()); } loadHour(); } bool DateTime::fileIsExits(const QString &filepath) { QFile file(filepath); if(file.exists()) { return true; } else { return false; } } void DateTime::datetime_update_slot(){ QString dateformat; if(m_formatsettings) { QStringList keys = m_formatsettings->keys(); if(keys.contains("date")) { dateformat = m_formatsettings->get(DATE_KEY).toString(); } } //当前时间 current = QDateTime::currentDateTime(); // qDebug()<<"current time is-------->"<isChecked()){ currentsecStr = current.toString("hh : mm : ss"); }else{ currentsecStr = current.toString("AP hh: mm : ss"); } QString timeAndWeek; if ("cn" == dateformat) { timeAndWeek = current.toString("yyyy/MM/dd ddd"); } else { timeAndWeek = current.toString("yyyy-MM-dd ddd"); } // qDebug()<<"year is----------->"<dateLabel->setText(timeAndWeek); ui->timeClockLable->setText(currentsecStr); } void DateTime::changetime_slot(){ ChangtimeDialog *dialog = new ChangtimeDialog(m_formTimeBtn->isChecked()); dialog->setWindowTitle(tr("change time")); dialog->setAttribute(Qt::WA_DeleteOnClose); m_itimer->stop(); m_itimer->start(); // dialog->exec(); dialog->show(); } void DateTime::changezone_slot(){ // qDebug()<<"changezone_slot------->"<screenGeometry(m->screenNumber(QCursor::pos())); int desk_x = desk_rect.width(); int desk_y = desk_rect.height(); int x = m_timezone->width(); int y = m_timezone->height(); m_timezone->move(desk_x / 2 - x / 2 + desk_rect.left(), desk_y / 2 - y / 2 + desk_rect.top()); m_timezone->show(); m_timezone->setMarkedTimeZoneSlot(m_zoneinfo->getCurrentTimzone()); } void DateTime::changezone_slot(QString zone){ m_datetimeiface->call("SetTimezone", zone, true); } void DateTime::time_format_clicked_slot(bool flag){ if (!m_formatsettings){ qDebug()<<"org.ukui.control-center.panel.plugins not installed"<keys(); if (keys.contains("hoursystem")) { if(flag == true) { m_formatsettings->set(TIME_FORMAT_KEY, "24"); } else { m_formatsettings->set(TIME_FORMAT_KEY, "12"); } } //重置时间格式 m_itimer->stop(); m_itimer->start(1000); } void DateTime::showendLabel(){ ui->syslabel->setVisible(false); if(ui->syslabel->isVisible()){ ui->endlabel->setVisible(false); }else { ui->endlabel->setVisible(true); } QTimer::singleShot(2*1000,this,SLOT(hidendLabel())); } void DateTime::hidendLabel(){ ui->endlabel->setVisible(false); } void DateTime::rsync_with_network_slot(){ // qDebug()<<"TODO------> sleep waies?"<call("SetNTP", true, true); // QMovie *loadgif = new QMovie(":/sys.gif"); // loadgif->start(); // ui->syslabel->setVisible(true); // ui->syslabel->setMovie(loadgif); // ui->syslabel->setScaledContents(true); // ui->syslabel->setStyleSheet("QLabel#syslabel{border-radius:4px;}"); // QTimer::singleShot(2*1000,this,SLOT(showendLabel())); } void DateTime::loadHour() { if (!m_formatsettings) { qDebug()<<"org.ukui.control-center.panel.plugins not installed"<keys(); QString format; if (keys.contains("hoursystem")) { format = m_formatsettings->get(TIME_FORMAT_KEY).toString(); } if (format == "24") { m_formTimeBtn->setChecked(true); } else { m_formTimeBtn->setChecked(false); } } void DateTime::connectGSetting() { connect(m_formatsettings, &QGSettings::changed, this, [=] (const QString &key) { // qDebug()<<"status changed ------------>"<get(TIME_FORMAT_KEY).toString(); bool checked = (value == "24" ? true : false); m_formTimeBtn->setChecked(checked); } if (key == "date") { QString value = m_formatsettings->get(DATE_KEY).toString(); } }); } ukui-control-center/plugins/time-language/datetime/tz.qrc0000644000175000017500000000033713635333016022555 0ustar fengfeng zoneUtc sys.gif images/indicator.png list.css images/map.png ukui-control-center/plugins/time-language/datetime/changtime.cpp0000644000175000017500000002367713640364120024064 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "changtime.h" #include "ui_changtime.h" #include const int BEGINYEAR = 1900; const int BEGINMD = 1; ChangtimeDialog::ChangtimeDialog(bool hour,QWidget *parent) :m_isEFHour(hour), QDialog(parent), ui(new Ui::changtimedialog) { QFile QssFile("://combox.qss"); QssFile.open(QFile::ReadOnly); if (QssFile.isOpen()){ qss = QLatin1String(QssFile.readAll()); QssFile.close(); } ui->setupUi(this); setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground); ui->frame->setStyleSheet("QFrame{background: #ffffff; border: none; border-radius: 6px;}"); //关闭按钮在右上角,窗体radius 6px,所以按钮只得6px ui->closeBtn->setIcon(QIcon("://img/titlebar/close.png")); ui->closeBtn->setStyleSheet("QPushButton#closeBtn{background: #ffffff; border: none; border-radius: 6px;}" "QPushButton:hover:!pressed#closeBtn{background: #FA6056; border: none; border-top-left-radius: 2px; border-top-right-radius: 6px; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px;}" "QPushButton:hover:pressed#closeBtn{background: #E54A50; border: none; border-top-left-radius: 2px; border-top-right-radius: 6px; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px;}"); m_datetimeInterface = new QDBusInterface("org.freedesktop.timedate1", "/org/freedesktop/timedate1", "org.freedesktop.timedate1", QDBusConnection::systemBus()); initUi(); initStatus(); m_chtimer = new QTimer(); m_chtimer->start(1000); connect(m_chtimer, SIGNAL(timeout()), this, SLOT(datetimeUpdateSlot())); connect(ui->monthcomboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(dayUpdateSlot())); connect(ui->yearcomboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(dayUpdateSlot())); connect(ui->cancelButton,SIGNAL(clicked()),this,SLOT(close())); connect(ui->confirmButton,SIGNAL(clicked()),this,SLOT(changtimeApplySlot())); connect(ui->closeBtn, &QPushButton::clicked, [=](bool checked){ Q_UNUSED(checked) close(); }); } ChangtimeDialog::~ChangtimeDialog() { m_chtimer->stop(); delete ui; delete m_datetimeInterface; } void ChangtimeDialog::datetimeUpdateSlot(){ QDateTime current = QDateTime::currentDateTime(); QString currenthourStr = current.toString("hh"); QString currentminStr = current.toString("mm"); QString currentsecStr = current.toString("ss"); ui->seccomboBox->setCurrentIndex(currentsecStr.toInt()); if (currentsecStr.toInt() == 0) { ui->mincomboBox->setCurrentIndex(currentminStr.toInt()); } if (currentsecStr.toInt() == 0 && currentminStr.toInt() == 0) { ui->hourcomboBox->setCurrentIndex(currenthourStr.toInt()); } } void ChangtimeDialog::dayUpdateSlot(){ ui->daycomboBox->clear(); int year = ui->yearcomboBox->currentIndex() + BEGINYEAR; int month = ui->monthcomboBox->currentIndex() + BEGINMD; bool f_year; if((year%4==0 && year%100!=0) || year%400==0){ f_year = true; } else { f_year = false; } switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: for(int i = 1; i <= 31; i++){ ui->daycomboBox->addItem(QString::number(i)); } break; case 4: case 6: case 9: case 11: for(int i = 1; i <= 30; i++){ ui->daycomboBox->addItem(QString::number(i)); } break; case 2: if(f_year){ for(int i = 1; i <= 29; i++) ui->daycomboBox->addItem(QString::number(i)); } else { for(int i = 1; i <= 28; i++) ui->daycomboBox->addItem(QString::number(i)); } break; } } void ChangtimeDialog::changtimeApplySlot(){ // qDebug()<<"时间应用------------》"<yearcomboBox->currentIndex() + BEGINYEAR; int month = ui->monthcomboBox->currentIndex() + BEGINMD; int day = ui->daycomboBox->currentIndex() + BEGINMD; QDate tmpdate(year,month,day); int hour; if (this->m_isEFHour) { hour = ui->hourcomboBox->currentIndex(); } else { hour = ui->hourcomboBox->currentIndex(); } QTime tmptime(hour, ui->mincomboBox->currentIndex(),ui->seccomboBox->currentIndex()); QDateTime setdt(tmpdate,tmptime); // qDebug()<<"tmp time and hour is-->"<call("SetNTP", false, true);//先关闭网络同步 m_datetimeInterface->call("SetTime", QVariant::fromValue(setdt.toSecsSinceEpoch() * G_TIME_SPAN_SECOND), false, true); } this->close(); } void ChangtimeDialog::initUi(){ ui->hourcomboBox->setStyleSheet(qss); ui->hourcomboBox->setView(new QListView()); ui->hourcomboBox->setMaxVisibleItems(5); ui->mincomboBox->setStyleSheet(qss); ui->mincomboBox->setView(new QListView()); ui->mincomboBox->setMaxVisibleItems(5); ui->seccomboBox->setView(new QListView()); ui->seccomboBox->setStyleSheet(qss); ui->seccomboBox->setMaxVisibleItems(5); ui->yearcomboBox->setStyleSheet(qss); ui->yearcomboBox->setView(new QListView()); ui->yearcomboBox->setMaxVisibleItems(5); ui->monthcomboBox->setStyleSheet(qss); ui->monthcomboBox->setView(new QListView()); ui->monthcomboBox->setMaxVisibleItems(5); ui->daycomboBox->setStyleSheet(qss); ui->daycomboBox->setView(new QListView()); ui->daycomboBox->setMaxVisibleItems(4); this->setStyleSheet("background: #ffffff;"); ui->timelabel->setText(tr("time")); ui->timelabel->setStyleSheet("QLabel#timelabel{background: #F4F4F4;}"); ui->yearlabel->setText(tr("year")); ui->yearlabel->setStyleSheet("QLabel#yearlabel{background: #F4F4F4;}"); ui->monthlabel->setText(tr("month")); ui->monthlabel->setStyleSheet("QLabel#monthlabel{background: #F4F4F4;}"); ui->daylabel->setText(tr("day")); ui->daylabel->setStyleSheet("QLabel#daylabel{background: #F4F4F4;}"); ui->timewidget->setStyleSheet("QWidget#timewidget{background: #F4F4F4; border-radius: 6px;}"); ui->yearwidget->setStyleSheet("QWidget#yearwidget{background: #F4F4F4; border-radius: 6px;}"); ui->monthwidget->setStyleSheet("QWidget#monthwidget{background: #F4F4F4; border-radius: 6px;}"); ui->daywidget->setStyleSheet("QWidget#daywidget{background: #F4F4F4; border-radius: 6px;}"); ui->cancelButton->setStyleSheet("QPushButton{background-color:#E5E7E9;border-radius:4px}" "QPushButton:hover{background-color: #3D6BE5;color:white};border-radius:4px"); ui->confirmButton->setStyleSheet("QPushButton{background-color:#E5E7E9;border-radius:4px}" "QPushButton:hover{background-color: #3D6BE5;color:white};border-radius:4px"); hourComboxSetup(); for(int m = 0; m < 60; m++){ ui->mincomboBox->addItem(QString::number(m)); } for(int s = 0; s < 60; s++){ ui->seccomboBox->addItem(QString::number(s)); } for(int year = 1900; year <= 2100; year++){ ui->yearcomboBox->addItem(QString::number(year)+tr("year")); } for(int month = 1; month <= 12; month++){ ui->monthcomboBox->addItem(QString::number(month)+tr("month")); } ymdComboxSetup(); } void ChangtimeDialog::hourComboxSetup(){ ui->hourcomboBox->clear(); //获取时间制式,设置时间combobox for (int h = 0; h < 24; h++){ ui->hourcomboBox->addItem(QString::number(h)); } // if (this->m_isEFHour){ // for (int h = 0; h < 24; h++) // ui->hourcomboBox->addItem(QString::number(h)); // } else { // for (int h = 1; h <= 12; h++) // ui->hourcomboBox->addItem(QString::number(h)); // } } void ChangtimeDialog::ymdComboxSetup(){ QDateTime currentime = QDateTime::currentDateTime(); int year = currentime.toString("yyyy").toInt(); int month = currentime.toString("MM").toInt(); int day = currentime.toString("dd").toInt(); ui->yearcomboBox->setCurrentIndex(year - BEGINYEAR); ui->monthcomboBox->setCurrentIndex(month - BEGINMD); dayUpdateSlot(); ui->daycomboBox->setCurrentIndex(day - BEGINMD); } void ChangtimeDialog::initStatus(){ datetimeUpdateSlot(); QDateTime current = QDateTime::currentDateTime(); QString currenthourStr = current.toString("hh"); QString currentminStr = current.toString("mm"); //if date formate is 24 hour if(this->m_isEFHour) { // ui->hourcomboBox->setItemText(currenthourStr.toInt()); ui->hourcomboBox->setCurrentIndex(currenthourStr.toInt()); } else { // qDebug()<<"currenthourStr.toInt() is------------->"< 12) { ui->hourcomboBox->setCurrentIndex(currenthourStr.toInt() - 12); } else { ui->hourcomboBox->setCurrentIndex((currenthourStr.toInt())); } } ui->mincomboBox->setCurrentIndex(currentminStr.toInt()); } ukui-control-center/plugins/time-language/datetime/sys.gif0000644000175000017500000000772013621411724022717 0ustar fengfengGIF89a$$y>lkeCpBn憣Qz穾KvDq@l勦mR{蝵Lwp쪿Xz\AmrHsQz釤`뒫{gMv?n搩HuV~玩EsY芧GtItvfuV}T~q맻uWdha鬾^]艥bꏪPy蝵U|}=k! NETSCAPE2.0! XMP DataXMP ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!  !,$$h H*\ȰÇ#JHŋ3jȱǏ 9%1 RA+[8jI&N,yV%QQ4ӧPJJիXZ !, yq +Lؑ 7xh8A A!,"%" A*8Xà7 xD ,x0 !,"} DBBnX / xD ,x0 !,"M`BX[<EB 4H( !,$ P` Rh„AJ\Q" %:H €!,$ RO?4PƇAAJQ"C %:H €!,$ '$0+ #1 #:H €!,$ J 7@0 A1A #:H €!," rP pp  y1D,x0 !," zP  yQD,x0 !, "BAZhCĠ yQD ,x0 !,  2UsI *H1A(h 3RQcF )JhQ A2 !,  : "(B7$8Ł&\8( !," GB(tX! ;xqFˆ)4H( !,"%P"ApX  .yD ,x0 !,"}PBBzDXh`  x1D ,x0 !,"3B@X  yD ,x0 !,D }9r` BM`AFB) $dd 22bf"!A+NHElj E"Ċ 1j"A > !,H }BB zeI8IAA2hTb C+ATXd+)Zq \!!,E9˃Az A%H$!B2pcDHEG E"NJ1jt!A6|!,H=aAR1$DIR"Bha X,d LHd'VL$G ZDÀ!,E a%  DщA.j\(`P \ԲGD*$YBĉ/f,q`6|!,>qȗAAFI@ (h\! A4n("!vhcʁZ\PG@!,>  B #! AT8, P;"pG#NLX"  *d0E@!,  qcЃ$!paƒ$ !,! B2AA4 ThP !," 4a!,# !, !, !, !, !, !, !, !, !, !, ;ukui-control-center/plugins/time-language/datetime/list.css0000644000175000017500000000100013630066010023052 0ustar fengfeng/** Used in class PopupMenu **/ QHeaderView, QHeaderView::section, QListCornerButton::section { background-color: transparent; } QListView { font-size: 12px; border: 0px; border-radius: 4px; margin: 4px 0px; padding: 0px; background: white; /* make the selection span the entire width of the view */ show-decoration-selected: 0; } QListView::item { background: transparent; height: 24px; padding: 0px; margin: 0px; outline: none; border-bottom: 1px solid rgba(0, 0, 0, 0.05); } ukui-control-center/plugins/time-language/datetime/changtime.h0000644000175000017500000000415013640364120023512 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CHANGTIME_H #define CHANGTIME_H #include #include #include #include #include #include #include #include #include #include #include /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include } #define FORMAT_SCHEMA "org.ukui.panel.indicator.calendar" #define TIME_FORMAT_KEY "use-24h-format" namespace Ui { class changtimedialog; } class ChangtimeDialog : public QDialog { Q_OBJECT public: explicit ChangtimeDialog(bool hour, QWidget *parent = nullptr); ~ChangtimeDialog(); void initUi(); void initStatus(); void hourComboxSetup(); void ymdComboxSetup(); private: QTimer *m_chtimer = nullptr; Ui::changtimedialog *ui; QGSettings * m_formatsettings = nullptr; QDBusInterface *m_datetimeInterface = nullptr; bool m_isEFHour; //24小时制 QString qss; private slots: void datetimeUpdateSlot(); void dayUpdateSlot(); void changtimeApplySlot(); }; #endif // CHANGTIME_H ukui-control-center/plugins/time-language/datetime/worldMap/0000755000175000017500000000000013640364120023167 5ustar fengfengukui-control-center/plugins/time-language/datetime/worldMap/poplistdelegate.cpp0000644000175000017500000000151013630066010027051 0ustar fengfeng#include "poplistdelegate.h" PopListDelegate::PopListDelegate(QWidget* parent) : QStyledItemDelegate (parent) { } // 委托类,主要绘制鼠标划过时候的状态 void PopListDelegate::paint(QPainter *painter, const QStyleOptionViewItem& option,const QModelIndex& index) const{ painter->save(); QRect rect(option.rect); if(option.state.testFlag(QStyle::State_MouseOver)) { QColor hoverColor(44, 167, 248); painter->fillRect(rect, QBrush(hoverColor)); } QColor textColor(48, 48, 48); if(option.state.testFlag(QStyle::State_MouseOver)) { textColor = Qt::white; } painter->setPen(QPen(textColor)); QString text = index.model()->data(index, Qt::DisplayRole).toString(); painter->drawText(rect, Qt::AlignHCenter | Qt::AlignVCenter, text); painter->restore(); } ukui-control-center/plugins/time-language/datetime/worldMap/zoneinfo.cpp0000644000175000017500000001110613630066010025515 0ustar fengfeng#include "zoneinfo.h" #include #include #include const QString zoneTabFile = "/usr/share/zoneinfo/zone.tab"; QString ZoneInfo::readRile(const QString& filepath) { QFile file(filepath); if(file.exists()) { if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qWarning() << "ReadFile() failed to open" << filepath; return ""; } QTextStream textStream(&file); QString res= textStream.readAll(); file.close(); return res; } else { qWarning() << filepath << " not found"<= 0.0) { return fra_1 + fra_2 / pow(10, decimal.length()); } else { return fra_1 - fra_2 / pow(10, decimal.length()); } } ZoneinfoList ZoneInfo::getzoneInforList() { ZoneinfoList list; const QString content(this->readRile(zoneTabFile)); for (const QString& line : content.split('\n')) { if(!line.startsWith('#')) { const QStringList details(line.split('\t')); //解析数据 if(details.length() >= 3) { QString coordinate = details.at(1); int index = coordinate.indexOf('+',3); if(index == -1) { index = coordinate.indexOf('-', 3); } // qDebug()<<"coordinate----->"< -1); double latitude = convertoPos(coordinate.left(index),2); double longtitude = convertoPos(coordinate.mid(index),3); ZoneInfo_ zoneinfo_ = {details.at(0), details.at(2), latitude, longtitude,0.0}; list.append(zoneinfo_); } } } return list; } QString ZoneInfo::getCurrentTimzone() { QString timezone = this->readRile("/etc/timezone"); return timezone.trimmed(); } int ZoneInfo::getZoneInfoByZone(ZoneinfoList list, QString timezone) { int index = -1; for(ZoneInfo_ info : list) { index++; if (info.timezone == timezone) { return index; } } return -1; } QString ZoneInfo::getLocalTimezoneName(QString timezone, QString locale) { setlocale(LC_ALL, QString(locale + ".UTF-8").toStdString().c_str()); int index = timezone.lastIndexOf('/'); setlocale(LC_ALL, "en_US.UTF-8"); return (index > -1) ? timezone.mid(index + 1) : timezone; } double ZoneInfo::radians(double degrees) { return (degrees / 360.0) * M_PI * 2; } double ZoneInfo::converLongtitudeToX(double longitude, double map_width) { const double xdeg_offset = -6; double x; x = (map_width * (180.0 + longitude) / 360.0) + (map_width * xdeg_offset / 180.0); return x; } double ZoneInfo::converLatitudeToY(double latitude, double map_height) { double bottom_lat = -59; double top_lat = 81; double top_per, y, full_range, top_offset, map_range; top_per = top_lat / 180.0; y = 1.25 * log (tan (M_PI_4 + 0.4 * radians (latitude))); full_range = 4.6068250867599998; top_offset = full_range * top_per; map_range = fabs (1.25 * log (tan (M_PI_4 + 0.4 * radians (bottom_lat))) - top_offset); y = fabs (y - top_offset); y = y / map_range; y = y * map_height; return y; } ZoneinfoList ZoneInfo::getNearestZones(ZoneinfoList total_zones, double threshold, int x, int y, int map_width, int map_height) { ZoneinfoList zones; double minimum_distance = map_width * map_width + map_height * map_height; int nearest_zone_index = -1; for (int index = 0; index < total_zones.length(); index++) { const ZoneInfo_& zone = total_zones.at(index); const double point_x = converLongtitudeToX(zone.longtitude, map_width); const double point_y = converLatitudeToY(zone.latitude, map_height); const double dx = point_x - x; const double dy = point_y - y; const double distance = dx * dx + dy * dy; if (distance < minimum_distance) { minimum_distance = distance; nearest_zone_index = index; } if (distance <= threshold) { zones.append(zone); } } // Get the nearest zone. if (zones.isEmpty()) { zones.append(total_zones.at(nearest_zone_index)); } return zones; } ukui-control-center/plugins/time-language/datetime/worldMap/toolpop.cpp0000644000175000017500000000163013630066010025363 0ustar fengfeng#include "toolpop.h" #include #include #include ToolPop::ToolPop(QWidget* parent) : QLabel (parent) { this->setAlignment(Qt::AlignCenter); this->setStyleSheet("margin: 0 15"); this->setStyleSheet("background-color: #3D6BE5;border-radius:4px;"); } void ToolPop::popupSlot(QPoint point) { this->move(point.x() - this->width() / 2 -4, point.y() - this->height()-8); this->show(); } void ToolPop::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing, true); QFont font; font.setPixelSize(12); QFontMetrics fontMetrics(font); int labelLen = fontMetrics.width(this->text()); painter.setPen(QPen(Qt::white)); painter.setFont(font); painter.drawText((this->width() - labelLen) / 2, 16, this->text()); } ukui-control-center/plugins/time-language/datetime/worldMap/timezonemap.h0000644000175000017500000000226513630066010025671 0ustar fengfeng#ifndef TIMEZONEMAP_H #define TIMEZONEMAP_H #include #include #include #include #include "zoneinfo.h" #include "poplist.h" #include "toolpop.h" QDebug& operator<<(QDebug& debug, const ZoneInfo& info); class TimezoneMap : public QFrame { Q_OBJECT public: explicit TimezoneMap(QWidget* parent = nullptr); ~TimezoneMap(); QString getTimezone() ;//获得选择的时区 Q_SIGNALS: void timezoneSelected(QString timezone); public slots: void setTimezone(QString timezone); protected: void mousePressEvent(QMouseEvent* event); void resizeEvent(QResizeEvent* event); private: void initUI(); void mark(); //标记 void popupZoneList(QPoint pos); QPoint zoneInfoToPosition(ZoneInfo_ zone, int mapWidth, int mapHeight); private: ZoneInfo* m_zoninfo; ZoneInfo_ m_currentZone; ZoneinfoList m_totalZones; ZoneinfoList m_nearestZones; // 圆点 QLabel* m_dot = nullptr; PopList* m_popList; ToolPop* m_singleList; PopList* m_popLists; // QPixmap loadPixmap(const QString &path); private slots: void popListActiveSlot(int index); }; #endif // TIMEZONEMAP_H ukui-control-center/plugins/time-language/datetime/worldMap/timezonemap.cpp0000644000175000017500000001520513630066010026222 0ustar fengfeng#include "timezonemap.h" #include #include #include #include #include #include const QString timezoneMapFile =":/images/map.png"; const QString dotFile = ":/images/indicator.png"; //QPixmap TimezoneMap::loadPixmap(const QString &path) //{ // qreal ratio = 1.0; // QPixmap pixmap; // const qreal devicePixelRatio = qApp->devicePixelRatio(); // if (!qFuzzyCompare(ratio, devicePixelRatio)) { // QImageReader reader; // reader.setFileName(qt_findAtNxFile(path, devicePixelRatio, &ratio)); // if (reader.canRead()) { // reader.setScaledSize(reader.size() * (devicePixelRatio / ratio)); // pixmap = QPixmap::fromImage(reader.read()); // pixmap.setDevicePixelRatio(devicePixelRatio); // } // } else { // pixmap.load(path); // } // return pixmap; //} TimezoneMap::TimezoneMap(QWidget* parent) : QFrame (parent), m_zoninfo(new ZoneInfo),m_currentZone(),m_nearestZones() { m_totalZones = m_zoninfo->getzoneInforList(); // qDebug()<initUI(); } TimezoneMap::~TimezoneMap(){ if(m_popLists) { delete m_popLists; m_popLists = nullptr; } } QString TimezoneMap::getTimezone() { return m_currentZone.timezone; } void TimezoneMap::initUI() { QLabel* backgroundLabel = new QLabel(this); backgroundLabel->setObjectName("background_label"); QPixmap timezonePixmap(timezoneMapFile); //QPixmap timezonePixmap = loadPixmap(timezoneMapFile); // qDebug()<<"timezonePixmap--------->"<setPixmap(timezonePixmap); m_dot = new QLabel(this->parentWidget()); QPixmap dotPixmap(dotFile); Q_ASSERT(!dotPixmap.isNull()); m_dot->setPixmap(dotPixmap); m_dot->setFixedSize(dotPixmap.size()); m_dot->hide(); m_singleList = new ToolPop(this->parentWidget()); m_singleList->setFixedHeight(30); m_singleList->setMinimumWidth(60); m_singleList->setAttribute(Qt::WA_TransparentForMouseEvents, true); m_singleList->hide(); m_popLists = new PopList(); m_popLists->hide(); this->setContentsMargins(0,0,0,0); connect(m_popLists,&PopList::listHide, m_dot, &QLabel::hide); connect(m_popLists,&PopList::listAactive, this, &TimezoneMap::popListActiveSlot); } QPoint TimezoneMap::zoneInfoToPosition(ZoneInfo_ zone, int mapWidth, int mapHeight) { int x = int(m_zoninfo->converLongtitudeToX(zone.longtitude, mapWidth)); int y = int(m_zoninfo->converLatitudeToY(zone.latitude, mapHeight)); return QPoint(x, y); } void TimezoneMap::mark() { m_dot->hide(); m_singleList->hide(); m_popLists->hide(); int mapWidth = this->width(); int mapHeight = this->height(); Q_ASSERT(!m_nearestZones.isEmpty()); QString locale = QLocale::system().name(); if (!m_nearestZones.isEmpty()) { m_singleList->setText(m_zoninfo->getLocalTimezoneName(m_currentZone.timezone, locale)); m_singleList->adjustSize(); QPoint zonePos = this->zoneInfoToPosition(m_currentZone,mapWidth,mapHeight); int zoneDy = zonePos.y() - m_dot->height() / 2; QPoint zoneSingleRlativePos(zonePos.x(), zoneDy); QPoint zoneSinglePos(this->mapToParent(zoneSingleRlativePos)); m_singleList->popupSlot(zoneSinglePos); QPoint dotRelativePos(zonePos.x() - m_dot->width(), zonePos.y() - m_dot->height()); QPoint dotPos(this->mapToParent(dotRelativePos)); m_dot->move(dotPos); m_dot->show(); } } void TimezoneMap::popupZoneList(QPoint pos) { m_dot->hide(); m_singleList->hide(); m_popLists->hide(); QString locale = QLocale::system().name(); QStringList zoneNames; qDebug()<<"nearest is--------------->"<getLocalTimezoneName(zone.timezone, locale)); } m_popLists->setStringList(zoneNames); // y坐标 int dy = pos.y() - 5; QPoint popupListPos = this->mapToGlobal(QPoint(pos.x(), dy)); m_popLists->showPopLists(popupListPos); QPoint dotRelativePos(pos.x() - m_dot->width(), pos.y() - m_dot->height()); QPoint dot_pos(this->mapToParent(dotRelativePos)); m_dot->move(dot_pos); m_dot->show(); } void TimezoneMap::popListActiveSlot(int index) { m_popLists->hide(); m_dot->hide(); Q_ASSERT(index < m_nearestZones.length()); if (index < m_nearestZones.length()) { m_currentZone = m_nearestZones.at(index); this->mark(); emit this->timezoneSelected(m_currentZone.timezone); } } void TimezoneMap::setTimezone(QString timezone) { m_nearestZones.clear(); int index = m_zoninfo->getZoneInfoByZone(m_totalZones, timezone); if (index > -1) { m_currentZone = m_totalZones.at(index); m_nearestZones.append(m_currentZone); this->mark(); } else { qWarning() <<" failed to found "<button() == Qt::LeftButton) { m_nearestZones = m_zoninfo->getNearestZones(m_totalZones,100.0, event->x(), event->y(), this->width(), this->height()); // qDebug()<<"pos------>"<x()<mark(); emit this->timezoneSelected(m_currentZone.timezone); } else { // qDebug()<<"two add----------->"<popupZoneList(event->pos()); } } else { QWidget::mousePressEvent(event); } } void TimezoneMap::resizeEvent(QResizeEvent *event) { if (m_popLists->isVisible()) { m_dot->hide(); m_popLists->hide(); } QLabel *background_label = findChild("background_label"); if (background_label) { QPixmap timezone_pixmap(timezoneMapFile); background_label->setPixmap(timezone_pixmap.scaled(event->size() * devicePixelRatioF(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); } QWidget::resizeEvent(event); } QDebug& operator<<(QDebug& debug, const ZoneInfo_& info) { debug << "ZoneInfo {" << "cc:" << info.country << "tz:" << info.timezone << "lat:" << info.latitude << "lng:" << info.longtitude << "}"; return debug; } ukui-control-center/plugins/time-language/datetime/worldMap/timezonechooser.h0000644000175000017500000000162413635333016026564 0ustar fengfeng#ifndef TIMEZONECHOOSER_H #define TIMEZONECHOOSER_H #include "timezonemap.h" #include #include #include #include #include class TimeZoneChooser : public QFrame { Q_OBJECT public: explicit TimeZoneChooser(); void setTitle(); public slots: void setMarkedTimeZoneSlot(QString timezone); Q_SIGNALS: void confirmed(QString zone); void cancelled(); protected: void keyRealeaseEvent(QKeyEvent* event); bool eventFilter(QObject* obj, QEvent* event); private: QSize getFitSize(); void initSize(); private: ZoneInfo* m_zoneinfo; QMap m_zoneCompletion; QAbstractItemView *m_popup; TimezoneMap* m_map; QLineEdit* m_searchInput; QLabel *m_title; QPushButton *m_cancelBtn; QPushButton *m_confirmBtn; QPushButton *closeBtn; }; #endif // TIMEZONECHOOSER_H ukui-control-center/plugins/time-language/datetime/worldMap/poplist.h0000644000175000017500000000176513630066010025037 0ustar fengfeng#ifndef POPLIST_H #define POPLIST_H #include "zoneinfo.h" #include #include #include #include class PopList : public QFrame { Q_OBJECT public: explicit PopList(QWidget* parent = nullptr); // 返回模型中视图列表 QStringList stringList(); Q_SIGNALS: //隐藏信号 void listHide(); // 列表项点击 void listAactive(int index); public slots: void showPopLists(QPoint pos); // 模型视图内容 void setStringList(QStringList strings); protected: // esc按键 void keyPressEvent(QKeyEvent* event) ; bool eventFilter(QObject* obj, QEvent* event); void hideEvent(QHideEvent* event); void showEvent(QShowEvent* event); private: void initUI(); private: ZoneInfo* m_zoneinfo; // model/view design QListView* m_listView; QStringListModel* m_listModel; private slots: // 列表项激活 void listActiveSlot(QModelIndex idnex); }; #endif // POPLIST_H ukui-control-center/plugins/time-language/datetime/worldMap/poplist.cpp0000644000175000017500000000630013630066010025360 0ustar fengfeng#include "poplist.h" #include "poplistdelegate.h" #include #include #include #include PopList::PopList(QWidget* parent) : QFrame () { m_zoneinfo = new ZoneInfo; this->initUI(); } void PopList::initUI() { m_listView = new QListView(this); m_listModel = new QStringListModel(this); m_listView->setContentsMargins(0,4,0,4); m_listView->setModel(m_listModel); // 隐藏横竖拖动条 m_listView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_listView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_listView->setUniformItemSizes(true); m_listView->setSelectionMode(QListView::SingleSelection); // 不启用条目编辑 m_listView->setEditTriggers(QListView::NoEditTriggers); PopListDelegate *listDelegate = new PopListDelegate(this); m_listView->setItemDelegate(listDelegate); m_listView->setMouseTracking(true); m_listView->setStyleSheet(m_zoneinfo->readRile(":/list.css")); setContentsMargins(0, 0, 0, 0); // 透明 setAttribute(Qt::WA_TranslucentBackground,true); // 弹出式顶层窗口 this->setFocusPolicy(Qt::StrongFocus); setWindowFlags(Qt::Popup); connect(m_listView, &QListView::pressed, this, &PopList::listActiveSlot); } QStringList PopList::stringList() { return m_listModel->stringList(); } void PopList::keyPressEvent(QKeyEvent *event) { qDebug()<<"esc------>"<key() == Qt::Key_Escape) { this->hide(); } QWidget::keyPressEvent(event); } bool PopList::eventFilter(QObject *obj, QEvent *event) { if(event->type() == QEvent::MouseButtonPress) { QMouseEvent* mouseEvent = static_cast(event); if (mouseEvent) { if (!this->geometry().contains(mouseEvent->pos())){ this->hide(); } } } return QObject::eventFilter(obj, event); } void PopList::hideEvent(QHideEvent *event) { qApp->removeEventFilter(this); this->releaseKeyboard(); QWidget::hideEvent(event); emit this->listHide(); } void PopList::showEvent(QShowEvent *event) { qApp->installEventFilter(this); QFrame::showEvent(event); } void PopList::showPopLists(QPoint pos) { QSize size = m_listView->size(); //弹出列表移动到鼠标上方 this->move(pos.x() - size.width() / 2 -5, pos.y() - size.height() - 8); this->show(); //全局键盘事件? this->grabKeyboard(); } void PopList::setStringList(QStringList strings) { m_listModel->setStringList(strings); int realWidth = 60; // 菜单栏最大宽度,初始化为60 const QFontMetrics mt(m_listView->font()); for(QString& str : strings) { int itemWidth = mt.width(str); realWidth = qMax(realWidth, itemWidth); } // 文本宽度加margin(40) int width = realWidth + 40; // 文本高度加底部间距 int height = 24 * strings.length() + 18; this->resize(width, height); m_listView->adjustSize(); m_listView->resize(width, height); } void PopList::listActiveSlot(QModelIndex index) { Q_ASSERT(index.isValid()); if(index.isValid()) { emit this->listAactive(index.row()); } } ukui-control-center/plugins/time-language/datetime/worldMap/zoneinfo.h0000644000175000017500000000205513636025744025204 0ustar fengfeng#ifndef ZONEINFO_H #define ZONEINFO_H #include #include #include struct ZoneInfo_ { QString country; QString timezone; double latitude; double longtitude; double distance; }; typedef QList ZoneinfoList; class ZoneInfo { public: QString readRile(const QString& filepath); ZoneinfoList getzoneInforList(); QString getCurrentTimzone(); QString getLocalTimezoneName(QString timzone, QString locale); int getZoneInfoByZone(ZoneinfoList list, QString timezone); double convertoPos(const QString& pos, int num); //gnome-control-center double radians(double degrees); double converLatitudeToY(double latitude, double map_height); double converLongtitudeToX(double longitude, double map_width); // 在宽度:mapWidth,高度mapHeight地图上获得鼠标周围小于阈值的所有时区 ZoneinfoList getNearestZones(ZoneinfoList allZones,double threshold, int x, int y, int mapWidth, int mapHeight); }; #endif // ZONEINFO_H ukui-control-center/plugins/time-language/datetime/worldMap/poplistdelegate.h0000644000175000017500000000073613630066010026527 0ustar fengfeng#ifndef POPLISTDELEGATE_H #define POPLISTDELEGATE_H #include #include #include // 委托类,使用当前的样式绘制list class PopListDelegate : public QStyledItemDelegate { Q_OBJECT public: PopListDelegate(QWidget* parent = nullptr); protected: void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; }; #endif // POPLISTDELEGATE_H ukui-control-center/plugins/time-language/datetime/worldMap/toolpop.h0000644000175000017500000000046613630066010025036 0ustar fengfeng#ifndef TOOLPOP_H #define TOOLPOP_H #include class ToolPop : public QLabel { Q_OBJECT public: explicit ToolPop(QWidget* parent = nullptr); public slots: // 弹出时区位置 void popupSlot(QPoint ponit); protected: void paintEvent(QPaintEvent* event); }; #endif // TOOLPOP_H ukui-control-center/plugins/time-language/datetime/worldMap/timezonechooser.cpp0000644000175000017500000001416613640364120027120 0ustar fengfeng#include "timezonechooser.h" #include #include #include #include #include #include #include #include #include TimeZoneChooser::TimeZoneChooser():QFrame () { m_map = new TimezoneMap(this); m_map->show(); m_zoneinfo = new ZoneInfo; m_searchInput = new QLineEdit; m_title = new QLabel; closeBtn = new QPushButton; m_cancelBtn = new QPushButton(tr("Cancel")); m_confirmBtn = new QPushButton(tr("Confirm")); setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);//无边框 setAttribute(Qt::WA_StyledBackground,true); this->setStyleSheet("background-color: rgb(22, 24, 26)"); closeBtn->setIcon(QIcon("://img/titlebar/closeWhite.png")); // m_searchInput->setMinimumWidth(560); // m_searchInput->setMinimumHeight(40); m_searchInput->setStyleSheet("background-color: rgb(229, 240, 250 )"); m_cancelBtn->setStyleSheet("background-color: rgb(229, 240, 250 )"); m_confirmBtn->setStyleSheet("background-color: rgb(229, 240, 250 )"); /* m_title->setMinimumWidth(179); m_title->setMinimumHeight(29);*/; m_title->setStyleSheet("color: rgb(229, 240, 250 )"); m_title->setText(tr("change timezone")); initSize(); QHBoxLayout *wbLayout = new QHBoxLayout; wbLayout->setMargin(6); wbLayout->setSpacing(0); wbLayout->addStretch(); wbLayout->addWidget(closeBtn); QHBoxLayout *btnlayout = new QHBoxLayout; btnlayout->addStretch(); btnlayout->addWidget(m_cancelBtn); btnlayout->addSpacing(5); btnlayout->addWidget(m_confirmBtn); btnlayout->addStretch(); QVBoxLayout *layout = new QVBoxLayout; layout->setMargin(0); layout->setSpacing(0); layout->addLayout(wbLayout); layout->addStretch(); layout->addWidget(m_title, 0, Qt::AlignHCenter); layout->addSpacing(40); layout->addWidget(m_searchInput, 0, Qt::AlignHCenter); layout->addSpacing(40); layout->addWidget(m_map, 0, Qt::AlignHCenter); layout->addSpacing(40); layout->addLayout(btnlayout); layout->addStretch(); setLayout(layout); connect(m_confirmBtn, &QPushButton::clicked,[this]{ QString timezone = m_map->getTimezone(); emit this->confirmed(timezone); }); connect(m_cancelBtn, &QPushButton::clicked, this, [this]{ hide(); emit this->cancelled(); }); connect(closeBtn, &QPushButton::clicked, this, [this] { hide(); emit cancelled(); }); connect(m_map, &TimezoneMap::timezoneSelected, this, [this]{ m_searchInput->setText("") ; m_searchInput->clearFocus(); }); connect(m_searchInput, &QLineEdit::editingFinished, [this]{ QString timezone = m_searchInput->text(); timezone = m_zoneCompletion.value(timezone,timezone); m_map->setTimezone(timezone); }); QTimer::singleShot(0, [this] { // qDebug()<<"single slot-------->"<getLocalTimezoneName(timezone, locale); completions << localizedTimezone; m_zoneCompletion[localizedTimezone] = timezone; } QCompleter *completer = new QCompleter(completions, m_searchInput); completer->setCompletionMode(QCompleter::PopupCompletion); completer->setCaseSensitivity(Qt::CaseInsensitive); m_searchInput->setCompleter(completer); m_popup = completer->popup(); m_popup->setAttribute(Qt::WA_TranslucentBackground); m_popup->installEventFilter(this); QHBoxLayout *layout = new QHBoxLayout; layout->setSpacing(0); layout->setMargin(0); m_popup->setLayout(layout); }); } void TimeZoneChooser::setTitle() { m_title->setText(tr("change timezone"));; } void TimeZoneChooser::setMarkedTimeZoneSlot(QString timezone) { m_map->setTimezone(timezone); } void TimeZoneChooser::keyRealeaseEvent(QKeyEvent *event) { if (event->matches(QKeySequence::Cancel)) { hide(); emit this->cancelled(); } } bool TimeZoneChooser::eventFilter(QObject* obj, QEvent *event) { if (obj == m_popup && event->type() == QEvent::Move) { QMoveEvent* move = static_cast(event); QPoint desPos = m_searchInput->mapToGlobal(QPoint(0, m_searchInput->height() + 2)); if(move->pos() != desPos) { m_popup->move(desPos); } } return false; } //获取适合屏幕的地图大小 QSize TimeZoneChooser::getFitSize(){ const QDesktopWidget *desktop = QApplication::desktop(); const QRect primaryRect = desktop->availableGeometry(desktop->primaryScreen()); double width = primaryRect.width() - 360/* dcc */ - 20 * 2; double height = primaryRect.height() - 70/* dock */ - 20 * 2; // double width =1440; // double height =860; return QSize(width,height); } void TimeZoneChooser::initSize(){ double MapPixWidth = 978.0; double MapPixHeight = 500.0; double MapPictureWidth = 978.0; double MapPictureHeight = 500.0; QFont font = m_title->font(); font.setPointSizeF(16.0); m_title->setFont(font); const QSize fitSize = getFitSize(); setFixedSize(fitSize.width(), fitSize.height()); const float mapWidth = qMin(MapPixWidth, fitSize.width() - 20 * 2.0); const float mapHeight = qMin(MapPixHeight, fitSize.height() - 20 * 2/*paddings*/ - 36 * 2/*buttons*/ - 10/*button spacing*/ - 40 * 3.0 /*spacings*/ - 30/*title*/ - 20 * 2/*top bottom margin*/); const double widthScale = MapPictureWidth / mapWidth; const double heightScale = MapPictureHeight / mapHeight; const double scale = qMax(widthScale, heightScale); // qDebug()<<"scale------>"<setFixedSize(MapPictureWidth / scale, MapPictureHeight / scale); m_searchInput->setFixedWidth(250); m_cancelBtn->setFixedWidth(120); m_confirmBtn->setFixedWidth(120); } ukui-control-center/plugins/time-language/datetime/datetime.ui0000644000175000017500000001735313640364120023546 0ustar fengfeng DateTime 0 0 739 495 0 0 16777215 16777215 DateTime 0 0 0 0 0 16777215 16777215 current date 0 0 151 3 167000 50 24 75 true TextLabel 0 0 127 14 167000 18000 TextLabel 0 0 347 14 167000 167000 10 timezone 16 24 24 120 36 120 16777215 Qt::LeftToRight Sync system time 120 36 120 36 Change time 120 36 120 36 Change time zone Qt::Horizontal QSizePolicy::Expanding 40 20 552 50 960 50 32 120 30 120 30 TextLabel 120 30 120 30 Sync complete Qt::Horizontal 40 20 Qt::Vertical 20 158 ukui-control-center/plugins/time-language/datetime/images/0000755000175000017500000000000013635333016022653 5ustar fengfengukui-control-center/plugins/time-language/datetime/images/indicator.png0000644000175000017500000000042013630066010025321 0ustar fengfengPNG  IHDR Vu\gAMA aIDAT(cdvnnnwbpFa`T 0k*~(H+$ti LdRXsJe&ybf)! |gI9/e"d9Z&%pAjpIg.ItqZ&P8KԒ̿KT6a' \ؕIENDB`ukui-control-center/plugins/time-language/datetime/images/map.png0000644000175000017500000024420513635333016024145 0ustar fengfengPNG  IHDRtEXtSoftwareAdobe ImageReadyqe<&iTXtXML:com.adobe.xmp babMDIDATxG-{RE#Rwhfvֽ?vfvhF^$JbhmTePSmBUVfD܈ȈBZ5AAAA!AAAiAAAAAAAiAAAAAAAiAAAA       H   B1(  AZ©Y(\twy?HyJy8PՓAAk=JAder7(^^ u벻ȷ#=AAt'͠H ;f3BH Ek8CVTZAQ!j%(|,ڇ|#',dh a-^sw]{-AQQ]H9$r* 0Rh#xj$uQwwj[>p+Rc#_9/v+ p`ń*ۭq}㇯ V?c   v B38բ{'tX0g;Ó׀()m|q,iC}4}j<3{ɢVCҢ"uA5eb\/ ![^DZ:@8yL"mUvH@o3ݷB!i_0>v_sO!Ix=E2o׃7N]H?\}:n^IoCccvs}iF|Ku  "҂0 G:aƾ߽5Y8lջ%EG6E~[C3͟pПOjGt8M7B2}7 l}|;,z0<>3 aDʘր  zҽL8ՋÖW $Hc=x\EA"e$&G #q /I/6mQ|ySMڧ;$a'-FGn hTAHؘ {~8]ZU$b:K ߰ZlaC/Fh qG/4UϺPhdȉ$Ч+Rbh}D "`0%H6UGy{09z$b!%cu ~$P(,iAJ| sV+5jx;*jTr=H6S$}j{Яtp.ڷnk!')mؠ<Yx}ԁ4 mmiAh #B*$%9^Q80%*cBSgV5p{;qQj[ک.@}d7 UoPM88HOn\;ihw/k% HH BESb,jpX0Q@K^ FF*QL!ExcD~eQa&Hjie:GZHY7yWܱbBfO!Ql R7Y5 [o0(4;$ADZ%yy(G(Th2 'x B{XgQDFXn]xMo|"7d }"@y:ι:eާ5~G"!9&H贗-2Fg~x'=Z><&t "-H@R6C}݇Vȅo"ϰGZ-lբ*P]P H (/ Ud*+Dn[orHu^ 9E?c.$U\#9[A<DwUQ Y̧,{YjQ "g#q2mcI5H/ꯜz)sl#i(v/;W"f{8H߮sADZFm@A2R}IW,NQ"Eь^7.Ѐ08`t>0ym '̕US賗%>+ l]uuc㊈>2+rsQNVU'/ݿfQfM#e  zgǾZ[ rO(9 @ئ5\7w5m%'dlvBBG~Ñ5cV(c2%/B0k _a]@A} 2-I4|B-ivi$ދ(hw ᬿ T# Ɓ*u_uz]Ú ЧPj 7fa|qۺ+< EiwP&uy rާ/ ctMu顆'j5K$ s9S\x{Ӕuky}Ȧ[. G{tD+UA "- ;Ip΢"-NDn[*#|&G-d>Ldwh@ߧjA gD>xTdlI4_Pᤶdy\ d b2!]cO(P =yN8ן "҂Щ (q E&}ˢ|7 ϗ-~>*=-wj};Y1Dӵ9Q}|2<_K TZd[wɠ--u޶vJNZHk0FEvx&m*{9bȁ0j=}(t'(Gw\lD#iFVRq> \PXrk{5:F1>5K%Ew!aNPE  ]"Ԃ0(2Bi[gUe%fFj ҉: 7I+sDD{?7"ڌy$zJyu2m4xV~^^SYFw릆"u.NH̓t0Lkg1^9k,@."2>[vj1 "-t}A11Bg$#vu5gTLZ*HS1ŵU|sYjb?$Gw `  i:GVWI,YXSAA_"]p]YE]o-Z-!~ {ߴjΜ.;b_G{EWH"kB#[- ẍDבs ^\.3` 桷q߻sw@GQ$wr9!Bv8ޤ.ŚYC' )G7ZWH9}G!6ɷ3 Ҷ&L!s~۩LcշG%ҥǭ{ tZ|RlޓibpDzs OR&Q7 M$/5:>8"~U#("҂ 6f; fqiʨZ:bL2{Em[< Hڈ(kuad>3U]7|YLY?oͧ7{ 큤 jߞC{flΑ U&,)Łl JlXOkƁ-Vp/pcUaH V$E|/ȥJ\h@1~5$ VK|2sߵ*H:cD޲8n? 9&tD`_/&YHn)9 2'- p=lu'9/=Պ9Ɵ)3"p.m)#NaOy$UU\"B&$:FU{|$UPx(t;@L\c$7iL~mglY5x bls!RDG |J4摁s5"D!.a{ 侮o!@-ԛ(ŀYӴ}JtI}Z?( FXy HɚŃV5ɣq=jOӡNDq[īcr WVs\c8.^:66#c\߻,ڂ/yZ;B}+F[ Yp75j7;L$H4QA=s<-K:" Fnd취6Kn%c[(FkxϚlo'ddVXї5Z^^0㸦Y ЧyLXT/G8jk?!"-x^@G ?x͆l_, Z<6E9NyDtu6wyRm5z.ŀ B\`kgG;5D9{, ?op}HɐJ![Tu?m]PBB`2UTH+[ F^: H$BV HF ;P$fQ߹,?Yz\V r;wUx ){F4RϑTK m]vǼR{&!vH[pFInz r};2ڊ5*>r|yg%=Y˿& fR mkq6 ﳨ{z[U$b}߽',Y5 5yØ,/;E.g2m+Z*9w~Ҕ-=~SPj(p,jF^{]q,u;ޣ~[dt]C𼎸g c-aDTNYt 4{i#|JQZDlohkxT}{s[q*5*cɔ{u|t |/G\.l嘅ˍ}:q>qStZdR yENn\qN gԙx>30),Ɵ_hjI.v6^Ǝ,|a+d2ݓlw-dF L-ogL_TgԔEJRAB2THBZ6Ҁ<[ f80ҨoRx)F-W\ ؿ5 0.՚h7{3e  AzRZWn4JplT:y\e㌚ȾjUٟ:SF6ڳ$Y Y@Kꐜ3pƧJ Qm6:O\xǺ""B"TFժN0$_Z8GVPhrw?k8 }HETfn=^>Pf'@^S~{J\d`}~ܢGɻ&2Ů - Y{2ȺeB֏r_=slK{I{Zv;LOU{،{jV1V:wWQQ [$pM!Þ`7bd{X}"\~p`^Cm4mgAѫTzS& [uϸ%G>Oʐ-kc'.id .ҙ2$ĵլ5O{Iıs"3aVߣi5y UҼ#FB 573nW&FZ9{B ~ 6H7;:b%W OR<НaOeS-) 4cv(귴d1}&&y~Rl+ƶZ~B+? ;hߵSԴ~Șբ~k[q,y[Nd[DZ] CR_AIJ !j;_NP$wiȄQtGE|"n'-Y׀hN^װW0[;ᾩ 4K}]c} vz}آ ~ݜ+"-N0u_34 7lj--lk8vrHL0#ͱ^ȡ#~ZD{>?.ǚkt 9lUym3F W?_M|!z΂ԯAa-=AoIU(2(@ܷۀ˪Td[4@F>{HhUď+F^#sUSdynrQE׋rV%n8_3m\A5e %Eо Y!yk,$IT ^lЖF{%LS<ZԳy#"=BJe w*87_ W Zcxi4Beˢh4E^ohPe㶍9i  [r#!!O"X\ W713[orl9- m xѢҸSzm킔%WPl.UgY8#q cd e: 8IB%pӳg6`E{F374Pf! [m~~+if]gFLD385i!G=Cr$w0GI'm H#6 3|x^_ڈL\sY~2>HGS^sTYy, |4@W>,_oP]dy6o ;!ADZhNLy^pD 7ixcl`oen͝VݻlkQ]tb0?J =c*lKZ((LĿhޤ}BB,[n[O+#hQAa߳O}[} INX}<ףy=Zӎ` _٠#Ae[w+CDDCF(\$zM*r%,l~|̢_1H03ZEy|@Csg~{ Wx 8ҏ٣,!$zD2ϳ7K瀿F Tqun[ЩpZC<1PWH ܱrǣFVk9"! c[3an[ Bk-ğhA_QE78\hV=_3*jEG"5)xZ DUHDAEy}UߝDy6 WARRӄ![RvGpmp&d?a>#&Es HzܝK$ q>15ꔾ@`^.B3wtHӑC:?c;!B9!E/ Ƕmb6Ihs%g:~1m[VX?i_eiaHI4q <|>; 0;K'}z iH%5%Y1B|B" kw] KφAUMQۃ1rEۧOȘHM!ÊO a 4|VR>dD;h`"4Z⏶5ZgR|p^at 20S|$g*MDZWXde =Naw00 I~/ ]5 UDOy}fYJO8`V?*?c025'Iu \V+ ijAE8EZ y8(wl4tCLL2iuk~ M,Wi761x }*EG!ぢ m( E7Hyӱ$ H mQZ~r?f zQKZfG7`|vEA me\2QᄯRݪ2_Y8{_-@_rkyζP}#P9ߛQZ ׆vX+W88oQ =Ҟa!!&os}VK\2iA'3hDC}l۸bwRcX>mV1N9t[ >=-r"y%f{izz@"ڣE ­/9˯'yIBf4u:x HX HSx! /-=|)kʳ$LKkUb|8q> aOjz_(:}k[IX*}1PΉyn0ߙ{deRSg[ok$;眬$،?ǭRE$_KQo$cFEځ]PA4ϷE̶L/d/Ysz"BauIEH'$`m%%=V'Ac:٬{zv>AR>aRVB1|9ѣ8O'D'U:Z!5zR-P-fUT ۂީ4Y>n 3O菫.Eq)JG/GCl:D}H}hs.W{*OqYE?{\\5C Djjً\@1}ʝ6a=3#_ $578Ys?Bs4~1h ?a[,8_ ["yڶf alH硌AqRf;lNe\H$G ! 3eUڣ[:Kq %l"BRzR/u{}^Lo+Wdf}˲wD.Br2Kgȳ2ʚ GtibB0w%u% 2@}*u k.*9eHWj%{׸`^弄Gq 6-XyStO9n+z Z涤C͹'7c7 aMc\ۨvXf!R c;vq#*s)Ffkǚ7-:n]@0a2̏,{:{ =xI wCaA33+ָghKktFnڱ}|!ZJhK殷%ڧiC:<,r-j-E|jJ~>K>/"MAGOs?'MD1AQ/DRx#b|||@+g8J蘆0"KB2snHuڶ_J:JqL #wrq$z"`:Ӏ```jQ *n!]%o*4ilXc1S~!fx{IaC*$X>aN4~ڑB5GB}/iNc|jPEe !sH$|zS: QM]S\lcBz7'F2tw]"';"BgūIw.Fu::"C|-V 6 vuѲEAL##֗pJvۍ{ ,eEbG(&@X4/Cy R1/p,Cך߷gkm,3 47p^.rW6$mƧ.5zo ~7'9 qK][IN>cN%u/@^.0FటP˒=1=mcU\~}.Q k)auu${8gIߦ#%/ zY#bz 3,AGnk(%c9- | qmgMt;M"o`N3V#} N|b̅%k}J_5zV-9Dc]kө@_aEi\p; O. zBd52\g,*0͌_c=, 5^Gbs2جa!4}*9xj?e4# v{G cHI o܂EӰl >as>0?M^ &8&e='7AN -υeKNW89Vg7v5kȿM(x8O@pnz,OzmӸ#.x}W8W p@Q<$ W,,)4͟z2r__[:-.^ wu:b:J=OZPbc<;yV - jQ 1_g#Ś=vmY OA@a\f?f{댸\@?JctTyIKQXA#,(u#GBo?eW.`\b[Iss1= +ﴭ{%y)k ?EYm_!|~Fcycs ͹<>㏝8ۂݢbY`]na3fUiCA9פg:PYj}JCѢ6նl~n,r֍t>G'~Gϫc)E䞦cEVPAB6Atxt7~%{>;G9[a˵TFYz}؉t|!Hh1dlR_|,xosn}1HK?3"ޛ4*Yo|w\%K#8qHrbP>S;.]✨`xi-RΏzCqNA _nLצHJH@/@Fūh!j16>odtH}u8WTrXY.]Yf8Q p-POF-:U Cmؘ " 0>֋ ΀lj7 s!vI Mb<* e$){Ǡ~6~?6Ͷb$>J k5f͢h/u=]ӝE{)vXT s {Iyr0Ech5%u|g3Nz:iJAM8Q9@;4X@rCedTb$^ɘu{c^ۺe끻/d}?fQJfTCus~g ksIQ: 헬dVo-E۾A~`v9U&AGf5 aD$$(d[~tF T!s8y L^Q@fs).U?yNJmm܎ňK^5[jW =t :\"Y<zmk/Cػ~9a|ĺ3fF}8D2~K@X}/Ex,%#$F?Ӕ>gVAc|E;FmO3FTRj4&_^[-. `YjHqB_k)q3RX__6X37t Bt\&Omq C:tHKz 6!8( -k$t1iQix}?,Cq9ah1zT;^O's4v^kG8ϸךDze1wx૧?]tˠnѷNCvI"hdI'/aoiG?5kϱk=p~`̱"^FuW1pV4#n*y:s`vFOe!4DPGXT׳hn+`o4:F16ZԶQk!4jh*y%=-E oxܝ~FoڮHɬY>rz]L SCJ>iS'çrIL۝. 4w_Dm#!BYi[YVۇ>,M!~Y{GpĽ`rk/MwDz}|5·cWHq\1,Ongo(->k^ EuuhiۖP7XM<-B-]!0`f=eޤ͒prLCoH*Ͷ?tzGCS֙htN1R.8bA 2Nڙ'QC{q(Yvon-Und~P5M n|%s@ Y h.| "݈z = =bE@7V(yoV!xQQ=~F@R> ^JÞO 8"{#Do5օ|bAoeY$}؂b>S'Az '߫Ujy?Z2у8NE(/IB$V҈C]A4NüCFoU;qrsB(Qf L<n$ EN]N7q<0"Z =NY5&90G| 5 PiߟoQc)IA(P F-?bGu`XFd/.-B_g@';~?5.ǍF(q谵^7=}G7sR< v`}Os҅1k/-@ȏV?\fLc)hI,$">KN鶜I:X@>q}MʕtԔֵ/G|qH °1D>VD4ay˻I[Tm=곷M1G2H iK'ȃCʬwUu: )XAa6 ytَ͒K06s))!A`Zyd69JpAl`Id'h\=Ҿ'4I-7.c_QeٯIJzj Tf11|H&"M+Dm=wP"m 楫qRHpJ#yho^z:q>9cAP7ϷN?|OI{A35[#"@m2L BGtYc\s؋xi\\ V/0pF=|A8}o= dB8ƻA!^bFy1FّWDr7@5.ޕ8ק-[/( jpq5@Ax9zv%-W)Jݧ -QA!y*:T*@HfJӾ}!ȧ18|s|y|eFkr e'=,0:*qz:"ETtfH PE7[LN0R߮CHplM $/Nf4kkԫd|w^ }N0'G`dI\AV\+@ozkT ʆ-^]j'j:pom^/d-};Ax@2ݳ mHr>q,Sٝ+ #(rM fƂ.'i?D'VKaQ?Frr05C}˽~@~5x&> VXﻃ '>p^~#ky6G~kOw}z|FYDu*VA=`[]퇋)z&P,REЈXWX:e #Kk{io'HtQlW#h_-rp߸ !{iXJN/g8dG͍˩դ&Ȗ:XAZړ=ᘉ/ Pԡ m4<"B=HC)`LZ4*@iABChX|)je~?9z YW\y_BhU=mExS|i±; ::t>=}f Ђm"}t)>Zk0 "B8`t Vd/K}8^0V̷(?)8 ' śtH}vdc>3pxՊf $`a YѨkZ0$QGT.sZXo(s40AI"sCVpȒ̠;k(sT]#Y <eL:/"5ܷdF ul ҥ B S^&?Ht80 @eyGZ$BŽMeDc7eOv.^=u؈2u}?CQmV{==c&Qe2$sݪ(q7p'|qhAt:k mGz|ul-/w44EF'4p+~G+2#ǿh?q~ Eﺿ{7'^1GP"yF9*b_JW(4YQ v4{9Qmc^b}\or(ދ]=[ A @O Ps\*k@ؽ{j_e"4ԏBji%Y8/H1g33E`Lڣէ}:}{iHp kw̸*kZ2Ǡm|k$O8O%X{Y>U m `H A+7i{|+$n^gܵ>i5" XhAԗ;]8iԍRC$#z Sx'4.eQ9x?Q٣WꜼe=ҀT'dlqS+ANp"ѶJPeu I<^v u9JJm! vL`~N 6OۘZ#:;"H}d v9ry]f|։IkVô:U]NyA|"mAKrI\ >%9Wik̪`NJ:=fbi7DW-**@-ՂL9n!}ɒSj)("u-16EݝuniXeNYt{2ajT?߇G_Y'RTYh0^)XaCNFfo'68C2'*1YHUuH[{}V3k%7?h.z(;r֏S& .6oDz =򽃎fL @R/1>TLZB ;=n LӏMGVi6pVg,9fNKfAЪ ;HmA>):Þb8Txv!|P6 J?o)[b FG~q?[{΃jk?@yҋ. B|kHdF8EC oe7[VskN~c视Ⴢ{$X닖R6wǬ[aTqUY~hd =cXN㝪. ;rm7?^EfPqr p s/l{ T⟒Wi'}6ߣzdowwbR8 ?l .|-6> ]8 !++~ t`µ>ϥtC=?z !I/;WwX}SC/v@0 N o_(R}obQ@EhBj͡;%RmWxC|i% 9?(̟ <L1ʓ=5c_E[DA6JL;H¶ҼC[JoH.emFslV7 }^]WI@B3D5jj D,f_Ar̽dL(ZcQdz0g#g$ ǥԐuh)* C1Ah@ 0>g紆oqK2TQGb+"т 6hЎDZ@;oH?&^p'.%h Npi跬A[þ=^)M_rcAXHE +מ7 v=X`q,9R6Gs{}_º23PL~j)7,zp/٣$LZT!\3~st\xh&jJ ]Zp`k!*^'~,ݩT.,p>yZsR4qSbيh:X0 v@*Ҧ2]y=W֙vDtF4FjC6i}a۱ &veMс2.N.CTG%RJE*NZ~qAO RBϻ^A Z\EzX8 ť5CG8aFlfM0[ьaI4_4W!d,}ԯtAKDD?>oCgdK4v&LJ4Rxbac;;֝>%kT BPk5 +9 ]iidmݦ/}~N[J8g$?N'Ap˃b`! ^E}"ykDz__鞨l 2ts7i?GX<cO Ld8aJ@8m* ?kߋߊj3x tS5# w$zlt"śD z3 &QIk~OU}X|> 8aU~?r 0DC&?Oj# >>D=a =Z}Ы x}$~`A7aP= 7%"=0|ԻwM2u>vJ<@P0װmkovqiv.j?+? 3/$׈>Oh+pEA@@}莻H(iV+r1p/g4 ث/v^_[ͻ迹70 trI]q"}٢B!z ;@h ƺWUt MNۣL_se_ ݾ>/C8~jyiRgs-c8D닁cگ[QXANpϏk4=pg3K##-n&:<ۣ%hL٨w{wjCv*>A,bŘsMB^(Y$<.} n#"ݢ: [=mQ]GL'*vppwۢ.I}Wb$~ܔ]%BփF;^ρ3ȷ~%#]Iۺ {g:11ρ\yL|50BVOH)NIAAAn`/\ ut?/Sz!sޗ3̿ݴdDXT:z䕌ׇNB|ĹMqiX3A2"hؙsnv* {t$1ChFa;td;u([6'B^ B7V vm- uNSDQh&/[-ZჅ=S$w8"WpL?~ F":0%;ƿ*&I _{@%{.B^鯨IϺy7ۥCKf'-y$1]!~`GWx)]^a]n3&dTPV0&7NV.=́ZfoNxQy rAH2苈-kɴ{N5D"S'#<>U~͇U ;^#9Xo9{Q~rd(UZMc$j$/[mp⠟L.w:y8ݽ|mnV2ﯶKv /YhhR36b?ݟ6EU׋/vl0("x~٬.ʅG;ݻ9V@($`[?'a ދj~8GR"€Ű'OR/TڔIS2(S$ѓT HVqV=5f.H\h0\N@c+4x*6\^FZ@JC@SC:Aâ=Fcc7e)2;qm(ၨ̆Tܧ.k6U,e]ה Dֱ{'Тߧt޴(wLsl2&ԬqJ!SCE:Jlu.^3HXC^TClF;n8o#5Ŀ^VuMHj1|OW6 ,r R Hd b*6&8 I,LUkE';gozY~G o??TH7@?TDZO`ߡqӻ_`@\q:njXHH,+1 ̋Zs]Z"=0[N)pb7Sw|/mMS Ϲ TUw#iuHVk6ܴmMɯXgK#]C$b3eўѳʹ/^= 7`;$bfy>聅&Chażmχ nP ex:RyAF#{ku["k1V>ZC"N պq.4[@8/֙Ei9{UW>wGLr{ngQL'd7kE2T<9 LyZ:yM#s:XZbVaɢm<Հ@׫ %|81-X o7Yb]i`W0v슦PGfn b}8AnO4 E,̽LA3!Ǣ}F͢j>o%i* yT745&̕\y V `:Q/M&9ۢHllp %v% Nr@aΓ` ?pǜҺ;:}QZ",[-cs6 4BZaΣ kB|lDc < O8@4w$h_Qd߷͢ަj]C6uoQ6ߧGӜ`&,깻aɑz_̷sNri%bNz)2 ?pZf˲X 8p- 7if#^0]`{D¢9hD5Q\V]$qFz,ݓhu Hc5O!xsT|rllhyբvS.ذ=>߬L[ttEiY ׵`-j5w>m~ŢHߚ0 U: &-ryX6V)w;:ZfF\$Ofz@VםQR?\D@w~׿S1#pH0 $ Irh~s:DSKU.r'I(ʺDb4E9K J;Xg e5h9as#XeJ=W̕ 9,n+QaVJtܢa48+,#i/[(ШX|:!#_PHŘqD!ۓ}iyi9<, @Vw3&bBX#>#0hJch ! !|Ro#;$F;9v~_{Z .\`ǪWadz#fvO֔ItFVl#ϭ -]yYiq^VMX1R% Ĝ0vWW}Z+?|O3sd;zD?Ť`wuiXiaTD ʴE x~WJC*2rgJ)2e}c#HHѪ m srs+#!|$" 2tޢ}~7%& i;yޚ?]n{Fn Q*#y+1O޳ɑ+tD,*En}o|دwy3ӺdMU,-3RClȈ@, @ pƽ~\6%5֢WiF b[@ 6/I2㝉̈́sdox/yNH iZ03@NK X?OrV@iL"C0ewRsQSN'e$Ɠ|Q ^νIF We+C]r$텀uE{ºz$x|$O|5 C5nE׍§K VYrS|ϩ@Z<-KXhT6[]وjM9I1^bs߂'Ts^=q(*F*:6rAi~hGEBr|F}TDWR ,^]r?zf7'sELY;% {[Ъ9D4dw̼t{Dbh³N#`}+OQ\z4nB}*%g"-ۃB2¯aֱYJРNWnbDybwKC܇kɬQ#2Yshn-!xZ|%J_TWV9W$^7@iY2ݮs\6Yu-1^81JDQ3=789.q2>S[=U\|qDtk^@, ;Tz G'$]%m iPn̓q o%p̀%*tގQh7%3*07z~[ϙ3@V% ќKV΋f.L4eJbVU/Ys ٚ#7q9)Kw!ݸwHȐЀZ 7s-2񺄡NNYȰ)C#5a@5 d2+ N\{%iWvpJ 9^[j?7l2!ᆺ  x-VlGsj5|Q=W5yQ1]D(z$S`>!I)ӱe}سpE؈D=ȋowP Z L>u] Td'*GM~Ѩ0Y*le8-Ph; .RxJfc3]͠` xjuiQC+f!n㜕MjHou~JF9ʇ3iԾ:8W __0jx~O="_V̶E<;y-VP#Qa*.l@?#ur 4tOظ-*YBEM ઢ]Q.;]*x_o#Fg(6Z zN^ D3-dj2y(ѽ D=͙_=i/뼧s' ~SmЀׂ}wx5BP4 =npσ}e6SoTIOoM k/4 :f|:y]gewF'NN.(Ƈ4wrA=Thz.+(Ve±4"FN(=Tc{V9Zae@Hqyۈ9C7w>1CZlVvAÎ_${QaIzGAgm€t˽ {HiH A%&T&'HYsL>Vpm oӀ4DDek V.`z}U{O ]6 WsqA<ǎ'2\߹ah9*di P9LS4wY=rʃ4|4|0yw|ߓvC-oEf@%) 7ƎaiԾ(87 4ǽ>ҁ?Id}GB]R DRoD .4v 4y4OS1$ @xf 1.NoI;F019nmnK_V ԍT*os{b;Ay'SSߔl;= EUy{O}i nx4Mp-|k?Ydia^(wPV[YȢ֗#oJJJ+W>TV+ȭ^ O>OO,n&arP/vLuX_f1NauoZ;)2U4Q!Ng55 kur* gRJTbU!P?k"~ 8 P)Z+u୐RiLq.r.JU f'ug~;N%+C ޼yV}TRfJloҖJ"M>U{QCF]&xF_>Ӓ)cC'.ҨC~:S{=x)0ۅl~*)0@  b :ϝs*Ty\0.*I"%C O99 b|YޗE!a$*:ކ;HW̹&ox6KJ~u.m} u^$65dAG~ֻys=3r! -l=Xv= t4F8,(ǖGZp @zzi-qSx>GO"L4T$׺I_m<2?N˟u>>@#as?j >ѠksK'JaHF-֢C(G(4 1@zj9^1\##XN*5lL=OP`svM"f$xހG1880n/H(y~܀DwNJg% %rb:ƅbO_sr! WՋ|՜E݊J f{MmE˽``\5HF57{{9 =!Bwc6kk)'w{Qi<,{J0}VoH&{/KeR7|@W(X}pNoGfVlFI8 ޞ#=|׾*)n6`1KS<Ә*~\)ޫ.ai7Y4 -i/a ^ }x>LdoA=h:X}(4ѐ= Lv*a-a_({"`IGxf)v8M}%{w8M~eT)@S{vp=m]EpPRj Rb`nkԢRAi5fpŔļ<.]6p^U7$,Ep`ss):6@%eu%ԓGțqD`Zx_xm|^8W#Jf?;r.a`8;b43 ,,hj_fN&a0[ l.l+Cx0ƀ陂I0}eF: #uZupi<&9!7$o#wH;ŒI|*{s"JZ!cǢQjzz'(؅ax$ƸD&N1J8OXc)aq_"nB)s% Y#0b ?;LzT0[2o9={\{|v;1 7;E1yߓIm}Ѫ5 CK~9?kFkh~*PHkvË> s׍ @FV\ku5^ $n EFϸzXzqkQg0ܳwKȝR^TlL]F0/;IgUgP=@Ȯ2ᇨ'%,@^>[46?#{tӭ I~74=(ZyAZgU7o8GnonIv6c<[OMWY:qFJcdBz |'oE{{GƻǸS6sVO3 yśOr@gd?ƈ4wcPu}cp^ DS^i%ɓurW(;| gwy OSq{%{ EEvQGAjN /cWѓTd33X ̟hWz 0ggtUyz)$$\7s?#kZH~hf$h*o޺4_ysΝ&itxP_#]mg_L ''NaDeŴziC%ar' }J!$3[j% B|z䡱8wMEtEB/tsjPm)am5M X|mdoM `5'CupKg> ^_" 4g_6j-gzXsjD@){& i!/o?h(3x%ds^yՃ4S}Fᳳ*T(›c s@<,)/:/1kIyNdOdΎ95zER:trur/@c_?-킋ZBFi{ngCɁSV~.yƅăsqA4ew¤~V $*]V +"Q*)ik38{YڹZEז5ރ=( 0P`cS/s$Ȼ_vÏWf |L͞B;@کk0u)~atrdZ/f"j2b*sUQTlߡ1u5zK-(Ҙrkl>J+l%ܒVDӵ򺃕#C.Q=ȱ?'i$y9GIO% [!* s,S1=KerFžo4E< zڶgTZ% 6zէYU-H)F[Ow2^i"miC$.h3f5%{nP`~Zi2\W0}sM>NHY2{Z<lx?]dpʸnw1F'-Xg z[v|'QrBAExHk BE 4yEx:׳]8)PFAnJA":߰s#hP} H}}<kZ_6<|(@pNJHs:5S8;&#ԁq$^8gK1?7%r.p΃1nД(xNzV΋ލ9e LVYPy׋雒c| @#~!a%?/~>vx75YgWN9])N!,3|l^K9.A;'V r^M+"4k֥`=\9G ކ%ˆ A'uJy'CiF ]XsqoK釥ݒ0[j#j-* v SwgՁWw""7do4 ;Ҏvyq?&Ain U9'ax3/n _luz!3X_c/IE4nNNXxbF&_mr/wa"{o2" .7s~yA fu>9^_az(^[s9&a-ugc_b;ADH|GtkF%<H;o\max-#(.ȇY1RTӃy9^OA|'Ileb >CG ZҋqE Ǽf̵g976h{HlJkT6Lokx@@zkޤ3| z2@ՀG^`s^5v'NH+Tb>1 z4VAmJJ;4kD+x (Ԭ)*6dwzzA[, g2ã6 q/Kwa8otPh]*ußmݸR7.-gaduX82rEsq} F \4¸z-7'[\5yFjIviwd'"Hh/Y]s;89vsBei_DVHoeAu(Qg[\qA2>8g4%5i-Dl8&|F4(PexC]#4v!B̟د3o6Q:(m`-8 !(^^jf7Z|B)VG-P :?[9᬴u2}|/vRXOS!rꕂר |^ri춢 Ut+D~Z[BU/\oI[鬈Vpk ao(R1ƅg9OYya-Sl+YeLx$19 W'ˀxQQI=v1/'^ L `Dkt  ̓]٦8'7^,u|T"J4{]_R܏֓X C%r伽"azK]-:ČUaVtV^/gn= c(Zs7XyfJ[ +Yu4m@کgb (U› DSNh}^J}C lPf_0H=93H|%:M1j2H2O,1EǴ2@`!`X@-rQ>ywzg-v5^ԓwxނ]ѽ] n%}b]lz1k_wC<۩bGYkjs1ʅ ^-|WdJ:%0`kug ~Gn¿wӐ%٫Z3V.r$G?aQƆ5.K[>ANJYt78x4 dxa{jJj"oƐY%KoSqEp{xQXI=v1W'9f+ Q -i%>m@k}\ o%_ySv?\@;[3-oYf"_99N x~i%c ׫rŁhUԌ7Rr#Gb@yϳjdž镻03hPKXiLOnSfTs^#׍ i \U ۠|/8MrSNJ2SQj!L02*(SԿ%) {(,Pv0^Wv*8xգn bA?_%iQ t͈"^8Fkت45([sC[*>v a3h4y܂op5B PUERH}N(A-޳z7ċEﴠӄ4S\ohAa Oe1 Ieq |(DY n?^y懗҇pBx45`^T\S:+ BsMcG%SnkB@hI7<}ay\/k&tMsռgb  >:iuPJήȵC܎3_)>Ԁ1nJ*D?@u|NzS# 9(wHrSIa9/aq0@xWmGsD뜴Sq9=SL̂}mF:`@IixZ dXkk{2y6 FG(X7w=̽;pm` em/gӂbYCX4itr4n<Tzk1ݏQآr}m3 `"wBžQ/Aۏq N ø_ttj .צ# Z"kN6fl>(8Q+.HYY%Xe s{%خKؒj$A֐y| r~[¾n\opgs86}3S_q;vr ԟ +/_󆴭`{է5`~sG]$ qF BC=i`:8 ]| @d 0Q)o|{sUI 0PHo0g/&&{)8.'L*(E@p{(MeGvzfXO-α qW8j6pȺT+SWNkmTx\/ ymGs#("/1߱7 3K4{<% +Zv(Țڐ{ ۯcs?YxoSjx/kP|0@6֑`X8/{4h~- ->IӬ!JNJCBMI7G3圆LGdɯ-4z.a+A|VPʯSNߠWZ z $ ߞ+b0#[b7_u_]ï,z_:KisقPY2Uu5T ? g@0+IJ;6Vp>\!HfrW "mMU3k\~~<^<&=klprhnA&MF9aiNT ><y&F^¼³0oI ͽUB'3<Yk"8@z^8m,<>@R(51݄!VX$ڥ<(v*e\G(3BW* ^ާT{Qh%sh4PCSle:g#orf%L%HVKnf%,hD*l}$ ui' :xy3xqY ?8L ԰銌y(ؗc>JYjNN޲gF \[31jRN\aDK+ kB☯X=iS_qWbE͝6^>hy-F΀-p~n|kh({ o7V.8m9<VNY{'aD1]3rE 띷IyЕL~lhS1899vr %j JZ2K#>9 nL# _N)k^$<ߏ+ Py֐٢B-ſF^9D!OPiW9xM+ @>'\-#]?8 Ǟ;YK ǵ9 "fLv"s2SF4kz٭gM/rmޯds*,}F@CP ?kp%r8fLcN\z7, ^  #Tq JJ|[QciHnV009iQת?k Z/5I8#h93$.ME'E'x|Nr 5u Ѷa3leæ Aouq9ŀ4{߹ iȫv; . p &t V']uJŘ(XPS!rzp@&6I ߂?Ϳ %b6ƫh:nK7QELi8*@SpSŠê"\;)xl/n/HY&W񮚵\6I,9;?,~K& s3AU sV9ylIzh95=fMl1K []a\vN_Sff'|w]ڞi(Ԟ)BfO]+63sSKcz:9r}%z9ndx{ x 7#; tyN^" o| XGf8r 5 2 =&1^$`DXiGz?"a~Ld׆ PJ^!Hn'"0 xȶu Ω[\!$Ai;D@QJ e\p Tqz냿߽ a (ah?'= ( NzSYqގQ|K9^@Ӻ5?Xg:u b3݊qmK!NC2ޅs4J\4~zQ`k9:KC9ٷus_ϩd'H I&BS4CD.F~g%3=L'AС;yBp5IЄ`[`_ԫM3WhdEO82NNEٝyd-/կw[3wf@i?#Y*z?V2찄mˢLFq4~<f΋_"q Ѯ_`9c&nHXߤCUrq57sX+-da(x|=%Ω0@:`~xjBiIQ 4N{cG1+AN;p<0n]uhIBoJTIF|0qUl-HcKZa{+@=Bvq?Q"ҭ|H',a^`,6Ax'\O Yc/jF2\pwR_ݓ08OE ́^F4<D}fr H:{^y|W<$ f">q@z:Z7H2(`ZyDJ`oeUnh)HOJ֤^Om7`9 Κ΋glH ^Bn G%xL@T3ڰi{49jтU{\-<r[x㛶kPQ ۔עd*F\ȳF=W`ځ(a/wm/cTwZvPp/_RhBP< ]Awpwn*sr~7Xo /,TԼH!wVҊ̓ʷFDMU vP4I=y(>ѩmZW)/eIL=uq?9o׿Ylu_Ԝ f flU5MlBѱФ$USB,^, *o ?u2u;5سf;W4A #cHŠZT?hK _< '~ a\xрNvN¶: 6+F'=d~g nS+r5u1HZS`@p+;º-򻒤GWK98k<_ch̃EWN"I#}0W9EWos @>pjXI}R E缇u*?ݛ98m_N}쑙!I׹j BŰ]kF"G=Գ>tmSn󕂀>]:ivUd&ȯc_}}Di!R'(CFn}ҒИwF:$pH\׎%/N=HYV0i- T~2f!(BjRƆVCq$Eݿ[T( ѐ}S{>D*- z|-K؊ncH`% LBn C9iGL[-̡w9~GcnyPB,P X MZP :\+w]'*G$N UzE!t_gM(wa^7)dU2L0x!*͔a=G047FEY *GhK$9B6<n{UpR0Leo` k]skz m(&OxRsv wls횑Ѫ;\ &.\y?5-ghả9ekbi+<{EP?OXuu-~5BWt"cd>u9 }Eni'yf u,GeXw $OH,%* DkΏe85a}L(`ې0SƜ3͚m#H^vP97}CF %ݕ~59-O=*,|$I3i 0YzWA9?|`ȿ yGI0> ѿk!- ⼧)@*tQ{9iL9NBtuNNж]iـausOD@z#aOF>+QH8?$sBaK;k-"~yi&[wy_%=QnIWċMGa@z}32]iAJWɋs3c͋MXwɫώSZ"pw ]LJ#: 5I/&3Ap-3͵y-FA=yKXhz drЁ†RtD'NNM BR>r:݌αK%SiV {MAZKI!tQ/a}E-2 z<LR<$ Jv`ߡ#fI4q4Ac~܌=s`7/Ǎn$Y OΝW @m ĥ̈́ͅzV㋶Dݖ,`lcJ|^))@ɩgV%*Zd*Zs(;dG;|5M!{=(`M7d f{4E*3Op5⧃^J7d%ۉY5 k%f-$m<-eVc7Ƽmln~s#{KyjBZ0W^@5z$0n^*ƒg.tw ehNN a5;³2L|#dUQsӸȆz(x*OW }h06}P8$mCQ5#0 Eȥqƪgm9 /<#6b/H Ƅ䏚ʵ7_cq<ʈi'!j $@uOQi1 u^׾e-uݟS *#xDgXJ/q6bAAte몄EI>˴>a\ P{U wU]g|~#)ΙFYL(5ϱj qjeML''NN4 V vBeM*QP Pkt#{CNS"<h (>N{JgJophnHPҹ Pv}EEk2Ji@:X*_7jgLy|SBy7-ϒHA3w$ |h9556DZƲ%NNN&Pkݹ@(]@lXANAAv%8f'84Iν,ގ+ڬsi[ݲ4l FcՓ.9=C,c&'i0¦P5`03(0ko 2g _Hg?- W|k cWސG@ߩq׼(Q Dr @Au'e=,Y `X&9.*NJ~*8 mӰAI.K=鉞!B6DrQT50ng5|o'2Q(L+vĵ4~Ape.Z&OpBbx&a7ո-I!?}9,tsF zPSi_oyX8zvw2ɩ7 `zHޣH%w|ƝFҞw}($k;% FTmjٻsFcTci W͂h1W9WmAvrOy@HHB(af% O _]o]wU>.tWI0dot{( Ѡh^0Gj/ϝ!}]ڡޟ{yȕ[aV Eqⱎ >5M>ٝgf@O|ܵQ)3-C- ;lJhP\YXWFp>k{F&P$9xJE4Q9*aHTW'/cvk j-5 G=7Rn;m"\vX{ޣϤm!tGz7zdQ ޿Hhj)dԑ-3j}WFߗvID$ r iw""N}X_q@ɩ@5j@ I*$5Y ŶH͌91 ;RIJ6%;л1NU{h7`DU6ʴVZ yk⢭rF:|"̻Eޜ 匄i6 r8Hό3F;MFkNSX%V1\Ύ_%k079@ Uo^?ɺ:|NNNN9 VyNLש9I "c-Fl˂{TDққ',7{;Iv%==osbC@5ΜCnSMD5=_ pWͼ |ӷjO^$ [:;lFrj$%${wFtkй䨴7 i@{H;99 `FW %Gr(ĪA) E[ʑGe%auS jm9"eukqk=r=ꝔWٌG{<:7*<\ />3-¶w\!4P<.ó ߇$a4ZqƵ)Zs>w}_yP^_0Gx89vrrU;՘ii;ct|Sk`Ok4{J@h [Yvİ977멠${X4.p$=~ L;05=*:cBEϊi'Q*ȧ8󀴽ӭvh!z>C4g ct[/NDֽ5Дސu\'0 : UoJ650" AY׶se<e2”{%R opm!-=?찶bDz43OTbs 6XCH;9LÒ&K+"Xe@-_'A8޳E9 +79ׂ|XU٩u[4연}Z, [ bK(U$z\{{`Zs'3OU  8:\c&oAs 鐄Hλ>reő)m_I; kK)zux`_02a ~ (?lKCl ё$H+i /i?NNӧ)|AGW(9H.EPsL(yBXøJd^c=G4|밟U8列3KL[r)Ӷ61>d5qZI:U2h m.<׼Vg}U59QP:G 8C0#ܗgXW9{q*2"iN!7L/<^4kAKZ @=KZ%PjC FpG aෂ몷oVVS8NETj] =䓜? ?J_޲xo:IJ}Rs!x;E) 2|yĽ~k>-'|L>V9eDԊȟPAm0'U8L[%1U`yЈZ)Fj1ߋgV73!ax6~ #$|o Y"gʼ_l mŶ l{k-I[<,xiϥ̟>!.5p5 /`(Q+g]T{xCvхkF` ֣ab- z!*(/#U1T IG3h^uWI=y%I7.kA-g!E (QYqO +U %C$Hh@']S1ؾg 6F}|Y@ʻR]OںzktˬY,ȵC`Wr\scD %[eǾ a9jc|TP{|(@?aE&溼+]Pqtrr=jga @G+B[ +iQkjL:)y:M#T=*ak-kkrZ 6ay£*rOՀa p7`;M!隤W^1/5-GA&dd@0 z6 [ j'+<9% 4/?n|C=߽y@a}W xPvWEHcC Oهzȱx]p|9*(6oP?fZ`$V^8"ƝyV̪Bxu@vnT{ q(>q#Tl!RQ^'iPk#9!aK?I>\E phMB4wOHWR$ew$}J#yK30#ǻ% "*WxdžwkE xk_x#hR u;"m#1{t)RS6J 8^ȳ%AVُk^5 `.^-ܔe(I[7%[XN=Y0;*A$GCNfxi''4ÜQ}J<7b(weߢEyA f( ![-nym+˪TV{ )5pl%a{sGZd|&kE}Pg fEvG>}˦CoiWފȰ'\QkSw r?]45o/7?I߿ L Ja~TTN^ CR= 81EbqTCP! ^P7`sVi&i{t?hUAQێ BiWԬsϤ_Y6k% [cI@Qmu:'Nqg&ýp44l@ʺ]<,| aVHu9㞣l QV d-P1s0\%LxpJҔ@s_`NMa4Gx^p\M ڧxx_% ."x}ݮqֆ^i'(8.ܕkb*]*Uܨb~Onr7]iu\OI`d@֥7F5>-mZsO,H5syxUOV]xyZh^ ٛV)cvi0D-(={كq vK,yZe7.sɼ1=ο3yN)oPRgw@@Ὃ Ѝ:1Ga)DZݬ- [́xVgJJ~zՆHnƌ ? 냴{w55+ϣ5΋ Uv.rIC-S2Vڋ9pWhأٲ~Ч{'fm1rEEkā|eV0>DRIvז/B x|c1qmJOy ~"VjW27BR: #DŹ.A4jf3ƽ j=Lrڶm-'|* n6W}U5K°F]XY޴,a(Y M$iFcϠ~~"9^u) ?Ry 4YH 93ʀE0s9fEuugFK5nAp586bq%8K;ܺB5c9ͣl>BEKpdEFMQ8T,JgYƵT\P'Z(R {@4z)TH0h fdmgC{]w^0_n kܯ =fdpQ"Y%jۘ3oNjO5̈́(k{nqo|Ó> QG/ȩ%}KE[%~Fۊ)zG:޵> ØCLkuӬ~>WFCyXtd/IS8 NkiNNDt#,uNȧ*>Q|(K+0X#$* ʘ]~>nBZ:ADa?(4@f^I یzŞ7tiQXLJ="׹ՈLK,J  ~.<^=6/9fr2~7{-|Uc}GE`P쬂i̸JŞM^HQkҹ>GNe᪛Bk"ַz`,^q-Ƶ)aeh0 Gx6([*)Gppwy!yY@i~H$ȒW̾6{NP(qM¾W7{~(<>F✫mi$ڻ8IjsxڵRT#]uHVIpr`Zt=<_0}AzԢ猂JBܸ<ʅz'( 6NWcC˸\_ki툴%X?7)i~Tkh>hOYXZ4p!=38\ve C뛑1v &Wfſ%=<C 'Zq'12 ŵ^JX0ѧ89IùHgFzOWk^i8:?[L_NNCK)HS;6kR]\e\/GLO7OPrQyDw$Nߥk'v6u?5JX"r?E֚`km 9>k˚F{Ԯ*m,ɒ%˲}om6f^;1ŝyow۫dY}_ŒjHNY(I'Q,ȓy{[⯺uk-zvHpzת5~UD4ϫ};fJ6oh(mtӵQ]?6Z2v-[o./f`>!)# iBcdgM:XXr5D=*ݽoq0`jO0H\XyNJobXf_z/~Mu1qz<\s~.?b"lJX4L>e-O\גQH vd{~Fy|ɜ'82iQY DHf` &LyY{]p wŪSe#`GDSpHx+6:G7I_\xךXq}ǾjC%~w߯皒l,7m8vzyI뾿n?}_} #:KNpm}Z,g=-sa:C}s^͐q.^s]xGc>`+ E:u̟1+% 6j)NI,Z&~B2Sބj`%vŸf- _[ORZQ{x;ܓ46ds@'|l.ug|=݋-w0cJXTt|i"MVW}y>Tj#]з޸'gTߗfO$~.cm3%?ʹu^)}HK=Car~@DH6f_ppK>9M% VނyhHsyc9mE}Ev.;b2 XxOTvo,ƹ"ͩ9>+J{#) &L=a> Nb^'LH[Ho :vM>5-[#R,':5M;c, dQ}U{!$u>lo%|uvŌF=oBRA]mk&Ձ!$/l+DMHbǮ4k:e/2v°#S̸l'sp^1~=䪴y/|7oFk¶v@jy퍱9 X>҄D-gqPUxNCcZSa4 &Ob{EgK!q$GuJE=bmZ6M_N$:{wVAv4݆sVk*θ/濍Wհj2Uǣs>'}$n 6_C 6ڶU}<ߓ9ңY}'76R$cb$F=wr`bjk}RXuqIm%CddUT Ԙn [fOlxNs=kn'ʰW+1`dF;SuLmhYW-5\Ϊ߱_4aۣ|߉^;ǎĘ< Q}0Q?ïyܱf?SхF,lr}s?op"$Հ#4SΠfEi /c}[5n_TfPZyu9l{vوqMg[ 1so]ܿ =^DTPL!&@kF%UOBOW۱#7>$R3g9?I0J䘊kB+ڗwO+^4vso;\roury텐Lk Owzί +ƽެ`6c!D_qN xq8)\jF ]^SKE¸{>#^B7h2`ik#t0ު59!RA'ճ2qEͲu?W#H| |q5g0!LjT $z;vsoToٿ-iw:bbU^M⯚9mm1+ Gq>˷ Vƥ<ВtC!?/\9 tZSobUkQOuM_mIoـdZ6'+-w'U=i=҅Mڋ|[(:>)gvۣپB'ùGb.VVA`W'&NYwG9tދx:?*?7en$O}b)ۄ#*eCGm%.kfkZ3; @?/Jb>FRs@TVs+@?x}+ڞ:9O˨ cԫy-& ZE&B0)???i+8yZrmo,"Jetf$ӁYBimU8Nl]qkG#$jM"ޚ@`>|Os3߫0ӧ>1\)u:n7Տ)uQ6|Sy;/S"9߰tÑ+84 tQ;0ȪockX߫x?Ⱥ|N*_1fK=ϝq4 }-W ľ[VQ8gn$G¹]Rt| i[*f`y=/UE?]2 6P8>=A '}^qձ+[Ѣ׿$'&ҖUgbL,Fֿ7K};8&c/yFC^Ѿ6k=gM ۧbtI7ڿ]EfW[yB #uZotD'vhoZYo=$oZRb׼Ϭm'%+ |.EG}Tf@&a~$YR$4|:t؊i`҉+*Cpi86qЋq@U'blS%&\&$C^c1 ?K Xn3!%o͢17§QzllAlQ-fO8MqkZ&Gc?VےJ9?[2ӏD̺®'w{UHvS0Br$ k i폜p9~ Ɏ8'{9ϫ!p5}4NiS9N$_zR6Zdܿ"}{s/_HƼ}cw\7"n~>*B]ǭNBT_;z=F(I|Z^>.'1-,}ۯf8BL#gƿ@fNt?ٖE#ͽۄ7ϩ36&眙 SZ CCX/4f0SJt`7ca A3i/PArfw'X]}YzaBm6Mc~|݃]ZT!Zʂ mLWϛ~h7*la^ϷYzX=Am'j#Ü>WkG⭈+$>kvg0Սj4!`f[oN"=u:OjX25=XeA2'>!n$$˚FvĖĂM2zHt}cul"9w9 kz_c$5!֜!vLMa"slˍ纝"~Zەc|U`@;d׽vz|_AB:M\BMx$~0; 4)!ɂMSZ0#*ek_Cd9[0f cO鸎DSq!O@?~E}9~ m~u\BaOжyBZ罿0,&;sUJ4 /4_[IZPQi $\VWU{|JA !a u_ [[o(~JCT5NBG56ejؓJ6}o' 嶊}2F~Ϧ(uGfKIJ+01]W[Gܯ\q]>+~:6?<\WFA誝;&Vqz7g_#'iFNƢwuWMynEy=΃1VJ;=hB MU":_9vc_#vJ_ZSq uYi i&*%FOzIsGu^>} aag۔sW،{YUEm _FssoM2dWjsỼ]Coky,VQd[+BHlq%$,cL.r~W&a,}>/ F"9w/햭Zcbك', V\α[c,}´BEgz$:i&-ER߁fH#^{>^f4!Cҙ+:[ӽ(L0W 6}+'۪Q6|M3N,x|=ǻ%UGy~D=vƸ|P#gtZ׾M9-u}냆vN f GHN N$oG^9Rd= *"BNٟGes9?⁩fw̱_u[=5Κ pSA=TJn+ {p`6 Et;U]I!wR<}k[6U`9WѰan.D$1j5rxZ)|{N-NxUR,Ǥ.~"B@L0|\zK>VQ[Y|g~XEx50ȄQ}}į%ߎuғ>*~9*wzygKdvƁvB{e1!UmAҾg'۾2gfZ6DYY>s'].2c ׾!GDWtRa\Yӣ[w-gM'4bl޳ kN'u.Gg2{4!$h^сh$_J$|#Ow[ :G4*M5/ӎSj߻׾>Iy}wT.~_WbE}YG>i}j#yK=7B4S!;L2Rы븬m[tEE/U}*75657YM {y+:\/Ī{` |ti ɳƬa~E&J#G)ĝAsߞK|ud$_%88kk_[zLٵD= FdDڗp܍h;O5#s 7LaIfǁs® [7KtJHf s<(?K}sڶeY"oY]s A䗓I.{=VݺmV>5@!~RPoR-IVEUS<̈́~=8qղڞVBNȘEY;g l~"53 a`FZJTvIg(ޥq݊dkx8&`uV:nyqNªz᳸';.f.Ҋ4;wt&xXG t3Ю{0Բ‰7M-TN#ǩem~NBOĽ^^:wEh^-FJٙ~%>@wcϿ=j z}'bvhYO+3O1h^ErD|_G%{ @wdiB 5of+dF+.9O=7hy'p~+ފoZ$2.ݯ.3ٜ M}e _otC^ @B1пN>rM_e`z_]MM{C.+ZGub[i iBpo]vc]DJ qoe(-+q~?>FO! /Bd̃6BXEV_^mZ} =0q mNe|M>,[pӱC 1'R(iK]F`f=h#N}̦rټrbr֧ zȒmLHH6}cXyM@wb^|CnO,GߋiEL Dd;p\v\gL'T ) %Kr+V,D]l uX1H,Gu"E4u.IgU}|2o'Օ}5`K[gTG.c҄ N +Ca01>Juڱ`Q'9*R iū֐Y0H#E;2!tj~4!.f@JFl hH2h%1hfȵl-Le}khwP!,Gr%渏~p` [ꗠ)Sׅ⯂~a|*DsEfBby!20p.&6t{qR;9b#C҉ Io=ubblQ6mؽ]$ɂ0w㆒}_D~&8X}XdX|Ȱ?dU]x:[ i|kn4*(ɭz aFH syU"IZqڼ'qPY@ $_U.+Uĺ+̰7Sq^UM:X%|췶ent$g#Fܔڽi g$ْ1+I'@4bdcS_Hnuf "$jLx{19Nh#y=yt쎈 4Ж-jjs;Q!<`<x7q|_2b=L!;M6od|O퀵#x=@wq-x}=" z1 l΄є+ݸu geH2*(mg2Άa/S;}O:bھW?Bژ4σ}ygrl}'#JKou# +֦9 g iBm=m?lUUut'/S63?mJbз$Ѣ%~.{u>^3N&Ki%tl33Y^1M Gֶ|C{~vk! I!=/w][rlX.C7DuMBH'x0DZ!/ Ym>Sl/8u`%؄ĶբG>NɎ{eeU=r6 m %i^%k*H¢?BH\'ep$Kjx9WO(cK]/҄t$'<oS\1>cL'a8hSg=,w99*&Mu~3ڨ#݇΢QDpU| W(.(IcTe*ڎcy}]EpI9sx!Q$Ȉ2mo㰾OrS #ևSs}{\:Oucۊ̚%VWAěٙq$ ݆\Coo7=!Ӛ%s w/Dc)hx5g+]b^?3tҪlMXW{cRwwRS{졽n뵶LR?FHhB_~M;k&ċjR{6(+uyvT!\cqo.Is?=- ;@ȧhI5╄ץ=XJQtbUިseT' uuI"FlY/)&T/1Lc'.?Ù}*t{<"_e^lу:ۍѻ{J;b12m89U=Nפm@՜~I*rUInyyƪ;?76B( iR'$þi8_+uTo)Ma.~Fߊ>21v\᝘= ڄgsYyR`nt|5o}I[0 > x8ly[a/v+/tݾI;")2ٙ $o}`Ium*fi3jXf)KDD3P'X½qmzvmIUZ`Yooq=:R׻_V[1 9iީ_╯ڑ&Ym,͏]L*4>(/kb:j7("G!9^R#ę0׉g"񲹟oW"H%zu{%Wd8jtgnsAqE\tK h/Bي:cC{ ANHtx#gig?A7kMlGp)I B{kRG@xL- fn![]έIʙ【͌:}HcT)֮lNv5$jUGy6z'ƀ \ǁV8'{|/+ؘ튬gD & !EM}IYC1\a1G6V>`= ɬ,F8N_S{vIT.>["":1 t&!?{ &WT)v2n'gz.YH:iH]ý+!{"kY&Ӹwg}|"0@5I׹K(*)-pPr}.NV^&pMc헒$ԣoY&G#"چ*NB41K?1?ϟw?zՏ>OMBƑfj࢔ a> $uEz %u$*xO͈qh!Gr($>$_XlEe ;u$ٸasg6/X:O M&ny(a pxB pժy!INaiTq?fLԯ"ٗ#ӸJ,&KTڈҪH0*.?^{+Nl*eۇߘh 3 h¾g_Nk`y*_Ld?SGՃa"27#Pe {pXd j.s.z7ͣ_f dPE, $;8p֧t`3҇#%I~BCLG<@DlfuGI)|̏w!{"KH); jo ӆ'ūuw=h.o'o=n̓PkF: fpcUGh$ݗ6;=d`9އM;14(Leg;ӈqh灟p= gXE E4hj {L!y.V_*Iŋ" Bx`".o7דLԖ^H F?Gsn5,Ҥ N]ӱ#8{.uuQúos#V+WI3VTήkM”tW9,oNSYP~3]i\gR5L/rE.tJ@c<6&߱dxd\uN(BblukkE]5&+hYf-!|3i8)jѮ , D 'VAAֹ ik#zQ69G=P{O"$0v H|"GվA M,Lu"4z;fgFtQT?WIY6n?f|T9cF [ vYwB?DZRL>Hs:9hzm;ϑ.8UЍt+!1'ɠGE*GӯaӒC8Oa[6b{A2JZaF k|s _I:@v!`2kLs =ZSͫ۱{,`rW$I'+۷wQR[UFQbؽp3Niupawت!=ۈ E(3f;^qz +`3s-z3y FGF6EgC4 x<>w@{AdЭ-1u8+v5vBzp9c&7C.vB֐Sȧ^WkNLr]4^^pz;a}іu hC◳$ـ~|x|vQW8Π)"I*ʜ!h[V$c͵_J!_0d/!b䝧] smąVLcpn/{vgN.x{}:8O)z&-[7XkLJ|yux )&p/7@/Qa$~5i#O6]T0!nYn&s)V= %*~h2MsV>&[38B?yZMB"Oר'1{T%%rwYI !p$?ؒm1寞7Ǣԧ~,Cr n7W{թve:JHg1n3 #^hV!dPED4&b:DoccޘP?Xxqy yiy)~/kc{.wd6: vt?+6{B DxJ;'tj5~dE܍u!jt(3;EKCH!Wf"sZ.hߙǙ,4 r?g#(yg̠ah)IPHG9p1o9Җq^MK{ ;qZ<+tINx(8kt ڹƲkV#C6A.-D&IxY3پ0tBZo!(_YYsS@d۩bI'λ-gdd9d-Or@Z $o-s|~Bz悴Ok4-w(˫PUኲZNVc|MCm N!} I)r+k'e1g+w{8gل$!A9afaS$ 3'=9@]qn֨[nn5 Ch~zV~؈(}•<#=FL_$4^0s/!(sml iB-DUAvq-Ex`؎t*&*maYRbU>uֶW6J !D~:Nr ( ? KmC<%6ws,0)Pz_aa6#MAQoxF]҄DaF2StpEJsHvlR;G]U4شEp]=%!f}qImyUE*}.BBE'. V&gՠ3SNAf]aKPeiպ}pؽ&VdqEҴڐYa)B}]&7~ûs _%h Dsc*RFwU>m_=)=5Vyx{ Aya2 DkUr.soo;\&t>G,l٤;ُAgMMi߈_D>8kWekBH\1}6Ci-Z9954!dF&ßqs5,~i:tY^) !p\Ec?BzLlYz8>MRR&3v2r% !sKQ&"TX<8o~˽FlLaഴylCwQM8XqMj<‚>!MΨm@_P[U}Q_blR 4byeNڰW$_%p8O!M)82? 2l y!H"T=U*|[eZܿ6"~:Ѱ' gF'T\EH5D!ҋxFwJhտ|>҄B3Vasv0!ҟEvU~jI^0bz'4!Ph򇃲5f#2${9. 5!B_q[(b9v㕢lݣ& &s0; 0NuOڟkJ!M!$m jg3<6x`5z[XQ\SHB, >F?\yV{B!$q į9RD/cvG<_*{mmSu~G`ǒI iB9ךd %ss_4!BRFTM~BDGP#aN|M=yK'^w/Oш҄=pE-0e=' {܄BPP7At#aӎry >GQD׵x9Bo) !sj E1lcOBɩ^4p)8ѬbboL,xQm( !yHSyIKO9c\{!Bԭ6ϯiiG,G 9s|ו}"YCl5!soxB!`8K16B@\lVA5s6ϢL[B)JC3ygֽ4! iF0& Oy-R,8W !lB˅<'AB:h;iL!Qh`_ D>kMB8<&^e^Š]=+i;|1vCXOGm]ۋB! 9~/32u#C8H\zt%͏B x񫮫–ŏľ&2tUpyϙ4`LJE!MA[R?t10-ֆ&BH_cK8a -FaX)ivyErhoq ;H@{5) !!LHH`N ` !Bbr[ F83N۠-v> Elbt%` ڈ@ ;ԨB!}KZI!OGL0`MmGD/^*҂ YBvطsR_u=:fi?/sfB!dH<H&VF·X*磐&@Hc{S oJ4pUB!C|6zz*Lhg ]5ǭ"iBJ9"P6IntoqkL2F!a@2^1ߔ2:b"[хB~WR<7F$1BB{wΊWiD"^\ =4!eVѕJS*]n%$ցB!d}*J'^i'I>WJ z"<K!MIԶ8e hQ#7*^~ crB!dC-R9o9OG'+q,ft}6:f_0?O%B2+h=k~Rpc&ě9e $B61]bX5?^H_[N;y(&P~ )? yyyɘ ٧E H!Bߓ.&m! I0n;"V&B }sR;р݄" A)y.4F{`f&B+sLImw-( )73Dr| Ϙ B\˴7RJ;? Z:yJ!nBm ''(p!OZ9>70B)ogKA_BB4!c&[%V/2!=j_c7qMC!҄PHջJ5Dp%P7zK!@K?\mY!B尰qфRh0Ѻ?f! iB'J9ni !T*+!PHBSHC?2Is1!B) HH@q]Ug =KM!B( !CH ! q'S4lDE !B4! ,e;VQdCoO(uLq]+$B!{ )o{l/[w*QX3?^2njy|C93]fH9!B&dŌx!Q"_o}jxMvAcesoeB!Lah7!dVQo5QUz84BͱUOc_#!B{*rHHYU_Ui+7 Oϛ㔱!m9kl? Թ!BO&`c% Z뮛;­ͱ~es}5+!B!PHB` 񷫘/^(u~ ^,T`NCL!lQB!R!=҄]oDLCDyOP;rڥ!B t| !q*mYRьm%r9O!B4!dUi:)~h7cAm3d?-ǹ*M!B( !eH"Roչ"/: J菱~#wB!f1B#`% iPۄx)lѮ{7ūK}B!W&x%⅌7(/*'L]aB!PHBa( 5^:y=|UEcs<2ecgز(/Ȓiu !BH~tA sb}*aGjx 7V/UciShU!BrqE c'j*wGACUԿmshԌB!"҄ 7S푆X>h$;UU!B&f>Es,qՙB!FHB!B!3U6!B!B!M!B!PHB!B!҄B!B4!B!B!M!B!PH !B! iB!B!BB!B&B!B `Hª!IENDB`ukui-control-center/plugins/time-language/datetime/zoneUtc0000644000175000017500000004776013543125214022773 0ustar fengfengAfrica/Abidjan (UTC+00:00) 非洲/阿比让 Africa/Accra (UTC+00:00) 非洲/阿克拉 Africa/Addis_Ababa (UTC+03:00) 非洲/亚的斯亚贝巴 Africa/Algiers (UTC+01:00) 非洲/阿尔及尔 Africa/Asmara (UTC+03:00) 非洲/阿斯马拉 Africa/Bamako (UTC+00:00) 非洲/巴马科 Africa/Bangui (UTC+01:00) 非洲/班吉 Africa/Banjul (UTC+00:00) 非洲/班珠尔 Africa/Bissau (UTC+00:00) 非洲/比绍 Africa/Blantyre (UTC+02:00) 非洲/布兰太尔 Africa/Brazzaville (UTC+01:00) 非洲/布拉柴维尔 Africa/Bujumbura (UTC+02:00) 非洲/布琼布拉 Africa/Cairo (UTC+02:00) 非洲/开罗 Africa/Casablanca (UTC+01:00) 非洲/卡萨布兰卡 Africa/Ceuta (UTC+01:00) 非洲/休达 Africa/Conakry (UTC+00:00) 非洲/科纳克里 Africa/Dakar (UTC+00:00) 非洲/达喀尔 Africa/Dar_es_Salaam (UTC+03:00) 非洲/达累斯萨拉姆 Africa/Djibouti (UTC+03:00) 非洲/吉布提 Africa/Douala (UTC+01:00) 非洲/杜阿拉 Africa/El_Aaiun (UTC+01:00) 非洲/阿尤恩 Africa/Freetown (UTC+00:00) 非洲/弗里敦 Africa/Gaborone (UTC+02:00) 非洲/哈博罗内 Africa/Harare (UTC+02:00) 非洲/哈拉雷 Africa/Johannesburg (UTC+02:00) 非洲/约翰内斯堡 Africa/Juba (UTC+03:00) 非洲/朱巴 Africa/Kampala (UTC+03:00) 非洲/坎帕拉 Africa/Khartoum (UTC+02:00) 非洲/喀土穆 Africa/Kigali (UTC+02:00) 非洲/基加利 Africa/Kinshasa (UTC+01:00) 非洲/金沙萨 Africa/Lagos (UTC+01:00) 非洲/拉各斯 Africa/Libreville (UTC+01:00) 非洲/利伯维尔 Africa/Lome (UTC+00:00) 非洲/洛美 Africa/Luanda (UTC+01:00) 非洲/罗安达 Africa/Lubumbashi (UTC+02:00) 非洲/卢本巴希 Africa/Lusaka (UTC+02:00) 非洲/卢萨卡 Africa/Malabo (UTC+01:00) 非洲/马拉博 Africa/Maputo (UTC+02:00) 非洲/马普托 Africa/Maseru (UTC+02:00) 非洲/马塞卢 Africa/Mbabane (UTC+02:00) 非洲/姆巴巴 Africa/Mogadishu (UTC+03:00) 非洲/摩加迪沙 Africa/Monrovia (UTC+00:00) 非洲/蒙罗维亚 Africa/Nairobi (UTC+03:00) 非洲/内罗毕 Africa/Ndjamena (UTC+01:00) 非洲/恩贾梅纳 Africa/Niamey (UTC+01:00) 非洲/尼亚美 Africa/Nouakchott (UTC+00:00) 非洲/努瓦克肖特 Africa/Ouagadougou (UTC+00:00) 非洲/瓦加杜古 Africa/Porto-Novo (UTC+01:00) 非洲/波多诺伏 Africa/Sao_Tome (UTC+01:00) 非洲/圣多美 Africa/Tripoli (UTC+02:00) 非洲/的黎波里 Africa/Tunis (UTC+01:00) 非洲/突尼斯 Africa/Windhoek (UTC+02:00) 非洲/温得和克 America/Adak (UTC-10:00) 美洲/埃达克 America/Anchorage (UTC-09:00) 美洲/安克雷奇 America/Anguilla (UTC-04:00) 美洲/安圭拉 America/Antigua (UTC-04:00) 美洲/安提瓜 America/Araguaina (UTC-03:00) 美洲/阿拉圭纳 America/Argentina/Buenos_Aires (UTC-03:00) 美洲/阿根廷/ Buenos_Aires America/Argentina/Catamarca (UTC-03:00) 美洲/阿根廷/卡塔马卡 America/Argentina/Cordoba (UTC-03:00) 美洲/阿根廷/科尔多瓦 America/Argentina/Jujuy (UTC-03:00) 美洲/阿根廷/胡胡伊 America/Argentina/La_Rioja (UTC-03:00) 美洲/阿根廷/ La_Rioja America/Argentina/Mendoza (UTC-03:00) 美洲/阿根廷/门多萨 America/Argentina/Rio_Gallegos (UTC-03:00) 美洲/阿根廷/ Rio_Gallegos America/Argentina/Salta (UTC-03:00) 美洲/阿根廷/萨尔塔 America/Argentina/San_Juan (UTC-03:00) 美洲/阿根廷/圣胡安 America/Argentina/San_Luis (UTC-03:00) 美洲/阿根廷/ San_Luis America/Argentina/Tucuman (UTC-03:00) 美洲/阿根廷/图库曼 America/Argentina/Ushuaia (UTC-03:00) 美洲/阿根廷/乌斯怀亚 America/Aruba (UTC-04:00) 美洲/阿鲁巴 America/Asuncion (UTC-03:00) 美洲/亚松森 America/Atikokan (UTC-05:00) 美洲/阿蒂科肯 America/Bahia (UTC-03:00) 美洲/巴伊亚 America/Bahia_Banderas (UTC-06:00) 美洲/ Bahia_Banderas America/Barbados (UTC-04:00) 美洲/巴巴多斯 America/Belem (UTC-03:00) 美洲/贝伦 America/Belize (UTC-06:00) 美洲/伯利兹 America/Blanc-Sablon (UTC-04:00) 美洲/勃朗萨布隆 America/Boa_Vista (UTC-04:00) 美洲/博阿维斯塔 America/Bogota (UTC-05:00) 美洲/波哥大 America/Boise (UTC-07:00) 美洲/博伊西 America/Cambridge_Bay (UTC-07:00) 美洲/剑桥湾 America/Campo_Grande (UTC-03:00) 美洲/ Campo_Grande America/Cancun (UTC-05:00) 美洲/坎昆 America/Caracas (UTC-04:00) 美洲/加拉加斯 America/Cayenne (UTC-03:00) 美洲/卡宴 America/Cayman (UTC-05:00) 美洲/开曼 America/Chicago (UTC-06:00) 美洲/芝加哥 America/Chihuahua (UTC-07:00) 美洲/奇瓦瓦 America/Costa_Rica (UTC-06:00) 美洲/哥斯达黎加 America/Creston (UTC-07:00) 美洲/克雷斯顿 America/Cuiaba (UTC-03:00) 美洲/库亚巴 America/Curacao (UTC-04:00) 美洲/库拉索 America/Danmarkshavn (UTC+00:00) 美洲/丹马沙 America/Dawson (UTC-08:00) 美洲/道森 America/Dawson_Creek (UTC-07:00) 美洲/道森克里克 America/Denver (UTC-07:00) 美洲/丹佛 America/Detroit (UTC-05:00) 美洲/底特律 America/Dominica (UTC-04:00) 美洲/多米尼加 America/Edmonton (UTC-07:00) 美洲/埃德蒙顿 America/Eirunepe (UTC-05:00) 美洲/埃鲁内佩 America/El_Salvador (UTC-06:00) 美洲/萨尔瓦多 America/Fort_Nelson (UTC-07:00) 美洲/纳尔逊堡 America/Fortaleza (UTC-03:00) 美洲/福塔雷萨 America/Glace_Bay (UTC-04:00) 美洲/格莱斯贝 America/Godthab (UTC-03:00) 美洲/戈特霍布 America/Goose_Bay (UTC-04:00) 美洲/古斯湾 America/Grand_Turk (UTC-05:00) 美洲/大特克 America/Grenada (UTC-04:00) 美洲/格林纳达 America/Guadeloupe (UTC-04:00) 美洲/瓜德罗普岛 America/Guatemala (UTC-06:00) 美洲/危地马拉 America/Guayaquil (UTC-05:00) 美洲/瓜亚基尔 America/Guyana (UTC-04:00) 美洲/圭亚那 America/Halifax (UTC-04:00) 美洲/哈利法克斯 America/Havana (UTC-05:00) 美洲/哈瓦那 America/Hermosillo (UTC-07:00) 美洲/埃莫西约 America/Indiana/Indianapolis (UTC-05:00) 美洲/印第安纳州/印第安纳波利斯 America/Indiana/Knox (UTC-06:00) 美洲/印第安纳/诺克斯 America/Indiana/Marengo (UTC-05:00) 美洲/印第安纳/马伦戈 America/Indiana/Petersburg (UTC-05:00) 美洲/印第安纳/彼得堡 America/Indiana/Tell_City (UTC-06:00) 美洲/印第安纳/退尔城 America/Indiana/Vevay (UTC-05:00) 美洲/印第安纳/韦韦 America/Indiana/Vincennes (UTC-05:00) 美洲/印第安纳州/文森斯 America/Indiana/Winamac (UTC-05:00) 美洲/印第安纳州/威纳马克 America/Inuvik (UTC-07:00) 美洲/伊努维克 America/Iqaluit (UTC-05:00) 美洲/伊卡卢伊特 America/Jamaica (UTC-05:00) 美洲/牙买加 America/Juneau (UTC-09:00) 美洲/朱诺 America/Kentucky/Louisville (UTC-05:00) 美洲/肯塔基/路易斯维尔 America/Kentucky/Monticello (UTC-05:00) 美洲/肯塔基州/蒙蒂塞洛 America/Kralendijk (UTC-04:00) 美洲/克拉伦代克 America/La_Paz (UTC-04:00) 美洲/拉巴斯 America/Lima (UTC-05:00) 美洲/利马 America/Los_Angeles (UTC-08:00) 美洲/洛杉矶 America/Lower_Princes (UTC-04:00) 美洲/圣马丁岛 America/Maceio (UTC-03:00) 美洲/马塞约 America/Managua (UTC-06:00) 美洲/马那瓜 America/Manaus (UTC-04:00) 美洲/马瑙斯 America/Marigot (UTC-04:00) 美洲/马里戈特 America/Martinique (UTC-04:00) 美洲/马提尼克 America/Matamoros (UTC-06:00) 美洲/马塔莫罗斯 America/Mazatlan (UTC-07:00) 美洲/马萨特兰 America/Menominee (UTC-06:00) 美洲/梅诺米尼 America/Merida (UTC-06:00) 美洲/梅里达 America/Metlakatla (UTC-09:00) 美洲/梅特拉卡特拉 America/Mexico_City (UTC-06:00) 美洲/墨西哥城 America/Miquelon (UTC-03:00) 美洲/密克隆 America/Moncton (UTC-04:00) 美洲/蒙克顿 America/Monterrey (UTC-06:00) 美洲/蒙特雷 America/Montevideo (UTC-03:00) 美洲/蒙得维的亚 America/Montserrat (UTC-04:00) 美洲/蒙特塞拉特 America/Nassau (UTC-05:00) 美洲/拿骚 America/New_York (UTC-05:00) 美洲/纽约 America/Nipigon (UTC-05:00) 美洲/尼皮贡 America/Nome (UTC-09:00) 美洲/诺姆 America/Noronha (UTC-02:00) 美洲/诺罗尼亚 America/North_Dakota/Beulah (UTC-06:00) 美洲/北达科他/比尤拉 America/North_Dakota/Center (UTC-06:00) 美洲/北达科他/Center America/North_Dakota/New_Salem (UTC-06:00) 美洲/北达科他/新塞勒姆 America/Ojinaga (UTC-07:00) 美洲/奥希纳加 America/Panama (UTC-05:00) 美洲/巴拿马 America/Pangnirtung (UTC-05:00) 美洲/庞纳唐 America/Paramaribo (UTC-03:00) 美洲/帕拉马里博 America/Phoenix (UTC-07:00) 美洲/凤凰 America/Port-au-Prince (UTC-05:00) 美洲/太子港 America/Port_of_Spain (UTC-04:00) 美洲/西班牙港 America/Porto_Velho (UTC-04:00) 美洲/波多韦柳 America/Puerto_Rico (UTC-04:00) 美洲/波多黎各 America/Punta_Arenas (UTC-03:00) 美洲/蓬塔阿雷纳斯 America/Rainy_River (UTC-06:00) 美洲/雷尼里弗 America/Rankin_Inlet (UTC-06:00) 美洲/兰金因莱特 America/Recife (UTC-03:00) 美洲/累西腓 America/Regina (UTC-06:00) 美洲/里贾纳 America/Resolute (UTC-06:00) 美洲/雷索卢特 America/Rio_Branco (UTC-05:00) 美洲/里奥布朗库 America/Santarem (UTC-03:00) 美洲/圣塔伦 America/Santiago (UTC-03:00) 美洲/圣地亚哥 America/Santo_Domingo (UTC-04:00) 美洲/圣多明各 America/Sao_Paulo (UTC-02:00) 美洲/圣保罗 America/Scoresbysund (UTC-01:00) 美洲/斯科斯比松 America/Sitka (UTC-09:00) 美洲/锡特卡 America/St_Barthelemy (UTC-04:00) 美洲/圣巴泰勒米岛 America/St_Johns (UTC-03:30) 美洲/圣约翰斯 America/St_Kitts (UTC-04:00) 美洲/圣基茨 America/St_Lucia (UTC-04:00) 美洲/圣卢西亚 America/St_Thomas (UTC-04:00) 美洲/圣托马斯 America/St_Vincent (UTC-04:00) 美洲/圣文森特 America/Swift_Current (UTC-06:00) 美洲/斯威夫特卡伦特 America/Tegucigalpa (UTC-06:00) 美洲/特古西加尔巴 America/Thule (UTC-04:00) 美洲/图勒 America/Thunder_Bay (UTC-05:00) 美洲/桑德贝 America/Tijuana (UTC-08:00) 美洲/蒂华纳 America/Toronto (UTC-05:00) 美洲/多伦多 America/Tortola (UTC-04:00) 美洲/托尔托拉 America/Vancouver (UTC-08:00) 美洲/温哥华 America/Whitehorse (UTC-08:00) 美洲/白马 America/Winnipeg (UTC-06:00) 美洲/温尼伯 America/Yakutat (UTC-09:00) 美洲/亚库塔特 America/Yellowknife (UTC-07:00) 美洲/耶洛奈夫 Antarctica/Casey (UTC+08:00) 南极洲/凯西 Antarctica/Davis (UTC+07:00) 南极洲/戴维斯 Antarctica/DumontDUrville (UTC+10:00) 南极洲/杜蒙杜尔维尔 Antarctica/Macquarie (UTC+11:00) 南极洲/麦格理 Antarctica/Mawson (UTC+05:00) 南极洲/莫森 Antarctica/McMurdo (UTC+13:00) 南极洲/麦克默多 Antarctica/Palmer (UTC-03:00) 南极洲/帕尔默 Antarctica/Rothera (UTC-03:00) 南极洲/路德 Antarctica/Syowa (UTC+03:00) 南极洲/昭和 Antarctica/Troll (UTC+00:00) 南极洲/巨魔 Antarctica/Vostok (UTC+06:00) 南极洲/沃斯托克 Arctic/Longyearbyen (UTC+01:00) 北极/朗伊尔城 Asia/Aden (UTC+03:00) 亚洲/亚丁 Asia/Almaty (UTC+06:00) 亚洲/阿拉木图 Asia/Amman (UTC+02:00) 亚洲/安曼 Asia/Anadyr (UTC+12:00) 亚洲/阿纳德尔 Asia/Aqtau (UTC+05:00) 亚洲/阿克陶 Asia/Aqtobe (UTC+05:00) 亚洲/阿克托别 Asia/Ashgabat (UTC+05:00) 亚洲/阿什哈巴德 Asia/Atyrau (UTC+05:00) 亚洲/阿特劳 Asia/Baghdad (UTC+03:00) 亚洲/巴格达 Asia/Bahrain (UTC+03:00) 亚洲/巴林 Asia/Baku (UTC+04:00) 亚洲/巴库 Asia/Bangkok (UTC+07:00) 亚洲/曼谷 Asia/Barnaul (UTC+07:00) 亚洲/巴尔瑙尔 Asia/Beirut (UTC+02:00) 亚洲/贝鲁特 Asia/Bishkek (UTC+06:00) 亚洲/比什凯克 Asia/Brunei (UTC+08:00) 亚洲/文莱 Asia/Chita (UTC+09:00) 亚洲/赤塔 Asia/Choibalsan (UTC+08:00) 亚洲/乔巴山 Asia/Colombo (UTC+05:30) 亚洲/科伦坡 Asia/Damascus (UTC+02:00) 亚洲/大马士革 Asia/Dhaka (UTC+06:00) 亚洲/达卡 Asia/Dili (UTC+09:00) 亚洲/帝 Asia/Dubai (UTC+04:00) 亚洲/迪拜 Asia/Dushanbe (UTC+05:00) 亚洲/杜尚别 Asia/Famagusta (UTC+02:00) 亚洲/法马古斯塔 Asia/Gaza (UTC+02:00) 亚洲/加沙 Asia/Hebron (UTC+02:00) 亚洲/希伯伦 Asia/Ho_Chi_Minh (UTC+07:00) 亚洲/胡志明 Asia/Hong_Kong (UTC+08:00) 亚洲/香港 Asia/Hovd (UTC+07:00) 亚洲/科布多 Asia/Irkutsk (UTC+08:00) 亚洲/伊尔库茨克 Asia/Jakarta (UTC+07:00) 亚洲/雅加达 Asia/Jayapura (UTC+09:00) 亚洲/查亚普拉 Asia/Jerusalem (UTC+02:00) 亚洲/耶路撒冷 Asia/Kabul (UTC+04:30) 亚洲/喀布尔 Asia/Kamchatka (UTC+12:00) 亚洲/堪察加 Asia/Karachi (UTC+05:00) 亚洲/卡拉奇 Asia/Kathmandu (UTC+05:45) 亚洲/加德满都 Asia/Khandyga (UTC+09:00) 亚洲/汉德加 Asia/Kolkata (UTC+05:30) 亚洲/加尔各答 Asia/Krasnoyarsk (UTC+07:00) 亚洲/克拉斯诺亚尔斯克 Asia/Kuala_Lumpur (UTC+08:00) 亚洲/吉隆坡 Asia/Kuching (UTC+08:00) 亚洲/古晋 Asia/Kuwait (UTC+03:00) 亚洲/科威特 Asia/Macau (UTC+08:00) 亚洲/澳门 Asia/Magadan (UTC+11:00) 亚洲/马加丹 Asia/Makassar (UTC+08:00) 亚洲/望加锡 Asia/Manila (UTC+08:00) 亚洲/马尼拉 Asia/Muscat (UTC+04:00) 亚洲/马斯喀特 Asia/Nicosia (UTC+02:00) 亚洲/尼科西亚 Asia/Novokuznetsk (UTC+07:00) 亚洲/新库兹涅茨克 Asia/Novosibirsk (UTC+07:00) 亚洲/新西伯利亚 Asia/Omsk (UTC+06:00) 亚洲/鄂木斯克 Asia/Oral (UTC+05:00) 亚洲/哈萨克斯坦 Asia/Phnom_Penh (UTC+07:00) 亚洲/金边 Asia/Pontianak (UTC+07:00) 亚洲/坤甸 Asia/Pyongyang (UTC+09:00) 亚洲/平壤 Asia/Qatar (UTC+03:00) 亚洲/卡塔尔 Asia/Qyzylorda (UTC+06:00) 亚洲/克孜勒奥尔达 Asia/Riyadh (UTC+03:00) 亚洲/利雅得 Asia/Sakhalin (UTC+11:00) 亚洲/萨哈林 Asia/Samarkand (UTC+05:00) 亚洲/撒马尔罕 Asia/Seoul (UTC+09:00) 亚洲/汉城 Asia/Shanghai (UTC+08:00) 亚洲/上海 Asia/Singapore (UTC+08:00) 亚洲/新加坡 Asia/Srednekolymsk (UTC+11:00) 亚洲/中科雷姆斯克 Asia/Taipei (UTC+08:00) 亚洲/台北 Asia/Tashkent (UTC+05:00) 亚洲/塔什干 Asia/Tbilisi (UTC+04:00) 亚洲/第比利斯 Asia/Tehran (UTC+03:30) 亚洲/德黑兰 Asia/Thimphu (UTC+06:00) 亚洲/廷布 Asia/Tokyo (UTC+09:00) 亚洲/东京 Asia/Tomsk (UTC+07:00) 亚洲/托木斯克 Asia/Ulaanbaatar (UTC+08:00) 亚洲/乌兰巴托 Asia/Urumqi (UTC+06:00) 亚洲/乌鲁木齐 Asia/Ust-Nera (UTC+10:00) 亚洲/乌斯季挪拉 Asia/Vientiane (UTC+07:00) 亚洲/万象 Asia/Vladivostok (UTC+10:00) 亚洲/符拉迪沃斯托克 Asia/Yakutsk (UTC+09:00) 亚洲/雅库茨克 Asia/Yangon (UTC+06:30) 亚洲/仰光 Asia/Yekaterinburg (UTC+05:00) 亚洲/叶卡捷琳堡 Asia/Yerevan (UTC+04:00) 亚洲/埃里温 Atlantic/Azores (UTC-01:00) 大西洋/亚速尔群岛 Atlantic/Bermuda (UTC-04:00) 大西洋/百慕大 Atlantic/Canary (UTC+00:00) 大西洋/加那利 Atlantic/Cape_Verde (UTC-01:00) 大西洋/佛得角 Atlantic/Faroe (UTC+00:00) 大西洋/法罗 Atlantic/Madeira (UTC+00:00) 大西洋/马德拉 Atlantic/Reykjavik (UTC+00:00) 大西洋/雷克雅未克 Atlantic/South_Georgia (UTC-02:00) 大西洋/南乔治亚 Atlantic/St_Helena (UTC+00:00) 大西洋/圣赫勒拿岛 Atlantic/Stanley (UTC-03:00) 大西洋/斯坦利 Australia/Adelaide (UTC+10:30) 澳大利亚/阿德莱德 Australia/Brisbane (UTC+10:00) 澳大利亚/布里斯班 Australia/Broken_Hill (UTC+10:30) 澳大利亚/布罗肯希尔 Australia/Currie (UTC+11:00) 澳大利亚/柯里 Australia/Darwin (UTC+09:30) 澳大利亚/达尔文 Australia/Eucla (UTC+08:45) 澳大利亚/尤克拉 Australia/Hobart (UTC+11:00) 澳大利亚/霍巴特 Australia/Lindeman (UTC+10:00) 澳大利亚/林德曼 Australia/Lord_Howe (UTC+11:00) 澳大利亚/豪勋爵 Australia/Melbourne (UTC+11:00) 澳大利亚/墨尔本 Australia/Perth (UTC+08:00) 澳大利亚/珀斯 Australia/Sydney (UTC+11:00) 澳大利亚/悉尼 Europe/Amsterdam (UTC+01:00) 欧洲/阿姆斯特丹 Europe/Andorra (UTC+01:00) 欧洲/安道尔 Europe/Astrakhan (UTC+04:00) 欧洲/阿斯特拉罕 Europe/Athens (UTC+02:00) 欧洲/雅典 Europe/Belgrade (UTC+01:00) 欧洲/贝尔格莱德 Europe/Berlin (UTC+01:00) 欧洲/柏林 Europe/Bratislava (UTC+01:00) 欧洲/布拉迪斯拉发 Europe/Brussels (UTC+01:00) 欧洲/布鲁塞尔 Europe/Bucharest (UTC+02:00) 欧洲/布加勒斯特 Europe/Budapest (UTC+01:00) 欧洲/布达佩斯 Europe/Busingen (UTC+01:00) 欧洲/布辛 Europe/Chisinau (UTC+02:00) 欧洲/基希讷乌 Europe/Copenhagen (UTC+01:00) 欧洲/哥本哈根 Europe/Dublin (UTC+00:00) 欧洲/都柏林 Europe/Gibraltar (UTC+01:00) 欧洲/直布罗陀 Europe/Guernsey (UTC+00:00) 欧洲/格恩西岛 Europe/Helsinki (UTC+02:00) 欧洲/赫尔辛基 Europe/Isle_of_Man (UTC+00:00) 欧洲/马恩岛 Europe/Istanbul (UTC+03:00) 欧洲/伊斯坦布尔 Europe/Jersey (UTC+00:00) 欧洲/新泽西 Europe/Kaliningrad (UTC+02:00) 欧洲/加里宁格勒 Europe/Kiev (UTC+02:00) 欧洲/基辅 Europe/Kirov (UTC+03:00) 欧洲/基洛夫 Europe/Lisbon (UTC+00:00) 欧洲/里斯本 Europe/Ljubljana (UTC+01:00) 欧洲/卢布尔雅那 Europe/London (UTC+00:00) 欧洲/伦敦 Europe/Luxembourg (UTC+01:00) 欧洲/卢森堡 Europe/Madrid (UTC+01:00) 欧洲/马德里 Europe/Malta (UTC+01:00) 欧洲/马耳他 Europe/Mariehamn (UTC+02:00) 欧洲/玛丽港 Europe/Minsk (UTC+03:00) 欧洲/明斯克 Europe/Monaco (UTC+01:00) 欧洲/摩纳哥 Europe/Moscow (UTC+03:00) 欧洲/莫斯科 Europe/Oslo (UTC+01:00) 欧洲/奥斯陆 Europe/Paris (UTC+01:00) 欧洲/巴黎 Europe/Podgorica (UTC+01:00) 欧洲/波德戈里察 Europe/Prague (UTC+01:00) 欧洲/布拉格 Europe/Riga (UTC+02:00) 欧洲/里加 Europe/Rome (UTC+01:00) 欧洲/罗马 Europe/Samara (UTC+04:00) 欧洲/萨马拉 Europe/San_Marino (UTC+01:00) 欧洲/圣马力诺 Europe/Sarajevo (UTC+01:00) 欧洲/萨拉热窝 Europe/Saratov (UTC+04:00) 欧洲/萨拉托夫 Europe/Simferopol (UTC+03:00) 欧洲/辛菲罗波尔 Europe/Skopje (UTC+01:00) 欧洲/斯科普里 Europe/Sofia (UTC+02:00) 欧洲/索非亚 Europe/Stockholm (UTC+01:00) 欧洲/斯德哥尔摩 Europe/Tallinn (UTC+02:00) 欧洲/塔林 Europe/Tirane (UTC+01:00) 欧洲/地拉那 Europe/Ulyanovsk (UTC+04:00) 欧洲/乌里扬诺夫斯克 Europe/Uzhgorod (UTC+02:00) 欧洲/乌日哥罗德 Europe/Vaduz (UTC+01:00) 欧洲/瓦杜兹 Europe/Vatican (UTC+01:00) 欧洲/梵蒂冈 Europe/Vienna (UTC+01:00) 欧洲/维也纳 Europe/Vilnius (UTC+02:00) 欧洲/维尔纽斯 Europe/Volgograd (UTC+04:00) 欧洲/伏尔加格勒 Europe/Warsaw (UTC+01:00) 欧洲/华沙 Europe/Zagreb (UTC+01:00) 欧洲/萨格勒布 Europe/Zaporozhye (UTC+02:00) 欧洲/扎波罗热 Europe/Zurich (UTC+01:00) 欧洲/苏黎世 Indian/Antananarivo (UTC+03:00) 印度/塔那那利佛 Indian/Chagos (UTC+06:00) 印度/查戈斯 Indian/Christmas (UTC+07:00) 印度/圣诞节 Indian/Cocos (UTC+06:30) 印度/科科斯 Indian/Comoro (UTC+03:00) 印度/科摩罗 Indian/Kerguelen (UTC+05:00) 印度/凯尔盖朗 Indian/Mahe (UTC+04:00) 印度/马埃 Indian/Maldives (UTC+05:00) 印度/马尔代夫 Indian/Mauritius (UTC+04:00) 印度/毛里求斯 Indian/Mayotte (UTC+03:00) 印度/马约特 Indian/Reunion (UTC+04:00) 印度/留尼汪 Pacific/Apia (UTC+14:00) 太平洋/阿皮亚 Pacific/Auckland (UTC+13:00) 太平洋/奥克兰 Pacific/Bougainville (UTC+11:00) 太平洋/维尔 Pacific/Chatham (UTC+13:45) 太平洋/查塔姆 Pacific/Chuuk (UTC+10:00) 太平洋/特鲁克 Pacific/Easter (UTC-05:00) 太平洋/复活节 Pacific/Efate (UTC+11:00) 太平洋/埃法特 Pacific/Enderbury (UTC+13:00) 太平洋/恩德伯里 Pacific/Fakaofo (UTC+13:00) 太平洋/法考福 Pacific/Fiji (UTC+13:00) 太平洋/斐济 Pacific/Funafuti (UTC+12:00) 太平洋/福纳 Pacific/Galapagos (UTC-06:00) 太平洋/加拉帕戈斯 Pacific/Gambier (UTC-09:00) 太平洋/甘比尔 Pacific/Guadalcanal (UTC+11:00) 太平洋/瓜达尔卡纳尔岛 Pacific/Guam (UTC+10:00) 太平洋/关岛 Pacific/Honolulu (UTC-10:00) 太平洋/火奴鲁鲁 Pacific/Kiritimati (UTC+14:00) 太平洋/克里斯马斯 Pacific/Kosrae (UTC+11:00) 太平洋/科斯雷 Pacific/Kwajalein (UTC+12:00) 太平洋/夸贾林 Pacific/Majuro (UTC+12:00) 太平洋/马朱罗 Pacific/Marquesas (UTC-09:30) 太平洋/马克萨斯 Pacific/Midway (UTC-11:00) 太平洋/中途岛 Pacific/Nauru (UTC+12:00) 太平洋/瑙鲁 Pacific/Niue (UTC-11:00) 太平洋/纽埃 Pacific/Norfolk (UTC+11:00) 太平洋/诺福克 Pacific/Noumea (UTC+11:00) 太平洋/努美阿 Pacific/Pago_Pago (UTC-11:00) 太平洋/帕果帕果 Pacific/Palau (UTC+09:00) 太平洋/帕劳 Pacific/Pitcairn (UTC-08:00) 太平洋/皮特凯恩 Pacific/Pohnpei (UTC+11:00) 太平洋/波纳佩 Pacific/Port_Moresby (UTC+10:00) 太平洋/莫尔兹比港 Pacific/Rarotonga (UTC-10:00) 太平洋/拉罗汤加 Pacific/Saipan (UTC+10:00) 太平洋/塞班岛 Pacific/Tahiti (UTC-10:00) 太平洋/塔希提 Pacific/Tarawa (UTC+12:00) 太平洋/塔拉瓦 Pacific/Tongatapu (UTC+13:00) 太平洋/汤加塔布 Pacific/Wake (UTC+12:00) 太平洋/Wake Island Pacific/Wallis (UTC+12:00) 太平洋/沃利斯 UTC (UTC+00:00) 世界标准时间 ukui-control-center/plugins/time-language/area/0000755000175000017500000000000013641405665020531 5ustar fengfengukui-control-center/plugins/time-language/area/area.cpp0000644000175000017500000002565613641405665022163 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "area.h" #include "ui_area.h" #include "dataformat.h" #include #include #include #include #include #include #define PANEL_GSCHEMAL "org.ukui.control-center.panel.plugins" #define CALENDAR_KEY "calendar" #define DAY_KEY "firstday" #define DATE_FORMATE_KEY "date" #define TIME_KEY "hoursystem" const QVector CFormats{"zh_SG.UTF-8", "zh_CN.UTF-8", "lt_LT.UTF-8", "en_ZW.UTF-8", "en_ZM.UTF-8", "en_ZA.UTF-8", "en_US.UTF-8", "en_SG.UTF-8", "en_PH.UTF-8", "en_NZ.UTF-8", "en_NG.UTF-8", "en_IN.UTF-8", "en_IL.UTF-8", "en_IE.UTF-8", "en_HK.UTF-8", "en_GB.UTF-8", "en_DK.UTF-8", "en_CA.UTF-8", "en_BW.UTF-8", "en_AU.UTF-8", "en_AG.UTF-8", "af_ZA.UTF-8"}; Area::Area() { ui = new Ui::Area; itemDelege = new QStyledItemDelegate(); pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); pluginWidget->setStyleSheet("background: #ffffff;"); ui->setupUi(pluginWidget); pluginName = tr("area"); pluginType = DATETIME; QFile QssFile("://combox.qss"); QssFile.open(QFile::ReadOnly); if (QssFile.isOpen()){ qss = QLatin1String(QssFile.readAll()); QssFile.close(); } const QByteArray id(PANEL_GSCHEMAL); // // if gsetting is exits if(QGSettings::isSchemaInstalled(id)) { // qDebug()<<"gsettings is ------->"<start(1000); connect(m_itimer,SIGNAL(timeout()), this, SLOT(datetime_update_slot())); initUI(); initComponent(); connect(ui->langcomboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(change_language_slot(int))); connect(ui->countrycomboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(change_area_slot(int))); connect(ui->addlanBtn, SIGNAL(clicked()), this, SLOT(add_lan_btn_slot())); connect(ui->chgformButton,SIGNAL(clicked()),this,SLOT(changeform_slot())); } Area::~Area() { delete ui; delete m_itimer; } QString Area::get_plugin_name(){ return pluginName; } int Area::get_plugin_type(){ return pluginType; } QWidget *Area::get_plugin_ui(){ return pluginWidget; } void Area::plugin_delay_control(){ } void Area::run_external_app_slot(){ QString cmd = "gnome-language-selector"; QProcess process(this); process.startDetached(cmd); } void Area::initUI(){ ui->titleLabel->setText(tr("current area")); ui->countrylabel->setText(tr("display format area")); ui->showformwidget->setStyleSheet("QWidget#showformwidget{background-color:#E5E7E9;border-radius:6px}"); ui->countrylabel->setStyleSheet("QLabel#countrylabel{background: #E5E7E9;}"); ui->countrycomboBox->setStyleSheet(qss); // ui->countrycomboBox->setItemDelegate(itemDelege); ui->countrycomboBox->setView(new QListView()); ui->countrycomboBox->setMaxVisibleItems(5); ui->countrycomboBox->addItem(tr("US")); ui->countrycomboBox->addItem(tr("CN")); ui->title2Label->setText(tr("format of area")); ui->calendarlabel->setText(tr("calendar")); ui->weeklabel->setText(tr("first day of week")); ui->datelabel->setText(tr("date")); ui->timelabel->setText(tr("time")); ui->chgformButton->setStyleSheet("QPushButton{background-color:#E5E7E9;border-radius:4px}" "QPushButton:hover{background-color: #3D6BE5;color:white;};border-radius:4px"); ui->chgformButton->setText(tr("change format of data")); ui->formwidget->setStyleSheet("background-color:#E5E7E9;border-radius:6px"); ui->title3Label->setText(tr("first language")); ui->languagewidget->setStyleSheet("QWidget#languagewidget{background-color:#E5E7E9;border-radius:6px}"); ui->languagelabel->setText(tr("system language")); ui->languagelabel->setStyleSheet("QLabel#languagelabel{background: #E5E7E9;}"); ui->addlanwidget->setStyleSheet("QWidget#addlanwidget{background-color:#E5E7E9;border-radius:6px}"); // ui->langcomboBox->setItemDelegate(itemDelege); ui->langcomboBox->setView(new QListView()); ui->langcomboBox->setMaxVisibleItems(5); ui->langcomboBox->addItem(tr("English")); ui->langcomboBox->addItem(tr("Chinese")); ui->addlanlabel->setStyleSheet("QLabel{background-color:#E5E7E9}"); ui->addlanlabel->setText(tr("add main language")); ui->addlanBtn->setIcon(QIcon("://img/plugins/printer/add.png")); ui->addlanBtn->setIconSize(QSize(48, 48)); } void Area::initComponent() { QStringList res = getUserDefaultLanguage(); QString lang = res.at(1); int langIndex = lang.split(':').at(0) == "en_US" ? 0 : 1;; int formatIndex = res.at(0) == "en_US.UTF-8" ? 0 : 1; ui->langcomboBox->setCurrentIndex(langIndex); ui->countrycomboBox->setCurrentIndex(formatIndex); initFormatData(); } void Area::initFormatData() { // qDebug()<<"initFormatData------>"<keys(); if (!list.contains("calendar") || !list.contains("firstday")){ return ; } QString clac = m_gsettings->get(CALENDAR_KEY).toString(); if ("lunar" == clac) { ui->Lunarcalendar->setText(tr("lunar")); } else { ui->Lunarcalendar->setText(tr("solar calendar")); } QString day = m_gsettings->get(DAY_KEY).toString(); if ("monday" == day) { ui->firstDayLabel->setText(tr("monday")); } else { ui->firstDayLabel->setText(tr("sunday")); } QDateTime current = QDateTime::currentDateTime(); QString currentsecStr ; QString dateFormat = m_gsettings->get(DATE_FORMATE_KEY).toString(); if ("cn" == dateFormat) { currentsecStr = current.toString("yyyy/MM/dd ");; } else { currentsecStr = current.toString("yyyy-MM-dd "); } ui->datelabelshow->setText(currentsecStr); this->hourformat = m_gsettings->get(TIME_KEY).toString(); } void Area::change_language_slot(int index){ QDBusReply res; switch (index) { case 0: res = m_areaInterface->call("SetLanguage","en_US"); break; case 1: res = m_areaInterface->call("SetLanguage","zh_CN"); break; } } void Area::change_area_slot(int index){ qDebug()<<"area----------->"< res; switch (index) { case 0: res = m_areaInterface->call("SetFormatsLocale","en_US.UTF-8"); break; case 1: res = m_areaInterface->call("SetFormatsLocale","zh_CN.UTF-8"); break; } } void Area::datetime_update_slot() { QDateTime current = QDateTime::currentDateTime(); QString timeStr; if ("24" == this->hourformat) { timeStr = current.toString("hh: mm : ss"); } else { timeStr = current.toString("AP hh: mm : ss"); } ui->timelabelshow->setText(timeStr); } void Area::add_lan_btn_slot() { QString cmd = "gnome-language-selector"; QProcess process(this); process.startDetached(cmd); } void Area::changeform_slot() { // ChangFormat *dialog = new ChangFormat(); // dialog->setWindowTitle(tr("chang format of data")); // dialog->setAttribute(Qt::WA_DeleteOnClose); // dialog->exec(); DataFormat *dialog = new DataFormat(); connect(dialog, SIGNAL(dataChangedSignal()),this,SLOT(initFormatData())); dialog->setWindowTitle(tr("change data format")); dialog->setAttribute(Qt::WA_DeleteOnClose); // dialog->exec(); dialog->show(); } QStringList Area::readFile(const QString& filepath) { QStringList res; QFile file(filepath); if(file.exists()) { if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qWarning() << "ReadFile() failed to open" << filepath; return QStringList(); } QTextStream textStream(&file); while(!textStream.atEnd()) { QString line= textStream.readLine(); line.remove('\n'); res<readFile(fname); // qDebug()<<"result is------>"< > reply = iproperty->call("GetAll", "org.freedesktop.Accounts.User"); if (reply.isValid()){ QMap propertyMap; propertyMap = reply.value(); formats = propertyMap.find("FormatsLocale").value().toString(); if(language.isEmpty()) { language = propertyMap.find("Language").value().toString(); } } else { qDebug() << "reply failed"; } result.append(formats); result.append(language); // qDebug()<<"result is---------->"< #include #include #include #include "shell/interface.h" #include "dataformat.h" #include #include #include #include #include /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include } namespace Ui { class Area; } class Area : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Area(); ~Area(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; QStringList readFile(const QString& filePath); private: Ui::Area *ui; QString pluginName; int pluginType; QWidget * pluginWidget; QString objpath; QDBusInterface *m_areaInterface; QStyledItemDelegate *itemDelege; QGSettings *m_gsettings = nullptr; QTimer *m_itimer = nullptr; QString hourformat; QString qss; private: void initUI(); void initComponent(); QStringList getUserDefaultLanguage(); private slots: void initFormatData(); void run_external_app_slot(); void change_language_slot(int); void change_area_slot(int); void datetime_update_slot(); void add_lan_btn_slot(); void changeform_slot(); }; #endif // AREA_H ukui-control-center/plugins/time-language/area/area.pro0000644000175000017500000000127713635356010022162 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-29T15:14:42 # #------------------------------------------------- QT += widgets dbus TEMPLATE = lib CONFIG += plugin INCLUDEPATH += ../../.. TARGET = $$qtLibraryTarget(area) DESTDIR = ../../../pluginlibs LIBS += -L/usr/lib/ -lgsettings-qt ##加载gio库和gio-unix库,用于处理时间 CONFIG += link_pkgconfig \ C++11 PKGCONFIG += gio-2.0 \ gio-unix-2.0 #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ area.cpp \ dataformat.cpp HEADERS += \ area.h \ dataformat.h FORMS += \ area.ui \ dataformat.ui ukui-control-center/plugins/time-language/area/dataformat.h0000644000175000017500000000132413640364120023011 0ustar fengfeng#ifndef DATAFORMAT_H #define DATAFORMAT_H #include #include #include #include #include namespace Ui { class DataFormat; } class DataFormat : public QDialog { Q_OBJECT public: explicit DataFormat(QWidget *parent = nullptr); ~DataFormat(); private: QTimer *m_itimer; QGSettings *m_gsettings = nullptr; QString qss; private: Ui::DataFormat *ui; void initUi(); void initConnect(); void initComponent(); void writeGsettings(const QString &key, const QString &value); Q_SIGNALS: void dataChangedSignal(); private slots: void datetime_update_slot(); void confirm_btn_slot(); }; #endif // DATAFORMAT_H ukui-control-center/plugins/time-language/area/dataformat.cpp0000644000175000017500000001623213640364120023350 0ustar fengfeng#include "dataformat.h" #include "ui_dataformat.h" #include #include #define PANEL_GSCHEMAL "org.ukui.control-center.panel.plugins" #define CALENDAR_KEY "calendar" #define DAY_KEY "firstday" #define DATE_FORMATE_KEY "date" #define TIME_KEY "hoursystem" DataFormat::DataFormat(QWidget *parent) : QDialog(parent), ui(new Ui::DataFormat) { ui->setupUi(this); setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground); QByteArray id(PANEL_GSCHEMAL); if(QGSettings::isSchemaInstalled(id)) { m_gsettings = new QGSettings(id) ; } QFile QssFile("://combox.qss"); QssFile.open(QFile::ReadOnly); if (QssFile.isOpen()){ qss = QLatin1String(QssFile.readAll()); QssFile.close(); } initUi(); initConnect(); initComponent(); } DataFormat::~DataFormat() { delete ui; delete m_itimer; } void DataFormat::initUi() { // this->setStyleSheet("background: #ffffff;"); ui->calendarBox->setStyleSheet(qss);; ui->calendarBox->setView(new QListView()); ui->calendarBox->setMaxVisibleItems(5); ui->dayBox->setStyleSheet(qss);; ui->dayBox->setView(new QListView()); ui->dayBox->setMaxVisibleItems(5); ui->dateBox->setStyleSheet(qss);; ui->dateBox->setView(new QListView()); ui->dateBox->setMaxVisibleItems(5); ui->timeBox->setStyleSheet(qss);; ui->timeBox->setView(new QListView()); ui->timeBox->setMaxVisibleItems(5); ui->frame->setStyleSheet("QFrame{background: #ffffff; border: none; border-radius: 6px;}"); //关闭按钮在右上角,窗体radius 6px,所以按钮只得6px ui->closeBtn->setIcon(QIcon("://img/titlebar/close.png")); ui->closeBtn->setStyleSheet("QPushButton#closeBtn{background: #ffffff; border: none; border-radius: 6px;}" "QPushButton:hover:!pressed#closeBtn{background: #FA6056; border: none; border-top-left-radius: 2px; border-top-right-radius: 6px; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px;}" "QPushButton:hover:pressed#closeBtn{background: #E54A50; border: none; border-top-left-radius: 2px; border-top-right-radius: 6px; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px;}"); ui->calendarLabel->setStyleSheet("QLabel#calendarLabel{background: #F4F4F4;}"); ui->dayLabel->setStyleSheet("QLabel#dayLabel{background: #F4F4F4;}"); ui->dateLabel->setStyleSheet("QLabel#dateLabel{background: #F4F4F4;}"); ui->timeLabel->setStyleSheet("QLabel#timeLabel{background: #F4F4F4;}"); ui->calendarwidget->setStyleSheet("QWidget#calendarwidget{background: #F4F4F4; border-radius: 6px;}"); ui->daywidget->setStyleSheet("QWidget#daywidget{background: #F4F4F4; border-radius: 6px;}"); ui->datewidget->setStyleSheet("QWidget#datewidget{background: #F4F4F4; border-radius: 6px;}"); ui->timewidget->setStyleSheet("QWidget#timewidget{background: #F4F4F4; border-radius: 6px;}"); ui->cancelButton->setStyleSheet("QPushButton{background-color:#E5E7E9;border-radius:4px}" "QPushButton:hover{background-color: #3D6BE5;color:white;};border-radius:4px"); ui->confirmButton->setStyleSheet("QPushButton{background-color:#E5E7E9;border-radius:4px}" "QPushButton:hover{background-color: #3D6BE5;color:white;};border-radius:4px"); ui->calendarLabel->setText(tr("calendar")); ui->dayLabel->setText(tr("first day of week")); ui->dateLabel->setText(tr("date")); ui->timeLabel->setText(tr("time")); ui->calendarBox->addItem(tr("lunar")); ui->calendarBox->addItem(tr("solar calendar")); ui->dayBox->addItem(tr("monday")); ui->dayBox->addItem(tr("sunday")); QString currentsecStr; QDateTime current = QDateTime::currentDateTime(); currentsecStr = current.toString("yyyy/MM/dd "); ui->dateBox->addItem(currentsecStr); currentsecStr = current.toString("yyyy-MM-dd "); ui->dateBox->addItem(currentsecStr); QString timeStr; timeStr = current.toString("hh: mm : ss"); ui->timeBox->addItem(timeStr); timeStr = current.toString("AP hh: mm : ss"); ui->timeBox->addItem(timeStr); } void DataFormat::initConnect() { m_itimer = new QTimer(); m_itimer->start(1000); connect(m_itimer,SIGNAL(timeout()), this, SLOT(datetime_update_slot())); connect(ui->confirmButton, SIGNAL(clicked(bool)), SLOT(confirm_btn_slot())); connect(ui->cancelButton, SIGNAL(clicked()), SLOT(close())); connect(ui->closeBtn, &QPushButton::clicked, [=](bool checked){ Q_UNUSED(checked) close(); }); } void DataFormat::initComponent() { if (!m_gsettings) { return ; } const QStringList list = m_gsettings->keys(); if (!list.contains("calendar") || !list.contains("firstday") || !list.contains("date") || !list.contains("hoursystem")){ return ; } QString clac = m_gsettings->get(CALENDAR_KEY).toString(); if ("lunar" == clac) { ui->calendarBox->setCurrentIndex(0); } else { ui->calendarBox->setCurrentIndex(1); } QString day = m_gsettings->get(DAY_KEY).toString(); if ("monday" == day) { ui->dayBox->setCurrentIndex(0); } else { ui->dayBox->setCurrentIndex(1); } QString dateFormat = m_gsettings->get(DATE_FORMATE_KEY).toString(); if ("cn" == dateFormat) { ui->dateBox->setCurrentIndex(0); } else { ui->dateBox->setCurrentIndex(1); } QString timeformate = m_gsettings->get(TIME_KEY).toString(); if ("24" == timeformate) { ui->timeBox->setCurrentIndex(0); } else { // qDebug()<<"initComponent----------->"<timeBox->setCurrentIndex(1); } } void DataFormat::writeGsettings(const QString &key, const QString &value) { if(!m_gsettings) { return ; } const QStringList list = m_gsettings->keys(); if (!list.contains(key)) { return ; } m_gsettings->set(key,value); } void DataFormat::datetime_update_slot() { QString timeStr; QDateTime current = QDateTime::currentDateTime(); timeStr = current.toString("hh: mm : ss"); ui->timeBox->setItemText(0,timeStr); timeStr = current.toString("AP hh: mm : ss"); ui->timeBox->setItemText(1,timeStr); } void DataFormat::confirm_btn_slot() { QString calendarValue; QString dayValue; QString dateValue; QString timeValue; if ( 0 == ui->calendarBox->currentIndex()) { calendarValue = "lunar"; } else { calendarValue = "solarlunar"; } if ( 0 == ui->dayBox->currentIndex()) { dayValue = "monday"; } else { dayValue = "sunday"; } if ( 0 == ui->dateBox->currentIndex()) { dateValue = "cn"; } else { dateValue = "en"; } if ( 0 == ui->timeBox->currentIndex()) { timeValue = "24"; } else { timeValue = "12"; } writeGsettings("calendar", calendarValue); writeGsettings("firstday", dayValue); writeGsettings("date", dateValue); writeGsettings("hoursystem", timeValue); emit dataChangedSignal(); this->close(); } ukui-control-center/plugins/time-language/area/area.ui0000644000175000017500000003703513640364120021775 0ustar fengfeng Area 0 0 890 710 0 0 16777215 16777215 Area 0 150 18 150 18 current area 0 0 550 50 960 50 209 15 209 15 Area showing time currency format 0 0 291 0 16777215 32 0 32 16 108 18 108 18 Regional format data Qt::Horizontal 40 20 550 118 960 118 20 120 15 120 15 calendar lunar 110 15 120 15 First day of the week monday 120 15 120 15 date 2019/12/17 120 15 120 15 time 9:52 24 120 32 1000 32 change format of data Qt::Horizontal 40 20 0 6 71 20 16777215 20 TextLabel Qt::Horizontal 40 20 0 0 0 550 50 960 50 6 20 16 0 209 18 209 18 TextLabel 0 0 291 30 QComboBox{ background: rgba(255, 255, 255); border-radius: 6px; font-size:14px; padding-left: 8px; color: black; min-height: 30px; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); font-size:14px; padding-left: 5px; } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox::drop-down{ width: 30px; border: none; } QComboBox QListView::item:selected{ background: #3D6BE5; } 0 0 550 60 960 50 20 6 6 10 0 0 48 48 48 48 200 20 16777215 20 TextLabel Qt::Horizontal 538 39 Qt::Vertical 20 40 ukui-control-center/plugins/time-language/area/dataformat.ui0000644000175000017500000003732213640364120023206 0ustar fengfeng DataFormat 0 0 400 440 0 0 400 440 400 440 Dialog QFrame::StyledPanel QFrame::Raised Qt::Horizontal 40 20 48 32 48 32 16 0 0 190 24 190 24 change format of data Qt::Vertical 20 41 1 16 336 50 336 50 0 0 83 32 83 32 calendar 0 0 198 0 198 256 0 0 336 50 336 50 0 0 83 32 83 16777215 first day 0 0 198 0 198 16777215 0 0 336 50 336 50 0 0 83 32 83 16777215 date 0 0 198 0 198 16777215 0 0 336 50 336 50 0 0 83 32 83 16777215 time 0 0 198 0 198 16777215 Qt::Vertical 17 34 0 0 345 50 345 50 Qt::Horizontal 40 20 120 30 120 30 120 30 cancel 120 30 120 30 confirm Qt::Vertical 17 34 ukui-control-center/plugins/time-language/time-language.pro0000644000175000017500000000006713543125214023053 0ustar fengfengTEMPLATE = subdirs SUBDIRS = \ datetime \ area ukui-control-center/plugins/security-updates/0000755000175000017500000000000013544017042020402 5ustar fengfengukui-control-center/plugins/security-updates/recovery/0000755000175000017500000000000013564473475022262 5ustar fengfengukui-control-center/plugins/security-updates/recovery/recovery.pro0000644000175000017500000000106413543125214024621 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-29T11:56:39 # #------------------------------------------------- QT += widgets TEMPLATE = lib CONFIG += plugin INCLUDEPATH += ../../.. TARGET = $$qtLibraryTarget(recovery) DESTDIR = ../.. include(../../pluginsComponent/pluginsComponent.pri) #DEFINES += QT_DEPRECATED_WARNINGS target.path = $$[QT_INSTALL_PREFIX]/lib/control-center/plugins/ INSTALLS += target SOURCES += \ recovery.cpp HEADERS += \ recovery.h FORMS += \ recovery.ui ukui-control-center/plugins/security-updates/recovery/recovery.h0000644000175000017500000000310413556706375024266 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef RECOVERY_H #define RECOVERY_H #include #include #include #include "mainui/interface.h" #include "../../pluginsComponent/customwidget.h" namespace Ui { class Recovery; } class Recovery : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Recovery(); ~Recovery(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; CustomWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; private: Ui::Recovery *ui; QString pluginName; int pluginType; CustomWidget * pluginWidget; }; #endif // RECOVERY_H ukui-control-center/plugins/security-updates/recovery/recovery.ui0000644000175000017500000001116013564473475024456 0ustar fengfeng Recovery 0 0 756 574 0 0 16777215 16777215 Recovery 0 Recovery 560 100 560 100 Qt::Horizontal 40 20 Start Recovery Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 200 Related settings Backup system and files true Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Expanding 20 40 ukui-control-center/plugins/security-updates/recovery/recovery.cpp0000644000175000017500000000263613556706375024632 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "recovery.h" #include "ui_recovery.h" Recovery::Recovery() { ui = new Ui::Recovery; pluginWidget = new CustomWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("recovery"); pluginType = SECURITY_UPDATES; } Recovery::~Recovery() { delete ui; } QString Recovery::get_plugin_name(){ return pluginName; } int Recovery::get_plugin_type(){ return pluginType; } CustomWidget *Recovery::get_plugin_ui(){ return pluginWidget; } void Recovery::plugin_delay_control(){ } ukui-control-center/plugins/security-updates/security-updates.pro0000644000175000017500000000010613543125214024433 0ustar fengfengTEMPLATE = subdirs SUBDIRS = \ backup \ update \ recovery ukui-control-center/plugins/security-updates/backup/0000755000175000017500000000000013622366602021655 5ustar fengfengukui-control-center/plugins/security-updates/backup/backup.h0000644000175000017500000000300513621411724023264 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef BACKUP_H #define BACKUP_H #include #include #include "shell/interface.h" namespace Ui { class Backup; } class Backup : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Backup(); ~Backup(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void btnClicked(); private: Ui::Backup *ui; QString pluginName; int pluginType; QWidget * pluginWidget; }; #endif // BACKUP_H ukui-control-center/plugins/security-updates/backup/backup.cpp0000644000175000017500000000424013621411724023621 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "backup.h" #include "ui_backup.h" #include Backup::Backup() { ui = new Ui::Backup; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("backup"); pluginType = UPDATE; pluginWidget->setStyleSheet("background: #ffffff;"); ui->backupLabel->setStyleSheet("QLabel{color: #A6000000;}"); ui->restoreLabel->setStyleSheet("QLabel{color: #A6000000;}"); ui->backBtn->setStyleSheet("QPushButton{background: #E9E9E9; border: none; border-radius: 4px;}"); ui->restoreBtn->setStyleSheet("QPushButton{background: #E9E9E9; border: none; border-radius: 4px;}"); connect(ui->backBtn, &QPushButton::clicked, this, [=](bool checked){ Q_UNUSED(checked) btnClicked(); }); connect(ui->restoreBtn, &QPushButton::clicked, this, [=](bool checked){ Q_UNUSED(checked) btnClicked(); }); } Backup::~Backup() { delete ui; } QString Backup::get_plugin_name(){ return pluginName; } int Backup::get_plugin_type(){ return pluginType; } QWidget *Backup::get_plugin_ui(){ return pluginWidget; } void Backup::plugin_delay_control(){ } void Backup::btnClicked(){ QString cmd = "/usr/bin/deja-dup"; QProcess process(this); process.startDetached(cmd); } ukui-control-center/plugins/security-updates/backup/backup.pro0000644000175000017500000000075413621411724023645 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-29T09:55:08 # #------------------------------------------------- QT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(backup) DESTDIR = ../../../pluginlibs include(../../../env.pri) INCLUDEPATH += \ $$PROJECT_ROOTDIR \ #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ backup.cpp HEADERS += \ backup.h FORMS += \ backup.ui ukui-control-center/plugins/security-updates/backup/backup.ui0000644000175000017500000001333013621411724023454 0ustar fengfeng Backup 0 0 800 710 0 0 16777215 16777215 Backup 16 0 0 32 30 0 0 Backup true 0 0 Back up your files to other drives, and when the original files are lost, damaged, or deleted, you can restore them to ensure the integrity of your system. true Qt::Vertical QSizePolicy::Fixed 20 8 120 36 120 36 Begin backup Qt::Horizontal 40 20 0 0 Restore true 0 0 View a list of backed-upfiles to restore backed up files to the system true Qt::Vertical QSizePolicy::Fixed 20 8 120 36 120 36 Begin restore Qt::Horizontal 40 20 Qt::Vertical 20 40 ukui-control-center/plugins/security-updates/update/0000755000175000017500000000000013564473475021706 5ustar fengfengukui-control-center/plugins/security-updates/update/update.ui0000644000175000017500000003064613564473475023540 0ustar fengfeng Update 0 0 800 710 0 0 16777215 16777215 Update 0 0 0 0 0 15 20 25 0 0 0 0 Update true title1# Qt::Vertical QSizePolicy::Fixed 20 10 25 0 0 true 22 0 0 Latest version true 10 0 0 Last check time: true 0 0 true Qt::Horizontal QSizePolicy::Fixed 40 20 0 0 CheckUpdate true Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 45 0 0 New Features true title1# Qt::Vertical QSizePolicy::Fixed 20 10 0 0 New version adds a lot of new features and improvements, click to learn more true Learn about the new features true Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 45 0 0 Related settings true title1# Qt::Vertical QSizePolicy::Fixed 20 10 Change update settings true Qt::Horizontal 40 20 Qt::Vertical 20 40 ukui-control-center/plugins/security-updates/update/update.cpp0000644000175000017500000000433013556706375023673 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "update.h" #include "ui_update.h" Update::Update() { ui = new Ui::Update; pluginWidget = new CustomWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("update"); pluginType = SECURITY_UPDATES; ui_init(); connect(ui->checkBtn, SIGNAL(clicked()), this, SLOT(update_btn_clicked())); connect(ui->changesettingsBtn, SIGNAL(clicked()), this, SLOT(update_settings_btn_clicked())); } Update::~Update() { delete ui; } QString Update::get_plugin_name(){ return pluginName; } int Update::get_plugin_type(){ return pluginType; } CustomWidget *Update::get_plugin_ui(){ return pluginWidget; } void Update::plugin_delay_control(){ } void Update::ui_init(){ ui->pushButton_2->setEnabled(false); QPixmap pixmap("://update/logo.svg"); ui->logoLabel->setPixmap(pixmap.scaled(QSize(64,64))); QDateTime current =QDateTime::currentDateTime(); QString current_date_time =current.toString(QString("yyyy-MM-dd hh:mm:ss")); ui->updatetimeLabel->setText(current_date_time); } void Update::update_btn_clicked(){ QString cmd = "/usr/bin/update-manager"; QProcess process(this); process.startDetached(cmd); } void Update::update_settings_btn_clicked(){ QString cmd = "software-properties-gtk"; QProcess process(this); process.startDetached(cmd); } ukui-control-center/plugins/security-updates/update/update.h0000644000175000017500000000331313556706375023340 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef UPDATE_H #define UPDATE_H #include #include #include #include "mainui/interface.h" #include "../../pluginsComponent/customwidget.h" #include #include namespace Ui { class Update; } class Update : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Update(); ~Update(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; CustomWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; void ui_init(); private: Ui::Update *ui; QString pluginName; int pluginType; CustomWidget * pluginWidget; private slots: void update_btn_clicked(); void update_settings_btn_clicked(); }; #endif // UPDATE_H ukui-control-center/plugins/security-updates/update/update.pro0000644000175000017500000000105313543125214023667 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-29T11:47:23 # #------------------------------------------------- QT += widgets TEMPLATE = lib CONFIG += plugin INCLUDEPATH += ../../.. TARGET = $$qtLibraryTarget(update) DESTDIR = ../.. include(../../pluginsComponent/pluginsComponent.pri) #DEFINES += QT_DEPRECATED_WARNINGS target.path = $$[QT_INSTALL_PREFIX]/lib/control-center/plugins/ INSTALLS += target SOURCES += \ update.cpp HEADERS += \ update.h FORMS += \ update.ui ukui-control-center/plugins/network/0000755000175000017500000000000013544017042016561 5ustar fengfengukui-control-center/plugins/network/proxy/0000755000175000017500000000000013640373121017742 5ustar fengfengukui-control-center/plugins/network/proxy/proxy.h0000644000175000017500000000536613640373121021306 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef PROXY_H #define PROXY_H #include #include #include #include #include "certificationdialog.h" #include #include "shell/interface.h" #include "SwitchButton/switchbutton.h" /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include } struct KeyValue : QObjectUserData { QString key; QString schema; }; typedef enum{ NONE, MANUAL, AUTO }ProxyMode; //自定义类型使用QVariant需要使用 Q_DECLARE_METATYPE 注册 Q_DECLARE_METATYPE(ProxyMode) namespace Ui { class Proxy; } class Proxy : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Proxy(); ~Proxy(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupStylesheet(); void setupComponent(); void setupConnect(); void initProxyModeStatus(); void initAutoProxyStatus(); void initManualProxyStatus(); void initIgnoreHostStatus(); void manualProxyTextChanged(QString txt); void showCertificationDialog(); int _getCurrentProxyMode(); void _setSensitivity(); private: Ui::Proxy *ui; QString pluginName; int pluginType; QWidget * pluginWidget; private: SwitchButton * autoSwitchBtn; SwitchButton * manualSwitchBtn; QGSettings * proxysettings; QGSettings * httpsettings; QGSettings * securesettings; QGSettings * ftpsettings; QGSettings * sockssettings; bool settingsCreate; public slots: void proxyModeChangedSlot(bool checked); }; #endif // PROXY_H ukui-control-center/plugins/network/proxy/certificationdialog.cpp0000644000175000017500000000563313621411724024461 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "certificationdialog.h" #include "ui_certificationdialog.h" #include #include "SwitchButton/switchbutton.h" #include CertificationDialog::CertificationDialog(QWidget *parent) : QDialog(parent), ui(new Ui::CertificationDialog) { ui->setupUi(this); this->setWindowTitle(tr("Certification")); const QByteArray id(HTTP_PROXY_SCHEMA); cersettings = new QGSettings(id); component_init(); status_init(); } CertificationDialog::~CertificationDialog() { delete ui; delete cersettings; } void CertificationDialog::component_init(){ ui->pwdLineEdit->setEchoMode(QLineEdit::Password); activeSwitchBtn = new SwitchButton; activeSwitchBtn->setAttribute(Qt::WA_DeleteOnClose); ui->activeHLayout->addWidget(activeSwitchBtn); ui->activeHLayout->addStretch(); } void CertificationDialog::status_init(){ //获取认证状态 bool status = cersettings->get(HTTP_AUTH_KEY).toBool(); activeSwitchBtn->setChecked(status); ui->widget->setEnabled(status); //获取用户名密码 QString user = cersettings->get(HTTP_AUTH_USER_KEY).toString(); ui->userLineEdit->setText(user); QString pwd = cersettings->get(HTTP_AUTH_PASSWD_KEY).toString(); ui->pwdLineEdit->setText(pwd); connect(activeSwitchBtn, SIGNAL(checkedChanged(bool)), this, SLOT(active_status_changed_slot(bool))); connect(ui->closePushBtn, SIGNAL(released()), this, SLOT(close())); connect(ui->userLineEdit, SIGNAL(textChanged(QString)), this, SLOT(user_edit_changed_slot(QString))); connect(ui->pwdLineEdit, SIGNAL(textChanged(QString)), this, SLOT(pwd_edit_changed_slot(QString))); } void CertificationDialog::active_status_changed_slot(bool status){ ui->widget->setEnabled(status); cersettings->set(HTTP_AUTH_KEY, QVariant(status)); } void CertificationDialog::user_edit_changed_slot(QString edit){ cersettings->set(HTTP_AUTH_USER_KEY, QVariant(edit)); } void CertificationDialog::pwd_edit_changed_slot(QString edit){ cersettings->set(HTTP_AUTH_PASSWD_KEY, QVariant(edit)); } ukui-control-center/plugins/network/proxy/proxy.ui0000644000175000017500000007072213630066010021465 0ustar fengfeng Proxy 0 0 800 718 0 0 16777215 16777215 Proxy 2 0 0 32 30 0 0 Auto Proxy true Qt::Vertical QSizePolicy::Fixed 20 14 550 50 960 50 0 0 0 0 0 0 16 16 0 0 Auto proxy true Qt::Horizontal 40 20 550 50 960 50 0 0 0 0 0 16 16 0 0 Auto url true Qt::Horizontal 40 20 320 32 320 32 Qt::Vertical QSizePolicy::Fixed 20 46 0 0 Manual Proxy true Qt::Vertical QSizePolicy::Fixed 20 14 550 50 960 50 0 0 0 0 0 0 16 16 0 0 Manual proxy true Qt::Horizontal 40 20 550 50 960 50 0 0 0 0 0 8 16 16 0 0 98 0 98 16777215 Http Proxy 160 32 160 32 Qt::Horizontal QSizePolicy::Fixed 8 20 0 0 Port 122 32 122 32 Qt::Horizontal QSizePolicy::Fixed 8 20 80 32 80 32 Cetification Qt::Horizontal 40 20 550 50 960 50 0 0 0 0 0 8 16 16 0 0 98 0 98 16777215 Https Proxy 160 32 160 32 Qt::Horizontal QSizePolicy::Fixed 8 20 0 0 Port 122 32 122 32 Qt::Horizontal 40 20 550 50 960 50 0 0 0 0 0 8 16 16 0 0 98 0 98 16777215 Ftp Proxy 160 32 160 32 Qt::Horizontal QSizePolicy::Fixed 8 20 0 0 Port 122 32 122 32 Qt::Horizontal 40 20 550 50 960 50 0 0 0 0 0 8 16 16 0 0 98 0 98 16777215 Socks Proxy 160 32 160 32 Qt::Horizontal QSizePolicy::Fixed 8 20 0 0 Port 122 32 122 32 Qt::Horizontal 40 20 550 180 960 180 0 0 0 0 0 8 16 24 16 24 0 0 List of ignored hosts. more than one entry, please separate with english semicolon(;) true Qt::Vertical 20 40 ukui-control-center/plugins/network/proxy/proxy.pro0000644000175000017500000000161413621411724021650 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-29T13:59:06 # #------------------------------------------------- QT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(proxy) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lgsettings-qt ##加载gio库和gio-unix库,用于获取和设置enum类型的gsettings CONFIG += link_pkgconfig \ C++11 PKGCONFIG += gio-2.0 \ gio-unix-2.0 #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ proxy.cpp \ certificationdialog.cpp HEADERS += \ proxy.h \ certificationdialog.h FORMS += \ proxy.ui \ certificationdialog.ui ukui-control-center/plugins/network/proxy/proxy.cpp0000644000175000017500000003526313640373121021640 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "proxy.h" #include "ui_proxy.h" #include #define PROXY_SCHEMA "org.gnome.system.proxy" #define PROXY_MODE_KEY "mode" #define PROXY_AUTOCONFIG_URL_KEY "autoconfig-url" #define IGNORE_HOSTS_KEY "ignore-hosts" #define HTTP_PROXY_SCHEMA "org.gnome.system.proxy.http" #define HTTP_USE_AUTH_KEY "use-authentication" #define HTTP_AUTH_USER_KEY "authentication-user" #define HTTP_AUTH_PASSWD_KEY "authentication-password" #define HTTPS_PROXY_SCHEMA "org.gnome.system.proxy.https" #define FTP_PROXY_SCHEMA "org.gnome.system.proxy.ftp" #define SOCKS_PROXY_SCHEMA "org.gnome.system.proxy.socks" #define PROXY_HOST_KEY "host" #define PROXY_PORT_KEY "port" Proxy::Proxy() { ui = new Ui::Proxy; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("proxy"); pluginType = NETWORK; settingsCreate = false; const QByteArray id(PROXY_SCHEMA); const QByteArray idd(HTTP_PROXY_SCHEMA); const QByteArray iddd(HTTPS_PROXY_SCHEMA); const QByteArray iid(FTP_PROXY_SCHEMA); const QByteArray iiid(SOCKS_PROXY_SCHEMA); setupStylesheet(); setupComponent(); if (QGSettings::isSchemaInstalled(id) && QGSettings::isSchemaInstalled(idd) && QGSettings::isSchemaInstalled(iddd) && QGSettings::isSchemaInstalled(iid) && QGSettings::isSchemaInstalled(iiid)){ settingsCreate = true; proxysettings = new QGSettings(id); httpsettings = new QGSettings(idd); securesettings = new QGSettings(iddd); ftpsettings = new QGSettings(iid); sockssettings = new QGSettings(iiid); setupConnect(); initProxyModeStatus(); initAutoProxyStatus(); initManualProxyStatus(); initIgnoreHostStatus(); } else { qCritical() << "Xml needed by Proxy is not installed"; } } Proxy::~Proxy() { delete ui; if (settingsCreate){ delete proxysettings; delete httpsettings; delete securesettings; delete ftpsettings; delete sockssettings; } } QString Proxy::get_plugin_name(){ return pluginName; } int Proxy::get_plugin_type(){ return pluginType; } QWidget *Proxy::get_plugin_ui(){ return pluginWidget; } void Proxy::plugin_delay_control(){ } void Proxy::setupStylesheet(){ pluginWidget->setStyleSheet("background: #ffffff;"); ui->autoWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->urlWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->urlLineEdit->setStyleSheet("QLineEdit{background: #ffffff; border: none; border-radius: 4px; font-size: 14px; color: #000000;}"); ui->manualWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px}"); ui->httpWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px}"); ui->httpHostLineEdit->setStyleSheet("QLineEdit{background: #ffffff; border: none; border-radius: 4px; font-size: 14px; color: #000000;}"); ui->httpPortLineEdit->setStyleSheet("QLineEdit{background: #ffffff; border: none; border-radius: 4px; font-size: 14px; color: #000000;}"); ui->cetificationBtn->setStyleSheet("QPushButton{background: #ffffff; border: none; border-radius: 4px;}"); ui->httpsWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px}"); ui->httpsHostLineEdit->setStyleSheet("QLineEdit{background: #ffffff; border: none; border-radius: 4px; font-size: 14px; color: #000000;}"); ui->httpsPortLineEdit->setStyleSheet("QLineEdit{background: #ffffff; border: none; border-radius: 4px; font-size: 14px; color: #000000;}"); ui->ftpWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px}"); ui->ftpHostLineEdit->setStyleSheet("QLineEdit{background: #ffffff; border: none; border-radius: 4px; font-size: 14px; color: #000000;}"); ui->ftpPortLineEdit->setStyleSheet("QLineEdit{background: #ffffff; border: none; border-radius: 4px; font-size: 14px; color: #000000;}"); ui->socksWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px}"); ui->socksHostLineEdit->setStyleSheet("QLineEdit{background: #ffffff; border: none; border-radius: 4px; font-size: 14px; color: #000000;}"); ui->socksPortLineEdit->setStyleSheet("QLineEdit{background: #ffffff; border: none; border-radius: 4px; font-size: 14px; color: #000000;}"); ui->ignoreHostsWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px}"); ui->ignoreHostTextEdit->setStyleSheet("QTextEdit{background: #ffffff; border: none; border-radius: 4px; font-size: 14px; color: #000000;}"); } void Proxy::setupComponent(){ //添加自动配置代理开关按钮 autoSwitchBtn = new SwitchButton(ui->autoWidget); autoSwitchBtn->setObjectName("auto"); ui->autoHorLayout->addWidget(autoSwitchBtn); //添加手动配置代理开关按钮 manualSwitchBtn = new SwitchButton(ui->manualWidget); manualSwitchBtn->setObjectName("manual"); ui->manualHorLayout->addWidget(manualSwitchBtn); //QLineEdit 设置数据 KeyValue * httpHostValue = new KeyValue(); httpHostValue->schema = HTTP_PROXY_SCHEMA; httpHostValue->key = PROXY_HOST_KEY; ui->httpHostLineEdit->setUserData(Qt::UserRole, httpHostValue); KeyValue * httpsHostValue = new KeyValue(); httpsHostValue->schema = HTTPS_PROXY_SCHEMA; httpsHostValue->key = PROXY_HOST_KEY; ui->httpsHostLineEdit->setUserData(Qt::UserRole, httpsHostValue); KeyValue * ftpHostValue = new KeyValue(); ftpHostValue->schema = FTP_PROXY_SCHEMA; ftpHostValue->key = PROXY_HOST_KEY; ui->ftpHostLineEdit->setUserData(Qt::UserRole, ftpHostValue); KeyValue * socksHostValue = new KeyValue(); socksHostValue->schema = SOCKS_PROXY_SCHEMA; socksHostValue->key = PROXY_HOST_KEY; ui->socksHostLineEdit->setUserData(Qt::UserRole, socksHostValue); KeyValue * httpPortValue = new KeyValue(); httpPortValue->schema = HTTP_PROXY_SCHEMA; httpPortValue->key = PROXY_PORT_KEY; ui->httpPortLineEdit->setUserData(Qt::UserRole, httpPortValue); KeyValue * httpsPortValue = new KeyValue(); httpsPortValue->schema = HTTPS_PROXY_SCHEMA; httpsPortValue->key = PROXY_PORT_KEY; ui->httpsPortLineEdit->setUserData(Qt::UserRole, httpsPortValue); KeyValue * ftpPortValue = new KeyValue(); ftpPortValue->schema = FTP_PROXY_SCHEMA; ftpPortValue->key = PROXY_PORT_KEY; ui->ftpPortLineEdit->setUserData(Qt::UserRole, ftpPortValue); KeyValue * socksPortValue = new KeyValue(); socksPortValue->schema = SOCKS_PROXY_SCHEMA; socksPortValue->key = PROXY_PORT_KEY; ui->socksPortLineEdit->setUserData(Qt::UserRole, socksPortValue); } void Proxy::setupConnect(){ connect(autoSwitchBtn, SIGNAL(checkedChanged(bool)), this, SLOT(proxyModeChangedSlot(bool))); connect(manualSwitchBtn, SIGNAL(checkedChanged(bool)), this, SLOT(proxyModeChangedSlot(bool))); connect(ui->urlLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){proxysettings->set(PROXY_AUTOCONFIG_URL_KEY, QVariant(txt));}); connect(ui->httpHostLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);}); connect(ui->httpsHostLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);}); connect(ui->ftpHostLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);}); connect(ui->socksHostLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);}); connect(ui->httpPortLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);}); connect(ui->httpsPortLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);}); connect(ui->ftpPortLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);}); connect(ui->socksPortLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);}); connect(ui->cetificationBtn, &QPushButton::clicked, [=](bool checked){ Q_UNUSED(checked) showCertificationDialog(); }); connect(ui->ignoreHostTextEdit, &QTextEdit::textChanged, this, [=](){ QString text = ui->ignoreHostTextEdit->toPlainText(); QStringList hostStringList = text.split(";"); proxysettings->set(IGNORE_HOSTS_KEY, QVariant(hostStringList)); }); } void Proxy::initProxyModeStatus(){ int mode = _getCurrentProxyMode(); autoSwitchBtn->blockSignals(true); manualSwitchBtn->blockSignals(true); if (mode == AUTO){ autoSwitchBtn->setChecked(true); } else if (mode == MANUAL){ manualSwitchBtn->setChecked(true); } else{ autoSwitchBtn->setChecked(false); manualSwitchBtn->setChecked(false); } autoSwitchBtn->blockSignals(false); manualSwitchBtn->blockSignals(false); _setSensitivity(); } void Proxy::initAutoProxyStatus(){ ui->urlLineEdit->blockSignals(true); //设置当前url QString urlString = proxysettings->get(PROXY_AUTOCONFIG_URL_KEY).toString(); ui->urlLineEdit->setText(urlString); ui->urlLineEdit->blockSignals(false); } void Proxy::initManualProxyStatus(){ //信号阻塞 ui->httpHostLineEdit->blockSignals(true); ui->httpsHostLineEdit->blockSignals(true); ui->ftpHostLineEdit->blockSignals(true); ui->socksHostLineEdit->blockSignals(true); ui->httpPortLineEdit->blockSignals(true); ui->httpsPortLineEdit->blockSignals(true); ui->ftpPortLineEdit->blockSignals(true); ui->socksPortLineEdit->blockSignals(true); //HTTP QString httphost = httpsettings->get(PROXY_HOST_KEY).toString(); ui->httpHostLineEdit->setText(httphost); int httpport = httpsettings->get(PROXY_PORT_KEY).toInt(); ui->httpPortLineEdit->setText(QString::number(httpport)); //HTTPS QString httpshost = securesettings->get(PROXY_HOST_KEY).toString(); ui->httpsHostLineEdit->setText(httpshost); int httpsport = securesettings->get(PROXY_PORT_KEY).toInt(); ui->httpsPortLineEdit->setText(QString::number(httpsport)); //FTP QString ftphost = ftpsettings->get(PROXY_HOST_KEY).toString(); ui->ftpHostLineEdit->setText(ftphost); int ftppost = ftpsettings->get(PROXY_PORT_KEY).toInt(); ui->ftpPortLineEdit->setText(QString::number(ftppost)); //SOCKS QString sockshost = sockssettings->get(PROXY_HOST_KEY).toString(); ui->socksHostLineEdit->setText(sockshost); int socksport = sockssettings->get(PROXY_PORT_KEY).toInt(); ui->socksPortLineEdit->setText(QString::number(socksport)); //解除信号阻塞 ui->httpHostLineEdit->blockSignals(false); ui->httpsHostLineEdit->blockSignals(false); ui->ftpHostLineEdit->blockSignals(false); ui->socksHostLineEdit->blockSignals(false); ui->httpPortLineEdit->blockSignals(false); ui->httpsPortLineEdit->blockSignals(false); ui->ftpPortLineEdit->blockSignals(false); ui->socksPortLineEdit->blockSignals(false); } void Proxy::initIgnoreHostStatus(){ ui->ignoreHostTextEdit->blockSignals(true); //设置当前ignore host QStringList ignorehost = proxysettings->get(IGNORE_HOSTS_KEY).toStringList(); ui->ignoreHostTextEdit->setPlainText(ignorehost.join(";")); ui->ignoreHostTextEdit->blockSignals(false); } int Proxy::_getCurrentProxyMode(){ GSettings * proxygsettings; proxygsettings = g_settings_new(PROXY_SCHEMA); int mode = g_settings_get_enum(proxygsettings, PROXY_MODE_KEY); g_object_unref(proxygsettings); return mode; } void Proxy::_setSensitivity(){ //自动配置代理界面敏感性 bool autoChecked = autoSwitchBtn->isChecked(); ui->urlWidget->setEnabled(autoChecked); //手动配置代理界面敏感性 bool manualChecked = manualSwitchBtn->isChecked(); ui->httpWidget->setEnabled(manualChecked); ui->httpsWidget->setEnabled(manualChecked); ui->ftpWidget->setEnabled(manualChecked); ui->socksWidget->setEnabled(manualChecked); } void Proxy::showCertificationDialog(){ QDialog * certificationDialog = new CertificationDialog(); certificationDialog->setAttribute(Qt::WA_DeleteOnClose); certificationDialog->show(); } void Proxy::manualProxyTextChanged(QString txt){ //获取被修改控件 QObject * pobject = this->sender(); QLineEdit * who = dynamic_cast(pobject); //获取控件保存的用户数据 KeyValue * current = (KeyValue *)(who->userData(Qt::UserRole)); QString schema = current->schema; QString key = current->key; //构建临时QGSettings const QByteArray id = schema.toUtf8(); const QByteArray iidd(id.data()); QGSettings * setting = new QGSettings(iidd); setting->set(key, QVariant(txt)); delete setting; } void Proxy::proxyModeChangedSlot(bool checked){ GSettings * proxygsettings; proxygsettings = g_settings_new(PROXY_SCHEMA); //两个switchbutton要达到互斥的效果,自定义按钮暂时未支持添加buttongroup QObject * object = QObject::sender(); if (object->objectName() == "auto"){ //区分哪个switchbutton if (checked){ if (manualSwitchBtn->isChecked()) manualSwitchBtn->setChecked(false); g_settings_set_enum(proxygsettings, PROXY_MODE_KEY, AUTO); } else{ if (!manualSwitchBtn->isChecked()) g_settings_set_enum(proxygsettings, PROXY_MODE_KEY, NONE); } } else{ if (checked){ if (autoSwitchBtn->isChecked()) autoSwitchBtn->setChecked(false); g_settings_set_enum(proxygsettings, PROXY_MODE_KEY, MANUAL); } else{ if (!autoSwitchBtn->isChecked()) g_settings_set_enum(proxygsettings, PROXY_MODE_KEY, NONE); } } g_object_unref(proxygsettings); _setSensitivity(); } ukui-control-center/plugins/network/proxy/certificationdialog.ui0000644000175000017500000002377513543125214024322 0ustar fengfeng CertificationDialog 0 0 500 246 500 246 500 246 UserCertification 0 0 0 0 0 20 20 25 Qt::Vertical QSizePolicy::Fixed 20 10 10 20 0 0 UserCertification true 0 0 0 0 0 0 Qt::Horizontal QSizePolicy::Fixed 60 20 0 0 60 0 60 16777215 User: 180 0 180 16777215 Qt::Horizontal 40 20 0 Qt::Horizontal QSizePolicy::Fixed 60 20 0 0 60 0 60 16777215 Passwd: 180 0 180 16777215 Qt::Horizontal 40 20 Qt::Horizontal 40 20 Close Qt::Horizontal QSizePolicy::Fixed 40 20 Qt::Vertical QSizePolicy::Fixed 20 80 ukui-control-center/plugins/network/proxy/certificationdialog.h0000644000175000017500000000337313621411724024125 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CERTIFICATIONDIALOG_H #define CERTIFICATIONDIALOG_H #include #define HTTP_PROXY_SCHEMA "org.gnome.system.proxy.http" #define HTTP_AUTH_KEY "use-authentication" #define HTTP_AUTH_USER_KEY "authentication-user" #define HTTP_AUTH_PASSWD_KEY "authentication-password" namespace Ui { class CertificationDialog; } class SwitchButton; class QGSettings; class CertificationDialog : public QDialog { Q_OBJECT public: explicit CertificationDialog(QWidget *parent = 0); ~CertificationDialog(); public: void component_init(); void status_init(); private: Ui::CertificationDialog *ui; QGSettings * cersettings; SwitchButton * activeSwitchBtn; private slots: void active_status_changed_slot(bool status); void user_edit_changed_slot(QString edit); void pwd_edit_changed_slot(QString edit); }; #endif // CERTIFICATIONDIALOG_H ukui-control-center/plugins/network/network.pro0000644000175000017500000000010413543125214020767 0ustar fengfengTEMPLATE = subdirs SUBDIRS = \ netconnect \ vpn \ proxy ukui-control-center/plugins/network/vpn/0000755000175000017500000000000013630066010017357 5ustar fengfengukui-control-center/plugins/network/vpn/vpn.h0000644000175000017500000000301513621411724020340 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef VPN_H #define VPN_H #include #include #include "shell/interface.h" namespace Ui { class Vpn; } class Vpn : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Vpn(); ~Vpn(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void initComponent(); void runExternalApp(); private: Ui::Vpn *ui; QString pluginName; int pluginType; QWidget * pluginWidget; }; #endif // VPN_H ukui-control-center/plugins/network/vpn/vpn.ui0000644000175000017500000001002013630066010020512 0ustar fengfeng Vpn 0 0 800 710 0 0 16777215 16777215 Vpn 16 0 0 32 60 0 0 Add Vpn Connect 550 60 960 60 0 0 0 0 0 16 16 48 48 48 48 0 0 Add vpn connect Qt::Horizontal 40 20 Qt::Vertical 20 40 ukui-control-center/plugins/network/vpn/vpn.cpp0000644000175000017500000000363413621411724020702 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "vpn.h" #include "ui_vpn.h" #include Vpn::Vpn() { ui = new Ui::Vpn; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("vpn"); pluginType = NETWORK; pluginWidget->setStyleSheet("background: #ffffff;"); ui->widget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); initComponent(); } Vpn::~Vpn() { delete ui; } QString Vpn::get_plugin_name(){ return pluginName; } int Vpn::get_plugin_type(){ return pluginType; } QWidget *Vpn::get_plugin_ui(){ return pluginWidget; } void Vpn::plugin_delay_control(){ } void Vpn::initComponent(){ ui->addBtn->setIcon(QIcon("://img/plugins/vpn/add.png")); ui->addBtn->setIconSize(QSize(48, 48)); connect(ui->addBtn, &QPushButton::clicked, this, [=](bool checked){ Q_UNUSED(checked) runExternalApp(); }); } void Vpn::runExternalApp(){ QString cmd = "nm-connection-editor"; QProcess process(this); process.startDetached(cmd); } ukui-control-center/plugins/network/vpn/vpn.pro0000644000175000017500000000074113621411724020714 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-29T13:53:10 # #------------------------------------------------- QT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(vpn) DESTDIR = ../../../pluginlibs include(../../../env.pri) INCLUDEPATH += \ $$PROJECT_ROOTDIR \ #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ vpn.cpp HEADERS += \ vpn.h FORMS += \ vpn.ui ukui-control-center/plugins/network/netconnect/0000755000175000017500000000000013640364120020720 5ustar fengfengukui-control-center/plugins/network/netconnect/wifi.cpp0000644000175000017500000000072013635333016022365 0ustar fengfeng#include "wifi.h" Wifi::Wifi() { } QStringList Wifi::getWifiList() { QProcess *wifiPro = new QProcess(); QString shellOutput = ""; wifiPro->start("nmcli -f signal,ssid device wifi"); wifiPro->waitForFinished(); QString output = wifiPro->readAll(); shellOutput += output; QStringList slist = shellOutput.split("\n"); // emit getWifiListFinished(slist); // qDebug()<<"wifilist--------------->"< #include #include #include #include #include #include #include #include "wifi.h" #include "netconnectwork.h" #include "shell/interface.h" #include "SwitchButton/switchbutton.h" enum { DISCONNECTED, NOINTERNET, CONNECTED }; typedef enum { LOOPBACK, ETHERNET, WIFI }NetType; typedef struct _CardInfo{ QString name; NetType type; bool status; }CardInfo; namespace Ui { class NetConnect; } class NetConnect : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: NetConnect(); ~NetConnect(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void initComponent(); void rebuildNetStatusComponent(QString iconPath, QString netName); void rebuildAvailComponent(QString iconpath, QString netName); void _acquireCardInfo(); void runExternalApp(); private: Ui::NetConnect *ui; QString pluginName; int pluginType; QWidget * pluginWidget; SwitchButton *wifiBtn; QNetworkConfigurationManager * nmg; QList cardinfoQList; QMap connectedWifi; QMap wifiList; //wifi list QStringList lanList; // list of wired network QString connectedLan; QGSettings *m_gsettings = nullptr; Wifi *m_wifiList; QThread *pThread; NetconnectWork *pNetWorker; QStringList TwifiList; QStringList TlanList; QString actLanName; private: int setSignal(QString lv); //get wifi's strength QStringList execGetLanList(); QStringList execGetWifiList(); void getWifiListDone(QStringList wifislist, QStringList lanList); bool getSwitchStatus(QString key); private slots: void wifiSwitchSlot(bool signal); void getNetList(); }; #endif // NETCONNECT_H ukui-control-center/plugins/network/netconnect/netconnectwork.h0000644000175000017500000000056013635333016024141 0ustar fengfeng#ifndef NETCONNECTWORK_H #define NETCONNECTWORK_H #include #include #include "wifi.h" class NetconnectWork : public QObject { Q_OBJECT public: explicit NetconnectWork(); ~NetconnectWork(); public: void run(); Q_SIGNALS: void wifiGerneral(QStringList wifiList); void workerComplete(); }; #endif // NETCONNECTWORK_H ukui-control-center/plugins/network/netconnect/wifi.h0000644000175000017500000000026313635333016022034 0ustar fengfeng#ifndef WIFI_H #define WIFI_H #include #include #include class Wifi { public: Wifi(); QStringList getWifiList(); }; #endif // WIFI_H ukui-control-center/plugins/network/netconnect/kylin_network_interface.c0000644000175000017500000000633313635333016026014 0ustar fengfeng#include "kylin_network_interface.h" //获取所有网络连接 //获取当前活动网络连接 activecon *kylin_network_get_activecon_info() { system("nmcli connection show -active > /tmp/netactivecon.txt"); char *filename="/tmp/netactivecon.txt"; FILE *activefp; int activenum=0; char activeStrLine[1024]; if((activefp=fopen(filename,"r"))==NULL) { printf("error!"); } fgets(activeStrLine,1024,activefp); while(!feof(activefp)) { fgets(activeStrLine,1024,activefp); activenum++; } // printf("%d\n",activenum); fclose(activefp); activecon *activelist=(activecon *)malloc(sizeof(activecon)*activenum); int count=0; FILE *fp; char StrLine[1024]; if((fp=fopen(filename,"r"))==NULL) { printf("error!"); } fgets(StrLine,1024,fp); while(!feof(fp)) { if(count==activenum-1)break; fgets(StrLine,1024,fp); char *index=StrLine; char conname[100]; //截取连接名称 int num=0; for(index;*index!='\n';index++) { if(*index==' ') { if(*(index+1)==' ') break; } num++; } // printf("连接名称长度:%d\n",num); activelist[count].con_name=(char *)malloc(sizeof(char)*(num+1)); strncpy(conname,StrLine,num+1); conname[num]='\0'; strncpy(activelist[count].con_name,conname,num+1); // printf("%s\n",activelist[count].con_name); //截取连接类型 char type[100]; for(index;*index!='\n';index++) { if(*index==' ') { if(*(index+1)=' ') if(*(index+2)!=' ') break; } } char *index1=index+2; for(index1;*index1!='\n';index1++) { if(*index1==' ') { if(*(index1+1)==' ') break; } } int num1=0; char *index2=index1+2; for(index2;*index2!='\n';index2++) { if(*index2==' ')break; num1++; } activelist[count].type=(char *)malloc(sizeof(char)*(num1+1)); strncpy(type,index1+2,num1+1); type[num1]='\0'; strncpy(activelist[count].type,type,num1+1); // printf("%s\n",activelist[count].type); //截取连接所属设备 char *index3=index2; char dev[100]; for(index3;*index3!='\n';index3++) { if(*index3==' ') { if(*(index3+1)!=' ') break; } } int num2=0; char *index4=index3+1; for(index4;*index4!='\n';index4++) { if(*index4==' ')break; num2++; } activelist[count].dev=(char *)malloc(sizeof(char)*(num2+1)); strncpy(dev,index3+1,num2+1); dev[num2]='\0'; strncpy(activelist[count].dev,dev,num2+1); // printf("%s\n",activelist[count].dev); count++; } fclose(fp); activelist[count].con_name=NULL; activelist[count].type=NULL; activelist[count].dev=NULL; return activelist; } ukui-control-center/plugins/network/netconnect/netconnect.pro0000644000175000017500000000150313635333016023605 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-29T13:45:31 # #------------------------------------------------- QT += widgets network dbus gui core TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(netconnect) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lgsettings-qt #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ kylin_network_interface.c \ netconnect.cpp \ netconnectwork.cpp \ wifi.cpp HEADERS += \ kylin_network_interface.h \ netconnect.h \ netconnectwork.h \ wifi.h FORMS += \ netconnect.ui ukui-control-center/plugins/network/netconnect/netconnect.ui0000644000175000017500000001161713635333016023431 0ustar fengfeng NetConnect 0 0 800 710 0 0 16777215 16777215 NetConnect 0 0 Netconnect Status true 16777215 100 Qt::Vertical QSizePolicy::Fixed 20 32 0 0 Available Network true 550 50 960 50 16 16 118 0 open wifi Qt::Horizontal 523 20 Qt::Vertical QSizePolicy::Fixed 20 32 120 36 120 36 Change net settings Qt::Horizontal 40 20 ukui-control-center/plugins/network/netconnect/netconnectwork.cpp0000644000175000017500000000037113635333016024474 0ustar fengfeng#include "netconnectwork.h" NetconnectWork::NetconnectWork() { } NetconnectWork::~NetconnectWork() { } void NetconnectWork::run() { Wifi *wifi = new Wifi(); QStringList wifiList= wifi->getWifiList(); emit wifiGerneral(wifiList); } ukui-control-center/plugins/network/netconnect/netconnect.cpp0000644000175000017500000004210713640364120023570 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "netconnect.h" #include "ui_netconnect.h" #include "kylin_network_interface.h" #include #include #include #define CONTROL_CENTER_WIFI "org.ukui.control-center.wifi.switch" NetConnect::NetConnect():m_wifiList(new Wifi) { ui = new Ui::NetConnect; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("netconnect"); pluginType = NETWORK; wifiBtn = new SwitchButton(); pluginWidget->setStyleSheet("background: #ffffff;"); ui->statusListWidget->setStyleSheet("QListWidget#statusListWidget{border: none;}"); ui->availableListWidget->setStyleSheet("QListWidget#availableListWidget{border: none;}"); ui->statusListWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->statusListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->availableListWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->availableListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->statusListWidget->setSpacing(0); ui->availableListWidget->setSpacing(0); ui->statusListWidget->setFocusPolicy(Qt::NoFocus); ui->availableListWidget->setFocusPolicy(Qt::NoFocus); ui->statusListWidget->setSelectionMode(QAbstractItemView::NoSelection); ui->availableListWidget->setSelectionMode(QAbstractItemView::NoSelection); // ui->detailBtn->setStyleSheet("QPushButton{border: none;}"); ui->openWifiWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->openWIifLayout->addWidget(wifiBtn); ui->openWifiWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->openWIifLayout->addWidget(wifiBtn); //构建网络配置对象 nmg = new QNetworkConfigurationManager(); initComponent(); getNetList(); } NetConnect::~NetConnect() { delete ui; delete nmg; // delete wifiBtn; delete m_gsettings; } QString NetConnect::get_plugin_name(){ return pluginName; } int NetConnect::get_plugin_type(){ return pluginType; } QWidget *NetConnect::get_plugin_ui(){ return pluginWidget; } void NetConnect::plugin_delay_control(){ } void NetConnect::initComponent(){ const QByteArray id(CONTROL_CENTER_WIFI); if(QGSettings::isSchemaInstalled(id)) { // qDebug()<<"isSchemaInstalled"<"<setChecked(judge); } }); } //构建网络状态组件 // rebuildNetStatusComponent(); //网络配置变化回调 // connect(nmg, &QNetworkConfigurationManager::configurationChanged, this, [=](const QNetworkConfiguration &config){ // Q_UNUSED(config) // rebuildNetStatusComponent(); // }); //详细设置按钮connect connect(ui->detailBtn, &QPushButton::clicked, this, [=](bool checked){ Q_UNUSED(checked) runExternalApp(); }); wifiBtn->setChecked(getSwitchStatus("switch")); connect(wifiBtn,SIGNAL(checkedChanged(bool)), this, SLOT(wifiSwitchSlot(bool))); } void NetConnect::rebuildNetStatusComponent(QString iconPath, QString netName){ ////构建Widget QWidget * baseWidget = new QWidget(); baseWidget->setAttribute(Qt::WA_DeleteOnClose); QVBoxLayout * baseVerLayout = new QVBoxLayout(baseWidget); baseVerLayout->setSpacing(0); baseVerLayout->setContentsMargins(0, 0, 0, 2); QWidget * devWidget = new QWidget(baseWidget); devWidget->setMinimumWidth(550); devWidget->setMaximumWidth(960); devWidget->setMinimumHeight(50); devWidget->setMaximumHeight(50); // devWidget->setFixedHeight(50); devWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); QHBoxLayout * devHorLayout = new QHBoxLayout(devWidget); devHorLayout->setSpacing(8); devHorLayout->setContentsMargins(16, 0, 0, 0); QLabel * iconLabel = new QLabel(devWidget); QSizePolicy iconSizePolicy = iconLabel->sizePolicy(); iconSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); iconSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); iconLabel->setSizePolicy(iconSizePolicy); iconLabel->setScaledContents(true); iconLabel->setPixmap(QPixmap(iconPath)); QLabel * nameLabel = new QLabel(devWidget); QSizePolicy nameSizePolicy = nameLabel->sizePolicy(); nameSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); nameSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); nameLabel->setSizePolicy(nameSizePolicy); nameLabel->setScaledContents(true); nameLabel->setText(netName); QLabel * statusLabel = new QLabel(devWidget); QSizePolicy statusSizePolicy = statusLabel->sizePolicy(); statusSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); statusSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); statusLabel->setSizePolicy(statusSizePolicy); statusLabel->setScaledContents(true); statusLabel->setText(tr("connected")); devHorLayout->addWidget(iconLabel); devHorLayout->addWidget(nameLabel); devHorLayout->addWidget(statusLabel); devHorLayout->addStretch(); devWidget->setLayout(devHorLayout); baseVerLayout->addWidget(devWidget); baseVerLayout->addStretch(); baseWidget->setLayout(baseVerLayout); QListWidgetItem * item = new QListWidgetItem(ui->statusListWidget); item->setSizeHint(QSize(502, 52)); ui->statusListWidget->setItemWidget(item, baseWidget); } void NetConnect::_acquireCardInfo(){ QList network = QNetworkInterface::allInterfaces(); for (QList::const_iterator it = network.constBegin(); it != network.constEnd(); it++){ CardInfo ci; #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) if ((*it).type() == QNetworkInterface::Loopback) continue; if ((*it).type() == QNetworkInterface::Ethernet) ci.type = ETHERNET; else if ((*it).type() == QNetworkInterface::Wifi) ci.type = WIFI; #else if ((*it).flags().testFlag(QNetworkInterface::IsLoopBack)) continue; ci.type =ETHERNET; #endif ci.name = (*it).humanReadableName(); QList addressList = (*it).addressEntries(); if (addressList.count() == 0) ci.status = false; else ci.status = true; cardinfoQList.append(ci); } } void NetConnect::getNetList() { ui->availableListWidget->clear(); ui->statusListWidget->clear(); this->TlanList = execGetLanList(); pThread = new QThread; pNetWorker = new NetconnectWork; connect(pNetWorker, &NetconnectWork::wifiGerneral,this,[&](QStringList list){ this->TwifiList = list; getWifiListDone(this->TwifiList, this->TlanList); QMap::iterator iter = this->wifiList.begin(); QString iconamePah; while(iter != this->wifiList.end()) { if (!wifiBtn->isChecked()){ break; } iconamePah= ":/img/plugins/netconnect/wifi" + QString::number(iter.value())+".png"; rebuildAvailComponent(iconamePah , iter.key()); iter++; } for(int i = 0; i < this->lanList.length(); i++) { ; iconamePah= ":/img/plugins/netconnect/eth.png"; rebuildAvailComponent(iconamePah , lanList.at(i)); } }); connect(pNetWorker, &NetconnectWork::workerComplete, [=]{ pThread->quit(); pThread->wait(); }); pNetWorker->moveToThread(pThread); connect(pThread, &QThread::started, pNetWorker, &NetconnectWork::run); connect(pThread, &QThread::finished, this, [=]{ }); pThread->start(); // QMap::iterator iter = this->wifiList.begin(); // while(iter != this->wifiList.end()) { // iconamePah= ":/img/plugins/netconnect/wifi" + QString::number(iter.value())+".png"; // rebuildAvailComponent(iconamePah , iter.key()); // iter++; // } // for(int i = 0; i < lanList.length(); i++) { ; // iconamePah= ":/img/plugins/netconnect/eth.png"; // rebuildAvailComponent(iconamePah , lanList.at(i)); // } } void NetConnect::rebuildAvailComponent(QString iconPath, QString netName){ ////构建Widget QWidget * baseWidget = new QWidget(); baseWidget->setAttribute(Qt::WA_DeleteOnClose); QVBoxLayout * baseVerLayout = new QVBoxLayout(baseWidget); baseVerLayout->setSpacing(0); baseVerLayout->setContentsMargins(0, 0, 0, 2); QWidget * devWidget = new QWidget(baseWidget); devWidget->setMinimumWidth(550); devWidget->setMaximumWidth(960); devWidget->setMinimumHeight(50); devWidget->setMaximumHeight(50); // devWidget->setFixedHeight(50); devWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); QHBoxLayout * devHorLayout = new QHBoxLayout(devWidget); devHorLayout->setSpacing(8); devHorLayout->setContentsMargins(16, 0, 0, 0); QLabel * iconLabel = new QLabel(devWidget); QSizePolicy iconSizePolicy = iconLabel->sizePolicy(); iconSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); iconSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); iconLabel->setSizePolicy(iconSizePolicy); iconLabel->setScaledContents(true); iconLabel->setPixmap(QPixmap(iconPath)); QLabel * nameLabel = new QLabel(devWidget); QSizePolicy nameSizePolicy = nameLabel->sizePolicy(); nameSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); nameSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); nameLabel->setSizePolicy(nameSizePolicy); nameLabel->setScaledContents(true); nameLabel->setText(netName); // QLabel * statusLabel = new QLabel(devWidget); // QSizePolicy statusSizePolicy = statusLabel->sizePolicy(); // statusSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); // statusSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); // statusLabel->setSizePolicy(statusSizePolicy); // statusLabel->setScaledContents(true); // statusLabel->setText(netName); devHorLayout->addWidget(iconLabel); devHorLayout->addWidget(nameLabel); // devHorLayout->addWidget(statusLabel); devHorLayout->addStretch(); devWidget->setLayout(devHorLayout); baseVerLayout->addWidget(devWidget); baseVerLayout->addStretch(); baseWidget->setLayout(baseVerLayout); QListWidgetItem * item = new QListWidgetItem(ui->availableListWidget); item->setSizeHint(QSize(502, 52)); ui->availableListWidget->setItemWidget(item, baseWidget); } void NetConnect::runExternalApp(){ QString cmd = "nm-connection-editor"; QProcess process(this); process.startDetached(cmd); } QStringList NetConnect::execGetLanList(){ QProcess *lanPro = new QProcess(); QString shellOutput = ""; lanPro->start("nmcli -f type,device,name connection show"); lanPro->waitForFinished(); QString output = lanPro->readAll(); shellOutput += output; QStringList slist = shellOutput.split("\n"); // qDebug()<<"lanslist--------------->"<start("nmcli -f signal,ssid device wifi"); wifiPro->waitForFinished(); QString output = wifiPro->readAll(); shellOutput += output; QStringList slist = shellOutput.split("\n"); // emit getWifiListFinished(slist); // qDebug()<<"wifilist--------------->"<"<setSignal(wsignal); wifiList.insert(wname, strength); if(wname == actWifiName) { connectedWifi.insert(wname, strength); } wnames.append(wname); } } } if(!getlanList.isEmpty()){ lanList.clear(); connectedLan.clear(); // 获取当前连接的lan name activecon *actLan = kylin_network_get_activecon_info(); int indexLan = 0; while(actLan[indexLan].con_name != NULL){ if(QString(actLan[indexLan].type) == "ethernet"){ actLanName = QString(actLan[indexLan].con_name); break; } indexLan ++; } // qDebug()<<"actLanName is-------->"<actLanName<"<lanList << nname; } } // qDebug()<<"lanList is-------------->"<connectedWifi.isEmpty()){ QMap::iterator iter = this->connectedWifi.begin(); QString iconamePah = ":/img/plugins/netconnect/wifi" + QString::number(iter.value())+".png"; // qDebug()<<"name is=------------>"<actLanName.isEmpty()){ QString lanIconamePah= ":/img/plugins/netconnect/eth.png"; rebuildNetStatusComponent(lanIconamePah, this->actLanName); // qDebug()<<"name is=------------>"<actLanName; } } bool NetConnect::getSwitchStatus(QString key){ // qDebug()<<"key is------------->"<keys(); if (!list.contains(key)) { return true; } bool res = m_gsettings->get(key).toBool(); return res; } //get wifi's strength int NetConnect::setSignal(QString lv) { int signal = lv.toInt(); // qDebug()<<"signal is---------->"< 75){ signalLv = 1; } if(signal > 55 && signal <= 75){ signalLv = 2; } if(signal > 35 && signal <= 55){ signalLv = 3; } if(signal > 15 && signal <= 35){ signalLv = 4; } if(signal <= 15){ signalLv = 4; } return signalLv; } void NetConnect::wifiSwitchSlot(bool signal){ getNetList(); // qDebug()<<"wifiSwitchSlot--------------->"<keys(); if (!list.contains("switch")) { return ; } m_gsettings->set("switch",signal); } ukui-control-center/plugins/network/netconnect/kylin_network_interface.h0000644000175000017500000000100313635333016026006 0ustar fengfeng#ifndef KYLIN_NETWORK_INTERFACE_H #define KYLIN_NETWORK_INTERFACE_H #include #include #include #include #include #ifdef __cplusplus extern "C"{ #endif typedef struct { char *con_name;//活动网络连接名称 char *type;//活动网络连接类型 char *dev;//活动网络所属设备 }activecon;//存放当前活动网络连接 activecon *kylin_network_get_activecon_info(); #ifdef __cplusplus } #endif // KYLIN_NETWORK_INTERFACE_H #endif ukui-control-center/plugins/devices/0000755000175000017500000000000013635333016016515 5ustar fengfengukui-control-center/plugins/devices/shortcut/0000755000175000017500000000000013642652167020401 5ustar fengfengukui-control-center/plugins/devices/shortcut/realizeshortcutwheel.h0000644000175000017500000000342113635333016025015 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef REALIZESHORTCUTWHEEL_H #define REALIZESHORTCUTWHEEL_H #include #include /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include #include } #define KEYBINDINGS_DESKTOP_SCHEMA "org.ukui.SettingsDaemon.plugins.media-keys" #define KEYBINDINGS_SYSTEM_SCHEMA "org.gnome.desktop.wm.keybindings" #define KEYBINDINGS_CUSTOM_SCHEMA "org.ukui.control-center.keybinding" #define KEYBINDINGS_CUSTOM_DIR "/org/ukui/desktop/keybindings/" #define MAX_SHORTCUTS 1000 #define ACTION_KEY "action" #define BINDING_KEY "binding" #define NAME_KEY "name" #define DEFAULT_BINDING "disable" #define MAX_CUSTOM_SHORTCUTS 1000 QList listExistsCustomShortcutPath(); QString findFreePath(); #endif // REALIZESHORTCUTWHEEL_H ukui-control-center/plugins/devices/shortcut/realizeshortcutwheel.cpp0000644000175000017500000000406613635333016025356 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "realizeshortcutwheel.h" QList listExistsCustomShortcutPath(){ char ** childs; int len; DConfClient * client = dconf_client_new(); childs = dconf_client_list (client, KEYBINDINGS_CUSTOM_DIR, &len); g_object_unref (client); QList vals; for (int i = 0; childs[i] != NULL; i++){ if (dconf_is_rel_dir (childs[i], NULL)){ char * val = g_strdup (childs[i]); vals.append(val); } } g_strfreev (childs); return vals; } QString findFreePath(){ int i = 0; char * dir; bool found; QList existsdirs; existsdirs = listExistsCustomShortcutPath(); for (; i < MAX_CUSTOM_SHORTCUTS; i++){ found = true; dir = QString("custom%1/").arg(i).toLatin1().data(); for (int j = 0; j < existsdirs.count(); j++) if (!g_strcmp0(dir, existsdirs.at(j))){ found = false; break; } if (found) break; } if (i == MAX_CUSTOM_SHORTCUTS){ // qDebug() << "Keyboard Shortcuts" << "Too many custom shortcuts"; return ""; } return QString("%1%2").arg(KEYBINDINGS_CUSTOM_DIR).arg(QString(dir)); } ukui-control-center/plugins/devices/shortcut/showallshortcut.cpp0000644000175000017500000001743213642652167024361 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "showallshortcut.h" #include "ui_showallshortcut.h" #include #include #include #define TITLEWIDGETHEIGH 36 ShowAllShortcut::ShowAllShortcut(QWidget *parent) : QDialog(parent), ui(new Ui::ShowAllShortcut) { ui->setupUi(this); setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground); ui->searchLineEdit->hide(); ui->frame->setStyleSheet("QFrame{background: #ffffff; border: none; border-radius: 6px;}"); //关闭按钮在右上角,窗体radius 6px,所以按钮只得6px ui->closeBtn->setStyleSheet("QPushButton#closeBtn{background: #ffffff; border: none; border-radius: 6px;}" "QPushButton:hover:!pressed#closeBtn{background: #FA6056; border: none; border-top-left-radius: 2px; border-top-right-radius: 6px; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px;}" "QPushButton:hover:pressed#closeBtn{background: #E54A50; border: none; border-top-left-radius: 2px; border-top-right-radius: 6px; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px;}"); ui->closeBtn->setIcon(QIcon("://img/titlebar/close.png")); connect(ui->closeBtn, &QPushButton::clicked, [=](bool checked){ Q_UNUSED(checked) close(); }); } ShowAllShortcut::~ShowAllShortcut() { delete ui; } void ShowAllShortcut::buildComponent(QMap > shortcutsMap){ if (ui->scrollArea->widget()){ ui->scrollArea->takeWidget(); delete ui->scrollArea->widget(); } QWidget * baseWidget = new QWidget; baseWidget->setAttribute(Qt::WA_DeleteOnClose); baseWidget->setFixedWidth(ui->scrollArea->width()); baseWidget->setStyleSheet("QWidget{background: #ffffff;/* border-radius: 6px;*/ }"); QVBoxLayout * baseVerLayout = new QVBoxLayout(baseWidget); baseVerLayout->setSpacing(0); baseVerLayout->setMargin(0); QMap>::iterator it = shortcutsMap.begin(); for (; it != shortcutsMap.end(); it++){ ClickWidget * tWidget = new ClickWidget(it.key()); if (it == shortcutsMap.begin()){ tWidget->setStyleSheet("ClickWidget{background: #F4F4F4; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); } else{ tWidget->setStyleSheet("ClickWidget{background: #F4F4F4;}"); } QWidget * gWidget = buildGeneralWidget(it.value()); if ((it+1) == shortcutsMap.end()) connect(tWidget, &ClickWidget::widgetClicked, [=](bool checked){ gWidget->setVisible(checked); if (tWidget->checked()){ tWidget->setStyleSheet("ClickWidget{background: #F4F4F4;}"); } else { tWidget->setStyleSheet("ClickWidget{background: #F4F4F4; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"); } }); else connect(tWidget, &ClickWidget::widgetClicked, [=](bool checked){ gWidget->setVisible(checked); }); baseVerLayout->addWidget(tWidget); baseVerLayout->addWidget(gWidget); } baseVerLayout->addStretch(); ui->scrollArea->setWidget(baseWidget); } QWidget * ShowAllShortcut::buildTitleWidget(QString tName){ QWidget * titleWidget = new QWidget; titleWidget->setAttribute(Qt::WA_DeleteOnClose); titleWidget->setFixedHeight(TITLEWIDGETHEIGH); titleWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); QHBoxLayout * titleHorLayout = new QHBoxLayout(titleWidget); titleHorLayout->setSpacing(0); titleHorLayout->setContentsMargins(16, 0, 32, 0); QLabel * titleNameLabel = new QLabel(titleWidget); titleNameLabel->setText(tName); QPushButton * directionBtn = new QPushButton(titleWidget); directionBtn->setFixedSize(16, 16); directionBtn->setCheckable(true); titleHorLayout->addWidget(titleNameLabel); titleHorLayout->addStretch(); titleHorLayout->addWidget(directionBtn); titleWidget->setLayout(titleHorLayout); return titleWidget; } QWidget * ShowAllShortcut::buildGeneralWidget(QMap subShortcutsMap){ QWidget * pWidget = new QWidget; pWidget->setAttribute(Qt::WA_DeleteOnClose); pWidget->setStyleSheet("QWidget{background: #ffffff; border: none;}"); QVBoxLayout * pVerLayout = new QVBoxLayout(pWidget); pVerLayout->setSpacing(2); pVerLayout->setMargin(0); pWidget->setLayout(pVerLayout); QMap::iterator it = subShortcutsMap.begin(); for (; it != subShortcutsMap.end(); it++){ QWidget * gWidget = new QWidget; gWidget->setFixedHeight(TITLEWIDGETHEIGH); gWidget->setStyleSheet("QWidget{background: #D5D5D5; border: none;}"); QHBoxLayout * gHorLayout = new QHBoxLayout(gWidget); gHorLayout->setSpacing(0); gHorLayout->setContentsMargins(16, 0, 32, 0); QLabel * nameLabel = new QLabel(gWidget); nameLabel->setText(it.key()); QLabel * bindingLabel = new QLabel(gWidget); bindingLabel->setText(it.value()); gHorLayout->addWidget(nameLabel); gHorLayout->addStretch(); gHorLayout->addWidget(bindingLabel); gWidget->setLayout(gHorLayout); pVerLayout->addWidget(gWidget); } return pWidget; } ClickWidget::ClickWidget(QString name){ setAttribute(Qt::WA_DeleteOnClose); setFixedHeight(TITLEWIDGETHEIGH); QHBoxLayout * titleHorLayout = new QHBoxLayout(this); titleHorLayout->setSpacing(0); titleHorLayout->setContentsMargins(16, 0, 32, 0); QLabel * titleNameLabel = new QLabel(this); titleNameLabel->setText(name); titleNameLabel->setStyleSheet("background: #F4F4F4;"); directionBtn = new QPushButton(this); directionBtn->setFixedSize(16, 16); directionBtn->setCheckable(true); directionBtn->setChecked(true); directionBtn->setStyleSheet("QPushButton{background: #F4F4F4; border: none;}" "QPushButton:checked{background: #F4F4F4; border:none; border-image: url(:/img/plugins/shortcut/up.png)}" "QPushButton:!checked{background: #F4F4F4; border:none; border-image: url(:/img/plugins/shortcut/down.png)}"); connect(directionBtn, &QPushButton::clicked, this, &ClickWidget::widgetClicked); titleHorLayout->addWidget(titleNameLabel); titleHorLayout->addStretch(); titleHorLayout->addWidget(directionBtn); setLayout(titleHorLayout); } bool ClickWidget::checked(){ return directionBtn->isChecked(); } void ClickWidget::mousePressEvent(QMouseEvent *e){ Q_UNUSED(e) directionBtn->setChecked(!directionBtn->isChecked()); emit widgetClicked(directionBtn->isChecked()); } void ClickWidget::paintEvent(QPaintEvent *e){ Q_UNUSED(e) QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } ukui-control-center/plugins/devices/shortcut/defineshortcutitem.cpp0000644000175000017500000000665013642652167025021 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "defineshortcutitem.h" #include #include #include #include #include "customlineedit.h" DefineShortcutItem::DefineShortcutItem(QString name, QString binding) { // setAttribute(Qt::WA_DeleteOnClose); _deleteable = false; _updateable = false; QHBoxLayout * baseHorLayout = new QHBoxLayout(this); baseHorLayout->setSpacing(16); baseHorLayout->setMargin(0); pWidget = new QWidget(this); QHBoxLayout * mainHorLayout = new QHBoxLayout(pWidget); mainHorLayout->setSpacing(0); mainHorLayout->setContentsMargins(16, 0, 24, 0); pWidget->setLayout(mainHorLayout); pLabel = new QLabel(pWidget); pLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); pLabel->setText(name); pLineEdit = new CustomLineEdit(binding, pWidget); pLineEdit->setStyleSheet("QLineEdit{border: none;}"); pLineEdit->setAlignment(Qt::AlignRight); pLineEdit->setText(binding); pLineEdit->setReadOnly(true); pLineEdit->setFixedWidth(200); pButton = new QPushButton(this); pButton->setFixedWidth(64); pButton->hide(); QSizePolicy btnSizePolicy = pButton->sizePolicy(); btnSizePolicy.setVerticalPolicy(QSizePolicy::Expanding); pButton->setSizePolicy(btnSizePolicy); mainHorLayout->addWidget(pLabel); mainHorLayout->addStretch(); mainHorLayout->addWidget(pLineEdit); baseHorLayout->addWidget(pWidget); baseHorLayout->addWidget(pButton); setLayout(baseHorLayout); } DefineShortcutItem::~DefineShortcutItem() { } QWidget * DefineShortcutItem::widgetComponent(){ return pWidget; } QLabel * DefineShortcutItem::labelComponent(){ return pLabel; } CustomLineEdit * DefineShortcutItem::lineeditComponent(){ return pLineEdit; } QPushButton * DefineShortcutItem::btnComponent(){ return pButton; } void DefineShortcutItem::setDeleteable(bool deleteable){ _deleteable = deleteable; } void DefineShortcutItem::setUpdateable(bool updateable){ _updateable = updateable; } void DefineShortcutItem::setShortcutName(QString newName){ pLabel->setText(newName); } void DefineShortcutItem::setShortcutBinding(QString newBinding){ pLineEdit->setText(newBinding); } void DefineShortcutItem::mousePressEvent(QMouseEvent *e){ if (e->button() == Qt::LeftButton && _deleteable){ pButton->show(); } QWidget::mousePressEvent(e); } void DefineShortcutItem::mouseDoubleClickEvent(QMouseEvent *e){ if (e->button() == Qt::LeftButton && _updateable){ emit updateShortcutSignal(); } QWidget::mouseDoubleClickEvent(e); } ukui-control-center/plugins/devices/shortcut/getshortcutworker.cpp0000644000175000017500000000703013635333016024701 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "getshortcutworker.h" #include #include "realizeshortcutwheel.h" GetShortcutWorker::GetShortcutWorker() { } GetShortcutWorker::~GetShortcutWorker() { } void GetShortcutWorker::run(){ // list system shortcut GSettings * systemgsettings = g_settings_new(KEYBINDINGS_SYSTEM_SCHEMA); char ** skeys = g_settings_list_keys(systemgsettings); for (int i=0; skeys[i]!= NULL; i++){ //切换为mutter后,原先为string的变为字符串数组,这块只取了字符串数组的第一个元素 GVariant *variant = g_settings_get_value(systemgsettings, skeys[i]); gsize size = g_variant_get_size(variant); char ** tmp = const_cast(g_variant_get_strv(variant, &size)); char * str = tmp[0]; //保存系统快捷键 QString key = QString(skeys[i]); QString value = QString(str); if (value != ""){ generalShortcutGenerate(KEYBINDINGS_SYSTEM_SCHEMA, key, value); } } g_strfreev(skeys); g_object_unref(systemgsettings); // list desktop shortcut GSettings * desktopsettings = g_settings_new(KEYBINDINGS_DESKTOP_SCHEMA); char ** dkeys = g_settings_list_keys(desktopsettings); for (int i=0; dkeys[i]!= NULL; i++){ //跳过非快捷键 if (!g_strcmp0(dkeys[i], "active") || !g_strcmp0(dkeys[i], "volume-step") || !g_strcmp0(dkeys[i], "priority") || !g_strcmp0(dkeys[i], "enable-osd")) continue; GVariant *variant = g_settings_get_value(desktopsettings, dkeys[i]); gsize size = g_variant_get_size(variant); char * str = const_cast(g_variant_get_string(variant, &size)); //保存桌面快捷键 QString key = QString(dkeys[i]); QString value = QString(str); if (value != ""){ generalShortcutGenerate(KEYBINDINGS_DESKTOP_SCHEMA, key, value); } } g_strfreev(dkeys); g_object_unref(desktopsettings); // list custdom shortcut QList existsPath = listExistsCustomShortcutPath(); for (char * path : existsPath){ char * prepath = QString(KEYBINDINGS_CUSTOM_DIR).toLatin1().data(); char * fullpath = strcat(prepath, path); const QByteArray ba(KEYBINDINGS_CUSTOM_SCHEMA); const QByteArray bba(fullpath); QGSettings * settings = new QGSettings(ba, bba); QString pathStr = QString(fullpath); QString actionStr = settings->get(ACTION_KEY).toString(); QString bindingStr = settings->get(BINDING_KEY).toString(); QString nameStr = settings->get(NAME_KEY).toString(); customShortcutGenerate(pathStr, nameStr, bindingStr, actionStr); } emit workerComplete(); } ukui-control-center/plugins/devices/shortcut/shortcut.h0000644000175000017500000000555413642652167022436 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SHORTCUT_H #define SHORTCUT_H #include #include #include #include #include "shell/interface.h" #include "keymap.h" #include "addshortcutdialog.h" #include "getshortcutworker.h" #include "showallshortcut.h" QT_BEGIN_NAMESPACE namespace Ui { class Shortcut; } QT_END_NAMESPACE typedef struct _KeyEntry KeyEntry; struct _KeyEntry : QObjectUserData{ // int keyval; QString gsSchema; QString keyStr; QString valueStr; QString descStr; QString gsPath; QString nameStr; QString bindingStr; QString actionStr; }; Q_DECLARE_METATYPE(KeyEntry) class Shortcut : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Shortcut(); ~Shortcut(); public: QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget *get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupComponent(); void setupConnect(); void initFunctionStatus(); void appendGeneralItems(); void appendCustomItems(); void buildCustomItem(KeyEntry * nkeyEntry); void initItemsStyle(QListWidget * listWidget); void initGeneralItemsStyle(); void initCustomItemsStyle(); void createNewShortcut(QString path, QString name, QString exec); void deleteCustomShortcut(QString path); void newBindingRequest(QList keyCode); QString getBindingName(QList keyCode); bool keyIsForbidden(QString key); public: QStringList showList; protected: // bool event(QEvent *event); bool eventFilter(QObject *watched, QEvent *event); private: Ui::Shortcut *ui; QString pluginName; int pluginType; QWidget * pluginWidget; private: QThread * pThread; GetShortcutWorker * pWorker; KeyMap * pKeyMap; addShortcutDialog * addDialog; ShowAllShortcut * showDialog; Q_SIGNALS: void hideDelBtn(); }; #endif // SHORTCUT_H ukui-control-center/plugins/devices/shortcut/showallshortcut.ui0000644000175000017500000001442613642652167024214 0ustar fengfeng ShowAllShortcut 0 0 498 828 Dialog 0 0 0 0 0 QFrame::StyledPanel QFrame::Raised 0 0 0 0 0 0 0 0 Qt::Horizontal 40 20 48 32 48 32 8 32 16 32 32 0 0 System Shortcuts Qt::Vertical QSizePolicy::Fixed 20 16 374 36 374 36 430 652 430 652 true 0 0 428 650 0 0 0 0 0 ukui-control-center/plugins/devices/shortcut/customlineedit.cpp0000644000175000017500000001177713642652167024152 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "customlineedit.h" #include CustomLineEdit::CustomLineEdit(QString shortcut, QWidget *parent) : QLineEdit(parent), _oldshortcut(shortcut) { _wait = "New Shortcut..."; _setalready = "New Shortcut... "; setFocusPolicy(Qt::ClickFocus); modifiedsList << Qt::Key_Alt << Qt::Key_Control << Qt::Key_Shift; } CustomLineEdit::~CustomLineEdit() { } //void CustomLineEdit::mousePressEvent(QMouseEvent *e){ // if (e->buttons() & Qt::LeftButton){ // this->setText("New Shortcut..."); // } //} void CustomLineEdit::focusInEvent(QFocusEvent *evt){ if (this->text() == _oldshortcut) this->setText(_wait); } void CustomLineEdit::focusOutEvent(QFocusEvent *evt){ if (this->text() == _wait) this->setText(_oldshortcut); } void CustomLineEdit::keyReleaseEvent(QKeyEvent *evt){ QList tmpList; if (evt->key() == Qt::Key_Escape){ this->clearFocus(); } if (evt->key() == 16777250) //dont not set , ukui-settings-daemon crash return; if (int(evt->modifiers()) == Qt::NoModifier && evt->key() != 0 && !modifiedsList.contains(evt->key()) && this->text() == _wait){ //判断当前text,屏蔽掉多余的keyRelease事件触发 tmpList.append(evt->key()); // qDebug() << evt->key() << evt->text(); emit shortcutCodeSignals(tmpList); this->clearFocus(); } else if (evt->modifiers() == Qt::ControlModifier && evt->key() != 0 && !modifiedsList.contains(evt->key()) && this->text() == _wait){ tmpList.append(Qt::Key_Control); tmpList.append(evt->key()); emit shortcutCodeSignals(tmpList); this->clearFocus(); // qDebug() << "Ctr + " << evt->key() << evt->text() << (int)Qt::ControlModifier << (int)Qt::Key_Control; } else if (evt->modifiers() == Qt::AltModifier && !modifiedsList.contains(evt->key()) && evt->key() != 0 && this->text() == _wait){ tmpList.append(Qt::Key_Alt); tmpList.append(evt->key()); // qDebug() << "Alt + " << evt->key() << evt->text(); emit shortcutCodeSignals(tmpList); this->clearFocus(); } else if (evt->modifiers() == Qt::ShiftModifier && !modifiedsList.contains(evt->key()) && evt->key() != 0 && this->text() == _wait){ tmpList.append(Qt::Key_Shift); tmpList.append(evt->key()); // qDebug() << "Shift + " << evt->key() << evt->text(); emit shortcutCodeSignals(tmpList); this->clearFocus(); } else if ((evt->modifiers() == (Qt::ControlModifier | Qt::AltModifier)) && !modifiedsList.contains(evt->key()) && evt->key() != 0 && this->text() == _wait){ tmpList.append(Qt::Key_Control); tmpList.append(Qt::Key_Alt); tmpList.append(evt->key()); // qDebug() << "Ctr + Alt" << evt->key() << evt->text(); emit shortcutCodeSignals(tmpList); this->clearFocus(); } else if ((evt->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier)) && !modifiedsList.contains(evt->key())&& evt->key() != 0 && this->text() == _wait){ tmpList.append(Qt::Key_Control); tmpList.append(Qt::Key_Shift); tmpList.append(evt->key()); // qDebug() << "Ctr + shift" << evt->key() << evt->text(); emit shortcutCodeSignals(tmpList); this->clearFocus(); } else if ((evt->modifiers() == (Qt::AltModifier | Qt::ShiftModifier)) && !modifiedsList.contains(evt->key()) && evt->key() != 0 && this->text() == _wait){ tmpList.append(Qt::Key_Alt); tmpList.append(Qt::Key_Shift); tmpList.append(evt->key()); // qDebug() << "Alt + shift" << evt->key() << evt->text(); emit shortcutCodeSignals(tmpList); this->clearFocus(); } else if ((evt->modifiers() == (Qt::ControlModifier | Qt::AltModifier | Qt::ShiftModifier) && evt->key() != 0 && this->text() == _wait)){ tmpList.append(Qt::Key_Control); tmpList.append(Qt::Key_Alt); tmpList.append(Qt::Key_Shift); tmpList.append(evt->key()); emit shortcutCodeSignals(tmpList); this->clearFocus(); } if (tmpList.length() > 0){ // emit shortcutCodeSignals(tmpList); // this->clearFocus(); } } ukui-control-center/plugins/devices/shortcut/addshortcutdialog.cpp0000644000175000017500000001220213635333016024575 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "addshortcutdialog.h" #include "ui_addshortcutdialog.h" #include "realizeshortcutwheel.h" #define DEFAULTPATH "/usr/share/applications/" addShortcutDialog::addShortcutDialog(QWidget *parent) : QDialog(parent), ui(new Ui::addShortcutDialog) { ui->setupUi(this); setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground); ui->frame->setStyleSheet("QFrame{background: #ffffff; border: none; border-radius: 6px;}"); //关闭按钮在右上角,窗体radius 6px,所以按钮只得6px ui->closeBtn->setStyleSheet("QPushButton#closeBtn{background: #ffffff; border: none; border-radius: 6px;}" "QPushButton:hover:!pressed#closeBtn{background: #FA6056; border: none; border-top-left-radius: 2px; border-top-right-radius: 6px; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px;}" "QPushButton:hover:pressed#closeBtn{background: #E54A50; border: none; border-top-left-radius: 2px; border-top-right-radius: 6px; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px;}"); QString lineEditQss = QString("QLineEdit{background: #E9E9E9; border: none; border-radius: 4px;}"); ui->nameLineEdit->setStyleSheet(lineEditQss); ui->execLineEdit->setStyleSheet(lineEditQss); QString btnQss = QString("QPushButton{background: #E9E9E9; border-radius: 4px;}" "QPushButton:checked{background: #3d6be5; border-radius: 4px;}" "QPushButton:hover:!pressed{background: #3d6be5; border-radius: 4px;}" "QPushButton:hover:pressed{background: #415FC4; border-radius: 4px;}"); ui->cancelBtn->setStyleSheet(btnQss); ui->certainBtn->setStyleSheet(btnQss); ui->closeBtn->setIcon(QIcon("://img/titlebar/close.png")); ui->noteLabel->setPixmap(QPixmap("://img/plugins/shortcut/note.png")); ui->noteWidget->hide(); gsPath = ""; connect(ui->closeBtn, &QPushButton::clicked, [=](bool checked){ Q_UNUSED(checked) close(); }); connect(ui->openBtn, &QPushButton::clicked, [=](bool checked){ Q_UNUSED(checked) openProgramFileDialog(); }); connect(ui->execLineEdit, &QLineEdit::textChanged, [=](QString text){ if (text.endsWith("desktop") || (!g_file_test(text.toLatin1().data(), G_FILE_TEST_IS_DIR) && g_file_test(text.toLatin1().data(), G_FILE_TEST_IS_EXECUTABLE))){ ui->certainBtn->setChecked(true); ui->noteWidget->hide(); ui->placeHolderWidget->show();//显示占位Widget防止控件未知变化 } else{ ui->certainBtn->setChecked(false); ui->noteWidget->show(); ui->placeHolderWidget->hide(); } }); connect(ui->cancelBtn, &QPushButton::clicked, [=]{ close(); }); connect(ui->certainBtn, &QPushButton::clicked, [=]{ emit shortcutInfoSignal(gsPath, ui->nameLineEdit->text(), ui->execLineEdit->text()); close(); }); connect(this, &addShortcutDialog::finished, [=]{ gsPath = ""; ui->nameLineEdit->clear(); ui->execLineEdit->clear(); ui->noteWidget->hide(); ui->placeHolderWidget->show(); ui->nameLineEdit->setFocus(Qt::ActiveWindowFocusReason); }); } addShortcutDialog::~addShortcutDialog() { delete ui; } void addShortcutDialog::setTitleText(QString text){ ui->titleLabel->setText(text); } void addShortcutDialog::setUpdateEnv(QString path, QString name, QString exec){ gsPath = path; ui->nameLineEdit->setText(name); ui->execLineEdit->setText(exec); } void addShortcutDialog::openProgramFileDialog(){ QString filters = "Desktop files(*.desktop)"; QFileDialog fd; fd.setDirectory(DEFAULTPATH); fd.setAcceptMode(QFileDialog::AcceptOpen); fd.setViewMode(QFileDialog::List); fd.setNameFilter(filters); fd.setFileMode(QFileDialog::ExistingFile); fd.setWindowTitle(tr("selsect desktop")); fd.setLabelText(QFileDialog::Accept, "Select"); if (fd.exec() != QDialog::Accepted) return; QString selectedfile; selectedfile = fd.selectedFiles().first(); QString exec = selectedfile.section("/", -1, -1); // exec.replace(".desktop", ""); ui->execLineEdit->setText(exec); } ukui-control-center/plugins/devices/shortcut/shortcut.cpp0000644000175000017500000004636213642652167022773 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "shortcut.h" #include "ui_shortcut.h" #include #include #include "customlineedit.h" #include "realizeshortcutwheel.h" #include "defineshortcutitem.h" #define ITEMHEIGH 36 //快捷键屏蔽键 QStringList forbiddenKeys = { //Navigation keys "Home", "Left", "Up", "Right", "Down", "Page_Up", "Page_Down", "End", "Tab", // Return "Return", "Enter", "Space", }; QList generalEntries; QList customEntries; Shortcut::Shortcut() { ui = new Ui::Shortcut; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("shortcut"); pluginType = DEVICES; pluginWidget->setStyleSheet("background: #ffffff;"); ui->generalListWidget->setStyleSheet("QListWidget#generalListWidget{background: #ffffff; border: none;}"); ui->showBtn->setStyleSheet("QPushButton{background: #E9E9E9; border-radius: 4px;}" "QPushButton:hover:!pressed{background: #3d6be5; border-radius: 4px;}" "QPushButton:hover:pressed{background: #415FC4; border-radius: 4px;}"); ui->resetBtn->setStyleSheet("QPushButton{background: #E9E9E9; border-radius: 4px;}" "QPushButton:hover:!pressed{background: #3d6be5; border-radius: 4px;}" "QPushButton:hover:pressed{background: #415FC4; border-radius: 4px;}"); ui->customListWidget->setStyleSheet("QListWidget#customListWidget{background: #ffffff; border: none;}"); ui->addWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); pKeyMap = new KeyMap; addDialog = new addShortcutDialog(); showDialog = new ShowAllShortcut(); showList << "terminal" << "screenshot" << "area-screenshot" << "peony-qt" << "logout" << "screensaver"; setupComponent(); setupConnect(); initFunctionStatus(); } Shortcut::~Shortcut() { delete ui; delete pKeyMap; delete addDialog; delete showDialog; } QString Shortcut::get_plugin_name(){ return pluginName; } int Shortcut::get_plugin_type(){ return pluginType; } QWidget *Shortcut::get_plugin_ui(){ return pluginWidget; } void Shortcut::plugin_delay_control(){ } void Shortcut::setupComponent(){ ui->addLabel->setPixmap(QPixmap("://img/plugins/printer/add.png")); ui->generalListWidget->setFocusPolicy(Qt::NoFocus); ui->generalListWidget->setSelectionMode(QAbstractItemView::NoSelection); ui->generalListWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->generalListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->generalListWidget->setSpacing(0); ui->customListWidget->setFocusPolicy(Qt::NoFocus); ui->customListWidget->setSelectionMode(QAbstractItemView::NoSelection); ui->customListWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->customListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->customListWidget->setSpacing(0); // ui->customListWidget->setFixedHeight((showList.length() * ITEMHEIGH)); ui->addWidget->installEventFilter(this); ui->generalListWidget->setSelectionMode(QAbstractItemView::SingleSelection); ui->resetBtn->hide(); // ui->title2Label->hide(); ui->customListWidget->hide(); ui->addWidget->hide(); } void Shortcut::setupConnect(){ connect(ui->showBtn, &QPushButton::clicked, [=]{ QMap systemMap; QMap desktopMap; //最新快捷键数据 for (int i = 0; i < generalEntries.count(); i++){ if (generalEntries[i]->gsSchema == KEYBINDINGS_DESKTOP_SCHEMA){ desktopMap.insert(generalEntries[i]->keyStr, generalEntries[i]->valueStr); } else if (generalEntries[i]->gsSchema == KEYBINDINGS_SYSTEM_SCHEMA){ systemMap.insert(generalEntries[i]->keyStr, generalEntries[i]->valueStr); } } QMap> generalMaps; generalMaps.insert(tr("Desktop"), desktopMap); generalMaps.insert(tr("System"), systemMap); showDialog->buildComponent(generalMaps); showDialog->show(); }); connect(addDialog, &addShortcutDialog::shortcutInfoSignal, [=](QString path, QString name, QString exec){ createNewShortcut(path, name, exec); }); connect(ui->generalListWidget, &QListWidget::itemSelectionChanged, [=]{ QList selectedItems = ui->generalListWidget->selectedItems(); if (selectedItems.count() == 1){ ui->resetBtn->show(); } else{ ui->resetBtn->hide(); } }); connect(ui->resetBtn, &QPushButton::clicked, [=]{ QList selectedItems = ui->generalListWidget->selectedItems(); if (!selectedItems.isEmpty()){ QListWidgetItem * sItem = selectedItems.first(); DefineShortcutItem * wItem = dynamic_cast(ui->generalListWidget->itemWidget(sItem)); KeyEntry * currentEntry = dynamic_cast(wItem->userData(Qt::UserRole)); const QByteArray id(currentEntry->gsSchema.toLatin1().data()); QGSettings * settings = new QGSettings(id); settings->reset(currentEntry->keyStr); QString value = settings->get(currentEntry->keyStr).toString(); wItem->setShortcutBinding(value); delete settings; } }); } void Shortcut::initFunctionStatus(){ generalEntries.clear(); customEntries.clear(); //使用线程获取快捷键 pThread = new QThread; pWorker = new GetShortcutWorker; connect(pWorker, &GetShortcutWorker::generalShortcutGenerate, this, [=](QString schema, QString key, QString value){ // qDebug() << "general shortcut" << schema << key << value; KeyEntry * generalKeyEntry = new KeyEntry; generalKeyEntry->gsSchema = schema; generalKeyEntry->keyStr = key; generalKeyEntry->valueStr = value; generalEntries.append(generalKeyEntry); }); connect(pWorker, &GetShortcutWorker::customShortcutGenerate, this, [=](QString path, QString name, QString binding, QString action){ // qDebug() << "custom shortcut" << path << name << binding; KeyEntry * customKeyEntry = new KeyEntry; customKeyEntry->gsSchema = KEYBINDINGS_CUSTOM_SCHEMA; customKeyEntry->gsPath = path; customKeyEntry->nameStr = name; customKeyEntry->bindingStr = binding; customKeyEntry->actionStr = action; customEntries.append(customKeyEntry); }); connect(pWorker, &GetShortcutWorker::workerComplete, this, [=]{ pThread->quit(); //退出事件循环 pThread->wait(); //释放资源 }); pWorker->moveToThread(pThread); connect(pThread, &QThread::started, pWorker, &GetShortcutWorker::run); connect(pThread, &QThread::finished, this, [=]{ //系统快捷键 appendGeneralItems(); ui->generalListWidget->setFixedHeight(ui->generalListWidget->count() * ITEMHEIGH); initGeneralItemsStyle(); //自定义快捷键 appendCustomItems(); ui->customListWidget->setFixedHeight(ui->customListWidget->count() * ITEMHEIGH); initCustomItemsStyle(); }); connect(pThread, &QThread::finished, pWorker, &GetShortcutWorker::deleteLater); pThread->start(); } void Shortcut::appendGeneralItems(){ for (KeyEntry * gkeyEntry: generalEntries){ if (showList.contains(gkeyEntry->keyStr)){ DefineShortcutItem * singleWidget = new DefineShortcutItem(gkeyEntry->keyStr, gkeyEntry->valueStr); singleWidget->setUserData(Qt::UserRole, gkeyEntry); CustomLineEdit * line = singleWidget->lineeditComponent(); connect(line, &CustomLineEdit::shortcutCodeSignals, this, [=](QList keyCode){ newBindingRequest(keyCode); }); QListWidgetItem * item = new QListWidgetItem(ui->generalListWidget); item->setSizeHint(QSize(ui->generalListWidget->width(), ITEMHEIGH)); item->setData(Qt::UserRole, ""); ui->generalListWidget->setItemWidget(item, singleWidget); } } } void Shortcut::appendCustomItems(){ for (KeyEntry * ckeyEntry : customEntries){ buildCustomItem(ckeyEntry); } } void Shortcut::buildCustomItem(KeyEntry * nkeyEntry){ DefineShortcutItem * singleWidget = new DefineShortcutItem(nkeyEntry->nameStr, nkeyEntry->bindingStr); singleWidget->setDeleteable(true); singleWidget->setUpdateable(true); singleWidget->setUserData(Qt::UserRole, nkeyEntry); connect(singleWidget, &DefineShortcutItem::updateShortcutSignal, [=]{ addDialog->setTitleText(QObject::tr("Update Shortcut")); addDialog->setUpdateEnv(nkeyEntry->gsPath, nkeyEntry->nameStr, nkeyEntry->actionStr); addDialog->exec(); }); CustomLineEdit * line = singleWidget->lineeditComponent(); connect(line, &CustomLineEdit::shortcutCodeSignals, this, [=](QList keyCode){ newBindingRequest(keyCode); }); QPushButton * button = singleWidget->btnComponent(); QListWidgetItem * item = new QListWidgetItem(ui->customListWidget); item->setSizeHint(QSize(ui->customListWidget->width(), ITEMHEIGH)); item->setData(Qt::UserRole, nkeyEntry->gsPath); ui->customListWidget->setItemWidget(item, singleWidget); connect(button, &QPushButton::clicked, [=]{ int row = ui->customListWidget->row(item); QListWidgetItem * obItem = ui->customListWidget->takeItem(row); delete obItem; ui->customListWidget->setFixedHeight(ui->customListWidget->count() * ITEMHEIGH); initCustomItemsStyle(); deleteCustomShortcut(nkeyEntry->gsPath); }); } void Shortcut::initItemsStyle(QListWidget *listWidget){ int total = listWidget->count(); for (int row = 0; row < total; row++){ QString style; QString subStyle; if (1 == total){ //总数为1 style = "QWidget{background: #F4F4F4; border: none; border-radius: 6px;}"; subStyle = "background: #F4F4F4; border: none; border-radius: 4px;"; } else if (0 == row && (row % 2 == 0)){ //首位 style = "QWidget{background: #F4F4F4; border: none; border-top-left-radius: 6px; border-top-right-radius: 6px;}"; subStyle = "background: #F4F4F4; border: none; border-radius: 4px;"; } else if (total - 1 == row){ //末位 if (0 == row % 2){ style = "QWidget{background: #F4F4F4; border: none; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"; subStyle = "background: #F4F4F4; border: none; border-radius: 4px;"; } else { style = "QWidget{background: #EEEEEE; border: none; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"; subStyle = "background: #EEEEEE; border: none; border-radius: 4px;"; } } else if (row % 2 == 0){ style = "QWidget{background: #F4F4F4; border: none;}"; subStyle = "background: #F4F4F4; border: none; border-radius: 4px;"; } else if (row % 2 != 0){ style = "QWidget{background: #EEEEEE; border: none;}"; subStyle = "background: #EEEEEE; border: none; border-radius: 4px;"; } QWidget * widget = listWidget->itemWidget(listWidget->item(row)); DefineShortcutItem * pShortcutItem = dynamic_cast(widget); pShortcutItem->widgetComponent()->setStyleSheet(style); pShortcutItem->btnComponent()->setStyleSheet(subStyle); } } void Shortcut::initGeneralItemsStyle(){ initItemsStyle(ui->generalListWidget); } void Shortcut::initCustomItemsStyle(){ initItemsStyle(ui->customListWidget); } void Shortcut::createNewShortcut(QString path, QString name, QString exec){ QString availablepath; if (path.isEmpty()){ availablepath = findFreePath(); //创建快捷键 //更新数据 KeyEntry * nKeyentry = new KeyEntry; nKeyentry->gsPath = availablepath; nKeyentry->nameStr = name; nKeyentry->bindingStr = DEFAULT_BINDING; nKeyentry->actionStr = exec; customEntries.append(nKeyentry); /*********刷新界面(添加)******/ buildCustomItem(nKeyentry); ui->customListWidget->setFixedHeight(ui->customListWidget->count() * ITEMHEIGH); initCustomItemsStyle(); /******************/ } else { availablepath = path; //更新快捷键 //更新数据 int i = 0; for (; i < customEntries.count(); i++){ if (customEntries[i]->gsPath == availablepath){ customEntries[i]->nameStr = name; customEntries[i]->actionStr = exec; break; } } //刷新界面(更新) for (int row = 0; row < ui->customListWidget->count(); row++){ QListWidgetItem * item = ui->customListWidget->item(row); if (!QString::compare(item->data(Qt::UserRole).toString(), availablepath)){ DefineShortcutItem * widgetItem = dynamic_cast(ui->customListWidget->itemWidget(item)); widgetItem->setShortcutName(name); KeyEntry * uKeyentry = customEntries.at(i); widgetItem->setUserData(Qt::UserRole, uKeyentry); } } } // if (availablepath.isEmpty()){ // qDebug() << "add custom shortcut failed"; // return; // } const QByteArray id(KEYBINDINGS_CUSTOM_SCHEMA); const QByteArray idd(availablepath.toLatin1().data()); QGSettings * settings = new QGSettings(id, idd); settings->set(BINDING_KEY, DEFAULT_BINDING); settings->set(NAME_KEY, name); settings->set(ACTION_KEY, exec); delete settings; } void Shortcut::deleteCustomShortcut(QString path){ if (path.isEmpty()) return; gboolean ret; GError ** error = NULL; char * fullpath = path.toLatin1().data(); DConfClient * client = dconf_client_new (); ret = dconf_client_write_sync (client, fullpath, NULL, NULL, NULL, error); if (!ret) qDebug() << "Delete Custom ShortCut Failed!"; g_object_unref (client); } void Shortcut::newBindingRequest(QList keyCode){ QObject * object = QObject::sender(); CustomLineEdit * current = qobject_cast(object); //孙子 QWidget * widget = current->parentWidget(); DefineShortcutItem * widgetItem = dynamic_cast(widget->parentWidget()); KeyEntry * nkeyEntry = dynamic_cast(widgetItem->userData(Qt::UserRole)); QString shortcutString = getBindingName(keyCode); //check for unmodified keys if (keyCode.count() == 1){ if (shortcutString.contains(QRegExp("[a-z]")) || shortcutString.contains(QRegExp("[0-9]")) || keyIsForbidden(shortcutString)){ qDebug() << "Please try with a key such as Control, Alt or Shift at the same time."; return; } } /* flag to see if the new accelerator was in use by something */ for (KeyEntry * ckeyEntry : generalEntries){ if (shortcutString == ckeyEntry->valueStr){ qDebug() << QString("The shortcut \"%1\" is already used for\n\"%2\",please reset!!!").arg(shortcutString).arg(ckeyEntry->keyStr); return; } } current->setText(shortcutString); if (nkeyEntry->gsPath.isEmpty()){ //非自定义快捷键的修改 const QByteArray iid(nkeyEntry->gsSchema.toLatin1().data()); QGSettings * settings = new QGSettings(iid); settings->set(nkeyEntry->keyStr, shortcutString); delete settings; //更新 for (int index = 0; index < generalEntries.count(); index++){ if (nkeyEntry->keyStr == generalEntries[index]->keyStr){ generalEntries[index]->valueStr = shortcutString; } } } else { //自定义快捷键的修改 const QByteArray id(KEYBINDINGS_CUSTOM_SCHEMA); const QByteArray idd(nkeyEntry->gsPath.toLatin1().data()); QGSettings * settings = new QGSettings(id, idd); settings->set(BINDING_KEY, shortcutString); delete settings; //更新 for (int index = 0; index < customEntries.count(); index++){ if (nkeyEntry->nameStr == customEntries[index]->nameStr){ customEntries[index]->bindingStr = shortcutString; } } } } QString Shortcut::getBindingName(QList keyCode){ QStringList tmpList; for (int keycode : keyCode){ if (keycode >= 16777216 && keycode <= 16777254){ //1677216=Escape; 16777254=ScrollLock tmpList.append(QString("<%1>").arg(pKeyMap->keycodeTokeystring(keycode))); } else if (keycode >= 48 && keycode <= 57){ // 48 = 0; 57 = 9 QString str = pKeyMap->keycodeTokeystring(keycode); tmpList.append(str.split("K_").at(1)); } else if (keycode >= 65 && keycode <= 90){ QString str = pKeyMap->keycodeTokeystring(keycode); tmpList.append(str.toLower()); } else tmpList.append(pKeyMap->keycodeTokeystring(keycode)); } return tmpList.join(""); } bool Shortcut::keyIsForbidden(QString key){ for (int i = 0; i < forbiddenKeys.length(); i++){ if (key == forbiddenKeys[i]) return true; } return false; } bool Shortcut::eventFilter(QObject *watched, QEvent *event){ if (watched == ui->addWidget){ if (event->type() == QEvent::MouseButtonPress){ QMouseEvent * mouseEvent = static_cast(event); if (mouseEvent->button() == Qt::LeftButton){ addDialog->setTitleText(QObject::tr("Add Shortcut")); addDialog->show(); return true; } else return false; } } return QObject::eventFilter(watched, event); } //bool Shortcut::event(QEvent *event){ // qDebug() << "---111--->"; // if (event->type() == QEvent::MouseButtonPress){ // qDebug() << "-------------->"; // QMouseEvent * mouseEvent = dynamic_cast(event); // if (!ui->customListWidget->geometry().contains(mouseEvent->globalX(), mouseEvent->globalY())){ // qDebug() << "=============>"; // emit hideDelBtn(); // } // } // return QObject::event(event); //} ukui-control-center/plugins/devices/shortcut/customlineedit.h0000644000175000017500000000304313642652167023602 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CUSTOMLINEEDIT_H #define CUSTOMLINEEDIT_H #include #include //#include #include class CustomLineEdit : public QLineEdit { Q_OBJECT public: explicit CustomLineEdit(QString shortcut, QWidget *parent = 0); ~CustomLineEdit(); // virtual void mousePressEvent(QMouseEvent * e); virtual void focusOutEvent(QFocusEvent * evt); virtual void focusInEvent(QFocusEvent * evt); virtual void keyReleaseEvent(QKeyEvent * evt); private: QString _oldshortcut; QString _wait; QString _setalready; QList modifiedsList; Q_SIGNALS: void shortcutCodeSignals(QList); }; #endif // CUSTOMLINEEDIT_H ukui-control-center/plugins/devices/shortcut/keymap.h0000644000175000017500000000756113635333016022040 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KEYMAP_H #define KEYMAP_H #include #include class KeyMap : public QObject { Q_OBJECT public: explicit KeyMap(); ~KeyMap(); QString keycodeTokeystring(int code); public: QMetaEnum metaColor; enum CCKey{ Escape = 0x01000000, // misc keys Tab = 0x01000001, Backtab = 0x01000002, Backspace = 0x01000003, Return = 0x01000004, Enter = 0x01000005, Insert = 0x01000006, Delete = 0x01000007, Pause = 0x01000008, Print = 0x01000009, // print screen SysReq = 0x0100000a, Clear = 0x0100000b, Home = 0x01000010, // cursor movement End = 0x01000011, Left = 0x01000012, Up = 0x01000013, Right = 0x01000014, Down = 0x01000015, PageUp = 0x01000016, PageDown = 0x01000017, Shift = 0x01000020, // modifiers Control = 0x01000021, Meta = 0x01000022, Alt = 0x01000023, CapsLock = 0x01000024, NumLock = 0x01000025, ScrollLock = 0x01000026, F1 = 0x01000030, // function keys F2 = 0x01000031, F3 = 0x01000032, F4 = 0x01000033, F5 = 0x01000034, F6 = 0x01000035, F7 = 0x01000036, F8 = 0x01000037, F9 = 0x01000038, F10 = 0x01000039, F11 = 0x0100003a, F12 = 0x0100003b, Super_L = 0x01000053, // extra keys Super_R = 0x01000054, Menu = 0x01000055, Hyper_L = 0x01000056, Hyper_R = 0x01000057, Help = 0x01000058, Direction_L = 0x01000059, Direction_R = 0x01000060, Space = 0x20, // 7 bit printable ASCII Any = Space, Exclam = 0x21, QuoteDbl = 0x22, NumberSign = 0x23, Dollar = 0x24, Percent = 0x25, Ampersand = 0x26, Apostrophe = 0x27, ParenLeft = 0x28, ParenRight = 0x29, Asterisk = 0x2a, Plus = 0x2b, Comma = 0x2c, Minus = 0x2d, Period = 0x2e, Slash = 0x2f, K_0 = 0x30, K_1 = 0x31, K_2 = 0x32, K_3 = 0x33, K_4 = 0x34, K_5 = 0x35, K_6 = 0x36, K_7 = 0x37, K_8 = 0x38, K_9 = 0x39, Colon = 0x3a, Semicolon = 0x3b, Less = 0x3c, Equal = 0x3d, Greater = 0x3e, Question = 0x3f, At = 0x40, A = 0x41, B = 0x42, C = 0x43, D = 0x44, E = 0x45, F = 0x46, G = 0x47, H = 0x48, I = 0x49, J = 0x4a, K = 0x4b, L = 0x4c, M = 0x4d, N = 0x4e, O = 0x4f, P = 0x50, Q = 0x51, R = 0x52, S = 0x53, T = 0x54, U = 0x55, V = 0x56, W = 0x57, X = 0x58, Y = 0x59, Z = 0x5a, }; Q_ENUM(CCKey) }; #endif // KEYMAP_H ukui-control-center/plugins/devices/shortcut/shortcut.pro0000644000175000017500000000304413642652167022777 0ustar fengfengQT += widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(shortcut) DESTDIR = ../../../pluginlibs include(../../../env.pri) INCLUDEPATH += \ $$PROJECT_ROOTDIR \ /usr/include/dconf LIBS += -L/usr/lib/ -lgsettings-qt -ldconf CONFIG += \ link_pkgconfig \ c++11 PKGCONFIG += gio-2.0 \ gio-unix-2.0 \ # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ addshortcutdialog.cpp \ customlineedit.cpp \ defineshortcutitem.cpp \ getshortcutworker.cpp \ keymap.cpp \ realizeshortcutwheel.cpp \ shortcut.cpp \ showallshortcut.cpp HEADERS += \ addshortcutdialog.h \ customlineedit.h \ defineshortcutitem.h \ getshortcutworker.h \ keymap.h \ realizeshortcutwheel.h \ shortcut.h \ showallshortcut.h FORMS += \ addshortcutdialog.ui \ shortcut.ui \ showallshortcut.ui ukui-control-center/plugins/devices/shortcut/shortcut.ui0000644000175000017500000002355313642652167022623 0ustar fengfeng Shortcut 0 0 847 664 Shortcut 8 0 0 32 30 550 0 960 16777215 0 0 0 0 0 16 10 0 0 System Shortcut Qt::Vertical QSizePolicy::Fixed 20 8 0 136 36 136 36 Show all shortcut Qt::Horizontal 40 20 136 36 136 36 Reset default Qt::Vertical QSizePolicy::Fixed 20 32 0 0 Custom Shortcut 8 0 0 60 16777215 60 0 16 0 0 0 16 0 0 0 0 48 48 48 48 0 0 Add custom shortcut Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 32 Qt::Vertical 20 40 ukui-control-center/plugins/devices/shortcut/keymap.cpp0000644000175000017500000000212413635333016022361 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "keymap.h" KeyMap::KeyMap() { metaColor = QMetaEnum::fromType(); } KeyMap::~KeyMap() { } QString KeyMap::keycodeTokeystring(int code){ return metaColor.valueToKey(code); //未匹配到则返回空 } ukui-control-center/plugins/devices/shortcut/addshortcutdialog.h0000644000175000017500000000273313635333016024252 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef ADDSHORTCUTDIALOG_H #define ADDSHORTCUTDIALOG_H #include #include namespace Ui { class addShortcutDialog; } class addShortcutDialog : public QDialog { Q_OBJECT public: explicit addShortcutDialog(QWidget *parent = nullptr); ~addShortcutDialog(); public: void setTitleText(QString text); void openProgramFileDialog(); void setUpdateEnv(QString path, QString name, QString exec); private: Ui::addShortcutDialog *ui; private: QString gsPath; Q_SIGNALS: void shortcutInfoSignal(QString path, QString name, QString exec); }; #endif // ADDSHORTCUTDIALOG_H ukui-control-center/plugins/devices/shortcut/defineshortcutitem.h0000644000175000017500000000351113642652167024457 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef DEFINESHORTCUTITEM_H #define DEFINESHORTCUTITEM_H #include class QLabel; class QPushButton; class CustomLineEdit; class DefineShortcutItem : public QWidget { Q_OBJECT public: explicit DefineShortcutItem(QString name, QString binding); ~DefineShortcutItem(); public: QWidget * widgetComponent(); QLabel * labelComponent(); QPushButton * btnComponent(); CustomLineEdit * lineeditComponent(); public: void setDeleteable(bool deleteable); void setUpdateable(bool updateable); void setShortcutName(QString newName); void setShortcutBinding(QString newBinding); protected: virtual void mousePressEvent(QMouseEvent * e); virtual void mouseDoubleClickEvent(QMouseEvent * e); private: QWidget * pWidget; QLabel * pLabel; CustomLineEdit * pLineEdit; QPushButton * pButton; private: bool _deleteable; bool _updateable; Q_SIGNALS: void updateShortcutSignal(); }; #endif // DEFINESHORTCUTITEM_H ukui-control-center/plugins/devices/shortcut/showallshortcut.h0000644000175000017500000000332313642652167024020 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SHOWALLSHORTCUT_H #define SHOWALLSHORTCUT_H #include namespace Ui { class ShowAllShortcut; } class ClickWidget : public QWidget { Q_OBJECT public: explicit ClickWidget(QString name); ~ClickWidget(){} public: bool checked(); protected: void mousePressEvent(QMouseEvent * e); void paintEvent(QPaintEvent * e); private: QPushButton * directionBtn; Q_SIGNALS: void widgetClicked(bool checked); }; class ShowAllShortcut : public QDialog { Q_OBJECT public: explicit ShowAllShortcut(QWidget *parent = nullptr); ~ShowAllShortcut(); public: void buildComponent(QMap> shortcutsMap); QWidget * buildTitleWidget(QString tName); QWidget * buildGeneralWidget(QMap subShortcutsMap); private: Ui::ShowAllShortcut *ui; }; #endif // SHOWALLSHORTCUT_H ukui-control-center/plugins/devices/shortcut/getshortcutworker.h0000644000175000017500000000252313635333016024350 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef GETSHORTCUTWORKER_H #define GETSHORTCUTWORKER_H #include #include class GetShortcutWorker : public QObject { Q_OBJECT public: explicit GetShortcutWorker(); ~GetShortcutWorker(); public: void run(); Q_SIGNALS: void generalShortcutGenerate(QString schema, QString key, QString value); void customShortcutGenerate(QString path, QString name, QString bindingkey, QString action); void workerComplete(); }; #endif // GETSHORTCUTWORKER_H ukui-control-center/plugins/devices/shortcut/addshortcutdialog.ui0000644000175000017500000003605513635333016024444 0ustar fengfeng addShortcutDialog 0 0 430 360 430 360 430 360 Dialog 0 0 0 0 0 QFrame::StyledPanel QFrame::Raised 0 0 0 0 0 0 0 0 Qt::Horizontal 40 20 48 32 48 32 0 32 16 32 32 0 0 Qt::Vertical QSizePolicy::Fixed 20 32 0 0 0 Shortcut name Qt::Horizontal 40 20 258 28 258 28 Qt::Vertical QSizePolicy::Fixed 20 8 16 0 0 Shortcut exec Qt::Horizontal 40 20 182 28 182 28 60 28 60 28 Open 0 24 16777215 24 0 0 0 0 0 8 0 0 16 16 16 16 0 0 Invalid executable, please re-enter Qt::Horizontal 40 20 0 24 16777215 24 Qt::Vertical QSizePolicy::Fixed 20 88 16 Qt::Horizontal 40 20 120 36 120 36 Cancel 120 36 120 36 Certain true Qt::Vertical 20 40 ukui-control-center/plugins/devices/touchpad/0000755000175000017500000000000013640364120020320 5ustar fengfengukui-control-center/plugins/devices/touchpad/touchpad.h0000644000175000017500000000353113640364120022302 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef TOUCHPAD_H #define TOUCHPAD_H #include #include #include #include #include #include "shell/interface.h" #include "SwitchButton/switchbutton.h" namespace Ui { class Touchpad; } class Touchpad : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: explicit Touchpad(); ~Touchpad(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget *get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupComponent(); void initTouchpadStatus(); QString _findKeyScrollingType(); private: Ui::Touchpad *ui; QString pluginName; int pluginType; QWidget * pluginWidget; private: SwitchButton * enableBtn; SwitchButton * typingBtn; SwitchButton * clickBtn; QGSettings * tpsettings; }; #endif // TOUCHPAD_H ukui-control-center/plugins/devices/touchpad/touchpad.pro0000644000175000017500000000263113635333016022657 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2020-02-26T16:15:07 # #------------------------------------------------- QT += widgets x11extras greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(touchpad) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ #LIBS += -L/usr/lib/ -ltouchpadclient -lXi -lgsettings-qt LIBS += -L/usr/lib/ -lXi -lgsettings-qt CONFIG += link_pkgconfig \ C++11 # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ touchpad.cpp HEADERS += \ touchpad.h FORMS += \ touchpad.ui ukui-control-center/plugins/devices/touchpad/touchpad.cpp0000644000175000017500000002013113640364120022630 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "touchpad.h" #include "ui_touchpad.h" #include #include /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include } #define TOUCHPAD_SCHEMA "org.ukui.peripherals-touchpad" #define ACTIVE_TOUCHPAD_KEY "touchpad-enabled" #define DISABLE_WHILE_TYPING_KEY "disable-while-typing" #define TOUCHPAD_CLICK_KEY "tap-to-click" #define V_EDGE_KEY "vertical-edge-scrolling" #define H_EDGE_KEY "horizontal-edge-scrolling" #define V_FINGER_KEY "vertical-two-finger-scrolling" #define H_FINGER_KEY "horizontal-two-finger-scrolling" #define N_SCROLLING "none" bool findSynaptics(); bool _supportsXinputDevices(); XDevice* _deviceIsTouchpad (XDeviceInfo * deviceinfo); bool _deviceHasProperty (XDevice * device, const char * property_name); Touchpad::Touchpad() { ui = new Ui::Touchpad; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("touchpad"); pluginType = DEVICES; QString qss; QFile QssFile("://combox.qss"); QssFile.open(QFile::ReadOnly); if (QssFile.isOpen()){ qss = QLatin1String(QssFile.readAll()); QssFile.close(); } pluginWidget->setStyleSheet("background: #ffffff;"); ui->scrollingTypeComBox->setView(new QListView()); ui->scrollingTypeComBox->setStyleSheet(qss); ui->enableWidget->setStyleSheet("QWidget{background: #F4F4F4; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); ui->typingWidget->setStyleSheet("QWidget{background: #F4F4F4;}"); ui->clickWidget->setStyleSheet("QWidget{background: #F4F4F4;}"); ui->scrollingWidget->setStyleSheet("QWidget{background: #F4F4F4; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"); const QByteArray id(TOUCHPAD_SCHEMA); tpsettings = new QGSettings(id); setupComponent(); if (findSynaptics()){ qDebug() << "Touch Devices Available"; initTouchpadStatus(); } } Touchpad::~Touchpad() { delete ui; delete tpsettings; } QString Touchpad::get_plugin_name(){ return pluginName; } int Touchpad::get_plugin_type(){ return pluginType; } QWidget *Touchpad::get_plugin_ui(){ return pluginWidget; } void Touchpad::plugin_delay_control(){ } void Touchpad::setupComponent(){ // enableBtn = new SwitchButton(pluginWidget); ui->enableHorLayout->addWidget(enableBtn); // typingBtn = new SwitchButton(pluginWidget); ui->typingHorLayout->addWidget(typingBtn); // clickBtn = new SwitchButton(pluginWidget); ui->clickHorLayout->addWidget(clickBtn); // ui->scrollingTypeComBox->addItem(tr("Disable rolling"), N_SCROLLING); ui->scrollingTypeComBox->addItem(tr("Vertical edge scrolling"), V_EDGE_KEY); ui->scrollingTypeComBox->addItem(tr("Horizontal edge scrolling"), H_EDGE_KEY); ui->scrollingTypeComBox->addItem(tr("Vertical two-finger scrolling"), V_FINGER_KEY); ui->scrollingTypeComBox->addItem(tr("Horizontal two-finger scrolling"), H_FINGER_KEY); connect(enableBtn, &SwitchButton::checkedChanged, [=](bool checked){ tpsettings->set(ACTIVE_TOUCHPAD_KEY, checked); }); connect(typingBtn, &SwitchButton::checkedChanged, [=](bool checked){ tpsettings->set(DISABLE_WHILE_TYPING_KEY, checked); }); connect(clickBtn, &SwitchButton::checkedChanged, [=](bool checked){ tpsettings->set(TOUCHPAD_CLICK_KEY, checked); }); connect(ui->scrollingTypeComBox, QOverload::of(&QComboBox::currentIndexChanged), [=](int index){ Q_UNUSED(index) //旧滚动类型设置为false,跳过N_SCROLLING QString oldType = _findKeyScrollingType(); if (QString::compare(oldType, N_SCROLLING) != 0) tpsettings->set(oldType, false); //新滚动类型设置为true,跳过N_SCROLLING QString data = ui->scrollingTypeComBox->currentData().toString(); if (QString::compare(data, N_SCROLLING) != 0) tpsettings->set(data, true); }); } void Touchpad::initTouchpadStatus(){ //初始化启用按钮 enableBtn->blockSignals(true); enableBtn->setChecked(tpsettings->get(ACTIVE_TOUCHPAD_KEY).toBool()); enableBtn->blockSignals(false); // 初始化打字禁用 typingBtn->blockSignals(true); typingBtn->setChecked(tpsettings->get(DISABLE_WHILE_TYPING_KEY).toBool()); typingBtn->blockSignals(false); // 初始化触摸板点击 clickBtn->blockSignals(true); clickBtn->setChecked(tpsettings->get(TOUCHPAD_CLICK_KEY).toBool()); clickBtn->blockSignals(false); //初始化滚动 ui->scrollingTypeComBox->blockSignals(true); ui->scrollingTypeComBox->setCurrentIndex(ui->scrollingTypeComBox->findData(_findKeyScrollingType())); ui->scrollingTypeComBox->blockSignals(false); } QString Touchpad::_findKeyScrollingType(){ if (tpsettings->get(V_EDGE_KEY).toBool()) return V_EDGE_KEY; if (tpsettings->get(H_EDGE_KEY).toBool()) return H_EDGE_KEY; if (tpsettings->get(V_FINGER_KEY).toBool()) return V_FINGER_KEY; if (tpsettings->get(H_FINGER_KEY).toBool()) return H_FINGER_KEY; return N_SCROLLING; } bool findSynaptics(){ XDeviceInfo *device_info; int n_devices; bool retval; if (_supportsXinputDevices() == false) return true; device_info = XListInputDevices (QX11Info::display(), &n_devices); if (device_info == nullptr) return false; retval = false; for (int i = 0; i < n_devices; i++) { XDevice *device; device = _deviceIsTouchpad (&device_info[i]); if (device != nullptr) { retval = true; break; } } if (device_info != nullptr) XFreeDeviceList (device_info); return retval; } bool _supportsXinputDevices(){ int op_code, event, error; return XQueryExtension (QX11Info::display(), "XInputExtension", &op_code, &event, &error); } XDevice* _deviceIsTouchpad (XDeviceInfo *deviceinfo){ XDevice *device; if (deviceinfo->type != XInternAtom (QX11Info::display(), XI_TOUCHPAD, true)) return nullptr; device = XOpenDevice (QX11Info::display(), deviceinfo->id); if(device == nullptr) { qDebug()<<"device== null"; return nullptr; } if (_deviceHasProperty(device, "libinput Tapping Enabled") || _deviceHasProperty(device, "Synaptics Off")) { return device; } XCloseDevice (QX11Info::display(), device); return nullptr; } bool _deviceHasProperty(XDevice *device, const char *property_name){ Atom realtype, prop; int realformat; unsigned long nitems, bytes_after; unsigned char *data; prop = XInternAtom (QX11Info::display(), property_name, True); if (!prop) return false; if ((XGetDeviceProperty (QX11Info::display(), device, prop, 0, 1, False, XA_INTEGER, &realtype, &realformat, &nitems, &bytes_after, &data) == Success) && (realtype != None)) { XFree (data); return true; } return false; } ukui-control-center/plugins/devices/touchpad/touchpad.ui0000644000175000017500000002237313630066010022471 0ustar fengfeng Touchpad 0 0 775 493 Touchpad 2 0 0 32 60 0 0 Touchpad Settings Qt::Vertical QSizePolicy::Fixed 20 14 0 50 16777215 50 0 16 0 16 0 0 0 0 Enabled touchpad Qt::Horizontal 40 20 0 50 16777215 50 0 16 0 16 0 0 0 0 Disable touchpad while typing Qt::Horizontal 40 20 0 50 16777215 50 0 16 0 16 0 0 0 0 Enable mouse clicks with touchpad Qt::Horizontal 40 20 0 50 16777215 50 0 16 0 16 0 0 0 128 0 128 16777215 Scrolling 0 30 16777215 30 Qt::Vertical 20 40 ukui-control-center/plugins/devices/printer/0000755000175000017500000000000013640364120020174 5ustar fengfengukui-control-center/plugins/devices/printer/printer.pro0000644000175000017500000000077113621411724022410 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-02-28T14:09:42 # #------------------------------------------------- QT += widgets printsupport TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(printer) DESTDIR = ../../../pluginlibs include(../../../env.pri) INCLUDEPATH += \ $$PROJECT_ROOTDIR \ #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ printer.cpp HEADERS += \ printer.h FORMS += \ printer.ui ukui-control-center/plugins/devices/printer/printer.cpp0000644000175000017500000001001613640364120022361 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "printer.h" #include "ui_printer.h" #include #include #include #define ITEMFIXEDHEIGH 58 Printer::Printer(){ ui = new Ui::Printer; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("printer"); pluginType = DEVICES; pluginWidget->setStyleSheet("background: #ffffff;"); ui->addWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->listWidget->setSpacing(0); ui->listWidget->setStyleSheet("QListWidget#listWidget{border: none;}"); initComponent(); } Printer::~Printer() { delete ui; } QString Printer::get_plugin_name(){ return pluginName; } int Printer::get_plugin_type(){ return pluginType; } QWidget *Printer::get_plugin_ui(){ return pluginWidget; } void Printer::plugin_delay_control(){ } void Printer::initComponent(){ ui->addBtn->setIcon(QIcon("://img/plugins/printer/add.png")); ui->addBtn->setIconSize(QSize(48, 48)); QStringList printer = QPrinterInfo::availablePrinterNames(); for (int num = 0; num < printer.count(); num++){ QWidget * baseWidget = new QWidget; baseWidget->setAttribute(Qt::WA_DeleteOnClose); QVBoxLayout * baseVerLayout = new QVBoxLayout(baseWidget); baseVerLayout->setSpacing(0); baseVerLayout->setContentsMargins(0, 0, 0, 8); QWidget * pdWidget = new QWidget(baseWidget); QHBoxLayout * pdHorLayout = new QHBoxLayout(pdWidget); pdHorLayout->setSpacing(8); pdHorLayout->setContentsMargins(16, 0, 0, 0); QLabel * pdIconLabel = new QLabel(pdWidget); QSizePolicy iconSizePolicy = pdIconLabel->sizePolicy(); iconSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); iconSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); pdIconLabel->setSizePolicy(iconSizePolicy); pdIconLabel->setFixedSize(QSize(24, 24)); pdIconLabel->setScaledContents(true); pdIconLabel->setPixmap(QPixmap("://img/plugins/printer/printer.png")); QLabel * pdLabel = new QLabel(pdWidget); QSizePolicy txtSizePolicy = pdLabel->sizePolicy(); txtSizePolicy.setVerticalPolicy(QSizePolicy::Fixed); txtSizePolicy.setHorizontalPolicy(QSizePolicy::Fixed); pdLabel->setSizePolicy(txtSizePolicy); pdLabel->setScaledContents(true); pdLabel->setText(printer.at(num)); pdHorLayout->addWidget(pdIconLabel); pdHorLayout->addWidget(pdLabel); pdHorLayout->addStretch(); pdWidget->setLayout(pdHorLayout); // baseVerLayout->addWidget(pdWidget); baseVerLayout->addStretch(); baseWidget->setLayout(baseVerLayout); QListWidgetItem * item = new QListWidgetItem(ui->listWidget); item->setSizeHint(QSize(ui->listWidget->width(), ITEMFIXEDHEIGH)); ui->listWidget->setItemWidget(item, baseWidget); } connect(ui->addBtn, &QPushButton::clicked, this, [=]{ runExternalApp(); }); } void Printer::runExternalApp(){ QString cmd = "system-config-printer"; QProcess process(this); process.startDetached(cmd); } ukui-control-center/plugins/devices/printer/printer.ui0000644000175000017500000001542613640364120022226 0ustar fengfeng Printer 0 0 800 710 0 0 16777215 16777215 Printer 0 0 0 32 48 550 0 960 16777215 0 0 0 0 0 16 0 0 0 Add Printers And Scanners true 0 60 16777215 60 0 0 0 0 0 16 16 48 48 48 48 0 0 Add printers and scanners true Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 32 0 0 List Of Existing Printers true 16777215 16777215 ukui-control-center/plugins/devices/printer/printer.h0000644000175000017500000000305413621411724022034 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef PRINTER_H #define PRINTER_H #include #include #include "shell/interface.h" namespace Ui { class Printer; } class Printer : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Printer(); ~Printer(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void initComponent(); void runExternalApp(); private: Ui::Printer *ui; QString pluginName; int pluginType; QWidget * pluginWidget; }; #endif // PRINTER_H ukui-control-center/plugins/devices/audio/0000755000175000017500000000000013641405665017625 5ustar fengfengukui-control-center/plugins/devices/audio/audio.pro0000644000175000017500000000104713641405665021452 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-05-30T09:45:54 # #------------------------------------------------- QT += widgets TEMPLATE = lib CONFIG += plugin INCLUDEPATH += ../../.. TARGET = $$qtLibraryTarget(audio) DESTDIR = ../.. include(../../pluginsComponent/pluginsComponent.pri) #DEFINES += QT_DEPRECATED_WARNINGS target.path = $$[QT_INSTALL_PREFIX]/lib/control-center/plugins/ INSTALLS += target SOURCES += \ audio.cpp HEADERS += \ audio.h FORMS += \ audio.ui ukui-control-center/plugins/devices/audio/audio.cpp0000644000175000017500000000373613641405665021443 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "audio.h" #include "ui_audio.h" #include Audio::Audio() { ui = new Ui::Audio; pluginWidget = new CustomWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("audio"); pluginType = DEVICES; connect(ui->soundthemeBtn, SIGNAL(clicked()), this, SLOT(change_soundtheme_page())); connect(ui->preferencesBtn, SIGNAL(clicked()), this, SLOT(change_preference_page())); connect(ui->soundsettingsBtn, SIGNAL(clicked()), this, SLOT(sound_settings_btn_clicked_slot())); } Audio::~Audio() { delete ui; } QString Audio::get_plugin_name(){ return pluginName; } int Audio::get_plugin_type(){ return pluginType; } CustomWidget *Audio::get_plugin_ui(){ return pluginWidget; } void Audio::plugin_delay_control(){ } void Audio::change_soundtheme_page(){ ui->StackedWidget->setCurrentIndex(1); } void Audio::change_preference_page(){ ui->StackedWidget->setCurrentIndex(2); } void Audio::sound_settings_btn_clicked_slot(){ QString cmd = "ukui-volume-control"; QProcess process(this); process.startDetached(cmd); } ukui-control-center/plugins/devices/audio/audio.ui0000644000175000017500000006043613641405665021276 0ustar fengfeng Audio 0 0 800 710 0 0 16777215 16777215 Audio 0 0 0 0 0 3 800 710 800 710 25 20 25 0 0 25 0 0 Sound Settings true title1# 694 42 694 42 Configure sound preferences, sound effects, inputs, outputs, applications 120 30 120 30 Sound settings false Qt::Horizontal 40 20 Qt::Vertical 20 40 Output Select output device Qt::Horizontal 40 20 Volume Qt::Horizontal Mute Qt::Horizontal 40 20 Soundtrack balance left Qt::Horizontal right Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 40 Input Select input device Qt::Horizontal 40 20 Volume Qt::Horizontal Mute Qt::Horizontal 40 20 Input level 24 Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 40 Other Sound Options soundtheme true Qt::Horizontal 40 20 app volume and device preferences true Qt::Horizontal 40 20 Qt::Vertical 20 40 Sound Themes select theme Qt::Horizontal 40 20 600 50 600 50 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">To change the sound, click the item in the list below, and then select the sound you want to apply</p></body></html> Qt::Vertical QSizePolicy::Fixed 20 40 Program events 600 300 600 300 true 0 0 598 298 0 0 0 0 select sound Test Apply Qt::Horizontal 40 20 Qt::Vertical 20 40 Main Volume Qt::Horizontal Mute Qt::Horizontal 40 20 600 50 600 50 Qt::Vertical QSizePolicy::Fixed 20 40 App Volume 600 150 600 150 Reset Qt::Horizontal 40 20 Qt::Vertical 20 40 ukui-control-center/plugins/devices/audio/audio.h0000644000175000017500000000330413641405665021077 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef AUDIO_H #define AUDIO_H #include #include #include #include "mainui/interface.h" #include #include "../../pluginsComponent/customwidget.h" namespace Ui { class Audio; } class Audio : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: Audio(); ~Audio(); QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; CustomWidget * get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; private: Ui::Audio *ui; QString pluginName; int pluginType; CustomWidget * pluginWidget; private slots: void change_soundtheme_page(); void change_preference_page(); void sound_settings_btn_clicked_slot(); }; #endif // AUDIO_H ukui-control-center/plugins/devices/keyboard/0000755000175000017500000000000013640373121020312 5ustar fengfengukui-control-center/plugins/devices/keyboard/keyboardlayout.h0000644000175000017500000000266013621411724023526 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KEYBOARDLAYOUT_H #define KEYBOARDLAYOUT_H #include #include /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif typedef struct _Layout Layout; struct _Layout{ QString desc; QString name; }; class KeyboardLayout : public QWidget { Q_OBJECT public: explicit KeyboardLayout(); ~KeyboardLayout(); void data_init(); QString kbd_get_description_by_id(const char *visible); }; #endif // KEYBOARDLAYOUT_H ukui-control-center/plugins/devices/keyboard/org.ukui.control-center.keybinding.gschema.xml0000644000175000017500000000137213621411724031270 0ustar fengfeng '' Keybinding Keybinding associated with a custom shortcut. '' Command Command associated with a custom keybinding. '' Name Description associated with a custom keybinding. ukui-control-center/plugins/devices/keyboard/kbdlayoutmanager.h0000644000175000017500000000451713621411724024024 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KBDLAYOUTMANAGER_H #define KBDLAYOUTMANAGER_H #include #include #include #include /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif typedef struct _Layout Layout; struct _Layout{ QString desc; QString name; }; namespace Ui { class KbdLayoutManager; } class KbdLayoutManager : public QDialog { Q_OBJECT public: explicit KbdLayoutManager(QStringList ll, QWidget *parent = 0); ~KbdLayoutManager(); QString kbd_get_description_by_id(const char *visible); void kbd_trigger_available_countries(char * countryid); void kbd_trigger_available_languages(char * languageid); void component_init(); void setup_component(); void rebuild_listwidget(); void add_layout(QString layout); void delete_layout(QString layout); void refresh_variant_combobox(); void refresh_widget_status(); void rebuild_variant_combobox(); private: Ui::KbdLayoutManager *ui; QStringList layoutsList; QGSettings * kbdsettings; Q_SIGNALS: void rebuild_variant_signals(bool type, QString id); void add_new_variant_signals(QString id); void del_variant_signals(QString id); private slots: void countries_changed_slot(int index); void languages_changed_slot(int index); void rebuild_variant_slots(bool type, QString id); }; #endif // KBDLAYOUTMANAGER_H ukui-control-center/plugins/devices/keyboard/kbdlayoutmanager.ui0000644000175000017500000001705713621411724024215 0ustar fengfeng KbdLayoutManager 0 0 742 432 742 432 742 432 Form 30 25 35 25 10 330 0 330 16777215 10 C buttonGroup 0 0 0 0 0 0 32 16777215 32 Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 20 L buttonGroup 0 0 0 0 0 0 32 16777215 32 Qt::Horizontal 40 20 Qt::Vertical 20 40 10 Variant 0 32 16777215 32 Qt::Horizontal 40 20 0 32 16777215 32 Add Qt::Vertical 20 40 ukui-control-center/plugins/devices/keyboard/keyboard.pro0000644000175000017500000000157113630066010022633 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-08-22T11:12:59 # #------------------------------------------------- QT += widgets x11extras #greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(keyboard) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lgsettings-qt CONFIG += link_pkgconfig \ C++11 PKGCONFIG += libmatekbd \ #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ keyboardcontrol.cpp \ kbdlayoutmanager.cpp HEADERS += \ keyboardcontrol.h \ kbdlayoutmanager.h FORMS += \ keyboardcontrol.ui \ kbdlayoutmanager.ui ukui-control-center/plugins/devices/keyboard/kbdlayoutmanager.cpp0000644000175000017500000002456713635333016024370 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "kbdlayoutmanager.h" #include "ui_kbdlayoutmanager.h" #include extern "C" { #include #include } #define MAXNUM 4 #define KBD_LAYOUTS_SCHEMA "org.mate.peripherals-keyboard-xkb.kbd" #define KBD_LAYOUTS_KEY "layouts" XklEngine * engine; XklConfigRegistry * config_registry; static void kbd_set_countries(XklConfigRegistry *config_registry, XklConfigItem *config_item, QList *list); static void kbd_set_languages(XklConfigRegistry *config_registry, XklConfigItem *config_item, QList *list); static void kbd_set_available_countries(XklConfigRegistry *config_registry, XklConfigItem * parent_config_item, XklConfigItem *config_item, QList *list); static void kbd_set_available_languages(XklConfigRegistry *config_registry, XklConfigItem * parent_config_item, XklConfigItem *config_item, QList *list); QList languages; QList countries; QStringList availablelayoutsList; KbdLayoutManager::KbdLayoutManager(QStringList ll, QWidget *parent) : QDialog(parent), ui(new Ui::KbdLayoutManager), layoutsList(ll) { ui->setupUi(this); engine = xkl_engine_get_instance (QX11Info::display()); config_registry = xkl_config_registry_get_instance (engine); xkl_config_registry_load (config_registry, false); xkl_config_registry_foreach_country(config_registry,(ConfigItemProcessFunc)kbd_set_countries, NULL); xkl_config_registry_foreach_language(config_registry,(ConfigItemProcessFunc)kbd_set_languages, NULL); const QByteArray id(KBD_LAYOUTS_SCHEMA); kbdsettings = new QGSettings(id); component_init(); setup_component(); } KbdLayoutManager::~KbdLayoutManager() { delete ui; delete kbdsettings; } void KbdLayoutManager::component_init(){ ui->countryRadioButton->setChecked(true); // init listwidget intalled //设置listwidget无点击 ui->listWidget->setFocusPolicy(Qt::NoFocus); ui->listWidget->setSelectionMode(QAbstractItemView::NoSelection); rebuild_listwidget(); // for (QString layout : layoutsList){ // create_listwidgetitem(layout); // QString desc = kbd_get_description_by_id(const_cast(layout.toLatin1().data())); // QListWidgetItem * item = new QListWidgetItem(ui->listWidget); // item->setText(desc); // item->setData(Qt::UserRole, layout); // ui->listWidget->addItem(item); // } // init country comboBox for (Layout keylayout : countries){ ui->countryComboBox->addItem(keylayout.desc, keylayout.name); } // init language comboBox for (Layout keylayout : languages){ ui->languageComboBox->addItem(keylayout.desc, keylayout.name); } refresh_widget_status(); } void KbdLayoutManager::setup_component(){ connect(ui->countryComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(countries_changed_slot(int))); connect(ui->languageComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(languages_changed_slot(int))); connect(this, SIGNAL(rebuild_variant_signals(bool,QString)), this, SLOT(rebuild_variant_slots(bool,QString))); connect(ui->buttonGroup, QOverload::of(&QButtonGroup::buttonClicked), [=]{refresh_variant_combobox();refresh_widget_status();}); connect(ui->addBtn, &QPushButton::clicked, [=]{emit add_new_variant_signals(ui->variantComboBox->currentData(Qt::UserRole).toString());}); connect(this, &KbdLayoutManager::add_new_variant_signals, [=](QString id){add_layout(id);}); connect(this, &KbdLayoutManager::del_variant_signals, [=](QString id){delete_layout(id);}); refresh_variant_combobox(); } void KbdLayoutManager::rebuild_listwidget(){ //最多4个布局,来自GTK控制面板,原因未知 QStringList layouts = kbdsettings->get(KBD_LAYOUTS_KEY).toStringList(); if (layouts.length() >= MAXNUM) ui->addBtn->setEnabled(false); else ui->addBtn->setEnabled(true); ui->listWidget->clear(); for (QString layout : layouts){ QString desc = kbd_get_description_by_id(const_cast(layout.toLatin1().data())); //自定义widget QWidget * layoutWidget = new QWidget(); layoutWidget->setAttribute(Qt::WA_DeleteOnClose); layoutWidget->setStyleSheet("QWidget{border-bottom: 1px solid #f5f6f7}"); QHBoxLayout * mainHLayout = new QHBoxLayout(layoutWidget); QLabel * layoutLabel = new QLabel(layoutWidget); QPushButton * layoutdelBtn = new QPushButton(layoutWidget); layoutdelBtn->setIcon(QIcon("://keyboardcontrol/delete.png")); layoutdelBtn->setText(tr("Del")); layoutdelBtn->setStyleSheet("" "QPushButton{background: #FA6056; border-radius: 2px;}" "QPushButton:hover:pressed{background: #E54A50; border-radius: 2px;}"); connect(layoutdelBtn, &QPushButton::clicked, this, [=]{emit del_variant_signals(layout);}); mainHLayout->addWidget(layoutLabel); mainHLayout->addStretch(); mainHLayout->addWidget(layoutdelBtn); layoutWidget->setLayout(mainHLayout); QListWidgetItem * item = new QListWidgetItem(ui->listWidget); item->setData(Qt::UserRole, layout); item->setSizeHint(QSize(328, 36)); //330 - 2 layoutLabel->setText(desc); ui->listWidget->addItem(item); ui->listWidget->setItemWidget(item, layoutWidget); } } void KbdLayoutManager::add_layout(QString layout){ QStringList layouts = kbdsettings->get(KBD_LAYOUTS_KEY).toStringList(); layouts.append(layout); kbdsettings->set(KBD_LAYOUTS_KEY, layouts); rebuild_listwidget(); } void KbdLayoutManager::delete_layout(QString layout){ QStringList layouts = kbdsettings->get(KBD_LAYOUTS_KEY).toStringList(); layouts.removeOne(layout); kbdsettings->set(KBD_LAYOUTS_KEY, layouts); rebuild_listwidget(); } void KbdLayoutManager::refresh_variant_combobox(){ if (ui->countryRadioButton->isChecked()){ QString id = ui->countryComboBox->currentData(Qt::UserRole).toString(); emit rebuild_variant_signals(true, id); } else{ QString id = ui->languageComboBox->currentData(Qt::UserRole).toString(); emit rebuild_variant_signals(false, id); } } void KbdLayoutManager::refresh_widget_status(){ ui->countryWidget->setEnabled(ui->countryRadioButton->isChecked()); ui->languageWidget->setEnabled(ui->languageRadioButton->isChecked()); } void KbdLayoutManager::rebuild_variant_combobox(){ ui->variantComboBox->clear(); for (QString name : availablelayoutsList){ QString desc = kbd_get_description_by_id(const_cast(name.toLatin1().data())); ui->variantComboBox->addItem(desc, name); } } void KbdLayoutManager::kbd_trigger_available_countries(char *countryid){ xkl_config_registry_foreach_country_variant (config_registry, countryid, (TwoConfigItemsProcessFunc)kbd_set_available_countries, NULL); } void KbdLayoutManager::kbd_trigger_available_languages(char *languageid){ xkl_config_registry_foreach_language_variant (config_registry, languageid, (TwoConfigItemsProcessFunc)kbd_set_available_languages, NULL); } QString KbdLayoutManager::kbd_get_description_by_id(const char *visible){ char *l, *sl, *v, *sv; if (matekbd_keyboard_config_get_descriptions(config_registry, visible, &sl, &l, &sv, &v)) visible = matekbd_keyboard_config_format_full_layout (l, v); return QString(const_cast(visible)); } void KbdLayoutManager::countries_changed_slot(int index){ Q_UNUSED(index); QString id = ui->countryComboBox->currentData().toString(); emit rebuild_variant_signals(true, id); } void KbdLayoutManager::languages_changed_slot(int index){ Q_UNUSED(index); QString id = ui->languageComboBox->currentData().toString(); emit rebuild_variant_signals(false, id); } void KbdLayoutManager::rebuild_variant_slots(bool type, QString id){ availablelayoutsList.clear(); char * iid = id.toLatin1().data(); if (type) kbd_trigger_available_countries(iid); else kbd_trigger_available_languages(iid); rebuild_variant_combobox(); } static void kbd_set_countries(XklConfigRegistry *config_registry, XklConfigItem *config_item, QList *list){ Q_UNUSED(config_registry); Q_UNUSED(list); Layout item; item.desc = config_item->description; item.name = config_item->name; // qDebug()<<"countries" << "desc = "<append(item); countries.append(item); } static void kbd_set_languages(XklConfigRegistry *config_registry, XklConfigItem *config_item, QList *list){ Q_UNUSED(config_registry); Q_UNUSED(list); Layout item; item.desc = config_item->description; item.name = config_item->name; // qDebug()<<"languages" << "desc = "<append(item); languages.append(item); } static void kbd_set_available_countries(XklConfigRegistry *config_registry, XklConfigItem * parent_config_item, XklConfigItem *config_item, QList *list){ Q_UNUSED(config_registry); Q_UNUSED(list); const gchar *xkb_id = config_item ? matekbd_keyboard_config_merge_items (parent_config_item->name, config_item->name) : parent_config_item->name; availablelayoutsList.append(QString(const_cast(xkb_id))); } static void kbd_set_available_languages(XklConfigRegistry *config_registry, XklConfigItem *parent_config_item, XklConfigItem *config_item, QList *list){ Q_UNUSED(list); kbd_set_available_countries(config_registry, parent_config_item, config_item, NULL); } ukui-control-center/plugins/devices/keyboard/keyboardcontrol.cpp0000644000175000017500000001507713640373121024231 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "keyboardcontrol.h" #include "ui_keyboardcontrol.h" #include #include #define KEYBOARD_SCHEMA "org.ukui.peripherals-keyboard" #define REPEAT_KEY "repeat" #define DELAY_KEY "delay" #define RATE_KEY "rate" #define KBD_LAYOUTS_SCHEMA "org.mate.peripherals-keyboard-xkb.kbd" #define KBD_LAYOUTS_KEY "layouts" KeyboardControl::KeyboardControl() { ui = new Ui::KeyboardControl; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("keyboard"); pluginType = DEVICES; settingsCreate = false; setupStylesheet(); setupComponent(); //初始化键盘通用设置GSettings const QByteArray id(KEYBOARD_SCHEMA); //初始化键盘布局GSettings const QByteArray idd(KBD_LAYOUTS_SCHEMA); if (QGSettings::isSchemaInstalled(id) && QGSettings::isSchemaInstalled(idd)){ settingsCreate = true; kbdsettings = new QGSettings(idd); settings = new QGSettings(id); //构建布局管理器对象 layoutmanagerObj = new KbdLayoutManager(kbdsettings->get(KBD_LAYOUTS_KEY).toStringList()); setupConnect(); initGeneralStatus(); rebuildLayoutsComBox(); } } KeyboardControl::~KeyboardControl() { delete ui; if (settingsCreate){ delete kbdsettings; delete settings; } } QString KeyboardControl::get_plugin_name(){ return pluginName; } int KeyboardControl::get_plugin_type(){ return pluginType; } QWidget *KeyboardControl::get_plugin_ui(){ return pluginWidget; } void KeyboardControl::plugin_delay_control(){ } void KeyboardControl::setupStylesheet(){ pluginWidget->setStyleSheet("background: #ffffff;"); ui->repeatWidget_0->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->repeatWidget_1->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->repeatWidget_2->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->repeatWidget_3->setStyleSheet("QWidget#repeatWidget_3{background: #F4F4F4; border-radius: 6px;}"); ui->repeatLabel_3->setStyleSheet("QLabel{background: #F4F4F4; font-size: 14px; color: #D9000000;}"); ui->repeatWidget_4->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->repeatWidget_5->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->layoutWidget_0->setStyleSheet("QWidget#layoutWidget_0{background: #F4F4F4; border-radius: 6px;}"); ui->layoutLabel_0->setStyleSheet("QLabel{background: #F4F4F4; font-size: 14px; color: #D9000000;}"); ui->layoutWidget_1->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); } void KeyboardControl::setupComponent(){ //构建Combox代理,否则样式不全部生效 itemDelege = new QStyledItemDelegate(); //隐藏未开发功能 ui->repeatWidget_4->hide(); ui->repeatWidget_5->hide(); //重复输入开关按钮 keySwitchBtn = new SwitchButton(pluginWidget); ui->enableHorLayout->addWidget(keySwitchBtn); //大写锁定开关按钮 capsLockSwitchBtn = new SwitchButton(pluginWidget); ui->capsLockHorLayout->addWidget(capsLockSwitchBtn); //小键盘开关按钮 numLockSwitchBtn = new SwitchButton(pluginWidget); ui->numLockHorLayout->addWidget(numLockSwitchBtn); //布局代理 ui->layoutsComBox->setItemDelegate(itemDelege); ui->layoutsComBox->setMaxVisibleItems(5); ui->addBtn->setIcon(QIcon("://img/plugins/keyboardcontrol/add.png")); ui->addBtn->setIconSize(QSize(48, 48)); } void KeyboardControl::setupConnect(){ connect(keySwitchBtn, &SwitchButton::checkedChanged, this, [=](bool checked){ settings->set(REPEAT_KEY, checked); }); connect(ui->delayHorSlider, &QSlider::valueChanged, this, [=](int value){ settings->set(DELAY_KEY, value); }); connect(ui->speedHorSlider, &QSlider::valueChanged, this, [=](int value){ settings->set(RATE_KEY, value); }); connect(ui->addBtn, &QPushButton::clicked, this, [=]{ layoutmanagerObj->exec(); }); connect(layoutmanagerObj, &KbdLayoutManager::del_variant_signals, [=](QString layout){ rebuildLayoutsComBox(); qDebug() << layout; }); connect(layoutmanagerObj, &KbdLayoutManager::add_new_variant_signals, [=](QString layout){ rebuildLayoutsComBox(); }); connect(ui->layoutsComBox, QOverload::of(&QComboBox::currentIndexChanged), [=](int index){ QStringList layoutsList; layoutsList.append(ui->layoutsComBox->currentData(Qt::UserRole).toString()); for (int i = 0; i < ui->layoutsComBox->count(); i++){ QString id = ui->layoutsComBox->itemData(i, Qt::UserRole).toString(); if (i != index) //跳过当前item layoutsList.append(id); } kbdsettings->set(KBD_LAYOUTS_KEY, layoutsList); }); } void KeyboardControl::initGeneralStatus(){ //设置按键重复状态 keySwitchBtn->setChecked(settings->get(REPEAT_KEY).toBool()); //设置按键重复的延时 ui->delayHorSlider->setValue(settings->get(DELAY_KEY).toInt()); //设置按键重复的速度 ui->speedHorSlider->setValue(settings->get(RATE_KEY).toInt()); } void KeyboardControl::rebuildLayoutsComBox(){ QStringList layouts = kbdsettings->get(KBD_LAYOUTS_KEY).toStringList(); ui->layoutsComBox->blockSignals(true); //清空键盘布局下拉列表 ui->layoutsComBox->clear(); //重建键盘布局下拉列表 for (QString layout : layouts){ ui->layoutsComBox->addItem(layoutmanagerObj->kbd_get_description_by_id(const_cast(layout.toLatin1().data())), layout); } ui->layoutsComBox->blockSignals(false); } ukui-control-center/plugins/devices/keyboard/keyboardcontrol.ui0000644000175000017500000007553613640364120024071 0ustar fengfeng KeyboardControl 0 0 642 658 0 0 16777215 16777215 0 0 0 32 48 550 0 960 16777215 0 0 0 0 0 16 0 0 0 Keys Settings true 2 0 0 50 16777215 50 0 0 0 0 0 0 16 16 0 0 Enable repeat key true Qt::Horizontal 40 20 0 50 16777215 50 0 0 0 0 0 16 16 16 0 0 128 0 128 16777215 Delay 0 0 Short QSlider{ width: 178px; height: 20px; } QSlider::groove:horizontal { border: 0px solid #bbb; } QSlider::sub-page:horizontal { background: #3D6BE5; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::add-page:horizontal { background: rgba(52,70,80,90%); border: 0px solid #777; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::handle:horizontal { width: 20px; height: 20px; background: #3D6BE5; border-radius:10px; } 100 2100 1 Qt::Horizontal 0 0 Long 0 50 16777215 50 0 0 0 0 0 16 16 16 0 0 128 0 128 16777215 Speed 0 0 Slow QSlider{ width: 178px; height: 20px; } QSlider::groove:horizontal { border: 0px solid #bbb; } QSlider::sub-page:horizontal { background: #3D6BE5; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::add-page:horizontal { background: rgba(52,70,80,90%); border: 0px solid #777; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::handle:horizontal { width: 20px; height: 20px; background: #3D6BE5; border-radius:10px; } 10 110 1 Qt::Horizontal 0 0 Fast 0 50 16777215 50 0 0 0 0 0 48 16 16 0 0 Test repetition rate of the input character: true Qt::Horizontal 40 20 200 30 200 30 0 50 16777215 50 0 0 0 0 0 0 16 16 0 0 Message of capslock true Qt::Horizontal 40 20 0 50 16777215 50 0 0 0 0 0 0 16 16 0 0 Enable numlock true Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 32 0 0 Keyboard Layout true 8 0 50 16777215 50 0 0 0 0 0 48 16 16 0 0 Keyboard layout true Qt::Horizontal 40 20 260 30 260 30 QComboBox{ background: rgba(255, 255, 255); border: 1px solid rgb(255, 255, 255); font-size:12px; color: black; combobox-popup: 0; /* 配合setMaxVisibleItems设置下拉框显示的条数,超过的滚动显示 */ } QComboBox::down-arrow{ image:url(://img/dropArrow/downpx.png); } QComboBox QAbstractItemView::item { min-height: 30px; border-radius: 2px ; color:black; background-color: rgba(255, 255, 255); } QComboBox QAbstractItemView::item:selected{ background: #3D6BE5; } QComboBox::drop-down{ width: 30px; border: none; } 0 60 16777215 60 0 0 0 0 0 16 16 16 48 48 48 48 0 0 Install layouts true Qt::Horizontal 40 20 ukui-control-center/plugins/devices/keyboard/keyboardcontrol.h0000644000175000017500000000416013640373121023665 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KEYBOARDCONTROL_H #define KEYBOARDCONTROL_H #include #include #include #include "shell/interface.h" #include "SwitchButton/switchbutton.h" #include "kbdlayoutmanager.h" namespace Ui { class KeyboardControl; } class QGSettings; class KeyboardControl : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: KeyboardControl(); ~KeyboardControl() Q_DECL_OVERRIDE; QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget *get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupStylesheet(); void setupComponent(); void setupConnect(); void initGeneralStatus(); void rebuildLayoutsComBox(); private: Ui::KeyboardControl *ui; QString pluginName; int pluginType; QWidget * pluginWidget; private: QGSettings * settings; QGSettings * kbdsettings; SwitchButton * keySwitchBtn; SwitchButton * capsLockSwitchBtn; SwitchButton * numLockSwitchBtn; KbdLayoutManager * layoutmanagerObj; QStyledItemDelegate* itemDelege; private: bool settingsCreate; }; #endif // KEYBOARDCONTROL_H ukui-control-center/plugins/devices/keyboard/keyboardlayout.cpp0000644000175000017500000001053313621411724024057 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "keyboardlayout.h" #include extern "C" { #include #include } XklEngine * engine; XklConfigRegistry * config_registry; static void KeyboardXkb_get_countries(XklConfigRegistry *config_registry, XklConfigItem *config_item, QList *list); static void KeyboardXkb_get_languages(XklConfigRegistry *config_registry, XklConfigItem *config_item, QList *list); static void KeyboardXkb_get_available_countries(XklConfigRegistry *config_registry, XklConfigItem * parent_config_item, XklConfigItem *config_item, QList *list); static void KeyboardXkb_get_available_languages(XklConfigRegistry *config_registry, XklConfigItem * parent_config_item, XklConfigItem *config_item, QList *list); QList languages; QList countries; KeyboardLayout::KeyboardLayout() { data_init(); char * id = QString("ee").toLatin1().data(); QString desc = kbd_get_description_by_id(id); } KeyboardLayout::~KeyboardLayout() { } void KeyboardLayout::data_init(){ engine = xkl_engine_get_instance (QX11Info::display()); config_registry = xkl_config_registry_get_instance (engine); xkl_config_registry_load (config_registry, false); xkl_config_registry_foreach_country(config_registry,(ConfigItemProcessFunc)KeyboardXkb_get_countries, NULL); xkl_config_registry_foreach_language(config_registry,(ConfigItemProcessFunc)KeyboardXkb_get_languages, NULL); // char * country_id = QString("EE").toLatin1().data(); // xkl_config_registry_foreach_country_variant (config_registry, country_id, (TwoConfigItemsProcessFunc)KeyboardXkb_get_available_countries, NULL); // char * language_id = QString("est").toLatin1().data(); // xkl_config_registry_foreach_language_variant (config_registry, language_id, (TwoConfigItemsProcessFunc)KeyboardXkb_get_available_languages, NULL); } QString KeyboardLayout::kbd_get_description_by_id(const char *visible){ char *l, *sl, *v, *sv; if (matekbd_keyboard_config_get_descriptions(config_registry, visible, &sl, &l, &sv, &v)) visible = matekbd_keyboard_config_format_full_layout (l, v); return QString(const_cast(visible)); } static void KeyboardXkb_get_countries(XklConfigRegistry *config_registry, XklConfigItem *config_item, QList *list){ Layout item; item.desc = config_item->description; item.name = config_item->name; qDebug()<<"countries" << "desc = "<append(item); countries.append(item); } static void KeyboardXkb_get_languages(XklConfigRegistry *config_registry, XklConfigItem *config_item, QList *list){ Layout item; item.desc = config_item->description; item.name = config_item->name; qDebug()<<"languages" << "desc = "<append(item); languages.append(item); } static void KeyboardXkb_get_available_countries(XklConfigRegistry *config_registry, XklConfigItem * parent_config_item, XklConfigItem *config_item, QList *list){ const gchar *xkb_id = config_item ? matekbd_keyboard_config_merge_items (parent_config_item->name, config_item->name) : parent_config_item->name; g_warning("------------->%s", xkb_id); } static void KeyboardXkb_get_available_languages(XklConfigRegistry *config_registry, XklConfigItem *parent_config_item, XklConfigItem *config_item, QList *list){ KeyboardXkb_get_available_countries(config_registry, parent_config_item, config_item, NULL); } ukui-control-center/plugins/devices/mousecontrol/0000755000175000017500000000000013621411724021244 5ustar fengfengukui-control-center/plugins/devices/mousecontrol/mousecontrol.pro0000644000175000017500000000137513556706375024545 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-08-22T11:12:59 # #------------------------------------------------- QT += widgets x11extras #greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = $$qtLibraryTarget(mousecontrol) TEMPLATE = lib CONFIG += plugin INCLUDEPATH += ../../.. \ /usr/include/kylinsdk \ LIBS += -L/usr/lib/ -lmouseclient -ltouchpadclient -lXi -lgsettings-qt DESTDIR = ../.. include(../../pluginsComponent/pluginsComponent.pri) target.path = $$[QT_INSTALL_PREFIX]/lib/control-center/plugins/ INSTALLS += target #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ mousecontrol.cpp HEADERS += \ mousecontrol.h FORMS += \ mousecontrol.ui ukui-control-center/plugins/devices/mousecontrol/mousecontrol.cpp0000644000175000017500000003474613621411724024517 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "mousecontrol.h" #include "ui_mousecontrol.h" #include //放在.h中报错,放.cpp不报错 extern "C" { #include #include //#include } #define NONE_ID 0 #define CURSORSIZE_SMALLER 18 #define CURSORSIZE_MEDIUM 32 #define CURSORSIZE_LARGER 48 XDevice* _device_is_touchpad (XDeviceInfo * deviceinfo); bool _device_has_property (XDevice * device, const char * property_name); struct KindsRolling : QObjectUserData{ QString kind; }; MouseControl::MouseControl() { ui = new Ui::MouseControl; pluginWidget = new CustomWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("mousecontrol"); pluginType = DEVICES; // const QByteArray id(TOUCHPAD_SCHEMA); // tpsettings = new QGSettings(id); const QByteArray idd(GNOME_TOUCHPAD_SCHEMA); gnomeSettings = new QGSettings(idd); InitDBusMouse(); component_init(); status_init(); } MouseControl::~MouseControl() { delete ui; DeInitDBusMouse(); } QString MouseControl::get_plugin_name(){ return pluginName; } int MouseControl::get_plugin_type(){ return pluginType; } CustomWidget * MouseControl::get_plugin_ui(){ return pluginWidget; } void MouseControl::plugin_delay_control(){ } void MouseControl::component_init(){ // ui->lefthandbuttonGroup->setId(ui->rightRadioBtn, 0); ui->lefthandbuttonGroup->setId(ui->leftRadioBtn, 1); // Cursors themes QStringList themes = _get_cursors_themes(); ui->CursorthemesComboBox->addItem(tr("Default")); ui->CursorthemesComboBox->addItems(themes); // add switchbtn for active touchpad activeBtn = new SwitchButton(pluginWidget); ui->activeHLayout->addWidget(activeBtn); ui->activeHLayout->addStretch(); //无接口可用暂时屏蔽鼠标滚轮设置 // for (int i = 0; i < ui->horizontalLayout_2->count(); ++i) { // QLayoutItem * it = ui->horizontalLayout_2->itemAt(i); //// it->widget()->hide(); //这种遍历无法得知类型,弹簧控件没有hide方法,导致段错误 // } ui->label_3->hide(); ui->comboBox->hide(); ui->label_4->hide(); ui->checkBox->hide(); //不存在触摸板设备,则隐藏触摸板设置按钮 if (!find_synaptics()) ui->touchpadBtn->hide(); // hide helper radiobutton ui->noneRadioButton->hide(); // set buttongroup id ui->rollingbuttonGroup->setId(ui->noneRadioButton, NONE_ID); // set user data rolling radiobutton KindsRolling * vedge = new KindsRolling(); vedge->kind = V_EDGE_KEY; ui->vedgeRadioBtn->setUserData(Qt::UserRole, vedge); KindsRolling * hedge = new KindsRolling(); hedge->kind = H_EDGE_KEY; ui->hedgeRadioBtn->setUserData(Qt::UserRole, hedge); KindsRolling * vfinger = new KindsRolling(); vfinger->kind = V_FINGER_KEY; ui->vfingerRadioBtn->setUserData(Qt::UserRole, vfinger); KindsRolling * hfinger = new KindsRolling(); hfinger->kind = H_FINGER_KEY; ui->hfingerRadioBtn->setUserData(Qt::UserRole, hfinger); // set buttongroup id ui->cursorsizebuttonGroup->setId(ui->smallerRadioBtn, CURSORSIZE_SMALLER); ui->cursorsizebuttonGroup->setId(ui->mediumRadioBtn, CURSORSIZE_MEDIUM); ui->cursorsizebuttonGroup->setId(ui->largerRadioBtn, CURSORSIZE_LARGER); } void MouseControl::status_init(){ if (kylin_hardware_mouse_get_lefthanded()) ui->leftRadioBtn->setChecked(true); else ui->rightRadioBtn->setChecked(true); //cursor theme QString curtheme = kylin_hardware_mouse_get_cursortheme(); if (curtheme == "") ui->CursorthemesComboBox->setCurrentIndex(0); else ui->CursorthemesComboBox->setCurrentText(curtheme); double mouse_acceleration = kylin_hardware_mouse_get_motionacceleration();//当前系统指针加速值,-1为系统默认 int mouse_threshold = kylin_hardware_mouse_get_motionthreshold();//当前系统指针灵敏度,-1为系统默认 //当从接口获取的是-1,则代表系统默认值,真实值需要从底层获取 if (mouse_threshold == -1 || static_cast(mouse_acceleration) == -1){ // speed sensitivity int accel_numerator, accel_denominator, threshold; //当加速值和灵敏度为系统默认的-1时,从底层获取到默认的具体值 XGetPointerControl(QX11Info::display(), &accel_numerator, &accel_denominator, &threshold); qDebug() << "--->" << accel_numerator << accel_denominator << threshold; kylin_hardware_mouse_set_motionacceleration(static_cast(accel_numerator/accel_denominator)); kylin_hardware_mouse_set_motionthreshold(threshold); } //set speed // qDebug() << kylin_hardware_mouse_get_motionacceleration() << kylin_hardware_mouse_get_motionthreshold(); ui->speedSlider->setValue(static_cast(kylin_hardware_mouse_get_motionacceleration())*100); //set sensitivity ui->sensitivitySlider->setValue(kylin_hardware_mouse_get_motionthreshold()*100); //set visibility position ui->posCheckBtn->setChecked(kylin_hardware_mouse_get_locatepointer()); connect(ui->CursorthemesComboBox, SIGNAL(currentTextChanged(QString)), this, SLOT(cursor_themes_changed_slot(QString))); connect(ui->lefthandbuttonGroup, SIGNAL(buttonClicked(int)), this, SLOT(mouseprimarykey_changed_slot(int))); connect(ui->speedSlider, SIGNAL(valueChanged(int)), this, SLOT(speed_value_changed_slot(int))); connect(ui->sensitivitySlider, SIGNAL(valueChanged(int)), this, SLOT(sensitivity_value_changed_slot(int))); connect(ui->posCheckBtn, SIGNAL(clicked(bool)), this, SLOT(show_pointer_position_slot(bool))); connect(ui->touchpadBtn, &QPushButton::clicked, this, [=]{ui->StackedWidget->setCurrentIndex(1);}); connect(ui->cursorBtn, &QPushButton::clicked, this, [=]{ui->StackedWidget->setCurrentIndex(2);}); //touchpad settings // activeBtn->setChecked(tpsettings->get(ACTIVE_TOUCHPAD_KEY).toBool()); if (gnomeSettings->get(GNOME_ACTIVE_TOUCHPAD_KEY).toString() == "enabled") activeBtn->setChecked(true); else activeBtn->setChecked(false); _refresh_touchpad_widget_status(); // disable touchpad when typing // ui->disablecheckBox->setChecked(tpsettings->get(DISABLE_WHILE_TYPING_KEY).toBool()); ui->disablecheckBox->setChecked(gnomeSettings->get(GNOME_DISABLE_WHILE_TYPEING_KEY).toBool()); // enable touchpad click // ui->tpclickcheckBox->setChecked(tpsettings->get(TOUCHPAD_CLICK_KEY).toBool()); ui->tpclickcheckBox->setChecked(gnomeSettings->get(GNOME_TOUCHPAD_CLICK_KEY).toBool()); // scrolling // ui->vedgeRadioBtn->setChecked(tpsettings->get(V_EDGE_KEY).toBool()); // ui->hedgeRadioBtn->setChecked(tpsettings->get(H_EDGE_KEY).toBool()); // ui->vfingerRadioBtn->setChecked(tpsettings->get(V_FINGER_KEY).toBool()); // ui->hfingerRadioBtn->setChecked(tpsettings->get(H_FINGER_KEY).toBool()); // ui->noneRadioButton->setChecked(false); // if (ui->rollingbuttonGroup->checkedButton() == nullptr) // ui->rollingCheckBtn->setChecked(true); // else // ui->rollingCheckBtn->setChecked(false); // _refresh_rolling_btn_status(); ui->rollingCheckBtn->setChecked(!(gnomeSettings->get(GNOME_SCROLLING_EDGE_KEY).toBool() || gnomeSettings->get(GNOME_SCROLLING_TWO_KEY).toBool())); ui->rollingWidget->hide(); connect(activeBtn, SIGNAL(checkedChanged(bool)), this, SLOT(active_touchpad_changed_slot(bool))); connect(ui->disablecheckBox, SIGNAL(clicked(bool)), this, SLOT(disable_while_typing_clicked_slot(bool))); connect(ui->tpclickcheckBox, SIGNAL(clicked(bool)), this, SLOT(touchpad_click_clicked_slot(bool))); connect(ui->rollingCheckBtn, SIGNAL(clicked(bool)), this, SLOT(rolling_enable_clicked_slot(bool))); // connect(ui->rollingbuttonGroup, SIGNAL(buttonToggled(QAbstractButton*,bool)), this, SLOT(rolling_kind_changed_slot(QAbstractButton*, bool))); //cursor settings int cursorsize = kylin_hardware_mouse_get_cursorsize(); if (cursorsize <= CURSORSIZE_SMALLER) ui->smallerRadioBtn->setChecked(true); else if (cursorsize <= CURSORSIZE_MEDIUM) ui->mediumRadioBtn->setChecked(true); else ui->largerRadioBtn->setChecked(true); connect(ui->cursorsizebuttonGroup, SIGNAL(buttonToggled(int,bool)), this, SLOT(cursor_size_changed_slot())); //reset connect(ui->resetBtn, &QPushButton::clicked, this, [=]{ui->smallerRadioBtn->setChecked(true);}); } bool MouseControl::find_synaptics(){ XDeviceInfo *device_info; int n_devices; bool retval; if (_supports_xinput_devices() == false) return true; device_info = XListInputDevices (QX11Info::display(), &n_devices); if (device_info == nullptr) return false; retval = false; for (int i = 0; i < n_devices; i++) { XDevice *device; device = _device_is_touchpad (&device_info[i]); if (device != nullptr) { retval = true; break; } } if (device_info != nullptr) XFreeDeviceList (device_info); return retval; } XDevice* _device_is_touchpad (XDeviceInfo *deviceinfo) { XDevice *device; if (deviceinfo->type != XInternAtom (QX11Info::display(), XI_TOUCHPAD, true)) return nullptr; device = XOpenDevice (QX11Info::display(), deviceinfo->id); if(device == nullptr) { qDebug()<<"device== null"; return nullptr; } if (_device_has_property (device, "libinput Tapping Enabled") || _device_has_property (device, "Synaptics Off")) { return device; } XCloseDevice (QX11Info::display(), device); return nullptr; } bool _device_has_property (XDevice * device, const char * property_name){ Atom realtype, prop; int realformat; unsigned long nitems, bytes_after; unsigned char *data; prop = XInternAtom (QX11Info::display(), property_name, True); if (!prop) return false; if ((XGetDeviceProperty (QX11Info::display(), device, prop, 0, 1, False, XA_INTEGER, &realtype, &realformat, &nitems, &bytes_after, &data) == Success) && (realtype != None)) { XFree (data); return true; } return false; } bool MouseControl::_supports_xinput_devices(){ int op_code, event, error; return XQueryExtension (QX11Info::display(), "XInputExtension", &op_code, &event, &error); } QStringList MouseControl::_get_cursors_themes(){ QStringList themes; QDir themesDir(CURSORS_THEMES_PATH); if (themesDir.exists()){ foreach (QString dirname, themesDir.entryList(QDir::Dirs)){ if (dirname == "." || dirname == "..") continue; QString fullpath(CURSORS_THEMES_PATH + dirname); QDir themeDir(CURSORS_THEMES_PATH + dirname + "/cursors/"); if (themeDir.exists()) themes.append(dirname); } } return themes; } void MouseControl::_refresh_touchpad_widget_status(){ if (activeBtn->isChecked()) ui->touchpadWidget->show(); else ui->touchpadWidget->hide(); } void MouseControl::_refresh_rolling_btn_status(){ if (ui->rollingCheckBtn->isChecked()) ui->rollingWidget->hide(); else ui->rollingWidget->show(); } void MouseControl::mouseprimarykey_changed_slot(int id){ kylin_hardware_mouse_set_lefthanded(id); } void MouseControl::cursor_themes_changed_slot(QString text){ QString value = text; if (text == tr("Default")) value = ""; QByteArray ba = value.toLatin1(); kylin_hardware_mouse_set_cursortheme(ba.data()); } void MouseControl::speed_value_changed_slot(int value){ kylin_hardware_mouse_set_motionacceleration(static_cast(value/ui->speedSlider->maximum()*10)); } void MouseControl::sensitivity_value_changed_slot(int value){ kylin_hardware_mouse_set_motionthreshold(10*value/ui->sensitivitySlider->maximum()); } void MouseControl::show_pointer_position_slot(bool status){ kylin_hardware_mouse_set_locatepointer(status); } void MouseControl::active_touchpad_changed_slot(bool status){ // tpsettings->set(ACTIVE_TOUCHPAD_KEY, status); if (status) gnomeSettings->set(GNOME_ACTIVE_TOUCHPAD_KEY, "enabled"); else gnomeSettings->set(GNOME_ACTIVE_TOUCHPAD_KEY, "disabled"); _refresh_touchpad_widget_status(); } void MouseControl::disable_while_typing_clicked_slot(bool status){ // tpsettings->set(DISABLE_WHILE_TYPING_KEY, status); gnomeSettings->set(GNOME_DISABLE_WHILE_TYPEING_KEY, status); } void MouseControl::touchpad_click_clicked_slot(bool status){ // tpsettings->set(TOUCHPAD_CLICK_KEY, status); gnomeSettings->set(GNOME_TOUCHPAD_CLICK_KEY, status); } void MouseControl::rolling_enable_clicked_slot(bool status){ // if (status) // ui->noneRadioButton->setChecked(true); // _refresh_rolling_btn_status(); if (status){ gnomeSettings->set(GNOME_SCROLLING_EDGE_KEY, !status); gnomeSettings->set(GNOME_SCROLLING_TWO_KEY, !status); } else{ gnomeSettings->set(GNOME_SCROLLING_EDGE_KEY, !status); } } void MouseControl::rolling_kind_changed_slot(QAbstractButton *basebtn, bool status){ if (ui->rollingbuttonGroup->checkedId() != NONE_ID) ui->rollingCheckBtn->setChecked(false); if (basebtn->text() == "None") return; QRadioButton * button = dynamic_cast(basebtn); QString kind = static_cast(button->userData(Qt::UserRole))->kind; // tpsettings->set(kind, status); } void MouseControl::cursor_size_changed_slot(){ kylin_hardware_mouse_set_cursorsize(ui->cursorsizebuttonGroup->checkedId()); } ukui-control-center/plugins/devices/mousecontrol/mousecontrol.ui0000644000175000017500000013260313564473475024362 0ustar fengfeng MouseControl 0 0 800 710 0 0 16777215 16777215 Template 0 0 0 0 0 20 20 25 0 0 0 0 Mouse Key Settings true title1# 0 0 0 100 0 100 16777215 Main button true right hand lefthandbuttonGroup Qt::Horizontal QSizePolicy::Fixed 50 20 left hand lefthandbuttonGroup Qt::Horizontal 40 20 0 0 0 100 0 100 16777215 Mouse wheel true Qt::Horizontal 40 20 0 0 0 Move the pointer as it hover over the inactive window true Qt::Horizontal QSizePolicy::Fixed 25 20 Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 35 0 0 Cursor Settiings true title1# 0 0 0 100 0 100 16777215 Cursor themes true Qt::Horizontal QSizePolicy::Fixed 20 20 0 0 true Qt::Horizontal 40 20 0 0 100 0 100 16777215 Speed true 0 0 30 0 30 16777215 Slow true 100 1000 50 50 Qt::Horizontal Qt::Horizontal QSizePolicy::Fixed 15 20 0 0 Fast true Qt::Horizontal 40 20 0 0 100 0 100 16777215 Sensitivity true 0 0 30 0 30 16777215 Low true 100 1000 50 50 Qt::Horizontal Qt::Horizontal QSizePolicy::Fixed 15 20 0 0 High true Qt::Horizontal 40 20 0 0 100 0 100 16777215 Visibility true Hide pointers while typing Qt::Horizontal QSizePolicy::Fixed 50 20 Show position of pointer when the Control key is pressed Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 35 0 0 Related settings true title1# touchpad settings true Qt::Horizontal 40 20 cursor settings true Qt::Horizontal 40 20 Qt::Vertical 20 40 25 20 25 0 0 0 0 Touchpad Settings true title1# 15 0 0 Enabled touchpad true Qt::Vertical QSizePolicy::Fixed 20 35 25 0 0 0 0 0 0 General Settings true title1# 0 Disable touchpad while typing Qt::Horizontal 40 20 0 Enable mouse clicks with touchpad Qt::Horizontal 40 20 15 Disable rolling: Qt::Vertical QSizePolicy::Expanding 20 40 25 0 0 0 0 Vertical &edge scrolling rollingbuttonGroup &Horizontal edge scrolling rollingbuttonGroup &Vertical two-finger scrolling rollingbuttonGroup Horizontal two-&finger scrolling rollingbuttonGroup None rollingbuttonGroup Qt::Horizontal QSizePolicy::Expanding 40 20 Qt::Vertical 20 40 25 20 25 0 0 0 0 Cursor And Pointersize true title1# 620 50 620 50 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Make the cursor pointer easier to see</p></body></html> Qt::Vertical QSizePolicy::Fixed 20 35 25 0 0 0 0 0 0 Change Cursor Weight true title1# 15 0 0 thin true Qt::Horizontal 0 0 coarse true Qt::Horizontal QSizePolicy::Fixed 25 20 90 30 90 30 Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 35 0 0 Change Pointersize true title1# 50 smaller - 100%(default) cursorsizebuttonGroup medium - 125% cursorsizebuttonGroup larger - 150% cursorsizebuttonGroup Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 25 Reset Qt::Horizontal 40 20 Qt::Vertical 20 40 ukui-control-center/plugins/devices/mousecontrol/mousecontrol.h0000644000175000017500000000731413621411724024153 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MOUSECONTROL_H #define MOUSECONTROL_H #include #include #include "mainui/interface.h" #include #include #include #include #include #include "kylin-mouse-interface.h" #include "../../pluginsComponent/switchbutton.h" #include "../../pluginsComponent/customwidget.h" #define CURSORS_THEMES_PATH "/usr/share/icons/" #define GNOME_TOUCHPAD_SCHEMA "org.gnome.desktop.peripherals.touchpad" #define GNOME_ACTIVE_TOUCHPAD_KEY "send-events" #define GNOME_TOUCHPAD_CLICK_KEY "tap-to-click" #define GNOME_DISABLE_WHILE_TYPEING_KEY "disable-while-typing" #define GNOME_DISABLE_SCROLLING_KEY "natural-scroll" #define GNOME_SCROLLING_EDGE_KEY "edge-scrolling-enabled" #define GNOME_SCROLLING_TWO_KEY "two-finger-scrolling-enabled" #define TOUCHPAD_SCHEMA "org.ukui.peripherals-touchpad" #define ACTIVE_TOUCHPAD_KEY "touchpad-enabled" #define DISABLE_WHILE_TYPING_KEY "disable-while-typing" #define TOUCHPAD_CLICK_KEY "tap-to-click" #define V_EDGE_KEY "vertical-edge-scrolling" #define H_EDGE_KEY "horizontal-edge-scrolling" #define V_FINGER_KEY "vertical-two-finger-scrolling" #define H_FINGER_KEY "horizontal-two-finger-scrolling" /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif namespace Ui { class MouseControl; } class MouseControl : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: MouseControl(); ~MouseControl() Q_DECL_OVERRIDE; QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; CustomWidget *get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; void component_init(); void status_init(); bool find_synaptics(); bool _supports_xinput_devices(); private: Ui::MouseControl *ui; QString pluginName; int pluginType; CustomWidget * pluginWidget; SwitchButton * activeBtn; // QGSettings * tpsettings; QGSettings * gnomeSettings; QStringList _get_cursors_themes(); void _refresh_touchpad_widget_status(); void _refresh_rolling_btn_status(); private slots: void mouseprimarykey_changed_slot(int id); void cursor_themes_changed_slot(QString text); void speed_value_changed_slot(int value); void sensitivity_value_changed_slot(int value); void show_pointer_position_slot(bool status); void active_touchpad_changed_slot(bool status); void disable_while_typing_clicked_slot(bool status); void touchpad_click_clicked_slot(bool status); void rolling_enable_clicked_slot(bool status); void rolling_kind_changed_slot(QAbstractButton * basebtn, bool status); void cursor_size_changed_slot(); }; #endif // MOUSECONTROL_H ukui-control-center/plugins/devices/mouse/0000755000175000017500000000000013640364120017641 5ustar fengfengukui-control-center/plugins/devices/mouse/mouse.pro0000644000175000017500000000131713630066010021511 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-08-22T11:12:59 # #------------------------------------------------- QT += widgets x11extras #greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(mouse) DESTDIR = ../../../pluginlibs include(../../../env.pri) include($$PROJECT_COMPONENTSOURCE/switchbutton.pri) INCLUDEPATH += \ $$PROJECT_COMPONENTSOURCE \ $$PROJECT_ROOTDIR \ LIBS += -L/usr/lib/ -lXi -lgsettings-qt #DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ mousecontrol.cpp HEADERS += \ mousecontrol.h FORMS += \ mousecontrol.ui ukui-control-center/plugins/devices/mouse/mousecontrol.cpp0000644000175000017500000001641513640364120023105 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "mousecontrol.h" #include "ui_mousecontrol.h" #include #include /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include } #define MOUSE_SCHEMA "org.ukui.peripherals-mouse" #define HAND_KEY "left-handed" #define LOCATE_KEY "locate-pointer" #define CURSOR_SIZE_KEY "cursor-size" #define ACCELERATION_KEY "motion-acceleration" #define THRESHOLD_KEY "motion-threshold" MouseControl::MouseControl() { ui = new Ui::MouseControl; pluginWidget = new QWidget; pluginWidget->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(pluginWidget); pluginName = tr("mouse"); pluginType = DEVICES; QString qss; QFile QssFile("://combox.qss"); QssFile.open(QFile::ReadOnly); if (QssFile.isOpen()){ qss = QLatin1String(QssFile.readAll()); QssFile.close(); } pluginWidget->setStyleSheet("background: #ffffff;"); ui->handWidget->setStyleSheet("QWidget{background: #F4F4F4; border-radius: 6px;}"); ui->pointerSpeedWidget->setStyleSheet("QWidget{background: #F4F4F4; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); ui->sensitivityWidget->setStyleSheet("QWidget{background: #F4F4F4;}"); ui->visibilityWidget->setStyleSheet("QWidget{background: #F4F4F4;}"); ui->pointerSizeWidget->setStyleSheet("QWidget{background: #F4F4F4; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"); //全局未生效,再次设置 ui->pointerSizeComBox->setView(new QListView()); ui->pointerSizeComBox->setStyleSheet(qss); ui->handHabitComBox->setView(new QListView()); ui->handHabitComBox->setStyleSheet(qss); ui->cursorWeightWidget->setStyleSheet("QWidget{background: #F4F4F4; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); ui->cursorSpeedWidget->setStyleSheet("QWidget{background: #F4F4F4;}"); ui->flashingWidget->setStyleSheet("QWidget{background: #F4F4F4; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"); //初始化鼠标设置GSettings const QByteArray id(MOUSE_SCHEMA); settings = new QGSettings(id); setupComponent(); initHandHabitStatus(); initPointerStatus(); } MouseControl::~MouseControl() { delete ui; delete settings; } QString MouseControl::get_plugin_name(){ return pluginName; } int MouseControl::get_plugin_type(){ return pluginType; } QWidget *MouseControl::get_plugin_ui(){ return pluginWidget; } void MouseControl::plugin_delay_control(){ } void MouseControl::setupComponent(){ ui->title3Label->hide(); ui->cursorSpeedWidget->hide(); ui->cursorWeightWidget->hide(); //设置左手右手鼠标控件 ui->handHabitComBox->addItem(tr("Lefthand"), true); ui->handHabitComBox->addItem(tr("Righthand"), false); //设置指针可见性控件 visiblityBtn = new SwitchButton(pluginWidget); ui->visibilityHorLayout->addWidget(visiblityBtn); //设置指针大小 ui->pointerSizeComBox->setMaxVisibleItems(5); ui->pointerSizeComBox->addItem(tr("Default(Recommended)"), 24); //100% ui->pointerSizeComBox->addItem(tr("Medium"), 32); //125% ui->pointerSizeComBox->addItem(tr("Large"), 48); //150% //设置启用光标闪烁 flashingBtn = new SwitchButton(pluginWidget); ui->enableFlashingHorLayout->addWidget(flashingBtn); connect(ui->handHabitComBox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index){ Q_UNUSED(index) settings->set(HAND_KEY, ui->handHabitComBox->currentData().toBool()); }); connect(ui->pointerSpeedSlider, &QSlider::valueChanged, [=](int value){ settings->set(ACCELERATION_KEY, static_cast(value)/ui->pointerSpeedSlider->maximum()*10); }); connect(ui->pointerSensitivitySlider, &QSlider::valueChanged, [=](int value){ settings->set(THRESHOLD_KEY, 10*value/ui->pointerSensitivitySlider->maximum()); }); connect(visiblityBtn, &SwitchButton::checkedChanged, [=](bool checked){ settings->set(LOCATE_KEY, checked); }); connect(ui->pointerSizeComBox, QOverload::of(&QComboBox::currentIndexChanged), [=](int index){ Q_UNUSED(index) settings->set(CURSOR_SIZE_KEY, ui->pointerSizeComBox->currentData().toInt()); }); } void MouseControl::initHandHabitStatus(){ int handHabitIndex = ui->handHabitComBox->findData(settings->get(HAND_KEY).toBool()); ui->handHabitComBox->blockSignals(true); ui->handHabitComBox->setCurrentIndex(handHabitIndex); ui->handHabitComBox->blockSignals(false); } void MouseControl::initPointerStatus(){ //当前系统指针加速值,-1为系统默认 double mouse_acceleration = settings->get(ACCELERATION_KEY).toDouble(); //当前系统指针灵敏度,-1为系统默认 int mouse_threshold = settings->get(THRESHOLD_KEY).toInt(); //当从接口获取的是-1,则代表系统默认值,真实值需要从底层获取 if (mouse_threshold == -1 || static_cast(mouse_acceleration) == -1){ // speed sensitivity int accel_numerator, accel_denominator, threshold; //当加速值和灵敏度为系统默认的-1时,从底层获取到默认的具体值 XGetPointerControl(QX11Info::display(), &accel_numerator, &accel_denominator, &threshold); settings->set(ACCELERATION_KEY, static_cast(accel_numerator/accel_denominator)); settings->set(THRESHOLD_KEY, threshold); } //初始化指针速度控件 ui->pointerSpeedSlider->blockSignals(true); ui->pointerSpeedSlider->setValue(static_cast(settings->get(ACCELERATION_KEY).toDouble()*100)); ui->pointerSpeedSlider->blockSignals(false); //初始化指针敏感度控件 ui->pointerSensitivitySlider->blockSignals(true); ui->pointerSensitivitySlider->setValue(settings->get(THRESHOLD_KEY).toInt()*100); ui->pointerSensitivitySlider->blockSignals(false); //初始化可见性控件 visiblityBtn->blockSignals(true); visiblityBtn->setChecked(settings->get(LOCATE_KEY).toBool()); visiblityBtn->blockSignals(false); //初始化指针大小 int sizeIndex = ui->pointerSizeComBox->findData(settings->get(CURSOR_SIZE_KEY).toInt()); ui->pointerSizeComBox->blockSignals(true); ui->pointerSizeComBox->setCurrentIndex(sizeIndex); ui->pointerSizeComBox->blockSignals(false); } void MouseControl::initCursorStatus(){ } ukui-control-center/plugins/devices/mouse/mousecontrol.ui0000644000175000017500000007373013635333016022747 0ustar fengfeng MouseControl 0 0 800 710 0 0 16777215 16777215 Template 2 0 0 32 30 0 0 Mouse Key Settings Qt::Vertical QSizePolicy::Fixed 20 14 0 50 16777215 50 0 16 0 16 0 0 0 0 128 0 128 16777215 Hand habit 0 30 16777215 30 Qt::Vertical QSizePolicy::Fixed 20 46 0 0 Pointer Settings 0 50 16777215 50 0 16 0 16 0 0 0 0 0 136 0 136 16777215 Speed 0 0 40 0 40 16777215 Slow QSlider{ width: 178px; height: 20px; } QSlider::groove:horizontal { border: 0px solid #bbb; } QSlider::sub-page:horizontal { background: #3D6BE5; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::add-page:horizontal { background: rgba(52,70,80,90%); border: 0px solid #777; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::handle:horizontal { width: 20px; height: 20px; background: #3D6BE5; border-radius:10px; } 100 1000 50 50 Qt::Horizontal 0 0 40 0 40 16777215 Qt::LeftToRight Fast Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 50 16777215 50 0 16 0 16 0 0 0 0 136 0 136 16777215 Sensitivity 0 0 40 0 40 16777215 Low QSlider{ width: 178px; height: 20px; } QSlider::groove:horizontal { border: 0px solid #bbb; } QSlider::sub-page:horizontal { background: #3D6BE5; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::add-page:horizontal { background: rgba(52,70,80,90%); border: 0px solid #777; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::handle:horizontal { width: 20px; height: 20px; background: #3D6BE5; border-radius:10px; } 100 1000 50 50 Qt::Horizontal 0 0 40 0 40 16777215 Qt::LeftToRight High Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 50 16777215 50 0 16 0 16 0 0 0 128 0 128 16777215 Visibility Qt::Horizontal 40 20 0 50 16777215 50 0 16 0 16 0 0 0 128 0 128 16777215 Pointer size 0 30 16777215 30 Qt::Vertical QSizePolicy::Fixed 20 46 0 0 Cursor Settings Qt::Vertical QSizePolicy::Fixed 20 14 0 50 16777215 50 0 16 0 16 0 0 0 0 136 0 136 16777215 Cursor weight 0 0 40 0 40 16777215 Thin QSlider{ width: 178px; height: 20px; } QSlider::groove:horizontal { border: 0px solid #bbb; } QSlider::sub-page:horizontal { background: #3D6BE5; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::add-page:horizontal { background: rgba(52,70,80,90%); border: 0px solid #777; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::handle:horizontal { width: 20px; height: 20px; background: #3D6BE5; border-radius:10px; } Qt::Horizontal 0 0 50 0 50 16777215 Coarse Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Horizontal QSizePolicy::Fixed 16 20 80 30 80 30 0 50 16777215 50 0 16 0 16 0 0 0 0 136 0 136 16777215 Cursor speed 0 0 40 0 40 16777215 Slow QSlider{ width: 178px; height: 20px; } QSlider::groove:horizontal { border: 0px solid #bbb; } QSlider::sub-page:horizontal { background: #3D6BE5; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::add-page:horizontal { background: rgba(52,70,80,90%); border: 0px solid #777; border-radius: 2px; margin-top:8px; margin-bottom:9px; } QSlider::handle:horizontal { width: 20px; height: 20px; background: #3D6BE5; border-radius:10px; } Qt::Horizontal 0 0 40 0 40 16777215 Fast Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 50 16777215 50 0 16 0 16 0 0 0 0 Enable flashing on text area Qt::Horizontal 40 20 ukui-control-center/plugins/devices/mouse/mousecontrol.h0000644000175000017500000000375613640364120022556 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MOUSECONTROL_H #define MOUSECONTROL_H #include #include #include #include #include #include #include "shell/interface.h" #include "SwitchButton/switchbutton.h" namespace Ui { class MouseControl; } class MouseControl : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.kycc.CommonInterface") Q_INTERFACES(CommonInterface) public: MouseControl(); ~MouseControl() Q_DECL_OVERRIDE; QString get_plugin_name() Q_DECL_OVERRIDE; int get_plugin_type() Q_DECL_OVERRIDE; QWidget *get_plugin_ui() Q_DECL_OVERRIDE; void plugin_delay_control() Q_DECL_OVERRIDE; public: void setupComponent(); void initHandHabitStatus(); void initPointerStatus(); void initCursorStatus(); private: Ui::MouseControl *ui; QString pluginName; int pluginType; QWidget * pluginWidget; private: SwitchButton * visiblityBtn; SwitchButton * flashingBtn; QGSettings * settings; QString leftStr; QString rightStr; QStyledItemDelegate* itemDelege; }; #endif // MOUSECONTROL_H ukui-control-center/man/0000755000175000017500000000000013621411724014163 5ustar fengfengukui-control-center/man/launchSysDbus.10000644000175000017500000000076713621411724017046 0ustar fengfeng.\" Hey, EMACS: -*- nroff -*- .TH LAUNCHSYSDBUS 1 "20 SEP 2019" .\" Please adjust this date whenever revising the manpage. .SH NAME launchSysDbus \- launch system dbus server .SH SYNOPSIS .B launchSysDbus .SH DESCRIPTION .B launchSysDbus It is used to launch system dbus server that realize by qt. Need to use root privilege. .PP .SH SEE ALSO .BR launchSysDbus (1), .br .SH AUTHOR launchSysDbus was written by hebing . .PP This manual page was written by hebing . ukui-control-center/man/ukui-control-center.10000644000175000017500000000100213543125214020146 0ustar fengfeng.\" Hey, EMACS: -*- nroff -*- .TH UKUI-CONTROL-CENTER 1 "20 SEP 2019" .\" Please adjust this date whenever revising the manpage. .SH NAME ukui-control-center \- launch ukui-control-center program .SH SYNOPSIS .B ukui-control-center .SH DESCRIPTION .B ukui-control-center It is used to launch program of ukui-control-center. .PP .SH SEE ALSO .BR ukui-control-center (1), .br .SH AUTHOR ukui-control-center was written by hebing . .PP This manual page was written by hebing . ukui-control-center/shell/0000755000175000017500000000000013642652167014532 5ustar fengfengukui-control-center/shell/mainwindow.h0000644000175000017500000000425213642553044017054 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include #include #include #include #include "interface.h" #include "homepagewidget.h" #include "modulepagewidget.h" class QPushButton; class QButtonGroup; class KeyValueConverter; namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); public: QMap exportModule(int); void setModuleBtnHightLight(int id); void bootOptionsFilter(QString opt); void bootOptionsSwitch(int moduleNum, int funcNum); private: Ui::MainWindow *ui; private: HomePageWidget * homepageWidget; ModulePageWidget * modulepageWidget; QButtonGroup * leftBtnGroup; QButtonGroup * leftMicBtnGroup; // QDir pluginsDir; // QStringList modulesStringList; QList moduleIndexList; QList> modulesList; KeyValueConverter * kvConverter; private: void setBtnLayout(QPushButton * &pBtn); void loadPlugins(); void initLeftsideBar(); QPushButton * buildLeftsideBtn(QString bname); public slots: void functionBtnClicked(QObject * plugin); void sltMessageReceived(const QString &msg); }; #endif // MAINWINDOW_H ukui-control-center/shell/modulepagewidget.cpp0000644000175000017500000002536313635333016020564 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "modulepagewidget.h" #include "ui_modulepagewidget.h" #include #include "mainwindow.h" #include "interface.h" #include "utils/keyvalueconverter.h" #include "utils/functionselect.h" #include "component/leftwidgetitem.h" #include ModulePageWidget::ModulePageWidget(QWidget *parent) : QWidget(parent), ui(new Ui::ModulePageWidget) { ui->setupUi(this); //设置父窗口对象 this->setParent(parent); pmainWindow = (MainWindow *)parentWidget(); //左侧Widget大小限定 ui->leftbarWidget->setMinimumWidth(160); ui->leftbarWidget->setMaximumWidth(216); //右侧Widget大小限定(限制了最小宽度) ui->widget->setMinimumWidth(650); ui->widget->setMaximumWidth(1200); // ui->mtitleLabel->setStyleSheet("QLabel#mtitleLabel{font-size: 18px; color: #91000000;}"); //左侧二级菜单样式 ui->leftStackedWidget->setStyleSheet("border: none;"); //上侧二级菜单样式 ui->topStackedWidget->setStyleSheet("border: none;"); //功能区域 ui->scrollArea->setStyleSheet("#scrollArea{border: 0px solid;}"); ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //初始化记录标志位 flagBit = true; //构建枚举键值转换对象 mkvConverter = new KeyValueConverter(); //继承QObject,No Delete ui->topsideWidget->hide(); initUI(); } ModulePageWidget::~ModulePageWidget() { delete ui; } void ModulePageWidget::initUI(){ //设置伸缩策略 QSizePolicy leftSizePolicy = ui->leftbarWidget->sizePolicy(); QSizePolicy rightSizePolicy = ui->widget->sizePolicy(); leftSizePolicy.setHorizontalStretch(1); rightSizePolicy.setHorizontalStretch(5); ui->leftbarWidget->setSizePolicy(leftSizePolicy); ui->widget->setSizePolicy(rightSizePolicy); for (int moduleIndex = 0; moduleIndex < TOTALMODULES; moduleIndex++){ QListWidget * leftListWidget = new QListWidget; leftListWidget->setObjectName("leftWidget"); leftListWidget->setStyleSheet("QListWidget#leftWidget{background-color: #FFFFFF}"); leftListWidget->setAttribute(Qt::WA_DeleteOnClose); leftListWidget->setResizeMode(QListView::Adjust); leftListWidget->setFocusPolicy(Qt::NoFocus); leftListWidget->setSelectionMode(QAbstractItemView::NoSelection); leftListWidget->setSpacing(12); connect(leftListWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(currentLeftitemChanged(QListWidgetItem*,QListWidgetItem*))); QListWidget * topListWidget = new QListWidget; topListWidget->setAttribute(Qt::WA_DeleteOnClose); topListWidget->setResizeMode(QListView::Adjust); topListWidget->setViewMode(QListView::IconMode); topListWidget->setMovement(QListView::Static); topListWidget->setSpacing(0); QMap moduleMap; moduleMap = pmainWindow->exportModule(moduleIndex); QList functionStructList = FunctionSelect::funcinfoList[moduleIndex]; for (int funcIndex = 0; funcIndex < functionStructList.size(); funcIndex++){ FuncInfo single = functionStructList.at(funcIndex); //跳过插件不存在的功能项 if (!moduleMap.contains(single.namei18nString)) continue; //填充左侧二级菜单 LeftWidgetItem * leftWidgetItem = new LeftWidgetItem(); leftWidgetItem->setAttribute(Qt::WA_DeleteOnClose); leftWidgetItem->setLabelText(single.namei18nString); leftWidgetItem->setLabelPixmap(QString("://img/secondaryleftmenu/%1.png").arg(single.nameString), single.nameString); QListWidgetItem * item = new QListWidgetItem(leftListWidget); item->setSizeHint(QSize(ui->leftStackedWidget->width(), 40)); //QSize(120, 40) spacing: 12px; leftListWidget->setItemWidget(item, leftWidgetItem); strItemsMap.insert(single.namei18nString, item); //填充上侧二级菜单 QListWidgetItem * topitem = new QListWidgetItem(topListWidget); topitem->setSizeHint(QSize(60, 60)); topitem->setText(single.namei18nString); topListWidget->addItem(topitem); strItemsMap.insert(single.namei18nString, topitem); CommonInterface * pluginInstance = qobject_cast(moduleMap.value(single.namei18nString)); pluginInstanceMap.insert(single.namei18nString, pluginInstance); } // QStringList functionStringList = FunctionSelect::funcsList[moduleIndex]; // for (int funcIndex = 0; funcIndex < functionStringList.size(); funcIndex++){ // QString funcnameString = functionStringList.at(funcIndex); // //跳过插件不存在的功能项 // if (!moduleMap.contains(funcnameString)) // continue; // //填充左侧二级菜单 // LeftWidgetItem * leftWidgetItem = new LeftWidgetItem(this); // leftWidgetItem->setLabelText(funcnameString); // leftWidgetItem->setLabelPixmap(QString("://img/secondaryleftmenu/%1.png").arg(funcnameString)); // QListWidgetItem * item = new QListWidgetItem(leftListWidget); // item->setSizeHint(QSize(120, 40)); //测试数据 // leftListWidget->setItemWidget(item, leftWidgetItem); // //填充上侧二级菜单 // QListWidgetItem * topitem = new QListWidgetItem(topListWidget); // topitem->setSizeHint(QSize(60, 60)); // topitem->setText(funcnameString); // topListWidget->addItem(topitem); // CommonInterface * pluginInstance = qobject_cast(moduleMap.value(funcnameString)); // pluginInstanceMap.insert(funcnameString, pluginInstance); // } ui->leftStackedWidget->addWidget(leftListWidget); ui->topStackedWidget->addWidget(topListWidget); } //左侧二级菜单标题及上侧二级菜单标题随功能页变化联动 connect(ui->leftStackedWidget, &QStackedWidget::currentChanged, this, [=](int index){ QString titleString = mkvConverter->keycodeTokeyi18nstring(index); ui->mtitleLabel->setText(titleString); ui->mmtitleLabel->setText(titleString); }); } void ModulePageWidget::switchPage(QObject *plugin, bool recorded){ CommonInterface * pluginInstance = qobject_cast(plugin); QString name; int type; name = pluginInstance->get_plugin_name(); type = pluginInstance->get_plugin_type(); //首次点击设置模块标题后续交给回调函数 if (ui->mtitleLabel->text().isEmpty() || ui->mmtitleLabel->text().isEmpty()){ QString titleString = mkvConverter->keycodeTokeyi18nstring(type); ui->mtitleLabel->setText(titleString); ui->mmtitleLabel->setText(titleString); } //通过设置标志位确定是否记录打开历史 flagBit = recorded; //设置左侧一级菜单 pmainWindow->setModuleBtnHightLight(type); //设置左侧二级菜单 ui->leftStackedWidget->setCurrentIndex(type); QListWidget * lefttmpListWidget = dynamic_cast(ui->leftStackedWidget->currentWidget()); if (lefttmpListWidget->currentItem() != nullptr){ LeftWidgetItem * widget = dynamic_cast(lefttmpListWidget->itemWidget(lefttmpListWidget->currentItem())); //待打开页与QListWidget的CurrentItem相同 if (QString::compare(widget->text(), name) == 0){ refreshPluginWidget(pluginInstance); } } //设置上侧二级菜单 ui->topStackedWidget->setCurrentIndex(type); //设置左侧及上侧的当前Item及功能Widget highlightItem(name); } void ModulePageWidget::refreshPluginWidget(CommonInterface *plu){ ui->scrollArea->takeWidget(); delete(ui->scrollArea->widget()); ui->scrollArea->setWidget(plu->get_plugin_ui()); //延迟操作 plu->plugin_delay_control(); //记录打开历史 if (flagBit){ FunctionSelect::pushRecordValue(plu->get_plugin_type(), plu->get_plugin_name()); } //恢复标志位 flagBit = true; } void ModulePageWidget::highlightItem(QString text){ QList currentItemList = strItemsMap.values(text); if (2 > currentItemList.count()) return; //高亮左侧二级菜单 QListWidget * lefttmpListWidget = dynamic_cast(ui->leftStackedWidget->currentWidget()); lefttmpListWidget->setCurrentItem(currentItemList.at(1)); //QMultiMap 先添加的vlaue在后面 //高亮上侧二级菜单 QListWidget * toptmpListWidget = dynamic_cast(ui->topStackedWidget->currentWidget()); toptmpListWidget->setCurrentItem(currentItemList.at(0)); //QMultiMap 后添加的value在前面 } void ModulePageWidget::currentLeftitemChanged(QListWidgetItem *cur, QListWidgetItem *pre){ //获取当前QListWidget QListWidget * currentLeftListWidget = dynamic_cast(ui->leftStackedWidget->currentWidget()); if (pre != nullptr){ LeftWidgetItem * preWidgetItem = dynamic_cast(currentLeftListWidget->itemWidget(pre)); //取消高亮 preWidgetItem->setSelected(false); preWidgetItem->setLabelTextIsWhite(false); preWidgetItem->isSetLabelPixmapWhite(false); } LeftWidgetItem * curWidgetItem = dynamic_cast(currentLeftListWidget->itemWidget(cur)); if (pluginInstanceMap.contains(curWidgetItem->text())){ CommonInterface * pluginInstance = pluginInstanceMap[curWidgetItem->text()]; refreshPluginWidget(pluginInstance); //高亮 curWidgetItem->setSelected(true); curWidgetItem->setLabelTextIsWhite(true); curWidgetItem->isSetLabelPixmapWhite(true); } else { qDebug() << "plugin widget not fount!"; } } ukui-control-center/shell/shell.pro0000644000175000017500000000707013641405665016365 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-12-21T09:41:12 # #------------------------------------------------- QT += core gui network x11extras greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = ukui-control-center DESTDIR = .. TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 include(../env.pri) LIBS += -L/usr/lib/ -lX11 ##加载gio库和gio-unix库,用于处理desktop文件 CONFIG += link_pkgconfig \ C++11 PKGCONFIG += gio-2.0 \ gio-unix-2.0 inst1.files += ukui-control-center.desktop inst1.path = /usr/share/applications inst2.files += $$PROJECT_ROOTDIR/pluginlibs/ inst2.path = /usr/lib/control-center/ inst3.files += $$PROJECT_ROOTDIR/data/org.ukui.control-center.keybinding.gschema.xml inst3.files += $$PROJECT_ROOTDIR/data/org.ukui.control-center.desktop.gschema.xml inst3.files += $$PROJECT_ROOTDIR/data/org.ukui.control-center.notice.gschema.xml inst3.files += $$PROJECT_ROOTDIR/data/org.ukui.control-center.experienceplan.gschema.xml inst3.path = /usr/share/glib-2.0/schemas/ inst4.files += $$PROJECT_ROOTDIR/data/org.ukui.control-center.wifi.switch.gschema.xml inst4.path = /usr/share/glib-2.0/schemas/ inst5.files += $$PROJECT_ROOTDIR/data/org.ukui.control-center.panel.plugins.gschema.xml inst5.path = /usr/share/glib-2.0/schemas/ inst6.files += $$PROJECT_ROOTDIR/data/faces/ inst6.path = /usr/share/ukui/ target.source += $$TARGET target.path = /usr/bin INSTALLS += \ inst1 \ inst2 \ inst3 \ inst4 \ inst5 \ inst6 \ target \ INCLUDEPATH += qtsingleapplication DEPENDPATH += qtsingleapplication SOURCES += \ main.cpp \ mainwindow.cpp \ framelessExtended/cursorposcalculator.cpp \ framelessExtended/framelesshandle.cpp \ framelessExtended/widgethandlerealize.cpp \ homepagewidget.cpp \ modulepagewidget.cpp \ utils/keyvalueconverter.cpp \ component/leftwidgetitem.cpp \ component/clicklabel.cpp \ utils/functionselect.cpp \ component/hoverwidget.cpp \ qtsingleapplication/qtsingleapplication.cpp \ qtsingleapplication/qtlocalpeer.cpp HEADERS += \ mainwindow.h \ interface.h \ framelessExtended/cursorposcalculator.h \ framelessExtended/framelesshandle.h \ framelessExtended/framelesshandleprivate.h \ framelessExtended/widgethandlerealize.h \ homepagewidget.h \ modulepagewidget.h \ utils/keyvalueconverter.h \ component/leftwidgetitem.h \ component/clicklabel.h \ utils/functionselect.h \ component/hoverwidget.h \ qtsingleapplication/qtsingleapplication_copy.h \ qtsingleapplication/qtsingleapplication.h \ qtsingleapplication/qtlocalpeer.h FORMS += \ mainwindow.ui \ homepagewidget.ui \ modulepagewidget.ui RESOURCES += \ res/resfile.qrc DISTFILES += \ ../data/org.ukui.control-center.panel.plugins.gschema.xml \ ../data/org.ukui.control-center.wifi.switch.gschema.xml ukui-control-center/shell/modulepagewidget.ui0000644000175000017500000001655313621411724020416 0ustar fengfeng ModulePageWidget 0 0 687 428 Form 0 0 0 0 0 0 24 0 0 0 0 0 16777215 16777215 0 0 80 0 0 24 0 0 0 0 8 0 0 true 0 0 0 0 16777215 16777215 0 24 40 0 0 0 0 60 16777215 60 0 0 0 0 0 0 0 0 true 0 0 303 322 ukui-control-center/shell/mainwindow.ui0000644000175000017500000001625613640364120017242 0ustar fengfeng MainWindow 0 0 722 457 0 0 0 0 0 60 0 60 16777215 0 0 0 0 0 4 3 30 0 0 56 16777215 56 2 16 0 0 0 48 32 48 32 0 0 UKCC true Qt::Horizontal 40 20 354 32 560 32 Qt::Horizontal 40 20 48 32 48 32 48 32 48 32 48 32 48 32 16777215 16777215 ukui-control-center/shell/modulepagewidget.h0000644000175000017500000000350613630066010020214 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MODULEPAGEWIDGET_H #define MODULEPAGEWIDGET_H #include #include class MainWindow; class CommonInterface; class KeyValueConverter; class QListWidgetItem; namespace Ui { class ModulePageWidget; } class ModulePageWidget : public QWidget { Q_OBJECT public: explicit ModulePageWidget(QWidget *parent = 0); ~ModulePageWidget(); public: void initUI(); void switchPage(QObject * plugin, bool recorded = true); void refreshPluginWidget(CommonInterface * plu); void highlightItem(QString text); private: Ui::ModulePageWidget *ui; private: MainWindow * pmainWindow; KeyValueConverter * mkvConverter; private: QMap pluginInstanceMap; QMultiMap strItemsMap;//存储功能名与二级菜单item的Map,为了实现高亮 bool flagBit; public slots: void currentLeftitemChanged(QListWidgetItem * cur, QListWidgetItem * pre); }; #endif // MODULEPAGEWIDGET_H ukui-control-center/shell/ukui-control-center.desktop0000755000175000017500000000053713630066010022025 0ustar fengfeng[Desktop Entry] Name=UKUI Control Center Name[zh_CN]=控制面板 Name[zh_HK]=控制面板 Name[zh_TW]=控制面板 Comment=麒麟控制面板 Icon=ukui-control-center Exec=ukui-control-center Terminal=false Type=Application StartupNotify=true NoDisplay=true Categories=Qt;Settings; Keywords=UKUI;control;center;configuration;tool;destop;preferences; ukui-control-center/shell/interface.h0000644000175000017500000000417213635333016016636 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef INTERFACE_H #define INTERFACE_H class QString; class QWidget; enum FunType{ SYSTEM, DEVICES, PERSONALIZED, NETWORK, ACCOUNT, DATETIME, UPDATE, NOTICEANDTASKS, TOTALMODULES, }; enum SystemIndex{ DISPLAY, DEFAULTAPP, POWER, AUTOBOOT, TOTALSYSFUNC, }; enum DevicesIndex{ PRINTER, MOUSE, TOUCHPAD, KEYBOARD, SHORTCUT, AUDIO, TOTALDEVICESFUNC, }; enum PersonalizedIndex{ BACKGROUND, THEME, SCREENLOCK, FONTS, SCREENSAVER, DESKTOP, TOTALPERSFUNC, }; enum NetworkIndex{ NETCONNECT, VPN, PROXY, TOTALNETFUNC, }; enum AccountIndex{ USERINFO, TOTALACCOUNTFUNC, }; enum DatetimeIndex{ DAT, AREA, TOTALDTFUNC, }; enum SeUpdatesIndex{ UPDATES, BACKUP, TOTALSUFUNC, }; enum NoticeAndTasksIndex{ NOTICE, ABOUT, EXPERIENCEPLAN, TOTALNATFUNC, }; class CommonInterface{ public: virtual ~CommonInterface(){} virtual QString get_plugin_name() = 0; virtual int get_plugin_type() = 0; virtual QWidget * get_plugin_ui() = 0; virtual void plugin_delay_control() = 0; }; #define CommonInterface_iid "org.kycc.CommonInterface" Q_DECLARE_INTERFACE(CommonInterface, CommonInterface_iid) #endif // INTERFACE_H ukui-control-center/shell/homepagewidget.ui0000644000175000017500000000200213630066010020033 0ustar fengfeng HomePageWidget 0 0 839 635 Form 40 0 0 1120 450 ukui-control-center/shell/component/0000755000175000017500000000000013635333016016523 5ustar fengfengukui-control-center/shell/component/leftwidgetitem.h0000644000175000017500000000274513630066010021711 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef LEFTWIDGETITEM_H #define LEFTWIDGETITEM_H #include #include #include class LeftWidgetItem : public QWidget { Q_OBJECT public: explicit LeftWidgetItem(QWidget *parent = 0); ~LeftWidgetItem(); public: void setLabelPixmap(QString filename, QString icoName); void isSetLabelPixmapWhite(bool selected); void setLabelText(QString text); void setLabelTextIsWhite(bool selected); void setSelected(bool selected); QString text(); private: QLabel * iconLabel; QLabel * textLabel; QWidget * widget; QString icoName; }; #endif // LEFTWIDGETITEM_H ukui-control-center/shell/component/hoverwidget.cpp0000644000175000017500000000354013635333016021560 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "hoverwidget.h" #include #include #include HoverWidget::HoverWidget(QString mname, QWidget *parent) : QWidget(parent), _name(mname) { } HoverWidget::~HoverWidget() { } void HoverWidget::enterEvent(QEvent *event){ emit enterWidget(_name); QWidget::enterEvent(event); } void HoverWidget::leaveEvent(QEvent *event){ emit leaveWidget(_name); QWidget::leaveEvent(event); } void HoverWidget::mousePressEvent(QMouseEvent *event){ if (event->button() == Qt::LeftButton){ emit widgetClicked(_name); } QWidget::mousePressEvent(event); } //子类化一个QWidget,为了能够使用样式表,则需要提供paintEvent事件。 //这是因为QWidget的paintEvent()是空的,而样式表要通过paint被绘制到窗口中。 void HoverWidget::paintEvent(QPaintEvent *event){ Q_UNUSED(event) QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } ukui-control-center/shell/component/leftwidgetitem.cpp0000644000175000017500000000661013635333016022247 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "leftwidgetitem.h" #include #include #include LeftWidgetItem::LeftWidgetItem(QWidget *parent) : QWidget(parent) { // this->setStyleSheet("background: none;"); widget = new QWidget(this); // widget->setFixedSize(120, 40); widget->setStyleSheet("QWidget{background: #FFFFFF;}"); widget->setFixedHeight(40); iconLabel = new QLabel(widget); QSizePolicy policy = iconLabel->sizePolicy(); policy.setHorizontalPolicy(QSizePolicy::Fixed); policy.setVerticalPolicy(QSizePolicy::Fixed); iconLabel->setSizePolicy(policy); iconLabel->setFixedSize(24, 24); textLabel = new QLabel(widget); QSizePolicy policy1 = textLabel->sizePolicy(); policy1.setHorizontalPolicy(QSizePolicy::Fixed); policy1.setVerticalPolicy(QSizePolicy::Fixed); textLabel->setSizePolicy(policy1); textLabel->setScaledContents(true); QHBoxLayout * mainlayout = new QHBoxLayout(widget); mainlayout->setSpacing(8); mainlayout->setContentsMargins(8, 0, 0, 0); mainlayout->addWidget(iconLabel, Qt::AlignVCenter); mainlayout->addWidget(textLabel, Qt::AlignVCenter); mainlayout->addStretch(); widget->setLayout(mainlayout); QVBoxLayout * baseVerLayout = new QVBoxLayout(this); baseVerLayout->setSpacing(0); baseVerLayout->setMargin(0); baseVerLayout->addWidget(widget); baseVerLayout->addStretch(); setLayout(baseVerLayout); } LeftWidgetItem::~LeftWidgetItem() { } void LeftWidgetItem::setLabelPixmap(QString filename, QString icoName){ this->icoName = icoName; iconLabel->setPixmap(QPixmap(filename)); } void LeftWidgetItem::isSetLabelPixmapWhite(bool selected) { QString fileName; if(selected) { fileName = "://img/secondaryleftmenu/"+this->icoName+"White.png"; } else { fileName = "://img/secondaryleftmenu/"+this->icoName+".png"; } // qDebug()<<"file name is-------->"<setPixmap(QPixmap(fileName)); } void LeftWidgetItem::setLabelText(QString text){ textLabel->setText(text); } void LeftWidgetItem::setLabelTextIsWhite(bool selected) { if(selected) { textLabel->setStyleSheet("color: #F7FFFFFF;"); } else { textLabel->setStyleSheet("color: #000000;"); } } void LeftWidgetItem::setSelected(bool selected){ if (selected) widget->setStyleSheet("QWidget{background: #3D6BE5; border-radius: 4px;}"); else widget->setStyleSheet("QWidget{background: #FFFFFF;}"); } QString LeftWidgetItem::text(){ return textLabel->text(); } ukui-control-center/shell/component/clicklabel.cpp0000644000175000017500000000224713635333016021321 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "clicklabel.h" ClickLabel::ClickLabel(const QString &text, QWidget *parent) { setText(text); adjustSize(); } ClickLabel::~ClickLabel() { } void ClickLabel::mousePressEvent(QMouseEvent *event){ if (event->button() == Qt::LeftButton) emit clicked(); // QLabel::mousePressEvent(event); } ukui-control-center/shell/component/clicklabel.h0000644000175000017500000000227713621411724020767 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CLICKLABEL_H #define CLICKLABEL_H #include #include class ClickLabel : public QLabel { Q_OBJECT public: explicit ClickLabel(const QString &text, QWidget *parent = 0); ~ClickLabel(); protected: void mousePressEvent(QMouseEvent * event); signals: void clicked(); }; #endif // CLICKLABEL_H ukui-control-center/shell/component/hoverwidget.h0000644000175000017500000000274113635333016021227 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef HOVERWIDGET_H #define HOVERWIDGET_H #include #include #include class HoverWidget : public QWidget { Q_OBJECT public: explicit HoverWidget(QString mname, QWidget *parent = 0); ~HoverWidget(); public: QString _name; protected: virtual void enterEvent(QEvent * event); virtual void leaveEvent(QEvent * event); virtual void paintEvent(QPaintEvent * event); virtual void mousePressEvent(QMouseEvent * event); Q_SIGNALS: void enterWidget(QString name); void leaveWidget(QString name); void widgetClicked(QString name); }; #endif // HOVERWIDGET_H ukui-control-center/shell/homepagewidget.h0000644000175000017500000000252013635333016017662 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef HOMEPAGEWIDGET_H #define HOMEPAGEWIDGET_H #include class MainWindow; class QListWidgetItem; namespace Ui { class HomePageWidget; } class HomePageWidget : public QWidget { Q_OBJECT public: explicit HomePageWidget(QWidget *parent = 0); ~HomePageWidget(); public: void initUI(); private slots: void slotItemPressed(QListWidgetItem *item); private: Ui::HomePageWidget *ui; private: MainWindow * pmainWindow; }; #endif // HOMEPAGEWIDGET_H ukui-control-center/shell/res/0000755000175000017500000000000013642652167015323 5ustar fengfengukui-control-center/shell/res/plugins/0000755000175000017500000000000013642652167017004 5ustar fengfengukui-control-center/shell/res/plugins/autoboot/0000755000175000017500000000000013640364120020623 5ustar fengfengukui-control-center/shell/res/plugins/autoboot/desktop.png0000644000175000017500000000100013640364120022771 0ustar fengfengPNG  IHDR szz pHYs  ~IDATXJ@o'-ӝ  |BE\P(D]u gq%).\fc2NL2MRҴPidsϝ Sh7o/>>&΅Dp pt%!.WThB^Z+9,h* Ј pٶ]#1& l) oBL=xp9ϲ,17b20Q/ZF (4P!2r Vk"-6 #pMy t4ߴ īj0&^T7-n$XF&kA3.gONFTN-V2lZp ÏIDATx] Uŵ}4eh$P~Nl?E#1Q"AN!qAA%EE "PPFA@i!{'ʽU:8ku{k>u]u+$E5 > \\\\  <</O^Aqp_P'15xZgxoť=ŁrO ϢOe݉!奫< /짃 ~դ ~<<_^ ^r⧀ǁ=\8ͽ1{N@ j\S $ /ԕ/)/0"U9Lfrs23mVKLsCi8 L*E9d:xugɿ=9* SxFO4H]-<e1?xa:u|Z؅z)7{~x~od&Yq[ju nk(8 =^e()oP9Dxq-⨆'y';jv܍@=]b2Bh20 'Fe!*) v)> eF΁\i)x'ЎMZZxXy 5 [tV1X嫛B^МL6 p.B6h3 v.OC-' MMEe+HY(\o>xMLfa0p6/5|Q_hX2{}_J6m)y~xW&f'\-n_ƜڹxQtЫDqk\aZ)%h(5h\ۻ0SiC,5̋{Ffк8"(pcWb|[PF{u|Wg5S|'J IHj+'Soʢ _,_%it6TJDmL˕xBab[㰦"jPh~ |k9NԪ8pk27JK]:ŧwE:OϪlo4NpN`@hS -{LcHōh(4g~y8JqI@ ﵐ*PtqٙD{}b߭8:_-g;J4y#\! .joG~y  2&M*q NhDCE~He6jUMH3 _ t* {X[ms|hV&9; ޠcշPЕΡZip' 9$([`8^xYDct,Ic< O!rRS?ЅhOa1!ghJOJN)a rvY'T*_e(4*WMDzE9}P@-q%B9ܫZqa->QJˀ6k#D;]P0~|8lcf 5bIb"aܴs(35$4jT2 P~}:qQVhP;$`PhjB8j:ke dl0jkIŽ6:^s&q?GP]1Ze >!+Ȁia99,r>6&ԶDQ^eD5pE6&$dLb<]>l3[m$YPlJzCVhZ !6FK tt[Dv'LG0:$T; ,6p5皜ϳ0gYQ@\@&)t{MsNxAi`ByudEkzN tZ}p,$"rP[,ULXE589vxQt+8.ڴd0IJk(G;\X\Dt!Zև-^:a7"|} AÎU\ m\[W܎tGS;7Y""o? *JդWc/Uҕ~*ysvG`=<_#?rqN jT@Äwݭ`} #WGg¤Bpgq Ξ+$|J5+b@j537",d|S\?7BPrƕC?_ ɼU_ͷ?aD숴t_q!4'\"3*Cw;™?TFG]9UdNSs"jm_a$FkMݳIH+י.&s1k4_e)K u qx#QSlDžx]&d`c *{;1yF>Ʌ~,A䎑`D_k4K0wD%$0yZI rKh5'gD9C̳>_"aژ1C39yHΔ9τ>Hx`N* MCGW'j&RNe/"Á8)_"V[Mtd2f(*p2_*a% AD ^ǻ{ 6=kQBror'=O"|ϜtʹsyKBz=*߯/i/teKa#y@(`{a~}Ya$N^Dy`(se&R'j0 >~_ߓC5NBހX+:TH9ZQXOF˻+~\l2&5,' YQe*ǁ>MKd^FzÏg)BPir7U (hFO! "ttw㘂[aijq竳,SSBSQd-42|CҝBy6ԆzX?֓Cj J0 feSV m~gi l5x iIAs-Awmw#H E#)FhզQ<37U\@u@#B%QBTv+ 6K܎\Z` Gu~v;?+F|Tqi|UbR<\MJ4ҢNys0Ac04e<hniAk`{k'pzU}Eq ]tySLB#6Q243o(Ygo͢(l +ooZCj9`?>> h*Tjt=We\nG{L|;\SV7ٗ j6*vҔpuq[%"N[4XA4kpSp#fPu!1yיIʄzrMeN_&ogu$S2Ku SI]\tcф}*36q=2Ojn6Il9u :Vׯ'MDbZ?8^ݎ5} *ooAyB\Wn랭1t"Mi(mt7 krP2)bmm Ho" @XF[C~g%؈H`VLu!tq?sSID} ' ^>OaM%! /iaB)ZjqXF>›1GRn?5B(`GsϠFIENDB`ukui-control-center/shell/res/plugins/shortcut/0000755000175000017500000000000013642652167020657 5ustar fengfengukui-control-center/shell/res/plugins/shortcut/note.png0000644000175000017500000000044013635333016022317 0ustar fengfengPNG  IHDRa pHYs  ~IDAT80̼o$+$N> ]x; \=j[%7w׶-4y վ@+nj_gqQ I^lw: @6ݲpaSQ%; ׮X:9?j/QNH!6a&wɛiMQ&aDN>cs J52nIENDB`ukui-control-center/shell/res/plugins/shortcut/add.png0000644000175000017500000000042713635333016022107 0ustar fengfengPNG  IHDR00W pHYs  ~IDATh @a H Rۇ԰p6֌17s$KH6(","105ņ?;QjTGVo0h @c^)ܮ=q4_R3ç?PݰT+}j|4!n!41h @WDQȊp6kS'^%IENDB`ukui-control-center/shell/res/plugins/shortcut/up.png0000644000175000017500000000030013642652167022002 0ustar fengfengPNG  IHDRa pHYs  ~rIDAT8c?%"\ 7\k,@5```` e``pf4-n4m&|ar AvA68 eK3qM`IENDB`ukui-control-center/shell/res/plugins/shortcut/down.png0000644000175000017500000000031213642652167022330 0ustar fengfengPNG  IHDRa pHYs  ~|IDAT8c?%"ѱ!a)vtt```8a a0J*ĥY- AӌBtf 6X @3*WLPCn@v4)Sj< 8U`WIENDB`ukui-control-center/shell/res/plugins/fonts/0000755000175000017500000000000013635333016020124 5ustar fengfengukui-control-center/shell/res/plugins/fonts/up.png0000644000175000017500000000025213635333016021255 0ustar fengfengPNG  IHDRa pHYs  ~\IDAT8c?%"#GG&~ghtttL```&]C3̇B.bcd &eJ ```1IENDB`ukui-control-center/shell/res/plugins/fonts/bigRoller.png0000644000175000017500000000043413630066010022544 0ustar fengfengPNG  IHDR pHYs  ~IDAT8Օ 0?9L aIdG( 6r`"[kMq'/#Pyh5i]r0u:uפժ0/h kҧ'2tNͥAr<dsNJiĢFY E&ЈFPA撧rY)BW1{ XO ^Jխ|IENDB`ukui-control-center/shell/res/plugins/fonts/down.png0000644000175000017500000000030113635333016021573 0ustar fengfengPNG  IHDRa pHYs  ~sIDAT8c?%"tGGG߿^0000 AYCÀ\Es"TH" b xSc Ԍ&eJ ```?!pژ[IENDB`ukui-control-center/shell/res/plugins/fonts/smallRoller.png0000644000175000017500000000025413630066010023113 0ustar fengfengPNG  IHDR pHYs  ~^IDATc?]γ 𐁁 OA R3) @ @QP ȵh&؁Hmc;;IENDB`ukui-control-center/shell/res/plugins/printer/0000755000175000017500000000000013621411724020454 5ustar fengfengukui-control-center/shell/res/plugins/printer/add.png0000644000175000017500000000042713621411724021715 0ustar fengfengPNG  IHDR00W pHYs  ~IDATh @a H Rۇ԰p6֌17s$KH6(","105ņ?;QjTGVo0h @c^)ܮ=q4_R3ç?PݰT+}j|4!n!41h @WDQȊp6kS'^%IENDB`ukui-control-center/shell/res/plugins/printer/printer.png0000644000175000017500000000056713621411724022655 0ustar fengfengPNG  IHDRw= pHYs  ~)IDATHUm0 <#H7#4xvvVD[0GeX"bhw{pTF8s02%$.;5'1֜kH,`9*@D ((,aw97t hʝ!mM7Y7u5f"MqH _ʦrk¡9 Uj.?A/)D 9G؛!v/YlCm3:"]5X"z7ٺ| z' 5wx$ЇIENDB`ukui-control-center/shell/res/plugins/screenlock/0000755000175000017500000000000013635333016021123 5ustar fengfengukui-control-center/shell/res/plugins/screenlock/none.png0000644000175000017500000000022213635333016022564 0ustar fengfengPNG  IHDR44xYIDAThρ !Y>H3AffCnkHא!]Ct 5kHא!]Ct 5kHא!]Ct 5kHwgݖIENDB`ukui-control-center/shell/res/plugins/userinfo/0000755000175000017500000000000013635333016020625 5ustar fengfengukui-control-center/shell/res/plugins/userinfo/default.png0000644000175000017500000002362213635333016022764 0ustar fengfengPNG  IHDRx pHYs%%IR$ IDATx;UGk#@vojXݛ:V18'J3gб'ے!t9NRR}iqQn?oW۶ fZkmzeB!7ߤifcHڶ| C[LI&E=jv;yMeJ* MӜ8@ngqm;q*)A@$moUqPǩJp4͋>dOH#idӨ>{)!OIJC ~w!VG *N@Rv<P3 U95w<P EK{wFJ\h^H K@q½Ǣ=6qgR EH{)Ӈ <1U@ $LV۶>C:Z&x3E&%易o98NcD@L,-,&*&- $WҶ|Gw'n*04ڿF)Y\/$P`TFFէRi0(}0mwS71%}ЫTh$ xhz>I\:~QLD$t&]W:56:"`c? jO"@$--{h‚A6"`e?d U$D~ȚDHT"$D5\F,IX IHX"D>&>P, -{ Z sBP? n~-"/ӴT*-{t>ڏ)PB~jԶm,z;EN2*I'3*!r?0Pm++O wʦPmor^i`y$Yhkt&B"?G FP4x\zm&0q3FP DP 0 YdN`bR_ 턧G`"R78ߩZ:H]'@`ڶ @vRRT2f0afN) X 1Sj^a_&.~42mn(^4H2V?3 n%SH|_@n]n$#K3BZjqL$m{l^ᾭ|? F"X߿p8_P @!$H۶qUGdzf,G)k i]$'ziyӠ_?Tz`?@g @N6wՉPPz@MH;bxV΀*V*vmЊp7Őbm?3(L6MS"y6tv!K.\M18%mZ@nRnM1Ŭp?=vKXD 5lx"Уc$)s&oSm!ozW40~F2S04YMR > uڙyH[~Lqk* [ 8)[$Nj dlRGO&H8Dzӎ7S2Sx()MLLb* @T LV]Y˺u+0UYǰlmkH,KYN8Bd{lpǂ?bZv@ c?J]l*hV_Jb\6e 0 jNeQ>_'}g4MsbA`. M`5[[[a{{{O`%/9%=h^~8U駟fݻwY|O?tܺu+\~}V-.u4 5p/\,o*Vvwwg d5c'q1ă>d*s+;;;ȣiF[8ZFV{qYϥߕ8M/RU~nU3swG!#q_ q_XŃ04ͽ1.( @jŐ8&__WoT 9X ?Պ~fXꫯ$l* ?zSܹ3rJv 0x` v?/2,;qX:R==h/g~_|,P 2:0q-}C[׿Pik1X`OMfl. {ךa1X`98Jީc5N*0X`Ć>=RIxB`*']=0ؾkqPAbf)Y@z 0D`oq?x㵇;{SWl#@z]0H=P `*T~T(qai7}z}V FϓJ玀(F\/+ޛx0JڶgOIs>j`ň{7t"⽊ KL<Hmsa l˴{b+NQ0O1;M{NdV9"x ?fe<#`X-Fw\3BMڶBd0eܹg줘}e+0ysX*f/(3ivYg,UB۶n4KPn*Qm^Yg,p ?KeyV(ĥ[@|, @6KڶUOSge7P`tv@ ~Yp6 KM0MOl*vn,P>MjV`m)mJ1#U gP3c m |'KP3cG erVl? 8z, P'_,˳B$ɗ:P( ujƝg) uq9XͲ<+鎀+g lmn<#@@-b AWܹg™Nvg]hLO?u9S|6T(1$8`(lPXXP[nɜɳA%L4xׯ_w9gJObW{9->ZSX@vw=|3AENvc<T O5^+ς?9m[y<+vP8)0Of1P_x u/k P*Po⽷u0dXK@f1_l { 7߸qϩ,ѩu1c)0\߽>i@Gwܩ2/.4Y7]H{kNɕ+W,+X} .n/\{j'|'ő|)8%׿,R>gb Ʀ/C85kw [[zdMUwgi .LOgqb@;hb=.&K?LUg>q \nwwע (+R۟8 950_XK2+ e$DXV$ ȋ$ya}X$`\?lFk.f76{Wqq~9 t0Ӱ=>pʕomm&.&_5zjOoBL( s},)?ׯ_7d$/&q_;G.h O>Ye|FOH [I2sG/ϟ L?199wCtC KtJYuFM̪ @W;ÐӧOBܹsgV{4ÀN`+ D̷3 U,?ydj޻wo6E8h$<< !uZܫwZ]\,x]}^4ǿ]~}w9] 1tN:G1.*,/%d@8#N&>-5E_4k'; Ob.;+{6?Nr4͵?3`GX]t~z`H'[Y~G\ /G _N='݊X|`M5@;& `-YË/T;޻e @ ~i(1q@ ۵_w>;ߎ1#VcFruw<cVGKǃ;|.[[[x>yeƬv_Pw,=5H#ݭZx׳pȠ'!cݺuKUge}=Hg)*gY x|B1/ ?1R/;n{\*qŹA(S|g8w6 @j`[ܹS%ngXMΒS &m *?G)e# qZ޽[%Ng#ؖ]`A6!; ]/ ,[c X8oƉa0q2jߢ,HB9C_0m' sZ( @L8X6o/T˲mX88%e#u4͋£ >J8-&"% R VqţCJ޾}A9?6M3n\ !Б=|㊁?'s 0 ObCfQwxx_Kbm?/cǿL*b5ӧ_ L $=#=gd'|NS1 GGZ8ⶾx J{9˚l'q*@ŪWׯg? >?ׯ_7ڟiv᧞lW38,)&Jw@ 8wd-"t'CG4ͳ)S8 B|G,N=aچ}zb,trV8IDATLS9gTBڃ9.LL)?O1 @x< !8S8K۶/ #/Y,t8Ŕ E0u{~.Rj 3eQGS:UEXԶm\q7OEJQV$a[y 7C~UC`(pG60%w :@.eIiߖ2U8,UU@eYUkigVEﻪZ+!pg82΀]I@UwnM+Ru~Oڃ~Pkw @ЇW.P*_De؄ $!8$` XpmC;YHN;h1PmL$Hm"w%2u$KL $YW$XBp0 PuvI@,&50: HF#oH!IH:DG nXءmCb~!|<t(=_w,wOm !C 8wKA s$GGm^Kڷg*=Zhl  m!?Wۦi~ 6A Y? #``.~'A4,;t)g `dm> !<"5=dmX xf]P8i}7{\2^ dm۸n(338Q($??3*J8GXg_T2p෵_ `'o*жT Kq?s0ES_ ki?*qGMЩO$tNC!>F@hK$ ‚AX} F:3=3ǩc Ih=TܿDH1'0qn>9T7%&e?3'G׶͔ܶ=qnE$LJJ6HF>"`ڶI#y0E`(S YX@x[6t|G@Di].G }P, UIS ?8`^)!(^ /|I` MSwa.\H,*BaO+JU?5/j$ЁT)Nt#O$У V [9#7)Izz$f-@ YRIDATXŗ[lUg.; KQ F$P5x1Fk$`MË!># o< !`ЊX" 1ոD([m˶mwgg\|.qo.wO8ŝsFI8V8ͮmA!J&40.{{{wpݕZepkj9zNGXB:hhhѣGvtt/옍>`35w; [icY*+sAl߰aCRX֖ٱ%@7A\WxJMmiKjbJF87~1`ԬwlskGzpߔ!nswwˆ+C;;暇xޞ(Pt(+QiLZk+lJNtϪ{B/tezKj2;-vڍoue$w^cw9_QRhƭ*?mjP=hqZ*PAKnXBM:Fb d8) YUW@n,4`NΜV]CY~ү6(a*Ao'P֛>#hE5lhtjW`4!3xH5KoȡPΌmCi`f ]X"@[(ŚwO dGK[Q-2%9@OB" kza(P`P|9$=d`.kȚAŊoo|ܿptLwLǼe ޟ9%H%*U?F<0Ly[~A|L|mm/.4^آH@⻚݅)Wla\#e¡]8s?%8~kNVH trq&\7J=$GR)NEIL'BT <IENDB`ukui-control-center/shell/res/plugins/desktop/default.png0000644000175000017500000000642713621411724022605 0ustar fengfengPNG  IHDR szz pHYs  iTXtXML:com.adobe.xmp hqIDATXŗklTsz^Y1C ⑔4jx*iRmQKK%JTjP*QFP"A "-y0N`c0޵y]%ά9Bkͧi/#eRaԂ aDV)h\Q>~Ɇ3&NkZOH@;؄06 Øw/^)خ C]T)̝R/ ֽl Qs;=*c֗# ZrҝXئ?u"5~XZ!-)p5XP`_Ӓ<Xj/ObC^JZ홒!7fhR-yfbyHVC+'{  {w9_Qd#c+l_|t@%C@aDJRN0K6xOd:`_/m34pF-ܜ"6<n2O3+J lXm˃`8rM!"-pl}(}+H";) -ɲRҝwJ3lg0EgN倔-+/dul 0K,(݄\lz@g M % ^6I90?Ǯ^lcsbD\r q46M&RxD$X،R, _"`T$ms Zr0De~eA7 ?T6[xf?҆Y\H~@a"r|ܓc*bG"m7y?x|svmZ"eC^5p5Jxn - bS=tGa~iO&h L4IHUqO+0( 0BĂC  ~p:#4!aBȀ2yKFAYPPDP1 _LCݰm.p$x B2!%ѐVPajB# yN] \|vW=BLȮ6xT?~5<*0`D|›L%ou9t/n]Fr@-Vo]e'#'癈Wy\xGLUy3%h5kžkWb=:bVW|VmX_WƼiA:xpVy>_sa y6ϳ@~ Je3! +D|!YXAf, ݅Z:=?ȖTpkB!v:cKyA_ e$;ƕ⛳ r|=XrrpgzjvWkF# bל/x@t:2dռw7O_SQ2*3e*>9gOq  )JOo]۞~yQGPEHv<ğ;>*4kħK?E7Es;.uk^9O kΣdw/zAn cc {,xw2HS9%3 7_:~ : )6acrYKU"MV?cEqxZ+;y#w'v8pe2jNF!%pB=I{ԆJ:vcěh"4Ƿō]/CӴbE0IENDB`ukui-control-center/shell/res/plugins/desktop/computer.png0000644000175000017500000000576613621411724023024 0ustar fengfengPNG  IHDR szz pHYs  iTXtXML:com.adobe.xmp 8~9WIDATXŗk]U{sΝ;w:w ڇL vbiT"m )#(D * O5oR-hK0v:C6RڙΝ{<L޹w1sM>kZ9SS@;EE](ffz7a`< !fs\Hd?V`X[`h#^jc̽}=&}Q)"p8H)!O)߳R#^:4~iab4ѫޱF&xa~<~8N(\j+rGġSGEP@)J Dڑ]7߲c+oq@c :$ʞ ty% #b#7m<T% aq^"/,tzjƴz\&+r#c `"M; EO+ 4Ф]0Ԓ @ @0R4:Ҹ{,ph',`m[DVZdJbCX! x U͊E@XC36X؋2:(@tIS  F V(M35EtbCvHDt(1XۮG%Oc-a">+YZ[E)Gq@00 T*QL'rYRj8KV\ 8Bt=x9H,/$CkwХ8ϐ%Is^ b@K5:kzz8JI<ϧ!IS1 c)٠) (JM8> Ā$y5VjxKw %H ()gϝ{2DQDT{7 ӌ"zB807Ɵݰ^`nGJ^Nu/arjtz/N7\UQo61 ZK5aac7Pp'~nͷ}}/fnBHf "@֨j\14Ȯ?Žݷsrb|xhBu塡o,nBen~)˨z7:em'%exؾ{0#` 8 3W|r2G ȵ\`%IڋD٘ɏ~mRνe˫G(jj0IRqLʧj̣zхJ,ph\z/ndKp֑O޴R`wkLɉz_Ɏ`WM޺gt^5+yxc `ܨ7\!mDOIENDB`ukui-control-center/shell/res/plugins/desktop/trash.png0000644000175000017500000000565013621411724022277 0ustar fengfengPNG  IHDR szz pHYs  iTXtXML:com.adobe.xmp 2IDATXŗ]l\G3wY;NZ{cm APE$)T ( yQ+x@O "*!GXm(A(-IS#k^/^۩JI43s\ꕡNZuE+"J)-"jyj^m|4C,v Wιu}ҩ[:69^'pBh6鿏F~?wXָle2rr?e2x~g Z{bUYT*}/w߹ɩ'~z{EkޞaZcNi R(OFZLyq..ҝCT6|䫇?<6{Sώ՞0CD)zҤS!||}5M'XkɤS\EN9G: Za<<~ܩgW{䧮cpJVk1 V,af0 J |c0ƠBP 6= Nvsvhp$q}RP(\Yv>d @ZݵN@#"1  ^X+V+iGiv+GVU KL]V) ZcT!Ӗ 'DVD64g"+h |RZ"kq=kH,$FrоTK1)`S҇V.r:1*I_g#F Jzj撀JI wSn\g"V#eLIENDB`ukui-control-center/shell/res/plugins/wallpaper/0000755000175000017500000000000013642652167020773 5ustar fengfengukui-control-center/shell/res/plugins/wallpaper/none.png0000644000175000017500000000022213642652167022434 0ustar fengfengPNG  IHDR44xYIDAThρ !Y>H3AffCnkHא!]Ct 5kHא!]Ct 5kHא!]Ct 5kHwgݖIENDB`ukui-control-center/shell/res/plugins/keyboardcontrol/0000755000175000017500000000000013621411724022172 5ustar fengfengukui-control-center/shell/res/plugins/keyboardcontrol/add.png0000644000175000017500000000042713621411724023433 0ustar fengfengPNG  IHDR00W pHYs  ~IDATh @a H Rۇ԰p6֌17s$KH6(","105ņ?;QjTGVo0h @c^)ܮ=q4_R3ç?PݰT+}j|4!n!41h @WDQȊp6kS'^%IENDB`ukui-control-center/shell/res/plugins/theme/0000755000175000017500000000000013635333016020075 5ustar fengfengukui-control-center/shell/res/plugins/theme/default.png0000644000175000017500000001124613635333016022233 0ustar fengfengPNG  IHDRZ@tEXtSoftwareAdobe ImageReadyqe<&iTXtXML:com.adobe.xmp ͖ IDATx}lU_oofB [sȌ#mcN9eEe-,1˒)-q DA > *Jр(ɔYq px_ɏ{zws+r'kqWTk 6CkU 8ZZVkVfZ~qeHkiZ6&1_lO69u B|S٪hgk_SboR:Pf7֛%h2Kf 0%h̤ c"h@A -Zccc h KqǐΖ(:|I,@1j΅7vA5( TH_v [:=NWp W3ذ7zPHjЁi.s:2>f)pȂ.RU }^)plTvm100vܩݧ:?FFF2UYY:,5c u%sՄ VFVrPņ|]QԤٻXkT}O1u{E nU3Uݸ*5w\59j̙NM8Q,˩NuԾj߾}j(Fg9]+_WʆAVr,a[ ;OC}Z~_{jҤI|ii7SK-RꅗMOG"dlK L{w[~f~jƍjѵ? Y+՟+u%PLe3EV>ܨFGGCWgR7׫#ϕu^٠3 Pgؕ #hioW/Jmw;}_yuG=c :b}=Zok֜>' W#k=fg֪OM:u:ealΛؼE>gCO: u\r=Ⱥ| N& aκC9CJoT_;>-]zO:1EN'|2~+9G-Y(/N3lJTƧ[H,ߐ뗿XUEX},n##^ ~^uQi˞ P}9:?X_w]v3_SNH>31f^Në{u!.hN$ c }a>8tȷɺ^inN̞5+}7>ʚ=Ƿ6D6_M6,NtvnuȺ@EeB}@Z*눋(HiRE\zO^[:"Sx^ؙČ8aժIM6MYQggYMؿݦZ^}5ءLXϔc-g}yyYVΛM[GwO0P[yyY㣏R7oɛ.]$h1kɓ']ed4mniQ}}}fS7.'Ȳi㏫֭N@ ˖'Jye=eLޖ{%o3)g<\)4P7lg儠\Ir>:$(b}KY3g:U3q顳Svw7T._UƂ14ilr#_ d2o_}「F #h@A -Zb{ɓ'@m~;)A -ZA -ZA -Z h-@2@A h@A -@A -ZA -ZA -Z h-Z h-@Z h@Z h7 uÌZ h-ir @Ih 3Z h#466o@*%-a|e;sqh~(c#.-v1'OGHE"h-5>S3fU"hl,322+F2Ek%zF+oNA1,Lq Rluкݳz<򗧫=@$KY|J̌mq^-RBV)kmԑ#G(#(\ !b~VȊlAZm1mAѡLjjj [!}}}ĉ2~q6.c:Kn5~xugqƩJ,IuhhH/ ~X&BfFk N/zDPZcxq >д5/}=VL0g8sۆa%L[\Ίl؃6K1>$7d3_6(d,Հ96_.0 ^HVA)%Xm1Mk^ ]Y@gIDAT8K@_bD L:XU+- :dpp5qph;9Xy.Eb*>p}}F$P;@NV3fwhGVKMx41E! q6Low<^UۄQ p.GxRwzrcJ!L=vRW'5x2n8z޻h 4`w֒ƺ4K3{6R;) , |l OܿT E8A;Lb[sQ, RYg߻#~m&IENDB`ukui-control-center/shell/res/plugins/theme/light.png0000644000175000017500000001075213635333016021717 0ustar fengfengPNG  IHDRZ)tEXtSoftwareAdobe ImageReadyqe<&iTXtXML:com.adobe.xmp Jl1ZIDATxU5gAI0"2h &ƪ)I Z! nBIїmD)$ }c5iL@ք Lev_>Z{$s\;Y188"z=嵻6I yڟYΎPNnmZqzMmpJȾ'#(߯ Y(Ϯb_^d\P#^O*,!ٺ^v9c,,a"cF+Y0g"a-@Z h@A (\/jll,Pq- ,ͪ0eF·Y"|p΃V',* ;TiW,h1~h)pթ`]nl?.Un4vZ .P4dJ4gt¶u2G ` I2%X!6YnU QZ&jU9M%.slVFVg ĴA}wōߎ6.`LmRF٪jT&lpB)~ӧpA6ڱ8c]==@gΝwx޽{+>o￯>#gVgϞoӦMS{zH=cm6УwemʕnVґɓ{#=٩G͛7ӧO{ocǎG!GU7sZ}k?@Z8Qm++,\?zg/}W1d/_vڥ/J>|X;dd}}}l]NquCNh Xos\\ ŋ=zn{V͛Sre;GBvwX9gX}T( -_v|ᇵ;OaRl2z'WdY̪>qѐo^1u@dǎ-OUc-6Bm*[tzGƽY,웠,ڱ\qe_?gޯ)}bW6jU#Y!ba0WCE d1cڰaC1غ<%}A hx̙31urwZ=Puk> ZMMҥ^{>yLl޼Y-^x?҇T@E¯GϞ=ۿ޽{mfY=trw( &[۷ՕlyFeʲZwZ +~ϟϋ-RrÇ[,С뎠i4n88[nkRuJ0iydnjVseϥ:ǽaYhrN>s-__}z7Ց#Gԅ #XBm0:ٳ, Ze-n?u'>`[_|9+ZӧO_/\@-YD-[ /Pe #h@A -ZA -Ͳ"###5&}75S@A h@A -@A -ZA - @Z h@A h@A h@A -@A -ZA -ZA -Z h-/CE -$hYLle-@Lm+1 'gM y\*('A|Z?5:`j -{j:/(x U-llE+/ hi/nddw„3%)Av/ vdI8_ZɧT/FKOoJeMζ:'ì dddH7f!+&4ʸ/ؠ8<0rАj6~*VZx5m 1YE8^rի~k4ӿd'2= kx낸pMEmqUo܀cd0JIL(K ͸4t_45pPKeΠ>qs:xY4=HYUdm@ ;1M9 !bsK[1W͆6.O|P"3Pm}ĭDc_Ew@w7.KyW|VeD\P՝>H-rY6JwȬi NiUb@g@*ʱM ٤.R<[D4m+[&(iT' ۸9ԁmˬMҪ"3i{t6nU' Y=6MzmLX ڤ6)tin YށM YݩJUi{L#D_@٤u2Fqf]i}qJU Bʈ+i 1~tJIDATxkTg/,"Aij%j q`?`QrI'ME$lLhhIJEW6"X l$i.JJ.<=uK^aΙ5BA,66ؾclCƶrccb) 7Ze؞19׍m Bype4s}@&g:mltF;@$s58it%4p, È,De b-ZB @h3g2Mi8@ io}APn@}H* X*rfCCR:j^H<;݇;uWP n" 2K%nMOpmɠZ'n2Od~dӦ7eΝ#SN3Vz9r\z*'(FZtglR'?3Pڵk[ r-w6xZCjְcKh"k.Zt1Lj#~%'Nt[|Îm"fZ,@>, ,իW ^$Qhfnݾ}Lx(o&Y[+KV m)!Ym?\n69r(ijj_~"Y؆He?D@(%kg@z.NBMѶ865Bd`Yݰa>}ghS-NqnNGXnogرӶ9q%nXǺ; l_iӄ/Hނ1]m^57׉V@N<{6mįYmCD6%{jܔ32q~Aiߒo;v_2ϻ!Cd|KKq˥Y;{eWWWqw]#??&Gdm9>& ֧_x1 .;np ijj/H0AfͼC9"uv ^>,zlnm$茕"n{}Wlݖ:wׁm*y펑߫ΙVWZmX졭\i剼9FԱj eydСeG{]wsoj~`N/~YÏ>׭}\S΢K.X/]*߽}꾓mMbF|ųRcYGoݧ;mngDiWV6MdȐ!CEBݷc;I=Osɱc"GбhN[\}UcXQw>efF">,VE>ceMs7e֏g6c1 ӦL-yIy?Ez ݷEY|CB\t,3OJ-EҎ?.Ϯo#k91}ZΘ68v^S_1K_}U>}g Ç }Ç΋Xfט"igV}$_֖=5.(@[$s? m/gVbreEJ{PY3O̪1cTؙZ:h={*ޏCe{nUMh?\>Ve$;e-isWȬ}d]KQ7-8#}LynY1 ssq_۬'{Z8x/m+叝vZ8x/moț-tLІǐf~/z;9zl޲%qܼ8v^ÌYw 빎\CB uqB!ҳo^6^Y8&9zҥc9>Inor?w/NM hPizp۶R[[[+ݖ65513*W-KV gb-Z B -B @h_k~F?Z B -B @h-ZB @hB @h-Z B @hZ @h-ZB @h-Z B @hZ @h-ZB Huhkjj0B в& Mn3ZmZ _m uJ9#F4:mKJ݌7U/ t8'cjZZ WmI4vG2&BgnlnBkޱc'ƍY 4cǎ-%sc >@4U .M BkO{BSjCkz7oӖhSܚ_Z:pzOogL:g |Ŗ&WKAc'?od6-[ )Q!* g3gk5o |kϙq&YdહY妛]sؚo[sZjXF5v-E_mlذA:;IWW8qgaÆaOV\rlhh 9vѵ7mf봙gvSNCr}6q+ˏFʨQq4u^j4nYǥ-)؅i?njَN m>YcuJ+f~*?,}vT ]JiOdͷfjֺ\` ]pPAkVҾKv6hk44u\Bc[:[df= [%lѭO:>g3[ef@u/8zf[:29"/8h^T,T:a` ,-XtVk7C{'yP6m.aaH.~bdW9+H,SdY\]݂g w9bvkVZn$qpϣF1.q/^Kz's3Z?Fg?e?r LjC3c&@ DOXl3Z?h+9 l[DEeZ Tg`F3 QF6:-_nt΀BW_ ݚsav. D݆D/*vY,m%3\Tz-^Qe T_|\op koz`>`,'fк0 qe1KiJ hh{m "[kg+"ECqthh3Hh[~fl9&mlE)Dcͱn4C>2Vc8@` 6Zc.}P(8a]dl#9v/3ӝOAe -\IENDB`ukui-control-center/shell/res/plugins/vpn/0000755000175000017500000000000013621411724017574 5ustar fengfengukui-control-center/shell/res/plugins/vpn/add.png0000644000175000017500000000042713621411724021035 0ustar fengfengPNG  IHDR00W pHYs  ~IDATh @a H Rۇ԰p6֌17s$KH6(","105ņ?;QjTGVo0h @c^)ܮ=q4_R3ç?PݰT+}j|4!n!41h @WDQȊp6kS'^%IENDB`ukui-control-center/shell/res/plugins/netconnect/0000755000175000017500000000000013635333016021133 5ustar fengfengukui-control-center/shell/res/plugins/netconnect/wifi3.png0000644000175000017500000000074713635333016022672 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHQ0EAgNJHkЁ 23q\lx%꿑zlj.[C:g=`f\xeq3@/v4y\&f;ʒSJ(G*%.O΄b[*9!KD4MN) (J8zlP*ԹW]8J+ V6#|XeIENDB`ukui-control-center/shell/res/plugins/netconnect/wifi4.png0000644000175000017500000000073513635333016022670 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHUQ1 0Iߤ.(!ptpF $$s&|wWd#~r](oDd `` pl1I DDIv`c  %eCo]'=+A} "SrN1m u#wPich^+'ǸVC"a{KBh",uADvU{j&ԘE9Y5̲7O]$"^МѿFhϤsPrᣈ[WmLDZ'K6K[6 [Ofd20it2{Uke[RӥW 0EnrKWQ„c=Qu]w*)zԺ_m 8J3Bh.=&qo\ IENDB`ukui-control-center/shell/res/plugins/netconnect/eth.png0000644000175000017500000000051213635333016022417 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHŔ 0?Az5a;n#x+ܟwNiSH!ESJ}}ڨ:!8,ݶBmifO+4Mշ&( 5fYHiUO/8C |6G`;hZܶmHDΝ$8urQ_%ZD\`A yL6;㿶;^Ӟ螩u,0Φh%ʹJ/' w7ن*p#S qMc U7IENDB`ukui-control-center/shell/res/plugins/netconnect/wifi2.png0000644000175000017500000000075413635333016022667 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHUQ@ 0Iޤ耔08CA 28p<nI.7v人(o\bSs%(@ІS8G=1 ]CIU\xlTio*5]{'1Z Z69c3wbmkQWr`DT>L`3s *Z&| Ao¥GD53zh"^7sgͅDcLy$a95g-|.fdTêa捀Ql)<=E@ѽO&2[|n aĔ#E_@wBm%vYչ@Wm[YjGf^F1zupV`%rs?& gkשIENDB`ukui-control-center/shell/res/plugins/netconnect/wifi1.png0000644000175000017500000000071713635333016022665 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHUQ00 H(!`:p*P@ 1{áDD}:=4人(o8. @ LV%1Ƹ=sQd1Qd<4K6M  5ENJcLicA&a[KBI^|K z[ 9z AUDB$j Yx ɪfa~"rm-7BAW;Z+NAk (C!wd20&sڕ, ryOP9e9\Aikt^cS?6N*#5= ~s'SD:lk kIENDB`ukui-control-center/shell/res/secondaryleftmenu/0000755000175000017500000000000013640364120021035 5ustar fengfengukui-control-center/shell/res/secondaryleftmenu/screensaverWhite.png0000644000175000017500000000047613640364120025073 0ustar fengfengPNG  IHDRw= pHYs  ~IDATH 0nn8lp4@KZ"!$&AxN=PQ3SjZWK`^J v;ȩ%Ơ=XwT@d!=E\:hξi;wJE['.Q_9TK^{Y!O-.f`df&!(4P+׈hAR(>T=,C}ќ8 $MU<4#Q53l%dfқOxL\Z\)^ULU7n龝cmIENDB`ukui-control-center/shell/res/secondaryleftmenu/areaWhite.png0000644000175000017500000000025413640364120023455 0ustar fengfengPNG  IHDRw= pHYs  ~^IDATHc?-MMG?pPX 000}@ԎmX p #1thZ0jp $gIENDB`ukui-control-center/shell/res/secondaryleftmenu/desktop.png0000644000175000017500000000045313640364120023216 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHՖ 0U|nn n7 j.PK[{}IcSӬt^H)el&"!TeV/{ w1 K$Oj>KQYzS_ڳ܃Wj.̢d i 8A2icYtEU,l-XnIyTw~=FyQIENDB`ukui-control-center/shell/res/secondaryleftmenu/keyboard.png0000644000175000017500000000036013640364120023342 0ustar fengfengPNG  IHDRw= pHYs  ~IDATH D Tr`)pT-5JPrIc>޲X=RLHfF\`D%;5D֐I"/,{Ƞc<">x%_t;I;U3(2({J)C3p:I&5.+c@J AIENDB`ukui-control-center/shell/res/secondaryleftmenu/shortcutWhite.png0000644000175000017500000000035513640364120024422 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHUA c {~Q; V-&Hd4 !(yŢ!HRk$Eb"ȽbM*Z v\/S|{X;tUDLkPŷG)~g`+y?9NK8&ڍ>IENDB`ukui-control-center/shell/res/secondaryleftmenu/datetime.png0000644000175000017500000000070413640364120023340 0ustar fengfengPNG  IHDRw= pHYs  ~vIDATHVM@ #G$yH $lVx eA.v;r)m,%]?jG,)Xˍx8nfEpNp(`F_d"4pp*x #I2rwe wsE̼TQQ@^-)A!ruQ w;߀znf:uy.*R *F4F^N_4 $+ր$Fd%$ 8fyq{,o/K9a" /fmDs/ze=s:vUܨh֡H8HrգPG}Uq~ҷg HX7IIENDB`ukui-control-center/shell/res/secondaryleftmenu/userinfo.png0000644000175000017500000000066713640364120023406 0ustar fengfengPNG  IHDRw= pHYs  ~iIDATHTm0}_6H6H6(7A n A J&xa*32Nm@'!a{绺qK*?ϖk˥?׋~UWqI-*dIENDB`ukui-control-center/shell/res/secondaryleftmenu/theme.png0000644000175000017500000000104713640364120022647 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHVQ@}8v BRXtA@RZAe2KFqgnHrwo߾ݽSUӮ۰E T ` `eCU)D tfpUj7EWՎ ᚑt\&XUmEd` 7G(K\xrI$6QृH."Gr@!A'p X_窚S.7#9yY{=Y,k s9뀽4N`+xQb IRl!_>hW( $ݳ^}XP5f+H@O|8lIx)} /xIENDB`ukui-control-center/shell/res/secondaryleftmenu/aboutWhite.png0000644000175000017500000000053413640364120023660 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHV0 }uG(L/xXrH^ȧ)Hvoj wy#XGD ш͂kѐ@6Ao9p;_ފu,`/>!Fuvk.TrkM9{=!׫Q?YP͊\mER )A,7hTL9S[ QႹbT0Jc$rcbM׭aLl8vd΅;bB-[ro '呹GE(IENDB`ukui-control-center/shell/res/secondaryleftmenu/defaultappWhite.png0000644000175000017500000000024313630066010024664 0ustar fengfengPNG  IHDRw= pHYs  ~UIDATHc?-p;V`Dg"BE`ԂQ gA#jq[QAs F"`ԂQ g-L;3eIENDB`ukui-control-center/shell/res/secondaryleftmenu/fonts.png0000644000175000017500000000072613640364120022701 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHŖQ@K:;HhXVAJ 49筮 2Ld{߾ mqɺ-"s"2P" (wl8 bbÉ>{/C7N!UXzAqtR8`/qix ٠D#vo{"/07llvvߓe)"ARDpl*"Sn]KVUܛϜFEU@ k]HrlTu02_pl&fSjh+>5W(y1}lH+%zp:,˦>86ˮlreĉb'=ic_Y1IENDB`ukui-control-center/shell/res/secondaryleftmenu/about.png0000644000175000017500000000076713640364120022667 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHVq0 }l@AFH' 2(ݠ&gN`zG| 9 ,xtF4@ /"S< EDfa=t=mP#JD; -"/O* Pl׭lɋx\m-E518e؃m3bsjQΫX~Tb~GPOpMm$I sn_:un$`ÐvNJт!&;7\ɋ] hZ#uDiKL7 ׁɧv|VqckΖ? mX= ZΖ6GVx,"N;e?gγdWbk:62ۙZ&N΄*{'s_>&iŨIENDB`ukui-control-center/shell/res/secondaryleftmenu/printerWhite.png0000644000175000017500000000037013640364120024227 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHV <4Q='J޸v[)"BITEԑTyJ(O'ȗ3'}Gn# oL%ureSBSK њ. m ͸N,,^>S-z }(p\< w5IENDB`ukui-control-center/shell/res/secondaryleftmenu/vpnWhite.png0000644000175000017500000000045713640364120023355 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHV 0  Q2G!dl T \KNY""IW =Yy630N:ESFv}x{L7ðX$M(4\3MQ82E1 ~jxHQ'ӆ|RYQݟ,VJhxXMH+w2~d~Gi*nL΍iQuvߦ&oǸ U/^JEIENDB`ukui-control-center/shell/res/secondaryleftmenu/displayWhite.png0000644000175000017500000000036513640364120024215 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHc?- Tk0 > "mTPY@`dp0jт40!4l&rCL}P h0Ōj`!BCXpfb|2z Z\/y9 UIENDB`ukui-control-center/shell/res/secondaryleftmenu/noticeWhite.png0000644000175000017500000000033313640364120024024 0ustar fengfengPNG  IHDRw= pHYs  ~IDATH 0 _#9j:DB[ѶFP +13,k0?)wjJL@2`f%L䐭v &vd];#JMpl d@K$Lupi>X4Ixpvd++r!aIENDB`ukui-control-center/shell/res/secondaryleftmenu/mouse.png0000644000175000017500000000057513640364120022702 0ustar fengfengPNG  IHDRw= pHYs  ~/IDATHVQ0 }p `!o  h7h7( nj9Ir|rqΒߓlYjMnmcsw=f"ޞ8;3I$ޟ*YV$02NI*" G.מrUlOaMA"8 Cθl8Mq;5/g^HlO#GZEXDS0i'UJ$I/P,^%s|{z@DKIZOYh$DQcӢ|EᲿ-jIENDB`ukui-control-center/shell/res/secondaryleftmenu/fontsWhite.png0000644000175000017500000000062513640364120023700 0ustar fengfengPNG  IHDRw= pHYs  ~GIDATHV1@ 4 O y O N(+SsH8*V˻^@HXM2cfz+b{}nX/kjAp0>0*V,| -]0$b $=l vY^Ai.˾ r|Lax/x䇙.X 7N(GŮ)^J0eNY]YL^u N5AA9n:WʵGa-O(LG'a\^Ef=`afnlN܇˘yJMk)GaY?XL6{yEk_JE"Xzd}C~S > :4A͒JlsgMа.?_4kմaeK.Jt.RxU^\ޅ%d,P`_Dn_=8^6&nj}JU 93IENDB`ukui-control-center/shell/res/secondaryleftmenu/updateWhite.png0000644000175000017500000000050713640364120024030 0ustar fengfengPNG  IHDRw= pHYs  ~IDATH ]+0#8#t4Fa =ZE%y>\36^8Ҙ*iȓ>|ꩴ$9lZsqJ#(| Yl2b@ /@cN ' % pReH/wvdXFAt= g⣙~૩ZMkZ@eZf7ݮrvdm@2x/IN˹-ަ R``PIENDB`ukui-control-center/shell/res/secondaryleftmenu/proxyWhite.png0000644000175000017500000000067413640364120023734 0ustar fengfengPNG  IHDRw= pHYs  ~nIDATHVm@ } /$#OڕFI]`ML nbt}iq<5z#wg7ƃX Gzvc *,njgwb- _MXPFOАrMkiA+;khЊ(T /n]&^wB>g5CxgjuG;cJs/s^g2WoڊJIENDB`ukui-control-center/shell/res/secondaryleftmenu/autobootWhite.png0000644000175000017500000000044213640364120024400 0ustar fengfengPNG  IHDRw= pHYs  ~IDATH @D6 %X-ف-%Xv`Xt w0n2ɱ˱ $ @ )7O\ V#G]6SQJJlbl*I}\ fU+Y>e `>ɜ} 6[`o뼑O=+<<^W==&w04Z {F;?8<H$gIENDB`ukui-control-center/shell/res/secondaryleftmenu/vpn.png0000644000175000017500000000063113640364120022346 0ustar fengfengPNG  IHDRw= pHYs  ~KIDATHVM0}E6 2BF`tvLLdQ9ɒuwI>4hEš tDJrgU;; ugȷՒjBW'6A,k% Zm&rح.iѪ2f' !" 7\}fІ_QjS\*"YAD.eì0>Xb:;!*f ηV1MbfSD10ɋ>AbE?w@y-"Ϛ@&IENDB`ukui-control-center/shell/res/secondaryleftmenu/screenlock.png0000644000175000017500000000053013640364120023671 0ustar fengfengPNG  IHDRw= pHYs  ~ IDATHV0\K`+;;;-&aLǏpr9BҶ-DIjI}@N"Rnjl\23djE佄KsLRr.tl.FAp "RD"EG!"LryI^H մ# w#aI҃^ڵ@zGMrihLRlP]&\8sŨ/!P[Y@h$73q \D`N82>Px)")d7'e nMXvTH YDƺH/5aupJWd:0 |$UyT9wAqo l8`k%[[O'06lL 9Gw_i[|VV;̮JIENDB`ukui-control-center/shell/res/secondaryleftmenu/proxy.png0000644000175000017500000000105113640364120022721 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHVNBA=> ,ZU516J _ 0bks)$6XXc%r!&!{wvy.[퍢-j("*f:*oi(G)8Z"R}q-IENDB`ukui-control-center/shell/res/secondaryleftmenu/mousecontrol.png0000644000175000017500000000057513640364120024303 0ustar fengfengPNG  IHDRw= pHYs  ~/IDATHVQ0 }p `!o  h7h7( nj9Ir|rqΒߓlYjMnmcsw=f"ޞ8;3I$ޟ*YV$02NI*" G.מrUlOaMA"8 Cθl8Mq;5/g^HlO#GZEXDS0i'UJ$I/P,^%s|{z@DKIZOYh$DQcӢ|EᲿ-jIENDB`ukui-control-center/shell/res/secondaryleftmenu/touchpadWhite.png0000644000175000017500000000030013640364120024344 0ustar fengfengPNG  IHDRw= pHYs  ~rIDATH D8B"ݤ\ob'^DPL A*JLUxQI {f2AWvnp >ȝ-YeJY |آ ZIENDB`ukui-control-center/shell/res/secondaryleftmenu/notice.png0000644000175000017500000000042513640364120023025 0ustar fengfengPNG  IHDRw= pHYs  ~IDATH @+xd $д%Ǒ8x3?!'"'\7Zw=N2]9B{gFg /1&M9#v'"EI [pوM+c"  LNzWFRLh &$gZ"A"Q\_,h}gWIENDB`ukui-control-center/shell/res/secondaryleftmenu/backupWhite.png0000644000175000017500000000025713640364120024015 0ustar fengfengPNG  IHDRw= pHYs  ~aIDATH1 0 /}A?/U qKhZO`5IdJ:`l΄q"Ix &"oTgLLj*v8WTl'Y_ӁJIENDB`ukui-control-center/shell/res/secondaryleftmenu/keyboardWhite.png0000644000175000017500000000031413640364120024342 0ustar fengfengPNG  IHDRw= pHYs  ~~IDATH 0 DI_AI$% @Щ2․? e:}GrXV.o6zVrZ[emZw_|u0M<d O;J\|FIENDB`ukui-control-center/shell/res/secondaryleftmenu/netconnect.png0000644000175000017500000000113513640364120023703 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHMnA?@2% 0vs7prlY}bY!AD x¨W< pKzˍb6mfܽ/w F8zO;p &-/xDz{f63N]ˏI4 ;fV\ŠH2>+9Ж-EQQ>bߘ@Ȥ>Ք]N~df JwG'Ӡ/ 8f"^̵㘘NJ:]c13+_ [WFy27=Ulڏ$^ J,er[ :KD9cí_u D![Q}D-I죄dfv'/=rIz?V*ǼA[& 8[./UfqNŽԭt4Qܐ=7הbI)csLUuJ)vC] w_cYm]/{&SO nOӑ+w~by?z2^dTZeno iYhAIENDB`ukui-control-center/shell/res/secondaryleftmenu/power.png0000644000175000017500000000070213640364120022676 0ustar fengfengPNG  IHDRw= pHYs  ~tIDATHVQ0 }poF04LЌnL@&(# ©Eq\rNk=vi⾆T 7D%G;yx(7Q,yKVm>Cn0P 3,dNl6 hR{f^ݎj":WW:8QO:qRq}fޙCw9edsJv*`xf"9y OXɳb_AraIENDB`ukui-control-center/shell/res/secondaryleftmenu/backup.png0000644000175000017500000000033113640364120023005 0ustar fengfengPNG  IHDRw= pHYs  ~IDATH EOd;I!d8[-MH(E}+w1ғGW;&iV^.Zpyw35fI[ʯC8;Jȡ#W}`)dT*UQ?7d`r?UIENDB`ukui-control-center/shell/res/secondaryleftmenu/update.png0000644000175000017500000000076513640364120023035 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHVm@ }T Z&h6 #]F` &h \ Pc)Jw>'m1=E@ū0.U=^@D&o,nmzNz f{ SUeoOm{:Ԕ`u.u)lPRUeix90XK䍉%Z7:%c_WӱRYDd`Pm\ʟgG}#نk:l|%r4~K! o=e)3$E$x"}:6 V}.:q+"|1;t: Z4QiG' :?590UFEȮ и > /"ˁޗOϟ5cfÇe f'?( 3&vӞ;HX1II[W]KW񇦒. EWfLH~Ǎp唔^toхW|33IENDB`ukui-control-center/shell/res/secondaryleftmenu/screensaver.png0000644000175000017500000000056113640364120024065 0ustar fengfengPNG  IHDRw= pHYs  ~#IDATHUQ1\߱:@;퀫` >\rsnɍ%quQ!Ã@`\PIڸ0%JsDNPXZRPKzI s)gsNOڸ p:1wm|ﭭ#9G7@c!f @rfs OsjOC>`g7';.Dbfy `w1 Ye*)$s8^IUjov%\w v-X ]^ۗ@?_#R! IENDB`ukui-control-center/shell/res/secondaryleftmenu/mousecontrolWhite.png0000644000175000017500000000042613640364120025277 0ustar fengfengPNG  IHDRw= pHYs  ~IDATH 0 ,#Q2 e3VJ;qRdeߗ8Uډ1R'; Zkr ܯi-ќ;pohҢ㭐3Y_jίpr^Dl5|[AkV<ZeX:>9edsJv*`xf"9y OXɳb_AraIENDB`ukui-control-center/shell/res/secondaryleftmenu/defaultapp.png0000644000175000017500000000037013640364120023670 0ustar fengfengPNG  IHDRw= pHYs  ~IDATH 0 DU@l AFV`:IȕB(l؉ݐRBKIv/z--?FDrI9'IDsv2M@𓭋}H22^~A( Ru-Zk Z-5IENDB`ukui-control-center/shell/res/secondaryleftmenu/experienceplan.png0000644000175000017500000000100613640364120024542 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHUQ@}8 l ЁX`MЁvs۸IHؙ޽{OWv~ "fRCNo,UuL8,NUװ#^U{  G \aTueĵ~ &6omC\΋JnL-o 6Wk1ia ծ9t^ "pI#3ȽABDdˈ|6_ѩ*qBg>pm89[ Q9QԐ'$0rawȽ#dlWUMRDИ'Uf,"qd$DrVH zEU7iUWZCM*"iE^+pN-9Ryeb%HJ" P- P$mf/֟ PpS~&|_\(FIENDB`ukui-control-center/shell/res/secondaryleftmenu/audioWhite.png0000644000175000017500000000050413640364120023644 0ustar fengfengPNG  IHDRw= pHYs  ~IDATH0 &vn@{ 2@lwhw- [LpLŶ q[E/a ݮ |Pa/?K_"zֈ vrIENDB`ukui-control-center/shell/res/secondaryleftmenu/shortcut.png0000644000175000017500000000044113640364120023415 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHŖ _p]M"#tG v7`T"-4?:8pg<v5Di˚ĘEĶI/;7[& sb/"r7RxΫ. ~iZ(MoVKlڴ{DdU|ST4t.*ERF<9N!=)ញc[@$ IENDB`ukui-control-center/shell/res/secondaryleftmenu/backgroundWhite.png0000644000175000017500000000053313640364120024664 0ustar fengfengPNG  IHDRw= pHYs  ~ IDATHV }5(uGN#tG8͉=L| ){iED(]Qv!`8p эGDABT? <u?` j O|33EJN~<!{+,B(E hp:E+$38f_ݪ"IENDB`ukui-control-center/shell/res/secondaryleftmenu/autoboot.png0000644000175000017500000000051413640364120023377 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHm0?lL@ l6` 0B;QJ`HTUIw>BXЧҁ2`,:>Yߚ P_9x=/71Gf8K3;Ic` |HZwm0$%M2hG&yA#E[I>QH*f6H0JfQ}1X#Kz$5M>nZtNnf7K5:Û0'tKȶ\1WSh_h;biD-|m*V" GoDq`IENDB`ukui-control-center/shell/res/titlebar/max.png0000644000175000017500000000030013640364120020400 0ustar fengfengPNG  IHDRa pHYs  ~rIDAT8c?%" ,0~z>2008߿Pp \"PFVKq0 M$xT (5rJt0GGG23F jtIENDB`ukui-control-center/shell/res/titlebar/revertWhite.png0000644000175000017500000000032113640364120022126 0ustar fengfengPNG  IHDRa pHYs  ~IDAT8œ @g*KxHbFTP9!գ$rIo|wk^z!F^bVZ76V!,~lfjF Y_U]2dHD?IENDB`ukui-control-center/shell/res/titlebar/maxWhite.png0000644000175000017500000000026013640364120021406 0ustar fengfengPNG  IHDRa pHYs  ~bIDAT8c?%"h000|```O T-X9 @ F"]WK05`0% 5 `)@I%IENDB`ukui-control-center/shell/res/titlebar/min.png0000644000175000017500000000017513640364120020410 0ustar fengfengPNG  IHDRa pHYs  ~/IDAT8c?%"ݣ X` GGGAhB000: HIENDB`ukui-control-center/shell/res/titlebar/minWhite.png0000644000175000017500000000017213640364120021406 0ustar fengfengPNG  IHDRa pHYs  ~,IDAT8c?%"ݣ Xؤ&FtqhBph"v)IENDB`ukui-control-center/shell/res/titlebar/close.png0000644000175000017500000000031513640364120020726 0ustar fengfengPNG  IHDRԯ, pHYs  ~IDAT8͓ Eo,M-EPPi>CbbfT:G1P35+ٓܲznYс)ZVU,XaT2!X,N~IRG$Gq|ܑ_#`jIENDB`ukui-control-center/shell/res/titlebar/closeWhite.png0000644000175000017500000000025613640364120021733 0ustar fengfengPNG  IHDRԯ, pHYs  ~`IDAT8c?%"h@Za8?$ c 5#|T^e!850H/PE# ftCI Jo- ڲIENDB`ukui-control-center/shell/res/titlebar/back.png0000644000175000017500000000036613640364120020527 0ustar fengfengPNG  IHDRa pHYs  ~IDAT8œ 0 E_wV`F߀ (0#:B7p"ӅXSUoII&69pl~cp6Gx,ZفcYv̖*88` 9Fz:ɁĮq7ȭ#VDdX QIENDB`ukui-control-center/shell/res/dropArrow/0000755000175000017500000000000013630066010017261 5ustar fengfengukui-control-center/shell/res/dropArrow/downpx.png0000644000175000017500000000031213630066010021302 0ustar fengfengPNG  IHDRa pHYs  ~|IDAT8c?%"ѱ!a)vtt```8a a0J*ĥY- AӌBtf 6X @3*WLPCn@v4)Sj< 8U`WIENDB`ukui-control-center/shell/res/resfile.qrc0000644000175000017500000001525313642652167017471 0ustar fengfeng homepage/updateHover.png homepage/update.png homepage/systemHover.png homepage/system.png homepage/personalizedHover.png homepage/personalized.png homepage/networkHover.png homepage/network.png homepage/devicesHover.png homepage/devices.png homepage/datetimeHover.png homepage/datetime.png homepage/accountHover.png homepage/account.png titlebar/revert.png titlebar/min.png titlebar/max.png titlebar/close.png titlebar/back.png secondaryleftmenu/theme.png secondaryleftmenu/screensaver.png secondaryleftmenu/screenlock.png secondaryleftmenu/power.png secondaryleftmenu/fonts.png secondaryleftmenu/display.png secondaryleftmenu/desktop.png secondaryleftmenu/defaultapp.png secondaryleftmenu/background.png secondaryleftmenu/autoboot.png plugins/theme/selected.png plugins/desktop/trash.png plugins/desktop/homefolder.png plugins/desktop/default.png plugins/desktop/computer.png plugins/printer/add.png plugins/printer/printer.png plugins/keyboardcontrol/add.png plugins/vpn/add.png secondaryleftmenu/update.png secondaryleftmenu/backup.png secondaryleftmenu/vpn.png secondaryleftmenu/netconnect.png secondaryleftmenu/proxy.png primaryleftmenu/updateChecked.png primaryleftmenu/update.png primaryleftmenu/systemChecked.png primaryleftmenu/system.png primaryleftmenu/personalizedChecked.png primaryleftmenu/personalized.png primaryleftmenu/networkChecked.png primaryleftmenu/devicesChecked.png primaryleftmenu/devices.png primaryleftmenu/datetimeChecked.png primaryleftmenu/datetime.png primaryleftmenu/accountChecked.png primaryleftmenu/account.png primaryleftmenu/homepage.png primaryleftmenu/homepageChecked.png primaryleftmenu/checked-2.png primaryleftmenu/checked.png plugins/userinfo/add.png secondaryleftmenu/userinfo.png secondaryleftmenu/printer.png secondaryleftmenu/keyboard.png secondaryleftmenu/mouse.png secondaryleftmenu/about.png secondaryleftmenu/touchpad.png dropArrow/downpx.png secondaryleftmenu/autobootWhite.png secondaryleftmenu/defaultappWhite.png secondaryleftmenu/powerWhite.png secondaryleftmenu/displayWhite.png secondaryleftmenu/backgroundWhite.png secondaryleftmenu/screenlockWhite.png secondaryleftmenu/themeWhite.png secondaryleftmenu/screensaverWhite.png secondaryleftmenu/desktopWhite.png secondaryleftmenu/proxyWhite.png secondaryleftmenu/vpnWhite.png secondaryleftmenu/netconnectWhite.png secondaryleftmenu/fontsWhite.png secondaryleftmenu/userinfoWhite.png secondaryleftmenu/datetime.png secondaryleftmenu/datetimeWhite.png secondaryleftmenu/area.png secondaryleftmenu/areaWhite.png secondaryleftmenu/backupWhite.png secondaryleftmenu/aboutWhite.png secondaryleftmenu/printerWhite.png secondaryleftmenu/keyboardWhite.png secondaryleftmenu/audioWhite.png secondaryleftmenu/audio.png secondaryleftmenu/mousecontrol.png secondaryleftmenu/mousecontrolWhite.png secondaryleftmenu/updateWhite.png plugins/fonts/bigRoller.png plugins/fonts/smallRoller.png secondaryleftmenu/mouseWhite.png secondaryleftmenu/touchpadWhite.png plugins/theme/dark.png plugins/theme/default.png primaryleftmenu/network.png plugins/theme/light.png plugins/netconnect/wifi1.png plugins/netconnect/wifi2.png plugins/netconnect/wifi3.png plugins/netconnect/wifi4.png plugins/netconnect/eth.png titlebar/closeWhite.png plugins/shortcut/add.png secondaryleftmenu/shortcutWhite.png secondaryleftmenu/shortcut.png homepage/noticeandtasks.png homepage/noticeandtasksHover.png primaryleftmenu/noticeandtasks.png primaryleftmenu/noticeandtasksChecked.png secondaryleftmenu/notice.png secondaryleftmenu/noticeWhite.png secondaryleftmenu/experienceplan.png secondaryleftmenu/experienceplanWhite.png plugins/shortcut/note.png plugins/screenlock/none.png plugins/about/logo.png plugins/fonts/down.png plugins/fonts/up.png plugins/userinfo/default.png plugins/autoboot/add.png plugins/autoboot/desktop.png plugins/shortcut/down.png plugins/shortcut/up.png plugins/wallpaper/none.png i18n/zh_CN.qm global.qss combox.qss ukui-control-center/shell/res/homepage/0000755000175000017500000000000013640364120017073 5ustar fengfengukui-control-center/shell/res/homepage/noticeandtasks.png0000644000175000017500000000132713640364120022616 0ustar fengfengPNG  IHDR00W pHYs  ~IDATh嚻j@;&q\5&_@#OU4AU}#wk7FCY3ΑFיeޙ9s9glgv{Fl7~>5%kTvn` \340=O#8.2uT2` }c0#YWe?Pzn/ `V#@!&H آPR#ТxPפ!jK|Ĉ4dibM#"E:hY]|r//oq7>S1r*[R(TV燱fW&AKPԲRޠDѻި4; m ]?T8Z,\ʼ^#؄GX'1otb(Ώ'k*v"ʧuvbX;1`h'hYENu2nQGUb*YZygLjn:a HBh`NsW Ie]TZTGPNʾܔrʉY7:MϪj,i'nѕYbanBuXr P̵eG;29ץ̘y=|R!wV *U.Yh5 N< 6*sIENDB`ukui-control-center/shell/res/homepage/datetime.png0000644000175000017500000000124613640364120021400 0ustar fengfengPNG  IHDR00W pHYs  ~XIDAThZm0zO\ #4,%#$A:Bs cv'!%,'FeW[S_I];e/pI}N"D_˞Ed\D!^". }@{:H3 7Bqf$9(Bs#%esMsB*ۀNyn h'9PsfB<7x]Z6(!7p,[UZbVG=K^JݛA%B h)BU]A+lZ i9 z$йmǡjЂ<3scЁP&F @Y@j097\ iC9W&D,oWT+rD:"xz>QPy+p]l%u2˭ @6CYC&ʖ4 eW ꣷ$67mŭ(cn.ZgdXޙbZ%οs?ىwkEmKyhƓt_ lۅ-\RrIENDB`ukui-control-center/shell/res/homepage/network.png0000644000175000017500000000225613640364120021277 0ustar fengfengPNG  IHDR00W pHYs  ~`IDAThZKR@mRYec 0p'd*QU6`N `x7ْjk5Z)pUָLތ|JO{=}vN&?%AFs?&D5P<$;JDG֏,3l{>Z0KDj\-}F=؝Ædi4C":ϭ@$iBĜp8/}6 Ɯ;vO_&pu\pͳ|ܿ{-`!;)c1ǘu&YŰ;bER0:O_Kg|ML ;!*ͰŽDZfKṃ*'6\'!<Jp4 \UĜeyD\mClP>+kP!MhX@N@uY+|Nj<7s=oYBBR6|w >:odq*҅jfy,ϮE-bF1VD2N$Je]@JЉ :eTNc=A: 0ak !x:dFX{lF^d!F4:jEaP3 mAH% Zp/'P^RT9C>.؇gOBz3;%'6W@6FE⸞yc _9k8 F=!9ZXqYM\~@/dÝd!ƹ Zo :ﺩBǗ>_n\G`N܅k)+L zƔʴ %GJ4ދzC8g2h$$P%W\gCbF5K~1+`W!J[c~V9m['׮HԂjHXTA@tMx% BpC̡3qV[ ܺAëF4LDAJ| LNFuNd,$8+N^4jWđ,m-{;1߶36ޓլy @R8GjS$/N|]C c:O݋c&?0BD?O ޹{Km/:⟀z;IENDB`ukui-control-center/shell/res/homepage/personalizedHover.png0000644000175000017500000000165613640364120023314 0ustar fengfengPNG  IHDR00W pHYs  ~`IDAThZKn1 e7@l t[tr *YuUx@T $#CJ%+k-\2^_o`hF,. Zm9\5*ңW|PcBن*ld\lϨ8Vfa]ّ ~;$)Jb$ \y (?^>ˌhL^p߱.`?)k)"lΔ; ב=>5.$Mq;!AzNA3˕;k=o+ZwQFlG|R iF6dz"c2 3l3 rzԯyB)^u-hw`I(TEdג )x jDd@\K5%s (G>xNJ5])y@WЊ>7!ԍ3 ur6>KeZ˒d_r: (MRwpG)s"+䷘"OwȔphO@|͍-@B3,=1L^+kobb.zɀX*ʁhu`ݼ+M2wCĭ) @_wV(b{Œ,8K|tK|I™YB虾-e4%ZC iy`@y9&IThgS~?)T:68آX+wBZ qzu.X#[cv(x+=fH]-wﱴDtJ(\Z0Kf!dž;1#WIw y@y%Eҋ6yiSyen tIENDB`ukui-control-center/shell/res/homepage/updateHover.png0000644000175000017500000000120413640364120022064 0ustar fengfengPNG  IHDR00W pHYs  ~6IDAThq0 EA2#ttF !l s+ScK$د"ّlfcif={8@ EE^sD bf~MtnQ' փW:} u6Q1u$ǍC1jcV!YU/>IENDB`ukui-control-center/shell/res/homepage/devices.png0000644000175000017500000000165713640364120021234 0ustar fengfengPNG  IHDR00W pHYs  ~aIDAThZK1uo9aNn0 nD=pr@6^O2qmh'4\|8Ё {hv+ `A^s^H oj}CHvNR ӦvB(hŸ80.>1Fr ͸ (dGUbD,Y OZKr@> xc`HWO*}ˊYHگg`'[@+ :{{Z"IED Tt2eLcOں:Q"J햶H6is+ v}@7G XL  * 'e1Sc#V_Ppe6M[W``n9e#SsynL,VM?p6 Òw$o/,".gt 93o;G1.qSSd rme~ =@|RyA5@эy@y-(U-CP\e8.'hX}[:p;觔S:-gyhJH CIENDB`ukui-control-center/shell/res/homepage/noticeandtasksHover.png0000644000175000017500000000114313640364120023616 0ustar fengfengPNG  IHDR00W pHYs  ~IDAThZm }onttf2AFp67p&;" i/Y d )g9ƃ)fI8ZD2K(2FWI{7Y@ np 7A npQ`+qڧ1OIWf7kvLMvt n"p5IENDB`ukui-control-center/shell/res/homepage/account.png0000644000175000017500000000107213640364120021235 0ustar fengfengPNG  IHDR00W pHYs  ~IDAThq@dr7g.%(%"s 3 ߌA|ٷop8Z-x)@Ty``DVl ` _hy;Ub*!?lj#@kYy",͏4&r҂ci<~M|Z$$Q[1%dmĔ(oR6z!KtcJ lڈ)1&k#fc1ciB 1-9c`J||ڃxe?Dn,>@s"@-6Gf{ww Ŗf\.󕴦<'/9k[w 90 xJ<{M- +Tnz'X;oDQNcӜ(PA&c) tZTJ0j1J̹ tlR`ôrUU3w6 x]҅rJىV8á)b$שIENDB`ukui-control-center/shell/res/homepage/update.png0000644000175000017500000000135213640364120021064 0ustar fengfengPNG  IHDR00W pHYs  ~IDAThZˑ@u:9@(X!pP('ph$$ڮ֛7#ޮ+^_^=iXX2Z߹ TѯGm>BqZ}P=ḶCx`(D1DH*By`@VM3N+O2tCRy eD^xa")ha&}$~xxm, S.]ӝ['lf>.,ȭ*#IIaBLhpl q׆Q `I,uOkC צR8X j ;QytV\M!{!DKYlO]VGIϩ07tL \bVhߦ"Ciu5ym;2yp,yI=y Ul%b;!BF5P 8; >P ^Hf@O+IENDB`ukui-control-center/shell/res/homepage/personalized.png0000644000175000017500000000242213640364120022300 0ustar fengfengPNG  IHDR00W pHYs  ~IDAThZMhA~E4`GM='#x\0=[Ul1C{jiFa-JVyvv23*;;lv2{`@*Nl@.=hTZcGqP|aР)(UVk0"q-2d*! 7#qhHZʦ/;8C H ɠӝHE PǠT1Пzy;KLp+4vܒ<HDM6st$c̡mRA(\nCΑϲDGy&η"]+@J!K}Iljv7]+',AEQVM|^OB\U8"[1yG'^J4,'{IUyБ roDfZS=T'qQBa`i|N蓕Mΰ _/QAYV7lڎFcP$uE(^B `"(Q9=˂GR7ТdKh\~%s8JP))VK(* DY3;+j'ZsPg(@z-L@~FՉ]9GIe8c``@ԒI$E'a'ʅJt،P>NBake w$E _ƗW!y)LI!ΫKx+ʤqq'"|)\T46qN6bֶJp߇ "{7QK0$neXG|:O~9M8 $ݔ@K!u$,>kբ\2?0Aǀ#Y۾*ȯW0*Mjiu%Tg{ W Ծo? 02Ac};=ޟ'o4ʞvJ5( W\HU.?nck?8{' Ǥf0D6ext^`e汙tߧ7sO8dd"t#l2B{E+LJ: RHK ̜bsK٩˒F=S tMAd*z%|?.1*ʆ7 f,ڿ.&DbĄFPxE M)72:Xq'bgQ^amas쯗C7F(q_D,V1At^/ {6RݸIENDB`ukui-control-center/shell/res/homepage/system.png0000644000175000017500000000040513640364120021124 0ustar fengfengPNG  IHDR00W pHYs  ~IDATh 07(v1(=\L#ȃpAjjS-X?EHtϫGrtsOɩa@i|[4h,@c X4͡f0ǧlY#{~+@p,E hM=h,"/'@3*IENDB`ukui-control-center/shell/res/homepage/datetimeHover.png0000644000175000017500000000111613640364120022400 0ustar fengfengPNG  IHDR00W pHYs  ~IDAThZm0}T6H6hFtl 2l@7p'pEu g0i q|&Rbx4{LvN5{y_JwJGhJ)s)e-&\s.j :\GϘB9P$kLM)޼n** uP]G+V|*Y ~oHB]qUKyB鐰iP'"v:08(V3k>,RBHp65zmZ׈_m䩛 q5I3j6 9 VtedpN\iL'_EXf59}YcO VY~0X.FIENDB`ukui-control-center/shell/res/homepage/devicesHover.png0000644000175000017500000000132413640364120022227 0ustar fengfengPNG  IHDR00W pHYs  ~IDATh q0 h, Va0X!B!Bˠ!c103׵䗒\;qϖ_^^Z}&@gR0]BLqGgkS'DTە[% `M #ļ 12R@6)c@"&E Gߙ+N=>?W0+ AP)m}#cI } Nvw&jt9Q57@VBToj֙ƄEMJn>YLDr.ޑ=S)q)x`-YRNYc9`2="e,*)=䶮`Uo?NbI $+BKWmsW^}5 6Z,p}EŻmeu2[B5?NT Gpglpp5_өvgEj2i*R[VO^\IENDB`ukui-control-center/shell/res/i18n/0000755000175000017500000000000013642652167016102 5ustar fengfengukui-control-center/shell/res/i18n/zh_CN.ts0000644000175000017500000032171013642652167017457 0ustar fengfeng About System Summary 系统概述 Devices Summary 设备规格 about 关于 UNKNOWN 未知的 Current desktop env: 当前桌面环境: OS Version: 系统版本: CPU Arch: CPU架构: Kernel Version 内核版本 Manufacturers: 制造商: Product Name: 产品名: Version: 版本: Serial Number: 序列号: AddAppDialog OK 确定 Cancel 取消 AddAutoBoot Add AutoBoot 添加自启动程序 Add autoboot program Program name 程序名 Program exec 程序路径 Open 浏览 Program comment 程序描述 Cancel 取消 Certain 确定 selsect autoboot desktop 选择自启动程序 Area Area 语言和地区 Area showing time currency format Regional format data 区域格式数据 lunar 农历 First day of the week 一周的第一天 day 2019/12/17 9:52 TextLabel area 语言和地区 current area 当前区域 display format area 显示日期、时间、货币格式的区域 US 美国 format of area 区域格式数据 calendar 日历 first day of week 一周的第一天 date 日期 time 时间 change format of data 更改数据格式 first language 首选语言 system language 系统,菜单的显示语言 CN 中国 English 英语 Chinese 简体中文 add main language 添加首语言 solar calendar 公历 monday 星期一 sunday 星期天 change data format 更改数据格式 AutoBoot Autoboot Settings 开机启动设置 Add autoboot app 添加自启动程序 autoboot 开机启动 Name 程序名称 Status 当前状态 Backup Backup 备份 Back up your files to other drives, and when the original files are lost, damaged, or deleted, you can restore them to ensure the integrity of your system. 将您的文件备份到其他驱动器,当源文件丢失、受损或被删除时可以还原它们,保证系统的完整性。 Begin backup 开始备份 Restore 还原 View a list of backed-upfiles to restore backed up files to the system 查看备份列表,将已备份文件还原至系统 Begin restore 开始还原 backup 备份 CertificationDialog UserCertification 用户认证 User: 用户名: Passwd: 密码: Close 关闭 Certification 认证 ChangeFaceDialog selsect custom face file 选择自定义头像文件 Select 选择 Position: 位置: FileName: 文件名: FileType: 文件类型: Cancel 取消 Change User Face 更改用户头像 Select face from local 从本地选择用户头像 ChangePwdDialog Change Pwd 更改密码 Pwd type 密码类型 New pwd 新密码 New pwd sure 新密码确认 Cancel 取消 Confirm 确定 General Pwd 通用密码 New Password 新密码 New Password Identify 新密码确认 Password length needs to more than 5 character! 密码长度需要大于5个字符! Inconsistency with pwd 与新密码不同 ChangeTypeDialog Make sure that there is at least one administrator on the computer 请确保该计算机上至少有一个管理员用户 Standard users can use most software, but cannot install software and change system settings 标准账户可以使用大多数软件,但是不能安装软件和更改系统配置 Change Account Type 更改用户类型 standard user 标准用户 administrator 管理员用户 Administrators can make any changes they need 管理员账户可以更改任何系统配置,包括安装软件和升级软件 Cancel 取消 Confirm 确定 ChangtimeDialog day 日期 time 时间 year 年份 month 月份 CreateUserDialog UserName 用户名 Password 密码 Account Type 用户类型 Add New Account 添加新用户 PwdType 密码类型 PasswordSure 确认密码 standard user 标准用户 Standard users can use most software, but cannot install the software and change system settings 标准账户可以使用大多数软件,但是不能安装软件和更改系统配置 administrator 管理员用户 Administrators can make any changes they need 管理员账户可以更改任何系统配置,包括安装软件和升级软件 Cancel 取消 Confirm 确定 Password Identify 密码确认 General Password 通用密码 Inconsistency with pwd 和密码不一致 Password length needs to more than %1 character! 密码长度至少大于%1个字符! Password length needs to less than %1 character! 密码长度需要小于%1个字符! The user name cannot be empty 用户名不能为空 The first character must be lowercase letters! 首字符必须为小写字符! User name can not contain capital letters! 用户名不能包含大写字符! The user name is already in use, please use a different one. 用户名已存在,请换用其他用户名。 User name length need to less than %1 letters! 用户名长度需要小于%1个字符! The user name can only be composed of letters, numbers and underline! 用户名只能由字母、数字以及下划线组成! DataFormat Dialog change format of data 更改数据格式 calendar 日历 first day 一周第一天 date 日期 time 时间 cancel 取消 confirm 确认 first day of week 一周的第一天 lunar 农历 solar calendar 公历 monday 星期一 sunday 星期天 DateTime DateTime 时间和日期 current date 时间和日期 TextLabel timezone Sync system time 同步系统时间 Change time 手动更改时间 Change time zone 更改时区 Sync complete 同步完成 datetime 时间和日期 24-hour clock 24小时制 change time 更改时间 DefaultApp defaultapp 默认应用 DefaultAppWindow Select Default Application 选择默认的应用 Browser 浏览器 Mail 电子邮件 Image Viewer 图像查看器 Audio Player 音频播放器 Video Player 视频播放器 Text Editor 文档编辑器 DelUserDialog Delete the user, belonging to the user's desktop, documents, favorites, music, pictures and video folder will be deleted! 删除用户,用户所属的桌面、文档、收藏夹、音乐、图片和视频文件夹中的内容将全部被删除! Cancel 取消 KeepFile 保留文件 RemoveFile 删除文件 Desktop Icon Show On Desktop 显示在桌面的图标 Computerdesktop 我的电脑 Trashdesktop 垃圾箱 Homedesktop 家目录 Volumedesktop 挂载卷 Networkdesktop 网络 Icon Lock on Menu 锁定在开始菜单的图标 Computermenu 我的电脑 Trashmenu 垃圾箱 Filesystemmenu 文件系统 Homemenu 家目录 Settingmenu 设置 Networkmenu 网络 desktop 桌面 DisplaySet display 显示器 DisplayWindow Form monitor 显示器 set as home screen 设为主屏 close monitor 关闭显示器 unify output 统一输出 open monitor 打开显示器 screen brightness adjustment 调整屏幕亮度 dark bright apply 应用 ExperiencePlan User Experience 用户体验 Join in user Experience plan 加入用户体验计划 User experience plan terms, see 用户体验计划条款,参见 《User Experience plan》 《用户体验计划》 experienceplan 体验计划 Fonts Fonts 字体 Fonts select 字体选择 Font size 字体大小 Reset to default 恢复默认设置 Gtk default font 通用字体 Document font 文档字体 Monospace font 等宽字体 Advanced settings 高级设置 Peony font 桌面字体 titlebar font 标题字体 Select text sample that looks clearest 选择看起来清晰的字体效果 fonts 字体 Thanks For Using The ukcc KbdLayoutManager C 按国家 L 按语言 Variant 变体 Add 添加 Del KeyValueConverter system 系统 devices 设备 personalized 个性化 network 网络 account 账户 datetime 时间和日期 update 更新和备份 messages 通知和操作 KeyboardControl Keys Settings 通用设置 Enable repeat key 启用按键重复设置 Delay 延迟 Short Long Speed 速度 Slow Fast Test repetition rate of the input character: 输入字符测试重复效果: Message of capslock 大写锁定提示 Enable numlock 小键盘开启提示 Keyboard Layout 键盘布局 Keyboard layout 键盘布局 Install layouts 安装其他布局 keyboard 键盘 MainWindow UKCC 设置 MouseControl Mouse Key Settings 鼠标键设置 Hand habit 惯用手 Pointer Settings 指针设置 Speed 速度 Slow Fast Sensitivity 敏感度 Low High Visibility 可见性 Pointer size 指针大小 Cursor Settings 光标设置 Cursor weight Cursor weight 光标粗细 Thin Coarse Cursor speed 光标速度 Enable flashing on text area 启用文本区域的光标闪烁 mouse 鼠标 Lefthand 左手 Righthand 右手 Default(Recommended) 默认(推荐) Medium 中等 Large 较大 NetConnect Netconnect Status 网络状态 Available Network 可用网络 open wifi 打开wifi Change net settings 更改网络设置 netconnect 网络连接 connected 已连接 Connect 已连接 Disconnect 未连接 Notice Notice Settings 通知 Set the type of notice in the operation center 设置在通知中心显示的通知信息 Show new feature ater system upgrade 系统版本更新后显示新增内容 Get notifications from the app 获取来自应用和其他发送者的通知 Show notifications on the lock screen 在锁屏界面上显示通知 Notice Origin 设置通知来源 notice 通知 OutputConfig resolution 分辨率 orientation 方向 arrow-up 不旋转 90° arrow-right 90° 顺时针 arrow-down 上下颠倒 90° arrow-left 90° 逆时针 refresh rate 刷新率 auto 自动 100% 200% 300% screen zoom 缩放屏幕 %1 Hz Power select power plan 选择电源计划 Balance (suggest) 平衡(推荐) Saving 节能 Minimize performance 尽可能降低计算机性能 Bala&nce (suggest) Autobalance energy and performance with available hardware 利用可用的硬件自动平衡消耗与性能 Custom 自定义 Users develop personalized power plans 用户制定个性化电源计划 Power supply 电源供给 Battery powered 电池供给 Change pc sleep time: 在此之后电脑进入睡眠状态: Change dp close time: 在此之后关闭显示器: Power Icon Settings 电源图标设置 Power icon: 电源图标: power 电源 never 从不 10 min 10分钟 30 min 30分钟 60 min 60分钟 120 min 120分钟 300 min 300分钟 20 min 20分钟 1 min 1分钟 5 min 5分钟 always 总是显示 present 仅当存在电池时显示 Printer Add Printers And Scanners 添加打印机和扫描仪 Add printers and scanners 添加打印机和扫描仪 List Of Existing Printers 可用打印机列表 printer 打印机 Proxy Auto Proxy 自动设置代理 Auto proxy 开启自动代理 Auto url 自动配置URL Manual Proxy 手动设置代理 Manual proxy 开启手动代理 Http Proxy HTTP代理 Port 端口 Cetification 认证 Https Proxy HTTPS代理 Ftp Proxy FTP代理 Socks Proxy SOCKS代理 List of ignored hosts. more than one entry, please separate with english semicolon(;) 忽略的主机列表,请使用英文分号(;) proxy 代理 QObject display 显示器 defaultapp 默认应用 power 电源 autoboot 开机启动 printer 打印机 mousecontrol 鼠标 mouse 鼠标 touchpad 触摸板 keyboard 键盘 shortcut 快捷键 audio 声音 background 背景 screenlock 锁屏 fonts 字体 screensaver 屏保 desktop 桌面 netconnect 网络连接 vpn VPN proxy 代理 userinfo 账户信息 datetime 时间和日期 area 语言和地区 update 更新和备份 backup 备份 notice 通知 about 关于 experienceplan 体验计划 theme 主题 ukui-control-center had already running! 控制面板已经在运行! basicIcon 基础 classicalIcon 经典 defaultIcon 默认 basic 基础 classical 经典 default 默认 Unknown 未知 Update Shortcut Add Shortcut ResolutionSlider No available resolutions 没有合适的分辨率 Screenlock Screenlock Screenlock Interface 锁屏界面 Select screenlock background 选择锁屏背景 Browser online wp 浏览线上壁纸 Browser local wp 浏览本地壁纸 Show picture of screenlock on screenlogin 显示锁屏壁纸在登录页面 Enabel screenlock 开启锁屏 Open 浏览 screenlock 锁屏 picture 图片 Screensaver Screensaver 屏保背景 Enable screensaver 开启屏保 Screensaver program 屏幕保护程序 idle time 等待时间 Min 分钟 Lock screen when screensaver boot 激活屏保时锁定屏幕 screensaver 屏保 Default_ukui Blank_Only 黑屏 Random 随机 Shortcut System Shortcut 系统快捷键 Show all shortcut 显示全部快捷键 Custom Shortcut 自定义快捷键 Add custom shortcut 添加自定义快捷键 Reset default 恢复默认快捷键 shortcut 快捷键 Theme Theme Mode 主题模式 Default 系统默认 Light 浅色模式 Dark 深色模式 Icon theme 图标主题 Control theme 控件主题 Cursor theme 光标主题 Effect setting 效果设置 Transparent 透明特效 Low High Reset to default 恢复默认设置 theme 主题 TimeZoneChooser Cancel 取消 Confirm 确定 change timezone 修改系统时区 change zonne 更改时区 Change Timezone 更改时区 Touchpad Touchpad Settings 触摸板设置 Enabled touchpad 启用触摸板 Disable touchpad while typing 打字时禁用触摸板 Enable mouse clicks with touchpad 启用触摸板的鼠标点击 Scrolling 滚动 touchpad 触摸板 Disable rolling 禁用滚动 Vertical edge scrolling 垂直边界滚动 Horizontal edge scrolling 水平边界滚动 Vertical two-finger scrolling 垂直双指滚动 Horizontal two-finger scrolling 水平双指滚动 UnifiedOutputConfig resolution 分辨率 orientation 方向 arrow-up 不旋转 90° arrow-right 90°顺时针 arrow-down 上下颠倒 90° arrow-left 90°逆时针 refresh rate 刷新率 auto 自动 aa UserInfo userinfo 账户信息 standard user 标准用户 administrator 管理员用户 root Root Delete 删除 Current User 当前用户 Change pwd 更改密码 Change type 更改类型 Login no passwd 免密登录 enable autoLogin 自动登录 Other Users 其他用户 Add new user 添加新用户 Vpn Add Vpn Connect 添加VPN连接 Add vpn connect 添加VPN连接 vpn VPN Wallpaper Desktop Background 桌面背景 Select form 选择背景形式 Picture options 图片放置方式 Browser local wp 浏览本地壁纸 Browser online wp 浏览线上壁纸 Restore default wp 恢复默认壁纸 Ok 确定 Add 添加 background 背景 picture 图片 color 颜色 wallpaper 平铺 centered 居中 scaled 比例放大 stretched 伸展 zoom 缩放 spanned 适合宽度 selsect custom wallpaper file 选择自定义壁纸文件 Select 选择 Position: 位置: FileName: 文件名: FileType: 文件类型: Cancel 取消 Widget screen zoom 屏幕缩放 night mode 夜间模式 please insure at least one output! 请确保至少开启一个屏幕! Warning 警告 Sorry, your configuration could not be applied. Common reasons are that the overall screen size is too big, or you enabled more displays than supported by your GPU. 抱歉,配置不能应用. @title:window Unsupported Configuration 窗口 addShortcutDialog Dialog Shortcut name 快捷键名称 Shortcut exec 快捷键程序 Open 浏览 Invalid executable, please re-enter 无效的可执行程序,请重新选择 Cancel 取消 Certain 确定 selsect desktop 选择桌面 changtimedialog Dialog current date 时间和日期 time 时间 year 年份 month 月份 day cancel 取消 confirm 确认 ukui-control-center/shell/res/i18n/zh_CN.qm0000644000175000017500000006734113642652167017455 0ustar fengfengP&'q*/-@6B[Bs:M+ZNp)Rs;PaLN}aOtXbs;xreOwYkYk Rt6's; q-0e 0e_e$=$K 2SVK JS%M$NV)20h>9 >!D4Rs;%e &z7L Y]rI,II IIII"=IPIXlI]A1T,U]=w1-TTU`!?N C-MA׹J 1};3>(_C&K6_W<Yg@Yge)hm iN'dK]KTC^^R7j#G>~+ +YEc=4*}TM$*L!:!TII=Hi2 '2s;;$:s;$T=8$C7}Q Y?[ kjD2p\ xE0%> Dt* II_r&a?N9?NS(GS2De#޷*޷Ok:6I5Z@BdFJFJHV8VF$?fRZ@ZFZl4,=2Y%JJV-x Lƨ-ƨHL5@a{(.+;b,L,L3;;?ef?)=r,Pz a%G\DE B,nD qE=ϒ^(ʶ [%~U-k &tQ7 s4 14I GC@^ LZ RM` S_5 \wQ cwRJ hV @9 @T d 9.K C Hx W? ɧ ɧ] ]RK L^ B r !% $< *y 04 3O ?=Z# D 2 DX d6 dF_ d d8 d dPK d d_ hT[w J$T %$" TE tN ?d/4 ĸ k ĸX +% +Ek , AZ r& rE I W (UJ OB X1 X1 oB sPIQ sPX1 5#Y G& J ƞ9 ƞS] d3U ( E [* $rK 6 / 35 $rGP $rL #D9F #DS N0 RVC Z$Z : , \*  { z, x A*  D ?d. 5YV D/ ͱ _0 _F   V{ [1 Hu >Hu >h%U _J< g j#/o u0 8 P] DK: p| 5 S a 4~,Pe:@,PeT<T)p_zRo}#wm7Ri-̀#4r4oD<ž\L39x`QgI< wd*M1mhCzutGО!{O=7bu]EiTG{iTMr%[z)5VUQI~JGti` CPUgg CPU Arch:About_SRMhLbsXCurrent desktop env:AboutYh<Devices SummaryAboutQh8rHg,Kernel VersionAboutR6 UFManufacturers:About |~rHg, OS Version:AboutNTT  Product Name:About^RSSerial Number:About|~iSystem SummaryAboutg*wvUNKNOWNAboutrHg,Version:AboutQsNaboutAboutSmCancel AddAppDialogxn[OK AddAppDialogmRT/Rz ^ Add AutoBoot AddAutoBootSmCancel AddAutoBootxn[Certain AddAutoBootmOOpen AddAutoBootz ^cϏProgram comment AddAutoBootz ^_ Program exec AddAutoBootz ^T  Program name AddAutoBoot bT/Rz ^selsect autoboot desktop AddAutoBoot TW0S:AreaAreaN-VCNArea{OSN-eChineseAreaEnglishArea NThv{,NY)First day of the weekArea S:Wh<_epcnRegional format dataAreaVUSArea mRadd main languageArea TW0S:areaAreaeScalendarArea fe9epcnh<_change data formatArea fe9epcnh<_change format of dataArea_SRMS:W current areaAreaegdateAreaf>y:eg0e0'^h<_vS:Wdisplay format areaArea NThv{,NY)first day of weekArea first languageArea S:Wh<_epcnformat of areaAreaQSlunarAreafgNmondayAreaQlSsolar calendarAreafgY)sundayArea|~ SUvf>y:system languageAreaetimeAreamRT/Rz ^ Add autoboot app AutoBoot _g:T/RnAutoboot SettingsAutoBootz ^T yNameAutoBoot_SRMr`StatusAutoBoot_g:T/RautobootAutoBootX\`veNYNR0QvN֚qRVh _SneNN"Y10Sc_bR deSNS[N O݋|~v[et`'0Back up your files to other drives, and when the original files are lost, damaged, or deleted, you can restore them to ensure the integrity of your system.BackupYNBackupBackup_YYN Begin backupBackup_YˏS Begin restoreBackupSRestoreBackup$gw YNRh \]YNeNS|~FView a list of backed-upfiles to restore backed up files to the systemBackupYNbackupBackup CertificationCertificationDialogQsCloseCertificationDialog[xPasswd:CertificationDialogu(b7T User:CertificationDialogu(b7UserCertificationCertificationDialogSmCancelChangeFaceDialog fe9u(b7Y4PChange User FaceChangeFaceDialog eNT   FileName: ChangeFaceDialog eN|{W  FileType: ChangeFaceDialogOMn  Position: ChangeFaceDialog bSelectChangeFaceDialogNg,W0 bu(b7Y4PSelect face from localChangeFaceDialog b[NIY4PeNselsect custom face fileChangeFaceDialogSmCancelChangePwdDialogfe9[x Change PwdChangePwdDialogxn[ConfirmChangePwdDialogu([x General PwdChangePwdDialog Ne[xN T Inconsistency with pwdChangePwdDialoge[x New PasswordChangePwdDialog e[xxnNew Password IdentifyChangePwdDialoge[xNew pwdChangePwdDialog e[xxn New pwd sureChangePwdDialog[x^Y'N5N*[W{&/Password length needs to more than 5 character!ChangePwdDialog[x|{WPwd typeChangePwdDialog6{tTX&b7SNfe9NOU|~ߑMn Sb[ŏoNTSG~oN-Administrators can make any changes they needChangeTypeDialogSmCancelChangeTypeDialog fe9u(b7|{WChange Account TypeChangeTypeDialogxn[ConfirmChangeTypeDialog$xnO݋勡{g:N \g NN*{tTXu(b7BMake sure that there is at least one administrator on the computerChangeTypeDialog:hQƍ&b7SNOu(Y'YepoN OFf/N [ŏoNTfe9|~ߑMn\Standard users can use most software, but cannot install software and change system settingsChangeTypeDialog {tTXu(b7 administratorChangeTypeDialoghQu(b7 standard userChangeTypeDialogegdayChangtimeDialoggNmonthChangtimeDialogetimeChangtimeDialog^tNyearChangtimeDialogu(b7|{W Account TypeCreateUserDialog mReu(b7Add New AccountCreateUserDialog6{tTX&b7SNfe9NOU|~ߑMn Sb[ŏoNTSG~oN-Administrators can make any changes they needCreateUserDialogSmCancelCreateUserDialogxn[ConfirmCreateUserDialogu([xGeneral PasswordCreateUserDialog T[xN NInconsistency with pwdCreateUserDialog[xPasswordCreateUserDialog[xxnPassword IdentifyCreateUserDialog[x^\N%1N*[W{&0Password length needs to less than %1 character!CreateUserDialog[x^\Y'N%1N*[W{&0Password length needs to more than %1 character!CreateUserDialogxn[x PasswordSureCreateUserDialog[x|{WPwdTypeCreateUserDialog:hQƍ&b7SNOu(Y'YepoN OFf/N [ŏoNTfe9|~ߑMnaStandard users can use most software, but cannot install the software and change system settingsCreateUserDialog[W{&_Ř{N:\Q[W{&.The first character must be lowercase letters!CreateUserDialog&u(b7T Su1[Wk0ep[WNSN R~~bEThe user name can only be composed of letters, numbers and underline!CreateUserDialogu(b7T N N:zzThe user name cannot be emptyCreateUserDialog u(b7T ][XW( cbu(QvNu(b7T 0Vh Audio PlayerDefaultAppWindowmOVhBrowserDefaultAppWindow VPgw Vh Image ViewerDefaultAppWindowu5[PNMailDefaultAppWindow b؋v^u(Select Default ApplicationDefaultAppWindow ehcVh Text EditorDefaultAppWindow Ƙde>Vh Video PlayerDefaultAppWindowSmCancel DelUserDialogTR du(b7 u(b7b@\^vhLb0ehc0e6Y90NP0VrGTƘeNY9N-vQ[\Qh舫R dzDelete the user, belonging to the user's desktop, documents, favorites, music, pictures and video folder will be deleted! DelUserDialogOuYeNKeepFile DelUserDialogR deN RemoveFile DelUserDialogbvu5ComputerdesktopDesktopbvu5 ComputermenuDesktopeN|~FilesystemmenuDesktop[v_U HomedesktopDesktop[W(_Y˃SUvVhIcon Lock on MenuDesktopf>y:W(hLbvVhIcon Show On DesktopDesktopQ~NetworkdesktopDesktopn SettingmenuDesktopWW>{ TrashdesktopDesktopWW>{ TrashmenuDesktopc}Sw VolumedesktopDesktophLbdesktopDesktopf>y:Vhdisplay DisplaySet^u(apply DisplayWindowNbright DisplayWindowfdark DisplayWindowf>y:Vhmonitor DisplayWindow bS_f>y:Vh open monitor DisplayWindow et\O^UN^screen brightness adjustment DisplayWindowN:N;\Oset as home screen DisplayWindow~NQ unify output DisplayWindowRQeu(b7OSRJoin in user Experience planExperiencePlanu(b7OSUser ExperienceExperiencePlanu(b7OSRgak> S‰User experience plan terms, seeExperiencePlanOSRexperienceplanExperiencePlan0 u(b7OSR0 《User Experience plan》ExperiencePlan~nAdvanced settingsFontsehc[WOS Document fontFonts[WOSY'\ Font sizeFonts[WOSFontsFonts[WOS b Fonts selectFontsu([WOSGtk default fontFonts{I[[WOSMonospace fontFontshLb[WOS Peony fontFonts `bY ؋nReset to defaultFonts bw wgenfpv[WOSeHg&Select text sample that looks clearestFonts[WOSfontsFontsh[WOS titlebar fontFontsmRAddKbdLayoutManagerc V[CKbdLayoutManagerc LKbdLayoutManagerSOSVariantKbdLayoutManager&b7accountKeyValueConverter eTegdatetimeKeyValueConverterYdevicesKeyValueConverter wTdO\messagesKeyValueConverterQ~networkKeyValueConverterN*`'S personalizedKeyValueConverter|~systemKeyValueConverter feTYNupdateKeyValueConverter^DelayKeyboardControl\.v_T/cy:Enable numlockKeyboardControlT/u(c .Y nEnable repeat keyKeyboardControl_FastKeyboardControl [QvN^\@Install layoutsKeyboardControl.v^\@Keyboard LayoutKeyboardControl.v^\@Keyboard layoutKeyboardControlu(n Keys SettingsKeyboardControlLongKeyboardControl Y'Q[cy:Message of capslockKeyboardControlwShortKeyboardControlabSlowKeyboardControl^SpeedKeyboardControlQe[W{&mKՑY eHg,Test repetition rate of the input character:KeyboardControl.vkeyboardKeyboardControlnUKCC MainWindow|Coarse MouseControlQIhnCursor Settings MouseControlQIh^ Cursor speed MouseControl Cursor weight MouseControl ؋cP Default(Recommended) MouseControlT/u(eg,S:WvQIhpEnable flashing on text area MouseControl_Fast MouseControl`u(bK Hand habit MouseControlHigh MouseControlY'Large MouseControl]bKLefthand MouseControlONLow MouseControlN-{IMedium MouseControl h.nMouse Key Settings MouseControlcnPointer Settings MouseControlcY'\ Pointer size MouseControlSbK Righthand MouseControleOa^ Sensitivity MouseControlabSlow MouseControl^Speed MouseControl~Thin MouseControlS`' Visibility MouseControl hmouse MouseControlSu(Q~Available Network NetConnect fe9Q~܋nChange net settings NetConnectQ~r`Netconnect Status NetConnect]c connected NetConnectQ~܏c netconnect NetConnect bS_wifi open wifi NetConnectSge^u(TQvNSѐvwGet notifications from the appNotice nwgen Notice OriginNoticewNotice SettingsNoticenW(wN-_f>y:vwO`o.Set the type of notice in the operation centerNotice|~rHg,feTf>y:eXQ[$Show new feature ater system upgradeNoticeW(\OuLbN f>y:w%Show notifications on the lock screenNoticewnoticeNotice%1 Hz OutputConfig90 e90° arrow-left OutputConfig90 ze90° arrow-right OutputConfigN N P arrow-down OutputConfigN eˏlarrow-up OutputConfigRauto OutputConfigeT orientation OutputConfigR7es refresh rate OutputConfigRs resolution OutputConfig)e>\O^U screen zoom OutputConfig1R1 minPower10R10 minPower 120R120 minPower20R20 minPower30R30 minPower 300R300 minPower5R5 minPower60R60 minPower R)u(Su(vxlNR^samN`':Autobalance energy and performance with available hardwarePower ^sacP Balance (suggest)Poweru5l`O~Battery poweredPowerW(kdNKTQsf>y:VhChange dp close time:PowerW(kdNKTu5Qewaw r`Change pc sleep time:Power[NICustomPower\=SMON{g:`'Minimize performancePower u5nVhnPower Icon SettingsPower u5nVh Power icon:Poweru5nO~ Power supplyPowerSavingPoweru(b7R6[N*`'Su5nR&Users develop personalized power plansPower`;f/f>y:alwaysPowerNN neverPoweru5npowerPowerN_S[XW(u5l`ef>y:presentPower bu5nRselect power planPowermRbSSpg:TbkcNAdd Printers And ScannersPrintermRbSSpg:TbkcNAdd printers and scannersPrinterSu(bSSpg:RhList Of Existing PrintersPrinterbSSpg:printerPrinter RnNt Auto ProxyProxy _T/RNt Auto proxyProxyRMnURLAuto urlProxy CetificationProxy FTPNt Ftp ProxyProxy HTTPNt Http ProxyProxyHTTPSNt Https ProxyProxy$_uevN;g:Rh Ou(eRS UList of ignored hosts. more than one entry, please separate with english semicolon(;)Proxy bKRnNt Manual ProxyProxy _T/bKRNt Manual proxyProxyzSPortProxySOCKSNt Socks ProxyProxyNtproxyProxyg*wUnknownQObjectQsNaboutQObject TW0S:areaQObjectXaudioQObject_g:T/RautobootQObjectfo backgroundQObjectYNbackupQObjectWx@basicQObject~Qx classicalQObject eTegdatetimeQObject؋defaultQObject؋^u( defaultappQObjecthLbdesktopQObjectf>y:VhdisplayQObjectOSRexperienceplanQObject[WOSfontsQObject.vkeyboardQObject hmouseQObjectQ~܏c netconnectQObjectwnoticeQObjectu5npowerQObjectbSSpg:printerQObjectNtproxyQObject\O screenlockQObject\OO screensaverQObject_cw.shortcutQObjectN;themeQObjectdxgtouchpadQObjectcR6bg]~W(ЈL(ukui-control-center had already running!QObject feTYNupdateQObject&b7O`ouserinfoQObjectVPNvpnQObjectlg TvRsNo available resolutionsResolutionSlider mOg,W0X~Browser local wp Screenlock mO~N X~Browser online wp Screenlock_T/\OEnabel screenlock Screenlock\OuLbScreenlock Interface Screenlock b\OfoSelect screenlock background Screenlockf>y:\OX~W(v{_Uub)Show picture of screenlock on screenlogin Screenlock\O screenlock Screenlock\O Blank_Only Screensaver_T/\OOEnable screensaver Screensaverom;\OOe[\O^U!Lock screen when screensaver boot ScreensaverRMin Screensaverg:Random Screensaver\OO݀fo Screensaver Screensaver \O^UObz ^Screensaver program Screensaver{I_e idle time Screensaver\OO screensaver ScreensavermR[NI_cw.Add custom shortcutShortcut [NI_cw.Custom ShortcutShortcut`bY ؋_cw. Reset defaultShortcutf>y:Qh_cw.Show all shortcutShortcut |~_cw.System ShortcutShortcut_cw.shortcutShortcutcNN; Control themeThemeQIhN; Cursor themeThememrj!_DarkTheme|~ߞ؋DefaultThemeeHgnEffect settingThemeHighThemeVhN; Icon themeThememErj!_LightThemeONLowTheme `bY ؋nReset to defaultThemeN;j!_ Theme ModeThemefryeH TransparentThemeN;themeThemeSmCancelTimeZoneChooserxn[ConfirmTimeZoneChooser Oe9|~eS:change timezoneTimeZoneChooseryu(nRDisable rollingTouchpadbS[Weyu(dxgDisable touchpad while typingTouchpadT/u(dxgv hpQ!Enable mouse clicks with touchpadTouchpad T/u(dxgEnabled touchpadTouchpad l4^suLnRHorizontal edge scrollingTouchpad l4^sScnRHorizontal two-finger scrollingTouchpadnR ScrollingTouchpad dxgnTouchpad SettingsTouchpad WvuLnRVertical edge scrollingTouchpad WvScnRVertical two-finger scrollingTouchpaddxgtouchpadTouchpad 90e90° arrow-leftUnifiedOutputConfig 90ze90° arrow-rightUnifiedOutputConfigN N P arrow-downUnifiedOutputConfigN eˏlarrow-upUnifiedOutputConfigRautoUnifiedOutputConfigeT orientationUnifiedOutputConfigR7es refresh rateUnifiedOutputConfigRs resolutionUnifiedOutputConfig mReu(b7 Add new userUserInfofe9[x Change pwdUserInfofe9|{W Change typeUserInfo_SRMu(b7 Current UserUserInfoR dDeleteUserInfoQM[v{_ULogin no passwdUserInfoQvNu(b7 Other UsersUserInfo {tTXu(b7 administratorUserInfoRv{_Uenable autoLoginUserInfoRootrootUserInfohQu(b7 standard userUserInfo&b7O`ouserinfoUserInfomRVPNcAdd Vpn ConnectVpnmRVPNcAdd vpn connectVpnVPNvpnVpn mOg,W0X~Browser local wp Wallpaper mO~N X~Browser online wp WallpaperSmCancel WallpaperhLbfoDesktop Background Wallpaper eNT   FileName:  Wallpaper eN|{W  FileType:  Wallpaperxn[Ok Wallpaper VrGe>ne_Picture options WallpaperOMn  Position:  Wallpaper `bY ؋X~Restore default wp Wallpaper bSelect Wallpaper bfo_b_ Select form Wallpaperfo background Wallpaper\EN-centered Wallpaperrcolor WallpaperVrGpicture WallpaperkOe>Y'scaled Wallpaper b[NIX~eNselsect custom wallpaper file WallpaperT[^spanned WallpaperO8\U stretched Wallpaper^s wallpaper Wallpaper)e>zoom WallpaperzS @title:windowWidgetbkI MnN ^u(.Sorry, your configuration could not be applied. Common reasons are that the overall screen size is too big, or you enabled more displays than supported by your GPU.WidgetfTJWarningWidgetYj!_ night modeWidgetxnO݁\_T/NN*\O^U!"please insure at least one output!WidgetSmCanceladdShortcutDialogxn[CertainaddShortcutDialogeeHvSbgLz ^ e b#Invalid executable, please re-enteraddShortcutDialogmOOpenaddShortcutDialog _cw.z ^ Shortcut execaddShortcutDialog _cw.T y Shortcut nameaddShortcutDialog bhLbselsect desktopaddShortcutDialogSmcancelchangtimedialogxnconfirmchangtimedialog eTeg current datechangtimedialogSdaychangtimedialoggNmonthchangtimedialogetimechangtimedialog^tNyearchangtimedialogukui-control-center/shell/res/primaryleftmenu/0000755000175000017500000000000013640364120020531 5ustar fengfengukui-control-center/shell/res/primaryleftmenu/noticeandtasks.png0000644000175000017500000000064413640364120024255 0ustar fengfengPNG  IHDRw= pHYs  ~VIDATHVm0}t e ۀ&hA3B&:tN(< Œ޳Ͼg^a3v ;5#5GtιwυB/xh2!pk#s EIYq sz/A Fw+ΐpY~dL.Mp(K Y3&7(-b}>/Z#Pyum) @Z T؇p5!^us҇\QY(X {pf\R>4D@<⬽jw=2 ($rO0Bl]qG5~ߊ/IENDB`ukui-control-center/shell/res/primaryleftmenu/datetime.png0000644000175000017500000000060313640364120023032 0ustar fengfengPNG  IHDRw= pHYs  ~5IDATHᑂ0-,)v^h %%P7q6L0a ˦{.-"% ~/ +d"rP8. iB'\Nhġ{[}Ë@78|Ŝ|ysdOrSTψs5^0H99Dp(n kQޚJMxODꩯkTh1T$"6Wִ k\\ߓQ۶̃m]l ,7ͼ>e- <$Sެ?"P dK O8vNx7җ\g%pq.R) ¯ 쮵\-rѮECR]nrRrhwVinmmҝf_ZSN-|JgZz<IENDB`ukui-control-center/shell/res/primaryleftmenu/network.png0000644000175000017500000000106313640364120022730 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHUq1 }ar_JH ( a t Ȉ<13Yz=\E`SV&S9l"PQTA̿k DUt "t3'ʀσZURV=ωq %].'Iu!mk g]bSD-F_E+2,u#OEĔ^h}zE۲jx$ ިJDRkw@UG+m3~ynوHC6!n14ug0vkRD:lmU;Y`hqMtv;0-V?k8 '[ʼDC1[}iͶȩXJ2)\eɦȑWACp|,rsR%g6, p\gsOfb5 ^_m1,JbIENDB`ukui-control-center/shell/res/primaryleftmenu/networkChecked.png0000644000175000017500000000110213640364120024171 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHUq@}fK":@n@ XCw` uHToqƁH}w{wהsINR P.o (ZE4ulVD"3@STVo$ <`pc(x3NsI֊ѳ-Q'LHuzkqû$kѾ3PQγ=$'vvs&ڎlM#Hh# `dmjѩM6 x~qh~VhOƱg Ĝ-?h)qfʯ uڢ/s64ˆ3R16dR8LIrTV:xc~\oEoH n]IDATx @D$9h@M{ŻzzY!_x}d< ^Sw:7.Yzu)FQdFB}6[}@XE.[G7?B8@˨U @ @ @ @ @q3P)v=A=]E]YD{T.yhCs(܀)́TYjMn&\˯:UnԃIENDB`ukui-control-center/shell/res/primaryleftmenu/accountChecked.png0000644000175000017500000000050413640364120024141 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHU0 ҇l X! B'A L j29s!aK~q4> ?kҼ/̱j븒5Ja:d 7\̑\"9VH6Vh6 @{@C$. *oMN'vf ॿ94[%Isۋ`n-y^T"N2Xf8IENDB`ukui-control-center/shell/res/primaryleftmenu/devices.png0000644000175000017500000000100413640364120022654 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHVQ@}x00@ M )rb:YXiVNh;sg}zo|TUicMDN`>1Lp̛;W:PѤx UV122%hg$ѨBSk]6zm If6O#:|?';9ShpK69 JKZ΍oƕ^fnNԔ`SrP׺K)3/V$Dـ|l4'JKr)%<x5(tt>p0iIU] >†xsrfN=92r: w^.C=$֤DDn\7DSPko @'r&J). ^0<'˧&ZUZL9bO IENDB`ukui-control-center/shell/res/primaryleftmenu/datetimeChecked.png0000644000175000017500000000061413640364120024303 0ustar fengfengPNG  IHDRw= pHYs  ~>IDATH0E=Ν+@2%+0(p)T.J8'ʩyV$@w% vaw}5Ŵ% UI~Ҙ p\DI.l'Ŀ ⠽-=E@ Sd{0#z6]nq(L ]$|#i\2[.AAEf?$ۄ5*$Djg.tF^'[[4+4Arnp d \#Ӽ<pĮ7#բM i^i? WFi"7\X <W'K"6LBI <:eEGy9$܋hmOq4/靈iFJktjN߷]9 \# 9qST6 $TNQgFҼsA!^kR`I<1&HJ} HD9Xxaxk2OMV"]KFpkP5 s+E𙕿']Һ58RVzwUU1AwJH4V͐SĵK,7*r"V@]5ɠ\&6ݲ>$i3<H,Y^yw}/2r~|ULhhf]%jzjj1 3>HK*a+*+^V<( A#Pj %І&DT@} Q@bu}U~ B?<83. |>4D@yY{~zd̝.4_8ⲏb,~[2IENDB`ukui-control-center/shell/res/primaryleftmenu/account.png0000644000175000017500000000047613640364120022702 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHU 0 V/#t2 Len Z6P(H y'rvlN<$.!J@E&:PJ5:ZR9ܠ*GJvp%9XI΂c$0ac% Ыh[iI"A EEWE*6ˎnj,?#y_יu@oKlM4s<l9ʪڭ w#淁22)?]cgw=Ƚ`0/p>66Z?)dU69N4tY<I v M|k`z6[7t$;YK߈-=fIENDB`ukui-control-center/shell/res/primaryleftmenu/personalized.png0000644000175000017500000000114513640364120023737 0ustar fengfengPNG  IHDRw= pHYs  ~IDATHjQ X'P$[ |?{l,Deb)ւ2,W8{ẘw܍bĹ.n3c $'@,]7 ]8Ӎ]`!#qvoQ#w?9[Y.Og qh9ȷ6N#eTD}8S_T ,򭪞}ya(%QF5w+E 3ի5pkpGf6QJb #include #include #include #include #include #include #include #include #include #include #include "framelessExtended/framelesshandle.h" #include void centerToScreen(QWidget* widget) { if (!widget) return; QDesktopWidget* m = QApplication::desktop(); QRect desk_rect = m->screenGeometry(m->screenNumber(QCursor::pos())); int desk_x = desk_rect.width(); int desk_y = desk_rect.height(); int x = widget->width(); int y = widget->height(); widget->move(desk_x / 2 - x / 2 + desk_rect.left(), desk_y / 2 - y / 2 + desk_rect.top()); } int main(int argc, char *argv[]) { QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QtSingleApplication a(argc, argv); if (a.isRunning()){ a.sendMessage(QApplication::arguments().length() > 1 ? QApplication::arguments().at(1) : a.applicationFilePath()); qDebug() << QObject::tr("ukui-control-center had already running!"); return EXIT_SUCCESS; } else { //加载国际化文件 QString locale = QLocale::system().name(); QTranslator translator; if (locale == "zh_CN"){ if (translator.load("zh_CN.qm", "://i18n/")) a.installTranslator(&translator); else qDebug() << "Load translations file" << locale << "failed!"; } //命令行参数 QCoreApplication::setApplicationName("ukui-control-center"); QCoreApplication::setApplicationVersion("2.0"); QCommandLineParser parser; QCommandLineOption monitorRoleOption("m", "Go to monitor settings page"); QCommandLineOption backgroundRoleOption("b", "Go to background settings page"); QCommandLineOption userinfoRoleOption("u", "Go to userinfo settings page"); QCommandLineOption aboutRoleOption("a", "Go to about settings page"); QCommandLineOption powerRoleOption("p", "Go to power settings page"); // QCommandLineOption powerRoleOption(QStringList() << "aaa" << "bbb", "ccccccccccccccccc"); // parser.setApplicationDescription("eeeeeeeeeeeee"); parser.addHelpOption(); parser.addVersionOption(); parser.addOption(monitorRoleOption); parser.addOption(backgroundRoleOption); parser.addOption(userinfoRoleOption); parser.addOption(aboutRoleOption); parser.addOption(powerRoleOption); // parser.addPositionalArgument("ffff", "ggggggggggggggggggg"); parser.process(a); //加载qss样式文件 QString qss; QFile QssFile("://global.qss"); QssFile.open(QFile::ReadOnly); if (QssFile.isOpen()){ qss = QLatin1String(QssFile.readAll()); qApp->setStyleSheet(qss); QssFile.close(); } MainWindow * w = new MainWindow; centerToScreen(w); w->setAttribute(Qt::WA_DeleteOnClose); a.setActivationWindow(w); QObject::connect(&a, SIGNAL(messageReceived(const QString&)),w, SLOT(sltMessageReceived(const QString&))); w->show(); FramelessHandle * pHandle = new FramelessHandle(w); pHandle->activateOn(w); return a.exec(); } } ukui-control-center/shell/mainwindow.cpp0000644000175000017500000004545413642652167017426 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include "utils/keyvalueconverter.h" #include "utils/functionselect.h" #include #include /* qt会将glib里的signals成员识别为宏,所以取消该宏 * 后面如果用到signals时,使用Q_SIGNALS代替即可 **/ #ifdef signals #undef signals #endif extern "C" { #include #include } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //设置初始大小 resize(QSize(820, 600)); //设置窗体无边框 setWindowFlags(Qt::FramelessWindowHint | Qt::Widget); //该设置去掉了窗体透明后的黑色背景 setAttribute(Qt::WA_TranslucentBackground, true); //将最外层窗体设置为透明 setStyleSheet("QMainWindow#MainWindow{background-color: transparent;}"); //设置panel图标 QIcon panelicon; if (QIcon::hasThemeIcon("ukui-control-center")) panelicon = QIcon::fromTheme("ukui-control-center"); // else // panelicon = QIcon("://applications-system.svg"); this->setWindowIcon(panelicon); this->setWindowTitle(tr("UKCC")); //中部内容区域 ui->stackedWidget->setStyleSheet("QStackedWidget#stackedWidget{background: #ffffff; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"); //标题栏widget ui->titlebarWidget->setStyleSheet("QWidget#titlebarWidget{background: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); // //左上角文字 // ui->mainLabel->setStyleSheet("QLabel#mainLabel{font-size: 18px; color: #40000000;}"); //左上角返回按钮 ui->backBtn->setStyleSheet("QPushButton#backBtn{background: #ffffff; border: none;}"); //顶部搜索框 ui->searchLineEdit->setStyleSheet("QLineEdit#searchLineEdit{background: #FFEDEDED; border: none; border-radius: 6px;}"); //右上角按钮stylesheet ui->minBtn->setStyleSheet("QPushButton#minBtn{background: #ffffff; border: none;}" "QPushButton:hover:!pressed#minBtn{background: #FF3D6BE5; border-radius: 2px;}" "QPushButton:hover:pressed#minBtn{background: #415FC4; border-radius: 2px;}"); ui->maxBtn->setStyleSheet("QPushButton#maxBtn{background: #ffffff; border: none;}" "QPushButton:hover:!pressed#maxBtn{background: #FF3D6BE5; border-radius: 2px;}" "QPushButton:hover:pressed#maxBtn{background: #415FC4; border-radius: 2px;}"); ui->closeBtn->setStyleSheet("QPushButton#closeBtn{background: #ffffff; border: none;}" "QPushButton:hover:!pressed#closeBtn{background: #FA6056; border-radius: 2px;}" "QPushButton:hover:pressed#closeBtn{background: #E54A50; border-radius: 2px;}"); //左侧一级菜单 ui->leftsidebarWidget->setStyleSheet("QWidget#leftsidebarWidget{background: #cccccc; border: none; border-top-left-radius: 6px; border-bottom-left-radius: 6px;}"); //设置左上角按钮图标 ui->backBtn->setIcon(QIcon("://img/titlebar/back.png")); //设置右上角按钮图标 ui->minBtn->setIcon(QIcon(":/img/titlebar/min.png")); ui->maxBtn->setIcon(QIcon("://img/titlebar/max.png")); ui->closeBtn->setIcon(QIcon("://img/titlebar/close.png")); ui->searchLineEdit->hide(); // //初始化功能列表数据 FunctionSelect::initValue(); //构建枚举键值转换对象 kvConverter = new KeyValueConverter(); //继承QObject,No Delete //加载插件 loadPlugins(); connect(ui->minBtn, SIGNAL(clicked()), this, SLOT(showMinimized())); connect(ui->maxBtn, &QPushButton::clicked, this, [=]{ if (isMaximized()){ showNormal(); ui->maxBtn->setIcon(QIcon("://img/titlebar/max.png")); } else { showMaximized(); ui->maxBtn->setIcon(QIcon("://img/titlebar/revert.png")); } }); connect(ui->closeBtn, &QPushButton::clicked, this, [=]{ close(); // qApp->quit(); }); // connect(ui->backBtn, &QPushButton::clicked, this, [=]{ // if (ui->stackedWidget->currentIndex()) // ui->stackedWidget->setCurrentIndex(0); // else // ui->stackedWidget->setCurrentIndex(1); // }); // ui->leftsidebarWidget->setVisible(ui->stackedWidget->currentIndex()); connect(ui->stackedWidget, &QStackedWidget::currentChanged, this, [=](int index){ //左侧边栏显示/不显示 ui->leftsidebarWidget->setVisible(index); //左上角显示字符/返回按钮 ui->backBtn->setVisible(index); ui->titleLabel->setHidden(index); if (index){ //首页部分组件样式 //中部内容区域 ui->stackedWidget->setStyleSheet("QStackedWidget#stackedWidget{background: #ffffff; border-bottom-right-radius: 6px;}"); //标题栏widget ui->titlebarWidget->setStyleSheet("QWidget#titlebarWidget{background: #ffffff; border-top-right-radius: 6px;}"); } else { //次页部分组件样式 //中部内容区域 ui->stackedWidget->setStyleSheet("QStackedWidget#stackedWidget{background: #ffffff; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}"); //标题栏widget ui->titlebarWidget->setStyleSheet("QWidget#titlebarWidget{background: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px;}"); } }); //加载左侧边栏一级菜单 initLeftsideBar(); //加载首页Widget homepageWidget = new HomePageWidget(this); ui->stackedWidget->addWidget(homepageWidget); //加载功能页Widget modulepageWidget = new ModulePageWidget(this); ui->stackedWidget->addWidget(modulepageWidget); //top left return button connect(ui->backBtn, &QPushButton::clicked, this, [=]{ FunctionSelect::popRecordValue(); //if recordFuncStack is empty, it means there is no history record. So return to homepage if (FunctionSelect::recordFuncStack.length() < 1) { ui->stackedWidget->setCurrentIndex(0); } else { QMap pluginsObjMap = modulesList.at(FunctionSelect::recordFuncStack.last().type); modulepageWidget->switchPage(pluginsObjMap.value(FunctionSelect::recordFuncStack.last().namei18nString), false); } }); //快捷参数 if (QApplication::arguments().length() > 1){ bootOptionsFilter(QApplication::arguments().at(1)); } } MainWindow::~MainWindow() { delete ui; } void MainWindow::bootOptionsFilter(QString opt){ if (opt == "-m"){ //显示器 bootOptionsSwitch(SYSTEM, DISPLAY); } else if (opt == "-b"){ //背景 bootOptionsSwitch(PERSONALIZED, BACKGROUND); } else if (opt == "-d"){ //桌面 bootOptionsSwitch(PERSONALIZED, DESKTOP); } else if (opt == "-u"){ //账户 bootOptionsSwitch(ACCOUNT, USERINFO); } else if (opt == "-a"){ //关于 bootOptionsSwitch(NOTICEANDTASKS, ABOUT); } else if (opt == "-p"){ //电源 bootOptionsSwitch(SYSTEM, POWER); } } void MainWindow::bootOptionsSwitch(int moduleNum, int funcNum){ QList pFuncStructList = FunctionSelect::funcinfoList[moduleNum]; QString funcStr = pFuncStructList.at(funcNum).namei18nString; QMap pluginsObjMap = modulesList.at(moduleNum); if (pluginsObjMap.keys().contains(funcStr)){ //开始跳转 ui->stackedWidget->setCurrentIndex(1); modulepageWidget->switchPage(pluginsObjMap.value(funcStr)); } } void MainWindow::setBtnLayout(QPushButton * &pBtn){ QLabel * imgLabel = new QLabel(pBtn); QSizePolicy imgLabelPolicy = imgLabel->sizePolicy(); imgLabelPolicy.setHorizontalPolicy(QSizePolicy::Fixed); imgLabelPolicy.setVerticalPolicy(QSizePolicy::Fixed); imgLabel->setSizePolicy(imgLabelPolicy); imgLabel->setScaledContents(true); QVBoxLayout * baseVerLayout = new QVBoxLayout(pBtn); QHBoxLayout * contentHorLayout = new QHBoxLayout(); contentHorLayout->addStretch(); contentHorLayout->addWidget(imgLabel); contentHorLayout->addStretch(); baseVerLayout->addStretch(); baseVerLayout->addLayout(contentHorLayout); baseVerLayout->addStretch(); pBtn->setLayout(baseVerLayout); } void MainWindow::loadPlugins(){ for (int index = 0; index < TOTALMODULES; index++){ QMap pluginsMaps; modulesList.append(pluginsMaps); } static bool installed = (QCoreApplication::applicationDirPath() == QDir(("/usr/bin")).canonicalPath()); if (installed) pluginsDir = QDir("/usr/lib/control-center/pluginlibs/"); else { pluginsDir = QDir(qApp->applicationDirPath() + "/pluginlibs/"); } foreach (QString fileName, pluginsDir.entryList(QDir::Files)){ if (fileName == "libdesktop.so") continue; if (fileName == "libnotice.so") continue; if (fileName == "libexperienceplan.so") continue; qDebug() << "Scan Plugin: " << fileName; //gsettings-desktop-schemas // const char * proxyFile = "/usr/share/glib-2.0/schemas/org.gnome.system.proxy.gschema.xml"; // const char * gnomedesktopFile = "/usr/share/glib-2.0/schemas/org.gnome.desktop.wm.preferences.gschema.xml"; //mate-desktop-common // const char * interfaceFile = "/usr/share/glib-2.0/schemas/org.mate.interface.gschema.xml"; // const char * bgFile = "/usr/share/glib-2.0/schemas/org.mate.background.gschema.xml"; //peony-common // const char * peonyFile = "/usr/share/glib-2.0/schemas/org.ukui.peony.gschema.xml"; //libmatekbd-common // const char * kbdFile = "/usr/share/glib-2.0/schemas/org.mate.peripherals-keyboard-xkb.gschema.xml"; //ukui-power-manager-common // const char * powerFile = "/usr/share/glib-2.0/schemas/org.ukui.power-manager.gschema.xml"; //ukui-session-manager const char * sessionFile = "/usr/share/glib-2.0/schemas/org.ukui.session.gschema.xml"; //ukui-screensaver const char * screensaverFile = "/usr/share/glib-2.0/schemas/org.ukui.screensaver.gschema.xml"; //ukui-settings-daemon-common // const char * usdFile = "/usr/share/glib-2.0/schemas/org.ukui.font-rendering.gschema.xml"; //代理功能依赖gsettings-desktop-schemas // if (!g_file_test(proxyFile, G_FILE_TEST_EXISTS) && fileName == "libproxy.so") // continue; //字体功能依赖gsettings-desktop-schemas,mate-desktop-common,peony-common,ukui-settings-daemon-common // if ((!g_file_test(interfaceFile, G_FILE_TEST_EXISTS) || // !g_file_test(gnomedesktopFile, G_FILE_TEST_EXISTS) || // !g_file_test(peonyFile, G_FILE_TEST_EXISTS) || // !g_file_test(usdFile, G_FILE_TEST_EXISTS)) && fileName == "libfonts.so") // continue; //键盘功能的键盘布局依赖libmatekbd-common // if (!g_file_test(kbdFile, G_FILE_TEST_EXISTS) && fileName == "libkeyboard.so") // continue; //电源功能依赖ukui-power-manager-common // if (!g_file_test(powerFile, G_FILE_TEST_EXISTS) && fileName == "libpower.so") // continue; //屏保功能依赖ukui-session-manager if ((!g_file_test(screensaverFile, G_FILE_TEST_EXISTS) || !g_file_test(sessionFile, G_FILE_TEST_EXISTS)) && fileName == "libscreensaver.so") continue; // //桌面功能依赖peony-common // if (!g_file_test(peonyFile, G_FILE_TEST_EXISTS) && fileName == "libdesktop.so") // continue; //wallpaper mate-desktop-common // if (!g_file_test(bgFile, G_FILE_TEST_EXISTS) && fileName == "libwallpaper.so") // continue; //主题功能依赖gsettings-desktop-schemas,mate-desktop-common // if ((!g_file_test(interfaceFile, G_FILE_TEST_EXISTS) || // !g_file_test(gnomedesktopFile, G_FILE_TEST_EXISTS)) && fileName == "libtheme.so") // continue; QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); QObject * plugin = loader.instance(); if (plugin){ CommonInterface * pluginInstance = qobject_cast(plugin); modulesList[pluginInstance->get_plugin_type()].insert(pluginInstance->get_plugin_name(), plugin); qDebug() << "Load Plugin :" << kvConverter->keycodeTokeyi18nstring(pluginInstance->get_plugin_type()) << "->" << pluginInstance->get_plugin_name() ; int moduletypeInt = pluginInstance->get_plugin_type(); if (!moduleIndexList.contains(moduletypeInt)) moduleIndexList.append(moduletypeInt); } else { //如果加载错误且文件后缀为so,输出错误 if (fileName.endsWith(".so")) qDebug() << fileName << "Load Failed: " << loader.errorString() << "\n"; } } } void MainWindow::initLeftsideBar(){ leftBtnGroup = new QButtonGroup(); leftMicBtnGroup = new QButtonGroup(); //构建左侧边栏返回首页按钮 QPushButton * hBtn = buildLeftsideBtn("homepage"); hBtn->setObjectName("homepage"); connect(hBtn, &QPushButton::clicked, this, [=]{ ui->stackedWidget->setCurrentIndex(0); }); hBtn->setStyleSheet("QPushButton#homepage{background: #cccccc; border: none;}"); ui->leftsidebarVerLayout->addWidget(hBtn); for(int type = 0; type < TOTALMODULES; type++){ //循环构建左侧边栏一级菜单按钮 if (moduleIndexList.contains(type)){ QString mnameString = kvConverter->keycodeTokeystring(type); QString mnamei18nString = kvConverter->keycodeTokeyi18nstring(type); //设置TEXT QPushButton * button = buildLeftsideBtn(mnameString); button->setCheckable(true); leftBtnGroup->addButton(button, type); //设置样式 button->setStyleSheet("QPushButton::checked{background: #cccccc; border: none; border-image: url('://img/primaryleftmenu/checked.png');}" "QPushButton::!checked{background: #cccccc; border: none;}"); connect(button, &QPushButton::clicked, this, [=]{ QPushButton * btn = dynamic_cast(QObject::sender()); int selectedInt = leftBtnGroup->id(btn); //获取一级菜单列表的第一项 QList tmpList = FunctionSelect::funcinfoList[selectedInt]; QMap currentFuncMap = modulesList[selectedInt]; for (FuncInfo tmpStruct : tmpList){ if (currentFuncMap.keys().contains(tmpStruct.namei18nString)){ modulepageWidget->switchPage(currentFuncMap.value(tmpStruct.namei18nString)); break; } } }); ui->leftsidebarVerLayout->addWidget(button); } } ui->leftsidebarVerLayout->addStretch(); } QPushButton * MainWindow::buildLeftsideBtn(QString bname){ QString iname = bname.toLower(); int itype = kvConverter->keystringTokeycode(bname); QPushButton * leftsidebarBtn = new QPushButton(); leftsidebarBtn->setAttribute(Qt::WA_DeleteOnClose); leftsidebarBtn->setCheckable(true); leftsidebarBtn->setFixedSize(QSize(60, 56)); //Widget Width 60 QPushButton * iconBtn = new QPushButton(leftsidebarBtn); iconBtn->setCheckable(true); iconBtn->setFixedSize(QSize(24, 24)); iconBtn->setFocusPolicy(Qt::NoFocus); QString iconHomePageBtnQss = QString("QPushButton{background: #cccccc; border: none; border-image: url('://img/primaryleftmenu/%1.png');}").arg(iname); QString iconBtnQss = QString("QPushButton:checked{background: #ffffff; border: none; border-image: url('://img/primaryleftmenu/%1Checked.png');}" "QPushButton:!checked{background: #cccccc; border: none; border-image: url('://img/primaryleftmenu/%2.png');}").arg(iname).arg(iname); //单独设置HomePage按钮样式 if (iname == "homepage") iconBtn->setStyleSheet(iconHomePageBtnQss); else iconBtn->setStyleSheet(iconBtnQss); leftMicBtnGroup->addButton(iconBtn, itype); connect(iconBtn, &QPushButton::clicked, leftsidebarBtn, &QPushButton::click); connect(leftsidebarBtn, &QPushButton::clicked, this, [=](bool checked){ iconBtn->setChecked(checked); }); QLabel * textLabel = new QLabel(leftsidebarBtn); QSizePolicy textLabelPolicy = textLabel->sizePolicy(); textLabelPolicy.setHorizontalPolicy(QSizePolicy::Fixed); textLabelPolicy.setVerticalPolicy(QSizePolicy::Fixed); textLabel->setSizePolicy(textLabelPolicy); textLabel->setScaledContents(true); QHBoxLayout * btnHorLayout = new QHBoxLayout(); btnHorLayout->addWidget(iconBtn, Qt::AlignCenter); btnHorLayout->addWidget(textLabel); btnHorLayout->addStretch(); btnHorLayout->setSpacing(10); leftsidebarBtn->setLayout(btnHorLayout); return leftsidebarBtn; } void MainWindow::setModuleBtnHightLight(int id){ leftBtnGroup->button(id)->setChecked(true); leftMicBtnGroup->button(id)->setChecked(true); } QMap MainWindow::exportModule(int type){ QMap emptyMaps; if (type < modulesList.length()) return modulesList[type]; else return emptyMaps; } void MainWindow::functionBtnClicked(QObject *plugin){ ui->stackedWidget->setCurrentIndex(1); modulepageWidget->switchPage(plugin); } void MainWindow::sltMessageReceived(const QString &msg) { bootOptionsFilter(msg); Qt::WindowFlags flags = windowFlags(); flags |= Qt::WindowStaysOnTopHint; setWindowFlags(flags); show(); flags &= ~Qt::WindowStaysOnTopHint; setWindowFlags(flags); showNormal(); } ukui-control-center/shell/utils/0000755000175000017500000000000013636025601015660 5ustar fengfengukui-control-center/shell/utils/keyvalueconverter.cpp0000644000175000017500000000413013635333016022140 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "keyvalueconverter.h" KeyValueConverter::KeyValueConverter() { metaModule = QMetaEnum::fromType(); } KeyValueConverter::~KeyValueConverter() { } QString KeyValueConverter::keycodeTokeystring(int code){ //未匹配到则返回空 return metaModule.valueToKey(code); } int KeyValueConverter::keystringTokeycode(QString string){ //QString to const char * QByteArray ba = string.toUpper().toLocal8Bit(); const char * str = ba.data(); return metaModule.keyToValue(str); } QString KeyValueConverter::keycodeTokeyi18nstring(int code){ QString nameString; switch (code) { case SYSTEM: nameString = tr("system"); break; case DEVICES: nameString = tr("devices"); break; case PERSONALIZED: nameString = tr("personalized"); break; case NETWORK: nameString = tr("network"); break; case ACCOUNT: nameString = tr("account"); break; case DATETIME: nameString = tr("datetime"); break; case UPDATE: nameString = tr("update"); break; case NOTICEANDTASKS: nameString = tr("messages"); break; default: break; } return nameString; } ukui-control-center/shell/utils/functionselect.h0000644000175000017500000000322713630066010021053 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef FUNCTIONSELECT_H #define FUNCTIONSELECT_H #include #include //#include typedef struct _FuncInfo : QObjectUserData { int type; int index; bool mainShow; QString nameString; QString namei18nString; }FuncInfo; typedef struct _RecordFunc : QObjectUserData { int type; QString namei18nString; }RecordFunc; Q_DECLARE_METATYPE(_RecordFunc) Q_DECLARE_METATYPE(_FuncInfo) class FunctionSelect { public: explicit FunctionSelect(); ~FunctionSelect(); public: static QList> funcinfoList; static QStack recordFuncStack; // static FuncInfo displayStruct; static void initValue(); static void pushRecordValue(int type, QString name); static void popRecordValue(); }; #endif // FUNCTIONSELECT_H ukui-control-center/shell/utils/functionselect.cpp0000644000175000017500000001713013635333016021414 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "functionselect.h" #include "../interface.h" #include QList> FunctionSelect::funcinfoList; QStack FunctionSelect::recordFuncStack; //FuncInfo FunctionSelect::displayStruct; FunctionSelect::FunctionSelect() { } FunctionSelect::~FunctionSelect() { } void FunctionSelect::initValue(){ //system QList systemList; for (int i = 0; i < TOTALSYSFUNC; i++){ FuncInfo funcStruct; funcStruct.type = SYSTEM; funcStruct.index = i; funcStruct.mainShow = true; systemList.append(funcStruct); } systemList[DISPLAY].nameString = QString("display"); systemList[DISPLAY].namei18nString = QObject::tr("display"); systemList[DEFAULTAPP].nameString = QString("defaultapp"); systemList[DEFAULTAPP].namei18nString = QObject::tr("defaultapp"); systemList[POWER].nameString = QString("power"); systemList[POWER].namei18nString = QObject::tr("power"); systemList[AUTOBOOT].nameString = QString("autoboot"); systemList[AUTOBOOT].namei18nString = QObject::tr("autoboot"); funcinfoList.append(systemList); //devices QList devicesList; for (int i = 0; i < TOTALDEVICESFUNC; i++){ FuncInfo funcStruct; funcStruct.type = DEVICES; funcStruct.index = i; funcStruct.mainShow = true; devicesList.append(funcStruct); } devicesList[PRINTER].nameString = QString("printer"); devicesList[PRINTER].namei18nString = QObject::tr("printer"); devicesList[MOUSE].nameString = QString("mouse"); devicesList[MOUSE].namei18nString = QObject::tr("mouse"); devicesList[TOUCHPAD].nameString = QString("touchpad"); devicesList[TOUCHPAD].namei18nString = QObject::tr("touchpad"); devicesList[TOUCHPAD].mainShow = false; devicesList[KEYBOARD].nameString = QString("keyboard"); devicesList[KEYBOARD].namei18nString = QObject::tr("keyboard"); devicesList[SHORTCUT].nameString = QString("shortcut"); devicesList[SHORTCUT].namei18nString = QObject::tr("shortcut"); devicesList[SHORTCUT].mainShow = false; devicesList[AUDIO].nameString = QString("audio"); devicesList[AUDIO].namei18nString = QObject::tr("audio"); funcinfoList.append(devicesList); //personalized QList personalizedList; for (int i = 0; i < TOTALPERSFUNC; i++){ FuncInfo funcStruct; funcStruct.type = PERSONALIZED; funcStruct.index = i; funcStruct.mainShow = true; personalizedList.append(funcStruct); } personalizedList[BACKGROUND].nameString = QString("background"); personalizedList[BACKGROUND].namei18nString = QObject::tr("background"); personalizedList[THEME].nameString = QString("theme"); personalizedList[THEME].namei18nString = QObject::tr("theme"); personalizedList[SCREENLOCK].nameString = QString("screenlock"); personalizedList[SCREENLOCK].namei18nString = QObject::tr("screenlock"); personalizedList[FONTS].nameString = QString("fonts"); personalizedList[FONTS].namei18nString = QObject::tr("fonts"); personalizedList[SCREENSAVER].nameString = QString("screensaver"); personalizedList[SCREENSAVER].namei18nString = QObject::tr("screensaver"); personalizedList[DESKTOP].nameString = QString("desktop"); personalizedList[DESKTOP].namei18nString = QObject::tr("desktop"); personalizedList[DESKTOP].mainShow = false; funcinfoList.append(personalizedList); //network QList networkList; for (int i = 0; i < TOTALNETFUNC; i++){ FuncInfo funcStruct; funcStruct.type = NETWORK; funcStruct.index = i; funcStruct.mainShow = true; networkList.append(funcStruct); } networkList[NETCONNECT].nameString = QString("netconnect"); networkList[NETCONNECT].namei18nString = QObject::tr("netconnect"); networkList[VPN].nameString = QString("vpn"); networkList[VPN].namei18nString = QObject::tr("vpn"); networkList[PROXY].nameString = QString("proxy"); networkList[PROXY].namei18nString = QObject::tr("proxy"); funcinfoList.append(networkList); //account QList accountList; for (int i = 0; i < TOTALACCOUNTFUNC; i++){ FuncInfo funcStruct; funcStruct.type = ACCOUNT; funcStruct.index = i; funcStruct.mainShow = true; accountList.append(funcStruct); } accountList[USERINFO].nameString = QString("userinfo"); accountList[USERINFO].namei18nString = QObject::tr("userinfo"); funcinfoList.append(accountList); //datetime QList datetimeList; for (int i = 0; i < TOTALDTFUNC; i++){ FuncInfo funcStruct; funcStruct.type = DATETIME; funcStruct.index = i; funcStruct.mainShow = true; datetimeList.append(funcStruct); } datetimeList[DAT].nameString = QString("datetime"); datetimeList[DAT].namei18nString = QObject::tr("datetime"); datetimeList[AREA].nameString = QString("area"); datetimeList[AREA].namei18nString = QObject::tr("area"); funcinfoList.append(datetimeList); //securityupdates QList seupdatesList; for (int i = 0; i < TOTALSUFUNC; i++){ FuncInfo funcStruct; funcStruct.type = UPDATE; funcStruct.index = i; funcStruct.mainShow = true; seupdatesList.append(funcStruct); } seupdatesList[UPDATES].nameString = QString("update"); seupdatesList[UPDATES].namei18nString = QObject::tr("update"); seupdatesList[BACKUP].nameString = QString("backup"); seupdatesList[BACKUP].namei18nString = QObject::tr("backup"); funcinfoList.append(seupdatesList); //noticeandtasks QList natList; for (int i = 0; i < TOTALNATFUNC; i++){ FuncInfo funcStruct; funcStruct.type = NOTICEANDTASKS; funcStruct.index = i; funcStruct.mainShow = true; natList.append(funcStruct); } natList[NOTICE].nameString = QString("notice"); natList[NOTICE].namei18nString = QObject::tr("notice"); natList[ABOUT].nameString = QString("about"); natList[ABOUT].namei18nString = QObject::tr("about"); natList[EXPERIENCEPLAN].nameString = QString("experienceplan"); natList[EXPERIENCEPLAN].namei18nString = QObject::tr("experienceplan"); funcinfoList.append(natList); } void FunctionSelect::pushRecordValue(int type, QString name){ RecordFunc reFuncStruct; reFuncStruct.type = type; reFuncStruct.namei18nString = name; if (recordFuncStack.length() < 1) recordFuncStack.push(reFuncStruct); else if (QString::compare(recordFuncStack.last().namei18nString, name) != 0){ // qDebug() << recordFuncStack.last().namei18nString << name; recordFuncStack.push(reFuncStruct); } } void FunctionSelect::popRecordValue(){ recordFuncStack.pop(); } ukui-control-center/shell/utils/keyvalueconverter.h0000644000175000017500000000276113635333016021615 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KEYVALUECONVERTER_H #define KEYVALUECONVERTER_H #include #include class KeyValueConverter : public QObject { Q_OBJECT public: explicit KeyValueConverter(); ~KeyValueConverter(); public: QString keycodeTokeystring(int code); int keystringTokeycode(QString string); QString keycodeTokeyi18nstring(int code); public: QMetaEnum metaModule; enum FunType{ SYSTEM, DEVICES, PERSONALIZED, NETWORK, ACCOUNT, DATETIME, UPDATE, NOTICEANDTASKS, TOTALMODULES, }; Q_ENUM(FunType) }; #endif // KEYVALUECONVERTER_H ukui-control-center/shell/qtsingleapplication/0000755000175000017500000000000013630066010020563 5ustar fengfengukui-control-center/shell/qtsingleapplication/qtsinglecoreapplication.pri0000644000175000017500000000050413630066010026221 0ustar fengfengINCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/qtsinglecoreapplication.h $$PWD/qtlocalpeer.h SOURCES += $$PWD/qtsinglecoreapplication.cpp $$PWD/qtlocalpeer.cpp QT *= network win32:contains(TEMPLATE, lib):contains(CONFIG, shared) { DEFINES += QT_QTSINGLECOREAPPLICATION_EXPORT=__declspec(dllexport) } ukui-control-center/shell/qtsingleapplication/qtsingleapplication.h0000644000175000017500000000761713630066010025021 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the name of Digia Plc and its Subsidiary(-ies) 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 ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QTSINGLEAPPLICATION_H #define QTSINGLEAPPLICATION_H #include class QtLocalPeer; #if defined(Q_OS_WIN) # if !defined(QT_QTSINGLEAPPLICATION_EXPORT) && !defined(QT_QTSINGLEAPPLICATION_IMPORT) # define QT_QTSINGLEAPPLICATION_EXPORT # elif defined(QT_QTSINGLEAPPLICATION_IMPORT) # if defined(QT_QTSINGLEAPPLICATION_EXPORT) # undef QT_QTSINGLEAPPLICATION_EXPORT # endif # define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllimport) # elif defined(QT_QTSINGLEAPPLICATION_EXPORT) # undef QT_QTSINGLEAPPLICATION_EXPORT # define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllexport) # endif #else # define QT_QTSINGLEAPPLICATION_EXPORT #endif class QT_QTSINGLEAPPLICATION_EXPORT QtSingleApplication : public QApplication { Q_OBJECT public: QtSingleApplication(int &argc, char **argv, bool GUIenabled = true); QtSingleApplication(const QString &id, int &argc, char **argv); #if QT_VERSION < 0x050000 QtSingleApplication(int &argc, char **argv, Type type); # if defined(Q_WS_X11) QtSingleApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0); QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); # endif // Q_WS_X11 #endif // QT_VERSION < 0x050000 bool isRunning(); QString id() const; void setActivationWindow(QWidget* aw, bool activateOnMessage = true); QWidget* activationWindow() const; // Obsolete: void initialize(bool dummy = true) { isRunning(); Q_UNUSED(dummy) } public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000); void activateWindow(); Q_SIGNALS: void messageReceived(const QString &message); private: void sysInit(const QString &appId = QString()); QtLocalPeer *peer; QWidget *actWin; }; #endif // QTSINGLEAPPLICATION_H ukui-control-center/shell/qtsingleapplication/qtsinglecoreapplication.h0000644000175000017500000000502513630066010025661 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the name of Digia Plc and its Subsidiary(-ies) 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 ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QTSINGLECOREAPPLICATION_H #define QTSINGLECOREAPPLICATION_H #include class QtLocalPeer; class QtSingleCoreApplication : public QCoreApplication { Q_OBJECT public: QtSingleCoreApplication(int &argc, char **argv); QtSingleCoreApplication(const QString &id, int &argc, char **argv); bool isRunning(); QString id() const; public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000); Q_SIGNALS: void messageReceived(const QString &message); private: QtLocalPeer* peer; }; #endif // QTSINGLECOREAPPLICATION_H ukui-control-center/shell/qtsingleapplication/qtsingleapplication.pri0000644000175000017500000000111013630066010025342 0ustar fengfenginclude(../common.pri) INCLUDEPATH += $$PWD DEPENDPATH += $$PWD QT *= network greaterThan(QT_MAJOR_VERSION, 4): QT *= widgets qtsingleapplication-uselib:!qtsingleapplication-buildlib { LIBS += -L$$QTSINGLEAPPLICATION_LIBDIR -l$$QTSINGLEAPPLICATION_LIBNAME } else { SOURCES += $$PWD/qtsingleapplication.cpp $$PWD/qtlocalpeer.cpp HEADERS += $$PWD/qtsingleapplication.h $$PWD/qtlocalpeer.h } win32 { contains(TEMPLATE, lib):contains(CONFIG, shared):DEFINES += QT_QTSINGLEAPPLICATION_EXPORT else:qtsingleapplication-uselib:DEFINES += QT_QTSINGLEAPPLICATION_IMPORT } ukui-control-center/shell/qtsingleapplication/qtlockedfile_win.cpp0000644000175000017500000001466113630066010024622 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the name of Digia Plc and its Subsidiary(-ies) 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 ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qtlockedfile.h" #include #include #define MUTEX_PREFIX "QtLockedFile mutex " // Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS #define MAX_READERS MAXIMUM_WAIT_OBJECTS #if QT_VERSION >= 0x050000 #define QT_WA(unicode, ansi) unicode #endif Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate) { if (mutexname.isEmpty()) { QFileInfo fi(*this); mutexname = QString::fromLatin1(MUTEX_PREFIX) + fi.absoluteFilePath().toLower(); } QString mname(mutexname); if (idx >= 0) mname += QString::number(idx); Qt::HANDLE mutex; if (doCreate) { QT_WA( { mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16()); }, { mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } ); if (!mutex) { qErrnoWarning("QtLockedFile::lock(): CreateMutex failed"); return 0; } } else { QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16()); }, { mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } ); if (!mutex) { if (GetLastError() != ERROR_FILE_NOT_FOUND) qErrnoWarning("QtLockedFile::lock(): OpenMutex failed"); return 0; } } return mutex; } bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock) { Q_ASSERT(mutex); DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0); switch (res) { case WAIT_OBJECT_0: case WAIT_ABANDONED: return true; break; case WAIT_TIMEOUT: break; default: qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed"); } return false; } bool QtLockedFile::lock(LockMode mode, bool block) { if (!isOpen()) { qWarning("QtLockedFile::lock(): file is not opened"); return false; } if (mode == NoLock) return unlock(); if (mode == m_lock_mode) return true; if (m_lock_mode != NoLock) unlock(); if (!wmutex && !(wmutex = getMutexHandle(-1, true))) return false; if (!waitMutex(wmutex, block)) return false; if (mode == ReadLock) { int idx = 0; for (; idx < MAX_READERS; idx++) { rmutex = getMutexHandle(idx, false); if (!rmutex || waitMutex(rmutex, false)) break; CloseHandle(rmutex); } bool ok = true; if (idx >= MAX_READERS) { qWarning("QtLockedFile::lock(): too many readers"); rmutex = 0; ok = false; } else if (!rmutex) { rmutex = getMutexHandle(idx, true); if (!rmutex || !waitMutex(rmutex, false)) ok = false; } if (!ok && rmutex) { CloseHandle(rmutex); rmutex = 0; } ReleaseMutex(wmutex); if (!ok) return false; } else { Q_ASSERT(rmutexes.isEmpty()); for (int i = 0; i < MAX_READERS; i++) { Qt::HANDLE mutex = getMutexHandle(i, false); if (mutex) rmutexes.append(mutex); } if (rmutexes.size()) { DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(), TRUE, block ? INFINITE : 0); if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) { if (res != WAIT_TIMEOUT) qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed"); m_lock_mode = WriteLock; // trick unlock() to clean up - semiyucky unlock(); return false; } } } m_lock_mode = mode; return true; } bool QtLockedFile::unlock() { if (!isOpen()) { qWarning("QtLockedFile::unlock(): file is not opened"); return false; } if (!isLocked()) return true; if (m_lock_mode == ReadLock) { ReleaseMutex(rmutex); CloseHandle(rmutex); rmutex = 0; } else { foreach(Qt::HANDLE mutex, rmutexes) { ReleaseMutex(mutex); CloseHandle(mutex); } rmutexes.clear(); ReleaseMutex(wmutex); } m_lock_mode = QtLockedFile::NoLock; return true; } QtLockedFile::~QtLockedFile() { if (isOpen()) unlock(); if (wmutex) CloseHandle(wmutex); } ukui-control-center/shell/qtsingleapplication/qtlocalpeer.h0000644000175000017500000000520513630066010023251 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the name of Digia Plc and its Subsidiary(-ies) 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 ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QTLOCALPEER_H #define QTLOCALPEER_H #include #include #include #include "qtlockedfile.h" class QtLocalPeer : public QObject { Q_OBJECT public: QtLocalPeer(QObject *parent = 0, const QString &appId = QString()); bool isClient(); bool sendMessage(const QString &message, int timeout); QString applicationId() const { return id; } Q_SIGNALS: void messageReceived(const QString &message); protected Q_SLOTS: void receiveConnection(); protected: QString id; QString socketName; QLocalServer* server; QtLP_Private::QtLockedFile lockFile; private: static const char* ack; }; #endif // QTLOCALPEER_H ukui-control-center/shell/qtsingleapplication/qtlocalpeer.cpp0000644000175000017500000001507013630066010023605 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the name of Digia Plc and its Subsidiary(-ies) 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 ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qtlocalpeer.h" #include #include #include #if defined(Q_OS_WIN) #include #include typedef BOOL(WINAPI*PProcessIdToSessionId)(DWORD,DWORD*); static PProcessIdToSessionId pProcessIdToSessionId = 0; #endif #if defined(Q_OS_UNIX) #include #include #include #endif namespace QtLP_Private { #include "qtlockedfile.cpp" #if defined(Q_OS_WIN) #include "qtlockedfile_win.cpp" #else #include "qtlockedfile_unix.cpp" #endif } const char* QtLocalPeer::ack = "ack"; QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId) : QObject(parent), id(appId) { QString prefix = id; if (id.isEmpty()) { id = QCoreApplication::applicationFilePath(); #if defined(Q_OS_WIN) id = id.toLower(); #endif prefix = id.section(QLatin1Char('/'), -1); } prefix.remove(QRegExp("[^a-zA-Z]")); prefix.truncate(6); QByteArray idc = id.toUtf8(); quint16 idNum = qChecksum(idc.constData(), idc.size()); socketName = QLatin1String("qtsingleapp-") + prefix + QLatin1Char('-') + QString::number(idNum, 16); #if defined(Q_OS_WIN) if (!pProcessIdToSessionId) { QLibrary lib("kernel32"); pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve("ProcessIdToSessionId"); } if (pProcessIdToSessionId) { DWORD sessionId = 0; pProcessIdToSessionId(GetCurrentProcessId(), &sessionId); socketName += QLatin1Char('-') + QString::number(sessionId, 16); } #else socketName += QLatin1Char('-') + QString::number(::getuid(), 16); #endif server = new QLocalServer(this); QString lockName = QDir(QDir::tempPath()).absolutePath() + QLatin1Char('/') + socketName + QLatin1String("-lockfile"); lockFile.setFileName(lockName); lockFile.open(QIODevice::ReadWrite); } bool QtLocalPeer::isClient() { if (lockFile.isLocked()) return false; if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false)) return true; bool res = server->listen(socketName); #if defined(Q_OS_UNIX) && (QT_VERSION >= QT_VERSION_CHECK(4,5,0)) // ### Workaround if (!res && server->serverError() == QAbstractSocket::AddressInUseError) { QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName); res = server->listen(socketName); } #endif if (!res) qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString())); QObject::connect(server, SIGNAL(newConnection()), SLOT(receiveConnection())); return false; } bool QtLocalPeer::sendMessage(const QString &message, int timeout) { if (!isClient()) return false; QLocalSocket socket; bool connOk = false; for(int i = 0; i < 2; i++) { // Try twice, in case the other instance is just starting up socket.connectToServer(socketName); connOk = socket.waitForConnected(timeout/2); if (connOk || i) break; int ms = 250; #if defined(Q_OS_WIN) Sleep(DWORD(ms)); #else struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 }; nanosleep(&ts, NULL); #endif } if (!connOk) return false; QByteArray uMsg(message.toUtf8()); QDataStream ds(&socket); ds.writeBytes(uMsg.constData(), uMsg.size()); bool res = socket.waitForBytesWritten(timeout); if (res) { res &= socket.waitForReadyRead(timeout); // wait for ack if (res) res &= (socket.read(qstrlen(ack)) == ack); } return res; } void QtLocalPeer::receiveConnection() { QLocalSocket* socket = server->nextPendingConnection(); if (!socket) return; while (socket->bytesAvailable() < (int)sizeof(quint32)) socket->waitForReadyRead(); QDataStream ds(socket); QByteArray uMsg; quint32 remaining; ds >> remaining; uMsg.resize(remaining); int got = 0; char* uMsgBuf = uMsg.data(); do { got = ds.readRawData(uMsgBuf, remaining); remaining -= got; uMsgBuf += got; } while (remaining && got >= 0 && socket->waitForReadyRead(2000)); if (got < 0) { qWarning("QtLocalPeer: Message reception failed %s", socket->errorString().toLatin1().constData()); delete socket; return; } QString message(QString::fromUtf8(uMsg)); socket->write(ack, qstrlen(ack)); socket->waitForBytesWritten(1000); socket->waitForDisconnected(1000); // make sure client reads ack delete socket; emit messageReceived(message); //### (might take a long time to return) } ukui-control-center/shell/qtsingleapplication/qtlockedfile.h0000644000175000017500000000630713630066010023410 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the name of Digia Plc and its Subsidiary(-ies) 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 ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QTLOCKEDFILE_H #define QTLOCKEDFILE_H #include #ifdef Q_OS_WIN #include #endif #if defined(Q_OS_WIN) # if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT) # define QT_QTLOCKEDFILE_EXPORT # elif defined(QT_QTLOCKEDFILE_IMPORT) # if defined(QT_QTLOCKEDFILE_EXPORT) # undef QT_QTLOCKEDFILE_EXPORT # endif # define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport) # elif defined(QT_QTLOCKEDFILE_EXPORT) # undef QT_QTLOCKEDFILE_EXPORT # define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport) # endif #else # define QT_QTLOCKEDFILE_EXPORT #endif namespace QtLP_Private { class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile { public: enum LockMode { NoLock = 0, ReadLock, WriteLock }; QtLockedFile(); QtLockedFile(const QString &name); ~QtLockedFile(); bool open(OpenMode mode); bool lock(LockMode mode, bool block = true); bool unlock(); bool isLocked() const; LockMode lockMode() const; private: #ifdef Q_OS_WIN Qt::HANDLE wmutex; Qt::HANDLE rmutex; QVector rmutexes; QString mutexname; Qt::HANDLE getMutexHandle(int idx, bool doCreate); bool waitMutex(Qt::HANDLE mutex, bool doBlock); #endif LockMode m_lock_mode; }; } #endif ukui-control-center/shell/qtsingleapplication/QtSingleApplication0000644000175000017500000000004113630066010024413 0ustar fengfeng#include "qtsingleapplication.h" ukui-control-center/shell/qtsingleapplication/qtlockedfile.cpp0000644000175000017500000001374213630066010023744 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the name of Digia Plc and its Subsidiary(-ies) 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 ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qtlockedfile.h" /*! \class QtLockedFile \brief The QtLockedFile class extends QFile with advisory locking functions. A file may be locked in read or write mode. Multiple instances of \e QtLockedFile, created in multiple processes running on the same machine, may have a file locked in read mode. Exactly one instance may have it locked in write mode. A read and a write lock cannot exist simultaneously on the same file. The file locks are advisory. This means that nothing prevents another process from manipulating a locked file using QFile or file system functions offered by the OS. Serialization is only guaranteed if all processes that access the file use QLockedFile. Also, while holding a lock on a file, a process must not open the same file again (through any API), or locks can be unexpectedly lost. The lock provided by an instance of \e QtLockedFile is released whenever the program terminates. This is true even when the program crashes and no destructors are called. */ /*! \enum QtLockedFile::LockMode This enum describes the available lock modes. \value ReadLock A read lock. \value WriteLock A write lock. \value NoLock Neither a read lock nor a write lock. */ /*! Constructs an unlocked \e QtLockedFile object. This constructor behaves in the same way as \e QFile::QFile(). \sa QFile::QFile() */ QtLockedFile::QtLockedFile() : QFile() { #ifdef Q_OS_WIN wmutex = 0; rmutex = 0; #endif m_lock_mode = NoLock; } /*! Constructs an unlocked QtLockedFile object with file \a name. This constructor behaves in the same way as \e QFile::QFile(const QString&). \sa QFile::QFile() */ QtLockedFile::QtLockedFile(const QString &name) : QFile(name) { #ifdef Q_OS_WIN wmutex = 0; rmutex = 0; #endif m_lock_mode = NoLock; } /*! Opens the file in OpenMode \a mode. This is identical to QFile::open(), with the one exception that the Truncate mode flag is disallowed. Truncation would conflict with the advisory file locking, since the file would be modified before the write lock is obtained. If truncation is required, use resize(0) after obtaining the write lock. Returns true if successful; otherwise false. \sa QFile::open(), QFile::resize() */ bool QtLockedFile::open(OpenMode mode) { if (mode & QIODevice::Truncate) { qWarning("QtLockedFile::open(): Truncate mode not allowed."); return false; } return QFile::open(mode); } /*! Returns \e true if this object has a in read or write lock; otherwise returns \e false. \sa lockMode() */ bool QtLockedFile::isLocked() const { return m_lock_mode != NoLock; } /*! Returns the type of lock currently held by this object, or \e QtLockedFile::NoLock. \sa isLocked() */ QtLockedFile::LockMode QtLockedFile::lockMode() const { return m_lock_mode; } /*! \fn bool QtLockedFile::lock(LockMode mode, bool block = true) Obtains a lock of type \a mode. The file must be opened before it can be locked. If \a block is true, this function will block until the lock is aquired. If \a block is false, this function returns \e false immediately if the lock cannot be aquired. If this object already has a lock of type \a mode, this function returns \e true immediately. If this object has a lock of a different type than \a mode, the lock is first released and then a new lock is obtained. This function returns \e true if, after it executes, the file is locked by this object, and \e false otherwise. \sa unlock(), isLocked(), lockMode() */ /*! \fn bool QtLockedFile::unlock() Releases a lock. If the object has no lock, this function returns immediately. This function returns \e true if, after it executes, the file is not locked by this object, and \e false otherwise. \sa lock(), isLocked(), lockMode() */ /*! \fn QtLockedFile::~QtLockedFile() Destroys the \e QtLockedFile object. If any locks were held, they are released. */ ukui-control-center/shell/qtsingleapplication/qtsingleapplication.cpp0000644000175000017500000002701013630066010025341 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the name of Digia Plc and its Subsidiary(-ies) 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 ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qtsingleapplication.h" #include "qtlocalpeer.h" #include /*! \class QtSingleApplication qtsingleapplication.h \brief The QtSingleApplication class provides an API to detect and communicate with running instances of an application. This class allows you to create applications where only one instance should be running at a time. I.e., if the user tries to launch another instance, the already running instance will be activated instead. Another usecase is a client-server system, where the first started instance will assume the role of server, and the later instances will act as clients of that server. By default, the full path of the executable file is used to determine whether two processes are instances of the same application. You can also provide an explicit identifier string that will be compared instead. The application should create the QtSingleApplication object early in the startup phase, and call isRunning() to find out if another instance of this application is already running. If isRunning() returns false, it means that no other instance is running, and this instance has assumed the role as the running instance. In this case, the application should continue with the initialization of the application user interface before entering the event loop with exec(), as normal. The messageReceived() signal will be emitted when the running application receives messages from another instance of the same application. When a message is received it might be helpful to the user to raise the application so that it becomes visible. To facilitate this, QtSingleApplication provides the setActivationWindow() function and the activateWindow() slot. If isRunning() returns true, another instance is already running. It may be alerted to the fact that another instance has started by using the sendMessage() function. Also data such as startup parameters (e.g. the name of the file the user wanted this new instance to open) can be passed to the running instance with this function. Then, the application should terminate (or enter client mode). If isRunning() returns true, but sendMessage() fails, that is an indication that the running instance is frozen. Here's an example that shows how to convert an existing application to use QtSingleApplication. It is very simple and does not make use of all QtSingleApplication's functionality (see the examples for that). \code // Original int main(int argc, char **argv) { QApplication app(argc, argv); MyMainWidget mmw; mmw.show(); return app.exec(); } // Single instance int main(int argc, char **argv) { QtSingleApplication app(argc, argv); if (app.isRunning()) return !app.sendMessage(someDataString); MyMainWidget mmw; app.setActivationWindow(&mmw); mmw.show(); return app.exec(); } \endcode Once this QtSingleApplication instance is destroyed (normally when the process exits or crashes), when the user next attempts to run the application this instance will not, of course, be encountered. The next instance to call isRunning() or sendMessage() will assume the role as the new running instance. For console (non-GUI) applications, QtSingleCoreApplication may be used instead of this class, to avoid the dependency on the QtGui library. \sa QtSingleCoreApplication */ void QtSingleApplication::sysInit(const QString &appId) { actWin = 0; peer = new QtLocalPeer(this, appId); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); } /*! Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc, \a argv, and \a GUIenabled are passed on to the QAppliation constructor. If you are creating a console application (i.e. setting \a GUIenabled to false), you may consider using QtSingleCoreApplication instead. */ QtSingleApplication::QtSingleApplication(int &argc, char **argv, bool GUIenabled) : QApplication(argc, argv, GUIenabled) { sysInit(); } /*! Creates a QtSingleApplication object with the application identifier \a appId. \a argc and \a argv are passed on to the QAppliation constructor. */ QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char **argv) : QApplication(argc, argv) { sysInit(appId); } #if QT_VERSION < 0x050000 /*! Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc, \a argv, and \a type are passed on to the QAppliation constructor. */ QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type) : QApplication(argc, argv, type) { sysInit(); } # if defined(Q_WS_X11) /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). \a dpy, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, visual, cmap) { sysInit(); } /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). \a dpy, \a argc, \a argv, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, argc, argv, visual, cmap) { sysInit(); } /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be \a appId. \a dpy, \a argc, \a argv, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, argc, argv, visual, cmap) { sysInit(appId); } # endif // Q_WS_X11 #endif // QT_VERSION < 0x050000 /*! Returns true if another instance of this application is running; otherwise false. This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session). \sa sendMessage() */ bool QtSingleApplication::isRunning() { return peer->isClient(); } /*! Tries to send the text \a message to the currently running instance. The QtSingleApplication object in the running instance will emit the messageReceived() signal when it receives the message. This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within \a timeout milliseconds, this function return false. \sa isRunning(), messageReceived() */ bool QtSingleApplication::sendMessage(const QString &message, int timeout) { return peer->sendMessage(message, timeout); } /*! Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application. */ QString QtSingleApplication::id() const { return peer->applicationId(); } /*! Sets the activation window of this application to \a aw. The activation window is the widget that will be activated by activateWindow(). This is typically the application's main window. If \a activateOnMessage is true (the default), the window will be activated automatically every time a message is received, just prior to the messageReceived() signal being emitted. \sa activateWindow(), messageReceived() */ void QtSingleApplication::setActivationWindow(QWidget* aw, bool activateOnMessage) { actWin = aw; if (activateOnMessage) connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); else disconnect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); } /*! Returns the applications activation window if one has been set by calling setActivationWindow(), otherwise returns 0. \sa setActivationWindow() */ QWidget* QtSingleApplication::activationWindow() const { return actWin; } /*! De-minimizes, raises, and activates this application's activation window. This function does nothing if no activation window has been set. This is a convenience function to show the user that this application instance has been activated when he has tried to start another instance. This function should typically be called in response to the messageReceived() signal. By default, that will happen automatically, if an activation window has been set. \sa setActivationWindow(), messageReceived(), initialize() */ void QtSingleApplication::activateWindow() { if (actWin) { actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized); actWin->raise(); actWin->activateWindow(); } } /*! \fn void QtSingleApplication::messageReceived(const QString& message) This signal is emitted when the current instance receives a \a message from another instance of this application. \sa sendMessage(), setActivationWindow(), activateWindow() */ /*! \fn void QtSingleApplication::initialize(bool dummy = true) \obsolete */ ukui-control-center/shell/qtsingleapplication/qtsinglecoreapplication.cpp0000644000175000017500000001235513630066010026220 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the name of Digia Plc and its Subsidiary(-ies) 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 ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qtsinglecoreapplication.h" #include "qtlocalpeer.h" /*! \class QtSingleCoreApplication qtsinglecoreapplication.h \brief A variant of the QtSingleApplication class for non-GUI applications. This class is a variant of QtSingleApplication suited for use in console (non-GUI) applications. It is an extension of QCoreApplication (instead of QApplication). It does not require the QtGui library. The API and usage is identical to QtSingleApplication, except that functions relating to the "activation window" are not present, for obvious reasons. Please refer to the QtSingleApplication documentation for explanation of the usage. A QtSingleCoreApplication instance can communicate to a QtSingleApplication instance if they share the same application id. Hence, this class can be used to create a light-weight command-line tool that sends commands to a GUI application. \sa QtSingleApplication */ /*! Creates a QtSingleCoreApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc and \a argv are passed on to the QCoreAppliation constructor. */ QtSingleCoreApplication::QtSingleCoreApplication(int &argc, char **argv) : QCoreApplication(argc, argv) { peer = new QtLocalPeer(this); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); } /*! Creates a QtSingleCoreApplication object with the application identifier \a appId. \a argc and \a argv are passed on to the QCoreAppliation constructor. */ QtSingleCoreApplication::QtSingleCoreApplication(const QString &appId, int &argc, char **argv) : QCoreApplication(argc, argv) { peer = new QtLocalPeer(this, appId); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); } /*! Returns true if another instance of this application is running; otherwise false. This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session). \sa sendMessage() */ bool QtSingleCoreApplication::isRunning() { return peer->isClient(); } /*! Tries to send the text \a message to the currently running instance. The QtSingleCoreApplication object in the running instance will emit the messageReceived() signal when it receives the message. This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within \a timeout milliseconds, this function return false. \sa isRunning(), messageReceived() */ bool QtSingleCoreApplication::sendMessage(const QString &message, int timeout) { return peer->sendMessage(message, timeout); } /*! Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application. */ QString QtSingleCoreApplication::id() const { return peer->applicationId(); } /*! \fn void QtSingleCoreApplication::messageReceived(const QString& message) This signal is emitted when the current instance receives a \a message from another instance of this application. \sa sendMessage() */ ukui-control-center/shell/qtsingleapplication/QtLockedFile0000644000175000017500000000003213630066010023007 0ustar fengfeng#include "qtlockedfile.h" ukui-control-center/shell/qtsingleapplication/qtlockedfile_unix.cpp0000644000175000017500000000661413630066010025007 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the name of Digia Plc and its Subsidiary(-ies) 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 ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include "qtlockedfile.h" bool QtLockedFile::lock(LockMode mode, bool block) { if (!isOpen()) { qWarning("QtLockedFile::lock(): file is not opened"); return false; } if (mode == NoLock) return unlock(); if (mode == m_lock_mode) return true; if (m_lock_mode != NoLock) unlock(); struct flock fl; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK; int cmd = block ? F_SETLKW : F_SETLK; int ret = fcntl(handle(), cmd, &fl); if (ret == -1) { if (errno != EINTR && errno != EAGAIN) qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); return false; } m_lock_mode = mode; return true; } bool QtLockedFile::unlock() { if (!isOpen()) { qWarning("QtLockedFile::unlock(): file is not opened"); return false; } if (!isLocked()) return true; struct flock fl; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; fl.l_type = F_UNLCK; int ret = fcntl(handle(), F_SETLKW, &fl); if (ret == -1) { qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); return false; } m_lock_mode = NoLock; return true; } QtLockedFile::~QtLockedFile() { if (isOpen()) unlock(); } ukui-control-center/shell/homepagewidget.cpp0000644000175000017500000002412513642553044020225 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "homepagewidget.h" #include "ui_homepagewidget.h" #include #include #include #include #include #include #include "mainwindow.h" #include "utils/keyvalueconverter.h" #include "component/clicklabel.h" #include "utils/functionselect.h" #include "component/hoverwidget.h" HomePageWidget::HomePageWidget(QWidget *parent) : QWidget(parent), ui(new Ui::HomePageWidget) { ui->setupUi(this); //获取主窗口 this->setParent(parent); pmainWindow = (MainWindow *)parentWidget(); // ui->listWidget->setStyleSheet("QListWidget#listWidget{border: none;background:#FFFFFF}"); //初始化首页 initUI(); } HomePageWidget::~HomePageWidget() { delete ui; } void HomePageWidget::initUI(){ ui->listWidget->setResizeMode(QListView::Adjust); ui->listWidget->setViewMode(QListView::IconMode); ui->listWidget->setMovement(QListView::Static); ui->listWidget->setSpacing(0); ui->listWidget->setFocusPolicy(Qt::NoFocus); ui->listWidget->setSelectionMode(QAbstractItemView::NoSelection); // ui->listWidget->setGridSize(QSize(360, 100)); //构建枚举键值转换对象 KeyValueConverter * kvConverter = new KeyValueConverter(); //继承QObject,No Delete //初始化功能列表数据 FunctionSelect::initValue(); QSignalMapper * moduleSignalMapper = new QSignalMapper(this); for (int moduleIndex = 0; moduleIndex < TOTALMODULES; moduleIndex++){ //获取插件QMap QMap moduleMap; moduleMap = pmainWindow->exportModule(moduleIndex); //获取当前模块名 QString modulenameString = kvConverter->keycodeTokeystring(moduleIndex).toLower(); QString modulenamei18nString = kvConverter->keycodeTokeyi18nstring(moduleIndex); ////构建首页8个模块 //基础Widget QWidget * baseWidget = new QWidget; baseWidget->setAttribute(Qt::WA_DeleteOnClose); baseWidget->setObjectName("itemBaseWidget"); // baseWidget->setStyleSheet("QWidget#itemBaseWidget{border: 1px solid #3D68E5;}"); //解决在20.04悬浮颜色问题 baseWidget->setStyleSheet("QWidget#itemBaseWidget{background: #FFFFFF;}"); //baseWidget 的顶级布局 QVBoxLayout * baseVerLayout = new QVBoxLayout(baseWidget); baseVerLayout->setMargin(0); baseVerLayout->setSpacing(0); //包含显示内容的布局 QBoxLayout * majorHorLayout = new QHBoxLayout(); majorHorLayout->setMargin(0); majorHorLayout->setSpacing(0); //内容Widget的构建 HoverWidget * widget = new HoverWidget(modulenameString); // QWidget * widget = new QWidget; widget->setFixedSize(QSize(320, 80)); widget->setAttribute(Qt::WA_DeleteOnClose); widget->setObjectName("itemWidget"); widget->setStyleSheet("HoverWidget:hover:!pressed#itemWidget{background: #3D6BE5; border-radius: 4px;}"); connect(widget, &HoverWidget::widgetClicked, [=](QString moduleName){ int moduleIndex = kvConverter->keystringTokeycode(moduleName); //获取模块的第一项跳转 QString firstFunc; QList tmpList = FunctionSelect::funcinfoList[moduleIndex]; for (FuncInfo tmpStruct : tmpList){ if (moduleMap.keys().contains(tmpStruct.namei18nString)){ firstFunc = tmpStruct.namei18nString; //跳转 pmainWindow->functionBtnClicked(moduleMap.value(firstFunc)); break; } } }); QHBoxLayout * mainHorLayout = new QHBoxLayout(widget); mainHorLayout->setMargin(16); mainHorLayout->setSpacing(16); QLabel * logoLabel = new QLabel(widget); logoLabel->setObjectName("logoLabel"); logoLabel->setScaledContents(true); logoLabel->setPixmap(QPixmap(QString(":/img/homepage/%1.png").arg(modulenameString))); QVBoxLayout * rightVerLayout = new QVBoxLayout(); rightVerLayout->setContentsMargins(0, 2, 0, 0); rightVerLayout->setSpacing(8); QLabel * titleLabel = new QLabel(widget); titleLabel->setObjectName("mptitleLabel"); titleLabel->setText(modulenamei18nString); titleLabel->setStyleSheet("font-size: 16px; color: #DE000000;"); QHBoxLayout * funcHorLayout = new QHBoxLayout(); //循环填充模块下属功能 QList tmpList = FunctionSelect::funcinfoList[moduleIndex]; for (int funcIndex = 0; funcIndex < tmpList.size(); funcIndex++){ FuncInfo single = tmpList.at(funcIndex); //跳过插件不存在的功能项 if (!moduleMap.contains(single.namei18nString)){ // qDebug() << single.namei18nString << "plugin object not found"; continue; } //跳过不在首页显示的功能 if (!single.mainShow) continue; ClickLabel * label = new ClickLabel(single.namei18nString, widget); label->setStyleSheet("font-size: 14px; color: #91434345;"); connect(label, SIGNAL(clicked()), moduleSignalMapper, SLOT(map())); moduleSignalMapper->setMapping(label, moduleMap[single.namei18nString]); funcHorLayout->addWidget(label); } rightVerLayout->addStretch(); rightVerLayout->addWidget(titleLabel); rightVerLayout->addLayout(funcHorLayout); rightVerLayout->addStretch(); mainHorLayout->addWidget(logoLabel); mainHorLayout->addLayout(rightVerLayout); mainHorLayout->addStretch(); widget->setLayout(mainHorLayout); majorHorLayout->addWidget(widget); majorHorLayout->addStretch(); baseVerLayout->addLayout(majorHorLayout); baseVerLayout->addStretch(); baseWidget->setLayout(baseVerLayout); //悬浮改变Widget状态 connect(widget, &HoverWidget::enterWidget, this, [=](QString mname){ HoverWidget * w = dynamic_cast(QObject::sender()); logoLabel->setPixmap(QPixmap(QString(":/img/homepage/%1Hover.png").arg(mname))); titleLabel->setStyleSheet("font-size: 16px; color: #F7FFFFFF;"); QList clabelList = w->findChildren(); for (ClickLabel * tmpLabel : clabelList){ tmpLabel->setStyleSheet("font-size: 14px; color: #91FFFFFF;"); } }); //还原状态 connect(widget, &HoverWidget::leaveWidget, this, [=](QString mname){ HoverWidget * w = dynamic_cast(QObject::sender()); logoLabel->setPixmap(QPixmap(QString(":/img/homepage/%1.png").arg(mname))); titleLabel->setStyleSheet("font-size: 16px; color: #DE000000;"); QList clabelList = w->findChildren(); for (ClickLabel * tmpLabel : clabelList){ tmpLabel->setStyleSheet("font-size: 14px; color: #91434345;"); } }); QListWidgetItem * item = new QListWidgetItem(ui->listWidget); item->setSizeHint(QSize(360, 100)); ui->listWidget->addItem(item); ui->listWidget->setItemWidget(item, baseWidget); } connect(moduleSignalMapper, SIGNAL(mapped(QObject*)), pmainWindow, SLOT(functionBtnClicked(QObject*))); // connect(ui->listWidget, SIGNAL(itemPressed(QListWidgetItem *)), this, SLOT(slotItemPressed(QListWidgetItem *))); } /* * 问题:点击“语言和地区”最终跳转至“时间和日期”页面;点击“默认应用”最总跳转至“显示器”页面 * 解决:屏蔽ClickLabel的点击传递 * 备注:首页需要实现伸缩模块居中效果,改为使用留布局来实现,所以如下方法将来无法使用 */ void HomePageWidget::slotItemPressed(QListWidgetItem *item) { if(item == nullptr) return; int moduleIndex = ui->listWidget->currentRow(); QMap moduleMap; moduleMap = pmainWindow->exportModule(moduleIndex); QWidget *currentWidget = QApplication::widgetAt(QCursor::pos()); QLabel *label = dynamic_cast(currentWidget); HoverWidget* hoverWidget = dynamic_cast(currentWidget); if(label != nullptr && hoverWidget != nullptr) return; if(label != nullptr || hoverWidget != nullptr) { QString targetString = ""; QList tmpList = FunctionSelect::funcinfoList[moduleIndex]; for (int funcIndex = 0; funcIndex < tmpList.size(); funcIndex++) { FuncInfo single = tmpList.at(funcIndex); //跳过插件不存在的功能项 if (!moduleMap.contains(single.namei18nString)) { continue; } // if targetString is already been found, there is no need to continue this cycle if(!targetString.isEmpty()) break; targetString = single.namei18nString; } if(targetString .isEmpty()) { pmainWindow->functionBtnClicked(moduleMap.first()); //QMap是无序的,不能保证跳转到第一项 } else { pmainWindow->functionBtnClicked(moduleMap[targetString]); } } } ukui-control-center/shell/framelessExtended/0000755000175000017500000000000013635333016020163 5ustar fengfengukui-control-center/shell/framelessExtended/framelesshandle.h0000644000175000017500000000302113621411724023463 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef FRAMELESSHANDLE_H #define FRAMELESSHANDLE_H #include class QWidget; class FramelessHandlePrivate; class FramelessHandle : public QObject { Q_OBJECT public: explicit FramelessHandle(QObject *parent = 0); ~FramelessHandle(); void activateOn(QWidget * topLevelWidget); void setWidgetResizable(bool resizable); void setWidgetMovable(bool movable); void setBorderWidget(uint width); bool currentWidgetResizable(); bool currentWidgetMovable(); uint currentBorderWidth(); protected: virtual bool eventFilter(QObject *watched, QEvent *event); private: FramelessHandlePrivate * fpri; }; #endif // FRAMELESSHANDLE_H ukui-control-center/shell/framelessExtended/framelesshandle.cpp0000644000175000017500000000551313621411724024026 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "framelesshandle.h" #include #include "framelesshandleprivate.h" #include "widgethandlerealize.h" FramelessHandle::FramelessHandle(QObject *parent) : QObject(parent), fpri(new FramelessHandlePrivate()) { fpri->widgetResizable = true; fpri->widgetMovable = true; } FramelessHandle::~FramelessHandle() { QList widgets = fpri->widgethandleHash.keys(); for (int i = 0; i < widgets.size(); i++){ delete fpri->widgethandleHash.take(widgets[i]); } delete fpri; } bool FramelessHandle::eventFilter(QObject *watched, QEvent *event){ switch (event->type()){ case QEvent::MouseMove: case QEvent::HoverMove: case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::Leave:{ WidgetHandleRealize * widgethandleobj = fpri->widgethandleHash.value(static_cast(watched)); if (widgethandleobj){ widgethandleobj->handleWidgetEvent(event); return true; } } default: break; } return QObject::eventFilter(watched, event); } void FramelessHandle::activateOn(QWidget *topLevelWidget){ if (!fpri->widgethandleHash.contains(topLevelWidget)){ WidgetHandleRealize * widgethandleobj = new WidgetHandleRealize(fpri, topLevelWidget); fpri->widgethandleHash.insert(topLevelWidget, widgethandleobj); topLevelWidget->installEventFilter(this); } } void FramelessHandle::setWidgetResizable(bool resizable){ fpri->widgetResizable = resizable; } void FramelessHandle::setWidgetMovable(bool movable){ fpri->widgetMovable = movable; } void FramelessHandle::setBorderWidget(uint width){ if (width > 0) CursorPosCalculator::borderWidth = width; } bool FramelessHandle::currentWidgetResizable(){ return fpri->widgetResizable; } bool FramelessHandle::currentWidgetMovable(){ return fpri->widgetMovable; } uint FramelessHandle::currentBorderWidth(){ return CursorPosCalculator::borderWidth; } ukui-control-center/shell/framelessExtended/widgethandlerealize.cpp0000644000175000017500000001660213635333016024707 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "widgethandlerealize.h" #include #include #include WidgetHandleRealize::WidgetHandleRealize(FramelessHandlePrivate *_fpri, QWidget * pTopLevelWidget ) { fpri = _fpri; widgetInAction = pTopLevelWidget; leftBtnPressed = false; cursorShapeChanged = false; currentWindowFlags = widgetInAction->windowFlags(); widgetInAction->setMouseTracking(true); widgetInAction->setAttribute(Qt::WA_Hover, true); } WidgetHandleRealize::~WidgetHandleRealize() { widgetInAction->setMouseTracking(false); widgetInAction->setWindowFlags(currentWindowFlags); widgetInAction->setAttribute(Qt::WA_Hover, false); } QWidget * WidgetHandleRealize::currentWidget(){ return widgetInAction; } void WidgetHandleRealize::handleWidgetEvent(QEvent *event){ switch (event->type()){ case QEvent::MouseButtonPress: handleMousePressEvent(dynamic_cast(event)); break; case QEvent::MouseButtonRelease: handleMouseReleaseEvent(dynamic_cast(event)); break; case QEvent::MouseMove: handleMouseMoveEvent(dynamic_cast(event)); break; case QEvent::Leave: handleLeaveEvent(dynamic_cast(event)); break; case QEvent::HoverMove: handleHoverMoveEvent(dynamic_cast(event)); break; default: break; } } void WidgetHandleRealize::updateCursorShape(const QPoint &gMousePos){ if (widgetInAction->isFullScreen() || widgetInAction->isMaximized()){ if (cursorShapeChanged) widgetInAction->unsetCursor(); return; } moveMousePos.recalculate(gMousePos, widgetInAction->frameGeometry()); if (moveMousePos.onLeftTopEdges || moveMousePos.onRightBottomEdges){ widgetInAction->setCursor(Qt::SizeFDiagCursor); cursorShapeChanged = true; } else if (moveMousePos.onRightTopEdges || moveMousePos.onLeftBottomEdges){ widgetInAction->setCursor(Qt::SizeBDiagCursor); cursorShapeChanged = true; } else if (moveMousePos.onLeftEdges || moveMousePos.onRightEdges){ widgetInAction->setCursor(Qt::SizeHorCursor); cursorShapeChanged = true; } else if (moveMousePos.onTopEdges || moveMousePos.onBottomEdges){ widgetInAction->setCursor(Qt::SizeVerCursor); cursorShapeChanged = true; } else{ if (cursorShapeChanged){ widgetInAction->unsetCursor(); cursorShapeChanged = false; } } } void WidgetHandleRealize::moveWidget(const QPoint &gMousePos){ widgetInAction->move(gMousePos - dragPos); } void WidgetHandleRealize::resizeWidget(const QPoint &gMousePos){ QRect origRect; origRect = widgetInAction->frameGeometry(); int left = origRect.left(); int top = origRect.top(); int right = origRect.right(); int bottom = origRect.bottom(); origRect.getCoords(&left, &top, &right, &bottom); int minWidth = widgetInAction->minimumWidth(); int minHeight = widgetInAction->minimumHeight(); if (pressedMousePos.onLeftTopEdges){ left = gMousePos.x(); top = gMousePos.y(); } else if (pressedMousePos.onRightTopEdges){ right = gMousePos.x(); top = gMousePos.y(); } else if (pressedMousePos.onRightBottomEdges){ right = gMousePos.x(); bottom = gMousePos.y(); } else if (pressedMousePos.onLeftBottomEdges){ left = gMousePos.x(); bottom = gMousePos.y(); } else if (pressedMousePos.onLeftEdges){ left = gMousePos.x(); } else if (pressedMousePos.onTopEdges){ top = gMousePos.y(); } else if (pressedMousePos.onRightEdges){ right = gMousePos.x(); } else if (pressedMousePos.onBottomEdges){ bottom = gMousePos.y(); } QRect newRect(QPoint(left, top), QPoint(right, bottom)); if (newRect.isValid()){ if (minWidth > newRect.width()){ if (left != origRect.left()) newRect.setLeft(origRect.left()); else newRect.setRight(origRect.right()); } if (minHeight > newRect.height()){ if (top != origRect.top()) newRect.setTop(origRect.top()); else newRect.setBottom(origRect.bottom()); } widgetInAction->setGeometry(newRect); } } void WidgetHandleRealize::handleMousePressEvent(QMouseEvent *event){ if (event->button() == Qt::LeftButton){ leftBtnPressed = true; QRect frameRect = widgetInAction->frameGeometry(); pressedMousePos.recalculate(event->globalPos(), frameRect); dragPos = event->globalPos() - frameRect.topLeft(); } } void WidgetHandleRealize::handleMouseReleaseEvent(QMouseEvent *event){ if (event->button() == Qt::LeftButton){ leftBtnPressed = false; pressedMousePos.reset(); } } void WidgetHandleRealize::handleMouseMoveEvent(QMouseEvent *event){ if (leftBtnPressed){ if (fpri->widgetResizable && pressedMousePos.onEdges){ resizeWidget(event->globalPos()); } else if (fpri->widgetMovable && leftBtnPressed){ // moveWidget(event->globalPos()); moveMainWindow(); } } else if (fpri->widgetResizable){ updateCursorShape(event->globalPos()); } } void WidgetHandleRealize::moveMainWindow(){ Display *display = QX11Info::display(); Atom netMoveResize = XInternAtom(display, "_NET_WM_MOVERESIZE", False); XEvent xEvent; const auto pos = QCursor::pos(); memset(&xEvent, 0, sizeof(XEvent)); xEvent.xclient.type = ClientMessage; xEvent.xclient.message_type = netMoveResize; xEvent.xclient.display = display; xEvent.xclient.window = widgetInAction->winId(); xEvent.xclient.format = 32; xEvent.xclient.data.l[0] = pos.x(); xEvent.xclient.data.l[1] = pos.y(); xEvent.xclient.data.l[2] = 8; xEvent.xclient.data.l[3] = Button1; xEvent.xclient.data.l[4] = 0; XUngrabPointer(display, CurrentTime); XSendEvent(display, QX11Info::appRootWindow(QX11Info::appScreen()), False, SubstructureNotifyMask | SubstructureRedirectMask, &xEvent); XFlush(display); } void WidgetHandleRealize::handleLeaveEvent(QEvent *event){ Q_UNUSED(event) if (!leftBtnPressed) widgetInAction->unsetCursor(); } void WidgetHandleRealize::handleHoverMoveEvent(QHoverEvent *event){ if (fpri->widgetResizable){ updateCursorShape(widgetInAction->mapToGlobal(event->pos())); } } ukui-control-center/shell/framelessExtended/framelesshandleprivate.h0000644000175000017500000000226613621411724025070 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef FRAMELESSHANDLEPRIVATE_H #define FRAMELESSHANDLEPRIVATE_H #include class QWidget; class WidgetHandleRealize; class FramelessHandlePrivate { public: QHash widgethandleHash; bool widgetResizable : true; bool widgetMovable : true; }; #endif // FRAMELESSHANDLEPRIVATE_H ukui-control-center/shell/framelessExtended/widgethandlerealize.h0000644000175000017500000000406213635333016024351 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef WIDGETHANDLEREALIZE_H #define WIDGETHANDLEREALIZE_H #include #include #include #include #include "framelesshandleprivate.h" #include "cursorposcalculator.h" class WidgetHandleRealize : public QWidget { public: explicit WidgetHandleRealize(FramelessHandlePrivate * _fpri, QWidget *pTopLevelWidget); ~WidgetHandleRealize(); public: QWidget * currentWidget(); void handleWidgetEvent(QEvent * event); private: void updateCursorShape(const QPoint &gMousePos); void resizeWidget(const QPoint &gMousePos); void moveWidget(const QPoint &gMousePos); void handleMousePressEvent(QMouseEvent * event); void handleMouseReleaseEvent(QMouseEvent * event); void handleMouseMoveEvent(QMouseEvent * event); void handleLeaveEvent(QEvent * event); void handleHoverMoveEvent(QHoverEvent * event); void moveMainWindow(void); private: FramelessHandlePrivate * fpri; QWidget * widgetInAction; QPoint dragPos; CursorPosCalculator pressedMousePos; CursorPosCalculator moveMousePos; bool leftBtnPressed; bool cursorShapeChanged; Qt::WindowFlags currentWindowFlags; }; #endif // WIDGETHANDLEREALIZE_H ukui-control-center/shell/framelessExtended/cursorposcalculator.cpp0000644000175000017500000000451213621411724025000 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "cursorposcalculator.h" int CursorPosCalculator::borderWidth = 5; CursorPosCalculator::CursorPosCalculator() { reset(); } void CursorPosCalculator::reset(){ onEdges = false; onLeftEdges = false; onTopEdges = false; onRightEdges = false; onBottomEdges = false; onLeftTopEdges =false; onRightTopEdges = false; onRightBottomEdges = false; onLeftBottomEdges = false; } void CursorPosCalculator::recalculate(const QPoint &globalMousePos, const QRect &frameRect){ int globalMouseX = globalMousePos.x(); int globalMouseY = globalMousePos.y(); int frameX = frameRect.x(); int frameY = frameRect.y(); int frameWidth = frameRect.width(); int frameHeight = frameRect.height(); onLeftEdges = (globalMouseX >= frameX && globalMouseX <= frameX + borderWidth); onRightEdges = (globalMouseX >= frameX + frameWidth - borderWidth && globalMouseX <= frameX + frameWidth); onTopEdges = (globalMouseY >= frameY && globalMouseY <= frameY + borderWidth); onBottomEdges = (globalMouseY >= frameY + frameHeight - borderWidth && globalMouseY <= frameY + frameHeight); onLeftTopEdges = onTopEdges && onLeftEdges; onRightTopEdges = onRightEdges && onTopEdges; onRightBottomEdges = onRightEdges && onBottomEdges; onLeftBottomEdges = onLeftEdges && onBottomEdges; onEdges = onLeftEdges || onRightEdges || onTopEdges || onBottomEdges; } ukui-control-center/shell/framelessExtended/cursorposcalculator.h0000644000175000017500000000273413621411724024451 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CURSORPOSCALCULATOR_H #define CURSORPOSCALCULATOR_H #include #include class CursorPosCalculator { public: explicit CursorPosCalculator(); public: void reset(); void recalculate(const QPoint &globalMousePos, const QRect &frameRect); public: bool onEdges : true; bool onLeftEdges : true; bool onTopEdges : true; bool onRightEdges : true; bool onBottomEdges : true; bool onLeftTopEdges : true; bool onRightTopEdges : true; bool onRightBottomEdges : true; bool onLeftBottomEdges : true; static int borderWidth; }; #endif // CURSORPOSCALCULATOR_H ukui-control-center/registeredQDbus/0000755000175000017500000000000013635333016016506 5ustar fengfengukui-control-center/registeredQDbus/registeredQDbus.pro0000644000175000017500000000057413621411724022330 0ustar fengfengQT += core dbus QT -= gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = launchSysDbus TEMPLATE = app CONFIG += console c++11 link_pkgconfig CONFIG -= app_bundle DESTDIR = . INCLUDEPATH += . target.source += $$TARGET target.path = /usr/bin INSTALLS += \ target HEADERS += \ sysdbusregister.h SOURCES += \ main.cpp \ sysdbusregister.cpp ukui-control-center/registeredQDbus/sysdbusregister.h0000644000175000017500000000336013635333016022122 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SYSDBUSREGISTER_H #define SYSDBUSREGISTER_H #include #include #include #include class SysdbusRegister : public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "com.control.center.interface") public: explicit SysdbusRegister(); ~SysdbusRegister(); private: // QString m_name; signals: Q_SCRIPTABLE void nameChanged(QString); Q_SCRIPTABLE void computerinfo(QString); public slots: // Q_SCRIPTABLE QString name() const; // Q_SCRIPTABLE void SetName(QString name); Q_SCRIPTABLE void exitService(); Q_SCRIPTABLE QString GetComputerInfo(); Q_SCRIPTABLE void systemRun(QString cmd); //设置免密登录状态 Q_SCRIPTABLE void setNoPwdLoginStatus(bool status,QString username); //获取免密登录状态 Q_SCRIPTABLE QString getNoPwdLoginStatus(); }; #endif // SYSDBUSREGISTER_H ukui-control-center/registeredQDbus/conf/0000755000175000017500000000000013621411724017431 5ustar fengfengukui-control-center/registeredQDbus/conf/com.control.center.qt.systemdbus.conf0000644000175000017500000000165113621411724026643 0ustar fengfeng ukui-control-center/registeredQDbus/conf/com.control.center.qt.systemdbus.service0000644000175000017500000000013413621411724027351 0ustar fengfeng[D-BUS Service] Name=com.control.center.qt.systemdbus Exec=/usr/bin/launchSysDbus User=root ukui-control-center/registeredQDbus/main.cpp0000644000175000017500000000321613621411724020136 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include "sysdbusregister.h" int main(int argc, char *argv[]){ QCoreApplication app(argc, argv); app.setOrganizationName("Kylin Team"); app.setApplicationName("ukcc-service"); QDBusConnection systemBus = QDBusConnection::systemBus(); if (!systemBus.registerService("com.control.center.qt.systemdbus")){ qCritical() << "QDbus register service failed reason:" << systemBus.lastError(); exit(1); } if (!systemBus.registerObject("/", new SysdbusRegister(), QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals)){ qCritical() << "QDbus register object failed reason:" << systemBus.lastError(); exit(2); } return app.exec(); } ukui-control-center/registeredQDbus/sysdbusregister.cpp0000644000175000017500000000465213635333016022462 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "sysdbusregister.h" #include SysdbusRegister::SysdbusRegister() { } SysdbusRegister::~SysdbusRegister() { } //QString SysdbusRegister::name () const{ // return m_name; //} //void SysdbusRegister::SetName(QString name){ // m_name = name; //} void SysdbusRegister::exitService(){ qApp->exit(0); } QString SysdbusRegister::GetComputerInfo(){ QByteArray ba; FILE * fp = NULL; char cmd[128]; char buf[1024]; sprintf(cmd, "dmidecode -t system"); if ((fp = popen(cmd, "r")) != NULL){ rewind(fp); while (!feof(fp)) { fgets(buf, sizeof (buf), fp); ba.append(buf); } pclose(fp); fp = NULL; } return QString(ba); } void SysdbusRegister::systemRun(QString cmd){ QProcess::execute(cmd); } //获取免密登录状态 QString SysdbusRegister::getNoPwdLoginStatus(){ QByteArray ba; FILE * fp = NULL; char cmd[128]; char buf[1024]; sprintf(cmd, "cat /etc/group |grep nopasswdlogin"); if ((fp = popen(cmd, "r")) != NULL){ rewind(fp); fgets(buf, sizeof (buf), fp); ba.append(buf); pclose(fp); fp = NULL; }else{ qDebug()<<"popen文件打开失败"< Copyright (C) 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 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. ukui-control-center/env.pri0000644000175000017500000000015513621411724014715 0ustar fengfengPROJECT_ROOTDIR = $$PWD PROJECT_COMPONENTLIBS = $$PWD/cclibs PROJECT_COMPONENTSOURCE = $$PWD/commonComponent ukui-control-center/commonComponent/0000755000175000017500000000000013635333016016565 5ustar fengfengukui-control-center/commonComponent/MaskWidget/0000755000175000017500000000000013635333016020624 5ustar fengfengukui-control-center/commonComponent/MaskWidget/maskwidget.cpp0000644000175000017500000000277313635333016023500 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "maskwidget.h" #include MaskWidget::MaskWidget(QWidget *parent) : QWidget(parent) { // setAttribute(Qt::WA_TranslucentBackground); pWidth = parent->width(); pHeigh = parent->height(); pRadius = 6; pColor = QString("#ffffff"); pBorder = 2; } MaskWidget::~MaskWidget() { } void MaskWidget::paintEvent(QPaintEvent *event){ QPainter painter(this); painter.setRenderHint(QPainter:: Antialiasing, true); //设置渲染,启动反锯齿 painter.setPen( QPen(QColor(pColor), pBorder)); painter.drawRect(0, 0, pWidth, pHeigh); painter.drawRoundedRect(0, 0, pWidth, pHeigh, pRadius, pRadius); } ukui-control-center/commonComponent/MaskWidget/maskwidget.h0000644000175000017500000000253213635333016023136 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MASKWIDGET_H #define MASKWIDGET_H #include class MaskWidget : public QWidget { Q_OBJECT public: explicit MaskWidget(QWidget *parent); ~MaskWidget(); public: void setDemandWidth(int w); void setDemandHigh(int h); void setDemandRadius(int r); void setDemandColor(int color); protected: void paintEvent(QPaintEvent *event); private: int pWidth; int pHeigh; int pRadius; int pBorder; QString pColor; }; #endif // MASKWIDGET_H ukui-control-center/commonComponent/FlowLayout/0000755000175000017500000000000013635333016020672 5ustar fengfengukui-control-center/commonComponent/FlowLayout/flowlayout.h0000644000175000017500000000376413635333016023262 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef FLOWLAYOUT_H #define FLOWLAYOUT_H #include #include #include class FlowLayout : public QLayout { public: explicit FlowLayout(QWidget *parent, int margin = -1, int hSpacing = -1, int vSpacing = -1); explicit FlowLayout(int margin = -1, int hSpacing = -1, int vSpacing = -1); ~FlowLayout(); public: void addItem(QLayoutItem *item) Q_DECL_OVERRIDE; int horizontalSpacing() const; int verticalSpacing() const; Qt::Orientations expandingDirections() const Q_DECL_OVERRIDE; bool hasHeightForWidth() const Q_DECL_OVERRIDE; int heightForWidth(int) const Q_DECL_OVERRIDE; int count() const Q_DECL_OVERRIDE; QLayoutItem *itemAt(int index) const Q_DECL_OVERRIDE; QSize minimumSize() const Q_DECL_OVERRIDE; void setGeometry(const QRect &rect) Q_DECL_OVERRIDE; QSize sizeHint() const Q_DECL_OVERRIDE; QLayoutItem *takeAt(int index) Q_DECL_OVERRIDE; private: int doLayout(const QRect &rect, bool testOnly) const; int smartSpacing(QStyle::PixelMetric pm) const; private: QList itemList; int m_hSpace; int m_vSpace; }; #endif // FLOWLAYOUT_H ukui-control-center/commonComponent/FlowLayout/flowlayout.cpp0000644000175000017500000001070113635333016023602 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "flowlayout.h" #include #include FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing) : QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing) { setContentsMargins(margin, margin, margin, margin); } FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing) : m_hSpace(hSpacing), m_vSpace(vSpacing) { setContentsMargins(margin, margin, margin, margin); } FlowLayout::~FlowLayout(){ QLayoutItem * item; while ((item = takeAt(0))) { } } void FlowLayout::addItem(QLayoutItem *item){ itemList.append(item); } int FlowLayout::horizontalSpacing() const{ if (m_hSpace >= 0) { return m_hSpace; } else { return smartSpacing(QStyle::PM_LayoutHorizontalSpacing); } } int FlowLayout::verticalSpacing() const{ if (m_vSpace >= 0) { return m_vSpace; } else { return smartSpacing(QStyle::PM_LayoutVerticalSpacing); } } int FlowLayout::count() const{ return itemList.size(); } QLayoutItem * FlowLayout::itemAt(int index) const{ return itemList.value(index); } QLayoutItem * FlowLayout::takeAt(int index){ if (index >= 0 && index < itemList.size()) return itemList.takeAt(index); else return 0; } Qt::Orientations FlowLayout::expandingDirections() const{ return 0; } bool FlowLayout::hasHeightForWidth() const{ return true; } int FlowLayout::heightForWidth(int width) const{ int height = doLayout(QRect(0, 0, width, 0), true); return height; } void FlowLayout::setGeometry(const QRect &rect){ QLayout::setGeometry(rect); doLayout(rect, false); } QSize FlowLayout::sizeHint() const{ return minimumSize(); } QSize FlowLayout::minimumSize() const{ QSize size; QLayoutItem *item; foreach (item, itemList) size = size.expandedTo(item->minimumSize()); size += QSize(2*margin(), 2*margin()); return size; } int FlowLayout::doLayout(const QRect &rect, bool testOnly) const{ int left, top, right, bottom; getContentsMargins(&left, &top, &right, &bottom); QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom); int x = effectiveRect.x(); int y = effectiveRect.y(); int lineHeight = 0; QLayoutItem *item; foreach (item, itemList) { QWidget *wid = item->widget(); int spaceX = horizontalSpacing(); if (spaceX == -1) spaceX = wid->style()->layoutSpacing( QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal); int spaceY = verticalSpacing(); if (spaceY == -1) spaceY = wid->style()->layoutSpacing( QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical); int nextX = x + item->sizeHint().width() + spaceX; if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) { x = effectiveRect.x(); y = y + lineHeight + spaceY; nextX = x + item->sizeHint().width() + spaceX; lineHeight = 0; } if (!testOnly) item->setGeometry(QRect(QPoint(x, y), item->sizeHint())); x = nextX; lineHeight = qMax(lineHeight, item->sizeHint().height()); } return y + lineHeight - rect.y() + bottom; } int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const{ QObject *parent = this->parent(); if (!parent) { return -1; } else if (parent->isWidgetType()) { QWidget *pw = static_cast(parent); return pw->style()->pixelMetric(pm, 0, pw); } else { return static_cast(parent)->spacing(); } } ukui-control-center/commonComponent/SwitchButton/0000755000175000017500000000000013621411724021220 5ustar fengfengukui-control-center/commonComponent/SwitchButton/switchbutton.h0000644000175000017500000000342513621411724024132 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SWITCHBUTTON_H #define SWITCHBUTTON_H #include #include #include #include class SwitchButton : public QWidget { Q_OBJECT public: SwitchButton(QWidget *parent = 0); ~SwitchButton(); void setChecked(bool checked); bool isChecked(); protected: void mousePressEvent(QMouseEvent *); void resizeEvent(QResizeEvent *); void paintEvent(QPaintEvent *); void drawBg(QPainter * painter); void drawSlider(QPainter * painter); private: bool checked; QColor borderColorOff; QColor bgColorOff; QColor bgColorOn; QColor sliderColorOff; QColor sliderColorOn; int space; //滑块离背景间隔 int rectRadius; //圆角角度 int step; //移动步长 int startX; int endX; QTimer * timer; private slots: void updatevalue(); Q_SIGNALS: void checkedChanged(bool checked); }; #endif // SWITCHBUTTON_H ukui-control-center/commonComponent/SwitchButton/switchbutton.cpp0000644000175000017500000001150513621411724024463 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "switchbutton.h" #include SwitchButton::SwitchButton(QWidget *parent) : QWidget(parent) { // this->resize(QSize(52, 24)); this->setFixedSize(QSize(52, 24)); checked = false; borderColorOff = QColor("#cccccc"); bgColorOff = QColor("#ffffff"); bgColorOn = QColor("#0078d7"); sliderColorOff = QColor("#cccccc"); sliderColorOn = QColor("#ffffff"); space = 2; // rectRadius = 5; step = width() / 50; startX = 0; endX= 0; timer = new QTimer(this); timer->setInterval(5); connect(timer, SIGNAL(timeout()), this, SLOT(updatevalue())); } SwitchButton::~SwitchButton() { } void SwitchButton::paintEvent(QPaintEvent *){ //启用反锯齿 QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); drawBg(&painter); drawSlider(&painter); } void SwitchButton::drawBg(QPainter *painter){ painter->save(); // painter->setPen(Qt::NoPen); if (!checked){ painter->setPen(borderColorOff); painter->setBrush(bgColorOff); } else{ painter->setPen(Qt::NoPen); painter->setBrush(bgColorOn); } //circle out // QRect rect(space, space, width() - space * 2, height() - space * 2); // painter->drawRoundedRect(rect, rectRadius, rectRadius); //circle in QRect rect(0, 0, width(), height()); //半径为高度的一半 int radius = rect.height() / 2; //圆的宽度为高度 int circleWidth = rect.height(); QPainterPath path; path.moveTo(radius, rect.left()); path.arcTo(QRectF(rect.left(), rect.top(), circleWidth, circleWidth), 90, 180); path.lineTo(rect.width() - radius, rect.height()); path.arcTo(QRectF(rect.width() - rect.height(), rect.top(), circleWidth, circleWidth), 270, 180); path.lineTo(radius, rect.top()); painter->drawPath(path); painter->restore(); } void SwitchButton::drawSlider(QPainter *painter){ painter->save(); painter->setPen(Qt::NoPen); if (!checked){ painter->setBrush(sliderColorOff); } else painter->setBrush(sliderColorOn); //circle out // QRect rect(0, 0, width() - space, height() - space); // int sliderwidth = rect.height(); // QRect sliderRect(startX, space / 2, sliderwidth, sliderwidth); // painter->drawEllipse(sliderRect); //circle in QRect rect(0, 0, width(), height()); int sliderWidth = rect.height() - space * 2; QRect sliderRect(startX + space, space, sliderWidth, sliderWidth); painter->drawEllipse(sliderRect); painter->restore(); } void SwitchButton::mousePressEvent(QMouseEvent *){ checked = !checked; emit checkedChanged(checked); step = width() / 50; if (checked){ //circle out // endX = width() - height() + space; //circle in endX = width() - height(); } else{ endX = 0; } timer->start(); } void SwitchButton::resizeEvent(QResizeEvent *){ // step = width() / 50; if (checked){ //circle out // startX = width() - height() + space; //circle in startX = width() - height(); } else startX = 0; update(); } void SwitchButton::updatevalue(){ if (checked) if (startX < endX){ startX = startX + step; } else{ startX = endX; timer->stop(); } else{ if (startX > endX){ startX = startX - step; } else{ startX = endX; timer->stop(); } } update(); } void SwitchButton::setChecked(bool checked){ if (this->checked != checked){ this->checked = checked; emit checkedChanged(checked); update(); } step = width() / 50; if (checked){ //circle out // endX = width() - height() + space; //circle in endX = width() - height(); } else{ endX = 0; } timer->start(); } bool SwitchButton::isChecked(){ return this->checked; } ukui-control-center/commonComponent/switchbutton.pri0000644000175000017500000000025413621411724022035 0ustar fengfeng #LIBINTERFACE_NAME = $$qtLibraryTarget(switchbutton) SOURCES += \ $$PWD/SwitchButton/switchbutton.cpp \ HEADERS += \ $$PWD/SwitchButton/switchbutton.h \ ukui-control-center/commonComponent/flowlayout.pri0000644000175000017500000000024213635333016021504 0ustar fengfeng #LIBINTERFACE_NAME = $$qtLibraryTarget(flowlayout) SOURCES += \ $$PWD/FlowLayout/flowlayout.cpp \ HEADERS += \ $$PWD/FlowLayout/flowlayout.h \ ukui-control-center/commonComponent/maskwidget.pri0000644000175000017500000000024213635333016021436 0ustar fengfeng #LIBINTERFACE_NAME = $$qtLibraryTarget(maskwidget) SOURCES += \ $$PWD/MaskWidget/maskwidget.cpp \ HEADERS += \ $$PWD/MaskWidget/maskwidget.h \ ukui-control-center/commonComponent/combobox.pri0000644000175000017500000000043113621411724021105 0ustar fengfengSOURCES += \ $$PWD/ComboBox/combobox.cpp \ $$PWD/ComboBox/comboboxitem.cpp \ $$PWD/ComboBox/nofocusframedelegate.cpp \ HEADERS += \ $$PWD/ComboBox/combobox.h \ $$PWD/ComboBox/comboboxitem.h \ $$PWD/ComboBox/nofocusframedelegate.h \ ukui-control-center/commonComponent/HoverWidget/0000755000175000017500000000000013641405665021023 5ustar fengfengukui-control-center/commonComponent/HoverWidget/hoverwidget.cpp0000644000175000017500000000332213641405665024056 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "hoverwidget.h" #include #include #include HoverWidget::HoverWidget(QString mname, QWidget *parent) : QWidget(parent), _name(mname) { setAttribute(Qt::WA_DeleteOnClose); } HoverWidget::~HoverWidget() { } void HoverWidget::enterEvent(QEvent *event){ emit enterWidget(_name); QWidget::enterEvent(event); } void HoverWidget::leaveEvent(QEvent *event){ emit leaveWidget(_name); QWidget::leaveEvent(event); } //子类化一个QWidget,为了能够使用样式表,则需要提供paintEvent事件。 //这是因为QWidget的paintEvent()是空的,而样式表要通过paint被绘制到窗口中。 void HoverWidget::paintEvent(QPaintEvent *event){ Q_UNUSED(event) QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } ukui-control-center/commonComponent/HoverWidget/hoverwidget.h0000644000175000017500000000255313641405665023530 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef HOVERWIDGET_H #define HOVERWIDGET_H #include #include class HoverWidget : public QWidget { Q_OBJECT public: explicit HoverWidget(QString mname, QWidget *parent = 0); ~HoverWidget(); public: QString _name; protected: virtual void enterEvent(QEvent * event); virtual void leaveEvent(QEvent * event); virtual void paintEvent(QPaintEvent * event); Q_SIGNALS: void enterWidget(QString name); void leaveWidget(QString name); }; #endif // HOVERWIDGET_H ukui-control-center/commonComponent/ComboBox/0000755000175000017500000000000013621411724020273 5ustar fengfengukui-control-center/commonComponent/ComboBox/combobox.h0000644000175000017500000000303713621411724022257 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef COMBOBOX_H #define COMBOBOX_H #include #include #include "comboboxitem.h" #include "nofocusframedelegate.h" class QListWidget; class QListWidgetItem; class ComboBox : public QComboBox { Q_OBJECT public: explicit ComboBox(QWidget *parent = 0); ~ComboBox(); // void setCurrentItem(QString text); void addwidgetItem(QString text); void removewidgetItems(); void setcurrentwidgetIndex(int index); private: // QString currentitemtext; QListWidget * partListWidget; public slots: // void currentItemChanged(QListWidgetItem * current, QListWidgetItem * previous); void onChooseItem(QString text); }; #endif // COMBOBOX_H ukui-control-center/commonComponent/ComboBox/nofocusframedelegate.h0000644000175000017500000000236113621411724024630 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef NOFOCUSFRAMEDELEGATE_H #define NOFOCUSFRAMEDELEGATE_H #include #include class NoFocusFrameDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit NoFocusFrameDelegate(QWidget *parent = 0); void paint(QPainter * painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; #endif // NOFOCUSFRAMEDELEGATE_H ukui-control-center/commonComponent/ComboBox/comboboxitem.cpp0000644000175000017500000000374113621411724023473 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "comboboxitem.h" ComboboxItem::ComboboxItem(QWidget *parent) : QWidget(parent) { mpress = false; imgLabel = new QLabel(this); textLabel = new QLabel(this); mainlayout = new QHBoxLayout(this); // mainlayout->addStretch(); mainlayout->addWidget(textLabel); mainlayout->addStretch(); mainlayout->addWidget(imgLabel); mainlayout->addStretch(); mainlayout->setSpacing(5); mainlayout->setContentsMargins(5, 5, 5, 5); setLayout(mainlayout); } ComboboxItem::~ComboboxItem() { } void ComboboxItem::setLabelContent(QString content){ textLabel->setText(content); } QString ComboboxItem::getLabelContent(){ return textLabel->text(); } void ComboboxItem::mousePressEvent(QMouseEvent * event){ if (event->button() == Qt::LeftButton){ mpress = true; // emit chooseItem(textLabel->text()); } // QWidget::mousePressEvent(event); } void ComboboxItem::mouseReleaseEvent(QMouseEvent *event){ if (event->button() == Qt::LeftButton){ ;//un used warning } if (mpress){ emit chooseItem(textLabel->text()); mpress = false; } } ukui-control-center/commonComponent/ComboBox/comboboxitem.h0000644000175000017500000000275613621411724023145 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef COMBOBOXITEM_H #define COMBOBOXITEM_H #include #include #include #include class ComboboxItem : public QWidget { Q_OBJECT public: explicit ComboboxItem(QWidget *parent = nullptr); ~ComboboxItem(); void setLabelContent(QString content); QString getLabelContent(); protected: virtual void mousePressEvent(QMouseEvent * event); virtual void mouseReleaseEvent(QMouseEvent * event); private: QLabel * imgLabel; QLabel * textLabel; QHBoxLayout * mainlayout; bool mpress; Q_SIGNALS: void chooseItem(QString text); }; #endif // COMBOBOXITEM_H ukui-control-center/commonComponent/ComboBox/nofocusframedelegate.cpp0000644000175000017500000000252213621411724025162 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "nofocusframedelegate.h" #include NoFocusFrameDelegate::NoFocusFrameDelegate(QWidget *parent) : QStyledItemDelegate(parent) { } void NoFocusFrameDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const{ QStyleOptionViewItem itemOption(option); if (itemOption.state & QStyle::State_HasFocus){ itemOption.state ^= QStyle::State_HasFocus; } QStyledItemDelegate::paint(painter, itemOption, index); } ukui-control-center/commonComponent/ComboBox/combobox.cpp0000644000175000017500000000501713621411724022612 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "combobox.h" #include #include #include #include ComboBox::ComboBox(QWidget *parent) : QComboBox(parent) { this->setStyleSheet("QComboBox{border: 1px solid #cccccc; padding: 1px 2px 1px 2px; background-color: #eeeeee;}" "QComboBox QAbstractItemView::item{height: 30px}" "QListView::item{background: white}" "QListView::item:hover{background: #BDD7FD}"); partListWidget = new QListWidget(this); partListWidget->setItemDelegate(new NoFocusFrameDelegate(this)); partListWidget->verticalScrollBar()->setStyleSheet("QScrollBar{width: 10px}"); partListWidget->setFixedHeight(15 * 30); this->setModel(partListWidget->model()); this->setView(partListWidget); this->setEditable(true); } ComboBox::~ComboBox() { } void ComboBox::onChooseItem(QString text){ this->setEditText(text); this->hidePopup(); } void ComboBox::addwidgetItem(QString text){ ComboboxItem * item = new ComboboxItem(this); item->setLabelContent(text); connect(item, SIGNAL(chooseItem(QString)), this, SLOT(onChooseItem(QString))); QListWidgetItem * widgetItem = new QListWidgetItem(partListWidget); partListWidget->setItemWidget(widgetItem, item); } void ComboBox::setcurrentwidgetIndex(int index){ QListWidgetItem * item = partListWidget->takeItem(index); this->setEditText(item->text()); } void ComboBox::removewidgetItems(){ for (int i = partListWidget->count() - 1; i >= 0; i--){ QListWidgetItem * item = partListWidget->item(i); partListWidget->removeItemWidget(item); delete item; } } ukui-control-center/commonComponent/hoverwidget.pri0000644000175000017500000000025013621411724021623 0ustar fengfeng #LIBINTERFACE_NAME = $$qtLibraryTarget(switchbutton) SOURCES += \ $$PWD/HoverWidget/hoverwidget.cpp \ HEADERS += \ $$PWD/HoverWidget/hoverwidget.h \ ukui-control-center/README.md0000644000175000017500000001232713621411724014674 0ustar fengfeng## ukui-control-center ### 主体框架 - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [x] 界面美化 - **TROUBLE** - 无 - **TODO** - 跳转逻辑变动 - 搜索 ### 功能插件 #### 系统 ##### 显示器 - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TODO** - 无 ##### 默认应用程序 - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 添加界面未设计 ##### 电源 - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 ##### 开机启动 - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 添加删除 #### 设备 ##### 打印机 - **InProgress** - [x] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 ##### 鼠标(lyp实现) - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TROUBLE** - 光标粗细暂无接口 - **TODO** - 无 ##### 键盘(lyp实现) - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 键盘布局的实现 ##### 声音 - **InProgress** - [x] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 需要调用mate库libmatemixer-dev - **TODO** - 无 #### 个性化 ##### 背景 - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 纯色 - 幻灯片 ##### 主题 - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 ##### 锁屏 - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 预览效果 ##### 字体 - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 设计稿有变动,待改动 ##### 屏幕保护 - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 预览 ##### 开始 - **InProgress** - [x] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 需要开始菜单提供接口 - **TODO** - 无 ##### 任务栏 - **InProgress** - [ ] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 需要任务栏提供接口 - **TODO** - 无 ##### 图标主题 - **InProgress** - [ ] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 #### 网络 ##### 网络连接 - **InProgress** - [x] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 ##### VPN - **InProgress** - [x] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 ##### 代理 - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 #### 账户 ##### 账户信息 - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 密码加密后才能设置 - 添加新用户控件换行问题 - 仅剩一个管理员时的处理 ##### 登录选项 - **InProgress** - [x] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 功能暂时不支持 - **TODO** - 无 #### 时间和语言 ##### 语言 - **InProgress** - [ ] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 ##### 区域 - **InProgress** - [ ] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 跳转逻辑变动 - 无 ##### 日期和时间 - **InProgress** - [ ] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 #### 更新和安全 ##### 更新 - **InProgress** - [x] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 ##### 恢复 - **InProgress** - [x] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 ##### 备份 - **InProgress** - [x] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 #### 信息和任务 ##### 通知和操作 - **InProgress** - [x] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 ##### 多任务 - **InProgress** - [x] 界面绘制 - [ ] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 无 ##### 关于 - **InProgress** - [x] 界面绘制 - [x] 功能实现 - [ ] 界面美化 - **TROUBLE** - 无 - **TODO** - 部分系统硬件信息 ukui-control-center/NEWS0000644000175000017500000000011613622361302014102 0ustar fengfeng2.0.0 * Migrate from gtk to qt. 1.1.0 * update gtk3 API 0.0.1 * init. ukui-control-center/data/0000755000175000017500000000000013641405665014332 5ustar fengfengukui-control-center/data/faces/0000755000175000017500000000000013642553044015407 5ustar fengfengukui-control-center/data/faces/5.png0000644000175000017500000040654713635333016016276 0ustar fengfengPNG  IHDRx pHYs%%IR$ IDATx}xչ{fHdr6qoS %{)Nܐ )HKbberm3s甙]jw]:Xi;sΙ#R(((.ʖ?5E*o78^ {cmPP BPJ@-)s l!R 5R8CUP

    D:{[T0}JT2W(>9SG@) )A) IC ~<; (ScJPH JPH\ ~8럮.E֖)+TB"(@!.TrBx/M|Xs(|*YPO(@d*%~E>D1%'B@((д"^٘RX@+LsȪw*E@C) WAչώVO3@Y7C#dw(a v~_8BAkv_ET.PVGc[A;T R)d*՝OA! [f筀aߤ%3$S{2"(8Q.~ljQ_A!,7>?*.XeZ4 )[䃹B<+(_k􅵏?ʌ0dW*,0xAWPH,ax_ ),yѢ]8ZF$P!W*wBr lK&t Ujr2xB) .2Z(($ H2j9Gakf0 P#$+Tf(ˆݡH0 2]+/,쑹fPԱ&C*Ip@)ge< PPxyFT;5M`%ŏ~9կ} 3d~e{:dJ(R(_A!s.ssG~s&h(My(o@QC)EᯠaHiǶYP@5]HUzT@A$%L`2>4_P5悎`!]脋 P$l~|Bf!Mg+3Q61?ۊ ,^"XP"@7J6?%2 ?]jGV=c{c1WH PP~ 9oIBF5Wf +R *ѯmW=Ys9)Yd&xHhiLU%0TQ| 7H?2BKg?(2\!R)'ApCO((DAy eW3مa :cDJ2 _P<J( (@ VV&}1H1ύB^o >F\!U@a@ ηF B3A2ϕFS:l!T{XVP @!}^P1"%O8-ń{w "BsA^"?T O%~T/nOZް7 # Z=`*xE2/!D;fVXru7+% KP @ X9A*ML,/:qo 2^!5/a>"R! +@Ue'$2-Ф%.uh_wJ L"3Y`\PD g`ex唼n#xQ[şh:S;uLDX֏ue$S  PJ@ CfX?] *:| [ ` B/iqA>Ol©7By FH32U dJb{Qx VTA) W?hAiIm\04Nv1M2HH#%nJ,^RZ!rFFo>WJ@x2WZvU!kݿ*PcjB;yY|>>}Yݝl /èߑsMlFϖ;?3d(>DXʯ]J3NԄ~Π{#7Dzbph8G0]!D%ܿ}oƨYzxBJTv({Y H-Srf+˾k@nANO.ȃC<ЇZ?# PMyVkߔJIvɐDS~WkT( M( OYJ<蚦voAD2) l#_ S X"۟t#9qwm>0O9cIũ,d}НpIcK)RYR|q3yoO p>  =/[@@0!lÒ}\O+t`h(IJrО.'`㿻J^)i@~./Q1dM+(+>=82d^;_ExD?w< ;e^_e^BG"UP#({1gJو$ k` P-߿l:E< ! T0td'`\`[W*ި[ȶC:KTNPg2YFYpSCʯ]S ( I>J+Dʼ C |FZ׸@w)D*>X5tC\SI ';BPA__YԠ$PʛGD`@(xL)^([zUEv-~ҏ"ZA4dMi"U.S9C_GI+-s,'ƒA4w3DƐ4q Ǵ:`QV_fQz*~ j@ W$ge+(,*Ǟ@ bTC# C+WTV>\iSr%F,.kcuwV B`*¹Ɖ^DA@a+Vpͣ展WPHYPLgKo>rrjdsdhQ\Pr!Βw.!eT d]HRp <=))IMAa@tdt PtOՎp@9)sW},p6gŊ@(X8}0W,+Tv H~e`0X=?QPVP4qv/gH3$KIJD='G IOL*`i'q+үIfH4L1Ӕf KaA-_. ?s~%s V"]ѥUF=}*lUl8 =!MHKXj'Hl/ >jHIYqx'T-cV6'%C#VfH\.2@Yo/lqπxN`p;xtJb~/>~qy}85VO;ob7vA`Mxj}% %І)6t8T͋lC7v T[lJ |s.>lT<@jMi\Q0*-:Ͳe^WuV5Vtɵ@R:'& a{Mp 6 `k+ <ǁHO8}׮i_w 4̀dܞ57[{\l Tn^xTeLiL4w+iFn;cN jy@-=*֒)5 (HB`06 @S&?e}J/7]F_1Kְ$Ӵ|37B\3W'3G^/S<+\وgE|gd~AZ\#s᝾8ws%WLJ Yp=uIP`i˖WFdyƱ}ɭs *Q׌])< L!`yPPxm}- f_JgiY ӓZ' m [ 2s6ZnU=F%P2aߏСvH2>8f0OYsE2&M{ ,/֫uZOrއ)N(vY(Dk"a&HGOwL)ot3s<2Y!ϺXhxd0̻wRe8bc"̃@XU{$јGkﷵaas,Ynt"u'kmnzΕ}8hU /Y(Dy,90Ox )Px5Z\+4r?;3<qVғdyt_{^gIazhΆg$qSGK`~& %q?%_ Xȿg_}Xmh V*YRL xNh?SUy!`a[B{DHZ Aye !@ϔad`a%&08@,VcG IӠU #zцnF*:B9z).yq/FN}Df}5pϔ$wg =:8q$NG̋AʫD< :gӶsRX%DG+x#Ǜ%?Rx5& C%@Gvc+FXH[6R[,;֝I|0'- Xle^Y. ZdG7;)~%F pH%? lj[e}o~Ȋ8{2]c!C,K2Y=7qק9G!V=7pO>kW @p[ ' p}h?dHG/fD j#(x8XvApy4O2wmojᅲ#xLtw;;|}y̐#vftSBQ0gg4׻ vHr$Jϻ V[3Bh8 Ֆ$qr|3q􊑀&"I^'ß1?APy^%Sf_Z=ϯ| ]%/`d6h7FŞ8e @ y O1{#oY?B("ILRq[-Oq^.KJ )zhhizE!BERmtzUeͻ.XwKѓ J cR!^7#\ t\F*B( Y. $|-n+Ff077谊 j;VN+i xW :++Iy sv<#+FTD#;a0^sy~<* \)&LP.sV\(veWߘ])oE`p[d[~#%,]M&>q ~F+v6ItW(?td< K(taSsX{N{O#WxV#$us-(dV*Lrs?p5 &BaboVd2ҏ;:\oPࣟăHS[xaKB"wȴ@#eB2㊒7S!xcX" 9}-A9dL98.XyC-gڧԊxoҩn1􏳺QE: w~~#G3+W(~r ?&nN3#>ؽ;+PC̏ep@m]r !q i,cRkP# }+* a94Q.PQW y/yRgžulr*, nӎe'qJ R-&bѮJ}\v 'O27|&r>& C+9qO)dMRvQP#(l7?g./vM (J@eO,g*yMo8`7o+@$O8'987޽]ٚfNzX^ | ޯ_3-&8X*h7kJ X/dN?A "k%K`)/Cn4"h33AMHv2qw'c^A0{^|A8 X7uΝX^$q?w'zmp$2Ƙy%d =c?IdkTfC1z2TD-8 ~3 twS((V+Ww@O?9^ph8$-bGsdrxA}YًH7b|sw)y@VO}%L l** [f/=0+g;b}ѥM}UrQ?{6}eVQ P=07vZ#aX$? c)ek!މ8_$b K9^/dbܜ+)'EJf4pY1Ͱh2OOx00&œƱ}_ @* H6Nq('c~8]M[[*Ʉ0 hSĽ.m@atW 2Q #@ "u18w\L)-Z'JS"\Fi#S!@VHD$B\,+S;D?< dv xNc|>#[t( Z63 kE@L  Ϗ&̂B{߄|:84ĘFCIeadP]2uWL7, V([ze2+* oBǜYӟ)gRO7MtDVuu#`Ѭmל |2<`@=@03l/xᣄZnN S*O kv=0;I&a4׭)P@A&6`Uʔ GÉRX,*Zx^:-01e2 Թ&;B@o "cYph'ʶ\m# g |i5yk" ^X4I1meݿx36K,S̀/J{HYrWT^!O̊P0<^OjP&ıg {"Y|?Z~fvC~MЮV.虇}n>rO_pի~GftnA8mW+h81'DD{Szt'`ZNjiqTZTJ#sD*f@PVX1O'Q#(=K$h9W]8k.˿炝P^3XY~ݚFB`!yRL}%oW?,[ƈw[Bx<M=l7UhVMp n̙|Z2>Uw+܎Cǰz)]hLyYA\Myy4#'ʌӀSF**5S"w2}n aI 9Sy78r|p9E`~Xpn ^ۅ>ԟƔ)c/]hGQ_ N9UT7aV0K%\RVHi9xq u0É^/p͍Ä>M{Gojh 7i /'x3E<%4|A>! O, d( v%L IE3 >y8&܉y|sBR.rl[0+XLO$St1h_{s^+VIfD#4cPb5݂`<~j$gcl c R/>&|7)/c|ѵFO|G0a;ǰI0 'rRr#&D:4b|Oya!aax^iqXީ „?yΉ=hfW` τYD֊X6) ^/Byc>Kn4`HZfVg´8vI<0a`ukn_$7M_P?9kYn]Qhe¤>%Gm ) w :ʒ4}cđ2أX>v m'x^ihokѽB?CP4Ȣ2ި{S'/ĭ\k;WnؿvCiU,qsJs& $ eJגRp ?SeH`?ks@|C2c8% ~ Qǔjݎdf˸Pv%)q-."` o,OD0e%qXNaJ"e`H?tBJNaqײ 2=Z`$@1BMX[.<+n#GN-lr^\}Uh8~G@4-LBY%'Ύ/'֜QrAYg+UH)uFp8&B6l@[OM sDer%F_ sV+=< ğw,hQHO8ǙoxpCz.l>7e_4w0xi <]/9Eza_&3H/˖X,oK3BT/n̽$Tsm "=qTHY(箾?$bPE 3sn2.Htw<. I` #z\D5 KKu|Sg>}JKl9w,G _doFBGG'{z\ή4u'ֶG?@J+:8&;"s.'1BKs|C?ĖXz<|`l,n_-7C7A=jh;r:9_V,"O'~铛I0/L.hN8~8sBk >q,bྰyDhYwud  )x,;2dTjxa!x⪱ڡFY*^5X쟍 |/@>< g+?)_V`v\Sb |Ys)Oٳi UUSt#lBMM+>bܸaX~zB!&MC[{=,ˆg4K0}^'f,֖c}.ֆń^?w+f̘n| ׿~=DYcT|'>wb„0){_Ÿ > `DԻ65V#7gF a.J\ < JQ شrz?LT`IGwnW+A+C9հpvE Ph-i&yl__ /0 q Ր{z8"Ci$}1pМ),\ V$?_'IZM?)bxyMڋ$zg\1pӈY gwנ0aY]xr[ve MFOO3N9;KkOO3(Ecc'[`NƦZtvzMaQG[c3qm9_XY|)~{9?@{{s;ZKw,=!urD_(6O<EǮ̊R~w=] .z% m~^Z3-xf]3 o5GKP agBN_r=8ǀmO |:p߳~EKsDK5TaS곁UqGMl~]{mh@>0Mē09V|u%Y*M0T{6N2`4)%SY yc-J"YHE% `2rYN3o?f́ Z**Ү2 [ӪS eY1H*:bMMx `\uhj:?Gl XUW8olb164~IYjIi@s!tvAstv69*Sq+{{p¡F'AE|S7'3L?_WWq=kqXYua9ǰ#|ص92"x-hc }'3i FopHxH OPY%7|^\<=΀+>BpOt >b1!-e\k"10\|Kf]*;b!X_e=xL٬dσpާdvaɌLg\K/@.=q4AC Ǵ4o­}w5*nxDd3 bJ\ Dv)wΖbl [ey*V87昷-H3#p`(:S^K_ ^8|ݓ/?+Ž\p~)\T&1E2<4 3Ee{aS1(O&d(EuZ0Q>j^nȒ  4]b?Gzb4rȉOSU?>\"nEh0[bxK"ީ㱎 4f$p13g,˃$linG8-atS)()98sA&mk r2Zۚ]m(+v;w*;wPu͗q),Zx~go7]/kR8cG8u~:| b`}NÜ bⷿm]w\rcfbQ3gZ1uۍ7w#0F =Qq =0;sg _+'v‰c5|[52]hk3Cgi2,ۣA(2"9e'x+"|砻,M 3D@Yτ?7ӧx`y!](+Py䄃x^\y(nbD p QCt&D6|F{)o71-蚉d-薔hnwx(:l.:-Shk=u~Fk)ߏ:n}fթm?,AK)r~Q7rdLJ?|{;%?.Jg͚KɁ:##dࡇoPUU?N /r8ϴ 闿h@Gg]{50l|~&Kpm#p;*f⑟֭u1ס b쏝-C7#`JѺ?ţMp'4&b]!Vlp#^YMq(7";+um"-ޘ [6#e?~0W9/*rhxyأ#ѫFcȥ78vgthCZdQ /bd?Lس8 G 1'3%Wd %ݤB s: o;[|Mn3/R [jqXD%Wڵ{Fv$95,AƸ(,]ل3[QZ/~_Xt&{6]@OΛY'NF{QN[U5 3< gض+2w3 Mv7aLaN??λň/S'WjpE<-[kD\ Ӡߛfׄw߰~`1aB h^yS'g X ~Z {Ne%r6>ֿ?+`Տ,m8f^(z+ͦGμp46Lq.M"9%C+Xj$4.YQl :L!U3_ : A~:ȅ F?NBF2PrHc)!0rcXz.!#FJpݭ#cEv ŋ`?ϻ7'?}R; r@b6jo7a¿>. qk<0:|͇mSg`6?N4s?x]'tqzQ47sN>r|+Ue,pҡ>9^`xr /> d}.F|ex'Ypci8P[ۃًau(+'qJpcϏx7k8\y>ޘ5j߆gY\3-ֻ2'OZx%%~TǒK⬳+Kh:\^wS|+- h8\j(Q٨ݎUQyl-PzvYDYG טXilqY3:?AaC*s)o8D8o:G $s^`W "tyEMx{H) LE9fv+5U 6@J+4k<ם\?"}T c??4vn'-̞cS HZ"0 ,JP*aÆ⑟ގok`䈳8` p ޽os}_[0)v܉)SPY<*b˖r!{ ;6&73ҾnI8p啋~gy <5?hv\~4aLDDſ^j .\o1fBWןa~|Sc0kv)v=CۀRlX;gqιCN~hwh8}8pUxv2ʆDw%Y%vw7 敠z瓑_ׯrL{GMH|{6Ɨ:fWcLtb.5n؆~8EBDɠ5X"10h8 +<` !$Ōp82ܹA]Y<0߇K&Z'n[Y(X@;q¯,2K G®G{ k8 οۆb(-KᣍŸYڕX1?&LqܻڰʪR[`}Uj|edl=y9^XJ̥E 4w@V%y`L L9f\VL$z~Q*?wY[ݗo3%msyw86{)K:K.|&}~$TT&CFGG_YY[k6`ΜP{#!9Cx2X-wD)ͿwUaixj_7NT?pÅXqTEJ{_ĄjtW`ٲXXxk>̜5?o] }{{:tP[o ?v 'Nb3spP.[}$ߍ0+s=#gg#xe}V3h(񙛘Q z0b.`ntλFB @N\ys#\0nYnd[tuJb3F{M Uef~T!ʭw-St&ڧw( G P%^XeT%ϦlzV&x~Hj\֌&u;Yvf8wa=š~e3'x qL8>1`Z[xic~<f]O_<cp/>1.6e?C#?K{GqaP6=©c"NrA(ᔺś o/:GPlJI)x_:-uGQ̶${ "^۵wk.6lW.( tHH#g&[9gfKnx|b3gfb$Xފf']xjrk za4-vz)Z KnT ۷TFâ 4eRWKteIX ÿ<ʧ̈`FU``B5]9D%u"/"Q.Pdo^fzTP،V`/oB5Ty9if(G0b4Adʽ?laď(_1%Xw9T䡢kYh@bB.Pځѣf\wTbÆFqOѣ׽ʪF : 瞟țUUڰzw"oJ%M@]e~Ok0"7ʕٗHc ! ś/GrMq$G7p=fa픡cʀ-xuǕ`0Rx{{\{\s(@] H;!b0puG()=waDG1Ev};Z0 - | |A(N*w͏?\}{Qla*۱\>ܗPAq9;)q_ b3 @$$¯=]RR| wg]/9z.`!A1*,t1P_Kyuʷ`XF*c񻍘4ɈZÇ)^~w>;àOR$?txfGRMzGu=_]|@jgι׭ IDATiP~JITpdADɑS4"b%*6SQ/ũt \VZ+="FD=Uc!yE{lJm꾈 o ;2Ph_G-@M%#;Gtuwڳqq.]y案 z} *!iÊkuO^xy"%9cdQWC] <>,8 c2} Z(fvW8찱c~0w߬ v|3EZ-ǜVP`dfpӍIHMӡqvv`ԸL^kI7rJ;f!Q@BXޞkeQLJphų9c?w_Cـ\#7ͅX .< ֌cɕA=6C;lyn`!QP΍MN[@-чA7b2IA`??˲_#'P侈Fe~|N7x/cB&DԸc2"J0fBIrG8G/Oǽ\n(Y /+l2'G'Ac_z}ƌ뎬V_$<+X bx 6a `+[ f$,CccNFxxW7!9н //}(6!!zҵ ˗oSN6Y\1IC}u96'Apk~5AI'fPDpjġɁm[;0vGlnqW=OHл٥{_WL`TO9 F:0& XʌCQVfǘ1 ی+ڽAIȆ.gn5bi'>lTWda}GpCC?n4#窼{JD3J8R=a. aSR:.G K!d7FO߿ )(7WsWW7靀\sJj/{HMw;g45m@{qw."TGgf42sNzA;?/ȑ<ro]̆R0Zw95*Q\xox'A?q:y?kGѣCWzlÌzd1z63 /NB6|FDϟ9\)BDweaۭMY:( ? iz|0 NƎ uK>YVGw@\X7}jW^ eL!jMy8`3K!aV)?H 6zhbυxAADڃHOeNTw y[D3ewj~IK6]g१d13GCV.Q\}4|[_K%R-!1Y&fcSn}w>@nn6?Z~ يP-%xe; 9^?چ̛;Ԡ'׭ieu\.GF!<\Mv=:VL?٣9КecyEc1wԀ^OqcS_ y?%5!7 xEoOHBl$n|6DzM\SH@ܛ ⦡%Lض0urzk6[ $f{*%KC$(*{/ ABvYVˁ'QHp'Av7 F P>AE 9I>Lǽ#εF,zX\BU%P'υvB`ydԨt<]˖݋3Θ# Ń}{YCp) 0~B::lXg>5׼݁瞻#l̰`{~Ř \"58?>wns ,ǝ+RG!8|K*K}St >oמFWJ1xl{"tޢ),y^[B@|<Ƚ3Όñ!s(`L&'O׳B9ya#g00x Np)Y(JgȽ7(/%}v;(@]c"@r(.r|Cr ϊJQ_MN1s ($.dβ}(f8;{ J# pho"|yo ۟ $lO8vX/sv<.8Epw֘} ;PA 0ƙ;;^^t:jkXhO?/?"#>0)cHqq:N":*,HLc۶2NFtT8\1%p_wJzҍȊj;]1Tr<@DY]܄?7Z8;(IF Gtzj6"{ڟ((yI`L8a`eu;ِyYQvQd pO㿹+8v13qz >.D zl{Tw.hT3p&[${iWK ;(g H{Kh5kFKA۲9xz EbQ1055㰨f_~ U*j9f2Dz(SG>CXuKⵈG^={":: gQ \O\THd9hI-Xv'VϚmA&50, ޞ0 R|܈(bd/?EE2} RXv {SIHր\F0#"HM?'ޢIʁnؤnsB]UpFAJ py|S>T U U@黡2B|GF6+qA IޔTx#|w[u,PYeǰ!((сV7->o~X.n8İx%<oNE|!jbiJUnfΌ;9s_Zc|s HJ䤑HNȤ8v&W\1 DWYGcƆaH;kLpi137)?{>%FP\3!J÷A]@-͔w+򊆂NuчM=;IZ+5e透>hH>FֽoSgĦ L@@)p߳w:O9{̈LΠ\?пXD9OV87xüFrU ݈&6tZac<[GK"=|-,ɫgKޕpu8cpM +3qPsqޗ^.pC*ei\硲* p9q٭xeHO :vTU?L<$Dhhg?8qǥc yz8+ռ}N<ٽy:46:pnD J(E] #=঻{mY3SL<xeΔP()b1XZ=?"ƇG_yxLjr.[~`Wv8a&5"?[ 3pCZ냁@Ԯ ܠ7.S))TTؔĿ gVj$;ZUJDHҏbeij?QXE2j48ܣpg =-?e~í.Mb&SJq`6b*!ؖJجVd3fDW5X{;l{>:m(-DE%㕗j_6u !z4~YmƆ8EEW7QtP(gn釔;g\@ˏ[/QOkpilҁ؁LE4!ab4΢p5VWMD?J[n~|FBt! C~rP6tk95B+?7&|.T>8)=@M\ |%&LtWwf| %:w8)֮1㷵f(Dj$G(~Zga.G+Vl¹=ÒW]QB"s lV'""ւ$tXZK%u|V|a#l6͏tN6E=u8<,(@Ŏ(cEqe0p<1F|R 'J)xoq瀸I, aO=#E@e9p̹@ۯ.<.%;vtrr s󌰨&.SLrM @+5Wq_OgdFs5Z ~M[?@"dsnN!xkQg9$7L` ض(ŽL-R5p%ox*y9 [-)K0g$V3εys 8alN\~e2S$'!&fjjv8,?[nt.8N|i3oK{ɱze˚!(Xx[yYl\ beo,ر~};jOb{<,U*V^GA%h  8;+ĮM߿:׃ UQGMBRb c棪jqsc;>v~#r+K< 4?fMb N!ڟVHq l gރ̬DU(8t+qiq?Sl爋8tvD6 z-X  q!8v^.}Z`pZQ)E9YO~9=o*yYytQ }ڌV2+n"8t$(t)AU9CSO> v0ٿ?o#/;Di7S/ݏQYK+XOE(V~4ձعǟ?.A]yI>pm<l ǑrT"06 l DA!F 4ٿĽ#m-'^{D{s ŪLgM2N8~iS i7@^]]>wka 0L>h~]oyAFoO+[s,(@p',y *g$Hdi{tO˽ ] Yv˟F!DP!;R+7~ ̘ۅfj -m,lv;RSs툊̄ڄQ%&mm~tVvV]bi@laq û )~NeM>VH~5rBc F1OY7f$;Ϸr4ࢫ_?"Hr.y8O(&N%л3֬mg|8x?T$xc^ͣЉ!:g9uٶu%}?;T sax)&{ճj)*RdDHPV^w^igQ ƫP] t$t=`c;@}ߞ}Oʟt/~x"t"aa!s$YYPR55b}s O9|= 8>(-DYR^~6CŠ "AG rpqSq=˟śnR΁? #qᬳhqx4<gbBAMͥ4Fn 8Mp8+p9S⋞p򮝝xtgWq:U+g>A֯7sko'8, Z=y؀knJ?i³!iPxkQ=?*t+g CN8?#CX^FL |8)h!0s㑒$.OOI;WtUq>!7Uu빽C67`W.$4Th2Kay3`r?t(?(`E`sߛi߽A 7.0u)SNŗ<V>9KY;AEư> w%?d}Xc=PSEq҉#q-o99 !{z\yU2gD?i 3= Ȳ 9(.*QT<ٌ,8NtZk: G`rlVsFV!'33cei#Aof,~͙'kk̊( eStR>fOAbJ{(W\oT4p^i@`ʼngL!zEzJt: jc/[Z\~!Ĥj1V%S Gɟ}#,gG+@tH)Ц&> To=۩\Kj(D eL8~Dn);￿EP G3un1<_9a86J4{XJT`;p! 僧 \+N乷)J3 ?BCS>ċ8 !|j)gu !10GyZ0*XG 7*+ZSn46\j}5(p8mEsN8\ri&niOޓzsQRljf5aLi' b= ]D1GK\{ys.wF4 2t"NLX"130pB.A 1@Ŷvl;.z3l2ky=ڴѢR ^CE4ʏr)\ueCÍ.s ԓ{ʽ(@?@`5O%hDڡ.@ n_pI`qCWBB}MzĜncbg3z&|RWYJ`Eb$&@Y ^ksGYW%ݎٳ'wSƍŸ9%L}> v423c0jx9M:1mt c?L WS^_*a,)aO"k83Sӑڽ-zAV89󀣎[u% ?/F+f |ERB炈xZ̞h-,W?1GRL toy9ߖZ*מ: g6t^ε_YWӁzGإJOQA3(bQՀu"]C ;Lvҧu@Y% 94|Yr,<ȞRœPGMVxg`6'ko ݨiĦ8@!#?goLȄ>ohu c{p` f?Zttf #ںK#Y^ ׁ{-OKI+QpY:;o4C-qp"LDH'WYclVC$$#zmb>#{⏨,=f~t 3Wx'E|o7` !2Wx {CC7m`Bu٦N0jdZ܄qnu F7,iu9 (voP*J,< `OPH#GTU7":ʈ:#Agn1糒>%q|L~Nw89CTl㌀l?~9ojAg' áV2lց/hFjS ( ^ 9{ڌZeGmIc2j*ŠYGkSU6rRV:~̥7؋w;D'V?WqMMaBֵˠ1ڜ.!*_/bm!yEw_h OO?=I"&_!*6EK%0J)<:7(aLx)ib Ϙ5ԋRS'գ׷"*:\t/[ZhtEv7aӆr*߰X7S; QLA\pR0)cM$&DhX2GU|=wKf'QCQ QP3fɻB3ߑ0|t)ʙ`+ΖQVϿ{iKDfxp .ar|X[|$dAMTƾѦt^%uc(jz]M儽7/aؤ3 XpQ]$<ث"$Gw& uB{`c—3aѣЍ/^`A*7Bj Q!%]hY<w!Tò SYр耰 -b'R2ÌԠx;wlOjjPWeeE;Q߰%;Q__TW@]]Jw;`2݅;;8\is֎EoֽWޤQ DX'd^:x2{_~̘*/76/!ĶW .1%*NgGmlp?_U_eS2q/}$0h4@؉ XWcJqF:h@0~ؾ=YYY0 ? (**„ {f@iSG " %T!ƍ׻ւ!>O4Ĕ1S܌{TaߢlZMW%='%aox)rzTu6COq'rP"a0Ԋo1qteT|Յ ]8P:'|v8l tҧ^%o_B4drn/[ԯBEjFC? w Poso w_䘞CYH,~\}R@VSa şP(#6Gl_v 4Am{+tBdf _s`zcS55eh1R@؛ vhhASS /?݁F+AFp~Ipe?cz?AXG,/p7hu8|K"מ/㱗$NTE(.)Z4wv~8 tU_ A"|׍ upN!T0A}(kmVAOehrWvq_Mu`K'1@@~~sߋ~79B&Pؼ!!|;k+[MmoZ?Ж5,-E0HCݔHY5_qt:dd#::"tg!5%QHOE\l3 I#?KKtdf#2vlS94 F~I\2&8 OOa'#Ë=e\s47d{ ?|Cql },j.cZ?R|Hz] Y- 4b\}b`"(qJ.Z|RB tYUp(?bP=c2~P4f}|,!"0_* 4<3lud[ C B 0 oK.:+B´#>z\ؽH-ncPHح{캏?jBm}v>2RпГP# py" pU*K }xh5jC}|,_^=@ӯ@ -ȐPZ!03=CWPQa÷_3WX5բm.FR45r0(}j$ZN9!J~.Dٝ*d@2C\ܱUAcS :mp**s`Gmmh15)e0Mhm݃^eedm(<y/@ҒA ?zKh/-\%߬ꃁ_[xn ɸn dwy]ha(+*᧕{Gx'<[h҂Ee!4RLhCKtW`)mt(X/.5笀/NFF XCFCٴww0enx5kjB16mpoaԯm h746> '*J, =#|I: y3brM¸qG"5t,dgO¤9 Ǩӑ=Z46mS "?|vu`ÀÎ;2 ͼP(Qz?/axwKNOkUϸ S퉅,K37ߨ<`n:)E(m_ Y T/I$hKny.%0^s 4/898XS[<)'8 ?[ b?9FMS|'صq/nor Lx¢apm09JGX@v(֯`ؾ=N!*W(Dv" k~TءKPAzS%`P#ž+/7 c :,b}hmq5#_}FƢL̝A耺8%,>Snk'XP*zݺ.߉,Ey,[t3IjXNռ8Io^aԄ3-:+vB=^<ɬB rDH+(grxsFxe0GOC\8=v;džCWEe̩oxBY\QFyYYKMbS=IBPlXWHOף|oWjt"9m]0*,:,.z#._F1&SBT1*[m>Y[o m)c0H0ž@gv ,HX;%x9E ;X,yu=#47ܥ MZ W#pY 謳EŊuv?h4*LZa|$):I(DhcA0qzF )$)aWCYB  K e$lNQG!@ԲBջ&ְEZcC_qcH=g/Z8]e|z=k~Z7©P[`RlYQB< D#/9aAѻ8d|UWqO'̝ QcRKcbexƌ9vcP@]3 !#s *ʍJʉk^} IDAT \5:ضI%ț(;УVQXbO?eỵu5ep9vǟ"a2(OMJ!;%waieJJ]D :{=IHMo܀i^ݻL05SDcW~pVhKKmHJf^i`{"Q<%LJ/R`0h}O܏ Q0xb$aj-AqI([J vXM*Dg'T A ~lbRP,#Wm#Οmr(0ptJC!)ةSȈ[5e'O?,C҇!ܕHIAFzZ8|)) 1 (AP\dŴCaP%)rNv^f bDC}d!]]M3@q'DҬ%7p+66uHQlL-zyrj@\pOCk[e578)> g^8<)r}: v%n}-z7.32 0w\^b\޼ $I?#0Xn|&![(܀wϤ˜"P~L4q,-p+z~'Ԑ>c-rӇ=}&uHH8t(3#_,!Q+ETm攰yq?'-"(̶g9 F/#$]fWޑĽ+,)JDtOk({*Ss)Ezo1Jió~~9s&a޼1lLc's <1jw" 7daoؽ1}!$Z\xaܶԫk(ȧ=mBE) $a-)K,ۭhl,}v8vcdH6tZʿp;`@Q)͆(pLQ0@cWNw`RQb wiD'd\{ {(#.:yap9C :vM[zNO_a).?p:U ///| 'Ih9i}LL? !Gä MT<a۲?(&<[Uu<6Tc.RB,Xek 5x^?pǻ=i[Mub&?++mnx5H_1lVÿIpeu{Au+`yx^/ e 0K02hKޥr+ nBCeKĉN:닀$U\sHx~gcn6b q?KN'Żo713";8&$ۿU!X CY|{O)&Y9/3ľ6m4\EE1uBܳdip-ރϯyH_},=?a0LPQvAxu;Pht5U*9Es*N >`V ʿcT

    .se@Sz*׈W24"\("4\St|_GyQVsC_oӝjGz8ڏ T ܘQLELL:kag= F!;~;_~hM/<)RT8xn\Ɵ jL;8p%nO(+L} 1~=l nc44EGW1XJ1phSFz/ƉjĶT:lp ڥY gfP[G YL0`w0b˯HƱ.S-$0%ō_ %qod@rMO5=^V巊ŋND1ѸC8%OPW/ @a)64en-N=e_`اE_c.O %˽b%HJƒny= Sog,ƞM=>lwa@gpG W`VYq)SռNlvv^"#3ESI@a8tTqZW)ٺu2ؽ{; auf{L&+ZL(,ԣiv} SUB = h,2(GZMp9`/c bkoP4TiS#7-&@韰21_֭v X:bڅW^jr{^jw:)HMotFcl^Wcx1jT(ǜB lQ!Ӎ>?D7[x$WWa@VxI)T"$ '['J?P-2lj@RƹewB2 Ev+^"z^QwlO(Yu()ySQ鰘5xI't?ɼ/U%B1"W|~}Y)xi_|ނ /L[oաΡ(Uboz^|jVExO~[:4'LEJ3ÇAvh;y ':mfWvW V}--dd5O3PK*qGϗڤ() paN8 ;'8ir3fٿDF`ժ0k||&EhТE3O¸)aVr$? *Y?K{c#YT凹JKF46:|w9w\aX؜bӠ\ GD[7c+{fx>0JtI )$LI+aPI1.} ׽E@Pr9{P-F ZmNyL~^Ӆ/}i ٻ 𨎵nܕ.@_wRh{kBi)B$8 7#{6"<3gf|~#9\BdrK_d+-ڀK r aawޣ``1nnu@w"8ycqqFƠw&_ ^DYh_Z'nciAH}j1$7?`)QPȠ~B6oIIQ\JSI˃D9 qUgDz:twjHBfYuz{'ؼt7\}Yil3D/t: {L X8I6#2q%fbŊ208v(~JsaI; +eV}2mO?u:|`Pj,ceعӑUC@.W *5#JVmD#k~:T D5{jo!?sJ P@h(OOaM@u =1,c# $`I>k+U1lt{vBQQ4֑#beW>rsY]VxxI~gΤw3[ &$io *; ӭ~!:qF鐦;x8zq_(+lؼZ D8Z?("`MA$~֔SL&+C\-A+ X  .Aop3a \o~ $f$ÇuPE+O5hN%`oTJC|;Hڴrr;Oʮ!5܈c9P&PXScƌѸQؼ>|-nÚvY[z'!Ug\P/?BQfgVzyo ^}u|gL.l~AR<h,鄓* -99/,,A~A: stOĩ p?|-0?uV$K$,g14!'IFk7>/{VôJe*++E!f zqpwƮ]gܳ`1ۤGcT8sv'dʱe:K(Av-?ִs$ ͣcNBC÷o<=x/qӈde'grXuvC=ѵb7Ԏ77蘧R+&m]ѥ C 2`42hˋxM@D܇O/ĄA >Z"M(hDi4R]M1_5]S0b&O7]dfMWs|b3+a|)0w<28W_]L>&=ض-NZnzӦl/Tn"}ܸ;7NNƢo6_v |2e?^r)zjxvy8i/LAiI9>w yg67s:&'JHD孂M\Grdd{h C| cݟX_JYJFe44luW3U?"ңIzZ]4=ZJu LAj | 2YYx05FFiQYQR2=\8\eKM_\:Dg'bhd 5 '_:ƸliT1uzt/jÆu@NS!?ae:;[ [)YdS( @5U_2~-g :!8DrӫqՓ2vV2i:DZt#zJT8GGСC8֮y3fzEp/`ů/ śQTdıXÇwefΚbs5sBtg= cѢ0~\oWhQ=px{W-EHȿL,?Ƅʗ8vCIIE'' !|U sgcq.a nvk|UU׬?@:`/qz 40,pxqnؠ[D2 =vu@(2*|4 $$#~CJGKgY1N!5'DYtuEM17q9sj3g$;c4GYe17:]B%f#*Z'#1Crж-<PkEl,FI )^@ha'LxhUg0@5Wru*W`B5vicOg&GeH+`/竗)U }_ER?ܱr(+;VzeO4Cm*oyH4>~QQ9c4OȨO0,8!]R< 9}-#oM, C9|꩛n>=SP ֍DNgKarܬEcmq2ҡ cLi 9ϙ+Y!{O/UBic?@΁RU ]^jjB?3}EP/5] 8+nÆdHziV={aM8yoCؼ9))9캟ꈌV*qk?Gnm#v}sb}cut {fzj .`[hdpn @#Zd`rPyjq,՟㐗gŧd"3j8OiG%OiS-=͆s[zonh俐R\pUbp5:vƲ!;4S߰{^W^o/P\\(z3;ÿko,$e\iuCt((41Q7@y9ǗfeF;6CG> JO!`,:!SIF'Y<4u+lԯSSϛp@J"a}-=bctƂJIѺJʕB͹ >>n%x ,SH)<\Ys ;8R-V}Gѻ$F8,uI#4.{~č^'VAc5G 8ZFQWAAZD)Ԡj!ԓjOMӔ0akgd ՗@6l>Q ,)ELWO0H֦[^$/ĶAl3QLij}\1pBWQ!~)Z]Lx5aVW_f _>qHi J% 8UHjڢC(u#5B|_ M` MlώSa([ͥ~;wqτ ~1H(928 ;cڴ3ǘ૯Ta ˗'g&۽{V,OiGa񧂡Q ǶJڴ ǃu_s(ЫRSL9$fO P {AxaNگ.z xѬko@ֈ̞i6+6s%/,X#NtrQn`,=4]J22K%%N#cX<̘> vGΑ [=!~10ƍ7T; i}6sԔ\u!3+ŀ߿|,d סsYCY!'qG/ ah-WY.%Wb޿Sg& IDATZ&fxѯo;i{ Xæ?G+# ^P9>U7h嚨BBZWxf:XĄrWxz*Ah0p)VTV:n0}F\pȑOz`um5io۷Y+&XZ9u9ǃ猪DQV $_ ^n\*s Rv6$}V:)6֌ÚkJ`/-džD G fCo /M/V:!Vu AW@hqMN>u'~΁ŰNYlz%ŵߎG1 uJǮ]"1@^14:[HkIx;07o)py"v f¤I}FLX I8E7aVN~ w@&5:I+'_**l5*4t!SMϼdh Z?Aim4&YB?vo<z,V!" uۤSwBAC0dT#˩b/4-'= ZWΝ%yo…_Ⅎ}̾ /0~NFg`DF Dy@h@rC&5G{|lhBn RkHU@#g&9wE(]I)Dz,ÒrдVF` )u/;^8@.P|3+gMyfh^$3 Ju?y2v tC߾oaKQ8F_z 361!'0,?XFwxxN??8-sGzMjgfZ<&lϋ~>}a1,˭m h5/$o^k(IMOuDq?,[u]d?֌ E%_}ѯR?8Zzذnxkn\UŅs1mpڽ,kOo#9$}ֹs <7пkXq mۇc@|E&CD^&hPDJ4%^}r5In%C& K 5l3x*L&'hDd)X ofo>T:#hDJjKС]oY\8_H- 8}Jrݻen *$~xx晉 o7`˖X`JI1?x pP) Yj<|+:wΗ pKmcܢ_Y)POpdXKfѠP@EGVѤ'^B_G$ YL__5/jZ9HO>r`R{w{>iqa3]:}ΝKAo(}ʨmc Q*XiG_.U21rOM u+1l'Ld ڤb?[_^u6 K~ΖBa|!={JzY{||o1fD]I= m'-.,vxUj_)PܑX/KD!2'_ȉK5Y'mc! !14G-3sؾ-￿>G:AR^)}J<_kǡcghgZ bh#B .Dt %wXO9;Y*m TVj؛|[Nb& ]̛9? ~ |:cGOB^额; ^ؾ9f#O9ػXlp%$5%_^[RNVHg6?Lhۻ]"z F@PdZElzh;D8~z!׿&hh'N$҄#1`@G3"jeU>ZG?*ee +g Юmڵ e}?Alt:1ob.z("7]FSJj/sY:/pkEH~09UKr_2]{Śbz[˧#j=BС=-eF{BNm`\HrP]:4CLq󅭘A (ԩd8GXuwt9Oy,fURZ6%b\q缾 e>s @o ѧN a|?= eRgDZP\[WSjZw7B!aS"x2c < lVT*GoPbb텡Kݶ0$3n-U!Adaʚ*mEtVLƛ#igkM&3Se̟*Rh{H_9̤kBeC9!p覡&@ح|"ھE̞ ?a'N3pט372,UP-Z>77꼵9٬ AU'Q`x/5NUJ4L'ub'$D!ҩj/3=u jo|$@ LBXזlvZ15kړ4tNtΎt #LF# 4U "J< 6aؽC}08e5悢B}n (.f~PP 3").pD_qs@BCՈѡCԭ{;0[f{Rm,^ihnhRL ׏Cү9uRIΟ*9+u6&J)G%e4^d)αcǾ-["=Xj.Ymk%B;wDiic"Kl^/! ]Ng06.ϭ(E0²9mwj,oݷ|=nbиjC8J9_D_ 99>#ƶN1[/DHp;;99&|EYߪD^mEl(-PE?rײquTʈi).-ݯun`OE)æ搞.GΡMPMȯr-AN(--Z 0&sϻ(5!ZmJ 6Ur=4vl?!5к}@Ro!t Dhf" *KuȾ+  *jg ̞V_Ax֬pט1c4xhrU@DOyQmS0|':q"*7JJrgV̎?77ߍ@t4 Qa'.(݂#:;)kLKSĸ,[o|@Q_cnw;. prnL+&|>I&a8ΝKunC;uR7c @9R`8S1l述Y)GJr; lLA fGij2##hV|Zacߟ+~QRjc4߿]{=(air*Wo=Ɋ:5JGm^{cSux3eDGF׮0 NJ_'HKœO~ͮk?38sfvY#8J3mE:3 W`@w$&VyHզ8aMK&vA#NYkuZb| ]xF JNE4P^{V 7fLOq1\zw|S`rU*3Vׄ-o6D8[0{G [ZiU,VdUȶMמ( #DfVQQb&lҝ9ɾUNݡ=n E99V,)OjCp!<= 'vČ&ͱغ5˰X\ >g|oX,xP^ni0D<'-C` ss|mxP;}&NX5kO^P%zUkN _̉&5@LKF2aWi4.d̙Aj儨e%znr?l0m΋' 1Z47Hpdox"Q / Jߐ,݆J__rM|q6o`ԛ?+T+_ATd.\DidnbX ϚZ9M4G^Lv-|P1" | SRnsSa}]Z/XDPڛ x9{j~UTv >D(4h 4=INPqL `9N}ҥUsٯ;p2P_蘐:[68ޑ[Tdҥ0yۈi˗Ӡ*mRXA:7cǎ~rmǚܗ0hth! 툶"zX&lV}{˱p ŊoG஻:,X-pSП` ¯Kt#N&\C֔AP}}\u)`Ʒ\5/m\+5"QKe%BY}NAL`َq5 ŀzl{&#%vA~& 4 nhP(8Pg 366oE+ 4#a\4K:Y$0hwfRFNYut1o_wJhq kT|J m_쟫>pݎүt4?ҳ4i{v; ` Jqa^[űķ;o#1kHE=G5s]:'6Oorr7w:vK݌)_ɲ5K­'%Z&)9, wefPӿ*~MpQ QA!xDK2ў=۠m0rR(tAZZtb.7XW4>S^.P5Y0_k1i7t"fX?:i$|oBVfgTԪ"j>r.5r}bktւTTv?ԬF~&׵zR?|l-UIg9Yݧ5s@3 c&L;1X̀ΜĬNs2 xaHIB]@DFYiARRLU2$X3`/k_> sN }wR55.B@˕qhK)9;ZRRR#"PUtAff>8G1n\o,^S@P\l'o`0R&4o. Hs i9;GxW ~X3Wbׄ*8Gxjkh]c(S u >*~\y͎ ^I{0t9A[l@z| "d(&Zg(?TYEICe̴Tk>J̹?.B1>ZX5fyDHS~Alt$2\R)(Çwð<<8C!m{bdWӏ30s`q{ Sp>!PKO3T@yvpyOR[2L[!(CiJT5H0wOSZnzR.M۶fY|i ο:+x-dUt2=3, IDATc4$9Fuo.G׵i,4(E {qDbԺucYB ~Fze8t8<3H{l*ŴexU  ;]!΢a#D[?mO|7 i1[4|ed(*~3> sK?(UPb1jTbccv|Tiv1FZW~=0;Uy] @iB]-zj_Ÿ_:'N̸ @:,x+V+VÏ~ǂa(}pq54aDvvZa,L stǙs[\LNBNY)we|S`!0#U g#4?q*X?_T cx5em5@!Ƈ7.qC!Rji #1c̚@@BХsv.|qAtz 跣M5숿>kBCH;`+^"fc%ݤey7^G9 oO6Mho? 'E(}l*S&AD8uK1EdfYv|DP>rH`2vT矙R6C}Q$B\d!Q&Ц.&Wb_-1j&L EHM+}٣>S4#g1 wM4Z5ȻYł DFcoQQQ |CBqF>&h۶/NVo1Zݰpv .#~X2ӻamNVnDa3 QBVG~Nw RERpOKF-V"Z* &#| Q~˯;P\lc[ z RSs ;EᅬjZna."-=IԘ2mZ*2!Uш/=<^x ]XpŮ4X}),; vk'Gf{P^^%?2>s [`[fB^^!PZZsLk\:,0O&K3yNfBDdW@c!G/]>щ / R4dJChMMڿt:rk?wYR=OK%mBe8yIi_LDZq..DRamgq.̝/B6LRa>vP`>xkתX8;ޢ=[|S^{{ PTٿp›j!I_P}Ŋ<}>f#>'??bϬMҥl  CǬ%iKk7o Zyլ}PR*o_\?E-#X*=ODvCݺ EHHgD%?]tvٸArmM;[nM7ZYߕVwov{a6T7PBקD4J-C]4f#8yˆ"+ X ~ҵ-zPY`B@TT>=rrNa|%&KeJeCnس rnFtg磝sӃXkײۥiAsrD=BZJt~jMdUv<b23 |v =\8Nɓfᥗ#sqV^?V,;@ 'mZ[8mQd_j7cX+h'4P: ~*D`| KĊKt8P鰧CAY1}f~9f3_8[Z_}4+d?qL(ɹ'4p8L(Z@Ee JKsQZ¢dو;_'8T:v!Z[A:~fm1]~\ ;j]i)յP[Zi]&(f%J&L| 'O^eapbXzJRB' |V4@Wy`N !,Vx(2| ǣZ1f|oTz\T*fJyMtm2`'uY --Z58(h݆as $vqmXUAhubQ8t8[=Cd#2SF ww=b1 +;0 wyILȷ+Y! NBW~kX^owEO&/S^l  S@TP)zq< xgi -g,- TkzBtPRr5z䊮;\-S(#1`޼[='29яm3!_~&/0)q<< ߑJYSIАN,xP\ޅag@x*8v`'3̅:?sNB3)x`6s0ODK.3ÂS8v̈I2eW_ϱ 5 )q0|:{}!$,^ƏÚ&Lf vmZ F+"!́5\uٹuP &`><--@veyL-H+-A΍kօN9  Z۟8ֶvgZfϦhB%/{ ªm3thAW4S-@Q QǢw;[ 3o}R`y1wo4lbnZWToLl@xX^-^M7; GYMLjqO\ ד'fFmӌa5jX'L3M8TL3|@ DFk3 T z/V_s3xAy\;Knwi̙ 65E s3=#gZS}?߶<5 5~꿨0;OvFX\][2NQvPٕuY6 s=5lJ?v4G (`9]O^1x슋SRƏ?܏:Դ|xx*`P{ á2"%fLۿYUq̜9O ذ~>NN[}(ugעm[7t/.aE wL{942J@+ٕ @A62aAuw,Hnx)옿`y^q,{tsu!u2 MHXT3RM̝Wkj[ww_ ={0!Bm"lxNuo?s7oL&s~|xzxaE\6rsOj+@6e,G 5:şԄp=RM%^Pxyڵ8?4ȗVp"eG 4WQՍJjV&$&0YdVѾݺ&S7!DEa~ZjKհ,(!;K&/Y^ =(54 JX8Px|qQ w ȴXmw qdZO_pHfp2e6Ί*ZǝXɶ ;ۂי:a~yGDz#*2"AM^tViQ-!k*VF_IRrbΓUgDh%] Ga۵?7b"gutO@Q\ bD ch}(e4u(AGC!Q WS+B9?`iPQxl)<*  g߄~> Ӱsg7ӥ>`?@3pߜj헧FAnBq?/* *t3(8p(VN /ӟ%ja$_nl`ZWc_pً)ȼak'U817D""bUӨөaFaİسgk+qFv/N9?֜&,'q7PZFܰHYP?eHK#0(8yjS*VyO?27F>:HH*]g)y%Jî2n=3ALAѮ`a@Qq,f+DQtqAt;^[Ea{gkq(hG )xQTdVVZX!(:jTNQ :S'/bZ=7|߷ߋ.:7Jv͛Gǜ\q40W\svc 3" DB!đBv<Œ}pE+ R켅JD# E}Z7떮|ɱ./}N!Y;b `@ t@dlHIɂX):ftOv{0×ѡᡝBxEE @Xⓥ첀Syd^0LѢ_,iE.WZA2_ ͳ {a˖8lӧruCnЩ#}!k2B{>} Gf2y=JJ4UO [e/A} 5: K| "Y9٢ȳGxfWG2 ^XkXv7ʠ(Ý_)"?jϓBM$Zy"ptTBVR^j.JE3'Ja_E4nFkS Pfe&pRSrըX-݆mGÀ ?lAE>z1D *CFnGc`=ġ~tOUa/.e)&<1GaS3FӠ?N <`0ƍk#V| kRZCзO  !:cʎY<Z 11}E0]gWznsH/zf ڴ p``;/$m{wΜMC Z'k,@RR:+@ip D矯o,~ i:u}Dw]'ժ AcEXkD M j 3AIc Iw{gKB8*v$8P(-{Fm O7,7-[oC2yzrY&l;!CYǛ/ϞZ6D(Rs9",0>! >JkЭkWҲfzP\ݟB#5bWqx5߈b;P fi3#Z1L/s~ya0!(HS/3 ' 99X<mbmjA:bL %Jrj . 3sSKˁbZkCHBUЈByPZp6*Æ{bΜ IDATuط4I>cc!|}Y<5k8~y'V:ѣ7aΜ;IJ9QEM?'wu%NUw`a9ikbiIR`M2g:ࣨ7ےMrB""RJQXPP4> t:!33[M#$ٝr=;߱m_mL"x̅Rܿ o;/u `g5:2 -XX@H/`K8l-@rhRV&[a?u2ΞP_<U޽3)Ҍӧ5ֿYhϯݩyG^Z7$U >Aɾam+QiCf!?l7jg@S$ϣ}jU!([3;)2h%[d^-[bS()6PJ#0m!4!UVV-8BC K?xy7zr&* 7R igwK$#mʪ?'ʕb}w̞5 ]&:1P6ƯFI Ø;XI;F<;M!K? m#yðQTCE߭Ui9hs+();l# ͓DTU NIRD&Q Ef6J8͢d2 ,~!.{)d0;kEeRU0#&274܈GX$وY1F./VUS^{`/q=2qge~f:P(dh,&5 >!uR?!*I4pTf-5͢ňi]D2 a6Q"ҽ\=.JcG|2)U$L \ Y$\gc(ABБyf%ߗkiOp KJ}p9g#@_1o~i50vC5pn:^#ʵ.aيg0_fj~ё̙Xl=8]ɪd-.g[G@EƦŒe%Qi;K/Fy+dя#p|TJ+ O?=m:Br _0icԓc B[a2MWLvhr%,^= ]h O8JD%}ti4 ]q|+y.ȕr /rZߦ;v^\$GHC&S7 j|z{mps!LrEsq\x T8("^7 IN fkR CCBH(T̀@XEӕSֿ07a9{PTЗ#"rTUpX^?766 .h"y1"bZ^wi TGn48b$ aT60f 1ewś_yoŃúo=F5-_mSOJK 30ftocpj3׃DwoYt4L$TK]oQ#BٷFX(y;U~Cc6d[{5HҙW#>/x=8b A#!:SΫtFNv qG-غǏ߷r=zMG)]E{̑U!͠EsXl)5M. UL0 .*QŨ!l[ JMm5yPӜPj^2jx=5~ض='V =TѣG <M4Xe x\CcƄ`'U e?B_-x&'Dcp3)ɷ#T!oP !C^ *'D Xd4NZbE3#^(2̞= c>Pr*W#+0h`jSoF@832 u.~AqL+x *Js{7'PûƇ``qU(GEE>22`LsǎyQS*`#(/qGhNuW?(Y5}IDĪ ːQQG ?ǴigwcQN}1B^$7ڷ+TTـSNo"yxUW93.N"]c@9U+@HרGRδ Q$a͚mø(k0>ȃ)Ή`.Yl'zafiNٺрS8;8Ie2Ug!KvU0B%TE&Ia`ʟ7 D\;]-@ĊB䡈URt^kEh#.^vuNkɃC'5kkVGHH|yLUdKص 1{N vv0a#5FFV[G3slv+Ů][Oƈ]kr~5+&LO $5y,0>Z3<~܃b;>kh):WO8ݿMz ~}lī~ǭ휍|獊'¢/bä8JU̚qtv)Ԛ(,SaX|U/@I( TASιkPYyh+N/M/²"p}yS$21^`  2sXcAW5F%ߕ>ffdy]uYUNffKJExca2б? _ø tz#λ] s7GDxU4Z?p=:#?[J+!CpP.IB/\ôiqyxyw½:^ͧ;NLM_,D%\k-ƜS8q~`%dhؿ?ϵh`x%.H,$vl? Qp߽M%Y"{;ɓj_fŸ*\9A}rnGKu1dbM,!|,S{gE*(MZպ71-zJ5ǡȂOJF.πt>ήq-%"V!V=]uUe8kBF])~F$R:spY(ME5 ۓy[&a"]/3|YeԄ+"bN9lH!{Z& *Nϲ?'C)w3ED+@o0fBRPJDR(r'kc*ky/6k[.֮FuȆ/1Q:tA>((,7$zŰ{x` ckТy@5H޽g0u;ȺR䰯)ݲX BXVhMEQ8n#Kv3ݟ/ͷu 呙!p#/πTWWIDLt"v ޽ ZsJmn`)m<ȕpM ;l ̽*;87<>WMFJR ? S %fkn.3i3_YX*x>3?zƨ@YW>"S8Z@\X(G{0rdN`d”J%Ê/Bk|vF#gf ;~i  UK8PtfW|rnZ%!ΝBiFA7Բ.xvSE\We ?zc8gĴrż0ㅯO٬P1c;9D)Ly[\(S= 27oRb-AP[;qp )_F&rrmaDPBzn 7[ UJ3In5S&m lf啤 8~ZJ^k //3FC3S syVANA,]ҕƈ? wp..&Ե59~xdf0L#XFmێC_^Cql6V| o /H f; r4c߾3H(֬J7/ύ\)k4O@cE&*%$ %yNA&ڻ-E،a"!G.gH(8xx˅ ƌ~aaS(-t*`4ʉoj(dog]᪖&m=,Drx*8M8țZ'F0IR DFl ]%QK" ${cRS.D ={ Fw# Mo s7#d"#I@xl/GRR%`<S Sv'2#mRJEftHnE-_[ņC?~ qX<RNAJXB BQ}%\ ȅy&`ׄJDWg0B387Nc]Ikr ~.9UJmTVh \32^Rǻg6F8a]ƢhaE/Y#9c0 M,3Wbu󉕯ѱPCF^"i0 AG!?߀VHj_=HʟE!:񫯭…8|飥N"8{,s]9Y@`$QXNxl= KXk uiAϮUؽ:{57ƍ6((́G4K W[6sa9{xn$3i\=/C2ۖkz-Du`Fv8%N'3xKKEߜ!)}-BN~Ҥ^dfSxUZrNѺ-W>9DGd-ad2dpLO^p/?A8q #F'uB_amSSxbÙشuxz^vB:0yL{˓}ۛad`lzKP3{VWw߽?7 )wvieʟuܼ y ƫEZx!ZUU#~O_aAV4dЈHWCyUIۍQS邲b(]L8;~U(s3=\ E2>Mv11+xc+cf 3uXȩ0}z JJ3q\D4Sʺ S# DRոge$B>(:A__sHF.'d\]3)ӆ=*ّ۷OOY8(=ȋ8<7G*@ytzauڡ=QX4eN7(leۀ Bfa*zqDm3 ȳ6iY}Q~P*6CİS)٣G?³M?REc=0h=ر[Q# z l99%CA fB9*ʘLMڽFvh'b48!M"<":6bE /u5di>kn(Piahn/6 z0'*) XXPPP!>ejBÕ(+5ᓏ^9f ŭF#44 YPZk4˺AcKZɕknj3_^*1E2zD7ˮf WپE"= 1l[G[]6m\ʬBNwI)/a2 G RYXf7uՈ/%3`^{+ Gƕ ;7$!! KN@ìWSCqe2W`W]lٲ_,[Pw$v.#G.wdl&m|ҬPCXxx璡~?f>2R42Ʃ^h(+˭s'΂j"""v(*PyۜZpp0_pc~8m ܹL댓Gv|rX`=ze@oIь%%$9#-mrrNbϞP^?H>[@+vKhKQ]@[ko-{pgWظT; IDAT x֮}d*|ɯi?̸=<8 {Ol?urY(3?8ڨ~_+ë;vbkp@$ch9Ux{r?{i>~?ӹtw ;Wb떊Z=>GIaCȼEѿ}P}1 ;ni\# jۇ eNI,*WE0vO]:&,}'*N^D2v*|#)9v.]Q;^i qErrb+R Vg$ŸVI*Ŏ_PS遅 o&Y Mw^X X`nܹlx{oaW6~Fܿ ]LJ`07Q'6sjHq@.|7ޘ& !"WVa0|vG9ᗖ HB|8E"zb\ V)Cu\8(U&xп=͈Ŕ`d=~N*Nx s2wUaW Ia\3ghZ&,أкu_CB|{mXNP<12Jʨݠ( V84o6~,-,Ї&gB|Yޘ9a3:&GVV1ͧmw$$=7*cM?X| C"E__0mQwt5Z ۻ#](>f wwuj)3nEt'. `>²2cG=oJWńgL\T%{~CȰ7lL m`=%T&RnբsY.4`%[/JL.8[#оJM 4Rٳ{"7?.BaQ6{#&>g)/P4p=2_@l>4/VM6ȣخEnHkOXه٢} z>f=C{haUK97Ky]§]\<3{bMüj7L: vx1!6``C`XU/Ld&x).^و羋i2``o V  x+8x1* #nBBޯk1[V*E6n<  !a}/_tC+cyh4*dѻ9DE9=R <} # cIlƝcXvM3i]Jo C0gq9Jq؟Z>Oe2oas_qA7e#/o#kXV8ө, +i4eس+`/^ctR:ʼn$4>eEP 4;yZN92 2^+7<+c >>Wm mktZ=x}{P8Lo,|rIf\̟%[}:vl_,|hrؐ0v< ػKN58|6o>͛ Htz7 ̨cѣ<{Rr<7Ҍڎ4J."eǎ72"|PR+ &jaNP!ɓWॕVࡇa1TWXXA =Zme>gy{tGd4JʐS!pؖҼod~,Rc,ML%` .WVCɬE*6N pXm**)˼@&l*WpEk9ᥗV# ۳#64]joWDt)g8 K{ Pluhbaxth|I [sy>4yjo l$LС[p m;+Ɉ[>ZOŇ ԩP*cn;jF O]qs8B?XDi*OAa*wkGz|1T>>e~wvƠ}J f;;%o. ˿؈ٳG]C,]6".'F"U %6*a X>{ꩱxgp5|_~j/~ົr;b6 Naر,.dhk嶝]`\G~^Hjwrp.h(Ah2]:i[?WW;K}}.AVs䘱hZ~,?kuI LI! nuVQQCs* l7G,E:I[=U)Χ7+\ [ ط wH2m[5r!˼ wŋJj3ѧ? ~9u=XtU)n))1|ƌ}}grQbsIW_w4SSS80Z<<<f6Yco1?6Zj%ǟvO?un(eou _ee!r.#98p^* m$^cʔ \ÂYt|mEx{kU1ɉ{JvNG>ȰR<[0WQ";sH 'mÜ^FMO?jx XSi'w;!(ttjuSOEEka]T)Ftld朳P'w`Grk .Gof@7EW갨sd!KɇR ?)vpx ṁC-k3/b;Щs>N ΁>_`=+m^DoJVF2<=ݰiԞ> *?Gӱy1N+FFnÝ_,/@u{`d(O.GCΈRx[Yd}tQmTY"#ƿJWOh՝#Up7GBm0iJ ~^_J޿ œOO?];kDll+hyPJЦMiXzpvyU0s:/\]`}^4?@VCGGP@ KP<2 S0{^8~zn0F!p0$|ZVmΣ(yY!!!}H#WTܭEg ;!;c]g]SDΨkB||u0+{owX[^Z$z@vV1T*φpl*_p3bǎ8?NiP\lm#hf>>j<2+*fU:1vUv>}Q?ku-˯{D*$Q --TګG[ Ny_؄'1ؼdQa՚1dH'+-b>fx&|-˘߭_ ۯ`oBCSX@A #'g%< :h}4f@R[7pRG?TUja+Z+j3AV#ЩSQ^^ ҵ ݯP_FVOyI`z,#!((4WPk<< _С}7;M^6mC}QqNp2-|x[ZXs)e?oG. 3L Kwh>sex?u)\FjUg t?w=:ZOH_qQg iٓ'j~JRc#rXN'Hiv'.9Ln{{C^S|ճ1{ɞ=1bD*B9? Ey6"<} -Ce9|ZtX١xkQhDٶi6O?#PPx /*.Ce%xuBqZ/`j>7ۻ S¥b³7 \J?| efZ O_!`+$_M)]vRX>!+Obz=o}qY}h2ʋn~KezvE8}N|.['8@?[yϏ7U~"}c8!(K{k*4XP  oAIIsС38q2u0I0'!#xW#+ZvE\J9yZT=+QUeG{ʑwN9ajW˗ ciݮisZh46E,i@: ^HJC|+)\EX83b@%-HJ ((={ 'eoҰ<+6ѱyzN=_,_SB:#"L4Ltlݡ=ytѥ}[L%Ƌ/F~ɔr1-0LdLzшضBkY 뒓]IނΎHٺ1Js[(d75r AR.P`%kr={$lEݺKر/_l?,h|]t^_5^*pfla|0||;{%7USC>m;y+",<.\#P/4S):ʬyOaa3HK™3Z =k+)[?+d9t7 3_u W _  Zn|qb9ETEe yCb:3^|kE];Sϵ1_[s &!Cdmsx #2 -h- kޜ zC)#L hu0jd'TJkvOZ=L}YWl=q]no}x`”qr p,eȢ"EX-hO$:wJ^oA&vXcd?/̛\X㫵E~, ݺ%{kҍ^}ɣ"uf!ҁ:kj"~;mێ#**W>-(&^A8bQ':FGL/:OEOc߾ -*2:4ԁOܦM)Sr Wb*O3|k#Vǃ`wslogTv uJ"7̳ծ]AH 8D*AVF#aDۧ_ѕ)BQTŅ_Nn V؄_nTH\:(KD^Ŏ'DnÆ!8׎*^M1,ǿPe`G fiSҪjl1S<={̙j?CQVhaЦM$mc4'dηLtz{f (vݨ*3쀇GCpHCV]#B.n3:RRTŔxl)e+QKDrr#!1oʼn#0PO!(XFK&[>H9rr3!GYeTWUZ4*CIi |YΈƍi3˼j?A ۬CxpPFH!K"-ob Z懒*j]vLZtY;y_~~ hlIzؽ._$/muC?/@*KxU4wwmgwSwKq:]k_76bߑY8[y>ZͣgJpf#NoJWCD3{YYEy[w^L]U@l^#[8ej}[0a=">rO2`;H} ӦC'<[5>1xcJ9.Ip~6WT,QR`9UJ@tØ2i)^_6UX8ѕ<Z|=f쁎,lӻw24q|ddЯގ?8BȰP(uh/s~WAMS{\6Ն(EQqϖgveY1X"'F+GF۫X{\Ngu?nkB5U.گuh2DѦl˃{/=L IDATnnlj'ЪU+^^oFrۮسW={Kn@STАD($S)ձc$TnT9t ;a?s⑔.(%; PوD"5-oah#E+>f [|J#bҤy}z'\ `0`4ߖڡ=(*FGFe^oGfQkܥ.[{>;aʔqEӳVS'GYY ~s6&O,hOl!F-23pn"!Oಯ' p`tEhk^48PdRv b}:ttP[9 rܮgG1MJ,]n 1 ^Z8Uɍo ҁ8ķg<SSkFtEZVdBlpWr7P8Z?59΃ Ĵ\.ZϫLMOB۞3x0j?,ey7-c@Aht,Pѻߜl]uC cRV7IhA^(.:ѣp` urE!Z3^xϡwi 7vbʝ<*#UafYiZEQ{_\׫PF}`ȗ۹wQ罰(Ye2e/)=8}v*-d(O_T(0J!(>^Ą"0/8Gpb >xW }yYK~A~8W'Wh%ibӛг'>= Cvp7_;;ND a6(Fttk&$&v!CJJF$%L5jaY@\Y(`򔷠шCl,, lDX Qߠ@ X 0Nv7Zp70Nk+-Ѣ"AĶjP)oy)HYykZ2YB!Ěއ~ڎ >%T}k+uBmY__RƢ?+7>2ZdRRgf"cȫ-\ [h (&s:1f/}ўR?[ΝSaCDۤAv썶:{OYYM[{1i ^*D|3:J|kA%;އS+8i3yQz='*߳xdY\j6<2VL;L2nKJ߉:'wKl0E U`í\^@ʟ7nr?'©\ELč9y&2%cj-V]oo\7!8У~\GI`S[!>;rru9F ѷOAخj1ҼuvI@VV!v<3gPzC= @ (ACG~Y˄W̜/o*+M)j <, mPQa"?"<%@EeB#a2݄NEh˞r0m;8zݐdPrPx)"'wp3 ri)GQBY8l4@P^KOcP믊H3GdRMY_ii5hu &9ϿJVOsd-{f&EP+i!Ue ̙nW@k׏5 ŝJ zl1صKV~q$w0;M&`TJ5C2Nh9s/A7D]}B0~",%+1kNR%"66Պ}罘6u1nڙ~RSL!~.[߰PVё].Qvh{'B`muxYݽbakPU 55t "}΁TlIP'/W|oۄ"a$3q +,Zr_*̳Y#Tl6;Tܤ¹ڐ'O^Cݕ7=1YNӍrC"$؏P/SדQ(dW?thΜR+ ߆YŘY3aEXԞP&tDxz7Lg|vnFae<$^M)sɛW j4Fgz{ 9ۅsΟEAkVт6m-\XfQ kYg^w›ouCff%|=U:,ȸ}Avn :rrJ0dp' 2P:"⧟8 ;gi9c $Hvm k׹ U?}½'RWͲ GU!!+kW?I\k,noh2e &(BȔwp9yݺ]"ݯX"k;j{ C|| O [l )<23ۨa0XvUvYe=k;A$}+CIi b!0DsR6Ξ߁֩byt9/( *pñ0JKlH )8a(SҾCzRlzPK-7p.nVR\RBmdVvXn$>Z/Ϟg = o..Xaƅ|(Fz -O>1SA,=f/g=wO~q^O?.@~acb ?%(ochu G\0/k4î-Bkߌ ~Th@![N#L@f2ЦQp? CS#!nT|GI%f)Ǝ鍹s?Vúu(L=QIxPɡT)gSf 6 Bt fEF|q>K?0 i0Tܹ …S(+;CQZ]Q(iYAtOBtr!YMVV?) 3\8"IJy梬_NtnD 2 dLyPhr~PeG &; їkϪUOS8_B}5""dBWWi nmn8qn>AxT`„7ۯ˝k>!<@׷8{҉d4Gǻ>W%Ly6mv6rͼNѣ'۩%GPy'$}xT /oa0n4S@QկpS[Tzw667;)j+WkqQpJRK,#tuKay=HQr7Jlp"}ątk`h%F^01 Ǐ`v4XӟYCзOWDc0K Ne(/ťg:|}) ٿǂ+Qe7w!PujoEEx]bҧm7 ʨT5n(}Po}>RlaYmRpD^S荜b11/gR=S,NL,<1ktNjwQ[l݉ SX{P(<W*TRH !!.8Pr WfΝss>UP|br2W֟9q3fgvx;|!o͠ ,gP8b[߄{t}eB²y"TVLmiib fѪ?csJ럣LT2{Ύr6F{VrFcĘnXp,lKBBlΝ;N!)9~M0Æv#/aҤM&gDb=ý蘞<$j }q/taRٸeR J>DXb\(,<$; K+CV F54W0gG8}:jńEEpnMӊKSb)\hJs0,TAyN23$s 4,ل2AGqM;}NJ&Yb#|s5vIi<M^K ky{&&Nz /;Nkk mqk ?dm?&w%޽cgɓ6lУ =z8CheMT DJ9քcTvl6 ' ܋O`п (..`@|X!dd6m:J 2e;C^MA6 }K2{O+0LY1qb&pyT~L,_pڢ4%RǗ_z'zypq B.h"d}qjT1x𕿶U uUY&0q?X/ i6=A#WoճiV?u1D* mB|u.kݘ5sX}|o^#^l3ό II+{p#B:qXZ&mXnxSp;m[x%[B ӕHzMZ"W0ƕ}giZ╕] >Gb4KHdʍ>M쁁5{ڎ92Z7WUD)=99hŔlKAC`P\~~1i;e%LJwBbcǹcH| 8G_/y6eYA!Gr 8HȐpWcۂ٘)(;EԦAרbV +PW@<::AAf700SxϷH[ C{qe%qKShXdz 9췑BQȑXt&NZCex>6n|:>t5k8( ՓC^xU+;;cA7;^^~EO-V7)̳HQZ.](-MGP`=bذP#լ;t /`擞|D}ع+fy?AqA<7|p3ժƲd7kNA:T&=l!4XI~@;+O_=b7{#">ޮ-/r,(1PRr {o2`o ״M k/9 ȸ^@GW_>hy+p'd3FK֛6BAZZ.$aօ(*šOϣ>d6OrcyI&Ƶko? Ĕ@~`a̸`67W4!ʣCl eIr(Ua\LWgæ?a'a !<Οy'|,^eų_YHi$U.G^6 -~ͭ*7_L=st}²u {rگFQd<et0}{Ü#ɧ#bݺtFok ɬĔ@\˃~큜̀LO1u oLJlw<ظ^> ^/ێ]z0к]!`tò71\c  hc3󖛒` .wc0yBE\Q-[a@1.fӬ~u'}I3/Opj٣Aϛ;NQe^􃣣SKV,z4s oO0ŎJUj%TCΈ1eʯXz+- ǻ?PcGŜCB04\T;܏kf*OV'!Ӧ޽S,6/cЏx+7c1drL|y *8E F#lJR0bK2qxH:2Y˰qʰCq;A6Fi= IDATl-Jkj3TM`'0~ Aa*A/o0 K~?Ӎ0Ύ?a](D/u*=P/O\\IϣVXO<`.InB^$qR_J/f2 !zBjK A4x(-BiYNoC!B5=pg D fO|AM1jv7a&=`@Fjʡ~ s9byb& >yʂAcmi7j3 ob_-. |Ȥ^}mI"]Lj.Tu8b1VW'$0i*>| ;*I93#={ ^y9ed,:u󼐖گJL͟O=v{":j8raOF+}سeea'H[m1Y /(lN` o$턉đ⢑BmSw8&esw?P;/W(n>8޶ Lgu;^%=1La0plg-Ehs5s;a+Єݰt&DAXixmp]Gf&~}n#R$=kر+/OW=' ;1c 11(sl'o?!үn-{nW#L Bd&5 ?) d x8#*l) }DOy,ǵsoSWVè/A$Zdw^Za{0|]⮷|z>;R/y5Zz|N?"<=̓Ǒc87V]اdΝZ]‚,TT@㧟c먨⯝d8 1v˴..A x`d͟Bi2n0Q'ro& xUtHa e&2, =a'qrqI742"s0#s17hICim ]2!XAC;֣G{`fJyH.ä)0Q< lDB{Ldشg6r N6r[3sRO2νH<9:A #3kJGOڠGB ;mj7A|| /Gd{tVF&)\YqבV|wp`( Ia6bVަBpȅ H2I*$ $o'M(ӺJɣkL:La{ ި^9N>K| LuKPG/%1jcL=Kiӆ`ݺ};5pqY;r,ߴq-! ]Ybz|ÆhBōr=Scyf;chAt1Ro5ΝAQuL 6;;aՖؼw.fn!6Ǒqc(G:+jp>)]B](ShH <uӟŘѣP"BJ1F~1A,ks|,9>н4F_[1+@Hѷ#8Ik\B*$ M(&o's0+iGo sSwoJqC`qtònHτ= b7:L}X&M3Zw˘6_7%J9\#ܴ ~g̟ vbQ}b 7)xw07<52o1kZ0g·ȑw E>܆G]m۸{O ]/@/̜9`[ sGV[IsB `J4Û(()DBXwCF"\- :XM?!'lvQ6v7&`oHb ،$N_'ŔQ'#`?j s)c[,΅ cxaM=Ao’RV@&OĬٷɐ:3~hʱ}[Y3L¢o_G4H8NH\2cMZm.:hFxإNN~"}!5 SM}HΛr,ZXM]!K0ܚ #a ytϨ]oA eE0jj[%b=̿=p-QR&%͘m1  ձ T!dz?{1%@UI|N.jZ2fKs,L`q`E̛1LeK0da%`?U*|̞f1fd'oNoNN Fٳ#QZ~uZ\P P*>Y 2-,A_ b69<cxL ;23~{#@ѣLne]TD 8}´Nҥ:\Rg`hâ|aG? BNWmՄVx bpFeڞς:|@ o_Õ?Exd0>'DE3`J 47 C$?C׊^60쑴ƞpR Xܗr5~ pr=VU6cXf> lQ O?| xI& r@(f?pBBK WDi7"),D'&#Phh>gN}p+0cWC ˍ):م-/c/#+ |2;=( u*ƝD%b<;L}-;˗s58;} Nr#Pmvhiszl`UI]XkZH2=ѯ H흛_PIP@Aiij Dpw ^o %F ,苮]gΔ`tȕݻ{ȸZPU X(8._BXhJ˲PUYei*-FC(ԖrkT߱re?;1 G $B:_xy;sVroO+Wm=\%uc{G T8xb%ĠANbERuRYggd%G͚b$v\S'k0| }D(քxbCî/\:ns\2m&c/Aڕ<ʿI#sI!UP'~BEĎg;HnN 5?9r̞p犈nэxqLөQZy&lʯOƌ^{aժM&2io{w&^yE\VMge*yl\C숏>N$pa(סV@*V[Հ胷!ol 3`T4zڔ~Mpg'!`R aGj$#Ui֣ߒ@bcArVŐ-x;4,Y'bOZRl3Yp;w4 Ok u1nX['q_=4rDV ?SRHXg!{7HDꅠDxbDGD ,[$J .~Zys)-Ԡ..mZ-B;asq2K0X@Mؒ 'WN!$?"4H^Fi"zKx"vv͗SsUE@]"Lᅐ;$tMFUUr(Ks,ͦJ`0 5wv@߲b7pPUZ;yN{j\[o}гt0CAn`""5P*L6,C삱q KlJUk(~82a6Ly͍'+7$acNM`xś @B惁pY m1Rgp`*dLfGwDL{DEK⍧!!$&6 C)yKADzppM1j˘s[e{Dq 3jm[)qΔ^Ƨ>KDm]D"WԔ jkKPT|z}5<=# 9`E^y×}8q kph wKckpؼ+ N ՁD| $'8=W+Q,/M^s.πD`VedbQXXJYg w*W$|2f+ Ht7ipW((ZUMw)HIT( -8s9"'^ 0Δg7hs_dJ״3livwc^懊%W Ijj@3]ϿyDr.)qidGɚKXlRisIa]OeBG? OϠz bJ^ B;k }+!Z&Y[ PR\NA,y}K7oR??1˝yKĈ¢kɂ!:|=<' 002!,y&D^X˗)Yyo{%!†%1'E:ss12oaѢۀkv,1v:]tjjQZvMV"uu 64(-ˆZM٨SW2FNJ ) &";8m]2_b-RRE3iiwsb1c/-۳zj{C{h‹OvX"/r>unWLr77a=(T0@h2M~JBN?T^ޖ*32_MjΈHӺ~sXdTUNliԥ(+5722/*+CMm"7Ȫ<;5SEU4U y3ZФ@Ф8.zJ3{]H2eP~k6y UFk#cGr:n:5fm7hFP(AmZ PZvi|ȕ']BaUju  +HO@̀P:%x"q.kkoM/[NJ//)uw.)p!zN^Y?􂗇 #Ͼ_z2y4_H5"tLqwB "WP]RkH=-X5WOGW{(煳3Q'@ ˖G~~u vp IDATDBsxƍ(-KCj U:v器1}Q GZ e&RST"=GMJG@6 K]S`Jn4׌P?M`9VreF$KC4lrm.lrZݶcr!!!;'*I,ஓ80d]NoDn'6O7h! (G~C10yݷ7g%k`X0i\"QRrj>4p]N[ RtKyВ˰rUN7dw(Q\@ ۷ pvbwG-bb#)i+?p?oRqR,[65"в3dd݄X lz+ڄz'!`; a zgqALtG'9ˆ`8x/`iDD*"11R)#DSH:>rX\\o\ːQB:xyvkWII uL/שc_\;i9."5'4x&R\?g0]5X[ V{܃Z gck!#[g|pbЕ3XjjB"R2 zDMyQ bbٴp*i#XK@?t.;iz} ]SC $e[~55Yx䊋)JUB˺<Bei:) IRRU0GUR˄\ ee*@rr v/))yE&4@aQe!`܄`ȗ_Cjj `gXbw7Guujj4:߼y<E.6aa(.@jCi^@Ltvsyᇝ()FBB(}̜(ѹ Or@\\,JN'Dw|HxDb7%r5XDE՚F*F@gIa&Rkpї_"ᛯgNV~OEh-CE"CEԕ\WWR!E#y ju5k b[&j+*U!kSyrVNEnұw1,\#.]R" 'EDYZ]zu"i]u)SӐI,!.N1c#qT~a8xA f;GHOQ])1)$eU4砼.ŋ7((SqqYqe X\55V_O!섈x{;" 60_(/DQ㭷Jl՚Jj >_Gmm9(aH jN8/؆3y}hu[9$hc`J%ʼ[ܚpBb)!n!)#WG=0Y~rw:6y]Z InRD{ {yyrZ>$(-' |Zܡ+xaȸQj_\HٍuC^G'_GTG)ĐJj-wZ[pgm![jw}%[%Đ!v8v•tZR3Wχ3j1 +S5ݻυ0Q?2k$z揨U*ygtCGBj/Jͷbd,VKNJE|$'g%.O՛4fr/vVO-69NG @F@7hmܷvL[z=GH (H _<R ?Ȣ |-נHKA{rsbq)$'ЏvuѩS"]#σJ2?$r89@W'!7X 9"a!JߗK)Z̘1 ߏAՋpw DYrA7vr G-ʇs0Ē<8:P [MONPJ 38}:.d?]"""Pg'{\L YHK˥p)$]F{w||0Rq ~%,FfK=3r89@ @<'*tt8sF[O#-m?^-Ҷ~]|!Α30L3~u0gq.7! tHw)c52?܌^;Ԫo$~I,C5Ox=Ȯ*#CMVgM|F0i:wB(W1j=elv9QU]LTU@~t'Ce7Q]o`"|N?c܏^(($,TT@:U i@^UrAUu}PYY|gTUTɓ0u$Ri6_ςHtr>AUg\ $h"xKp}|\2#2٥$)}- @ahW+__}Aǁehކd7o?_X0-rK…AX Mΐu?PgJ޹“ Vh䡦&S*Y 6 aPQC'/GBx%^XBI!KQERq~DDbq:;ev4~Fؘz$QP~(,t@10hRa]m%bc9 }t5(s{{;x@PA@`@H?\\epv$G2% X,NDɁX%QZQ6٨$[HYܹ ~59{ g^ =kҾtDEy"0HJC5*hi 1H(d Bx32aB_̞ygE\\Z"#;…<> 62oGxFٳV.`kX D9H^JBHտ>Tіs) pۓx>Ƞ`#8Ta(//kG)%+QL|b瓏C(,D%JWߊ+PWO7@Rxq%e˻wPʧ^`WASDKx4iL/E]]x"q6*1))/Gеk >?& s.}b Gxtnsͻ&.x;.{r.Q{P;#˩wgN_-xz ,F@!bK`'aIRPL)])P ,L4U3ѽbd8;ҐbOسz v>Cǭ[{! IͿ6ڢ:苳K?֠k<'O"-9)*1{H?M܂Z.4eͰ`NP+p}K$n)EXfYDF`N&k\~G$e8v.ف :-{_PXXœ9a8w~HfG]UU̇b+":t@;'0jr\ۮ, ԩzэIFÑH$n1}=fꋨh=|}QPX+WRgẅ́L  M@~EuBae" z1TjJIyش) 'Nѭ[̘ƍEz%~O힘92ڑSb)(^sG/7]y q 54왫8s2E@CB%"$D ƈ%sR5Ʃ oHT >O @LK7I"ߞבRr8M?~; |0(2gÐ{ o?SXJ$K ?,ߊk|fO3*") n7 M]V!NP\ :Ȝ48:LM}5:",*+0G&0g|}H:%$y%lr]o"8nHM=A`u:1v z RL<EFY}q#ãؼ)r'MwIcTXĉxص3F7wbWϢ_3Ǐ_˖59FŻf%8`N􇌣`DnΚp \Tm[hZʕSЫWw\C~PZZc[OJZScE |K2Qi[a] %&qb*}ezbضy[t| -Si;yշ>ak)Gapdym`}0l>NNPKv/(g)|}zdxUacB upu\J/8 PXtnnѨ!d@G{ C$¦͛(D"#cC`՘F'λԩIf PG+g`Q < M s#bۖ`4JWeP ܔC;ܸD(؁vKnÙ}gRy2NN:~$kpu%P QY)AECvС! 9(`Aں2DF@#,4%\ _~qG 1p`' FMmHK+Q[ܷ#zvħT…K=J]pj,~+_ :P/܅qc+ TWp)+$o`onj'Q_ƙjd^BH#nܨ 2.$U?>GrܰF=e+0X^Vix-](9bzchڟX%H2`o[4w+H9#;yUSTꌲ|mB{';CЉ,QZ\/HF}|9AA)}@ /PB\<|3ΟƟҥ,̛7;{s2BOl_Cy f_oegIa,/JK#-!oNN/}o>P߻r;}*=U>'vxb<vص+[ ڀ{$o{n1 oNR܎$'V崽),$0`3NǔpjDGs2ņ 1<?7MӦ)>nFij?̙[i=pc\!vuV;9!?AA|:#0HJc. Ax7qzs o:&i_gJ[Ƹ*A AP<.3x*wŸ.4ȯ{.[(x|"Т\\_p9U(ңt%zF7E*k!s:n^r*~JPXT7ZDEe.ٖ@(PŹ9؂ [_PEpyw~$ZU{8+ĸ HHREt-4+~,B ?u g=}<*b*_'g;cV"3-":Z*c8(" ;+gmNup^5UtR6xLj!m%?{WuM^-Yer7զB@BrrSIIH{M BHB Lql^e[V3osf4lgf4g)kUm?= 80Pn_B6 z r;@+msɛq c Ł Bj):P raӭ'qpڛ'<,R2-#v*}U1`֭BFz>,D/r>Wl1h%Tj9RK HHVGR&xcbc#z:%ࣧC_Gv?.VoVI_L@ZXree,AkQ~g<3x챷hI['|+xw^|{322T% Tye(3=('V@Qoě6'>R)HMt4?y1Eq- *WS]_W#8`F7*4}(h! * +WQ #||B ೗GI IDAT 0?@!X×`q.KWfC{m}FbBҨ>?G#TC7l;&+OCCo9 a!``ۿҪp㍫(Q7x?xByaшp͵(J[j$ffi?`ՏZ ?2Tq8P~:ii*s_G~7^}m^N,7#)iYyf߲y ֮]yb1 ;Lj5n# BE'oq}Ɉ3![r%tJR&d Ӷ /M A@P"HIl>v :C%$Msİ30Qr%GپG`׮羍Un/ݹ(k !%@2Iao^7<~b YEHMAyeϫ@~b>7gXy 8-),D^]_| ƎG~͛]?}u|/x||B[nį+7FC* )Yp8Tmw㲠R &:~'B"h{a$&F῿q=x{~Tއ[a2\3FPc8r xD( eWߏ܇GKBb`?"CE `.%.1gL6`C ^<V:u ~!3q.c6@8d/C钜%pn} =?ujb,w:Jλy1)w!b@?>#^ jTL=0ǦAC*g@Dw[w 1,Zօ>S)hK}@NÊ\*Z?D,Hd4ꛬo\\RdHqdggbQ"V\|0EK{EL/JJz|ԬN|n(k 5M'H쬥8^Ђdf,m%lE3tV\~YehA{HeU ϣ ?K8x_:kV|Y G\:rA"=]>()L\<ضTH >DS&Egieds59!YB* gYkBq1gB\ OvͲup{҇_.rr~xqu4xOl*D:P7u5bR,C~Q$Vmo0a`{z:(+Llݺ?[ߺoc*,N?x-tvC0t&͟EŒA8:R[?ؘZeΪRS\!Skm?,ڟ`:df%bD|`i7 ෿}wq |>ĝ?"px[G5+5Ce*H$ lG}oHll9Q(|h~J{±Q7vg׭ߢ sUiqqPgR1 11 $K/؆f5H4~hx?v/nڊly(߸χJh"P+;9^%>?qe^``.ǣFFz6̖ڇTza2<5w2jpފ'.~֐# ΁Z$Dn`j'rsLMIHJ̃eЎm5d:Dig{-WZTVWH-'/L3֭/ǞݿEfVBXD9O y6-Fe՚q(_t^ drHx1_G,2ަC𴞀l I'PѾb]p~Oÿx~޺251ӆI8\ b;_&6.ļU'&M/ЅH5+ێK}>T?s%~7sq?rDni? `ex3ylOAZZWfs/|>9ZZ'8xHZ.t qŕK<*d;߷`e\sm 6\IB"!*2SlMRSx#I+q`qJ|su5x@ #bh~o˳CszB!'G)0JE$0D !lXeJ`nmu+\'Pjgq8IR*e[l~RZ. 0Q1Q\nm=֮)w'ڧص[կnJ+11VoË/Ÿ~ͧDh>hrKM""E 2]'"F?4`w9F >9յ B3$ʍ1P(u0J:Y#ކi vAڒtф _GSR?|]'>u ~?pt~X~0cd.v =azB)D&&w:%0`e+ J1oo-ǂ[e2?$7}S!4 av$ƗHЯ9bVĉ~{x#nP(.u~{?%!o z)|PYx="%8ykזMp +3d<{x $Ą̍I݆ QDDJW*9_4SզGٽHWtu鐝&6_̏ᥗ?$vKijr,Dq R_|{'$ ^q|Fd 86e ??8ЀC(_|)<<,\gj &7HmU?  ]?iׯe|nZ!`mͫv=يCpl{m{^&rR g5_o-!{6qgLxS,Ң_*UR?!mvODŽv+ !4 Dtt*?SO@wܳWϒEY :Z3wY'X),̨Ց?2$VfJF.ü|bcDGe"{8Z ҲFX[8/ vO;Od<B߉ [{AO98H C0.{~2?LAi `''|Uį=׿>?yWTw/_>/+ )V,/EC6˿In`pO}vpC j>S$e{!,|7:rg袻zK>=&:ϋiK-`:AV u _ `d/޻uJ\S`1/29 n[oJ.R)Caaf;Avɗ^W_|pn=‚t eh)V`͚HB"4@"1T8جN;zއoh0c^^ h䧢89 OqT;n\vy%}I%ScvfW0轨TƛP^HB5~P-s>3W7h?e~ ߿ϊ_j;;qeQM>D"%RcϧVK=|}gI䐗]q{7L f癅#AVZO 3vuL0X7@mCFDvOk(.^ܩEvt];I`:-]*Vkiq iC׭*y%eCO^Z.>zL&S^TҒL*I>X4|~\.}/i_ @ftq +M*`@Іmkn+/Z-%x"PDPkĐE }Oz Gl'""wVoe!5G/6V7ǣFLmoڸAq|~5Uc*Oޮz*iےՐf 126a !h%$YeQa.'}xSu  ` +`892ߥ`>;bCݙ3()<[Z:D3^{SE||t<EQYMPP;w5I#q]Wb;.qE8jGG .tqJi 0$sSܼdAJJvfRwhqmZ;CG .ԔXE")9v xK _dx1be6oCLDJA,YZJZGf c?rhS&($cWBugN&i@4Ǟy"cߩ@CfπDHliuٿaCMP0 dEHQ~mx뭽xh 4@hmu|;|g\B.XRGH߁B>~EѩJd&m wDIۏ@J&pI.?)4S ~}Hikz4ԏ^fөpW/#7G>ԒB/AF:l$0Nॗv1!rCIzcxBlB )KFc!]t`O}PK!Ebp.;> OLY/ ǝuSt(mw|2qgMu ^gjd go_p}߻ Pp/\'[p?~ nyThxah< .*f499IxV9,8yI\bw㣻uR|,V0$JE p `x[YlHvy~6UQ@"e`2z{o/nq_"D AlL$2$&֊Ad嗁ώH}^tfYa)~ϕ82 YO ^ f@Ui"0rP2'3^t4 ۔EF`v6@zw}2G #K c&Q;d0i?<q7Et&dL[,ȡ3PȑH"|lQ$*Wey<a#V[D4ho2ss Mo ~61 <~ 9GLcETRcIjO1q߃^z\ AW_+7EC&e?& (Hry `V ʍ$d 9@rA\CQ"9"Q̇?b~甥b,b>f0ef gS!&R(G~ 4Dׯ/y-D2R'?>4?UWEuY~+RKe,!8F rp % elrrnqzC!^oR7#97z qꯣeeQ{ *D(.\s-g]K o{9TLݧR/ IDAT'?Fi44"3+&c'U"4D~"44A+p.T,OF\|~I<zYq_V/ؕƹe{r?J!npV\߀("*_照$>c^2dE5pp9._VS~1N?mY21M$/|@Ok-|nP*41;xtwI(_; ]qRWUW-3 9xϰsqB9@~^ Db " bI{)%!6H$ H(qk h+uOPp C& B! !n '9+Giz7Kb4f󡫓3fY9/.Nca0O/BChw/ՍR(.Z $%hlZDsUdMHJ\HKAO$&,N_"8}\d1ZW4RRj)RSjq%0:mۑqwQ\:䕛E1’C9G}giҳ X@ipbB4Wn|SǨ ?l;$4m;/zwO1sȍo|B |oqN=!V ̎>ܲՅx6)JVvQW+DrF]s$%އDđJk.V pœy ow㴍'~y!΁L{T1"B_ 8ةra;idbLj!;+r)QS2 %Dee%|~*/ɓ"AohX"2c^Kp E?)QITCH T<$D9F%`z1`0_JR9&y~R2H(.D_ ޞ.d`d#+@ε4穋=ztv/^h uq& 2,\IoӦJ|z$%eWᇿ/yլ(GXcidÌw\-\eU_B̬~]WƃZz)<A,޽S\W$4{1-C /kOBd)a:$Eye` t L ycogo;$!agQ47ܰ;w4de. T*R)jW۷O)P<C }gpǝGSt01$)?e B~3`3Bm6S>F.[KGpxjfCA~HI?&x 8i Yf±gaw}n?fAx5#@8t tnqqRGJR77ߜ{ ooٍw4QދC޿` _$zf]&TR_u Sq>ɎdP{a|!ZAUu4c&3)T@sF- ,f;¹ַqzgNh4ER~C&0~?I0(G2'HHD`"b)AlY e{1⸴W_8kFReeFͰ]cRB1# @Lo9G̰ vrj F ?nGK+e0HL;6`#8pF_x}6VX8;vXpZFoDJ$ !HDjiK`vB,RB$r 6. 4h  nDDfAVV&֬xlFh42(Jd AG\\ XKʡVВ,kDTv}tjg:ϗtXkrHV D"*ɿ \+ A)zGwD@<-!ͩ$c >,k|&Ziq0K۶) 3eĭ1"|@WT"s[d2y}rNIb]lL:.6@HSނW_݃>/̿ yIX\N ח@?DIcN g1;`4)/Ab/<R9[)_ZnLA,\Gbq F~r5B.k'u45Gee8rd/Q\TɦD`'& -0ˉƅO?=Q -5 V[/df#!>VqqYp:͈J%ЉaœO_E%CV:?8r:n4o>9{H WBE-ʒW»Ke&!A )}a Zv3L 0Gz Ao[: Pw==gJPCp9NIVas@6` nx[H2*R FeDĀe- Vz0;dJs`iU>T"-m1:ꐞݽ'reB8 Mp8tdH&զgЈ3gjy ظ&lJ:} ΜQ`l@}z}#<Њ#|>|^;&WߠJGWg/~sgppQ  , V8V tl6PAz}}`H9 ~XW(ϥD<0]l4Up}lFg2\Q/yj I"3xe?E og=O5dū!NLXlvC1{+@[QJDad޼k4١R̠l*=Ą|*< Ehlҥ!KQ > ӧ >bs҂娭˫/CۑXBk!JVyaa5N2x<*,[VJWju* `Qr*,++.<!KIGWw%9)u%~<㎯jmRL-'Y3¢ҕhiB|\\.ܬ)%hlTc t kV߀Gڲ O<i=}sgbqEF#;kN"**f`=fw~hƙ:J~7Ds`sV80ݏk }Qc ;}r_4ϺICt$e|6/0c#~m|*}s2c.TF|Jx堉".ԋyZa6;wF ~fhuv@oIXL{lrL&'t6 Z LF`6s>{QQ`?Vt{ж=a[ ɷ5uBk^O~-f`6tL#pX- 0B`A=,}`1){}9Z:fk:))>|K^ZVbc:M,z{(OG1u|S ~"8Յ>ЦQY: 2-6D~/*#~ÿ 'k k Yә_K1 @Z5Fϐ@˗Nƃo9.`%0U(2" > c(;}娬\"7)4x,5mݎu` V䈍KDnn9j-pXb=w\K;J RQB/._ EZ,b\ vWRڴr$&@Rji 6a  ,Ē%Up]Ymm`=n\rԬXl2V8zl+Ws\d51";1iTu njce55QlCG_]1qZA- )]({.?~Qk W],(=,-:y.A+H yU!tS è +K%?-9 ˗NX2~˹@ zVΉvxss˫B]l768v>gъ*>Z,:I]:0ӰYtWop:dN·[ kv#. I z} foms6=00`t$`hJ> }| &Fc7&Xfa`=&C;tЎvGB MF39fCWI Я٬uӰXh;S<8vԆv3^{mR`D^ QO EJC ~fpGW_@Y9a>OLtc;H 3iy0ㅼGK(e QDݰ @3Gow >K Z[%σcwgFb-{XTEII %22atcфҒJ /[m{GRxmW"2JAfVӑN롱==PТF嗖/CNn s4DAA9u5^;xѽضzƚL#C:~JV\mJfup$%91vqXH];i$W?!,&~ T-SciM.7>sӋC,| 3A,.=G1gv'.`-,`/f Fr'@L@¹4yGX<]n,t`0c6RC<  fK'lv+{.j Os_EcV/aHyuBoŃi6VM+A|~k`2w0alqSKfj1oo맄=, ^{55Qtzc3>>pGoe@/pl:hV@zUghBbM u~g08zN Cыӧع݂'x}̇QEB3J`(8LV e)rҝaù6x}6KfrݲBC]TFt /!ܮxVfzhwX'{X+XJBXz<99>=NG;v|hD_M2wmo笔ㄛp:]±k%sޱ='讌(<Z<boiRb \엁>mi|"1‰, >s>̦>c6ps|DƲK`)> R׸zM`=z3|>^*D{ k!"q" D"t 9!m ԼNo=s m=sZgib1QUAN<*_~Js}ǵӾ=|; c{ŐJx.InU(]?n1fvt/Z ŪPk!-`nAy>ScaV 0<:׭)dK6jAwYDhxtt#]JErRTD$AJDrR!44":* QH nMw*ѝj =VB#"" IĜ/R %=22nB6)/ё݂Rbvya4R$@Vl6VN_O9wj @U.] w+o~$y݉!+X`!)Zi>|a'r _k~罳=JO<DɐUnv!zH V@<7 ni~)BQVAs!& l1XlKQ ena M?B mpC gz02w"DP쩏7(.@KP" DNQ1zzOP"n*:`ÚNSJ .ӊB| r7Q}Z=D>n YHR r$ŀDJa+ 9J")n}$k2 >eADE 5u+q!m_Ɓ2{;;'Bxo5SIfQvp8=tN xD/\E=wE}B)saƦM1HN37-ioɰ ZLD \-._+PG.)^Ey*p yXcfo!=sDSO?ɀBt`'"e$dˮYg^kvCH{IJK*z' ) *k@{8  K2 0JMe.$(?ZO)>" HK &ϛ$ː-G[?.TU-pb3vB*bzYEAkaBW~Nps *0s๿'cI;Z$ҢU3# ^*'׭Oෙ M/G8?Vi# ѣvlЌb O=qByiEHΪ{byo1xNL1x.E5f/ aV)lBV17 s sanCȵ 8z[=_M37H4,>b'Ԥ<qW\Q~- 1I0HaH$M 1d9r\0 NaAmmH\C,~8ߍ~ U*|v<) ?|0G8d !egd;[X,))2DL,ۀT;ߊ;-rO* oJ%C+ ah~4s1DQ ?'IpBAbgBx\2/YzT0r̺mJ;V+@Y H]y snfH( U HA?z*5+I4؎qLPY0=mvaLw* cc+cBf(2E{CZwjIz %o M ^CAFGP4XOoeg 4q<|3M$&x䘙1^GrO{ \͏T)J#!ߵ}\ PJHr89Xt>QL ]OdhX[煯apYaNDщ|- ^Xp.8Z$'0:./amg@m[0)=/$! ut5 ‚o6a;&l5"1W`8d͍.l}׈zr`.86_'2ak!CʢTbKԬ/ xR -':pv3Xi Z3yKigghz0h! pny3@.0<,8 F,#U#.Jp?OAZs~dѠLG= `bH+ AsuM]IZrՂ+V$?UEQES*ҐX"$]zkv7w4®v!- e91|B߬V;^l8?7|Q)0x~(F4a#;N%ً!"2f8#`9;~FR~† QX.0󕕫`2 -.p,9K!ɯ&yTyAi6Wu%xA˘GispVYe)5PY:-K1o8^ Qb=@쩏3ys0 OAPoO#] `|NLвSsiUQ8.όg] "MdK.b|9WYJ>8 $m3l\R>;L<^#oў_3"+.8)v >K? \#q y<뚝8DRHs+!^F,yo <'BVW.I#YM3R%AFϳ$0'L5W@ uCN2ơ(<힞c˶ 2@ڠVf ,_Am&vٲsXl9gzFstݿ%KH=O_x~{g9[u} 5["usp'j#l@W)QV|ǻۼS)U]ϭn WVPD/oRIG O߽@PG?O>_RƜ-\[a-̌)~4t> (\)XW 0"iy0MZ9nՊvl;y&Z솶ywC~I8ww_ȭɖ Hފ@?n\ktG߽Li9%eSHP-{J 0t=ؽE6zv/[t{wn^n/wji}x=wnu<@z%@+@ܾj@OK{ۅo^gi}ԖDW=Qb^גf=VE?zbfu;Ip%dib҃7OkŻf/йd\zM >^}uMnFy 6d" @iَվXʃcm/ n4qwf3aܼsaz-BKT 7hC(z ږ=C9wř:$`mS89wz!t2"nK#*60- jv,]Ru\)5)ym%!j$u:V?Mϟqsi'?)n,IЯ~A?G۴ ]q'2_(ML8= @qy '_>ڶíY/3/h:3P=wxQ|lYm4#o{/\|(4v(-x~y vwQC7.w2_J٨y)gy;evLt?NjJyﭲk0ozfSxo{c1QiPwUWv;7ëPx{p{h"WP; n MZ^ι͋@YýE\ Eo𴙐hřoDq HS 7ݷȶ' 60& T?ybBz!.v}ǀ8< chu%9dODG:p{`X `}UjDدzWQ$Xy`B]L,v, b@EN{`*acdDK\\_ԘS3>h$@7d> ?>HmمЯ]9֤ۛ8޵/k4`3_A>h flC$|zh.-{m{P)fe{'/AʔԑJN$-֮NP8&-b7cQ}+DW@ŌWJfYߑ͒f=pfx~3QFRMж/4*H&%j*0z ]L?1Bz)(2п>EY}$ &9֏XڍRL=$^?)HZS暎7{"6 r~hwxWQcRm_>cjDOkG^JuKdO]_;YP EAN +a0Kr<ۡ| ˟l. )ƒ;MْS2?q-~ݐz0;(鞐-yw%W*ޖ%q;<<(tl3nA;+Z/ Va&+4jYr?y a4 2Y)D-2dQ@OQt3붢sGL1 ƍ+BЯ]P!U!Nµ&׿K_?2 [W/_Q&Em_4& *!W|[_׿[b^/i?eﶽC HwAHU~dJ[dlQ~u}2,RS_wƍKz7/] : G:<"KZ25%K#zw;&R<$ddҲE,pc"{VVAtÏs^)JUugzQ ~& ^Y?F6g:mLV{ xwa,2^om{8vvֱ{ξrTԁm3?O7w r`VF:ݯU 8nDQpJڄW.®gk#!rk7w* R VH Ȱ SjL{/*Yr@*-z_~,Z1#@E+*_UP|cL|UsϺVf*~c~8e5zoEwL8 `?=0&*o3NT R.00_D&?oU#oU|;G̨{+o,~zBt98spH:YPP)r+Ɍȳ*#7 Ja WmyM4eeZ-ؽzm1\Gc پ\mL jrpq:nJ¿>}%Iؔ?߷kp3n͡>gvn#E t+{{h #SZy}#ZCu%uT Z 1xhM3.?dO~!G B|^dfp.}2PBr XvOKt.}5)Z `b\7.-3_kesAz< 6Qz_F:HoH' R$JLSnsv pS~QDѥ_мXAH{OLv#,}_~Onl4[ (=3Àׄ.$ASȕ^%Dyz~{ѹ^ٻ0n\ۣ 5s!_Иghg@Hyz ,tk/k3W!),̠ +-‘!#& *)Gb/E Ws~sT?FQ7ܚ r0Ak]#dq!?wHt)ML՟>v;z W{ E:=A-}|n0bz"LibLeL`,\5ơ5[?ܚB+Et o/P_1G}N,j3(k?j~# \9Uσ, gi Q6Pίȼ~* pG2".vV  @Ĕ&^FA G2P=7`T7ZHrI ¸ ܓ3>k ̏ޡ%PQ=B @(MLހ>Y$in}ksgߜ32Cnmm%9(+FM;֚bsVDp$M ?:N! !SL%g#&1P;( M횿CZڦm X˛j!T'0)|:3 g?B틓@A;GYGCntYAHIv;__9 ; …<@}BȘbfQ?wٺwC##i'- ́.?%JL ɓޣϲhb?qCS/F~Fzп:p~Z2{?ӽzuK.H80lsw&TbA*'f@Bqywe$${r.,gO ypo@;Tg*g$jP0 %[+4 ڹ{?˿`"7((0֤dp> SyR𺻳JO!\aU~f/^"dSlNV @Jq_JZ˟]a@ؐy͗~;TC @)MLV@i*'ٰ(Sn-DN;%' v!"Y@)OOo?S&e ;7B9 WDuA"R1!@$N\\-,[Q wjC-JJh?e - K 1YNe PI/XOƫ>XV[@~[NT7{@)OO}YNܮ k ^Sȣ,7e)E;ٛO? 'yrYl#`ځJ:-U (T[< )ǪPzYf "`E #VAY#iAyz [JT ޫ?pM+)_U(l|H QZ#~ 2T&`׆jOEͅzt9ȷ>vtϻ;*vH R>*F[?~1RMcO@4J{~Fp]oJwoG%)D_"݆/s+|u]QU }%(#Q@O2< p['O12c(c`@_|aۂEF@j -߭;=.-~'A  U @͡ [H h>iG'F}D(@a.q̟^qkfa_(f+F7C] Q(WŸxbt>!^%kjV\iͩOf cqfD$@DN^!m@{((IgYV$YD@ 8MAHhQ8A KW 쥻Dm:ݏVJZG')D)MLKE@$D⟕{Izr8C (2p(jD`M?@OBH41ŕ \4-c3GI"2;!@ :l¬1@qi-S 2H RlLd-'@p?q+/LR"@d TE)Oi.?&>@ iB`yI!H(?iY$,C AhӒA?}>Ya ()T%6;Kd4e_d;H 1)~&oWZ%n__ܲ@=A ) 6ŀ{ 5hq<Ҫ'AOB ADQ`)r J҂\\{R"&Fh) hS,T⤴ac@D<I=^ ^IENDB`ukui-control-center/data/faces/1.png0000644000175000017500000024034113635333016016256 0ustar fengfengPNG  IHDRx pHYs%%IR$ IDATx -GU/DL"s^ի֪PL0f_7pc@qC7p}hTuqG,8=Z( h/pZ_ }+ˡq9/pi/E.ƅ%:8=ZL0Lׅ-}s?c@?nU ݀~8%,ՑCF׆ ;NƹRǿg2&`0L0"g?S3>`2& Y#4~Ome9} W/?}&Є}o {{AW!VӣͷoԴ_5N pF=(Sv Lp(dLpH~co _ܷ)1 yN4eh.kL0n`W~~V? L5J+Ա"~YO^>#xe0BW9pWvy_ &0:rc_*qo] 1 V@C Rъ5)Jl^f. +NҦ` 0ߛx3Wa%y!EGz,.;72a %Ld.)T1; &` @߀-]P)~VnL H?)kՉOK 'ؑ0/z|_/BW-}>DF)/RL 8n ޮN<j 6&`'h@2J p(U!%4;hmyDԉ_O0fdL_@WI|NlJR5V޾S0eɧB̀~:iL+LV 6X]lJt>с1x(D~yY6!P W'?ie 0ArנW(сb X/mU yNSk V0@쉿O4t8w!0?i[a!Ƃ݌VW'8Sk F`Ox~rޱ74#!Q<SKxį(=)ҖJUBui V0J@wWt/n|dz>x$C@Xm+,Û_qY!z D & 0hO/=[')MWc˓ SͿ@-- Y"-8I|L0&`OzJ[{_ H2SƷwifx:i& &`l.PoQJWX#K2aɻlw|y"@]p6t`2&hx_r>s5Vم=b!p* ! 4!c9x/KhlK5LYg,l@?U==L ] {,PST6>C,#tN hY <9r MYW2:`]~{Ƃiiáx'$ټ(=~ԇw˸l0Cg#A$9$Ȓ_ ^>:]!p4v0;<<|֋<#?6H'? C3!lpJ>ײ ҲeB%"hPcyObc6_^%ƣL0;W(CG'3+qiU)Hg\y2hǯ?1ϑ| 3lIwLb߳o7x@b#3Od'C Z!eIgWΏ/_+SqEiP|R\lFºpύNLYF o ҲA ߡ/uol LCnfJ;n2V+c Hdvu˝C<P㹷?wV%G&c)Pd605M 'Eͧg=?? OQxu;e4lx)T'ퟶ@ {bul'e_a)Va/o<ߩ|{xIc 1!Дg25'X#LAo0[ZWJǻq_ʴ6a26w>Mx#C jDC ~l!eeJ_—lugX!F-> '"IgFޢ,+Pdyv˿Qx' "(riRpC`=T*m+'x6^[&N0R o4Jve8OtSx} rd )/>w{ZҗC<%):iIv[<#ķY2³OWr}\eAYՑV'`jO &`D(N=e_ lQ ]gcG}xޏ) 5r+֍J͆@8xV'>)`2Fmn+ M1{;αzv!`+;{2(՝0a˰1 SiS'~1O0A*L@f(N{C+V-J?\o~(6LMP*164-3(QL 8x(;Xw!:f\Nr Py'4HӴ>senE8M +OEg\MKh2.V40PrնYܓ>bc_Qni8y<=+^#)iVMծ862 (xa^Cy9ٲ/~`4ۀ6vDt!Cܘ;EJH#ZȑǟOI-5LY@b(&dDB;nAWe? Y 1>G}}e{Z }cȊ?hDȷ wo?4N`N}'}޲M2 (} hC⊥*BX0TV.O%6O,YD1&P3/GyS+N{M=fDRTrN_ yH>Wg^-(bcL ) O*=R:"dA[&dN MÇxCl7kgo 8 Gus<̙}oʃx?*B~L`{@.z'7wO*~^s="S Âm3? `mJ?%Ɓ#cN/b۲利z7|Hlz",M'/222laSL,O{NPz˹iM4}I8'Ų!J,T&zv%J'OR1%S #*Md-]ZZ@?Tp{mU xUwZDjH.&C N*NTtTC dPL#]y5n$|ge)V'r-աP)~hz*Qt!Ue~Jq9>"8?WӴ@.y<!I )z*FqoM&`tPe%2̒+1KoB Ye,DNp#- tHM ]́6N\Z׺?CƲӧ7O<' +ǯ&B 9*Yvw(0C.~rg#pG >%6e6s{Q=`Xc- M3 ޽x*F/iBΊqcW-1)K#ޅxJ.6ȍ>9Z0d=M9xM7g ^_ >)<+!h|zC c(#Qph<}cQ;p,$4g |;q ŷW^O۝pG^s/@GCm(e8pl,čEcESHhOTȸl0o]NCSˋGxq^#&+иz{C knSn, $wP 4bd_*IB/>GEt)#S9H%|ڠ')c[<6O)t͆o&uy*^]> ȿ G?13?-$0E$_?< 0O;F)KKq|GL><5&q ;K3?p3`y|σc:#CI;xcKX< _\Y8>xPx i=}5G}a!`(̭ Jp ,.s ^AxIqq\ls? %ޛu 'gc/?|aî(>  IDAT…:3-]mItbg>$9_2nLB|'ذ6Vb#Osd)oov72ٷa/4Rص@4ӹRyxzd\!Sq3Q4W.͡!Je2(CH3od{ߓqGwP|7iK=7r{|$7ǯ?1ϝ'oy.ݘR@݋W@ \moSچծMNcQf?/ǛK~ OI?vف8}6CO\xC= tt@ P6~+*Aǃ30s~=̉{fK3`WM{wgQ=Z%z\yd{g a?`1pGh\Y}œ1+ Clny2;n[:_کk c/N\@(? @ .%kގ1RvH|! c<"bU{)r8x~e1}N]1P|[V l8vk#vmv3.,t =aPp\RuQPxl(>;P,c %&?PtlmyE<#u=ʃP.=p3? 4?aPx.mZOL[plvz6j{M?b|H\,%I0A~8'cj6S>>a(޹|[ucpx&?Kj-}P/yחl.vh8 pL!f\!dC`]s)uV1<üJC ͦDc(ܜP%Kx[!~wN;Pyr9ƾ:"ܦé\;~{!Y}mO6`B~Wɕ5?/c l )j3{ac^1!|s!ޘԝH 28IlCWj~nyr>Ik`ر̓EK'gEZzŮ8 ۏv)ȕ :!xP#x!<{wmW:|#OI3H^#a۲؁# ̓nнeBml+k{}|r}(U0WD|,7;ZT<4sgoU$߯2I[44sL@q֛"sJcx2=*G^2mVݮiulKNjݟ'y6뽥c^5fZG}~f8")gI7Ԕ?aNs@޺[ؽUS:CzGl}e|C`dq􎏖"hxhzevW|24#x'0#xMWCFE,Nm7AƗ_5 *$I1<22IT|!p)7[]sNAp9wkю> iBHn e}PJh3 84ܻn6eo4Asc>ĻO+zoll8ekп|mσˋd-W5-`e-lMΨ)=i`)Lnޘf+{d\h"O8p%)0?<ܻxo;|CKM_4_}{p(ll0ll8͏p*ĻK׋:.wD.=ԮvG!ᐁ-Xl޿&֛N‡x;Eh+[c1|'9 {LM4rcptX#C׹bzbV 8ٵ|C2fw13σ>Ӗ}?32dR1ci!<S̻DLe z;\NT[r事 UKcp\Q;\vM;|H5Y×o<"xpgF cwGɶY{щp\l*OߨM ,avUy!2PƢ3x}( llT8O%"o_r%KxyГ7~]^4٦C;?!)sekQx6#c=rzCcOC{ʳ\xooLBYoO8{E_&u_ ֲ}@6}nbdP5yΎ2(CY(~ ]߾'n?`YtNkZ SYv>׶]O>~s% JbRLY |G9xxéB<k>a`퉂11p$|:`ĸK* *(؈@q[~J 9h|9/.{U'"!:׹ruLp^p/:cH%~h޷*cGα yC}Úa⬷mꤰ,skDu^vqyLsjwLJ&dq%$zA$4E[s9"p8=QUnXX9\x|G 1s&L< NސC iW՘K2(GySCh ףcצxqv_'/VWmxN]hq }t mS𡆂->>w׽Eߩ;+#v2(~8hyǺ!.R{ŷݰe#?<X3u 8m*J^g|u%Q ν&#˹ǣF"u&++'L`x:xil[Ci$]$vcek[6'Fc;ڵ=-7+Շ̶{y_?$ƁÁ7)x,!z Ύ}ceϴ4S?Y!=ﭓg_N>H?kg@y\"cx],J|W JIMX2{@fܳx'{|s3I|KxMWmk5Fd,m\,?IߜU'W~[rn%[L~kG;?=A;&8zUixi-[sjI)<9;E <3?]XظYE+nS`M@q־2Ö%=Ke3p1uz[ +S ߒg_8KGX<P|OSnڡ~ՏQOyF\ G;1zGY12"cxGr)G&/`&E!d{(}39o+V <5LxO^Z).D#wcsr V+g+Sf_j7ຓ$O6l˚iGoӶr.1Px8JfOo !wTp܏c.y"yʻ)FD<+E3O 1h8pzr찓s޹o'[&MY0 %{QG۞[^m)MΌ*$_˂]W|?%29[8sٳy@=+D3#B/@,Rz ]u'BBmp^y6]/3NN̡]<,:Mb^"_?5mN&RզXկ}(L[])K>Nfwjze?.85cj:TnG\^]@ (4q j6[as=PsOuLHq{z8^Eȴ})n?/ͳ­{GU@8y3Gg.ߴR9 \rE?bd=P<UH 6D:یzgcr~Aр~En,;!失)˯. +koA?䝟aP8`>FqqpB]H]nx]@(.<$ch|`ό ڸO~sVy2}|xo:w0}/h>M 9IucUM 8^"secM gJßG A_v%. +\*ګX6FA8j|,/?Hu@Q9Fs*Q &2v9h ̳gʴ۟{0"jwt/IQ+1r&C "atC I}A.R /.(64]* 7l,nR+/兢6f1?1 MY~`v@sc#o0Je%J@?Kg ËwTǽi4%=vuN/R4K i7W~:7_Q7*?v34?5ީbw6\駧]LžcG,gj .%߽ W!Jo ѷ իE{]}}sϲ9;K|i,d^r+f7>17VOJ~@0x5|狝2 7`«Jwƒ#hcʷ~ItHL H2]gPo-0=kWЦg2W\l7&B>. 7 .B.+˝^P߃+DS~&U.$;9?ǗϕQzQ@_x w.>BJԯ䷖ &ޙnCEpK%}p:T%M/iJn 4Z%ڣ/@QaZybe1! vb A̴jC 8H3נ7MkJ/j%CRZ:]flo +DR6a|l#D49(,r7yRmxA ԏ0f/aiz!b<%C;8YG9.x,aIQBI: ] =Z\G(P1J%j?d#\w5E.u~1Y{/u`KjJc$3!xh9Ax90^RmFF]< 9ׯZC( ֨rZjzc0Q'eE7M d)t]72XI+12nhĿ\tBm |yޕG{IuV;DA;yۮM8ȍ''k!,sG .X*o{λ7|1}lZoQ&IxB6Jٰ[M P7 la햫$gn  n-AMc z蝺JgQ7ע IDATރDT\(gƉS47ϔ$Ѕ#1<ߣw!olA'e#%8w($ @C.Q0cp![>_|3/_{Qۭ"zfhb53]UFLnꟑ}3?'KL7C㡗%et_@fҬR0y 6:`1uY`?LW#sagGʷ9%˄zw'gx_<>eXCtRۃ6&"H]6͐xc1u66 h婳cay\E@V\oCwM@UZɊ^6{%K2 '!ƻ7cS M36DoedyjPjE^ ڬ F-qrr\y/; \/nYSrmӴ[2;ZΦ瘍eܳ=ryzYKF;W{77.C` 6\۪fɹk\v|{}>7ң߹T̷TǥL+$1&S|`&+/Pa§ f g픁YgƴT۵x[܀:F*f$`>k 'DB+7DʶuA go Oz/NŽ(q~E㑀jDC2d"υַVw wQeL Z/HbeA$vFBmpm n$d{U\΍6X<uÍӇ/)7⿾ܔ!r"/k:d]h~G5~M *!VgoC mTxFٖ,+yr .\^VX)zAe' >c@a?/<K:0huz{+_ǁ /bG29A^7 rDBq!<8}wB"9vS%tܚd}g|e:o6Z(&_)ZcBqs(ټiQʁ&a!PG骫?EaϏSOH@S"6+IDh!xm9Գ\4)3Vis y9t\6%W.7qZJHwP|%m$iT\TZ:tMynbCӬ)9U՜|t7]iE8]ߏ p-@Kk7頼j(0 myX~h0z*rGa~cvψ''ۖ܍8-`>|XyiAxkig9#O2]H<i,8['-,ב9qR4S8ڏqEQ|3'{ݓ1^v5-pJaw@͒7K@0scm{u]^%c<_9-WY%MIH;TTL)(J*c,9|IH4B3I:4 0Dݭp Qe={0ͭ0MP|wYˣ,ܾùw!Fޱ&V~nWc o^҆m nڴAy67mԯQBUº>o$˩:d_+*ovI3j05ey鍗Kvvz~A6mKڭ:D:Nxfnxz$#Z&zLF> o7(D)[l\nS7ů.} p~yi"2:!Z 0xIyyߓAx+`о_k | 5lNB! I Jf~W[G6,~1H\|m .M|:(GTوRWz>I_Y~mu>:͸7H5 5ᓮ*h?ûyFL`Y)Ռ9p=7*}і탉ɓ&1͖mv{Z>KyOcvP77XZ.g5Ao^&(0(.䚤~ ]l,H=|A>G#׹]CuPW܉9+M#ֵ(>E/>IO/_`/A1&$@y};z}Yx <3u&DKbvC]2,q0(>jw)5d4bz! Uؔ^B+i7P$=3-!Tcڰ_~Lv_5ߚxt 9e5}-r2J$);k&ef>,g L]'baV7nJW+Z(E1وɅzZY-1k72ZMZ9 1P:cPoAu8`H4au_]CR;ee[xP`&qá6")Ց^຤\u*v% mU՘j_P?Q+nnǣZ,C7/\6xLN럑Th=pd>h*^ ׄBͪ3nU74(&;(K_̇Q|d­zYcPQ걩 {:f 9W@; vr6f#)99hNh娆xk o@%QG% n?znCH#C8bpv81x #:XY ͂ t}X ?e.`\#l}Vvf* s0S&μfV4z`61tAwi$XhlmMצ~ ]L,DrI}u1!h q/첥"6a!07{ܛl@hDuX5 7I{v&]קyͱ4ll. 'e -ڶhJ:ׯFV6QNj꜅ұh[Vxgeg7HJ>[@$+ߖ ?@p]q]ڎNR4KA.1b !0xZg~_*~8pR-|#7}Mbda`x-@nxl;7 ҄BMB芆L:O{ht~Z*v0cFĝ%/qŋ1D5KoxRE3K^t#&j?A]S@̳@" 6w%ʵC>ʡ]Q63(z?5rUr6[*&_?@#`Qfc(.Ge>2_I/yUD"sh7J,SjrWk[^ų:[ F~vwDGLDB{Jbbol:AMƇ?&T0BbA6 zd֨y>! ,Cov}Q\ #߇$@j/6|!}E˕ڑ^s)B7 4ԟ6y#I\YLu%(-x_n[S^24*є H6~6|HD7/j&VtC7 .KàTպx06aL tŠ:eU|;562:Pve"+jUL}grH1쥑q;a[4qX'Y.wG9mƍl|mC'##ſ 4n߻)q]ڎNX*^BwXkz=OvZc{ =r~Zr>?}6~]_n{cAzsEB7|ڣx-fAH2ERs"8_-{3nMTKFPO9zr `ӃN.McLT^vm(~svJ@6YoD/Ld`F&F$:`{`6EuAmC?aчpI݉m;u0+D̤=VY|ﭯk'tצv{|2Krҹk3uVozzSx|St]O篻ʫ뫚8;ۧxj鍪Zcv0ʹI2Ui5":h4= Md5{TH%:z75"{ضDs zw2[3mWwH]xsxٴkPM|l'L" ;wB֞va@wnvK$FTce2#2Zf)U-ޚ9@yE=n=9~䇸&S^[Ԗ?&9Qۭ2J['RnO3IN61NZic0޿.@/Ae,ќ?eM~o.3,HRo|:3>\oVD NA`v=gu#Ķ̊wi2!|ty:<#b8cض^Om1 4@TP=eXz _@5.64_-3I{$̍fi(![,zkQh !Jᷗ$?mޫ1L34FkD ='!05[x6kRQݤ:Ќ,lTv@vUtkZTpB̿=wHC #wO6*<H g+K<<q`qƾkS`E[+}kbhB iԊKr7嘺z:vŽUWP|3"^_dxfF[n gB.MvAѡIs^YoN -ِjsA7KEIv`ZoRdJ_fWSz߬/o<H*oȬٯ: _FFAr:^wDH],tv 6w/yV(h p."Q>oܶ< Ư:B)sO)Ց^຤\u*G}.:Iߒ>l=OV0->$ٰf~s -ݸ7f Ve{ֵ$ϴ Ώо26Y~e&)x{}f[d+`m(2?=njI%Q4Yr^{ffd/ rȒu?jM -rڠ"~F*.,#RSfKj3Mv\ a|б N+%[A4 zb>ӡev9}mKӷL%!E'iGr#!Q|s_\j9~22^&tda?a$Ɓx<3y兓п2FF(bcßj+6;q5[X=xՠ IDATh07:ҵ27{C, F Mniz,4h[s30 5'g _<܆'t=Zsc6ۄke[ 8؝oҵf36 tr*`6#ShF:ocnЭ5@;sGP DPD4QՊb.3uP?p#ஷcֺum$?v{ξk9>&sy:c]$_ ,x<at Ky* X5@RO6j7PK:fLρ>KEZʳI>dI2YA4}\Zfse.ژr_\ץTZ ڮP;慤!Jivh-/%?W_%] swu" &9z*r7rlzOzYg9Qt wk>C6ک6E+/vYW`z>1f31Z 2!i" wVbfl{9;{Yg1U$$ 7u"l%;쵚3rYqFqzs+iOg| F3ah~<5/Hthwh>]lm+<(>֣6l;hmKo>{@vk!:e$к1M/T<8J3;or[@)M>΀ij.e>nợ N#Vіu2E$[.Sf֜YRH eFGcJw!b~UC~"u~:hbqʻg-tpo f<G@0PPh )Xр!c^Bn"F$ #zK~Enwd_|E6kQ+*]fEy:4>߮3%jt|$ωR' Yֽ1#okr&Cv9@輻 Ad$pBTHjX|87F=23eAƴ `ͧӕpyMTpڧ_Dz!_>^8<4&Ýя<$Trx.2WrW;kRGr]-qY]}ɥ(>tV 5(2?3zy_yX{UgWnS٭W}QPho #p({5o3tP?`TdmЀth^YV2o"(fA" /h>EhJb0ڥ[v=fK6VCg x;#a@!wWHwn/-sѦ.mU' F U!}5X|uN}܂g7ΒvHnIkQvw!(1'-yE)3;A+,#Y&lQuh(XT :;ZIƻ1omhMj0v"U|֮601?b7~p U:D\l$Wp8pǴ@Eߩ}@?xX ^8eߑ 1Iʇ>XI4 ^BFxaE\69 *+yQ~[5f:sajug٫@EyJrY27G6(ث|qY֞nt$ $&L&:B>؍W1G=3V&9zŸ 7$ 4F'΃?xLwwmHlo(>|qY[ty#˵տy:Cb%\ @vs3$'./g}\ZO1;ӵfy74vv"e=_˿}myZXe3)%pPuwb'iQ(*/B/Nm1h?"{n&} 1h4KrAuP7p)} MF>ǘ=49&h s`E\ȬBͻɇ̊3`W2N4Q=nE6AE1nGjH;0 s04r>q>cO =_i4P$mFȆ5x&Yf?}'ZTf=|MSFX(k:`f}yiOBRzxb}{ $88V`e_i3~ou8e?a~|@BPzRڔr_6墏фW!+,fӟD9dwG˼>niNk_V:7">VyGNUhF E54 Et*O7f&6J CTg ^hs0#}Iatu$bǏwU;P>ь]&S}Ð.ۧ%{윸c\)U͒V ޫ+ăт7,rch]0_3)~,T/徶Bbhm @"%t!wzXzFvYg4ĽE2ۤe؁e;s!7+Sf+zT7d;7In"|X:,.Ҡ&)/?uRnK!9t|O2@%C~A|9iFÅmۊȉ*83w;I~SӺu&mp~Z?wY];a!,8i HiR $1biW|}+Gud}S_9Wk,EAUfu'L_))A/@^r)}7<) EvEo浼F^͆:MҡY&I6t9a@:\uugdVć*Hh/G'd? j<3?|?ۂWn7mRT_B E?<U}s88:,$hHiR$%[uY!;Vۡl;L e$)Q`H H =fݙ3} LWUfVVueUee145tѥvT5tk{E؋f%H*{@쑛 8pf?"'kIԞL76(З"M>dOH6I|XB+/? Gz ] ƒ? qMt_8$Ѣ!w*J<52DR~Ҵ'g9QyHr@$]zi)%|ckG}-A2ZK Zi1g$kӖl[}lGݬn߄)q3К e }L-(?'ϩ#m n'֐Kv<qz5q]t6 ȵ#Яv>HGo}xྞ~fEȷ׻N=Cg]޳?W<_2 r%f  /Yi?`R&D}>,؈6@FK$t*qT+Mk^ .kOM$S#nJ_5t;ܗ[F ;Fp8 hΝgہdXޡ~W]v7nv;&TfNuӭG#EIqbdx~doOB4߃qD_n3{G@q o2Fnbw~`;xzAG yL:4OFHCڦd__g8nC:WxQH׃&3zNtR3sɫȍKZ9K W堥/YхGdz$S dZ8#8z>w]4[J9t["an>-zP$d $ Q>ri!VOIN~&?8$9ܷO:*rW;_9JgY`gq`u^*WZ9fs ݯ\p@ӏ:O@δT^#S TiV~ е "#$z?q7~nm.`;X;"?~3KL#V[oo=֏hssL ?:80GF;@il76l?m90 StlI?KV}?oɋ)h$͒n JQ@ðu/ n];w1VJ%U!aF4+@yЧK'`A_crZoyAHh| sesgZ i{rm1T14Wl zZ{:+/,bQ0&@77ؐFHٍqsc{4oc c31n4d4ñ%1E3F〆k~eϳbt؎z>mg=7Xo^rZC  M3LJij3tIJ3&e)x#"`TJ8%Fc%?dzTVtiU}nx)& z'uE" 㚿oѽ7\N[6_Ԏ݌ @?C o`%SܒGݨ]w:rJta,'P0#Tc UC>!ˎ; ?зM"̀}wؼafR<,K< FcZmXO%-=+nY`I!Pz~;x7, X9ڥxKu(]"/CYr2tJ| OH~cnE~ u@"LY;ƺ<4ƽ@Θ?&?FoMtm!$smؑ ^ ^W[FN&i~OsOn nN'} uo1m3oΝ^'n[3> Q`flry] ujfhnBf8TivNZ#&o ZmYjhЇ׀v/1z0x^:7/WeU?\T;(֟Q~G qn9aЁi!xIxk _qg{c)c/BWZFMr7 D?obs(Yp J&&}&R>дHCڒaА]JF!@5A$/{<kރJ}}OotLZ_#5C˗x49٭t5uWLuFö?7H1oMN#ܔ S<1^N77:Wڻ?IJS:~е#᧾C>C?cBW3z ZN6kzRgp?=3"p{GX`[>1{J<*F $47si Z=H$uH L_Q /\p>n IDAT.^v&'4V?,+=MPdRO?!yK),k0 &<6OxJ2KiIRkϾ}BeF!5zjkdhėҖNd6WWv`@D?(c]8yMׇv{̰wʣB} X23.nd)::3_lƏ9P%MU'LN보RB7?}_tg!#|ccIo8a`w3r-|p !`V_N(h7(xkF9HsuhꝛWßS÷!:GC^|vXs?NN$zƏY6_pSeX`k * +z^P<-3'!o=z)@#rq,np(R7,FAq !%1VQmS>sE W8s*~r@~7}7< ! :J۠Is$]iZӵB>?')!g*$|pZξ:ZE0?SoFD_;[+kYZACSVKb4]yCrS~rJMq܎"?w|oGY|`Ը6G!EaymAC;W~b{ t"2@>ڼ* ղ@aʂ2&2K: M ٴЯ4}&1|D!gA} 5Z9#3_ [GKk !\S#n7?* B҇^dͯM{#('# NlԺߤYġFp~ri0 LS?}pDc=o(#97AN\Iގ,E$E;`w.V""yuNsy!&0HC΁86/e,y>LϢ'e>M)e?st `$`_) VOF6㦡x[j0p+ap5?ڻ4R [DSq  =$n8a'jYa0NN }GC{'!{yn෽A[(@!|Ն@NόaP ր8z_Px=UϢ6!>\Zz=oyϢ3SIDBu$% M&\ko/>=n *6Iuph9-z [[+ [>8秽W&iht0d&"`8z? `H=ٓ441Y> }6VF$)פ4f۸a/HA@,M&z$:yN׀#)-\ph`i9ݾw|7k -aזQ}Ȕh%\Z##^<mO??B|~,LҼN0>6ggW#isp}Ħ!(KPptA!Iykqõ>xwx薤EE=}sJyo-$CRoW3Fp~mnC Y㺿7)h`=haRg$S3bTg *eC0<6z"n;gyfR:Mra<*eY@Бo"+jd2k$yR/fYL0K s0xӐCGlޗ\YEfܚt>Nf MkW$3/іI25-t5uWܶ<,9Qz͸#o8A^: zָ5xӠ4B i'L:INK>aӹRQ0\?#{ϐr~!}v"#W?p,Cdn"v:GXgo?v^c?7H<'c/E1 yoE~є;tݔUC["8mQţ|a3rZż'"L[c?ߣc~p0Azan <$/eO 1VID6OSJ$J4tf6ӦP.+Զ44{H*G|rkxk(LG\6s?ij%P,,!,s\]ZZ:EƥqrĮqHOS^s?$Vd%u s /QC~cwܤo(MÔ:Hdߺtx+cC~ %'E;GΌz%wSq@c`E~~n߯{}rƞxL?)4O_25uz\N\_|9>˥Òy6O]^pL<F-u-9t*oZZZ]Z2  ]NWvk~ Xw_>~oFXm4v;t;1]fs Ck\!GޡO:0ȏWdz}MSC$#HgTQmQLl3 6Nc߾< s/c'k$ȸ\Ҽ>'py D46)! RV&}+>'ۺmЧؿ3,̂*-raVW/іi Uc$u>?Y74GݹdߡydZ0R-;_rغ7$ࠍYBUL۵%1};!i{zd7he݀#x43at1 g)8#Onx]t}8x['_>:QfdMIF_q'#P-q\sU>4LxLI/!~w|- VVË %%^-m)S*ݽ;w8hfrzzhqhetO{tG#%z4c&Ao3XrhHkj,,?mmA4cR7_MtEa??ǃƢ (d64OCu3 wдi?ap?6?g(K",UE>Ӛ:ZijՖIWNFGy7n~tJ"`@^x`4Ŗu]>iU ԟLZå`2끏G?Df;?)w¬- O <G>] kÙxIؿi魉CgAfs2&aI:b-|Tq;8<3%Qh >nͿ螺wN$ ?-?Lz6tzK#m=Œ@ǵ&^Fn{T}-+DÎe7l_ozgEւĵ =TO*EF/d~NVկnV ?v ö#ux|t@C ؒ| icG{G[`w%9p%L1\{Ѐ>$=+f1գ _(cX`0,a)rmt8cQ2~ t6':_`}ßƑqIɽΉ|GB?}@Jyv%q#:aFI g:Q〉O9Yҥ6:^^y~>F^ !M3#PÂ.mזּ/cnef =?lZ#fwDV~Q}GOhC[BN /4-2R=> CLÿr}`~|jCF#IW_G7[Vy1Ͽ^sG>|kT7HBR㌘E=HAO ">*u:.{<7fAx $ 2 mM$_#SSɓ%R>''SNgpGvz3KsLۘgV~I)@׺-1)vaaE&3![CBLl:`(>?xcpk=w07)ydFTF 3B@U9C@,\JHש X[@(;tKȫG̵<ƬcQەw5nCgHoӍ !`Gj]~mB; &F7Ur\q2Mߚh2_ၷ;!.K 2EO;;\wo"Ҧapuܺ/ütx?owIG/ 4H Tv@2.8PzVQ0 3H8@**x J2DKI)=ϸz>uP-kh͕)Ѷs29\^[_ru4яzƁxw. VWփ| gpZYPgC`91:Xo01d $B u(a{/L|`Rڸоn̋0Xkq (}(gTTw4D7IfNߚd%ル8Z֮ mŸVtvkmg:2pKWdƠ3tD:2Ĺ9';ED1QnTeFPvzwP5X10-l<üp+5|s7-Ckz^@Z z}rG3|I)~ d  M Y9:< T"&]YCӚ!Kre>su A>} OOoAAu#}bNY 1T1 %+q Z@n(G&x1~?Fq75Xɀngv0;}EKwao< ?I0XCepՌPs4~`?}~pg`̕J)iM''ӒɕGb0크 p˿F@l#SC]Ɂ[buYdpm9VG%2Ȟ %~?8Cnwq `W_yE {`#0?>i(- DIưkRo#},, LB/z2{# IDAT[+7+W`^|ƃwq~`ԑSяf/lRk4|N_ j6ȵ/'a dq ku\Q0v8,VIB_#%\> k(̥id%9ڲO!*9s;$ȮF{ʱCÐ}u6#l]H^QVmK>8bָs Ϟ%yH:~:fgV07d ~NށcNCܐd8fS-xv<7''ȼOXRxJ@? b!+`$O}LGidi4O%4a(DZꃸ3j`IJ@ Քi90n5 ji'lYb\{4A]Yy ,Dmo`،~MɚJ:Oe~~C|~yWf}䨳{GbxŶAQ3(g1`Kӟ+rP8z+06K+.SK- `Cy,4|? g\p,#c. . 1^FF Bs 6`^`۠Os"K[D#[_#DD^Z$ɑμ1;<<,8 x|GF~;7ڿ!yFCÏTضA7)0!"r:~dق]d1OK {H|w`^z~7i{o%lQ:W?/[OFwղ׾L}lO&ӆm9f뛗>:E "x1~Ք͡]"JSme9[;gc7xװ1h0 n [OzaX7q$~p gM$t #y}>?/tK0~/a~[ kI$ 0%HfY`| 2:pΌYcf_+#c,'~:(uO {ZGkdʴt9kxjhZ:$|I-> f9.Q8x~"';K@Fa~[]G^:Ct ;pvƐy%Q r#3q@>1 o߀yyKG;஁} 괼%C@D$=$Wmn@cP}1G2E迦9i_}ƒ7 $ . ЫY5`_+c zjiyN*O%fD cD=C8ȵaaOz $ f4d6a.xl5<%%:$|Fy`_)-| LЭqLiG)'~M@>dЯߓ"Ѐ۫k:]?!aQu?K#4PѰhw"pE` !]? |3+\'$ yTTȠH?@YWnJjW#?kh =Eà6:}Y@!$_i@>e5rL$GӚWßνcu{ M=rx!2OʏD*,מo;$~? $3ߟ[_u#?\ȷ1O>a_&H?9Uz?g7v}1x+^ CzY Ǘi۠`DF if Qm KK54 9Թ!pЃk! $1YVS>ikGTO.1gyɽwމnYo{82ҩ}ApM{o$~қGM)yڈUGF;&(t a5|89ngm~]|,x| ̕0ס=NzPOHF@'Sмmqq N?@ſ^NOvQP ݸV5:kk@0Ӏx-g ̹8 -3ѿ`v (Gן ~>=L(ڂg2tKwJ g0t8O Cx2kw ~'wTuhp ! -@X4`Ɖ%Q;btNor4C 8<ׁqzҿ]_|j(ʳbT>aa)m>gDBáT'}! o+z }yG ^d5Ir|5e#sy52soۭly{&dMɉyfL?>j{Kv~@; 3=@\A==m[/K0Gf OGQD/!Z΁Vv8@x" 96e+җ4[D@?jutV3?@+siC"oֻ-R@,O},-DW+3-զKєry)o ?+xs;G֯w盛#!9|ЮH>)9V#vq ~ ;cOƃ~<^ ~==l_Yܢm'o;U2*? q6c(TLMpFtd]QPS'.6y5$ z(85D:Xlƻ֨(tOIUΩ~<5e-9t*oZ9RS-?~a~ۏNՒQzJ'ې##|?L,O|LG>-K֭Nߍy_yy+OavLg?{ DS,gExK|\Or!Jr'fr+뫭G75ӃT/vGy>՗IyyO=:uYY@.{B0~oQ"k -raM u dzMw{߇C7am<Вن FDaQ1pGN4Dsnڿ7DOco#u6ϹA^C(I [\% ȲBQG $ ӳȷE@etiR]44O`(L?-/_8ߠ 4'+Ƒ(ċe V]J)kMGV}%2ͩ76Ws*W_?w5Yx<#$f$3ܒ@''?)KC>NAb76noo؛yg NɎ{HƇuNH/cѠ@W+fI:+w DIj;叞qi=\?h8]:X_0K KHqNcwu4\ .2JFAii-kxJ4Kun2=8?q (yޑm"6@s`<3ҀoV8b\u N>}%_kW;yzg~k U*GY~_0 $FNNF Y ]9U1h^aP4&A6}:/-t5e^Mz45y93_ \Xx_3mج is#gvۑQg}[Yȣ `Ma~2!pWC`Vܹ |f;gLJ8@ҥ1єN /ز| ҆@)~@ Qu'3җ34@/!}/mLx >}p"UNӏ`xX{s$kWi$9iVȎ\/{OO4pOVV[3liV:!cl$_q5 ɯK0ȶ! ky}8`DR]N!W^Z_maѕ?ws-->-ۿJDS(Ir&OųԶA0c7fJo&yz2['yiUi=&ymܳa r:NSl-c2i}LIX~_9| {b9ェM{OSgIF5oVٺ Jh4esh%^)ȝgξ {7b+f̹#G=ȹm7 ?[{ց|oXv #130_zVV0t_&iyKAP̥]&W_+>PPl VD4I: B7C}^v7~ & `вAH/,@ρ@SB+䵺he,gH\=;z P/G$frzxϠ9 Ln[?Gyx~Y+೫i}w>>3~slj 4jO ZDމ!`)hFs2S*Ց[\e@j` ր:W a3ק/}2 0;Kfb c9zӻC@C:2 r|j Zdꗼ%>,@KmJIQ=S0s6`z@O /聙v_F5n,¬@Y>} jhytEFmv w~.xjL{Ofp󎅫~<4Lg?˟^$,݁yo9W!4 C/3O?[ٯT 4 _̓Bsy9=_/S+k4* ;U 9*^£5 je-@E+#'mQȄࠧ?(et JPo{U|8,y) _|5xG-ɓlk%޷ ww|_vFcǯ<E#F+_F@$+WaO_[#;TΦ .>'t{ox88-U)%Fnf@>!I3"g(R TN* @<)Xc4 M4?>K){߄O)XedҲVza1|c7c69}&+˰{8?ny#+/|̝]Ogqߑ}{4|NFjL *`)C +L0 ˜>9ڱRoKWë+S]syW])V\i5kimb+7 3}7~/\[.RfݟxOzcRXuX^C7܌oLI҃k2!?d$ Qm"$$L=EңtQJ-;'{Sh }z Gc0߽(ld ,(X+G;E.ǧS#7[Ih#{}faK(,#aߚfw3 |ݗ`__>y蒞3΅~dT@7'TRFBskr4%9p<EI&G?.16Ocp, eX!]7ui2y`Z`&B>jSQ鏍,K\.>wCa=/o{ xk1.'Mze~{8:`\uOC` My`1RK$G!#)3wYk_ $T@ρ7Qݥdt'9T_%4em T?Kcv C>XCVn U o{_>3ǯ'[w5rm$SkOо CeD5ENF?X/>΀J$tS Tߢ0DDSm$KQ|v= 5e$Ҳ9R:iv=r=tGt?_shw2ߧ0/i}~o3O㢓"5.Neqg5F Vi #(ZD? +X窰}IRGXC91ُ }$`  VxRolXVXS?aKRq,-6e)-xm:'vima |n W0et%@*1+ow8ԎQSmy'Ii}W1dP0eL3'/'!Oҡx@_C/x~sa`}9Z$<:@/b _u|z'{oJ2-Z4:- p¼ӽ/?PK}b/_垛LD/WnǻF6ᛐH|=S^H}i\=\^}R:$bπӱH3I ħ@/![`hb{(ҕxrt5el(hK#vaޖڒw]nSkL\@ Akxg:VI_3j^ si,x 8! 鬔ar7+W dEC@ 5xS@W,Q`l-@h4u&Ak̽ore'n:Ofv%ٙ@ b;b;b]?pׅ!ܓ2$ e/Ldh-R]RԾZC m\?i:BoNa?@c?$?KKTAD;#YRjB4t,Mf5 s Nev|^  / Y W-e`sabuK ֵdXv߆gp+՟ STl3 nd ??m8o\y =[3K?63n2r}J=S }!Zz 4J0o1J^H^"`/hr4lL = _T`9xm#\B[`B=1k! !WJܷjmʴErc>ۿuF4* 2tWNzCn[#mzi  }/i,k /W04m0B>Wckv $SilLRTIq2ɋҿDS gtK8$P.H[FMVɸl-jUf܋%nV\q~o+e/mo⥟+[;K ֭@bzi闢[[N$)Y%@2,Sj׿:ؼeW 4U-, 46=$Q'_Ҿm:} ڇ2 dQO~dc: Z2Z j1[YHJ@^՛Q6Jdޜ!!TjY.|F\, @ FDjctb(W_ԥ%5ȱ/7!7̇m[[K趛Sx?ם5LR\~"ҴKД? Ǘ*dd '@a j IKVIyz2+%p_yiOw-_Z^44ZYs)WD{WvvŸc~^JR\sC}NG]![jrq?-y%9r`Y_Fɾu]?$6hu NlLM N:#X_V@],_L eJ45)\Ӗ#GYΒxN?@!Àr ]Ģ+ԓVÌ'}ɓ0}8k~x r[)kn2,)y޷/AW#SJ_h޴/xIFIO}7@tݩ6c$hijZb,%w MD[ǂ7(C0LM+LRd|yne pYc6X E0>!dxgg&kQ#F&M߼sB?  s ci>%3kزi\+`n>D(Nj1ݷ!M*>i r)ȩzj:l`'Ӗs>:d4b^-*i jii3+0{/x#Kp?sji-XNΛ&C 9v8ɿ ;S@ 쥫T1JW +C@.6Z* &!? cH. /OwH{mbtD ܪC@&)-U}eAtCn/k|i 7sxje|W =^x>m.\E$vsW?Lş9RΒ0Ђu!ti I( 8K|, <@B -BoU(iDO߿(6@pBvRJZ[!^lˆdsxJmi*|zs@ o xبٯ1`b7asqX0ӾW k>w5W0\5^C[FQse,h Cd*Ң袦JZ" 1C[__24΅K4t5e.lb7[S0Aqߠ 8'BFfcoV[YW.R~(]ZC1](z_iY \Ttɔ=yv OKF=X.ѡ C+E:&t DݸVY9~MYJw 32؅th? >oa6p0Ϻp]ڵȁҫ[O4=?LBW+)BI;wP9QHHg:m̜l$!XQH2B^^~O<bgUvAIh%{O ޒnէKO{|M}&>:`MPdv+U  ^ie59Ҕ#wr^^C?@3=-HUAfY`IEc1\p\1,Zt:= 0>E0mh4(ʘk5 fVՑᯑ"+ـ?U=F~Um&߈Ϭ7. Җ|%xXNk̑z5rp)tdÂg"5~@2lX#r??0'"X\˶:$>>XoUkT#,#ra^}X/WOtHl~8~)FX(̎ivr>)mݲ: C]ݷ׭kC3rǏnYg_i?r}ki%zmY Jt5u7[^CM܌ǒxhi%쮏wEiV3d,ǺTWnF5覞P7G1jȚc9>%3fLW4c[bI%Aѕ6^Ƶ-{o2ka!yښRZ9KBKдo3p()/} >|i%26raFW ǑU&"?>zR}=+OGuHz( {݁lZg>*y܏m=WCs)xًSn>!o8X SARk.>4[jNkhroxA<; Q̎zBR?A׏DG5*MB+*-,zSpj+mA.WfOؠ|g0уOҕ'}RKO۲@/[ IA5`o]nOe@@s.J]іI25-t5uW!44%0G!+pv` _ґk+/ 9sݷݴ7]⧃.W<'Ϥ\EIo {ϜS]:$4u4ps$RZ9OUc9 z 4r3K&$a@?gY: d Aa] •YuQ.EmнՅv>(+[ &s ! /i+%;߃͝@@iiKs ܵ/Cp`-A,Fsll~׿EG T_n5koߔҲ@WXo+=KۢOEeVNz[} *+`lԸv9,. p7qL\ooYY^9y5|MnWе҇+}5Z%h4Tnu_9}z>0*t:غ-OiZBm҇d'+3c|hp6 Эwʙ>D(D Po;oKrJi$1vHd,y`HF@`8L 4R-9QZT'A{4:QOLNOyl9Y8hqLef^r?ӵB@;/-_98;[)jiK9&pį7\nEyiȌY_GE<^p㗷f>ʫM8y:D0M>: xQ. ;b>۷ ~ ?2UqN^ .ƕiZ䲗kh5r4sd,? S`i>Ҿ Lw/3N. @~:Ď,A,Z%-^?Qld _M7 sb04WG3^[hK_={ux+[2?'TVC5>j^4*D/'#f=Sx@*|?4OšՏh1 X zyioc3s[d@zC[c 9r[}jL'X\po(Ck>FQnj'7g$ \OtC_6N܄4+OUuξh@^A܌>"m {d+yt#b_371"[ƣ~/V:}c.>)OK2r>jhJ̑; -RrQ: ޯcQXedzoU ߅߶k_㰞ZlgvHV]{0:xν0oKYݲD9r pD{f;8]!lh524KD +Ddk2nvyweK=qtgʝ Pn38 C(i[yS+9\x˻wysgr>ɗg :* 8/[&c%%$ںrZv):h^/{]&Anϙū|'h++m"D -wQ!T< %25R| F/2?,II9}ide)}s Dih26ߺoUNAu3^¿M5OڅreNH" 2QUoG z3x>m\#W(f|~t+҆@LchZPo6jfj4zmpbB#ū6,6ՠg+hg-V (怗%\N-Z46kQ5|jyI<s𿤊Q{uoՙi}!'x*Ygj% r!e Fȧrrj j?rY#} KI| |d D+@oҞ=uPݲ4,0\{nQw0QB,@0J$$!扰xmlc׻m `0i k@1^&$#@ 5o{kխ:uNu}awUϩSuNz8ty( ɍS2\i #@QՎZ Wf/ȏY :K|@<")f χtbC3e${ Ԯ4޶I|> L9f,9>\U=nD+;m?l`^u }ױ ƗIr [vŀO0g+9}>snhs?2tf7hs $u%262&d OHa vc6 =bIZą?+<jhjd}2>cKɐ`b\edR>9<#!Q#;gJVxOd7{*AR>x@֨Y.zb)w[h§"mjc~ĵ }CFݕ&qĭWfw?7~8sd *WNL:œ*+EӐB^|# d^2k[:{ $)v d+7z0CXɞ@BFt?~zicKa[^/:Kue] 8lQ8>ZCf~Q @OUd+# 1v##$'EWf(#@QU@"a%2r"7(x4&*řSba%{ !dZ g1F fqۀ֎[N' 0ͅ{9qC7Gfb;sdb$i)<q1#{ɗDIŭI/Ph@{qc+B ]rS=gQ̷ҷ : /eYr=F/hh=mN&hW2h_>6# >0th w SduaÏ@>S2$+-p8$5qRcv[<ՀCʬڐEV 冰,}-|~Šg’6b:Dv"^MN<7#2i#0[]l?m|;㏕14_91O|OU-&]TvpM]TgS7թB؈plMFSg.!>#o}ж/C;7@`{ϙÓTQ#k8GFHN4PzG"# ǡE1 <_t:Yǰo3Q rԇ: & nc$`^Imc4R}#ÎZwQ '.)ǹP\`QO{U'PzMSH(ޔNqRM8>HHo5 K(â[V7݈}c{X-( k؆O_ai>n#<(/`#XḫEct&CxAwJҩ2B291r$]_ G VFhy?%_ T0H]ݞ`%K,,٬6YQK H@PO| l] GtfiIOr112b˒KN2) s)#j()(]$;Ot><`6_@\kA! `{eH^UXD`|ihCreo2o<,6 Ўc:7dK婳 [+kxve!2\<4ʸҸP''pe(f[köaٽ+u>zBY6qOBcX[3id,c^v>.}:3y!w9:;#!Wg`n=8t/F<*$2XN>&&FnbTrv}J?)>_l+=}l0XFX.V~|҇'3zvQI[H8~d&8o 4f֣1spP@8*6@c%2r4 E!G@C`b(Zm2!#ϽNuK ( @Q9 H,ۭx?9֒+nk3 cO*?g^~toGur![І#0Ȥ/]w֞vyI4.K')O'&-bn )(]$;Xz.fS2@}e܍ /JT!ϣkc{)#ǽrr:d#-NwJB @zo@ {Ȥk6fؗrdI}FIʐp(ސl'-#P G˓eRgd?ҭ9>6RͰӰpc*1XX0AI㩙r:BK2ԧܕ3DCϟV&|0A葯M^ qJNIӢG .ն@@>mQb@KKB#{%Cl }-pt:E_ (+OHo ыM,iw$X!#A0N QFu\Ǡc9V7 ú:6ڊO([XoG 5Wh?0|M?2VtV"' O\"#CfW^tJV|T<-b[+Go dT>~[¾9# +Vz KOZ@/szW.QOO_c#inSr 0s{JˣJ%2Br8C\l(Q2Rl'l 2``Rl vV ,*5Zc V1 ic`v֙Ѯv7π~CN֧wdoG(pC0G<5Y]GLl L*'l?'[{lՎ@p5S (Mխu6XS*< >Bk9mҶ6ǬC 6~a OF?gmǵ>ړJkTy`I%|2i6Ix1O(O*>PX(8*vZ/EݿeR^YMDn_=ؒ zNl>1u6{yC#c%@? *4fb~ߡj$ex "WF(ŕǑ!Qi\l(r -i/@R@]$~slO!;+0!Dn),W~d[Ti0V>}J~#vEN|nI0̻W')88Geni oέNnkqWǑ#҇Kx82l=$$eLdQuKq>Za\S~p!>XEv ((C.tnzgK~ۙ{t?G`C&\9xH>G&,N". I0r-Њ9}_`(Vj;OD ck Y @9.}X3Ζn』;{.%^|AhL̺d{lreV x7xLUIdR<NZ AkB؈ҲCb&V gF끟h5\};I]__±y}\9T"pP|1,\'U-PUU"i`U?Р[LwmcyǢb-=b҅~4>eAN=ga1ј<$#ٞ','LbeRm22r|i.>< N*@Um ; E[@NL7ƕnߔmaB."%8nI?־~c=c~8T vH啑#WH8iTtnńt(#@|>'P4 PHp@T  CI=+M8.\BmjkC '}w}(ᏀY7p BP<0?q(l?F_^SF[RstTtF>T<-|@תϏU, vNsJHJɰ݀Ƞ0%ݎ }et^e/0f=!W>{p֣nP2pYK<\n<$#3I-‡(\~)NRRݨ6^/15)CwԧZ0+5X'|_!,p2l5d=4ܾ 66POgY՜n;}$14f?*&j\;xG7(+*;F#Ia!VǑubm ڿUH2 @`s5h !|c1mlO@ 2=xJ\au$_}b`f1s{m-||fjsGp1XxHXLlKL*'Gd$e;mn(Pz4ъ_gX'mbe226\~f[p9XOŮ԰HL7?x2 NZczf;6Lb&~kdpmGI~AʉIxRsiѢ=-'Z]ًi,\5 [pe;2_=9ؐdE-zZF1ħ OBz燗a*sB;hPo 8qt/zQm Ierx!L4P:ˣdr8IN7|9Fh^6.%7ta$؂k@rf\GM݃׳q/Wow9?Nn%]O_M*7W=@Ep  /NI䤌sdb$i)Uqdr 4mWhs wq&, IDAT>[Zl HdG9 }|F{Hں/Mb8dXg9G <'g9[֯13wI {wTJTyT}VǑm$ĕ[*aߣ6^RѢ:zhwbl@Fvv + G ު6^SӒpgXW<#!SFrP3|,SV"X||za> #C-?{quDOlox,^}%>utWQW|#̺+5 h ']ny^~뇱c.A' 6}pYY8WDf [.?F4&$t#I7)Ԕi]ԼC1 D^6`nkFjsO{;r+ io;/GZɚψdDГ7%1yTe%CNI0\Ye="ieǪ+=5-\z !31v!,kOͬ93ԫ}zKT"%p>P'9{%Io5Ηhf_3 Y?<60ܕ O8FT'GɉKC}q&TN,tJU>?')Ijۗi,i3aUop۳;eƅqw"ҡ{u =zNLl\OJa; $֣kIO8F= ̝Q`RN|% ?d̺@GzmSWѯӇJ>u29|y׳Є 4}.a"OaCq\ll\R nM4 E )O,.')KYj񢴳Vj %xL+ΙfU6+F3|\ױKݳ荿)_Aㄯ 7n\ܰFpXaN<7;Nç"%G8KR]īQL!<< + G߫c[\%uФ>Ldb_=Ƌ>c`buqȎc @Ja`xmO|Y<~[xQ[>wǖsOl-5zn8~1s<~\vЃgﶱ5|Y}NC3[ޞOWA8 8ؘ̔8'#IK2#;Gݢ6+4PZrMR{>hb(; p%ƛ>! !P>k}҃ec-=BXHW`Y $ӑNcGqt/) M mR|_Glf\sxb1*8cp~~W aQhI;h;hŧx&fuMF D..ybQ`u-\'omøkpVސX&y˜QG+nH~.H䦈ʏĦɤ}ryoHv Xc NKhW~ٍ06RdT3|ቐ\L9U@u\`=ޤF=E}j'Oĕw0o18caӘ[ç[Հơ@Mpv4ƫCXn[,u8t~6wiAs~8wؼV>^LGJIU9e.IZ ly6OC6m%AP7}yCƣFTw#jCq:)˖+b5hDۼ3$!?h5p#?8.I3>6/>!9>ct#A ?GGn4\IO7 ɦ|3wK ױ yc x0dЛ5և-O hޜ6IC_]+-@ca^8gL׫\ H%ɣd#G˕/14_91ORq -+m'c/v63 'KB30;eHqΒlch;mXEXi[+cI/;[7UhJ)n t+߸GK޳Dz,N+#K}qi\tǗG/ޠN.h9-Ҹu% ntcf>l^8M$z[|Lűطxt]gW W&l8W<*vP4 ?%# w$,IZ/10yA1`æBzY½pjLa%rYX.VH˿%w[2{D)@n- o$aqux\TܔX_98#4Wrt'-{ߥvnƻ1R >~9aȎ#\ua,:>i}gDUI5$GTZ|l|F =V$O*C"'oY1i68eLd9W~AH[ҴliWh y3 6 B b.dZ.ZVؽ0<7cPxK-0K uQ2ʔaGȐt a2(|(6uا%MP_ WgZ 9g|oIAOo HU%Xj4-}j?cZC:J]_aƽKcdQdQԏ<(n:osEUsz zJc GPJP+KH$))Y:clhE8-@| 6 p~2嬽Ǣb;-A V5$a)W`V8mU0\%/NI`]$yTg}õh8Kz?FwD71ؘ<^~ @[kG00ezQ%K_X0Ptu^5"+>fop ^e<QC8\;h7頻F{9H}mWG0|%ͫ#IKuz=eM+P_~τƮ^bN!ǙYONKȦFtlj$y V21} pCu iښ~2aԑ wIY)p<6LW~,&6ͥO&?'eO+s*h41ȁ\}>zsq M`֎w]ըlX^l[ZgG9vʔ7啐'+ǝO _MZNVAy|

    a>b>*|>>7D8TGv}"Ƞbx}q##+ۇa?~{ԊP_yEU 2|2ro_>1zsU֏{]XmP[H |n?y錧 a#jWo1aW@%ͣdP:#ʗʈ-K*~ 4vH:PVr'GhP& .&K`#; >l2=(v{uښ|̪YFaվao~Iևj_ehWiԱ;+KD%3TG sdpdx"1ه810@NW4^ ;X9718g8xpK邨}jFqk!@ݛvg9Me'm> ;2LopTysʰMkoSsX:Oς'YO0:úB":^ʍ緞qҝ݀t ^E L ڎЉ+ .U4@ k~sZV@=KGJ^3(J4oX2 lN{"\ o5FÿoIz:˩wcc70鱲88 Li<#߮K\vZתƾ]t@:ꫛ_. `tn'n2xI1KlQXx:k[m I8뷯u)>~vum[a__+-XvT^L6ʓq:{i+m' fˆ̼|WG:(V邀hlNlUr-3?ץ:p-t/6>|p,_=5qtNCዑSE.SY@!̀i`ū.=B3zxީz2N?cym< ex"{mp@`Xxoaedq`Su<Ա&'AMj9 f9;1`|1yFHϠu__0{.Quc<ٶ}_\[?oQ},.#+&qǾT;R7m[uh8ĠӃ.`g\efTrgИtg~ >-7(y`V7ȒHbToKƾH6 u>@xv8{`Ex&΅2gӁtr`{s?Zq} '6 _LOhT}^|囼&e8FN C<}Aс3ΰ@ 5-Lcv/5Qu6T׶v@'cYYR12%rB,4.QO5vn;܂Yz/87]ǩGZF _ Cv XaOBe|m"W\Gq[G[׶L_.sx? IDATC2ʔ+/P݌T;BR7ochw(L=213%[Gva vLa"Ր4&uZUll >d=Xo:JLHtKb$rdx^RDyӛ֫87S/(>^U18!_dF,f>ѡNŔ}SfOvtaw?~/4VϨPDỳ~m>;1HB<lhSpEC+ T CL^t_] #IOT\ .?gy2w?C=~/jq@ϋoޠ|@YOՃ3Qc{A\#u]{}c@XF!,=b5…6cdʣ?K~P$u'O=CȾx7໡|IxS(||O̖z8sYӱN뺰b-ЇwCW¢s2BbdqyWWϪ_[j [?W}@ <_߀Uq c(Ę;pۏlk>6/&%*YId崿aaT;H2e ^, 1|⛚p􅥃[ ;U![Q>75d.A,Xi[Y}W]8aq+{tscdǑY= OHH M:e, ެ1gP$4.^ZַBGM泌ɱ5pH_ߕ{DU0u82h97=)@bR`# : N/'Y=<^~np$އqȸ Db =U=fc鞿[57$}Vߨ2a1a P0[}NԔjR~ϷkǍL$A|l,`*|僲鑿@;@~ܶ3|Xٶ},X:1 sD_#mG*xe^y 玙Qx)ԖFx% c<>\;Uyc@MQP=DvRgc@yIxpXN#PN֘`Y_R(h[_1}Ww}%CImpamԖq /h}K`⦰}|gm>R>CG/tpEӃ=z!݈FƁv1LP@.eYHϵֳ~'("J`ՃcT ԫ.jlKr2@B0x3y,Fs 50x ʁD[cƿKQ*b/~ 䋼6~nkCR`y]c8۹$w 4.5 j`yVm"NEOߣw0f`vӌ. Ftޔ>OXRO[-}A܏^);#@s)b[x>402~_k%F tI;-/C&tcVh\x`x B `$42c Kڡ;߮CҷKcywT^.\]<6JO-ȿ&H|HH[7p7/vDԲzOT~1ׅXc0=2 ߅g,dO*הl4->E(FcF%ic ep1mo:Jy%^0jZt%BjV[sBhi8F֎"b0M,RծlW~=%m/JpBLD.Qgc2! ֛v~Yp싨iP,1R[ǿLh{ k+NaA./+ˢ2lCyۣE겱%EIm'xoͦ놥nL@—^LeT=gCjӆc-A,"U]GmBrzIt>`!};4.W/ۤ^T//E%Jj:xF(:nd/KIxL ep#$[3|XD`M W#,^B^Z۠qzQӒX⤶^!|N#{n (L/?딜<1kl%pMYHmIvp_BcziIS9e@jO<{և2pwp|3x|xBp>U\g{a'ad<ȚAM7u|69R|vXf'IlG'}} Óot3iYPHm8@c!\"fey2uILȞޚqڜТWy>@5u \Ǿ4>Ǫy~V9Q,3R%[ޭ3j}싻8ev|8 _<2u>N}uP8ibx>Vk|֩>|+'x4jZVTo,CRuޫgmgdxnLj}{_!XF'x\^ ߉^;4%@Kv1omzTv\,-3D\/,#6ȪGQm |RW}5-KW1m GA㓽ZhwŻo#nvy>>ǬŅ f:&ы 0'qt?סG>,ܳud]smYCa+@v䙵_T,s\ny!_|#jW NwMM g/Jt0pq!Mϼ.k}P^)hlR\uMmW" %m|Nm3/} Kƅ|B1|Ű֟֏T. jZT;+Զolh\ }ξ<úh+SKF߀3~@S`%0k aYH5znDW_/5hԶk6Ч@CИ՚21pߠřuʐiOxtCk.zͩ=BX5w.y h+ZM2uxѿzSյoAMՇ Rۮ=kgm4G{>(ެ}'g=qu9o2x^z'87)|?6wҥk4BL/w%\PpѺ$ݩ@nvTg+ u CcG\3.g<0˱)<:q굠SZlt 6d7 #uB.zOO6 >߭Pg8@Imv6Οh3m2 /|w@ 06RWLxH)HS6( kX}*FQ'Z}%W䋨逥8Imv6~τƗ Ǡlcy1|Dy^R#w ৣ:]߭tϺ>~,NC++ q[ ˀ1 Ax_.yj:>PSԶkYͳ6^"|@k%[ILoӿY ^hzdrl^h?>Kxx˸VsɏݧHm@?{y挂f9v<_^~̍Kjjģ .YOx@~âOHM$Doy}1~KZlWj*vm~Cͳ2 i̙ 3a8f)6ov8?koY d6s7{'\g1؀&~ZuhBFoUwVTj&/mοͳ6_/dFR<$X'qBgK78S3:_̢_^K׳~ 0 Z:':ixXXmئv(: BuTo"mahc.9FTI#OS9 x|x-d<j/)*%Xx%GXd`mM[y|Ơĥz&6mP?U8tvF/,ў'գ0%̆`|S^/"vj&m|@6|2Hcً3fv<xxC7!9NuI3gc37e!6q$+] hnB7?ߝT) mֻi1x'šHPyΰ]e>84[1CKCUa%/c_3C#tהQgk _B͏'.px_gN>-{(#:^N?$tfyY:/k/2ߵb;@r!6oSo|^SMT;5UBj.kFez_79pžr+3vЃ= ; \F,=kŚ~pȏ}R(e[|So|NTSET;5UJjx6ilFaN܋zx BBr:C3W~L aMѯg}>,WQy.@~P A/]\ pmoVoza}P4R[[<{\ 3o@/ 9~ggq)d#Rʸ9:#uml['wAS>DM5 j:OO?go>Dk5Lγfj">ɻ<Oh@5,WPv^۔y\ @ M12[ 'KZSMQԴhyx&2ShvƲ;>]+&٦{ܠ:i]IX tX%;i#_WvYO5T-@MNj9p zz_^\ɓ :`~G S3`gXz#[4Hӷk_~l dx/4>eXSMiI2s6?_2tLKO$"x[#2̖%NCaCXeBg3͗՟iIR݋kiiQznke VoL<>+{A>GyA) .'3`YiuZ>`u/R K%^9[-v>QSMK<- ݜl>Az3qhR>6 @Cσ {'^=hQ&Xԯ2Sŋ% @MˊԖ s7t>V]zG0:%tu8~xÃ>Q2 k߬#kAV:W/Tiْe|Hṛ7@| O"L025 ?إ|κge*Gvi;B{_.4neW εLPӊ unUCͿK,z;O>wPnrdܫ gx5W+ d'#* ,u1ji SԴ"I<m>: g8*Ľ? K5qk]asc[ۯ-/ljZT;5xR74Gum>pB#YU]L@;;W*Y ç^=-r.c?ނ _ξ)@M6_[oi>@4OB3ll=YU=3&GsV !7`(0We}[][V@M46/j痯dȐ<egvBFx\Hk]{N`>l]:3[&ޗ2QkiRTAMA'!ՏAď Bc0 au˦ iME'8[|/zw7bM5|j"H}mSu~E~H1'ẓ^G?fzf -8NRhm@tTSjJH$]NnhL?wНnm)H\SJ#'܇, wƯh<Q}erkBjnyAA?|5Vadv(259y1zÂC 3Yh܃ ww#Ý#Kduť ?2k?"CQdHہt@zr㝿byY |9a Ag>2{!_rIDATȰz*4@M5մ`vIENDB`ukui-control-center/data/faces/10.png0000644000175000017500000003441213635333016016336 0ustar fengfengPNG  IHDRx pHYs%%IR$ IDATx gy׺F3#i$Y.K Y`7aѐ8Yj`lrT $/P1RRe d(XClڱǶd[c]ZuniyQOOO_Ք$H_|{]vE\lzR?ZZчWJ*o[RELj3`. !l~zI@y q+M H33. \6H _#l J®t&U^q %W*?hP . ! {}O 3-]`< fߣ{x7^N6뤀J0~- LUIB*p O)m` |FWT8M-y˧jNأ"sĽI{hEN61!ti# :P\@k%}>_2LH`J}& 2xa ` d" ΁$XBFe|3p: S qm~g\.|H WVs $o(T">0u"6BH)]_=!`  BY(+襄9a#@hE v\<-#H"0izb` ZBB!$Io VD`sP >jLDU$E_O *@9 cYl(QHPĖbH,4D aL @tgK_hV=/$ " DDOcshNiP *`?к.NLjm*!e!XmLgR @- hC"& q$-`@~r2.էf4}Xl D-Mk @`@ԉMRF$U%,c`u$c`?X}   @?8$I?.\6y+әE`~{ @.tp9[|nk+<7-o+zHp9+z|=A @B u`t,XcCx74ϫ''PkN_y>uy9{?_=z>U:5}jݗΤ'~E%88࿴yuq#?E)':yXfW{xٞp)܇~}ό I$1 u/Hr"=~HK߾ÿl7 !2`_ @Ɍ&!v~ΟmuLu2@7.~ [FAN/!ؤ݀Kd~Ο AzIqlLgRNot(5Rఠ㧾^3]~ [Τָ&lW)IxOTKަn$ҙf[IA\$]M0aI|On߬6e d`uI/LʹKrټlp=$^ny"Zܤ@vC+mգ=6lDtۯGݾNhS;:p?%c2۾n-V]34pb@'6Adؾd@w@$ȕP ToRG ޛQ˗I"z9qr @._1ZD@':7ImNXZ$K_>m-. =qe\ #~ 4wKgR 6k 2K1R`y~DBSK(sKKXrr|,kKmLX"{Gq#W߹X4Ъ#~Jh$(a$/c, $DvwHFal/~4ЊJ~g~LTfP 16al 0>/&fLC ZVSS;ܻr˽ ,ԱhFW?E ^`5 &ʵ$9rO˽-8bt 3|΀KA o4oNgRMF&zy 7%&cMXOwCe{~h+C18UXJa&V0/%?0D pqͨ ͯaͿ^WY@7Y u31CLsu7>v@g>%d4hR>H_a@gI3 `D{0Äa8Ɉ T\"Ȗ9wIFļ+l~RD/2@dӠs{V3DW$pԯ{@HIpԯCd[_?>SҷX@bd"$?ѿWWϻfv, \T AQ\&e6 rH$RЛ?Q pUIlT? *I$&^  yT{ YJSb k-'ː>7wH%[{\źEp-O"}7O㛱[12@/C0[YIՖX8+[/H`be, ovrbUHtc4OO >+}֊%fFuG |>=,%}W0tؿZ _`3җavbhHw+ed L "n\,Q14@<`?VXkԓcۅ@oKU\uKDy8N>Τ@ۣؕ7>{3^|t*LHqp&^U"'z Åa 2?g>]F=p-?/X'F@lc\&Alm`P7 ۿ%@Ij ;d"•ɳ@ B16v8pdZ%p<ㅺ$0 oXG@y&c(f%z߲0.DG?PN ۲*L3?}fP<#% ܰc?ZX`PbV&?nW?{3uTO80ImhӇQ |εM?5S}>{'}0Lgrm)n^1DyVӦt`I <#: o%˛~=`&aU Xjˬi( yaU䙰ҿZ t{8>3ՙ::o9¨3A RJJ/yuIGK*< k5[IXxlYNh:7Ṗ0OUy0z h?,Y|w7Axhߔ/8af- ]?`(G!}>`œl|Ku`?lQ.L0R=7sR|J_qg5I(;|j}qE[`dLWΙ_y+H_>[N6Nkx5@6q ju#>X }V4Pn48,$wX0bt >vw@&) (}Y4#'4"{D& sZ|ߛ 1?/xb]7+޲U䉾7`Ϊ-/?}L%u ̜yXJaxg5;<4sMX>*i=6{MIp 4`1 x) ! ot쭚tv8Bixcp }K%l^.[73xXNO{:K7 02āvʗR[W +u|f" 3KC/6aoox8071wt'㱾 `K !m%i^z yj0O%Jd>^Cc =8]z)X_:SF-/ie9]zAy X9^SXiQۦ { T'mql_}z6K@7)bies^ 4`Yl^KL [ñ :80R^bBV R[Kz7 @.(eTX1?H*xhDx$H?c><$1?Hi$ߛ}kŘΝ|DǸ\6@<"@?m>v܉}o+yH9xg:u ӧ&GPz Na>Thx>2@Du0F~>h feo'SDdbYPvmXR$fdipp@sgFNίMͤK,zR$fDnԤ<AK,z "0cP<$@/mQJJڬ 'ꡗQ@) An5IzI>||jC/ {%BҷR ᨩ%3f+5eRNg*ҸCm^b%Bm$-06g%㇇~MU8JʰXț Sg %`p;Q DQ F0-A`{)i/ K?E~Z9A~I޾ ҡ `黔Q.SqĀRG5"`'.j!@U2iV6>$^" Z v>E賨IUaX>: 0('`N WQ.UZlau۽ FE#HP7vhԸt&VC=dW?MvC$s!O FMQþhP1w 'nL4BD1 Fl5 A"Ktь `" </ ŘOM7= }XŘ>V0"%n+ୡ8TcyISf=7r˽Ϥ?ĤbLDg%+r+z~Af?<{QjW I|@Gƌ V` Jm?0f,'Qv󐄃$dX^q#@.PJq"vV'hxX-$HN>?_ky`2=LGZ Hnܻ1VoI| 1ëP!d> LG!:*a@rbTro=J!jnX#8;Sa'![yܓ0T]s /[I+Ic* %/uiRq0T]10SX UW̦/hxIDAT~>W=ƗH=&0\xt&%{T΍Se7#2ro=&`>kjNfƓW+ "<%~ͶEݱ9Z\=r/-{H%KZ`9 l3sIj |wL۹rHئF*I[ cvዦWC6H9P" C# |'cM5=(r7rGմi$ƶt&goF&:n=FH%@*PK?e~x[=H3 @r@~$ 9sII}Gt\μ- aB! HR UZ:kGFz8I-oM¨%$P۪&]]YEP/@m-r@50P7L:Uy?Zlkjra͠aI P` M:R]SI~m< gh|@Z'#/pBq`ğ y5ijBGXulD[Quaun;ϥ޳5k5oPt&+)q?͑`yzO`|[7]M:KkkW'uI?fP]8}R9vH]8sR?=Obnc $@$ʏRR Co?߿p:?x{y%yP*I&͙7}^ Ay24'g00P@lB{a/ eb6Ɔ wL DUzl =HgRRax_PERBIL$HgR2S G :.ʣ @k"Q'ThN I q^1ڤci$(&p͛-4FM 6Fo.8}q7ߣOhư7)u@QaE6)8̀QPT|*US h,%[R*x-j뮼7M#uρ\ `(dB^@7xѿx)'OqyW,S7.L9mϫ#[{[߽)z6eb~ŋck\6/YͲA & >S?|woVNeh'w4?5 {q1!˻o\|E@/o/oQ{J?'{}'%lsfW?{naOj@u\E* ;^2|5wYN&?}~ZFw0µW׽ lۿJ(Xz9h㡼c颔]nǟdGH" Uq,+{9a OTo|ɀ2Y$I@ߊ/+*!}D~kۜAk_Lo}IbWI%*vqb߈}ew6Ǿg?n~ր+I $H/yj<ŤK_KgRI&ӕRt%rRvw=؀+%o*$y<5Ȓ{xm?,xe5{zTgDq'NU:0Jri"paL*N [-L"4 ?x|ez|h[ _&0 x[V JJU Jd^c{/e[`{/E"LgRl5H- )Ids.f?.R$t&ՓtE0Z!KW L>M(;}q\M4$xm~h:#5lRJn"S#}z s'ɘ!)aMo+,bB3&4I "=!eI Հzm rw[5|P*#:Ŀ7Ę@,uuo®}ID7+&q k%RTdD3*PCI.G}*7B Ä{zGh >ȏM$R `3!?I-2qLLQ700;rW"1b_)ń@Ԟ/,רT0f_)S&8У_!`G QJ$@NGZg f2cp ZΤ֛M;zI?c?"+~_oo,̼a̤L[]Ms䞖{[qxft@7Sv<{S7^w}!+b>6Y벫r˽ge4+x?|Ƽ+5H61.!c{Ӕ)v}Lj Ȇ! !O :VY b( 'ɂ{ fE?`S@醽πKAd? #W`l ʶ@ [YDh2T'}D IuTX5e2m3|aB3+73-]z*@sP Ze2޲̌A)?:*KgR^+Q0 h]P WcuW Lf?Kҧ`&+lbi9X/X"cܧcլO4@v3#ѐqFr_%N$Ljɒ{;>7GXkHLA\ \K-9ՏxH_>Du_%$j( F.r >!VuqS JV0 Kj-Nq.Ж3 zY$FFVġcsLL'0Slm;DIde@۾,V9/ 2If#HE&FfmG6@ %k.sd`FCtbR`x620IjʝO L >oJE z߉~L FȚc&f>-uu_9/ui\X/M[NxK;rr`o }j]SsmZJP;\x%eJE6u؉[7/fWegwʤ~.XrWȓI?gWk5Ȧ"~+F_#AИY7ouie@/Ih?x|IQӌJNԥ$:Ǟ!җ`UE0D/`?+}[7MɩbL"}V/!(ΤGK7ѷkp (ΤVȒ#\ IxYFlG  |M- >N |Kxa_ @3C?z:ږ~no?<lnTAPCɹ&~qoyF$@E@P'WGG}HP811pUv<%}_#7Ar3^͑g,#7I go}q@R ο$-9 (v|&_-"hI>W i> ! 9JX&9W i,l2j8HB\iõEτ3 : (|LPʂgBA. d55 s`';A l0TA' LjNMvP'C :;oqH"oӶ !G B%[L?6 }G1u,Y/kC3=3UI/O% xFJĀ FzMI`$)<obHb@#gBt&+Ɂ/BP[ϊ`.MBOpYƿ7bzĘf[dQHX:Zz[dLCF<@uo#'LjsЈxfBҙTOЈr 04( >B~f'qaH Tr`(CЈ[9\$*9Q-)hFώ8l,4^**˄ɠZ!ώi*% o6*Izb_WKM>;,X"=0ͯid㠄`&k&vSwc>ȇo ;A7 aH,%ٲpO Wү]'+B$+FxT573>uP\p^.P1@ʞ!zyTRR XH~PpjC<C&벋/NݶOPmo7ڷֽ&s ߺ'ޏvvm n|FS#W|vՖc0\Oi?xCϾ[ _uOWzo ϐxS˿/_]u ]o! _Ţ7_47Qxb~.o>  |n#{62?pK0?{럮xvCQ$8p~vo˯?ʑ`L2Qp]C+vaj!@Mzxk~}wQ &+^ܳݯNfYpŵ7]k|5 F"C5eIEG?Ҟe3! ~Rz?"@˘,ć} B$/{j# BdžB@8Q"@d>Oe/@Xʁ=v~jmW@eşgF?@X<ㇾm0< o7>e'GH}`ﱟ|$t/e~$j/e)ULg/(oH ڵ3W.Eso SHzηt_97hY>LD}⿮/~W_xC`*Yw25c|Q0 "{w׎Ƿ͘6‚ ^ n W򥏬 H 5p L hW/{ VάEir0щG94ZHu[YgMis\FP;ܺn6l33\8熿 AIBpk{ʁ.'!p+;1:`,>#JV Őݤ?kC?c%$@2,?׎1l2ioԮ)~ *`ፒ_A1 ~JGۦ{1$@Rp雏?,\N V?p{۔=Ӧ4iBxZGD(H O[vKϜ=G#9&N>>o _<@DHQp{ϟ?}Ѵ\$MqeLě9^>-7~'u|@2Hí^UgdBG8O?  :g_U '`IENDB`ukui-control-center/data/faces/8.png0000644000175000017500000004256113635333016016271 0ustar fengfengPNG  IHDRx pHYs%%IR$ IDATx |ՙvᆄ  T6Dh.ҩLUhbbWg:.P8 ץP;ڂh+(p+e_B\繼nMrw9䣵{9y9=諩&QvqR=tRZlR:'ūbKX""TS< aKORIA*qXq[H5${<諽VrߛY%K* U>!|諽/z^@bQSMb7O)>ޫWVjt}H6x#Q~z-%^R@h W|[\U,J@yK>|է%H28Tu \Cyk%OJImMU= `-XkܛдB,E46$Wڟ}FB ,`6 jS}6m`w&"Q,/{\*0 Gya fa(9h  TH"D`o*tAyY^y}جޫ ̥* 2h:kᨥ^UDb"APxbnhb/XmBH(?N~ 'p |3OzU&Ho~XU/HPw|ADA9ZXUHdhD9!@9~LG!@hF Dx+H"0} cZl( -{'0#p/#JU޴+F(o.N[%4 :7EM5 )$ΓgJPpW_$IN&B!M~DeH,eϭ &H5p$c T,@`(F4@5`$FX)`(0egћl'l*vQm-"h*hILv#oK1A͑hF?APcLh&1])p [=Ӡ*iIȨ,WH4B ~)S]I`Jo@5otH"mT7+Y6Se*fT0$`/ "$!/+/ \[ &)b`HBTǜxǼg%B@f?g/Cs`HE ޫ]ۣlߠ`۸G+{9t΅ٝ:u>ԵKݺ-.CGŊP9m*?u*.>R17AX ^tWX wlPoy-^ڸuUC7>j@`u搳$GLz+h @G>dD~_eD/m`^TH@:b$!:Ȩ>cCV*)*AhGyNd$A^/kMJ3jc.N&TІ$!ISMbRA+^ |! z˖ /xљ~Bp \pFC mK}@GJ*Keo/>?SɄdiƫblT AҐ\=ĥ\Lw" ( @nu?eFo H&wM$y"ȑl3 GA$K{_o2EpمWSpRo v  @-2O~(}HUO1 +  @H_4K 'K /jA, gg)i╳HG%vGw H@ЎDwƫbծ߄~vw HDCX"V#_>fAi }^xi5͕zPuA«-N" Ȁ]$>gB'D@N$5HZ HÑ`~WbZ%T1-.?I_Iy$kȲNi;fDzA;8(dmS O/s$Ho꽍V6:ǨQ`go_y+4Q?D5 Ϲe M:~vʊߺ~+жA ƏX)`.g 5Da.LY F_gQ>ل**M5 yoR#)?@~0BelR1'#OrJF~WO" Is_a@=z|&LPPj?|(H[f~Z'ކ?jp)h@;(EhN/iK ]e? .wZ:i4$f~\z~wRN˴e i j1hH*?u o^=6X \~L?)nw)bvK5S4Mښ6XO3f*;jIئUT`ͿfdnN!"YB+^ӆ6M4iƷ/hi#c<[uGKB֡C_Feݕ0UCя)k] F)uSzK^C-^^Fq⟉wwoQ{65g֩Mj8_mNgFKף:pǓjyaA$+GВ~{sˆЃNmnܭo]{I Vl]㛢nվ>SUXG4$+h1׈,#_RcʆxA\u&[9#?]cdJ@?TûX+"M8W? R—(t{OVVl[|& gA},WB=28-O{PtOO>=_ե^U!Gnv_wq_"/R=25a.L kO@WhGUNFM<\c.W2 <lߠoCΤ_LQq#cYoNz -'CJ`"dJ,\O5!+UBI y\6eY;DSr} xa,K& =Ɂ$&,89yd0~̧Խ碐PzJk'#ߙgORDב ˽ut=_T LIyGGI*!s^}M!P+UA_P ";]Q$gq:n(Sx&?[L =mDr@h#}HO,k_T~Y۞:$!4"D)Հ/i СeZ |w@Fzfxoe\_{3%٪82y8RXɀTӽXWH9O}%kB0ׄ,y~Z%_;׃~kR@X&=Ϋ&AW@@+VKyiMZ'GFA@967 {$:9V qQ̙ȋ=o*B=ܿ?ܝ_H6A=kR;kA K嗄iĠCW/wXM>~v~`v$ڟhp`BźteEd]u dI`XJdy' dc9gܣބUj`6e>*VU@JalTN׃o}rng߯f? >oϊJ͙j[Yt|&d*$-tm EVJ@*M5 Z0nۂ!YeHS3IV_Zz~PN]|s/গqv`z_Uƫb +޶ 0?AFvrX_J23g]zO;[?\>;[|x?qW| q־˵uY3z8VmڵFAדTs#<8_c @#;V_.t#)O{]\?_>,938ud. ='bMWJw-`>\_#;Ce~/~v O!WYP5$@EWY`jWk9BFn 9Wi*>}TAדyȳZ+&Pvh~FѸ≪y`Xd5`GKԾp= `E6& W? lپA'_{_:ei'E{}~=~4j@* i&ȳE6|~%52wrl#,δǪ% i& vH#܂zB󕒿lCtU3}I*z,kJ ck@4Q=qK|MmC?zsȮJ]v:pP$|D1 %s<ʜ; 2gSMqh`/JCU I>Y h 0׀4Nfiº¿%~2O_/+Nƨ sFk\LF]!y@ B4Z_knXQyôC ~~S’2cNjR'֘3s3gS&dǿiW}FkqܒW J/祐  W=pDM~/A_>nXI$\5D9oy͉jcq! Xܝ\)Dn]ײ̏ௗ_ =]$sv' cq^ WrXNvz١%9s>qeN,ϰ3]*9 ߑM΀Zw [j@Fx3Ϟ7g|#55 $ՅRRsy|pe/H-효/-|7Q$$@vswJT\^19&1'7W2OO:wgK\_y1 R/6$ @]Ldl$;x-pe*imI(kқtg[z;/!?Hl_46W\U׿ɪzֽ3WFΫr\(ɨ)#~`OKo͚W/׽gNM&b@9\pINԸ;And>K[N~FN1:;v\(RFM푍~8OO J:ris2esH5VTkeT6Jg=VQ] V˨"XM`ڮ^n4[h¸կ_N0<\fK}7hIH=v6Wd/Hӟ,O?7.M[mߑm]ژve[` W߿y5jibT\^y63 Z*fgP׀0! Ǎvd@!*fS0M6SGzO`s6UOr͟|]ٌgُƭj%\ '1jDTl\`3@Y Mѿlά'~NYbP T6iNzME@nC޹kxJ%/uMȾ6h0$FFm7UFSzm{؆F@mxs6֩%|ݦr}dU^YZ(m 4`kF-Oij͜WFZ<4R>Ԕ?ن*6ڌ%5`׶19O#:c[۪ f o/hwg4=NM׃ynE R 6`_68ե2OhX˶f@F}mU(kLzȌ|sczmF: +>Z߱!ﴱimI4gHv#z`Wڶ3 +`_[?S_Fs*"o@_n[grhI f=X?Fѓ5ʌ^bl6*~*5a@!)u'YMغy25`Zk/HQEG疵1FƘN@cVN>7^3Fq䑾Ӯ/?2-3 pFƘ޹`П 'zL IDAT|X 2?lI;Rj U\%c>4j#cL?۲Y/|? GȁɁ&Y 3Y؞i @5&־ɮ!|e_Nn5TOLdbG@bv2L#1_,jD,}6ZVdߊ"|}yõ : @Lh-ZÑw /8㇟t6R@mxql+e,/p^9Y=1Cvjjv6M0Җ;d.᳭lrDt*Ͼ}6Sޥ٫iC fm%&4(r%TLj~JMSlf1F@T4Ѹ/׽W+_B˟F?C{UYvٶld۳pL@K6=*)"5VN%T,GzO @ B۩R)]i¶iS ##K~ҲqdhxO|L"a|YGK%L|dWiJ-K˙N4=Z9JO@휕j{pzwȯ4Rp#j֩.Ǟ?q/rR1?U`&lna 3 ObԦ?Cb]'4jEbT@hvD#J ?*:LΔhOр^J}xT;SgP ZZ&{lH>ܨ1T+d9M7\Kc[)9& M}W3o:~eoC<ԧ4aRЕ/IP#EN:d,J2 .l'}O3+۞ę$c>%n:+oqO~au+E ӹ&A e^)MLJ}XE/"  AH8*2?fٔ~# Lgv fGCFc*Rg>q!kތ4jfTgЋf e/Q>t= *'S2fYa]f!0TG2WxWVFPoғ*ѿw,Q%j!Y_6ub]ySQL@ r`Ns2}qqw5|#q:sN=\>|H[djdgӖmܩ4ߧQ]:T].u@LCu$@3#' Y"A$8 j!DZ/5 "@H@Su-o C@546r<5 P۸o q7-$ G&* ǃ ݦ-[k ǃ ݻ!P$2 wT4;zg4wJ #@(XŖ@HIj;<ЀQ5Cj%XϝFx{Yo=SŊUoq,}AHM[%0efJF5@{3GH$XF(k[ BR:5°䏯qv(#$uL 4@G T+xJP-yh%S8 3i2 ,$?B1^[MG'{7/qWT:I8ANDh6R0GȒ1?p" Bj_ \ɘ"!6mC?JhD({|ḑP~D% B'eOd/M@Ȓ1?p"3YO>7QH|*}J3 \$/xU "3|8Mx7eg@DI XP@d`.a"t<֧'OH LH? ʢHP(? nk_2OLzx_qD?䄆? 'I>aos`4ٸ͂ОcCjۛWYVU@pdw_tYl pTӾEV1 #i3oUo o>r4"UU:R>E(aI6a^nW4l$́G4K=/]OֱΓi3oI~K @*倰զ-ےAaO=Ty?;wSjX\**l70" RsMRh4_j/ R,S)`W@BJ (zĨjtVpI HV Aode~8&LdAFS M8%ac;_8()G65$˰O.^u =]9g~+!O0ܲǙN ;y-R5W DM` \'AgRWӮ @@3yk @1 EE xc@ **iTE@ɟx"w'ʻ1 (ԛ'`}LRӮ~;r&|߼ֽѹO;PǒC+C~V#K&%{&뷢]2/Q VūbL(`_`>ʏT$3HRdn_} km_h@H|D'/#}@wCr9u, )!`遯\FV]{Xw'꽷ר[#}jq*6_X:I:Pw|i/fQեO2!\T:T?ذ3soL W'؂\T)o(C$MN]Txd2 IAǮEZ%W] ;52J{ }a~T;ѳϑdS2(RƓ M ԑ{*8+$@RHrбE 0 RAVq1$҅TXT #vhK OѷK$%^CB_4K_E2w|dx /)~WU|{l=WŖ(j8֋  )@ _ `Ҡ ^bȋhw™;k h 46-X`&wNsX?-]PTY3*оMK[w7hp*STߺhG(13pi`m}ţ'392[Ķt ?@U퟼ XVsHy7m[SDCB~{Gy㱿I%P8$hjR֟ x@I2'FQmƖ$*_+]PԮ5; 4_\PT` 2/?r4_ܿWvD5J)4qr閭d`˟7%T `PWͅxUJ)Y6~'X!9B刕o6y~K~RIL#l}}c2!ॵT`aEGÝslI VJ 5_bk1i$IC|gCz&~s R!u/Ųy/0$žH T}n#AI'~HۚS+,cH2 h*u-^PTD |Ry}edA^{KǗjw֤?YE@*ѿNT)nb%]ϞF\ْ@aY E௼gLi5?/VwvbvEUTu S)%/4 `Ft饇T=fO~=!qFN!p9pG%oচ\ԝQ]!S<vR~r̷`c7 !UWQVԉ*JTEd*_yXْ~Y`Z _u)JVuQhV)5@K+"4B:ӒӃ:43#^u, XǐƦN>7^9??H-]j> ?~[*񕇵)PvӨN*E $ ซ/-u, X@$F<֨B r$2% % 2c+i\׏^$ɦ?5^CI#x#AV,ΐEWG K$eZߒ6 :q}Y @dk_$)kgɒ?.(FWB=-Z%Xe$M|dR?M! ?/D?ȴTLu'` 8NC Zy~u nR$1Zb?v];^gb .Q_|cgU>ٕ0W4hx4J \Sohϲ|9txUL 1]G!eLgY2-svM4]` `Lg{,:iīb1]\ $щv)~|Δb߻4VKASLQ& u̳Jj:mS6f*B2'z©t9>}2"fx'ip)|?\ 2O5t|S|=$wABIK؍IU:7Ijus6wB0t/V 0t={wC#01u, Aft=wD+$Y&x 0D*d'B$4F$#os4$(OkL X ?P#,yxsl@RI$go w"Nf?.DPKF- $XK-6yh'ڐ@0qZ0r_&V$"$,9N"e:koYiD3!5Nt 6U$ X@?@Lԥ DNsCOgUOwDB&߹c=5KF=zo}B XK3MPj[Zr"P'v R o3XgNy% U #PZ,5M,d_;?@̋Z(h&ψy$ $ج ?Z3bDHB-a 6О7gh d^C˨,E_H"9|, H5 _g^.M5 z X !My_ 9= Yp<."G@ؒ %!#Є́ūb݊~1 A<3ٖ|1߯ ,[?}`m=B3#ylFH4|E~N @.||f$K3 !/_qT[3 ><;3Lez"g2%4V#Y] `\@>|v3j0%3bڍuno#xv&(yVޛ0n(U`XN,=`-_q xW[W+P,!wy~c -_qpmWq䯍g9H*s]$9 Ɗ@__گ?_>ۄl g$>X҇| o337MI?E#9~I%V>dU[' D@çV_^14EH Y9pʙ}lLr8z{ǿя0 T'PTA >X?󾭍30 22=pʙ}b?Hz{3DNgz|lJiU_w>F_>+^Dw֧~O ]@K^gtH8LSi_fCG$?sSRQ#O={g1J\/ ($ A"0S+n&@RA?0V21҇mH`TacݽF>؈V%{\s)T׽aÞ1f$pLt|%2wM6έ^ֶ $!ReFicz<7 $\}g+=sp &BP2G &% {vΦH6HCaE}` &M{6߷M: GiOu#IAJK:|P_/~$~ k7Pǃ85z(J}u=;uCѡ:ŠO2 D({5t<`n8(MSr@Uvpz X$@D`gt8RS'*$A6ui,n׊v+/^pՎG;nr8 Ob=@sY+LUt<\إap8d}#S#w{>qJ)J/mIENDB`ukui-control-center/data/faces/3.png0000644000175000017500000107361113635333016016265 0ustar fengfengPNG  IHDRx pHYs%%IR$ IDATx$Gv&{.YPY h4httC[O zBOИC?4lphx8&)6hԒK,νfnYU巎WfFxxݾ]B+r~Wg;k/;e/x ¾/۪Vί@+<%|USB|dFÊheϮq qϹBPP`k8|՗VZy,i VZ9Cƻ;J;B;P)>2 V `n0`+x~˞B:A)dy̓~A@|q>J+@+|>*1`TRքSh(ac_U7JaźS h5x<V10p1] Kož3~Tqp1xhOh#<3{2zV՞Xc(`^rլHxgd"'ۯ;c!#E~jX ,Ȁg_6Mh\ʥo3P'n*|K#{'Qzֲc2 <4"s8$ uVܩpX^p&cSO'ʹK߶BN66`N8O*%rT>_VkyAjF(E~矝٤15Zyb0-p@YoZ i2!o.Dx2>mYa+OWZ&_yO?.b|UYMS[c59`eoTFy<`"ǹ*#R֯E>b:D50jǘ *Pz5CGL/oڨ@+OEZ'*WxgGG URBk9-rli VT^z6T{eT5N^\|W}9U)qw=wuϱp\Y ; SI2oT[`){e@G BpL<ъ_ !@+g&ʩ7))5OT1wYm5ɔ;f`Y׺q5}4# cԾ31,(wq"Y;N]JZx*iӄHc *~) >WmcVNUZSn&4q;J0(ף U<ӨhBϿ4er[?ThDs98V4o w5,A U~a{4DXo?W-NSh1L5OFNwo#k28 ֯"e/үn}(u_ۿn VKZ˥H"g45gmr_K>;8qn덋RZ@/C()EP= Z@ HgXxIBZ`+'hr[ŏ~$TSMh08wT e/0s4!5_=Ouť ȿ:s9E{ֈ>( q+9J=ρ. }==Y"pn V%rP4(mi(߮`MpXX5;kc-`_;c5(;gCDV<;Qb>b@yEP 谿E[,k%| [*I`ֺ6u PҌ5s3.p*ag?/m a++JkrXQ=Jh7*}fQ) 'EcegmI8M@x֟JM/BZDLC W n:7u}5crF]X. UVZuOVr |˿iIZY.ʡb sE5ť4)5N(p[s z KwC<7I5V@^exN|YOQȂgpw~V /l$ߧO\~p$G ΟQ+snx5kC=Jۚ{#w~\jz$ՀS5;@XSKCL0K(TsGΎUOP.3 ڡ {#{/-Pxe{揗Iϲ< iI ^,8hYa$_pssNޫ=]uoJ=`|~4laM-u $Iv!0:oOa)p]Lǻ,_?<*f9_e]MVgNT@)J?}ѦsyܹLwnR [i<'*{R:QMyc"sXӧctX۸:FQ$ȥD"t@X[;Bv%C]8Q"kw}c+Ds*;7p_W;q4܃O*ʸu\sC>,EY&< ྒ߆EG(\gVQ+=t@rT sF`RQ>N- 7' d#"e?X㽣(r@NdtO`v 6G9zGsCWZe9v85wVο5z!Iz/3k[kڲck;w\Q@S{k Gk6#\X_GxBw<tC8t:b"WX# ""@Wuqy l{xE1x-\4y@kzJ@f(8eϓP@.$o{Fxŏ)zCugBK?m?&Yg-} `C")IsQD2dV ͐PJ z88lV :7෿lcp3Atbl!Q +}L28 dږJժ/rw@@5)-@K8r۟PUJNCl M\"B8'YPKq}MsFb(ȅB&fEY nYY6*><{f /  "4C#N$?poV|m3o^ 7o/VL>DB9yJvJܔEm ,*P[. њGC0BF8^]lWgGF$Ͳ"7me\&!2BerՆMrq~zP IDATct{V"!omnTDxzAG«?5U~{^k䎌hAB g.Ux!01s9zJeHԴ/r_"Czff)b:j0'4f.A<θGؘkwRjm96p+,SQpj{} b~8;z>(`mđ򆺝!:;xb<Wy3VD)*dȹOZ St(nwv˽irk> a2b9 ?E>0F8^B3d1{_Q ])cg)Ŏ1t>Qd,ˑD Q?"^t,-P P ^Ysb $vC$d<0ӦItǸI/ݹ=ei $^5;5UJ垆盉b!iB0I5m{nnb(":ݐJw᫄S9q (2y9gKXyK\#>'DSh` ^p>70Sg/7Ai~ .=c9I<G`a" gsbqtݔ=s|ar%׀qs| vZklP]?۹g;ﶽS˯1=7} yuOp ~AY0NF"Boc!&&c{n|}o>hT\lD'+T.kػ.Uh t=^g3>3a-{*«ބϊtRk/7CcwW5Q.%oѠL8#`_g8a8`=Y5\X[Å5AԔz5h9Gq$Iכ_˕q3! #PC,EKe,s)yw('#(1-l(* Qi7Q A{m{y /h '/_uG)|O~Kg)/R&7IAZd?C^p8K"\>5boW"|*)0NQ*sBb߄DlMי0+,/4} D0 Hj_|]Djt$ r{IW؅ 񋚲@3Яey5Zår"kQb!u66͋mm;B0ѵ?J{u{ ]Jd<?\hQ_IqS! 6U+d\YUP,/ZSxW)ګ*1:>knX ܼKKSOpArFOP~(sJ{Be&q-P 0%OBݴ:Zqsʫ٣M.F  /+oὛE//lp;9Ç:D+}D.NIOS@^\IL^s wғOam,?*wUf<>Y{^h 578QEIep }ׇ1pT>|t OaR~_u/I6a 0 eb3g\Όaũ a[u$Y*|)y^,"G`j\T"2BPC/ JkNz8i}IG9PYi$y= 8 @Eco"[ef==mf=w)g=JDq4w?q ?@|2f_ƹ5I-Ŗ{+5DakMl_~"`ۅIf:$ O&?VARzS:(Y#?h{9`\c4 goxqH';w'8cn}VOB`d3#j6Y!B* f"D L"e:SOg-) z1FC (O@JjD!`200i9g pN~T7vޣ A B2s$Ӝ!#̦0;EPx92H(Su'E$yo`§\Ğޘ9D߯\oo*s*:*F6 }l# IC\y"DNBRc~@H9ρsd"硤tl4h6R㝭L:bI2?pX gfɗy+(/oV2hi<ח+^xm1ٲRzSOoy38C;e`( ƏL 2 AC^!r=8Gzp0Y0 -Ah #|&+dV7n4e/)gl2 'q0K@H=MpsR,GW߅̩Ml%U9I>- _Agc)*E%K(XM~=:C{\p? I'Qݟ(dLGk`IC`\-'Ld}PmʡNnBܺ@?]V C!rԍg(pFқQJ}AmA,t,k/WwI FASh<CޔYSt6aO@ bH,͙bpT?)7_}w3Ԟ買/_XѹA0ڐT=aʮ0MSdYtu tlo<֞e9۟bφzPvsJcNII~a`Um_Bg}IɌUS>?@@!`_Xj1E""އS8Q%WVX}fyU?JEo·@Ymqwv7pKl>w5Iۦp <#i 3+osPʺc [>TfZ JT,MMO |. Gۗ$= #.iQH-qugPteL&s `i]J^0^Y1fYi' n'b߆*"O.𶔃֊D 4/(g(Wyi%c)u2~4drNz5b<f6!e>qRòzKhXfP<L kH}t9K<ίt7.~wU4c!5uZ# 5NY'B{B]Ur9'\.h`ơ}|gŮ7Rf}LҔшo^ k:5$&n\}底Jҳ2_vF 5Lf%ɕd6eWNSkJAw h)1K i΄K0ޛ":$D\;l-eع9ekm{&@U:Ѽ`ޗ0ejJlm]Ű3B/1 c$~Ls?Z,M9ER H'>J pBQnE" $Q D_"4ǝ2RTz 6QwAI k_:a5!UMk+N_Z~"~"YMQ ɭEZB,p/75E(=1>؃|d1{=|]^.ĸB0)dYʴ¹(03f+|Er/}G/s'A!5^vF.Kۯczq)BG0t U=JfLL $A[E4s#o1̾ #(uk֗Hm;^\sYPWʗy.}-e3(5wS ޵Kv/šU#!15zglR' =\̙݈ niC#З/DRE!ٔLd|"Zwn~E8?uBʄzӣC񴸓g4TDOzx '`C6hLG:=@+ք{.)n6dr)P:?y{h0=O7́pHyc5h|k,T|QX)khD kv10*E"k2pXBk=~Q>;Jc7Y*;J8:Iqh"*WV`&$% t;QMP_!N4`s}ï{ -zÙ&a|o>Ͳy v'@#E!㶮<f:K2 xgr,eLEN$1{)Peed ᗯ) qi bRT'7jh' "6{~5EG S't?/Gg`|, &\heKחΔe.c(EY9phivm%1,k!)r[ZޔM,?Cķ! [ICZ}^1T~v(}x.D2 Lu6|o0 aQwn} 5$<]ؼ0 coP ِ={"5`}8""x~ 1cE1M>.9%#3S9R.Wn[EqӢiUe^<>P7i.S[2s PTWI.!z/ac% .b8X'AO^C{BD9Y3vחާNJPxg$fd!NfMHө6HFWtDWX@8 ?xI_o{TW;k_[veOri%j^sZ1>>'+W2Jx0B@a:pDM8"@A:×>Q0g0O>ŇC

    +ۤ17N i9V8ԃT}q Ke3Ǭ%΍4&: 6`c G~"9E{,}^?Y)S+}r<]g; 1WHfva64x2O2T }~,j@gP0- 854+ @lLH9ѝ_^$B\T l l+ npzXM,ch m$15)w[ >vMnf %Zp!#žv?>|Þ&'G9^QͭMN!<}YG'P\a8p/Zp 1 2K׿H"(>!}kt9t\c @(>l:A:oJ=}=W@?{ ;>*!oYÝw?T Ȝ#4}T}^U;_ovF+ s{F=VĹ@%p_  ]`DjpiaF~pU ɘh "&1lJi<Ɋ[il Ζs&@G) T|x !(EgdI+IcuҎwU?J|{׿AxLi cS*EpbWejjyE99QW@!ok5 p( @+&UQ~ Kv*L'tD4 Œ$H.b{1,g,4.%N|Gu׊B"&Xz͊^jkpr~bһ#5ue.6UeSI9K0Ul qyt[Mx"0dDIoE>'Ua~烌a^Ji H&R"%àhNȦD2A zlFUBdU aY+h L.Q T{?nkCZ`Eƭɟ\eΦBMwF975_ΠA* $bhybX?ܴ(^pl6AR)3R !76|q6CAytY%|ΦSL-1IDAQ~'$w b?ĥc6|Rɥ{~. "/= 8!8rV&pѡ %$5`DO8Rc&ft^ })+~ˆg*}n0߆|2&΢]l釓ʲn~#@X"#֫ 4jk`7|)U5D &.+um#Jk W޸5=qd.gSJg@w >9]"GO t޼z Aс';·OH]v)EI^LJ%<| IDAT]V#%P2@%V&{'R0k0hI_LOi7!Bsχn|D&)RB^#Hb>ɄQ% yu\ܸ`=3QW+17ƿFu }QD>LvǵDL?G%GuIYΤ>ֻZ"`4<*I[P1V6MuI CT&bqn4= 89P6oZ}M=NK@kO28׿BԲ N[aW]s鉚aRp{7GIk) mSi9 ic#߼_PN83R0,I&B3=ƤKsB g*o_gu/ւ>W}.q > _`2S>f|PZ}/FK\/@%Z爒GUe'@@%ڛLdH&{\޺i[\7b3lͽ6=4Pz]ӎ;ߋ@{٧)_y=[P}mGURv];OZ`\}rATÿgQJM:%F(R.shIBx85|6UЃKd(<ř$ C6fJxhX\wݠ×=y2u_x_ؼ ?0F9/tI`e#5! i?"|$ya PضFkS^[o`kYe]ݚxH9Zxܾͫv=D~ XRZ5tc6|N'fj$'t>Sm9]RC{=!t݇{xtݢ " KۖF6lu*T +s ˲?aQP01g8C@8Zj¦0`~ʇז.8D.S?=u 6<ţG(%Ϲ=MGF8 FD'D~j;Q&?10y ez h@ 8%P!ƂW.|tpKxګHzw$FM^4@UAx>ww)W6L1΃J Ux:׿Uao՞rm\Q[TBa?Gl,%c\K/cK&0'btA}ɳ= K+fdSVm(t*eLrAӱohշ;ܶ(+!j<&"<8*u6 _,` bڰ(cCnxKU*||ky)՜[Ve78DZA&ԃ|ZxABfJ't$P)Z&Hu uE"ǁ0 }Hq}tl6èx rNl.qġP?F'j"_ %RL{! ^폰݂d$#ȂsAC>9Q6;PL 0D=%fzb?Xcd bVL`/g9)yY!>rb>z:r|HyV='(3Sw Gsr]B&ۈ}'b [u/1Ud¬Ԥl1Gs <#'o*0EAic2K8D{UI7&L5twd\.Ea&М?|HwN?X-FO]\  ( 70 aʳ4{W4DŽkaoHX9{4AB@J;PԀuMS}QFʏ"Hvփ]ƩcO 0~XXF+B"7oO[\rc^p&C}S\Ûбd o5\%LJ΃[#`NZn |lo@}^W["hW 5ȋ1Ai$5E@TC4*yں04X*yKx<1SJ:|z3 8@eJ677س79urIL#B&$=a^ED&)]8QYS(|zI~A2c( +jb"U a$w2"4ame)v{%/}BPcȈ ]T}RSh 8a Y6D&8׽ycll2taPWJ٪{0J>B hn 55JHIН m+aGZȕo}w䢟SX(rSf/\(wH\7cϟB{G HBD 9߯4tPٶTQ@4K czb"l0:-(XÕ Cܳ,dcPڵ8\Mv KnUM+>]Xn!,t{lQ/'ͫy}#OAwfSRp&*gj ׆,a EaĠq>zO©iM?)MTϥյs9']`\:_]P5rAuaJ)J{5Z^ܽ5ʱKt19zЕ9OV^i C7O0_ƢP,ʬj)!7@;|]~hLޝ ``^pY,q==]F]r|5v1!J͙*M4" * ̧ x¥"=:K!iQ ILLT*V!&#)|*]& :I@H)߃^aBuBGn7vS>fmd| q9 D.nU*)z& .cua\~n^+uu J5lo_m8XciRt|?Κ}FI~TpKOPGU @w  OeBL5j@ & G&gn"ʦady-k8('gc=y;F8޾pjqkw[X7pܑM_4GZF \%u禟l;PS-zSYLV}}#ԲvͿ׼`!0gQ?33>jQ?ى(Ru ~dd:t5tc.-ST9oƺ̎>d}mS?' س,Öd v iKůS6ba"! zӷwzN6.Ν()e.hjㅃ6r)I޾*) `0&!P}ß9N#[kLmGq{f~o Ew>1Oyu1A̅dpJ,*fL@QB)xEi0`rY: {P( %1+@GT+Nd4TNH~3`2˘>[CO5װWgٱC˾SzXoN"{kX[ظp1fs{ {v(SF&"IQ19Q[%7 #x?2`!`fN:(} 竊ld煏Ř끊JӣLuT ,3= *9crdқ6d!P@ܻF k\~bl? wG?_65E BJ^0T U.~A3˜sZSTr=j Hi!pnpu8Ș,<.-BwG\n8#W}~CxF9\<B(opx|PK5qᛯ~ic v?2(rBS/X[ Zw{~Ɍrۛ0..%@I k4vޓ5/o0_W8޽R6v^ _X]`` A`Ks=0HK H"I %z~@1_ԳBj߲`NZ:P1,a`_Q15M6Օkߝ3| ./3ww~^Y#+ ,-@>:b_@Q*ZܖڈUvlQp$|g1C!Pw24~.=מZ{:B ƫ>X>S'yQ s^Rp\ )beLÇBw\{R+Tw5`K/>#|ˮ唹Q9OS]QEgREu7^~ȩO0U$pL= r䔇`V?2Րȁh:! jD'1&=N9g!G7 э"]VIu-$T~)}D2@Drɸs\GycolE2VsDW uxM$?:)8Bzo|F ~66"Y+FL)WU< x嘥&LDVtKb=݄S钌k{RTd&?j<6JQ4 :\5eL&IqWQofI{x^]Lzzt V6-lg~%3ݥkZzHEyfx 'JM-a[m؃ IM6{ams""j5qm߲y"qhPsGs?}Rn֦p}uKNVOvEۯ\pƛZׁ>.o i j?M~=b#Jszd|^7WV(ptx$oPVX' LʼnWJKiz|$ o%M/KX˜$ҽ>4%c}_faU lı)\dƶm%LᠼW72&pB >(g>7'nckbGC3OkD܄7JZ\pb2)8<<Ľ{aS &jմm C} $!֭_Clf2smfϓ- mfenKi݉Q IDAT ~䋕}k1O#0dRa㱴HRBRܔ'``+ 6ZCـ!5Z vmڮ6B9}awky<{)p4?FB 8FABkđ6ΌŲkie%/{m1u"3v&LJ,^d @p8A^t^*t7p'v5?b=nքU.q).9 sTS~ԮEz{nj;ڠ݄ߗc8i_jXKEv ᱲ@i@I{mz(XeEۛ_ 3W"|kۧhRm8-8%b Snҷ4lt P.Lx"n߾% &8 . 2ߋ@I ,wdAu"R3|<V~JSw514@U׋<&,ŢUJ5j$;h<FJ6ʥj-W_A$}M#ZkU!Iv dܛyٯi+8I VDKL^ӊ2/Qkkl8ljT QV׷ 򵥨'MV iZ-1RKaRZ#ڶaہY۰C<zF ?0y}vK"${"7P{ "[Cؽ` K|Α@ߵQݣv_h;toͷZ?%VlY>p=.FwE`*uip]P,(GY Ms*b* H8WMCdz)N~~W:LG}(0S4b5TKS+ J_@M/D7i{a1 >a<qmM yEB Wy603R&3"@Qg1m%  ()&وsC S6g,k[8"ƻ&&BMu7U]r0[ r @C[h9ºF|Np!Mwawh8'n-B?_GSCR#eP/ JVW^,#Z:T**+PUײڸ655G:NY t$(륈gU61d(dRYF@SF qSXNnXLEc= ސ. 9坽hp[?Šѵ1ÎRIvd̷KOƐWn ~ a*[+HdޛjA4c4>@2뢦lol*+);]{Y%8tD:}N%ɺ J6 D3T༸YPV d~ "uŶBY5,oxMeu\kۍ\k]kt%znθߝ0; > xpώXv9v}Q2=ct}cp)UpP_U<4NaS ښroks \'o-8]7- m۵yCqBj\XW;޶ qPT۪AM0X`2Db݁-Q5IC6΁83|RY[b ^n.NmM\>'xFFrQ)VU\Zf$`al>f"1x=g?f%je]It Aݢ*Ž`jJ$7|$oǨxhy΀}g *>H>u>8y\g;g=޺ Ƅ(!w-G;it4E|:18*PQC~P\Em厵SEF@5'(j7ފ>y,/ y=uZ50b}55NyHhun?89ٔN%`11r&Rm?݂2\+gRuʌlw@m8uiB1̙&)T /B^K/)doScO]>WqPL4>ƨґi3/%1Fgs4yr@*WyפP* vC&)wP& Bo0Nq>;yޠ ҭ{)! @^jc0-s|BMf:F sGS^YQي )w%HL>ʑ$+iy)* *Lٴ]o}'R%?%9 P.:l:j)%o8&p3w=a8,g}׷?;MgS$DZ X?׊wz纑Y^44C5pGtG_U^Qv &>KP$ϔFylͳ}o7nv~[9 Q kE=)3A}xDȫ 28 df1xN4 C|8@"+A6MPHFTLP_Noj?bTE$69pˇ/ Q/6XμJ~OqV\! "Di/ EmN#}J[@H`)A LGsԕElZ{T9N:’΄-l)qKgt, pa7Pu/[`lSlں5CR ΅jĀT"FZp!湞ՎՐΥ;*tK i89!`hV54K"$Q$I$#*%rG~2Y'nUɕRj\?X v"%O a2*I[d֑hP6 lC%TQ&m"v3*-?hP%&DoY|3B2*f=ߍ vΌK;ZukIg ;l,5Cz9a:#}*;u5OykRgFls$^C BZęn->ΔΌ繮?Z}. ]pֻ"/dԵWGmTY[NVAkL6 E0N me{DrOg߉mqR6zܚH ?1+#ica 0 LGcI泙`73&7C ^| \x N$v~Hun3.&S 6K#GK25C)/!U6PXm6U)Vɔ%Mp.2agBIֲMegq0c tn3^t_y j7JUhM=Yv0J/𰨷"t݈2Z F']{8nZw@ΒA '@n4bƤ0VZm@gs<6ka|| ֛U:Ῡ11Þ|._ (neC?Y(s:j~ @{7d > ݌H&&Q:*:F^)+Σ}g\%Wn8vvJ :𓛥 {ۆHϵ6n/qŋy\#߿>f{=W -SOw>F-$V "jZ$ 8d ?DTv#qﻖ~`"s_i[.SG&H 0M\jSj;~Hf8F:乇BǨJ?@$k{NԮ@3q!0w絗V|G{l Ng#MJ^ XPÑmy\V!LXܓ]&JL:\z>P;a wA.N,U]U sESrS& q4t 1&dxMi&m[;i{\*@ZmUv.KmB źS@:d9p_kD1ǩ 0|aP cDqKU}kF!ΜLoi~v=N ]pgigq>Xnkwg)$q : qP9}!X=IeZ` 촻~7>7J[_C;И=p9̿/j<;+֥҅qu"GH8f՚euaOErum'v/x>H˟k F'vvkVQxóGǸtp{4$2-T*麩-(1(z.\76OG1$ Lf{~]O:2C[VVLdy (/.BaE(A-`@Z\ 4F 6bCπM;Ox%Q$?TPA,cx |/pߐaJʭCk~YVmPBۣٶNmC`4覣1&IԢxdl~0(x63PJye6˞/~ {֎M"59yMaT8I+hBA$"d>X֥t'Dm;9l@ҍpnCj4g ]s{߶mlu=Lmun(ӝ=''k}E+,,#q"utmWi]AsDgCn N7ጮ2_zs!m}ط>vfnd_򫿁}''_K5h'}||1V%JTҗL҉@Ѕ8/G9wk -O&3G@z--R[["d*1g 7VH aE0jlڗRm"EPT9FY)FZ(9]EsT33Pć!v~Sw|rr6+v~n id#L3(/Fea!F2$ʳT f1RV|MnC**tdwy2 Z^;*U0U)D]+ sE5 ,d,-`U? ݍ ;j.4J^FV9~.^pӚ?}'=~G6{b?K,轖yg$HK'\&w?WW#dPj95, xYf-%jڥ/>)S=+7ϻo>XĤ7"cZ"&lSdWf7Ww_ͯ#k'iυfP,7p mʘ+kPR*W.HldYW\i&0LEgͱ?O ; U5**']PΞpo`<:˷ ~"EN(~q$jr)-g""Ld-lQn:nHet9iGWV^F$ TY INF,3-n3rȱ G<1ИO嗠wUvf,gOQ6b=tq dKXOL|ܿ.wo:^~m.!n'u[|.kOK@&Tg9* -lk9E|% ۥ4j/ Wɉ̼v3v [sZv5N yIb#-as+H|(5\0!ǟ\otҗ΅O$% -z-Ǩޖ+[9o#MN{~cpahte6{mhTl*%(_Oq##Oy"SL"k !\-WigE; ep.OgPPZl : FAo4 |>)j9tC-;Dx\,Gd@=iۯR{Nfbh9 F08;P}y)N>S_%t# ,rkm?Ks󽻿άS= o~KMw_\;rV%Nն\m(iQ#*Yz:NDȦꭂ8³ωO @l4;PEamj9k:ù;[^C1 IVzɅ] Vތ|ߣr,`yvFi))_(Ea]hkƓөOfqNc0sn^)1L)~hd IdA ^ucTVl"Nk; -(uj p bP;^",tO$nvt,-3U33Ǵ;_FU2&ӽOWe&CFpA53޻1/=ԓ%8R$G<7#̦1fK_\:%P?w;~_&gRm7<|Jrي54='v+# ǘ׵Z,%prU μΕFf2Uieo*ˣo 6mig;wӍlkU.IhOluG:6?TҺ) ^ ݐIbڝ5c6x_rF(;z6!rw\\0ς}͋/< a?@I%ۺǺys絈??c~els/އƂ rmuSd ^a<2Y4Hc('HTE|W`JjT%V.,fn5icjQ&߬űhCxR pIP|0pnu<5)U,$h3F&ل\>{.)*OFYzSI[i`;HN7esi>*%)!Vg^N{ī[y? |M&=(ĘB -75A}T%Gj"3(x}YYԌM|XQz^Gٳ${,g_+,oro(|4h4GQ- =Ծat0'a8UCaP$8OFJp.*(ߢ-x="TFiz*õFU [4X<6'ׄlP)D[(LdumYzk~*)R*M@C ,1AdU #hX`ڀ'z2T 2YFn WI@щ%cs .wי;);{0V]Iɘ@>3fet#aBU0ϟ\zԱ}kGexO9x Zs`E(2fƖ{3>V] X7 F˸<{&~_zn{qzrrԉ /"Q#Џ A"#t9?$G )ʊ;5WH1 "ވ\ |u٠ږJoIwz"\~ lG~p%i& @+}L"h!ц! ;7B7%"iXlz_|}u_x6.1&C%h k-[@ّgttAM?#qa$Htr Gb.聜(aFv 7ɂ =|ΝGeFa6:ƕk@- gh$- yFR6" sPti GY*N%PUK}1 Q1Mp[x7?sx[XUYRODeV w_F2l^e?/IBSVGT[VB BYQ6-r| ]ܽx~#Y쉿0ROYcZ_Ҧ*>=uMS1uHB^I´-MgGSٯ)\r݈\#cJ΄6 Y\(1,.Q fAfn\KES0 Ih@9玳%nw~`m؜l^&5<4IFFID[^ r[r|+XaE*GOd(^ *ج%ЛV=#bCn"ex2b<|,MUI{e1mvml7Ir:Omp~ĨH%\Y6{~KN,*b%"m濡q!<@hK,TN8zME_=OLH{ljgDZG4/;quxM|Cj1~bFC6{BlMjIy0s\Kok>Ws|uL1ǸU-L؂$ w8}?͢Qrr9{ghu.UI:VIl4мj U⫄&xֻ$2+vD91\Ͽ%â9W-kz ҴҢM) +&,ܢ ?-VmQޘ =iS޽'77șgU$s}`b0VKu:JZ.yj8WVL(X 7VQ &<~whdYQk{1IY )>}n 8b {c$wxMp|tYR$ 3cU+/UB ?mlv %g+#wG_}7TFneۡ"Y4IK_A9j(NGU&RXe.׸4m 3wbMxug}!=qjwJm0Zg>ov,w`*"S ̿75b ߹ C3x=Pk_G`%`Zd4:­_7x o0Әe⠁r$a#Ud:GQ"sYX7Zo \(EjF)[Ơoo#KIqX0 K^sj:As2wq/v2do|Ʈ'z{Fl*[k4z{T:G5<2?Q6 h#KAȢ̅oOq&''RY le#Wx*TlJ@Wxg?go"|{iR3G>*t FߢZآiz}qK8<GVk&Fc1p4E=-bƢ Gҡ0M+]YQou~,oax㉡H)\xb0%%UtRJq(Ñ}&~n:s: I:9ŕPr^]kD: y6HA#c 9QVHSH) EU+בflaӚWs;aG`<h/a45ks6d)Z0@HxYub48K3D- G1|覐PulJZgH,Br.0$`SjIG>*e-vD!? 8z|$=XHK\x0[x&i d7HS/)f)WFaZyG- g>(LWB idѪݻ#Z:൞AeBHL#xW&vu?euHzv1Gpt@IeRt >g/D3kO΢)۪XΏU16wԇmG?5Mͳb&(㿕v~tPj`~ -O‘9b->mTi0,o@S˜^ gI=;/~Yyq ~ʱmi]HR87%l3Bn^H c"g8~ d'϶f}GR`D@Yx- ZߓJbDZQL" =A1s~KxYakbH+F"Kq@'>x@0aj}Q!xA%f3=T` Łdz :B.rL)j5]"0?x!R}c&M<k6`P+7C&c|_Ge5 -`KPsCZ~(ItإajB55:DZNqur<I#8 q" GPQ$O13 fKI6d[>G IDAT'kdxPX}-gϛKxP Ы| gi&ƃc@¢Qc7"E s5rb[JUF *z+m/PV2-ݻEOwvu5BA V euxob$1Mն)L`djqd'(v=>{g1 REW_J0O*qǬr?ٿvS^Fmt  ]u= ׮D|D2[4 kl׵aJն;g蓭&əAsڐ v~ٞx'}T,"6O HQKӞ }LfS.]j-mtgB0%ds $8nkAO M!5I6z:KϿϿ",ogZYGnV8עGڳ6pEتyVFUQ$U7%wC[#OkWq苅ؖ{,Ɍ~H74\-nVxCݱE}5=#"2%۱ BNyaV6X +H̚syY{d]΄zƳ\׸4::~ٱIGt d2f106[ iza]KL̞ykOw`%ocW/ .8vJDd^GY77vs?/J9^)eP~꼲%;VGoe(ZW@mA*5&^{_QV}.} Hʊ 9ip/~NנJ09#_g/ 7RYiYF@4/&A#p*hwOᙋKKstt4%=2ԃ1Fw-<{iKA>{xNQ1':= _ϾYbbxw9=Ug puf %cj+ T*l%RբՒ"K'\'(t(ɐEtB=ʬkVx}F^qt /_}oumk{sMm<Ҹ8`V74Tgab<9Ć΀XuxV K@0~8, PX&c 29p=K'B%q`ιfu ʠn|u! [ٴΘGtcB]mc m1SllX`EcV%f 6u0028l,s 4A[~n4jn`>y]yَkoݪA;ڠjdk?t?A؎QVi&NJ`o1-LD[#"_K#s:-cC-\ơ*ʷ2'LR0DNlmdLY)=biR$+j:*X;[>Zd!M'22 ڶT ,Lhuɉ`Vq@P`կZ*|WFI׶+;lKw^V-GPnW-mh:СwNzk"^tKTg̩I2q׀n@X)VzPM:{N!|[ɍwaxc%zԇ戣X1%nͥ1FgDvعx<:#c|o~?q<ƒWHQ\ xT`]Tp-me$iL`dxC&(^&2` k$&/WW|/])[vuK\<< sYVϢ턩8cG=r@٘mO 'oqsG΢ޝ;wVvק݄jܾ#q-n{qFݔҢե Ƕ˜amU jL_ j2P B 2ve9:_XCp0!_?/ѬMDG<[XsvZ ̰֨1ͺe@5?PѮBQ61tm"N'T%xA NW&9PU(I(;^6 bߊlixUr͕rϗ`Oq5~hV&Tu:ZoHDbp<8@Ȏ%*I]: ıU4Q.OR4e% q-nr4 09MGUA 5IP윩RRNR._tu [Mn}t8=_r3u؊A6ˏ9T#>|Putq)GJ/+2Ī&NᵪҰH<O^,BODb'jMP{ +bYIJM&g `!Mت8Hadn =l^cq/"S,>8fN.elpp'IHD@9h4F?Gdҽ!uˇH9*& QKl]߾ GGerꂲ਋ɾU~:?w$9Bl:m08 AD\0$6#ItWA@wc1b~u[ۯ?#wOLC73֨ۿh'7+gUYJu"jg&r!? A ,x ?IG?R#bI4:[O!_p8hwݶVf 7m]m[pV% "nzq_@*2V*#7F"zJ97+Yشl.U6/bkm;6`l%n,%"Mti@k-gGJ9dv!f%5qm\y(R I,T^8($Θvd:~ ʑ8E}nGvQjwq ZnRH'b7V'&?'M&618B ۵ AA}]%pB/X>Uoaѣbqʘ,_ 7`7]zsމObNaՖ7ßxFqGԗgB 9yPm|~F__~P/i"Qhڋpqt!, "H0H:qǩt4`&0JڬP5^y L$QȄ?bIN Je;a`*.֟qw-z),:Lc1#;Qa'.=Q _>a}0_G$wsM뇿ף ?}S~𣿑M\?6/<;wUAA\> .*mV V=.1<80IƸN[,re]R7(oA]KcwnQ@N 9m+ۺEkfڃPi;NfdaT9gac#SXz6 4bG z~hDp`-d?8K(b#d|K_P(Gr~6X,r… ͸A hſEķpw E~p]`Vw(RIL}\d 7bG sӕʥC @"l)`Q2)DQY'N\z`rBEaŇĮ2ZQZ3 l yL0&0CFB71hV]qk5޼uBESIlt:bu\mx#^x-@`"?`&j0HRiPWڍH&It0Uv ]EJ'N:,:=׆/]7V&W/A= k*0.^xbF^{~ycnU{2Zo&hUS`6jeNSr魟]O?@p/EpĸX*k*m-0_ KPS|pk@pW%4c ;C$8HmKdo~oE֓zDmp`SBQ^3D2wlUKP[XɏNљ`P,bD7ACYF*^o2wfe{9rOȷT n[&S0a"H)PB티XG&>q$< փgqt{O ܗ3 aס$. 3<hɍ绀{I_7tlUl.UpKOdWд^i:cV┰6@<0&tQ$F 84R`*✤F.>]":1*m5}kc섍 JJzmsew87HW笈)_GzJeJFAϿ5dsج8F> %p @\3_;Cv{:_2 [@c.!{X /]8Q6nьlKy㳽,Y\4ӸЁٞu>Zb#I] Oq)' 3ګ^ŵskkz/bBC|ggĦ6\l Q! ީS[Sp20Պ΋\&B"bB8cm{vN Sk[s,vF@Vz=ןKN'Nd > lSk}:l6VHd,C:VHB nñӓDY_vX=DK&u my ߐW_j4D3 "fzmԈ"bYr.R],-u^|39(ZXx_+oAR@t}C}}/J^n/}x9?G1t ǶsV.;٭q˫6PNn9]B<ٶg%R]1(Bq qbXevBggjSM.ȋp$2b \(sٶ,E5̞4 HI4S/cR>4ɖSy{AT 20m+$ *eN,9YLXn.Qs$GmZ3Y@+d.۪"Ŋҷ#ڬw(O8ԑ_^20B[T(FhhO1ܺW<,u]2Z_1(!?я!IE l:(:AX6J~dl#}|yIN12l+/8 ;%Vύ;nZ%{+FmUQr!UY_ 6-0:^u u8;ԪB 5i IDAT"SY6Cu.V1/b;'+:#8P9LݼGPmoʎ"+`O9-h "=TK~`Ǽw:]ý{Yo9r(Z^^+QtkG6׃ $mk$x<1=xt+D?DӀ<uGBcEj%zѬ@D:9\LnZN <dBXp||l:0A4)hxOy3@K-eS*@FU_Ǐ&^ڋ O^e&=)tѥtLGuc 0$G 5 fxZ ?KGԈʘD0c48(/(lQUL^ ):uM'I3kןr"FR`rm)yDO&b01yegYl6i^Q\סi裸%d2}ҙWbv>/yȋB kyh-i?6.϶-ΐ'DUld :`4|O|sWc8F4RDL֖GdT>gqTT.'=#J8JS  L?js͗1xx Qb?y2|ҟfnKȫvΐuiU^ Rc|qG=%~ݒ>x۾ ^y+hRb{m!cҺS|sߤdM$'t HkK X,)>Jҟ;={.,t ![X"Z<]Oh#_C'v@Ï|0PAe ln{.cAoyF'up`m,9Nu<WQHQ`8ݷ-!5g 4]U6C1ncX&>5^پgek߷׽w>ț3V!|yr֐-vfeˤX<3^ A**ȿ[hqҗ Qq>vX$NF84 nGC Q6.7 R2lk仵3 ZHp1N{5EhjnKz]+:y;Ǭ%kS* Q:9*ö֩__5gP+X ŃQ$rhȘpa7=mV DX4I"Yl{ D NמA3pC2=K^V J*@{Z%R'?YI?O=o :bv0!RZl!^xSBohBg@c%3 N""Y/(q2H5Jت8 vZ]?1oL@:U~6u&*NHv|=jѪzbPG[O#Y6/ҭ2d<¶*_RϪdl[}HEġܩÇ.Գ>Q7qt /Ro -?{ gTE@ ەmlhJrΊڰ%×'GΎT)>xpF|5Pre:! A"3x8 /ϔo#M* ~CAx+/#v瓕~\[5$X&V8"jw *cpa Yz&dnP6H ζDkJٚ&ؒLONÀn\dyq<)y cDj LBơG]G&vM@{>Ejk7:$F1~gS ݛ~L  mw ~`5ND^[IU.~HxvP8@M;K)U/2^"[te%ps~]@s~5%NaF.}~<)P{݀;7H|ݸN跃.no]ٯoE5#~<>pL_uxQ JR rkń@>:ABGGgB4DԎ˿ha(Мyy0w[ޱD/6m..ܥjɅGw<s3z+u|#Ӣu 0w넌jgH ^RܤĂ8Gf`1N'ZKt?&Cy,/J*G5N ) # rSvR]|O~gwl ?o{;+o@1͆/k3Yhvլ&Ż91 9AJ^/.48ЊeAh@BZ FI$|@%oosS])ZK `Z|?cՖu*}߼Jc8UN#o__O9L\2+b_B]8ԭCiRTʂ ~Euc\;h<4#`~z-5) gp!puZg+q$&rmmx^X ]„+-|@װ]* 35}k_4:̀ C,atbnThL'u8|% {'Dk[_oִۻ598/!(U4E TU6 tWfB6Xq): gs9 };}[= f e*f \nܸ;(ˌ?ĔZMkVV>ϮFfJ2-d{wh~\ܻKHZ 7}de6w `8W&;w3T+FCvx)Y.q[vM-r  = -]ED&r ̣q=)ϵGj[!>FCZWYqsVCe5D8N1M57 T%Tiq U'Uys) &@QVMIbk43e `SkTV.GݢsuCUc/Rzs|v|-7O^?=md[`.0NCZf䥰5l){z&61)- c fDC>yd NnVks=/'~B&9){ '_ڟ[dظh|{~zLNn;ڿK;s^C:Qґ JX KPyA!_sv);x8O@Oq |R͋x[]O%/eeebB+@tY:_Ԉ )*D79Ϳ,mV;T>vO0ɉQ(?ܖyQXYkOՍ4IqbbBA 8P(ضV"""T XͱY\%VP -fqS(%bxˀ]7eS`(PnT0qWUolB3g&9(vBGkTv>{< VQma2a6p֧ɨ`U1Qଶ R,Q,o0=BD~,&ڕ[髷dq/#ptT1"bk8 3&slȋ!uL:<0yMQmt݈ ݵc]Yr#;KnL(L{Sv2"S>UL)% =Wj]7B_\\3wx 9(TݻxxӾwDj_j"60A?l^ vt9&9Zjp/c8PQCɁ+I 8ieGw7.zΓ=yN _{s^MIU;|?Db;Q6[@_O`$!UTJb(ibgP$Y2`Qq-[ΖűFhڏ0yaWMaI&)rkXOAb{#PBb:GG D!&ic#ܺu\.Z1+8? (7ሠj UdcU)4T;CDOc%X2ʒHEdH@[3 (0Ą򭡧t{#A0vʘ Wo|J7+37r&5BaruN.D> kT6 b\;=5 8ݸEV|R<VY=Z yLbLhZ.wMQyo*6;Lt+'D=LTa>?ϐOև/\)cRFM^}ϑ6@4/5h͠ \[;bz_g,, \X5K;NjZ:^h\ۿuVL.p+I£tDoNRp9lĦu~ ?3{ItWG:شеDW" D$T;2 zUJ-)K  2"}t@Ҥ @;,_t?{_~5Jhs~5NioFID 鍧`y`@ |*1Ui=簺y6gr2o준9Z kKNdBUk9CW\ni[4;zOZRؤ:6ź[ӧz9T^JZ]1%;ԣWkYkngpYl#1"GEd9P([ezVĤ}h0%<&&-dw;iX-PKĄ %L%V΍6 ́>O|?Q5 xVy f;%!SlavԻIU`9&W^G㢳e@k?;xS'Ӫ[v+if9W*Qb=Dfq=/'f%60FP7-a ݧNy@W؆ U܎;kZi!RJC}ZIkxS_D1SI8 LRf`@:.]mæ.??ka2c|t[nc-6H/lNI`ѱ\S)؍Nn=\ܹef,ωgJFe ̺syd@#e1/4=|31D͆AOPpCg&.F\&:9k pbdBPL^x۪(u (C1(4#NOG enHt\^3e5["Af 8>1s=(2ޟ%J<l#(q۹8R Xa_ֽd@ӑr~ U| 8WYl]-0FQvG Vyѷ;q+*0Y_.Kz2̱Jg?)xJئ\wbq1fȋKk89){d,^A:x#JG8_/޼M:Cgt3StQ M"k7twå*ھf?P"^Я=Y;џ>Q%_AcstsW\koXz;@[༿X|/ifL ^]щhfJjgrl+r!,ݦMTEUs8fo}-Z &XmEm6DHVvҫsA`뎉IݨKXPw6-6\@)Cո,TqFݢfPt"G۟Av--pK7(rB᝘Ib\<.y@ٟ \pfn0!݈RDID"ٺU?XP.Lȱn\fODcV$S+9`o3pSLlWJNOg^'HW \(vQl4LBr4~0ao x\`1,S HʺiqZFn.5)C &1[x]n:> ]9R +'j6K )+ԍ<**3g#qȁ[Ŏ:%ÃB3}o S'Vo\tC;+=qKkps:FFN 0yЬTE tS&" P]ra`0Hb*X SD Á 8KkK yU## IDAT XvUsWcP$'3l4<}f .އ'GPIK7TK2;(`v΄ubO=_?Ud+o*$8Ty6))Yn JAÛZhov:XP ێ~F5}|4"W-udo/6~.Sj|k$Ijn|^G.PZ, ³)_v.u{V6.bBj)9j\cY>Z(d$0llYmq= iDho,PPunVWEٵ.t@@aϱ1\uYUC%>&ls[BW4qYMǔ-sB'B6=Q2I4N5 h4|vs0)[=u8b!LNUfX//q<U 6MHpb6a8P9^{-u56i#tjӥ|[~wb~O3.(ur­j]w~4KnV(P΃ s[}K$6qkY|xKD7P٠!-$hѿ'ꃖX+d2:MNF`׎qqvu]HNw0kDT,oNX:D=]R#}(MS½yt"p0ht ,˞\ )2ǵNiaZ¡*Ĕ-7 /Nn/:,Q`2@CxdԖhg  LgcDI6|cGujS P!mQ\ l5[T`ʎܲV%z|ALtR:F AՈ /9H@o 6Zk:4:DQo1򎏒o}ALi2:#.57$6aX_d]iUdʪ44~V1?%[U*|vMQ7[2f>EuMd@1sRܧ^9M=q>+jSuX5Y>\ݮ`<pyVkͯC@X6%.EyC76uFgRnZ\̅#O׸h@!yc s%El^mCw7PtU6F jUe;?W{5kx wLϷ^4~6p"&P&&Jy`A 5I4_}=6Oҟa)PR%k iPa3E(:Z$(A6ūӦW%A'J=rҠֳ6GBs`YfR+Q@N)B?F-P\,1h=ZDG O8Ww<Fq4%|)?m$Yok$Wkӓcڕ-xK+oIBS类@2F:Ex.|b%OxkX!.L ~i4itc 1Q;IJ%ƭU$я|aj2P{JU8Ŵ=Zդ[쏎Tp~=,DU8{xi:Db<a6 sOa *1dEl&/~Ԟ<=t2x;NAqAJ(` ;dV `3,B>&P7)¼3 N`S^&Cb/n|\:)/1MЫEfկ;X FT()8Lzin Ljb$8Ur~ҋ/*ۃ^O?pbapOA3%2?6={ y: sa@L{ jA +Tvss0mW.tn]?slx_ޯw6-N/'@Pѥ AC3 懬%_ >1;gq㐸KQbP)緜ej+KGcx^A<J p&OQب*W%cUoמL8!OPp@@:^Ķ<\ܤX #[k"#~˳siiMP9xxVgw86YsN~SLHx(:ș8%}`H#!\7sA\(ΤUTNAʝf%rثF]Wnq%#b'\Icpn+Nڼ}q+GhxN[Sc`frKp`&Í't[KXVTHޘ01["?jRo"UFD]F խo3C`Irg 508h#i҈0C Hf8zoj[IW09!X/x:;0QWb-ul(z#ߋ}7O}>(5G,=SC `wLsd_ZCݤNҷ%j N& #'zS)eq^kֶ%@RXGXi T޶;UmA#EOr购*ˮ< j_lϰh2lyS$ÀrRg ˀ^{y.O͎hm|l{H[/7Ѱ]8P:uAh:g\E ""1ZL" Js2J)E n-Q5k\/ZXH-}aLM]͒_k\IR(\,z Ws #%l0IS 7+ݣ\.58\ T:>_m1!kͻv骜0528bVq´XH&V5sxyL+1ش$qICLĭL?PGA1AN/rˊdٱ:PTR _ N=UBf]yEuִsRd:n(!edX^no~~jVΠNmQ\i =g2=t% qWs-mܬnW}7{Ţr~{w_*^~_ݔz= \mW"RC=VBѷىwbd ml'Z"4$C-%2'KX.E|YUE51\Hl0}ۺ@2}220L”2ܵJ/;Lb; ٝc|i<|;we H:8׬ؙGv7hq zI !9] Wp?@-}U 9IxҦt-֝L rF|r] Ș hM;u4(܁1 }%|o6֋{ȫٮ\ޢAW_&v˥t>c@Uh:*ul įgE%h%*ř;֭ &^xqs&4Y  ǎ5]F8۠mvUe ~wM!:=Ne9]6t[['%f"n2Gkیb[ _/lwٳ\nGes}!>$}ߛlnlxXscM~죟| ғ-mox鵯( QJp$.t^kcՕrj+)oeV(,6fU~0b^ ٧a$^]-0M0%b޵)\EhǷIrlnNȊHp iݠۚVb*ƨhSъW|@.\: #yi;},7Eeix &Dv QHتA@Z"hLܔV48l 1Lc?X&SYp vb@Ҝ\> .Vl|=/`g&1}iD nǨo#6YHwaMt:6M*}:$6m"<(=R5Q4+[!k9x"z0 azȤ@Q SEL@ `تlC<8u#7B'Rj$4H!e ]䨘k$g+&+e/~9Ӊ:[Xݷ\@9*eKmqvxx{_\HAtv E$r俴/vx7ЪiKؑ ~V"k>_FuT9ʫ r쫻n4F#2Ad۸VƑpɄyN{|U>zdg,΅\B`>[glv5Euakqw~6?._WQ6Fޠ݁wV'aHvrc˖UK X.//lAjK2ܬaUel> s.[3^9F{fIܸQ6hh"LQ֦HEҗ`2b;L2!# ,1ygCb*4ZfI[սz @+8Kl+)Uř*Aa2 l3+̓sxjZačI ,DZV0*20vAlG@v)+by;=6w[LƦ5cye A)ZV9WovO.6;!N&)Ա0+rG?~NЊN(L%yt,(e֨{ùwXgAc1K{eW:}ѿԏdFz< 4Fkrwb"D+kk!--fsb< !RmkΜ:c@z̡gҁ<-2w/~q_h0kv({kpտ= |)e^uaJRrE N?W41\u}=K @Q;jx2r.pgֶcc<s,ߙBy&{]˽'xW[K>%E39Xk-\K♱ҦTiQʏ\V-Cs-unޏQ":ѵ6YN3glו0J7li*y_H&p>OzVlsfCtl`HtV gD'C9r]n.̐Uh[qN<2|}(zw_$70̜6UQ:$QkY4Z`+^hMVhvV|u)ytyLX<,l)Ä@$>685`Y˭Vq~5'!N q M 1M8*!:::!QԘ +|&S`H ؾ̓D{mob?HIgč8 ~(u>M~VPԸ澼yn9_-q O͏1d[||Åh[:jKHxٚ\-$T V8S>uF=Ls`;M.h&Xd$bю[t&z y" DxLg$$ɌYW܏hP9<:cQuZbүl=} 6k5Jgu|ߵWQN4‚8\@;Qc+p;:N:W&: ~.p5aUo۾^Y][7=Hy cە|c?E с Gqm! 5^I]s.Q*ҥfIk==$ FkG)!<O&RUřdѱ85aB(rC.L4'ltk0ۃ>F+0JVIsђv]ܭձ1bq6Jb<[ô΂ďXq}o-\obt fi7Z%Q1ǵQ*( 02A$9$xifP`w2c'bV8U&׻f#xMy\#&8wT$A V{î[ IDAT@mmV:ȆPBW7ݭ*;{&Pk X+l/k#8=xv YfH ?EOFAYj.uRm%ulQ_s*/&H7Cbl02bh*Sǫt21jXݯ(x'N1MmDW?&œ )NO1ϔy'5hL$0;b>`Hjv"Ikx`LA(%:;'̖̋aY+$ 9޺w ?Xj;gs5}oQ%Nk~w=zSJZ%XEl[7~Cۣw%oW9R yja!MktldoPΞ%hW߮]sȩzwoVV*Ҥ'D z4VrWt+Vg#:GCSc@q] r\\Tp"""`6j1 _#TlfP뼳Vk:Ek݃F"o@QGG'^^6nփo[@CmEղ΅1It2I"x72LP(~ظ6?Y'iGKY27*\1br~_>O&ߊΩP?خ1=!&31}4f攍Q™? GbGs%ndN蚍@6(k8.o⯍ڳ\{ (M"*nčC6=cD%Rq ~KH~/`%Ƕ?^՞cvFB7t9E{BlZnzsXZY)Ý(MNX.h)z-E-ypll+{҅Qu(&R;9 ԶZ\fڝ_<X%)[oQXx+ȋR@jc\RhQEkgL1LogOOM Ti2ǵg I{f š~Ej03`(X eF9<*6?%`,se5 )ݷ.ji]3YTT/5*k6/}o,?EgǦ+V*!kQ\tt>uĦUy gś)PIZ `{Pjo{h.`M΄<9q@ IL iJ+]aT*߇AbԸ6@ko*elA }$BU5snwL&3w1HN^kF~DHeϙS7~m_S<HagmfW^sF|SH~r7^*? 趷SDF7{^8Qn7ON@ʞ.i0نlpAXL8EB>[eK`p0Ͻ@x9cCF]$<-\ΜͫKm"cL= }:Ÿ2F)lɈ gxۿ ,d84o|0|ca* `b`pBGsMj6uceP?@ PXUpۆm7tE*gL۝ U%Y v衖hypם9,⩳@]di-p݅Cp\>۠`Wf)a`ONc8~M Ya<*`"d7ԩDiز7=`8j f2T.V RDɠXb :os=ؒQK pNXDOXE N 1U4EJ8GYqy7&hS .;-(IYKdCAvl]o`\eP݃͵37X6q̳]mo"2AILT__?xxqK=<-{6hC۶ΫPc LgF+ 7f1xtd|K#;(KW*4MUh֗0i$!eZ' ft; ''$.w8.͌OI:[jwYzO2yNkK A&-As.DxFg? h8! AEC2W-Т\a8^%l" A=GuU l@qqszN8r,79>'PIOq|@Z?(h1嶤/`BgG lwN3_ya&K2 N}1sAalkfV&5~0&A]SAQ00 6SL *Ĕr['gg;:67Rb "\!0;aB9.kbWw6]P?lQn=9y8ձs~@ts|pm/q t\@UmCpmwvx؆$!S6["`vrQUֺ`-VdDi|1 lH8W[PΈZLrXTrqUd H݀1]}p3 G=#tȑbWT@XJxvoB* n > (srw`}y>;1<` :WC>#4R9߭Sy5٘o6r%B:5:c#w+2= 7*% ǘ RQc=ɴ oOť#vf >N0 "ށr#2p8 gӮmM?%}iأj uAw8z]L x^9: E3A&x''G&y=;XةBN6F`p旆C@URd:V+pZVJMthi{z+QQШ># $m\ҩh҅R"[$Lp49t|zv (]+$vn΍X%J Pqz屒PcT:`2p1_3@RШ#2GRBN_(afM(g>eݷPaYlNfSL;8Ájy7j0ϜUU* M*%c67IbLG'C^8ѧ)ߚ#dD )YoȹG^ƻ:f!1!6M: LH+_hۭx_D?S?"=f_g{Z+A/8=!Fod=eg '>_aX,t%C!gI:C*ApvE<̧39ZH2gؖtD*p'Plq)#N#}:\6sK#zcWSȈIYq^,^*O1k2w;e~nReO:ж38KƵc!.+x7Op?ݽB _QNƪ$~nNtY[":7,ÞowٸSb*,$"(F@%o l8 dA$bVL 4)D)!9kR]~<[iRܧqn{glt&n}Β Bw%31Zt96yvnh%-m5飋i9gCu.`(,B@lc Sp)ëO`v}E-''v;DgB'׊^z̪[k[m EC>g -K AEsMXe.*VefUR3 jEUrL]i->G4%7МxbХ--@Ї~6*8 mtMH_0Gq.4u_[7 ^w{߭HjYy 4J~uҘiΪ>=cqߣVkॗ>~2ԯiA?h v^[89iϾRJ"D_NP@b٪6 c3xr*x>+6j+ [Ȓ%*m G|@bUX.ȁ'rne!M֋AK@Z- "Pfg%rl(e=|lvlT2ߖ¤ umz=IDfcDG!ÖQA fST`Xt.!Pyc QݰB1.PK=TuϠkå\ѰK)t ŝ fa,:ß`]1qJc^Z@ hwMÊ6w o6aȨoMֿ<u~`e[:@}+hH޻=B!ڨah~Ugo :+`B":gj4]kkxiлn`1 MWfK:qVLZzԁSPȒXzʦϖ:yݛH'6O^ӳDŐז}LHBAu6fƧGbDP ilBcdK~<+v*v1g gHVl:Ok_3Y9y薺̀fNFI&r;~aV:+j.Ui3RZN(e((OGIq +kMW[T%V}aյ1hT-@E%](0d&uqI!+pܓivu]-ulIu늟< jxgm4.Đ@ݡ׿%^wOҤ)iU)Aـ+[)M;uN5cf0YWI$,׿e|_s|]΃F6q_a|jx uc?_]LHZ_-:Gl-!g |& tb{l^x61V'iM]gy tzT)6(9v`cplU聗PNXIUeӊFZ iU b2,.˔6%$ĭεM:/y@/|ZT8 h\)# kvGhߴPIBa¦ C!f;סqKGn#YLV L4# P*2EvHm1l;`ֵ+7Z YřruskZԞ& E&>I4i XeΗrElCj pBDN`ȮyEQ4J/H@Kvxv=C³)h zGe`IM o]πU&vCPNNuEV# Vq8CSrr.̧3qi+ekeMf lW$͖'k#9WgFN |G>;5 'c[d#DhLD AUdG2W ,d m_Z(3;K"'`-g,eu~gUys{.7 WOVm܊G)Ig*^?VAy xas| j8l;xŏN 8rObS S IDATěo Iq(DD92LyD,zo<Э#hP][Z+fk%YkOa#23 BeV-Mg],cVO wČAG)j0^D;'Ҷsݪz*# vQ奨;rt@T#bv3Zwh\F)I A}lӔIBK-\ 'G6vs?@SaIg׻l[+֥8V~hH&@+}iWM--DJ$7lд$s&og{p_ꗐ'Yt VVh>Agk<5x[$}'?U7[ڂV+a<е {7>uۏ[w+QM#INJ4U8q3nzfcąimsۘ4 <߸b5M.6q [xbQ3 =5K\#YaE-p50,OO|O`g8! X /]n'on5j|N< QK]yNf8RuٕQWU:lŗc}o1y"n\ഄ ;\c e8`cBpra/nFhjAJ%Ak`%h3:)F<af.5O"lcl*IWUkx:`72h #r&[p|x ~'dw0XI`$GĚϩZY_$d|3e$ߤ\o( 9%R)n7<|4^> ΐ/40eR.GDŽ47h$ ,1:tO=EJX "c j\[є@BZKEP](9غ (2"Y(ٮӏ䱹trsjS*"["RIrJr4Gߜqz( Kۼ>"g3-./_ (jԓ萋96р7@زۨ7LnbY%&k vAƓD, )&_#$l!!jjt*T=sXbEpN*w2ꖕ)n+qA1 N{PtQ|5"|v*  d+[FjTuN ZEǤ55 fib9|݋`QԑGA4MYtF$Hy- yB^bkWYb+lq8U- }ҝqP0jw]`9KՃidX1j)4iL9X2Xֹh%lO- .ט)#'ZQ9u@ʮ8yE;4δF8$2@5r@ mG>)d^C?VTTƯ|UVs8W=:7iZ&~WQ쏩0<\]g*/G bu+ lO vBF`qywekIfY9FšNԭ|a47fV;:AmųaacG?c)jf&GMxjmC8'UexvP1^_}veJ[*-519$H5r`AGf~oӅϒٽ(rkZ”1Ď0tʿ ~~X{&ZR!^@5_|:=[ s @LehXWB-3=!Qd2ŏ^.?x[q_(ls;ޯ- cƻGJk3oV@ ^G3Km  Y@]=Li] h4L8>\1mh7D(|wYr9;g֓b|mF3oxr1PC{nkhne Y.f&1S>tӔZ,[I,tbpW_!c*;=lmw ӻ?@Z`u #D,\޿"|w߽$N ^"ݮئsCserW }\ccw5\p)$0jaLX.ZL4m0Q؃ FhG&I`2;a/^ǯ򿃿M6 H(y<":zzrNĴk$;Ǯ k ̼HeR<׶f,JCc1$,C^ǔ꽔a*E1y$KǸzH@iz-.t.k ktA`ILY[!iLs_0~Z0ϳf-mkDg5u/x;UUkvӺϲ[J.~LՂjZ@Io8|P%y8{ga=S|>xMZF/4 eJ#L6߳++Xѱ$Tŵp=EbX-R׊K!= FBJI!ۜA;܂J*Tq 0m!]ER:Twt 2i>@J G Mg%Rg n BY; XVW6JDv㖍[_EIٻP蠵j%tnJ{ZTZe07еKhhXJvTN&YJ3RJЎyl vVg!p$?"Ɠ`sc\kF!ꋊ%3=N' fCU̖Z@~9EazxGxCnBU%s?Z;εa6+M$T>&C$<@N%H5Iw/aEoꎕZFW|>cH9wTz>+,{wpN`˹o=%C9A51 b \hH⥶nK|sXFM|Vl3*MX60: >\)䡵]_CxBOy`'=.k돋ix<5p;Lhix7*)~wFմ.Ŋ\h)q~V]c3|ÂgX jMzD]JL ZǞnjx=ڼ|%剩#nHbP01LJ 2(c8&jR2 3ķ%`Q|{8` =,k4,W! ,=b"Ԩ#urkv;F2 mErPdZdžV"y9fc.ȇK1[4{deb )Mm$B<~ ^Wݍ?S;(f^?>: [4z=v q{LXlb7RS4G wk< E忋Kt!" JF@ rM;_謞#@Brmq܉ƿm ^t2\fTlzua~#>D]x{8=#]V`?vĝۧpv,&+nߘk?S`xisG.ٶ0O]J2=65fM faUk*ܧEvO=mNJ"R 'o!m=' $b)ix=f( juV[%km7-b⃆Q7omgϟ暏rW/ +=WsyҮ)h逆+qb6# A`ٙp 2JRX#%d(Sv#rt-fk_gcs4ra!6wv0p 5ʄ;P9Pe,gcLo}u"DQG:|~St|*b9AsF~Cp#6LQ S gox3G(*[E>I/|va`qFヤQ|,5q,4?AQnm` :\("=7:]vr<^ ϝc7 Z+4K4YX=J6sV ++[HN>p7еO NXp EQehdO S^Ga"3qgB υPa/SNj4ίUuZL`3ؑ _׍%-z_jȢu׮mcoo(pn*۷nң-N( $".+<;chrOpʎmi UlIy/{ܯ^?I^(Jw}Yo_T8V@x9Ϸ8n'#7.3JC@iO{]9lgk4[2FIuPuW4BXE~wgn+k9hLc!}k%lt x/`LEQDkYYE53,:H8;dZIzS^ Ru^³Q,s& RMY73@np̅0 p<;熰+ @9bzʸDmlN5)D߃ ~`Fǚ /5e2e<Ϫ`<(|E!Y$Vc$T9pa!cu AUuPIQʙP9Q, =%BR.X1do[ N6ELan%t2j@t wxL3\"}r@+< {_]5W hM[ NT*j>YL_4]S9!?VFgi_kM>7o$Oֿ_a ׵J۟BցX=^[Wt+`sO嬳 IDATx>+s<Vi'ZO {MJemd qļF͹z<0 tY:;X n? s|z`l~4 C c5EQ~l-?X} MإpV:]H9n생N' `&%{4Qs3?[7&m+|ېj,$ LJDDKeG={' L߀[dqu6^ٜa̠"+7izQF# hy(L*/v6bҺ ˲ay}C&.nU-9S"<6^?DW{-#-A JL`ttX^0=F/]VNg,q_"L;g!Ln|k4~$NcǤa6 =GR34"wWED- oZI0RR1s !<20ncv%cJQh\(ZZEP MXviawE9\`Jry5ylMEp` :I0%/tc SnV&zX`e^co(0ĄE #6w0azz(Dsj58* KEgR(9 BvnD@6 ؕV)΂5R5 *cޅQkLGl;db`D9 E|F \78qLC< $ʬĖXrUP>n׺kOĄ\3ӰFBNbk#lKMMvcO5^GG}[w- X HikHF5a,8JL`葤VCӂmvm^G7jټr2x|Si"L8HSM${j;$Y֪~A1Az?^IT& ~OnG|Twuu,xϠdNy?m== k?.]p ]۹'b'd^{E@PQs DqEba :D|f׍ ȍ%"bK/J=[پ0v8lqA'zG.r:2_K{9A`ayןWͱn?[1Y7w(Ax<3 hVM@]= hٸs=VsIKߛazr+GK˱.?l]w.4X -9Z{]G5-1~'l?2O@-|=D1'&Cf[KWAӰb ؾ ! Vo\EџSmF bo~7%yeX(>%[4MWV"YaVXr&+`"=|UËBZ /qrrO@_~e#=ly["7Bύ0p] NӵevĄ(r INn\ݫS !4)S#rl\pe~b8a?Ǡ%!Hҕw$1{zaߠͤntĔm4Y=\vj5V+V"ߪ&H7h mc{{[ n7DK[>d[=QKxtd3hTbHjI5TquK+ . v6\Z>fx*v~e1b% G#ܼ.L^"ε7>&v kjnsHdH`]J8Eq*BHP`hF(x\PxLM 3D8d\sx)|' N/Ԍڜc  T@2+%aǀǾlǽu b߻㉚亰H_E{߄{L3؆=lhcXdSj}GYg_kFkJp}1BR ³Oy/rM[2rΎ6K$',橌ÍDɮҁ ~e&D8I%i-k^2Mg $ƍrOw( @Mb5G_~5%WbbXT5DkXu :]UC=}@`3jBUU _ 7X* w|&i*A=̛}nv^c[?6QOD_x~=Z/Y6X~|}ڙeHO?_=N\iտb!d.!Pͬ~Kh:.x [[}mliAsLKx3(YۦpVġ#]_F~_IHH).u yK"]a{ D04׾o~ Bu t[8z{p5NOkQ0JvԆ""-߂` a"C53ǵo]a"h-qKɁ613A3zc(~ w V 0дu5mM08G$u%m\3Z@].X!h ĸh*T3\i(0ف27[Xŧ2i ԶWgXo;32`G*Vy,&k@$I, 1^|EzijXs`>1X$s|Bi$UUN8źX ëHeg4bh{azlܐRjp}[}.9-lXuVJ;MpbiX >,Z1B؆/:\kؒ|G$׮hDxݰkE9drX5 r1 q :ALD)t$^dӉEahM#1q^O=1XvǕ]^SKq(,?~{pV1㥁k%2f" ״?^r8N# |*ZΤyfajQ2IV^];wJsjss$кS%A:3b x)AL$i\][`S$u)4ˆFKuۇꔶ%UNyCqXJ Ir!#@_??QeiSlEZO~s]X±"q6 ͩ@iȨh1OK;[HRXղ[H. C T/Jd!8U8"OtNk\zXֶt^?Ľgj!ƺݮ P'kֈOA&ȗ9 )mYLYt6sRS] x.L'~âD$cI |YZgb4KL(h5_ hl3Qg>?}*ZUSGԁ-|c#LMӇcvd`ף+Z9 195K*%7;BN#I7 ֺ_f?񐖩&&gPz+>9 Jiif󱌡c,9R#5tRc<#g\<*\?t}7̻S=M XMc3+~gHŚZIğ\ioS+\YyS;_[R5*I MC8wޓa|0uB,PjЭr!95 H68x{zJLܞw5j;_IL'/87i3T}iݣ7.}588Z'Q^|-qK":v tFa-Tu+Ӫ-+q|`kkiV⍷ƕk0C:b/KYZm.C3&oM]ڵ 37{b߹7d%))}\v`;WmdPiI_ۖv%|_|Oq0\n]‹媡RJo[ŒUz\Tjf.2|( P'3TRY% ey* Ot 9 N i3ovsA-rS`jٗ~'T.`i5ZTLa($K(17+SvUҝIYh#$vDeL<;#xSRt9S u#͞ ӒrȀC|rsRJ_Wڎi#]Vcʹ~![OӁ`Ac [m1<Ʈx]Mw^羌8͐ק[XN) 7|/Jgn~0)Y=@YAkdqc0%1-Hxvce߽w1T8^+.k0y.U] Xz4VTJ!ljpۣa҇{C15t^VNfp-_N$Y/ r*fNg#c`DŽt:ph49>YD5vG#Q\yu̖\ZFe?jX DI":N]oS, U,۟Gn+݋1K[{-uwvﵵZѦ\Kz+akR-D.5<;P]3*KZ$ݠ Iacq, "Y ,ÎThbJI5lr n3ҕqᄕGࣘ1HB6jDv +48~ IUdnX:)`X3XR9϶\ipṖj'G tt& r~nbtM`,)TJ5.r3`G>6*y\nhSYd[}ԎT$HWBEuK#(@RՈ]踐t!#PH`744>=F;R+'|Vojv<rO`.Vs#qd7e;* d rjqmTu{mZX$K ڣ|U%(: G[Сq0IM{'U%@b?R,ָ͔fi!8L^2EʶH `w{[{l\°7B]b4]4( 5Y>ma_&f^ GGQ7`^A eemㅗ_|XP?)5I v@9NmGXP$߀5s4^\{c9_Jq4Y>,G,4g}Y&xf Fy|~Я45悿0rXS|^?M6c>K~2ʌ8ǙoB9/[H F7g6+W* x??^NhNM )`l(dqoET.WOP^9>dX#½C apc&`/7ϔv/lObp|x{W8*Ge` r@9𬁸'l5J IDAT0T!^U%΁{3;n-_g Vw h:|G @4@g*1UomS*}n9^19x^yDuNZ d:|HYFV2u׮"Y9n<-,j`Pu,N|;F"@ VvDNj%'d%҆ P>Fӑιj4,Yvq, $4K:\ćMz @t1o[y~\8]xE:"-H#? ;xY Fܔ$A)ye)IAW2?;)$VNlc9uDaMr!I_r!vvR,`Vvտ}K&cI$u؊88HS(9: vVZcU g뼃dP9ZuLD|Yi/bXpp\Ç_wFbYjh:OzmR9s_I 4k(~Ea[Sdq Q%d~ʟڄPApKN,#VHmk\E@zgyv}i3%wIZiɲFH_#ȏ'#UN'VKBv$!)Q2M$w.3gNKp]svp% # 3_yJt;Z #,9֑EO4U~Vu#vFoLM@K!jD7lߐ X! IIi+AI*+9MF*N& IN'iE# 4ɝ-Y4p;/n^F-LG9V.DlLwֈY(Fb%gQ2{vp2^ǣ!3f64fB,pyljɀeL '^gHz&.^|ۣ171m]M:"sl/Οօ0d`*2h_ˎ8׀4 6>R@nb27Q1" #A,Z|_dzBOaN5'~7n/} G =,%q9R&' E &bEV"瑡OԄۯRk,#?O]ħ>4V Hy>b4Ul*$Ccv@`ccNhjv&Y,[dU/53W$2:,q/i{v'Ƨ|Qۃ(*`^Eiqp&(nRTӫ.31]t}'evFJJy+Xy#ƙ [(3D`j ,9"7iV[թJ+ל52N={RCL_w@Ka8^fp VPm'q= n-SlLΣHKQ& ޝ}Nx)ՀDɢcq+ O*S"QF[g]Pe8N6&GX.R}Y$lYӭix^f3 g.l G: JB=~>C,K!>*W`H%C$s1+DuJ<"ˌ|;FccDF<*'>Ǎ3Q V625Y+$ SԂ͜n3"]IlD l;?q4 PبN&zt)V+e=Be85ܹ]JK4vfm6m|c`7o^|zM!|3b:6mD-2L'6DaEa.AhM@yjjt(Otm ԅ@ZDRNVy[jƎwT"$1!JS Í:냀: [bV*=iqOhڟݽkB^D93,e,$ُ `u ]RF6–T.*0F#H lW?xy ߉Gw6Rv Y8p\(p"2Yr=(,'Exs_fZOm5R̪U^cX6>*W+_ol&$0M㜄}lM7t qFcpT@2Q=MllLbKţ8uZ\mrդFa6AQ IeQaOwKoŭj%?1]kD8]yyq o\{UH==֡{Xc;mk{6g/?]׍d\f">sߒVS{:/d-0]% mX-#Oz7.Pfїi?m'L(΄: RUfE  -/?ݏ&ⰃH)F@x&26roY$`.: xc,Q.fG#BAЋ9xexCObqǿxE;,P*_`c22 ԣ >bć!$W}Q}'aOhRjDVgVC{ hPd56F?[rZ&߾,MGEBV/mZ!N֐]oFo`x.iܵ8h?wM;f99황_HQse θXeHH9@Ġ̐$CR|O8/sCZMUDcڼ+!Eh-1:{UL#Ѫ&2Zh| EaɄjW),qUE)8 l$QF@Ls[~/MiV\ӽyߍkY\?D lUQ' '2LlD+3[;ƳD]B1_JlRn')G?[jZ$HOdUd:=¨qNܚ3dgZ-5JӐxl5K}]Z֖5e(V8k4Įj ڸG*{(bB*\@s1ސrt&k5¿gh>ǓTƓz)|Ǟ|ڷ}5C?N|waS(gG>\$H2hWҸ%5qroy;ӿN\ݼ)iżq>ag^yy2'=ښ lE]bDqh+gsa 7QWWDCczpg&nR,bmnmp~Y$>k}p̓.]&2d{ #λFJa[)x,^x l*aZe9ly);r X\8E^ au ? imN;o~HwPA~Mgb}o`;簽smEWGj}^PB)PnBroM1 T.ߺ!Whc3fM "@kpZVWZ0HnW;j2UP 53/;[8<<Թ#08w~WM=^R bh()(5I^ f.QjHaNZ":8e{#g.3&ZaU'R(޼-{F6a#t+?#/,,Lzt%CY䊰>vZ4Av,:ԝNM?W*v]{vSBk7\ eGSpdémOg3ǃ0J:+ I5=ia!ʪd#]cvqqk4Ct4rUql dP+ENGGG59(OEtPU-lW)l`#Ƌ0 a!WH4@MLk(&.b֪_-S=ĘZT(K}L=:ʪz/|1Czo-kkhI4iU]c~a'$ЁNIݺiAt,p%6zQҗ>} ES!+s6&&]6<|מDD7}d&Uɹt9Az:Ώ佯10A& u Е):AKʴ/^h$ GMܺ[HFb^@ ʊx]2"uQ0{F5l4Ƹ5-YKh8Q)l5]ÕLH2qA<| > NFE ^gNXN5c"OqBh;`[ǟ\@V1٣1썯wh BC!\:da*]2n?/[ (I2ŁEM_:ɘ*Ci;5rjsx0B#]G(# $.pgPGhlb)!,bpe B@dV>gl׬@(]2y$ |z=DzA ʴ׭.-`8bel\@Fqh`S[jAQhbm[9qWϢƲKL Ztf0u5bp?e^4]*vS2np_NoUG *#JLCnb ~M%ƾ$Oәy6J {QfHgu9 e2&L+}TЂ_ܹs8{<3V"GZ#Eq1lQڨZ)~s0S{|k4z{u:y~M]oǾv l<^]^?~7hW;K?8|P'Ucs?aAX!T]Z^#_\ei1`50p9nq,{/aJa_:iW4QoO7tpxhF 7^HcLăڻf,:;> #q[uԋ50LqQé^D>*:`b̫yŌEi$,%u x<#~0웇Ee:-t8aT)rel9jw @>4:oE?lֹ lbs+uIDs'eot㮟ů. nY} :_+3Nre˴DŜ0G[` :ڂQn0q vJo%ld ]d~Qno VlyU\ hjf%\IanQJ3,ӺC7_=+?1 ^Z1.y,\,nܸnX0`Yi59g.a0ڀh:8dTLUx+Ma_ygD%A"Y$Y4H5H9+bO{r8š1⿉g~}kJ:3dka

    >[PѮ|o#N =[M@O$mCt*EvvX6"%x , O>p!"2AB S%P< 70Z+@I2qƳ}\<@h ؽ W}I\BGC2M\&b NQ!|Ly+TA>N\^491-_\:G sT[8ѩH>Pe5@йNz^{G??aoJKNXpO=ic)>F]KR:vvs/}UiԻޱ8{KkmgkKIgVWry, GG$oos$(=M\{YOBZ5Iɯ&{"Ч^<>FHb |O>-Z[Gvٵhi` ya#](k : 5ee@Z22QNXtJLGZ!Em?;ayփ:nc:…/"Xlt,*]0:?*)Pt$T&PU-ĀD8> JaBL2#5lFӉd*,?i`jec%+0v(+ɂ"IQBNfq=\tS8;RˢD}&`(͔I?taK{#&d**m5(_+ X.93 ʕ5法1jZ 1KXK97sN~S!:v@Zo$}c>;6]w ߕ{׳ >ko˯>, E];f;A׶zRK{t0h2 lg/?ǀKVXH{@gr:pwמ}zZ#TH'0Iϱs$|W`uKtu+T%'>2$Ak k^T(P[gwPkh Z SgLcMڷC}5 7,nfGpCcWryQA*W;zl=0Gk]f1<,cҪE9VG(^UU 0 lň yU:;QI= Kr++4rmQY&f<˹ƣP1Hbe$FGW0vPu%~GjZ;]cweb߾=,B7@Nf}p`|ZN w [ nRPi |_0ZdZW0QI4&;F%G(Φkh,O|VҰMĵ_(]IuoBY(51&E\ P 4ccz0EMgH|t!4 YMƱȆ<9Ӊ8"En߅L\4:7zE&W~ `W=t$v kOw׸}Pp} Z+PYH0lVвJ]ՊdYK/PR8r oS/4~G+\~=Ov? \3~/NJ0!);}N2'>xxK_-=D2]V70P, ܽ{[;p/3Zo^dP$'N*,ܣӐ$ Ն |Ï<,|[ 7VcГ7o!Uy.z?=ɤ1ڊM2`c B:EYErn<$F /crgaséX ppe4EqiqR?||&1t4|LmD`/RPlTPzhjNxȨ_C Q:H;&j=#Kir M(\ext0'.!߼&B(=.<&'l.~*I"SDFx !m4ȪE"^뾆`. p8;du@h4'l D2Ϛ $/`hgg?|߈?JgsI0(lu=g>\58bT.W5/ *s5?HRzA{O7q (ARVYnt~]'/|pc24 PnTGx8wx8x$W "c$T0x/= 27Cc:mAdg>s ~  dPݔr}],]aj7;9ZEdOYr_W8me9V+١"jt]j*=)Z F%7EumGr=ʼnVJWWmVݵB$A$Zo7P%ЎDr'Yrs8w|00sN;[jtɐJZ͛O 6̨&Epsc.?s/#l"NǛ0e0kIg6w!a .S0 mNlȭ}Gc.fT4!u}M-\fM]WJqacsðD!->Z< D?蒟@'g9?VR+ϙ@ȅߟ+ "QTzoqSʄ8M5Q.wEu:<[1*Clgt+LġP:6 0ן~S5fR] {kMF\acM; p4;w#~w-X^aNZOt#?鼆<*؝!~79rٙ\ԹSc3ɰPs'zrjP+x^⩏2 )ĤYiБq]U8;£.ykZluQoF&fǰq?)`rj"=&gٱ {|ckt1LqsoUvG.Q3pWi*\ JthѤK4 mzCʺrLtZ=1vDd$ +Q68˨Ep|M19#aֵ8G~ 6d=O3VQBlȢf kFh1|čP$Іtw7 6!'K?P0a6GL ߙ*+? FC6Vןry/4CrC \ 1\K@ E2:ˋJN|S̯?x>w5sxL]4 >_&vT.CǪ3pp0D&y%|my?ji}B'[#O7?m x#:iN ]o G Qْ+2u6N!NA8Vcpm 3tj''NǼNd̗Y z6_H@6-˔T<_)>p n*|(D7h^V!֕Jb^-qdgH+sAf1%++pێ06Gn ӂ dV z@a,KJ-mdw.^X6eNam- ҎY/rfq`qP 4y (ظ!Zto n`c ԅ'1s!OG&2483=4+Xwn6%*ۄ/AqlLF&FE >gۚ99ʳqpgv_`:$y'Z'XN(#%_QOW>:=G1=a,l%ъwY&SjpfgGR;~@8tA&R+f,VM!N],G*"oVVLXZڶYc#i?O#T3 fos8ZPu>|ʖ3̙-<ú/8(!wj2J6L8eeIZIA b"屳 V3{';S#swy-Ge槵s_gìc@|g}cO]}@8g>!o}7}7Tᤳ9Q$ z['{M*_W!2}_&vvϡ}"|C!2ql;}xky,6~41]lkݱ!ynd'}`q4G?6#,cAi6'F~]#ɺ6vCGo0%E g3WS+V1M.' O,/0H\صn-22I;&>)w+EL"P 3CvTNj͔Dһh6`MY*IޜĿC(1p][qg_|~#\8wˁ_=;Б@Ir)%O7QH D:a4HGmPfP/3ܣb~w ҬRтW2Vrj)hp0A0 OژfCR@8醜j7fhyMwΊIO&6HԳZׂ {XY\,DVŁ0 bBIG2hY`I!{pz%|Uh+ml{(kD! ZV8!fBf>q֏$HyZ{l~ՈhtD+7žla_URЇ@d&ʸN1&(JLK,З2DJ~>VSDT:eydMWD+9Xo|_HRK IDAT׆gȷޮײNj8'!?}i3qwCp{gj8]Oy߽v1X-wQ]|)kR2V$|>!UʟX_(?_.x#dU2_1Lt/h8 >~{;F]Y6&,2fqKX[>7O~zU<K''\LLs߹xaDWu4uza$bQ C8>d$B2FȲ3ɐF-ovcV;h!C^,cM48`d+K}=6!`j2lZ;1W&1p%#tR/dwo H<,W34CҘ^~ u޸uw +V͡gGp E<<&G5o}{rcams\z nmu L;)QcUq7TrH< 49Q1g72u ;f7ot~`#n4.p#NوQ!MhE`kti|_9oa8A`qOX BN@wE,LJ'DԸѵ90D3iBk봢dGӨH[MgB(Rϯ[LmǬtyOY)e*V0!H sURg%a,{e3Yе ,"ui&94)z 1P9L8'Q(K[STE6 7n__W-\reepkS[~iOk#Qs*~]c ;?-Ϧ16ܿ/ O Q'ۆn}Qv a;pSYf6T'w>[;MD6@Vٸ\bçmp]k^pF_:%)>Ow(ZSauTh=`0|di_ <*8^t-Q55Rď _ ;R Gб1(>G=VEiҷsPt:|fJߊ `23۩!֣B/yvׁ 1Om'q}H^BL<t1{&' Ws|%"tب4 0ߓ翊2CUX5fwﲈғCu&.ƔRV@ ,SO\ȵ3[/]E^"0C[hS`g{vxHCwch"Qٮv]ca šȖse*k7[cvpFgY`wj`DHT'J`)t 0ZCO,,0?~ۿ3ϊ9Ճ%B},%DPD1,K( !d`*ߥ?t}1@PN$)ġ t%kvf*]Qؘ %Sqx,h{y6< @H Q$]i9SMx gi°uՙBi`k { vmñ:eB%TI"˕~&M0qÌ-5/|4-+dxH*iUcݕ4pg5R&#;v߽E?:>Xk-wmwHz'GwZ;z+; bл ~7:)b.{ Y@?8?;u|}19>s֍;e`q o^Ζ._@Moyԫ#GH6ϡ8ԅd;oR{@2[#eyZI&gw=72Kr}q}=l'>h 0Í=X(\!M9YnNl_h-gY9e6|]h&Y/wp~g`p^5&`۰\ QFp#4k^]jMdJrD# 050q;.%)r"D$N?]W Wj5]٢D\^~&F" Q[h vIcOԌ Q3Iey/i|_™K[pB]CŋT 9|&Q~Y6Mʟ=rUt˥I=?s2BW{rzUU ́X}p4TFQW56PwԱ!/rd)_!BX7ˢn(Z^ݙH/0˃J>(Eǚ`u2Quccq5\7'̬l˗Fpg/ ~3?:y_瞽vCm}ҷ>,`Ɇ^Oϧkc[OO~ kFحoa:OQn>7w(,t==>{WIP5s_)l![)#TY,,=CK_ |?oG*ԘH%2$9}QlKG~[x^zq2it]#O1wu, ]qBwg*fmYb]f&%;MPޕᙐժB&cFFfͩFzeƃTd.ڼE:GFVg!r$<@CպPN|A,=2xc$jDA"Eu+d(xOS~"kDN,lR|-lnWP$GAc$,r 3>4DP<9 JƉ~\,-v*)a-lY,ctBlñvEY!C!M>jz.PZѯL>"f` ) wCU/㳿Yl9] ia@_J<9.Ο{^g&N'xч c+/_ÕkwӘx D#dy])٘*t-]U#fFr>h=$ r2B^Bc,CUbkKIN c39󖢫w-1Ԫ-U+ݹ᠓ke 0;A}HădE)$7MOb8DD'P4o=o{6Xk$pyV;L6 #dL< ้>wwީڅ?9":y*q'u0ϸrpeCyVN;bjw/ioCHFT1 ^~ӿ7[Q0-A @$c|16!~O-4].t7;34sd>>OGY̸sA5Jb3Cv%̍]g 𵯷gɄqj\ UIE;BW(!q~JY+G^z ^G3cDT*S<"t5\֒CzN-: c\,6yV:b/ZM.('2_| hlfS QX{<[MLE?F[p3휪ygγl=kT~pIѸtw%{ A/du&}M[5տ7^s-ThzIǾ,堃-Rs_?Z3`pc7-9U7G- ay+/?i=|LBo52ҲsP,Lp?/>4W/>K= 2uETelOR8MX]:Uܽ94 ɶm;NЮגb\ ޔq*&dD.8"V7'wf[N-81 ,,0 M;RNLk*q$I\_CxJLcA4R(Z^_ Vs5m|xEN:;M$a=p~qb7(G|01#^s= 4gwHcc1_g4'pY5@v++?C e-M;٦("jTi_? /İbm.C;a(g#axG1|t60& mz\?<=OР%˼O &sڝ>Qf> 8JtԝJR (ȏei_G fb^~҇"ICU_]{_jL&1.?'(g^~ &촶#Q 3\ zp%%ilmߖDZV9myyqU?)vhҬ`USgCeHġ=9 RȻ$Ե$*yk֊l9<'xn2n8,~s\4{e 뱔bu=dnVhռl{Ӯ5xer p:>R〰'1~+ 9yo))!ɝkٖ2l#1R3_q;y/lzƩ>%ʰH[§/f} ,I1F+|7>/>,G vy`a2FǠCy`Z$2N-y 3tF%EVR! utHS$wy (Z \8xD8羉頁f`)+1ԹZ -nLB@ŠOV$W%Xe%7U1 _I;}[؁Y0p,ǶIJ}"IU|$IIJ%bQrY)[)RrH9>hᄂ_Rdhtoy1*'cL%awڲE _ַ<V2vF(Ʋΰqu7>)U(O2 ?Ubc{$b]Y"&1>h$MezߪΤiZt pBq,ad4N}ujPOj4Nx*ZcWHb[Geъ@7thflElKYE0"eV/|&Y (OȏHƏ==~h]̝֛={랢 ?/z BC00?ׅ=v#e0Gʰs,m~uz8B;IwlB\"WӱQ~>hG&no#<5TK=ZswpzFK#=-1MI8T$0;dy;%Fq'LvH]'G']o'l6?6}:;@&3-y\2z[d.u~@za>%jUp} k""CEr3h%V04@n'>ȱcƞ]o~o5b,;?/`w[k_CH$*}ow7^Ԩed#eq?aZ!S9C ŜG.gaԍĺ(GZ!k_k,#[А3VcS@.ٱkDaK3fȥ&i_֚7F9;E^}J E6$ ]cNtakVF ,"ɍqc#B8R$lU#v717q\p$*y/Pt?!Qݵ)&q7^W^~aѻ&Q,5R/ꖣ*3,p+}(* wߩK]%?T_ *#NuUYw-,H˕їvQdqێc8bh qshвMte'OVxrB;|Y 5K?%Gq*`wƃNָ]o9l9mT":6JGOzʜ%"c9I?7#U#' GQoq!{|vǢ8 }1ge~+־e!}E$nlIɔɅ l,S3D:8xqcrzxdNxn+4&"t՝ud7-xkg3`™= ͱe 39" ."9yǗgƷ#n`3ƞRעX[vK$2/%S^FJ[#F@8\m\U _fF!쉅vR%X,ϐ3YO7Q;h.؟BLy " +}ۃ?-W;5z* 8FH9O?k7n=w%m|OoH`3 U tkP+M*!h0BF㌧-X1Ft4 {ev~22xDwk8cSp); 'zS Bc0d 4 uQ =M זiJ0li:DC!B?֚3PAhLt1as2`p#\FBx9PPl>WߗHehq2[|֑ϾiYqiϼqy5ttrvH}o ȕ&߶1*qrVhb"Q%bG PQVJT\x'"kNYS 4ʦ¢ۿu!c'32h&o',CV z}nhxS6L$x'3LfXÉ-p,ST1R΄@] ԉX]o ˠ_V: IDAT.&ρĺ=/,>GG15"ŋ3>t_lN) @!J>7_W&B(1sLy6c J""Qi9DSǟ*pEV* Co5WL!埲)Zm %s\c9swyw5UDcCK2NZD 9 ?XUML6m!6tˬJi?ty8jw*GBK&&tL<+ٕGfJU׆}̎Crr3>ׄÀ5>hKL~bm$PUx2VHQ-;GXkmq G&MeY8F7K֬6q`s|d7ж4QJC,Vs<Cu&OGd q>,<to[/~ ?/`Ug9ƠDgh]f5v"7?!]LWLɳ0؊[? /x\/Щ۷p tkg[Ɨ)Pds̊S S1E@6?3P[tb:,FV4I2#BØvSUi &ɮv,IW+lvjcު wtv{ 1h5Nb-+ɻ9OڪP-{s4agRuWU 3k6ji+F87W'':S+Zltsay Ux:C]fj.xxv "Q{wia2Q'τ?>^vh;&rVy+FG;~T:hNqf`U+"=?߂E9~T<>k]rX/sa` rCrIɕ/~ƣ|GDg`d34yVq` $2Q OMak.a4+aoMF|"Df&CtWU y2 _[·]>7K0rdQ-i yIJtz%|zN>34s7Mc4мUK6 ƍf ujmFxF&<4]*k ¸hs87yQ)#S| AV cmE1ZkQT9^J{ 'ux|@O腊&PX5_#ڋ.b:!.\liu5 Q/j3,ŵmHw__0}/**jR v٩r'#4&  a_IJl*٥99 .Anl9FMkjiL98)ԝшmncezC]Fj3(-4r6n`+De͹TabҪA<0r!s>nz3cC6}Q`Dg$A9sgJ虱j=1j U. Nosoc *a/|jk;66`lD r~8rO4(јMI$>'O= ;"h|:iPIJ7?­w࡛f)\x4:?(%J C{(:lG 6q׫v,> ǩ J!q  R"Ghۧ2bDNǺ&͐n Q*1/pvvz;`aYoD2!v =xy-dEzd{p|EĈ8::ĐDP /WWWdh: >>Ɖ>^9U5kH >76ܳ?[;#Òjf\n I%Ī.g,$)U1[l+럆Qb2^ʜP[]VV*,2*V`xZnaL7hk[ˊ=SUW f=OQJ_WIK8DN:'5e=$Sغ\;dWvG|5d߻% Y^TkiS^w ۗ^;c,rd$f5aD 7QYf6 ځ*x ťQ!xZhloV "U )׆bm+= Дtd쯇 C)SujMH`%e Xy P6X-V"(T&BҵQdUimW'yR[-І0왥5N )SW=!hbԝ7e ]]):hӴ!F.^| r'r7  ]xm;g8GvE ;j(xxxu7= `6 t_E86%bh"5uj̘gϘgBo"#@{Ra'F(;?A8RQЅ2>j k;|ܺPLArZ%mX;hle&ޝ`DhV9ZM+<>l͋X^3 FI a,Z骾o%]7JQ P::'521oE<_K8̬._x c_* Laf(p[ue앮rl #QdjuW""~"3A?x?z.{nνv),3&@xW[ح mӻ9=}n:xm3ij7w~k%&lX>60ݜ#5 9'L~ks'æaHcCN=ÅFI3+Q_UwǪ;ơx &®baG8LPIV;حa*Ue lO9\hz]$Ȇ|K]?^˸ysx|o ΪUSq:)zs-^_B-Ef@r^:dm91Z-5$1%NN[YBAy:F_Y,K$ˢzdz ˼L_qIСLlblb;˨\ȲL12ݽs''g8\%N'[hVdׇMN"46$Bcxwfbo*{;YBv!]"?a#hCEUuƷCL3l]C4 5s z(ھ#$ϏzʿhLD+'=&1NGHA& 0Htĝ^k o~JV9iʡ}֐F^=͠!e!] ,>x|O.HE#ڪ2G6ٯ"[RTs#?ﻏ}fm˧b/垵N7{6EճY@rcz&~Ky7P"NW?woÅ-u|X¡;E)r8B &<'+}9G6n5IM SQɍ~J2^ EllT9tαYUQIc-#x#8:pLO|JHĞ P"kbOݶ5X\ YncC*8=3e])MЊy*Y_ǻ \qe7@'7l ~!J;׬mU(y Q$VMdU;"2-"zc L%87n\ ^F,,g o>nYQt^:xX8Ak/!r:gdb=K7ob8ˈO c)=$"(Ss"]ئj"p\]ESg cWӓ%>KOCQH"lF1gqa9q B_۪@٦6(]E(S+p(9~ùϳD41/E 0ZOIH,tѕ5:[6H3ܖI#C^% =d$=o)%[4E"aQbUKjm]rQOg/#|իs ,ر3yLkܾC,g+E%/C[0ewT X|6LBTgnf^&"2 U+C[CrjTy19p-+IIG4cRׂsGݸ{54<]퍯?:. ڕ1]4[`:=efEXb?1ڔ, VWoQ/oo(t‹CJ%"ogX|!^8c8Ep֑Ab=c/Dn4b|tb{|w?˗P[7CR$O"y)Vw QJ_S/P G '}H Xr=׀_ga8]↰[!UZkӵ1nE8o~١7fᔂrf&I8t[`E\6EBdz4Gm}<8e3J2J#_SnKI<֕^wA-4$1 bΎ@DZ^uQ;;h?I'r <~r wӘ#)0sLǎ]=p:lb:ry/c#]uNJ&JHl.xQ1u׹CMWg7jAƝga?Ŏ "HI4A38Q')ʴr9ǵqCu^:(Hd yk!I=czSk,:؁-1Α{''*^誰#j'S=͍mj3np"cwwWt6ǯ?^~?紧|ίOQݿaukf[~~"u=Q֒dS<a曰K. cKBakcOIL'YMSdѓ7cf YLj@|+e#C%Zieni.E‰uh0tصؕ1"=0CVE0=+ȳf<֐ǭ?@/c%\V\-Py*:#IbȔU.Y:fhLptڜ2Pj>#<"Iz-D$9< 39#%VO>7 7'_ eFYJ+',Me (CF[q*Z5f1NN0]a<^ Օ:׃Y[Hx/noܸӻ~0Pq9"\8)PiK7Q[>Bc1/cMq[X t&\Hh2!*u޿}*qcoCcx1<ݗ`.+&ܝήѽUQ)^i[Bs=ҲF ]-ָIK*I6-+;4YD:eUE"]sЙCW0#>Ak%l?)>WwpQEzXQ Cײ0 CIW3|wcl"$\/_> qty)h:C*7nbgS=5v"r#ȹi%-R_#e@<^ fZe:+8!(l8",Y8%!-چ`kvzǵM}Z<$iaߛE}Zϭ`kwƼ! \ nkҦ %oŎ' P̞ji3ؾr; ȄNXҢVHywVXC,6E 13})!XNbGZ$+mJr d@m`Tr0vg"aŔK%!:G~8P7ҔD,j,̨jj8fuy;|Q/̰1&[ fwJk61/U->a/)ɀiLkdd*ųQ,V0w]adNRC"_+7FVtf>!=IXt# k[.ΐ*E^TȠN^y򪙒 +D8=l=ܜavx v8azX9'Ptq3DZ9:bFx`-pp}\~ƑXiYpl5Hh IDAT6FXm`ycUl\ W'N/ kΦHClԅ4˙.͒y<CƤTMA|<]0O&ڔ0tXNAGO,(^eI?^jj--, ;c D|`@™T ); `1{%4 F[G{"KW@H3ܻvbw#qVp4%ms#FHҺ܁q $e$9q=EA7L;ܾ>޻}`W2\-{ D\kµEΣ˷эiy(g% Ыq҅/a'gS@ba(C@ ߡ%٠te$/H 9&;ªh M&px #( -:XMWr]) k*F| K"e l 1qzɇ.r GmG䅅KjD2Ya'A^. RoOb~? Ӣ`M~R|3_vhi&/|qrߙϯaj &Ǚ]QrvEu*YPof;=UCgWE+Қ:u۔dCTlě~ʾl n$ m#iKk΢*2?DT>go^5v x/`2542Q89LNb'̈́L6T&^@!u$#Nx x^n*K<><}'iD"Mk#=l3 EyxwW Wqpt_vcjan.z 8 0EeBǜHFYiՊeDnJd1_,4>!oy?5ScӅ*{X"^GR ІȦYx}a{>i(COBU-ãGt##!2drJ13LJ2U-DnkCz ;Y̬0t .GH%|J1==f(ݳ#o=:{Ǹt؎.cV c4QFV8qp6C:FsK4i 9A l.$$ǁS+nFppۆj| Nd*ٚOOf Xn H4,N1+G@N`gT8166"@X/(w=m#Dh?{$Qq4-zVÝ15GzQd y%GH%kzO[@ Mgͯοnc<@hE\!=cT6%-἟ !h0FiT 1Dbox"]<~ 3\&ûDR^>@^kk2ߑog {4X{gѕt`2 hb F~D!桳CBGԷ/!1ݕ־-Ed؎vTYy&=E''8*隸yłO Rj\gnȕmf,yJ曰$tˡyp3UM%&;"̌?7,8͋UH\#BUʑgN_ (19*h-Xx5#]>A866#R4EliaЉх~U0ֿqzW9"yÁT(DVYnԟ>1I W?{X{-Pg-OguyV;!\B$?Ji2x'/K[6>K2#rwŜ0 \ 5UxY=d5AtAtk] 8>.epP_z%l&HH~4&kI_$jV,Y~c&橜a`.8 m{UXoeUOރ T&s "1try0pgs)8 89}~ ol/t^eGxطϋgTg SA]gAk&YRHpCn5SZ̜_MlR2kbBtWb,ynjZ8:lC5EԋeG x+ij"!$X]r:|u5<d(&u}/9uwLdIx!Y\kUIDsVNsVc.MN ŲPgZZT^ح << F Z-[d$1ɅêS$KjyqX&<塌IƈJ{ݝܭZ{f3o$cY#H. ayؖF ,"rJi,[ංC 0u^[ (b\a{;oxcyUB P1MCQd0JSO(;{{4Ysb<9ѴDPR_n6W8~dLQu׶kHiY![WPM$Clɂ.Z!7$:91Lnf'Q)̋gM iaViZ+:qVYlRA|q֪+" )o#xx W#,'Oe̢0Dm<}8A Ad1H1WXvegOc tUX%el.h% t(Z[Fln]I4 rjM [g/P һꗀ3?=raU#D[?A qx),x>Z#$ju^$SIL^y$ewqt|`Wo/`1U/DR3ZNkxvۆO~|^eIB=;5˙˜W8;;PVkf&rFr&Fj:,K!=|~8Z$^w]?Om1k& (suk'Rȑ,]b^ 7Q,l g@ 3gRH&dʤgUڦaIC Mb;뱐P$9;{zO RPq67x'xyICCr\h6`bWEDC'N=fy\r@6gE#Rc(9"ƲQOt '4>Bu&MUmQhW ="HДdAttM- 3 ]XY{H̘(1meiBPyx䳵f%9IĂ12h3'SЉV8%zm/8޿[/^%JLYNc RDDQڶ>:G/ _B 7Vqrg1 2X&BN d pP,2!dJ};Ѧ9*X [:Gz: wP§;ZCh1K[! Ed6Vݘ5@w5zxas.lF9}XD@:rz{0,7m\zP.9ZSIONKN%"Lgt ՝P⸋PW@'Yw%DʕT,Sx]e9!`nr+k$ٛI!)gp$[ ӟ2ߛty ҧx=l]A4buv,ŗ_h>Q q aa>Y4ĥu \#l;VrH93o|nν,>oHZ/3fh(ߦq7n\EQHI:D&9||Ow\<0m?>f]<Zxo\/;r>Fu}J3\$_'K3$=y@ (c}X)6Z/Cˀq$XE'/d.F( C̳ !Ɠ 1,dx& [c#ך+]g#e>P@_50ۑ:/ 5p&j\@hH!D@؉ѷA@Evr di 4x(6v=|Y0[/fAaa2 N36kxyj3%HY42GKpt%˦ZȃA^ 0%hqCl'8.pv:b# _:#lLd=n2aödix`4z>?;7agĎa>}$8\\NsHNClO^> uޢc_cLpEp//ҙhb3جDk ֗ j-c<Ǽ0ynB˃$=1l< d 9問.gw]|a/ 'D)̑Z [Bݨ`Qp4Dn7; .בsq (XuND|U({؝`Z R$&f+C-,&GjBext=2B\E&W<3p,j qQTe",qѫoˡ*pxpcܻO>wwŋՙ3٤#< Ӧy_,KS4=,?er4Կw͡r5Zrڞ(24VOj(Xgu- (25:Y!BI>Vs "yP]7弟:$j .-cIMvn~85dž%]\d,2g3 q=ud(2UԹt"ޔD6 n{VvR\22Aku9ӧFd$Lļxqz FmzQ5Y$;@X(ht[;nƼGrųgz|Hw!׼P: 2=BrLxqM"G4MDf.ҝ6B3ͮNOBƺ$dRipŦBmV߻^gB}D%]K`vs˵eeaͤ1&l^{0KsL3[wZaNŒtH:>K/&:K6Rju1/ ˳(3THXc aNb:FfIo4B\X%'N䚋r:˫)Gw96vHU`ausqIХ?CL&zo ݯ=_=> K+0*\I|J˕1#h[oݟ °@D A3.Rg7=bkc"'G6}&(^faNȓ cPo wmecӿ?`Ì]8EԈ`U4۸\9oϕ&*m[A/nvxZ}kbp pGjDZ`/1ocGI=DNgBOWO Np=];;;(9#1zqKD;D5)h&cE͍,c G_)xvHy7UM"^ti_U旈-0gY}Ώ+KR& sHN2=*}~:|Q#gٺ?cʍ\ҥs^ UFB qgؐ섑.FЍeJAD.4Bkr̎moVt8KWU!}[u9 lHJ֘)Pp цc* K 67"C -u留u4JmoέstE* !붱Zl`z) JZS l;|vp%IbXyjv}WfThi=0xゐ-8$ŀ`3q1p:1:G[a{hawۛc"ڕ<9{̘|]ov yF> <͟+:Z  MjرhX1"Y֝'re_ mt mJe?r g~q舟±$o0VjoWJcܒbR>4dxz[TL b\D6:;Tlã#a!ЂS㜳#L`o{ׯqihhN;DO1*+klr~p7__yQy |]ʚLP>lܼyS+vHHEۮלIytkys/[;s"t&M*#5U-en5x3p@-cmt䩺%0Ʈ D ՜HtQWg2"c벣|1dC-BD2!a-Z )Y8sXDSAx!JfJBpKߖLr4S8Ƅ]ෝ!,gs5i)Xc7xBB4EX)Pi`9\@PC2|09̪|v`4^5;wE,s 5Ѷ4A k H'{7G:#6d^D+y(g0х"e~V8ORtcLF lr3' unMf6x12`q|02Gysg\`"|A ZS u;JڸCX};[( !Bc]ZVuQ$Ƿ2xhktx1,kG7!tlƔ?GW7-4Qu,3N_DFC _/8=6Q^ōG{#+xe^C tL,yfrdq{zb1OJIcuxrFwB*c&eSOH/e)@{#(I(=`ΖZOjfs=RN`ѤNjxoW|YTx.J{os#ZL ղC>*'OO'܏=Ʈk@kֹ/w/a.$W* l 71YTЯ Jxzyt'yIb>gr>=ϑbs .Z. ^hFF&:[w8~_T\zܪ% CcVFlU/ o]UEyOcX N>?su:x=GaR@ -)-Sb8x|io[Й)>~)eu/ZDq!.kMyc[l{G:0=8؄{aɕ˸^={7_CSG+CQ m˘.j(JS%ݽ'/8m/5-&z=L1^s"qۼ_Wq{N0>㘿p[b !G%=0eQ!YsW̧ʹ5G;o*;A2MGL`Ln/ F|1Nwo8[5fcO^378=dW& &keۗg wpXb{llYEn.2c'n@cQC /Vc>FDT󏆣e[#.R=`}9'Ԟx/XHؑUL,+2ӅZDxURWfgҤ+Sj ?95yI$5_\v66.ڋrhh{DF4;}{Jֆef/:T9rV!큜q0SDG*b`gц1 y$!ւC.X*)yM,beH>u^0 ۸Md9V#9#FN4' 9ujyW11_#y=?EY!loB`gX[R+CBǛHt4Ѝz r)՝G^1kecۘ-pq'8߭au?~&"7 b9%&X樍ٝ#Dժ" .)V m]ߚK61'S-؋0!/"zy!Me\[V?[yo1L O:Yr>7wz%;z_4צ=֬YENVۃuWue7zuOa1׵#htSJr.rV<+ͥ\qO<+ko }_®Wvh8FPH ?횾(B%H' 4:)6uz'B;h5}exjгq\0X}Ğ*V1:~GV _70 IuqRNJm[hQ* U(NdjkDW&>dPNi[|1AQY[v?w AMVC+v8̕1};Z@vınUֲ 0*<~>F){[a5dEd6E^ 5a( $۠ 7]pw7ʽMN1mg%\rĮ=QW u^zVy_oc}l"%OB? UPS BTz4ܽ;{Z[DDBNFLd_ZI5p'T]S}7"aVE2rXVHOS2.0t80[nexxe~<Q >̱'Xdp4o6&ˆ+"F ׬?ȨV//R?)N~۾xp{ Uks{WN`;]scuY4W*S(6 !f%Zuwzj^eQ /K_} 49ZNF9héz?S'c>|&yL>=?\ :ӧ zg [R6ZxQƌh>MʑF޺BjյoR!9!e 0KW@4pT;3ӫܬ;ވyUyY"J$㑂Kh87c'!ʕ>v-QIsk$VFnD 7E|LjϮ0)38ҽ#LghqkNTF߷qƲ᰽ji_ %5_3Jo;vme%-dW9#WZڼ|_t,`I*$X=af(Tm,͎y(ex7qHٓтF(]"Ȯc,?d:h$>wOv(ufslnn} 98yׇ٣V +ȉCZYc%NzhrUaڵ*pȹoi{0PhRd3cȶxV"b& <:5,F0pc_{!AyFVʴDsxӣ9n7wH] jIs"m2jg̏_xYyvUD1:5Mף@0зd8^CA [2!vsb0<@x#L| 21\CY qa`7ZnBurR_3h6&Wjːeb TE]n`15i+ `yw],|{CrMxa ωp6cܸ|Eŧ6M:nX`sejHack3O^]ς'z.=ķ6 OjC7YaT(d&q8"A'UQ(cR%RE3Dn/{w^SHnozojh#z<ۿ(Q쁥>R-@ϩɰxxN>ZF EJ;ܪXhYz{ VZ5Z|}  k ҦI:9>f-ȜG7AC~nvɞnEaknYd0ly]| "%{TA7nk)WCAPq<Ӎȅެ&iN(rVVp!]mq}nNVpG,%8  qTT԰Xq% =`G߷: ?xP KYk9>"?GfV'*8=xbai|`Z鄭BJ,e*hBzI![1Xպ:P޶$]%k=FA9,X[kǂ,IW63rn/IwC}@-tm9f, bci rpqv.`mظ ]`Q'mcV!YoU4}#SP[;nЏnA(a_C~)D5No5ZxO-w VG/hf񧬟ֺ}z:5k_Q} XmӟCubٜ?޻#3XϹ_ӼK+HaadΞS;>'c$ٿَZ5RȊ`%Od),4(V[X\+ |,H5'"j S#t%6llƵ;.C+d+r~Ժ<["25ž΍(%5m z-Oóh,t97SތFJc+ޖ6q 6듹4 R1:ӣ a"P"}|3I6+ 1E:}O %Z.yʔJ|:$\Xvm$_!<].m ۮ]+Rv;Ʒ bB[n[k)ikz SFA!um&O5t;hW)lGJV@ʛLt2&OQ):YAKIrs;2xeh))f)S 1& bz*U+ 5_7 < b xܹ`B [SkI 5ca6Ujvl߹_9ĵ!qO5\/DZszS3F yy%Q/5*Ӡ`˽[K|믊gc@~Qb8S?U0@z"ޙ 8& 0L [w0pEi sǮnXN/qEUۍONS깑"c7`r!|?qӲ݃=+ŕ]0aU?-Zfy]|lm.Bz#tJrdϺœ.r [nC m쬍0c7 Ur1KGSPW*vhi{R۔PU[Z5Gk mL(Lv^ʿ+MkdN h ẰxWljo <~QʶH|+J ![[<Ŕ6'ŸD&W+!u) d9 X.QFN$9K>ok9j:씐qQ"'Fߟ/*0Ier62 T u ߜV6h@]BeKy͈eqaE% ުuOg8/uhk*wQ61N<2.'/Z[QC"D8ɱ:ET6l9O_Fu4v|a`0_U8^XcR`+XҎq#, :\9Yf<{` M`:A^[a5W, Q{2fAt9z25LK(Hb:Ys #fiEI?5Lktc#`yogeW u9 *D!w#^)c۟j#\qi`kcKغ4Bl25Oj.!2+F IDAT\KnЊIK.A֋w32lt6k 7X^4G>?;8)y$JS%!vq8;½lLӟ@72װO#QHrf,GϢ|׋:r4@ŭsp]kԅ qQc@o8}Y؍R|Шq8Ho|睛;{V+#yzd;?LzaM9_Γ7{}"@ƆAE`+9 |P_DK6Vq[iHO"(?i5)s#6 Ղtlml"9ʖem]MA'XynW .=  R8' m*7!"zI:dft Tdm,<6+E50tbv :2 {Q |o]U2>mg5]5?bVnVb?6DrA1<{ϱk~$Ίf) {tnb9ULK0rCj%.Y(U)W|HYїYe5(C(|پT*J?!i'w Hy;h,uqXOM̳c00f|b&h :0h9n 5 -Qn_ˎ`xL?NNtlTj,GW!{Gyv#1j=ՏOq[xۘ.>u%]CEiQUOe=:p>d' EUz `H\k ΄5Na`*\H'[r9D݃@ 4BZYj_G΀+~O}8&3Ƈyqf?~+=>; ~;wmĻ^n >$欛"ζF 9U3:YY] kpC/[b:ՅZ0.[M4gC4xAkZ 8 4pD`Pb: că6x2d }2N8<=ɑ0:-L2!9Al}!K 7l ^9VLoe| A8#}\W% hn~ܸ[\0ق'\XNKJk-Cc ϕ͕/Fj}wc˵W;-*_}}\o0(1ޖط݌\ M5Ja1TJO 3=戱` &Y<}ʂ,mꜧ}g)t^vZlڤʕ+Y t,%yr4DhB)GԿ2v!ܧ/"Np˨i (Ս!yM\Ie?LGlNF}K8cw#| "AHEvi.^f6"6 c$I%뒘5>&yǐwfsm㔈bF&Y y8ZKcN0&8 O1IyIQam罫]Y݌=Ŕ6!׵!o x!9"s溔hCEX\fSl*Dnnѣ}}}hQ?Wڐu]?LD@g hBRp8AD!"G'>?Fz]NO] Ď.8371ne<>]1<&0lS'bmzU9"y15ѩ$)uabUbYG8E"؄1 oOBvBzŵ[Eׯt"~7% [cOVǑa#1h%`<^%Xdyfcux.#ĥ\Sia^)5%F!9\xCIM'2FP'1j7E`xۘo`g+B<6 1cɠK7&}/_pPsXݷ!lIP~§Eۢ%rQԊ}*r8SodOglA\,TUÍY#+jz?XP^鄡@aUfZ\0 >H_ NNRt.OȑjMaWss\/Gŷ_*7Egt=#Nsܦ}^vl*І .աͧ"CObkr^0B͂k:ni@Sr8œR" ]d (70=XK\|qkTx #T a</ܺIخ.MW̥\j=XvPRHőA3P{A 97E:cwF(HRS~A4 0ؼ,7ivf- \lOBв_oX0|9Fx*u.$Z+E$Ql |h~ qF0[hKK8(LE!F}(/pp_~/˙v8>>=鋂w N/3~܊3Gv}km&lF3%+%# VN]}\C338\!R rX*gn :k[c*g9vHEHgQ2߱5ֆ'a#a1SW3,ɟɓ7g}Xkog ^4G/pagH[^g:ۨCY5op={Of Ĺ E3SD\l8[įzn' .\\3`mQН=o[ؓ6NWlKnMm_7`XIs"O<;"ps63+uS8↋[_rDzq:G adxLtN+ U˲dI7`;0Ԣp_Z.CN3ȡS#z"_buz,nbKw_vBom| GM&1 -b41 oZDpdu6}tœEUi;,1CgƇ N9:/ 1|c1b{K\E8G6}8$& 0Fk\~LD}ep}QP ,O0;&68nǗPS$P'wP^,]"6j]5 "BYzۮ';ւ~(ڊ[ރoz@ ԐkZݧi{7ذ=vVCz2TĪ0+#[4|֒"&?~w޹**ʮkN_'I$χ>=*?I6{ ilh3|$w}9oqvZ&EΘOw&X,*T9rM>tU qYmZ6ф a ݔ6H[9l|KjmT-~o#JFer 6760exbYGǃKvMDM5m\5iV lG:&-YqeQG9{ 2h^8E?(|w}DXk[i=_g ?⛼ tֿ`䜿2(cyeE] "!C?PKB^beU.XHԵD(Lj)il+BX@lqtp T틖ǶdyH /!ֵ!/ HL|GD.뢋'ؠm ia4 ݘhZ+-l%ݵ)`qx:@2H4'c䍵 ]{6bow*BpTR5h-$|.Xj둅1AVLRoII8DuxB&H~t~yzc$mQ0yy#ѧ^ _Ds* F{xع| A-sˍ;. qkB+#&xu+h#d5[)9ELW\.>irDTxô%01xlgW/b'o<bJQ*tr>ѭWp 07! A=j."u*zH PXfJ6c3 % YNeXFwiKM10U*S,4~Ȃ*\uvLBtɗw|5֩ lg=Ĕeu?0^úmljmqEmQr(Zɹh7SX ,5VϿ $pbɑΤ.ws@IlR{BgtĠ葾u5#-t8PI8g8Z,S/2u$f/I6#$na20ԑl|uX"g,(UFD&8:^!"h쉽.)O(r +:Nʮ*Alcs$ ڝ{\lIu IDATfF#u$Eaܐx B4N؍Tq=I:4}7JzVcl@`c2BQC6hc|zK_O㌏C0y"hyFX֥NDq`;wm  Yi.-pgm XM'F8Ppq3IY1N}ٞA #/W B!;!_} zT0z~3D[8BeP™6 HYgpFtȁXKΞ *0d!h/EY@E ƽbB+ 1xC#S/D0;MdZoYgxZ1"%Ȫ#גaaX78s)4:֦׊;{j3OF(mr"^̈d}C=8 m׹'"$A*0 ])z̗5T@wq0ؼ>Y9rҸs(<ճç?^=D^96%ַ%CG_#2L\vx@CcwJG;JL-AM0F׊T:᝗]! \lзa'}\(cIPNGq<Әxv:pSY EtѭaWdtM/*4g<)4:{E[g,'ie^JLjMޛF2;_x$mj֩֫1z{Ol]Y>޽ gA=`2{`$3mw`]yH!3~O9g,([Q+ h ES9է)>6TsNhZc4` pKt<&}ԮP6~KN/>e; &϶}: |6\ Р!WQT>\V[G6ZKyCP\]*D t,3$d_ $~ _c8'Z,ů| =lQ z N8B$hsňavYIxo^n8..HlpQhZ+6w &c+YZPd-B mdבNv@ɢ\({'@NSF)oF WW9^y囚78vG=3+Y׃y}yWx~|swsoâԹsQо<0vu%]֣U[㆛ S*,.6 mi6=-f;$Z a1Z!v#Y.dd4ɟMZAԶc5Nv h;<c$DqW_ fS BI)8HI^f}H\.]Ip|1$;`M2s{XȈ?(t(žبv: Z Y >V+ 6ʤOCZ0l:]ε WTs^J;L%DbÂP~u h)VNmUVyIJp:_!m1l D3\EI5ҎDb!pmBG( cf퇉6M҇{X$p땗Qcz@hbug4AҚ캱!Bh"1g>fW=pH0)XI!WtWu}-wtR>9[{DA?]a!apag;Ta!Z4?S9.]Kゖ͗ 1jqMkm$۹ 4mQg DQ~URΛ{e܃H'<(Nů~"C~.Ѥx%з'O'G894H#hܼUfUPĜ'%ql] > CrS'Q6awe,%Abq2xzW86jyMru4scoxeֈgE҂B('' }.4K|߿/F@kR |,#de+[lIWPVZ5l | 'nt_[.?-ru`^xNeu`L F7ǶK$׺Ȭӡt=&.^ascY4093 ,ҕ/rwI #]Q(ģ/AZ"oFׇDr8 GhDI7غ;j"x<_Dm GcTu 1v:BXr3X^:S䔠'„!OZ޹b4/{p'j_Uk G9dWQ\ꠔ*Zv֝;r'QuKA\UA PCDq>o֐WnLК bl_OB6T?&/O%LXGU#YV:OdY?Esp@#-bgR-pp86`Z ʯӉ)xgd)zQX ӷ[IQY@E͊ Y ;TpqFic . 䍃=l'x䥣@2ls 9fU67 7/_uxȚ!o+܄²FLvFuj,R!sLlc1&BG3e'V6UDYRsR)e͡|yׯ܏#6/|1]ad Q"F .PCԇ!xsO76N$Ay=[Sqٵĥ;{bX6'mSZ#q:'W/➮K:o*oPD` zyR A0 רb׫>FXRlYeHgw_ VRh8Dgk%H, 5x[xΩtADMG6J#cxGeB4&:;+˪>8nΖ4 *{=ž\XPcQ)ʵVǠJp ڮm(!s}CBDdb&õ62uLם vQ`Af{}}c#xyۘuO#W@9}`}o}w.J-?sG0A戀pDJp0Ecq2~W\\Iۊ%q6r1צUj '7Xt]0]1 T77Z eL-DҟOZ Z:9&1渴6b$rW,*UE{Գh 8>9QkR}o#)6cFA]H"jmNZ !9 mp@q Qp]\ޘck  }Qk㝧1ظ W>A‹7vS4mdBћ#OeqHy.qs-xC4)QS.\+Y?ޫ[_N;TE$(J-Mc{υ_z _|%c_bh=g:(PEV>i/c*VgG:_xY BۨBš鏾ؔޅ,kݒք٪XH1nb$@+[!P9߇Ov Oyt֕53HOs-Wj)ȝ(8fOO^gq.V)[A|#8qh򒮆E?u]XL j6 -aם:lclON?K/}QmÆ"?ڙmo}%RnGL7ah7k>=׼''tIO|X]F )=N+In0yU7E;NTX-f5:nyJs@w;qA] Bv\P0-^cR>#Fa.x)1Z߳y`Аa(rd$o8m]([v,#o?9ç6 uMb;v~so@' \קavb.W]1v>:lI@Iڕi?LDɗ+6=s1#ЊE1^M?o1$&L!rcćӄ4 02^v.4ci LhsLܭyrI r+=V%xzj<\pP(aϙfq"LH=;8:5C/"!n}Np]DAB y  ƲZ.GZY\GD>#$!MQ4Yb2`ע"C1R- |ߘޝcX=zidDz6Ds|ONW_YQi$У!' h5v+K9S@[aCOG[aA P7șac(k3T 8fU1ˢ)'cfx{̙'AuU#^Ak% d x=ds*e7s4D$6;8]k4Msu aț82r`ļh< QZ@D`<2j_FZɛa%"f`8bM=!~|hMt>)Y.~">MSouO z.1#ݿ2KӖH(l|&ulN}L.]}:;S a0 : 4|ԇ:J?lݼ cI͘S```J܌ O(R()U~ˑNa~~ڵMgYù-qSoGh., $E0l9ػ:Ap(I8@bK } *r&X0T{X3F'E x,Q'~eShn^uv߯D#x2៑4,"7덌kca S~rEg_ķA &W1kdz5pϋcD^ZQ8hL ^sŁMnehKeٱoWb.5J4mVn_ogpwmw/Ը')L/~q_k]D@c/롁' WmJw\v>iKy͒#kIžCTV)&1t6SA*nLu3w8Y-{o !ΘV$$ e›[rV+1n]A,U;IBh+ GaONsu\tEqxln9>rv#(|~Ϳ$,"[#.i*{}Fp/#|mybMCM]<]";]kAKpi 倱\~ܰ k%}R=jmu3 Ci"#ޕjh;oc׈ ?4,fLĭX-38lc\׻oKhΖ^2-vga0:8DפpY+rx5l7Gض$+|/`2=@PQC'(@ÀU%(9|Oo̖>oF9#[DH#QѐcFuF~0 E$ 6Xi+oL;2-dl:\VXh8&vJMk}E0`F<*B95,$Z+OGx@t%, q⒅D\Ga' Bl6>hN/T,lL2r4C!R<qt O ЋelK!EYV9|g4q5O r3LcEk8&$,H[q_ӗ|p|z?{giW5(`{҉iF'/GbzVXm`{YMȔIp-p3o&,t/^|-|,xNo^5 jZCʣ%yAjHaZOd#f <Λ@Mvzr*NFYxhkM*y@F \)e ܭ":3h|l3eL@or4u_:aZ MO(3h 5aw'nz v{C_:.MQ櫘)jxe lD1Uj:!p/h.9??zAՀw>cl-n>x%ps "Ye)VA7'箦bdL[ts;pc2j `^\#KͼGZJdRaj4&i.9 ]{7_ƫG!0wm3*+7A%L;7zo7wx5\z(86J<AD4>qzasd(ْ1FSفudfsPZeǫNDG>u,hTcD  4N7.ZU!M89n?~yc8 ]Aa pxrxEA/OU~%ۼǂyq'yɱ>ZUD:grwFk,->tKErxFEgxBPhSZC;0*WO-?ȄQ=][_JH¡l(n,BA@?~~r`mc~$cӖO[!A~w:F,GD[2ZY$beɿ11Mǧ-@̟"&I #e%_[IGզC|s-9 Fd㸅||FV$G _]Î6Y9f){/+/CY鏫d&(t]Må8n5toVM#m@ gs+KdI'#c .5t!l;TwP: +W^() vgsHm5i{C2[&wCSwF9/5u%-ZfqPew4LiYo]X k+smLdEA)nLQ=%%McS qƦA1yX.;??bcH+r0@W=bxCPaPֹ`ʴ&gݮ\mE0O63̄{tw3;dj+rЂN|hҕO&AO4n KG6 MܺrTaO\*NB8@>d-[֔SBonO?=zx z$@bK{P8$c-^<~RƭtX`n\Ly S>"˾2H**=z$P j8-\" Ukn͂$`[ N3ȒpJLG_;sm9_}uo}vg<9,JHcݳx.OИ(Ht1fg)~9not]F?M Y۱/xo}7@[/ ]kv ??~W@RyřhLS4cem:xw&X[΀'Y17xMJ<N#-s0"+eN+Sܒ-q8#IԇBT= OtB|2Ï9Wv:(p. MQF%0vl%h W1ٟÇ (ymy[$oj9^s;;4+xP4PDLHD+]qV[g{aPaiI u̍jD2N,<ʌ7EP8Q6! IA qQn.2ޖQ]ca Lr.9t}=XL"_фT1A4Mzƿ.1sjE5~? ^uXq08yU+`UЖ E^3* &eV$J ?^c?V^^qᝇ9  uQkF_i@3[-aՏG :ܹDՐ0@Q{Ά~nh l!ɗ,}D<[&Xs]?"F.Y!o|M7z~s5rLd>3R-C䃛{"{,]gfGLi T5~=ӽD"m00HMٽ،3rB4bѶ[1SM;N_k_@_ lz~:hk_n_$Yl|?7Ϸ鞐8?jz"hgonM~mH7vbh{ӉJɾ jޮx_H;ŮaהY^IG6 XڮZ`͠!tmLNt:% DvT-l~Y;c*ϥ7hk_1HslJqv;7 vʠ.2"[~ 'x!]ftKi0Os.x}re"E}DL&cnH uu#u+\q$cH\:\2)iPX61m*EtmrAo?,ʹI: B4jKp4ERpXX8ZyyvB/3qJcI+ g'A^yٲ g MOd3 !.qexbSTDVEgwΰNC n,M㵅Txv8 \ڸu%/_!+4CbƂ5vHGlWo]W_$fggV9!2'Id5F8XAфp jJ& 7DžDZ{y+04>Bd! KB! >Dc2!'ׅ73Ɠ2ئ߈>&{cC$ā##6$ڝFs,(̙ǽD4mZ~S ՅbGEgv=Aɑ{`+HhmnfSY;Xd9Y}:/S&{ڪ't0٭8|||՟]Bg%e|z _B8Z)yZ /.S-bk v©3x-6\g8RZW9?YGuG/=wxk^{әq# ZaQDhLhܓڱD&c1gsXm! G7~]˳@p2L 0MLh|Ddj&ډ|eeZ*lIBg!$@&N n"r[m.UmlQ N ݲ~Qt"%7HJBinqk܀.%L|nB,U1nxo5LG8}#[98=MQT.秘/Fzc5Ň*Wi*ae^)w* hPƁ Ĉ8v5q%5FJx*(^;oɥO_oׇF>htyp>;]oA'@ϐkOZ-B+?"/էi29ݐ}|=CB=(Db6)mOz @x< /׿&_}VTcFy ?/c?\RXM[;n=u|ؾ1 h7oca|Ǚ@.VqI?%'@EGoaܨ8 IDAT\nJF+x,{ {J,8c/v~:%~ FI@Xp4#t4ŔҢ}VZB.1?zCޘvSI;fl{! ikqИ%n6Q`8R:4Q7r4=8pmG)(A$ BMZKe8 Z:C滁*72eCVX T0 Sy8hMqZ`2T MFOT%#C?AR&cn\0mWzώɭsײu5ɏk"oWrh/ZӒ׶1+F_-T#$Q*pr޿!rJ0[yʗk7&(fΎh󥾗.gX-V*E-gejl;! (W+Qt N8heJc̋Cg:h!-*wg3)f%l(hZg:U(!d{3 ^}q{eQPi̠?#N Dž<$VSa`ʉ17 pz07"*88;í)%Quq-6DQ,y=#m7y{c޳\B{^2#(y),vҥ 6k㱻<~=iy/Q؛M~'W}.1v 'Q򋯋OoU|ޏM%fmx bhySjOjAa|(1PC9V뙺1 z!bZn:8]ٻl)D)D|ZKO`8Ruvv Hv9ʂoe-K0(q|nf|M:`Y4;VvtD#!@VHe>bSC4z&Q\,Q0/eDsKuc|-.Jt2L2eaW;wF^DtH\uezl|,iXt~l/x ֈ<[f)6.c౨j )-1Ѳ ,P? Ve:kq!{,;w  ?",M⠛R G"9\;^3-tkju|y8\s#7PضFUFI_ߵ W&7E`id}-a`ho:-JpAzr< Z9Hrf M* &p~'bKH3fM3 GU #2-xU7^;tp:בox1W46)c}M3}vUtmBHB6WeBO/2/TlH^$isǏOiI]YЂ*Ue{8cѓ(6n8=Ll5ۄ}ADQݣMcƁ$b! F$F! hfAҏam/u B*Y-V-Z _/ n} _c糇H׸lȿgy|c ߨmo<˽yOo}g<=Eٽu%('_ig.G..Kѓ9Mӵqܘk)@A_1 H ^L2Iv2sܔOPtBr#ʰ@)wKp#$ӫHmRB7FxײgAw@bt1OMVH߲DJilYʗ<E~qtC}xwe/|ϰʗsLT8(![|ɰ*" b7ycax9yś_ړ|vR<Yϐ-Nt>i-v=N,V5VF9W0} ^){6g͌eulz>]V.AȌ2m` ưH9n8D2@䌐(H)D d?8(Ǎ7m\{U G\$ѱ%BF4a`+F9U=\=da41ڛ!!ea8$MuŢ{[ԨT:Vnx&lROTw &)O3mi0MƅeB| c'qݒ:6M6 S%gr6(qFc[c'~+{+G/Ƶ?}U,|n`Vwag// [ɽggc~m7{֖Y"t{v/ow?/` e_P UIP5lObŁxJ_Bʨ]:槣7Ă:]Btk#`ٹ"/PhQ >g9HExPu4ִ dy)bB~bBd$sU$|ʇPNgҩ3*Wmh+#e`"|Ms8b:D$s8~ "?+b(J]v"։kcP+G<0Z{hpF`YfOO@gڙY@7(7B- l46P`"%c:!X4# Px_.R]_0::q~!pD?TAnm\b˅|8J''FeJZպl%\җ-LF2)xoMܾrYXVƝ< ||N,;/f{8jl 7E~p$7DmUDoC<2ŋl)9y?ؘ[5?mΗqs+4\ J%]4D^0=ZiT5|"Y2B!Oƥam oBG+ Fa`4qvRF@Ő)]kL$36]M)èB""4U6߫IN:‚iWxڭn 6bCg\KYK$a==M{wo>0F];?3뿘oUQ]_lnLpؿԎww[~NL:,9v m;Wn\dċP#26̵Sx+1>Y`^ 2%m/`S;zt|;;OޕT>-7FBE ͊ ^`̷0s)T֭BϲujȈ |'lτ]Yu"xّj9Y8F9kf돑]5RjFqBWWP jfF EVvHؠv AmsaGD5:ˬ^X(St1_O㫯L*7ߑoypO)d9ulʿFS=CpPÀ^i&z~FwC:erlPGNwFY(I$ߤ\݄ 7x'sE/o->~S e};hZOb<8x7x i*2I-\i <>Ŵi fڊTg,]{JwGAfF `uFCtVR-T$Ն\X8&8+HdMrµ8DWxfgs-]z6%SHg@bN41T|[WJ0c/Jpw C'8>u [R<.۟v7g7O'۟^=cKzy)2 }Lؿ'kFw30~K9:3mqٳ=Qֱ2iVaӶVear$, uS$FgBz~Mcʕ UͰU* 8ŏFS N({t'Ǹ"EZSf " 0"aU:@JP͂本p6HH5<Ǵ3zDw]c3"ʡcRUhM];3[TqC]Cjܹ909qBMAhY&i#uSxUz.Rc??]d0~0_( +"&\bU`sL󥋳 qR1N@̢x6_Rc5Y䏐!NQ>zͰiCK^xac::xp9l]D¤Ut P >`Q ]h%ѪJngX}`<ĩ829C8}D@Ns9.\\gt,D #SXDkupDJUZ8 {3kfNe Dd稩GNEm:T򍢀Qy"Í|)3Xd29ɦCWMU*#6A$S)4HQC8i2$boxW;!`6 g>kOcgſ;?'ф~K<׶ulCtρ>xnEt%+uv wnWk{3"Bw%l6NpYbu+ѥK3o n[}X~|xvB -0]-2䉩p})0޿`"9YDGrBMp8\zfj^Q.3d%XQȒ{{ڌ== ЕZ.JT (-K4pb sZa0bv~*0SަC]fl5X3}& FB!F ^uj|J5DΗ.(g&O@)]!va٬OjNVƘP{R5hEhhdRW0⧺')Mc90`!?Baqxʨ1Me5\3hD,g!bꮹ54pij<@KUe@Wb|ۑ|ȆF@'k,}1G C/z o1^,jЖp,OX@e^a8ޫDp1 *k.AQbd#X |>z|2n^WP\{ a28AG2o^`INTc>k>]kL٬B(ekkwYV*xuƵrawy,)3Jg #1 b:6lSƲPZ7xUsk6 V$AJeE7&k<|`/6eB: PFPBH0E?z:PD8 \t0%p:3#{bVMk:Hs<7?W|atv=<"Z= Ʈ-̀ڮqo|Ǭ|>j [+qvfS8Oj7.$ш'xϯN*tndOslF[&PѰu`u~_CX#;}8΃2(€Ol,A9t"t1,^Nܾ}[D#YIz( ZS+ġ$ pZ" s3~\.SzY`دrHGH9h.@FR򨷊4Bns4UdnI`\n=TW@hf^b:9//8,yЯ@j /?Zrc#g!x u"$#)`.ڇъë'aQHmM6. ,6.ߐ8Ooscc] 1Ն`2L<Š&z!c4*B}>W#ԂA$rA^$=?$Gee6" /` K,\ ӓϟW}/nޒ/~5Q@L!;|֜ľ܌̓Ew&{y?.S@bSon.vf<%i/mA&5To$ vI3 ( 7<12FFàՙbT ɗI`%@T*M<[5l\hˢ`2diJb*hHrh2ٲkxX.r -ə9.ҵb{ˬ­[_xF!I!9IW  EΜ%U J-j &1ZǘA;VܼYKZl7P\4b!JB}u à­RE$BkjZ IDAT04Bt6_'6 F1QX--{g3p]! KvJGbb5iCUC:JYVNQ_aᵍ#w\Joϐ# 9?Bhilg֗0O>k[è2Zhl)BA]gNϱ*JݘJD9"2fP@K׀luEH|MxaY/'>R<јF9GQ Wx"/^x( DޡOMa,7@ʠPe cx)-nM.|Kkx`Ÿu}M@Ә~\轰p%Jb,sZm}u?rPBӻ\aLr"mЧ#XRXRElXjq6ИՖa VN$s4B"|y{0?c?6=O |_16ĒfI(LGG6iKx%=\W˞McؤXOn5ҝ')yr (<\>4ͅ0g߭f^#:<0A)>3ǼQ_Վ$? },h)x3Xް>Aa7fT.`*_z-FLojNLCLXP$yZ!n'RsiԬ2;N/vp03L AhrNMYcswT&@L,_Xgh4X3`8L|T8|EVVq*ϥU*Jx̏fH -ȭMZ%{C|}J-J2иLaCZ˸mIF:bɝ*0x)M c֦:p|38]J ))$$RvIқ5%eCӃ#Nt] ؊uJ1 "tlEwsmLVB $杛G`8r"ēQw1Ȳck8mpΓ"Nnn)BsT(pb_$f8ֈ/Xd4= ɖur3'B " oz$LF2)NM_bӵ#m!S36nB\2 |˙Z0u^hq._ޥD)O7  -@E+_VAw<VũMl a)!S{ď퍌BMlw\?|S}gACNtvoKޠ]?&iJN̷f:eUoZ dWύyoz(BZW/'p%ӱ6 z׫B eW2 J7v \C^MSx1Dh ~o+—k8]';I^bcj#tȴ&LYS&F?A.5|MX3KHu75u! Nr~]{2cX~nj8J8z Z@5xᵯ!Ji]9+78{pO"6"2P{, &Pn "R3+ubW:\f=Tb}P?1 \"=6dΠ2 -3kIYPͤKy X ΡNb4Cu?~i Vzck\yuV/:@VC47GsZCI!Sviz|_}rbw}QiTB3 u^ݐM;I4ꉀ,>b5JZL% s\6ł̆,Q!GX0tadݣ 2oܨ:l<:L^h X\"4ҟCS8pi%k15 ,vd0@* Gt'gm5ɮ3&_F_UbݜJMS" 6L1ުόJCy)??}/W!.ye_tWrbҺ>iJГ7܀gSyl;:t4(V'oᴮ6͒zEz5V Hxq2.]֟Z|h#/=+븐QG+NL7 Nע1??p08I0 F6\$Ӕɞ.:SPP uV=]@| ݷ#7i7#E~ $PW&7ᴨ5a(ĉ3C[8?E :/ W\8#:h֦HYiSh9ksգw}W{7# ƌ鄉1~7 q)m3/) !1a1 (EVVt?=uc`1.ࡶuw>'GvDtftq*y'=n /me7GOnF@#Sy$;s+B-;3g]|{.`<ވg[D| `EkSDy[pG7 .\L^5`l1Ɠ=\ik{uFE"jp(+UΚq̂VbrԹs G-=߳)kc|99!ZY (&~7 WߔMf{xSÀ4rҘ5XĊq½ul`jg^w ?rI?( #F|h9,z3 CcĮVZ%AaaץRxԳO9, y!9;H1g`1$ƥa0qUhau8@$0+ q K8/% ь)h=jDLlQL@WhRI=g m\ɐWa`#qLEEI};?O`L*6}f~R0PJ"7\͆+ޢ!bfӯ~4uadʝh}zɓ/cNqvs")y4@#l=֚)΄xX"Q# x)v(WXNwN94sM@y9(QJEGL25$zg+$bs=L#>lpo~e>goݏ_j}l3κ؟4^wSX|,oգ{lu= 6 } n! EwAgwF*$V@]m:ٕPVp8fA=Fėax00P9ttx'd|lQmAp:C/(H6P/gvk= jA]R0JY/Tҥ!՚ǒΝE4rH.ˍlC`5%'jzRU9,CȰ(x7<7_ªԡSeIi]!t\ 1t0F,d-9ÖL:j]~[k_Y )E$zR!уDJxkKyW l,+KFED r! ndA?l3#7#!yG{6YrW'k}7A "ef5CD_j;23@!hUצύs7)Rhvꚴǐ]^HwoLz!C3<8e>+p8o[  G2iSisijfi_. 9+r-x!ߙ##5\/>,"G{c~ 4()>xy9[I8`V<3 )ɓUČBVid^nivJ- m#WQ|C嬈@S{b|&LH( A.L:2IߡNa :ꢞv#֭iR$4 4,hܳ JS1ps@1#PL>I{i;_{r"ȔLqLQᗱ coKp7i3`:o^״-c%7Q66Wl{B~Z@ێs^}Mz;hsɘ6k`kXfLX͖<`5\rkl׫>)^zTX珜Y0vcX5NLE(-L"Zo]umAMsV(O*1 0W4fiw\f&M Z^gms\N8u{1|⏾sIduɠ/ ckPIjL \ٙɧt6#iR;Fm~tVzN@orIYƟB$Tx$C*L0(rԒK݀$~Kߤ|dx VOQoxvs`F!`ҞFaԱ7+q.LlںYώ|aqJ׽ CׂLMa 0X7ka+,Z (k8Ԏ+XX*Hmwvƶntjrz]'Fqb!Ij Y.*rOiHB:^Fc%/P\= ^N ` xu";f#+ۑhwWpcg~8_W3d԰V>zmS Dj(E.M$5C%窪Gʖ7Ef>Z/V'S v\!%W(*!di-½giprr,#M86&&lqAOT8>}Y7Jgɂh˥/lϪy*|6ٵq~74߂ƙ "; ҈Fǫdd ~!IS3~b7ؽ(-$J DPtc,5an 9j0'ŹטlgcS\ )66fP:fHo4Q nk̄||K3Ȣ ,Pŵ@k%\z۫/9X67j[uSuV{=ۿ։q-'Lnjl8:m.BgB]řrk@u=]M M _~^z{ MPOY9ѕv5xi>qMr:tFdJ'9[,%^H# [)Ze80`R#Z+oUUt %*y8+ ,/P/H)&#7A]1N'?2vޏ 1;.czzG U l(aSG5mYgaÇ!|{7%Ac9=)V5Ur`:ƠpP+,LHg [GbM("[,ݷPD$R])r6/G걣{/6lZWA I}-(g5&1Dcbyf>ۘh 1_bHwU-$WVQ? +ptUc-"cj1kcEk ͪ]QTkL &cU41a`t CB'!Ʃ 2rfŅHcKzQ^ cgCV勒a3Ƥ>CeV^[J 70ibe~OJ\F|dr)[CRLZhsNA;LaI[ jm4:hZr ]Pp%Lo0EW݄y^Sh} s1 ௳*WX(oo-ٻ-5wf-{@a8v}h*:fk\g H`G .jy[GZe}gܼEzY`B_uan(Uw[71 R+iCa!s˴pIDϪ.m9E(1Iǝ ' N:8 B}4tjtV5kK|lw-Nq1=URA!޽1xeѼD]⛯KLhUT[&Th:9J zzR;LٴPUDԜSUӹs`bxxw,#~<wO0 ;NO  @ҿ' GA1ً0zuPc&ͦ&ιɎa^g?o{GgVhZI^_e[vjΌ.aVm[9bXBX[ $}.G(*ٰk6tQ娉:+uHSMPXrzC0OC#T0 G!6Z}Pj:H©I2"Bͦ:pmF,JL&FUgr[d3xf ?i-sKa>rQy@  嬴ws@ԇG Wvcw Ҟ HFёΩ>Xg VBbY;J.J_JzAdHI-%DEVs)ss +[{iрѯ LMR1K. 6N8+vp oU53Jʴ_nrwo;} 2At#vθׁL8?76&;%XU-YED=fR:`l-kmi /?wsã:pT~O gٗxdBDPJL5yRѨ0E <_ ) <2"+LQs3;n?/r1Yi Z%NL@]?!Xr= (.dA< vHDmJpSah 4brMOZoa&ݳph}ؑ΅.CYt5]q@$z&W(qQCB1Bͫ"FkM XW*Y`aEL ӍX3<w賿㳟87j 8ulX*6,-Ϙ xctyfur.l/Z~xgZ{uohfۯw~[76/^;vk ͱ6.3J@mo=kG{7Ov8}Z)%#"zo>wkok.ͪm{I+-TT/ `x%.ʍZ@D”}r І9c^i?] %.5jg璄-@[-ij# H"F~2*Ylrf (Ƿa0M$ 07[}/9X$ \N v1q! ZW E/1Zx <7'-,r1?/oSV5*2t85 OS"_fP% ŏO".IHj|OOU `u@{.̅@T륱ݠ>o^ŋc;sҳg߹y?af()Q[z;T%OuA,?Nu({ J5G!KtOƔ-سkӴ$ %h5ŗx 4ʌ4o9EB%@V+P]L݃~j uZ FpPϣ/{4[b#cNBkcrV1\)o8 tb"sTf,k`e RrąE@}6q(].wVZ% SHnGGӧO1E4[w-oΪ WH7wh{ol;L(^bpid;mIZb6춝N3iFt~ zi:Q<% egޤh;s7U>6o>M<:Ǩٝ(4@ ÷w CPCվqhC0B2sq/ulytˌE0퓿[!r]CΠ\Rt ]81? `նZp9EZdi ݂lBG9s ܾG5;KcJY-RoѢ>㞵3rc`TNq4bfa= ! `Eƴ*ClG&{bi-vmue1MݔdŞZ ^%Xߛ4Aͅq`z'?RfOuTJج\\2|?o(?Y95J_;Q-ލ_ov=^w[]p2 7ŵ|?ooWmwomo;7د,hH;O?#u"At7̔kzj?& :^3:ZxU`wlV ?Rg-Rb{RBke%QœnmzA mϤKS?QoJf3" NdF,Q1BwPȬQ쇢< w{Vw|dpxx?Èf'Ia+(V3 mL 1VYI:=qJ}/w374`"D19HR-p,YcojP;̹>R/ֹB$pMi.<3}G&F2XJ_xdS;x=āgg.1PvÏĉg>a\/zuC aN^VN;-3\u?XKvN|ſ2/~Ov;Q0[_ߡ< 6tդȰw76hnQ+犵fEh;`vƻYpkJw\W{7 :Z\ Ix Fx7kkR[(-J\X-UTs:R'/Iz Ҁ{\IfB`VljB=ԺB n&P3/gZن`o$xq}CQˍ QPKَU޽ؿ88Db _O琉Ldggљ xK)0M4K42@qSG[lb0QHtȊ4+aR6y_SCB)/`f=O ?[L?GQІt܈sL_ϼ mmom(iv8$`L*\K3u ^yqU r]䵓y(}E]78n ώA#k9q/ A%kΛ\aLHTvPԺᾳ'm$ C1KDQr<"BROUu~( _MT#޿gO?Bd*x*Ն{x)%9r)~:\Jk/g$8=^?Ezb)?zJIw JkZ`n9-] PXpNR+ݭeĔM#Bo\r:1 lqxtJ!i',%&qKY]~mxs~f2n}={zW;IvP! "cs6>i aL|1 }TJሥ1] JҪ5W_80+󯖚 !!~_q=Ǫɔ4 ,F|4v?sikuE}c:<;p@{h+axٶۮ.|a MGo3U{N/MVź/h6X :r*NOs۾ęꗽ!9m.x4bxSAN2돾7/=9G7)bEig];ΎiQV]\ i쳪/Uq{I ,(VS !'HqEAtQYm|i? 8̡nj*eR \加AŎhE7gO a=@=E}pͯ}c 0n|GU^\-nFN|n&+L_mKWi|~L~*-|&‡>h$J[cjJ(x&3*LX ̴)y#@I*P^ &*EsGُVzdI Y N1: 0[L4ٖC 8_"It<Ndm VZYD43 3S;W; սͳX-3YߋсEɀRxcZ/+^=%mKmTc&Ig[ %|)ĺvB\̱)r$a-@07h;^/_{ #d(biΡ+Px.eRG DMҌ/gӿ8[>FVOQ{u";%_0lۊ|PU坥,kM۰66p^]< ð9]Zg;x gvlvUNzW: [J6#V-¢sFr3;-$ku߁ 6a}N7۝*Ea=~%`m 2mZ,Y,Gw}vkB۳]ޛd\ |!"vY\ϦG~[+x=B#D,gxJb(x+{L,ڔEn6hHӊ0!:)L3Qgu¹۬|H9`l48 0[! kJ# Axj4bqgc2`ZYY |C` P޷!u24%1'R!ֹO4*Ues ?;T? G ^!ʐ3SdV >W9EH/< [ 1 ZM9DS\xmaK ;1;!@{}4ra8GjnQ.=]Now?@? 1BS*~enuniO.E8]RUuc295>gSs}_m,+f0-fk]`F L/(K5yeHڍ r̠Uo\ C7DZ+:?B@ajZk- Kd<͎F4z*ϣ{`[.g(Ѹk9/n>ev\! 4 K2_)A~x~ ^nkgZ%;~ZLW_ەvXtT? ʾ[IT_w7z2;ㄎ_kئz}:>~;7Y`_:@oPZ|%Mdn^>~|ϰJiΆ]<}so."ʒ6FX%qjf|Y sTMe ru^5ط("TBǙ4}&;C:19bJu4'xj;t"ݱx&i )VoJt|Q=*^8=S,LN7aˀHd|K:Ay)t>g.D=QE X))BL~ %C Pgړ-{\o> (*=#bf9M|^\HN;\?{Pdh8ߕ5yܓ~<'Xwud`X 3`y̚<&H˵ׁ /0E| Ϟΐɋ`y8`]ߺgڍm6VϤ^wP->S?{EO^g-GͶ@׭c a:>yEbx~ LWk`2)Cԭ3։am856^fbn]Im_ X-z}ߒxߎMiP΁\oRtͭI%fJ*'g/c]XV#ƔWy7bf 7dcwwŪ~u=ou=p/s6n۳{]ܮ]G3 ^i1Z>mN˚<[@j]Mm6Btcm]2'tﷱy/֣o jB-'|~.lC`9J{ji ыr節J^)F 8L\) P\yJQ(J^XU p&ّ+ߕ0 IDATjk6(yMz硇'/h6^`88.1[~ Evm2U%f[/DVOԶFP:XmhRR-t&& B-8-A wϓxT 57'jpZekTg;9Su1 yYK}d ,ԎWsX)oIdnӱ p:[mU"Pep%D&E%>]# 1>>r{sdtc[OFqHw/^CsZkY4[5H ldU[ ; DPdk'nVͷ`z/^J9e:]ĂSǀ> t'8S$L&&(j Vx"ysTTI}A nu/vֆ7$h{oMrD܁K^ٗp9?ċ+ϗǨڵ Kb:*Bn#Lj2ok|kalsӰ5߿ݤӸϚ>lk\c&?ПoUߖ++m~~y(xۭ|E9(ؿZU׵f+}1cbĒ!| (5=B(ꥴLM2>W.b!hP+:q`cid ^-b̵o%- P  ;t~{*go? $8䪲g T77$'˦r\|8>ʰ:Dq A/cX`R&<ɣ )e%6?gee19W:m6z" 68b=8a5dmg`UvQ1%XUYg{\d >yzG_SUhЇ> ʴ9VR2F}%nZ7MvH|d21@<Ə{F{D8*̲.KTH$`k#>㣿Oc@CYW罺}cV;="u7oMGS :-&'-s~:$(`c4Drs?{ }_탻LD(7PNj=&vT<:<c'/X'FCXsr_is#'q \Iu + .qX`y?9N.lb^mp&k_Yi*%9ͨN-lnlvǭ}UV^oͫmP޵8<}֧CzNynj] rm.;6Ț^٭"5]8O-v *-j:zx$&i-os~臾\291F y{Ywr`]7xڢx4@JYT&p1f{:b, Y>>Hqy~0hĤrs(O|v\zzDk]ۃAbu"[Q g=Sԣ(}i,TG^Oxx<;A]{}]s|^#),,h,X7NM qVq2G<-aYabTР`U;F;f@M#\, ԅa@➉ h\_wkBc#dyQT(j$5h0/ uf]dֹ bǓ!Z ˙l%|CZNjy.I }%+A_Id041)v(M\7<_SJ|) c9+sAyYEj$ c6ijOGϱNQ6s& kn-x.yٚmݿw~nm^ɚ+2k7NOq] ;J}U[ZWwnflMQoryWuoi=]b;͚6^>|Pkz[+Nz]>8ɈF]|?7 aY q_9S&-]!ua]Ersu`IR@.V QA.+Dk>[Uhr D ['w{'}bcquidCI\0S{~P2 pNQ,Xy/^$-G%wWr!6wBjzk5у=c2XAD6sa4uM[qbџ$(UuR"+U^{ 98X)`#xsTߒ̙wsǚѻ X4N0z 1^凞Yn@@T:&1Mip8JP-ۜ3뙧`\iѨx4#4⌝qTusӰ:^ % ʟ^Tk@a ynH#8ߠ7XQ9GX>x?byj/f+]YwwzeU9*%۸ V\Xŝ2TU M۷=+wfR$Rjnk|ةYʛD8' lDV" D}HV<Հ@Cf 0$YRTK=b>,[  jU~8nRlUoMERIS2Q(ujzJ5%c\R?ƣGqqAaVξ@^,I40˦55DpV+U)|5Wad&r}V=kW||]0Go,E=};X, zǨhvbV*D뤰 gO2[ n4"XFkk9z71K,|)ґh _^-{)' $+ L |tr)ob:(H*v #2bg %Rr7n-:kJ81K.5YK8/`uvxܫ?bΤ9Mз熒ر[ n}H줏;NS#%ollU8s.2iWZ:@V5洃xs^aU#+.42 Ǒ)UZS;t8|C .R-R Y1HcO/0 _.%#rLM61⁸yuU} 0HFds=b:?t=󝪜!+kΦwYESqtt.5c774} `q =ʰVa~w#Fi׹M ԲFe^lzdKiSݤ~(@iBZ̊ϊ"%'=TZ=^Hj:*F٬+$M59?4ʴy5@O Мg U˩j:辏Kj9B mħAňL]Oi"G/X<Ŋ~Rآk Q`0esJ~!콏"wx~屺656ѬkoXlv%<3{{{X-ȳ8ZwC "/BpqPJb&,cxU; I5'ghg-dk˄h8,#9s\̩HL я r]PrQc&/p\̉1Pb63ܐ3ߏ8+ ~PbtA2AP~[ؚOra\ N!&'/BbIA赆P5ks)Oz [\i!oׂc]oM'(Ȯrɍ i5'iE/\卒:PZ & ">GlJdv`ת jhf B} mb5>V 6@8\'?ç_'1IytkM u.ڽY<4 hu4XPmw0F:t*7Fύw%x@. g;F,.'7践uYwwPC^:.U,~y\ț) +ޣ&HMFhE>oOqwt 9=yoځ\5 -KQ#,xh*aW%V yTj}2X@T&jK✚t=@Umx*YKw֙ 2au,z /5XLT\r:ΗstmR?|ֱ*o&^lgI](q \RK@Iڴz0# pZ_ =3}ܺqm\2O 89_`(ưIя&>2rE6̰D$val^8LJ]"ךzH*zHG{!|oqcI {DsP30e^}qSg$x/qKJo&q*!`^DΎG AH "tvǚ()::)MmmNg?sU1[}wwn%<Λg|{wo k6e&k z!4R[@5uNW{{o ``rqß)[bh3L|}j×Gy'>8Q$%QBÀiv(UoD'A~HN(GhղR7ɘZU"Db .1%MP+٭2X%y~/VFenMW&%ӏ9 ]Ri=WGwo}.q k@D4@.9c-%óS'O[眽,Y6G)u.6 QVا-"1A?nF#-iJ!w߻ 6%.?%AmSh6|-cr֥m>[[`>c<}>G=/tІ6;Gmyr,0H_GB)IȎg-ZZLbt60UA2N/mcg@\iw ||8"cgN[` Mc0XwbtϾ|Y pPE۝f-JV$2 FA\?_.GpM^"zaur7Kp-Eߌ_9?W&J7}}>{ ο~2 JUrZP.yn%FLBAp܌yUUk0(zucA?g \$XM~C DLCLj}C8 M"% t Orp.QC\r1/p]UpBUya IDATNbw6T+S6}^BUn|ir?v KQx[41=B6yScY n.Џh4)p8[.Qluaoo0ˢZLhTF?'{EϨdlc8ࠇ^⭭j>tVlqG{%no5p)^. Ϳߠ#Iɂqz:3G^M,̒FbFēhv<?G2wyOhj|}mo}y;sb紮XX3JR Di`%X?ـ&@yr]Bykֵlь)m[ޞp9Gea7h|%x;2^ d Dh_%&p-׼D?N;eމQ!u~!/`㲞b5ŋ8;:<{e7NWTZ N^ujYYzy]׎cˉN:fo5dt]Z͒/ߝmHGxя^vKjUՋ **t羷 < kgnd{qКu "{\ qC|P-JZAXpvߘjTU(Eu(9ˬ?F4o(_!؂f@r Qrp&&͋͢_ѲnJ [̆J7_%ZҜ)CLr ?! ^XIp2m'(lJћ5/EBcb.EiMkކ"AED*:^o[[_G@8/PőM 7# "jc_Ve&% (ϐs"Ij\odud˕lS0'ebU7l< !E`Pc<[A{?, )\!ȩ?)1ƺʗb(mQJs#GC* ؿu hq!׃~QBզ$9"FQΒPG^גΏ 5+`Z;dhe: e:MQሀUTĔgTveԾS~ -< Fq,pXӋz`2O-U! ߾ESc^EܞOWS=3\Oq4|nX ?5OHAOlsz^g3`r xօ `|7ߞ Uͷ[58|+9UnA mu_"UnN<|ض47_ݓrE xpMjdwhCΖ[l7[4^kݎ$oӘTaꮥֿ@*N+Z!Gtj3ª{D 0QH.l -\i,B황n%-MZWLГ)*IS5ʫ2 XQ,Npq#T#=WҲ>:9RiәOQ4h*4V(V3d\~.#P}LYKqHU]ci`͒V_޸G 9MPy ),1Aq80;XbB`eGaQ:<fUUPk1LCtck8 1J( .l}q"Hn)xQfiώq\ J2xQNQF4cb䔢G'aBVR2qKO>#~/xi/jU.Z%oQ+" Ιv $ `YE}a$ ZC3E2&1pC؜[;R.(óԍ YMK7q)6u g6hQKD^dK~쭡NH7Fz55_ˮr̥X`آp8տ:܆1k1fn;`h"*uxtZ5'w)࿝PB1f@||ͺkf~㔵WlNcz%I3'|DcWut43. +FwZYR?7)]K9)4#ycz9$ѬSy2#"^~P^8 ܻ/WAMM2p$x ^ǀo\@$%Nx1+:ʘ4qT"&87 8?Z (AF7iudns?" {=*!7t<yp-GvH96P&4[re W:6<5 ۣ2Lpp[a .t)JSaw[K;o"md:41 ZL)n%t.:V֫֋3LcTXdW\qC)gx8Cs! R|DUUU#MP17gF}8!YPt RT" S&Ҝ2UhCTg>^!sJaj(SW 0G;B)aM(hj$mI#?9Gބ֝ HV]F2TJP+OS)>4C?9ߘ$Mh":"h;~;IVLjusW>jfYoWIˏbXjGyg:ASَs)[_;{eeVD%>K«qwK9#T>X#|y EFٮ%]fʟ ?vjuƱ j%v>hw.{Z ?^lۍ٭/P60?`r8Esg~K؊簃-ؽNoӶڎ ^ 3!qFuxrUpaɕbyECsUćN#O9X(3&>]6e@Q|f\6'SLFJ,Cp eƦ4t:B6ɐݿ+<7򑬁'C ODoy8l#ldr $+a$0EDNG#]$LF/M< k+6X@F8d6f5{ZQimWJԕ|*j{- /e%;\@Ipi,#o "+޹GQ)vBgcrf\Fc%M+XeȑTn\{:coI 9'z3Fdj~$ Vw[Ncı[7ƍ7qt%h].ySP7&z2A M1puc*W84Ͷ.:4օ񨑝k:ϼb >t׺7|}yL_ӯZl;yy;kv×ڏWy@ڶD3/HW Co~EGgK-qU)*`'hY|ekUSώ%@ه `щj fQɳGfl[2E==l&K@̀KJclۧ Jc= JA>АNFHcScB|MN!,3UuoLeK);oK:Gծ" wֽd#p/\CU1YDoZ g|Sr+T)}-Ҍ: g&0X_g\UH#_xhcMT~&C%HIv凘eΟxmS`rUs ֫3 (Q̏NӍ>(J 8}g \Lc=VI/g>ɧ׽M1=`.qxS[8.׌ 6%1؂緥 j57:9p}ѿ߻1do6#{a(%-QO8tchץ>`xX,/\=yHӣiPR7'JxqnՉsrSܹAj+%Ҩ nbqEƷf{fi~U7yX+єթQ7?S!/M񌠬TT,]&2=EPDf OtƩ/J8e 0A[}/^<D*.K!5~ u>*kq{FMs''MM T ^}`;;8 o 86Ia E[LwċTgxF !Z$;?lɇ#&xQcZ ڪIgs܊S|s[l,koz!?yʓSQ+9Hgct%#Cwg.=2TVQlղ@ݔ+$2MsDjqbmn4=E6-VAo28:D raAfIn3hoFVdCD~ɰDoF"zu!-_>) }g2JM?ݪP"M&zj>v(\:AWMY47ej? /1Y|PBo{'k`@_pֻ" C5tJ\)nqi ~jJmW&qf߼ }7`T˗J]xY9|o;X ˸ۯyt/t{o~d.iPt#(ѵ˷GykVu(_O8i^fC;ָ}pÒckDضtI/Uu^Ƞ&IO3;_x8+r!9FA 9˓ OF aI7tfmqXBpz~Rn5 pL*j( U1MLc] 񋗢LWk5=|<Nj/t/YbjZN pCu}Kv|X盿<)[:׆M3g "%rUashڭbop>K#At9{Tiq<'7"U?FUz~[8;gH Tu\3`!qpkВЮ =Z ơ< Fػ}__n|xI8ݻq gO1a ; XNS$ۄ-vL8vOHדIEVșq'4O'ށ}cplF¹"7oNHM>Ao6̊ɱ'GVF\ $]9SXg=,C3W'( t=`$&9rͥQ&Ȃ#7J[75Vmg%SҘCڰN]I.na`+;B|Yy-NU[oَ/ۢI%W?CK;(n3xCK+-%eveH&4~8g&j`( (DڋTCcpH LSȽaOf#[X-bu (040ܸRis:rsi!ʁ5,١PID` 64kf660(xTw"~x4(rRYqﻇ _/esTجQlM'lm/V+yFX(FImPTGHF6U7%U={azn=bAPuV'49`Rg<0MU?A]Y*,秘cLG49;N{hlk[w5^4AV!RV!#%h1H=l q񢼁O8=ycyV!qLh2J֫+p- Y.‹Sxnu-+,%R=Cc"ZYr+O oXOJåԞxD@L3!NkgcN 4C s, {ALۮ``(Z\ #@( &E0L&Drz!;̑c$`y t;Iq6Kr܉ctr!Ў.~t\;vN uŮ=vkiWo~ۿCo0]+ck1]Cchk:Нjsp Moi1o@|79@og.c(zd޺;;nU7=y5s'FFC^Kp F%4M WH{%H׭S76?i 7J.b_&j-ъv9]KpOj:%-؏pzqRamB>4+T%Cr @6vOh1>*ig#`)(M1N3o#T'K|zQb8XM%L^J-W#NUFvEi:ʓ Z9Ս4C yvBhllIŷQsIPo cWJR=/-|z;{q3D]yW#Y.0ICڂF^&}' d2&RѲq0 L|=[^\ׇs]!֪YT<&R9WaOܟl>Y)NON$)֫$cSXJfNʮ q L%+uղ{t=M6\ݏC$W$};}1ākw^׻kp]chTWEov˧\upO=o c쮲o6?|ڊ{~Rvf!ɗȏhb$j_*9̦{3]5pY&xiilD)f{pnԘ9P=_͵+ O쉏I*she R[Е\nfb1cDbH:FAk^`"Ѽf=B=g2!orS拉XE-{sLBO mΉ͟M16JXqd9&M1|R`g 0JXȈ(!#C&V)늬3U:Hhzx_=W%;;vU:堽.6v|ww_ե zSzwxW-^|=llE5']h*dA}|F'u;΃WmMٓJQ\u֫|ٖ?&IfkIB{q%+l6pJ) $$Y52X I-/֍kN~̈́F6*, ;ЮKmZs)9nd]*s̋JƊUӍYt6|_rY*j"dfSLb,'B{^ ,V爉wK~5;-Dú܉;dLJ= 1&=1.#VueEW$8㑢@ݏ<MKk :? DZ{Hu]xNfTݣ"B833|-<>{Q-9gexջ(#se9Efdļ'A=~' 'x&Q&j" b5(a㑦VyfJo8'2XOWKVFK@agW:O~uo913<'O$hLH(DjK$zg %Kt;;#d4Cě@A8=-TN:8sJb"֪-\;H2Ԟ^ЖոL8:ugdSȸDBcs.a8*H;]Bםb-}|fz7w' fC,sjّɝ1ΗDzaiƙ8Qc̀+YIs>Z&{`a~ X*0Xƙc+`JGNeIEc4 jnXiĩm\pmsMCWCQr&\]Jj ٮr15c#m*!AJF(~8@9\9FhDSM0K[@ɜL @b8Ar9A^'71 3a{0 m輿I)DnzB.2r5>F6U`a2D6OX-jۈ >m~C!좺2!8zvd y[ 7x\D8;0UDA Hܹ.zdh΀2CHlA m7ec pƨ1t3t>vHi6L I6R*ϗO?~#FreS)ŜƤJ86zkPIo(U}idЛ%Ņ9r̺h%؅,vhM|[rUd/P2$u\mQK50TPZ2(g-YY &ԥPW` }؛NPI@ꔙJ1&SdBPc)6i/Errq]md;Rؼ% fۘc_368?G0:͈^_h..]y"pU]-J:np_p>¹w9ӛ{ l+;ת*+vyPD?+Ur]OAC,q.I ~hOtͩ18=t<P7(Q"`KƔ:Da z`٦Q KY]M~6 Rkq~rٞ6UCJHLp{.HNq3PVeS9_V܏l&|";1r$=nhHK: q"%}'`!E17P"Ja@(D*Ѫ_wg 650KG:ATec5ō_H@&h;ge Ft[S'OhE*o< REҪӖI: s^@0}7gs'i)cu;= m 'f#[$2xv|T:~| ǚ%Mm'*el.(~u=bU:}lzQ"ݛa4J u! o#}>7P8ly-& @E[ʍQ5_W:r2|u.}SpCӿl~Y0l2(a: 8&@ \M,Z};"YY{«Q IX it"ޅّ),Ig2N@a>*Ω9$ӱ R2z/29ZZ]b6S1+u_d}%88)=l"0vegq⚯$@]y'\@Mvp 8!]d7)E;>x#/]P| u~~[ nd\E`3W4P5 oPޠ<m&P붙4vN"6"Lla9Z|=|VpaUDsSrLXst"5?Nг S(TV7U9WHH6e[ Qƻxp;xx80 cQyQ۟H0|İ.axX-r&wT 3]2RkcmuF&쏒|)+)Gsy2?QR ,O :jEhl@],(Vdե8_x@C-&m!s|O[P$B l%g{-ΎbTV<71Y y`vcz|4S"1F1e"PYYh?LȾ`}`{{^lG`',T/#W;~So@,\u @7/ͧ6nes ~h~O _>PUEo+_ /Kan|o|77Mͷ`r_M57YRkCRX{M64w;v@emJrub-{\cfEkâT{[b<;SN.] d$QK1v,O/ܤG}?ct~r.*_{9:=&e%3|9])|+dOs9qTJ2I%*}[$PEP}; EvuhʌtpOPLi4ȉ%A@A!2.VޥfKs+MqCr$j,1"~7ة` %GTp#fY8x &H{ܳD">w PLi%}gJI$iJ{,Np0s,opqo;[ vs%w~Ɔ^`(Wj9zy7 Hn9&;q]\`\%HĿܢ ԍ ']zZt񽮷K.cHpqU]| {TպoWhFF"Z(p'<+ھх<ʢg_ ,[Lxw$|ͻ͊WsƔ(Ǹe\QI*kV٦ԩBݨ)%&tx 9֭8&e%Ęv,jA"$H8 3yFx3%v4A#RkM l<מqrr[7n뾐?; rm/؅$Ɓk{:s1]AzMP.мy7S74|sC|ھB~Qz8o+_[ ]Q^(uF:ɥCz DP ?dSV7./RSpl) ~viw6;ƽn78jXX0E#"5+aҽ (*p1>zR9cK3#EGϜo-ijo~X%D;)eJu(ԝ0e;&Ak҄隇KnI Ī>57g3WP=K)dYGa`Mn=#ld`zDfD3KW/yWlOw]?+L%0#gWi* Z4 "c8N @IF; e+1\)ȸ tG2;H=S$=-V;jc c <Lj" zpIJF2=Wzm3F'92 `"EkB6 jѼD;nR[+d㑁_**ʨm9;kf:`7{B0#1U(4 bȚg'+ x#|ſ1u*}g+n5 By{$0w?bt9gVW@%vbB@>n$EMI66V&:D eў\zQKQ4m-ѣi\UֽS;SX+.yg;5fIRA hcJgߐXQM$;N61 8fB]N !NF /HoRZQ@nI~Di;m˓=DX '/ Ft?p8-%{štt󝉮Exzbb:G nݺե)$m`_v(4J35dĀ0!Hc>[.I#΍M$)E6T=y/_>8q TwHXd#F3>Rq\rn6+Ń?=_ڲ3۰ؼʶmRG,haӵvUuؔ?oro:gz~W/ oZ<\/17 E&؄di|%`\`{..Pk_Tм`{6hKn8[F&?ԉewc 9it0Dp]2rH`mL%cBLMlCU;5'gcnD!ڭ[UfLbg۲575nXtSaL/ Ntd:VKhjpJk~H +")C|} =^YF \>Nj/~g~8]y羰ղ?mnn#`ĈdEqAG΁C6ET?FWSw][)׹wQΝR3ynAd?}D,7Kn#͑N8Ȅ\7F@(o($3Zdv" 4`gG'r+$x:SjȇZ3^ãϦS P<^kݕзQWIⓍ;Dt`Cd*$MOx Cg_{wӜ񑴦8'-7! @ *TXؚP!Vu)ELB#dIEViZcwnźJ)^l.o&J qFkrqTm W2Kcv@u7܋[cuvM+wl=`㶀 5}7. ku]{5x: Ow?6|d{yN[;?޿`0}5lko","M5Mv %.\/;j٦Z451nf]M$|h$-r'DZR~!yvzM@:^m' $+u0+76IOjfk=G Ӊ_-j9'F<-cfΖ<@:+ewjL0#ÚTzB귽njfsmt#Βt8 P(UD3ba)vd4NLR h 6̖|%4߻}=lHeLӣ1,n޾+5Fa-Z_1 "I:F8.}|هHS˧:_y] `"YtfR3eK>J>;>pϡ?ĭw?O|}upQJDYa>MF Ǣ&DEВ#R4) Rޚl Ͽ.QFҵ̆~CMr[89>º83q7Sq 7}` EQ}l7u݅?"M\)*KOyfkcWxW/ilOal_^xzlG%+T->=~kQ#`rY4ߛ6cZuF&8 eӠwT@٤yC3o wd"L @sK}7ccN~Q ϋq Q$<& ̣oR^bL3Kl J64ɒZlAmIJѬ NC%|\=LJ;SOc~`Q&ZZ֢Y(Yz;g'/1W@ č!o""QH3 WZLO?G=]v<̀GH|H|d0XRȇVu o7)F~wgxt<3||9Z)ioDsшH,H{@eF7fIJ|YW )l*dn1@GX߻axC_Id~{oi.a}U |80 jxuKnL{wmߢ ޅo)"uU n{kxRr_R.NS;Ֆ;ڿ}H s5>AL \`1 9W^u/ XeXD@TYY+4}r5+*`ڴ#V( qm02S|E@6Iwj-! J'8C:UY|Ize(='˵ΓV{LVz Q=mkcVTJ Gg'8 ^}=PiNA4QwKe $wb$.23"F`Qkt6`Y6(n@@4ES oo>rL5^S%̲I|аdB/'?ǿJ=oH72arVE#j (JfrJu IY4%Ύ_`zU(1+q]ɨB>ʀ=L,_@tdbw?Q6Ne)(rrtC (N4ia`$ŹXo?-?| o8\L՜L2%rL7Kuy"K2 {~㽻x3</^wm2Z$<5Mv(EQ>glx?Nsmy׷X/f3UjZ^z)~*jux !@)~D9oSn;=гOCX}9e뎭oC|Xc#08;0{{F;\.Dm Oz77>V wg`W=(GlWggkY;%z9wV ;ofs3#.if9 m5}0fPV(Q>jDS}qNc3s(dʵ;C1jXML%(݄Rr͞C5q $d KkJ^]':V4ua0dk8<)FyGcU`88AX (#[T涽17n՝o=PVEM)ǽ)5/nd3: ў8Қlo׊NYk̂3K19)='1X)'Y|=*no;m?/!Z5;|#MHoj s&Ÿ{z͌~cn?TSg󒍂H(Ny`5\n|Yi,=@PuE\U/qϜtlv&9X2@Rw6,2^o}6[)H Lt4dۥL ,vA 74!(g.nxązȍ>or3pc5(ހhm̌>}Q8xΏnkj=}Vb۹dM0Ӫ ZɺzLޭ`M.Yb) 7 L88;Sc|uuwo+(SB;S T]-AgymZk8SZyE:WQ4<"fJ5V>ewG''A, I|Y"@"gL GӉTy*" Su Z&Ȟ&qk z|ĒŶWJ=[L-ZGgʎt󄗉EKF#x~/}j8}H]4BZ,$ :H6jsRa9s*fK]a>## G쓏%͇HIO,LQ*tENcj^l+sHX">m9 LEd݄)&p><ȅ$Zlvw>rqj~#Ƈ'{8[,N#.!q>jW 5nyF_Ԗ !]nm/;m'?Fp؈x%WW)yf_:\?BXh~ 9P[oٵU<[$l)e4RG3k_vܴ<:nzQdt 9*m~Ju#4xXv rӁE '"Ft~Z /РRvaў`PhE]J6[MFsVܴD]Hkj(۝.֕hgAki MhPz& ֹϷtu-]kFk"o3Q߀RQ2|y8.Nl*E6:\s6bjzn0H`w8"w@BC/0NfJx &Z[VS䢌 ]\>&]0Rmf+ hyW]3"$-yMrZ0TXx{qLDKXK)\7YuGϟ Ȥa8H^`:#k?1{v:/>t>ͻp%DoFu%\.RcM}ol]{\; #}| _~K|ѣ/c~ hWQ u(cIƱL2)֋9$JәNz&Y ]lK΍?<\v{sy%;*yPn$kxsD IDATB;W f#i/xӇ\3p Z/UyJBFwhۓ][8 zSҼ'*D$j-A+e=#Y9NW.վg;c;:"#: qh-݃u? ZgauGy rg#<D@'苎Ck2816~Tv3p;d?_,ȖHʕ<Q8ט7O:5vSO;?mfad}Zw R9gg4;1K7PǬJUyk/P90_=[&أRG2j;fڋR'lAP?4d(1׵ۇ$aMC>|Ohu"Dq'?ųp|/W? <ַ{#rcrŀ=5_NC-p`Fv;=T$0N2IV^{NwX7fx 1uy[\gכ $fHK~G VwK 9i&[*+."DȬ$4 wo۴%%߹%ygalpW~D""oijf'bù Lha!^bM-~)^E>{+kJݧ*vy_Ck W%߳,jvԴWVՉpm7 |p*rVBf߽޾T5Aژ.v>gT?݂!|aF?l[zr좈ʧ&Aþ^.^]xYgolJ_9N(Yv9z>dy2 ;Ru`ku%q˖_bVv,YMx+D9veOˬbIf=D5M,dJ jb*@P.JCuA~q9ڄZH;&^ z5l@{ H{6H~> )Qr)֥fܘ + dҕRr)>YV&ēUD iOaO봓`pNG#C= fhҲl>RAob/m4\$v9FM\=khO'vt)_+g6yHbDx2:"~<زׇ`Mxeh8d.rggBFISZռYyc!@.'Ce>OOOe{tsA2(b$44b'^4#m9oZ>1o;9{U?  )%iN4brJ{bp#tQҹ$Ե߻?ݽ_|ōw>I ޗ0'|^lkc6ckD&np2:CmiTE%Í*`\xxp[O?D8n+ȏ#.Zf3\_$۾$H l/@/hJ/%u\"X\)*_kX3tRc]"))̣"Ja끬sHPy%?3fٕ3$Y;%}=̀=f9,yB#V PB[m\<qΒqLeЕ,_c3p|9F8Fo+iT!6W라 Nɽµ+a q5m9ٜ>ox1:y{T=ޣ,ZXm ~J4Ʌ[kOC%?(3W=x9 LGcM|޻'|cg/4hvԩ/!2_4R^wSOSsdmf]{+a ,e_r~/Gwpݶ.%@gp=,P.('ΗEGz副,]qLV>Lkg)fn@o"L"l/|]B[p]'x,,$Y3Z.T[,eT<(kSyr9#Q&] s͇)+ltc^Gb--ٹc]"FMn*[Tl쌿E]-ۇH`;Dڬr~H3vBE`tHRh$Q~EK #G'D"026\0AQxb$o&(23 ';635Fs jeom)7%0*=]\DDˣ˲e##9_8x-Z #\H}(A/0DzDNQe1 JiZlh., K$&c$o}lddmxi,x|FϤ¥ђze:s!k<7Mh)dʂD^/si0G{!^c|<[6YPc_AP ؍sVY8KX5U& " Zt| ~*7z1Q^{|{ \ (,7{@pkJ/X/f8hUX9NlӁ wqvrgϞnbc0jšAw("۵[[o+6#Nc@/ߩp1}ڤ'.K<|LLo-c*/Z]z0*F h)b4*5ϕlh=K'- BYVe3ˊ8zaxrdn|pKWL܈#L06,_V?KM% a.%Wo\ Y4oQ,K.`ei P!byanVPJ6TR C zxRTҚV!70_! 3Hur[|6jBIdCة1s# "LVa!v2hn6\/zh6Zܒt6UN׬[j2!4IB7Ѡ.?'B7"ZPp3&IJ j˄fjvat" ΍ŢuXf^xiZ&Kz:GV!WӐ5/C)w=JF8} :݆͙Gagwf#m{h*SA&>Tx4|QaԠUA2M~x6@P1Ǟ hϝ-"vŘS(KBL#sDIDR|aRdlVsC" NN>j+JTsQH;_{ײ5a_W׷B K*_bأ^$Zse+kYgʆW8v5 T/0X-MMDm*dhb ¥vo{pd{fkp6B]8 #ANd> / uO&h.. :R(afr%?P 5X,"RؤY׌qJ)mEea[Ԃ/و% t_C[.=?MW6̘T0gӿhojT{Uty6Ogi 拉7~7K$>m7꧳^a9C&=6ǤϞv Sf0㖵ttژ.XQ!.owtSmK;yD?ّ '(UU;uw\pq}@~Aa>:y 6~n9[g~e [016p>!ڲf2TJ\R,JȂQR\(3iͳ$Uf$yƆ1$+Mi=t7{+v+Rsuo`:'U (D@3^s|% `,,0Pu0Y?F׵8L&y}Z2]/qz~l>GoǓ Չ֜Pܟx]QGC3Y6NFPbwI Up C ^i[i\*57\:ӟf6iSd2CQ-$8!HLcv@Kb  I899FfG<4}q'*0.{?t[mh̕6`LG (H`:2DFICYLʀ$"cūZD_52PT=!vS|pz6~OM6ӏ0YllwTf,. ʢGE })׈[)!Aӿ^<<8st4=If0Z8z;1 m\pky>& bB} |Vgy\塄AֲTj_$%*_MnW_C+`Шj 0mkӅ88+usjh k+n L7K&d@C<!WgnlԽlgEV_G"=Ee [^1.~԰EQmMlla7yĸ %S9rm <-iD\]o,4EfڗX$·vDEDsqMG9B (Sn\Pml3/^=?P?ÏhϚ8q_V9NNOvzB V_ElN9w,#G6s ՒnW23eQ#afO#T(ij<zMR%kzzz K!B&K KcqjQ&&/½{oWYI궃!&.F +ǛT(\N0]N0d"q="'DZY| ~9cӼ:m-^O@|f3g>ĭ[$3naIZ"?DwyCt<{]WF#xeݷ߹e|owyUǗ"W]a걾tWY%3- 2\ STDҏOe1GU98(1d+4=['jrլ9(dʲI?M$dzR`o^†rܢ_fl3-ov }{R[a;_*8\%,f*f{ouGI>~u%z+Law?,LcrKbޚ3#,=č7jԑ7uʰ'k[$âr+-vo0ueugָ\$-{G4)rOr<.gg:k Қ+`#YY<Ԥl$+:iN`#uaA1ڭ>LzoSޖ MX.A ,gsl``4d׻\ͱXE8"y>!?{L=Z|l+,g  ONSGh8ܿl =zG̱Շ18Rc Ge |Di7B8q{~&~{マǏ? .Ξ\ *ɢ|UaBWPK#W4ttq~~gQF%IapW6I@֛JZOK&Vo`M"1/ q}&-o#Kuǔ<2S}U9KW_xjfDol+a{[84׻IN}}Tke_?oaAI]k4pa eF<ƒJ`y 皫#~M]qXnenûxuGߥntuE+3*x !!nPDa%ۑEpZ~4l=Ô^E0M=΢37RB@#>Rj鎨\sHN.v@xCш |XCq,0HxQ7>E3q.#AǧgwZcuEPmhyN,lX$1k\ZqпVւ0]R[xgsX$BtXbh\P6e}O®@"&sZ>fϑsܺu[|d/+ kw\ZZ]SY5Vk%;O'k$sR(/Fjc>_!id4?ܽXBgg' 5t>у2vXsa9z"4|"ִfP; aF~# zm0oMCykE^In}iXD)Gד;%G,:Y5ZmL)Mn7o)3bШs,Cwpo_5;4ٯ?@?7f[`[e{vu}W IDAT<_:Hbo<՞ػyeEXU΀"K)ڲ˹tq͙`|?u2ˆ32\(tchvn@R-SvɴENi-|R?kjoEK4J"WC}Pr y[=xyϷa,m^ qM~=μ6'SgF$)*vqgߟ[9:oܹxXkF7c_&בB<-Jc)!BH4%N]# ZX3$FpDkN!NNaxxo>:\8C'60HmLfF8cL'=$GXLΐ!ڍ?H$1gBv☁zJљEєC`%Nj }tQvbMG;>FSo,R~f-lib-0 Q`d I[&NG?> S^XOh>zhaKDvu7fY;/K*Ȏ~O򼰍H>CE":+1Oφ,HjÒAJ!ZyDG21;ȉ|?HCNi哱?/ZDH0_lœJKc:ҦVm'፽L_7֎DJet45\x)M %>֍9-Ƌ@| Җ vwqCܹ}OPBGOXh88Cg>}ο5٦¿f0)nW:5$ungAm*[/7S͜q^**jPD:g(˟}Wz(*TʛC\f;-n.G|u˫`sSPXUaXςmS+N~MQܞ /S ZmsfG^5>(Vyvq.Bh|Ȏps.fyq&Auh6(mv=v;{M@l2k߽%,(dY1 n7t2 Mc'mS ChM'8vބ0Uә>tWhE8{M@˱X;O +KŰvbx@F $>z?99T \4g&*]&c-,2/.CT]a1;_p~/נ[BQ&J\ `F^ ^#lx8{e>*..۽.NT_xsAB)ݮjHvvoEgxc_bZ{5E <L#t}Q;iV^PG=ls`rt]uݿV|x*T#<TrQ˰{x Br70g u-B^RیRm_k=/~Ύzty,9s=>Khbr}ؚ*X/߾Ջƶn50"pEwISwNs%T79ƭCbJU 0.ZPn+P˴ƫũ%t_[#RfZ"4l, 2b wm&-a3)yCFͽ:H3(0ɍI;ݮ#`X"( dZ(!$]r_z>Y:fYl+kA(ѼϽIv\.Upgǒz%q Tc%h*˚g̉mtvbr3z̤ɱa4&G tkӇ0[mlg+(ˢNvG̾FU|<(xQFsûxwD}S|MK3($Zh464Q)ܙe&ɃÛV\c>QquH*nbEfM7q&^hj @0 1ލ8`ѳa agCcel|۶6"y%vj|}=_}~)Ur_śq4וT^UWlә^%`* +/Vӗ_Zv:.D7b(.mXvռ4K{Paʗ* %U -o܎9eXS}q.oX}3m|G16Ȓ χhRSH鈎eH(u%9bRa?| THT0ZB8A3n!NZC${{Ȓa-: !ZW=w-g,+CԦݺy Un/-~VΞy,(969t;?e3J(P( .+oB JjkvIR~Ŝ 4.n߽v>Ɠ'$ LBi~A#7JdGh 3 /Wk<>A3}QY4^3Vn᝷ߓt1',XY5 ĔJ{o~si}Cn׭ע5_!w_Wnm_]K:G uvW}=e%ZpI(2^kWn^gf<[UN!K;kϋƖxhزe UDz^Uxn`ҿmw#LO`Q¡ \PP-ľB9Ⱦ658.ۀoQ+Bl!bSNTScXtBQ3!YvA?#!Fxg^E)$,njY18Zw5CeFdI"}vEEؘ9#o}HJyo6Oo]^&؟;s0+p1yvF< ;mֈݟ`,A/dGR%v<ָS1=ߕ<0F4kW CEd(&3XΗX/VB)Q!Z7ˍMx^سʝEӲoCkkM b+Ѭ,ZXæqqصElymޫ2 P>]iDE6uܓ(Mћ`f3b=Fy}M_bbY113eQXji&J/WOv;{Abz~ʣ\ _r4Hqk"b 5Eʨ(eKc Z%M{x =}”G6װ hjIڎK=Z>+*o`<GN ^0-l1Zy|ݽ#1a_LLDG8č]Sqnez}ۮ9ͻ$ǻx#xy[  Rbet<_|ip6:FӢ9$PoT%$/Y ;03HY/u4 ZjAlϟt9B  0oV^rM4V/0&%q 5`vUy_먨̊L~IlHZ4tRF98#,*%|4AC;D! =4H`d o4đٿ̧xrDI<ji',3*3h汰CڎǼ&4xur>O'vCxX6hZ*xagɛb>F3IT$¢[eQڈ0#<}D$gFP.6ElÑ[m<|BΦgj$B+Kچ(($O!N0?CfO $E"Gѐ (o)9٩+2<2@ՖjE ߗȋ֯#&] 1Y-p|q Ks.iR˿=}pOoF]gnq5N^.&Pp@K6`dxOK; / U^y )51M6KNsu4Ռk˦I]E Inܨb'nRQ`=]%9gK5RՈ{vo߻\킍`K޸DAnQ!.K"~yԎ)C0'v1wo+ߟ"uݽ5]͖ɒÍt?M1~gtgm?{?bѵάreӄ< zM;j!=B\9VXQ\liW ho"}1ae)% 9eHJY/.l4--3*"oqh&m/@ڈ1]%2CE}4n*y~?yNST7nc x8+a~B:DV"5"sTzYFEh}=",+ *' $qPi,6SB( 9Ƌ9zRvOHvO jszn`^<@o)*j3}o\Dq?ԶS{S+ilĿy!U7p~lyTv<%ClW[WH_#+62,+_~u֕׾5(=܇]D.- J;ƺNNhgva5FHWcϖ^?Wazxǘ.Q+Dr#=G;` 症0<¥ҔD) ܿ6bcpuΠF4ױ V2rv z GgSuFK )֙Ч|\C}H Ã[ʉJ%K+U1/ƽS}/@oVj2/Ύ'7+cy)yQHyvS5 _1 A- uf>~j+y 2&;; jAw{L{4L?R!KI# cB{_?;;^E'l119& L'xiDk qn6g%p?KLiͱ\LpM s\Hoa5Y3T IDATE|ou~|~"J40z.$VUx=nXLFo֓+>cP(Ss$Pp6:5  0J9yU3Ua&D,mw%)%C6֞zj)NB1R댦#Y e,(#w;t,,&Ht;." {q1~ffg/J |S`1[H-4Sc<֐ R['cOlla?R6~G[w3͛mmaÕYe6p8 $®XZ%"@ 6u<Q`/_3zF B@>|)0gr\h?-e2CtF:c*"QLNJ|Z fs< "ט27Bf!e*SŌJpb( =LƐ,- x3`D@u(69Xy m8p nbΖx-={ #ABy@O8F *ĩmv1x/9ǟ`7i[6޹bms""kq2X tZ-"!HB4Nlh7 Mc+ viРt~6ogϱLܸ.~:G׽?e1y_Tu_4_o^5aC?U0qA]J!Nf#/%r&q2:*_<_qXraFDƨ݅G[-bd&K|'ģa௾F%6|/*: , wj$Ǽmjc ϝ㬉gJmW\Qlu1[%ٱqΦ] eww-,n|x̓H"J'$ o `ͷl#1z;}, k˪QH^q%Y,hW0[Lqrz?AjvShb{,\Op]#-xDZIvgg83{QE᳇p( It8%,," iiU5T^}FgEj% ^8 bJ/ IiΠqEy a!Rt(:@VRQU(i@vZT@c-1 &V;trt B6#By._xyzurTACF=uMTR"&D/i'h)z/ѓ^,Epdk葺8Ե"P Fsn5x>H#%Bxm/N^x,H@1X),sHd!ɬBsah~,% 9Ns= }v:=8^5p5@᝻nXsd ozwnrl=I7v?6:{h.W ĽjnB|kuu+$W]"K?WOqF9OZ^;EXyx4rF>,涚%pD V2\B,-\XkRs ؙwT( 9͓,icgna\ȹ=IBǵl˩fP!dJy膌Ho"oIxx1GwZ h$mYWɆ4`1\gh0Eo![IјNb >4c2|gq׿waޔAȷǯD#k8kFH~I<&wwTK],0O?+ n ?D5f7S&FYZZoJˆ  )Vm͂Frx3IڋNb&GI?٩a J [=!8+*PSͤqG/C{L/´-H^t̗VF 9biD$ J?=?WQLcfl"oeZ}$t1Qy-<:~f5U3+--5^ܾR RX']CxL|Ηߗm4_Q !eЉ3[ ` گ9y߸%)gz Lƍ5༸{^%M,apc ) -8ۂ%4Ǭ)PoePh!pΛhE),Ξ|E㣧 5'ݥ).̳5VvO_-0!p%Zٗ RĞ?{?џ ]F(-s9jOՃ>i}a\j.zv1»o?!{cVI~xdZEB'%Kzq]:JtGV7gBDGkEI{Fg啔PA0x8=ᰈ*m D[I+i٤D f̛Zuϗyx>i1/` R W3|hӗ PpFi']޻%$x9VXlؘ Fkt4:Aht&4D9q* %$\%޾'n?#:n30ye1C2_/UIe%ff@FDDNpl—RL?Քd0R2 ]rC6[tz6ZȕPJ.C&B?Duѱdž\YMx_l6"y`~S0p Nmhi02|I^+2TǬܞѷ|`T2~e$˳#2* 4r흑&ϔǂ?/xw7؅YY lt3@%Ob`7mTEh+3\qqč*rTN#Bد?5G;/f3eeOlA^MnKΌ<X8ͧ3 cs4E2)]c禢|rztFPBsF" QوRa˲%O}BTq(V_iYl;x|9!7kOZǛ`Dxq\ǛBiȿ gfRl9> ;J1D9!HUdF#*9V6cjPK'4̙aXsc_*HLɭ JB9V΄(P^{@5(-ߕ_8Sr@:X i%Q[r`+h !vwz|f#"YI%u._vйMDC/,lQT!ر@v\o8z?w?H*O`jY7Svw'qEBdnh_.3m9 QW[7N5'3Zc|BȎa-eT$񸖖\KAMy\u.]>i6bMHr{M: \U(& ܹts6ᵡג7p#EyFу!#Ü\9.p|BzBl9j,1Sd13STNEZxw|'.'\#Wa#+$#h6b値q^_9 gT_<ř)B :QN&:G9HXȟ!uz߰ c;yO2 )[ؠiW$.cI*) /5PqڐFKG?@5Gܳv$ϖ}xn߭ۿ{?V㟫7h3_[`ko/PLŽ']b~~nvXW¯SAeJ_VڸX%'l=t+I[e|ӄ%]JŤ:}u "Y΂<܃"ʔ5 ?Y݄ Q`@;srq>[ zލD<asy! ]9vf:o޽':@KG4/3#!& Yo' L\i0lņ2RA2y& Qj\Ýf(A ^)VS䃟ɳrHli!GxCoOho,>|= ~+kbTY̐[6]"_@Cfq#yqOiZKZѥpA 2 bш-(3c-l3.ѓM'Mxox0qb(_"ߒ_!E 0Z60znd͞蟱v VWY@-r0g!5 :7MJ90OXl2`x?W+os,dHl*GK;%֣U0"Nd4ƑeYt~1xn9H@R w7DD?4nk"[ON{x1Ct[=$~댑$Iaz\/Ndt]=GӋqyo`ر7u/F|+翇-6v,%IۺT)hy(ueVBL۸乿Dm "Pre_^؆3^)ycBw;M !Ig\V%cZx ]^`Ke$5S' @voBݲWVYxFh%_\ <>~>)t>I|JG&}!+wԠKE pqe!z{YwB/a[0m8gT?SOy$EaJ׫buYp0hZJ C\$D0u)%%_WX(GBEage[NщI1s¹P~6~' ft<9ӓSo18UN)fVizD8/t4?t}>{kz"$1xۉ]Y%ఋ >CLgS.2;rl,J6llx!h2=œQ\)7$2"P3فrpfәdև, yQܼqCcRz]"ڽlCXDR;.8ͳO_ub%oKw^'ؙ'vPu˝(Ye~3rK5P.CJ4SK6Vr+z;d[Aî `r, yu,p,Þ1t]慏݃"5ʜyIG"&(H$̍=V?{o$Ir~qYG=7DD[[`7`՚-mWZH$H1髺#s`np|,j2##<ws :"(#^~+g L;B?ߺ~ f\2h AV/ݴX KYk[ FeaUȪӟ:zkBtǧw1b-+-]'#t8?f/ XYOX @LnxH4&c)d6Glqul1$XN|Դ ,3]u^+E//` U?">7yf8_BXrXs2 FhUIZ$x`4ʙv`~~ $uO脰2Ubjy_N f}UF փq|z.1&`?!|/Pǡ,K7}OD8ط^ l]@x1[`ob <í뷱qV[ "^ñduy4gl$ nEqΤY}FG>1{|*w~Dv IDATk=/#}*7҂HQu3"{ BK v,߭Ds;/21ȉ'` WLi[ ߡ˪j:L"@ڕےeϙ)ַj ;䶇q saQӍ7p5r& ZG2ǞNOpOoͿ̶W, %;:#c: .84a~˷-@a+?!Z4 +[ ڭױT*sѦ3CZV'0hzB|o"a5 H_."pY$`4(/ aRK opU H0KBܞ~cfl'M}'cEst2]"JB]Ojg@8:ca  ")Ǩy]ͳR *XHb Vȋ 9`ꚭfĸu#.{ T_Hc[]>bE{^>jg)l6~$5mΰ㖱,:Zq5}Re=% :kQ4C >jJ; 8X . Eb6?H&'P Djcυ78zđc.XhGH;k_tܞ'O\!K  +P(HP;JNJOxi4zZ5s{|(U!DDP~,?Ze"JrUꍵt9`=:nF\NuTk*}Z e< IV@}8[ r  > '1jo!Bu Z@h7LdXI=$g qk' Ns̖K\z W1ܷes4vl2<]*{i/RTdKV:%(4-tdt[)gY kksd&-)j566˕QI&]`DMX0D\Zd+%D8_ ]Im 'c?|GN+Ǔ>0{~|j|xrx J4ٛ>p}A#yH:4VW}-tRj0slB㭅ˠm70*&Hض4 ! g,%{T`?i1a wA.:I\'oQń͒)"LoƤąSm~?l=NJCX"UXLTK08k?ƭJ"}wNoc1[ 3`g-O{V̶#TbIPW_Űە Ko2[a-ՀsFkCYZfs]*_ YQw*[eNX" Śǚsw /RNHYAhm)ٻDhLz'. EAj*l;Y& *Aש_\$p>@cq0O8;zoHWSlg=|5x p^br8ڬxcL:{u*^Ǐ>ujcGdtdjE% 2PL^`ܷOώ: >zd3ȬCj^sCDVy:+1Nq=2bܵv㺴gj'?a2$hbor 5󳙮}D'ׅ9<8D~ 56v"+V޸ ; Z~<UO-ǧE6/M})>w.#: xWsZ욦o|٨+ DC3i^xޑsk_c\zl%êl}#p\/xEb2~urNb*3&r)$j7ܪT2 zb;»rlHgN5CJrI+kCNE֥Ă0z{q"$y?]kޗʼnDٵkw՜k0Yl q!Z]mRƔP i0C<+o`˘Zq&?A4kv|?> o7Y7w+-v+'à }W .@s*~и &,\-JWm[Ұ9/6/ [nSs޾?Y18r|)&_^@\sZ)2HJ"|Ue;p#ЊDmԛI~P6ezoҔX\i]mVH/T8_LoAXȰmFo7eGg`abd([u^2a`<3yB=G{jݦVۣB.{>?UKF('2~Z,7 :tm_:3vzF#&t؄D<^t6M !'T]J%޷Wep2HwŠVoENNvY~GR^}ea:+S#wDbJԓ`PI/A:e`TQ_[Xg(J$=CmY6|V$߽w닿G4 j?'{2=i!XKpІXA$o q^W32_ZʂaZƛ4wOS/m ޛ ϫF NS5' K&V$d啛7'@=þJaU"e:2XUT,& =o5?ҦUV:{$Cko;%&ZՅ^u[Z4e&=,SDÿD ؑ oKe:sꯃ&|wq:*ƀPzիM`Kgm#~"Xgfβh)e&?G 8̺% ։B= 41p%]ȶ@䃖D _ R˴Lb6Nokw1rBZbp]_}#.nd\Ȭ뙓?yگ~Nj >H,|Z6CKO9pc 3Xs{H,l@ t')fɲ}i=r2 |J&=ëuGj]UuBV糙6k{mE=lfuPF/ 㝕Zvv .rIW}gO8'BUAK_6BXuky&+n' nbpAy6GV̆ё~@a~`تTQ,hMi"%8{g-h"ƀ0J͝ZqܤY%+Dx*HI=HAÊݝhK3< Re*tD> 4xC;5h Aq|D? FxkxvWŞR-';ở,0x'nmU{˸*hk\ҏɣiE/܍6Y[.V,":#ڹJ389^'\o+MM*ɦRHMsb?_xáBg!\CdU W@ܾA<яݼ.*X\Ê,vK雳tJQҘEcJ]-JRRK{[Rrn;=T?µ:B$#lq}Dvu{>bc7R*q#5w?g`{5́53&brI"Ԋ[01u '=65oʪz,SDvw(r#T\ eQ#JZJqj$u)i J2סD{1KGra{$UM5ۘP$^%-"YO/`Lb:__ \kQ@׿A)Mւ5Pċ"Z~u^ͅ眍bƓHcUx|%ILm ۩$Z8>;t;T΍fn߼S2{썰>/,Jf96b5!޸ JmR|jZOa|ii?m|4O_uO>.{rYz gj q=q]2%ԇ"?FJFVX]9T8%H}z@Vy)W`n@@p+7Rhz2Gi_WGO$4u_xBs"x(sFn9uH_,[r,^9ec0Q$f rñJyf?Rҵf {?Wx5OzKex}񞿠U?` bviī@2j6UO4zE#tiNӛ<|uw7I )H?0pGZ=q]1Wt~rz^pu&[n5lOWk(PC+Cv(1pfEmy<=aZ]`u;-*cz޸v(Lmh'mr]b0[V33%71ⰴ _Q=~{l͂ær`8z|nQtF* TQSe`٠y/ 4dX_UwoꯎOU~lV7(T@E6[&⣓y!!F9:QUgъ!Oᣵ˜\lV)t߆Joa^'bABd鬞sk.$ʁt1E]ZPhݻEFAZ$+kA1:q=Tҷ"C;CcGAsZ?ljɑ7A8q@!"az3to $:Z֪-V+L-Y<q$m A piNs㧒 '''F! ~ g1`QhY;ExpZ =3|_?}V؍NMGoO1I@HkbX8E[:MbМK*N NW'nzӞݔ6{Xa!HQ: .(Ϡ7Bb׮s{R,m?AE)F{{{݇./o|Sg_Ͽb^Xw%fqBNfѧLBt뢱@I`:kc,{a"|XSOW iMYfx6EP׋&;c? 0p]KӀHP8rdP'$w܅QO-(}莰#պ'9]'w (J+xflI֖6f3?|\2\?wοtK*hQurZZ'׮l~*HA3B-4fDs;:y,׷r# E%>m@oQZfS`m@ވ>ڹRھugF⁻" tĔD3Yw^;s3κ5FES@9H00ΫFs>hl7z0b8_+S5Y gQXzT,)޾(j|7zmRH;ߟowm Yd/>{Ԉg/pJwאS ;6;M@f@ܤ7D:K͌dǮ쒕NOXҎC})];"BJ?|E+SlްRcxj ʪMbqm?G8^Wt; ,[ٻ//V#[Ohů<ZegMypE8sy[P%9.q;yAi'Pl=`,_>#{/؛.ߓ Q-ҥf?t3;щvF =U'ki[\Jm:#J'8[ws/Ke| ,f r&GZ0$ufY32 vX&!N$<Ǐꁪ¥P!=qELd↺ M e|1{^^ 0'1Zu6hXTk 4qOC\U:&V契wB#NQx(4ۓ}k$SN µ6d8T0%99߈'/ " Eݔw~Wf&NsIpeZkઅT[-- x@lp\ %CLV\NEށ6`9%w򳬂c^.LA$@ Ib[HV͗}zo_aelT5'bV"ЂV)n]9ĀA ٦ptB+H@}ϭ:!?D0mQ .ϋqZn\kle2<<~d0e,4>lU1 n`ڏPA%!E a%e9̖LpEb.`?[ r'D,)23>@i ҇wִ)g 7_ё3-@mgM.5f 6uvs`RhWM}==ȸXtYdNuAf=CqTa0#i=TN( 4>: CX+2]+4)TD3VD^R [".3+p/0{?~.U ژ=]1mچ(BM~#k{tx^NiCqXp bG)RT5#kۥBό* }_e Hݡn]0D{<H,7N3 n(Zkҍ=( ͝RIzd[F$btcr]@bnkpqo!uS6_2cL}}^VDU,8VSU^2 {Gv}>Խ &6K GUt > żB\4Tc7U,Ȅ- * 4 ' 5jסvWZ +ys e_{0 n|f:2nM„@_o4  /&yΖ,Z[xk D 3j:/ōuUo?/k I9%0moR4ps45tꅻmG,ҫ7akwuz|4ɡC]/W/"LLs)cʈXq&BAe{LQ:nBnt.vك&{~ ^c"R2$NECfؐojNo~ϰ\/P%ze`&qKX{=GZej-w;kS 5e x8G%2SJ<%.i\nSN͐}AkJ)2/` gCy? _5Q'`p$G*QZ S_fA~=3{&@2ez%Xjr= %RA,,frHił(!:{{(i(ZJf@c%cVƒ?i=ηak~iӀb\:C naGgȻ@PR*ςpnJ91S.[jQi?W; l@jh\[.}fJjjk#.-ճv;a7^" ʆpy-W z#]G;$5UtXmRu{ nRcLpO<7ealʈsw5>U@պB'׮J78~}|Gk+!ծ 4jkiEBKGWib6|)}6PRs w\8T5用Bfj:CQdO' SW :nly)ZW+G d+ErG7f \.k?.^ ZI%@bH-.%أ .@-Rz \* ZM ,@8=@̜\|c֧cbSL,2TUpt??zTY `71߻f%(5}hGu}(J1.eʫ]ŇZ:i xELrn nZc^D3!翪[H?׺t[?FPr-x0V:5P[1-OvAM;;U§2_oba|{/sV+MƖN)PRsOsS/y`-+W4:!9CJ{Tfa-ͪ@gMt;==CjT g٠2 nu iWFJ:vlh5OoxzAlqgN?x1cm%BGMovU49sȲǺ(78BJ$9<j3tP*Xu2yI8PAT2wP&ʸ8.4ؾ>|<\6vNq}6u U @\ s]^ Zk9zK+fU(%2欶vZIZi7"ͥ[iHՍKupW?} `G I\}cAgp7xUs67/rc \{,VS)E8 F\s6WٲJD*jrEU*Íޯg i~'3ZNv0[Pӫ\m7&i44Smq >`j Rm8_{qMd+*z(*}?1G3,#i]^vM@k'l ,(f,U ^} k 8 IDAT&cq,:*Gƣe j-߳IeUL{?>ssF&T1E2WU ah0-lY;;fS7`\p̲*d^@䘮xm|܉[]2@ZQTbIFP$ZR `,Rìv_ y_N1_gUCJ}f_V+5xbjKwͅu7_ >KĔ*XD}Q8q;N)IcY> 6ʤBl fJ&+,ۮY>mfY|{o3Og<6Saͺw,&u aE.sN4f^N ji/>ٱ9n2VlRXBIm{n݆JsQ؝̻@+cr~`>v A r{"VP lyuz0uiC9RG<:uBL I+E҅/bKgK"t #x($2L!lWX12/لt~v6PY/3h}sTZ:1We"%TM 0S*|3< Y75oڕDdSЧѾe2lLf/O ]7cl_i p4GDnnpFA2p",sQ(g~! (8NNK'wo~0a`УA.80G? O43[/*(x@[c,qw1+0{B=+\˩I.rQ 7Jme>GGnv.t pG{mydzցe}؇]#g_n-9B "🡖c) uit.fѨOnŪԎlMM^ Y!#~an`V2Yd G@"Po8\U 5LS$̻bDuK$UCZe`7Cja{wAݺJO3X,p m$|TNfrBmp{sW,gkR+WL$0ov:J3oԥ7!x^:Q011=_R3wYU~|E0} P#zwȹ$PbEkwktn8BA gsIO^Kzdgˇx=l4 0ZJr5ݬa? KgJQHlԲpfWnz=}f`2$jf* +l~F1Yfs4C!~n6k!Zs$Ҋ i`(0.0 .dpm! /O6 #H|뫜NW>Qd }d553)֩LwΗKY$5G{c+B?p ÉZkp5F>bC)+Q]~4CVJam6{4fRtsA$QېnCqt U˚@׉E@{pVf؃JeAaFKΤ,tԶ#+@^>YT%GVPVJ".aºq<;3xnϝ.i?@t.z!J~H1>ML%SǵyP}yѿ2Coo3\Yʁ{C :VgV?}#Kc~>gNJѠuXĀ-Ln~~mɵuܡ &(V1 , X' #Z7B#VPTƕC#BTKWk+>X/zw>KPǁY<˥E=9=H2GgoXNexB+[J]TK m$.mzgC*kn '0/Lڙ=D?䦫 `Sh>-cɽNhoZQ-.s6Yr"ȩj[bJ\lDE`4IC{tP3VUh}s{{(B׃ ~Lp;Z 3R*}`Yp߹M|l`@i 5e~)Vf9~a>6odͨ^z7en T\a?Am2V G"0(3dI~4XogTF/J3c:fGp h)L)5>B" ft n[M{=l nye ow,G)=lvk3+`r^5ry΢};S9sKkPT+LWx#Pț>56D\6Rzr NCRg`> &us".I~^n ԟZ%xk>J~po7OmVMB8~>y{TVlQT@;ӘxЕ5 Сs]uU:惯aG`y1 *+hUcq/}w%}B&pW4ځŤR"ƭk/uvL ӳ3=7˅e/@Ybqvr*]qX'.N覈;C.1ˤCŌ4NϿk9f%+E^םcq$0GGvƺŝ0.lgHT9!{ol>k˅0t80_+,n^V(O>u3l}{ gt8^8^ҿ/\ ۪~R&R%Ql lV?ԦLU0nKM* R LGbl7-SOok_+>ݣioQI8f|(9k!bcqD꟟+*Gc جXB$lnh8z=fׯ#1g&?}>uK%S(fB;|7Q4P"Jʐ=[AJ3t\` ux6Vf+ݦz`=Mdp:_  ~{lcZ # `"۬!1 4E| @ iJ`hהj,PIYf>>s-BAl)3}_߼ő&n"R26Ȃ2  Z=6ۨ-J",|DT؍n ]9u>+P J8hBT@HYh*q :p$*A?qKz开`:h< H3-QބBw3K\^ozU T9J\Xaq4_ RrN$F1! U!J]#,Mu(ZFmhv-}6RB7̲ cw3R;l+$a>ru,.reҰ&o8D'sLy½#o}S>6~qhoE$ t;ʢSԛE*ڹwT󘌋w'Em'7кi}=pו%fpEͱG/5.StFyJ`'jPÁ4nⵥgDP?/4~nyB}۴ ~3M=|em\;_ wZC#%|lhY3R]$غ4@8eܢbYUj+S,(lϼ%A /؂sЦKo\< huܨWeLX@F @a\~1}w tp<%%BQ.?co0 Xݾ2zI_Z/+#)G\nw^wb; t q_ fy?U`85Bb\AL@^ҔG/핍=F>uP6ŠS/}`]10-UMEu +aixƦ;<fK*S}q.~i vh4a,0JR7e:8 `\Od;mgdzƛG\~W|;٫^a=صэQP%=o V_ڂگ)%cKWDP¸UժPmXbuYt?<2 ^>_j.Gμ .Ьv&r$Et/n+ȊLG)-h&X{H)Jq鑯RɱoZdb3|1:U)dP@d_ZiB-KtY=kKÛ<]-(Љׇv9Aw?/Λj,erۼZef DT^i\faSp&DS`os 'c䦃zAOA wk?ԥ/(BFHͬrYI– >/ ښ `kَђIHJ$ h\Kw%/qq_;{DFeeUWu%VՙQqn.s5A>L^C4:sVgp%ιOƿ 7R&Kv&f]loONenw#<*E`i DŽ6圿3=."@ŴU W2<-`!3%3H'l;TиKܮ>dY]/p Be2 X@aw^1o@ir>s 1zbZP?}TuٙH0ZZ1 h=%׮N7}W8v1ڗA'ƳGQV v"P"3 v*uC=^)X@5'#m bJ# MlIaL-*f2 k-*YgSɳ|Зu*}wns `j2\s>)S 3"a2 yZ`Tf. r|.jlc;bbL`6|1LNIdLM;69 0}k <02!,TTܺ^„p4';Pƃh`aP/+ UCXLJóI(C N03HF .%?[F~i=H劥 RNrVPujakҀ04 8Ell\(v]kؙu-Ƽ<,"c96IZ4'=}笷_Sdd% #w=Ah;'̷;.k-Y|"XvwvY@k#V}׿w" t`}ۃ@ $b{Fyk7hd#  =b+3( 8ɟc#N6QR›]֟D\(&ַ5Qp͡ l6>~38LlvaoaϜ֑.;3Iг^UJ}Srߜmq0/6pPK`#Q&2WNe4{vr`SR[ p4BFTTPh @ZFWp[`1XLMخ5Eۥ[*Z5rƙ4slfXR&'Y)SPPy|j>̒'9@$2[[/>Y])'GSqEnr_} |\6ֹ/=^07s)6vסݵ-KT} p ɕ IDAT($ :`D90'2hY5g}X>ju +1!Jȴ.nG,W01(sLj 'pqA 0p[%jyafDu ڷNջ >n}ٳg*k<_?里jg]z@{1hP@9srg͙2Q ^ؿ@jc]WۄV7Rn;Ayز?Rw50] `s1۝ FDC},j؁8Yār/Ĩ!Lƙ{9foxn1xϺ;gtlll] 9n0)y^KGl8E\֮;p-꽲6鯪炴` _~n WEcVZdrkaL&j[ _) SA TۘS ܞ~Egc6C֙aS. g̈́}1 [C sԵo_?#]voOZkQL*=ެ \1 _ ?gQ\b؞Q/=<|>@BJ\T 슲 ˱MKJt|3'Rҗa<Èz$o3&V$nyhvգS"IRQ *3C1`Fd'(Ƣp:ɵ8ygiپFH&9y|UA%Asުftz5x`-"e13rEU49 ]=p{z;> ʾ,쓧}/;̖/(G(cK@R A4BPQGu^ 3qJ>NJڠjÌSdڣӉBvGR|<œʡ"*Ljti#I{`ߐ(0֑azg-ևl {1_Q;j ,"#"pōMYȊC>dqe1^į޺|ҏ9{»`@0n&Laו;߭`vLg"?܇7~v&mAȁaK5}GMY&#eS^վ/)SnNo.]/XHYK΄Y 2\DCY|;T>-FUC|m1-ؚO~w{KDSgA`v:fdU@K|"v C&sG|ELw'G}1;wt0v¥xBA]gޡ_&•#z圿U#m _,D7;}H dGz!x-\x]e |t:IV.3笞=:Jx0 !( 1}ArkQ^Y:w^uH"9H]kQ92JB*m^|$U:t_rs݄GzƠB΅南^&U#~){J_c0}E7lϪ+Q.㍎Ham&˳ԓ]BY2CH.+|Ɨhk[[DSamp}}E;6ΐKdo(lf5?(;L+Y} f]S``Hdr<4To-H`!Y< $sA!SƄa+dK}Oܕ>}֛7߾~&Am;7o}W,tF$# JșH{DYw&U>KĢ&2~%vMb7q{=wT0<ׁjͰF;99"PrҸe5|>cn3cV $4f 0IN EIՂ Y7Ã}],4Tcww, կ8`:SxX5`;Ȇ*2k{-ՀJ qWNVkIۚm= XU-ʴ٘"5DT =F[oϞ>KLٹ yZk^yO5(OSDT^);8Ba#O7al:W7&}i J3E QH䦚dYp/ 7f߸Ka0v?;<͙ƣB<Pk vwh)9xqI5 < ȶąOQɿN@~Mد\gSu*Jh^uM)=i"T@o@1#zZ~ lUwh{MxϭNPyPeD09a>%NhSٽ$?K.x:eF?̦s 3-f(MUGs*~i_=%cږ镽*1m)$I{;F4g׶Ԭtc.Xyy`Z!^o5iAP( \  A^UYmW=#TePz#\TuDwfɞe;ȳ1n`VB Ŭp;9$Zbv02g<]EUc^oA>YZ$z/]zlv9Yq C%ֆCUɠc0!ʩҠ+'-9Nayly'k"s~Z8:2pOGTkּqέ 5x-,m-(tJӵώe[o|b$\ \5dRꪵ@`&|3wl1X@X<d$oT3Kj/mI|򖄀 ֡:vP^ BClK1Im_b}*Rf]2,`0t䴙ő6ILg zD7Z_Av}x֑5Op{8rizwqLw,&;7?W(]X;]/]T1b~~T)ky\.@ @~k&alOZNWv>@]ۭh]n]s=ѱ;w]vn_z'wEd^Eۑ6UO̠?s8HiSZ{%#se3~Z!qJʫqpǷ$DKLzlY HuQyz\Pzs+G11I([;3w;;| 1s]U{z 2ͮVhPNր>WNυ^~|,EÜe^'Z 5yQq͸^va7^+y~G*`ߓ蟟5@o69+?&9%ViLZb{ #,Skodi] *Ճtm" =Mͧ,T ssŜ\*.tvvv]o0pimm^˜D@ïy1ʱQ6ߙ`Lk?uՃt muV#)olm(U#=H yzh~ڷ*)d(2Qgb/x??TIIC 9)r[a8\g :܋8тLںsZa41HtqZLx*\i~}?(n`S޳#QLk/{5_w&x҂a'.،f_h}вw^St9VSe$zIUB ,_ Iߟ6}= ي "ڢ>Fk:KfsÖ~02 tNP~M803IJL\9 iůgx,QeʿG{ p2ch PA^Y\ZdYnoɭwC'~< n{H%sOuWBwD'N m Z?um}a7^SHaFz^).ЯjZϙ~WqY%ẃ@ 0beK3Riamh5T Vd^$ؙLoZT3!hxt9b%a1?Ќ?v6G_pb@ŝ 1@9c2Wz?+6;sloJ2ѐߍ@'AX{Mk[6;xKMj m" LvvY;Hwv;(e`4׬*1- 어%f- bC5 1O O.VTi+F)|{U oU,D&w_q):UȖ,n*;[ҦL |dc b=iUI2յ<а/>Xb}GO)k_ J4'?hBF,5VbqBq5M X?v(i,|7hGV< AHwm}z4D>ypa Uޔa m} |kzryLts@tNGP`svs(w?AQ߂ӕD,' |Jeإ=kbQv/~ pO*c_{AĬBy֗3Kðr ,sg^$NN@c\ToU !:Ab"D,g=|RţжFEAsA(.Z O8{s@crP3nغ *witVgf;ޏ|rFM\Uzecz}ɫī=KH\?gɱϑq(UUna<~אָco_nث0i| dkt 1k/FoRj.p*vv<`Տ|Wa5jY߼w lja6^W.#@.ΐK0aG*_xqt8nu>2g@L d5&% G ۻ9p Gk(L EBfi/\YQ7?1>G9@g*:}Zm&ߦmRZ m|]$+ᐻxDFlG?}QUuOkq ]cKq`}Wn6\ q.*7oD,O-ZJm'tzɄ6͛+Z^㝼7ƗͯI0b\E&WNw4ƼPM .և؝ma4ڄmЦcܸ* ȳ!K IDATLQ#rX0n'?ބ&?3mGkm[D8䥊"A!L* i`/Z׍U~Zx)uF#@.,N`o]vK2/JIQO[mb%MЀ[aeT4[3 Jʱ~9#!\ B7 Ub6.WUObc}(ll\ 0x+Tej`H?kkǜ 4I<؞goo\*=2fݯ[C\1=GcyGa~ڎ S:qZy'${ &Ƥbn=vvʳ0&9l` Οgi;ߘihiKWB&s8VaW '̣Ԏ`)ʯ GZ4%Jg||5ʒXe#v=,c 6BfK`)Acw6sx r}\^9^#pmT;xCVln[%]X-TtgAbogzWgO}_?Ao ;5drd+PQBGW#~P ^v(k+)XPo?cdu5ż!F+\q[cSD͂>s`n渰[^G=UO F͸wX_0SpqӍg*O'̪ۨmׯjۃh]})t20,FGHIJ%ϕx\aoGxyAWHCրWe`lֲ &~ZYZ@#^ŵ2xLXVW؇vA2*Qɢ-NvflbScZ7_{JiČI|POJx3rقW}~ JjOk"KM #>Q1׾2R͙0y(HL0Q>c4aḿd- ƃ1, "T ~xerUWpC/}n3HXq$q^=T<_0-7$-8B/^yV)t4zE͘gtc3ͺ[ծ/R2zQ[@ya< 3UE RdFQ"F|b^p8pqrN3༜?n~Fi?*ёXA"kTt"( `FOY?? W5vm ts3q@|;fH5p* :TZf&|3V#x/fĤp7\֋N-1PL 0pujp5:0f&X~oxb_QhWXxSX{H"RbZ5?+1g]U_!@Rz_j9%mx3bұVhɴ;vZoQp,`F7Qe<͜q,xwGo}p W U5߱F>?9SoygiHh9< Ǫ-@svn3(Ά> PE8l"L%׀a%>Vz'2*2JDf;IĥZ4:m{$kG(Xqtt z=Ŝ!?S׍t,zv;{hwP_ϳޑ-!輀7!Cٟ1 GdX7*`MGm`E"F>$[sk`ma6`9is^'~5.MQ?%yg*&%I~큍QK@Eۉ3BG[ok\3,F/sa=I dG1gxdlzYԳ3L,CD4?ePQL0ֈ L-%5To@|,X r5z9-0NL-̌%u=:ԣt/rA@( E@ad ;[k(-Qw/ cU\͹L+̋]&A4@? h&fHLLu,yB S87è?_~v/sY`N6H<DkN F dpڤj[&om<ow]Q YB}Xջ艱tcif%f$^R92H3UpaPջ.v 6u9~?_q}Zn+C[K^>Zlxy7NjOQaN^mEk9o ,ǮQkE5WRMudHNJ~7lA'W|ZʶDAA>oyȏ|% j<ڣZ| E&Gifs~Q5TM|STXsdU1Cs¦sěv[ (/sEgۭWG}?ǥn=O**6Sn<:_9O΍N˒ZfnZaY}v>`g ~20RkOo݁U<2-C[;o}p! {x:d|jy]r5'?*ﳤe#F 8+p!LJ̥ULDJv1[?_Nq;m\,[/;dt&]|u+`)>Vyq$J4ӺvF 8so} 7^ؕ/~+Z&W7)HmEb+'E?c1|>8#~~QPdjv'Xc6-5Q-kܚ}_KySYek'ui0>mva?әx ˌ+؟s(R@O X!J|9+WuYT %(^ߖZ1'`soE3\}}\a05Ofos3A~My1n1o Kt\]ǀRLy@ 0|1BH$.d=ߝF~Hed1U$aa ˲'jy Ni^ s^C#6*?uvǿ|8#>L7J8}SV;PKPCDr5tA .>nal3-c>+Y*xJ0rG:q8ޕ-Xv٠ࡏ0pB`(^%y*U3`h.b`FO>p(Fp$㉭k"jJAOsNa}N)nNPW~Q}HG:P9&$;N3<|[an lŽ>j4^2)HW=uټ|< Ěg'}{6* DA޽~I6@pc=;>NSnx8n?zk;)KU@p2E=gqju2s(+[mbr:a2 F[7l*sҼ7g7Ii jI 8 ]V4q z y; UtuǎZ V$ً'6²8鮪Sx,L3z._tg _ 8lnFso&)۱%B5^3tOJïn3˕VlnekUKX`+ua4:Rp}ỾlCG?jJKWJ1U3R4W!{_|8z}޷1AC'RO* @@Ly!$["W*{wXZEI۩{2"y&׉o?¨aI&㮍kmAgX)uE)M `P`kIQfLpzi[Pw¦=gj7nԽ>bŪ|*+ !hEYݔ/ ʩ N@.{IU7Hq].ٽ`6SRj2-!ӷ=ȯwg 9/WHP1Wu&1O iYC=%S%{3_ڦ]T@Ϛ!95/`6x_y&ϲ>>iЗc8\MARX A .fa &ʩ5Xe]Ô6o1Y(-jwh@j~J:%"%鍓~`N" ` P!*`Sh㵲w'pփΙ9/'@A.8^Γ(ҬFTIDAT6k#mmp#ii9_@f?߲߽@]ʍ}𲴴W$i~`5? ɛL@Ys-)hX@T ڷTʺdv@.W[2Vdm(#"r_ 3X[4~0s$ /i|ϙ-shy[Jkn ȷiY2Ѹ_D~P84" 7<]nb?] 1Çq}- {LFEF2~$]=?WιePfK1f*DGICgn|d O}-mWV8VK&c Կ׺W P WZA$H{f@d KIΞoBr\6K a6QPkAjW艿!TZ F!@b<k_Š = tW`<Fgr>$>ϯϯTLstѫxNoRB>/A%_N?mGH[ҭЁOHHtiJT{Db%CFUUx*>jYTͷL~ޢ=+D>KQ=fu @6h[O4L?{N@w~;@ߡ9*" E6Sfꉠ,by] 26kAulּ6 ث.Uy8 pcJ9ܘ` ˗S XT:-[N&US ɴecOe=Oo@o WvY)E7ok@@+%:I@ts5 L7cLe>l@*m3jr遦Ca-I* -}3]i>VeiԂ/k8sgq:1ׅeȐ?<-N>Hgr0t?CR&4kgҾd kj u0q9_o ǙD⛒9 ͬݢ𰭎u}:7@*q7Z5 Gi Ed#sB#` h=0]Za$I@;e}]ۣ_:\/cnCMFoֱD3-T}j/BcUZ['+-T /=d< fGcC`gu2j`=ྛLR3O~*c&!L|$< v5$=L IuƱ<%r͈9c۱ڣ_S%nw[o{YvOѯ|I LsltBds  Ǚ@CNN? >w,DlK: 7qVDqvE*x`5ɶO;˳,(Z0q z`_o{jOYK|_Κ@(v%9P'c*ٗm `Z %ydM`JukZcHEp A/V[<[;z_,8[ n͎AcT w|*}wc)"0'U>Z$zѹkHmUʆAIiz~~BhvϬzoW2 ߐcP^#4fC ܰ+Q6pH)g)խ<PďpB_Fye" Y$M(S2vG]P!b݀ub!&qUcTK~QZ:lvZ}e@oڿ\)+L=8&35%ĨD5"/8ϖ]H~o'e]OI('ʳݹl&7f1GH6WpБXɳƧ?@L~۽ʒr}$SppB0bu ~4ɓmL J!$I÷H*<.}%XKy]i\ t@ (@{P_o'i]xZk}ph@{YrԦW$ ` yR liIv 슧||vz;pSIkc@zheN:{@&崎F0KW~O eP+Ty_7uo"E7 =y*okv`6X;Z(ꃉAAt2fw=ÞxvP. B`+ w,?z*'\>c}RY\f`㢆jB4C?%`﷩}-*IP9H5Atpv'@_{;5Z'UkB4tao͛OvlU_e̚}k-*? e-G߉gذ!@|8±iV L$#:u>h9~7i hȇy=k!k&M~D[}Yy_痜z; )T]>b!]δ'ϥ R+?&R{ka߈J]۪dʂ㠍>YGPL ,~og3g|ǩ*`7DJ/Lz{96V|3e} 6?GYq@Dň/}چ~Mz \1A_hH@l ?^|)δ=IW(Zz}W@,$AɌI+`#Pӣ @-|! {ɷ9?8ӷ@؇kk =޵TBa ޱ־ _Z/ۙ>\Ï Z_j>=0ƧO58@ 7 ؑxg.I@]i4UXܱ_PƼ/^Kε='$Ձ+{@+P^gEb"pYx;8H6;T`CJ I ]@Z7q o*i ^ zsk}[oQ@oj?n@tv~eo5Ё}ûv``dH&_00 ?x+H*V l:#(xy3q gZoK%COuW#c'C# ;ZR6o}oz;W~5I%e` " Cۯmr]o(ܐ)"m}K/VoPîIENDB`ukui-control-center/data/faces/default.png0000644000175000017500000002657313642553044017556 0ustar fengfengPNG  IHDRx pHYs%%IR$ IDATxOl׹sL0vb% T\v"H\)"R,Ra RVmz+!7)TfU4VFj+ed N`Ǯ\s xΟG&ywyR)%KJ]vqB6u!D{LfEuݒhZY(JŘ@HH)Kv I+OJIA$ KJ ғ{J bY%aE) "P̟F򦊰Rku$@ Ô呌R`YPJ{~$@ ɾ '|>VJJF."S̓~ l &2z Xl#_//΁t2p  "-t`-H:9_ P@Hg(cUi؀RADH)Mgmn$FX2?J, "g^gCh^3Mx1"EȘ~sv@tJg'e~ Q$ f6sH4X%o*$h FF"`SfpNnG!@UlfAD 9?LGޢ6 ZA0 ٟBt>@@ BN  Pf_A[0D )e?0ˀ /@W@8H@@X 礔}fw?~*sH<%0{YV3e|C H<&?1bgH<`KG NsfǑ8~)GTF v'EƗl3K;a8tO]kM5. p2c?خhfn$cAr$bAb$R !(L+LXFJ{CޙWJdZA` '%K9%` v;)@$N @h P4J @Jll` HRz?<$̜z?<+/ Y$ 2w17H)M)fČ~06& F&f4`Ą &fl @ @LH"ƛ rQ0$Ċc"Rza^3J9u$yM5S5h @ 4# h{d]N]8+/k`cH@k_@`u`@'4ABP'hs9?8vv{8"X @'  *H!wH* (c^Kx$ײ>x>sCP /@JϋXp)d `wYzl3m"w Hk1 A~\ !7 g&,@Je,zMlJP 9A#z} &0=9fGH'Hf61{'4 !Ev)e?;M51[&Rn!דU%^208vZp)uS6wARJɦ?@:LlW T''@"z}M`7B@"|E`6`6.؋XKg_;H)3>{&R^9?p\.kL&a۶m{]...N-,,LݺukjjjEXSB\UJ:' ]\ 95,--Mܽ{O?K/tGJo\&G3~SN冇z'=cg/w/~W}v) . HʬRjv200Xp)@t?z3O<đ[+_|'$^ (QKǏ nt6z/ą~ RGt1Ȳ>OǏc=vؖ~T27.;w]ԜRjƥT`^˸˂K"7󍌌fCՙ yZtc9ҿ^G/gΜyep lO.vگrOMMM~׮]vs HU[?KR>?\wQtX1cgB0:L,^ s/㡗yh X`[Y*cuѽ8:K.w 1 J]u gǾ8Ⱥ6&+ߠ_:tWCpҊRjҦ j]JO+c 1SM5 G8o8:+TȲ. ۅ$1Κ*lc?GIkb^lyZp @Mz?^zn>p1/@JK?N稟 }`Rj`^kծH`=&?s,qM LM^ /=g;K[jL泗~ Mgg䞥V *qi?l7ݥM\H%Fo=Ħ?9s8ji5J p?63=zNCX- &/077>?n߾ǾCXmR)Qؑ¿.甥X.@&aWN^L[`L-]R&\rrppɳ{}+qJo%V6McsL X+*@ba3 >VbUD*ւRz{'Jq9獁X&I,9섉b&X{`wX?ev=Cca񶶶&*\b-[>VQ(SJ8s?B@Vm&"kXý˹H){y/D lLL\\AѣGavP{%F70O拇pOrqh L 9h'X"&톇bP ,y{+$k{4F<?Too/Qi,lFT Ez$0ʀ?O󄇚Gbm$ ٘? K?Ow{j3`T6z===&8"U@?6=GDs[Npl"pr%ԃ{h9ؾ};m^Q8΀VpB&Gu^CZ&QG]W4H);x/0)R)(eVǼJ/(KJ 1iR[Y`t5J(`fPMml6j p .9uǺ4| pNA hI?vi867+5| @˯h(F7PN AةW7RκwEf^$#@J] pzpq]&fo @7w\:½M(inGu^&ᴩk 7},;}'* >J=ᅥ fp#zݻw/3{4vS@0fggqGM#Hk)ew 駟 5q#m&@)e;X]]okkaB^Xe˖ <2q6{󄇊7࡚1|fpW_} J7࡚1j`XW>cFQ !D;󣝝CL,JQJUX9/}2(=U>^<{kl @J.䎀߶m!&ݻd^~ IW?611q^@*j>)h@)fjN ƍ<{ӫ%Ν;.6bL߰`@f\x5q@0* R {vΞ=Vcl*lDP8!@6VA9s e0І^]^а #PE?Ct$#8Ag6x B@\rrppɳ{%@)K~>W^y~s8q@G-'=zCnۏ>过>>}^}R sرWf1z.>@%P2G}Ӣ'\R+8<ڵkr?aX555]v:q<8 PYF V>bHܳ458(ĺ=4y_f?{ } ]/p?K/t9q*xp<ëǏ8pu~.]? }* Jb]ٟTPMA_Kл';a?R/ ~,I}x/А_Ju" hC؁4e-4$ ]5qǜ4m-SZwc2Xh])c 4O=h=z9l-^ H}FKhh1cK{_ k1rc DW GWSJ}&d 1^`Iyz&@ &###>n߾GƸ1z1tHs`gttг>[d[^^Z]xdrr,]=F [h/(w۶mΜ9GD`I/HЩSr?ضmۡ޽{Ϝ9ӧ, 4: !z ϟ?22r,a ٳg" n!DKW?{p[[[Oӡݸq¹s%Vȓ?244t]柘@^:$tUѣ<G:;;\,ݶ믿>}Z$+t20<<ԓO>Loo![ ty~~W_}g} k /ܣ7>ӇOB޽{yvv~zNZ /<;r]۷oe2\wwwNF{ԭ[Ѥ e@ D@H " @$ D@H " @$ &9A'K ,1eI'EY @TZK)x¡c?TJx# aX7*%l k1 t3FGGr]۷o յYD܊|>Yk/޺ukjjjEXR)%B]lsԩS?CLl4q/}v)& ]f 6Ol6֭[w2)pO.]"SJMJAZΟ?;BЇJ_zL4ҢR`AǏ|?Fi!K_;xL<VPJ]N$axxʕ+'WWW8:w@w y+B~fq?ro={c>-}ի+34ѬRjVKYFq|}$D/|k1LɌRjN["w ? MGwEgwB 7"2?==3cC@K~ryh^裏^P:(*$uWUFͺvگrO@ ZSSSߵkׯV hnٛG @$ÆNukNL@ f#ݣ쥿l D'J)TNҗna]fW1WLR+p~@w ֊T )Ȅ>r!mA)u>r!NVC' MP֭[w>owttTȅD%~mZXf4@ &} }8R3o,>zx7>w\י`Ԍ% ^ lÏ] 1&)[G]r ٽ{t{M'VWW)(wlr)Z%<c ,;L6T1zM+{6y f8, } lo '`]M`۷s68XO500@68l0brS qM /i XpoP t,n%)j:7CSeвBb@P 5-V8W~WZR)`H)Ƒ R_>*R+CV. @Z-'JyZ-a8U?B !IDATHD$17vDP[$17@)k]ܖEU,bmd U$J&uf@i40h @Wu@P rԢ",8*,w*%ƒp$HDz\\m.6!-ƝP9E'T#4mXYliXӴ xl>?]ThX3d0=x"򶿕$QT["-IL CԖo%IUU6XL, @M=+*U%#MPQO" v3'&T%Ok!~򻜞ػUF@ =o&EF%5TyP?;nݺ5b.b@6:F>coC*iVĥR*O.Bv* ںu}zspGGǿ1UJY!8w! X1105&JT? } |߄T̚TJ{_H@VWWzB tb-[> +(}i/qqƅ)"Y \J0Ν;nc߂,$+ev!ޛ~#}P\x 1zjZ׳&ؚIuGdhΞ=Vc߀ĥk*%RA!DW?@xO܊RjҦ  ! @}*/_>o߾mmm=` _Stƥ vծ.X{wF?aA.$?U:W4ƩSr'N8I y:7>}zO q24N?{0K@|tƍΝ;.7@Ov !,}yGںuNh;w|>R߸z'6b20<: HZ@!E$8)e"Ň{VhDHJ7]n>D$,@diHb B& ME && )h@V +~H}cF3 56o 1"HR @R3_H1Ac~ "H'`v RvsB́BW0;WB́f4LJ/z)#, /L -B`) x &?KX Ls[b`?-8H刟H ̘jKlW4O ̔HaN $+` w chR?七Al`69Ql`69q!C kH<@5@x GO!qR@9B)N ;=F9)e@A*u9F_$0]BLc`S G6 M~!i'DzSoxHŲ!ļY e,:?`ל`?5biK3<@ L"0 eti?#@Uf`?$6&l$pXF> fN Vʛ'~v.$h`?BDQ Х~4-c (6!$LY"y'#2$ !@h1 4 A.lCbH(O@'<ѥ;&𳾏Đ 5fy PH RGUi ULU ^xF/J*1ͅ:%8`,zRd8N˭yTɂH m)8KJ1' i'RjчH S0C(_| f^L] P@-+eAg$Y*6@7  $ txh/>"ʬtdy!j0 ;LBɦB@d,qhA*J%g{1$@LA;ՂM)C'{u$@Rt=P#tObD(\t?DizY KAXNJ]v J D8@^d({r_ZO`!jH{{IENDB`ukui-control-center/data/faces/default.svg0000644000175000017500000000127713642553044017563 0ustar fengfengavatarukui-control-center/data/faces/2.png0000644000175000017500000112446213635333016016265 0ustar fengfengPNG  IHDRx pHYs%%IR$ IDATxk%WvsoIv4KlYD YI'b@!:'HC L!#8Ҍ'H3$S{`=V9v73|n{ϣNծַUml;n4h&zRyzrBԛ7?_JnGenOݭR3}ɉ~sK4UjSZkDsyGt YGF>6_]Vwl6lߤRt5w'6ޝn^@#^ɩ<_$Ɲ㓓Sv$ǀߣ? ; #03{~Ti־fgǎ7ol6m_y~v߾7<;;{gYikNGlį\yB2S{_ D^(˿Z=f-)jhԩ53 hC>3gGAƨ4>RGG\0W$(At/_ۮmlmvn~?w~vFz-:3=xFsY~lOi.FD${ #0PCo6<9*C);wD9#ە~D}tj}-PMQ ?y>^F8쀴UvZѿlcrl6g_KwvN-NN)tP\ަyӛoEoD^=mFrVba*)Zi蝝(2p#-)ZOu!]"Jhl^?>;ō5?(}fɎ iȾss6ޗZ6}l6qt굫w}wNOO1fـJ;5ˍ=x@3z뭷`E~sD1 ]f9ϿFdpߢ~6jX4E&P>CҵB8 W#yFxym{;) NEFd!A<7I sFRiimjk}lH6qml#ߝk׮ݽr ~ܹ[׮]+t ]W0_ŘJTnKq?ߋa??{@ަ7|S&=x@~prE"l G禝;^@1Z,Wd|!qXplF]QoC0R |H/;Gc2/P>}hgguZz\| %6l춉ysOޡBջҝkO\i=NB/}OuO;6tTHyv(i.k ~X'W(B @(4|6lH'6/vf#~vZXOy Ȩ 轈ABVTZ"x/$ZMq~=ci!Ưgosո76JwDw7؝*Ƅ#c55p [Π進@ԪDRj{@ۃ~ *9uٸ˕ KaOZ?&FSe"]'XO>ܽ&s$EAu*T*p9&+Eȓ̥5 x溨Z-_狼v?7[GzCp9،Gz\'n}[0ڸ[ гLWhsG:xWvΧY"~jWiGNw=T߃&sE]k|wJΩw5҈9rkbXg(r$ޙܷb>%1˻ď@DuEY3?ݒ{5lklonjĹZM(-k뜗WnFgVTRW#)) 3HPq I)*1b0N |k[qyn~Qm|Ɠ3GPJy )ud~igqpffiφsR_-;:;?|IβldOYXELDV۠= Ҷ5 /qMcr>e1\h}ńb\ xŁ жa6K`j$BBII{Kbe <)jN ObDq1ơlh?W~;ߍPm|$'3wz/_t*oў{{cQ}oJv㨞I|rBY*;MtF_팭߻ !H z"c7"gK_$QNp>W>8>PD:&e )ű"nWU srENoxnc/]czlm|lC;>o~]"HҰ1.e^) ð`gyB6kL(9ό܃35ܧ'5Țv]$F>``xeο8p4K"$hj傏@ ̕gD>2|Go*;4> 䜆jE<Nbsf 1bp`gs9pr#g4Le|:5zRƶl86`}G1^}PtCS_3pݢw1ƽ &aI* kdꨝ71bgӹ`n'pX pt PK6?\/=P!Z)k`Nl\Zi#GL*OKw2)FLXHz})k|Z ǬBT܋`% @ d&#cfzν̇gMU#? q<|'neܐm|hl?nP}k4jCJкߺ½f8A0?&y/]PDwn%yh1'EXT5*{j6Q#"f=nϓ#-,:P[|n\~U?5V(dDͻK s PՀy  Q@J ;? EYygxa %P!6s !OwD^3a@ hЍZ_/Dzl6>mB/ZE[[5>] 9cC&:3dŌr38Xϰ'-QqI9Mi=7簀G}J%f&A"հ>@D8-{cNoW%q[:KGq,ucO|k o_euu ` (f5M\H?NAFbikJI-řE^cpTkoolm|ƦԸ~ j6 Ğ)oPgSEz5f7%֋7 L]lW9h;ݕJW=AWO:z^W$M"Mߡ$Ew v yHp[_`4F@ "P**C? ѓh'-߭X&hinwjÚX1t`/ > ޫ}@Tm9߬0< HV2ACJA1gP әʲ|1D酋Rs~ƛ_o+6>(cCgn7BTJU5CY:M=O"13"ry{|~=vp>¥t#<._PdX<CW/##{cD¡< Jwqki:usk T:G@Zӿ;aV^kmC9@3'b('^-GCIa ۳iY>GvAԈVR'€Вx8՟kK-Pm|Gl;6>3RsZE.s[l!yWB3dQB]9&YR!aFD$3T#~GZmQA@r`%sʢ0nY+gvxFDD2is~q$r AZY;0cZn/c<h1Usn@ +8 4[':&툲.Vҥ s3p>76T`߶9+Ӵ{ZVՑo ϋר`↺ Ќ53]5Z}IƟ4S`p*4 ?ƿ#hcާEI9p;֛(nr. Z8 b{q8>jK KQ{BRNC~O @𼠪SF#[ @Sp]oMhH!%U$FѼ%P (GO#{n/~xoֽme=6`xWkna1}K҄"ZY?<A>v7"1Jc&;$'Ѥ/ s>G-0hr=G@p@~4/Q?TA΃.[r!t hmY/[_)Z#{W >* *Mf}Td>UIb PUZ:W02mq=6Ư>F76`x}&zeJ)y4aSո~V# m9?1a$I)O &ܡC#tc ghRNYy`z9Q0 43zO8'zB i:zy-c@Fs":;2?y9ܙr_і@"HxvABx#VGUqFc2g')BPh/Pk`;9Ӌ_-A|_OVjek5&{:2mgmZ ΪV/Ow=`=8g?@{pѕkפQW \B;>8>9L^5s r{[TtWs`QO7l @Q0FOQZj/pJ 8U#w z!i҉8'QRh :@] A`( 4W `OUvssl_D#J@Dfu? g0\G¡Uʲϟ{Hb0KKrNMZZe.%㝄pKC}=94::2(B~Xs=Rt"K Z$u|~nP҂sG(Fy8'FLFMs51#'ZAu‰K /1r`# nc6WizifzmלQ B4PGhOHE9[i$֓d\\V hIx WYzX X7j40~~Bz|D!;f,%qZy=89L;P7v} 0U?#聩cTZ '=2rMTenK/9E '?FOȍ3&r9ewSעVm +$mؾW WtsXcs?q*?Y7(!ZD5<~>5b2 [#Â)ߜDN噰FVrP,lЌ&w;t@QѾ@X2L&V^6 4$nѨG5С(; K0`Qd;UJ!ad niQȫ,/ c R`^TepRQ F1?Y<"tr9碄2Ko; gj(yֿr>Z[9x9xx۵ש?6 hJƺ6h%}[?ɓ O-42t1,XhRr7nn[5iՠXZIjvLW WsH2RQY0JH *kp7m[6Ƶy;/2Y͜!m+g位9ՏC}KZ?wCV`iM'؋LDڀS',?Z]zpwr"݄@ceGd8oⴀyC5ߗ ;-[rI`wTA+@C_唻,N;! s y;%_TS/a)Q!k?̰gAJ$z* M)EAjw7DYbmOd1&ઁW7m,džlf:<.fxt/n/X\!p!g^Դlu h%Ν#TgXYW5X ^M@#Z Z ! l#;u!ΤҽH䴪w#"NX>s >;/⎂Z1;x IDAT<;)RT /#Pp JQ;_^"ҟaxkR䅛{7G`2._ŷO'_"c'DC%C ^[@*+?ob`!ǢX#0@c5@ȀS59~ dmpEm/40 H( H7(;"FH9U88_a_i$qB9 њX~?G,$?Mk[Sݗ(Dìz>ǘx$>65r_ƶ[ c>'2?xeWZyzzM~ ?)*L b'RQ"Ҫr s|M9])8늅aD˜7钵mE8⒮zQ'{--J}krN''}S9UY0YU/R^kQc8p\#O3>qyRΟ/;T5B즮BCfsz9`}\[T>H Y:.ަm{Ŝcȝ Lbsx5) RyvƯ;gp"Y.A䇼wF{G] RQ\ tC% Y wq\CА [}^v%cSϸDީ1 P;A~cj_{m8ʁ2vY)Z)PcLe )H`ĎC_ )8B 4}_TM$r)I;-6S:S9aykva{~q?+蠶[ #:2^B>A~Ik۠-,NS/Q6##@TdKE~_gn^W; /T%P1_pǎr@9 J tm9 =x65Y5p0Vy@$L{9H?"G~o HhPF)HV(TEF9 Ê9& *p.7ɂNЯDVnXx_~/o¯o"B>B/Zi B^0 9zH>0fi%5PR~%988]PR:*vE@z ,Lꨥ_$o. CXRV%I K8,܂rFI7b^ }sNZ4=: p._/c? zKD-uM:(";k%Bͫ t/]; qWʧ"RSU" i!ӃAT#3f?; z'X+banY I5gcEF$7;^%?4 rk](s|DiL\8dGi4d#J5rBH9RCBǁ>gau*! "`}uV0gC=+{mK {nB_̿??x7!qRq$ǖD)0]_,< a)⬷O9RᎈUrTC) ;IIzX]YN$We56J(t{a!haνk1D{{s_gWW =F_{90)̱rTuvĘ|:Xi28Gߗ͂^xH{$!&ԑr)s!!מy zJq/JAsSڔG}m mἨNۅb"Z.glz7,?! H'zh1L%H Fq邝h9 @[K1^>/52uعO}'5=(H*wg`2`w-{\Y1/cRc^R0dudi?XFLH L(^iEW/&9ktJzd$aVv;e9%"JjL}rBtcFͪi N|-r]-܁6e3G3'D% {r 5™|=f31kYͭu~E,JSOHW? EdKA#Tjj-t"Pǭ1+ԻgFFzCѩ<΃4/ZPZ $k0LPINK9qrX*(N%w0 E#C#?w.RW@%M3bԡ[ p&}0Ŝ_ʢdb%Y=vbn0Bע_&'![ C2=m%zX~G$tiԮHJdB{X4{hfȡUgax7"ڂ׋) #Pw͊A~h#$~5<2^!3()l@'r dd^Ud*OCcqyH [s+rJ\뢞9DaX9\e9=x|e{V(mjq /ߖ{ u2!+@ʇ5lgWߣ&rBӉupxNwD/+Ar:Md{Z%RZ {dXridv6.$k! QR@0mjt2GrڵW( B1RAd37rF_k'ϮԗT?cC>3O`D.d <_ $BG>_p%їw' )ɏWtI%s'0?):Y;# a y ؑ * cEH8᫭v6S?k}ג8Kg2ǀəx~~uK3<zH\2vG)ĨCJq Rg3I!ќA-KT25%? { *W3nC)?kF).h-HqKOUۥiJN = >FDׇWoi`NS!^ 6>cC>3o*˽zw] x~<(0mgʋ 1me/BԆg" Oe{rΊ~@:0 NT;3ySp`PsB DD Bg|.Th*K,1/f;nNdHՠrURX8gO6|Brxgݚ'Gʎ;~yg2\'ClD5/p㲊?/T^o'QCdIҜ{(ű5V5~â>I_DѼϩF̈r}q+NAL< rB- ^s-ޮFi{Yq^K49b ͋<o-miϟ~/u.J9 P_kN8\dJ0k{_G{HVO`kq{[Ic`YJexοc]C4HfO赏JIQz]ў; WM#cĭ'9J, A_ ?K=* #3_GǜZǥ] c;LB,c/ȏ6!֜ 3f ޔ $vRĩpGA neT8jGc Uͱ`67傣~/*B3o\&YW PGe5$'iQհӨ4J圈8NTV$-ܩnt*͝7ϳwIN_nh_#Ʀ3nXꁘP `i_iAcz !pH̋n&'Յrd>@>mv{b־dh4l>Ā\qYM%` N-5,a1]\Nɤ"40#*)-*j0alU%tg)?UuL;"<>T-q71'%}!) #o NnR:WT ϟR iD+P (YӸ2!y(tg:?33x7U |Ɔ|Ƶ> 9߃5ܳG=Z/#IDp}$E9qY]߇P>nf1^AᵕjVWoV !@ ] b?@bj@=K!rS=`y[#3\t+CUKCK@;S;og 55 ȈX;D΀w?3 7C)fo#žrY)?#5a?O8K~BJ{Gu2#9ӆ[zjx-??3Y kF%)Q*jG!ߡ/8ؼzD_7YJG?i ődGr AGF@?&#O~W W"2<"xCGȠ`jZ|؝ۮ8 #iz 'hZAhڢ\p&4ӻI$ů+StA6Jw/QeIJtrpIH<ε\ 2APYKOkk:GGDzBL @o 953&f㑴!sxP*+c|kC+!bӠ VΊF&t.18_ {=d'@=wd做pQ_ >ֳ`,o$Km({Hp5ب7z_ ߿ }ǖ{f!z8%f(& { DJs9^z:vyYM6[1*Q, w>U^HτTc=\2 $ꁏ 8U l_tGJӎwt n;`jEzf'IWaZ<_sPDϥKwB>y|6*/̸ZR݌ IDATwTCJ;ꃂEvE%-mM(5=+ ~|\]K|DCt,q X]ImA94NӾɿ]QF20k(s葠?{A=gy9!ŪAjkfy!#!Гr+]dg_LqPGr}UM^f _QDigecO6XVXg6>JZ&+cVGp,29q~񀢜']r<킨*uO^筷3Hu~#iN8,iQԒ~sX_뤜MvGzFP)(x1be%{ - gnA*#9`SI0:54=brO oOcsgSoЍG5OD1e2Ȱt^na 'Z))c9W4RMm'#9h!D(8@"~cPIQN+ v9=Jb~>5C5;m4ϑ1jVc:ؙ.p?E[M cmIXzI \^ Y_:Y9Ϲm\NۖAsȖ!F̒9Ήvz-+QTN鲧%%vҔb@AOf!(P"Bs+, SPd<&=l/Gq%KOmgGj3$HhZxpJg~ pբ}it)KH+_HsNJ_;qUyǹv@p^qli\}kAyIyG/* $`tգHUc+|DJ9bBzH0ԁn^yi={ٵ}h ݱє8`A 9GI L0c+z2)'Uk[UdҎ2 JyZޖ 'K11sNYݿ(JÇ\-sB1L?l3X 2H4X %nAu`9)Y$bP$)+Wʄ٣18;qxO>Qq-\v(mFViι<&lW٧o|Ѿafl<7ˠ׈ʋt$Lnw.a`?oynڭ&kzHdXy,{Wϋg|2XW@کh^d+w"KIK•%Ԛwc2GD@<%[>Wakȣyk1:&7;}- Wx:_|XhPPrl3);U2<$QuEBy]l\R gڡ52^Vi{ALXx) %Z;FqE] j>Uy_#$ΧYu@ǣ׊ ΊI&MnZ WDtRc#i~?B@R@x˅ҳ|5C\|O(9e(sL/^9צTkqSa8iֵpe~ܒPH Thk蕷~6r86}O|^ֵ A~-׬-x X0z{``_޿xT! \!(\0 m/# pծ DZytnR&u4 XM(JT}B RaZl=Lδ8?z׈ugH<RC Fk*vL.V!RE'%|o5ҋPOj<=89 lɫ`s$s1}o8#J:@zg|FXoZj8<81r fKߣCpd^BkΝJ݃`)p>HV׮U -r(J"5sG}xssާ9Ӹ'U^~,¸a&cX,ȈEb|I8GE4JǶfeB@>Pb{AjKϔ5{L蒲5FݘxhR/SyIDcWLE:UoU&Ͽ9$Z4^c֕gԃ}л5"wDh[R%~@zOcJ4Fe!6%2ZSp=[Qo ͆`25J;)aѡz19:-"k)$]-ƒL"H-{NsASe2G* g'.P[?V->Ea!j,5 B`w"_8`sm?\'@h\$ =>7:=yyY*A%%v>X켥aaJ?Vhi=eenGq5PjF[K M raZ뮞DhL?'HvRZL@-_A$myvoLWמ4?5[6SERn ?&-/nr"GzTC*O BrH| KN>H |4XI^f 84( ;E4"E㘌] rENYkw6+ë+$>-Ι P߻٧k9x\͗(Ѩ7 Ÿd#?ÈKw*q3ng2&c,)CH^y3:? 3sXYBŒA*`M-zxKiaiǥgrHC^5>Vg+MqCFmXiNÅ{+ t?|gOT]_y |&JI?tEF*Y>Vjd=tr]12yk.'y~sS'yR.zZ16`ޮI'm؊} y]Tt vӡ} ]C})!å';fPM!36TXMrI`HɭeT4jq$[NjG1AbM Z+zhXSNu)-iS@u3` eV[zMؖ\0dhzmZFz4w֍Wn ñ9._(  t&(kf:>k*xOSPLˋѰ(X~FR3K^{ ) l}Ww/'=rsBW͎MM6DBȩl2oRk܁Z:L'EL+=HiaU# sIŃ@%S@pzqm<)TP؟ Mpx;U4do6J] n~zSm6\?CwuBw?\_k%{HJh֔D._OHTQPP/_4ۜhl{4ГQh& v2‘9G`K?sD)0Ȅ"Z5"Q #I~`B.g=)wfCW#{ bGuOh06=|m=\8FXlA"G~*5 65 B,4vV2̹yǹ]os( I ɮ 2rh4'rƿ(vX{浄jVN|S ocbN ;},qVfhvd&Qp ;y{Sdxʼnڔć|?kom26=A _6ҏTt6ie$)Y'$j$˘1'nKrƗfK4WZ);LC_zY/^pt\ z?蚗Rf9|(2m鄼ԻhΦ W~.H^FG

    Aտ׉^Lzv A2]*6 "gط^w1~J6̹Rݲpoye]HG1=9.@`G .֥Cz͈{H\hdс* du_Oy}s zcs#O1uiC/zHxIlÉSAa0χ M!GEyl(|r`tѬ(~.^Ӆ0ey+~ii<[ҭ,GJWQ[]jUHf9'sp8@ 1*jCę6Jhfw j))Md:m:E EEr:Y\T/ 'bQG6V1|DH@G6ԏ{kE5][WVs%H[H= TCQU0'_[TgtrCz,tugUpAtSr@|oSEheL޺pk\ыS9nlW w9"i۩웼ij25ރ|tD[P[Vn.6P>kmH@mK[X2ixh3Cv҄\7W} ]c}-DU!֐(V-viaP+ưJP,Z0 @0 y\9ur|a< o DX$?;7,uaޯGUMLDXDߚzv~B d%6sl|'a]8n{ 2Jr5d =g >d088%RKEՊGbG/.ď//D!"cDŏScV*)@<)#ɘ龍t3G,hij=1U%has0`:yOԞr%ʞEsoݢ| Dzx!ԮfU|\o:H6J9vGzXC\7Q6HR!)/wPyYէ* ׆+VBl<MɈ_UD)\$ 6pk|3b )-+'fuXB ,efcRY2:N+JWpߢ# JzAӃb;1jI&,IT^ ʔԤ%(9oQ#"phᾈHJ/ N3NJ?t^&*UKzZmEr_qylkEULj8r[_bXl)J|rYBVE$ojP",C$ɮ9Aˆn IOT.;dn0ǜb:;#sg<Y݉'GY(55| *M{q.($0@G\lu4Z:۽}cS |91OߤR1E+ /Az&0P°YWwu|*@a19ߝuq#HDuQF0F~O("ԨL l!hQ %&XF}MG c%P? ]&CkES=gI5HIɜ8Phx%˲WR7eupȺ]z{Y*lydsci^"=2 9#te]EZAtڧo|ssql#?ɛeJg˄֦r\Lg I̴Ś]cd'EC_ bE B` m SVUE߬4;I!q{%6}>7G`Sr13G}䐉p3A9Fw6xU-4b Ro淶 \0~ק:Ya! K5X^ rnbт$EhQCfYs@MHGVe&9[:p,jm$CxGzR"?Qkmd4!Wb+0\ilE/GsYaB-s9äw(Xkۤ6Nyr_!l{2ϥöca08B?Et+R`#ԓi&rH|hYz7IxrT5ϩA51ih8)6MTܺJ|,.4brn SmLch?y%C7u9I* `ma~XZ awJ8Oyv1"d*׫2 m)?lW@Z!劸6FQr^^RJy7c 866ȸiЋZS5Vm*rl#2h*dFfR1:i,щ XSKZOt,<9 .l,\r5d$t2S?Ng_oWteaz{_4<=,BK[)Yf;N闭 u$, #>C#%A%o؏G|))XkWFKQ̓8B-:ez.]V);1BeW 2gɈYwvʢhuH䔄-_3ZeX$^/ZT) /j΂;NJ"ҽ!{O,@+H ӨY>ҘU  e3 4Eh+6p -% RLJ(w͝'DM/0ՄmkZa|-يTRv&ۜtfWyf.(%eAn0@bzM9_NFfk*;Phf #b$ǐ]Z,{Hah dE\,P2DR)*&,vdqM,eeݟV!sp,-ۆ+Յ(Lu'wvw& ƜebFzQ?{>#@ U᨟ dF)PڢO?_r_B֠7gmcvͮ<{fl'$mRj'N\6qZ-D8 -r!ŽTR*QeA,>Ñ*PUHر>7k]Zk=33̰GϼycֵֺKń7/͑\\|{Wu޷w~i,wlB3[;Y-7jER6 \qņW~ xQM*zd&FXJ=|ff׫m$ ػ}- g +-' viNAo6,;7@tkFxie62ZԐBвr Aѭ= x* +|6Fiԭ`Z㒃T\6anvN#" ⢱K4X n8gs/ޗKŏ,~EJ/,n& ?;7JHQ@nenrwAڷ6: gԸXZdbFάmՍNύ(/I{-^RH3קN ORD(.~tD68k~}j/FG(2Kc#nqG*\ɴyV,~0IltS+angـvj|Q9 yD{ pE_>ȕAǃFڮw1O=:k[PGs!E6$`vot'Jp=$T;!$s[~4 ώ QJ@-E˒J/KdKg0PC*K/,gOmy'BK>!ߗG $}/jbl]Y]l.km:;]w.RLdpXEQâ) :;R9I|nSTs-)`pcEvLRRY;4QTeC(oД44phi @~,9&Z}MܪFWG5p1]yƮ{ =V#jN n Z*y;kJ& P8ch{'p>~I+K4VK`)֢4ׅz'kCˆ#\N ˜W[T c^M@Ɓn6"/h>7Uab+ i9h =|O^ n RE./*IxIgGP)j =BP q>j֑W<#={6̊0y!ؐE?-!ȧ\cմyX |֨o .t"uQ"}?Rz0NdER8 [v*2I|6Wh:QpQ+ua(T*]2do[Y#ڻÛvY|%$1ϔo=Kh/<)|8?3zgǴKl!'-T+`:J6LX6=nwW_ 6eh+{LO`m.EZ+: t}r޿.5P$YDD`Bx4sub! k؛,p`blDE#燱۱ȎLȝ qm2:M@K)V,툆ǣ[KXY ՄZ4LV{9[C oVf_`FUȞ9QquVN@l@vcC u<x<84$eU'q}rkj,SQ$b7J=ΧeF 0}e͂GD^K(WEhčy oM=57C34UEꥒP?a8dX4Q@K<}1HƎjgΛw x_T/O̧>Vz 5sT1I6S[6dm$ ܼGYrŽoIY`8RpyrZF!P-<{̝!uZiQ Hzk^7DZQ0 }t(*T*C {yAFGY)^pi$FT#@g_~kӕ`s6?DL#Mh+-GXgrR-}vqƻ]L ?E8gNM2-Sok:Iuzs6Z/8 ,IeQqB3>;gMeiR> R9.MhRa&"V=y3'f*i(%wlg^/cic'(`57? +Vtb ;lxB˝hhhH5/YLK> K neABO8҃X^2gnb ]}v(i?sȼ*`X|<=Met]l G#xvoC`T0!hP Leklk5PB+ekE 7?1sR *fBTՙqgJviN;*mw0tFq>CN¾tOcͯ;)y- "7J)VTolSQ[~*'V4|`ȹ{Dj:#*ÿSy5+EOu*DoszK3G ~ϑߓ@]5:61`BlDD_# et meYÜH=d3'(G |H&~*};vQG/yB687^&8 ^SE: (Y4#ҝovf)xtNN9{|}sgq#Z:dƚ|[ʷt#M315sF3Gdчo9~hrTѪxqñx׶Ќ/ ſhn{XN.ReKx)(UƂDeo{mADp4Ԯ3lN`Hg8 mnwL'Ʉ221Qe{[%4P(n;A[kdkLU~k>-! BzȔ:k XKܺA# y`bLnR_y^Ew'z˴hyW;3 -omNHj(syG5 &{ug msw ):KZlz*ʃR@G1wtJń/晝qǚ;!66&ء DZа) j>N %E$:%>JVM+QXN娧Rr}9g #hQ:BHXĪ1MY?`UsVz\=Z2t ^:Ert҂|}2u8cjPo^ENQzЄkCSwi ws`k}j)1kHF8<zVy( Ґnr1$fԔ* ҏX7K]dq4h>[.,w*XTGi,GW@HNDڢ $! Sȷo8Xߠ3ox:;YyO瞢ǂF&GPYfNU,*y+SW"Bq=L8tmnvd~ >9cdK/˄&e"Z''bS~yJ5flLg@o-n ?z4ÑwT'NhIrި 7 AZE S9 o\3"yGݥsKB0`MY5'yLK`wvy+pqg3Jš`Vx;c;kU4FHOLgg{idmA|>E3FC+ 6Gņp9z`&XY4QRA}D̜D&R44߸)ue ;oE2LѺo52B*$?npF+z\ -lYMӥ"øz PcDInEl=B$ &gG!$/EUո]]]yp=j}V& [si向?w "Ur =p➞Bpo!Ȅ4P3RMz({ 6@֖tCU@u cd'c0_z7J C짔WK)ޓk[\-,u\^GȨZ>S{C>$lLJ7[qN dd0,_n^@̦ÆKx%.8a07&!Dr jd&,~ C@ɭ 46[m$EH_Q9 %h"dKNBV(zuMG&x->J&.qbGi>ƐZ|[nk@\rX˪`9ZoMn6c'@Ej{\q+iL%i;lZUDxw+CGydQhDHcjc9fNl~ _<{>4d#Ƕpe /jNiL(}ftBTn4O߉WQAaEHU<:|9-83ō|Xu k.@l82W(^~S/^A^>{anr[LG!(ҩ%gpy<_vCFk7^aLv]K; ͽ|ϳv7jf9!=2zce D<;[@N-Կq^{5OyY@dS; /5qXVi,m% ~z_Z?iNx8Nhn~o5P6j>Wpt#< Ԭ9wJnIs"ge[10i^໴ jf@q4oٺ70t,s}^e%-X~ALe+mBKbOݏF]4 _1v)Ze?I=/?ٰ9O}Ͻ";M73SZD Fh: dwxwG#;oI'򛰗HϕX%۽AqȬrz8#B!ǧon * vT(Pl`/(ӣz3:ɽk3m Wуkw]ܼ?="& u$ˌ}q8 p?k%;drov2]s#YNh` Ľ TI$5ijv:%"ce Ce$]o(Q4B+zz t~ (ԫ?R6:Jy+x+k_~7O}c˫QVDFQ{l!Ƴ ף!H#e~xA9glG}(xd-O^`C nNN@B/^7I|p}81~ 17<Ij al.[jKԳ7GukR)4v\/0eϽ?.1C|D<^~^}~ք2yI_߬C0 jvz G dh^]YCZ=gaY?npK): ~6}]a7Iq~@PؐJ`}y)%S9 ϡ43|ZBhQGfwSyZx?Nd 5tA+ʳ'- GX"Ozd;ϼe>P6@ā= Kȵk= Pϻ"7[87QU$.HߓN,E]AO:WGԀ{^es"@LR {֍섣 +zBձKMJ3 lh$NK-Ų.w'Z~"(9}~if4X>3A1'c8h[*Ĝ x7e9ȁB:LKb&q 2s J7X~ }j c;sNCڈdžP|On,8`LkrqWՉ˛3}@0\6Z"&w <#9Ϧ :pSVg$3]R(yǻ n]bh维63iM}Ĩ!wGlh<f")|c1 8o@rYDm2mU]tSyGD% lv!E]vsJH9g3؇_SW9Y+?B,u'=GZGO - \alx2}G!/Z;}of4zil,D!2T[D )(;m臐SV-*_WPdfas1ȟ)c܋|i8lM$57`:=I} G{>PֵjTCZ h'ݮO~$nD=v}dڨ2F3 rD0jKEY*n *(D:6gW+6ϗH+\;ux\~=C0k$=:O]rNbU&l]8j`Pܶ3ȃ7ߔu@uD3}YLVЁu^*UAu}. q$iJGJIȋjw_Ԑ6$ tަv:St* U͚Tn)|4jN.S20v4J!s>xϊ5ѾKk=1m '<_I1䲓##Cк&6S.#W}t W=JWPÜ>7=£.\\tH0H2*.ZYe"Dzz!{Lh qizvk!E{yJ*ݗ^>-oJg!kRDG^Lۂ2\;l.Σ~ݞFQʑv>SuߚxʠJ ~x56y*gLGzxk X66#Z`ac%D%SݻGqA:c#ANm2%-q1 q_|-mmB2ܙ/%͉!N # RB8% Q0]2sz쳃+7Z*76JAvq-NFRN!|B] _WԴ~jO(scLc;[sީ gDyiFSdQ-A "){%TȬW/& ;#8{]9~ÿzVaJfg#QqE=b.Q<#,).[v?0Ts;g=\k =|Vifh#+1ô]=)D/+[Ѭal^'xL(K誓kEy ]i' @5Cp\J֒3B KK!eo9 +RF` .Z [vS9+xA^!#y8OQ0e dG>UǪ OVDK:EM,k%,60=[) Al<PDs]3 gR:vD5h|V,=u2)ҹœx)u~q́#kzkկ>eyܑKGɛLjwqHptw;U&-&QV5r+~9Y+U ]%4 gz;U ;?W{`@"=9)S=Ga/@pO>5w:A`d(8w-mf^L!҂Qqa>5=ʸ毹Fg/zFj||KVkINDd|v_s !!!!W3;a $\@ ]uOZ@*r~tTQw|ym(  IDATH4{! |\V a *; ◗Sx47Oqn#xp!q%})-Ś{%RZ\|Q#UR;χ̵k1}=WAP"cH(G'9ضv:Dg/@==q&7G/T ť~ʼnr+q;ۍ<ls)`n ֠* u[ӎEqq:'3mO [b?BOܸ D"FJQ^>|-PmOj_,# . 35T#B|S@JU愜{wf?>MݻRgb0Zup!"+R)beqO+ng/%&݈)\7ݐ-[@\0Byt8nV@[pI{l'q.tELUH% 6?]LV: G8|8&W=/0ZgKTZTH@&G߯QE:g9 KMYw+G TGO+ x"_.T(ʏV,@=/[ TƤ8Dn' =-o=>CJ: l%FBWH:=Hm{"R;wMMS֚ Zn*<0o? uO$ib$R4KY{ #…ݞ߭kv/ QCRc̪Ʊ1bNT ⳢLͮ!jSsX6ʪ7J6єm}q\SHwϴrI[ڎNQ6W1dt֚,g4Gg=OIpr0%ks@F]G# `K_!6d6w|fU O 9 X=tѷK ]Gg(Wcp⹾dP[*rDR*.B2|O&eEϋ{خqo6' m[Qg#XJ pLxȊ-unASBh%FoDּj)LD9rRױofE-hi%th hTĎ'/S!PJ>:x 㭰U۴;m=tr.8qC iNDyS-KaƸ7c,Mεzy7^pGbC{FI~{6<8)ҥQR"@5;I4إ)ݘwm\C@g2 o p,`pLҸxݘ_1h%.!Y: a`X̧.bSNQRR<φ: !\mF ۊ79X)c=g H!D z*}cBdqs'RڢԮ9o5Br3F$ ~໖y'++D;5S|imfO!o.  xwF{aK]pjӒ3ixĶuߦ|cLJn/fmfzpaL$9;74)sʅbp0fMl ilV8| W a ɰ$ hS+ڛ|qχѓ>~C(I)Һc ނꚊ28XLO u5Ѳ-$yC:̙a"<~nhr!Dg.j &S_zE'zȨ8Lc^zEH!{q0ȩͿ2!W?Sh04q0l6ŝ}?{./iGrj2b([sCf C~uφ?>0YW?I|ݵ*\TjM+>xKQ`͏􁵞]q_zIٔ;~$n CiizF^{Q{6X޽dm%ybԌAY,]74;b9Z 2l@mغ+I,~GdF=}itFS/qק=Bݝ>eco2A&wZ:@@?9NvOQ2]d *'ִr3$d{ƵL}6O Y3s~5" /-jpֽziOeH[AuOOHrWCqyO|W~tKt>scj)^z}(s2U3Od pv gu̮#o$-6h=D8{Q6SnD沾p;dOuXe%u[W.<+ ȯFeGW^  [-i7CQ aj.ys:܂Wl *Eaȡy5)1)m\`72+0lD"@^?W MxSx6mקurW8[-RJO RG@!պ>gC*V3\ُUK.U&TCF܌a ml.]b\}Z`_Mt5sy?ٯ[d" Q^{ Ձ&4ȼw} ) `1Qȵl=Ƶ^BTξvb! P36ȫ#lGEn?Ðٶo(E]=Z,YA+_O\'R-?jw*2R1҃ H3 :%4;bP9 ޼G`d8 YdSn3E&/KS}I;ed)ᆴp<:{mqBuqXpf'f)A;_N$5̅ EoiABR788;e?g<OJn" ĭRݽD}y 4&IyZ0KR\3u=l܄Ү`z?h@b? ©^7G5Cv9@zMp4~C5f(yc 4Cw6ZPv{<˄g *ޒ~Yw_;x ]HΊU ULMSqDÉ@ZCqwPhMRFDAKE|1q#68(α:/U$[>]+O6qؓ>{\zHb> nf7IJT#^jPsIהGY&f&]>UP9ZK\r*[Ϧ3n^RJ" -b_o(‚2凔LJ=5~@ lK{FO୛! t g .b;x *dž3D:4DZONY1>*v@z&{@dmOnkRj88!9$6ŦCAGI,i+3LWYʰWK .S$3 ?Z&K; Fx{Sq%E*$uL1\+ F9`v!cg_.']ӯZ?zxLwsi֫[kɋ ~6h֨&#9L큚'hTrဒ0? ]3x)#v G罛%p=!9T tRPKhQHMZ1cS0|Iﭱ]‹k*E glӃ'^VS Ow7xZ8gCUcyP3%r+XWJH,R* &UǮʼnVqc'DPh\$==s^Q,$Lï/fn".QʀJ:*V!0ߛ[ֈ;#⪐6Vpu,ŝPjXDQ<ہr~Fê`TS 3遑2Ʒo&?Wbײy"̶0PThDm:J@W[S''_>޻LthӣEd>v*2n[{x=ÍOE@#@S.8oy0Z7ݰ5&Jh"QO):!G˩ŮTGĻ[qNٻqO7q,^Id9t[`y\;ٱw]F&&6{mꀾqk9G)U\*b d1>n!G_oEzK9^};*C>ĆfjUңml[ZWUoBeZ\'{V*6en +Z}>ۻm6)au35,sHEbMC> VU?Cxk.USRM?׾Zd@>G:2Qt %:Ge2FͲ)X)Y̏4JG<&c%U+⽁۱\󺀨gu,m&*93wRE* Qzc޻]d{r24 uJ*7~-n;TE'Ln77Ԅ>27JS8yVfY$b6Kg?o'X×*[2c%Vnp UٍX oǂ$G;d;dc&tϺG5q9ԇ ( 򸷆C} B5e;9ϐIvhƬzQ.ms|?k QBN~![KvhNi9@CɆAB@˜|ٝo;49 wl֒JͼQ n&>TW[8Y33A^Bt~wrBL_5.fe"x)Y\kӕ9eM)_Qvjs1/ƞo[c{ǽ[ 1ɲ>Sx B@%PR| 6rՈXŽ RsV |$"KOB|?~x<8~vC=J?G+Byy Y/̭,Ky |h"-0. /O7\A6;w#tnly >c4EFtdx~6"ɁwȹWGj騪PI{ P W8t`DZ*6HHeTT ^3$S5m0bҶm n`/=`bDUR\xr,Cϼ.ESi#FEh: P/5 e:Sz,; 9Qoߥ*Pd 9q-9| c9ϩ@xApF3*-gc Mq+i0>GM4V ؆#0&5NEPZTKa\_7n9z!}W:rMJlIm%mma_桐/3aDChފ#0uEN ^~7d'M:ab2g+W3Y@j# &> ^8,bG'>]z?oATDdž??Rk􄯀iC(pΉiəA2i3cHܝYw/s 9Z!.A13Y&܅lXj0y: ` u"C٥Z@"ש"f-E),bM-@U3 wvk|:t5V *v`@jGG3TC8i|X*ՍkGg4|Yv%`[L`#YOȳ+dtHQq?~lM/ާAnh< Ǹ(+ASCMꊺAq2e".DA8 6nVԸ`EA>vN]$pks2Z4最F9K—Ni湣fUN#Mv`\غ,u[z@ʳkZw~Vwgr޴(oֲj~+zhbEסF>4-U'έ,5I .;'Bލ;oK?س7u3j2%T|@\FJ16;xP 쐁\I&2}_=#}8(wu" ^CV%UT-" ޡXDfbx&]' *nُK2ϰ{x痢hxUXFP1f4 [ZT[' aw=(qq c, IDATސ4Zk7W/-3l^Q qNKV<0ݡKSrTBp<Y:U6eK*Z#׳:h6|GHkn΅! )Q"Ktr*%k]m9?>,ڎcu!\דt2kIwnサYiNw5f=MFq .Ow9[;Zٿ_C.SAȘ2زa(M75HLیzNMaDR@G7=:Z4qz7$=V<չFD}.Aw&Sq~鵬4[v$qB7N%tt|4 6vSfHp$U <ϣT9qpoS_#+ӪWJ ljJӒRs%EqD|^Oؘ/CRTZߋj>@ ^@z@5&\2qʈifTX7 U5"u_= ."Kȇs8 f6#^׋n!keZzD$qAM@(X("I$5-%_ݧru]{ /rWnnY_/ş/GpӞ*\p|f|> "mKCuÝ -J<  }/8nI?{d$^X$mHԗwCMƞ3)mD,.HI d0k2jƩ)azqs 6Nnh>,gD 9@ר$ 0* 6K-h@T4] +~zyuSpc3$kepD)4顴Ð g?G S39o֏*!qV ?kM1+–Syh:G7C#]2M^FƸnC+h5%s0rUN,R]uc(cQP#d{)*0Խ)E!96aia$Fph: |uߑi,ӘHob$#-(Wxt/;=2FyAdc~ jKׄ (֕oI˜OQ6)`M{4ToRe/-öa" Ζ=Ɇv*4 eϽ$}:5P08L?}>3N1ZGӣګ">+ش$Y]nB'<ܣ9oXGK;p˥}EcNd|zA*5iggОx&Vph ;6 +;GON#/ɉ.lM&oZ tu\zj%s$Al҈\Fռ2ZJd778?K:BBUrv0!p QE2vG;9- },{ LU@:cDZRM7SVucv|8;پ/k(Sw(+IW'֜a9{Lvy+#^:Y)uHe,6n>i&sw'sΎk;G,l?6?{zySR"tsO[MUY׍*C +`9 KN#__5B'! dHH8'ԐQ0QM<: zܔ?t@N|N 2D,RC՘,8Mvk+SI>{v_\Ǽw㼖jVfi|q jhI"gg<$HQhHI8*ѝ`W)sR߮664:\.Oy#} u__nmtQ-= Oᑍrvirk@K#x}z\p4*he'. =Z!~Z /ÙIc:E,\Q Zw6s1@s{A k' Z (@6DjY pN  _?S - l@ A0g3cěrz* Xjxz=+5Bzg *l=.fXnjr>d爴CєhHvO[  +aGF@n;WϩEViL'B %uƜ(![ mYw'hsF a֢O?4D _wOu'k[k1kiMlKjVulG|s/ocZ{%ͽqQ9m;M-}/-8  aSD{UdG!gU'\MB9Okv ፛zwdcԵ3Q2Es6I"YSg]p2zbdC -膲G" +K x}~S㜠OA7x/Zqnp֣~~*#h54l n0oFج@֔kf9^sQ5Ek, Пouf O>cOh߭g9wqԂVzvS-p0lnިVGΒεb4 U9-ul\̈s  in+;^u*U+,cѩY(!pecH!GO(d[ZIN XpUsBܳG@m 8Qk`^ur\WsuŞ.dU rV=AEOOYҙ(mQ,/žZ1]I~˛r-LN_>ܿ?Io|z22zSV]d9}~~ݽaHC?qn \oAJ@@eo 6rTxa)rW$Ƚ:5}{Sںo5's4=NDp"SдˈT'?zs- Aq{^ppwJ5ښ$f(j@cM+^kA#S;p||lSa ~Fhhִސi=Y| NXw۠OVPh0l e]3(j}ZcufAND4B^h:E޳t!hBxhԥވs\_9xer qF{V+/:məԾ8ʯ.kJ`w xGO۶}Lif|6-/ 3/*,g=ݠ*%7A^5PSN2˿h񺵘hOO14.0l\a')zX8y"yF5ϻ 50YדoȲd}7_ÿM{A3?߿"-i$Gm IW d9 oԽA">t~CXޡߣyϛ{wNDKlFuF)_Ge}4y;QQzZVCm!}; e: 2%8Ί^Si.lRT46ȩ C7|a ^Kly(kh I֓ehk#ùL[%C{>4($*ۛ| IQkz^j+RH'}p-є4<jW 5MʕmDkoȡibBenXja83W})ZZ>8(4ir#:ȱD*ˡ5ּoXKIv.m~ $)2U"޳:msnr> tDTrPώJm\4<oI壼8Rx1" B](C 6ZU*Yn$f"rq-ЀJedl& ofv_Pd@閵GN}rrxgc~FK<\“ OkL-wK !F+PRQk#_I8a;e kau AK`~QbVR:U$ 7leXHgJ{|0ۢ_v]"GFʚ/|f LZmhC#%WNbd5GR?_'6MigOЭ˖6TbY)ztH.9U~Q7_Hk+{ _OWrX>d-jq<ӛrxznv}{fZ^elK k.^S}Pr&GQ27d94y!p%Ac ?~|,OE9 1iO>_ԫg^Q8glG_~e&ffNAanh>XsjR 05rlJ"M8[RIIOQѶ%fRӐBYQN]R=N+`ɏ-4~oҼǃ9a} rf/M#4䍴p Qɡbn):_j%-DizUᣘPA.p%~nJSq-t/څt;hřZeWC㸋R}*>׿;ׯ x\__˃ok7Ϗq}7~FF:YS  )\m:Ej nzy9h䩆q詳7>gUۍ\x{.)^usGEzi?רcUO?hjh$}[5>"{E$~oȏw?HrG=3SʃU~&O}N ޗ3ײ7m'+[G_^oVz0|=],u7d˱!,"gIOs}A[9t}]?qZ"1)5.$mN?tHTפ / G߶p_2̩͒%y}\B`i:*Vp5iڻAHFP gja׺ģV)Mi%>q2mЩKh96Cp)Z:?X[ y%g {6:MU)}RS 1G(bڍ3. *pDr(;%mE~ϟYHo{Q.RDEsjU0C9* &S#}-rèkw| Dv:K _yC|w _6^8Dty7ʌ8yR%t@V?bVq=TG61TTC:.L: h1C QXwUR䙿TZY0#j߹ %i_I}Y f $p$U`NWD`2fQ%ٔilJrTR4"Y!hNBm NZqMͼ5u]덵G sMhd?[a f{Ҋ(=iX=t yԌT%{$cЎ"PPG)YNG5jό:?M S%PŨrt;V\+@Jf̱rp\Si#(x. x [硝Vkw#aF2j_1<#,؆84b>*f.}kqc-GJSQyhlxY^ۑbNfT@ WjՎQv?"!}> }_H3$}?ZqniWTܴ"vX?ܠL‘l:s uؒl4VPڔƒîS͒k0m|gS(Tc \ռ'^H`ZheYk:=['ۮ5V0;DMyqU 7)Z5:\iОL7tC1 DCN-ÞRa~Z_wHW]o(zn àPBѴvv5Ѣ/K*~X yqQ+ds?o/ NwiڧꤛԔd9[B׳r|R#RNB,&@|NxnGϋ{X>$OpU| &@.v6| #gభ99Gێ[l~[o+-'8?Za91T1L"bH*J۪p!uH.•Jߊ"Bh=ޛ&ͣ^HH~fZ _we3؊׿rFzx|nG7hMmWn~Ko8o2WoOoݡ*D$q D*ƛ߼Lc |PCtN9K/YUoVxX_H/~Vr}I?m+:SQz(mjiOj+ar֏ހ-B)EʛN.G(Qk;-b)B;ڞ;3^Rcyb,. BFcs`ʲD\f J E)Q]/\_SڜZ?5nsM!!=~&Q9 #Ps<2<k\@_aŢ8`E.g&D[ 5$'d;,b[ >xA,HGu4s=)7M]΢NnW Z؋شCYezg+[ӷ] ZIaLFntYO:罉[1&@Q9'"ٝ3*Vlgbԣ*d1㭧o%F,\fߔP\VR" Fe4ڵʊlևO$:}5v= RPc$/h xA x}}|QP/·Urwdy:y岬@\oz ND8eT< @>w3ᰶX%O]|q!` [d$L4<\ C&贻1sqYlL {bDg4kX\z_w;HqmZfQ-iI`.5HT\{!ka'R`4 T c (2ѳ(֭$EA+uhJ33e F?1Wz`1Ms }dO %E[M>k_>v ŏh4ɳNqߣZeAYU@Ͻlڶi_,U#߳ҳB϶ie%= aDz爣U.ȏH-C O o6QM3dADfd"/5kcZҁ?g1N٧ƀ3w:.9o>x8G7wpvbN dU`SSܒo V{FHemLVna=_ 0ZixaXG4Z88XݷaAP3wWpcՒľ݇{$RRk("y0to* ȈnÔ$/wGψ@'J$*J ΀"ǀq@{0#BjXfH11VOk, ̲EIi2Qj/%3ZU4xHҪx&Gѧ\57[17[TnnT_S]`9&auP92+&A 1̈1=g?@ںcoz-ߵ I{603X ˏ}kz"mPfa4r  B pԩWlWrAԝlafߟ>((fwA$ʰx<}@U3tP6qwavSn d<mu7q v.is@D`WT?0rhtAL.Ony ?ix.jkW^i0@2Woٟj\I=INsկ]ͅaˆAvF:n7RI( GpTۚQ' X:AŒO+[=7Z^Ӆ{#`cmc95kVb>&1"Yrq< Lx@Bf 3LnxZ`ͼ7Ghj[޿0E62eX؎J2fz_p̊Le`;fQ7D = g- oOSucIn:9rDBvŒHІ@sg9NLҒ)P7K)dQ&|@d TDբe hT-77I;r;˺ `6ɂ[YxfJt=+#.<.PH+ ;Z)?ܾP;^$e7}`fzdkfͻW͠Wʈڅv4Fϸ)Hj0t5xH|M-D* "_.4BZQAOD8 l}{}N c;،mBy'|VIqo AƐF% 168mDZ~CࣇƐD54si"ĉDaS+; &:P &3C:viİk.o~ab|׼,e%>'̆*~7o$R#]B ~FHqE,V'&t2+نǻN@au(jdڽ5Հ{'Oֈ'YM-s81ne2||gѤֈWJ뽈\ќ\8 / ٽm=WW(W:bVt&Ozwof0~9~x|ՎT%7h?O|r,qh~*nIWz's#O扉Mydg(.ح$^%x_ ~!9u'xkVDaWwSymU A@UO[p[NA-BڝE$Di\5su 48zँjŢA \|O>w^6}wi ;PRTہ;ލ݇&@%EZw"SqM/Ue QGr Ĉ;=Op(הahRULh8s(CZ|g]#υ6Ztd8V[H0 fTĴdEcߴ\91[9B),I ޡ\+яHZBTyJdRHqݵT} fEǥ(S۪:fiV.qM-f愧%q*Į7";P@H-X<&Rs"vOS6,c\h(0a F} pri(:sָW ϻ:P[L3َi |w&Z֑jB9$6UTȀz+<rʠ4F@sPD&z}cARnaydq:AJpcgSV*Ĵ@t*⪇CAt4V; 1_B2āD /O܉ ,i1 (Uh\ /Vm,C"qĔ}2A#Fji 2ٹjgkQx"EL"%]l "sã_$%eڛ,Xz,p(J}O9Bxt 1ZY5|>[1QӺzv's" Q,Z`ajX4#KtCmq!#l/ԍ10E܎5ҘqJIu~fYh?uQF IDATj > f;lclx狯"ៜ6bZhnEq,a.EŶ hӛvMHA ]x dh]D1 ]}IjPF+eYg6 !VXk k쵗I襣=WHr67w㬀LF6RҜC9K",7)%IYUatY QQDTŒ W8qjKr%Dg;{o;o>;l1``UpW%bRMKpǯK{ l1<8razL!J F]d2BtV0M`'Euơ)4;腙@IEi%6]h I=8\v,ȳlI:KӪO 2%T ?1TXS`xBi(%X?>ojO$S'%'i$D]mh 0wB 2ͩs:KETHyNDuupH%+?JsS 87 :{J_%Vpxg-et\FFN؂g-ײsSC#jnWW9ID_v̒cP_lWz~3?vrQ$i'1g S!hU(c4 sG;&?6qX3ز!o! 6nDa=؊cYE-'R3ݰ/TKj 4}sGKX-'4Ne7^wh$IxӭRPu,iDt NYZu۶>RZJPI܆7W͞S |Vp(j`NSC ЁSŒU%|qEu8 &5#j< :Ww,hA$W>u Ww_M7~W گ|w~pªe'y1fҗ׼xe,c\Ѳ3H`N 5p"!: JʸDkF`eKkbI5D;$cHDKBms,(Q&K,* !E3]0kSҚz3NFa%mq ytaW6JH &T?eb9e{1; J k 4ں:\>WؑSP]Zl@#*`j KI@a,n M\u#I~y~f( ٠oGYYQKx22i%㌧9zvZ | eT9iJ+ki)^[N7W XLq)Y‚1mAa|UZ" bGZJP40Jn t*#)5}<;P؄3҂@"eKj~v^؀Iݩ``xwg-/f%u4:5`K 6{9I" f6.n v c(*ɂPd>xQLӘT=m] 3TJvdJME綒Tq6[oiGow(bX@Kf i24̹Rg~IՍs5DB GR#sDn٣d$*H: |ka (5.49 '=8nQ ?G $uHJ$@C D %4(>GFp٥x6ɉ"}طg +VT0ՉqM79g$n+ /!ǏIsQ.R]^( lBWqʵ)tBMI,9X2<, 6/DX& FwD@1Օ@Bd Hy.B#H v 1'[ZnFUY̏L(ĸXS.!6on,0omsrKE*~.wO{kym?%%WuDЈI1 #3ʃf0cWVY5-2"bo@HkQ*0 IvW%9r{!~GC: K km $Zrg9CEŵ|nhcwT *pz˾ et}3= i@Rҭb.VN[ek$w\QQFH+=[* r=0y8׬BܱB?KdrW{&r0 f20[XNP,=xҙod o}u8e4gd~ ʀ+8Fv|ƵOsF+DL¶DnzΔj9Y&'97 Mf(r^d^mjUߌ Zʗ/Jwr-~+i?):"B'NzIIR`xALCzMŶ+V[ b O=b](.>CRBm|J眿^ybߏu R|5؉[c<9R#,M(x!nyY/ D༉d ǰijx|\5xq߼z \ى|j^_^lڸ{G#xĞ O t6ƫ.[+Fjq$!zn 3`iT&5; Ǜg-'bêY\xĻ~jQ'x!сt/tiM2emDr1REnӂʟ% Y±t3՘/Q=sˆL4Ճ5δ]UASU=%gS =(NV _Ad&GGk1 vvs58st f%l~ fێiY}Z;=#c0VJB2"뾔#PNj.REt҇!,UcJMVԲLm{GٍLEKz*dgqȘ_(, KpH-?ݚ$Ǣ{-O[ʋyG`Ȭa^[} ^O(ARnNeH5| _,`]?4#Kwn4M`Ӆ~ *b<BꓨAmy 1ŢE p0nbǾ'klFǨ+ќMh>-dL)y^jVU1oaGis!p.q3hE_]uF(5x=|C?ƯSq13۵GqE y3Î-tНNk׬1>~!/cQ]/7gOTH[ л*J5Vҽ، =$)0]s&^H\c՝Y<FhZ +yXWDQtEbcai͕9 s"'ay[*z`3;76v&ܠ,&G̟(d;;Rhm+&DM5sn\xn:F0e+!syػw7;}.'=/AK\+d~ .Ǿ'v=2^NC$>Mko6߶rز'ԕ[pw }+~$ W)!W-4ŝ tC 羼 al_x69{#?lšjʿ<6 p:cOA@>DO`j 5R(b-JE·U];vLcݺe2YFt_~ !' T0))i7tў{Q7|ǘ%"VEWmxQt!>8GÐL2r"suԳW#9nU0,YӲYK#gr!щ{qGRS FR˝Ǫ,#%%SK҂p#ʩO=w=;t*I|G}'2 жs3f<&QR&B:YQռ,2=g:R0rƒ\7 jm*%V>VcÌqB"`W +I"JQuqt%dK[6~(ְǎ=kZ|B?vˤMf 37CcFHRwP|3 6 T/𼣂2:8 %djpapxof; `v;؇GwNՃ?iss1\jhw(*WQW xj=(qօ RgR98S {Xtq7ŊhTk;mCtSբY$UT 8`v ǢНl! /8~ǰnm?-\ya*qNw#_;w ՘_`%xn1uh1?Ģ%c8c2r78k֣/0Ԕ0}rZ{w=4ԌY(~ʓqEtLTMIb?=uۃիZ ϣ]4OT5Աt=`lǒeж[ 8=)01 Ei\t?w VzV/Y$/ݍ}V.U$W3n(lPYF#re[ơ0̍g2꟥͹(J@ =l&3F8,瓿0R u+]y1 -c+U]XJ"So|.f-=X&˲za[LŋoV85Fb跠me_w- /pU#(|\ҸJ< 0q- gk8At۴NvSZ jiC&Ut[qW AA܀|n<}w8{G1Tq S820:ڇ׼fg`tj#1;0%u86EKp>| ^Va a7᧷~mm WLjعu/07XvyJru2DC\_Γ88 =8V-b%8~lahWaMj1úyO?v >'=`iBXqPrD eO]ppgAuQ[ƬXtޑyx!2m0[1k1`8ՙc鹙B͓HǞrB?u@Ѧ  vZ#3 Md=L,_tHZJƞO'yY3l X !)Pz-ic @Nj;{:8W$_~x%_ IDAT2P9mK/Zmxطm#.<3oֿ}kMHYFaΕ䯭SBRڶӬEb%eL/a(*yP٠ z eЯz]9M&;nO*v.W90f6Q]Ņ瞇V EB%(W.% FQ&O|b|VeG潸~|V&t(C+*X^rbfx~:P Wp 9<b{!Jc!M> Ku;˖IǚŃX2>|@aթMTyMǍDRCDh1raB'toˇkXLՇ_}ػ}/?{|d /?n!TOШ-ė>3{Ekm;AFaNX>;&?{DV@OTP]L 쓨W8/d_3A0OY:OUž=8Hi5!idnJ!~uvH/VDFs1>GWx[C= W#B/!JBԃi\UhM^2l_u=fxK@ 8WPҠ5P9Te"Ctb(L%ͭy|`?hYqEL$dCmk` i N7r<%9Mfm(a - d0|Xz,0l`7U0 zsDZ H/ѕ:6r &@HѫYy4i8ϨXt5+YcM戆*7P@o/=QsME+ (BmN\[rg6 5_ʌ v t"DU`u;.ZC5Lw0 q1 a(w҇cX(caŽ.GJ#K}|g3nTZpJMT2FB% ömz<23MTD}b#! x(X(ӥi-S,S"3 k "d\PdFS8=4u ":z- jOӾv#C=T7qH4@'7?FSuӚJKh`mb _I[\a3EUVCLf03-ԏF> ๆ!"(F©H//APt@* h1SQըF 5(R(ϙ !ŕP,DyXDzG[YG9ZA316g{z,-mټSw~OޞYhU84iYK9 SMFVfOP7O?2 /"hu&=hRb$h3+F7qxB46Ⱕ& *-R@L.: %p9Uw%*̃ң>~N nXA4bh"$£_YJхg!E܃{kfMkC:t#LxNq@GhL)U({V;WMɠ1xQǺ^_ߛV11y, D^MFv۳q<֛bT[ixr/Es)XQY ~%(&q2y |'x78)]$J4xlGPpI涄8x[qYGxFmĝ~0T+Ӓx^8m*Al{t60=9Z-E#@_a` "Dx</E[ᢂUFؓdI\P(F+nAD U/d0w+i"wa |tR?ɃرUbi_ {`?("l\VUـ[ 'xRLNL(7%@Z3\?qB)џ\Vsﺛ}Ip\ӿ?k˸:*>R'|I/=_{f$M8u4|c]Vbhh1} pp488g3Wb3U0Oi{h5#r$%N?-GK!E%ŴZsZ}KkVQ o҉ս$|6biAAv뮀Ül4.J2DYWH' -%YV\⇓9wqPkkw31D@}E潞*'h Mm#)J3*3BW73kf|ao_DGL@eCQ3\M݋LLL?Wh&Wn96m 07Dnk>p+݉/ÿ~|)9x x(c\T5ki֕ZZq x߇-w44pjT*E8()orxdn[+\J'(эKO=rj֢&y\q7(GGMBxM%&ˮ.J\(P!'-Kw{|wfеؚ)Kn}NZ<%.Dsрhft=ws"hI,&Tr2yڂ8&NPa+GD@trPVAi͠8A_01ɀ~2!Ohíp%Z;+;`d5Zܺ0Ήy7@T_|:P.SG<1sLĕZOaÝE? (iYPE]~dg,Uqϲ 2L$C%鵺_sNw"{4ԧ]Ugy7Mq3*Q6$esFan8_~>J2Ήybe&qC6Ǿ)8WcóG<>g <V~NvT2' d6y;ٺ=Oj%2/clV΀F Sے7f$E;nG?e*Oɩ&߿_ }Q<_E߷@ "M)tʯ<-s,;G|ۆEfif s&m︂fkN6juA`ljK._4M|ŀ;d4vgxbmiQ|x<_6A&,̷T*1VY\6K8I.u ?ȉJ3{PKoz:S?~q+Ht" -iۜ{KܪH~=~:#aĵ1Vs !Z }1\ua8 *4{C}| #0SWVLa~[I7E3 1DPA_:ZJ!9#]+JneUp 2^&Dy1Q!!0HJRVNf y7-h҉^(/FC]4ͩ" 6ܹ+o4Ԡ'e!099dd IM?͵ Y$8n[Ϫ0HBy&/y `;E/KTqا{P_$ Lx{O.^¥ }HC;Ey ws:Z9HMgRd8a}ALL=a$L,)HYqKPVw`@foWzu Մ205>DS(-mdeV FX=//sMw؜fș.z%`x!9x}y?tkk+1FweіCG!ڡ6?y-s|w[b||gHZ! gY^Yc8+@6嵣tIs!}vL-l;~L>_kqžݸiL'12jFA8NZ9O6]ۧٹɣzI2hXu9˦h`;Te]%.Z0ٽ3,K)K"X}WKT"k1I:uaz3=eY\8>5 kcZC^]SϼnInra>=~$TߴN&]ZGg9O@M 2JRށ M1izX\,0sוo?QR ۓt`Q),[ !F^D.~R=9]+J d6[JuH~~FhOEK)?T6fhjOwI/R{%՞㾨k6q'n@ Lo8T+ IDATS|?~?gX]nimȈ:a86$-9"r_<67\JrvգXN&?fh,bz̝^a3df^|,-,Vai?We#qmEN]0lQOmb,l>dv6dV㥓+l&GOϾ.vn W|-7ֽp&^[߲Z8:%ffrMrqncd|Ig YGνdrG\៾xMNh=d@{=< k\20Iy#Gi ^Y[g"03B9$Q kU V_s|QE&_ͯ?+5٧_/Tk \F4IZM%ôN][0N4/A9nh4dgabz9vBp%+tXY`d Yo;a$jSk>KuC4M&eqC/<>:Ϧ-S\o_w0T!!AqL`7ϋFמX!EU LߦrՅ1R=h#Hb5ub'FQw?ȂVQ;C%-G "F>F*z+C@dx]L ,"Z*I`h{ݔ؊:Jz; @d#pD>- ߰d!1mMQn2i2X:8Zėҩ=ˇV&uV6*#%,C2r)C9ina77v>xU/YԚP]+%7lK>ۑZ뿮5wwOP]; ofpr\@v1G-2x%X ca,/}g۲~f$[i6<NwشH83o!S+,N}mlmf{2PzsQ2H( ჋__FpO.䰫 Ek[ Sn :4mFG䵹v~o!5e3G-&!qկ)ן!ȑÜ1v\J&ش~֫ٵ{L~Z6dAB7 A׌ ür74%VA0B'Il/M|5/4 %XP12?r o$#Up,s[ E,}LQ\ۡZټڣ+ g=C)Qe/CNMe?[w 0{Ue};skg|H+B`j0P⟊"f%|n θr d6R ?uR,6ݞl4x|N x|_ 5Ahrpu~]w1IEM):us}8>}I>r! p.gj,rrgY7q1cy v-NL=q 15R^ÌwWhm(wp3m34;l4?( 7[gbjMc K/pGh'xN9sFF$V(  سX{0/ͦ]Ԗ'GF߸eHP)>/p71~'m2ɗYhe44 ؝'nsž1nqo|W__ DGkUXU<:A-Az[*ࣟwNͿ(O%Q;GBb.GA ƈ,HfDZ[at /UM?4tx.B@}7R㞱R vZmH̾fK3F!ҿ"uHBfqE^,zikzV%9T~Fs-^<^67rLٌX"YExⶈfF%0uشiv*FǤrk<3+,.,6$$3952kyǹQܿG9JemZ3L *a xXj{gۖ,3FZ"9rp\u'qWeh0[c^zav&CT#\v01wb/IpCEA]ΝLX=vkn*7IdKLAń9KT+Y8Ž)hFh(րIpIF]ܙDF9cp Bd9/c__~m[9uE2G[bd-ו D摖ɝ:|7J8_}|mM/EC|/_bf~Zr;_XPtCozW[:qR$4?ֻ[K&&l Kb;d:7?r!$x`j V}P k˥[sg-LN;w]KdqUx`o{j5&e)d6+u\, `/Z;/' P]kP,MZl6XY>$S;=Gkө#ڊ0(ba]guda{ɳϭx9l(W9Ff7?:I~kS V೫\<q/=Sg3sʱ#UjųYN_xI[4"jY*MJ<%[5nOR]`p"K,՘VLkC4p n6KyX9K9g e /2P5Y덹3ɮ Yӥ^8c09eGxk!aa~!'x;/ yO $ahwi[Opgia}qn7g ā/}oejwHld!Vg3'p2W\5+kJmEˋJ8EQ$ ^&_(G'4-02>s|#/ IOfn#[H2nV BEX…SK./Вd-j,I( CuG7%MAuMaڒ-wHcKi^0ƚ&&m&C/1z5.KeHU3HlDJ@V.K AEHْ{eue{斑ٺsKz iK2++R*2_ذ+ S}_+RdX'C?HD&"R(H#lբlP_q(7swǮ]h1z}$Ԧ+Cm\l2ו@>IU3BFr}׍,-mpcIBB_LĻFx^:<G؜FS< aKh XH{ ~n<0w۴c6Cll( n4i5Zxm *̈́ 3W\ef,-7ng|zZx 3L,m7J1W H{/cǴCeF5X[Y_ieK6V21q/: \Ÿ}vLu&+ 2CM6f[疛m*_S&a2&U!36id!bd{w]|gS3Nĵ(v)4CՍcC8I(!dYVV3-wgTyO-2:۶gt_zv'W,Nrc"QX?Ӷˬ6&%j$ a@5*(D0=D +O 9%Fw8IwזTNS7`.I$2tCP d~]NSvY=SώjԾO)~p>]kω[ZmKv,!I^[L0>1I,dsd ѬV8`L&?LfpdlWOR2I>?efe';+_XPz5A#v<- DX VhS,p, ߌ=aΓIB**϶$a`.Q!<`[Xq^=21qYX4IN?|gϽj>yaγ . 2d&\1JӮb;2G6"B݂)d6qdq(pI pXZptȮoo>u# fG~72{ǣ.X[ D)8d;~WIlړfُw*?M̤%^vJ>H'X3B2(A|}N }l䇘U~"m/TWa,t~ +>Ȧ&$M#D-L1] |n`D0hDFWy%nuZS>'Q3t5B0wҫ 0DWM40Ψ0'SՇܯ|/ի KMB2/zMQw¤7݇'>}?Z_]`F#ds"½K"U1"K3^߷P/^tSHܣJ{FDD^Ŗ [S9ԉjE\fS?moB1ϊD'QV.#m~䓟uxϿ;.õOPp"PD͏(=ՐѢK3w4K _e/R8;ϯԳ٨ ^7;"[?پyx97f4J6S6d,jjRB)#eD<ݓZXcˆ9x0?k#ȕ'Veᓟ?ϼe%cTeמ e6X$Q/O<7skwk'g BDx;3.k-l f`$/6M\ЎG {lwh\pQhñc: ӒLs:&CސRq`: 2PIglynp{x 9u'ijll8!k_;XmauCav4eqB\`l{`p`'0 uZAAcg<[GF b?Ƚ߿+:&%E&36@~&ː'*4c$̔8q4gN,gϠ$m4C;|󵯬se>嵷m$I\'D!lפ5_(l DZÝfb7#D'-]]B79/e}5_k#-گ I 5}UI($;F2)#_#H+V}5R*h9/Wc=l2,5%0m&Hhz|/ͅRI43jRE)3,$"^L7H N_g6:t}Km׍9?*@4=jL^ Яq Izpy!,u<6$zrt@u ̮۔{o4"XDNGJvB/ !{mtw5+ލX/?K놢+Iۉ4 JZ+ͻwT,rGJT84qTeJIDJ.bv B[nuR {e]|7KU~4vLR '3V@)8(E9аCV|-`Sl/Pֹk{.bfK0N4|KuϚapDέIDLy5%n6AY2;2@nǞC=D!8-7):[6Op[*KP[ dmZmI\7枻7<SZt֫v+l bWL8]LIv,OEjdC1[lV.aLQrء08v"QBcPVʫU Y VV^KܟEȗsծn<^AhV81tn,}BD)Ų829.zh6;y`0AY;bҲ8H8c\2;J%="_(r;.4ِNK4x<sd//)u7/6HO-Ǟb2;gzMC~QϼQϑ2ILJ,CtG9졥:%M>):iPfE}Z ow<0=U|S+ m/,ְ{n u%>$ y@)⮪^M?V/V>}/ќ3ZH7FzhMUZ|OjhBVDqVm¬{f(rNejΦ\X1{x %/C8t'.S~_hekh}NlB}sECRTptFWPR,')Ƕzqzpɏ`wBaH?gS2SJfSLe^| 9ũq5HoT#nR *sӛ\:eK^FwTP#GHSսuwNicI-=@,!ܽB#[iKK)r <Ky۝LlEmDL*l%I7b66 :In#QkrĎŝ\l[2ɟo9ܙg>q|גp^ْT͒ϻrN-s#rZ脜_PY):lnS=_0W_ʱg*ط-DbYքAp %za\P֙<%_r'd|M&6qns ,2NCΣs4a|M&[.-{XC,,pGXcl[Zgfl?3sFM:۷]|<(s: Pk,X?[d݈{عסdӧ)mp71_Z?~#$9{"-02Z}#&W G˿\f$gs/u+ΊD=i0rx W0aJG>̶Y@0 INSJ:U/6I=SovϿ Ǩ`:M^^" 3&W ixY$h^)4ҩMrl)!~ciO夌vy)/ yڞGUa%Y9%'~7wKMZRh<ۄzCW'V&=/w L5f oȔLh5ER3T۪\i')>v я4KᏊk@hN#d-Ut/52}ow 49P&to|XJ05e٫ ?Z $=ݯG^D*aHa$%=kh@+CT\Sw6_}a޶íbY!^$n1 v; Nt)y xk85n{;jsn}^*uLJ'}V#+` !i`.g3,ZLΦ\DؕuK<.wuZfFӇ68|t8n\oGY&o}%lL~j#ϷI,wzKK.|O R~Ap/V^7|c }u3 Y_mCaǾB13IoJQ*YҼdxzk뫌MOVdy֢-kRN( &*,l|֗j?|] a̋Mrj ی CҫF e0!-|/p\\u(1˰y&FJŭ[b}Mlt_$Ir``*a:F&8j?o1?Yg[t:vLK"&OnlAƘ"@VOi>@"S rncG_#u8*Xi4ڜ?*5bL$=KMͰe [v`%ٻJv`嘿 ދ0E,xWj]D^$BhYrͤ`!4jj;,$F*֒p~fޤh&!UA7ҼS;8lJK-λkS #sq:_~RFъtU"QtX.Nܳ(jBv5 xC#ithPhi :X֠@IfIivW;85wrwDw(Cԥe[~o??$IVVR FEsHI 54b\"o*Htڞ$ʡ*}ٹ J\ĂtbiuB H-SL^KDr9}3ѫEQFH*0{9 !ons-+ W>] Xџ&4ZВF 3W[7R ,Xע5#2mH* MvN-vCxb&(G1OpC ( &E!zФ XZW^ܖQgn|\qVFayN&6+c%`E6o2>4 zFocgnD։lgNyS: WY8N33Oɸ%^:1'ޫ?>ŭLmu&-NXE$ar!gO6Zz+ _f~|3s؁ fI p*1E1j|D4;Lp306=DRaz%,dL.6(DĪzr=cc1vv9>R[\䞷M1u9i6;-1GpQ(扂0Gh)+_#C3Sx/s_LNs]Vub$60X`zˠ\1Al &fDh;)P[`„Nۧdp bQJ\7/G33!F$³tl\f/,k+KWhtwך{]zВ Ly$8:h4/R6!'~W'REu펄UB`uvMB 4- T=x]mHFV^zTui"ESҝ(^鮭XQg1@hDZz*{~h$:*Q>;~%Z2Y>в>q/KiLO NzoǾ[}WZ'{ E:HŅ>h-u5c+4DY;6t7LaW_GdL`țڈ PgzK5uwg-HR^b&?XϵW2P.O:AFΨ/446S4[hNW\4K*+Wj|$*4(`FB!&r#zs4(0PQQQCƱp Ar,#EĔ\ (:FGNޭCMf =xB>ϞY:?2#K2"E Ck4Wvm@A1܄FUB[gӏ1Kyst,u8ƮLV-pۮykSVٲsX: 9ä(; %(aŦJ2356)Gy5|bE* F+ ZhRd`^c|RLyΞYc`0fzs'r|žbQNM:ljMXNFFg~a q:L3\9fGHM3 \c0!!CB.`|8 |>^Kger95: U-qgKy򸋛o;IfAVeɛ)=i-'k?I3dnH | աu;0@ǠIejI3=ө{k42Y 7Щ'F1N ̈́#-ٔ6+]5Ī M S)uĩ] 01)”ХzQҖϲHCߙgV\▛b.ʅ2`q))3L'ZM6*T j-dXbl/x[Dk$hcmel&/tv^q xjt^{=;2HLE5|2y_13n8?@bn^iu(3,3غc,ۧ/26knsXGN i\03]`,~U C$-nْe EVDP]QmH /nKY)>pڢ2F\nxx7ݹ 1X[czHbf̮,l㊚骄KdF Pedwåȩ[y֗.h: Ƴ;$4By&&a??ks7þۺ_3ӳc`N MPRɑDrdGb9Uvbɩ$UN\rrd$ےeɦ(lQE @ľ͎Y{zs R*p}|U\C! "B&q}h/ӊIvQH^V@&|)Bj9 LԾ4Nna[Ucfjsf\)7" lXÏq g~B҅.T9P5CK%K%#ʹiӬ6tB\ c65$ҚݱdMsXa:% V D x:ɠ\行BX%LzXZ 5@~_"lv2墭LJ]=e\4L͑`crRVwAhgF8L&Z}tLVKzGqQl)t" {vt:ddp0̿`~sGQoe_/s'r&o߄a`9h7,Si:$CA,EfҤG﹵Ifb(-՟)G--c(Kq4jUݫmSdl9ygG )=1J}ߗO~ԟm|G9W)%Bf cG.mGhLҽ}\ i~㷆'/-j#!7KL-8¡E C`'8y ̌}6^?7v[+0ilƸv5<ў塻'.'>JC A!C9nz7 h|9wwYf[x?J+EDsŅW`bтkh4yK ?bU&0 SQtځp-K3:* IDAT!ZM;s'aKY#&F4Ya 9xࡇWq.YQ 9Q/O-."CNc0Ց[l Hy _~2~߉ZciXAn[0Ԗŗ-Wv䚿2_KD1xJ&>wVskF蓟 @RE0Wٟ-_߷}-ծ>BǤBMx6TDϿFI¬~"Qv]pT25 04!\<KI_:Nv>-K1P2$UL0eV#Old~Z> (dgKf/ l[%AP𰕫`T32kȎf%nVBew0 yDGצV(+[=:f@0OyZ;6SdB3J&0n! T`܅u91}h`̤e0TQ| FU T: >=zcsgG0Ef#O52,0ݷA^NkC< t ,B /l==C#xCKc> wў EBDؼi# |fOvsO_ܢ|"T-mr>5DAV|q )Otylk/ۗꅥ}xH}yamdΨS Z\E%^-~LUf b lZq9b0Ѯ^m[]>M!F񞅸?ȍu {D&Ch/582'g6D j8,->5%~t{:X&dN4ݰrsĝô3fG> ܅W 'rؤ,ZˮM6edC{,Sʺ` sxOs$H|dTCI!lay&pֿV L2tTRq`.KMBYv< KE a(ɯUqL`ZhPDU/rI_?u|HO44)ah"ZCIHл{eB#9Jf()fAJ~![]!ćU4̯Hv6TCNUQd:,i H|hita *rQv\ դ'ROd?f0 ,rK s氏e+/_/^ ` *ٟiP'V)&.2ԏ_%qOX1eLj睩X˙Yv&؉GL*WӼ-Q? dP@I_@0[ڀHfp| Xwpz SD="ibZgw.m᭷M} %;p[zҫA5gwmqF“۳l z`?~?671hP>rfgqumm3 ^k\ĀV# ]4)x-/]4 LU49xFf`㦁w6pAz(U,82eUFqCki5d;Fΰ`afvcō.K&Ӱb`{6nȊo3qvyTv5[a5 /behf5d*If~©MVxbw#nƯҟZxsͷя7өcvAcnF,Iv֒E?! #4[-T( nK1 tSEK#!崅!ʤ9~ ß 2K.c\2( FZHdP@#rOmpt.U+dƾLc1AER3з +%P&  8uy=c,I4@ő^oCZY^qu#pl0^>H  F( 硉in)H3 @)߱:a@gǙFVۖ!O}ysx A H(5XXʤ4S\n(WcY D],Nk|v1QJ7 儤'm1QrdGwBƺJ(G-Lkk.QaI݈ZOp4w c 91+$R*u@"eYE:~@ɎԨw22}p H=TU&i[L [<>˘j"%8}Ae]'V; ^{ cjazG`gu,N@rY_^Aa?90ơMTl3 Q (5p\£bE 1(GUC2*^xµ-d:=# NN}[*S'H/>68@95ZM{<Ց kNд+:~nU_% ݹs PH IQAD#_8KCUV$P&F"K"P\C6 z0RxAB #G9YK E!kÊd[ᎈ{jȔͮVH.@Y!Iu|F&b<`]57:10)DA[l(U\qaZv8!%i(E2ߥ5$LO"3aJĐ95Nhޙ{>Կ\<-l}1Pzl|sp3~D<(ݢ] h uuCRvd{(ey/ 6IRi@?>WqⰋ?@GM{7O8rM]Ǒc>7uׯF<ѓ2O;xYq( _w7Kˋ*Pth ڡi `U f÷=doE۫#6><2y &qllrZpJ =j+.`a3p}p=5y:xsXm WeVNiOkI1%)A$ aќF!$vYNXu{!FY1R9ʪKBH*,ĥroy,OOCџ_~}߱ȓCMBʰ~l05%ˑ iBytA;E(39&|lQM N\E֠r$#'G "ihsr,x*q&#J_&]n9{2f6P5 X)2.W'RJ C2qK)(VZDNL'(?826ؔ-J39JZ&D,V)[iO xp2%nWtF5=' |߆ofx6>2fM/OJzi#+3y5k/'xNcL"t/ݞ8._x/u 'ǹWiZX!½*5 nh_|uFLUw?>aj+8GAFшSjS8÷_S\[p>VZWn'|hgE,qGsgo`U bo<2^Në~o>2|e+l@j 1;kCM/Aci"hxi6.9ANj :NnL{ xY.ʆl - R4/n}gMYGe5CF!pѣHj].%o6[>;nز3]_I(dش?l< e^(?0QJFWgr˴9#e>L+tܜSApfO\4YIr$b[dZ1J\cHԥ8JJ*㟌~N jb55xSR91&brq(oi%?6m{_2anC`Q-r$k]R9_3k€ oPQtnI lqR@ TVj=]̊1˿\/L#D*M\Ƨ\"g3 Y5d OI< oDqRk&_s@YHsT}@Et61[ڤ.BQr,z WkD!>dr9*FU,!69ƚQyLC3 չ=(QP¡Hn2%]^\K Ü?L!sO .ԯ`,UlS \52әy4u٨ ' %EߟiW tv5&I,0T;uc [a.ZXp0䠓[@4շ.W.å=ni#geI!e9eg6GF]o+ ʈ%'P|=AlGK!^y৚X.]wx8~2(FhVDH1?9^z:g[ pIt8+8vv=Ej-v &ΜlqUU7c YėQV1]30/ñ!,dwaa6^q皘jyxxyd7 |O__5O,➣UX%ooȗaϙ!y_n/EYSs8tdz94jSqb 8 k7uVXp=O~#=Ns9&3x~QS-4) 9SR\U1h2tDuaE;ϱ[.Na{{dTx'hbTUFte DkzVi_pg[] Äej|JKFXÇfg{m "GvH`m" ߘQ?/;QX5yVp`d}@HB Ic\AAc<ֲyk[atKS09;RJqE+.TG%5{Ldlg| r=)|G4˜k0Wpﲁe% ~b P;-hp.V+)aԇ:GԱ,Ǵ8ttx-B2ET'8Z#*nml~} 9?TŨ Eg۸.pm6PiɓREfӞ17pfM,̶uEF\iA511R">\g~Ցk:\- 𰻳Hb8*e n'OԌ&Qaz.:"vQm{C ,I1'NiWQ`ZɮDVH|j3sM>yǩ"%i[8ʙ$.ReUx T CA 0T Fp2("f]fT1 9csίaC{3 R̲>,YmoH &qOg5&]W!BӈAʉWNa)9R1q#"J3#zƨHg;9Q5=S#9CJaXkir„aOS&\8OrAD)TyIȿ`dtR-@M4yxԄBʉlN$ИُdsȴSsp0K k/؉Chyb n0CYE|"R݆tGXXyԚJݸs+sNF4oLaclc;=W^ L|kL IDAT ;R{LКr̠{}C~N d.S枍rT]|]A:~>51 nwB&,-Qϫ"סb*NIDkrցVF3!-z_r}O u8h.alK &1JqlZ }٥DկsܔAzw#Cd B(?FLԅ7 LEw "`zO2XCz/(dJ)є;+eÄʡ[WvnjMj ڝkaŒצ̄ZTU~PǤ){)<rpMwZ׷65fNj֜Taˁ_ 2 8\o]GL=EGa>D3q ۷җ7n [g8W;&r{x]4#|.avf :gL~!>T*s3<ICmkxkkHGWؿ`V8_3 :fAXDF]a0vVKxuX9T>v24I!@@fp3DÕxve<𠏅9W/ &1旫}dqI?G>uxAncQ7¢|4.cg&SUIkl )\ XZ_k/pȌ(w>xzbD6me IB  0Ӷդި,3t6֍C p"ff10^f\A; 8/Hf>+$mg2#rZ``$H*7UiT`gkhM%#$m=u*sDT0=YKx?(l_GUqx_|Jΰ I8K*/1{Ӱ*|.[Wˆx Z~Ө*'<3BL*9[&@jؤ+XQ@ߗ Phm8WBKn.4XB%OA"HM|LI^^uQJiXpaFR {6Ҫ1ZB'{.hQ/dDqs-:vRN}K>'P Cz^?_\(fMQ9њ17Ug#{ aib?x1_kԏă9jc+ p⌏͋h1VgP |LO9_ޭ5A/|dCQs C5QNkv*>Wv1}f"yh&5<2m V3Ӹ|&5-ܸ2DٸqsM!}` v2t,'p4guv &]]?ճW:г r%9׈蒱}pl'!ܧ 9 D#Cb7Gq(| Xb޸0K>Ym n)Ъ;_hBB! a;\c=惇SFbí[hvP|(1cgGR=[\!⳻u)b#BinP@uFCLO)⩧uo. 7q l0F0<AFJ-?X߲8e.ڍs#. gGt08[WGTQU[ db!^&Mj7cIq/#unq9|EZAůcq+SMzvwr&cBq0Sٿ}7*v^MF^=`@iqkᇾޣx_׎;/ 4fM"<}zE,.`UvAܽ9Au?oYTG+.K+]g l\bCͮv*.6\}! Ka-$)iyL)EZhLmfNNЄV9 ТBA/)vvzq4Cm|} !dB q2irDနHr"&LfsZOL#ai_ŨPO2؄-0LQ# {H b)|b3_B/gh6up@"RAP|GȋX9MvY],OT| DI,qZK;:պ&L5 e# Iff!L" Ki1>%$Nm*6R:Xi)$2DB!`㸢l8)h `P~Z_(BHL';M{o"s)R8c[,(%KZ)8:Ou'-n@)e*_~eWd @pB}2S2.(7 y .L2,:=-,}p>s )wE' 3@p ;z?lقfpĀұ211MGvS(5+ax6ӹU[2@)fe;Ef)־:7вB#EL-U),zQV~pCmT&$!N}]Ch\شHq3"k;r P90 #4Z,(8FzPNL ʡHBe#R.%]f󬑂Be:#0%q[:;m~ifBCe#($ݙPQfs/'wJ"f"j޾PzQ iߟȉ4]0\.B@Sv,R~\Y'~.G3Ei"MVPR2"S_F^PQ Z=$%P])ݔ˃l@kCO=G8uiu_GKyrg$hf&,Fw1": 4X'zwٸ: L^ [6/]BasSs+!pa:{#LD*gAŬ{b̬WdN7 Ez b;E}Ƅ亅,ÏU.|>&8!h{FAI%q *,L+7,쫋xK\>H1 ̛~=(j}j\Ҟ]KLiaR`zEpPk]T`Ctp;KT-.[מ$W M?m+0qvKi]?Fш=Ǡ)n<5QyȊLP\YA%]77<]쮟_D+5Q.u^zX\\ΏB v8'dl u^,"M?8G& hR?@2-E1j*2cs"9Pr dq2@h eެjJ%W6FysQV*ڗ)ΨuFRkͫz~#9S(ٓ5O\(~Cͨ2P;d Ċk~ʠ O8nC4?mNHצl`o #$ !aMо寷EWx7_~b&jj,]ICJf8ʘ^9vW )Jh/{E= ֕FJBXR&-9(2tIKkE$`UPE,'ۙy B*H!\d\IV/X6pIl4ӵ6]QQ8H c;d0gxcX?%Ԍ*n?zq?8;<\!\ HBX) +Ar,՘[ ^U?7lftsLE n R[ШqU;Bcv an{W wT`4:]sh,wUùW@Ŏ`U:C3  st+# yZM߸*z.wh4i!phB}kdI16.]\v95\Se iK6ROW-#"2Q`fمCk0F%Σ-\SیD` Df< i˜rZ4Yncj]NU?Y%D)&FC\%n?3g`BtF(@mmbU·7hl{kKh<7:*"_e,nجkom݄4>!%4fqL~c[^vр(vQ9E܂oW_C=rhcr)9 yup7$~F |; F#@š8!ԈuymE KR>-!2PeW-eޔJ߉wBi1 zqE>a%C+K b.Bx `򳕙RiCpZ s/*jIF<>QVjhfc6n"P1ko3Ou EPxfn>0kY.x)N8՚6jȔʼέz*(Jc4ט2jPlbcs2jY lIsu~ep phBHD=4x?XL삊"ra}5Xꗐ RpYSчUoCEt1KKh gUS] x*aP {@s홢8W{q#0KrV?-d^j\ ,2.yQ[Tà#Xn#kQ߮$ӵ!"_۱ B\;jJR'?zT$oJU-5:r} ;((<p=481MfQB2( vDjquwR@ <(P&E,"tq$^ I05O܇0CR58o1 S7O, k״QkBH)mc&ckN-AѮRB>w^ބd\ !ڜ`|͉-8}ؿb`D=؅5j+@}tQ !W =ˤ&KBla;nI؍0n!Of *&`D'UMڢdaj^Nkk߼n'l5,- _qah $CCR%#̧)8bZW䩴h=Ő+9ᮓHi<=b㒁qwT1rQ ԛ8Nv}$"k.h#;Ls򐏱b߾e: l,MOu[0-1 YBχÑdmKWNq=챧(1xݬ:hx6ګ|hGpG1HVՅ~،`eBna IT[z&y 6*dEQ]gsׯxhPH! CWK]=çn!Wa1xd"IBǓQ:YӚC~y˰=7$og0q:Rܶ$7i%TǶ"7Yr[  B{txM1)лn$9p(ÖuziX㽴 %O Eⓡ5(TxŠ5ZB(H'k+VE{Uυn&$AVJCqsF1wt"Y,^p&Enή2\^ A_0KD4ǿ7@9JG~#k]S#r/,?;&I`\t/kwB}'AѕWE`$4OVD̻0}׶/- ~Dp**H+] 7R1M ,\o@PH_d2Z(ҠT(o`.h:?cokYv}kUznbs)jZ"H[%zq A0!aŒ%DɒIZ&sxkәVksu9o(@_/rQ#(+`wypQ+HD|QE;{!O +":[`4p؛״v}#Ҫ(Vdy9֙Mw0&l#|(ŭo2VE>0'eh,ZNk~p$sX`vp>@Y\ݐHC >>f:Ǘ9R_!KI6Ļ]`c|c28-PV8z[ΞbQ-ǍsQƞ1%j#iwmyÅx^gGVT8tMRtł- :pg9 IrfU,ЄfC<% |7p#pnt<ğ^c*JɄ(-~G#V4lvt:oo@6韱zacNy-`zED,>3S"Z~{?4>:f2~>'+R&@U6ґF֟K9Bj;1zcP4YP-d¢L3)BNv$k+t(%L[- ՝w\rᤗB^I$H!&߽^Y B FCSZ' &vŘq]k,Miфq48~QH|>>3ct4 P48g$,4AYTؔ-ޣO"̢!@ ލ}~ HqrtxtgGOkP.^#)qhqx+hGK$rT3 ,!/isBFP/y_MkdtmdR$>@:ms8x:bK5lA2i 1dt:FӔd6RkJP~:qiOBKx#"ZulDWzW~!oͿ6_,>|FкشDQ<_!\@V|PdvKL,G\!f-]tAcOɔ%q8IDf`90Rd hZ9!MZ%-6 qBp⇟9e~tSמpp|z+OE'xo#Kj.x/_. MQ<,7&quWN dC/id8_^(7 ^$t31-MZT5\9AqAMoLSXͅ9(>5 ?p?ELi*k27IÑI^! 1#! bs)tu:j+џm v[-@=c6@"l~ȴ,bnpvbH4$)ʼjר[ "$+q Aͪt_PTk ΁ Tc81 ^3vqL#5IYbE)Ԕ%> /޹M ^|H(VI_ K]SsD/+%yn"N稚|;kїO9&XD oֵ!g2aGM-aa  !8YnL:q݄)d餇#N,Tv<ݛD!ܢpmGqj8Uf_:٬/~ t/d^e%0㊨ɑ'bD\LBhY:]-$D>@3Pyڼ4 iXk6Q:-WOj%G? ,nt750OzrW >oL' K@;ٻeȝ:\ E:͕Q@pubI'Hf:t>`5?s V p;N&&՛9>x k'b3㈕J+jOĪ`X3FQD%@k"q#\2Uױ!29G [Qerg'Og:Ƞrãɟ^97ݹc'j>HEܺ)s p)A&no>779֚c^V]58b׿,K5 6zEugM׻a}6F]nǟ2qo;,0wOF\Fu%/V%[3Y2Q_ XZq2Pך`弶v&s62c`ƮSecvkvkwV \8.E9:,HT=dXC*;&m}t6Fҋ҇^X3:T--Zn;C=lc"w)*|(m$ݵiRߏQ)wґ8BY톽^=~V*fDH{s  *>!x ?96btUpS@e:GK\`lt;b ĤD390R]'v;2ф^ nUgQmq.Q-n!@q*pܰ-..(+db4rㆻj-0`Du8C]mm͚Z#|s/o\#vtlPgO`m`LJ+xO,&8ƈ~ -MKR>pX8Cܽcp~_kc0oe2'g]PZP175S4,'Տe5$B6 L+?GH5,ǭ,HA2n i dҽ:uu(:ri`8OMh`h͢ U;H'ߖѬ+d KU&9ZF;%f; D+g01G<7A9Ƞj|%-÷AҸ+iIB)b4t RKaE |_=|%AҺ 9p oWh(s"5vIZ7}8!gS**D.5}OaOq^AlU?x߀thH@Oie*=kM-c[{!r6>k]r+hsN>@:=_ GIΈ)9[5@2R3#/inKO%ڙҀI 7QQxE=!2L]/o5?^QhHv }lat?md/$(2"owdMvҜjvBaDP]$vlwN!W?Dd; Va[E}•~ɭ3kd. fqtX`>(c45mA X_ȳI\1kVi{SFI NN7?}Gx!Oc<}85w{Xd9bzYww:Lg#"6E*p, f ׎F\h-A҉G&;PVc8 aҮݩ]6hֈRjx<˫7h ʈGAI+apoO_:j0'fH'_OGJ;)ښt(4d"]$t& L(m ?ɦR"F)ob!*zA\a75e>[aU.f"c0˰!lZxKhV;8;v!/WOzoo| gp6E[#/\a q7bbUd_VB  Z:՗NП4hU*1 Sڂht/ ܪ߀Z5 '\\)d0Yp%c #}f'bxˢS]6H½M* t`V>u["oшd/!9YnA0w- IDATC:#p9#-;&L|,x+hi.gV.<[wqnv0mnwJkvn'S>4&;˶[t pGm]@?_fVn?8PPzT0Cx9 v;#Wf/E}I8AC(I fg___Sׇ짞'^; GܕHAa MOKϦӧbwao!XT% O Dٲ;M]';(2\;BT ԽG{)1upOyjt<:XqaE4-HAcWm~ ]릌x:)95ndxp6 7qr\`B*ud!zbEo8;[Gs M o~|_!VPoJH䦥d79m8sK$!ֱ֥j C$3cQ+նH᪺#Ѡɚ4tSpϦB>ʐFHs7<.28;;cr+ɠ xf+<ɞ\CpWEjn]xt y_=/'_ RIw:`2`7BAI~eDY5X-(g;җdLqib2"&8{1kF~q^DSj1ņrBU%CYA^$vT a@aڑQj(ڝ.7*;ghwC/F mQ#j8w'plrmӟ ˿0AsVId&e(xe: ΄׺%~Pr-'V;ݿ~ɺgV[o Ei\P6|$l4&EbϾםJ( ^oV}BQݥQVf5bB Fx>]81?~7ibBB΅cvv+L"l+`2dݡ^bՈC(!1O.U#7G71#j5f'E7ZK_; WV:Gŵ7̵׏:L{ FrVȲ%dA󟤂6bFLr ,j9Tr|sANy\"tSΔ*Drơl*>iwND((ҳbޓSpg4Ajp4N0-|>^w#:lΏԞwoPt`q >WļMĢ|Ě^`)L'0bCg(hF%| C ˨!dj<5CL"/O1?x22Zwڜ'fYImQݔpeO[]fJ s$,Gє6EYafP O`U& -z8tSnh%uMە- sLj9 F]ޔ9!< a RSa# ^%EbϤLen#9!qA!:9+"E78S[Ý{wfxqƕ+. @|vl3YٱC4r4 ݥ4?%j2g$T17ɡ5/%YZ0I]ZVwT*$VMv [V9INH>ߞNW> rٟ4R} `Mʵ37(/b'L%q*p ޺T#~-nZ(duu{S;Ê7RZd}q Vw=3 5gT{vEԭoԛىN Sص͕ng7m)F);X aE邰w ֪Шqkx-dnO슈<<ݬ ̱\% G;Ur\㘶57N #|J<{v AKtַϾ*/M_:b%Ҹų7)>C>(0);zd&pHpQh6[mN&j3Fty.TCÕpXp*bnr8uHE|hJcN f1atPAu#)tOu8|0) (Ifpy)nޜg~/ O21OJ4bUehUW)V 9Ę'9lZ[[<0{8Ud2Fڡ$Վ Q#CkYłkղzSZ0ˋ 5L磰Lr< wv42r;Te#@3ղƅϨDض=!5S_WS_J us\EHz/1Hht$|FE9L^%J\>]k9K>('ۉb;YQ=D^g_o-#L D'|[%`1l'H U)ơ67Uo#GC,SY'" AEQ;>-'DXib500^A*a1H%t:ddY_2rKߴ(TUռ.x|́IafĞh u+IP_Oyujlo+%k $yU9fvLofr DdOXBBj{vf=x])w?8 xff8Rqq z3ݼզb`)^1<SpG'6!/ (KvS3&E]'Xy< XW?v]ƐS :!:ʻd{ox/a>;g ~Q] ]ENƨ6}B)Ua#]@<=9yA!!xh<yC9F+S?=I6S#AE=Xc0a8*۶xr s{&KYW49+ Wx2#tu'l dɚoed zo⢂Y3jJn'g;pxuD29K+VfdB;HXP+M|z'e$sh q,sAn* שKnF lPD]ÅQo $fEJS'Liɴ0XQjXrG޸ 7N Guns{\G8> Lglsk%u"6(ss p$oXWjEc⡢d åql)sTtE 7&TO4 ( և3)4De?n:≷BFWCAA-4bYa^ QUV)_#"{m#NKU(]3h^UN%2Շ^HN¢L E.5J ո9ND5X#=GK͆ ~09ǒ%,.Z`iV?Pe?{3uÐ?L l.;d>}QV!w(;*Ib;^ wu"E[UiWCpiB;y{ ⫶AIPebKc9}N7~X|v lߖ9=02& (I!7բl aw aE\B%9 l$'@4,y>(>s{$~L"843\yNqv*2aa:#,uG%_&lGvwdUQ#$>crP#P;Q*Via)÷4QLޣ3,90 7 ASt8ŸF$*MR`8ެ-YDn\!9NZ =Ph^o*a7BLMTT݅ZDS>5b~_x{+=A<!9mU)ԭkh`Tvbi# (>Y%|^1ƳԗޏTl ^uğ 76Hyj|ԱkյȧC, \cݒ*c)/R|pJ~}n*̀]&3O;c )E),ANpVD۶'].v(l۽V/MX kәiםߩrsU7?g $J{]';HCUFk[v3U4Նi6+y& LjEDHХ =QB Im93Q&4pTPϚK~O$F}J4;Ul1$uDhd*N*OȈNc 5z-t^/-Rr=}_"6$mTϹtV5e/ĥsz|xMӽxv\20߭;Lh8ީELw_mKk.؁D@i"|Gg}Î)BӎitȋaD=[(ڍ+o_w t@ HwUhb=N}GR+_.[%IWRa5Z㖃>)!,oW#Y¬e{HUb &\ybCA'YT:rOSJ`E ; RS0K֛7g@}3"ͰZM!>.|D!^-рS*>bc>X|rbpOO0$O='%@Y]%sW7q41pS7G[^>FD\]y/詩t ^P=~ ' ZdJa9䏾 u0 ȂKr[&g(&d0xrmؗ+P "Chى݆P|udD]R",g^4"{8ƺ9G4ʔHCU8wmo>ƛo. 6H ڨAK**9og(5f!L MU["pKMn %XcaE> .8?vC*2,f$D?jD߁Չil D#8+0*CwW_b{gWn<#' 㒏q 7y:ÜrKve4AC{Y)j#51G3`p+7 _Gk%uG IDAT>(6h94(5Fy!?l%Ύ=;f a09wd)ƁN8 Nif!K>5t{ҳ+Zgq5IaSؼwqJl;=8~x+˔!vdD2j|4xkLOR\m\s"4ZY/2j% yKM?TFhÚN"F3#5zq=u4.݈p" HC_0=|A!Q'DhA<^U:9RN~)H,8Ysw@ ijΙxmVCn"ڊfa3&&Qhuh9yձ.,ua/J1zҮ  :;ٚ!4ۨ=kQ^(=l.nʷDEi2KNgL ;pVG8a<#5cJ 1,Sv3ī ;Ln^IOǴO-0%d&tsL ?>4g9VRY4ޱ_b yps\=uqn'~FT'-u"(.,Fx82ddysql?{ӄBhR bn W,<#! /?>g?ߜ bW@v0OƍGW&h -G:pHO;cI@atϰE/zPv׊SH : Hft!̀Χ@q} cNa&#KE;H]Z<>9Ž; ܹ}ج=0 ;tl4! ,sU jsnDEl9uւ& z cZ_5G%xYq`HHH*K"]b,fG<-NC ;)Is,pg511 e}D ?U>ZwǡM% _y\4#Q !)+N.ɬ&L$ ,.Fî h04Y >ڥCdTBDG1Vo5j?3W{?9ðAERƂ3_5-p>Z#fwl^!{'EAj:"2͆hȷ$3 $US,Ùء+0fgUN§0EMq9'Z%Wl41kvG4E|1a:DH" ϩm.Dʓy S~4ZlV}~O/cXU9A(/=#Mc3G(80\6S8( ߇:; rJ@`k`#1;(6ӴFj(QWH$>RW^Ȝدzt]G?.U0An%5 _nK0{72O`k6 &̹]y=N)\tIVIawMsh7Q4C,N~Afv珶*gGHF7P)R"]_LF$]2Iź,eg0MeuBJNC A);I}5|FWeY$8ABN3yp2J]r)RZz00&J%gNe$ ej.Y3dv3`g5:3^l94E WmC_QE0WXt]!GрZyC`yQ`?ª8?7Z5:,Ih'^| /!VP^=ƍ&ܭ@I3T%7NְMjsD Ηs%M0q:F=DN 1f"9 /r\?B )2tT  `fΦÑ~+L1&}2ڡ[.?Jպ9rj3QAVvj1[y8A*1F 654P`'ǩ׌׵:.t'@瘻@8R6?.F`@m}pTƑn4MhWl + #vl5Sx#%*y gHOh^ѐk]@JvW:$hљ:ezru;mٱfK `Lt -iកt>x`BHT @i}:|;Rĝ!k\kj3j5jOceH;UTPeh6KzU dG=ccb^:2(IbE6ļҩK107bCD+' &\`iZ119=RbWxrJS>%B&LrUjmmi8%8Nj$Q&N)kk8NfS\l~#y6zS-5B` WY'-7(d'(Xhհ6 MQX//'wRLzt0X-> 5ʒwyq5t!/JdΆ˜(GMLS.h1JYL]6OY0?z wSѣB*զ] Y9PZ HCȞT$b|DLKN!5Rե^%jsҩYV.+P; Fd\/d՘Cuyz 2 PԁWdFCs敆2dx[̀އT]$8I^+ԃM c:HYNw!I?(H͆f''dizt F u g3wx۠TĀ`u >a҉KOwEKn3rP'ǰ.Wp۹Ǫ4p$=ANM4WwXp=曙$+6rL`x#5|'h:Xb_"i];ofgڪ 6ՙpN1f1rP%ע;)J,Vb+9MXx]H,͠jkj$DB"Q"Š;ݛ}Y\O9«dB9Af I=zE]l0 qx}osL F)z7{x3 oU-MCre`?FSY'`>1L@x"ׅː؆0Ǥ] W"޵NX.CB _Q-0{Ϊ M\%XIp#$ ZvOo$ѓ>aXYFx:"2!=+ 12%2c+Uе$-0N_Ɩ[a3;}w|zȱVW4=B%*H΍պED55xr^c6qqDQn@\4oZdxzg ϡooIZXqs¹Rzdx%c410q|XQ͖H>W}X|2E^߮7j4Xr|=;!S(Sc%sӓ R#Hn۠KbWW.H  <݆]wuK)QC tdཇg]rʮ w[U c1ި']H"}k s~07w`;,WKLQ{,>B_[r@R$Qn.0oUUSȎq64ߒ)OZ""D'!׻1>Fg&-gmCydZΒ&|ŹbK-d(&!)4xzFH2˓iIZ~G Yp]2(72eĶcC`2Hu|5Cz3\$t)=X:AEQ.i8%{^m9iᵣC|p!=y7y_kWGHlx #&5yo3erc;3D88L&tAlČsvsRW2YCTE1RTviRf II<տMdy퇨5fW0 bHŜvy]!e6Vj2NU%#mmx iy;h]\T":VψɆBEAaG>ucC1B([4)Aw0Ɛ,%F{̩&x2fxؠJ~/;(x(8p?#B|?E,S/}_ŃR.xZ æD:jЫF N3bۚAa%]?}~Έv cLciL Ep? .~d:Fq=!1 D8L/6ɛX3wKq˲H, T?YGOJݩDHE ؾN@XWD$)#+& leK]z7"Oe0 fpP~H35ڻmwb:@A^P|eEfGs8k^>.;.jdIU]o;[fS&U*Pnn|E4~&qg+>:b3Mep63*UI`J jkpEߋ>Ns!4A/ѵ[4]uEB[}mOӟ+agV8_uC#|U1z.P,2>uD׀H4Lޱ뎧^Ij,)Xa2&TZZFL2+b!lk9J@$4YJM?B*9nɌ1|"\sΈ Qn5x ;<\\ɢoG^OMEfB f|̻ӓ >u} @gn`iy9!ZZQ\}^B)+O 7 BK@qQAG.Fd h1)n lZ '(MD|SB)vX)79MnQa8zc\s$C#_[nI&jBZb'bXipǝEI Z' sYa$N}<e^ſ?kۿFbxJ4v&jbhA~<?WNCfdϳ gA*Eh:?Ls X"&r/I')/\ 2>&*5Kc_-tTj_OMub QuAEzYS"rQdl00Ǡ c?/Gѳ}Ъ3_[S-xiuL^;6U:q󽵣51#/`zg;^J*̶ 3҄@lLAP FNӣM8Q:i+ǭQжK2](qDp˾(JyoJKMK+=fW,"rgQР8u+qKbvǁ_+/~ʫ}|G.Fl2ƨ,0H8#Lԋ Wo:"#v#1k8W :y!"`dع>qȑSt8 y79`RɺsK aC"B`y~`䕠!tYcaaE5ڗP;킋qcsi)|h]rɬqܒ|t;1 J3z!_FiȌ'!l*10 ~"X^|fQ'oc:Ǹ 3=?/Ovc4u*23ܞTA^#h.(LtepU^+_Z6f T E5COtb%@4md`<7ĝP9DMކ-f<71#inuܩthfjqcu W]S@Fo'kVly) g'AؕiTuպ)L~*s¥mtaqZg-,RmPҔCgFT&|>tfَKu)R}M 9OhM|4uɗ/0WgsﲦጳŴvщ2ie{ ەEk+i]t@h:5zI~݁,b5{trGeCdfHct+'cATGN#d}46cTwML|U*<% yPǁ'+?VeH$qj*ן}~'${HK(iL)<9<1/`:Ex*+c8>ˆ!!\~v#HK # p)e}Bu5H5Bz&4  X0B8J0%eoos{NF==Y=:FEfL~% s '}/f1JR5u௔}mh2)oFA5}Xz J<td5dM%@[}OͰQY: ct]ivE^.\n,k- gX~N㍵=o .q΀߱rR%rvա#vjg{iUQ:}fD"rҜ-?\f]ǥ" RMW|wcD7;܅IZ>[}XpZ+$hqv4?dA[Ϸ&-VhYV-] BK'.zܷ\ 7X (,aY13?0>-'=܁u)١k%HkFxB )U--LEjLTV>:| r{)0˧ L]1KQJ lR4j]jH?]6 A7b6DƬall>Ǎ};_}XӤz6{^-D%`&Bb^ŽꃠKzq^Sأ66r "Tl24>>zMSسȋ{\ u"јw.:@` q-Ki6='9`BDOw OEC]*١ˮoӕLơ/ז'7zuQC׾9",>l.O sb6cXD@!w8g_;:@$>t R%`Z-v~Ӛy L,Aە;fKrN)]k{oeξ 71g$|'< #.lqp8V< MF ɷ|/~5[XZ :$r] e/!D J&c._ϱ`$6M=o ^WyEgt2Ug\=HndVTdԡȳ^)e"f(Ml)WKGvƂkN:;j(j. n!F+5ӑϝS;캀o³3-ie?Z@{ 3:亖YM}߯ l lL : K+pxA:7mpUY*kBS A?f3qM]AߥD [orhZk` " bB@vmj\nпPEMX vϯ*!. I%Ώʧ飓tMRdop&p@M#bdt*h'# hOѵfUKa_ǘ/*t:=㨇ng(+!"}xiWg&!G1i?ً >\`!:4Z޲+01@)п=INZʚ[A({Xoɪ%8/eX0Z+9X: x(hdټA;oF=?rQȆ"g綵( K9jP`5!^R~YyP&%r2s13 /eě9|I!/\X#6`h:lCoQT#(Cx~#oNa<[ǝcV70NJ̫>BUN09&ɭA6-:< [Uy%"1<>x;1lc>1}|0|\K= z lnX['F( CGC2#yp ՄiK"ʃo'Bw>IߵopW0HG!k238y:tq Mlamci>FQbl;vo?M[՝o' v4Wo ߽t +A1dZց -.E&z.>?,Nkskțž JNQ\c6$Dm MB q!^>Wc^{w'9A8hZ$NlW>4>&|t _ab1gIIҵ= z}4az6:2Vy kEW^̱Xȁ p:iN'8b{vѦaonkjHeEPܒx1(BLo;Caӈ`C'ĪPM u 2-?yVd&Цu,Iz N\N/ ՋzaVJt'*,Tց|-Jk:QΐC)-sY&Gs!6\ (ѬC ܳ(M[[5)sϱ<ĺ o9?J: u'd HG)j*( |rSțL@ȁHIժ[.GyT䕆V5TX9N\g>[l E-YO+n ؀bo)WZj1",R[kCsfG\2m. n5J+*uCs+t^mD;e-c@avuVgK8V<aa*HD~_5riA,Ԗ#o$g.Ցk؈w󹬘V2[w7Zݿ6Yӷ6sƒ<Ǖ+wjٰWڡiºE""v9/*$ n4cwt^g\kQi`o lr`A` _ѐLH8RKcY۫QyNrUskkg7dZbE~^k대 l563A>ZSG?#BZo%^jedVjI*;C3`(SnB!<@ЮވM8DɎ40HN ~N=:g7^pS2rܸY0w3ǭ[kb9FRBeGiT><ûv \c{q7׾ hoorQe a[qZZE[ZiMO)}+: G*)h3kKnݠ+lK, Ґ,<>f_M}LS"6 K%S;CK "ct]"*#)i3crO"Syd;yi%h$ԫ<е-0)MI m粚(-,Y@&%4jL-4ktj{{vNI+1kT GK=˄ĵ. !dMQ;W?Χ?JP- Op/}ex2 C kNhla P1ן /q<&iu$~`WT&E3msWքϩzBg\p%OA-vSX9?w@bK^"+DT&aϱh6tऔ:*dI4Y毭 Z#f ycg"W‡Mtyߥsi~eõ|+> bfZ;;T̙+nfz8:<ӯk ?|utt#tPǸsw?nhbI{X.2(+)WgwoTp`m=h+ɍd f.*",)*C=px02axON#lJBuuC1sk=wJTH\ѩB3a+Z'7E&tƫHBMZ>w5v՘i&Ļq*CPi8%pJ)d.?kH^;z^&%x>WVZhX=|ZIx-Uij]Akw1SpH%>4HͲw{ :z<ΞY OGy@y% ZV\n#Y纩(^Ï]į|[(),4SmQp3Bkt`JJ-7)QXʐF?T 66 -QJLwQ?LtiF9!2kQ+jG\6T'#]}A^ۉĠ4C6WU־tp5VVge2~bUH #f˳ᩭ}T@{RvD~Woׄ5/Yd!pps ,i %/SFzl.]$Ɇ؅~W ws^bwkaeEe̦[~GGޞm~9켼@1H&.+ډXzR)#ɏ IJ-jYu -zԎ3%QuAu%FII!5Ƶ&"arhPFkX†F 0ݒ#7R> vN9w}O_c9ԸɏjNTye /K%L4$DIs8Vы{¹d' _Ox>'!cJSqR {s!S^._[,e !Ak5w\ć?}v grȧ{3!i!JB5oӢ7WB YMx(k7 LN,86 Mlu5X`2װЏt>$-;(2~4牑gFWy@U,4mL D7!ݴ+g5S走?2^tyTE# ~)~S%^ \#pd_I">xl&#}0s{y'޹7qxMw 41pX?&,bOBzJ=?]rNb{n)x+D1׉-4Ȫ ,e>$|_+HJ0B=gH6RԞݻOCԹ/;iUc^Ȏpd$|\騇ɬxYȜI+;qs^<H vy[THF;eعa煈aȳplFIac6vkD)ziEoœg;Kjٱb@8ݑEb+_IBE:UXDͰw'V-_܅k1=j\l  FCqJ,~R`MZTLkVxQx3"|hUG > cj늤GQݍ]|I]G%礫Ab<, =_ QdSzWv)ӮBr=q.f]yE2en/SˆpV6MK XC #q>sRގ 6hGͶy4ԨOXH^>El:g5l~T[*ۆR]v)dumS 24S *ZGm ( ސ >W'$N6uPكX#.TU\#Ӯ]Xh`'Uy|DJ\kK=''ZJOKfM28 Єyx4A+͓S4rE5P;{ݦ֓z =~p),<9T"w\Ʌ&Yp >)Q?ۈK~`KKUdՖ&Fm$'"7.5*!D.7l|ijA^p> b$Oԁ0(`.sSi~Mg0>{z' f8$H݄IG[lj9^ NdLcQllcܼ[+sq{kƦĥ5Njh|EtX{0F6 7f8?yTCEG&x?5}!XgЋ%-y0 &*%*+o1Nlڬ ůgł<) >s r AAy²r)m+_lE"7dC+D c1L<_ϼ:Z/iUBG4yMs PIP3$T 1lL`4 |zλegV f|4SUQV@?Z`6^{Æ9~#ߐ3k3͐Z@_BB$h Rf|6)*ii6alYa2=dU$ 6e)F皗edj5+2v I  rke7'`F ߦEՠ5F{%7~LE{&> "5c~mWP«Fw UxĠəo &}xj5V?UF&s?~om7m]x.[h.kk<)ZIHF{:q*Q,W)Fٖ@3<7Hdn+Yexo_-ḣ{t={[f El^z[`8'qb xN1֍]LKN8tocOmc S`w阯eIKyc O LLX)._dUa^ͧX̭AM>u X s1mWQB)8T&ŭ][9HCSlH_9{֙%əSKJ.g"bW:hЊ%)f*(l$um|t [yqBJ ǍªZ^g xlq0?,v]/YE]@ nuzV;ԸJ82 t) ./vh_>_T*Jl^*dRn+R鯘8N=M }v~?C4%uHyiUY F޵ф2cE<+)'ՙx6i9:1E %n?otԲ3?krxC-e01f.omJ^&Z 9Fs<àۓLXzмa,ɥ`0D8G!ʅR S/@!M<<EG]8̧%Ѝsڌq-#\8L&}|PI}ܾoCx|ڭc8Oԛ+c, O>.=E0AB  aN@ڴ kJ !)g(S Q8 9$8rgxz|{yXGA)!<1k %1[ro>jYPG08GƧ>?vxyQAK)/ʡ[/@ZeLoU652PtسϷ276j޴M'|K~sӯ, *lY_ |/DTO!]]>;NM~.r _oUc|U'Aݛ Kj`R!q3Y 9|MȞ`vI"3{a{ 6E`.}VqE%9 r}gN&XwӧdtC+ ) sLJ 0+3j+WN 'U`xFcyo<|G;'B~ֽ)J8> U y,kH1vų[H7&h:;!;0SO{TW6"5bUL)1ҵ[/翘! Eܝ{y쎁fkk?C;wĝDYJCifĕ7pGϟm~a\:Gq1L>ELP1ƍȑc\3h/ŭEyD3yli 2sKds ]dR/pt|FfcNjoh6F4"Y1VS1JVJ&QehuB Ow|7't4HAC r3euhL_g_j[ʘ06ˈ;|R\l ?%^' ȁ2$i61ƙ+8Xzk~󷿃\j#r1- ) "Hy!Rr?blCvE|Ovgk~w*DmmFKa% H|xD>~_MOmek_<d[<295,FL|7jP|FS{pS+ԠYmR^F0nd|n[p,&V|<|pʒg!jwZheZnp dWsqZhCҞF.sb\Mr{8B)6#-#Sd[#r [9.uYnθ}6MŢTO'BR~voYFZ>Z7cK;bE%8.A5I|\[G~"Wel:ĎJd2,ب]' bwx'*RDJ|EkZTĬdQS_k?̼3NFTӽo5VPD6qN(7wvX)pQe9ms?&gNj(3KZ~Cpٛ-d4I< h8r5jٺomI1+ı!*P)eU0{:opdEďl#lQS4r1 4d70nUhl |orְ&GjS*(r_w L9ϩKf4cATɡI)K$hI|:{ `Ls6e\L8[w1Bl' N^ c\8E;x4N?"JHv PG'ŴC\!LL=Wc ȣ#6p*~s,Ki iCjQu(%+gEE𨔉> "=wN>1*\z$gxo qQL_jԵWz_M)"o+k@^YA 1DoD3 2LJӀ(sGlӐ^c8v]0]Ӭ[4?[˳.&X\Goؓb$E)~Xl! g{L iձnZr/idrE{Me tQK4ttN$Q?M IDATFCtjpdCi \6vbkU$5?mz03O@7 r`ԬۇkV[pI>:}aKl,̭핷\ ̊\Zfko,-'qZk2Z `OZ2k"o4vme, ߚX0XcɂnnT8* ]š DEРSc zIԓ_ف&DLK %FJSP/;@icbslv&dFa$&6.i͂MF#?K ˤWѴnOgƙ눚;0.|O BϽim6 d\S7?k6c ,G aL ԟ G؈ptAGI'Gtn 72$;DO3>s8y\#I->6" F1.`J/w/G'߳$B&7oOxg 3Z'OQ&*zy<L,~"F[W__w;؛sB<'/?PwN t5x9go8B'pE'7Noe=#A8Dh@Lo$h&S6K?,k]gqx{;G)rO}z+"/8w$#h 6jzʇpf5RvRYUY6 ~^jPaz0x>7ގ, ߨ~3Ks5m\`tQBĆg.Hx6ţBP=VW嚝p?O4S!BM".m Ij>L=@bxC[tiKid[`Q+OEg55hmo F6Cɱs2 7ngCa~T7l@]4HzhT氓c6qbҴ(,~K3߃ C>i@y`Ξ5wnƙ3{޽; v9'~~Woᵃp LF@B11yCi &5*qJ+rX%&̇q>g jٝcrXc熏?=|7i$' ‹\h ~4Rƙ#K Qt<4Sj@S/ s!pH hR?\ct3i{6P,iСx˷g˧vfڋS|o~G7x8@Pʠگj+Irm %G#LLudo:hC,o~њt!D=1k166=F\H abZBS f h2~߀ )yX_{5C(~$D`}4q`D]u!qw {)._> 4¶ޛŞxI>N‹OunHcoբ6Rrwv'?(Qr`Qt_-_O~&>#OD=DD ёp;4xbb"C)L:fbza1%>9S<{ n"|xKwocaV.,9Mk)j O"LϠG:qPD( /ʫ_7#v;;7oJFr;{!N&vpg:G1\l( t_ OTW@:661&5> y=['WOb'lY˱y3gՙZzGh"ߺN=m0I=,NoNl)}+=mu-69++LR)*fyӬ4X] WS$:Q A:D=&W\PZ氯B4V%ͪe0à4?ycW/tsN).TYSBl&F!p_~>k{?7ei(u3(͛vv}llx<`å)NީU 4/`>4B7PSDl0~}}D~y;0+(/AL3 1.j;7/>?Z_+xf*cE//l*/ p!~C'И#0 %FVY,Pȣ^In0){7sXr(:ܟ!.@,v(ʯTE f a ^~￉kg_y /೐HC\=hpU*y wx+w+cݧ6ꊬq<>{;Wq:Mw5)&8FjERK7Ex_?dcCtG|(:wAccc` 0>sl%R&)9N _bx?q>=O>o⃗qs@D"d&2I[_*2z;se{ 7/#C PL!ĸ _n޼IoIPzXLD<jagRGHDeBSN&ar1FSas3O_ēO^@Y{YvUg'Ps[ I !ȃ01?{=al03`DFBBBPDVXVt[k}l{jUZ ~@:5-Hڛa ":j5q[pb)VVK(H0ԑS4%Z>L!'UeHͶԶYtL!puСMdɈ| 9)NģnКcˌx{_dXvȎIl|Gnes,^ѼN Ns<47tv SS]p3r !a%o6|lxtRsUd0B ({rԽk:ҩsiQmV\Y$ߋ?kJ%e.='YRv!d 9b+8OmX76 "*dL D> ()#VB60kxXBF*'{bc>+S(]70 ԁ`i@J 5azӑ!.xY C[NI\X5/(;o٠}8+8&$1*⬟o￯# >? a)~4%S…gxן_CaHiJ;.CQ13QPaү+Ǎ1,V{D5>g',Tװ,[6Oc9zdPARP7OҮ *s1Nށ?Gv~Ux .l=;(`yv8DPQB6Gk{wp/n[v DVRbom[f|=e\X-1klLF5G6Ċdcij8V>WNcϮFCIVZ`M;wL#Jr6%޳ Ve8h)8Bf6pŤf'ο qX Yvr1׿yB_:x/֐+g rl99F$["~= GiJֲ3S⳱u4V$2Fӝ r EWy [P<2%y~2"ҜH:ZQ9+ڎ6=~ 7m бoCiR@(tCEx jcS(vdMZy(Z-띓ARgV7EMx5T9č,FiXErC#xILN;XՕV3vct]p-> IjHѳ!i _GI ŖzV]#ǡkF i0%mZT5 c b^}l; '1b}.m/a|}Hܦ࢜/ KZd8NQ/xN!7Y7~EViҾccJF.&OPbvJdi{{D54_lΰAK66C_0ɆKqZSZ$UC>_W~N Sq"2f1YbgB+jt+MvBkt⁚`63>и`T4ިPV53+0#Qd)r3x[/ED<Mr-ߒU5j[XifJx?*bfZa8xrܵq|c|k/B:AQu9o FSz\ANs a'>UC46jc\;ف?;囈'_MxO@e FaMf zG#>1N,vaf1bS1c=%xO/O%rF`tF88}k ,M/AlqiGnEI5F{c*VB,*ӗn%pHm%Px ܇'߾c=˟4!>ϕIMTkM#sK,.{8\+6淦|OQҹV2=XyNt e-fei b&PƵm~ Xnx84ͱp&vߑ6lխp-68͎~T (#@+3yOM! |'Oߏ;n=E{qkӽo zSlG}吕tmML"V(@[v3ǚd0*/?߼߯ab*{q@=A U0̂2qƝ߾2vnYy7aG*ao~fўbڛ;Lj݂]0Nm4/1ncu mki9|} w v&s/sVC['W8QĮ%XB*"F#hx۟]pr1A/~ x7Yu I6!k)kICoy̽۱Ky F^ӳsx`®X6 kvqwWTb\y0a]=T/ap(rK8Q+J2 IDATc Ua"a {qE[܎M. r,)VGD Z VHW m o B #8P0 ؑA+D2sDo|ARϭ&J(E{3JOf 97hnvSjPؘ\ G 22153;}ݼ|vjg}\GtU; Dix"ƒx4VY:Hs#&w1)(;a4vC's07z N|`k QNt~pai>gjȰ%q4Ѹm|Yt\} Oli"whWt{ *}щJ!1>9`t} S $"z)rU'N۩;9]M~ /Cw-ss oLF,mp 2@[;iSƗ,G3BE-K3mV9_Bؐ *ג$nz1 cڰ 'f?oλ|'2c5s?Ft F+sQf`nȄj#/U -d6.ja{z/@m|󫧀 {:x۟^CDӻD#f<Tyc;#9+8ũ}|k]oc%(N!*FNm|r?'E>.qClsT<F=.:-㡓Buq3'Q͈䄷Ҭ#$RT⮍4rRg۬}͟?3}HPQ`vs h?Bvp4ʰκ sيO|0,!pX9~+'uᓜʢ$@Q#Q'XĞ |cO`!hpa{8zTcqig>v`뎋-?}pÍa*l i a9>4/DuP] Du`r]6_ہ}tˢѽBF +>qNS}THqɜG{$DSڈ%>iL~\OxX Α֖n1Ż'F>g--^6/]߅n #%I`|Ga [bjQt .ڣ%ЕN*`eTn?}v =}7\39(EBYaZa 4hoݬQ]8rn9nGpϷ?Q GʑE^ѧn$yϥϯmy/ ~MWCehm"nPG%~Z22Dڤw Ca3 D6)"+^hn.iޚ tfə{!h`kQ-NƏ)K%yl'Kѓb>^w==|uCw3+\-w)b!)1T4QY>fL"5c*JO݄d"9pݼ4(Z8 =|xwW9C@=c5!oWmX/Eֶ"/7> -BCB4 N> hNnqUzW}}IV!h$zv "9yqƑǹOd(%=lbPmZ| YP*;?Qe)IsT nN]t'LU&VVw>j߸/N'׾?ɤ`]"7% ǧ+@RCz1Ct?z?=:^ qu&fԱ>@ *sM1@YAk;N?~ )UcWi}o:[wfG)J9!8Tϫ+GEGjNjy1~c¤7_}pS~""#V}L66 7}-U$oua4矷a̤) W}6&wB[wo WlP@m-3?fAB1#Pl*ˡ[Q#1MAna7-;ǹW_x_qlDro|l? O0@%rjguĪ4R#;Kڮ8 e(k'WrmL#)Ï݇M -D(-ݗOzv«j/^d-t:sz$ ;9` PeT #*||VfCFc{ʠSab:(E};y6@XL䳾[uR kx8W%Ņ"llg+6T<;цH5Ÿ.k;d.=lfM$(Qao\6 BA m<!rEE1οGc t[ ?2*)A|d=ё2@I|(VgT,ǧ2M2֦K}!FG, &{!W!,%oܐލ7^2:e>ryi#!]y;c\ͺ TSF7 WVq_򄏪&8A3sHCi>|y"xtiĉf=>J0ڣIjE损 d/AE!ZO\Kr{Q=L¤-ӄ<rf]HO#qƣ[&%mV;ڇ֏cׁ=,L8| qج!PJ+認Pw*1]9⦛N[x7կS,95 Zb#خsֿ{i㓰oX\\j D\)]ߔ 'ƨL lEnVP9o(q+b1Pάt=&H9"T-{^$9ZInt(4e߭GW~R|}=RB-Qb =+8q͕ض6&Ʀ4#2q!KC,4u`?^s[ބTt5v˫ ,C&&@-|6­þ^itӴK!6SH(NP@N pҀbȩehs-Vh!5A}$(L:Mwhٸ͒J s0G ;↓V5x=NX$*("85.#џxU(UjNtQ؝P KDrfYfW& +6sŏ+k-J^7`.O1ZC`©rE`0֥AQ1f[-x `!sc0EfGeXq8Hkԥim诌09]rAV#Ϳe9)** LY[o$$pBϧ:2v+0.y$c#_TʋPY1\0;s??d-!vI|c>~*~W_ }A[#2b$vi@+Cx%a|#w_BŕCl;tioJ4R:X\4xۗоq 񜫷`B7kzdᢀ)(FJPD.:}F`DfOH٬-zC!I lCP~PBIPKuSdK<%*iB w'VDIhE`If e` B]`9y Cg#CPL"@ ;? _~K @Guqh5"~kTT͈DFrnEj92*mڍ;ΆG|إ aAcNǕ*pi" [9N^H_ue'zQKco^ib.g }/S?jtjppfΛ.'ܝzy8c"ERw'^q3,Kzy:uoP5bJGW$ RxNSit]Ȣq}+)< Ե9)#`߯j"[ qs{GC3t OsuYIn HБ׉U"Ah!>sM" /R f^,!1 &uQr?A3ٰ!Вh`괈7DiajӧNSzKkv7p݋w98kh%4|ʭBd݆!VDZ>.Pp4n ny ǏtPJl򯟋.2ǨoKIŢ,">BNdFR+-6y͍t)XTQHM(bl! U kT4CqL$@Xvc҄E))(*Y w,=n/,[Z&ֶ&x҉u7n;0gͺ%n- [xk9Fnb[C&w*$Hcb<׼|>!(R`QKt0X$ 氼tuƩBd2/|NE+ ;ǐT gj"y VjHy\1Pc"6Za(GFE;p%y|xĬ`5) v͖w"O[ug e^?G9}c3^ ,2y2G.g,ER."ĩQ_ M"G]X(N5}RQ߿zVހ~6ڧ٭7p&9Lzfd{Ƨ dO9#^>C񎵫ǁiyUԎv7Yo ݮԚ߀x#xšI3 \@u誒͒?Y7+.gtfPQ!;PympE{NvcUϦA"FW}Ec2Av E/h%|z l3;a ߺg~wp׃ YT!!bW^7wŵ{aps]] GA1 "XDK<>)e^r1^D ;,b8_q*!!ȴE#6;?GX[`#mq)t?dȦ&t+i G5F\߼L_i05sG(MbPo?5[D ٸΆlR ]@liΫZƳFkp8g\XB"f"`Nas7c:R+1I8-ъ"C/⊫v0/#,|6v2F9τ ."? /?!;5J n:]3@$ˊUsXrD *eИ""}31b8ZCpY],fx4b±"1_gC>ެ*ԙVKb.*dÌ WMaǣDl.},~]gp_ӚBIXgMGcCIu9G$3I͞'k\|Y 6B\D!$GU"ծ$ ۻK'-c|\Io5y_1X9#COT\ CCWvQßQ/{/M[ζWbrZI+sDrGSO*XЌ!0+D6R]9}'ٚ mc"!@#)I` T^YZR1)5S} RTL~rSbUbSEI൳^n)]:hX;zRz!U4Š2ڜC ݻ{]9/?D&O_3dB#~~FQIl_;/HUhwit55d4i*3ݩ_Wa8 ~ OT eЕF'*>ok0yEHvWB^HB qjuYuN{`qg~eg㪫f"sK!Z(J )9 .|DO|  =~/6CY@!TkNIRa0(؈ʣ#}Uh_#J3@\{!rLr1`I*;'9Shج63e)c8$6I8sn-_6`ZXDľ&UO1Q#5kh,X<ҋ/@wnUY"<ֈ (en7Uylh8WA1^E>r( ާ.cF|!5|5غu't+o<Kg8ĘL"?f$`&r!!U!E,=J}~% (fߣ_gvLtX&Ȝ"ͻ]ƭYYqoT*5ܨ h*08%x v-vq0'픳ܺ)('FS%O+ ?)J\/x41+4e2!?d)6)6@*gCFd7pghM݄LpGxU''0\<(( 'a=_y{/]P}-r*M1I'X2X99Z5!5=;3dR$J W`!fJX#X20tHIQA]&-ݘw``;-[W. JmͬM~87I@TK =_DjT6Yg #F@(͉#s߃íh%Acݾ+;tFk/D6r36o>}pr,-9(\g׽\5ןk1mfI`{6m//Rs~e CW-|K8xtWP+7vCVa(eP:[Zm70Ĵ bLrp㫷z⤃8갹ߚS2-Hb3rFTx>ḥ2*.e@t I 6!픘ۜqlVfff-č"G4%"+۶Fx8?1 ⤆CXd츓ĻT2xboy<t8[*:\cǫЬ1sBFBNgNL\K[m~a# qwl## 8J̌ G&O(̜"@L8ID#)~j* KްYޡ N8 #@2 |2Uy&z>VM ɟ|+L=&婒߾F9Jq뎪5REYpoLnܠ]y x%O6q##{O h9a$g (=)IUê{ּUB]hx+4T]8)#f[7f nmU8fsI"9+\|⏞ F /ŻVxҒ #5zk 8qp /gx ΘILO͠5;++9yg :nv +G3ƒq:@[@FK8F1yͅ?oYcMm N/}9c_3!=c2hc4XVʭp˝'13_aY\:_%OcatH"&׌bɄ9EVwpd_BY;USWB%7L%x&Oc;@恍&#;7qA=|_9(:ER֒'ˉ=j7ip.[[mdžyUyZ9K^+Our]j^QԲr?`$q]7}6Q8 jW}\Kq'hf7Qm'\XNMO=匋$FXK˩;RWOC_8Έaee/S;YV5 9i*:h =ڦߜ눓tH]2D)&,ֱ,\сUX a^<ȸjY'xoͬdIX|++ I^IMf CWG>lS,Љ2 H ?`oFAnx! .WRʞ_qF%̃EXid49p$uz%Jfl߸鯹f~B[SR ȁqڜw+taÙ`1+fڶzng߾"YKxWmO\8 U Nf~Ua6clb,#^<;;qǽ}JRmmF.~ysyaJJ2 `*[>M"PA:;*Q%Fsv wJ4IPK̄F}YMs^MI7ݺ7Q͕! >N1DHAHzȕwEGppndzpG#Ei͗$L.+\ ^!~gx1T1's ltbKܤKMi\xpXF ;FQe%]}D(/aPOeZ+ |p&=B $?h#_I~Eֻ >:n@]晞7u]T'Ą+Xn `47'[Iv-4&&;ryH^Y܈ &{)gg<YsKrG]0 '6av;+p!6|mM{d5u4E7,Zv e;i`vp.d*,1RP9 X:]|8yxv0UU1@X*<O3d?3i> װ{55W]&DAKoPX,؇*b )5^ÈB H*$* 9UO~1;B7<;`m5xBA1־˱xa t=CqT҇&hw5'F&J#C6JYDJNxe@ruLptP3,睍wS8}{@cw+Ï6u~ ۡqS_!"Ķ=s@cy9 F2$FScGPv%ðnU:d[K^+K%>ӨFhxp?2?x7ڍ`8Q(kq#KX܃HRKoګ˷;oF/ی=!?uz+]8%R\uCA6pv*cU2ll%iI_l8dH+GmNHeYwLxtj'RkQTռ_Ks [4]笝Ԕx#铒nh rR~FMFfFlcH(ˮqnvŇDSH6t/ l6dN6ꭆ/kl' 5;e%:kt)SSh;h:ICFyx9~S0iMpHF<`:Q ţjg*ԁSob ;dUN4VxDӮl,uo"{V1lگ=gG`ɭP4YDo:`KpW9:6(;.X0ݮmptG<'6c]0t-K xL` 4?畓dv~L>yVEwOƑ7d4F@Q2!.0a׿ LK+q3c#غKl}xx߸ \zI4w?KD-q6&R?!iI2;h*ƛۤ[udVMSFyU/lH߃׌<2IAyxbm'ص0˙pNuռ[2ÑD1G ̳z*Ƙ.4.Y$tS.dEmqc &IӸ|/%T$1|ɐBt8PSAΙ0qʄHOŅG3c-`E & /dz8[ޫjcx y7ӛt~B: Dn2t:RduЪ_UnN }I}ˎin瘃 {΂u0(!i[L ubI8콍UX|M{>fɞ!Aqn ڄ^!m F1MX#Fa`׈*60 hBYl}ɹx~OM*tq ql0?s|34;Ĺ?E?(q lX,lAyw<s0e &%#l^bT5zqj1 ڣ{}y>)”F:Ycwe)s2 BGh 8/q}0ůN<S3n4LЊ4z7Ȏa*YX\67rǶ2hL/wΔgK;4& poyp :/s+#,=qW*Ceg-s{{Z@ŐDYV/m&$' ,8~&q# kFR67 37(Pl>FokA(|AZzm򩂞NEb!!FTDiiy3po25>E ]&t$6*qAYCЎ.Dàv)ɴ%΃{9?GN$ ,bg7~*Jh$tps1@qŢHY>`% :! ;EAmdl(% n0= gtRscfr:zDWC'CaylPpp fh@׳2-dHWm^* f,\l2b 'wt 炧~ںxM q8nt~6tR2/rXb<'VƄ/t6A/,TOq̲6[7|o%wiHw9ɑ#݀4WڝxqO~ >b߾ d憴*JR  E8"7q7ڴm,kԃU&JaDjA?[y7r?n^5 zYS~: b6\-H3a-na,[{x0ˆBĺ'wPy[@-*FH^r&rR+#/ <+Hi8zP/1;3 I|c!4 "He6tȈFոªr5zrd>"ι@$?@J}*g.ⴃq>dB2*"U aJǸNR'Qk:l㦛F}[w1/xqR`zlvl~8q!>$Fvn3URd3^͌Y4!?)au^#J87.qۭ'^*g#%_,s 17?D0qbc%"sf4EɄ2* |^^m.5T NIs6ayQ!-kZ[iuMq(_uJD &)F ^kђQ% T+l|k3=ȷGҼ&rk*:I^[Vb`c4ib@ 2HǸ,$+ F+muArI t꿇 Va~aċCPI Y0Ƃ4MV&Re݌t&g$a N.~qhg!^g)c'-OUY{_7 ѵ0c*!wE`#׹8 KCh up:͆籇B2ajxrBZIXQM v$FSbx%uf; _mz$njU(OAЕm^PÉvP .>/܇mx &>ЃS]wc#wqkG`4uN7{!"sO9 V-Bn"&@nZX]['#8pp΍S*b-CtF'4R^aMkKrWBo7'rZD[Uކ̬ LMo7?ts}pAFrSNL`Mľ鈏].4шפAƄ]XZ &ރ-،^{~YID {mJ>Q)S'cx5SRu#ت%$W$y;[Vr{8?F2d%!+aX/᪋-]xǻm@=''j$eŰnܟ08~ \x.8p9”jP7VAAp7iO ]63+JgżA-<D`s0ׄyCZZLgUÍ)2NWLZOw־Pgu!U^my&И)rg6DYk7"g,($EUN%ڊ(bR/gxay_ d(1h\2:Jy)(1z]]卟GcJ#<ߧI. <BzM z057<ԅ$vX{t^zg?C>yd=l _@lUR^UykGJ!o8x?3kaɓkӱJ:Nz3 qX*e߷>[po ج>o46뺣7({io|4y>g ! IDATnrDuE[o;?'w$i8l$8<$; ih'%y6<](s(]lnU؆w7?"#eA(J/&Đ7 cHT9^ Ip-8l%VZv=\@:8_ψLsz%*Cɏh}Ԥw=%)^h:~Me*p-댓!z@,˝z+d֑$iaB~ײ*JGcc*u]iudrRRWڶ2NaDT@EuvOƌm R 7) }@|2P)!DY31Ϳ}uUIGX˞7 g*P?[?G;]}*dX^q3@4捩q$ͥ9t65%-9i( v.o3ݚV;7R7B7aCdZ|6zoj' F507zUNVXS2؄ӰvzH"!f)G"!JNrĩ~OǦ83@Z~){0 Fﮯ?Hy4@(臹|}岡q)F'D?J p X ol`5H/Az#fJ%D/P”NSn z\ dl$@K|[[f{z#ωZïr x oQWaQM)_2L|H23Qu:ؔ/lh1j`} l(aI $ǜuۡE"^Nr\zМ}ZE\VUΛc5򍰒h9';rBic{{lFh䃯1 z ÞwmuǸ׽l Q _>)P& vrpsgʙ+2W}z{ 02)D %p2~(̭W2r12I)UH8шĈŷs98N-Tufdx̜я[GaK*+~~#\Iܻt42QNP'sɫdd[}6[*&[)MmLei5<4Aas+AUڊFNW2|_F5q>3^G}8Z_GB<. ш9ј3Y= s/xdzȵw 67Af&@7^Wn'=I`kNw3>1\&5l}uE.}E,5$&Zyf Se+WO"j 6# QG6U}Dag&)O9"YOMjE$eDVdאqao}`8wRo%LΈO k ~Co:c쓚cX3p j!*egh!TN>Np5GCt*tlYH9#%AVH _~S]39cali C3q'xbTiT" (NTOF=lMc;9޷^"$٭n]5eG/3ȆI!_!ȷ`Ix̮-[h$%[V[ꅽ&Ysv}EHc{.Q Y-{ofA=+"`%'UɷBF\}T1lKF8D'@&"-׆tcOqA ݜvA!1\Tdٳ|aΒE~thƿ>_s3(xCFULd PY˜N~/>3$5#&t}?‹Ϭ&V+:38ÓWkڐL.ZlAO?g[/J" &E](EG`liV)ɵY W !3 Ue@o`2clXEqRbI)0%Q̼8&1+z]itKAo1Mk1{MԈ6~Ҁ{q[΀=Zfow/܄oʦMXFΉ`szdSɤ ~覠G# 6:u1fDlG۝92HG>vv=3'?^z* "Am# tYIY _8Γw 8ڛ! ˃ex08^??_³O&{`B;ФD,w# `z\k_+k(HTo0:U԰Mb8W6'Rg FLbBB;*ƺq?Q|?k<]-ۍ{w@&k.khS{ݤb!I 1lտ~/Sn.Õ> AET__9guU0c@R~{ j)7#[|ʒKnɌ?'z*SeyȘ:]h&)QPIox]}t*m rg7&!10W*y̜-zczEV4Ė5v0 ) q 4Cm\JLµ/Zb7s`NNhū`;ެC8k?9{4{M+zpG[RŖwY`FNpiP6;CFƳ[Eh,>[mF39^7w*\ k琗L1[X3Wtyv̂,@6;LYe:8 bvYPsgqPv7oi?_ζ5Ӄ,Nhi/jdC_,"L-kbdd1k׈+CrfXY@^kAhAV|cKׯ>|[_oP4&*^>[g\NK_ WE/oEQםbse;1k,o]n$ȭxr49jJ8fnS7C6o<fGlzN>XgL -2/Weow؞ohauYp"KiV&^Mo4O`jm%=6hevfD]qiOw^81O\2h " DK(lʘzR kwHlՊȧVɉt$:'(Hu3s"p3) E1|tpθ^~cq18~nt1h.udyl&#DNA.iw5`%$Du_#KEgEv"x[`3sqR});M[MN[+# )h57Rci/)v8}:~ \}4}nyiU6VF6 jǣ޼>Fp"6N/շX@E/~b1+⺘Vc\FcEs~ 1;DC2鈕6Nv~Q){W00VY .j$8$ؾO|擘T36!}E)G0dh% /u#is3Z+]dX !EzY !SﻪjyBPkIO j='F&q* hmu\cp LSALr&ndVDAkpvr ,.Hg@?r@ȲL'ϸ u(XYЫؐ8;3nY𢵧%(jD;j%RGC~ z_%Ŵ'΅]9wZHĀ(U&kd=|3z`u+S#VBڍ"s ТmKNw.ɈK(52}LtҔ)ImЭ5W􊿳l.8C'ϭi^˘KYMeޒvgdL̏*VXVy= Gte2]wg9N tܚ =bD"2n7*?<xp  }b_̒7Ň͒!"qcq}ESE&ӊQb88Ú8#/:*M/O]' DLU5źzZJ| a2XZnnݚrxzBzv/XJ :gp|{}<ҟ^bNqJ5tP,a_ nLs?>|/6W!YQ!~ᯝ Ͽ"H7` 1É ~w~OeuaUEg0;JL7x#ņC+8BbM14S_jV=JhVjQo3x7fDiX BJVSp5}3E$xAx22G2NPM(1+;F@D\ NlF|Ctitkr;urmV1ρS5rBY눑VflZDS 0el%=@AuMwPb[Ox3bfSDԖ)5b U0d! ZX\ש܋6U[ $u blL,ZēgMATIN'51\b|ӑ:M\;\dP "k?0")&`KHMeL 'J"]DYx~wzquM\^u)fԦg)IGj>oK ҧ!]-B"Xe\Nh#EuYXmY,OO0S-:xRP)IJ@IӆlҤY_qϭe-,k&GFX[ xn/cC<ԏ=7^m4 NdR-FN ot[1>UXm,+tC{8waNZ{]ywbXX{f.70h/S|e w a@X' \Lȭ27Wk+/=u- uhֶēDPӪSj}"i +0}gjj056(֚L緮&L񶺶t1X* >PuXXXu贮gaeθ+R\=E-/Kg&)s圚{"b$Ɋ\ޱqzC-fQR)@!B`-hr׼AB_MTnKh*^' Y# fٲΓ]olVλrA\FFURlT) Xv)L$I*;f-H@= u~=ܦ ͖gfG}7rȮ l(mBSya[Buo;%^'sD]M3Zr'#8]&'A}?‰ S$3KP}׾~L2GjI>iS:X[Pw#O$zuΚ1#nu$Sbi0LRza*v-Bj$UgFh  oW&t_rv쫅5XTyQ1m66>qΟ5Bce7sisT3g~bQ1q  #TLe~Lyç@d]Iեa+?}743g nKU&H3J)vq%3OV3SU1 }*c{t5gl :>m1v/R`yi ?8s`ÌCbOEOn&AːwB'}koWXT\g{t:YWTڋhŽpv^LTgt5U콵}X/ O O(x$, -Ku!e`]뽮@qB[-XSTGۧ\9(x=TʡYHN}b:?gh_i6ީ$1}c<s7@4 jW ~1Qbeh1KLvJ%cy?&&s$6|xEŦR_2+,FJNyP=i0ڝDtNcpӖSv Gz1W%GV I303h(Eζ oӑB2$iO:0RRFg0U-9kS@}x :h7xsjt)Nfl,B;՝9w_DF,nI55YG$`$TNQ)b/=}v\amM) 6k[ϱf@Ix Ľm?x,sWW;)+-pTW_cO||YճDH+LAsΒ`{#|ɗCqG6j4dDRF%L͒1B ׼=}Z&Xc`HWp39a&JuأRɡqn^yfnsuZf<ݎ3bɋR9޽]hLjy͟F\uJߤY룓qtE`=-HK^DŽ}h{wAAjKFH򞈷O~\Gx>v=Ta neh3g?Z fwpFeLK$6C P b2j%³2p4<«W^ÀMHul_ wRK$3i;&5F=|[C$9;0..F6Uu.^A I#$g"vB{Cv_ۑNdDBtQ F&xig^gQbNP8Eۙ$H+F1o U>'7_>p?v_\t4ECgnìj?7jѳrr*y<!$}Գb"ohP'n>jM LPϘA `XZ7\".l-!H4H ٮWNlK$&ʛgDRߑa:0^&'hڦyҀQ54SnRild %ډSnx7B87F N|vA-..*'`5@`ҽU*p&PlKVKKھϒk*{TG"5UK[+āR%Dm{΢ F<ҭDsiivs/axh"UAbLra}r5ܪ}c#S (ꢖ̜G'F#TIwnn6:TEOf3vG+xm|Aw!R[MvR$?'̸!$q1d]z2ʕc l-eX:k73-x?x7…Lg\ou=26leg\E#ו\~ ~ O]zT97V }A&a)_X4A W\Wp)cJ-AsIAS\bDC%p{c8<Ob͜gFns;1F;TT,]AFA$_Pl7n2ٝڵ683j6\X/wpGIyPfEGrNAF5rjG K H۾PÚrANI>:z.WFC;,7Ϫb6nVT]ȆnrdLw2ɝEdA8hgSOPNxupDnGȇt Z?/+r#{|om`?wy {1r-Ǎ#}6=[~7gPN;KR;ZuI*k`.,H8m1x  6!<"$ET KNT#,᪞ 5TZdch3,HHizw!;B'/T >E; (QΦSf)V%F!!gf^9HD7U{[Pgά3V{jNL5T&?ZYE܅j-NFEݻ8/GJPA q3#/_^rip~⡋%(Bamu!Tuy|WA"\lڌHG]$4s 8,4/({x/G# hi6]5OhYrWɿtt}H/}YIԍXt!!#XHVb+EZR{r~ FS7SRr3\>b^D>+btV=T/G?J3v,`iy+蒙Ը+5njK{"ݯT14g5i@ÁUtW*Qw5w|lݕ\)M,x3ھ*L착}ASUڥ;*g $ۑDiW8Q4 }u}Gn$ 4N2Ϥ}.T5V=]W@tMs,JQgn+J+=8A^^Z:VWWa^-ȓ\OJ7e5Ś;H jM  Pt&# RJOӦ+jvj< қtC ĐZh+d-OKʣme7VgRX`F0. 6fxŁ5A"(\gQ-s-> uA\W7e0^cK6~ z3,` R'',mV2`6c/A)pdמ<JvN%\5Rv/SfA- ?>p=%D * ~~GcĔd}ɞ! qNJEԑۂĽ}x+:<1LjE9#%V~Et~|(&s1P_=g2[k9} "1/b k/u_ǟ>=AG- j1VX{6AB]beY9d6KK6.w[6OΓ5,y4ҽKͨlL]{>YG)w NW֜hg\tjx+B^}W-`gt&c{O>z {rW|s|n\D^=z42々4)%_{;o\GO_Gt+ECI}dnv^dDY^g?>Kx;/bw{nvpp!qW&ot봹ֽ1;n7\54NyKX ̛Uf`NX(Z4XVXȻ޹؃xq+c6jLRŜkMRgIFfUN-IJh<>B$5!(ũ2[*;*{Z ˋ0S 0Bwh-ΜwK6BaGя.cc~x~Xb4^5FqSVK_5 ɪO>5G>~ 4۫Yw2(`X&*nZ7="p vwXuph33[ϜBg&7vcak2/`}_AȻqJKŶ9l"m^nϷ^K{a<'<\vδp:Ji}P@ЊZ~1\:g8:v0<>bIM:cdp$aÆb3BLc$kۈ}B|ŕ7)QIgrT -LD|+4LmzQ'$ʁhBMLg/Ÿ* nܸ7|{猎5zcMYBݣ8a`C1?Zcɘ'}<}&WC]SpdCXrF>؟q 3yd|@MGnZPjUnKиO͠v4 w@eA;r9u1fqqkn KOq izͰxf ^zEtzXDA,_}Q?{u.K2}@C7}э1) y\bTQ&(ww}S.9ϳk`2>hZۂϹ} ŖBdsQ>JlKpMRkCm.dq}8֋'O}޽WLk8$%kn5[Ǥa[#*]x˩`չhݬ3J{Wb“uF8(\4RwhȭN~7ͷI %ZbQYƣ:}:{6lB c&z ΄w/$@3sC =,A`&A)Q$d}4k9cJ׮2XI;'1֢e%V^9Au"4q[ -w{ %STZ6QPpӤws -I}hfo.myzQNS :L\ɡ*3GCIT`Sg `d'O_K >>L&6#cXms\ {7SpBoY)Ay^js&lS0ɧKz-d1+CRL HTUDLP!hX?.._W|+0'ls;9W=v+x},^8>ye/XcĩԽgqp|[o{[#w#!>}q k]쨥kbF]J6OΚ9E*_{MXFG~1ߍ{+U@1Tuvu䁒zu o^?X[^.9Ue7N:UrݹM>v$@ \%# UyEfAi|ϭ.7=IR;ժg~zیO*Y$'(̙xOXgiMǧ{nqyMQ:6u}<=t<,Dt@B둖=e=x]MX2,..ϒP0'?'GdJ1uc %[)p])tɡU*iqI+8D Ùv˧znHΝә AӼ}rټU<`kQM!5pѢCF֍Ǿ{5%d}` qVG71oy?ƥ0ؙo^`|u_y1:fw1Nz0B5!?u|{.~a&26iv:[ۨSloBYd8=ę &p7A\5J.P&M*:6nDfdxb?$ '$׊?VnVe,QlJHFM/=<6ְpa)潠s5e%tU]-]( (d@yrҘ\.k $cz(\1ڱ3S`\4p)qRM~V_qg{dZF&UUAi>;̂[XvtT0=Omt k8g9 r>XA:ZףUQeEPn+ 'l VN(S'厩#y=0>AZcJjU0C3A䖻Oܞu[$nvJVS9jVdUιTp6B@)Z)EHe(0R+\ hk$jTLɦ4X*.v Ԏ`~tMs?lxO_÷}'3k_# , 8,Q0įjﲻUoJs^мTVQA\PUԳ<5:@_b vqA70/w'q0}d=o^qSX^]:/^ĕMfmev]66؋Z/?;b9@i>?|}G71WoO 'Nӏcio4w?9KgH<lgL IgFmf W,?d#np{IXTކxRՄJ,LĹgSnncr ]Dɱl{Wtzw9f h_")rÍ@)}yg(Gf!A%vb~RSmϳR;1 .͝aLjVs{V6W߄_^^G +ٽ>#' sфa򶗷*}_%p`7v2%QQ+Лk|V5p ^t}V*RPp dL r*|D# "l4ڇ',7\@c&P0E7 =jY8kņ%$.kvVESkpmQ}t&ermҥyE'Z_4q*'e C[_v̏\B»*f6{s|Z$)̤lMY~_n*J,Lk8@9<ҠAv$"EAf5ʒ fLv$9mWP&֚X™<{GD)f@7=L>lg0 _yi\xa,c}Y5EͷnrHN| KxGztp~:rq=Cg(zN-,cG\g s [&uaIr^:Dg1^||o +(YW#0- qPyUAe†59jdȵ\Һ$;3v:~${2_e)OR+ *X\{bw1JWsRPKVWP% DxńZɡRYPʵ):"̃0DB6umhf6Njj$U"W` dCf5eŜzik+ \@V'{cE+bH0PPd==jLGPR{^:WD(Q-_7F.GNTLXFC6$IHIEͰVL9KZ'2"F+"Wtrs!q K0v<[267G6jVe*:bMgexb6| V 5 A.$w'W@eIXu+y-"`λͤ[G\ '&K-ߡoX' NF2sv@hs!TyHjn %?7J?ê9bvfi7C2vgt-pƨd H2͊\5d(`1/ݒajZVP`2jCaaBȭŅ%*nTT~=,/.kl,1DnsgY_ $--/jt 75H!㊈Zʹ9S&Uvq<^xyԯM*5`:D?*M6PL.H "OPfS94<ƦNKɄ3ΖQ /#n`! 8`mnY,lĔ +=#wK@k3u_̕y |:/4\krjAiy-̶]BC"D)漉&3P#rQ48 %Ge-A4ќ حyTosL+}v?u jg#7ƻ'x,)>yi?e^:ϙ|(+*M6G4PJefyt !_L-W3IJT XZ3b=XB1 w9N` [=dۿo)mXR_N\kd?ۤHyp'On_]hs $-2O"DLfAQƐͳڥ5kG8.]VPWi]8iJ:% [`xL=bL +Xco<qQ.\de?}p-=tF!&{)`SO𯈱M߻'_ /'N>QQ՞dz)N1>я0w,U&Tj M Rws+IvsQ㌡My&hy~=Bimr jt&+PF/kh\E_pgc=w 8ོDz&F(N yB[vɊ~y^ϔI޴]d"['+s8z)KƬ2c$TQձHdٺ6KZH/f*Ŷf>dP׃?}fzl3@Cm԰ W0639G!ucȻ@3^G^EOG_'B3( Z}Llb:'{ÕT(rPl{EgZBʑh8)mԦy#\U B]zj=ZPm\`6duћ;'#9; L]~2o}μLY69g}ǏZqH,rXyu JQy㜘 m|g7GE7> d^Y#@XR$:/ j>+dFk=A:EUrcڽz<6g/^,Ըx,x5zpxGB@tO}x4EOp7[=}s,n3Z;g#)fv xwO~G (<ǮkB1&[d=XЬoKbqRN˘Tu3OѩxsG?`6haϿwp~3OsLvvj?&B1;LϷ)/{,**àsa{:L#*Ȱ+̙jTuu ێ,>z#VXC)'v?/:@]Ԣ6R951sLznP, m''3ф2SmWSgRP-꺙YjZ摆6yHh9t0ֺ@mlD}a{',& hd=? sz~?ԤHO"#C1" uy Ivq9+*)rX@#Dnۋ+]ԶTQ(qF`""PVȡ.&`g8rU#; !m7`sm6nmB=-qPS8x+8y7{Wb71 q ,_Oa< c,O{aC- pk|_7ݏum&l'?r.ݔuֺtDLVaϙ {T;Ra_`x%F:%Tcy{mF3wG_,-S?:@UOӱ6XpXã4|¤x V ~Z Wr[AN4]L ^#SLܒVN4r|1jcoYT65rZ/ X  Q|=4- Y|EBc,SWs[{>ȃ%*zK"VpPK-wIy1g&w\Pt*6Z1Kc1@pV:"oI'*Sx?xmF< \D;WzxvQͳV'gj%bt eo,o6,PL' £el5]NiЮFL>Ɔ)IN['q?W,{3M=3PB`MTZƴ8͹»ɩv aFLgV[B];U3kdNwZ3oaK8W7sۓ۲1Y3,y+klȂ$%D긑LԢv_[]c԰sraoXX_AFjI'k/:Guc Gw;\3)0.bT6={+=vq~Z;$ gCn[JwtdIZ :(jF4-gQ Z!Pc=DZ6WiwR H`Y1$R(ҟ sJOݤ|iG1PǍTW qqJHͼqˠX:JW'A`bK 2PkШd2ŘMT3Sx:~'zrj⟵ѧ Pחx1+h0ih ^sKrV]⦦* %ۀS@qf[]xu{^)%hFIJ)9bt7?õ.O[,ДЩ`MdAs}ˢbKKEfSY KguڙIl_J6I|DmOzQVDqV6:aQ`/nmI W O'ܺڃ|ԩyp} ;;{xs&x/vfmcll4c-z4Q(Ѓ ,ʲwsmD?H%ßK}CowzJU00`iHn@BsHY`= sE? FAb%4O_ t>H">|uXsfU<{ #}.nxx8pģOv8Mq@ c9[&)k7hvbUfvDyc6ܱ415Rnu@Ɋ&pJ_40"/^%[:Q511jdYc(3#'(U@ȘSTa.lX:NTa%FaMUO%Y]BmaOdڪN4gg@ ZZӜ@= %Dͮk}IP_Y۴_ntBYh"Zjyh@F֦da$c< a!o| #L` @8N9η nM@6rw[56]ⳛ۵PAѽ7cJ_KŨ=6KirZ1#>ʄf@7ͭyAa޺uq޸3qvww\0Q.\:ãO|8UAe>p'u ,PqXހ[sXĽ~_q+:}rޥoW/w~=W34V3%|UKxQI0՜1F^p: . Il畹־7џʉ#'Gw1=>:ޯ"ΏX*;A51Ej9tBqU>-diۻdx:YZj{oNM -R.1̙I` ޛ5[r]gbkEevɆ*ʡ @ņ@ -LJnK&ܣ["((¶>DhqfNnN}kM/5v K#מ&Z{#2\ݡ#}htP ҁ:ELK |C' +q[F89ɭ|OVi:4~uS`4 mRHU`/ | F)'tu&+4$j~ )M}'A$HRL48)'d  {'ÁLR6Y`3~v9s24yߺڣ["[_ g3@5O,,M]HuXuҡNjG96U3"F4Ws*q cȼ}DCHM`5'B^3$sqq& 3%F#IJ=;oߺ#MazɽTJ|$gITI\I/D7+63YhmF:O<_7?)o]w-F]Μ /ХKwO?MߗQ>u[sCa(r_I8T Xq;MnW l It';ǯӅ|6[嶥\~V0dKCUB<*y&%cí%gU[4Yh^YK5>%8 K$1!l-I:.U#3GcaX/W;Aާ0?;}#FFbbȣ;_шu*DE^92KRdU<_k̢}29u\}NnG>8gӋK'Nw*k@ԧ[m43zаW^zھg}iA 2nI|>>CU,NMSӉ'6 q}+%zoP}ˡW,V\ NU5a,.a(:"G*V(vmflƌQqGs gho4nT^#vRF:958?8h NHGW̎Z@ΚJ[ {D8_I^H@ ")Olė}mTQF!1u#vLܾ.1Oȡ hS). hL$O)1B" Ds$ '0LVYL7<*<>oή"XbF/? ܂"Z߯T)'G՞d|p؞xOLz3&M,Y6D PHdڕ=ؤ k"=LN\ThDCm!&C~2z:#~C>(͹NíVP!Axjyp  !X1p%9[/TcdҢ}M @JVg<95^=WpmQ:531} *K.Ic3ꠒmJG<.!T:% eԅxt{\QKO`! dmɵxBK9!$j-Eh(IU%΁\*:iI~81Ʊ歑UP+W_x>z I*,r'8żCT_L E)*BYH`YVQ1ZKɍ^vџSMAxCd7E U7Dj<#-˹F:H z-T~yzH|Ϝg =c?~֘5u*>U[0c/4lQlVKx9'$S' -eA+Q'MHL<ǒ]%J_щ2Rs9I hd*LEIV!Wv<*": - tp6bbL܊dmLa3\5ψD, G i`aw|t; 3kC+$CYm:%+4bSV@BhOinc.VRhIA98` PyP!$0dϭ9)p:xߊMg$E6t+&+9:2WM_IFi>;|t uriry/i}D{wyc5 P1OCCGfZxq5rºoro{[G3>9Z`)-l&}GM[5p܄B;EVĘMe=skQZCQxq -UUzTn.^YVbxA uN:EϟkpÏoƿ[ͳGA\$2%c$Z]LF*C#CpKb+w6{lZ1\ZZ x~#'2@XF"柣I>Mk ;:@j*LMSgD\q@"şo0yM15h^, tS!䖠 *N%9Ϫ"h6l/%wm]~uF;x̣(b 9@Ԁu_J}0eCs='YF+n@V& i\8 '"d}+P>9(‹j ,j--jt9[S$v+RjPQ.YbJ Pbb_N~CV5G^xA[ξJ Gzչ8'qZ:W@AhUнݣ0Rq?! Ъolvx$xb,?[\܌:UH0 x~CLO['ị~ zww/ҽwMo;wNz:y,u"9{ڍ5݁vZF1zK:WK^$kL9 ՞}Z,,QA [3Fdxc/6٘Ǯ &O&6*-ta'r(C6[Iz ɿVߒ3bRtbDM6L.sDUB,0#šEجK43 0_=OеZ/Cr (C?5p0"@0Z6R -.{nv\0[Md8d ѵ#[oտZuayMG({wn᫼?'L|"ǨT)_y-ɦQ/t!JŰ0CiͳmC6-u:%evzbS䋭BrkxO.cAX@=q:Bv!ݐYTjh*X Sf/#T!X#[F;ʽ $%_왳gcLZ\էw3Y:HP%18 s+xi imC3jqљC\B<*ϊ?F;u:Pt^rB%s.A.9gD@d(%5!PjJ\Dm^ Q;ׯZtX+oM Q$z%J|K#dA0%׋N C(aH4S%NQ3,F(Qf=| zO1ɦQ;Km4e2LyaN%B t0ʂ*t`PU9'Xy&Z5JȲ:.%W;(Q?U~~NtӴAKm{ .?*z]}G="zhR3,1Yy 7Mq!p=')y142e )h@,HI|;q1Ӫ4PȎG\ܓ͘ W\V_u} 1GF~+s"LΰLy`J#2|/ :D /1T$G H9;,4$1iT!^6 I7%XGnOgۥxIDiu`$6YbF}zs8'_cRѸI$J\v`k}Lm GDdiLVzJp} n}p]Hmlnu0!5122} &4r00,y#Y5n6uk5՞P{1JGQ`gx_?LL#zi҂`U.U(j6n2Wj1OX89<5#~růPg49r4yL+`I? /.Os'4__sk荷.Й]ntTd' sgJ~v޹H`0B\hX}Hfڕm/\(Ntyis; ruYnLY"C?􊅄:!Wź眗F"U &0vĘ!@y!c,6獒?؞y \GL)4'qKy>*S#NysED5hUŜ8&*dZx뷕I~4L*EQ] O ;e /bM7@}.J#' ku$@T|M|:PҥJA4c"+ u $5#f?Ύ945Urq8ngŗ^zym|sN?Ol5ZC˽2§Ky_3KoKҵZuL"ZU$4B-$YLw#"܄Vi0Ӡx5x~A>:gk@ |c!#. N F[ؾ[F,C$94eqn4N2Ѿ$WFw o-Ki9 Ok/}>co5 476bW'JtbԜډ-?Ϳk\f4 z1?'@7*zN$0i5"I Z D]!5$ƃ^(,x}VW,D;EUn>$Ϧ=5eJtРfכ?S.d `ȓNz=9 Bo`0!%n@L̦m6S#l3g"hrG(|-< Ws5h ?*?88D-Rd{ jm_{iXţR,j\S4Wwx BACRoP`k{MpYdd6*b1W_ӞTMTT~s+UT̈́beY,&BL$OZhY w:QuGXHBRFQt~b<DFWEO<}WhmkK79".xp wޡ__W^/}봙:ukԞ"Ɀe3SZҏ~iI_ߢ6m_ۦë6hGYw)sPZ U3qId+cx%0m5Q><[o潇/ I& |݅ `󈃪9ZXMP "Qv:F /|8T$²H"YHĂ0L{ٌ63cw77UOz}_snLYf~y>󪶛# k_.+8B)ɑcG ^x3)nHԑMm_=T9>'JT!1oW<zol7תIB.Uenk,D1I#K4hb5ձd̑49J6y,O c*$0ZIcg7Gh6(uM5]%@rà`_M G(VMib>- 'DMP(e(J6_T Uǝi_!cEP߾`loN$Sq咾+~:yN=#&&[['st{OdOkJPlgֲ^mmҩSt@WT#BfN&fgZKfq ªfp!zڕq>{m0ў n$[oρGZ*HaLY#0֛P& L/=~[ +cn+s <>OF`䙒" p/r>zǍ@_.&,Fv%xՑ*(T5M !T׃P#T&6pK< x4!=kހC̵k9&)IHA2B 5Ū 8!S, 38!Z+BŠfW#~r\CiKWlaiCG};sTet21F{*=jm%xS(H@^@O>h?)oA/]{ᅬ~Q}ů^&YN~Owi3}`^OMjݶAU6ӫ_Aѡ1z&S/Gv (@= M @;o5Lƒـϕ Fm: NHYj u#-ﱃ] @:;Zѹކ &+mIki✋7.0DV" | =2M%A=E @T䖄: ~){%~}`78zNEp9}},d hqD5"Nip2 {Aody`t#TN̆ ((4\@kOyK Ok"x sǣ=w?cS 9h$㯔8Qf"D'Gr'6Xޟ;U%PR^ d*2P-+#ÚJ˕0E_A1\l'ܬl`$(Iи\S!6J H{Zʉ׷&[dmvS?iHBu T0e4bh'= !lIF}W{ ՈC?%hE2j*2I<Pe,(#'5RUZ9A~H^ꡅy#T1`Z4 Fn?ȑ;)ʌ͕YKo[=ww]Mׯ_7NL \~"}/EhPώz@[hogGl4aHy{{~?G[_ li _jg?LfCj;;K/t" T1FUwW`Iછ7?ThNL7Ƃ$vll^Lk3ui,ڣg 7~[H<ʕ|*l ^-BVz\-{ XlDYƓX#^G KBr}B{F>>}6xƒxUy/@$,\T[lN.HAAS#82:zQ1aOO64WarPieKS`>λYnD&/Hw5۷@:~3866%Aؗ92ٳR`ThseKFkp&cuلѯZ{Y4j,ȀN)W(: Y*y]mEp3X$H8QPCK`cŭN)ke#'3BB3{Ǭmh?^'B+1;LAs YƋ ̕?QU5TkTUd3j:D |pzC?"@ j|~&B"B}a*atQ3.wCDfP8FULjtK2}+ϤpI&<٤)m.iD4"q@9Xt$tb * ((3ѴC>f ')5tbcYd2h< $T dMw+7 /+Mr>#rYSFR>\ɢ݂ɏE8 `J"EyZY$8t80J"=hc4UrooLHCI 'W1,-kʑ'X'."iq&`3r5ax}Ɔ*D\6|mBA.]Gz]}UGf-ŵg"bT5匙~w~BF{`%56~eG6֭ͨ4~oAkXz-4hؘ^ X #5и dp!)´)/uʇшzG[ASP})R{٢Pa&_s\EV~b2'T ߉~P%X0U*XnG#0z $m4׿zpd-n#D:zs~c12CHt'A7%Qߛz4TVʺz VV?& ԉO5_!j^Ap S#5IRbki0AaĿ1}<">q#y]$;h18sΫ|Pӆn+C&'NKHF0=ގ،oJbjB6j޴?"sc֟&oh_,xOCmGzHNhPj>4H#H]㛍M pS #m,[A(mFɪ2VEwdz{3GfiY?.8 tkإG{"Uxg^u(G]*'+ Zk {6 tE߫.D58ɬ7~3ӕD7@1*o;0֏+ŀ6_A ڎyjozOB&4G܇&?!л);Yj TZ<T0#89w" ߡX^Lu#0iϝ+NH/M)cqxA\ $|!ZʙF?0Urmk*FDda1cdE~zzmO<~iGkF/Q6Zi68.ۜ(|Y7 k|7d<8>U nI|$"7 _eXy~xw?FViQq#vtQ3 #YVl4M E}! VLKդ ̝tŷv{&hJv;k5ޖSܙ3mآ3 ̙3oJ ]ەѽ3['i5qxIZ?I{&ɂ(Mٺ~0:XQ^cF*k =#2OʇVcP5\Sf׬8L pB,q21`N+aw!x,L9L=X!biMPt]xMNݡu 7# q9 ^# _4A$|ElP y{n<DzM2 79ZH?ԌHȔQl ΈbbrWI V55&iU #O8)G=+$6Cv8UȨm^<&/"M4H)A~TM TV=J[s:Fh/f8y9\ %Г/YuZTM,.}hɄ8 \j3}H2tCBї}ׅ,!q=mvR e-Us/+7=>wTA2bjɖ'%i F[Qy- ۯ=z z$a(GeR{ǮVP X+`9o\  \uFn.ڧ/ն00OY&lLjGTXUy8q\G7{E/ovʈυRVQ ԲjiQ;_2π8\tGI諕>O꓾$%(Ԏ[L*4n2"ğ!^h6Q~4iɷ[6 }F }C{w?L/zdզĹ 'O,4ұ( )s9(@{!%GFH* (p*F{:Qeڷ VX{j$2W>r\".a48` ǟENh]Rcr} y3ov᭴J~fVAd3Ǎ9VŠㅞ$DTY;z:ֿ<%} be1vDsP~xtb¡"4gZ!BH\\2`ߑ: xVts"ANc[!F/`q@kuM[OYL/=X[}a$Ҷ0GN8NLK fߪ{TP Qس  jhKk A?;nVw,R< ԙ1XR=[EYKm۞Ҙ ah?tϓkQFFZp\H\%?s=N|)x2>Jne*kcWCi%`@6y] J BQP jC8l6@`ZYmz$<%r/+G#co n噹%`_t* U0x{m!(5ItG_trUVvۯk;[(EϹiF 7_uvhV̾`;G j?(k,АotK>V׋  x/TȦx)ЩT""L&B5fUbnt, 565P~"tƄ=THmͬm1ѩS'ҕM{mooN:"xؠ3\Q)CSMu l0X֪XyG=[Jln] ( ښlPm"qW?ޘfA&YD力k h M0e?%S?!G|ddfSC&2ҪVƸDZaIPk@KΗ_#n@yN͘$_KsDM8dgݓ PB)%We rt6tǡ`3A'weҡ5!ZHxga$ P44D/eo:! YAR21jK7T[J3sG}Jy[G&aLٛe04\K@c{#Z%spjHiP qn18BEEpFBa7x%D7ޏoH?8&Gݜflcu3z3mӵms8qNlm޾Co񆬅iؗI3W M5IHE'+ڮQYsIQG!{+.[yUR s?\ LBp CEXfɂ@bJI*{++JIV/N5)gGT*܌&"D92˙pFhf& )(}nɈb5)i^b)"t7'S|lP؞ݭFe@bW.S~c ? aSTQ!)jbaMc}5f_PVc-X/ϖBLWb0m߲Cז@|A#V0 䪹ev4o P4S2]A럽nzOO_z_t)!Vo_PKɷ q@z{{/skTm]S -a®y)gЈOXkۘWc?"̎~{EHQI`RJ _ueo?{t$*ٻ=0/__F @A'Vڟ%SU*yqĶnV?cnVba ;)G-J(~J[&r%#9&#qʗ%SG 7a3=ny3s8̖>08 =}A h#GDF LcYi@lcPPq`jd*L7-uG/YD9YXId(1T\CGk*Ҩ\(q&Hh~rC:*XyZjᗏ9nB7wwn.qt]f$Dk',%NO.^;%?yBg7OK/O m14Y3z B9(;euQ*XjJa]5J@o0F󦅈H2]_A+ 2*ު&2wa*}E-_A|N)*DRM5< ;;%"#_Ǟ),I|K;]Hmf 9c'κ~ O|z;VUI<դ}Zc.T> zWX=J;!2ceGWmV}Z)rs A|(b8@߱BtIRq<RGkF k>`hnʾ.H}xC#JkaWz @.hx& Puh 5 }EV͸" -%{D㽸A~cfIp0 'ϰRh\1x2P>"EĈ\w28o@ЁY_cIL28=1 V$:U_1]j0D2@A6]$5cְ$TP&K:VM(\Ѯ1ݱGK=æ&h C$*FC44~8cϏ$sIro|/2=j pjU1#sY "mݱ/cX^ hh?ErWje8]=SY%Y8b).jy`)j#/j^#f@asb1⥴7v@Pqy}BIB2X0/2qQ3g6g\J+ XPV_]$Q6b |z m`ƟaDA%0)S9= X(c& ]b.bw.D=H~y259OH/hxSܐ͢斐 Shte~ߦ+ڥ50cDuFԄ4In&L&JRF 0E0騚M 4kXUM]47h?r_%uf#-$52{^-8uBӲgjו'is>J"E՛>wTԲ Z #4ybDCź *M k%?[j_ -ldz\;l:|Tw?)3dƒ:l&UC$YubG}%(ϳ,dޟdC~NߟH PRRw{ Ÿ'ZgmiDe hj q`O U@ŖpA,u@P9fo-l0ўnTMCDW*AHo,d6>Vm8T:t.ܴȎ:[tOew[?v a>糚I!e 6}* 6Φd?qc>hȑ^{X+`YUꬥIl{N?'ZYdSQ ˟EoήFss,:53_ngis"V c}.wwQA7:GG.8-zrƪsѣX@x Rt1XJUt%U082IRΖ 35,,*b*(Nj$IRAjrpH6__bS>xs#\UQ}Je\AwN'H:*`p7d>x=O,%PU2#Pd! EBŨEI@ ߐ֮%ג'e%fཀ'0(~K?q ╝?~! bH ^a# : @cyv,(@ЋnQ< . [ ݚ@ @2UGYf/)bP U*i9 {uq=!TgF@eXB)_K.5-vwg߷V%@$Ҫ:uwӃ>(6׷E^V6J[_64mguϣQmϴ=/d@Bpz#>^.- &GsJ;ky?'9RClgZ~', >E/aR' MtnEyP0FXn&'+u~4,#Á[xn0ވq|́\¬Q=Wa%pܥ-} j89ڐ4"õЦrI&OsUD(Vʧτ͒ɦJ<&p=i^@? ꗐP|qB\?t[?}5_9Z}϶ WlMel9XXf(Zf.~׀~8؎v JG  ` $% 2Y'G4( cF[u$91%j\0x`!RCPhbbc?ǘyミ?9ޛt6bKNJ盱-sL XLw <-A{ +rU,xCg[%[t3d),ukV^iHʎm,$Vk":"eR:D eI+{?,+r.z6ā0&qoMH(XgY$M(l-Nʂk IDAToCp}d Tޜ pP#$CDSDH*غOu]@U%mdf~ } 5hnbi%Ip)Zaj;gДV.j]әMU J&;avO4H!?C~M(*\BhUCѬm!x8$h z84îWk'w0 N^/TIDV *!X1zm|d؅|8tV54L~{2u?f⪘LܯG%.>J}ۑ q$!{,%/nZ=Mb6`o]{_|@Fl[{8b}`yG TkE.Ptg/SxskW?F8\FUꔬʝ+`F(I՚9@"J 5 =WE"-U(~ Vh%sZeKgb'[`o"3dMlS#f-"`k.{5$:ɯdzPKP0Ka—_UՑG0oT/[#p,lfz!˄DVYDA?(4I}7!O -D.0`rY1ޘ摠۰C7|s#T"c*i&Ӳ_H\Omh)&Sˆ@vF'嗾E޼ (V>QJ2|Oi[o+ٴMcz0apzлEp祚)h b$l,`Oct綀 byhFqC]*LV4bުZ@gD`sl&Ng1W`2?>)|| O M$e^4PzatTG u* T{DфLp>~;#/p&?/BǷdbhHSO})zϟG)JS,2qe`EĂJU WWkksPg>&|tRc ZTMG zD\? Ւڧ-*781mQ։  f&?OsЏ$Ӏgܥ<>~BZi4kVA剣{V՟vx{l)b6ԭTQ Iz='j eX.t{Y7\XPQXˢyƯ~[ҿ _~m멓ZTMA$L;pH,H3hkbqD"PEVErFc /?!8BC "pVNp}譃d@ȯgyQ^5%띖A'7雇i+e' B=8kU}+'P*Ǯ F$9Ei~7D6`G Dde6On{OSދ6>O'3YSOxU;Y! >1nߍs@aOJ@7\ I%ȓ$x"to^/g;iwXsJ to ؋2\]*<1ܵ@!?wIXYPDxh2)$1[ߕQτ?yry1ށ$w`(SP&KsX?XurQNJȇr.PdDFskoT% :BV>qq2td(d>Ltj[Qhat1\JK(S׌╻YE5p9̷0Ns< O~8Ӈb01wv%%eOWRO j9% 7#n77/K%MTaji, qT:' `c,hόseǑJ3RF~yMyj6څ (_Kx I7>#Z@Cv`aMpq΂,e=I$F _5./5Z^Q_؅LQq'Yw\@qs66u7]z3wdx}oґeYf}3eq~ni/fMu ړY=،6@mfֺ1$~q|A OV]&X*X`([{FVCH`m.fDCBНgm~oq$`VH 1dt:ʻ ) j2̃Z<'e(Nk$B LM͠Q!Y b;ίӬS :Ƒ}.ٶ 7sUdq'?+W=2Sx*,7"5M'DC(|h^UPOL<"X` czDbS,Mwp;sޑ#t Hyچ34<Ս?rP8ny<y]Y _ MMALW0׾~5M~JZ'L `όQs-9фyh ؖEbR k~y[dӼN@w<+ˢ"^|m'%!^n7>w9"Jʷ,&Aop  !B”^8D#g:T0`&^R=c"pq{Gׄ(Y_#cC=FGI,Nac\h[4e] ;SZ|Dbm|?Oi%AXP& c8aMU,&k_`3IMTZ&׫Jt8'eyΣ,rW_yq&O7%C$4# exhN[/ͽ C`fI.[.R51D즅TK_Wh1049`I':fVUӔodv3?82"<,2P-ίKBow]ZՎٽ}r/EsQ̆x'EY5";~ 5%(|t;J׉K׊3ժ )8`,'(2mo31ZY*C"孻0(cD3wXH[23_" Ф?(2VB5^PsқY uSY$W&u`=-d؅َ͛d)٢c5mz|kW;S0V9kϳiQ+%oPE 5Ț}x,98´&F1ՠ>Zϙ9c<LVV]k81&?i7 +9wgWݯ8c_$կd|Nmk֟a+,/@~:oBb[AADj) v )`gx\*;&] X $r 3}+G[F y̬#ۑD.)͚pՃ t3(V 2jH@d 6 ^2,3*p_-:4} ?$Q.f@^lJef8fQ:jM &[HgƄfiމJJ:=:9P@|ݎFꚳ9r2.%^}-jB(.h hL³LGD˚jn]IB7eHZA;WzH#a4 U:sTyսJP(SlA@3>̏* NR C@'ұ|I!'=4Be cG}"^&&!ӽ7F*9N9z:jh}I$@䜨kJ(tT cD)w]Q_|tԀ3)ZBCt^aySx?y*;fؼQT?vT`r5_Je?W|8~Ԏmo(9 -QNZ=ysXGy^Ni#$Rz |U٪2ǾiGzCwGt|M48S;󓠁 5)&g_e5̲YQAvo-{k"'*/I"sly.j2f'>k3(r$R=|Os:/ڇd()m]5H{gW:%,APP'K0&m;کHT30;h#7NQ0¸_Q}@Wd:S"/ C& O$r0#@=ZwK& (ŋn=vl:Һ}x?П~[tZ5Xз-5uQ*H0:X YV8,9g`)lmwmB<%3wڵp怨NaXȧ9{ʫu n2_C]ϫ=s}P`L2âc{(Ѝu֮ќ`;g84~j}b.f1W'<=̗5fU$8¬tlAZ5ԟ0 ~łx5(1(AE)Ax Q %+^E%Ӽ84y%,`T)SRUo>·9u8e3+:r'[ s(ar"}`T^K,ox c<9Cph#'w&5B#S 1;׊4m?'AwC 9`%% 8Hbtt9Tc)qW[0/TLf9󿙕# HWN[kl|=jPpoDh_=}uH7W4*(Ȑc`bEh7aGc&1ȴ]xTckj޹ p;& <%}M8$w̓-+{NS28{ؘL\M*=}["("4:MC>'RtǼ*㴵 h^}//w)ƺn$ΧsҚvWF>] +[L^Շ*pCUhټ~z'ۜ -Ubk z*,>$HEǤԀ7 ;#fZNȃg58ia`|n}㾐̑`ԁD@Ou;vr gVptkH\zJ\'8]>D ,1uuSЭuvpbi"@ 3xv"zFOIan)[dNjfEhټI(cBkuw_?th_dkyQruvܟʴjtCMi #?*r M6| ߇aGTh)NKġatjH>~/T~bfXV<$*,"j\ZҦ4&<<T]^U:OHU.ɯؘK׍5^M`0,7ZmgY:6Gj9H)ZLa9QJsZbܣyM"XRY nB0]e]8/ޒ;qtKOUg{<2OH*YNԍB`[1W|#Я&O~AJ$?ԺD,̍*Qϲniv 8t$r&52qR=Uܠ} ]Y0PI?@h~._>lvyA"_NNN CYv jTO6ixHps:%[ fIhUsiQG^g|W)X[[w+qa/vD6Κ${-X5- ;YN(_W|xKK[[^_=ʣ (UzaKll$Ǎ[X 4~FA'fehMWБ4!D ?;_7, ޱYih"CLysqцJDކ5N2$ggPb5:H2#ijī|+@#9zujØ '%Z-lk 0H!gujϴw"xN5L*#IT |El&˺~RLo$q-J()k{H|nQѻۢ>7oίfDEAi ʘ/y8 @#,Yq\1́9TAu% 9s% <9;Q㕋ul:"~z;T}N\-onգ[oߋ5AgH9翦;R4O1^fAw2}r_ھ Ʋ@D} ݆\PkgMp9ndgf[fĈD1i~npZ⚻!@Ci6[qN ;r*4 Ф⤨o~y?=k BfhHϱKՁyUzzd-R THNcQeLU}k'r-51;oVDH đۯ>}{Йd$ V?g0jT*}^h{"-2S\DFg`xnf柇 ?k~N64oX]p| **󞀆8la Q/8 g?:LO@b9Ps6@-xW(ȣf-t|+~]-GS#eviӢM[pj#U*{|83{fNc9Oa4mT]k%zXGy8NU>#d=[o g_W+g=/gpkb_RD4W!# PPd-zJ*n0ᇧG;h70c?M!jAmI}hN,֛۲Fm8r (.UO=OLt y' py}ѥi!+4A*|X:i=oO_iM!TK5֣Q`* =*$/k]'Pӣgh ˭qmޫs?ظcFj؀!u$RD/*>W%[ܖfD){"_?_u| v5gR=ܘ b/Rkպ+Z<|xtjó,O1 0 $pā. io#.];Wy xڣCfؒ"D;}̯ d-nչʶ,+_tE-ur'm~2?^lMl);lyЖ*@a=hRm@MmiG>o_;qJG~FPf_hѦ߷ӤPܒV~йk&ePXAA,iCyK!.ǘ c󎶭n.'EB95.u! $d$'DK^s;^nEP??w%Q)vhhf~ 'pNأןKKF_J7wf j}$ Gi!:5FW`T(nABlfp;o.gWC"(s "g }s>qHDOp!Hh,p8J(Ѧg=}Ѐ=7B{Fzȭ] :Wԛ"ltDl?MQj;w}VIO{/> yK-bO -:tPF%%;ܛY9pTCn1V<뭛 Pt2-f+psk g@Db'``w^@+rL^ %L!fQe9t5k$ yLrbe(@ηwp3`?K.i팒ŠG qbBo0uu9:38Mt6` wSiR@K tr,>WϽ#?c;q}TȾPm"/*l[8ґhEb&j'{{P98Aa!.jNCi,*HNj".'-I%.'P_;5dFp2Ne&wrf~Aˀ|{P}I^[dFGx߭-w[Rvd-MwUA<_ʎWpF)rm8ٓvLuNUWS'Wk,!BdF|3v|nޝ(۹T%"׽'<#Dci82#* oy.XpcPm~>3GX}³x:D!\ :`7 %۰v`[m;w4Ngt =\|ukV0*W/OZ93BnuM#FeNW}:FL> $8겘@q,R /&zqBNo#jttd>2+N݋Hd 'NXTTE^ݟ>{QA0O-@Dk&ޥòzXܥȦɵXzL?## FE#86<0֗); 758| ݂X}4ƀ0R`.u e}GިMMةO q pmqKU nϭu7O!Mb Iw=STձ\LV7@y]\մ2$-j~mX'HH%*_|&* {7y&:M2\yOH;{Mm^5^i/芇zmT>e]΢~6N)Y\/yl dUVL!at|AJ4q c}k[6ZPn"՘ >H~rOgzzt'ې9x75TcfXi)!;sg$y\ꁊu$.H;]Hg@y@+F"TҾX2U1=yZ7rϪ,[r#ӣ )Ykk]<$udž#[{Ԥl!Dλ&? ;oS7Mb duԫs?C?H_w_3x \NTW"GtuvדS8UpN/ @7%_An-wO1J ؆3-w>;8qנ @܋H8q1y5]űRSK>U激@sB b M(~;Qbh(K࿏ Q$x.x(C r=5L~JOfG^D_'e ͌ @HmuY_Г żAz=&lxvOp^̲!l`f/Ǫk.F%TxHK6hF$GdojsD-H' $&uHQٿ`Cip mc i٭v]YExJ:(#u)m@Ҙoxڣhk.^x~-xR3LbWYE [ y1*fj#b (Z4?b8aDoY)q`W\IKgEL3vMQ XNrfguu}vC~P5c u#+_߿u{JԠYLqc\XU0ʭoNEZOa@h 7J}DjR3?G+J*mO4 ?P^E3 эMYzŘ 6⦕IhOA$'[mbִ=0#+ %͙C_+pJ|܎Ԗ,5uZQWjfbʛL;QK+6>'fn@V;NWk_d:T(hZgs̊;"ɬb(&R?!̊ڤQ\fY2*V}ћ b!o[R5FilkwU阭øX/*Պ' dxcPLI9)LE/:ּ5f}x|lOz)Asrs[MKMu%fI.! sC[+=`Dm J}.I~g \w huZ'1O{mgCM{2@k?eFp1u^MOtAo4|K: Ϊ~tB"Y1ژw!$`jB'nMf;&k/|%n\C1˴9 #y%?R5ўq@@NZK IǢ|?i+I(bьX e(HFHé*p8|-|O}kj=8({5jb\YȆ =jNshqWH7Ni^<G'o;fӑ|7 Q >DSHe& :uXU Hlv=w̫ڢْPjcl;p"`*2}M7du>yN ݂3v^hLK~J#D|@i1޷y&[_gLַ=]GEC{xA[Sub>lwy[l^QJ3֍_ v\O&@0Ss>. $oYܝUK0œgur2GL:<$@_s1R4`Oƫ=]n0P3!2#bi(Hj _-ޡ[63.k<_ǻۏ~72JأÞ({jV3\ ƝWUc+6^0YV,$mJrH:>A`{Z|ޯ@A譸ӱCS6W78Gv+΃5@vTwPP͟ =uϊllA;BP}8!v3Iak^;:\߈(dGx(D_%G>gqx7)JYbe>4M 3iecs$tM.f:ltuyp)zfiN)jo ,8XTlO fN0V|5&8문{"'#q}ƌ3atcS<뙋/K#رɁY핋U;l+hսB9Z `U4y}.y9ϩڦgzV ^1RG8Lxc`V9KirH}9q(6U3`u$v踟BO읕x.҇cG}p_V֟vt}lv{vzP~Z~XA+`end$kOo~Wo9ʂզ V)W<15߀ ݓAy# \tjpj{O2yGns~ߖ5"EבT;zqˊlaV0:>UKY; Z;8*~ca JC;uEs~݌9A Dg#ySvr ` GJ87!x1#y}̆Yd]|u L:>*t$ Φc0vth6F{[8FIMMD> `\L)TȊ. Hf8`>SfL) p.o..rb;5 I u٢NߩyJ|߸ȋ(T~h:6n HΪNW I'Aiu {b  L(gBN͈ @rk,9?[7ECyqzMH-) 8nEQM:)=.ƕ-+и-KaX lP67ޠI6ebb.D׽5;LҾiGpzt&r+ Y-;8|%#oUϺt1;^55nv8uZ-&ܩTSLceMZTxjFzu] Xw PExA%.Qq;qܧwXWo[Sw;9}ņF!2 ON𙫙TW cJրݑ\%wOpw)T3@pXN^7lbKNF,.ЅNY+!pwl LN9%Tz%*\i/t 8>L!Eu{NT5lwTsuAd5oI(N: dizn|յ(R=3t?ʻ"sxn>~W}䥗 *ݾ[j^UHOM;%rA$;ЎVfE殆}m VdӪ~*4t1o-.-Uek.>}1{ #=ʹ 8]a[a`CIU)F6&nrKX& 6 ynmh=gȁa<c6Z""Y*l7Svk17 Wd'd'-Dxv ZNnХYjin%DsO_[üƩ\ۓy+.'谽M&uA,ln]N㎆,vV#]\i2l4n{gLgV5H0@l3mvL@T̄ΰgMuE q\Ǩ4JoϴVH mӸ^*[|l$8 P uVXgke Rl蓪I6vS6LU;g`Ę?gU5E0l|e&sx҇u>;dR!O}1s: qd%P`1fh @l*{RBo& 1Y%@Z xKH M5aq{?|765pk1{~89LtE*`-`y]Jdʊ7zRܭ'B8C]oȏ׿Wm]UNk <Fc kcKޝR'SihSuVɚ=lثˁ~pRTXm.ugQDG}}κ@_C\MmU2E+2Xk* {M΄2)GFt'ĥ=U[ڣO}_ j6;ͺn~/ߏ i[W',r6wRe&7~M@!mgΛb6$GJ=vNM@R>o-0g_~2K]`Vi_Kx~D[|StXֺ5ՂB4-!; Z{)`+(qGS,qr)A6Cw}/ܻ+I$\ ./f(ppvvFS; P%^upa-./w>U;ۀBI.)_$E!vxxN. }>ֻ~aCM|JnbMS/kà"^ɩzRs\$Xk*p7dAmThJlx{Q?T ·Ei5dO"K4F 6ugr0ǵf4m-dDD^e!{x|fۋc"]ݗN:u5pn%p FFftu0=-#/^YI '`;9՞]S3,{\uZoik{nx._}T!?g P޼AuH\Sz/ XMqmn[z hMTtHbF:s2 ]8JOPe6 jrpRz۞7w.f2޿ u&5>:LNIB9cF&5PѶ U9Q>xH#*b \yS]ۗrSn<,ybd;&ţ%ܦ3nAKנUsU=r݋4<}[ߢ/@7o>tQq&m&&lMYI޽dCnG K9\)`\tNmlJx(?40;-ݔ֌l]qwЙ=v\n}] ⬄G)o.A!fHG ]춾䉊w68(&2<ȥN/`fBIЛ*¹r\[ZYE` ,M}[&K>&F6}ܧZ|'a"K'UZfMzH߻":;JJ@qqC~~oYPvliyHp< F:+$Teb QmVI4#/[&5Z e&$Q2 0\3k9,'t& j|+`낮JJG֑. $Z`,y6* IDATA9qG2b <gc,Ҹ{A3fA¯H:VC5UHMbU܍(:-l*r(9:[" 7>ה[g!LWx'LR(݋L];?r{pgZڠy~':A;FgF(m$ S5*Q .́#@Qaʹdl 1~$G|H /T;@^=@ &7s'kW?˝g5\|Y G\2ћ.RlvG06 ol讆+YNSkQD&mt;ډv`@hrIsLe5qҌ̟WWYNJ +!?ۋƞ TQ GֻH~qE,R=|@f /n@u?dD'A#ƛM3c  5K* LkfxT;V 5l$cn\8rj`6SMi#`&UfB a1U"*xrVG-k{DFClgUc=~п.:J%Ukyf"YBdn%Ik6Z݁Wr!-;FD{Q+*U)FNPߔԙA jETFK͗_yW~x>~udxkksSL ;;ZnVbhh lKZZk5YU`/ DhGk6 iIݨW}7h(&!cnTI+(Q!Ip d]gj]fʿ,$n_TQ\o>K~mL*jJ@mkd]VSQIw1)Q{DDr_{5ofpE`]Z9zb͍ܫÁ._9L~79]lwՌoԤg yuˇVzKk)*{7V̻YofD@ҋ~P Ľ%KZ5tJ8%?Gπ=UUeV]RM>=yZU?žV*6v%)c?GաX-)M&1"Iv_Ꭸy^J(EStIQSŲĞYmNL@Hs%{I~.?D3lf\U}Lf  ƔlYᚌ7(rTT j%跓o}XGwۨhQňHܞ4e=G n?c E:bX#12^Ulbz7[V8;&)XE`|o o:c k\I>;yg]IT/mk!y 9."#ВqPgQ [0J^V;S咧:n̴޺k6Y,H+׊v|5QY,AĨ&N{TZk&K%Qy/11ޣj|N*yML^'lϫy Wd4fǜ pD"W#("#,UN:nI$wT9QU\_G g2*"ЯWy n& HظΙfėg~ox$|\W>RNtvٺiWΛ=m".$roB$i6VU~g5PjP>RŽtpBIU798#?Ow\7@_M ~] >"Q'֫[b}nTtaR0(lvdHx6Z+`^ϋtdș1&e:V70c~7(I&C$hNTv}?^mFPe+ l5SP `Ts{Zq.-?Zi |.g^fG!dսO6٦gD̼gKhŗsPȥY 5:bqtZr >7Z8S H+NhpMQ䬿L(UgaRþ=T'Ӏڜyꯃ&W,7Ӽny3x/bN~׈  )CT:\M&abI|QlQt0g,U_5mIؘS+&?w6s[>r\gTla@M2g14 =`C}0?: ЍԌg Hݓ0̟3u|iFΑU'otHi y$TndW@NJ*" 5L{. SD'@VInqAؿ .Ds/_]s;?;O(s (]TRT:αg͑ɝu<8G=w.%=IKrzRja.JU}x-Y݇5Z51d.kMw\\4c4f?3w͍5X:78ԗŗkێd@jʽĎW{|S#۴bFThي8~+=XKfpX씢mpSQq-/t[b7V[_vʯnGDDˌZ8=P]k*qs'$`1HdSNf ^F|eJc]փ3Y@e-pT5M "X= I>F9${P:`[d [={uM~6Y6n/6Nx0 C.ZҊɸGjZ= i[gbϛƛI)bBNV;2n0$uպ Wv؛SbI]Oj%1wt|\A0.\{6Tjyh oucNVAl82lj1 (0Ѿsһ 6ȓBYGZs @5{}ȹC n6,IjBZ@tP\36FM85pΒ-Z~O 2o ql&PMwA=QɂRff 76= iv/Id,#|E+b̥ {fCN%Yo;;6q얠$}$"ut5 bքGuхpcJREw,3Xg)5VO:BᯧkY 3Ѣ|x0YR%GKgD83>Ywu}u_7 /Oi<%ufAz݃V+yLaHUpɨ@$$@^Pdžzd3L52O L:4lDm5=8r7gF,P! v55RMM̴njyTڗEzڙ@"m~G6=u/ˍEFg\ߜ -B| nF@׾n; @tWVK>9 `0$W\sCNmGsgG*d@M;ELR!ܻjxZ,sfO ф&YL}^UNp>sAk1`Isuj"a#uaٹsWCpS)ZZAt!^HA u :YD-!r01l$8 Rl6g}_~OVRď;~+nMo;`DCV\h!;z@#Ks9uϨ?c7DL"Y+8;*7v0nUlvH?+uqL~WԽO4X1'gPibo@~;qɛ*VQ3[tj ~$YBp@㍂L9/+]\L፲Exݕ.9u IDATvJ+罙̎G s9o"e[=g}]j eQ'9/t<ߪb:1(AB!=J"]r]~'RoUռRlo3yBǦ̆N̒ݰ V![j=aak&3j'RrdوA2 :g#(O뺾g <_nkPy[yk_;hCB4ŀ~=גgzٞAg>qrPR6ɔcڂYn%m%F]_%0 O5_JZ;\ۏxHhuS%@HRypC7={ f kMxw%\˷9Pqd|?Zέm֏eѦPt? a P}bPύ%A@lnHgh)b27Dmo[d-f0H`T){ٿG'i Ds}ﻚ(n䂯%%bGL20|2JSľ&%1&*YcQ9ff6f1tѵ0@j #I)PUԪvh!S+^Ojgx9ݓ#UVZߩzQ!>_soyɲOZL\u$Ce\=;nƦ,nkNFb~Dbd?4KU+p=FfdX$P=`f09inmɚL (C"6tȌ[!ﭵΟyQiN}A;[&nLUiW/&FU?{wjm]WNFE0kYx'LBrbs j?_*΁$V6V$xEԇ VZWoAέ^N^h5<f5m<8Y­|͞();gE)wd',h1Lݓ-N  'ML&8(ca)[ Fĸc ^nI0p!z9z2хwp$@Uzh+?H* `{l]u1*%%d?% FXg -~7^=I;wI?^h> knuCLsm@]/`ѴBvO <{dsu [3!ئN~ܺ8 msY)f>ɫAKcPg5S j=.Gx>,ݜ U۬mKhN͎>c9@HcMr=_Oф]Nn[qo zpM/]ݧ?}W??f]}طYEN!Q,8V#C  1ZpD-%XpPAQ,S2bR$G-dKM6YÝΰZ+߷>V8t7˪s7|U7N_8xDu& eъ$CZֳ4?ZfDdiu2C_[xv>u]L'44? `w @7^Sl懯7m [~dʁ̓/9 ds )nV`PMֶ"v'<+D!*.j?fv>YÿwW~W6kF҈ i6A 5De<X L FD\aX:9WÞb`Bn"[@&-~pFg|ݹm4.lv0r\OhԱ$Ag.M& 38`I $x+vh>jt'Zt@¤,`jh7EDby!ϑv9PQIaןy2d=SS;frQ4^k$v1Bgmo6jr5u\danZ ,ܴ ]^y4c<qm7}_+gs;'n̥a%[A[T_y|Gȡ;5kUfLe}V.~??8跛S8MN<:b1C+* dwUߍA%b-k20$'|NBep*en1 +}ke7;̕I0k1/`oKUNTS9$d Mvr6"L -Z„!k`ā*d1HSIkLoFhLY#MI5;pk>h\ 1shL/.~kbIU)U;~jE@g6h kx0j&wzx5JƐpi5x(u_Li:!;y14cCe"4{$ɘBFh ;zT j__d=1M'?"0{jE> 'RRa޶.̦kԻ`@uD{Ե -hׄ6s**̈YU^P|>V tq BLj2*칭TB%_'?0 >E%pWVJcL 0Ʊ^dBu~ૐ5i?A)3qCe?[tm ɴcՏ[/hI"o? PusGCv2/8{b hLkvv,CZܒ& &8]R\$+B57ې(q@2WRsGtv~*HjEiYXsPGInGƿ/:A2V[B#Kawqw la=DnY^^'hah LST%R7?ud9gLk a'*8Yq֤rqPUMPT 8fkAmCo_q=Ӓ0u ~~>x'~~~0wpI?߰W]BuSL;냷>KM- ( yنom z)}XЃe E$N{)N ,S ts䊆~7oKB>=pA簦_TƣICF+=xs/͚q1+n9}gn.k3 ~6wBk[qK .f/&N˪Y K\ߜb!vkg2z "!do#!-GQƤJͪ S:Z_˥&Bf><9!"*u7~B%Hu.ѡUa"c#]*f@ȅw[*h=/`  u.uh\݅kD]4V왣q7 =T)S݋~!w)2G{u5!5]Qeشx?-w}lޖ>ǟ+|᪕[2s)RllsգyCړKZnTgTP| P.( M2",g`ohMRQη:h?SW /@,ap)hzIGvis`~: OT }zj4]{:ߏt4QpDΊ.C -VnzhPue#G ʉ!m\XnoRyܦE1_*kEm'’3NMȨq cH̆<KQAl ߲Xu&Zp;B5&.kgN{DsӳS6+Z4շR &CO&XX8s .][{"`Eվ@*W* u\E~b> Z#xVˍ)G e$ɱ#Q{=N΅ aCvskR_FH4KV=>8χ^.xx\oEvq-,1BijGy N`4U*gj!Ry;?xTkPԤz5"Wmc(J,> Vv+y]\\^ =R13g @|]z -Vz7 5Un^up6gLum`/](_l4P9 1GTjT@"؋Uh\-͛t\Jݓ@y3lz{k(mDDZ}Z%WT.: јXhmS{KOT|M⇡5)edX>qRLMZ_9d.ˋq**kKd'Gy2s6:p~ »?lk3vԁ\f-xpkQy˪tbAmC6C4 XqF?t^^ QCbmN9ʿ3-Β '6b U,PK_Gw>1 i'{=| H[NCR)d䐕$݋:}SQR``YOWw|oJL8Kfvau%6Mu^t}+L:[&#UPZ$(b8$Cw~ MT9%o,0{q0Vh*Ga9Fvjs5"51͍[FeY Lz->gs:2 ƔɘUx1,82檕)K\o ZՋytBVQ1QNG;Y0VJ}ޖy'! _Cru#z]f2ڷ47*`X~fٗVˠ4 , h/hKVRXF[JB ߗ9}T&¬'PgHhI+XWT?&6 D)HG~!Ӝ /w/ ;eBD2E1MI'oޡO=iz;wU_T[,hۑ`/q݋MM>YEt4!IzgQ]ZUE[Hp0QdHf͊baQpAK#LFmLXu sDF>PX`Fypl yr?d~b`b9+5Y;ER>wN!{ {G@^9[ç(2+@/}B y<{mn8wy0ߴK'R]YLzomJ/ <]VG}3-`r7Kc(cxN[n^& [0.>+̬7'K:q@w.ْh,lg ")_+СMN} Yb|67z29aX& K!*סv2y@WlSR2if| Uxgbt?ݖUC4@ynTЉKK=nMN<bc]u *Ͼ.zn`̒0xR09y"IX;TR #s2jK_,JO@E+}[\ !~t߹q1lob&P9GP1=98uw>Oj{KWB[m^xw>#nZW|>U%6FhAo [ZN{pѓ_/z#^u>V"D}(>kTPɡ H3EkT4ir-k S|326(UVUZuȳ꿔?`Gt]L':4,X<QmA$&b:K(7r8u"ުj)ZN΄mxS"i%674":P wvqjwBף{߫s+@.lb2Ղ1 ͰR3nFPw%喣s{{XA6{*j}6)J 3˾R#XD.WR"$ q%؋_o(u1_8}n)*d4aJsb:ΥKr2)A޷Lӽ_'2'9mq'Ulm@.wyכu*DZ`ϏL4ްE򊫁P+3bv8Q!ܨcw{((nV`_?ÿsWU|W iknrra"{}>`@&A{AKD^Ԁ Uj֏蹋N9[|ItzviTOOOcE֓ZPYys/< ?kGsŋۺ.?T"=ܰX@&j[Mα\%H6Wp7K\̟ \ZO{L-~% H tQN6,>(r7acVXu+o 8 +Q˖r`uStꍭ@D~75}[IH;)g(Ε@JH.GSvs_'Nx˻O;v|P 6]4o=Plٓ`L/魾/W8<]>v,hR5@o JNA@$PVA 6uaZrԑ{ΓmHf.Km@崯hb‰f1ɩ$֌6gu`ʯgã#OJq˃-RO*-.:>~{ kMӪDRĪ`MGNyv|6e L7_42gʥ.n6\l>Zb  Z|ɷi=١Q ,k S#K p`N8* oɂVBڟ]\e]0͏Rnj^.O9۵֮t 9Tbnje]kuY n ˽:5EHR122Mj3C~~ۮ.^;G?@ak>Cz7j%]-NF[FHgR?~-NZPtq-_x[<_T96xV,[݀yG:=xC0hZ 響-i/!\{EC|xXOs& T;;{^֥.=twS}limPÊE*8)|^9ެ6A2MLxBvzuL srTW>^nѢ QMmkBErWV|AOKɔ)e_$dKNt80~A`A%I4Rͥ4qγ7@Z+~T$(#bL"Ne*VM3#D@vpl%5wD UM (8fFi֩kW o$uzMu@q1Yjn9e],\/_ۮf;>| [ti-mZ/f8?߷m`nk 4R>ٯ6HlnYj<7xˉ{W>j]p9c,fbfqN}l"T}k L Z\:B:I\6KbAZ8B cmd'rvyq8'`+m&eȏY,EOc-YVS.HHL۽DVѭʒj՟սWmX*U& BKfCU6gݹ^@vEQx\T@Ge-SX>l*z̯ͻ[f}Dn!Pgx-`&?=6iY' ֓dF@>Rv@*zd:g]BKB>uvS~R"c4^f.ޚ\^H$ߟiMӰUޢWnmK?͐0>tV*P-%g=H0[[K 5j3Z'Es[ X -5YJX ^z":_*A)pJ)q}P1'vt]  |A`Y BK ?zZAăhI9T*0;~>4:"e7xvx?qkb#q]xT???>n}O?Z]0`os" < W x3-o/i.m HZqkts=,bXW 'u.,*_\`:7jǸd6u>Apy D1Ę&:/GU$?;["4+hd4#N@䇯9!ΕT~сDoUDwƟ1bwIm܌Y~̧zk#;CSݛvC(NEeb@b[e`AK 6rh<@xͳNT乪2OJ"fī[$Us J5m۾'dg8 KIpmm6B7?iZFq?Dۥ=ڿq@qoAc:>A;;qCvth{F $Sš&+L:) cb¯ƕ`Dp *n'׏Ԗȼ~ku k0KxۭD G{J?oc,PQ%ywփKw4Mmw7\Jb,@n}JoW?'"|-`!쮖Y@:Rl9Y+uexXoypˉ}Bt@p˨ IyS,F.zIP=<|u|W ~y!cTtg:Eu83,X9(WL@\.DG֫s{]', \)'oC|*zlAFE_-guC&qREϢ*SJ Rk SBXU3=hhz mi '$UW8Di''v~m Mi>Ő(`: pT[zՀ"sS'oK\<ꆯԵBՠͭbAzł.DM4'of]Jr?gѽa+7dHĶ2n1~3ʜ8 6~v6Fo[. Pk'~uEG:*:&޺tw90*RSF#xnmc߽ޮwJ)Z߀vc 5s+yWՒh LIz+:vu>}5F"I 4 }[! \ U\DWen0ܴ$f/ QcTj1-{[ꐥb PA$L !HU{\9bWD}1aᨧ^=w~"%7n=*o 8X^ƍxq.qrEal ߸A>s6+ZuJɆh=QY(_Ϯ.Vtpcv1Mfyrpl``dA >D5!ff!xpBn9?ee+-xU*#gBBـxFLުR)㞩b_ Hd /5O*YiM%֋И`o6٪v' 5bGI f;MC;' @d }4FJ)egA?`8%4FW5}p߶ӻD9àhZew??G4ejI"7egjkYu6OtT[ z j@ GcB"Wl3qAQ=Ǩl!GȹH6w/,3цehh8ȶ쫟 1 UftV`b xZ3y1nTUiyD׀jִ*Lj=0;jE 1-e/GUF ('jf #m,h{2K^:{c h2xMˑЮ>.{݊k_j̗ϙHE?pG3 $o[RK蟽/byA{Z-Dr99͠0wݼyS~[oFFq9Gw/hg~4-74JvSG^HnS4pBQN |mZWZ^gפ_B* /Wa&:.=8q1Ό=>'D.=Tdht=2f35ΤfuKnի@GiP: k3,Kr߉Frm +$&η!mq \ =ʦy洕E=\QH:v䥋t]ܟ|_\خ;q@DҾǮh#cV|[h[#e/Ahw2Di}wꪶ-V}n5E, 6fEW9ip92STR w#=m20 HLݍ=)Hh}jY$XءnwwOŽ=O]E2pz$6ey8y!LF[c'#P!# $D!b>{̚gC/#$qYPƑŠ (PZ. d}&k$j0ig-"\=8~[;g;;EÊVt8Ē]ȦVg2 =S~A\ - *#\K8#"AD*`l(z^YwdPUq'W6Jqs𣏕Gq2JkZ?1: lh P D7Fłߥخwpԍ]Γo{+pۅ+SV=,BiV6,@,?0miT<V1sVJ u&:~'hՍtފhwgWyqc.2LL܂cgYӳYIW:Wki' ,~ǎM;tL{'tp&.tE_OS/]+:XY]^bBivXs%=ۑQ9m[!A0$_%7u;'Eփɲ}a IDAT΍2ZSҨ*.d8H  6*Cl7 Pŀ:FM׃8ĹX*n{kK#xMX%Iu1 @]&Ȯ/éxt@* y]v=x^!ؾdyc{Vָ,0ek0|<kut@}tεlK?`TD9YT9-n>}N3}vW*ߥAT4GL-s- 9,vvLjΐ;Qqֻlt%mg?MGEy RŮS),H* #v[}kw5::$~ TB2Jtik$yg%o7>Ѥsv޿F2hOvC7URU+[iu;?x`x0cvP5-}~o[IT=/VϾkݛh,$MoLBjRzk_]wv;/?bA (mp]2 m+5;x&I}٬Ll]=xɴ@ԉy C=(V@[_IՀPH6Յq/VJ Q7}:t6j&햰~ڙ}}Qzao}.[i5!2_|n"{xtHwn$*?$vp͆NO8PXb\s=ޓq~G~_>KZ= n4:%sө%>IJv8zr ,Bhȃ]rdcةB A;xC1C{ac`Doʨ**B7 VrP.M}LPcLU4BEJr/Je{bj /.t?g# =I@Ŭ]LTɓikI_+HGI 5 n s*6ѐs __^cNv {zj_?MxfSJz`mف`:{ku(cބjqPckE>@wvVMa/u>:CB$Hq OߕJl~[C`2?v"}Oؓ==Z<Ry^[s齻ÜRB۷;*Mx,P{ 7x_rM(X8Nt~qJq% bߺY{͂D+Rbs~[fkJ3e7c.+UuA$GWK8ԱM[j⶘V\?6!GAщTѠj|&HEzu.*v(PȐx赯T6h'7Jn+!Nd@u}'.O) \$'ێW`g% (&,D_EPD_lVܡHPhCe^_uulop/S)}P^މsٌ>eAC񤣠]uH2ε'VȕD*y*Uxe/4{hm\}S荷ߢxGG޽{NNNł732q0Iֲmc9gy}{K).HSq ,,fԹ9DuD>Z|Uyhl4V9Wv9DS5$[̯~9Xb4?"Usv$%Ԏ'*b T 5ɭD/ d󁭐szZ@0k\韶l_)Ð~W;'ax$XytBp;׮~v|@73GwCwt;!c>NtI-x{l$B:P*%`<@<ŀf]+ )Wǯw+p']i^Z/?=(t\Q>==1'u1 Z8@dRp[ܨ`vA(jkYmskuڄ0G*UL `HޚޤEbCw߾Cj+a4 ?++͔wviSvz-Ҧ 8vw`"d#1ɘE*Dk'J ~50ΆuLS X!a 4 VM ^#2̋tRT/xR kSg8 㭋&?7q-cp]虆zo Ql-;^焓^L:O:cV/~6@oa;@Oi AXq/ l8"~ScB% Toʟ]@un:b ,,PT nARCa]vFT+[ 9fu Yd=yoh]K Dʣs@G 6f`tP޷œ63BqES7E?~ݹw"U 9!}}: Iͽzc=1~ix ډ svtZE>%J{"^Њ\vP%9iHUliBA} ]󹈛 BF̍qW*@]ģ/FU^ X 睞Z%ehu9\hJl; :\±sg.-'*F?ތ-R wzN?IFè;Eïu'N5!Mh3sFʑ%5 $œ:9I֝ix4P?XFK&{,Uk4i¢7_WOvMl篞lwPA[٨vPy1.P-*E)l.Ny 6 |<]mR!+S:7ihW??.v ͆x I~Mn ^PJq-ݾߍp[LwvB 7ntJ s-y$ATLBIob1XVmG'Wըu~ڳ8U_0h_q׶3xT(d}>u15v=H>5 %OK 4U-/~}áؘ皿B|i:!9%$$NҒO.3߭^Gt&x%AҒ=oWcF(jJׯ`|6N=HzhUHPZjdK4@s=>A8tJ3 pnOh)H8(_䱓N& AJ2V 0s3dWGu{zgs+>24_KMU~#6J)>E! ^$`YpTX 4<*?F0pl(H`; ZDVV=x[3[.I>rLGW߻{/ UkHBn$V3 V9D$|zНngȏϩuD܈#A; GĤJb{:64,P):'W#E^dSݮ;͒v>?~ڬlfY>ڦq?ĆJ],G[8Jz@m1l/T7k0oѶ?{&hLẂo=qS;+-Yޗ:sLwi'Źvwh\ ۩q R)bʟZ}4M~Gr)ScPᲰ t+ht:aN-K"cb֎$]ds9ܿd3?hl  7~qXjt EmIk~JN53Ĕ@7Mv;H@/jc ٳB3I_8A7;: g2 x9'_ŗq!v>m@hfyo橾%j:*tP5[nyK5+ A VOpY臿wt|$(mTݻ2Qϕ>/ 6=GgƀPJU7}!ޫGc p$6-xKΉdwmqo`d2II:ř.C4u,bh.,%D${JFuӶhrDqpai t$u0Z./V^;Qe_}@ mPZ., TSd.L7T*ZW]-: #}g2#BY/Y ywJ!%7X ]y ̌&(.4Da! QY'@0)BaXG~Ͽ~WخG?m7|O4oy&@w3uhaycum_MCjU=h A _pTd\*k)fo[؎ut|11Rq{QcM"CGif]>5[h<_2&'bIyj=dԻɺ y+*k1S/D"?22I{ cb eCC6Y50kC?}7yܮ;?mŗP{"m418I|k O@(oJ}F}ARKCT)|b0bhߩJK}y6d~Ѡى:N-XW|]j.4BmAŇ@6\qJu9xfXC`y2O*> O@YUʕ[oWgRa~ظPL p/P;o]v|oB`p+mז:Z%tV ߍW`@IW:ͳm7xo|~uAJ`o#:8ܗꙅMةdܦݡ~o|C~gwo׽Z zd d,LC/NNO@"}+9JRd\ G<_6}yE;}`~k3'kOc$qߝ\5FeݫH t+(b3MLR3Q FW_K'b~) p1RbzP;*`T>Ad'IR;2hmtw dm(Bo' U5(mb#G?K}z!_==f/̂8U\ @f:{'[۱ ݂t:i+xOpl g1WV;иV>EEo릪6| ƢQd{dvzi 3?*F@eK*:.ت)R+讃Csb3v~J;:5(y}%Dhu,Mw Rx?c\t<7ֱQdV,l`MBcO0nw~or[B^y@0m)9W_mrQ=(j֕=aQEB/W=?DuCzBL)U-_Ão h 9v_uekwb*~AI/18*@<^nc{-XĝRW(Esyx Cw2X-W[ߥz%-p^ya쥵^?]oÕqQD^UK.FbX P CؼcZ0 Q@`?}}]DBI :8%k7 фd D8B^lgGPŌމ3c~&3fg=4~LJ3,A5`1ݷDyI*Z9{WeMxhg cV!(`WcU(H27sx?|u!V\@=p|ClEzkotj &F mU1ۇj7q* xK?ep- l"eߕ@Q1 SۣÃC }oq$w6T'9b^6̝1խbea2TE$='g\T p1C(PzjP^kv|Hob|.B+]7+0X@C&(Eۃм24w:s g*?9Cjlo M O\8>[7o 򟏅2kY;N/sO'L{CS>/y^&B";(*&T $*.@AQRiS%i@QeWQ=2xV<)f+\L, h`Iײ~7K<ŮVNlBknO~AsW喰LѯJ__Lkĭk7\2^#t#!lpp8Љ)C3ȯo?ȓnh,dd] >!.GK;|*Q1Kr50ތIX1dFq"-b3tD!t14ST)6㴱DcN;` Q-'W0UFd1ɵ3A5uݮ91cr wwNoH'h`vy^O.+QcРD )- |y/>hW-Lm\uX0qV0 >[='Aq/x)ʺ/SD 4bz1b(̶Pyt  Վ{Lb$}}SrhY#Bq;ӕnaNjW ^qg;*5pr0( OB'>+k(˿ұJr~1@0C^hAXQ9^IzB DL*(?}y1IQ|)U`(MaG1OTLJu]'gCGsIv= --P^ZEݺlYJu" 7=[TlB15o0RpR:>q4@2U_hʿ~-jo/ /ouw/@@QwX>]R7(MiVH6TN;%3)xR)` Xc DR'2N;]7W+e>C:E0U9j0q00+_WQkudɬnNd{<7M JlϕAlx%6ZN-ӼJђ`*i󽨘T21I8S2#Uʰ~G$|MS}4U\Y XS]~7w~Ϯ}>u.q*?tĺ?#{p;3n#¦|-ZTZSmd\@6Q Y?+G٬- 8VNVrev]x~/l yC]2{"F=܆~R91뭍.-gFՈX0jw~C$[ nE% (eZ@{w(RÃ8 |<%$P@_ήzFZe:i Gbd(vH:U(؏Ȓav4@'K}E3,Jehаvẁ˩7S)1iU;d>f{2ʢhev^Q]:cy/$>J(/±  ӑtqa|_~}?mN>b7N|GITYG˶}ͩ]԰l)Tj aM̾45_QjTT}>$' %IwLJΎ1ݬ"^P7˕(̘.'y+Yf7kq.D1Nܑϭ.rӽb(e0qԲV |ZGt<"*lz6E8{JImpdӓ`2/AjF "fnDNs< _KG§> s#IwJ;յ .lT `v 0؁J:kp"S*\*(`PO{3ℾ:صg 2"HQ~Ce4ΒxIO)J׮g:n_?}# _D?U`|msvSSC,T]goac`򀖱'! 0zW6XyWMpxd.ۿ>v$ꍾXŏgŎ oںIQ}EUN `V*3~4+=O 1jZZ\‌_#ۃU]WQjvڕ9U\ _v>s4-YS6`Gg{O +|#f%;^{fX0h1p1hglk3Ac1kUig8>~\%*[: F dCTQ >a7YŘLW\iL> <˖'=ɳu_H٬ 1+M"E$ ߌκ21ftuP`X+jWT:tQْiV! Uy`M \PXmk!C=ī3`VdMBɓ  GPBS  SUĦc?BBժ9Uͯ}Go7+D_%?Z853mъU޺{ ʹVWr pTLÒtPE)'hL,N O޷Hr}眪ޙ%e["e+;c޸y ', /8"N0品!K 1qE(,RbI{sN.T.&)R-ٙ鮪V`*עDKGnڛ/@gUɦNE@`;Y/@Q}Ʒzs֮{ϣ`*{c6\U̅#p\li`B?_5Cݎec6o$n  LjCwJgZOB69;L&AڽyUc;(7N"?+寛 (՗PEDǑL6M(=4if:#=  V-y6 U$kZIЉ'h=WoQAm"Q֩]s*kfaz^ͯ|ழBꭎD=䦏nB]_}mR+FJrT>紛 EhW כg#$wfXCk(tO{\#CqטdxVbzS9Y*+Xd.~߫ q4)2PWXLǚZTx'jWNje|nR0B#QF)UKnG?MS|xD>sh#IFڗۛ:U3ϻi<cgzkp# >vM ,tmK 2ٸ׊ީ<P)vm}m<{:3D'|!J~vշ|ߔj I]yLư}I&Ot",bw$1Rfk/"0U,ZcyW̹B;;)xJc}UZ01)ǗxzK.ov}sڡ>ib:Q0v?]ءZqt"a\DA5G$8q?CqmNTf͌:T{6jWnAEGgW݌_S`;}#k΢K*L~UU"]d^yC}}\ƲE غDZʅhqN]Mku蔞}Sz2kL%5Q5m#ED;c%jol(13Od zFӴ|\9U%[c<'b xa[߫LGmoLV< ׄxjA{ v6KVvT+$8ե3C;ɳ)xcgtz+?o,m0dLrY13t-Pʊ~wN )L@j ojAz W41N ~) ?Kp3_oMtu/j;8%TEL@?=:F{g@T!+zPv6 iڧ" 9#ɗUQєH"7  B;) {aS(`dEٓv:{5"tՂ́)":$ Ҝ A7$QA3@>I}Yd7:SGL@EX5o.QGRFh:Z+. :)B U^O1]}T<sV|eEhePytԼ q^ <.({>.rEď$Q$ussWbI>fo.]|N뎓t.{LVKVxTT9'rsc* @ r뺢F2n΋4[ %{ g)fwULr1Og1g`[Qeb<C~*.X 6 bi[!\7U.Aw6RZ~><!\ -*XQFՐ4ezrX!DZ<.J(h>xpFY E)a!gp-,Ծ?[Ӟxž|Eu^3g;oԷ-͠QOF;N#Bz0"f˹TUpSzX yAJ٥&\PNWcs>}{S82pbAG@Gp*tĉo00"p/>qyj.r.t7It k^gHK:ȩ $l22>*$TuԳu?y~+<ݽG ձҘ+n$`Tlg EC0Nd0a2XЦZWo6P9oO2XL3'w\[~FJtR`W2yvnw y0(;m+|= ٩-+k볏rD88h@wcf:G'֣]э~XQj;pRg8Q$gr!0GP݇?_vm$u>E_c6b@ AbJ,id ӝ5KdG 6z5 cJ,:, IDAT[}ɞ*ϞJnOP^|W;%D(('ZhZ=.䈝Q`C0+`(WABk*-$E$ O0Tq)2!/̋R׼׾7q3S;y-+eU8غyٸZY'c0 DFզ_E̳?z|ew:gpV`{\$ǜh@/2 pYюB>5;p>AqkInz$WǁTHݦ"D1[TtNTiyObބs 8qjuE !v jdY#T.EEQݰKÇL|6=cyj8\Q0La^+[q1( lF@M7r>}b;(v6A \a ݖ*cJN[ΚiBfƫbQf{f]D;p-r2Dmd `kRq'IdWw臡뱖$d%G `㇪Ͻ TlElR]q"mc7o *\&n͠ RT{.9g7TLqÇ7.|~b|P"o8xӊ֝^S:R hQS1s߹ŭIEᮟP]VܨxP`8qSPؽ>%~gʭ({"^E%t/ES?DLuvU6a=[iPY'5㮳TGPt =O|q Y+PJiX43L2&fGzJcE=䳎UL%M$.ɪ' .Y*- ؅d-| Q-P88rMg Źur*&7r)+x cQV-d3k4>VY3^*CL©om9wP.$ےb a `<"X/2Qĺr5Lsbz-wSb+`3z_{a`|&E?S9Y! `ԡ[,QEɁBi肂 3a\u)4/Ȯ# ̯圯}N)΍⑱~7W/\u#'`6ygm>ZA2(_!\`Vq- z6s>t7sRc:el#,E^(Y@aĬ@8x?K 2xO?%jkd#꺺y-&- j0(x{ ket/cw e-ZɊ Rx` Ý!Go~k`֭c@3ABʫtOj4D,B_|,TDdcVr%9KKVG)vr~9wɔxlLwYH+5Tu#6@ULTF:i`l/q۩7Q&gjڸڸ$Li=oB<냢^[9KBy& + 6׳~ݶeO+E/S.T'Gx(ұ\}x!:?dFYOH2 H) ,PL8X|e |ew}< qk,MWI$l| 0QvC'}H̀DyEt;I1 /e=қ=z ؉ t*Xp9s~%:Ź/0ɰ`wy_ԳxvdRݭ񼍚Ն( zCtx&Vi(L!]sH9U¸Ź]I5E9"'_ЍL ]}qSܾĎ9R6(k0 @͐1 б7ϐ"u.@u;oNY…7 %gRX:ѹ| q/SxA*ŏաdŁ EJ|,hE`AS((8ˆ#QY'c*+ EߜLP (^D&,zߜILY聰>{p`8$6$q׋iu8 oE=nDI"+x k#Խ:H8ps,iQ3>ϊZIjJ(=i">Qm#uHD5X29]DJUd[B瑒uo#t+R; (R*@L"h<;e,QhnޙeS"-)°ȦPQ? 4M]*ߌt h|~h{"ql>ޛq 96jps٨'t6Hc*cci"1܄d`Q{\29H(8rBc{u'8?zx:ϋg򐴀0"WB{SZGhYT(_ {n2(<+j&9."pTv[tE;@[^vj`Ҷk@āqR/~z05JQ!B.jtQi'8GyEPW[( "N+ |Oc͗Jb[h4k_5 έ 7S0%|_p9teaITOH숷I[}tu7%@yQhe|ҵ"6yr8 R2a4k^`u8~u9~Κ|cOs{r~x>qs%{ >1}R@Iye'8PShTA3ױ3'i*(1;StH H wwPց &=*zU*OF\Q]EPB"iHs@ms7(* &c.H hrS~@}vx%S&.rM zתu%.E>X#{NWq Flct~ӘO$`O,N~ ů_E)ìRoI>ۗ8`:J0)ȝHswM25의`k~o@Paqp, L*S7?LMIB!n L6WM5CO%UԤ T_z!J!*v hZ'JaփQ1;V8zrGGg.43y> ZT@Nf %1=@(]չI7aU`ft/;]3( d,E xT Mqak O7὿S?'S0'שo^P.?vLSh3ZI,^|״AvCw+N-Ox <_Ӄc}<]o՞iuỳ(qG/# { 9=p|v[*)[ ˲EXԹ1R~Y$^q<'}[ ")p!)atXJhM>[N9`wC 0 `пM |L P)8=C۟SS0ŧ*VߕKUJE8`\͉>v$n 4t&|Pwho7b/&Nn$da]7,{Adl 0ybXTP#T#$$aHQUL^ǩ ]̄9Fb ̣yE.#_I< 'U!Ag ܠl `e5;zUO!0 X D"UE1n?WG[5؈EN/Y,g7ݜ)>u1S|*{ cG+KxIldJ;l)\RHtM~C\HE$f-O~~$6s?O/}Y宓5 -4؛ѦpbN`$D8 oQ l?F7GGU֭ny˳㹙~~x(`T|!)X3RQ^@"^P@:5 Fͱdq #!KMbjIDIh&]仙M~tw=S|Zcyŀ;4W- Xkkh˗j6@|5hiNNOps*|o'7uѼx ]=:n`sQp7OBF8 `+X`&sh<@x ;we1_dӨY_F<`N,K?0c)O0Y).S5PJ ;L^CnAfs ݯłb(Z Ўݍx{Zv:o9oQAJ _wo#fZjN삻4rw;)O `_82W襢Gd? ,parJR99#vHW~սzxtEgխؔ7k /_ALE[yf%jCKmP$vVc}~ROx<6PB:f^ x'?^Iڎ0n#- D#x^p2k5֙(mxTt=$`-[ᤥ}ihBK˽%吲4chE4TRH`ua5+EQm8dW'#FIJW!/ʏ)FZg`(Ō5c29YŜҾ/N9t`^l:|13@X$v6$4 7S7w?:)~cZLEv'|9bede/{}lpHK '.#{sa3@8O| HHpfvs6d/ )g?x2w^4ď NrðDZ2=+ ~ O%j/h~nja. +z\DYy ȵ `LOy@ h=6|oO&"=,ϠĆwbP=Wk`5wk@i^j(0O&C?ѿ⩊i0S/+W2 W^QΛ]~iV|;[8aiHu| G]hX?2꿢Α^|]>Y~vLqD刡|iڱYPB>tIDyE,Rj=HQ=yE2@ վ>5e %:<$E xsE _(hwy )\ƺ/Uc>Spf,5`r"@+|#A2 Ov|͍8QkۙJ_PƲf{3HDGme4υ %y 6 0|pbFsIH޼U \0+Sۖȹ5/ЋacW70xfb*xǸ -3!.;N>* ˞ S Y}1& @ vehQ ͤbYyET&qwcS|4 *W6KlGX7g +u|(c9Za`ʴ]8i23"Ms>0ڟL[`h7B.O)&rB77?3S03wJAq?j%7JrQ%Q bԣ{$r)r5 54!,fCNS-{-" 7]c_Ǐ?Į ةZ4#Ӧǧϊߥpw l(*Ұ~ ¾;96R U@>K/ׂ10/mZZOZ(>zA וpmA >awO>%)И )otkBt98佻s<^ƪuU n,P]֕XDjG' VAYR;$(~' Płjy'W9>I;G k\jXSDZ~:eA\ kQq7܊ VϼJ0D܈##K773UmɚsFrt9w˻p?Io)S0ӯ 3G]!9|Mda$r<՘榾jl.haZwCd/@GFMI5Ӂ"ѱ|OQxF]䑄jaj$]8 }jqnb p)>{/\wJeOrȭ݋G>u2B9vgn=>"衼1@+hde[cx/!ur1?f9Qwmׅ>V& /,B?Yz>wjuwӴwλSg?2`)>;]Nx%:x)%JetuB6.@*?OuRl )x`z OpxuԄȱPq闟3|??eR~lRߑ"-- oÝodJSL1TL1'˿yp)tD9_ʙ"48L_p;kh0O Xtg$z4& +x 6 Mt= pbP:-..s\<8y  L}]$L)z]-0ۙ=rO\)b*Stx!c0. ;b:BJ}/q3Μ@OkP]/+?M;V5500Gq2P{w/6{S|J?ͫ֋_IENDB`ukui-control-center/data/faces/4.png0000644000175000017500000041230413635333016016261 0ustar fengfengPNG  IHDRx pHYs%%IR$ IDATx{Wu'ֹ`Z-zam`m$cOIJŌ*"S'?$5S噉%A<$uc0ZB>+u{{ooo^{o$"i.?qflǿ7+'~tNsGB"p1Dp?֔%|7fڻ4f:M_+F}f䚰}OOhKB HDCpdro '18Lf0LH?w'V|?k[$%aAU"-}L}X*0῔ Eq 6}8sf L3܍wl/wJƴjqP[y-XQ>$?Iۢ^6>3iȿL3mf0Lkx͓ʞw)O%TGj&~9O3q* ĖG3{`2~quyOMQs4Lf0Leo$G.0> D XzT/9 - Fv%ڂ>9gML34fb37ޱ2;դrq%6b?V7ʖ$m̒ΟBFnGVy ߐC8)([ O< '/Zfh3Ӵb+A`D7 Scpa#Yʩ4JA]v (3z V;+߅_}Ϫ5>Bz`=i[CL8=6] ?o|x34)\+/; O6KRϛb]EMMQC!9@៵dpl.X_<4Lg5wweCk1= XI";2Vt'CAֶGE# a2{' "ˣ]^ԃ; f:ki3uS7ޱb F{B>yL[l[Rާ|Q6![ ޶rSF־s 9@|]0}U[6+<4tV f:+Fa 0%gema'%kye?JI.wcXh/QD+gWڏ QX=¼U0әO3錥nӇڏ $i e]; 5}>'g9,sLީS(C|V }@@bȂ;!d)^D7ʎO}L3ULg ?Hz~Z u` +MyO9kTR4lyuĜ@ :j : Z˹>+J`|6p8*Sv[4/I3pY30C3iO7aO'ItNeJI.q ӡ!-b3柳4{TX@V{A:UߏJXc5~ yJ TS>`aLM06`=I?q&CtSdos|\$Ez%ٻ5yl[~;?șqdDuZZ5%(j(Q$x2G 7δh3)w0#bP Dm&&9Π3$T-rї<հN~m_xs(NHKMI1v HȰ=GtN `N?~ﬤV@ l^i;aLU yceQJZ ؇{XۅPEBWaGi?Tj!3` kx)0QKc=0Y^^V`K3я_;?{׊Yo7>g*\1z~> r-'n{P KM~o](-oqX޶B. 5Fg3gLf0)wa4tԲ1h5gibr;TG/ 08m][m}NQVgO&ƭO$@K`uUZ8i{?V`SF3Џ];iT{޸#ݍT=邝H6vLJ9z&t'N6oɏ""z T|OZ{=/d{[4]UF@op<F p_+L3mf0Ӯҏ^;o]O$ jx(Fz8+xABě3o[yIn͓AȞ8"4zJhLKgPk؏TAݣl_L$7_Rwmr] =0Ӯ fqe@O\Cw+ վ Q~k SkN]0 jl !1GGh^}o_-yqJ;F릩8a=FJ1QB7?L4ӎ f1o5p.$z%^KxgZ AK* =w`A٦xGu"ȵ4qXjbB+.U@CXAS_|l'0ӎ f6y'F%M YgwoKr=(9jtP-I}:VGRK9S^ >UZ됫QT{$/R^ Lv#Z%;l|i3mf0#t]! ݣRC 7i 8a_ltK(ȑP&~;*vt[2~2=_zS~U-T} HJeRth4ҡ`ph3M${18ҸXe;K) e%ŝ}9aTB"ܬA5ǯLVX,AU'w3]tAǣH̫ |y3G3O+'Ư7XJ/-^J\'ٮIj:za{Iζ2Rt썔yYe `1M)vfc=6膊)8vH\09'I8N%x~ fԤuzt})cMD3ޔ%|v>ѦR;lR[ԊGo=pVl8<{_VmF!oZՙ{3P]he^vMR*0;~l#0Sf0SH_}s"@Β0MAZ`ͭH+*Pc&q miiQx|EZuyȽxQE#'XNdqpTg蜑+S$N6͘­~y34 ˦Ҫ?[.vϙӺR{cnlZZ:+,ꞝW!X;nwo竷ٺQz7BS#Q"8 Pc&=!؃VZ_4Rfب ~I fk>~|.H 56נMush(~7,\XH@6@`qSٷ{TL-K"DF3j5>x~2+Bk zi :<L2[/ol%X/O U~ۭfIKqTtL h'jZ/E@CS(&,MY>=}Iĭ=X PDSߧ|r~|l䴎w=txbx?p7JMbnFDVHT` #@8K6E|9 @@N[M74<y9's jK!鱑bɋy`-pCsfp{}?,3>D ܦ({#>SZ4L%nWWQOQФw-Uj/[Vbd{3UaM3̾hf-#tz[+ +1n'\]&9H38u類VJƱ*v-++911OH#?? u߂L?ink*e;;1Z /hʼnHBTőXyRYʟS៵r}2[fCt_zvS-clf]J3я!8Md[O_U#PPIrHKc'\Qi nB :C.jʴz] +4s^yձnm7g5A~W(^ Dju9ð]OG q)#`9jێF@\$:wYX]싪KDM?$R')q!JQpڝki[`?l+>2KuM/o'{\;ueWEN!~uV)$ʿ%UQ6 @>T辭>ڤo"l\ˬt͑@Sp?nY[$G:F 9նw=|F`YJ7O5_z7"{2Wk#$0]hK9t7 4kIkKLa&HEDdߍ3*Kʃ>I$zyPYfGLFZh~s#Q0YF⣗xϯnfݔ*-jQ\q$|ΊGC'U!؟@xw)qwD1c׈uo0'h|:k H$ӥ=%=QZ ՞\{N2-MfhBCAz%Bg,w_ѦQK.ILlaCgseJ(Wzb]Grn\(:qA:![.e>GQkdT:ʑ ܠ|Ql/p PUң#Y@Կ6}[/SY'knRJg=u9[f{vʒh]?_t(Py~dҪ;%d5":msbw⃀iR-ӊ"~|g< S+[cevm')n[۷FaYŵLn=69*L[;hmIINEY1?,2v8p`'є4PJ+}m">P?Ylդ9$~aP/SjQpfmL38Cݗ3}>-R>dv4)`+i> +U.zᚵljH5IsD@ R/q&$C;Md8$Q>m `Y#8k3|ĺWo|/ڀ3fp]~[`/u(&`h0M| ?1|=ZccK5Έu+"SeL1??,JCm `K.6,w}z tITj7]%iʷ$Ammy/'0F?tmn_3ub na/j}O Rcd|v7H`=0K %seqF2h7/FGLU{+`a4kǩ2T;k6 ִSJ[M|D38C]߶߽ &Z&b:Ψ#_+^ 85Am/fs"uHO[2SzG9#:~nͳ Bts9CqW^!I#RueqiGs ] ˫MD4ˍ > 6"x z21y50f m+yBv"( rI[bkI #UU;{T l%йJ7([yS_.CflGΌ TֺPg\[gҖ_b;73ICJǐ'>4^az#j,A{C5($ MZ<~hhHn`P1Xm_8h'舞<3sMJ~dѕgsޫ{+31KiG |QjthH Wllq;6ܣ4=J"2k,;Н]T[ deӌtl-LJٺyAXJ%"%h3c-Igf_bWLӌQ_ʥfCz_H68ZkE ҎjW̜ydGjX1Xm ql i{ym>MrU-bTJi8n*eunSlV<$ .ϕ:sT/%z kPZme$Wz1cXYTqNKUyY"pʁ9hS6ԟ}KWׇlRxI/aY2$B{f:M4=F$9_bdYO\U|(S/Z'Y_)WI']` . B& .m"Z!JpU>gGr$A=)Cwԏ~칗 &E%y^zc-`KT{ǑCRti{~u9vHV^sKuՌKGN_ԞŌn[ S'g{K47 & EBP"s"/!lm^Q$9@q|ifzbNנIr`^$2(Z{em$nEՙD ωpB!~;ӕF+fጏe5dy?( CSa ecF1*HyH[ J^HTGFiwGnT\cK\#3*Ŭ񛟮E^'T|󮚏'559ٿȮd2V euTGB)##0w#[ԱA/O%b=m25BƉTjI b@z^w>! /VԫISR}MNDD}0t'~|a:ݫwK/}9^dJ;Sm֨-2qb IDAT x:>pC}fpDqG|Unt}0fUY{TbQ){q<3+2]!97}Z>ʧ49ɓ?~dx%Qkj>2esUOӐώ^+k en:vuxS/Cʹ4]b'4A*LP' ЌZ u7:tWsL6\fS@3E?~}68e_*﭅-Xa\& P#SjI-UE=E{~bj~PMƲ+^R{R9a!{XNy{2Γ]|Tr!25=@SĢJh׼M`CP_C&.`D3%zە +u}( -%^r[Īq)|dhR<Jnq8L7$J=*^Dh:Djy2:ҭ[ )E3vmOރ|bZ})N5*%ׄ֯1Frt:!0`mW/}ti(uMos;@q]o='^ص}e^^0G7i5l 4TPf}G7rgm cS}PeqXt~*RWá}I߱/$AT ];"9. vvG: l&v>NY0VO5l,qK$D:Wog*LA$RYYЬُnT)_5]W m'*XU*pzVEC:\ ס 86'vf?zPCvx o;d` ++Vp'LQ38c*i&N"l76|?ޓ7j3̫mغ!9]-)}>ԴGa>R\S6ħl+Sof=7d5U DN s, 1cVuc 7Vo#~!VyȨI5MA Ʃ+R8CQna'r]ym^]L{c76p2&A6i۠?$zO?6쁐iSV/Row9fLßC~-\LZPJ9Ƚi0O1z1`~%'PH=,W.R"7VS8w!^+ؾ_T6ƻ\mLn_⇘A 6 ٜl|Ηp{RoWcK\%;3p} `*}>zﻷ57NVLa \uR’Цvh"u1I-9h` ha2`vLe$N.ntD_uQ,Тv6bQ{ZcѰ^) lm4) g\;S4HbpKLS@ӼM ˓&5p 41{sݝuJAJPZE*[ƀuw^(UX<[[*pR$^;^ L3hh) t%Vj˭P˘<]`bS^/{`fq5?A@7`~1I e/:uòʹg?S!ȕI1ZDڂ8NqHyy_eKD]2C=<;/ֿ8հ }ض1c a&٧{1 neLXj`<3t[ƘlaŕNvs`ВV7ȹXOŘjͼP-5^rDak2[6H FQn>f w9a^x6AYÀQVF[v`-sAcĴ\/p?#B]4I_#4h=X+6k5tc+ 'WYL$]Ku'J f4äer5= ±zeȿc}q&V]r=%7$Zʖbu?,\Or@@To΢џ6麇+j-_s" f -CJlML;'' ,IO{7=BoOAo#K)LƦm ך\ڇ 3n"}0jYP-8m&lRFXo74uڴNS^XK?8eNMKU[Qk]֕qlՠfl.(tR6}@$co"F"3L&6\2Y-'H*f 85bߺ& s>" zAԱ&V>|Aیqp,OH~ * GGJ JV#:Gʶlg$L3s9%F1ӟ‰/hɼɝ{d~L&B h}a o,yozqpq⭴t84ik8.kĬࣴ`՟*k¤K#{vPl U˲  G>x-}f 0"x$=+vNN|l̝9٦qkk,zk_ /@w  (zo>Sal73)E/Zu pw2TN0P9p@P0=#SQg&W?tr/!SU/DIJcy_+n|EƷL`+EV~rC84xGN3`MON| Wr.`͒ &zSPx5YW hk.цS~c7ݺ (뇌 9\'?%`F,v/YcFHT +1 tøz(]WezJC+wN4|2x(F) 9?l[̰Ib2dVʣX{L#!{@d dG-`EM}r2 ^.2Јg|;Ytqx)$WgMKV6tFgzmk5!p<8vtϥ-u`-&>?aTNڌw˛#O"ꍫY^P Q=k⡊ged'VuFmH-mWxhq o0Шku{7}ќE2mo{W -1:KfNَ. +ItNoDh H %Re@cה +{e=vT_Z,9_]H͍A7&)GA:7@\.~ FլFJ7s?6"T$Wu9i;jQVFp?z7#Yp7W:m%1݁Ȏ By-2qhY>Nb4ޢf/5ekD *0A CCj5=z9z 8`ԷN,Ívç9ڰn7c@SvߟU$ +Y}1&os- C,ڏl)i-n p'97 >'甐yƲSA DlQw֭i4(3&JaTUnl\~Zƭϗ#K~@#I]:-]h E[S*i-7+XǓcB?+4>̼JAA:"hA"0Zi;`Օ"Xt9눀!Ɓ_KxڙD#'Z, vitkڔ S/CSJd ᅡl󳩴\|MqIDv_ճ%nbb7qzu4*c6ڐW.f!XB+_Kzj"Jnf;WofH4h)2v );Z9"3^e7!9y4|#~߆; Nm..w%:e乀 BZac#;;_׊\jq1 d]?GşA'yQV ܕ?j3>p㘠UۖkE-˄vɖy:y{RS/miX8#]ڕ#B'`x+IutN|?7wv0TCWq'Z?t_ X{Ůa%dM^Ʉ^ tv F"bܛTِ@0Ne+’o;6F$Mj$b9f`\+.3Qq +2kU .x`',@k5?ϝ;pӁ,h:䜘t8On%8͗ 1@,  )(s OBY}mX,ekXOP~G8 gď ebKp]ptu@ (Mx8pN|ddn!dk/ݼ2)lF^/bmEbn+Ha&̚q-o+4 v"2yŤ3c< ש|N`zjO^6fJ++J;W{R4[eܦz+exRcOޗBR?IEX˧F }uOiؽ 鐁!a`+Q ȗ8jfo>QsnJew#4w{{߮s1ZW zW$sVY ? ,>N.SӄڿƴrUAl!B䅭֐Zˠ>9]oq? [SR\ڄԌ} J \ 23j:`2ZKL /%>LԭүB $S{8Y;!s\12 GdcHT灬J,l<#,(EߟcSN+tY ׍vzYf8E# \I+:t],zUQ%7Ծ]{-;AХ JG $BjeK $s$豝< ohڻ&ZL7!=2B~yqm ֈRoVDlT{`4٘󷴿i+suZ[w}gQ=PݠO&x:pg(T:OWWcyeLb#P{pCV)3;j׭J w笊9Grp[>}-%vTBQNեQBbiY>)>fu?M# $K4 *VeTb8ѿEʗȄugSOՙ[R<pYڨ RaeG.ULls)."F_(0uZ~iՆޢ}0UW|k_1H7?xW ?7֌z䀱iU:au b ؂TGq62|%|n=4ecᣐ'"a˖oKb@%4m~ 7WFd*hSWިa",w 3j˓D=.مA[[B@IXu@H;nj/MzfGTfZn ֬'C_,v^4W®1F4LdY&Ud]e9#Lؕ{w%%˂`Mw}̿$0$[7aM0,Ӳa&ل.)]rO:F!Frk:<9e9=z.1|tNhըɮNI-k9rT _?=ƾ~3뗛xXUN)E*6hLYD܈T)6m%[1B}roPjLI IDATknDk9D(7trA r rO>)R'@pZ ˞*e6WpX0_)}g(L+5*F/8vlu4/[xF-Hc.B>DdNjyM6^XeȥT7ױU&w7 nVjW &Dd9hS~.qkbt2T~IR.Ey01y_+mx UsqlxZw[2`D@1dE3 u |rS2Li%8{nc4/Y(U~cqRڔ`CY;CITĶXpD`Rn _o:vF᠂`u?xABg&c"N4VQ [Vg9 J)&];(IYb!r_;0zJY,#XQxK*%UP͌:-I"(鰥YgX`d_L7~"*Vfez.ǰ07jmKQE4R=ϤSS5}2zHpտ:ťovOxI 6JeĘ X IYb@lB$&?vT?@.RecS.Sεq3LXrѼb&rf^!LuP/|X/D,kj mfi.'sADa kB[XRl6Q5&1RajCC%~Yxj㵺0Zjp X#SUh*lXo`MɼMbH%@%s&ʫˁ҈0uˈuo;ssbf.c N5y`pσ;6}GⰔ6xgP~tQ_yTܧVbqa3lts&ض,DE@#e9[f0&#=' 2E9RRTP҄rKJ\cY7Qx뮏Д%]IB{#`I'}2{KhGTc DoE6y 1UuwmTF o/f3 eاtWhbOQ*XzPiU儼%uY|3?Cp7M:xFi7O&#.f)ɜO7ɟ|6ƒ<7#ȤWO[ڨr+/u1m'kBQy-[T峒mj J,vq$jE<'&7Ϳ^sx5J}7QmԂ{y}gg nTX4̐Y}gH :÷Zv3Ҝ3I3rNӄ)&Ʌ$16>$L5=`P0Z-+1#P}Ɉ)Ply Zϥ_A_,sV5EJgDG|Y@敠&!䖑q:MbnؘWXfTòXN 66M N)] gVp+gO 㑘YA%n^jW*q_9jZ DlJ*_b* wKD ' ~/qxF7_>ByRrKRJd*|xZ%|Q- űkT`=/ư=!>Pe&(ZE2M;BdM%,*<"@^ʶ>~7'1;fA\P~Kr,ٙa+X|۪_sTr=u] "uN\6Q1M.z$q@:d!LWI[g 3/LOMt!]%fࠖ]kyGjbG,lZhR:rc:vFThq: i.Aҥ `(S2*i l-2"n#-=tyo"wdgxuf$h<ꑞdџtK1 4"j);P (O=0Fǀ\o{ a[kܔ !O^$Ú©9i^7|ɠ=wV׮TDѕ3ܓ!D5 & L ?M6Pf,QD=N.?80Lq"D@?ghM dKq7I1Opx [)l ǂdAFN/up(ESo:UK%UT^Zl߁aVk9ž hkɿ} g2E i-CpXݤZ5?M&rl J@U҃Koetrztz)UOeLil8̥HNX=γzo1Ju\DI`SQt(Z1/@&poҘ[.HJkֳvI1Sp)ݓA ~LsCT8t*Aȷz$uiZmVX?U采4ԃ΢Hw2X;h/؎Ꝓ &P&JU*cnslY< r T.|Y( O=N=pQ\ DMǠX <_[b%g!C?V* yW)A)Ֆ.{q S*%9I#C4i[w9so5O02S7ܴcd5ģ-|~sZZ/e(}'2]o7E'W~_o 7n`-KN}d`;a"9dw&I2IhИN c$--2 eu"𭷠? |#8T3} 01%v &X@P/\VfIg9 S{p*xܗ穞5A T)j*vF'=>?}$N }ng5 lbιJ6HLd &T9;G,÷ }k' Wwܳ{u v48BQNC-"E-fh/EG+{IKTV@i/[oHSnԂZee^t 0Y?N)?E&:W$sƦs hy/I#{y__Cق($ txk%ŭ1%-(MIKr\ǰ2u/c,KF͙\G6vZ\͂51^ 25A3[{esêR铩Eho ovYIjdW[N+9 A,ɔ\~~MD_e#\ ӗ|&2Kp]F%C2))b* .e-^'y$b!bȖ̊Q$eĺfJ8icH3ZVdXϕ|+qD޼5F{ n"zJ3J?Sw9 hB2yRop`^e)?0I>@1[.f4!`Sxh>ژK^Sj]q@-R>9=G6TU+=x '*e8!2$QBQܕ9u!YOD(LLFXe".CJޤ\biE9(U:i+:YY1~Ld)#?Q )n.OԨYheҞaߊ mrm^$FPh P([>%dWr]Χz;@׌Z˛uRt> pmK<ΛIx OxN?q'3<;4zrH 2 iJ]IG'*^ u[=ܸ}+y@>)aa^|5re$kZ5­%QL(?1%R z$2w:u4![+A&Rڲ,a";U&nڢDEDӭ+2{rÚBcZ !~{\W~D* ^Mv J&vK7&I%Mp!k{;o%#~e+) 9?Ъ_^Kt\AtNGuX|xg|$*YDLy/@<~hW/l(_}@C^ܳ1lohQGWzu opѶs&Ax&7|b^YgjKju| hC<~\x"-[mkj  6_t0_v { plLF Y MFbT#YYt"la|Nb".{z ,/%:^OË3O rh*L 9p9l '/$[#g]fJja) Ys8UByW@Ic2>q  o^YR%16ET9|\ٲLEJL$e3f,J ,ŝҨ6QKs& (02j|<*?f9O'NOǦXI|)Zn==mipg ~f;$KەhXW/pSYl "dKv^_,+ pMrxJ'":p y2ş@[4m,QKEކ?:|*s^!k+Uݥ/`0j2|n"'bԊY/eoV{ YJ~tT%t!^ oY~7ΟjId^?Y0;K+=|n9x`,|kq\JM[/b5R[ d j1(C5bl8{dZ8Ts (y R ]3>+@3z iq15} f4VƧ6^krOZAnȊ:~a{eȢ ˺^>|Aq4fZ@<3Rϐվp&%DsUhݟ{ৄN+n]6w%_A=ޢdkz!(L^aG!^\ e̟Ҧf(C>|4]k؟E~?Oa(06|?||K_HP2SOUb^u 4*. Z>z5\vBꭀ(Є]Zyoixã}>VyoqEl.IA|q3җx8V 5ݱL\48l? IDATŖMB4,`t_bYt9sh&Z0] Ζbaet:T>('@Y$@!A2LjJrvRKMW>̌ޤFl]\3]Ⱦ* x[O(f HȄbl%$I+Ʋ.l5Sݣw#Yg.fe9`0ss{-Ñd)<ѕ$0GQ/75kE(ISc)Zʷ[h4uy9™!?nE6sck$z$,N,Uw>|_tZ4r#&$>Z\:os=-f<3+WKQ'Eҹbpo[^oppA3ߟUl j.gխv<^ ;w'N~?q-ַo82\JR\2+p{%p X$O0 ъ)KX/s:O!y}ϲWOY҅?zª^ T)%2%hR0%?aTf,0 tFR7vZc0nn3(X0*-!S&jD|86^ f[ViM?|6E[ǗcW:ˁN|n\wn0o(DM10]}$rq7q^L/t9\*Pcsw蛋WC-ǿ+n%,>#>m$%#= @O 8Ҏq*!Eԧ,b@ѳQWQ]|2 c|*C2_Vwl/7GtFb`5Ypqonb!/oQ А,HT׊4nڷSP2"'atb yxkNʹGi-;A5@r mV]BP ٢8}.U~YDVr Χ}.v` *)mEMZH[ m=>T hӋ”Ű/N-EP~_| .}fނW×^<mIܸH\P N 1EZ*yjg[Pvݑ-^ f\ԪyHm!-[-Mx.u+3dmlX "dyM$.+W ǙLPzN2k~e#`RpnZ$-d[V$6&6sYƄ6 )rpb9*z_+[[ R xoRot눍LV]@a={`׽K:6*wWeJ:V: <Nxŗy8n$#@> T\u(˯T㽀rw:K}8ۿ&M /osd9#wq:.wl(OI̎2 RJ#xqK):]3Fu/{1~Oy /= O?r`Q HZ1fQዲ#{;hV(3KwAnZ_l8IL~q`bKv煹zܭ{|)"Tkn jq>hKt4^ˋɑ %!x0LD% [r..~'دӔ :0eU pYmjYnm*K)8N}˰դ " 98o*xW/ozҢ;$2?:R歄"7g> ö*SJGJ6K6qi@:]Vi1ID$_ez(X7y!@jTvN1n$JוYRex+/{/O" (ⷻFg>jAe0<@a:,ZϖKX |V_A-K2 WҿAvLuɿ ^+»:ɌpuB ֍t%7…p^CʯIА[{Pt@Ualn] GS~Zk*Ϡ }C,Y~pj/%3ga(^I{[ؚ(YZ9#l5TU}t؉D"L-I%C.Ѫ zɑY2|WvE15tu# ݪc_zt` ǫ-0BU쓴MQ-G M Iy$0WJ$ <L=w>rjR o;b~quh<(%Vt(Ye)"םNZOn,Oz WfߦZ~i_9Ȕ]}.v|7IhM6yLGXԤUrZ\bڇ%`-x/ky!WKgd4-,gA UM~kK}\2x/ydFhf - "d\WO@bCO*r?tv#̄XИ^K{7~9xf%z%?rxEϿ>y9<'A wO~^ .onJᏼ2xE'p<1+H9QuRxF yw; '?'IVm^̖hP pJ4+s#}Ma::_`A9WC~YHJY$b/3!8\I_B ~}|=^\^SN>4^R$aN Q\8 -Xq|v+_%j!%3-kcDr0`R@YUҿV3Swɀ[xyUl<3pxG 75_Șgx wRWE``kϿ'}^1x<9<_~C 'SG -|s΃\pjU;h%!II`gYet)7KS{P#wW%& ImHv>w;R? W[,{NƿGYůPs2x/wZ @W ]I_|֝UѸV>W]`m VR5%Ng䗐jlY{Ҭ.Rg e @TmF&{u^f)aZ`ҵ렷8؞hrJ 'tq8o(2IN;@%V Bzfp^7-)bl bjy`]QIݐ\7F3sΆ"qm$7gvB'ƈN*)GHܿؾKǟ# '$/ǟ{>{aeW[D+;T wyCp柠4rpۋ#➡>k?^&K %[[pECO>c!iDZzCR?joR 5J m\=,kxXe=O_kA@\V s.ӮH׼Ͽ/d>(RH7]mL>b8(8S1)jA !z +җײ¯H*\Yz_sM0߲ @5'i 'q?\J׬*$>,R̄;^|´=7,vKP8sٺ@^nXU|x/'d_s{n_x c'1ϾOL}w xn$k4s]*ǟ~o>fVuosNo߮oM+(Og~-_^p]`%Oh!o>Ehi=B;Ɨ)PbK&X.VXJx''ElR:tLE>zk[8-+E/ɇ᭫?淄|I(->Ho y+==7@>2xO0+$ >J73]N f5Sbj PrQF/MA[闰eO~epz^ 7ō2o,)_[VB%<<.8[I,bļ6 wk,h "Nai\Hif@@[!1{DG|,Ɨ(ژ~:qݬ_G'E "\ʫMKm#QSKgHT;|z/ \/ 9˛rGB2327%>fifFU "1&P/'.RA rUeǮJ\ XvR1&& q"!-~ko'uN>[wo4C3Os|3AMK-a"1߽ޒ~^-ch'$?kko [N@ pž|N_!Ro۸GB|ᏽ1na&\=rIޘxC̍%R6G}XB՟ c> 7tKTS"y?.NKے}̨e(C/Jo*[>/dӔֶP4ム ӉjhDu齙C328SV+a=+OsIS85*LG[[Iߪ45=9GLyq~ T1جiW;TkepZ}!>'dWAz}E sJ' \NnMGxŽ9t 腚? MdAc S<[y`>.]|[CSq@ʐQk/B `?$wj˿Nm?>KכTtz2Zt~g_s?lm:,-fL@6Wէ(; x M\\,D=1zBf "m,m[*!:t%"$&5~O\ds/K<|kS)"חbD* g%G-G৕TvC"4F= euWCHQgvo컘:[]keAkc[ iKՔ-fڵ, *.P:c1kQ 6w52aQ㯬bߛgF- k7{/On@M؏܋Ց$,P`:3s sFS.sOp'CPX |T0mZ/#/a"bM#F7'w?l;S.1e} ,KϓZhn" oz>-, u:+ʧNɮ߈7: e+;㧙Eǜ5 XT;kQL~,8k3h U,uJ @9lu^j*kPmHkֶA=i-=,},'}g Zr\nM~4 6k;Y1g4πo'6`w= H{:`T+_W Y FV ~M3os&9*C*F|ڮz ×~3K t !C)ϲrNvpzR!WCB NV ދ-rTJOR14MO+ö?Z>ZFmj'!k6Th΄Pd,z'ZV6F-ef֩{ &nbc SV5 BcL6 T#Svn z5Zz8LKQS[oF[b f|@1,A^Q4D -$hLC*3l1.◛P0J֞"ga6#qztů8J~3{)['IKծJn[|n3AT_zG'pLKvt8XڵW81tsil@( ,w{,qaV1FdDOzvLo:YCj)E3Z$ھb֢m cz 7>Q,<<뉹P*Jb̡&# ǪEQGdR6kr6 _|j?CxerR64 ~%|IֶJV\/a}˶%qiK@fo*g71D}"+)rfS_5I b&k%Z/Q7bWURLv醖Y3&ÇKHjHx "%3q nw1wc?4)y/6ҙmﺸ?Uo`i9P\ ܝ>p޼(Jcğ8peB3E99IN*SR(YP-T,m;bE=UffIu/GIDYjNss틬xVر3(^u_Ta"+ PRK1F1J-XE*F?_gr'27U[潙zMo79Qh#++ߌgȌV2)s";UU|bMRd*CY!a>1)~#4joJDѭ̘Ň ^=aQx=GT6pJžvL;SkK;mt Bcٸr+)tnv&8vGUjyh-kc*KVWz?ZYj4Vա2Տ3 F j8 }BτxǯYUGHjNf+8<պi( ֏iS,?(m)=)Z̫w` e|/c@+g&8D[XDfeKo`SwX_w:`,5$@%W2s1S8n %%SiCg[c-oϻpRR_}{T<u ߋxa ]K-Vo&f./@+ 8xxw DC -Oǘu{~w.؋<Ӯt載<ϼx0Agn,/Xw3_j ihlFfcy^pVCyP]f3v#ĩ9F *1dP 0r`GΨ#s HEӌ0KʟG PZj>!V\m+[۩\hLԢ?*E*s=\vՈZH륌,PjPY8.<]z->[z6tGْU9s|`)GÝdϰʝoc' áh1˻F L&6T'|?ʳdA3#A\J)~1viHǨ2!_! ]t1VxO&YB$,ᮋ;\Fi"D//rposvcEf$+!lݩg)vcıGx0F֕<%DMqyzpM8tD*'q?ELტnj0 6zMֵI;QZh5Ug;Q3c3)SAD\U `ueCA~5,m]n׹ԢGY|]T-GNy5'$Bf?GX;a VW%1"ʝO >>':-8n6OPguKOW5O9Vϟ0d9ŹK.ma$c&il3I E2 qzRnRzL9;=ϭ~ߌ/\xPw'hA.wq<65ө=ea_TʔMcPLT,KE0IKTPㅹ;1@uFUZBd:|_j $T(g xA2eg쏖_4Gk2Z&ÊŹDQͦK48hc8r&6xbARI>!܃_I+B8,l0U# j` 7Rg; &=Llfߤ/L9gY'~_| q}xJqTnxvg'9)ǘc~WJ*embu1na!wQ@h5ȘoLcr =ɱo+ɵ~60 _zxx0t8ž>?j KpL^Y:xtwq{/J/{нvn`XvGݥ6&;ӣ6OTKؽ,ep*pz3QX4bvaӮ~jkjz+% y.;>8 'a+??9m'!ap\ԢJX91[5l*|N[}|&[]5 =uĻ v8#"R=eczHƖjIJ64'+_>y9 W1l< >BR\J< N]_2)$@8h]\l|%8ݟyq(t˫={SIp?ƃ;L'DOoJ&GCm(!g$kKhm;+>}|sRwr Ģ ʳh(l8`<p+j;=t`ػ"iQ D/Ip~ * Czh1aN/M,GmQUu9WfhIPZlz*c0bt}&=Dt: Hڦ9ʚc`.XQV8;- hhHIw/{Kx)=ė!F'KKfŷ4%I=#I"2i~d$_Mba}(ϙvcv1:ۍ[- 1 ;gdшDÙCe 3J~N_u@/Pܳ/Kx_j~K>9d@;{ܟEv(p"\E6Z{[ Gdb@vU Br$bMTEf߃18uH0O${aÅ/OjEԲf9(ExX9_[ gnϺ>m4֓$p<^ t+?p]L+Lg&1wW,4BD}*Mc1^]L"tw|?71|E|)m-Id!8cyYKщYTG棫xxɥm[pi tG'#Bb&flA$7dcRMHiG 28kWzwx}MAc{mufRtbg*%w-z8Xg~gmlwW1tܩWqsn fOX?^W^]g]a1#%~7+˜}<L(t1TOxnk3W -_[Sdh^ c5a \IrL^D{iXrD)]{ȟzV{G-IE߭T1И3# Ip,&PB?N3Zz^_f˛Aj{_p'aJұj%&jᇮ‰)Wnnݦ[nİ+%)^|NT8ҫԯ.kV֐J#:羅JЮ Ivx`?/w7wrf JN`Ͽ\\7_^"&- "Rǣ `_`0s|ݖ?k6o"bF G4b|&Ʒn"@湋`e f ,e}Њ?nÞ**4%2U @>-H4VB$R:Ȫ9jJmsY?ز rdj"̊h[xt^?!A;H7hPI23_Niʦ5 PI^Tm )YXLі]?!_3UE ZȘ7vEt4ۆCsb L Tr d&G$ jQLTrLJ0cS.pܹ{v&ch0@Njq={}.]7J*0zU/o\p}ޢZRLRZUƗ4:db gOTU{/s,u͞, cnWKjiW =Z Sg 3GCO8;3\9[1,+Qk4ŵ`R6(0RH] f ѫ1::ęQ g0a3o8\:>9]qF~)R5.w" O̶U, <-j!b;q0\5_6KwPAf 2Œ-0C=?gv-?}::?=S7;WK,g-t:mvn+{L\%nNiɽ;>>/y )q}8R:VN\ÐS:pSWiSIxI*Ȧ lyd:y2-B2AԷ[FXl}{ B"52%Y}/ /d@'x?2ժNyRJłvnXQJJ-j>~[rdK>g/a=͟D]}vwxJ[)AfCR͊ΙXڢ9zƒ 83Ybv8K28hCtaOiX$x6߶;|5ҫo^}cN)>qp{/eɁv))} Pa1TYFb!p=x| wAY@?W3[p8d.Z/x9@KnVʱY_d<{%%Ο@]A ,IaL ͺHʝ눥!\ҝ :kVzاiK=Q[oo/cf㤪_ReRΟl!-y( =EWV̀FB>Q;%zz$[qM)J?ܙcNo .+m^\OqA8 |zxp9Csjr7qF$Lt9+̀OfۣuRȴ"l Faw 7`D0=ta1R&$ofe9"1n\XZoO<{ToY2նŋCwqf~I t-4.!:E|>[¥up)&e>~ +wr.gbgT TZ ̝h`2cDl1Y1Yf^oyh:aLrhj ? |.>QC2..fnF;spi֐> ANhhplqӇw }kn5y,]0w<5dԼY3Y*_HH/j\U8YG'hgnAO/iJUKkqV#TNQr=&iZ*y{%0ZeHo/.j\:[cޑԧ~l4PT` FYocP\.u^2/O(BywjEsP %\&xM'LC8DKEt.<("I >Bϥ}5Wmqִu/ FE,b4l#tL{=2AM0ʙb4^x'6 qi XhkG!n&!=KEdpi7x4,~Nę@|-$Hs ,#+13@ʜL/ԇ͍GV0f:xɢGV>+޳WjTp5ЪoBj7ڎ*A>EMxn5S* Jf2t?oN]&lxY4Iֵ)\F̖u|bquKkkVNRzVqudT@28wi5A|nyc=?o[_cI~u^U~;yr]L&/2U]kF<_*~夳3J_ Й]J朗fz *DXߵnpJ6L֛J­(=>c`2^a. .a [XbO){;"1.q?}z8TkVmc'06pV [l#m]}cX#`5ZM>g#c1.C|^?۾;u<)HJK4h}x7^tt8LsI 9\jj~Q ;[1隸Ҍ˰?Kg$ścRN6`%# NX}a8+EءUgO?cjizW9ٴJZ>~oVK)'X+oԙ7Js!+g `+%7`+UߖxIaqZL&q3қ%4⛰ )(mNBV@W9mz0b<@1"C"ږ6+#A0-snkߦUx}x# f($j`wD7?e/1$oRskk-x $1ϢG>8z\;x9.|Yaal S20:HF†%)nS^ṕG8 j"#PUlnyfaNa 'i ;i` SϜ*K[1R;ة.zUϭ{d4];,ty3$GF甞6Aq#0ޒZf.̞ܸժiu^sEzz@ ;rǤdEj`,Fy)t9J, xzžs'--3<8pp9ʕTPJoD$_H!H}ăuă5c8yXd;- Vy'FܑpCgwSXHw>ez+)"K`+㠟Dx} O/6wOI~A-~G|W -vx9H vNu;BNf1PGz 3c01Ƙ '[ ,S+Kfk8c2-46ǵlfCP'oDH2fX W7Œ:)ܬ1ʨk0w)aY??P"~a~gҽ_fymx; 2zKd(x^䗾6+<>h|ekҙrj fQ0/+'yor8m{2o6!s 7倯x'ؐ S>$>߈;::qL-?^I'zy88pƖ^Ma%}}ϧq=.Wg;YM.ᏦpzN&XxiqH\wR%q }9ciX8̎>K]4Aڙ!4Oa)y>vO 5`vS9% vp=&gIJFi ,/@,OM B׀Re Z9=/Nv۠@g\\{d(,}5^WM ֨° zd: S0@/'K_R]g>֠j0*PUYjR?9T6~:":˜rZg>]4{-GG1,7{ rf<\;M눆+<Ḧ9B YpL ͢4q߻mz #ѦC`s#MDmr,|ͤ{*L# \l22̗%b=gҖ4<K3±0=.c*=C$"rs-L({| VVuzHF$cgLJ  hg;$:TUT:- /Nl(S `-XCGޮ|vWJ[r)Ul僳T``rL'oþ$uWס+^fܚz4)/֤L ~<U6zވKq G1[oTm-"=b%r;uWWYmm @$f _lhuȝY1/xO%s0]9ׁF$* i:xQ3RP(mU΍6` JD/3'Ujs??>OܱͫPkQ&EZqVZ?*o9*WSmM8o@/|㨯FҪORp+q&|D@z,,}e&'K8q{;OiŸ{mE?D#dt5L#vT\#pa6.-D;0%ͳ$zhfvx${@=X'pKm&%La #psGhʦ oݨL_"=_>z_,YbcIKV&@gNA-'g\KB5P"_d<}Uvwgb8^hH9FΛ,BfƲv]o 5rpN;.cr΂~⇘KLdtuc r2)9 BZd~.s:dZg3Ts˴Y4I ͦπ^,* =*scO⮐\e߇ݚ`\~`LaUUɊ=_/K!|V_) !lLSn[TGp@-PY+UNty7SppfiNUK&]Ǣl}p1mn6')Mej,*'`5)VB.x IDATka\g0I)2I ϝ}W)/npn> BRQ)-3) Be|>"8ڣaZ; ƀ9̃nexN2r@digIP?Hx6t4`M r.m#` ̜PY,[ ,'R\^ahH(Wԁg, @ #ɓ.Eb6Q]+?f{6ȖW<w f<,E,b +|s59%-[W=M,RscY7̈?:gȲQPjiO`#Н7zG+Gp!<J G wx6[]4;;ѱ3o{t 4c~g&1 51Mn_w3܁0c r/@k ?{ KRk܎_gZ`ϵe%+9.Dt3)CyNi Q'-k [Z!&SғYtiM2$\֧V\cev/S"Lǂ8o?!rbxn"ȣ/}L=쏖y>x|2;3N>swnG\05M?4Whpº `OZS} S % FY性f΂ }IolE;huR̉{3*M10&_gIj!W3va %[noh rr:,_lSl@j/K {\|2 \gILj?"\R3}RqF$׊(X0u{W2u |* ERT|!ܒ Qy$w[W7y4M yœ c}=~6 fG"MFOl*!J}k`?HM>JV؄7{ЊҊ}I= "9Zovꯊeڲгa_?SK;kż>+uApN6'.dz̧~tt G.!bY7 d'A1ώXtX3tS\E8^b  40Kp[T–,zӟ?I46>51{r0,lfC^4 ,4C1[bYy`Px3=5ҳ\/cXPh;DEq˳U B̡ey~4_X'me+ 6:0}㝇ReR*S@ (1"FRw -GƠ% X^{*^\ W8BL 8&gEx:3mKڅ8 e)@j%K4;vH_)riS6YJ]g06!E~+kEؼķbs {Q,C gyXb7 S>Rb ae5 M['F*"]\0k'V$CT섌n;]|Gy\fPQkv,Bawj޻-a9ckd@L 1LCo{a36r:ak+3meeu\ı2 --)kPe{,2rJi.yw2/~o.Ы(i uwVMԣ'?^e#&6՞0}N3uU1e}u%e 㣫zv|$OMz}ؠ] |:`, # }4nn*=\~E|B=.S~O 1i#!n8;o.(#|NOxb$h.2Ma/Tqdi-B4 by K%옓6d΁b30kkǙw=0< 1 k-gi Vè%oM ,)=,ovgs-Og MGbRP JA厩 ZA9ix A%wFH( T|f 6Tִ")Ji+jW[Uƫػ< }#?T9h31{);6^H&ĺxϒ0KШĂPb1K')'piSd/ts"IxpcmZrzo?!-u\|h,ޢ/D3(2 Z,;'I5ǡX6f!q«A,PNchM$ )o`s Z̉3%n YkWb7c"i+<"N+y:blvϼҳaa޳}=._oiP Q5NW)-Tb;g58T}d<TE9{]m&[k ffy:#p uf|ғ9*+0[ն4mvWC(K#2Q@6*cb *KlpHl#tɚ? ` c(3r;Vŭ'x%B?O\=Y<";e}Ϟxir\ Η哕P}'yz^F{Xß{@yaΪPŃ"a5Q* d+.Y[z=52c&́Y"~" ԝl 1 yFC?svu>0_gK|!%Kϕ 4.O_jߴ1,AuM 8K g"[9kKPE%$,wZ*"js;/_ZUFtH8LT)}W~_z㇕|1j.jR̮ӓBVl4BK?o%5͓~qzdWT@R=I/%"Z.,y/=N]w葡lYur)*I ډo۴i)!K`Tbyѷ$u}9OE_HjKՔr;_f aq Ƹe[B72Ӌk0<<77->fw(D8p:mnŝ}?)/[ǫΣ:s?IAJKS\в zE ammYp^qw^}x/e iOZ {K>zuW==.;%wEjy,ѢhJ0Dhða?a m P%X2Mӂ%P) r.cgg>x ""3"22_WU=Ȉ+~_Fs!Hf|<^@ᆤ6 \3!)*5~b_GXٰ,FHuEMFh**CPAM4v[+A8hr.وr.[cz>+Tz8ZYu?!PpƲJp]R<*^Gc[.M|m<vCǿF)}_Ơd|?<׋W^–t.//0u66+wϬW/e ਗC뫵pAǨv?or~>iхHhElg4/,;s" *# 3d` |-?/Gw%\uHSՂ6 ND!IYL yPcmF@BxJgdBؓ]4[V#կA"Afˁ\3c{AΘPe~7VT)Kّb 7ZdJ}drelw Q9(cxE8נ ЮY$EiU۹|ag]M?l?U@YSNY [*4EХB5xR7̍r@m<:+-6&).epS1:?܄l^>xW4F'ӂHJӠ;N<V>_+tMd&k4>>m?Yձ %.d:d;5z=,SFdG"gxYy_D!}jh\@M*X0T7SoHM@?9N |Y0C*GSd4%Dm⤯4^bvk0ͤf"Տ05d}ǔ@W \l郼"oފ̯kg<}xڮ+fw3+r@_CZݠl .TŠk/)-S:!pkfO!-'Om5Q-Mrc"ghG m-BB"H`k AR/Ti*No$Vq/0Aϩ HC:m*!zɴךRָI4auX͟R,U"ϖ=8eϰ  s CVqѾ).V pShmcUߟ'sr?0lg~\YeMRw8o8DILKgs⁓SD#|[_h 3Uh$_W_G_0*!})) YZ\׺<0U Žo>RgEi))X$8=,ܯA!LBmZ*CK➏~ip=i5sZk?}o;EB  1)"ǾcE@t*bA`C-c{1E16EmI< $7d6c'g\Tv\IW_{1pJaDm7,b[8[!YլnnJhK`\B5~2 XBt>gU/qXTԯW7)5I(ZZ1Mu>"oמ A2oʇR(9'Y_<_{|71?p{B{; 6ba<7>hGNv?y$(~ۥݾ\ș'a0T CY9_ ('$E l'ջ`m =yЃR'ܓS|Qo1{6º}*3f,-Ԛ J>6` \]l.clRΗZ~y'%ܜ{ڿ451S&Gb86s$2lM);9)ivgT_;ވGoN0:R5>:ɦ1DAT kOK099}ۓM nlIrU9yן5Yodm`w$*87.շHiLJPTB<") -<'("3OIў+_V1V7x4"Kt#Bi?f+O>$qG+/5?u΀ n}٩m*¯9bnj_`b(Ʉ dZߢ 6W?T7ג%myF<9 Se.CL|~$2Ž` 2&V@^Tb]{U^]w7 c #by';=ඔQgq :mU!Km}򥠚[gAtNV5]/vN%9M`c17WMD/jHK-rz3M`3Rs[[Dv6b9< 1'6E @G:M%tW$ɛa>IZN]A~+1 _Kc)^R#88f?AS܅19w2αLl=r<~y(qZ z̵vI($巡I5Y)mWl`@^fDI~`{EN|/$~Y{Y`fcZ6v8V)PͿZ$^_26*væc}V NBeg9iZ?jA*{ A I?˾ `w1{ط!r{z}~}Zm.]V >%%sƿN-p?2w$H%)1s!?Q"Jy\W ANsT``ɑY/I~.mM^r "BMtk6tB%A1J!B+#n z/L~a?-K%=X6PEvl_?hUY ߤ]*sp %4l/ЂR7K _uFmq} |#CV%WC!=g[=$# Kug-^x!?o<&g:7>bAQVX 0Uav)ί<`ğ wkEQTv)"t1z_ jG}IW9ȥHExS'P K7*} 3Ht @j[y̅~p0~|\rt>yr93/#Xy> ~42Ak!f o?0}Z-iLڊ"J~#%&cdGSLTjfAOg٥?\n-̀$;n X6%ry{W tKkJJ#'^ ;)@!j='Lhq~vk| Mx!OJ]c%?o{kݬ( [ ǷU2!sQz?l fC`?" vΣgHpsC%THi}j YնRVϚfk|L^ƫ%tt@E/ہKa_D˜ <ƂcRᗀ-=Gі.^$(;Wncj %?I?kOtP_oZh,9Q/Z8MRϧ4=l1P`_嚧P4o\d/0> gس?i'Sal{dnw! Džj>_EdPrSg/u_cRDI b'#!{Kgb'pcQ\ O+TtrˁR[!YVⴉjM;1w5twQJu6oRG,~DIu`rbD cϝK_ּ9o3ݤ`_[j{%CZ[Z_ol|.{ 7CgM >ob)Zs޸jz/ j\n!.nM<Ҽ~yhor QPg)5Q<1ޘ`gIjẂ0y4:y.^#HkTllﴞ(wmޡ;Z}=vB |LAÅ㨇B wӽ#(8sA*K虊RҾ Jy M0ht={ޚec_ Pnw#Wnv@! vyN֡juJlzh`9"pol/֮ $)βEvPp[Qz_y)_$:3 \0&2yzZaԒ(E '/K]gQN'FϪQ68'KC`v9fkmB+Q5s.zfG_xgNGQ;9*F|ur*}V ԁz:AEmm8*&}޾TUֱ+J?? - [zGb O6Kˀ?jys7aa6k>VOxn= .v?dIT(3i:c`x1y'(j#tLe q2+cz :/_mBsrT<ىcveX~#rTJ8HElپ ր@§N*=0vwURMV&_lsGk%aW>1̛‰~ҷpS! K?Ϙoެ9-B%#+ضƯ%+_nT:iߙp/-*TG/b$1ꍪ-B~<,Vѭ;}~gO`OivUq9"I8x|5Ο Us=b{&]8AafhwIAH"=4 =GA{9\$I$Ie u?Iu'SJNQYxl֨;5qU(DB5j0ɕLahB~u(4饎׍䐅 ;͋oOA* lCNM= #J#g`d~ӫpHjuLjaCEWjs?te}/KHAZ{WL Ao?*Dž/?p:/_Th;][m칷5/_Yo='JgSdY; }{ކƕXySHhҁ[g>=U;~dPFfpjYZ]J1Jsb0=ONaҟHO+`k>뻬gS(M"W6ZIN-uAK-P C#٪+[yd ꢡ!9 |Nҍy_.ضs&pAnX;5 =GmY*E UC3әq?,k+Ok75Rm[ES/{o$O- .;u(J we R'G+ᔶ/@\<`o' W b-O?rYz2.uqQz:'\Y0Z 9.v{is(_h;I-'Y MFcRo=n7hNYR)!a]}=0D?PH@cB^n6ݐ/e%I<Wu'GH6Wj$l"]ծkaŒD03Lm1)R<> &;@sge J.Ko+,5R(sZPE_P':$]jb_&4 s#Z~΁Iw:YVo3k~[{;c6=j <Ο% ר#Ymil#x0+0'~P@crOA,X=YCʱ]NVfId* +$xSZeRi"<|d?Ó&ؾ95ͳkPpk d 'I$m@*i!騉0hru:rw4'"K2uLuD'0 Up6pAگ+$r䳰 Eׁ'J/kHDw?q߰>5i}A/@M Jp̑-8'0Z!*qm!gddMj\0-+V Pe:۽3Pٚ=\ar"%S7+}j{~a=;koo~Rh;W`}r]Ζ^ ڿ %W[-2JR_]/s?\7笀kA)o3>/H:gˮ!BK ^p^'Vr׫tGjDySJ͎_*,oGT~K8cT9>H"ȸJ"P.H$/3;҅㠄LtKg<7ȲrT?eWw1}@By䝗ul?}1 Ҿ̲QWY׵jϷחZL1FwWasixY~"W Կ_>z'㓩1GTt IDATp1nnv!HzD%e7kK[(3< r<+<2WNYs^^$/lJX.*!5:{g#;W*v~G:t=bL-#DfٽFbۆemgo7 ?#\\B @kթU +CY!QJ5nqZ.w6Z}RϾUԁ{N|oOSϩ|6U4#9(ֶNd*~d(ٽɖ ރ).XT: l'ɼG`@17q)P{c#BuA2d1Lbm6?2ӡ~`J0&@|Z A"ҋe,׾ ut[jb>5j`d0rq/Ol1,:P"v2% AQMK[W:,3dB>%.yy!(ޒO<(-&.G [L$p7  3v$6Oq~Aq7wp'~li0~"w#,E: ]!v %pd"UNpGk4ujIAp]c!G DBQ(8.)Eb#ǹ)@[IH }C-aAuf[;ׇtWYG&Qvyf'$J#5aYP,ȕU7]|6{q.1o$+;8'*Hc5Ebjܺ&nxWuHMyUttGE_e ʳ X~(ON[Y7爧,.O"mv%֟S$\3lzx{_Ե1 ?p>VX4O^89 ƪs2ݣ<[UMNd`N ] _ȁ\kO!OGŊ7}T~3J.{׬o#bEy= 7R')L s5vڡ̀ͦf pA# &7?>{YO0WzI 7[Wȧ?|G59_7 y^$V?O*C CRtIz皈o<{` 8ƣj}'1"Dꇩe~oCi  J<{آ\ 'ygܻ~HdX.$I glP?mRi_t~!RHϐ5`p^p 򭥨>яM5oh3^-2EY7%c5?@|qYTl6͡:7sA9Ӟfq`gq{44C}>3ѓ*^۷_{bƥI̼:9iv*k1azfVD. }uBZR~wڶ^ a8!7oRk> &CjzT}Ϋ  fY/e9K뿐6Eoթ wzr_ϋ>>yMcf$!'~Mdg7HUĉg(ϏW[|Oɐ{XO}xI"]: I~&J^P'?I}lR.nGe{w ! W*x! 5 @D懚J|#7hQ.P!)&|I1.o}PVc<|~vc'k+*JxL_fNU8?:><)*/ ߂ዏU0VB*;ziz=`P'{,|—c\r@!αsuzD>z}em~ ]_\\+$}p3Fm/#TZ;~kC(99۫O0:\`YӉ}:jfϧ(3_<:t<#m5P2'яM'o"eMmw|8Ch+ӿ2 *o_uN2d9i!$]kK-$%ь%It :~{nU=Lpma=?Dw2[_>x0szݚcz]N"]9~k(ÓXu(_$<A)!\S? | yVҔt_l_ @RPj_%C~QzB=Z<+ѕ~S*r&tC` Jf: W-xSx.Xs9fKBLXal$ͼTY: Qz#5 B`DVa&f0a#yD)!#$QVy9i_Cٔ'|@$BIH؎=:ɔJ($Ⱦ/t΀i,\Ҙ 4o)╘{?)߹n:Êqe˞`d~/UӨIoh4N3(e'ϼ>~\8BC{ې_`~y[~AȜFxQ:o%{-Dxo-@9IP pxZ d!DR@oEqۦFQL χ,iP. y\9_;̽]&ٯo[k#0T)喰9@ӛT|nv𵒼PSb4")= D9 [rLaDPy9&N nOwR?L~?'9%7rױ?y{k5`} D]S N2DU[Ԓ@oa|+3|;_^~'KHEfhک1_fقoAډ*X̩_Y{5~&%eX{q#"RT&@7fٶ tI?M]žgC!Z0'bx5W$[uvm&sb7u(n4 u1+p+P}s=TPׂ,X ; [xrўIkڋg:/ɨwjO=lŒǿ/QM k[X4|BQ4G{U:?{xy)uݔ{c3Dڇw !Cl1HAJ)V)ﶧ6~+c7L_BP@^GE#L3B?c?㟞~ ~"@Pr#J>ngUTzߪj#0λ#.-1FKҒXNOR\ONj%,gT^TI淙gPK1!1m>c> VG>y s"ܪ:%}[>/o.=W@nWWPyvYj5ʉ$VtS 3I'"V+oOg$"ut )00 5-:vNIќ,6siy/>,8^7dϟL ,œR,U&Gv9e0$I.m֮AQ qlǯ!?Pe@z?E#*iefw=r p%S@ 8'@M" )Z>Ym kS G/H >* CŒE1%U@wFՅ9VaٓC9m'ݖ' tTN2@]5W/uB7~{>84+O>'wxwe݊ d*(azYa&bz}ւIQ!ҿiQ$~/Qm(43gQw909!vseF:m?g6=?JMsz;}:o=Kw\vډ>b 5HHPiih\w,h)K_\"!GQ!(q|-ANZȭaVT=kQ9Vxs{ƦUF-E~ZR-+՛p/U_ad1ۮlY`?p@8wX  oylXN֍ V@?/iLvq Y0*Dmu`.N{hNz2t/U-v0Gӹo2Ⱦ85W.h[s0z{EH`cypR*_uJ!ox5uțmnPT[id)u *K˨8a[f,nZHtx0˻ 2 9!$=@,2r= I4c~G%(gbg#t944cbS ղhD9K$7q]|M~7d?OvT ӬqnwU24 cexDžSe(>nэ\Rvr>W0MFY1 1[ 2<=ÅG)6UH Pa6xDdBۥwpok'Sc]QQVU$6R.aOnE@_wk^¾۪} H?`Ӄ/:.}kVAKoKoCofwz|eѽgkS tY amyt$> At36K&z1&6/Ku>YI{jAW2ʟ"6V"4j p?TCD\?F\/!z$+j ryhR#S\?>J h*e (l;!p܋?;#gV|p{7xVfrϑ$ 0^Aa״CjSr%UMGGSkOi*H|I>[΀UFZf&BmzJc}QaV~Gr!6UUAܭi.R*l#-tfe#`w  0Pa5|dfL=uroRT1))ZYhP0Oů'Q**ì*hz)$W! ;VLA(`/WO@Zii`~?峆#ײPm?;t~T;3F?OߘY%MTKt._tȪxwրM#N3 ;QNGx.HD .s9Nhal幄8T8ԯ A蜎&!(r`3}8h&_ \ B?㝯ͰsIs@?rgͥ-`T6~cLh-j4kFT_uA7_TjvDiK};_5%{!كݗ^W!cX9= vNeҹf12؏ly}+pQs^3Sh{2ڱ#?w_[PsH .I-e&?[`|'_xЇ!{0 R+ɁtZTm2}Ւ"@>@VR嗍@nw[X>Z2G(5Gѩ1F_4_h?Kޏ ?-jbV_(tO)v+}+ەvtCyS /SC(怒g4ϑen geHߺN\d)f w$g]LPi$>rY}OMVqCA 2.$0:,E&9k/p6p&˓P` ٮ)u2@P%1}魇Qu<8U_C1% s$%ˇQoSpy΃S Yb:5*V{~aж~4ځ /eO%C?{Q"$Z&ՔF2viì67[VWByˉ@?޹KT}b"xT-8Gt* g2 (3(pOl" |X{g IҰs@%L"F`BCO}3yI@!R|*J4o(\a`:k\GV PԳ4^`49q3%֗c!2z VͲ2Gyc}X_ߔwYߢmCu W^* i#s Й,Z bjF?=? ǿv,44'4GbB{@O" :Cx5yuza/ 9܃f(*sD5Lg:%y_EL'F ( kU%]`< uL1E"Mz]@Ns*HQ1: 4VK9oM_k3=™ќ!p 5Э}Dć1)F,=xC)#ǺHM||j {UwF3Gg1z1̌O]$%Ia\WԧK^CHzzzD^JfI;k<>3#TX0~^|k#B/`~0v#b Gb G<˻m @+}1pa>CfEP=Ֆ>6_=|{^௏*Kyu]p +>]7lm|/gbԭw8 9?l߄Y0NON/w!*/x;Z őK mZfH)٬$;HW(Tz1 i_1)Qv"ǿE@ܦC8=4NpvDp*dKV%)Fb>&q "/`J$ijG#Hws|x}n %S4  ~h {bA7[b7 JU6^](E21dZx4/_yacu=eV|p>/vW5*tO,RPRk뱒osPiiOJ ,֧RT']zc`}bƯ[p5ne~M И ۀ]w T8 G'M0'UP%}4ynk(vjVi]z>O emx|Q)Ʊ5<2h,rԬK[jgK.'v˖sk_;O&9738vzV ~q!+ib 9)Ixmu4Q@riS |Dv+E;*+aW."M &ZGe)R`k%E4: Ҵ8"b%ȆĬ5s&{UjD׆(dP{3#CC_q^㒵ܹF Bـmh%Ha"X'>kٳV{L4 8hWyØDٷSclšpe53#;@U{?+iIҿE؟@NM)uJQII9-WOU4;M.`jL%xV?ڎZkֲhCEyX\'\H󷙀);7V:E teyV \矨OQXj}}X"x7eu=>wP[RUTDTcr^:J%\{𳠊ҏ81F+Py~;DSe:N DORUsm`szlJraK6l:\R}oh|cgo|'{|aTŽ!bȦNၥ-t~X7/mݘ#p򅋪@;dwY&pHสHe)~ېWmd𘁒1d"`{$f/yms XFbV #KZ1@Ҍ'4s#~6Bt3#{H zLB~@{ ѫ'S(? ^\'OIP}R4en2s<%Uʅ2O^7F?oo߻V- :]/fV8m$6R93>];?wY.UvWs IfռrAjY?f`0's$ȣu odr1gE$6??l`fw\pZ6! j>}r;A2En' }d6[.D bT3<0Q a2bZ|8Fe q9NZr0df1Aq>'G(k"Y+@윱ton!8O\hK'fk?~G{oPZD55LHJ TVU6q9L6+{;pFg"P,v`wj{4 ȷ WpHDQQ!]\ ReF:@&O!fGbIbwwf-^)0KVSd©Ɛ+{5n5n1Zh Nnuݻn;_/Ǩblt¬ǻc#>ʟsr,"/.4>'8&F a1Qӿ )NyH\ 2X=~*6Fea޿!GkR! 1 P <`<bL9󥷟0 %HHgJ(ԳV!sb@$e:3bt̙ 2 {`k~'!2CyIdq.3V :QPEfEbέ"*^Bz/3syѝL/ߙc xJԢJA5%ֵnmo2{. #W'' S? U) \i-Pͥt=. kZo::ǿ037TOIT枋r 9'&74h1~B?O^Qb_fЛ}k|e51*; z@PRsUeO))O' #dT6>K`hlDiqq'GM*b^:m޾23PC'f bO>5-]d47t⢌1S LK~r,cI6;Hջ| w+=.ADޛ`B7=0,?;Y*#W䐲PfP?=(9ϛfub;i.y D}"jJ[ݯ7Љ- {IrՉ}}v~ΣgkbcC :VA8b7ذ;]Z`H1f~{TGf;q`N2;'|3`@eD1Sv܉pp{VQ.JA]_&*:T `R2;ŮvĎ!@$T8Y!Q8Y/k'"Hp}.@w|ۣ!/PЯ5kjb,0c3O4+`۞i$ԤJ~<9O_3=MfXFk.__Ƚ]O[m`?g%+ mߴ- Q 9H8J1vwAxa15Gs` -n'[[Z}~!^7^ex@5|\Kie_\N&ͷtr'pGA= sd:^2y Sns" ĎGD\Z]9gG=ʅ/ε" ;^!$#1΃^ڋۈі@an %gQk<"]+^Pۯ.Ո:%9?-RDiRqb{\_!skTc6P ,^| 6K dz 2L߸|4ptBwL}ZW9"02 Jlvp>p! "| ":UuK(n#\YW1p `L Ye7뢟, MX(("{~Eǖh ?<eZ4?f\k/fNݫ.08߇Ւy-xf!s;m^U",J IDATne8q&Bط~vK@e+8ZTO*!nȓ=F;:d\)e-R'"޸!G>^G p!  `BHO>ǐ}+aQ"rb)-`Hj]p1C58KS#enQ"ۍա c\'鬀 .ė&3(Em l؉]mzӔq^/jp~\V[ k1&^@G5Lb۟QΘGhaϐ1bm ƐutZWuHƇdx D}9~@FjM)vۨ0I?KH8Gxmk3AG?X{כp\㵉3ƒ9Y9.\[[$VDa=sm.;r"9/$ VDms ~]o (O32;{HĖtR(49h@8#&ho ?ϯTl9|-|Eb,RC')$AWT׵W5;1qʂp!?I*\d 474~ g4dU<hd&%`;&VJVL3H3sP& y]{o/T)ϱ@XXCt1<1{?rFi敂%m5OV?OQ+D &BO Sʥ V簺|K~{(Kζ<x䎡и~tm (*m}. F  > #fxB,]/:I-˴‡G&K!O5xa\KS&0w 8Ba`AI!픡~E_Y(I<E|ʄZXv8[tb3u.bv_e5{c՜qL^h >^{xc` D2g^Ǝ'2wҗ(;`<?IHCy_ r8#ae?"{߈?}|5[2] OE4ı{<`qQݽUB×"Bmj ̽+:dB 8KVȸɩh67x0Yx-͵xecKhQ?Aj9RS8LcoF.`<B@m g"?8 jg):U#>/H=_̿qvӜ͎z´|̗_g_}|GރO/ '1f4p3Ce=uswHl9ޠ F\pf eu(S hɰsHoGMyvHYג(x  W[GWvq0 ˾Z_8w,V-6ꪦ|M[mc`%/&$P祠qzpMT2~*')eLAe Z3ǁ4ݤmf 9Bxq/?'T9t [l9)$R2KH LBُGgӍ'IٱAtOsr"(]XSnG8-+sZžuDM'g.|.u[) M ֟rL1x>w}9Ը8Jmv(an:^!C 9#TD?Ug ʔ>*|Ylm/K+l3Hxh±Q03|>Sp'1gyZ2ϦV adF[2BhIUL?lΞ/A!KHi#k W׵or* *)5Zbq9ONayuy҄K[d!"-] E# &$B}v;)?eX2/{cw#)7PKmDH"Ō:1r~>w.>| o~;Bc3{9 Z%`Un<@v錎-<ĝz|"+EEO %LklQY>>KBliT4 gCq^""( ]HC|=Ƀ>b{>aUֽޖ?zT~KVx=euSЅ@E Y*We ןWGd4ߞ:'e%ZTwey6v6;[^*ӬB '46.ķU dT`Oo"z-t$̃9&NɄ?uO  \A'/xɵ{?w߉r.0⟑q۽׋vnXq@U ~_APFH],*⁋ڡ+O,2 Ŷ /csC>qI9O"S1-`z^Ƃ!yܻAxBVcX1ob>x).r' +ly=fU_m{x>NMy!0cޖ@rV[@S#,2yB<)Z`qhX,x>m Qf\֛ ][}o=O/qڻ3!0Q;D,Vbৌxd#le=Qh7?3=d]je`B;Y;en=D9!`%3.( #krV~s乯o7Wzxk+F7;-zj+1Hvԕ eYX =A5Sn+PFz.OSI꜀&S6{U6KCN &EiV$ &Xߧ @qB?*\)a5bI^ kb{+wj-ŒH"D]AuGc/p- s\ /,>~Ko{l˝2tyl֓AVz[oXXܯ]PHcd9@'(WoW!m&p ( 67;=VvVJꖑZQ2~ޓ9]{LZL*WqOe/);(3roy"}BWiJ{+23Q1G^-DL^"$!<^iNdb̃ VƦ̟ Oc?|ì|\-%ܿr/Qrw1!}zV/V8<'o㩜yFǴUn|윩h$#L]~{B੉O#8n ebs쵰y1o)DȶZs}?z~/kL6Jnk<>[]>峐HkS{毼fd ^/ƧO 14Z';yG=4 D÷7ClM}m G~w1"L=VȜcɱkߊZ 8>ܳyn8[1zC׌4zU!"p0άWY]]7ǧs'9Fm39׳<Х &xKpUiͽ7n}pƓȿ"|>1\^D2 v .F=Cu3g;MZK/d Kgp-Tsnw4Ԫ_oWVlY=]+9KSՄ|?#[R;b:(%uvN*dB?Z`h`:Xʊcgo#\:}k|l{cѷ>-rA@^/ +˰%/ n[e˫X:bᥖ F&S3{9ǧB*]SyC/}0O{(D訧Nj|Q7WwQ@684?[Bs/$zWXKػ[B}8 1E7Yo06ǿԵkr^_V)8u56| [BLx_n} WTCE1sqjτOanۓ*sl Q,ӺNVUO5]8+1[q%ww`-(;R@"z׮>- ?b91;NR&t畻_qnmW&aX Wea7=VieCC+QھevPv|W; 6Q Sꄅ$iԁ+ d&5aHX}%ebP?3ϔDNmߚýʖԌː.컜3ܥ^~-y6?M JFXp?",/{67s˱Ӌ[ {)=&u\7Q 4 \)hoJ#]>ѺgQE '[Ci1>1 1{2+P4@-G SG@_Śfmjzldt0oŢ/Hlw\+^`#,\@ RQ2BgHOӹ,Xmcy;&;o?ZqVV_A+\ xi_k)[瞱3bzkyf͒hz1 JާL9SmiJs>#\ٰF(ހL#sdM)fWm~LuqfG@2yIWZq--=҃L|CQp/>-6Eˏҹ4eĞ.r2?kǖFJ 9^;u MEY-%"es1(/}iϷWiO@z EITSh̩F|>PQkmKSȆ$)ѓ-,7{*;\ҽsiq+{r VӇ\+^eqB'aE,"f:vJx!\ l ^"OoԻuT#>tmwx@/&*ȈkU6Tuƒu1Gn`etDA.ހ#2}9x>N)#I64 IDAT8ECm AmOϊ!]vW#;/ߟ#D?q `IZ_ "^{H-3n= d9i`wrl֣؝*b͊D{S%viDޏݷiph^+c6~:l0r )k_UcQdNx ~\O;vzjCd 3ݵ`:B8 ?)+Xapf{Q=`1?p?T)rGZM->iWa7'}]W^dwo2 7 /R%}OA_3ԫRI*9 wdV\' ~Te>h %1<&X%0ɠT=rQߞwEQfJ2+ԓ2U oH;{>9,^Eeb!s4`"YcGXa}Ms_|_x/=Yi_y2C"ONv$ N6[􀣢#,o :BLmQ eجTD}vf ;2ix.On` &y #BS1RtJ 1hOA1ٻd2z"T (1u?~oGaV'ƽO搱VOZ,jw~۬%PnHjsCM=d/Y˜Fc'G'~%9'ZPz2'r%ۋ4-?ƪ;K:r{pp`k+pt|Bϣ# bhb3O+4|_;)rԴ&8jc㶠 硖wHą @yOOl36nɚݯbY81ӟ? GC'5̸s~0h*T9׾"ڬU_?vF]&-QY+Ǔ"Ǫ{m3}=J% ~şWŘXpR 4ȾO?Ov䳥2KN=HU`\,GwZxU?\ =vT_ЬV-^ B.N'a\!~E>uV2D}7 6pq͇ZNqM E4>4(8k~^c ĶA3G롅lYL4Z-S.h*{Y@=կORNP.Mַ I-?7` NTLQj LEϬ 4@& #ِgC7hl?Ky潁 ["RR]b ink'Ґf=.^LY=e.c;0)>_`#'qKfoz!Xx'ʃ.qs w1j0dOmFӈ ,3 %p?:IJvq;gNF7 3 b8ZsjI߫Q幯߅U#/r)OÞlI#kaS>m1ºUOOi5rRU'D5P0CN/YDZkuD9^i?)U2~9cv{2Vjp, >ɾ> ml%{<},޵|煣HP7q˩O^[mtA$Coϲ,jh*_~7F~!26ht8SXa +xoCb[6f[Ğ(F' Ɩі>a:_.*U*/mD_1*{|Sq|"Ù?Wc,9Ap9vD1s@@i@NxZ?*:n!viI|T_cA|};h ?ζdD9lݕ*8=jqӲWՌz^--PWG/D *߅+Dt~B}c9.k;"yowPoHws6{ V?Vtdyq_Qi"7 BV9Xґ?)Zģtcx 尘F7`^"B*M8VQ\LQ#pGla'ߙK@UmB =YH"#@BJ9aN<߭,Yg&! I"{ZcSWDz2,`^҈>Cד!4]Wv=&O>f32mꢚsJذvJP%0zMjڬv>oH.Af]ea {MgΡ}gA* 4ɟcs${k_h1u/kTHR$X@W鲈 FgV!ok t3pKguWP-F $[@ F씡}%H;/pȻ%[Ep"!@G^O qrzG-4i3~-buO`9741Xf#‖(ճk߲_ҵ" ۤ߼%'XgmzU cdP#s<{<*'IEz74>PK5[2/1E%ýZS~@(@GB xpǣaXǚ9Y瘔Zu k#ǘ,Qhb K ZCT\˕.mE<+pVyBm23,m"QĞ(9Bƶ2sE_6ZxL9P'O'RgG&;LʰH3"so]3])Twb᫹Ԝd<J=1Ba͘yuH@x5[PgU=118ޭ:juܜ1] ȽM΅;Y:z;`w܅{T+lϭ?OF j018;d/gC 碭g0*#efόХyl9\ ,`)wD^FfWvV5mpwR B l! Zy.ĎJG ,"3x^VؽW]נ$ozL0EMɚ'Ԥۥ->RfO'O[`.|DCSG:G $7**r!+tO.}߾V;uw?^ 0;ԙ21km18u,-S9["([ KE UMMĵ(/~,޹ Y 'g2v@0x.#?GǸFZkLOZx3.9\8=8?ihɵ!j+3_Զq` y&PP~~P >qKRLECJ;Q8/s-Sn"wy^>[Nr2g82/tZ,=xH> Ɋw̿D1d&2T#R˻cPLq>ueDlr^s68(:0kNZNjG3!s x IrOp]4;J"?P>, "(|L1} ?'jWu:2N9Ax#=7ћp ΘPܖ Q%#lSǕwv jT' 3ӽ(=9/̞I7s*ߤ[}¡iW]^x!6l!uRzIya7K/9 I-ݏht9gIqD$W b˷Zp/Q"lى[;&1u)HTyM-dͤB? g8OO5GT L E8/SeuT*=%oUę Qk3IX!9Mx+!~ZG?d6j^,۟*!985,D%M$o9}+.{E#j 6TNCZzWϝL֧4%'-0-e>bS'XK1,/~h?,| g QkBBA+MDS6>k*2~,` gfQ99^5N Oa6hB/Fhji/lG DH k ۋ)?vga}ID@LC1pm`z;x~jlRfJ'tv@ͤoa䶥~~뷮mb=_evL"4f*Y\Emsfww<'%/@$ } <bKBUTx{+js3 z*;pJX&`a9Kp+dM gH֩Q{*DҁG,FSOPP꿒qk&NB$!j$CLw| [A~NZzL6|:&%FRę?(3WH!cՕ.pVuqe a٨R y[~,BwrٍϨDns<<_߶HD( ڒ1!ԙӆ>Ʒ&S~)_o1x-t'fUleL}YZ nǴy`$[߉Vc7V֮IPX͙d#&A&,s~Ww;03/Լv8s2YŸ<4<=zq_c`Q/ie£p U@OYB>qgt (NҏQ"l=P)z,!9!e yϜY|),]0|Mmu Ogz؀όs"Qv\sqoz)Gɯq?މX~YKdS#`m_'DX`C36i`9L*a^ x#tYkҶGbgkف:f&?h+80sW԰b[7%޷ 5c4&:Oӽ2P;}DW_߶qk87/$,Nƻ⎘B IDAT,-3D { y>Ϋ`RLOjwM[:J%TpƝhf- ̹ylkTa(.r.$/a(vDOK Qx%Et"8ߺ ًTd̤aaYKXY$IIrDEb^ߗ5^3`@F'~ㅟnrK ARx7vfھ{R+||+^6_˹;FRWW͔res9";br.eGhtЌRKR c#wLg2 A@ߣ+[aP[l@tm/^{4٢j[/KpVuj%3.ΧŇkjkӫ!r Crd!zXKEUq;I1Odu^bg9|%J/bV@xC6[v"#n&"KvxwP^W!#Izœ)1ImPgA }F&az|o7\Ņ}6;{)vRln`s3Aۻ9wƄ?*7!! f vr% yL%1oVrbJp닡 c:!\{3W~ݜ ㈾sw6o)<%'|eKL! 0~^֕z8\KoyGߋoZ!ÿZ֞(v|Gjo&i V9lC :^nzz&cӏ0NvЇgPX)X $Y#J^K X)KK 毽UX[2a+yĆN0d9hhf2 %S 3g_F\wȾL1qPpvE{;{ þ {wLs*l0m3"`I;* yϋ6'^gRP7VCuvJ>[CDuo>K~ r15(꭯y] @j}KUF!U 5<:~iBmg/^o2C%-YVpG]jhrq^D~XK|~HROL;:5&H9h˃wb'_/L!T=`;&ndB5 6弃.ZhŶɆB *#o{z1=)>ޙ!KN#)w )/1&ĻGؼOؼW`AQFXy>D[uyoFcBRSSruN̵ /]s!"GW햦-slFgr0_(|kNLb^yV'YtPmu}N <FLT{?~yfqٺ [û*>r.XnIk?x8M#~֛Ww~,5Q?T؋=/?k(Eb=+"5}+y/̼K;OH ,ƬIPnzƾЌn!VQ鐝#5CspA\pYJR [>-Ǝ zpd`"2*w"עħs%z*f1cQF)n: #*Qf`zҐsO:_aRa!ȁBzAqJ;Imbl-OB4:Wd+@6'eSL߬IRc-(dWڰ1@@XkM5+_L)<; 08v0~1J3C<ОK;*j5϶0QTf囗1kqj᫔y= 0`'}a507MgNwv1LFڲTuLsNBs<JCa%XI֑efFJJ!k؇٫OBχNon܍5|YK 8އT~ԉϠ" sD#@X~XB*@S,̚Ω3{H@`e6!y"Fxzh\OEN{WļSoja,d_JsLYyj=Wo#nǹIM(@;'#z\jrf/qmRWum6t\X=.ab-}3U/s*毡PB<% {2FWtQb?b-2KIi{w3K_I-6>,LwӢ@ذV8|K̵sb {@:1Ӫ3e d<* #[К?z#y#2Re[Ly C9fjg `lj`rp8ĵ[z@|%XNHGd29&jg~7K/<̓ފZ}"B d]|?HxU  _@,ig5kd=41݊xƟ 'm> l^g$Di{[x$ 69<޺2gW^LbTm# >7Ӻl48hm~o׶ancȇe(u'EBՐJ ^tL?nud|,o/aM"3Y?U7 WD" 6 cMSk'.>~WG/\ğ^CC*4 ;\o[9 YON M9$?Qw8xφ lwC"qЭrRw>)E@Xw3x~ n 8R+pF({`oc!!';ؠ@Uuϟr/ J*ddKԩ W8if?ƙɡ~.1bJOl@P!}m1~?ՏL4TdPToj P %SȘ 1=NtdfģS౵}/c8( ?X>/vx8ލ$>@xU_,a'N%rԖe܏^jCsMaiv^JeD'Α?~| }{25Zsb5zlͲ uLP1&8m Ce?3M:vٚѠʅu f!_u-.%Xb HGo. L m;3BCu : h~MT5G(@1g=05[;#m9_ի&ɡO]ŕӇx 7o%åW. N-Grz hLGpƫc8$@#fJGC ꏼ$!OKrñO3GpTҫؽercSo;9ȁnѧ{qھ>2xw\eh"(Pţ;sxD.\iD2~ƖZ)ʴ}%gk}sM ,'_`>ODm|:SۏJ J&+ ;tfX_S0q'SomԶYXj=WMHsZO}.\],QƼDʔ- p;'/^^7.ak#7Y1h (B ɻe*E3z2|if{Pڎj fUih I?8s?q"v5cW-4=&"$J>(0y4 iLܹdfw4"ܹ">6˱xV Guϑ!79G_}W8h8\GΑFo%AqiN2~=845-2B ? %1ǶC1 FN*(i4˴h1|@"YI F•-ل e<_dEx}2tZ|2j8εiYR =򗿜%-(Sn/Uݹ?eŋXMJz asi!!c)=f%OdW.xiJ?k(|! @~,Zy5 "j2Š-ݸMP䰳!GR OdwT~/ f߸7u+OmǬH|br% lOg EU Zڔ R2S,$2'4xdpT0{s;-t5"|jR_PO=I2ySDsbc^lhOrr7oU*mQ(' C1m.H;r̾# f7_ؙh?I ׌G*.pϱ2yKn/Wr)jM-kA d/Op}7KW̗sfd\|(n~#/\Կ1G*MVfVpvek8Օ~%..Wܞ Z>Nϕ(N{Lm=2 ;N5.S`/Yb] *_(YJ&~ ;wzqaEA1~h_g F9ϯ)H?&r)I\)HOFk9-7wOfۑhIU,H &RarAdYs֝TM\2@ý.-`oƯ7Tq6GsޛQEɃCMk6ЀPg|-}ꀆF z$v`CHL7մn&?*~>]w'K DU0qcBu~] qp;+L "Ę;7c}2-X1!謃CU7uZ`-Vb8(%P`McG= *!=*.*ѫRF`x O$G^D<{[nF.owe)",L3itąJ `*ە'9w>3&3)*rJ-Kay b]åym0.φ'c7Ez϶q pc"p†lV̿1٘1ehY(emć%ޗmo3-@k$k~\XGD8ci4o[rk>FÛ~Vg6ۣ>^Dk &dˋOjR36 j\S=Pu}5i>P#S Z%M>,Rmxσu.ǰ aO>P$Q=ݳ~9Vqb[&g&A*F#XRc y(Cjmv4߾| n O-.me,ʌz+A{XewpyQA83V^]%bO!n|E0 f^@V5>~nc02c͜w=&İH;UVlxϰb"e+Y$PH=润" IDATWB*sP_{ۮLl#4]6R!(UI%JU*os^,Z -|{Sp$פ:үHmwwYS[Fl$m :#֚qk_}5s1Kfl\*i9{OTk)dNvS=z"=o} ":VG4</Ygu.bQ]h7IOW?AlGIE pE!\0n,r)ؗ+/Nw| m>?q['{)@@}"7~𗴅pol(?o{`hKB6bk1G_kpɐo;E>ob-FI5Q#(}SDx J[S]Q)VH# w3K1K8ApH @kz{Uh8ms^yjv(2Qsl7dwU"$Pf}dL ~>xpLl3EPMSnp7o;?~-[w58wmη]fA-A,yks2ُxkYqͿ,Ъgeo*jc%>MKgTP!O8r?7 ( et_Oٗǔy3Y $vk։$?,6?/?i& ul ;&dmYz8@_u8f^$0ܱ/_.߾ ޥ'KFif:u1i QGf0:`\;x *{u&'MQY|HA߹m,8@η#|a!KmC[{zu( 0BQWyD7( Q0Nw~;!XhE>_>t7j g>E?D$&/?p%wN8]IX>9 @H9'^,чՁzc+'Ccy~_{&?6s]p﮷w-G pOQ+*g桸^ c5YfMf23ra+mÿz^><<~P&WTZ^Rv,%"pʙ{2-aL,vv[mjKbAdn: @#!,}ٻqd\ߧë́=Ƅq=%e5Z' N`kiEuK& Tk;G&ᾷ\]^$BP =?#kGD* fO}^~M_o~pK~_FjV`|Lj*K<.0ս'q8mv@CڢpNF0SYd޻Y~UnwZ CzUbd);iPZ`((:g^;d2a7T1PN@|u GkMqmHhUa2<+[J^u wޙ_*2o)IY^?3lO;/T|\ʫz_3Aqםw^.ڵziwvd:2 nd WK|Xޛ }od|!LG{ƕ3iIU g ;5 TZj?:C?h9HČ,yP~Oj `wg? RLj{u owpHUO\nZ&Ǟ!1s@0M'+,A8OsלMꆳŧ%@rkWWu^Uk FYu;r%~ce$Abd1xhWh1:ے9 Uۃ֐(@1v?MHw[q-<*aa2թ')-aaQi@2\9b//:fq:,\CUEY_@enh&k9DlU1/kQ/g库Zq<2t{T6yہy^xE-lض&)Aw'=ctȝPg](dB0p]r3%x 1͗UY`وպ?⯜׉Q8ғ@{ofKRK|ie~)~Fj/!_]`̂= 9{A W-\үO "Y}΃~rJQM@f_ 鉙%RƾڪR-C3ohS @`ᐖ9Cƾuy,iJm:b48/λ/~k\'VZ˖8WˈVz6=_A>HeCۢ=P7Lb7qWjGM=0tH0}F]P1NogǭOu8ĴƦsQڡJ]mtK;S%q=$3d Ki\W]1{ 1P;Nr?d;ReeJcm' B;(r.̓҈=M nf~ڏ~t%~ƀ/t|ćEPK #~$Y[%7Ǡk eOӕ֜hSew{ ">U[HV-ĥ"Ki9s/4Ј&3ˎ-1cㅻg!9>_ߓ{WdgAztH@>ohOLֲkC[qW # mYRwxDzR`"6)2H+>V8$EY<nG>36\x3樑wfnHvxT:X{&r#qo}.]4;ؚeg9Wܾ-݊4)[7ɀ⎑50 Ta "bNCN蟨44h 8>.-ow9È-s[kcxVolbc`Qۓg֙|^θlj&o2"F!/#OX`^elmس[,qu>ThV₱7=']ɑsF+m)̀n")vY?=855'G-qCc_&b.k-j\.S^+tiՐ(LFg7m_r:9_SVO]^M*!ay hMi *үp1Ҙ15>w `LA4һJB캍:N3|(z:O O':c(2)eNQ3 | DT(d_n.'pROHs?a><9`ц~WT ,Oi/[K#Md7ULޙѽr.:[$NПÜ{ivKJϱ#B:+O_9QuM¹vȃY*>n o$k~_@2 8Qg(#uwD/^ #,n^ض+ s4 (0*oE(?vX[ _n$43Kf` [7oݺ*].HϊĞc`7G'Z`9U=R*6}BDܦx 7:tc0!|; m4Owg|g@{ #ry mJ) 22I *ɴXgc6S:sR:lk7/u W9;yOb$=`Kn<$͖]8cA#í$Ql"^v|v)2N; h-ɨ~SyO5*i !,Ȣp^=Tfs/_ґOA?hԓ]4숕MC6TTXFLA nO #?sewIK-=)u^įHj!5=lORd= wlЮ?A<^C3ӏ ̇UQiw@\S/[tO  ?K9ll Fg\+fTcSo&H 𳸪p&ae"iB돌}?wYHpOw$_ uiMbPݿ _eM!rNy4$eG.ka$ ̅o&,U0eQkH~b5cݯ˛s_2Z>$_v.gU3m9Xsm8`IRmhFJeݾL^@$eϥ'(~e zVug%Y2yC+4 GKRK˃/*P.pF1N21!ʟ}O5am^0Z;0#EbahI`9-J:!I{|nPo~=5ϦEt? ꥣ!U.4Go}[lqmF0y ~OX$7s<%R0SZ3f]Z\U.ɟڒ}$2oawjez1*"#%}^ooMT*"ft+w F$t/#Ղ4,G>_ٖ2-}MF"ƉLY5Γ,_~\O糖~KU+r[8j)7_kdڄgGg+^r%IQU~&a'+H?5$Á.o0K7%n8ϘU׸鉟q}_,$EkVhԞtf%: Pl1_.W=~f$ia2ʘm)%qrQ)0 U-i D}cF~/ȿ@eRYϽL[zڎ 'fi&ܘ^<\u>k_1Q{[kmHR:up0;)>E2$'lGlW)I9WkCD)(ي̧$MOiʄ^~93%+?Np /x5 ahN}kjؖF*lіu ,0ɂ#Aě,L8Tt/֓Y# TPO6얽*}T t UfGfǀ{*Lâ*Za7GiU0G?@+n<7Gr 1zOo%.(JɟBiFs)vGʟ \O5)-QN+rXnh@LPi*:G1>"HO~%l$iv"q/{kRJry e=2!n(Ė|J^(&9/ {G;)Qr]S)XòUY(鯮$go}Ak?+H2Wt0~TV<]2>zAG^hTA |0kރIyx{;y@rX݉ԇ^Ҽ&-% u& QKO9R{ pSNӬ&F"@Z܄RΉ1'9qI}þhcO%:R4FPkɫBU=to|{Y?$<y<wlG{mZԚ6៨λlӺ&uUu]P.$A>Cݧ'.,H c{bנ/aWamLwr)~b-wtKi/RF˰;_ܺ8ذz"aq_xq*wpp=mרK%ŗ}jxؒlQ̗T&Vr*XfV؜f 0A 2t^sϟ~B0n譀ɮuS)c w8r6vwNlpQQ*LoZV ne"O A;]4ں֪p'$yW?^ { {wbq{<#`&$>_8lw-P$_pnWע#. MHB{⵩5ʕJ穣s4}r]e%.F6BLZXcGۣƂFtؠN'#jhdRySz';^x9~{{)a"3d@P (ɪj*"3YV3Bva)x!T.``ʺg}koW"?T۴/U <]/b,x58.xB}yF ͌l^-%wو k"Wg_Gpԋ0U3@l-0Y>ޜqZt גEJ}hLB412Z&1{] $+7EKy'Pe>c^C/H@UXd']ܱ:2[2|Qߐ_(|,5X}q~3vzsӕIxkCd3|l%MОi̛@f]^ L!&930Sy 9'a侉xqTε'}Yߝ֝-gߗb(lۧcvEmmǾW=>~#EgZcXl6u|Uz sZj4m2+sk\fG?L+3?i[Y& ZX85=s/g"/)k)~r49C\&7w^Bxw. T:Uy}mAsT~+̿GQ0l4]s(=tJ ꯿~pzh֭IW6E> XP[Om} s,JF?aeBų mh+e#{R+z0Ki@ꃠ| .în- 7lOֺ/vTG֜ $r5.)}΍S9%Ќ<+H7NsX3.&\*6‡m^HQ]=e{56 8$wByE-E'#9z5т]+313'ۛG6ObfvױZ vu/Q=xe{l+=mi/~屇&{FR'V6v iИs+l%eh:Kz)(;ҋ_¿G)0Xw ٌÌҲ8 ­8{t2L=vy)yܫÔ=һ_MβFG+@/ɼ_m֙j4`]itm8J7a%]/_=@|aR퍏?%+ 9K u뀭lJUJGFÛ^R&T?_]`wԸB>B0I_f#7}{?j/|<)3Ug~(>ʹ!k={=ݛ.< \o_ߓ{x`4so?'}s^S+OpVA$%{eQ9v_`Wp:˱=>]gΖOgΪ5X_n{e`^#] y T=_#"սx\|)E?϶gcE@ W㊜|W2]-v̬BWE=וUP'6{)җ5ief;w*? >89:mrw5e pG?vahASB֦z>e:v GYn ~|ߒ=LZ<W zq~bmd6xCOXXRu7U G?3ڽo)}N*L0C^G58:_؅<ѥa`bgASj??造=d A||utb 읒jō@x .d9.nĚҢ,+R[b&~&/&G[NS[PkyDYy+{d{rtDt6u1;}΃8Bg:nCu=AL^ӷDҺ6> kI==owi:0KD앧7MhcOYRoM&K Qhɯ2̨Y|`&dB -xѭGNgLH. "PSK)eݣݠ*b/Z*d~q}o __u,E7>,5G[Rb@$F^LoK0V)x 2x_f4)KQն 2$0 #>͛pt{ czٯBj^\/?̀G@W9 *썛[CMqoFp{Wj=zϝM'" l'!c/8)>4,a]+t;gIn-{;IޫIL?oa3;><B]. { h%Rq?mRXs[XZRύFO8䣪C`wcL(Lʰm|Y"(@0%&,N37ţ8E {ǓsQ?NW0P=~,y'<}*hLalaRVN)TC?ޖG.7wiQȤ+%:UE+8kZ& }r땼f|dKfV_`3)gf/g<Ƭ] EZhw| a- ??qi<ѕt7_:6h`Ґ}4. <'"^z^Z@B M҈/Kx"Ό|ײ&cy-=vt*4pyC?OJZy?>Kgaj3|mۿW^K/{g?t8O :dF=OJRf \N㟢zo삿rwPD$?)9|dO0W%%/7 X{t%50iޑNw_/2$6"azH/!1~Vڰb)MbۮgZTc?uƟ3!; vI/_@iJP=_Yfk4%{g-8qRM`)"my8.x)?BA><2,? %_aնI5 A=6p4یϨƧ:*U~]±g?9~?V@ҽ,A瞴'LC0y{ԫ?W3;+XXY,wE3 e^B \+2,c P~95y"! bAրaGK_~R/~{vC IDAT5 jwIUeust[PVVL2,sǙI]0B+1fLgl^i>S>MJV?@h2&fT3__-ZZLN} ~6x/X|E\Kvtx|߂Yfdcdd[} Ne:JlWK+ܰe; pϾhߙ1::U&Rq̀jsx_-<H3?(oTU@ߏ"TJpL@)-A0?3)oXhM11 1vgt2KL|.M5?o 7; \cjPB{XS>.eZlwLf-vmR;iI?u= @IjoƘ y`X?hgU|rtsGm:5NaOk-o|G0jG2}X9kr4a }~09ܓNvlsK:*V@3*^:IbL1vd7t\?6S .23tσ7GARuKNJD~69='/|NW.%H( Qi~I~ZJ-=A MW>ZK/瑌@:-)У}'5QO"2f$xVB`⹔وtsgD7z|4Iӏ3tO$vЮf^j01 E~`u3+5ht=ӽ 0}On3-%*7~a lA^x;~V@xaP 7Hylz<2,{G-A' 'Bm18v%mf4J19~hrg_Mf"PB}#G17əg;B Z/юnu#oq2 s ۀI*aqp~gՙ0e-`  hؑޟV`s{gkPo)#̛/)}ҥ>EMn̬E])H,Д0Ȏߦ.5/3I1h}rxԜ@3r#7H[aVE`YKX_0G>"O_'K_y Yu2io2{.Umd(nŠ_'vǬ @D95LHo~/ݮ @/ ս:]z#քq[ @guf-Ơ_1`5=a`Ƌ io; [ +ZiԽ xhE+C^(>k?/M|iSKthhu_O"9y"@: iGV&ؿU!h!/-UJL7 ȋ{wv_;᥀=B Rv:IKXlF=K(]F$ =O mY$OY'OUpW>3LOK V4ߦ'Tg-A.H$*:WrGDD=C}f(w/ hO8.|%FO,Bv@NW5ȫ.~jЪ8 'I[hyDy7og'KG-: Q8 tydp^ViKX2q*-K'l^S_?瓅 zEsď]hEtVGCcI*/}.ͣ)JmAԮTG/R7F=Kݡ,ty,Rx4eX'37ZOo>Laɏ,}p{B6w_ TKo\H^A>V#֗hKNm+;Ƚy׸-lW 5T/rh+y)9 z-*.ZQ}`&.LxQ4^399_m ؟c\[]u>vqMjg= |BY hKH+G^B0&9.}vaAGdQ셗 –+~#<+8Swɧkq(G P--]:c}y9%Ⱦ*iP6`s}w e}1rʉ'DoVH&@E P~ј=xfpm3֊/tj`,kS_}_/a꼞_ooS/nWV:( )һ?xLpA GkaJEKbg(_aA9K$ ^\!)HPyRG ƱUc L`VK|r_2Ȥ~` p4^vj <7oMz;^`(k?`퍫˽?~~'ÇZ-?/heN'Jvo_^rJ?>VבDUY |>_c}@ٰȣf,p~EQӰkps9OPm{{/lޏ7u&!S_hLugNc&||xdeh7[p>"6L꧇ >07׼@.VTG-E[X F,U8}`&E[EJ@݋ rgۯn&͙9L$;t~65GGHl&|$ 됅߻&p9,ǩ&<}竟~vU áIrQ6D7;˭rUs%pD(Ҁzbh߄*ЏprC%<ӈ'3T%mk(R|M)`fܔs5 Rg;[7am+kό͏:ۡNӻ? BܖiZ <^-# Eu+2%>L )Ab/{c>d 8ZutPIEpa~asI*@W7. =C>/\tٚ.BO͏?+ 9wA9p߷Z:%/ ОZ/AՂxt:,i{ q3Y{JJ&1k^+ ܿ`j4-ˮ;>N\ QH'-JݴVƀ/eٰ IV26@U߾҉z?1>taiɸUSX,Qw#ERNtοW@*>{-&b%MgoT>,gtJݟ g4HGIlF9gmf 6e{" ?0Y<5oP-(QԾy<xo7a#}Wt4FK,g4y,vV7 0?~ba4g'׽ F?3/!ý J#9O:^;mtFw;*[ h ;M_n2~C)]ڃmBP x5I!C(>!i(9y|mWѨə&pQ#GuFI^VO_i6Ϳea zxI{x ) Ǔr]020t(&gnMo UY2j}w-rYS6Z Xncr QL݀j4E.۠&[o+<Z(Ҧk0IQUÐGjӛtg۠+xm|/0 Ng!" ǔVC@pY ~t/z("TlG 24[Po[\N R%>qaY"?S ̺0~ Chn>{kLq_EPr‰5눙!3+<+ \[֚Vj.?0>cw)hD*hQZ-i\KڪƄ_\emك޶SȪXyr~. k'WfkhΠGIǿ#묺-its2kɆxAy/Nu8磪i7R+`#o*5Xd{+_Z5kOr SG@̧|?Y :,D Ǎws=F(͚)"=$bܜ߶-<.ro?*bPHθVudxlѠ uvU'JT4LYgwmۖdɼ<#cl_x7?rHV˦'eE>?>@I31BϮ|ic&8-Դuʧs{F@GR"**1:b=݁K+}@Q.M4T4]|CsQ5-Z_e|KC+p!,Hq *#IDAT\8 ge ̀uͅ@v{#n^&HAD1N5e0?'0R2Ube U }E=8Izzhè?] SjC.@@&]<)yqwie1D~d0s+\6~~bTԂY5TP猃3M6iEij-B nRdA*¸h,N5/#eɿX!u@ԐH_5Dž @ >T];zW{-aX7X1TP.F~/WV =aKq[`` |0%,>:? ؇{Il#5b plQ]U٨8$# ΄ 1s4IN% @C//R})Sr[k~#S/n| {m0m pʰ5ZR.D8gʔkþH!f@) d^{[iŽD< a:]pEUP0 IݟAb7w|&`Lr,ȴ9xֶgpVutmujJVGT>?8`M!%z=*gȫWN*oi(o]Pބ8!2 KHƔN0~ -ldYk%{?u (Зʪʴ2+tG \;otKF>/XD*ex`0~7|UюidY ΣQ$,IJ{@kPb3l8a MDV}\kP^QC񧃮theV*t?xm,+GVwY&4I3R{hU-cNsC{8];/ T6‰CPWϠ=~qR?G1TB|^ަ)z=/tieV2y8-?g"IVZݟ?bV\*e&VQ܃9R xK7; 2sZm %>0NZ@ytZ┮$V x|4Z Te3KsZgw+&c՟s42oM|+^z|gmϷ; 84oOR ɴ9n̂Iѩ_3x_~o%V`Yg1x|~a# .ljɐODo 6LN1%6 aPvTW~flPB/O;#y_?8oɘ?K&a Dem|n3H_ +5ieV{|AJ@C3:^ >Hq^7TB<"p/ Z*/&jnJPg iltKV;Rr­Sx8 TE~oX7~(dTi-8h>ZE+b'>bu>{~jo.q>`kz%IIS{ߖ)=Ǭ)$~lH;^nmdl>y#VԽ}?cJHfvXigo ǁ3!)3)8Q } --1זQIsڶ>zr)P3Rƚ>sc`)sbE1L`| _`ۢ VWڍV`ޟz~ }HrUo$;qXH4a rrlEntCV"~,5:êsPDj>wj\dO{?R`n @r0\x7Mf }2qCu?/{+E+ޘN <"1Qj?*gssRuF4sEsY:E9y|w~^"{Po?Tf=t|O^=)d6c}JXtnct&D8fF$ "o]7i*18(R#n=m5m_(yNoDyBDd=9?:?pg=oсㅯztt7M VO&:i,*#ij> H ?檔WR7gr ~^ѢĹO %8ܤ&PԘ.e"Gq܏+w,%?qfaƋ+ޕNV`S !  cג=%#B+[ >qt0I~'?ք?`8F~0QX~]yT9ϣa߿_Y V:qZNwxT Rc'iO} /9s<B+{p2VՄћH9d&eQd`}H "ӈԿ_YW:5ZΌƣH ?SIYϭ.=s9V̕FTȋ>pOep,0x2yK,˛O-bb:ajJx?dUt62+9Y@_>>}WbZ"xm@y<󱺂. )̕Wߗڅz׶?xzGi*t2++ i'J5'M[U%e4QZ> E]!o[fp0Ӈ:PT?=Z [|$Y?AHK/%Dm+퀶"xY @|,A8%(uhRW=ۢ0M:QOB:(Ulqkv ЦD񫫴ҹX}xh!@v0SZqvpS9B(S=n3C4J_KJ} #j<1Mt{:ڗQe" i s~Wo%=OW%++tnheVPtFfMN40J ;nJ$FyZ4)s$K$A+o܏L'MF~gߒ`׹1A{9m -}~K8rI^A D+҅{?x|!̪EaR.|J/qLjU㓖7iRj]P; ׺mx_S}SG /s gگ>k [i @+ҥ{~i{6@)XP{ݚL'z$鄐IPH}qط5?.NA?:ihO ?' [OU~o%#)]w]<<-gJ:/ >VuJ+-Xiл>4j ISp?O@itYwϓA +YX  1}z<['Q{ޑ#CQ{=$j2{HJ+M+J'H?S90'-;x|x5odiƆ\%m,0^5pRL K!~UJ'E+JgDo0M Skh`>;[d YN}29VO&FנnjpԶKK_ƯgWZ heVZO"$aw$.j( gW rg/L*3/%}=g7un9%hLe IENDB`ukui-control-center/data/faces/6.png0000644000175000017500000036764513635333016016304 0ustar fengfengPNG  IHDRx pHYs%%IR$ IDATx $} )cY%]"G2"qӔE Y%EPaďdrT@*%cX֣HJၤ%QHIH`"!)8 {}}Nw=3;;_P{vߏ(0\1w+J~7q ܼ\ǬK/iZ%$ HHXnOf̍|0(?y0p%U-r3Wi+d4$ =mCBBBOH @BB063/ܞƶ|XJ Bb z@bZտ}Vy7?'W5;mԣ []o*cಔGB7%$$H @BB^S=Bbsܴw7ݬ̂dLA$$xo?7{oVZ ܛZf@4(t^ ? H8yVJYEjcO ~ِO*1 GH8R`'Zw_c(yVQGBex/SęK$l5wVwٷ>1x_R:? a{k-r?\X "i^ |X2^  H x.oK0&.Hf?d;H @|!_ڦomڋWdL(f?WN<-7D ~o3&.Kf$H$$ a}Ěͫ%[ϨP$j'f aH @ q+CR✄ ce ?r$ H^Q{2ƶ "m GHX;]E:zpmp$HX+6|׻ bk0S؆qPvv~zQ`1N'@ZP崏Viy0b?=Rޔ %HX ]EgXEu,I5g`ɛN?x"aH @RF} ):_b6̃?d4<$ w|߻ygpF}rVҕ?є(_$ 74 BEn)0ƟR#1 } 1 ;Fn}$q6ڴaѺQ,.e2vLAwn0?r[2L$oWh0:J0.o zZVꪌIC+abv΋NcQgܒP ܓH @B4BgZ8 <2M{t~uGFu,xZx4@%Vgk:1{BbZ!1 A"-m$y0XQ2gG{c`]#%F$ x'Vc7p "нI"5x~$6ߙr$~=8%}Wc՟T(T1wLq*H @s~|Viڐ0=m(;oK@Gb8E ӳv3NH ϝ?R #ۗ"/݉Qڢ1n[D]hoޖ*ǻiZq٧w2y a$;qbkGbP_2P"1Gw{Ro[ 5EY|Y-6-[ nCОN9΀TaƠ3wELbT۹}gOC !=s7Լ I-pD#;-Rf|Gޮq7?->;k{4iyjw},۲!,gLڊbEYuΦdCێl9wKOHH,Z{#^$`K#=+SxEƫ*!w6j]]l>᣽:`kK>2?B&sy {wH'le|~iuJHocC)6!1[}5.<2?-)ߨm50x0qFmp[-c3=τzSɓ}0 }]c[i>-:}Խ5޼)#17T5z7b+eƘZ7C6-mވwM[~=VE{=#mkVe]#OQ&:QqvyQ7e=ez}@R7&iS{(?#wݹf{({!믶W EF:|[_`׵i4ڡjl{lV1?˲O}CuoUBLm=MXpi;$ @$`x~a]ٸ:Q\sгꈨۅ6^W2:^=o7l'IRޙ'WuYy*cip`4$`?E~˦ptN=:1Pޖ o!?|}#N-Յ 08 ! KCaҀEp 3O,,h(zgz1bpE)KpR!Tl0`sEDE_֍XˆE7sعmBbv9',xǸ4(>Z `vڷ-\--CMyh$n t2(0Pߗ|k(aM i&m5J }0bQTʒ)({kuQccѶϰ/ @ i]wgF+z;l&B_Xc(KqvިqWjZSKzGڧBe OHK{L]@Tw8}_dž%, K> u9ؒ# 7+= 1]m?!!ax V^Ȏ#hCG[8;^7s?}>6AIiOX9{@uWM뢍}H} kD oww]tY UpH  Eߟl,I.ߟVo̿8 l -׭M*TEJmQm]z.޾v/1 ?2Q5+Ywm&rkfvgS"oTQ`k"$ ?нQ!}mSʺHM!h4QbF9Ecۥ"x!Ԇ[gqDճ8CMKڿWݽvq$`?zh~ noU8pH -L}jxI_t ~C/3 ;jhz8a#f EZ7U-܍.uG9K{@H @L~;82i﨡yb/`P͸FRt,{ʥ3 ߓ2 "6Xk#L}L<1_\]JEOy[љAF۳ i"EOX~M8~n9oDkuzITk;\&겝7,xŶNaWuL:166l+JOA "1 g;n#qq|mq I 1uڰij]G;,,6-[7x?@ rfE v _ԾwkllM~􆝽j-*HjqmMk:7knttPLV,t}|eo&닊iu/:Hڢ*& ȣ?w"1d-(1A~mL_YWbhZe]и,1Q= 5$Z]X򹔛AO:۹_ 8 @)j͝4r^_)b f`dg )I=]G@ҩ/:P5Yr{^Ov"%* Yu!*m*di54!_}}hPо!.ƨjZll7V/4<-:V$}=/O<{{Y>CןIR=SsPܙɋrA)?!g\pyzwlQϦ[&-S:}}5_q[7۬,S)lR"X|P7Yy5&LOmcfbgJSyaZ r_lm~>%D I"P]:/&aSՕ"XkWdϨQaK)qCz5,~t.5ޤ]axnoCyPk:yk,KZѠT jWz>+B:ا(II ؿΑ+ЖE mh*9`D,c}>=KNAn1b(9v[Of 7ME$1T ~]ΙAW=TidZ0 Povs>i /1Dʖi,kU m=@;O 5_wIz<ß'$$lд}LfmQJ@P[OБf/^{ۑg<pϟ>| soNa%iGJkVŴLCXM 2κ}4Cuǩ{Ş]O(Z,Q*D뒎XuYk^ش괩~f}ALh9+^=Fƞv;L󝩯!,FY{^{Mi2pYߛBBBB†3G 8g:om5u_m2EL}CAuiân!rM۶avbw} $_||봾 [OSJ$%:0a҅2 wd(XB"CjLGoLVRSzF^y!+lz5l`<χPUkE6HЉq[܁Aup9E#cf!N'ω58rя3h cm[=. e]X&wIIM0hRiѮYjS7S;FEq@d,uݨ̦MT]Fw3 E@WAOkw)ǹ_S}6GFÌ˛e!d=DUb )QqoS[n. @ܑ:qnMڠH5t3 gZ֞QVI;mTX2:#ɳ}o~? tb5B,N?[RѲwmtdO*Q'ojj׸ߍ˙}Ϸ)h{+s(:T눧]*f_xщpd *s/fs])[G,S  xc2KO,H&bºJ7ܶEQmpCoaӨɢ)mDAM"^Ӹ_-U,I"$MVoDKKl;]*Jy>1U?t1pF,mo π#-Hi7(p씵CC$xc:r4-3!UNHZ-iڛ - @H^mn3aFQ*sBoP+-91͜Zl}/hu u'f ɕ /<d^.tXfQѰgm.O,7z GSN K]]nW{#skKی !oo@Fu.EFb2}KP?bw~V{8nN@LX]lJlFuh3>iVK~塏^e5]E4t|bK;0i_cR &b; @}0Z~ێ_]llY̸.gjވN߳^[C;z?H >c!شa$atдO\;iڜ1͌JG\jW8}[JLQ4y,mHW:K7Rڊ;j:\mUlsæ`+_}c_B&:o XC ] }Ǫ`=/-]v4O[3]=Q0e[cjmX΀[nk$OHX ݶ4 ne07-j/GNu8)["8l17)[*yn$ baát׎xTocm/xE-hp:L%Xnmopx4%!#h[lm8$bC<@+@b gnmk"n |VJho_LmbϸeAס"E03ڮUA .֓r1⥠3N]Yk"mӮw{ '.ґGS{:%?`gm)p+_C<%7Fc.rqg˸nu辄ڄA̤ڄIPL #@؍ Bצa۟jկ9hkcN폩 i3CBSh]fpuyYw1 m6͵onŕ/O>t3$$$ tqt'j9wP +I;+o;7tF3v7j5!,9q~tUH'I]BXE[ѹ]CJa3A{vg0N <>?~76>F4 6oDFY)}v8i=˲@-Sl W' CS/AH"ůT5k BP1מ6[S^ui]41-vL<и۴GSó -掜kmǤ/,` {٘_㧤hN1GѕP5vZvA wh\ zdQ0mC5ul|rMg۴{ְƦam6&a̐AheѕqK²NSK*VC9k8,:>۹V.JO7I\Д#P/no2 Um3V#9yϬs^Z Ґ6TǑ'P7kw_B n}˷;aUE|{˴@[1m#vmYGP^VVQ1G3lFÞr̈kiQoNV CjŦEf!T:j_+cnPִ,4+lkjj8MY1-2VnW;kƍDg9kl `$8&kKf{ح+nz4V8~ݍzEKp`QƔo-55II1.ug1R Y`Q=}u4ݻ.νИĠ|}bw=f܆Llgłw1MZSМ l8D'?a1wz R|#`@-NX< Bd탹I`5`,0l{R TKlJR ,iiT,J[3~ f.38@0:T1[ﳯ\ࡪIARWln&ZmN6@A90ˏ4!vk$|O;;G88 Ogn?rt(L`ca%/+"XM_fqd`[6=٩o}?E@ZUMݑQub 8dI 7h`@h=D&%3ձ ӶX|ueҎ뛒3b}}f2_`.p9 0E;|b{I(Dxb NO'/׿nS`&r#88!^JhX)Vnmz? >*Lb^TӾ.XvwmA蝯>L1H+*\ ˜SO)(Fxv_>{z8|z,3e͏Ơ$?|!Oz˧Vgszl}h#u)vBcaWe*+gܙt(6mwTbC$1BP&Ma-BV!jDorLr2%,y1׉9&Q|0L V?oS#d$so;wk`0 A=B·|q ք0/C]QY<҃PߨaM\`.DՁ"-%" M&(2cTA?p=@0gd  pXexaI >3~ vY­O]SXSٺh!,zRo_;g7_!_~Ʀ?VUۆ :cz}m_S6:vnQ(<]]*_#$\&VwªCA/^=Ѻ}T?kljTz@v(.(L1@F'p@+q?!#o8){21 A#ُ-v[/AFf0E O k-㱕#>TXZP)9W<C1,`F.@z̀G %q ES@LU!{3sõ,gpevG "#{8Lc9t1ًFvb֑w LHPXv&f-& HISFe]q86A6Gg> peA3D6}ڮw.?D!QB+Y*+'"x) DŽ ?PK_½|u5+D# 눮 8U89{NMu`+?MCh&@_@qfQu{km{C oagc %lٯW |X)wq SwKZTa((5pN Gs|$$xQusy˚חغs}!D ѦK%83ޭ4} Ps-R uF gFyã] Wg09P":!}0([wkKn|ˎñ`̠iz~nahղzkqliL>Q0cxj4/=u<)ށ9MIѐĠ',M OB"d; ͧ0|O±UxUNHHoVɄmNbn?]Cx>AAr1k܏oY`xTs*/|} MHHh #Bq0\h$4Oʽp-nkȠ?Ɣ2Z(هWoLfPd]:Rbx ˨ҟyiv}p4}k''E}WY;N$(6ۆ?޻ b`c:Be?+DUJ!$]bVb} s8|k:n1^Rg'P_}wܾ@D< @XjSZvy2ƛCm,(Nea_WUEvl*gi,_eڷ=&M}k[wy,RGzuۯ:H{ی$-; FXD$t*t>b=crܻ/^gtbchsi|penƀtcٌ ϶9Z8@e2BOeVJ8~1gLe9d\tf2eD&^!7,رc0`6WX)s_{$O;P0[lJm!a!I0K7OPI1.DeFy Z:]ZWuys]/GUeK]4mFw]ms L[}ۄX%1Ve !g:ViZ xpK. _F/ {D;;& ԍ;O,D% ;rة//o÷29THsupLu{[KԛjC~4G.W75NALeknRoM 1۪mSoݖ*mB.hy.Y}^ZbsA"›LY|_<~y 0n.lu ןo8>Iq90 LHXBEVU-Ce-"NξƵqMzi-(9:}M55}ثl/`x29}(|c (wh99<_ +h?awF`Br4CO\g#n .f~AavX} ҌAζ펼g;-$Ӻzڌeޥ>h.zb^ 1L&0%Sd<fSPT %r#n8{`$Y݋7l\1%ec"<7'sEMg \'ѳ?mGcVЏh&l|$`3TyqW;01qaN1i}Fsx7o_g04d-pMP_Ɔx鵼`1ug=m_n;}PsB>䔶:2W4lRNs\j܃jwgfN[cʋCe|qA{@y<*X@_iXC|K_/dtbc'CBBBBB>+P=F[?rԲL 1W^.}K%tag%+.B`'mzN ;WEnȽ iTTD,*>lP122R!#}Хmхz65T\{}좟UtˤAO/3xj SPn~/C0ݿd rawNCgi3?dc- V'/ 2.-ઁ$#nϾNZe۵M?Ce}gr[mDJf@2%P]e/\=zł^}#6O!SypƝh7u=P j1Cs 2 k=\ hͥvYHX.:R'Fjo~^PF,Id:!M#_>.Nֻgf?Pa O{*|M% ;hi>&aXz^ i/ (t9 -P iM{jh^߫cQ-ɂ a?V IW05୷G/^M?MxFDTN(/)kny| S@?|2]b#rX} ʷN8VO3WcidQ#`[\_c̱!ƅy J[l=* sVkdvlIW"ȍ;ܳ6mO34QKa cǟaB2 \/m4T/ FyDb0|dl19VdK!wF.O-PPs/Q^e^vՓ4g53qs\>ztUu h8c^ܚqm!`QWD)us_ \/dDy}X&:moz1 \8X9A6=~/)^¸}gC/U/]W|ѭj/)›uRzϕ˿ja'FN*4c"CjB[KO;1ލR*̭wATvoVPLa?ۅ jaz1\hI>(Ab(A//=0εHRT,̕C2>Ci?uuhigTY "Xg)s9&gmY2,&uBEgcϳ6^PRS]2m?[F~QTl>Eyw`̋|mUA_  yQcF)0}^r3L-sX.\%W!a>er EsA!kemoU!;*k5fVPi_cօ `nXTU.@g;?.AѤ d[_m"YWiҌX&ڮ! >\W*6ZL6V<_ IDATSo8]p! 4cI ׳2% , ^p,l{60 X }gI2T=ɒ}'aGo x!DE*Rh*V+wr+8H f)08p=?.OvP._ٜ݃'0"Jw#oYJ6CF L>%v|L\>fI*&I#6XU!GXJ8o=/7T—%ڇC?o궕e 3m#"~7m0 ~}k2枢iϛZ=6ŎPb:0<3 CPC~&a=ޮYl\Ac9%Iq"9܀ xdr 1) xpDG{N4IvhMO՜tVݴ!V]nc9-5y UUW7Z'-ϑuy/(pT9Oh!YU,7!!%MU$iV6EFcDO՟G|N/ 4/DP7 $'ߦ`k%\!cxL.&ާͷ!1ӚbN=LF;DngN @Qܻ)DƩgM۝hOr]'X|ӗ,q[Ocx%Mu}zc!'fb<~Z^z6C5_x\9]NsT]~0K2÷v`k|p ʕn`(0 aJ#E`[9GNT;poLelL{k+v4C aMe|z󝄬kژTugKO߱m[Bma˥Υ>+$.v" Яj@Au,A!}'梌rP@3>U:;lo!E va8h JaNs: ̮,qU{.]߂!-d:dgI Е8R /I:)Vm&>M[Axvfgb/7һ!ǚA m8RYAfTТT1$"fd>L2F+uO\\?MdY]Y •pp0:-&8tbZw{즇n&dt-KT3PN >[N^}̶a_xǯ.qĮN@ tLk[݁ Pc>!y$,^+sNa^Lu@(2ݡR)1' ( l=6s @<;'0+@y l>y3xf | 2&Ӻm Y޾,`: +]] +L}KO1\@Iysò6ABIBDxcPi C=Ų[w` @A04ZG)\r]rBG]9$Zfmݾ7D3|(|Mӻ0GOϖb Ӝi9bLFdV1n{ilR{tv@wH#׃PU9*ϫ56=n{/]Xh1(i˺\a Oƌ (RR)8pj=ɡ6MRT]W{/Ymwᾦ_RFJP_* ( JLۂXW0ER*訓sYMyŀ2sSŏiUnޠ*7m~Qv %#_ >r(QT\.UC-V,J3AxLH9``Bd|I 09 @T:;=p f-=FM;nq.Jpcl. @}ZE8 ڼa)71'x+;ʌ~5;dVئ/udh@ SJ/Ƹҷ!!YڐfT/ ǾZGQ `)aPiPK@KGY`"\z2 A#ȼXkX B`Muy|@45t =/z3Btb%G3OBC(P EaUmC5fxѢIm=nfH0Q_ҧ' ؎_.6&\2:-ccZ飸gX+k2TK/'³*Riׇ̱*62hqİ0  pQ/ZEՑn? J &k琂کW1623< 0@LBņ#*(P,2잘L)fJjB,W? \]Q-}՚9ӋtYIEYf,8x$a-*)V L^7PSTV3AEDyQ3X3Nz!G(wMJ4PF&#fcnPC/nک۫7R T0W3pu̽ k*&Ht{p#CY'(7 {G`ꕖTx:YE6{7K?Kw8A躄ܲ3`jm0%5n[hT**j\|7^ Lڙ7ϹW9LQצeZ"pUmMz*V30WE.1_mɵzcc!?{y #z*Q{v8i6g4η: ߸ fݪ7ժQue* 0q?VqjF/Oet[xZ̮4Pr xYZ6<RSi)6s8Y9#hDiHYU%Kp tM*E}iRv,`2Emp8 #HX)W_R=I/Af!ꊣiLvA߫Rb* S JŏOEX.|<&0Lg:n 牃ɍߖ[m}-i GH*^ nUH2Z`E3 ^h[Vtp1'^PF? _$Jǔ0 *#*>yK(a<}#@]'ܻ ]]d c*$n Ⱦ:X"MefG@Ҳpn-⍠h\)N._|N"n 4u%2+^’dhِvE,WGy!tyU8\r橿n"NnBtBȟ'vIMnn |cf,;kFtJ_⛷4ԉy-I+20Pot94 1-TUW)≡J舓!; =`.7Yl G@=6štD˫:dڵi[S./V?n,?|b kh(ȴf"ݫ|L n%HclUrD8y'bG!Gjɧ.NfmH @G,"reN7/u/ܬsQ-v,HxbLs҂3:fai{G1U*Gx$*7Fd ԫtHy d28JXC@;`yHWz}Z#ɾc) h$lcIp^#iI"iEպ*X,<u= ƕnB aD=(& S,y!J̾ۇ\>-kir!3~ Ekc#b%и[ԓ!'E71G _G\{A,=hDt&t,,CelaP<{]~SHJ*B&cNZp';4ɤ1$vB78%7# H(̲ g$~hý O '7Ґ*&gLZtС 1 E*S.du9+[ʢ-A.ǁue2SUsPJhi¢̟.Siv-෩-E۪ 2xAx(WTHe +|ƁZP$ڥ2bv!:排xcLoPPފ2Qk=O.[faIh|u]hh$gv&ܵC2Fy]ɤ0pr}iL|p-D.T"9G@o@O/P'1/gׅKn!MT*PM'XrF@A;@)hP Qiko2d0 u=c@̃jP18-ell'`zo ɀ%ۋe2?,2P9&7@b:m ^M@S'pb:9(ˆTH]qJ̳ T%II(H Bf)~|uq͐б!xM#-paU1pPc jl|>ircS6  趮[W,!z"˞OjP$ v~!a#G)ׅǁT 06`<;YYVĹNZY>yD8[Nsܒ3\0X  ˘ɶq$W!͙ km\ʵOsg^P+J1*0 ~W&\ΌrȐcZ f\# 22Ƣ!JSC _k^Zt,U42cby0fE|s6:zDn:PF)wf5,?pMr9 @:ó< ( v/6FО2?2xA"rQy1r7rhѺy%k5sL,^?!s `̠3*AI#IBl\Ͱܬaͻt_dcQg3!gTIr+XR"tإC?AN ` `{z4-A1xn* μjO{{IBuE+Twݾ:46VCnEL4Cf j>{$SSoU2!umf?SG_1 vMC)PƘ J};CPy"""x ϥ_ԕ:{ad^Ae#aۇJ@-3=1PcU kbTӢ\}g\-LєRѨl)Nb xrjnGy>l^>fL5*fx_E;)|Fx .\=<ǀfB219ch 8mٴGe2 Q.5~cI?ΙY_ oRo?zF[#n&Fqg2dpSf5 H%bpҒnۑ*4?Rt^>+93],-W2d4S%J=ܞF(s .8 s<Wv4#2-4c_6i=Y̊ jW% Rn:6tu7 p犣R?t#ތ(:0xO|"Rj2$siAu{cylS@"wUIwj逕cc-;ǤBË#w®+E4<{jsP+]v`Fr./ ̵gZk [ހF7&2#}}{oh6t *g^ϮNcX`lG2OdR,-9Л WO E:62{0:?,+=D椥r,ij3a jK fbs]7euAIŶIX e|ݜ]xz~pTDxbưb(0@M $z"x`_?B\GJѶk:jpVjv?ޥX )"/hQuNϛrAvTQ6h-yڼ1FP`>է{7 C7y (0 <$ >6$RSem0ڗH69ЉdBg$d Y Pt#KM2sZ@CɄ̹cpsYrLaLa3#eˁx&  cxjoFAe(Pdc  :ռgQဩ?`hC)Sw!wC(c|'T~Jm'л<ś+Ͷm0 X 0.zs>KOBo{=rK 7 /O)\-Dҥ(}H a.rŰ@7|E)$8IRWA]̝̈1 ZdTS, HI07CYֽړ6 #WmMQucꖺmnEխIfUnQ%<0Y#chʟ&<'w?OSN愍Ceߘ$2V1<}ma&T{ }Ui ap.caR(\_^;`H2l2ЊoO cu܋1rbbn0x \_Ψ~` cZ#Hhᨀ 861kpNLaR\.V&@[u*=`lW܏1׳0{huv$2B9 8gHA)3`Q ^B(hiɀSNdn'Ebԫe_U@\&e/J*Үf`"t|.[ebpU2 ;52ų̋*Nx,MЈ 3VL : YB3,đ f퍿zDP~6F {S 9>)$_)nߺ0'a0υ%[ כ;R# z_J 6`n~NRL? x$pi gY17^f)gSLq#ԙCƕZ)ZE;D$~7ƾf0Ng@0evf>Knw_ޛȒgb9'"29PI5#X0ca$[ ۀa`> aaÂ= XC $KDnfV{g1YT+]޾Uy}-gHM/Z{Y8C#3t E%'3RӆeKȴK|!snX -e4ir8Q#?I\ؚ?k8u<*7_د#đqoP ܟv`/GwuM6y0-BK;Q9W&T'אgq}?ǣn zrbWIVT-;o~]iȶUd?n#*ֹO2Zɿ~L&5fʫFpVYmvCIqoE'ԞE;Mi& Lsgw 便H8֔CW3Du/̡8c|8^8/!krbiGgG(E&rBJ`ajXMo͟'Vs DfPW0Ȩg W*mH<-&̀0Hm eR*aL ɇղlqZrM_Ʃvsd_yck]X{/ .a@ ^&@H$qq_iz}sb@(B\"~v] :EΥs)Y/ ^dCާ2Qre6F>H3١s#h:QK3a-3d;<`T6K|p+?} ba6Y"qz6?ݳU0z$uP,T ^dLqk =Z29{rJ}Fg)*s2+52ck} e=ڝS-]X_JTw?Omuܞ՟Yo$=7gWDO~4OؚHzo4]_h$7.)84Iᥳ`^n;(xJۜ?hP`K[h 4f A]q!QXe.ɣ|fⷴe ,2HY%)5|~5)JtxWj$xnXzą^LRM^mMε2coE.M]7" u;k Lv *[G1NPF..9H* QQFt̸yM$7)C\x 5'RaNjX3Wh_$W}3BjW ¢툔Iuv' n T{Y[Fow j"^ PvL{2 75eif/|)t4GwR|Y qՁ4{ٳX[~U4A3y 8(@tcSTHI%SR-_VXy #[qV$\*v$ţv5W{W;}rUMz y| )JcwgPߓ͒v vkgSbXqK[yo,)+=?}0p_;Ձпq E6KO:[p.wM4dP;}056L=cnXλ'pI̍yQ:ߢ(eY/Җ̶ En~߳ q.kR:ԲՄVrf5x/L0g\pku+Sλa~h߫w+z پ ֧Y,8pjfb(WBY1Bp}[<.0!p"we]:"6 4(),ap +d3ǿR{?wj VpB}JKK'1A4@DE8 U-_\O(}Gd|>Vt1q=?%ŵ!~rǥE-C/G1i*FHQW˚'x65u &+N=QN*>]g# 6@P,~{)ng/yJU`o/z(7}١=5eG{wMe bh8Pݲܶ ua %!Ὁc:ύ2' 3Q@3 σ7,K;?j &a%?_K:/TdnuR1?G@g,.mf'ᯟ?=nPq+Z{%,ӰW39h83sx8mCBQsbk 53Dcr+jVq)@Lа=@W2JOe  T;{C-޸+fK:(H(^&\ZV^ɘ! ?}mMA~>¸@Ҏ7*ɗ:iQL^޾æ͐--nZjoN1IR%IpN|VxD IDATO*"0Q~ kxXúdeAx%u^C e4U2x̜ѫuc~tֻs1V@ Ob 6n͟yT:cy }F /%a< M"vp~v[j :%ͽ31~cٷC.9/OSzL8961 -S``F,䀏>}߸[`s$lG9BI%ӌ.?/Kar=f<ƈ [ ًK(&BR+ ,tK[Z4+~eS7iwGؙ?0fݖ5s%LO6+& ُ^D{.u͛n'Jթz]N2g4+q0NWg\gYQLW߶Q}F砒/j$M +ٌ13لrc{]!B3(dr0#𪆧? .A8eBi dHZZDH?TQr6`_vҖv*S;#<&O sPMe9>8Eq|"lLLo<P_Վ2;r HCnym lsguh P =lAR{CVq.R }i-c biKsK)j驢qR w )]*RK%BFђPq+ve?|:x_#$Tch;)&j1UNo/v$9 nۦaQ[׬7ٟad?mwy}1d'޺LkrD!\e1 >\93pQ\a^Ef4&?˜3O_C I<+[\j)kJnLTLǁ{Xձ׎Zgv<@xn$ -gcAA&>u PQ'"J.p@8T '-DLeMHx/ '6( !U5_7$ 6VJ+Ʒ(:C/ },buIdٲX[5q=סmaG^Xj5MB }H7ppeC2p@a6H]\yf-|r[=fɜU20NOhvL[? ʰ2$\JAdUң#ҡUK`7[jMf^|qxFFaCtNP4Zf^:HzӲ7"ҽVş3Ys^k{Nkysf?e|<&pi KՇPc9˖DL0ݻF${ %'8h38&!C>` W&<c>KR֠=ܚ$xYu?+|Fۼzj/3R0S6znxBv1 9(XOxÛ )ٱc*cneX;{Rꄉ+uEP^㛊ͺ@K2lUDPh0:n< Ey[X\Mby˶"Dto 4mu {AP+CN09!&7U'v evQ0͟r+BP4ckXhPKezl*GfSlUWbD4BG#Vfq6n贖Ń76%d gL׾d㌍I0ǝSj3eGC|2*q-MJײ_GrZx\8|?Ĕ X/,#*zg?1-r@:"pk֖.$7KE`)au{e>!ϰrWk*\\t&ga!j@f=nSUw؇B !WqUk.;\aebEy\J|=(TJ IqS /^q)H8+_ 8PP<tul d,| $IJVijxg ?O_r"|EZ>0  kK;{\%F 'O 8#P *"PlU|-[2s%=T\1/Evx7D_I%ǚs-B '54&YG?!Ұ;1섳K2 ,=ŷGĿ~m ! A+ʔsI=\ W6֤ĭΘ=o2{".bTHèm,Ќ.Ҏ/Rlӳ]wH_VoϚ2q "LDE;Q+MGB<1)@`(6gas!?; [L,t\YT#G\{WJjY0 90lt.-%) ܚL*\_9G"9r&6&p,~%6.HT,»=:B*KcjosG N_W9 *3l¹لA8)8~;y!0Ի=*W3W~F;$hqkVMmNtht9pn-pឹ#6hB,yILK<=C^g®0E(Sp3@ge]+(]`4 V:l c/wV$ mc`rEAœE[/QƄ %y3KQf^|o_UB#Ktl}Zq("ه嗢)L\L:1#} :YaEfG[N<3 Ů>;bC x A,G.ZLV}B -ٌ*`>⤅LbXHŘ]j$iz$e0[G4j,nO 0$GTs.Eo H='X=)/2xmgHLZY;ocor;L4C0!V!#zTWUtZp[5R 4ennoUmBG;57 1׷G۷ԿXv'ϱ:uOԅMYOP4EƏ#5`; SʄK,P(esq=&9F= Q7p#g;f !)=Yډ[η15$}xMt-QWRh/"l3<%dʄtJ2rY#J01l/$ Li ,x/_7'e87h w?'w}*<$A 4_j^:=IwOZwC-Cڼ>dmz4{ԣ_tt9 cm锠zUGq_ן!" !tV֚ۡhmAگgdևٶ=Td{K;vw`y^ݛCx,?+xլTU,PH ^@ !0 f#fjYwڳ^2@ď?#_w r9=Iiw[?;{ w ̝g"Ղ2@&,-Èɘ&/y:wf?AGxstEȾg"Rr[Pa6el c7LBKc4?"0OFiiǛ Ya"S|rE9NC)XR\gJ)Oxh?8VxaV?~@y"%mBdn~-Ŀy<ſaKѮ2\\S{A_c :X{494u4{عTbg>:m-*_ACS8x5HGF{@D P x_yZg̺d,OYx1WY$s´i)ZdRnJmS|yV[|2+QI~m\ +eb:Q&?ホ134GRP$V~־J6%wF긁qa #V}9 ցS$I]E{S> mxVHLШe1#{cziaiPj{yn*tukNumTMbeza³llmkgsY;ԸNH*'0L&0dpt_WnDWzm {.A2Pk2m\ ^Xbh*@͌gS{?]Fchx(̐ ^|Xtkm w >%\˕11593 (ٍGvX'etjM7G^;'Zm 1g8nꅙFCRp؎wR:LSIB(~Whd*|@6ܦ w{1^_]&-Ļ!lҎ7Y8çc K:h*+℈^ToAx`"4}4ԐjEl+?aI6ÇSbTQR'ZR\]pw?Y ]C 7.!0.-%cW S=灙xH }@y(ȳDlU|b2scjByx_FEͷ ?灜Kv&컳6H&˚sB!>yy}@`,|7w- nzlRSчu ;YǿcX^ :DXc59ϱx^jVߪ`e9^]9Vhlվ%0Sxqjy&{׼}]7p/8WbT '.+%(AiݜV <oCYC16hF7D(Btո"Erp¨ לHZ4?z qAXמd~9 ]t >ַg9f } 6sd8Ze%^f7J^y;CR/KH+COCErȰ$l>fx2=B,dUA&z~2/*@8,].H1M-P U@a׏qDTXغ09~ e΁ -5|wHt&X ς֞|?\]@{"[BzfpK3?xpob"*UWѸ+a'.<;bbaj=ew]Fřdm;ԃnezWt9&j T] =RƢABRfYaOX*!"ZD+ELP\|x@.ScyeJ'[[oѣ|۟`:|$sPh߸SÃaO$b=&ŗX,34C%&6~{6hX{|``y1M/-ʜN?^AhmC ;ZJZ#aqULbrh+X%2#d|QȜEɹá)s.LPb=X o g)`JDu<ڀ< }p*)fi+HQP~~<q3d-:%7QcjŕN`_DNq0J3X '1M%?Ԧop-6+L0.װ!l(]qqbTL bQȌiKLxܳ0Q~8G#>wǽpH`kb]̈́ L,Kn"-&;-&! xVG= o%;|-:,Iԕa!@oqP>5Jr"V7 IDATَ2dTHtʍ=" YiHHo &Iifet2ώr]pMmb¿$bŀ`]]MRZ vKm`[˒82?eȤ.**٧ff8Ek2E=sVv硾KEYuտ_<&HmQ8V%a+|I6NT;ĽdWe,ޟL`pX3@)<Zc@OJ৾v]D[KkX):|cG(EqA$h%0& V%wõ5U O2VZ 6(yR37bVZsrtܐ{4A1]l5 ]Zb76 ”2Mn|E>dҔ%ʩ땂&|{ۑu"}Rbp=[5.Ic|hpOWNɱPbV0=V뛖X[pHLuO pOϓU**9Q|)Dx8q.JWٸV"xMpp$#?  ?~ ei/%d1U]V~Lhac$ۓאg&XK^O mzp%+БSd Ҹ(~ڎ9HZT Amw Rآu2t^ןV X~ϒ4p<8)rtRKݔ/]/ѷMc2Xw~4ѹ\gh/7*C|N$738HCa $ :6_x#]1meW j,4s uуMR1E_6 զiO29 I=SqY.+UPFMU04(>~-fK c&}V?= }\HAOt&Bgġt'@3y /zQOH%^S \չo}aW +U !h/O6K^oxPg-Aԏ*>QhWspJ_1nBHi\-NC`Yq" @Aފk&LRpX;mߔ2 +Ir>܀A)/5/7.pH>۰D):vH2h=MBRϤY ^`E v=$|%W;V b[lq.qTt0+HD r9:睜He\2g%YQ[TQHdj'U|Cpv&ޕR/B;sk(cO'Jh_ :~d=Yd]U0նDQ]wLHnxU'?Ŕ ##e (S1߽w?Cc'bFҚaRe^X Ŗ̡~)E9wY)I0b}wUtpDAa) !}rGD1E{)ٓWeS) Y'~4aAqGz2s%pKLP( ebr60q9t-OpmȵRlDA1r ^ {? ,IluT "dE:N*m0 xZ#W [}6jבvt ]eq_aqya54NVZaW8WV4 6z0Shbe[9*K_'ǒc_{w8菲z?E2H"t a_C µ}N2ڐPh,ާw† .^|Lp~G. \摘x$ SvbOp1H%+bYT};V,)XvO25 Z?Gfϯ%2:r1ț{_M=(a*9WE,|b od)v{ 

    .", kδG)&i#|H D/jus(hDdn“7^G,P$yO=iţ+7R)Ԃ1N`ތZ%doBβ҈\Xݽ}D jspٌP$e!U[S}=7/='a]OwxTZSѳ~g"œ֙u6k,CYAJ`! IU*a.<4FPX'm9L2GCT4X7ų}4i9~'){cBƲ}Ps/]X?M~⟬q ERqj뗸.hlcJWsqDY_08L\&ssvfh \ts)T! ϓ \PՃ^@V yM_ @"GO"?U"+4=! lXK}dI?$XamEaˋ˳lΠ@Ԛo Fsಡ:V*%^U[r~}2yR cڟ {nʼ>B0ԗt|g(6pŎZv NS5':f jlOb>jS/KЩ/;RVZbCPۓ ۈ矒߻r)r Iz0e]ycBIIHy2I/g4+/¸:v LWծ-SmŪcI)CD>Kґ.͛:HGkj x]`=M"iDq0H1vsÝNg1R{&72)r:&̐u`l"; ]b)EXJb,5z@㍑<(:PE-~r*/)ќ|hbg[\UHg_ dA2s#apnS%t>| 5蹫<x|v)c^0DWGoq$d?ؙb$\'gJ;?M'3v! /I)]cӥ0Fsy hDh+WfS|)|VKٯ '%&$rSW)~r!nPN3Ĭ<U,H8ˆ$L' +C A0.]lt}l[S _3U6&̮E,+/ Ri) qZ韌t kJố9j 8|$wCi_*E΀ZL1 b:t3'^=ߙ^ŷbV>R AMxX_jI4$0)h<΂&Ie8ɴ<ضYYt`σ 4IA.ywr)ߝlH芙O\& t{/C:C j_wd&^wS ^^x n /}o4>]ZNrHN;?B3r.IB/MvP}a!0eS[N:]A.ݧ%W[wy7c"oz״ȵ1W@ =Q??  l`­Ty]Iz/I8R $Z֦盖zd IDATVzQ/sQWm 2SU,>NgXy \sF7^NPJ2?&/LT,Q,D|T nwqL\,cV~{"EUmч#b͛xi*zbx8h QU?GՊܣּ@0 2?o'C*cY%8|x 6'%g>)%JY8' GW$#CxWyІ*%Nv4#U /˦rq渴"L@۹ efDD,~2?jۋ8r @J̣k}^*c0~K˒0RR2\=?B>1GjK\lqzHz/K?Ab`GL\1U'l"P^طh_.1Iv$ŏv'xZfЉdXd<@l]̗򲴟xc}.[9慞s9ND*-~QP%.k`W:[Ph[],ՙF1"bV%C yytϽ,΋&³r/X\ق=/a1?+Iݐ}I;wXyQnY0U,+Qv[a+#,؏ny&f-v\_kx2񳵒C*x v*NyAY Zd*'$:ӆ~#cÏַ#f( #L-0TdCؾՊ9_  aD0W?S@vczp[.Bd*M]QAi~#5bqP=1PRLϲ njOl\H֘@OOxNg*qH1 =(0!I_']8cIO6kK 6ҧ/eJ2f{+Mw3ATiVmvˀQ~qClPz3P6W۰lm쮲))'f&yq3m97n d0d2%A 5}Q6>tD9x)9!I\L8߅PVűv=9KTNCG 7oDl*]Y%Þ?e.C-0y 3?Ôaȹq0T$<5MbNQWM|/ UF[(\-eGF[gVaͮ0·Gv%o'c$q+t6˝Q8~ZZ%cDE#,&@>-?gpQ2?+&3aj, ~A=v+IO-]%7!| ̶pC +M3áGT/?'9_Q@t1h(_L9EvD)(iD>#a8Gx!w\X^{`<^.3.<-Y}m^)sbMAfjΕD~)ۡS8ӿŜT#?ߍ,)Vf- D)&_A1)O?mDٴ.|3'zY_=B_9<=_3k v)rs3 ˟PoaФ ĭ{&UcViYNƘߝV{6V4&v&UIK}eOr`6s'O(vbE{@Eb%A'Wl(`1SXnhBZCؓ\r '@#f4Dž8L@CD_"#v|a<68h~8c('] o P#t*/zTJ sobDenQQGt[fEεk3Nz̈Jil%FJ>:"侗@R ev[+>Gw|WnW,kv,@8~jV؉jfx4ILc罧gAgc8CS:Ei4%p"jl!iO˲X\ aՃ!W 'ً5v)GI,K<<àǰ;?8@ "Js9%r, UѠ!2L,0$&ic-Sd:|LD2~a! }sk[L)S 0Zǎ;hLvd.. яs='M>_`t;4(&g[*ʾꝜ g9S n\m%Kܯֳ>Z<"pl^eOe#-嫘*@%Lk{E)8lڏ8$s-/LFN['u{~Kjrt:xgRKbDVVl yd19ńQ6lД=k /!C h|k zR%pWgCY6!H0h@R@Jê}סx<Seѷڑ?OT@E LJ*=)ưZg[+ SH $b&E!V>f0vE::-]12`n£"ϫƁ(z8SPRHyA^Tm M`J}Qz?GTz%iN9W>&:I39F{Q^5%ct jyMYZ >;pvd۫hݼ8h`ƾOOYsn1uV'dacY=w f3 zM#RL:xL`' 0p\l 㞝lWkB1& &,RrAb5`f݀{^@ (Ga^2El ]]`@ܽ$.sUx"_ 8B/—GvW/`5 )`a_Wކ`G+NS؍SiT{:q^KCI[N-;nZzOyMő`ciq '3mȑw{k58~>0/pF}Nh{Ax|՗`'brıZV|~ ;EdCV}b A 4t٘> YGǛnA`SXij씔Ў`B*`Ke lh*C!7ĭ@፶6\< c0Қbk+Gs]1;4aUH?ДԧgFX?S8.S[5D D*_$ \tg 7 t( :hB.GE h}9LHי~Y wʗ"08OȯrmVeU^@-3N£|1rC902-x(۴}aM{BYQˁWFa1_=3Mhh"9I;9-w+x.V›5W\LAw9/] 5bJ#RHߘm᭒H4u|^|aN~MQmY8 Q E;ݮ>lɒGNNgK s1to4.(w&'wVxnkWlŜ Jh"n& ]2I/ a[B!Kcwր(+edA1̮򨸻Pe#q줊Sb.M)Fck)k%84 xDE|j`e+$zld0;/Rohbc}0&JOLL&CdȨң};TYQVJ@6mj:ݙ_;UQr;{[:ç&?`{\'/ #ӏ1*)t?g0"9VXYQݽ sgX]R#ۻ1nZ k\7o!j@; O$oh}Q:h WPU#iJ6rd17 x_C!\xA&v R+ڱ8E)B++y_U eGyI-* ';<"E8 Һsű Yql"y(z Ϻ^}g_Qgf&So2WpE"luq_J#$iS9WW]%W]s z^R6VM m"G\U]BPiV DfZGa`^Vbc eŏRB%g"w^5Αȼ䌾d{&5g0Զ P dj9Fh\g6_w*FHX(4.'hԽ&:½=@JO>יt4B>y8"9ulJN0u4 &q2 aG.e0wg__ 2j}(OqNDaSJ‡K*yOQ:)yO-K |wZ9~Y/`÷1zNsro0mp39- n]42Cܫ!"(ru0TFUF1|5꟮M ,.d9jx֏>cғ(^3~4*P+EIh`ޢaB {3>s }>q0fOb7}u󥽤lS?RȲQ'T݇4Tao\d)LoZB19^AzHc"1ƤVxB" fzg̒}AA[7s6!91j-a:\2, /\Ӛ-H^P<괚s/.Dؔ!*8p;.ai,vh\he q9F7|$J,i/O9Y%[U4hD~ iA lorp vTү**m`g\/`6:ò m:Do5G?|c?*^30|DzcĂ|*JQ!7: PBR2^Av1!#I<^Ӏ/ϥuW>J2&ͱπa^<1Wˊ||@\ZPDzȷ(S~XiJG0[<ϯaU8 jC>ӿo@Ѩ$ fnmilAL01 ;ÿ{7`gJ)*(˧aR|̓-V4ѵUm3$*UHm+ґc'Ic[Or%[B/hh&pm\RiM{>h_7> RY5/si/^gm |]  @x}z𣑥-S~$U1U 5Rzy$J+ɆL2Q3N59݃\}֨PgҟLj7]  7[!|&f)c&VC,u!q1Co=DRL4te񲘠wH}g{/5[)B#s.L7p~N Y46F/Wk <LK;sUnZ@+r(GH]" [`C~ H8%y'⨇0JP!"5,Ը'QmCDrTV׏+keoAhqO]:]ư2.T/M9)ϧcyc)2aM&KR`cw?K,+}RmTy#QxaCokXxC!BP#ܕ\0U"|Y"1/kz.hG17sxRρvI&?.淶=u>2mJ]Zy]?Mԕ} HߋpiL<0.Ͻ]Vq/ .6'$h»}Ewt*4./iF zg _pMs^澸݌ b9=xsAaNf^ڥ]$eGsleV5/bv69^0ܻϺ3</_ 2w aYC(W"uyΟ _Es|z~ 3;<PU|L !Tc8 ^nB17~3U&2Gq*&Ldj }$8D.2* gW8r}b4>s|T?g?izHhD?KN ǐkk8'3 {]AWOp]TDS(>fw^FtVW+ ?;_G?hؖ 444$: ݥ9,:t=6]XBaXGfM8J2O*UlyFIR8!Dcee/w=Z!z7b"h-+Lx](1G{s~evdhRB ?JB!J KK{A6=rT;wXҎ p1G03 R\bs=ľ,­Y%Ȋ$!ƫp{UC{V {ȄˁKH=\^]3EDa@u>o|_j}[HU& ~{s*YFJRtzz}DWh̸6ː!mX@ON[=d':J'@쯨As/In;Nח jGj`@Kx-M9ApwQ) Xw7K ޤDŔۛk=o!qxҵH@7_$-!ۂټ\<BDS0D\a#4D\ڥc70N4]+QfLRřgd)ԋh G,$E-+cIq?WZqaX7n"CxDnN&rx '}h/Aa[.Qbsbkxr^lg hD =Tla<ҹs63n!Yz57,9JPH<E3O}*L".;}C}Hb ^ڃڂ{OyQp0@ۇXZmK= Bz :Dp(!]Tz^AO?`-kQ"ɜ:Zn}5ca{A$ |E.z@u X-xZ8}{Ed\K{sEQ%[5`hj=""G)nk Vte=9KOUx3(!FC(mЏ*E nA7"kHaqqSOHw `¿um3')BhG=t:J ~qpO8&H,ar/Vw•א-`n=84PCԼI,sGwAx!AvP79;qe&!yZ-}yNw8ynriU$膵uXJC4~v8kɋY&f/=kwx~(vIHm!Xہב};Ù/ YXEaS$idMvOD~i/JJ=`gqoQ k$5;#|+LPM" XvHD* V4L(y }A zT06 oHZȩalpg=ŀ:Ya$9 j(\)!,Si&+"#&4zTʏvZ'GS *V4Q-P1G̨̟ \ŋE}4!Ni6"Sv*JxHen`>Ng6Q8X?G}@cᅨ=.RQ.ps܅bŃ.?R_{2trmO ^Q_|kZ={.s(ף<'e=ƒ$Lʈ`[젋1RS3ѓNj/%mesmNk[$x 9jЯF/!3g-\-66AV+p ߸G1tN-0Ѷz̗!lo]$ jj++ː1Om+&[ģ!loV"'iQ(HrZ0q3@M@y*)WlheZսZ9Fv?zgu+шd>a$5յ:g );" ڧѶ -o"_EKq{8st&mhcu:߆Oz!T VP[p2"Tv ieǙEX""2z%b fppMETX I.k+,j"G'DWv9(gjyn5L~+_8,IMc`.Z6"ۅH 9Z(qjA{Efh>_@#ViJaA+mtw o^GF㗁8mmm!q]pS32ȕh|#&a[f$lL\q`Qp&aذ68ΑioRr2mHSBB΄p錜?)єNOx!‡Ti.4aj߇p$,23^p@ `C1 цtТM~  7JSv°F $g92.U"_^EM$&1`Ђ4"G_RpM&\{ WVgA}ijH\M1DcjR;;!B*7Du(sB;l)e@k a({ع!9>=3?4(i<3^ju=\@ }A=1EA :H אOXL!}8x4mӜ>9hOG4+ueԟ$# 7ǀ\ Xن?w_ZXB.D4@M)}A #igO+j[LGオ31`?>$^ QS/8e6A-V 9Mx"L=ĨVGPEmc$趚,UX :Ρ6;RU-އAk7i H &8Vr=ұf-^<)0K-Nka |[c۹ tEH#fb}#2"-_LXct{CiEru?x%#6nݽe4M1\-HEvaq\Cтƛom\A- dq*'oW&;Hu6aPO=e<{vlh̠Cq.r#tr{,BmGC+X;U $n^V;8ݪs#'jZLxJGիa>F/obG9d~6bN 3|k- t}R/\ĞcާBgf'dA B ξcX "EZ(8Cv"j&$-dzZ_!Cn8VMA kc#M- r 045qH_D}d7Ȳ'tJuCfbG3J3H]p> e<}H#x*"ꄋ!q|eGعxG~5Գꧨox(nBk;Ik$ܥA?Bְ?ۄz l=d }TXM A\E~6r喋'Z\n3um#x~ 0 a@]"N H#ێ3H I*H)H GyϨbF~Zѧ(^\B<F,*cA$C<~ّe [H`%k0sTGj/E1pN}z>Soa?;T4kM2?D(g<!/-J [fD<ӆ;3KA~F4lYhaĺnZo_Y<1⿘Ģ"Vpz֧!"ZPG%܉9nL3D T0VJ@u1An113*zeu3 M&>½ɟc#''|ņ(vvq}G6Ʌ͇~!| zprx!`K#\p;WWY{_0!Q%[P>sV !liC XiY|@xZ {A՞etQ?*yvשTkrG[[ @Ag`Gޞw)T'[%Qwc$պ(jbBKb"L!]%ʯ9LA'c? >/iGqb{!K{6_CxG҆;h3])SYbBFú+\z^qqۑHSqBz33ŔO06}6}7U Hw;(g=?Ai+=)ל>w;(EٿY&6_ z<@@Ե bcu&%c&Ҙ`EjIXymȽp"0k(P ‚[?P|BX$L&[H/В{S@louzD6f׿hE~d* i!Cv& 18h~tC47wᬭr?p!Ǟh}[4 v67b"":ĭ785Si4Zoo d#feiPrDHyF3 ڝfoP+4|")Ůzh͝`/ +Jnj3d+8}>2ȫb|/Ũg9jeE|w1*1{` rSz6!L`?\6JC9q>'8\XXE%kWz5Y]̣T!8TQ σ !'mVmh49YH@tP=bS!: > IDATH|͟k!`vlxo7NM%}$+^s"}01ОԨpq o؝rQ[~iٟS-wtaL>ݙ:GX5_BH"NHPB&&zX"%$fACЮuxF;.7X !l!v;.:SFЃ1lf9$@?~iQŦ*Өe8<^3MIQqt>n#ygBq ^OxkpoaUxw8&ldJzh+Fpkufk7!\&nzj.xs򕂾V ["|EP ~ch>嚊J[3*^;c;SwuSMYRpgE`HLh #GJ]Q=㘧&j81T,97AF8u=l:M&`H'F=~Xidc`1%%%Q|q׾6aA]D _$c&p>q~z'׀yZ zyf~sHirnc40r1"ٜ,6MG}zѿ\|눳Kpga$gp{*@؄)F*($k4Ft?1FȠ!Bp{@'h1б1v?ބ $ƮkUO)Q{Z#d! U$j"} O號,qV S-WHdD\M"*QJD%[U# 4Ab9f7:BZ?&K֩t`hܻ>1TRG?`w{ i(}ZVL :XyW`L(&ҹ;ee'|zvn-ZªX2. eu KYn;Qz鷧.l*) RPlm# *yr E_==^@DhڨZi!!s:M%1գy>H,|S@Ђ Q3E&_A0>)0+ I2:A&DMaHiqjk\?GM-= |nt" xo=w碞HBt ߠ,Gz6%}'1[@-{{0 ups M}4hAu=J$rďD!"j9 KEIpICoxhw PK?%& o6D92>NʨH6ޔ _шU(f@h# ˥Rgh+Q -ꐿ;[[ʃLkT iNtcˏ::uɻL\Ve%Q 3/rߎ"A0,;[_!X(MY~⭯~e\ou Qzꢾp {)Vpd)pCxpgkpvznM|QqqK'l*"r`E^LYbHנ|a [,"?C >OTk;# @s(iƨUE}7PkW\3'BꂃmS| &YXYRNV)0΁+sPn&KsyEaK^NxVi>އ'1Djd'%`RGq,#*]!0..Ul/Fe9rG"qqH݆  @DRTbC&&f:/T5)װ)݇,ƽ|ny~`7btJAGc;e4:v?K}lm\ ~ut#z juyGY!,0)zf$3ٙE^9 Ҡ/mJLF&9NdR%@Ð wTՓꇪEVlʇr]̓+i <<7!dE('+w};Q5찝S)p@Mz-%rж5jY Z3a /Ӓ蔜O\>O S]dppチA3@#%B.HT̈́IFu;F椨 :;>{V.MB8hs@]T:Һm[C =G+p&b7.rImE0P#!]B3i$YXp-km.I"iAчqWVW7>ti'}ا-AmUa(4MYsK.[C=`A@)4{j|7k7Dila W!u$9~SƕbtahU0WnMw q]>/I>xdHx8A7afLyrF6V^[Ł$踴2S)4 ~~CD9:5eߺU?QQt\͈ůCzdOpksuvAk.'qow <_5 #YY)1)jqm^sdMKuXdfmĎG 6"+&VRiL& 5?>kVg}(ۮ 6N!4#hρm4(X[%xy)}Aw]E18C$qR{Hl!u]4X" 9v.jWgAe0MEwkjUH/,DC{]13Ih,%$~&UbRzƵ&-%j"v^>A+WoPud6AYdg *.Pܸ;pNDD_9 .iB$] Q>GȂ93[ָ qa&j^dHFL;{p69|Fo+p$F$=k[gUuWw.j"-EA& g0CJ"=t@ nA93fKUGV3yxxdFDVfQ`WeF%@dKN<ёW<` t5D#.THa/9B ϱcd)j5qhy hP[p%\`X%*F\XWV>0ƴ+GNM vpk\I6zֈ:B>>YF!F{}dǭ6uZMluL [(3ȋQdU) Dn"s@ k5f~33l,?aʾkI9?:w3 q$B&G"̆c,UD+c7GbWO{gzm[*͐$>* .mJDBg*G2g őF j#qEl jǩG{+D^y() fLIm$ ^tvӗ[L[{}'E}K6,ȋE9g ~+ul߿ h1 H[|x .nуzMwЋ^zʠ>zV\% ,$> Cԇ W`f"Y 1/!ENs.n=[a 6oԷcpUc2F UHӫ(h:=ELvZg:n4IB:eb T1*|+GH|Gd^ #'}rzBRn#:R q3y*P5T40vg )!| $'=an 2m ƯWtYUNT@'%r<3kEBgX})}2CcŃsux^`V0 [ Tr<_6P~~^ͤe+w`.A9]꧘j1&-M tU1L5'%K~pF;oE#ǽ-aiGK2;ˋ" 6W};Ɍ9eЬgAa;_DX0}#pgskCγzc $Sa,'*…uyF |:dE*N)mL8K y׋壇v/cGX3ґ&nڸE=r8ۄbU $0&W薭H꦳8=ktDC8# f ' GcơQSnL7ߌP ӌ=1΢kZU/&4.|aւ7xЍl=#>䙴8Z(V 䌌ߪbkˣ /d^A1? 7 sSM+B{htB[_wr=Zr)o/ ˀ|md5kSm\j.2UfvFZ!7?l?i`:V[ Uyd :P*xώ}d4h (hCnqNtcz>aKW֕ױz@o`C5>#Q l!fV!>tFt0aIfٛC !ӳ)jp0";ei@SRV!ʥO\z=!#BfW_>vSD Дn&坢ΎM|UP4O?C@9ex Yf$ c}"XϸzB.̠jvSh8uNW ,F!(Wk)VC .t CkRaK) G΀Zxd%J֩C݂Y{6} EԜf_;ֈ&j=Ƶ<>p0}ϸaBi6zW*q}w\HNxT4G,G'} KRYZ2Ys&,PE >Ѓh0t /$4Ha YXxa//p8E}`H4^E|_iLN.ܷ:̛}j )GAx!"KZb*ۇ~.r`1Dg' '%l/1|piO+p9Tk´r1.i"t֭q,RHF|h#^X\B1B^8C$&AED:>)~1=KQYZcN$kF꤃aCr ADv:G垇W`&1h(D@_G^E1OЦ)\RiDxڑUW.gXHxQR|gCIi\o^Ewe01##CU>q ƭb{34]9ԕ@:w֑V%DoP"_o%t)6W9qOlwQށ2˧]^Fx+oW!h=f-,FJZN@.fFį/z%Ɖa, @(QnBꧾ7au,<~=9t=ȗ^B?0a` H>{ ]J{YnTR$H99= IDAT|~ +Uƅd`)A Q*ĭ&vB|'*)^Z/P-KDߦήx8@ogeY/ :$!31R;@D1u[1'|3:܉>7x}:Í8haQ֒l G&G n[_`{8#nΉt`#\6m?FLē ѵ%~UA3;k$AL.5?Dqq~gwQ W,?˿n?MބRo4"rI%ʀnjȞ˶> zq6MM"⊉PSZʵUDijflm= vX8^Ľ-Yֽ\ZF(xI6ϊ\L.~nK'uUZ9 o ulW˅ )gF!逪@&SX;'e5lTˊop%5 2"uTQ8ϳ^K2ʬC"&m(^kʽyB2K|ÿrbea]"R/,KKЄDinB;7C -?xxX!KiD`D{&W.9Ks$ f&q)z'o v>M7`U=]e=']k7>gؾ|ésȖϟCz y~F/PH<%dVNIrve1x YhL1#Z~t Oo {KcZr`dX ~Ԅf}h }xK(ƥ5}Z!kG΍dIVG!$LdL֬`x~a:IAZ&mpce xMMd>eT,Y*)Y䇲^)S^vH=Ԛ1ob& ˹p654o#iMHrWh^\>4)x E|]:AWWp]v!?KWY&I,躦!#q54" yo<.4#!O;`hAEVh. #9 uAɓzv$2VG ;: +"㒌`rBMG<3Z7,Xc-<"U)wm*C7b;\xi* ư',[+sVe^z/a>)YFeTXMsc 贡Tٴ>J96bB+ ~{;g֚HEpaÝ4}:~Iח (5/, q#9# )S'_xJ,cr+# !tgyٷ]ol:IJ`Q!=9Q@$)x|*N/Dm}u?^#bd+{K8&D3p:*+%a# x G$r`zZCPSP}E@^|JKz=֐go@\!dg̔M) k6 vsI CL` sy+?@IQgd.)1pt UR<QGh_ F)$V[Ghv D^C͟b@Fp&BsD7)|oOMcPB1:aA,(y%⼎a`f({ĥK~9ׅB^@ J F;!0-7n"' &-Mx<|pI5te.PYVG mh,Q#Uv_S)}9mʁ9]2YCx8-wAs =xY)lүdDU}_xza*j\uEO2Pi6(PGw-)"gT 6 ,"%c)Yach`%ڰB-b t<B1HGNsz@o>dҏ?@ lΡלGcgo!44.-B|V3%z?}?A# sNGZd6)qĞ~NbAro+u>-KGTk(,Cd:^[ַmJB;<]7}XALx,~rux%/AZl B(*Q"8}ۛ\<;4cb(4{)¤kh'7y, P4a^{ uY.WRNPVttKAp;wQ̞vtGp+6:6EfFk88h_Yѵ=" Ug?Ͼ.g$ ,JkIF;Y'N^Sk'lUGE߇ Λs/o^oZw rofH}[Y&2h}~g Đx(7+ٍ%H @"f#QRD 7 ]|*K7,jQ Gbn qӢ6?s~_[?^;/mMR ,^} _xoc k[p9nLGwTU'Mv6aE=ϐ$)?gZϏnj vZYdp"kk%ZcUX(\bV ^=GdgPG=S?G uyt!&ZI`Ls>+)tC5~iz ޢDAG?-}iuFAf"bFa'hu ߁ga$]ag !gi͢ӇлWP{#sֽ|`oah_4);(֎u$(o4_A. f s\ 򓛘75쟿.fSᣏgh\; ȑ&|ٙ#]Stlk2x\{|9SV5s`:!D.xkہ[ ޼$ExɒWi.Ǝ큣ȼ&Cm=Bq8)8~Gܕ[,{]ƐT 2hCn(oYDl8;!$jG "z^EyDfi+#4FDjɺN(]s/.1$WDZV;ȧė\9M;FI3s'HqʼnEJ"^2xս'_A{y L(ΜlЬZEH*퀍Nax,tIsVo! &ingY>>P"$- cU)Gv27G3PA*϶5%FdcnU^#w4ǽw`ִc|Qcb%۽!>q8C#w%ҎFS:xej5f񝼌^pqnl s%fߤIЖC58U$6tfG13 >$:3yVԴDq9,Y(*w'@I/mx'A=c=Lst 7Su$^͉OKH(}``œ2VO'5T3&1--F 0F+!Ye1kOKT%szsOx*4et!vvㅻ/UIoPavGe1"P@ DV 1@=͟x~W/M ޡ$(θOZܙ5f!]f@ ʜ8Z e* XAIKk5dD椱]7]ɼ,}z< ʝ &zh (sP7),L$?!> --.b8XKi!VG S v~," /C|?ݎEU!Gܩ:б`=}јMn;70eKQya0/jQo*N2 p#5&K+@*+Kk' %QB_& 4:E@Fz/Ǯx @n!(*#ԒTBLؐfX胧`p'E;9I5ؽh۩ G ?i/}|'u)P' ZZjkT][g֑8KB:Ǿ%ڙ 캧[l\΍.H1A%Sl3yIGgg1Lh yvA{Nwџ}}i')ߠR )Gϳ"6 Edi;0;+ q+%1]axv0=ẗ́CAwܑ&ܣDS/]Ykh-DzvKQ`0iiH1S3~>xvGTpY箷 &9)Hyu<$8sG1lDPӋPLo9 Is $[&(wc68+`ϤPMF ;?F15͠>]!}f#xxxaw׎ "ye =-):͋5FګmKc^~7"sBc%\ֻHw}I 2g@ls{.rΈ+CeYsp4sA;Hc)zOBf0UoCd$J/@p,A1xMR!TV?8KG99sH ހiXu{ ʡnaD`zfF j /@\dĦhi\B-7we B<Q̯k,iy,s^=%ez7z$\p)BZ 1ႂ˜H)(黤kfU=^UHJG}DnbXF߹?Dc9~;B bm.7v٥QwR(SM(CQS<-gsP9_;o=^++1"Af^oo~EB|$P/!䠃 A _—!Ske|QXEv6$AQ+Kd@|TcJX' ,Kdjf 9I:D Zo§18p )- ?I/K{6Ǩ-O;N30!GUSC@2AwԸF TL$+'N`T)) Cv鎂ߛv m'" (b DD桜8{ tAPs<T I@@ϢSxTQ#.:pRkW@w^-$T#y AXcguaoɇͶ&9r3EeL?@xC;houKįCq&Л[hʑltWۇC}JwlmM4١RBy k;w惌kIKK+碎j+K Y$ >tzMn|66kPx$( "D/G>|o*Cxƶo<ѿCua(f>)6d@) '7j֮xxL|ٙY:O4)~of͝G?߽@i& gn HDYY{]1["J-6\[iFu{#I`/$ 9ɒ@2p "ɀ$6㑶׃>nޱ'W*>q1j1><:'hĤnjԹy "$P9S*3 A|za&f:܃Sh@$UMmӡد`.\(zB<6%SB *e2hp߅\XL$ѣ׳2~Ge H!;!5gG<[Q 4a?V(Ouwpɟk}i*jmOso?EGaonf zA-ȥvD9(>`0̦O*Dڊ/j !QXgAL &*YG68L 4mܻ`w^y;zMG9 ,s?l+XԬ]ݾldPW_Fu\Cx;= VryY?$%Uke&S\ctgā:]B5ib m9fdܜmPNr^K޹fNoaHC,Gw=-5@dHH> t5 txtsQ#J~l{ =Z6Y0uti9=yv| +]LԴ*/)et:+QUuNz 3oH@rm )g}WwȇMqV; C6r `%v n\xɎnׁ,RgB${\:& .ARp^|r#SY̾ K3*zQt#g5t_b7$.܈my4͟d1L`ɝۈsTZLLপa=;o۪Fn|B .miP>DtQ/%2O 4r;ìyHYlAgN[-j̬#_>%dd I W=f=.hL6}/z!fyD->塏 7IKIuФOxN`7"Imuj{ tQ@q:C4GT 5"É].hNFWX LnCLϡ2_Xs}/­$n}].@7P5 ,39d}dDj$!}: EdT˛E0R̢&I!)/ x.=I%gM<5ŚсWTw6a: C.#тFMNV1/ }*K޸N`uGY<̠ >3͎|6ѐIcD,tO\R)"dWad͢t?K8ePCEH [׭!Z!q.CjjIF#9)aK/}P_{7B|6o6Po҆sJ xku:OoF)zFv f%8_%)<ou ;f=+NN'Ĺ-ЎbyK8_LD#ۂ}Eda>NYG+ft-IrDY8ȳtJ0QAj߀ueS`Ѩ1WԼ4'$DB+OG)Pβ1=YbcuZ zѱ¥nIFax5W_0"HQ@G Ëgv$=>nM4=Yl|~e5~L k.Ε;u>v6Qdc׹I4w2Hs34XSMJqz(J'4AR|dy 䄤%Uxr8;kwXȌ僌xP]ڿ\WΘj9Q.ȨG(^~z]y Wh(n |q -pt%5(#J3)0T%Csz/٘ȣyKRw4wӶeǬkfc& %GhgDTgsx!Ua=f"Z7nD,"DQ93q- ]߸ƿ<0t&;nA~v}5=O(:ק/{ux:dLA7}و U7O&aP YNm!6<9plb?!?aw},c8.Vrƺ `8ͤ· dlnDAAy%AgV$\x(L #|a$IMJ2;/t1F$'.ܶ*_H;2:$aXN4 0$erN]j?F^^XBoe*6ݽ"Hap^^µ$x ػq rnA!QRb^o z+-o G (w"" i'-0&7_,mcP/ `61L{Y:/:i9?B’ ɌvC.o%+R"~rz4s x  cG 2δ)A,ϣL>F=Om-hyOi*hîgffSR-xbKl*7˦n(p&٭DWӒ67ϑuִhA< Ff Bd" b{vMrX!fI|P:qEϳ$@rcgD2#TGJ!mCJ43Y0*mmh+# Po55ph~fͬIlk S'Wn&Q3tQT x&k:_4!|/ ݈ d/uc2/b,0;o!87xko᥷߀"DWH $\<^[g`E 1$UCk9V#g۬eaCא,"|̰\!g88̨|]8^HJ:8MԇnF2m]AENI+`g i$vEB&',F_o0T Gpb}"@)|)Zj}eCPN2U7ONZp) 7wlp i=CXT/mu AA%æpz Y _YFԳf~\wB3~1!\h'=EHf v5[蓶Yw`0E<5>a34>H!4BX~/8$[OHGH#sz7CZ:&״;\J&gO!KtJ&m̴ ?ߓ}Sb| \C뒝)\clZ}e?lo~ެ_*]\/t LGF:BNO>'٩QocQM^KZđ. VA35v )Ũ _ݠKsr}АYssq!#LQ'OfgmXλa;Wkuf:ƍ<ʇ0rQ휼 &}?#Tc.Ͼ!(ϻglrk,CrH\ryEX1CtH*A4T!)wo}k9HQJaML\@;90T#z4槡^:P6?,F<ιkDfVյtWo$BR4 ,04|eilczr [L`H`= Jk$q(v7&nvuגeefDsnDFFnUYK7'Uq.˷,'C4~,w_9p{Y,Dp20~w\G񣷱Evkċ]&FJgK+&h] 9(1)0 9 7(W4iѲ]T,Y)fVcg++  ZCA$lnjn+9~ki$qɏ+v tk?xSUAqs+^~y̌}(F4tLJ7=`9P(o{qgчq=b6|8LqFBdZAS6'<vdҨ" DnZGĮhA R8s3zYֻ:79lwbaUEUaee,-L|U6{Es IDATl\֭igqӵA>⃄Tp[[x[h_C;+]\8ip̪uOxAwg&# ƻwĸ*k olb~yCgOSٙ* dI9@UA[(Ϝݕ+[wOHu`Λ#}gmDsU `kj &?9N5r~ǯa Q qPk:8 p19d,% \0Y a5kCq,Ǒw51ˉ koLĖ?h7cőڮCBN-ȉ#* ^u&R3K'! f_'q[:] jjuORmHAF4 8G`d$v6_!6B?*I0q hny }ϞFwQe*k(SEmRV*3;")Mz'G=\AGX[?@A ҼLCSEJJooT챕c{L3JZ 8uZKBhn;-}%lM ZY\~7{Yfc)X=z\ގRYIS$nUO?I1\ñq6iO|0zHyy6GK'ҦVV~cd]9ގ VE_bs:ZNDRWX/c m݅5jE4q4U:]|Ht8uVDx(}ۊ9ٹ{5XF̳6j䊀Yʠt^RPwFst EIXLI0J $-m,; G{a<Dlbࡨ68-*$yN9k½wLHʟAu5 =,kvnGtp:BaLROlu6̡Mh_/<w$<>W@2 Iɖm1is F;B;uuB]7~@TS1L ec1$]c/%na H1>ŮM4]F&@>VG|j{)iX`a5> ?B h%kо&nSĨ~1(~Z#d?F\T'20ajpt8$Z<~S0:Ay}7Q@9!G3\}mtHVp[( f8Db[mt,y o&)f,l/O nh܊ ߅'>e&2D>8Q>ѬOo~ Wַ0X9P1.wJS_Je$ QנpB8v 67:`.ɫCvF1aGy"rQ-{e :2G?SaNRv"v&nL8:IwGLM'I@e^ElptSI^B'jr'4y88 jgt롶c< ^_͋cJZL%V]3ݼeap6R+>f꛲KJb}C7֥m~5 l!_I]d7bxFW^yɦh k"]jZY / N`]h /_]Es&VT1-Q>D7=΃TiĊ9~θX-~#luRȞA+?z8;"Jnm߄h_Fkh7__Q:OjmrƧψ Q]ܺ8ML}b -N ֎YldF$%񞰨 :~s.! =A2H(gh|\]oS-p2I0i'H7^2]mԧK0@>1N,|#h۟:mSU"9f:!)탛m(b'qD(h,An:Bd3vb}3Dݒ I=fTAaXEmQ'UmJ%h;] dmEr ?X&aPZ@7j%qg?M}6>Lq AJ.DWC5q$i+I g3HRrܜ2:ߥ `ã7p;9`e Z&eTni 0OKD~Lc^Å -V,) FFݘ@jk1NPS T95p5"`!NlCl$Ea+£h¢^ gJT4#-ti~Ú"F)ڧ#oЍ +/>ilLnb㲸rA'D {6]7 .HϬb򣻰/4p?Òij~n0؝LNwE9Rt`ɟ7j1u@*\DyυlsM; ư(~k w^AqiY"@Oc4(ǷOpDs=IrtS*~&ɔ|jug/uԌн>fhɢjkuzXz I\҉sؖχuYu\ɦϪ9y^8 Ө5t ȋAYpS6w0&"8-9T4PP1 ɘ5ph6e"c>(QUFgұ֡vS)$0=׮1nՎu %<~z%gBeI<|u><|4gN"{iܽOts{qjMas^y옜>Ȥҕ m| v_&7-kÿCdSbA0s5M'jFHSO]%5®qb] v ,#CEdBQY ޴X:u ͨlQp$FX;RvCHА~)qk-IV15z MR #brRὓI찼1ac5Q [ s.b'!׫TUlXJ@TMĘ NhRC133]]Qk&/uU}IP [rb} bS7L?}DlsuU1kO+܄i)!\TMRijcP/_]&8mi/QIdK,_cuQe%%gN&6[o`:|2!FpM55o_Vfxwm$X n~❐=I1bV2F^A35,"]o/,S+RM𞥚㕍-|ur&[):*Qު^[ߏ؜r/-r[y{֤w2^V2/|8S Pt{] Ԓ<+TOnn tbxͽ<"']Fש<6Q:MU;~n~rMCNfΓuбVjo3A–RLTǕHՃZXEmX5 nkGwߑc$Ѫj}%&h R8f}叩ABC;mihvƫ/EvزW9r+m ~߷ @G1:ܕ -XpV]HqU ޲" dJTHja@xwؼSOaܽl5-:;&`kp7uX M2vx}2I,H66yhywvqν *=yN RK ~H% _C]TFNoowu)/hΜEB ^ NmO-LzasEʮ%iQ;҆ѓl7R.v&Rh\ts&? "N\CRCƻKMF3fl&>tG5+fe 1t"j1>ȱ`(=O;l|WKzlx#n\6I?^0ms],+hK<8V Пz\N eyI(L]0gC qd҈?1t"iDͭ|4.sIr)%G*N_a+*[ZQ,ou7B-&?ǟ9x,:Pg`\ӬO=JvF?.XmRUAv5;uQa9LwK'ϫ*>64: ^}[ƒo/>H(]^ÄVkl?>谄e IG}Ep?1F9K1R)VT's7֤GhGp1~ӧ ?\o2,q>1q7x&=i+:ޛLӶD84'JTybx 7 ۇp-t w"cO`vG.;z,:ÜVi+5Z.Td94)LZr7ಹx uq[?IUbPr]Wύ8v9WFoNCV_ U?~;}_*5\źLG#SN*Mv)K" @V7.[0- f6 hgTv QGg JusO:p{c uֆ3fkl3LmwVx_%W|$wnl`K#9߉il;[2#Wh"cn"`%l֟~K12Ga'zאPobK{y|$RaP Tefl{H@[#tmk23T$3|65c$eP>es, q~jm˹? {FCwLNDQ+P;§`AA5:F".^ALH])3:2 z v~C^/]7vT(h RQ5}I!@3_\ЭJ)->m 6A6m ?=,Rm@a yAذE,.MVc[뿂tJ6,3slݕ+Q.#b5 òDb8Ж4F -*݊9,1qe( };8qTt&;[BS/>wmam |*Ŗ03gQWE޻.>S]dI[.Bxw5"/.ƝUQeҟ7w7*~a W ^z,Qii>d ͲGLe[cS7a<޹/=s_/r،bXΝ*IETʍGyvբ(`b$3hմ0 `~uOgύ1,YAt&EGިTckHQZݑ'}ڜ0Hk@2 QRe=pEW@ŏ6ٝG΄TI串Y{ZߨS=zȃ 'LE`OEk@&߅I*}` '*F_gvLZE)n=NYk"˅-/8y4Vp@@`%qz5L9")]׶KYqP]~KXu b-k/g1!LCxnR ʞ/*쌟I삉lnodWx!ھ 1ZlvY*`:)pfvŽX9//<[X4j6Mz6kEґ( D:7?\0 U.1艞Qe&J4LQ(XH[ٴ},m׳-ۺoDdxwT}Gi\\iמ\B(&%^[ҚUŸF[&MdU1.,"3n3SU ȹS%^sP\xg]XDB Vỏ؃0" iw|8*˿7G'9Դx>&9`4Bݗq)muH ]0[}]}#/,S,&)KH!NnvŨ1uy۠khw 9N#wXDVvH41ϩQEc}NϑrꊫN=*Ӹ9-5p5wl&lt/{t22)2Ĕ7Mx䘂Ʒ"z 0s$iIu"3Ϊ8rq<%HuNf*=1{}^2h;CgK 1 Dw*%!s/^…=hl](nb)H(;Z.aC;ț Ly/檚V./3.L*>"4mlRƛ&2>]+@8ߡM01MDFʙz. Шamz{9[؍R|{YJowZ6TUӋ`t'RU3laï$812u{Dyv& ,C[qmJ}fkP-bG<"`nD6H .} tj0[b?1 *e{@w{>Y'\YLr* l<#g$>ozNnq7&mFê $bcר% fYVl)Ns/|1{.e6aF8NZNUMѻ=׾h_y[=mZYW~{]$q̧?>quxڍ;/-58$xgpze71h3.num =/"]|qNsQlh0g(Ņv"Lgi)YnHR=M2MBUBFzL"{r)cL(:ּ["M׫3q8tJ:1R e[Dڠoύf;rAetFGtctL$FMz V=m*Y"&~P>Dj^hT!]}O}K/gΆ`]o`e;6ȧ]ͅN:p\1Ge.HDPM|]9|02ǛmLQӳѫdZl%Ѹp LG;UTw dnO٣y#.@UdzASw~=b-X%<~> OG"BQTҥ:SxͷX3*( ]?S*ј߄!<*FxBq03T3yk;΅Wl;ІQ0.Maz'v:xM{:є%u=5i=sfV}q Y )/wL Vgk" '@-G!s T"Y8ޥ1yI# @tֆZR1I&9*hK t興@W xa;IdO1'?q 㧄JE& ~*s>L[*%+:Nf9j[B7?2cGco[_j;zEǻ\Ψ}&ҹR;H/Ͻc`mmffcwccM$k5yҷN_ 7S ҽtxW]6-eXo WR C|#ɳg`}Wl㧲~ ]S۰yG|ıxr'Mz+7e.D!nLLsVxX6*"uPb]X)l8`N_+/;ٌ3սl AMRpQ̤:p3٘@#j(A'U c:ngY OӴ@ d7"0r<ݑ`J,)}hiyP0H¶<FL n ,7ѮFZFuuE1%gM8jҠvY%xGj{xk_x"*"ՑaVS~LJ&9WuU-X&+EZ%68MdBt:z[`mT8{#(F9b0/gVUY~a\k1or䭨Q7;QgnXlg, =K &1NC6dԯ Lz ^=LqO֎s R }|5ou~Npi~]>lWR7;Ͳ 6wBGۙ  ?| V 5OSTD`'`qB!T妞gII3azc#I zXy"M{!(0sWt!bOǯgyEAu Zj?fSPCCIrd6 IJ7 zФpa.?t n@U5qTʌer}=S#s}>Z\zE@ Y>:p?h]Y=įJm2Y7NV\Ԧw31SCߡEFI';HYI ŁwpIw{i"x)Ka}[1Q\O|`" et 3e<>ֻǴ]hS^(qv?AF)htHO]<|P3a` zXܚy)Xnជ>U?}gH,})Ư0ΉV=psM^5}Y7,+,5%21Z[ᕡK^ц7N ]4|AE4 FY&`Jj`345V7*LL1?= 'E$? a[{L9D:Z5FLEW{*ƚ8ҩ)f^)5\xw/ ϳ̲lP#WEJAWxv^E/;VLi΁Bj$4HrMPGL#.$Ds;vA'*Q@P iLgX]>ZR~'X@V=< Χ:ȬeVB]o1gjn)ö~^(WUoJ;}rQK}om 2ߙ gŔҖ~5NZ%r ^&c̓+~V7sd0x b̪5DjI>P4up4b-Q4td@'ɻ2u|N|Wq-$>_52^!Hx&(85t<&9U#E[,m + $maI<83\h62~!_{[1>Pk_׍_DSfƅd2HƄֽ ~[YYH%E_~iW/#X .R"xMd+$ƙ4fm]|MM"Sg}_{.XI*ifK̊"* ¯'8Hm JԷ[)ݫ{;wN-1  | ,)޺A[i7%!5_*P&;эO0%mHz.~h]H=Eg+]nZs7վNL~Jef~^ww*9whU49ff)" ̋(h}H%mMvV{=ɔr-߾#?y ZX[ԁ0ljϾdmEA-Y+w ˍ;/fgE@5j3i%IANXWCUעV YN+Ha`ѷbHKO*ThQIv}*M_#'qOB) "hLwؼskǩӧp^!ߏ_kU w"̹ e.8]_2W9Rt/%*azE3m$sbk4!+-3J╲s$[DFyL?R? kS.~U1mqd fæ L"K=|2&De֖=%wrv 鹫Q&S|At|‹.x`CA7B: ?<-&T.q>Y$oբ4T#GeԢb+i(TLRwA-g]NP;` @He~V時 @j6GmWĩbTrDLy~S/< Ùio٧Ka]c6g¸-Jr'5usPkcRz "J2IΘ>\YtSxD1px2a!bM.YP1T?&%&$<$)jGDUK(/xXZA4YN?dYi>3B=!d0b:tӦUth4昆rZGm}exou|9]߅ij)9LMζI,l7|Tp q&+`KW|`uX׾%[ ?;?Xa8h2_OHaVF+L j+amPmy_myX:9IdC ĞBA D̑2 ֚В R[^`TLL9 d .>wh̓=~/iQ-XSɜ>ӟxKxs129!Ju)^k#4) 8*qcI&bRr-R3uq˳LFN=JNE^UHo{I:eSa;ˑS2(ev@4.LRjإ$ g oQGUH8"G1؝2y릇>kC~݋mѕ I>Od;! MPbXU.q㱠JcQ"T#!Fm'ctX*jUf `-5Oىvu?T_=/I*{s1 s2F?(͚2D6|^1'lqϙ5G(B$I.ÿc@C'/X)Mr.UGM%32 9 u-]T)LFqKFx(uVL}T71QhXAZK #݇,ߣ3\<{7BآxU˽r G5IuE5ߧ}KpV DIg;HբݚHǎHw2yTpF`#:!Iz2N~4m'(qbu%rj<^|1Z|vޛ:Xxy춯,0,u= 'jFW2vZ(|…=d%D:\K7؛$Kr)mgH"U(E%.NY݁(EP a|-HUhYLh24z ^ @&eLQhfY~3U cӓf~BM~{)ZpXd7egzpyex\?W_]?-lp[#eut8'*Crsjz噎*5rvge/ảd-;"I&\zQ L{C*Z]0\Qԣ 3Atjp܊.H jͬg95s#%Om"G4b׍ɮ .{z색d$,Ĩ&s1!QvS8ŵgw|XX9ye Q *}ٚ7A yq-*S,W(,. <=,d4WA4#`Ґ6,F̀{8]^/WL;&aW\Z^^{f~ `@3(+<4!#/њ%ǩ׸o>ѷ^.^.w> ={ %EU/ɀaMS/ R]>$n+Έ׵p2*, %Ai=N5R& VN ٠qϚwxV+&dDDaD/$6 _bQE!k]BvE}+Ƙ6> @0]TS 25G6pݤ$9SZcЁh,Jl;XMZ(xAVńrb(Lp5A˹e _Q~c 6;`~֫Y(5s-\ɢ:5Vi˜urMَ]~%N|)a] ҷLXo6{JwtTraLU)Guw.6nHҞڠtH3imM4= 5Bt2 P YuC! I$zFYUoJjSUҺ\(|j434B/V䔋,tFq7ؘŊ.i#Jf #oM6̝k#@Sc<}p`J"*VsʁԋBZ)U\6C%] ,yƐ*]xE$n2".~3CC$ę%8mS ͏C-ױ #A|Wpc|} K,ETed"R` GB† B `dM`&>;@RŇ&&~7&I3BIΉ673C7|Q!n?r Hfҡ&1U\+D"YrZJjI,*9YQzTpX8C # CBE6ǒb;(PAJ+_[02&Jx&& _I0brjJUVSLi&K>5m'u>a"*@!cʼn򃕙%,/?f~I4Q`rQ#jkj<=CH#t ri(X3IV;MF8aDWl|/&]װb#k4Aqr:v7ڄGHHf!ZI$9 r*8B,+ldy FNPƃ;}"Wӱ?*'bgn3寓k{8ć*&/ݏfiE?e|֗U`-+YU Oo9oنdCTC5@m2HdnƶtÊ7zlోlWǺo"x@EZic7K8ͷ1zs0 3z .,X'8&&ތB;0%+D`Ǣ ӿ PUwϚ-8{9*x+2aD)L. bz=rl(J#']ǯZH7 f,3)$O6?bKm[1Px./P.\y)w ~b7 el:RݑFfv2#aC %A 3'D M'hT23py9\yI;8N]DϨ >GLyڗ(>p^`f58>pqo;5޶r(S^L"M#HτYP^FaMsMܨn F :-őLHk(Llș-H b6"WqRb-֫il>\%Kp䒥=8吖 eq+dbm㜰DXI1UEIR Y"]5:j0+QF"^lKg/'RAhp%3=Ltirfx!YB75eԪHZEP PeY+$K.A(Xg .<4VOڹUSCYH <ט l&Xz)ͫݹIQLbuM?;O:;43:Ƿ-I'#9eC11%`R@CCqLrrU1E/V Ku%rIMw7^3.O+ hvJaIy<mlwh:=wE+f4P&$ 4Os}FGj%(Bf) h19+ "|$*E`s <t#39.+zڕ"gp% '4ζ(w 5yS/35jz06ɧxdZs@X![0".)L%**%g3`*c1o47mM1bq xgp|$+7<ճǗjOȉO.%2Iк6uCALxV2%.$Jnm$d XFpHu4kU0KrIk0rR/'Z־a)Čv+YDXr7iCƇBh8w.AG_䃥g\hVZk]{{$5+/.:ce 7EE ؐ}NzWu*LE+HN0 әmm ! O<Ä*2WpϊwB!J(Ȯ K>{sƝNrN@bX0>bz.d(cbi]˙EڵϜX*i'Zw͛w'WͭQevY dkxK1A3GVn4 Ȥpg5P 9:pIXX01LؤQtT(evL ɑReUJ@IyI~ LA|>sJD'RH;n㊀d>T#a\:== 〇 >f@Ei%C7+`6H Oy}'TV}fV&Z΢ JZBC^ c+;Om*G H@ƨ(c'ͼN%31sJХ {<t|-#]v(Da)mRiT/K{ H\+Jgʭ6Ѫ&a:`+ 5 qs>r~F)|'ĉU| [)F.oeJq<󸴜h7nx Vع_7 3[o Ŕ!ČmqNEPn!az)k@'Nңsόj ZVA"Ɍa ٹ\zL \9J IV q!cDPe;3R(+>lT\txɸxe7Z)>h`zd1.B*:7~nw#7V[e ڤnTkt:M&gD>XXhf% tm$ǞyiV?<7vd +, Fn82+H]SXIXqރ O_/#vΨҎ"Nc `+@j>u`{?iI$r\ 'lO~V$.(_T{7>['{rc02*1eHҀq"-BW΋p#ؚ'h)rs-vUBIj3vЉnXY<=6p|WtcG,ů}~8Jc,ܢ@(d ?T uTj)O"Wpc$1*!K1kw;{' ʅRi@K'5C&[\" l *[Ѷ:2l﹟ST"^硢aq߀o@O¹qli.OHEi.pLvBg9ѩ3o|?0jTao[q=,IpRkU]$P⸉/ɛ ^x*K~.idd׈$C\ &O?;ѝp^{%&t|8j,f볮׆WƄ^ ]6Z3#ރ]D&9r:p$HOJvk6~1f|2 |ңX;# ^Lj4)\-|m"EUh'ik E^iSҮv忳i"DYVEw'9"FA/|0]*qInuQޕ&w("ʓl PU ~);/]ӧUGBp4xY2ߓʃ5jo_|ʞ4xiAˇ' g#Zc㐖Hnw}ܟBt mQ֒[]沸*{^/9mAL#?E'Oez )\d% H3xJ'ljcZφnH~ꌙJD:D}ƬS(zAr]坿s{fdI<,ɒla Y\Y6w~i3\cΐOwJ$`*l'Ss_:&Pu[$Uj{I ')['446Qj}B7eU n8O)p ązbƽLR\lg X V>D.^qI0.!)B7 (zHDgJ *O̸ %Kv s=YeU\2nƎEUGv˞#c7Ld MIWdː먚ԧ摰P~wFBASl-gS 5Sc+amJ&*n`?%Lā}kH` u2dzIp] }x}f 5 :nv:Vaf65~\{'; {.p4ImVD J`U#<=w A5MӎY\Fy\+)+8/>)&RuErΎ*2Ϛd}42QF'idZX 6I#nI1xD $_4_1NXzVDŵɅkqv([abŢ@6ƕ'XM‰4nweI*ZȀ'l>i?5-(yOMƸr$`S?o|Z1lJl+xC6nYꯑJdäDBd>N F\ѧ<9yJƤ"tMcU49Bήp*nl~TNgMmoCmzCq<(LDqe80#/yD.B!,Y| rD&JU\ Nh,ɧ@93'1 R(ΝO2~!rJ\ 6FC郃ZU-sm8&Ѫv Kx,%Dyy?&؎S'=vjb~Gj+Ŭ0L1d'& nV:74b).Z/+lk8MЖɚњ'('A4XQzO{L2r *0tωPωy #Oj]ɹKO#^ȥbjՋΟwnIjgxP:_ú:x\NV6G(U}D)%Yz~5+A_lZ3u$vO+$}c'@Db%N~{v#c *ϓx]כR)=Wn3?wH^+E]6ܕray6Q: 'u멄S>;q\a%٤jյ~lf+nѰ.s_-m խZ.Tn*># n} I.4dI8gU*VTt:%Vhho!!퟿f~6M7_{ۻkN]:FTgl& Y8<DZsY PO5ܧ&Og5@P8։ܺs>{cmIYN< 7 D;)+c'ZT8Q,NҴf>}кWϹLsոf;nEwW2b1Lg>?r4xTT sX$h*-J yG. nd<>4\>+r d@vkKoaz,Md]YqbmJΗnÆ4ƚV&@k%%iQ h ,0|$ eq "(ɉ/!T+N|g.d';K&wFWnQ]`iWٶ|C9ҠZ}~V4ΞBD$&Y ի)=kIְҬ&w}_}O<2b̸s0=T >\3dKQZrtZsƔ#+TJWt-'D۷oXSΒ+~׺ކN\1a-ID2LsV{Ԃi4ȍ30Jbgv_UzD7cݵNWUesB92_^A6qK$ URZ,S  EicxB_>E3j`4ipNDVNmCKܹ` 16қSD d):opK/IG^xG6B`uZ$7TVݷ5hx7Ld'R;mT^8LAQUw {+F֒KR~7X IaB#Y2%q oqo~ؖ5K o_of> 6"㾿fq (چ#"#f qFVUrh#6NGK*s7Rݤ06 *pGBLvbrv;w׃7[ZvBX&4,&;9l#BrI,fC1Uα?YVpsLfHWr }vnڽ A/\]EHq,wz_-ػLW(a-h[6Pbb Ĭ@tt-?ac%q|dX^e Lo!T*wtS}4 R\6On);і^Oʪ ȚŸzo=3ŋөi8i zlؕ6_}40f{ +x3Sy"r Z>~@b+a6D`,HjVȭ-<#<$ɑs!Atx2T2pnI2CXŘUQsYgi8ΉK4v63%4*Hx\='7JZK8zH[]G>>zU0Ϟh4q_+FwӤ"C? iqc )dC|*Uh{<%\6hG܆-O$@ \ڕy]&VHJV't;eN]FxDT^;L' oİ=ȤVM@F={EHЈm7\wALxq kxB3,h? .*)R_"2%=cDTUS3_+1{k %{~æT>ϙ7[FU[oYN*x RpN2,rNt|/CѨ1Hk y'-N()Yږd ,BA&'QZ\k3 ên;Yt׏/qz_aV?<2>f!1?&~x6 ^bYZZ )0dv@  Rr>;nEV'in USވ2^Q[td'}tRr#@L09D" eMTѿ,G=JOjq:9+LFA5AZ^H).݁"c}u 4EN:ts+ʭJ^0Oy`v;XPIk߯U)l&&8r] Xc֜w3IJN|D8?|.ݩrVwt#&Ñ7܈wq+'*piA [@[ ܤB 1Iʋbq;.yWY=8= k~Ұ=vکy~6%5kPco#.xO$0™>`!76RQ> D@p3N k[g~Z-'ʊ҉02 k oy/bdKZ3 IjQr  >CHuԗyUѮa9+Q@_~cVm=RƕĻ=q֎`_BqXɌeyl~7=gK y[_~ު&y [@=si7^om {G;rKr"uފ+;n9w4r8,E>n* l!렉XVυ-\ȤS5+P7Ύ& ww}W>9 `aI  :`ԉ3. 8^\OpAP[ Af ; iЋT#%W9G%N52 ±r&#ܭMs#_{Qh`sc  !s@hBk}3->BNpÓIed](B# (-S}~ycQD&Qh l=wȄI^`ҭ\^r,HA׿xO,0@*o~/-6'ڿ+"b-3[w3y 6 NH!Z!BV(JY_#ׁ"ь#QXXҗ;GI`t7cOyPhd_% \DuDٯ ÐwN d̼S`Ϊidy7Gy&mA`T4nvn2cN\@n?> {J\" `ܩ @G>,ΦT=W9"+?QPв@ЗVП lB3Htw5 @HϛM!oBp,O@"IUKY>{&"NdE@ŒrM0Rr>L#G| "g_{v!؃~^L4 ,s~+^s`J6 lКX`1FῘ!-:-ms1~ |G5N*|:V|/ꩀzC Z oMܩOr`(UHAҤi 2I֧ -j# #y>SD ڝs Yw XؔRSwMP\}>w@P0xߓo< p1{`/0(uzI/oN6 0I 2M 8ˑ>LO"V."?i )!PioaU3d£Æϛ}aO hNB=`*S'(3bmٹWoXϰKɷb<ؗ@ݧX\h O{\jqSvl3se} e H5;FO'.zh_o)>m  |]oáװ W,Z ܩ/vTgc!b3o8(Kְ<0q;=ra@rT(p~T.Qr/dYUڑ54urw3Sc]k$4ރ$_c6",CsZ#cljIѨ_ ]h :ji;g駭"J"$"gY⡂O']b~̢C׳ek  @KI.m$}?gRaX!#\GAg(l''5;P'4)monvё-1SE!Yʹ o=|$G?%~n˿Wo߉\k|u[!"D0 /CHFGm ?M"y=Hw!fzQ} :,/z)ۙcZc< gV] ,9+%ZqGvt({o:v({B 5,8(B08 ~|_?1>WM(VAYvY[0e߼3S*1l!=+mIDATc֙KZmkqTӓ`Mʣ#> 8 H1o>F0=v(ʠwL̋6Ƒ-')i_j=(T5t3]| k;nƯmMG.&ܿ]h>8c<{:4BTkԉm }hJyZ<}\yhz:;&s8ETnc21IM.LxoC{ G?1@H5w>6Q/դY]B?4@:,3 {'V)@rף2GbveU5*·x^?1A`lBi"9~d p37@CSExnAFA&$U<| WecI' m1;Q Y~70?{_\>6 8 w_A~a(0#8=v#k1)߆;|+r#bFJU?e(90j@c@nyX%}Gi4F>5Yǀǃ@<`+`ԉs=vP 9< Ӊ#l kKd$bo؋<b_-J5`&& ( -=^uA 7G]Cl1jj~Ml Es\=Wl+t Qv^mInH~[!آp_óǎC DnyD"^8o+J!)ځ4(t oa߽k#8M* _YD.Rk4]!DTsR0)FqIkzKp?-P8eadpkv ^Y }vj0N0`ADP0oIv@0ܹ "c? EG[0-0> c\5%y7tO);N1 u(vgԐ&''M6B0ǎ?`L@%My'K0V8-  x᪌6y&ib! ;1s8P(Qϵ>h.こn/D@;BnM т^vcyUߺ~gP+?.s@7 `Y'T6#\JvlY|iyM0b[r!r;VDHV[H{C"Pt3ۈwDaタypӞ($F` D`aw^R:u%༶`Y ЈG! D#\ :70'RV7?<>`_B`alC!.8={u,qt 8-l]նG!8 ¡b-El N=!$kFYg`!kvXb <#^t)Ll,h&B04T5 d{`,?,z>XXX / !: C_/WFZ02]mCRx\+^(ƥ]${!XW@nq,yl xKj @{dʟ d\Fxbcr @tjH댇n?!t)+;]0h@ɷQΟΏ7dR G1wB[~F"$ 1? z#wro=a#\D,,\Gе`* Ql*PX^ΗC7 ƨriʷDmm*<h3F@` \tS3Ke7a02 @KUh Xx[Q^ wk }Wk$ cc0r-,LŐ `B0R uU[']b;HHap}lŻѰD]XV{`@HFRFɆ>nE `$L=vKN8pIoro]>?=-/+i0o^l _@*D_u18{f/PD#$#a Q40{o߁W߰4اa充x$Zا).,\D~cK;NI-]7EHFJ-v+lmbP8. o&h_7MKh?Ȑcȓ_  V;sN<8# B0p l~$ VV*3`v;c);> cFO4/]B~BqjvP0~BH:@xt5hwJҿ > lٸE}жrug - Fh jUh05=1e6R8w\vU]䓻/`!$[6q<$nfD(YaWюZDxgO1{*Yshzz$ 㮭埮OEH4[p#cĈ~[j5c):n~ !U E/  0x~%@`.qՋq DK$E 7t<0 X 'vu\ x`owpPBD_TZB|lQ6&!hTFGƷ l4PR=8x^H@.cl~r{xlxPxo~@I\3,Ggk3.%TХBpK|BB{m2q-d>`cè=>Mn +km}i!噅O ,G(|sЪtip02Şٝ=μ1 < A0R9T̶aλD ? Ot Ъ\*V nշ@jh7sh6rQsfE# תX=zO#$C@RpzJb@U?sY#f)j;Uh}ߋ,gk:NywCز><;,1;*`a~ZE}sιw%X!#BX.1MvV1y[KDq@: Ǝ Q}:O5?~Kyr:B'wJ>lĠ`?wj ̉@[TWS OHd Ot I{9W ^/IzF?~qr,IENDB`ukui-control-center/data/faces/9.png0000644000175000017500000004677013635333016016300 0ustar fengfengPNG  IHDRx pHYs%%IR$ IDATx |y} @Lص D"ye N$r M, -mI&i@BcekL›"hX [$xŋ~?hFwt;9g~Hsޙ<~GQҡ3^)5ϙR!.TڕRosHT++@_$@LZ:zxf }׻O |A ,2@{a ` h)s`(I@]@+-OW"bTsݧ}a3X P@HiH6WbAHAU @$Z:͌=&&rEfcxa"@ x_uS 1F? [mp} F"DA @ƾyLbA B%#Z#@YHP;ƿA&zP 0͂(}+H":#@/łB%ы ~y2s$2wX FPnvq7Q0'$QKSo''v n1rr`X !Hr?20, XÙG@afΘݨXCջ~Tj;, e2s 0YD>$@h ܧ~3'@ R 0 x 0O4@5`$F)`(0d{ћ,'l*pW js"h*hP3t"8wIT4F 9M4j! t&&{X{Ofhyꟕ:K)h_S?ɐ f ! Xn;K7:~$1sxN)U )^ ŏ!S0 (*0 @WRE@ܹo K#DgQ"^,Tf{D~P6#@"7/o@B6T[4*! PXN~^ ; @(锳c*@ -Zk*`Ԓt!jQ"7˽ $U @lHDP!?Ď$ ]Om0^m¬X2/hDP"?t{vJ爺Yv嬣|?2T߷7+2tڷwOߝ^n֟S9_Gj?zSPGa5jժ͗{|z9n$5eRԞr/!Hy7a7aD$D$Eyr'w;rJ @!RIdԔS9* @HHJ0P#R?$OTwWVDo IhR3W*$=*t)͏ @LC${)yP#F9HrT ȃJ8o^h n/wބ]" ȃ ?%e^xF=%}?2hZu0\r@CG#X&'$@å2TRdpKv'7J%Dee9R 8a=H\-Nf~o{ЦE L7l ("%~yҗ'8;Ts8սeSX这FfHEkg$> P$Nwp3iGK$!K2u '$: #cO?rj{akM ~V]z @$> Hl.+o|xey A>qɵ @t)ꓺdp"L{toCuiٷ7A%v߀&FU "FG.$5t8s@hp( H锳Lb$*`_Q J$n " ]ikjY,(̤ HDҡ܎YN?}Ŭ蜏Mrfuٵ7@2t3:m't'ls2:_|g"X/3kp a[L𷛌iu?B/Ç\lْϘ|3Ḭ~ +-jRjH_~8eȵ Ekwtʉ#V6hPJ48Zx3O 082,pޥξ0mKB_S0uLh/اƍ)ֱ4Paֲn`*Jc~ߣzT5ˍ1ְv?\'n#XN>+ZQpYL9C4`K?|,iXAbb7ϖ+AVّSt~#xYϴ|an1C-jRg t?=l.t~7I̞`t|;xO~دԔ}#L`p26*I?3'<}qcMu48THDKX7&t~!z>}kpcpBo1l۾3'"fXLX]`I/!k#䚐kCȩFU\oܠ>:HVc&g:I߹O՞zFO:ؘ @j0׮%k悳9FzbZ%Ф!)jp(gMu~A/r֤#?GCA槷iSNv~A?L47fiOҿu?ݒӠǩ&w~'HdP fJf!s{1Ijإ5w JD7C?}# 0\7iK qǎC_$F:it812fԈ{k@o$ƙ2-iBtL7}s$ך\s0<7iG 5U'4岆snccԸ1M;%ɫ48"?)1,dt\@ p6!Д >Ʋ&62vM~MG7O)52 `' `ASԺ1N6I3?JOqF:끂]~sz0@R>RZlS? Uʊ h&&ڄjtE@~>3$?(N8Sy'-?|r-YqW)77Eljh\rMCk#`i仠K3䚖kڊ G4%sܤkG3=f}E i.DL|;j~A4`e@;ȵP֮z+kEgj~4`e@{5@E##l䇡,RY&ZQ_够RC/q&%4tJFqlQVxeAŔ@pk-XIؿH.7μ2D| ZCTQUXWCRQֺ)kYڊ$fs |2-07'>~uUDQ`_C‚?'j)F7U=@R3U$낳U}xB `WB_0 QFCO=rk[&UȽ)uj -p8Gewq,9U=@-pci(¬4߿~he D%?vޠ0g@#/gr}/*pɽAЎY @Kj_?OЫ=BK5nL \X4#S}X.K_O).r`ZB'A_TiiR`Z cy0*kGgǩ۾_ ! g@;@zsyM: =CK/toô@PV16 NETL.q7CC}wh)X?oic_1rL4څ*d͐eGhGM%1!`oտ΄cDh!f*4i홇~ "OӦKcԹJq/R 17Fd=oV?"N 1?1ڙTS`FA1s&'Sq,&`_#4Oe\ֽͨ6yM0T+J(7/$OSJ%~qNmVhk/n/Za.׼F*M(k7/r1a>Z5\sMk/<`,iw͟_.y4K9r6j\J*8榿bh 4sNٱF^{SSMkOb{n Κ90= hN\3&96W-9h&A)+FP%q v}9a`pNY1vF7ΥܝpNm9[S_#/oF/N!wW&4XM`(!{!駡drH 6hPcR ֜ HWJI9iEZ` \]v$4h_9sȽUSR.5Vz$b6Qr?8$f`*7tEI'iUKMװ! Лܓ$z9:lC%,'M! cmal#̊:ޤX{z EYÞ=9쩠Mک)PӿfƖ 9l%MZ*8 dz=rϖ@ yO?Q)Ë%E :4଩I?ڐzʆܱ5I-V 'Lrrς=F#ć{v P̦~ bsdi^!ܣ7W~ "'ch[O+7W=QZ(`_#]25of?{F_@)z#塚 {rt*6\&e&zcWi @C΍X`#'Sm? ^{.=ǽJK9cz#GdhI=K09 p2_\A9cSSԘѣ4}۶}jxDޛ\wRw?=DO_l 3)՞yXs#Ͱvd;ܐw95k`۪Tuu%CͨNOOw @(/{O;v}.IHx{xYΚ5Ԋw:yG"TyVHl'@2IM3?ܿj鳭~> FmHR fōj7R)('GG$=d6Ϸ_K 0KH'|$H Y{Ldyor97:;g6gL__,+T۫ڿ(hdo&@fJt']H[v>+wZ'd Z*$xpj?V? HM 0)QMOŐLjY/KrO>vX>ٕpRwd[`m`L 'e:7ϛf^Yt\_m:T),3ʭ9iDE&%O>G>ϲ|/XQo\Ղ yBOW|lsyz.eu8+$kaI$Yzoƴy Ք0y쿼9w42e)jjF/K=_6`XOe>Ao. IDATϜ@ ɾߞ{ȍsedmS.y”rei*3m\T2Cn,%{ծȏoI WdY'(yƓmZ_UOG Vx-: @KlMIё @PA?4W'1K!S:+ i:_xBꋙTe1Rͅܗ/g]}~ClIHvL:yC@`~ΙӻT=tDeej_ t->['!MdyLҟ"CUkEvkI) @NGŤMS5ՙ ]X~9}MW)gK/g-$hE0Wb6[Yl7L#IQ9C~Ӧr@( i"D5%TP2y6#|\Mֱ|$g/F+1q]]Ng싽?AfB,X` 9uvt~)_BՊw:~%1)[ y`/O"l0ʟgS$H'"? plF~: ,he4 A]jۿW/*IU%p"~A3Isټ۾7M9g"(O2<ʆ@I2QnOF3OOޡI[IC`9$1ez`NR sb>;Sկ|O AFƹ3I3\J~Rn>hsg+d"4c\QV AY%2[#WR >5ͷލx/TS&LVW7\ߍ8]T~m/o▫/ ]H̆@ ?KKzb&oZpkN}ߴnMI= rbY[sUoRmھx 2_wI_U*Łr-%pͻά*,Wf.~|F~n2Y ?'^ 3Iy}Xڐ*Ǣ 2DI|[KKcEethKU?W2MdܜI%-P2#$9>kFP{jU,' ./PFsdFTF22?ɝ?T]^XϪ# w!Q?Lnd IsoMə7S#nyJ*v>rAsSe&IKRz7A 'F}_f*n1Cƹ%GۓZTferV|׼T //)0&LR$VoRuZ,],E̅VhUȾAo}yv#ӧ~ƌ+%ckH0Ћ }#C9KĂ8K}Y)gxH.sau8!d]XJx١IˡQݤ"urm5NY@/GY(_g2&gTg ɕ?QkY ΀2P{b'xt'ɑ!/ h} @!Ĭᜏrrm2u?Rs~H{>AG-} ghYHEBtqqc֟>Lt 3C=#W]ܐgG(5=zAz-NJ'M$dd+/M$}-YkY} , d۫ڜ<2<ۼ;sA&WrvI'L9*c^9 0S$-~؎G7|_yu?X7QHPu.G,@$m?fM_Ed$9OORI"ė6Ϟِȅ}|g'ڜqfVpߋt O=|9XQoܞgI0 r#@N AƛUܗrs_4gYLMfUKI2 r ˵ Bt**GL)w^,g_DgzPG!tqN\U 44Rn\UIΒا!?(.I:9IEaHs5%m(`Ɵv 2|9!ENzhʤMu2t+! 4B'̹s0.IH9!83(}phVO$,~!1-Ĝ)W濛${2Ř5+.P F:/L?ygY'OKg:i,{0Oh@I>1eDJ($)DVSm$x6^yuW%K~]'{Y1 _G qdt<>֟#K 8<\m9xo$@^iKKB>Oe~IkZjg%Ը(_ S?qѽҴOrsk|~lT?{Jk!@ɤV܄f O2]J:V_s!]&$rֵgK'(gtW#GuoZ5kՌ|]-{}΍7y}]Xx7W ,~ ;U}[Ijm>qJ(IIjrG)Տe6S0`'NEo5G曾f~V՝49'O>sG?&(o7A3(;SY|GSd&!P-JaBN`]sei4sj嗄z,RN^Cj|WS8Wʼ?R ~@jr>oRITb?p2I3 e=/QtJy @# HmY(If{U۫oS?yMOڤ겭=Zy_%c Ri=S뤌T +m@U<&aVKrD`cO%"c~ į{5Th~:b&V 8JAqd .J咡y$O̸Q=rJf(~ƙDNV20)* OKmuj,'E_>/h}u j#ɘ'eTwpz'T3Z%r wH5 Y|$2]MN:\H)wBU[M *d Sh \r-5Olwȑ>?CK @V%~ ]:F bI`Mnxr:)J>D$gLϗ" "!]$HT;\0B>D ZP|I'T. |EQ# IX^(# QXN&,o,ϹCmSJ!wlXLv U} +MH) E~D^@8`:8tV@ W%TЅXoLg$0ʖã-gQ>4BjޗR;E3YdW?hh.zdൖaąNhL/,@Wr+͕KMmI}7O4WR̦+x}TL>[%zTO|}N A~xP5)BT<mj,PK(` Q3KA 0HɱVZqwp"o0*" [ÔKPLF߭ T-DQԿ@c0QIِ`btYCaXbmLa&K?Gab`YJ sdr×T퀍LL)w:ϰlQ}CE` {kkiacsCg`ROl"`uloL6NTX (0l"78 )֑XB{& U4C` l%b˾Q$##ATR+P@HP;p3sϮ H=VNE`(g੃֪1k@3̷{0/WMI"e:'ˎ7@=:xYHx@ +CRɰ$ DKY ,Rj*dӡ&=:}ਪ篶 CՑ})!"U%' x_d@fP(Z u?d0xL=jՑCxO@*Z/@[:TRwN/)% w~:!/= r<Ѕ<9t LAU[ B/1˕ w:xf@*&@̀@e`@zQGP@<~L@x16 n 4p{g@ (.xNVTWrck¨y|JD(15 r:$HSV@ @Ba'TL @: X~$R7" (͡CsZ*CCME 3:!1c^+P%A/v@Ql7i &;4 9e UE@Q ۓA$@L$p0 ޺ݪ}ĜykH-o.#|Rx.ŸNݞ}w;޺=׵[giW8zol}uu _pl)9_?2a6d:!'*%Ѵt8U~&;9]ny@+)O5I"%HW6QǎN;I1#q@"{WWUBt%Ǜj߰3+(F)r) T>2q:ep*Er9ykp0Jfo>|k ꏎYc['߾0-L$SkGR!1㎺ ReYٵ 5'R<4kymaL*W7: #@h#*lm8+ !~=e]/4֧bR8vzHJVKLPG +32|w3V}>cb?/cNNbXE1۳znʭIN\aLH0gh685р>S9g ˁIS ;iuv{Ǩ,T<5TՅo!%' )sc;$wz|\A:L%L$t酋M I 0=l $ EKaþb?6L$زtJ}RuIY"Ր?uu?_ J9jM8$9YOպ(5"P=IRU "I}:5OyE!){VοYP*P)5CSP6RcCQ2_Mߩ'.D@,N>(@ƿE@1-%yϾM]d"[3@K[&%6g/>8gXi$iE+U/0}5}F5aumm?ިyQaO;ńOW:Tc@C '~t'R|hˤ]hDyujݖ}cC>1j<4e5!Xs2i$@vGKCAĤ~XAzf)\7Sj^@B`"ɼ%XEf ԉ @wk~ &\Yf'm_>$.q#U?.rMcfQ$) k<Sqm;shp ITSR2!N%HrHjz #iIOX @Pi? 7}x#!UeoIO@X~/K (I H-]_ٚ$>L$eHh VI}mI>`锓?E<f=@+@P! =WvHE{yU I\$^U"I {?$p?l%,?HM5L @@m&gp<d=a6[ @Z&ZkG@Xc @hIZ}B& vs #A:$KcKVJ齡 uHB~`u[:?\47Ƚe,4Al` K d2eeaB@!#=>S9in #fJD Bnq`ĸ(Ϥ?Z$9^A_LHbNΨ[GS@S+fN> @)ޏp3Ƌ @)5O)uQ}2ֿJ!^w?~$HTk}(G o7$~$1tI `@9Bg@3A(v^[N|vc͐h(cG@3H4`UK3;H4# b~!*rܻX_o$HRw@[GK;.t% C9;@*w̗{] 0pЙ6+ޱg,$*ApB  F`AYF+׫`?jtg0e,#ܧӾ,|np3VܨU$仇ST,Q pf ly0@2!y˸ՀyR ؾ\5I?'*}ׁnȑ#I?V}uy%\(AN&~Sf/巶~Þ I? ;a;}L+Fn$ ?ؼswwd@NW/$ @׶f' )F<qBcOF$Ԝ7]~˾~f䤟 8iZq/!HaU|{#~.7tns; ѓRþ?*E,D>U|u<{ p,(|&J^qϟmض0g( K" $Xym߰gg㇭?a;GH)ؾ:V8@O?u=bGHXyլ'$'e~ąmө f×3<#n$Wo՛\Kl"c {M ]@Kn?ܛԽL3f m=ba!4$0G_2yOSN~k7&"&@(6$@aF@5dcj1Ѯ}nܲ:B)ct;j## x`3$ s[w8wݖ}dzP<ᘑ^4n菿}1O% 9HhxýcI&n;jC_X>ȐY!زq MJǎ<6?Q$@Pw˷>xIu4MjF =|3C= ?LR%سŻ:K0t-)=[^6<! c{kT !O#n+@/8^TЫ eMIDE#:>&Hq4 @ߝsYBWSIchr@NH< ?rm. ž,A 1r@4+7?\RU*?Q4o]ٛ}og A_P)AJk/ B5TQ%"@-vR*5 Va9 Du C{%ЯII MT҄ .[aџ%[YPߐiimyGd`#S +k}if`+W."[7,賀Td`=Qއ;&3Hم|=}8j0IX@HKWW#۲D`#_* }~OVg^>dUT` IײW P$(odT` ʑ>P׶,2h$(VZ_J~)Cs Dd($*D ﯣKPެ*:;p5‘ $h X0yi_}@"@"q~@343K7''X#`z,\bAE/&u#IHp |_P!@@h1 $KW˛/lZ#Uo=M|m hV Hq,?X  P?i@r?1-|=4:-E_qWVgu?V f\Al3o~)',P z[l3KpnTG:jH\[?8E;Eפ-;_$PbY2&N9T\v_ jg: xe͏@Y|KQЌ~AHb@P14Ƙ>?-KƲtL2Tcy_e^E$h[?ɔJv i;?-v tEG`[h4k -IHjqGX=APǒ>à'Yp|ifH*#0Wɶu{(L _mO' ]YN ~I;@v +Q@_k 9^ > 7H[DAxMT4d ep "+υ~)|̬)` 3ذ˚܋rOʽ /,bBp«ı|w*$n5ɴDQOH_eX % @o/pt > ꐲ%@PZ {Pvl?U߹{_8+wWv?`ſzO8O A a+_ 垖{ bg @h_];T]_ xF޵]k-3S{٤3Y(M?qgw}DQ T{_w@_usXϚ|n4QOFNR'#Tr3'-bWO%bӼO*U8+s߷֓SSi]䙠W:X`H,9s Wc($1[Mmup;`:y$Nr?S+BZt:,wGrm$NZynN[^TI@rtnpqk{[O!ϒ`,S@+cZ3$i N09# Q`,SO@ѱ/06,NTn@ `@[ru:'ƟM9/ţ'i ~2% 'iM`QWŖã̗cj6%4&b=cjSV~UDO8fcbY̯V` 3M$W* #6ΩQd<ئ_5aHb>TM8M$W%_ [ Gm%1)41 IwS @$h]l>z]8.x.W1@E <]L|(ҎZtMҡ0TP gEI(ʕsm6 @Kgq Y" @$ya%..! D@HPx\`|ˆBPc\`PP; gE# @$(TE@+xvP40h$(́h$(.2w"MAHP4ge @"MAHP4ge`+"h J0$ 4Ʃ@cxVP=L/p)`[`Nh " WEۻ7| !ψ<+@ $J } 30Ҽ0@ige"@iA @We)qSgC$TP*pll$(UsS@f(b -N:%P(=\tl&lg3%1p" Jn,VÂ$3+Xx`K5`! J%%ѱ#\tM T` B3 't< $WNDd_#H$T`} H_f4W.^}̺on0/ @N.8sLW*@'7Yn YϘ׬Iw؏Bxg_Hi?)b@L][tc^ .^|᳟1?@I$ozlyG9*$I4Xw HGw @)Z*VH@U?5_``Ndq\[9yTI"p˧o2?/EKd;]TJRߴ$ /<]u>}S POWO>M^nDQW?)n/ dR–?KoJHܾm}@Sڑnh%mI?C\e@_|=$hI[yۛ04||wa _[c /䏏N~3/?f/{(6E+VLmyӌ}= .;M$؟:RIy mm~EM50 G'9%O136Q0Bzku\4̚3/I fu\8H UZo aK PyM3)dr(3ǜ| c k;xĜڷOTbf9 `*qmB"̱ck ӧعs9}f||9KclRehǢE̬Y\{)3k܋nsW^i|ҿ$IR@9~; 'w:>kRsw7ã1 o62K;:;O=}W/RvK]/Vv@^`">k\xر#҂ 7ȏccN\0w۳/ltu-ER)'J{7'&I;r(ОڀrwW~Ϙ\T.#s\61-c_$aM?O;߉;{˟ZWso$PJ-J@ )yq|_k\c5~ ?e1EQnZ̺(Rۿ$ @wl;_}gf9zSrcL+y债uyyd+π`1F2}/5kmѳAL/o]tuT`#뱗$ a v8z95vI ) %,\x-/|{+M)X-d[ f$? _Ne/[=}}n1}РJR[sI ј#Y9oԛXYOsb2 jKLl5ƬPI`WzJ|pŬC_⻩ SYК \O0 g-c t&&It*$(yCΛ}啇}Kf@2Q^/70I Ue > J"+7;s%q:׮K߀ (KkO½,X L hg) K/=Z?Q-;^{޻Gs7+#}*]޳~o#'>Oy o|rx˖Cvdx㡋og}NI S>xgӦʻBd][^ͳ6'JUnLT1,YL'φ<#p3**U4r ho?5>2Bfбh[΁NQg:nUZ僠>?yV䙡'c @ZC @U|r@PDQ)QPZ RTq}: =_Jf?yrVp IVV? -\Z56din@UprTܯz9('V9?_˟ ݆ѣGN;e %gM9XꖿT$`#%'G(Y9"y< ebt}t|TK',@ȡ_@'ˢ70Iӫx#߸7@y&Y,x ŢɜS8PDIj0m'Q4¢|\#NM%V@gl@=Я<h[& #0oSIuTuI8 S`d7ȳ*,_WӼ73) mgV]4N3 /H3A6,S 3HWwv'ǎڷ? yv9:xF٢?WO% @5 XIS/4FaM+=?oN΀np<,=GVO%L$k|5d;(g7!DVzuxa-@xq[6*| ^ȉ<Ӝ-Jo{T~CNkLEkCMdЙGixH퀷fc;jL%$`'N( 3N tKx`_ @=%aY'π`& u`pR$ό1^?ϟl HA7 ,{ }E(OgfȍE], mg_OȂ?HZ `o @Oq|d,p $p8 8G<-M6$`?S1XX@ @љeJ > d,pl1m|%=f҉$H_! #<7ry;| J80&T+E֬a$Ծ}R2&ؠT%k%_$E]GPm;x(Jpl HgPM?(襯H [V6(ԣdؐ‘%zlo<6>ec%J@Pt 6v$yLKKM*6R-]Uv@,ɘbґE{^xW0NJb=|3/Fecz[:ke\ZXҏDzh{ؖ>,r]9uj35ud#[GA.(p̨ǴEQWЌƌ |$ڤ{`s=QԾ}s> Q=ɏʐhtD\9Ւ?')DaJox}#r$ڵ9%p7 ;(;il1O{rhh4k--XE $HONg4aСӡ_:ka+8$Ig7\%м&Ǝ 8E .x^&ΒneAx3%*C㡰U[>BC615&%]L8OJ||$@ق®EJH&eU:(W% xC ,*Zyߓ7=# TH%qGHVO DX(&]٧ԣCۻHVg=` Uk>a5a0"@^U =wŌ1Z3<ϢIENDB`ukui-control-center/data/org.ukui.control-center.notice.gschema.xml0000644000175000017500000000335613641405665024451 0ustar fengfeng true

    Activation of this plugin Whether this plugin would be activated by ukui-settings-daemon or not true Show OSD notification Whether an OSD notification is shown to notify about changes true Eject Binding to eject an optical disc. true messages notice . true voice notice . 3 maximize num of messages The maximize num of messages on notice window. 'corner' type of notice message the type of notice in system. ukui-control-center/data/org.ukui.control-center.keybinding.gschema.xml0000644000175000017500000000137213630066010025270 0ustar fengfeng '' Keybinding Keybinding associated with a custom shortcut. '' Command Command associated with a custom keybinding. '' Name Description associated with a custom keybinding. ukui-control-center/data/org.ukui.control-center.desktop.gschema.xml0000644000175000017500000000415513635333016024630 0ustar fengfeng true Show computer icon on desktop Whether show computer icon on desktop or not. true Show home icon on desktop Whether show home icon on desktop or not. true Show network icon on desktop Whether show network icon on desktop or not. true Show trash icon on desktop Whether show trash icon on desktop or not. true Show volumes icon on desktop Whether show volumes icon on desktop or not. true Lock computer icon on start menu Whether lock computer icon on start menu or not. true Lock filesystem icon on start menu Whether lock system icon on start menu or not. true Lock settings icon on start menu Whether lock settings icon on start menu or not. true Lock trash icon on start menu Whether lock trash icon on start menu or not. ukui-control-center/data/org.ukui.control-center.experienceplan.gschema.xml0000644000175000017500000000062513635333016026157 0ustar fengfeng true join user experience plan Whether this plugin would be activated by ukui-settings-daemon or not ukui-control-center/data/org.ukui.control-center.panel.plugins.gschema.xml0000644000175000017500000000307013640364120025725 0ustar fengfeng false nightmode status nightmode used in UKUI Desktop Environment ,control by ukui-panel and ukui-control-center '24' HourSystem status hoursystem used in UKUI Desktop Environment ,ontrol by ukui-panel and ukui-control-center 'lunar' Lunar calendar calendar system used in UKUI Desktop Environment ,ontrol by ukui-panel and ukui-control-center 'monday' first of week Select the first day of the week 'cn' date formate date format '24' first of week Select the first day of the week ukui-control-center/data/org.ukui.control-center.wifi.switch.gschema.xml0000644000175000017500000000132113635333016025405 0ustar fengfeng true wifi switch wifi switch true Wireless network card Determine if the wireless network card is inserted true wifi switchor wifi switch of kylin network manager ukui-control-center/ukui-control-center.pro0000644000175000017500000000022213621411724020037 0ustar fengfengTEMPLATE = subdirs CONFIG += ordered SUBDIRS = \ registeredQDbus \ plugins\ shell \ TRANSLATIONS += \ shell/res/i18n/zh_CN.ts