From 27856879bf962f178d88e79144e37a47e731b122 Mon Sep 17 00:00:00 2001 From: tpearson Date: Fri, 3 Sep 2010 09:14:57 +0000 Subject: [PATCH] * Massive import of OpenSUSE patches, primarily for bugfixes * Added some infrastructure created by OpenSUSE to allow for future addition of the Kickoff menu as an option * Minor Slackware compilation fixes git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1171255 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kcheckpass/checkpass_pam.c | 11 +- kcontrol/background/bgdialog.cpp | 14 +- kcontrol/input/xcursor/themepage.cpp | 11 +- kcontrol/kicker/menutab_impl.h | 3 + kcontrol/spellchecking/spellchecking.cpp | 2 +- kdeeject/kdeeject | 42 +- kdesktop/KDesktopIface.h | 29 + kdesktop/Makefile.am | 2 + kdesktop/desktop.cc | 47 ++ kdesktop/desktop.h | 5 + kdesktop/kdiconview.cc | 120 +++- kdesktop/kdiconview.h | 9 +- kdesktop/lock/lockprocess.cc | 244 ++++++- kdesktop/lock/lockprocess.h | 30 +- kdesktop/minicli.cpp | 15 +- kdesktop/minicli.h | 4 +- kdesu/kdesu/kdesu.cpp | 1 + kdesu/kdesud/kdesud.cpp | 3 + kdm/backend/client.c | 93 ++- kdm/config.def | 11 + kdm/configure.in.in | 71 ++ kdm/kfrontend/Makefile.am | 1 + kdm/kfrontend/kdm_greet.c | 2 +- kdm/kfrontend/kdmadmindialog.cpp | 176 +++++ kdm/kfrontend/kdmadmindialog.h | 70 ++ kdm/kfrontend/kdmconfig.cpp | 2 + kdm/kfrontend/kdmconfig.h | 14 + kdm/kfrontend/kfdialog.cpp | 4 + kdm/kfrontend/kgapp.cpp | 5 + kdm/kfrontend/kgdialog.cpp | 4 +- kdm/kfrontend/kgreeter.cpp | 214 +++++- kdm/kfrontend/kgreeter.h | 9 +- kdm/kfrontend/sessions/Makefile.am | 2 +- kdm/kfrontend/sessions/admin.desktop | 7 + kdm/kfrontend/themer/kdmitem.cpp | 107 ++- kdm/kfrontend/themer/kdmitem.h | 7 + kdm/kfrontend/themer/kdmlabel.cpp | 67 +- kdm/kfrontend/themer/kdmlabel.h | 6 + kdm/kfrontend/themer/kdmlayout.cpp | 9 +- kdm/kfrontend/themer/kdmpixmap.cpp | 98 ++- kdm/kfrontend/themer/kdmpixmap.h | 5 +- kdm/kfrontend/themer/kdmrect.cpp | 32 +- kdm/kfrontend/themer/kdmrect.h | 4 +- kdm/kfrontend/themer/kdmthemer.cpp | 73 +- kdm/kfrontend/themer/kdmthemer.h | 4 + kdmlib/Makefile.am | 6 +- kdmlib/kgreet_pam.cpp | 668 ++++++++++++++++++ kdmlib/kgreet_pam.h | 93 +++ khelpcenter/kcmhelpcenter.cpp | 7 + khelpcenter/kcmhelpcenter.h | 5 + khelpcenter/navigator.cpp | 10 +- khelpcenter/searchhandlers/Makefile.am | 2 +- khelpcenter/searchhandlers/docbook.desktop | 4 +- .../searchhandlers/khc_beagle_index.pl | 49 ++ .../searchhandlers/khc_beagle_search.pl | 88 +++ .../applets/systemtray/systemtrayapplet.cpp | 98 ++- kicker/applets/systemtray/systemtrayapplet.h | 1 + .../kickoff/button-box-gradient-topdown.png | Bin 0 -> 213 bytes kicker/data/kickoff/button-box-gradient.png | Bin 0 -> 255 bytes .../data/kickoff/button-box-left-corner.png | Bin 0 -> 203 bytes kicker/data/kickoff/button-box-left.png | Bin 0 -> 306 bytes .../data/kickoff/button-box-right-corner.png | Bin 0 -> 214 bytes kicker/data/kickoff/button-box-top.png | Bin 0 -> 163 bytes .../kickoff/cr128-action-suspend2disk.png | Bin 0 -> 13797 bytes .../data/kickoff/cr128-action-suspend2ram.png | Bin 0 -> 15500 bytes .../data/kickoff/cr16-action-suspend2disk.png | Bin 0 -> 834 bytes .../data/kickoff/cr16-action-suspend2ram.png | Bin 0 -> 865 bytes kicker/data/kickoff/cr32-action-leave.png | Bin 0 -> 1602 bytes .../data/kickoff/cr32-action-suspend2disk.png | Bin 0 -> 2091 bytes .../data/kickoff/cr32-action-suspend2ram.png | Bin 0 -> 2243 bytes kicker/data/kickoff/cr48-action-leave.png | Bin 0 -> 2475 bytes .../data/kickoff/cr48-action-suspend2disk.png | Bin 0 -> 3713 bytes .../data/kickoff/cr48-action-suspend2ram.png | Bin 0 -> 3965 bytes .../data/kickoff/cr48-app-recently_used.png | Bin 0 -> 4736 bytes .../data/kickoff/cr64-action-suspend2disk.png | Bin 0 -> 5601 bytes .../data/kickoff/cr64-action-suspend2ram.png | Bin 0 -> 6115 bytes kicker/data/kickoff/crsc-action-leave.svgz | Bin 0 -> 3915 bytes .../kickoff/crsc-action-suspend2disk.svgz | Bin 0 -> 12713 bytes .../data/kickoff/crsc-action-suspend2ram.svgz | Bin 0 -> 13613 bytes kicker/data/kickoff/kmenu_active.png | Bin 0 -> 3257 bytes kicker/data/kickoff/kmenu_basic.mng | Bin 0 -> 81101 bytes kicker/data/kickoff/kmenu_flipped.mng | Bin 0 -> 81240 bytes kicker/data/kickoff/kmenu_vertical.mng | Bin 0 -> 62006 bytes kicker/data/kickoff/left_triangle.png | Bin 0 -> 781 bytes kicker/data/kickoff/main_border_bc.png | Bin 0 -> 171 bytes kicker/data/kickoff/main_border_lc.png | Bin 0 -> 166 bytes kicker/data/kickoff/main_border_rc.png | Bin 0 -> 174 bytes kicker/data/kickoff/main_border_tc.png | Bin 0 -> 163 bytes kicker/data/kickoff/main_corner_bl.png | Bin 0 -> 211 bytes kicker/data/kickoff/main_corner_br.png | Bin 0 -> 218 bytes kicker/data/kickoff/main_corner_tl.png | Bin 0 -> 176 bytes kicker/data/kickoff/main_corner_tr.png | Bin 0 -> 202 bytes kicker/data/kickoff/menu_separator.png | Bin 0 -> 260 bytes kicker/data/kickoff/resize_handle.png | Bin 0 -> 217 bytes kicker/data/kickoff/right_triangle.png | Bin 0 -> 722 bytes .../data/kickoff/search-gradient-topdown.png | Bin 0 -> 181 bytes kicker/data/kickoff/search-gradient.png | Bin 0 -> 218 bytes kicker/data/kickoff/search-running.mng | Bin 0 -> 11888 bytes kicker/data/kickoff/search-tab-center.png | Bin 0 -> 170 bytes kicker/data/kickoff/search-tab-left.png | Bin 0 -> 398 bytes kicker/data/kickoff/search-tab-right.png | Bin 0 -> 417 bytes kicker/data/kickoff/search-tab-top-center.png | Bin 0 -> 146 bytes kicker/data/kickoff/search-tab-top-left.png | Bin 0 -> 2960 bytes kicker/data/kickoff/search-tab-top-right.png | Bin 0 -> 368 bytes .../data/kickoff/tab-bottom-left-topdown.png | Bin 0 -> 145 bytes kicker/data/kickoff/tab-bottom-left.png | Bin 0 -> 304 bytes .../data/kickoff/tab-bottom-right-topdown.png | Bin 0 -> 171 bytes kicker/data/kickoff/tab-bottom-right.png | Bin 0 -> 351 bytes kicker/data/kickoff/tab-center-topdown.png | Bin 0 -> 142 bytes kicker/data/kickoff/tab-center.png | Bin 0 -> 175 bytes kicker/data/kickoff/tab-left_center.png | Bin 0 -> 165 bytes kicker/data/kickoff/tab-right_center.png | Bin 0 -> 165 bytes kicker/data/kickoff/tab-top-left-topdown.png | Bin 0 -> 256 bytes kicker/data/kickoff/tab-top-left.png | Bin 0 -> 198 bytes kicker/data/kickoff/tab-top-right-topdown.png | Bin 0 -> 327 bytes kicker/data/kickoff/tab-top-right.png | Bin 0 -> 198 bytes kicker/kicker/ui/browser_mnu.cpp | 9 +- kicker/kicker/ui/service_mnu.cpp | 123 +++- kicker/kicker/ui/service_mnu.h | 3 +- kicker/libkicker/kickerSettings.kcfg | 5 + kioslave/media/mediaimpl.cpp | 7 + kioslave/media/mediamanager/halbackend.cpp | 8 + kioslave/smb/kio_smb_auth.cpp | 1 + kioslave/system/entries/documents.desktop | 2 +- klipper/klipperrc.desktop | 4 +- konqueror/Makefile.am | 4 +- konqueror/konq_combo.cc | 12 + konqueror/konq_combo.h | 1 + konqueror/konq_frame.cc | 5 + konsole/other/x11r5.keytab | 4 +- kscreensaver/Makefile.am | 4 +- kscreensaver/random.cpp | 102 ++- ksmserver/KSMServerInterface.h | 2 + ksmserver/Makefile.am | 4 +- ksmserver/server.h | 12 + ksmserver/shutdown.cpp | 78 +- ksmserver/shutdowndlg.cpp | 70 +- ksmserver/shutdowndlg.h | 19 + ksmserver/test.cpp | 7 +- ksmserver/timed.ui | 352 +++++++++ kwin/workspace.cpp | 14 + kxkb/kcmlayout.cpp | 3 + nsplugins/nspluginloader.cpp | 6 +- nsplugins/nspluginloader.h | 2 +- nsplugins/pluginscan.cpp | 2 +- 145 files changed, 3334 insertions(+), 251 deletions(-) create mode 100644 kdm/kfrontend/kdmadmindialog.cpp create mode 100644 kdm/kfrontend/kdmadmindialog.h create mode 100644 kdm/kfrontend/sessions/admin.desktop create mode 100644 kdmlib/kgreet_pam.cpp create mode 100644 kdmlib/kgreet_pam.h create mode 100644 khelpcenter/searchhandlers/khc_beagle_index.pl create mode 100644 khelpcenter/searchhandlers/khc_beagle_search.pl create mode 100644 kicker/data/kickoff/button-box-gradient-topdown.png create mode 100644 kicker/data/kickoff/button-box-gradient.png create mode 100644 kicker/data/kickoff/button-box-left-corner.png create mode 100644 kicker/data/kickoff/button-box-left.png create mode 100644 kicker/data/kickoff/button-box-right-corner.png create mode 100644 kicker/data/kickoff/button-box-top.png create mode 100644 kicker/data/kickoff/cr128-action-suspend2disk.png create mode 100644 kicker/data/kickoff/cr128-action-suspend2ram.png create mode 100644 kicker/data/kickoff/cr16-action-suspend2disk.png create mode 100644 kicker/data/kickoff/cr16-action-suspend2ram.png create mode 100644 kicker/data/kickoff/cr32-action-leave.png create mode 100644 kicker/data/kickoff/cr32-action-suspend2disk.png create mode 100644 kicker/data/kickoff/cr32-action-suspend2ram.png create mode 100644 kicker/data/kickoff/cr48-action-leave.png create mode 100644 kicker/data/kickoff/cr48-action-suspend2disk.png create mode 100644 kicker/data/kickoff/cr48-action-suspend2ram.png create mode 100644 kicker/data/kickoff/cr48-app-recently_used.png create mode 100644 kicker/data/kickoff/cr64-action-suspend2disk.png create mode 100644 kicker/data/kickoff/cr64-action-suspend2ram.png create mode 100644 kicker/data/kickoff/crsc-action-leave.svgz create mode 100644 kicker/data/kickoff/crsc-action-suspend2disk.svgz create mode 100644 kicker/data/kickoff/crsc-action-suspend2ram.svgz create mode 100644 kicker/data/kickoff/kmenu_active.png create mode 100644 kicker/data/kickoff/kmenu_basic.mng create mode 100644 kicker/data/kickoff/kmenu_flipped.mng create mode 100644 kicker/data/kickoff/kmenu_vertical.mng create mode 100644 kicker/data/kickoff/left_triangle.png create mode 100644 kicker/data/kickoff/main_border_bc.png create mode 100644 kicker/data/kickoff/main_border_lc.png create mode 100644 kicker/data/kickoff/main_border_rc.png create mode 100644 kicker/data/kickoff/main_border_tc.png create mode 100644 kicker/data/kickoff/main_corner_bl.png create mode 100644 kicker/data/kickoff/main_corner_br.png create mode 100644 kicker/data/kickoff/main_corner_tl.png create mode 100644 kicker/data/kickoff/main_corner_tr.png create mode 100644 kicker/data/kickoff/menu_separator.png create mode 100644 kicker/data/kickoff/resize_handle.png create mode 100644 kicker/data/kickoff/right_triangle.png create mode 100644 kicker/data/kickoff/search-gradient-topdown.png create mode 100644 kicker/data/kickoff/search-gradient.png create mode 100644 kicker/data/kickoff/search-running.mng create mode 100644 kicker/data/kickoff/search-tab-center.png create mode 100644 kicker/data/kickoff/search-tab-left.png create mode 100644 kicker/data/kickoff/search-tab-right.png create mode 100644 kicker/data/kickoff/search-tab-top-center.png create mode 100644 kicker/data/kickoff/search-tab-top-left.png create mode 100644 kicker/data/kickoff/search-tab-top-right.png create mode 100644 kicker/data/kickoff/tab-bottom-left-topdown.png create mode 100644 kicker/data/kickoff/tab-bottom-left.png create mode 100644 kicker/data/kickoff/tab-bottom-right-topdown.png create mode 100644 kicker/data/kickoff/tab-bottom-right.png create mode 100644 kicker/data/kickoff/tab-center-topdown.png create mode 100644 kicker/data/kickoff/tab-center.png create mode 100644 kicker/data/kickoff/tab-left_center.png create mode 100644 kicker/data/kickoff/tab-right_center.png create mode 100644 kicker/data/kickoff/tab-top-left-topdown.png create mode 100644 kicker/data/kickoff/tab-top-left.png create mode 100644 kicker/data/kickoff/tab-top-right-topdown.png create mode 100644 kicker/data/kickoff/tab-top-right.png create mode 100644 ksmserver/timed.ui diff --git a/kcheckpass/checkpass_pam.c b/kcheckpass/checkpass_pam.c index 6f281165f..44758b696 100644 --- a/kcheckpass/checkpass_pam.c +++ b/kcheckpass/checkpass_pam.c @@ -140,13 +140,16 @@ AuthReturn Authenticate(const char *caller, const char *method, openlog("kcheckpass", LOG_PID, LOG_AUTH); PAM_data.conv = conv; - if (strcmp(method, "classic")) { - sprintf(pservb, "%.31s-%.31s", caller, method); - pam_service = pservb; - } else { + if (!strcmp(method, "classic")) { PAM_data.classic = 1; pam_service = caller; } + else if (!strcmp(method, "pam")) { + pam_service = caller; + } else { + sprintf(pservb, "%.31s-%.31s", caller, method); + pam_service = pservb; + } pam_error = pam_start(pam_service, user, &PAM_conversation, &pamh); if (pam_error != PAM_SUCCESS) return AuthError; diff --git a/kcontrol/background/bgdialog.cpp b/kcontrol/background/bgdialog.cpp index ae76b701a..8294f53a3 100644 --- a/kcontrol/background/bgdialog.cpp +++ b/kcontrol/background/bgdialog.cpp @@ -504,14 +504,23 @@ void BGDialog::loadWallpaperFilesList() { //search for .desktop files before searching for images without .desktop files TQStringList lst = m_pDirs->findAllResources("wallpaper", "*desktop", false, true); TQStringList files; + TQStringList hiddenfiles; for (TQStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it) { KSimpleConfig fileConfig(*it); fileConfig.setGroup("Wallpaper"); + int slash = (*it).findRev('/') + 1; + TQString directory = (*it).left(slash); + TQString imageCaption = fileConfig.readEntry("Name"); TQString fileName = fileConfig.readEntry("File"); + if (fileConfig.readBoolEntry("Hidden",false)) { + hiddenfiles.append(directory + fileName); + continue; + } + if (imageCaption.isEmpty()) { imageCaption = fileName; @@ -527,9 +536,8 @@ void BGDialog::loadWallpaperFilesList() { rs = imageCaption + " (" + TQString::number(n) + ')'; lrs = rs.lower(); } - int slash = (*it).findRev('/') + 1; - TQString directory = (*it).left(slash); bool canLoadScaleable = false; + #ifdef HAVE_LIBART canLoadScaleable = true; #endif @@ -543,7 +551,7 @@ void BGDialog::loadWallpaperFilesList() { lst = m_pDirs->findAllResources("wallpaper", "*", false, true); for (TQStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it) { - if ( !(*it).endsWith(".desktop") && files.grep(*it).empty() ) { + if ( !(*it).endsWith(".desktop") && files.grep(*it).empty() && hiddenfiles.grep(*it).empty() ) { // First try to see if we have a comment describing the image. If we do // just use the first line of said comment. KFileMetaInfo metaInfo(*it); diff --git a/kcontrol/input/xcursor/themepage.cpp b/kcontrol/input/xcursor/themepage.cpp index 4fb8b8a69..7caf18c3f 100644 --- a/kcontrol/input/xcursor/themepage.cpp +++ b/kcontrol/input/xcursor/themepage.cpp @@ -73,6 +73,13 @@ struct ThemeInfo { }; +static TQString defaultThemeDescription( const TQString& theme ) +{ + if( theme == "redglass" || theme == "whiteglass" || theme == "pseudocore" || theme == "handhelds" ) + return i18n( "XFree theme %1 - incomplete for KDE" ).arg( theme ); + return i18n( "No description available" );; +} + ThemePage::ThemePage( TQWidget* parent, const char* name ) : TQWidget( parent, name ), selectedTheme( NULL ), currentTheme( NULL ) { @@ -333,7 +340,7 @@ void ThemePage::insertTheme( const TQString &path ) // Defaults in case there's no name or comment field. TQString name = dirName; - TQString desc = i18n( "No description available" ); + TQString desc = defaultThemeDescription( name ); TQString sample = "left_ptr"; KSimpleConfig c( path + "/index.theme", true ); // Open read-only @@ -480,7 +487,7 @@ void ThemePage::insertThemes() // Defaults in case there's no index.theme file or it lacks // a name and a comment field. TQString name = *it; - TQString desc = i18n( "No description available" ); + TQString desc = defaultThemeDescription( name ); TQString sample = "left_ptr"; // Parse the index.theme file if the theme has one. diff --git a/kcontrol/kicker/menutab_impl.h b/kcontrol/kicker/menutab_impl.h index 3d0e09748..877e47ffe 100644 --- a/kcontrol/kicker/menutab_impl.h +++ b/kcontrol/kicker/menutab_impl.h @@ -19,6 +19,9 @@ #define __menutab_impl_h__ #include +#include + +#include #include "menutab.h" diff --git a/kcontrol/spellchecking/spellchecking.cpp b/kcontrol/spellchecking/spellchecking.cpp index 6416f9e9c..a7ed79b46 100644 --- a/kcontrol/spellchecking/spellchecking.cpp +++ b/kcontrol/spellchecking/spellchecking.cpp @@ -67,7 +67,7 @@ void KSpellCheckingConfig::defaults() spellConfig->setRunTogether(0); spellConfig->setDictionary(""); spellConfig->setDictFromList(FALSE); - spellConfig->setEncoding (KS_E_ASCII); + spellConfig->setEncoding (KS_E_UTF8); spellConfig->setClient (KS_CLIENT_ISPELL); } diff --git a/kdeeject/kdeeject b/kdeeject/kdeeject index 71079794d..34e61097e 100755 --- a/kdeeject/kdeeject +++ b/kdeeject/kdeeject @@ -4,12 +4,38 @@ # # Copyright GPL v2 by David Faure # -if test $# -ge 1 -a "$1" != "--help"; then - quiet=0 - if test "$1" = "-q"; then - quiet=1 - shift - fi +quiet=0 +if test "$1" = "-q"; then + quiet=1 + shift +fi + +if test "$1" = "--help"; then + echo "Usage: $0 where name is a device or a mountpoint." + exit 0 +fi + +if test -z "$1"; then + for dev in /dev/cdrom /dev/dvd /dev/dvdram /dev/cdrecorder; do + if test -e $dev; then + lp=`readlink $dev` + if test -n "$lp"; then + device=/dev/$lp + else + device=$dev + fi + break + fi + done +else + device=$1 +fi + +udi=`dcop kded mediamanager properties $device 2>/dev/null | head -n 1 ` +if test -n "$udi"; then + dcop kded mediamanager unmount "$udi" >/dev/null 2>&1 +fi + # Checking for stuff in the PATH is ugly with sh. # I guess this is the reason for making this a kde app... OS=`uname -s` @@ -34,7 +60,5 @@ if test $# -ge 1 -a "$1" != "--help"; then elif test $quiet -eq 0; then kdialog --title "KDE Eject" --error "Eject $1 failed!" fi -else - kdialog --title "KDE Eject" --msgbox "Usage: $0 where name is a device or a mountpoint." -fi + exit 1 diff --git a/kdesktop/KDesktopIface.h b/kdesktop/KDesktopIface.h index 1aa90e538..b966405e4 100644 --- a/kdesktop/KDesktopIface.h +++ b/kdesktop/KDesktopIface.h @@ -107,6 +107,35 @@ k_dcop: * space for desktop icons */ virtual void desktopIconsAreaChanged(const TQRect &area, int screen) = 0; + + /** + * Find the next free place for a not yet existing icon, so it fits + * in the user arrangement. Basicly prepare for icons to be moved in. + * It will try to find a place in the virtual grid near col,row + * where no other icon is. + * + * If you specify -1 for row or column, it will try to find the next + * free room where no other icon follows. E.g. if you specify column + * = -1 and row = 0, kdesktop will find the next vertical placement + * so that the icon appears at the end of the existing icons preferable + * in the first column. If the first column is full, it will find the + * next free room in the second column. + * + * If you specify both column and row, kdesktop won't care for aligning, + * or surrounding icons, but try to find the free place near the given + * grid place (e.g. specify 0,0 to find the nearest place in the left + * upper corner). + */ + virtual TQPoint findPlaceForIcon( int column, int row) = 0; + + /// copy the desktop file in the Desktop and place it at x, y + virtual void addIcon(const TQString &url, int x, int y) = 0; + + /// same with specific destination + virtual void addIcon(const TQString &url, const TQString &dest, int x, int y) = 0; + + /// remove the desktop file (either full path or relative) + virtual void removeIcon(const TQString &dest) = 0; }; #endif diff --git a/kdesktop/Makefile.am b/kdesktop/Makefile.am index fecd9e9c4..5035fe77f 100644 --- a/kdesktop/Makefile.am +++ b/kdesktop/Makefile.am @@ -6,6 +6,8 @@ kdesktop_la_LIBADD = libkdesktopsettings.la $(top_builddir)/libkonq/libkonq.la SUBDIRS = . lock pics patterns programs init kwebdesktop +KDE_OPTIONS = nofinal + ####### Files bin_PROGRAMS = kcheckrunning diff --git a/kdesktop/desktop.cc b/kdesktop/desktop.cc index 54513e962..a05dfcb99 100644 --- a/kdesktop/desktop.cc +++ b/kdesktop/desktop.cc @@ -32,6 +32,9 @@ #include #include #include +#include +#include +#include #include #include @@ -58,6 +61,7 @@ #include #include #include +#include // Create the equivalent of KAccelBase::connectItem // and then remove this include and fix reconnects in initRoot() -- ellis //#include @@ -986,4 +990,47 @@ bool KDesktop::event(TQEvent * e) return TQWidget::event(e); } +TQPoint KDesktop::findPlaceForIcon( int column, int row ) +{ + if (m_pIconView) + return m_pIconView->findPlaceForIcon(column, row); + else + return TQPoint(-1, -1); +} + +void KDesktop::addIcon(const TQString & _url, int x, int y) +{ + addIcon( _url, KGlobalSettings::desktopPath(), x, y ); +} + +void KDesktop::addIcon(const TQString & _url, const TQString & _dest, int x, int y) +{ + TQString filename = _url.mid(_url.findRev('/') + 1); + + TQValueList files; + KIO::CopyInfo i; + i.uSource = KURL::fromPathOrURL( _url ); + i.uDest = KURL::fromPathOrURL( _dest ); + i.uDest.addPath( filename ); + files.append(i); + if (!TQFile::exists(i.uDest.prettyURL().replace("file://",TQString::null))) { m_pIconView->slotAboutToCreate( TQPoint( x, y ), files ); + KIO::copy( i.uSource, i.uDest, false ); } + +// m_pIconView->addFuturePosition(filename, x, y); + // qDebug("addIcon %s %s %d %d", _url.latin1(), _dest.latin1(), x, y); +// system(TQString("cp \"%1\" \"%2/%3\"").arg(KURL(_url).path()).arg(KURL(_dest).path()).arg(filename).latin1()); +// m_pIconView->update( _dest ); +} + +void KDesktop::removeIcon(const TQString &_url) +{ + if (_url.at(0) != '/') { + qDebug("removeIcon with relative path not supported for now"); + return; + } + unlink(KURL(_url).path().latin1()); + TQString dest = _url.left(_url.findRev('/') + 1); + m_pIconView->update( dest ); +} + #include "desktop.moc" diff --git a/kdesktop/desktop.h b/kdesktop/desktop.h index d8ec12c69..31928e9d4 100644 --- a/kdesktop/desktop.h +++ b/kdesktop/desktop.h @@ -164,6 +164,11 @@ protected: virtual void setIconsEnabled( bool enable ); virtual bool event ( TQEvent * e ); + virtual TQPoint findPlaceForIcon( int column, int row); + virtual void addIcon(const TQString &url, int x, int y); + virtual void addIcon(const TQString &url, const TQString &dest, int x, int y); + virtual void removeIcon(const TQString &url); + private slots: void desktopResized(); diff --git a/kdesktop/kdiconview.cc b/kdesktop/kdiconview.cc index caa68feb9..5762458fd 100644 --- a/kdesktop/kdiconview.cc +++ b/kdesktop/kdiconview.cc @@ -962,6 +962,18 @@ void KDIconView::slotNewItems( const KFileItemList & entries ) kdDebug(1214) << "KDIconView::slotNewItems count=" << entries.count() << endl; KFileItemListIterator it(entries); KFileIVI* fileIVI = 0L; + + if (m_nextItemPos.isNull() && !m_dotDirectory) { + // Not found, we'll need to save the new pos + kdDebug(1214)<<"Neither a drop position stored nor m_dotDirectory set"<url(); @@ -1026,15 +1038,6 @@ void KDIconView::slotNewItems( const KFileItemList & entries ) kdDebug(1214)<<"Using saved position"< viewport()->width()) + return TQPoint(); + + while ( rect.bottom() < viewport()->height() - spacing() ) + { + if ( !isFreePosition(0,rect) ) + rect.moveBy(0, rect.height()); + else + return rect.topLeft(); + } + + return TQPoint(); +} + +TQPoint KDIconView::findPlaceForIconRow( int row, int dx, int dy ) +{ + if (row < 0) + return TQPoint(); + + TQRect rect; + rect.moveTopLeft(TQPoint(0, row * dy)); + rect.setWidth(dx); + rect.setHeight(dy); + + if (rect.bottom() > viewport()->height()) + return TQPoint(); + + while (rect.right() < viewport()->width() - spacing()) + { + if (!isFreePosition(0,rect)) + rect.moveBy(rect.width()+spacing(), 0); + else + return rect.topLeft(); + } + + return TQPoint(); +} + +TQPoint KDIconView::findPlaceForIcon( int column, int row) +{ + int dx = gridXValue(), dy = 0; + TQIconViewItem *item = firstItem(); + for ( ; item; item = item->nextItem() ) { + dx = QMAX( dx, item->width() ); + dy = QMAX( dy, item->height() ); + } + + dx += spacing(); + dy += spacing(); + + if (row == -1) { + int max_cols = viewport()->width() / dx; + int delta = 0; + TQPoint res; + do { + delta++; + res = findPlaceForIconCol(column + (delta / 2) * (-2 * (delta % 2) + 1), + dx, dy); + if (delta / 2 > QMAX(max_cols - column, column)) + return res; + } while (res.isNull()); + return res; + } + + if (column == -1) { + int max_rows = viewport()->height() / dy; + int delta = 0; + TQPoint res; + do { + delta++; + res = findPlaceForIconRow(row + (delta / 2) * (-2 * (delta % 2) + 1), + dx, dy); + if (delta / 2 > QMAX(max_rows - row, row)) + return res; + } while (res.isNull()); + return res; + } + + // very unlikely - if I may add that + return TQPoint(0, 0); +} + void KDIconView::saveIconPositions() { kdDebug(1214) << "KDIconView::saveIconPositions" << endl; @@ -1665,4 +1760,11 @@ void KDIconView::saveIconPositions() m_dotDirectory->sync(); } +void KDIconView::update( const TQString &_url ) +{ + if (m_dirLister) + m_dirLister->updateDirectory( _url ); +} + + #include "kdiconview.moc" diff --git a/kdesktop/kdiconview.h b/kdesktop/kdiconview.h index 715a0eb5e..5ef349322 100644 --- a/kdesktop/kdiconview.h +++ b/kdesktop/kdiconview.h @@ -73,6 +73,8 @@ public: TQStringList selectedURLs(); + void update( const TQString &url ); + /** * Save the icon positions */ @@ -103,6 +105,10 @@ public: void startDirLister(); + TQPoint findPlaceForIconCol( int column, int dx, int dy ); + TQPoint findPlaceForIconRow( int row, int dx, int dy ); + TQPoint findPlaceForIcon( int column, int row ); + protected slots: // slots connected to the icon view @@ -112,8 +118,9 @@ protected slots: void slotMouseButtonClickedKDesktop(int _button, TQIconViewItem* _item, const TQPoint& _global); void slotContextMenuRequested(TQIconViewItem* _item, const TQPoint& _global); void slotEnableAction( const char * name, bool enabled ); +public slots: void slotAboutToCreate(const TQPoint &pos, const TQValueList &files); - +protected slots: void slotItemRenamed(TQIconViewItem*, const TQString &name); // slots connected to the directory lister diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc index d589232a1..cdd5581e7 100644 --- a/kdesktop/lock/lockprocess.cc +++ b/kdesktop/lock/lockprocess.cc @@ -39,6 +39,8 @@ #include #include #include +#include +#include #include #include @@ -119,6 +121,8 @@ static void segv_handler(int) sleep(1); } +extern Atom qt_wm_state; + //=========================================================================== // // Screen saver handling process. Handles screensaver window, @@ -135,6 +139,8 @@ LockProcess::LockProcess(bool child, bool useBlankOnly) mRestoreXF86Lock(false), mForbidden(false), mAutoLogout(false), + mVkbdProcess(NULL), + mKWinModule(NULL), mPipeOpen(false), mPipeOpen_out(false), mInfoMessageDisplayed(false), @@ -1120,9 +1126,11 @@ bool LockProcess::checkPass() if (mAutoLogout) killTimer(mAutoLogoutTimerId); + showVkbd(); PasswordDlg passDlg( this, &greetPlugin); - int ret = execDialog( &passDlg ); + hideVkbd(); + if (mForceReject == true) { ret = TQDialog::Rejected; } @@ -1251,9 +1259,13 @@ bool LockProcess::x11Event(XEvent *event) switch (event->type) { - case KeyPress: case ButtonPress: case MotionNotify: + case ButtonRelease: + if( forwardVkbdEvent( event )) + return true; // filter out + // fall through + case KeyPress: if (mBusy || !mDialogs.isEmpty()) break; mBusy = true; @@ -1290,11 +1302,30 @@ bool LockProcess::x11Event(XEvent *event) case ConfigureNotify: // from SubstructureNotifyMask on the root window if(event->xconfigure.event == qt_xrootwin()) stayOnTop(); + for( TQValueList< VkbdWindow >::Iterator it = mVkbdWindows.begin(); + it != mVkbdWindows.end(); + ++it ) { + if( (*it).id == event->xconfigure.window ) { + (*it).rect = TQRect( event->xconfigure.x, event->xconfigure.y, + event->xconfigure.width, event->xconfigure.height ); + break; + } + } break; case MapNotify: // from SubstructureNotifyMask on the root window + windowAdded( event->xmap.window, false ); if( event->xmap.event == qt_xrootwin()) stayOnTop(); break; + case DestroyNotify: + for( TQValueList< VkbdWindow >::Iterator it = mVkbdWindows.begin(); + it != mVkbdWindows.end(); + ++it ) + if( (*it).id == event->xdestroywindow.window ) { + mVkbdWindows.remove( it ); + break; + } + break; } // We have grab with the grab window being the root window. @@ -1319,17 +1350,24 @@ bool LockProcess::x11Event(XEvent *event) void LockProcess::stayOnTop() { - if(!mDialogs.isEmpty()) + if(!mDialogs.isEmpty() || !mVkbdWindows.isEmpty()) { // this restacking is written in a way so that // if the stacking positions actually don't change, // all restacking operations will be no-op, // and no ConfigureNotify will be generated, // thus avoiding possible infinite loops - XRaiseWindow( qt_xdisplay(), mDialogs.first()->winId()); // raise topmost + if( !mVkbdWindows.isEmpty()) + XRaiseWindow( qt_xdisplay(), mVkbdWindows.first().id ); + else + XRaiseWindow( qt_xdisplay(), mDialogs.first()->winId()); // raise topmost // and stack others below it - Window* stack = new Window[ mDialogs.count() + 1 ]; + Window* stack = new Window[ mDialogs.count() + mVkbdWindows.count() + 1 ]; int count = 0; + for( TQValueList< VkbdWindow >::ConstIterator it = mVkbdWindows.begin(); + it != mVkbdWindows.end(); + ++it ) + stack[ count++ ] = (*it).id; for( TQValueList< TQWidget* >::ConstIterator it = mDialogs.begin(); it != mDialogs.end(); ++it ) @@ -1428,4 +1466,200 @@ void LockProcess::msgBox( TQMessageBox::Icon type, const TQString &txt ) execDialog( &box ); } +static int run_vkbd = -1; +void LockProcess::showVkbd() +{ + if( run_vkbd == - 1 ) { + int status = system( "hal-find-by-property --key system.formfactor.subtype --string tabletpc" ); +// status = 0; // enable for testing + run_vkbd = ( WIFEXITED( status ) && WEXITSTATUS( status ) == 0 + && !KStandardDirs::findExe( "xvkbd" ).isEmpty()) ? 1 : 0; + } + if( run_vkbd ) { + mVkbdWindows.clear(); + mVkbdLastEventWindow = None; + mKWinModule = new KWinModule( NULL, KWinModule::INFO_WINDOWS ); + connect( mKWinModule, TQT_SIGNAL( windowAdded( WId )), TQT_SLOT( windowAdded( WId ))); + mVkbdProcess = new KProcess; + *mVkbdProcess << "xvkbd" << "-compact" << "-geometry" << "-0-0" << "-xdm"; + mVkbdProcess->start(); + } +} + +void LockProcess::hideVkbd() +{ + if( mVkbdProcess != NULL ) { + mVkbdProcess->kill(); + delete mVkbdProcess; + mVkbdProcess = NULL; + delete mKWinModule; + mKWinModule = NULL; + mVkbdWindows.clear(); + } +} + +void LockProcess::windowAdded( WId w ) +{ + windowAdded( w, true ); +} + +void LockProcess::windowAdded( WId w, bool managed ) +{ + KWin::WindowInfo info = KWin::windowInfo( w, 0, NET::WM2WindowClass ); + if( info.windowClassClass().lower() != "xvkbd" ) + return; + // Unmanaged windows (i.e. popups) don't currently work anyway, since they + // don't have WM_CLASS set anyway. I could perhaps try tricks with X id + // ranges if really needed. + if( managed ) { + // withdraw the window, wait for it to be withdrawn, reparent it directly + // to root at the right position + XWithdrawWindow( qt_xdisplay(), w, qt_xscreen()); + for(;;) { + Atom type; + int format; + unsigned long length, after; + unsigned char *data; + int r = XGetWindowProperty( qt_xdisplay(), w, qt_wm_state, 0, 2, + false, AnyPropertyType, &type, &format, + &length, &after, &data ); + bool withdrawn = true; + if ( r == Success && data && format == 32 ) { + Q_UINT32 *wstate = (Q_UINT32*)data; + withdrawn = (*wstate == WithdrawnState ); + XFree( (char *)data ); + } + if( withdrawn ) + break; + } + } + XSelectInput( qt_xdisplay(), w, StructureNotifyMask ); + XWindowAttributes attr_geom; + if( !XGetWindowAttributes( qt_xdisplay(), w, &attr_geom )) + return; + int x = XDisplayWidth( qt_xdisplay(), qt_xscreen()) - attr_geom.width; + int y = XDisplayHeight( qt_xdisplay(), qt_xscreen()) - attr_geom.height; + if( managed ) { + XSetWindowAttributes attr; + attr.override_redirect = True; + XChangeWindowAttributes( qt_xdisplay(), w, CWOverrideRedirect, &attr ); + XReparentWindow( qt_xdisplay(), w, qt_xrootwin(), x, y ); + XMapWindow( qt_xdisplay(), w ); + } + VkbdWindow data; + data.id = w; + data.rect = TQRect( x, y, attr_geom.width, attr_geom.height ); + mVkbdWindows.prepend( data ); +} + +bool LockProcess::forwardVkbdEvent( XEvent* event ) +{ + if( mVkbdProcess == NULL ) + return false; + TQPoint pos; + Time time; + switch( event->type ) + { + case ButtonPress: + case ButtonRelease: + pos = TQPoint( event->xbutton.x, event->xbutton.y ); + time = event->xbutton.time; + break; + case MotionNotify: + pos = TQPoint( event->xmotion.x, event->xmotion.y ); + time = event->xmotion.time; + break; + default: + return false; + } + // vkbd windows are kept topmost, so just find the first one in the position + for( TQValueList< VkbdWindow >::ConstIterator it = mVkbdWindows.begin(); + it != mVkbdWindows.end(); + ++it ) { + if( (*it).rect.contains( pos )) { + // Find the subwindow where the event should actually go. + // Not exactly cheap in the number of X roundtrips but oh well. + Window window = (*it).id; + Window root, child; + int root_x, root_y, x, y; + unsigned int mask; + for(;;) { + if( !XQueryPointer( qt_xdisplay(), window, &root, &child, &root_x, &root_y, &x, &y, &mask )) + return false; + if( child == None ) + break; + window = child; + } + switch( event->type ) + { + case ButtonPress: + case ButtonRelease: + event->xbutton.x = x; + event->xbutton.y = y; + event->xbutton.subwindow = None; + break; + case MotionNotify: + event->xmotion.x = x; + event->xmotion.y = y; + event->xmotion.subwindow = None; + break; + } + event->xany.window = window; + sendVkbdFocusInOut( window, time ); + XSendEvent( qt_xdisplay(), window, False, 0, event ); + return true; + } + } + sendVkbdFocusInOut( None, time ); + return false; +} + +// Fake EnterNotify/LeaveNotify events as the mouse moves. They're not sent by X +// because of the grab and having them makes xvkbd highlight the buttons (but +// not needed otherwise it seems). +void LockProcess::sendVkbdFocusInOut( WId window, Time t ) +{ + if( mVkbdLastEventWindow == window ) + return; + if( mVkbdLastEventWindow != None ) { + XEvent e; + e.xcrossing.type = LeaveNotify; + e.xcrossing.display = qt_xdisplay(); + e.xcrossing.window = mVkbdLastEventWindow; + e.xcrossing.root = qt_xrootwin(); + e.xcrossing.subwindow = None; + e.xcrossing.time = t; + e.xcrossing.x = 0; + e.xcrossing.y = 0; + e.xcrossing.x_root = -1; + e.xcrossing.y_root = -1; + e.xcrossing.mode = NotifyNormal; + e.xcrossing.detail = NotifyAncestor; + e.xcrossing.same_screen = True; + e.xcrossing.focus = False; + e.xcrossing.state = 0; + XSendEvent( qt_xdisplay(), mVkbdLastEventWindow, False, 0, &e ); + } + mVkbdLastEventWindow = window; + if( mVkbdLastEventWindow != None ) { + XEvent e; + e.xcrossing.type = EnterNotify; + e.xcrossing.display = qt_xdisplay(); + e.xcrossing.window = mVkbdLastEventWindow; + e.xcrossing.root = qt_xrootwin(); + e.xcrossing.subwindow = None; + e.xcrossing.time = t; + e.xcrossing.x = 0; + e.xcrossing.y = 0; + e.xcrossing.x_root = 0; + e.xcrossing.y_root = 0; + e.xcrossing.mode = NotifyNormal; + e.xcrossing.detail = NotifyAncestor; + e.xcrossing.same_screen = True; + e.xcrossing.focus = False; + e.xcrossing.state = 0; + XSendEvent( qt_xdisplay(), mVkbdLastEventWindow, False, 0, &e ); + } +} + #include "lockprocess.moc" diff --git a/kdesktop/lock/lockprocess.h b/kdesktop/lock/lockprocess.h index cdbeb0da1..76ffb6013 100644 --- a/kdesktop/lock/lockprocess.h +++ b/kdesktop/lock/lockprocess.h @@ -23,6 +23,7 @@ #include class KLibrary; +class KWinModule; struct GreeterPluginHandle { KLibrary *library; @@ -79,6 +80,7 @@ private slots: void suspend(); void checkDPMSActive(); void slotDeadTimePassed(); + void windowAdded( WId ); private: void configure(); @@ -103,6 +105,11 @@ private: void stayOnTop(); void lockXF86(); void unlockXF86(); + void showVkbd(); + void hideVkbd(); + bool forwardVkbdEvent( XEvent* event ); + void sendVkbdFocusInOut( WId window, Time t ); + void windowAdded( WId window, bool managed ); void resume( bool force ); static TQVariant getConf(void *ctx, const char *key, const TQVariant &dflt); @@ -135,18 +142,29 @@ private: int mAutoLogoutTimerId; int mAutoLogoutTimeout; bool mAutoLogout; - bool mInfoMessageDisplayed; - TQDialog *currentDialog; - bool mDialogControlLock; - bool mForceReject; + + TQTimer *resizeTimer; + unsigned int mkeyCode; + + KProcess* mVkbdProcess; + KWinModule* mKWinModule; + struct VkbdWindow + { + WId id; + QRect rect; + }; + QValueList< VkbdWindow > mVkbdWindows; + WId mVkbdLastEventWindow; bool mPipeOpen; int mPipe_fd; bool mPipeOpen_out; int mPipe_fd_out; - TQTimer *resizeTimer; - unsigned int mkeyCode; + bool mInfoMessageDisplayed; + TQDialog *currentDialog; + bool mDialogControlLock; + bool mForceReject; }; #endif diff --git a/kdesktop/minicli.cpp b/kdesktop/minicli.cpp index caef6197a..027aa0bfc 100644 --- a/kdesktop/minicli.cpp +++ b/kdesktop/minicli.cpp @@ -145,6 +145,9 @@ Minicli::Minicli( TQWidget *parent, const char *name) connect( m_dlg->cbCommand, TQT_SIGNAL( returnPressed() ), m_dlg->pbRun, TQT_SLOT( animateClick() ) ); + m_dlg->cbCommand->setHistoryEditorEnabled( true ); + connect( m_dlg->cbCommand, TQT_SIGNAL(removed( const TQString&) ), TQT_SLOT(saveConfig()) ); + // Advanced group box... connect(m_dlg->cbPriority, TQT_SIGNAL(toggled(bool)), TQT_SLOT(slotChangeScheduler(bool))); connect(m_dlg->slPriority, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(slotPriority(int))); @@ -295,7 +298,9 @@ void Minicli::accept() } bool logout = (cmd == "logout"); - if( !logout && runCommand() == 1 ) + bool lock = (cmd == "lock"); + + if( !logout && !lock && runCommand() == 1 ) return; m_dlg->cbCommand->addToHistory( m_dlg->cbCommand->currentText().stripWhiteSpace() ); @@ -308,6 +313,14 @@ void Minicli::accept() kapp->propagateSessionManager(); kapp->requestShutDown(); } + if ( lock ) + { + TQCString appname( "kdesktop" ); + int kicker_screen_number = qt_xscreen(); + if ( kicker_screen_number ) + appname.sprintf("kdesktop-screen-%d", kicker_screen_number); + kapp->dcopClient()->send(appname, "KScreensaverIface", "lock()", ""); + } } void Minicli::reject() diff --git a/kdesktop/minicli.h b/kdesktop/minicli.h index ddbe868c0..4ae49cf7c 100644 --- a/kdesktop/minicli.h +++ b/kdesktop/minicli.h @@ -54,12 +54,14 @@ public: void setCommand(const TQString& command); void reset(); - void saveConfig(); void clearHistory(); virtual void show(); virtual TQSize sizeHint() const; +public slots: + void saveConfig(); + protected slots: virtual void accept(); virtual void reject(); diff --git a/kdesu/kdesu/kdesu.cpp b/kdesu/kdesu/kdesu.cpp index af2986b06..67ea55fe9 100644 --- a/kdesu/kdesu/kdesu.cpp +++ b/kdesu/kdesu/kdesu.cpp @@ -382,6 +382,7 @@ static int startApp() change_uid = false; password = dlg.password(); keep = dlg.keep(); + KConfigGroup(config,"Passwords").writeEntry("Keep", keep); data.setSilent( KStartupInfoData::No ); KStartupInfo::sendChange( id, data ); } diff --git a/kdesu/kdesud/kdesud.cpp b/kdesu/kdesud/kdesud.cpp index 3e9462698..49006a401 100644 --- a/kdesu/kdesud/kdesud.cpp +++ b/kdesu/kdesud/kdesud.cpp @@ -45,6 +45,7 @@ #include #include +#include #include #include #include @@ -248,6 +249,8 @@ int create_socket() int main(int argc, char *argv[]) { + prctl(PR_SET_DUMPABLE, 0); + KAboutData aboutData("kdesud", I18N_NOOP("KDE su daemon"), Version, I18N_NOOP("Daemon used by kdesu"), KAboutData::License_Artistic, diff --git a/kdm/backend/client.c b/kdm/backend/client.c index b2e7ebbc7..0807b2ce7 100644 --- a/kdm/backend/client.c +++ b/kdm/backend/client.c @@ -87,6 +87,18 @@ extern int loginsuccess( const char *User, const char *Host, const char *Tty, ch #include "consolekit.h" #endif +#define AU_FAILED 0 +#define AU_SUCCESS 1 +#ifdef HAVE_LIBAUDIT +#include +#else +#define log_to_audit_system(l,h,d,s) do { ; } while (0) +#endif + +#ifdef WITH_CONSOLE_KIT +#include "consolekit.h" +#endif + /* * Session data, mostly what struct verify_info was for */ @@ -291,6 +303,56 @@ fail_delay( int retval ATTR_UNUSED, unsigned usec_delay ATTR_UNUSED, {} # endif + /** + * log_to_audit_system: + * @login: Name of user + * @hostname: Name of host machine + * @tty: Name of display + * @success: 1 for success, 0 for failure + * + * Logs the success or failure of the login attempt with the linux kernel + * audit system. The intent is to capture failed events where the user + * fails authentication or otherwise is not permitted to login. There are + * many other places where pam could potentially fail and cause login to + * fail, but these are system failures rather than the signs of an account + * being hacked. + * + * Returns nothing. + */ + +#ifdef HAVE_LIBAUDIT +static void +log_to_audit_system (const char *loginname, + const char *hostname, + const char *tty, + int success) +{ + struct passwd *pw; + char buf[64]; + int audit_fd; + + audit_fd = audit_open(); + if (loginname) + pw = getpwnam(loginname); + else { + loginname = "unknown"; + pw = NULL; + } + Debug("log_to_audit %p %s\n", pw, loginname); + + if (pw) { + snprintf(buf, sizeof(buf), "uid=%d", pw->pw_uid); + audit_log_user_message(audit_fd, AUDIT_USER_LOGIN, + buf, hostname, NULL, tty, (int)success); + } else { + snprintf(buf, sizeof(buf), "acct=%s", loginname); + audit_log_user_message(audit_fd, AUDIT_USER_LOGIN, + buf, hostname, NULL, tty, (int)success); + } + close(audit_fd); +} +#endif + static int doPAMAuth( const char *psrv, struct pam_data *pdata ) { @@ -349,6 +411,8 @@ doPAMAuth( const char *psrv, struct pam_data *pdata ) GSendStr( curuser ); } if (pretc != PAM_SUCCESS) { + /* Log the failed login attempt */ + log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); switch (pretc) { case PAM_USER_UNKNOWN: case PAM_AUTH_ERR: @@ -484,6 +548,9 @@ Verify( GConvFunc gconv, int rootok ) } else psrv = PAMService; pdata.usecur = TRUE; + } else if (!strcmp( curtype, "pam" )) { + psrv = PAMService; + pdata.usecur = FALSE; } else { sprintf( psrvb, "%.31s-%.31s", PAMService, curtype ); psrv = psrvb; @@ -553,7 +620,7 @@ Verify( GConvFunc gconv, int rootok ) free( msg ); V_RET_FAIL( 0 ); } - } else if (!strcmp( curtype, "generic" )) { + } else if (!strcmp( curtype, "generic" ) || !strcmp(curtype, "pam")) { if (!gconv( GCONV_USER, 0 )) return 0; for (curret = 0;;) { @@ -699,6 +766,8 @@ Verify( GConvFunc gconv, int rootok ) if (!p->pw_uid) { if (!rootok && !td->allowRootLogin) V_RET_FAIL( "Root logins are not allowed" ); + /* Log the failed login attempt */ + log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); return 1; /* don't deny root to log in */ } @@ -735,6 +804,8 @@ Verify( GConvFunc gconv, int rootok ) } if (pretc == PAM_SUCCESS) break; + /* Log the failed login attempt */ + log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); /* effectively there is only PAM_AUTHTOK_ERR */ GSendInt( V_FAIL ); } @@ -824,6 +895,8 @@ Verify( GConvFunc gconv, int rootok ) GSendInt( V_MSG_ERR ); GSendStr( "Your account has expired;" " please contact your system administrator" ); + /* Log the failed login attempt */ + log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); GSendInt( V_FAIL ); LC_RET0; } else if (tim > (expir - warntime) && !quietlog) { @@ -858,6 +931,8 @@ Verify( GConvFunc gconv, int rootok ) GSendInt( V_MSG_ERR ); GSendStr( "Your account has expired;" " please contact your system administrator" ); + /* Log the failed login attempt */ + log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); GSendInt( V_FAIL ); LC_RET0; } @@ -917,6 +992,8 @@ Verify( GConvFunc gconv, int rootok ) close( fd ); } GSendStr( "Logins are not allowed at the moment.\nTry again later" ); + /* Log the failed login attempt */ + log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); GSendInt( V_FAIL ); LC_RET0; } @@ -927,6 +1004,8 @@ Verify( GConvFunc gconv, int rootok ) PrepErrorGreet(); GSendInt( V_MSG_ERR ); GSendStr( "You are not allowed to login at the moment" ); + /* Log the failed login attempt */ + log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); GSendInt( V_FAIL ); LC_RET0; } @@ -938,6 +1017,8 @@ Verify( GConvFunc gconv, int rootok ) Debug( "shell not in /etc/shells\n" ); endusershell(); V_RET_FAIL( "Your login shell is not listed in /etc/shells" ); + /* Log the failed login attempt */ + log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); } if (!strcmp( s, p->pw_shell )) { endusershell(); @@ -1223,10 +1304,17 @@ StartClient() env = setEnv( env, "PATH", curuid ? td->userPath : td->systemPath ); env = setEnv( env, "SHELL", p->pw_shell ); env = setEnv( env, "HOME", p->pw_dir ); + if (cursource == PWSRC_AUTOLOGIN) + env = setEnv (env, "KDM_AUTOLOGIN", curuser); #if !defined(USE_PAM) && !defined(_AIX) && defined(KERBEROS) if (krbtkfile[0] != '\0') env = setEnv( env, "KRBTKFILE", krbtkfile ); #endif +#ifdef WITH_CONSOLE_KIT + if (ck_session_cookie != NULL) { + env = setEnv ( env, "XDG_SESSION_COOKIE", ck_session_cookie ); + } +#endif #ifdef WITH_CONSOLE_KIT if (ck_session_cookie != NULL) { env = setEnv ( env, "XDG_SESSION_COOKIE", ck_session_cookie ); @@ -1360,6 +1448,9 @@ StartClient() # define D_LOGIN_SETGROUP 0 #endif /* USE_PAM */ + /* Login succeeded */ + log_to_audit_system (curuser, td->remoteHost, td->name, AU_SUCCESS); + removeAuth = 1; chownCtrl( &td->ctrl, curuid ); endpwent(); diff --git a/kdm/config.def b/kdm/config.def index ab1adac84..7bc39b36d 100644 --- a/kdm/config.def +++ b/kdm/config.def @@ -1985,6 +1985,17 @@ Description: Specify the widget style for the greeter. Empty means to use the built-in default which currently is Plastik. +Key: UseAdminSession +Type: bool +Default: false +User: greeter +Instance: #*/! +Comment: + Admin session +Description: + If given there will be a special button that requires root password + and starts the given session + Key: ColorScheme Type: string Default: "" diff --git a/kdm/configure.in.in b/kdm/configure.in.in index 4b6972178..da741e7f9 100644 --- a/kdm/configure.in.in +++ b/kdm/configure.in.in @@ -240,6 +240,53 @@ if test "x$with_kdm_xconsole" = xyes; then AC_DEFINE(WITH_KDM_XCONSOLE, 1, [Build kdm with built-in xconsole]) fi +########### Check for DBus + + AC_MSG_CHECKING(for DBus) + + dbus_inc=NOTFOUND + dbus_lib=NOTFOUND + dbus=NOTFOUND + + search_incs="$kde_includes $kde_extra_includes /usr/include /usr/include/dbus-1.0 /usr/local/include /usr/local/include/dbus-1.0" + AC_FIND_FILE(dbus/dbus.h, $search_incs, dbus_incdir) + + search_incs_arch_deps="$kde_includes $kde_extra_includes /usr/lib$kdelibsuff/dbus-1.0/include /usr/local/lib$kdelibsuff/dbus-1.0/include" + AC_FIND_FILE(dbus/dbus-arch-deps.h, $search_incs_arch_deps, dbus_incdir_arch_deps) + + if test -r $dbus_incdir/dbus/dbus.h && test -r $dbus_incdir_arch_deps/dbus/dbus-arch-deps.h ; then + DBUS_INCS="-I$dbus_incdir -I$dbus_incdir_arch_deps" + dbus_inc=FOUND + fi + + search_libs="$kde_libraries $kde_extra_libs /usr/lib$kdelibsuff /usr/local/lib$kdelibsuff" + AC_FIND_FILE(libdbus-1.so, $search_libs, dbus_libdir) + + if test -r $dbus_libdir/libdbus-1.so ; then + DBUS_LIBS="-L$dbus_libdir -ldbus-1" + dbus_lib=FOUND + fi + + if test $dbus_inc != FOUND || test $dbus_lib != FOUND ; then + KDE_PKG_CHECK_MODULES( DBUS, "dbus-1", [ DBUS_INCS=$DBUS_CFLAGS; dbus_inc=FOUND; dbus_lib=FOUND; ] , AC_MSG_RESULT( Nothing found on PKG_CONFIG_PATH ) ) + fi + + dbus_bus_var=`pkg-config --variable=system_bus_default_address dbus-1 2>/dev/null` + if test -z "$dbus_bus_var"; then + dbus_bus_var="unix:path=/var/run/dbus/system_bus_socket" + fi + AC_DEFINE_UNQUOTED(DBUS_SYSTEM_BUS, "$dbus_bus_var", [Define the unix domain path for dbus system bus]) + + if test $dbus_inc = FOUND && test $dbus_lib = FOUND ; then + AC_MSG_RESULT(headers $DBUS_INCS libraries $DBUS_LIBS) + dbus=FOUND + else + AC_MSG_RESULT(searched but not found) + fi + + AC_SUBST(DBUS_INCS) + AC_SUBST(DBUS_LIBS) + ########### Check for DBus AC_MSG_CHECKING(for DBus) @@ -288,3 +335,27 @@ fi AC_SUBST(DBUS_LIBS) dnl AC_OUTPUT(kdm/kfrontend/sessions/kde.desktop) + + +AC_ARG_WITH(libaudit, + [ --with-libaudit=[auto/yes/no] Add Linux audit support [default=auto]],, + with_libaudit=auto) + +# Check for Linux auditing API +# +# libaudit detection +if test x$with_libaudit = xno ; then + have_libaudit=no; +else + # See if we have audit daemon library + AC_CHECK_LIB(audit, audit_log_user_message, + have_libaudit=yes, have_libaudit=no) +fi + +AM_CONDITIONAL(HAVE_LIBAUDIT, test x$have_libaudit = xyes) + +if test x$have_libaudit = xyes ; then + EXTRA_DAEMON_LIBS="$EXTRA_DAEMON_LIBS -laudit" + AC_DEFINE(HAVE_LIBAUDIT,1,[linux audit support]) +fi + diff --git a/kdm/kfrontend/Makefile.am b/kdm/kfrontend/Makefile.am index 5c5dfd61a..6d4fed27b 100644 --- a/kdm/kfrontend/Makefile.am +++ b/kdm/kfrontend/Makefile.am @@ -21,6 +21,7 @@ kdm_greet_SOURCES = \ kchooser.cpp \ kgverify.cpp \ kdmshutdown.cpp \ + kdmadmindialog.cpp \ kgreeter.cpp \ kgapp.cpp kdm_greet_LDFLAGS = $(all_libraries) $(KDE_RPATH) diff --git a/kdm/kfrontend/kdm_greet.c b/kdm/kfrontend/kdm_greet.c index 53d164f45..b03d96e15 100644 --- a/kdm/kfrontend/kdm_greet.c +++ b/kdm/kfrontend/kdm_greet.c @@ -44,8 +44,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # include #endif -#if defined(HAVE_XTEST) || defined(HAVE_XKB) # include +#if defined(HAVE_XTEST) || defined(HAVE_XKB) # include #endif diff --git a/kdm/kfrontend/kdmadmindialog.cpp b/kdm/kfrontend/kdmadmindialog.cpp new file mode 100644 index 000000000..637d6dd90 --- /dev/null +++ b/kdm/kfrontend/kdmadmindialog.cpp @@ -0,0 +1,176 @@ + /* + + Admin dialog + + Copyright (C) 1997, 1998, 2000 Steffen Hansen + Copyright (C) 2000-2003 Oswald Buddenhagen + + + This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#include "kdmadmindialog.h" +#include "kdmconfig.h" +#include "kgdialog.h" +#include "kdm_greet.h" +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +int KDMAdmin::curPlugin = -1; +PluginList KDMAdmin::pluginList; + +KDMAdmin::KDMAdmin( const TQString &user, TQWidget *_parent ) + : inherited( _parent ) + , verify( 0 ), curUser(user) +{ + TQSizePolicy fp( TQSizePolicy::Fixed, TQSizePolicy::Fixed ); + + TQVBoxLayout *box = new TQVBoxLayout( this, 10 ); + + TQHBoxLayout *hlay = new TQHBoxLayout( box ); + + GSendInt( G_ReadDmrc ); + GSendStr( "root" ); + GRecvInt(); // ignore status code ... + + if (curPlugin < 0) { + curPlugin = 0; + pluginList = KGVerify::init( "classic" ); + } + verify = new KGStdVerify( this, this, + this, "root", + pluginList, KGreeterPlugin::Authenticate, + KGreeterPlugin::Shutdown ); + verify->selectPlugin( curPlugin ); + box->addLayout( verify->getLayout() ); + TQAccel *accel = new TQAccel( this ); + accel->insertItem( ALT+Key_A, 0 ); + connect( accel, TQT_SIGNAL(activated(int)), TQT_SLOT(slotActivatePlugMenu()) ); + + box->addWidget( new KSeparator( KSeparator::HLine, this ) ); + + okButton = new KPushButton( KStdGuiItem::ok(), this ); + okButton->setSizePolicy( fp ); + okButton->setDefault( true ); + cancelButton = new KPushButton( KStdGuiItem::cancel(), this ); + cancelButton->setSizePolicy( fp ); + + hlay = new TQHBoxLayout( box ); + hlay->addStretch( 1 ); + hlay->addWidget( okButton ); + hlay->addStretch( 1 ); + hlay->addWidget( cancelButton ); + hlay->addStretch( 1 ); + + connect( okButton, TQT_SIGNAL(clicked()), TQT_SLOT(accept()) ); + connect( cancelButton, TQT_SIGNAL(clicked()), TQT_SLOT(reject()) ); + + slotWhenChanged(); +} + +KDMAdmin::~KDMAdmin() +{ + hide(); + delete verify; +} + +void +KDMAdmin::slotActivatePlugMenu() +{ + TQPopupMenu *cmnu = verify->getPlugMenu(); + TQSize sh( cmnu->sizeHint() / 2 ); + cmnu->exec( geometry().center() - TQPoint( sh.width(), sh.height() ) ); +} + +void +KDMAdmin::accept() +{ + verify->accept(); +} + +void +KDMAdmin::slotWhenChanged() +{ + verify->abort(); + verify->setEnabled( 1 ); + verify->start(); +} + +void +KDMAdmin::bye_bye() +{ + GSendInt( G_GetDmrc ); + GSendStr( "Session" ); + char *sess = GRecvStr(); + if (sess && strcmp(sess, "admin")) { + GSendInt( G_PutDmrc ); + GSendStr( "OrigSession"); + GSendStr( sess); + free(sess); + } + + GSendInt( G_PutDmrc ); + GSendStr( "Session" ); + GSendStr( "admin" ); + inherited::accept(); +} + +void +KDMAdmin::verifyPluginChanged( int id ) +{ + curPlugin = id; + adjustSize(); +} + +void +KDMAdmin::verifyOk() +{ + bye_bye(); +} + +void +KDMAdmin::verifyFailed() +{ + okButton->setEnabled( false ); + cancelButton->setEnabled( false ); +} + +void +KDMAdmin::verifyRetry() +{ + okButton->setEnabled( true ); + cancelButton->setEnabled( true ); +} + +void +KDMAdmin::verifySetUser( const TQString & ) +{ +} + + +#include "kdmadmindialog.moc" diff --git a/kdm/kfrontend/kdmadmindialog.h b/kdm/kfrontend/kdmadmindialog.h new file mode 100644 index 000000000..91f1ed3a6 --- /dev/null +++ b/kdm/kfrontend/kdmadmindialog.h @@ -0,0 +1,70 @@ + /* + + Shutdown dialog + + Copyright (C) 1997, 1998 Steffen Hansen + Copyright (C) 2000-2003 Oswald Buddenhagen + + + This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + + +#ifndef KDMADMIN_H +#define KDMADMIN_H + +#include "kgverify.h" + +#include + +class LiloInfo; +class TQLabel; +class KPushButton; +class TQButtonGroup; +class TQComboBox; + +class KDMAdmin : public FDialog, public KGVerifyHandler { + Q_OBJECT + typedef FDialog inherited; + +public: + KDMAdmin( const TQString &user, TQWidget *_parent = 0 ); + ~KDMAdmin(); + +public slots: + void accept(); + void slotWhenChanged(); + void slotActivatePlugMenu(); + +private: + void bye_bye(); + + KPushButton *okButton, *cancelButton; + KGStdVerify *verify; + TQString curUser; + + static int curPlugin; + static PluginList pluginList; + +public: // from KGVerifyHandler + virtual void verifyPluginChanged( int id ); + virtual void verifyOk(); + virtual void verifyFailed(); + virtual void verifyRetry(); + virtual void verifySetUser( const TQString &user ); +}; + +#endif diff --git a/kdm/kfrontend/kdmconfig.cpp b/kdm/kfrontend/kdmconfig.cpp index 6f4c14031..15a63fa67 100644 --- a/kdm/kfrontend/kdmconfig.cpp +++ b/kdm/kfrontend/kdmconfig.cpp @@ -33,6 +33,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include +struct timeval st = {0, 0}; + CONF_GREET_DEFS TQString _stsFile; diff --git a/kdm/kfrontend/kdmconfig.h b/kdm/kfrontend/kdmconfig.h index f5420bcc4..52e054af6 100644 --- a/kdm/kfrontend/kdmconfig.h +++ b/kdm/kfrontend/kdmconfig.h @@ -35,6 +35,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include #include +#include extern TQString _stsFile; extern bool _isLocal; @@ -46,6 +47,19 @@ CONF_GREET_CPP_DECLS struct dpySpec; void decodeSess( dpySpec *sess, TQString &user, TQString &loc ); +extern struct timeval st; + +inline TQString timestamp() { + struct timeval nst; + gettimeofday(&nst, 0); + if (!st.tv_sec) + gettimeofday(&st, 0); + + TQString ret; + ret.sprintf("[%07ld]", (nst.tv_sec - st.tv_sec) * 1000 + (nst.tv_usec - st.tv_usec) / 1000); + return ret; +} + extern "C" #endif void init_config( void ); diff --git a/kdm/kfrontend/kfdialog.cpp b/kdm/kfrontend/kfdialog.cpp index 62a4acb22..78359e237 100644 --- a/kdm/kfrontend/kfdialog.cpp +++ b/kdm/kfrontend/kfdialog.cpp @@ -28,6 +28,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include #include +#include #include #include @@ -137,6 +138,9 @@ KFMsgBox::KFMsgBox( TQWidget *parent, TQMessageBox::Icon type, const TQString &t TQLabel *label1 = new TQLabel( this ); label1->setPixmap( TQMessageBox::standardIcon( type ) ); TQLabel *label2 = new TQLabel( text, this ); + TQRect d = KGlobalSettings::desktopGeometry(this); + if ( label2->fontMetrics().size( 0, text).width() > d.width() * 3 / 5) + label2->setAlignment(Qt::WordBreak | Qt::AlignAuto ); KPushButton *button = new KPushButton( KStdGuiItem::ok(), this ); button->setDefault( true ); button->setSizePolicy( TQSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred ) ); diff --git a/kdm/kfrontend/kgapp.cpp b/kdm/kfrontend/kgapp.cpp index 70b510645..50e65e916 100644 --- a/kdm/kfrontend/kgapp.cpp +++ b/kdm/kfrontend/kgapp.cpp @@ -36,6 +36,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include #include +#include +#include #include #include @@ -133,6 +135,7 @@ kg_main( const char *argv0 ) static char *argv[] = { (char *)"kdmgreet", 0 }; KCmdLineArgs::init( 1, argv, *argv, 0, 0, 0, true ); + kdDebug() << timestamp() << "start" << endl; kde_have_kipc = false; KApplication::disableAutoDcopRegistration(); KCrash::setSafer( true ); @@ -180,6 +183,7 @@ kg_main( const char *argv0 ) GSendInt( G_Ready ); + kdDebug() << timestamp() << " main1" << endl; setCursor( dpy, app.desktop()->winId(), XC_left_ptr ); for (;;) { @@ -220,6 +224,7 @@ kg_main( const char *argv0 ) if (_useTheme && !_theme.isEmpty()) { KThemedGreeter *tgrt; dialog = tgrt = new KThemedGreeter; + kdDebug() << timestamp() << " themed" << endl; if (!tgrt->isOK()) { delete tgrt; dialog = new KStdGreeter; diff --git a/kdm/kfrontend/kgdialog.cpp b/kdm/kfrontend/kgdialog.cpp index 1981eea83..f4ed918c6 100644 --- a/kdm/kfrontend/kgdialog.cpp +++ b/kdm/kfrontend/kgdialog.cpp @@ -29,6 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "kdm_greet.h" #include +#include #include #include @@ -84,7 +85,8 @@ KGDialog::completeMenu() inserten( i18n("Co&nsole Login"), ALT+Key_N, TQT_SLOT(slotConsole()) ); if (_allowShutdown != SHUT_NONE) { - inserten( i18n("&Shutdown..."), ALT+Key_S, TQT_SLOT(slotShutdown( int )) ); + ensureMenu(); + optMenu->insertItem(SmallIconSet( "exit" ), i18n("&Shutdown..."), this, TQT_SLOT(slotShutdown(int)), ALT+Key_S ); TQAccel *accel = new TQAccel( this ); accel->insertItem( ALT+CTRL+Key_Delete ); connect( accel, TQT_SIGNAL(activated( int )), TQT_SLOT(slotShutdown( int )) ); diff --git a/kdm/kfrontend/kgreeter.cpp b/kdm/kfrontend/kgreeter.cpp index ebd303525..74fc6b090 100644 --- a/kdm/kfrontend/kgreeter.cpp +++ b/kdm/kfrontend/kgreeter.cpp @@ -27,6 +27,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "kdmconfig.h" #include "kdmclock.h" #include "kdm_greet.h" +#include "kdmadmindialog.h" #include "themer/kdmthemer.h" #include "themer/kdmitem.h" #include "themer/kdmlabel.h" @@ -38,6 +39,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include #include +#include #undef Unsorted // x headers suck - make tqdir.h work with --enable-final #include @@ -46,6 +48,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include #include +#include #include #include #include @@ -57,6 +60,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include #include +#include #include #include @@ -64,27 +68,46 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include #include +#include +#include #include class UserListView : public KListView { public: - UserListView( TQWidget *parent = 0, const char *name = 0 ) + UserListView( bool _them, TQWidget *parent = 0, const char *name = 0 ) : KListView( parent, name ) - , cachedSizeHint( -1, 0 ) + , themed(_them), cachedSizeHint( -1, 0 ) { setSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Ignored ); header()->hide(); addColumn( TQString::null ); setColumnAlignment( 0, AlignVCenter ); setResizeMode( TQListView::LastColumn ); + if (themed) { + setBackgroundMode( Qt::NoBackground ); + viewport()->setBackgroundMode( Qt::NoBackground ); + setFrameStyle( TQFrame::NoFrame ); + } } + bool themed; mutable TQSize cachedSizeHint; - protected: + int sumHeight() const + { + int sum = 0; + for (TQListViewItem *itm = firstChild(); itm; itm = itm->nextSibling()) { + sum += itm->height(); + } + return sum; + } +public: virtual TQSize sizeHint() const { + if (themed) + return KListView::sizeHint(); + if (!cachedSizeHint.isValid()) { constPolish(); uint maxw = 0; @@ -99,9 +122,24 @@ class UserListView : public KListView { } return cachedSizeHint; } + virtual void paintEmptyArea ( TQPainter * p, const TQRect & rect ) + { + if (!themed) + return KListView::paintEmptyArea(p, rect ); + + const TQPixmap *pm = paletteBackgroundPixmap(); + if (!pm || pm->isNull()) + return; + + kdDebug() << "paintEmpty " << rect << endl; + TQRect devRect = p->xForm( rect ); + kdDebug() << "paintEmpty2 " << devRect << endl; + p->drawPixmap(0, 0, *pm, devRect.left(), devRect.top() ); + } + + TQPixmap background; }; - int KGreeter::curPlugin = -1; PluginList KGreeter::pluginList; @@ -116,12 +154,14 @@ KGreeter::KGreeter( bool framed ) , curSel( -1 ) , prevValid( true ) , needLoad( false ) + , themed( framed ) { stsFile = new KSimpleConfig( _stsFile ); stsFile->setGroup( "PrevUser" ); if (_userList) { - userView = new UserListView( this ); + readFacesList(); + userView = new UserListView( framed, this ); connect( userView, TQT_SIGNAL(clicked( TQListViewItem * )), TQT_SLOT(slotUserClicked( TQListViewItem * )) ); connect( userView, TQT_SIGNAL(doubleClicked( TQListViewItem * )), @@ -129,10 +169,8 @@ KGreeter::KGreeter( bool framed ) } if (_userCompletion) userList = new TQStringList; - if (userView || userList) - insertUsers(); - sessMenu = new TQPopupMenu( this ); + sessMenu = new TQPopupMenu( this ); connect( sessMenu, TQT_SIGNAL(activated( int )), TQT_SLOT(slotSessionSelected( int )) ); insertSessions(); @@ -151,6 +189,33 @@ KGreeter::~KGreeter() delete stsFile; } +void KGreeter::readFacesList() +{ + FILE *f = fopen( TQFile::encodeName( _faceDir + "/.randomlist" ), "rt" ); + if ( !f ) + return; + TQTextIStream is( f ); + while ( !is.eof() ) + { + TQString line = is.readLine().simplifyWhiteSpace(); + if ( line.isEmpty() ) + continue; + TQString icon; + int index = line.find( ' ' ); + if ( index > 0 ) { + icon = line.left( index ); + line = line.mid( index ); + } else { + icon = line; + line = TQString::null; + } + randomFaces.push_back( icon ); + TQStringList list = TQStringList::split( ' ', line ); + for ( TQStringList::ConstIterator it = list.begin(); it != list.end(); ++it ) + randomFacesMap[*it] = icon; + } +} + class UserListViewItem : public KListViewItem { public: UserListViewItem( UserListView *parent, const TQString &text, @@ -164,6 +229,14 @@ class UserListViewItem : public KListViewItem { parent->cachedSizeHint.setWidth( -1 ); } + virtual void paintCell(TQPainter *p, const TQColorGroup &cg, int column, int width, int alignment) + { + if (((UserListView*)listView())->themed) + TQListViewItem::paintCell(p, cg, column, width, alignment); + else + KListViewItem::paintCell(p, cg, column, width, alignment); + } + TQString login; }; @@ -232,10 +305,23 @@ KGreeter::insertUser( const TQImage &default_pix, TQSize ns( 48, 48 ); if (p.size() != ns) p = p.convertDepth( 32 ).smoothScale( ns, TQImage::ScaleMin ); - goto gotit; + break; } while (--nd >= 0); - p = default_pix; - gotit: + + if ( p.isNull() && randomFaces.count() ) { + TQString randomFace = randomFacesMap[username]; + if ( randomFace.isNull() ) { + TQStringList::size_type index = 0; + for ( size_t i = 0; i < username.length(); ++i ) + index += ( 0x7f - username.at( i ).latin1() ) % 37; + randomFace = randomFaces[ index % randomFaces.count() ]; + } + p.load( _faceDir + "/../pics/users/" + randomFace + ".png" ); + } + + if ( p.isNull() ) + p = default_pix; + TQString realname = KStringHandler::from8Bit( ps->pw_gecos ); realname.truncate( realname.find( ',' ) ); if (realname.isEmpty() || realname == username) @@ -289,7 +375,7 @@ UserList::UserList( char **in ) } void -KGreeter::insertUsers() +KGreeter::insertUsers(int limit_users) { struct passwd *ps; @@ -309,6 +395,8 @@ KGreeter::insertUsers() if (_showUsers == SHOW_ALL) { UserList noUsers( _noUsers ); TQDict dupes( 1000 ); + TQStringList toinsert; + int count = 0; for (setpwent(); (ps = getpwent()) != 0;) { if (*ps->pw_dir && *ps->pw_shell && (ps->pw_uid >= (unsigned)_lowUserId || @@ -320,10 +408,53 @@ KGreeter::insertUsers() TQString username( TQFile::decodeName( ps->pw_name ) ); if (!dupes.find( username )) { dupes.insert( username, (int *)-1 ); - insertUser( default_pix, username, ps ); + toinsert.append( username ); + + if ( limit_users >= 0 && ++count > limit_users ) + break; } } } + if ( limit_users >= 0 && ++count > limit_users ) { + utmpname( _PATH_WTMP ); + setutxent(); + toinsert = TQStringList(); + dupes.clear(); + + for ( count = 0; count < limit_users; ) { + struct utmpx * ent = getutxent(); + if ( !ent ) + break; + struct passwd *ps = getpwnam( ent->ut_user ); + if (ps && *ps->pw_dir && *ps->pw_shell && + (ps->pw_uid >= (unsigned)_lowUserId || + !ps->pw_uid && _showRoot) && + ps->pw_uid <= (unsigned)_highUserId && + !noUsers.hasUser( ps->pw_name ) && + !noUsers.hasGroup( ps->pw_gid )) + { + TQString username( TQFile::decodeName( ent->ut_user ) ); + if (!dupes.find( username )) { + dupes.insert( username, (int *)-1 ); + toinsert.append( username ); + count++; + } + } + + + } + endutxent(); + } + + for ( TQStringList::ConstIterator it = toinsert.begin(); + it != toinsert.end(); ++it ) + { + // pretty stupid to do another lookup round, but the number is limited + // and caching struct passwd is pretty ugly + struct passwd *ps = getpwnam( TQFile::encodeName( *it ) ); + if ( ps ) + insertUser( default_pix, *it, ps ); + } } else { UserList users( _users ); if (users.hasGroups()) { @@ -379,7 +510,7 @@ KGreeter::insertSessions() for (char **dit = _sessionsDirs; *dit; ++dit) { TQStringList ents = TQDir( *dit ).entryList(); for (TQStringList::ConstIterator it = ents.begin(); it != ents.end(); ++it) - if ((*it).endsWith( ".desktop" )) { + if ((*it).endsWith( ".desktop" ) && !(*it).endsWith("admin.desktop")) { KSimpleConfig dsk( TQString( *dit ).append( '/' ).append( *it ) ); dsk.setGroup( "Desktop Entry" ); putSession( (*it).left( (*it).length() - 8 ), @@ -517,6 +648,17 @@ KGreeter::slotLoadPrevWM() return; } } else { + if (!strcmp(sess, "admin")) { + // need to get the original + GSendInt( G_GetDmrc); + GSendStr( "OrigSession"); + sess = GRecvStr(); + if (!sess) { + free(sess); + sess = strdup("default"); + } + } + for (uint i = 0; i < sessionTypes.count() && !sessionTypes[i].hid; i++) if (sessionTypes[i].type == sess) { free( sess ); @@ -718,21 +860,24 @@ KStdGreeter::KStdGreeter() hbox2->addStretch( 1 ); if (sessMenu->count() > 1) { - inserten( i18n("Session &Type"), ALT+Key_T, sessMenu ); + inserten( i18n("Session &Type"), 0, sessMenu ); needSep = true; } if (plugMenu) { - inserten( i18n("&Authentication Method"), ALT+Key_A, plugMenu ); + inserten( i18n("&Authentication Method"), 0, plugMenu ); needSep = true; } #ifdef XDMCP - completeMenu( LOGIN_LOCAL_ONLY, ex_choose, i18n("&Remote Login"), ALT+Key_R ); + completeMenu( LOGIN_LOCAL_ONLY, ex_choose, i18n("&Remote Login"), 0 ); #else completeMenu(); #endif + if (userView || userList) + insertUsers(); + if (optMenu) menuButton->setPopup( optMenu ); else @@ -826,6 +971,9 @@ KThemedGreeter::KThemedGreeter() if (xauth_warning && (_authorized || !_authComplain)) xauth_warning->hide( true ); + if (userView || userList) + insertUsers( 7 ); // TODO: find out how many are a good value + // if (!_greetString.isEmpty()) { // } // clock = new KdmClock( this, "clock" ); @@ -851,12 +999,8 @@ KThemedGreeter::KThemedGreeter() if ((itm = themer->findNode( "session_button" ))) { if (sessMenu->count() <= 1) itm->hide( true ); - else { + else session_button = itm; - TQAccel *accel = new TQAccel( this ); - accel->insertItem( ALT+Key_T, 0 ); - connect( accel, TQT_SIGNAL(activated( int )), TQT_SLOT(slotSessMenu()) ); - } } else { if (sessMenu->count() > 1) { inserten( i18n("Session &Type"), ALT+Key_T, sessMenu ); @@ -864,6 +1008,12 @@ KThemedGreeter::KThemedGreeter() } } + admin_button = themer->findNode( "admin_button"); + if ( admin_button ) { + if ( !_useAdminSession ) + admin_button->hide( true ); + } + if (plugMenu) { inserten( i18n("&Authentication Method"), ALT+Key_A, plugMenu ); needSep = true; @@ -899,8 +1049,8 @@ KThemedGreeter::pluginSetup() inherited::pluginSetup(); if (userView && verify->entitiesLocal() && verify->entityPresettable() && userlist_rect) { + userView->setMaximumHeight( userView->sumHeight() ); userlist_rect->setWidget( userView ); - userView->show(); } else { if (userView) userView->hide(); @@ -916,12 +1066,17 @@ KThemedGreeter::verifyFailed() { // goButton->setEnabled( false ); inherited::verifyFailed(); + if (userView) + userView->setEnabled(false); } void KThemedGreeter::verifyRetry() { // goButton->setEnabled( true ); + if (userView) + userView->setEnabled(true); + } TQString KThemedGreeter::timedUser = TQString::null; @@ -966,6 +1121,8 @@ KThemedGreeter::slotThemeActivated( const TQString &id ) slotSessMenu(); else if (id == "system_button") slotActionMenu(); + else if (id == "admin_button") + slotAskAdminPassword(); } void @@ -992,4 +1149,15 @@ KThemedGreeter::keyPressEvent( TQKeyEvent *e ) accept(); } +void +KThemedGreeter::slotAskAdminPassword() +{ + KDMAdmin k(curUser, this); + if (k.exec()) { + GSendInt(G_Ready); + hide(); + done(ex_exit); + } +} + #include "kgreeter.moc" diff --git a/kdm/kfrontend/kgreeter.h b/kdm/kfrontend/kgreeter.h index 61673badf..fdbd56209 100644 --- a/kdm/kfrontend/kgreeter.h +++ b/kdm/kfrontend/kgreeter.h @@ -73,9 +73,10 @@ class KGreeter : public KGDialog, public KGVerifyHandler { void slotUserEntered(); protected: + void readFacesList(); void installUserList(); void insertUser( const TQImage &, const TQString &, struct passwd * ); - void insertUsers(); + void insertUsers( int limit = -1); void putSession( const TQString &, const TQString &, bool, const char * ); void insertSessions(); virtual void pluginSetup(); @@ -87,10 +88,13 @@ class KGreeter : public KGDialog, public KGVerifyHandler { TQStringList *userList; TQPopupMenu *sessMenu; TQValueVector sessionTypes; + TQStringList randomFaces; + TQMap randomFacesMap; int nNormals, nSpecials; int curPrev, curSel; bool prevValid; bool needLoad; + bool themed; static int curPlugin; static PluginList pluginList; @@ -142,6 +146,7 @@ class KThemedGreeter : public KGreeter { void slotThemeActivated( const TQString &id ); void slotSessMenu(); void slotActionMenu(); + void slotAskAdminPassword(); protected: virtual void updateStatus( bool fail, bool caps, int timedleft ); @@ -154,7 +159,7 @@ class KThemedGreeter : public KGreeter { KdmThemer *themer; KdmItem *caps_warning, *xauth_warning, *pam_error, *timed_label, *console_rect, *userlist_rect, - *session_button, *system_button; + *session_button, *system_button, *admin_button; public: // from KGVerifyHandler virtual void verifyFailed(); diff --git a/kdm/kfrontend/sessions/Makefile.am b/kdm/kfrontend/sessions/Makefile.am index 14577ac42..71655c9a4 100644 --- a/kdm/kfrontend/sessions/Makefile.am +++ b/kdm/kfrontend/sessions/Makefile.am @@ -1,6 +1,6 @@ sessionsdir = $(kde_datadir)/kdm/sessions sessions_DATA = \ - kde.desktop gnome.desktop \ + admin.desktop kde.desktop gnome.desktop \ 9wm.desktop \ aewm++.desktop \ aewm.desktop \ diff --git a/kdm/kfrontend/sessions/admin.desktop b/kdm/kfrontend/sessions/admin.desktop new file mode 100644 index 000000000..73e6ae3bf --- /dev/null +++ b/kdm/kfrontend/sessions/admin.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Encoding=UTF-8 +Type=XSession +Exec=YaSTadminSession +TryExec=YaSTadminSession +Name=admin +Comment=Yast Admin Session diff --git a/kdm/kfrontend/themer/kdmitem.cpp b/kdm/kfrontend/themer/kdmitem.cpp index 38af9d0aa..d47c0242d 100644 --- a/kdm/kfrontend/themer/kdmitem.cpp +++ b/kdm/kfrontend/themer/kdmitem.cpp @@ -23,10 +23,11 @@ * Generic Kdm Item */ -//#define DRAW_OUTLINE 1 // for debugging only +// #define DRAW_OUTLINE 1 // for debugging only #include "kdmitem.h" #include "kdmlayout.h" +#include "kdmconfig.h" #include #include @@ -35,9 +36,7 @@ #include #include #include -#ifdef DRAW_OUTLINE -# include -#endif +#include KdmItem::KdmItem( KdmItem *parent, const TQDomNode &node, const char *name ) : TQObject( parent, name ) @@ -47,6 +46,25 @@ KdmItem::KdmItem( KdmItem *parent, const TQDomNode &node, const char *name ) , myWidget( 0 ) , myLayoutItem( 0 ) , buttonParent( 0 ) +{ + init(node, name); +} + + +KdmItem::KdmItem( TQWidget *parent, const TQDomNode &node, const char *name ) + : TQObject( parent, name ) + , boxManager( 0 ) + , fixedManager( 0 ) + , image( 0 ) + , myWidget( 0 ) + , myLayoutItem( 0 ) + , buttonParent( 0 ) +{ + init(node, name); +} + +void +KdmItem::init( const TQDomNode &node, const char * ) { // Set default layout for every item currentManager = MNone; @@ -62,7 +80,7 @@ KdmItem::KdmItem( KdmItem *parent, const TQDomNode &node, const char *name ) state = Snormal; // The "toplevel" node (the screen) is really just like a fixed node - if (!parent || !parent->inherits( "KdmItem" )) { + if (!parent() || !parent()->inherits( "KdmItem" )) { setFixedLayout(); return; } @@ -87,7 +105,7 @@ KdmItem::KdmItem( KdmItem *parent, const TQDomNode &node, const char *name ) id = tnode.toElement().attribute( "id", TQString::number( (ulong)this, 16 ) ); // Tell 'parent' to add 'me' to its children - KdmItem *parentItem = static_cast( parent ); + KdmItem *parentItem = static_cast( parent() ); parentItem->addChildItem( this ); } @@ -195,7 +213,7 @@ KdmItem::setWidget( TQWidget *widget ) if (frame) frame->setFrameStyle( TQFrame::NoFrame ); - myWidget->setGeometry(area); + setGeometry(area, true); connect( myWidget, TQT_SIGNAL(destroyed()), TQT_SLOT(widgetGone()) ); } @@ -236,15 +254,21 @@ KdmItem::setGeometry( const TQRect &newGeometry, bool force ) area = newGeometry; - if (myWidget) - myWidget->setGeometry( newGeometry ); + if (myWidget) { + TQRect widGeo = newGeometry; + if ( widGeo.height() > myWidget->maximumHeight() ) { + widGeo.moveTop( widGeo.top() + ( widGeo.height() - myWidget->maximumHeight() ) / 2 ); + widGeo.setHeight( myWidget->maximumHeight() ); + } + myWidget->setGeometry( widGeo ); + } if (myLayoutItem) myLayoutItem->setGeometry( newGeometry ); // recurr to all boxed children if (boxManager && !boxManager->isEmpty()) boxManager->update( newGeometry, force ); - + // recurr to all fixed children if (fixedManager && !fixedManager->isEmpty()) fixedManager->update( newGeometry, force ); @@ -258,8 +282,16 @@ KdmItem::paint( TQPainter *p, const TQRect &rect ) if (isHidden()) return; - if (myWidget || (myLayoutItem && myLayoutItem->widget())) - return; + if (myWidget || (myLayoutItem && myLayoutItem->widget())) { + // KListView because it's missing a Q_OBJECT + if ( myWidget && myWidget->isA( "KListView" ) ) { + TQPixmap copy( myWidget->size() ); + kdDebug() << myWidget->geometry() << " " << area << " " << myWidget->size() << endl; + bitBlt( ©, TQPoint( 0, 0), p->device(), myWidget->geometry(), Qt::CopyROP ); + myWidget->setPaletteBackgroundPixmap( copy ); + } + return; + } if (area.intersects( rect )) { TQRect contentsRect = area.intersect( rect ); @@ -280,6 +312,8 @@ KdmItem::paint( TQPainter *p, const TQRect &rect ) TQValueList::Iterator it; for (it = m_children.begin(); it != m_children.end(); ++it) (*it)->paint( p, rect ); + + } KdmItem *KdmItem::currentActive = 0; @@ -287,8 +321,11 @@ KdmItem *KdmItem::currentActive = 0; void KdmItem::mouseEvent( int x, int y, bool pressed, bool released ) { + if (isShown == ExplicitlyHidden) + return; + if (buttonParent && buttonParent != this) { - buttonParent->mouseEvent( x, y, pressed, released ); + buttonParent->mouseEvent( x, y, pressed, released ); return; } @@ -362,7 +399,8 @@ KdmItem::placementHint( const TQRect &parentRect ) w = parentRect.width(), h = parentRect.height(); - kdDebug() << "KdmItem::placementHint parentRect=" << id << parentRect << " hintedSize=" << hintedSize << endl; + kdDebug() << timestamp() << " KdmItem::placementHint parentRect=" << parentRect << " hintedSize=" << hintedSize << endl; + // check if width or height are set to "box" if (pos.wType == DTbox || pos.hType == DTbox) { if (myLayoutItem || myWidget) @@ -372,7 +410,7 @@ KdmItem::placementHint( const TQRect &parentRect ) return parentRect; boxHint = boxManager->sizeHint(); } - kdDebug() << " => boxHint " << boxHint << endl; + kdDebug() << timestamp() << " boxHint " << boxHint << endl; } if (pos.xType == DTpixel) @@ -380,25 +418,25 @@ KdmItem::placementHint( const TQRect &parentRect ) else if (pos.xType == DTnpixel) x = parentRect.right() - pos.x; else if (pos.xType == DTpercent) - x += int( parentRect.width() / 100.0 * pos.x ); + x += qRound( parentRect.width() / 100.0 * pos.x ); if (pos.yType == DTpixel) y += pos.y; else if (pos.yType == DTnpixel) y = parentRect.bottom() - pos.y; else if (pos.yType == DTpercent) - y += int( parentRect.height() / 100.0 * pos.y ); + y += qRound( parentRect.height() / 100.0 * pos.y ); if (pos.wType == DTpixel) w = pos.width; else if (pos.wType == DTnpixel) w -= pos.width; else if (pos.wType == DTpercent) - w = int( parentRect.width() / 100.0 * pos.width ); + w = qRound( parentRect.width() / 100.0 * pos.width ); else if (pos.wType == DTbox) w = boxHint.width(); else if (hintedSize.width() > 0) - w = hintedSize.width(); + w = hintedSize.width(); else w = 0; @@ -407,14 +445,22 @@ KdmItem::placementHint( const TQRect &parentRect ) else if (pos.hType == DTnpixel) h -= pos.height; else if (pos.hType == DTpercent) - h = int( parentRect.height() / 100.0 * pos.height ); + h = qRound( parentRect.height() / 100.0 * pos.height ); else if (pos.hType == DTbox) h = boxHint.height(); - else if (hintedSize.height() > 0) - h = hintedSize.height(); - else + else if (hintedSize.height() > 0) { + if (w && pos.wType != DTnone) + h = (hintedSize.height() * w) / hintedSize.width(); + else + h = hintedSize.height(); + } else h = 0; + // we choose to take the hinted size, but it's better to listen to the aspect ratio + if (pos.wType == DTnone && pos.hType != DTnone && h && w) { + w = qRound(float(hintedSize.width() * h) / hintedSize.height()); + } + // defaults to center int dx = -w / 2, dy = -h / 2; @@ -430,7 +476,7 @@ KdmItem::placementHint( const TQRect &parentRect ) dx = -w; } // KdmItem *p = static_cast( parent() ); - kdDebug() << "KdmItem::placementHint " << id << " x=" << x << " dx=" << dx << " w=" << w << " y=" << y << " dy=" << dy << " h=" << h << " " << parentRect << endl; + kdDebug() << timestamp() << " placementHint " << this << " x=" << x << " dx=" << dx << " w=" << w << " y=" << y << " dy=" << dy << " h=" << h << " " << parentRect << endl; y += dy; x += dx; @@ -529,4 +575,17 @@ KdmItem::setFixedLayout( const TQDomNode &node ) currentManager = MFixed; } +TQWidget * +KdmItem::parentWidget() const +{ + if (myWidget) + return myWidget; + if (!this->parent()) + return 0; + + if (parent()->qt_cast("TQWidget")) + return (TQWidget*)parent(); + return ((KdmItem*)parent())->parentWidget(); +} + #include "kdmitem.moc" diff --git a/kdm/kfrontend/themer/kdmitem.h b/kdm/kfrontend/themer/kdmitem.h index 6a73c889f..98b876977 100644 --- a/kdm/kfrontend/themer/kdmitem.h +++ b/kdm/kfrontend/themer/kdmitem.h @@ -90,6 +90,8 @@ public: * Item constructor and destructor */ KdmItem( KdmItem *parent, const TQDomNode &node = TQDomNode(), const char *name = 0 ); + KdmItem( TQWidget *parent, const TQDomNode &node = TQDomNode(), const char *name = 0 ); // for the root + virtual ~KdmItem(); /** @@ -151,6 +153,7 @@ public: KdmItem *findNode( const TQString &id ) const; virtual void setWidget( TQWidget *widget ); + TQWidget *widget() const { return myWidget; } virtual void setLayoutItem( TQLayoutItem *item ); virtual void hide( bool force = false ); @@ -160,6 +163,9 @@ public: bool isExplicitlyHidden() const { return isShown == ExplicitlyHidden; } TQRect rect() const { return area; } + TQWidget *parentWidget() const; + TQString getId() const { return id; } + signals: void needUpdate( int x, int y, int w, int h ); void activated( const TQString &id ); @@ -237,6 +243,7 @@ protected: void parseColor( const TQString &, TQColor & ); void inheritFromButton( KdmItem *button ); + void init( const TQDomNode &node = TQDomNode(), const char *name = 0 ); TQString itemType, id; TQValueList m_children; diff --git a/kdm/kfrontend/themer/kdmlabel.cpp b/kdm/kfrontend/themer/kdmlabel.cpp index 297b7cc48..e83ae9dc7 100644 --- a/kdm/kfrontend/themer/kdmlabel.cpp +++ b/kdm/kfrontend/themer/kdmlabel.cpp @@ -19,8 +19,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include #include "kdmlabel.h" -#include +#include "kdmconfig.h" +#include "../kgreeter.h" #include #include @@ -31,6 +33,7 @@ #include #include #include +#include #include #include @@ -39,7 +42,7 @@ #endif KdmLabel::KdmLabel( KdmItem *parent, const TQDomNode &node, const char *name ) - : KdmItem( parent, node, name ) + : KdmItem( parent, node, name ), myAccel(0) { itemType = "label"; @@ -92,21 +95,46 @@ KdmLabel::KdmLabel( KdmItem *parent, const TQDomNode &node, const char *name ) } } - // Check if this is a timer label + // Check if this is a timer label) label.isTimer = label.text.find( "%c" ) >= 0; if (label.isTimer) { timer = new TQTimer( this ); timer->start( 1000 ); connect( timer, TQT_SIGNAL(timeout()), TQT_SLOT(update()) ); } - cText = lookupText( label.text ); + setTextInt( lookupText( label.text ) ); +} + +void +KdmLabel::setTextInt( const TQString &txt) +{ + // TODO: catch && + cText = txt; + cAccel = txt.find('&'); + delete myAccel; + myAccel = 0; + if (cAccel != -1) { + cText.remove('&'); + myAccel = new TQAccel(parentWidget()); + myAccel->insertItem(ALT + UNICODE_ACCEL + cText.at(cAccel).lower().unicode()); + connect(myAccel, TQT_SIGNAL(activated(int)), TQT_SLOT(slotAccel())); + } +} + +void +KdmLabel::slotAccel() +{ + if (buttonParent) + emit activated(buttonParent->getId()); + else + emit activated(id); } void KdmLabel::setText( const TQString &txt ) { label.text = txt; - update(); + setTextInt( lookupText( label.text ) ); } QSize @@ -139,7 +167,23 @@ KdmLabel::drawContents( TQPainter *p, const TQRect &/*r*/ ) p->setFont( l->font ); p->setPen( l->color ); //TODO paint clipped (tested but not working..) - p->drawText( area, AlignLeft | SingleLine, cText ); + if (cAccel != -1 && (!id.isEmpty() || buttonParent) ) { + TQString left = cText.left(cAccel); + TQString right = cText.mid(cAccel + 1); + p->drawText( area, AlignLeft | SingleLine, left ); + TQRect tarea = area; + TQFontMetrics fm(l->font); + tarea.rLeft() += fm.width(left); + TQFont f(l->font); + f.setUnderline(true); + p->setFont ( f ); + p->drawText( tarea, AlignLeft | SingleLine, TQString(cText.at(cAccel))); + tarea.rLeft() += fm.width(cText.at(cAccel)); + p->setFont( l->font ); + p->drawText( tarea, AlignLeft | SingleLine, right); + } else { + p->drawText( area, AlignLeft | SingleLine, cText); + } } void @@ -159,7 +203,7 @@ KdmLabel::update() { TQString text = lookupText( label.text ); if (text != cText) { - cText = text; + setTextInt(text); needUpdate(); } } @@ -170,18 +214,20 @@ static const struct { { "language", I18N_NOOP("Language") }, { "session", I18N_NOOP("Session Type") }, { "system", I18N_NOOP("Menu") }, // i18n("Actions"); + { "admin", I18N_NOOP("&Administration") }, { "disconnect", I18N_NOOP("Disconnect") }, { "quit", I18N_NOOP("Quit") }, - { "halt", I18N_NOOP("Power off") }, + { "halt", I18N_NOOP("Power Off") }, { "suspend", I18N_NOOP("Suspend") }, { "reboot", I18N_NOOP("Reboot") }, { "chooser", I18N_NOOP("XDMCP Chooser") }, { "config", I18N_NOOP("Configure") }, - { "caps-lock-warning", I18N_NOOP("You have got caps lock on.") }, + { "caps-lock-warning", I18N_NOOP("Caps Lock is enabled.") }, { "timed-label", I18N_NOOP("User %s will login in %d seconds") }, { "welcome-label", I18N_NOOP("Welcome to %h") }, // _greetString { "username-label", I18N_NOOP("Username:") }, { "password-label", I18N_NOOP("Password:") }, + { "domain-label", I18N_NOOP("Domain:") }, { "login", I18N_NOOP("Login") } }; @@ -195,7 +241,7 @@ KdmLabel::lookupStock( const TQString &stock ) if (type == stocks[i].type) return i18n(stocks[i].text); - kdDebug() << "Invalid element. Check your theme!" << endl; + kdDebug() << timestamp() << " Invalid element. Check your theme!" << endl; return stock; } @@ -205,7 +251,6 @@ KdmLabel::lookupText( const TQString &t ) TQString text = t; text.replace( '_', '&' ); -// text.remove( '_' ); // FIXME add key accels, remove underscores for now TQMap m; struct utsname uts; diff --git a/kdm/kfrontend/themer/kdmlabel.h b/kdm/kfrontend/themer/kdmlabel.h index 0770259c0..1ec2f88ec 100644 --- a/kdm/kfrontend/themer/kdmlabel.h +++ b/kdm/kfrontend/themer/kdmlabel.h @@ -50,6 +50,7 @@ protected: // handle switching between normal / active / prelight configurations virtual void statusChanged(); +public: struct LabelStruct { TQString text; bool isTimer; @@ -67,6 +68,7 @@ protected: public slots: void update(); + void slotAccel(); private: /* Method to lookup the caption associated with an item */ @@ -76,6 +78,10 @@ private: TQString lookupText( const TQString &t ); TQString cText; + int cAccel; + TQAccel *myAccel; + + void setTextInt(const TQString &); }; #endif diff --git a/kdm/kfrontend/themer/kdmlayout.cpp b/kdm/kfrontend/themer/kdmlayout.cpp index 00ca693ae..b17d2e7b7 100644 --- a/kdm/kfrontend/themer/kdmlayout.cpp +++ b/kdm/kfrontend/themer/kdmlayout.cpp @@ -20,6 +20,7 @@ */ #include "kdmlayout.h" +#include "kdmconfig.h" #include "kdmitem.h" #include @@ -35,11 +36,11 @@ KdmLayoutFixed::KdmLayoutFixed( const TQDomNode &/*node*/ ) void KdmLayoutFixed::update( const TQRect &parentGeometry, bool force ) { - kdDebug() << "KdmLayoutFixed::update " << parentGeometry << endl; + kdDebug() << timestamp() << " KdmLayoutFixed::update " << parentGeometry << endl; // I can't layout children if the parent rectangle is not valid if (parentGeometry.width() < 0 || parentGeometry.height() < 0) { - kdDebug() << "invalid\n"; + kdDebug() << timestamp() << " invalid\n"; return; } // For each child in list I ask their hinted size and set it! @@ -102,7 +103,7 @@ KdmLayoutBox::update( const TQRect &parentGeometry, bool force ) childrenRect.setTop( childrenRect.top() + height + box.spacing ); } else { TQRect temp( childrenRect.left(), childrenRect.top(), width, childrenRect.height() ); - kdDebug() << "placement " << *it << " " << temp << " " << (*it)->placementHint( temp ) << endl; + kdDebug() << timestamp() << " placement " << *it << " " << temp << " " << (*it)->placementHint( temp ) << endl; temp = (*it)->placementHint( temp ); (*it)->setGeometry( temp, force ); childrenRect.setLeft( childrenRect.left() + width + box.spacing ); @@ -125,7 +126,7 @@ KdmLayoutBox::update( const TQRect &parentGeometry, bool force ) kdDebug() << this << " placementHint " << *it << " " << temp << " " << itemRect << endl; temp.setWidth( itemRect.width() ); childrenRect.setLeft( childrenRect.left() + itemRect.size().width() + box.spacing ); - kdDebug() << "childrenRect after " << *it << " " << childrenRect << endl; + kdDebug() << timestamp() << " childrenRect after " << *it << " " << childrenRect << endl; } itemRect = (*it)->placementHint( temp ); kdDebug() << this << " placementHint2 " << *it << " " << temp << " " << itemRect << endl; diff --git a/kdm/kfrontend/themer/kdmpixmap.cpp b/kdm/kfrontend/themer/kdmpixmap.cpp index 07077e4a1..f18194f53 100644 --- a/kdm/kfrontend/themer/kdmpixmap.cpp +++ b/kdm/kfrontend/themer/kdmpixmap.cpp @@ -22,6 +22,7 @@ #include #include "kdmpixmap.h" +#include #include #ifdef HAVE_LIBART @@ -29,6 +30,7 @@ #endif #include +#include #include #include @@ -58,21 +60,28 @@ KdmPixmap::KdmPixmap( KdmItem *parent, const TQDomNode &node, const char *name ) TQString tagName = el.tagName(); if (tagName == "normal") { - loadPixmap( el.attribute( "file", "" ), pixmap.normal.pixmap, pixmap.normal.fullpath ); + pixmap.normal.fullpath = fullPath( el.attribute( "file", "" ) ); parseColor( el.attribute( "tint", "#ffffff" ), pixmap.normal.tint ); pixmap.normal.alpha = el.attribute( "alpha", "1.0" ).toFloat(); } else if (tagName == "active") { pixmap.active.present = true; - loadPixmap( el.attribute( "file", "" ), pixmap.active.pixmap, pixmap.active.fullpath ); + pixmap.active.fullpath = fullPath( el.attribute( "file", "" ) ); parseColor( el.attribute( "tint", "#ffffff" ), pixmap.active.tint ); pixmap.active.alpha = el.attribute( "alpha", "1.0" ).toFloat(); } else if (tagName == "prelight") { pixmap.prelight.present = true; - loadPixmap( el.attribute( "file", "" ), pixmap.prelight.pixmap, pixmap.prelight.fullpath ); + pixmap.prelight.fullpath = fullPath(el.attribute( "file", "" ) ); parseColor( el.attribute( "tint", "#ffffff" ), pixmap.prelight.tint ); pixmap.prelight.alpha = el.attribute( "alpha", "1.0" ).toFloat(); } } + + // look if we have to have the aspect ratio ready + if (((pos.wType == DTnone && pos.hType != DTnone) || + (pos.wType != DTnone && pos.hType == DTnone) || + (pos.wType == DTnone && pos.hType == DTnone)) && + !pixmap.normal.fullpath.endsWith( ".svg" )) + loadPixmap( &pixmap.normal ); } QSize @@ -100,19 +109,16 @@ KdmPixmap::setGeometry( const TQRect &newGeometry, bool force ) } -void -KdmPixmap::loadPixmap( const TQString &fileName, TQPixmap &map, TQString &fullName ) +TQString +KdmPixmap::fullPath( const TQString &fileName) { - if (fileName.isEmpty()) - return; + if (fileName.isEmpty()) + return TQString::null; - fullName = fileName; + TQString fullName = fileName; if (fullName.at( 0 ) != '/') fullName = baseDir() + "/" + fileName; - - if (!fullName.endsWith( ".svg" )) // we delay it for svgs - if (!map.load( fullName )) - fullName = TQString::null; + return fullName; } void @@ -139,6 +145,25 @@ KdmPixmap::renderSvg( PixmapStruct::PixmapClass *pClass, const TQRect &area ) #endif } +void +KdmPixmap::loadPixmap( PixmapStruct::PixmapClass *pClass ) +{ + TQString fullpath = pClass->fullpath; + + kdDebug() << timestamp() << " load " << fullpath << endl; + int index = fullpath.findRev('.'); + TQString ext = fullpath.right(fullpath.length() - index); + fullpath = fullpath.left(index); + kdDebug() << timestamp() << " ext " << ext << " " << fullpath << endl; + TQString testpath = TQString("-%1x%2").arg(area.width()).arg(area.height()) + ext; + kdDebug() << timestamp() << " testing for " << fullpath + testpath << endl; + if (KStandardDirs::exists(fullpath + testpath)) + pClass->pixmap.load(fullpath + testpath); + else + pClass->pixmap.load( fullpath + ext ); + kdDebug() << timestamp() << " done\n"; +} + void KdmPixmap::drawContents( TQPainter *p, const TQRect &r ) { @@ -149,12 +174,20 @@ KdmPixmap::drawContents( TQPainter *p, const TQRect &r ) if (state == Sprelight && pixmap.prelight.present) pClass = &pixmap.prelight; + kdDebug() << "draw " << id << " " << pClass->pixmap.isNull() << endl; + if (pClass->pixmap.isNull()) { - if (pClass->fullpath.isEmpty()) // if neither is set, we're empty + + if (pClass->fullpath.isEmpty()) // if neither is set, we're empty return; - - kdDebug() << "renderSVG\n"; - renderSvg( pClass, area ); + + if (!pClass->fullpath.endsWith( ".svg" ) ) { + loadPixmap(pClass); + } else { + kdDebug() << timestamp() << " renderSVG\n"; + renderSvg( pClass, area ); + kdDebug() << timestamp() << " done\n"; + } } int px = area.left() + r.left(); @@ -176,25 +209,37 @@ KdmPixmap::drawContents( TQPainter *p, const TQRect &r ) if (pClass->readyPixmap.isNull()) { - TQImage scaledImage; + + bool haveTint = pClass->tint.rgb() != 0xFFFFFF; + bool haveAlpha = pClass->alpha < 1.0; + TQImage scaledImage; + // use the loaded pixmap or a scaled version if needed + kdDebug() << timestamp() << " prepare readyPixmap " << pClass->fullpath << " " << area.size() << " " << pClass->pixmap.size() << endl; if (area.size() != pClass->pixmap.size()) { if (pClass->fullpath.endsWith( ".svg" )) { - kdDebug() << "renderSVG\n"; + kdDebug() << timestamp() << " renderSVG\n"; renderSvg( pClass, area ); scaledImage = pClass->pixmap.convertToImage(); } else { - kdDebug() << "convertFromImage\n"; + kdDebug() << timestamp() << " convertFromImage smoothscale\n"; TQImage tempImage = pClass->pixmap.convertToImage(); + kdDebug() << timestamp() << " convertToImage done\n"; scaledImage = tempImage.smoothScale( area.width(), area.height() ); + kdDebug() << timestamp() << " done\n"; } - } else + } else { + if (haveTint || haveAlpha) + { scaledImage = pClass->pixmap.convertToImage(); - - bool haveTint = pClass->tint.rgb() != 0xFFFFFF; - bool haveAlpha = pClass->alpha < 1.0; + // enforce rgba values for the later + scaledImage = scaledImage.convertDepth( 32 ); + } + else + pClass->readyPixmap = pClass->pixmap; + } if (haveTint || haveAlpha) { // blend image(pix) with the given tint @@ -221,9 +266,12 @@ KdmPixmap::drawContents( TQPainter *p, const TQRect &r ) } - pClass->readyPixmap.convertFromImage( scaledImage ); + if (!scaledImage.isNull()) { + kdDebug() << timestamp() << " convertFromImage " << id << " " << area << endl; + pClass->readyPixmap.convertFromImage( scaledImage ); + } } - // kdDebug() << "Pixmap::drawContents " << pClass->readyPixmap.size() << " " << px << " " << py << " " << sx << " " << sy << " " << sw << " " << sh << endl; + kdDebug() << timestamp() << " Pixmap::drawContents " << pClass->readyPixmap.size() << " " << px << " " << py << " " << sx << " " << sy << " " << sw << " " << sh << endl; p->drawPixmap( px, py, pClass->readyPixmap, sx, sy, sw, sh ); } diff --git a/kdm/kfrontend/themer/kdmpixmap.h b/kdm/kfrontend/themer/kdmpixmap.h index 479ef0f8d..92d4895d0 100644 --- a/kdm/kfrontend/themer/kdmpixmap.h +++ b/kdm/kfrontend/themer/kdmpixmap.h @@ -61,9 +61,10 @@ protected: } pixmap; private: - // Method to load the pixmap given by the theme - void loadPixmap( const TQString &fileName, TQPixmap &p, TQString &path ); + // Method to load the pixmap path given by the theme + TQString fullPath( const TQString &fileName ); void renderSvg( PixmapStruct::PixmapClass *pClass, const TQRect &area ); + void loadPixmap( PixmapStruct::PixmapClass *pClass ); }; #endif diff --git a/kdm/kfrontend/themer/kdmrect.cpp b/kdm/kfrontend/themer/kdmrect.cpp index 961809a37..1d854d213 100644 --- a/kdm/kfrontend/themer/kdmrect.cpp +++ b/kdm/kfrontend/themer/kdmrect.cpp @@ -32,6 +32,18 @@ KdmRect::KdmRect( KdmItem *parent, const TQDomNode &node, const char *name ) : KdmItem( parent, node, name ) +{ + init( node, name ); +} + +KdmRect::KdmRect( TQWidget *parent, const TQDomNode &node, const char *name ) + : KdmItem( parent, node, name ) +{ + init( node, name ); +} + +void +KdmRect::init( const TQDomNode &node, const char * ) { itemType = "rect"; @@ -136,13 +148,6 @@ KdmRect::recursiveSetAttribs( TQLayoutItem *li ) } } -void -KdmRect::setWidget( TQWidget *widget ) -{ - KdmItem::setWidget( widget ); - setAttribs( widget ); -} - void KdmRect::setLayoutItem( TQLayoutItem *item ) { @@ -151,4 +156,17 @@ KdmRect::setLayoutItem( TQLayoutItem *item ) } */ +void +KdmRect::setWidget( TQWidget *widget ) +{ + if ( rect.normal.color.isValid() && widget ) + { + TQPalette p = widget->palette(); + p.setColor( TQPalette::Normal, TQColorGroup::Text, rect.normal.color ); + widget->setPalette(p); + } + KdmItem::setWidget( widget ); + //setAttribs( widget ); +} + #include "kdmrect.moc" diff --git a/kdm/kfrontend/themer/kdmrect.h b/kdm/kfrontend/themer/kdmrect.h index 7e4776233..a505e1921 100644 --- a/kdm/kfrontend/themer/kdmrect.h +++ b/kdm/kfrontend/themer/kdmrect.h @@ -36,6 +36,7 @@ class KdmRect : public KdmItem { public: KdmRect( KdmItem *parent, const TQDomNode &node, const char *name = 0 ); + KdmRect( TQWidget *parent, const TQDomNode &node, const char *name = 0 ); protected: // draw the rect @@ -54,8 +55,9 @@ protected: bool hasBorder; } rect; -// virtual void setWidget( TQWidget *widget ); + virtual void setWidget( TQWidget *widget ); // virtual void setLayoutItem( TQLayoutItem *item ); + void init( const TQDomNode &node, const char *name ); private: void setAttribs( TQWidget *widget ); diff --git a/kdm/kfrontend/themer/kdmthemer.cpp b/kdm/kfrontend/themer/kdmthemer.cpp index aca43e45d..9e6db33db 100644 --- a/kdm/kfrontend/themer/kdmthemer.cpp +++ b/kdm/kfrontend/themer/kdmthemer.cpp @@ -36,11 +36,13 @@ #include #include -//#include // animation timer - TODO +#include // animation timer - TODO #include #include #include #include +#include +#include #include @@ -72,7 +74,8 @@ KdmThemer::KdmThemer( const TQString &_filename, const TQString &mode, TQWidget return; } // Set the root (screen) item - rootItem = new KdmRect( 0, TQDomNode(), "kdm root" ); + rootItem = new KdmRect( parent, TQDomNode(), "kdm root" ); + connect( rootItem, TQT_SIGNAL(needUpdate( int, int, int, int )), widget(), TQT_SLOT(update( int, int, int, int )) ); @@ -82,6 +85,9 @@ KdmThemer::KdmThemer( const TQString &_filename, const TQString &mode, TQWidget generateItems( rootItem ); connect( rootItem, TQT_SIGNAL(activated( const TQString & )), TQT_SIGNAL(activated( const TQString & )) ); + connect( rootItem, TQT_SIGNAL(activated( const TQString & )), TQT_SLOT(slotActivated( const TQString & )) ); + + TQTimer::singleShot(800, this, TQT_SLOT(slotPaintRoot())); /* *TODO* // Animation timer @@ -151,7 +157,7 @@ KdmThemer::widgetEvent( TQEvent *e ) case TQEvent::Paint: { TQRect paintRect = static_cast(e)->rect(); - kdDebug() << "paint on: " << paintRect << endl; + kdDebug() << timestamp() << " paint on: " << paintRect << endl; if (!backBuffer) backBuffer = new TQPixmap( widget()->size() ); @@ -195,7 +201,7 @@ KdmThemer::generateItems( KdmItem *parent, const TQDomNode &node ) // Get its tag, and check it's correct ("greeter") if (theme.tagName() != "greeter") { - kdDebug() << "This does not seem to be a correct theme file." << endl; + kdDebug() << timestamp() << " This does not seem to be a correct theme file." << endl; return; } // Get the list of child nodes @@ -214,6 +220,13 @@ KdmThemer::generateItems( KdmItem *parent, const TQDomNode &node ) if (tagName == "item") { if (!willDisplay( subnode )) continue; + TQString id = el.attribute("id"); + if (id.startsWith("plugin-specific-")) { + id = id.mid(strlen("plugin-specific-")); + if (!_pluginsLogin.contains(id)) + continue; + } + // It's a new item. Draw it TQString type = el.attribute( "type" ); @@ -225,13 +238,11 @@ KdmThemer::generateItems( KdmItem *parent, const TQDomNode &node ) newItem = new KdmPixmap( parent, subnode ); else if (type == "rect") newItem = new KdmRect( parent, subnode ); - else if (type == "entry") { + else if (type == "entry" || type == "list") { newItem = new KdmRect( parent, subnode ); newItem->setType( type ); } // newItem = new KdmEntry( parent, subnode ); - //else if (type=="list") - // newItem = new KdmList( parent, subnode ); else if (type == "svg") newItem = new KdmPixmap( parent, subnode ); if (newItem) { @@ -287,6 +298,11 @@ bool KdmThemer::willDisplay( const TQDomNode &node ) #endif if (type == "halt" || type == "reboot") return _allowShutdown != SHUT_NONE; + else if (type == "userlist") + return _userList; + else if ( type == "!userlist" ) + return !_userList; + // if (type == "system") // return true; @@ -301,7 +317,7 @@ KdmThemer::showStructure( TQObject *obj ) const TQObjectList *wlist = obj->children(); static int counter = 0; if (counter == 0) - kdDebug() << "\n\n<======= Widget tree =================" << endl; + kdDebug() << timestamp() << " \n\n<======= Widget tree =================" << endl; if (wlist) { counter++; TQObjectListIterator it( *wlist ); @@ -323,7 +339,46 @@ KdmThemer::showStructure( TQObject *obj ) counter--; } if (counter == 0) - kdDebug() << "\n\n<======= Widget tree =================\n\n" << endl; + kdDebug() << timestamp() << " \n\n<======= Widget tree =================\n\n" << endl; +} + +void +KdmThemer::slotActivated( const TQString &id ) +{ + TQString toactivate; + if (id == "username-label") + toactivate = "user-entry"; + else if (id == "password-label") + toactivate = "pw-entry"; + else + return; + + KdmItem *item = findNode(toactivate); + if (!item || !item->widget()) + return; + + item->widget()->setFocus(); + TQLineEdit *le = (TQLineEdit*)item->widget()->qt_cast("TQLineEdit"); + if (le) + le->selectAll(); +} + +void +KdmThemer::slotPaintRoot() +{ + KdmItem *back_item = findNode("background"); + if (!back_item) + return; + + TQRect screen = TQApplication::desktop()->screenGeometry(0); + TQPixmap pm(screen.size()); + + TQPainter painter( &pm, true ); + back_item->paint( &painter, back_item->rect()); + painter.end(); + + TQApplication::desktop()->screen()->setErasePixmap(pm); + TQApplication::desktop()->screen()->erase(); } #include "kdmthemer.moc" diff --git a/kdm/kfrontend/themer/kdmthemer.h b/kdm/kfrontend/themer/kdmthemer.h index 6bf6af00d..6dc2318dd 100644 --- a/kdm/kfrontend/themer/kdmthemer.h +++ b/kdm/kfrontend/themer/kdmthemer.h @@ -80,6 +80,10 @@ public: signals: void activated( const TQString &id ); +protected slots: + void slotActivated( const TQString &id ); + void slotPaintRoot(); + private: /* * Our display mode (e.g. console, remote, ...) diff --git a/kdmlib/Makefile.am b/kdmlib/Makefile.am index 91218a8c3..eedb681bc 100644 --- a/kdmlib/Makefile.am +++ b/kdmlib/Makefile.am @@ -1,11 +1,15 @@ AM_CPPFLAGS = -I$(top_srcdir)/kdm/kfrontend $(all_includes) -kde_module_LTLIBRARIES = kgreet_classic.la kgreet_winbind.la +kde_module_LTLIBRARIES = kgreet_classic.la kgreet_pam.la kgreet_winbind.la kgreet_classic_la_SOURCES = kgreet_classic.cpp kgreet_classic_la_LDFLAGS = -module -no-undefined $(KDE_PLUGIN) $(all_libraries) kgreet_classic_la_LIBADD = $(LIB_KDEUI) +kgreet_pam_la_SOURCES = kgreet_pam.cpp +kgreet_pam_la_LDFLAGS = -module -no-undefined $(KDE_PLUGIN) $(all_libraries) +kgreet_pam_la_LIBADD = $(LIB_KDEUI) + kgreet_winbind_la_SOURCES = kgreet_winbind.cpp kgreet_winbind_la_LDFLAGS = -module -no-undefined $(KDE_PLUGIN) $(all_libraries) kgreet_winbind_la_LIBADD = $(LIB_KDEUI) diff --git a/kdmlib/kgreet_pam.cpp b/kdmlib/kgreet_pam.cpp new file mode 100644 index 000000000..b43952488 --- /dev/null +++ b/kdmlib/kgreet_pam.cpp @@ -0,0 +1,668 @@ +/* + +Conversation widget for kdm greeter + +Copyright (C) 2008 Dirk Mueller + +based on classic kdm greeter: + + Copyright (C) 1997, 1998, 2000 Steffen Hansen + Copyright (C) 2000-2003 Oswald Buddenhagen + + +This program is free software; you can redistribute 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. + +*/ + +#include "kgreet_pam.h" +#include "themer/kdmthemer.h" +#include "themer/kdmlabel.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +//#define PAM_GREETER_DEBUG + +class KDMPasswordEdit : public KPasswordEdit { +public: + KDMPasswordEdit( TQWidget *parent ) : KPasswordEdit( parent, 0 ) {} + KDMPasswordEdit( KPasswordEdit::EchoModes echoMode, TQWidget *parent ) : KPasswordEdit( echoMode, parent, 0 ) {} +protected: + virtual void contextMenuEvent( TQContextMenuEvent * ) {} +}; + +static FILE* log; +static void debug(const char* fmt, ...) +{ + va_list lst; + va_start(lst, fmt); + +#ifdef PAM_GREETER_DEBUG +#if 0 + vfprintf(log, fmt, lst); + fflush(log); +#else + char buf[6000]; + sprintf(buf, "*** %s\n", fmt); + vsyslog(LOG_WARNING, buf, lst); +#endif +#endif + va_end(lst); +} + +static KPasswordEdit::EchoModes echoMode; + +KPamGreeter::KPamGreeter( KGreeterPluginHandler *_handler, + KdmThemer *themer, + TQWidget *parent, TQWidget *pred, + const TQString &_fixedEntity, + Function _func, Context _ctx ) : + TQObject(), + KGreeterPlugin( _handler ), + fixedUser( _fixedEntity ), + func( _func ), + ctx( _ctx ), + exp( -1 ), + pExp( -1 ), + running( false ) +{ + ctx = Login; + + debug("KPamGreeter constructed\n"); + + m_parentWidget = parent; + + KdmItem *user_entry = 0, *pw_entry = 0; + int line = 0; + + layoutItem = 0; + + if (themer && + (!(user_entry = themer->findNode( "user-entry" )) || + !(pw_entry = themer->findNode( "pw-entry" )))) + themer = 0; + + m_themer = themer; + + if (!themer) + layoutItem = new TQGridLayout( 0, 0, 10 ); + + loginLabel = 0; + authLabel.clear(); + authEdit.clear(); + loginLabel = 0; + loginEdit = 0; + if (ctx == ExUnlock || ctx == ExChangeTok) + fixedUser = KUser().loginName(); + if (func != ChAuthTok) { + debug("func != ChAuthTok\n"); + debug("fixedUser: *%s*\n", fixedUser.latin1()); + + if (fixedUser.isEmpty()) { + loginEdit = new KLineEdit( parent ); + loginEdit->setContextMenuEnabled( false ); + connect( loginEdit, TQT_SIGNAL(lostFocus()), TQT_SLOT(slotLoginLostFocus()) ); + connect( loginEdit, TQT_SIGNAL(lostFocus()), TQT_SLOT(slotActivity()) ); + connect( loginEdit, TQT_SIGNAL(textChanged( const TQString & )), TQT_SLOT(slotActivity()) ); + connect( loginEdit, TQT_SIGNAL(selectionChanged()), TQT_SLOT(slotActivity()) ); + if (pred) { + parent->setTabOrder( pred, loginEdit ); + pred = loginEdit; + } + if (!getLayoutItem()) { + loginEdit->adjustSize(); + user_entry->setWidget( loginEdit ); + } else { + loginLabel = new TQLabel( loginEdit, i18n("Username:"), parent ); + getLayoutItem()->addWidget( loginLabel, line, 0 ); + getLayoutItem()->addWidget( loginEdit, line++, 1 ); + } + } else if (ctx != Login && ctx != Shutdown && getLayoutItem()) { + loginLabel = new TQLabel( i18n("Username:"), parent ); + getLayoutItem()->addWidget( loginLabel, line, 0 ); + getLayoutItem()->addWidget( new TQLabel( fixedUser, parent ), line++, 1 ); + } +#if 0 + if (echoMode == -1) + passwdEdit = new KDMPasswordEdit( parent ); + else + passwdEdit = new KDMPasswordEdit( echoMode, + parent ); + connect( passwdEdit, TQT_SIGNAL(textChanged( const TQString & )), + TQT_SLOT(slotActivity()) ); + connect( passwdEdit, TQT_SIGNAL(lostFocus()), TQT_SLOT(slotActivity()) ); + if (pred) { + parent->setTabOrder( pred, passwdEdit ); + pred = passwdEdit; + } + if (!getLayoutItem()) { + passwdEdit->adjustSize(); + pw_entry->setWidget( passwdEdit ); + } else { + passwdLabel = new TQLabel( passwdEdit, + func == Authenticate ? + i18n("hello &Password:") : + i18n("Current &password:"), + parent ); + getLayoutItem()->addWidget( passwdLabel, line, 0 ); + getLayoutItem()->addWidget( passwdEdit, line++, 1 ); + } +#endif + if (loginEdit) + loginEdit->setFocus(); + } + if (func != Authenticate) { + if (echoMode == -1) { + authEdit << new KDMPasswordEdit( echoMode, parent ); + authEdit << new KDMPasswordEdit( echoMode, parent ); + } else { + authEdit << new KDMPasswordEdit( parent ); + authEdit << new KDMPasswordEdit( parent ); + } + authLabel << new TQLabel( authEdit[0], i18n("&New password:"), parent ); + authLabel << new TQLabel( authEdit[1], i18n("Con&firm password:"), parent ); + if (pred) { + parent->setTabOrder( pred, authEdit[0] ); + parent->setTabOrder( authEdit[0], authEdit[1] ); + } + if (getLayoutItem()) { + getLayoutItem()->addWidget( authLabel[0], line, 0 ); + getLayoutItem()->addWidget( authEdit[0], line++, 1 ); + getLayoutItem()->addWidget( authLabel[1], line, 0 ); + getLayoutItem()->addWidget( authEdit[1], line, 1 ); + } + if (authEdit.size() >= 2) + authEdit[1]->setFocus(); + } +} + +// virtual +KPamGreeter::~KPamGreeter() +{ + debug("KPamGreeter::~KPamGreeter"); + abort(); + if (!layoutItem) { + delete loginEdit; + return; + } + TQLayoutIterator it = static_cast(layoutItem)->iterator(); + for (TQLayoutItem *itm = it.current(); itm; itm = ++it) + delete itm->widget(); + delete layoutItem; + debug("destructor finished, good bye"); +} + +void // virtual +KPamGreeter::loadUsers( const TQStringList &users ) +{ + KCompletion *userNamesCompletion = new KCompletion; + userNamesCompletion->setItems( users ); + loginEdit->setCompletionObject( userNamesCompletion ); + loginEdit->setAutoDeleteCompletionObject( true ); + loginEdit->setCompletionMode( KGlobalSettings::CompletionAuto ); +} + +void // virtual +KPamGreeter::presetEntity( const TQString &entity, int field ) +{ + debug("presetEntity(%s,%d) called!\n", entity.latin1(), field); + loginEdit->setText( entity ); + if (field == 1 && authEdit.size() >= 1) + authEdit[0]->setFocus(); + else { + loginEdit->setFocus(); + loginEdit->selectAll(); + if (field == -1 && authEdit.size() >= 1) { + authEdit[0]->setText( " " ); + authEdit[0]->setEnabled( false ); + authTok = false; + } + } + curUser = entity; +} + +TQString // virtual +KPamGreeter::getEntity() const +{ + return fixedUser.isEmpty() ? loginEdit->text() : fixedUser; +} + +void // virtual +KPamGreeter::setUser( const TQString &user ) +{ + // assert( fixedUser.isEmpty() ); + curUser = user; + loginEdit->setText( user ); + if (authEdit.size() >= 1) { + authEdit[0]->setFocus(); + authEdit[0]->selectAll(); + } +} + +void // virtual +KPamGreeter::setEnabled(bool enable) +{ + // assert( !passwd1Label ); + // assert( func == Authenticate && ctx == Shutdown ); +// if (loginLabel) +// loginLabel->setEnabled( enable ); + authEdit[0]->setEnabled( enable ); + setActive( enable ); + if (enable) + authEdit[0]->setFocus(); + } + +void // private +KPamGreeter::returnData() +{ + debug("*************** returnData called with exp %d\n", exp); + + + switch (exp) { + case 0: + handler->gplugReturnText( (loginEdit ? loginEdit->text() : + fixedUser).local8Bit(), + KGreeterPluginHandler::IsUser ); + break; + case 1: + handler->gplugReturnText( authEdit[0]->password(), + KGreeterPluginHandler::IsPassword | + KGreeterPluginHandler::IsSecret ); + break; + case 2: + handler->gplugReturnText( authEdit[1]->password(), + KGreeterPluginHandler::IsSecret ); + break; + default: // case 3: + handler->gplugReturnText( authEdit[2]->password(), + KGreeterPluginHandler::IsNewPassword | + KGreeterPluginHandler::IsSecret ); + break; + } +} + +bool // virtual +KPamGreeter::textMessage( const char *text, bool err ) +{ + debug(" ************** textMessage(%s, %d)\n", text, err); + + if (!authEdit.size()) + return false; + + if (getLayoutItem()) { + TQLabel* label = new TQLabel(TQString::fromUtf8(text), m_parentWidget); + getLayoutItem()->addWidget(label, state+1, 0, 0); + } + + return true; +} + +void // virtual +KPamGreeter::textPrompt( const char *prompt, bool echo, bool nonBlocking ) +{ + debug("textPrompt called with prompt %s echo %d nonBlocking %d", prompt, echo, nonBlocking); + debug("state is %d, authEdit.size is %d\n", state, authEdit.size()); + + if (state == 0 && echo) { + if (loginLabel) + loginLabel->setText(TQString::fromUtf8(prompt)); + else if (m_themer) { + KdmLabel *kdmlabel = static_cast(m_themer->findNode("user-label")); + if (kdmlabel) { + //userLabel->setText(TQString::fromUtf8(prompt)); + kdmlabel->label.text = TQString::fromUtf8(prompt); + TQTimer::singleShot(0, kdmlabel, TQT_SLOT(update())); + } + } + } + else if (state >= authEdit.size()) { + if (getLayoutItem()) { + TQLabel* label = new TQLabel(TQString::fromUtf8(prompt), m_parentWidget); + getLayoutItem()->addWidget(label, state+1, 0, 0); + debug("added label widget to layout"); + } + else if (m_themer) { + debug("themer found!"); + KdmItem *pw_label = 0; + + KdmLabel *kdmlabel = static_cast(m_themer->findNode("pw-label")); + if (kdmlabel) { + //userLabel->setText(TQString::fromUtf8(prompt)); + TQString str = TQString::fromUtf8(prompt); + kdmlabel->label.text = str; + TQTimer::singleShot(0, kdmlabel, TQT_SLOT(update())); + } + } + + KDMPasswordEdit* passwdEdit; + + if (echoMode == -1) + passwdEdit = new KDMPasswordEdit( m_parentWidget ); + else + passwdEdit = new KDMPasswordEdit( echoMode, m_parentWidget); + connect( passwdEdit, TQT_SIGNAL(textChanged( const TQString & )), + TQT_SLOT(slotActivity()) ); + connect( passwdEdit, TQT_SIGNAL(lostFocus()), TQT_SLOT(slotActivity()) ); + authEdit << passwdEdit; + +#if 1 + for(TQValueList::iterator it = authEdit.begin(); + it != authEdit.end(); + ++it) { + if ((*it)->isEnabled() && (*it)->text().isEmpty()) { + (*it)->setFocus(); + break; + } + } +#endif + if (getLayoutItem()) + getLayoutItem()->addWidget(passwdEdit, state+1, 1, 0); + + if (m_themer) { + debug("themer found!"); + KdmItem *pw_entry = 0; + + pw_entry = m_themer->findNode("pw-entry"); + + if (pw_entry && passwdEdit) + pw_entry->setWidget(passwdEdit); + + if (0) { + //userLabel->setText(TQString::fromUtf8(prompt)); + //kdmlabel->label.text = TQString::fromUtf8(prompt); + //TQTimer::singleShot(0, kdmlabel, TQT_SLOT(update())); + } + } + else + debug("no themer found!"); + } + ++state; + pExp = exp; + + exp = authEdit.size(); + debug("state %d exp: %d, has %d\n", state, exp, has); + + if (has >= exp || nonBlocking) + returnData(); +} + +bool // virtual +KPamGreeter::binaryPrompt( const char *, bool ) +{ + // this simply cannot happen ... :} + return true; +} + +void // virtual +KPamGreeter::start() +{ + debug("******* start() called\n"); + + while(authEdit.begin() != authEdit.end()) { + KPasswordEdit* item = *authEdit.remove(authEdit.begin()); + delete item; + } + + while(authLabel.begin() != authLabel.end()) { + TQLabel* item = *authLabel.remove(authLabel.begin()); + delete item; + } + + authTok = !(authEdit.size() >= 2 && authEdit[1]->isEnabled()); + exp = has = -1; + state = 0; + running = true; + handler->gplugStart(); +} + +void // virtual +KPamGreeter::suspend() +{ +} + +void // virtual +KPamGreeter::resume() +{ +} + +void // virtual +KPamGreeter::next() +{ + debug("********* next() called state %d\n", state); + + if (state == 0 && running && handler) { + debug(" **** returned text!\n"); + handler->gplugReturnText( (loginEdit ? loginEdit->text() : + fixedUser).local8Bit(), + KGreeterPluginHandler::IsUser ); + setActive(false); + } + + has = 0; + + for(TQValueList::iterator it = authEdit.begin(); + it != authEdit.end(); + ++it) { + + has++; + if ((*it)->hasFocus()) { + ++it; + if (it != authEdit.end()) + (*it)->setFocus(); + break; + } + if (it == authEdit.end()) + has = -1; + } + + debug(" has %d and exp %d\n", has, exp); + +#if 0 + // assert( running ); + if (loginEdit && loginEdit->hasFocus()) { + passwdEdit->setFocus(); // will cancel running login if necessary + has = 0; + } else if (passwdEdit && passwdEdit->hasFocus()) { + if (passwd1Edit) + passwd1Edit->setFocus(); + has = 1; + } else if (passwd1Edit) { + if (passwd1Edit->hasFocus()) { + passwd2Edit->setFocus(); + has = 1; // sic! + } else + has = 3; + } else + has = 1; + if (exp < 0) + handler->gplugStart(); +#endif + if (has >= exp) + returnData(); +} + +void // virtual +KPamGreeter::abort() +{ + debug("***** abort() called\n"); + + running = false; + if (exp >= 0) { + exp = -1; + handler->gplugReturnText( 0, 0 ); + } +} + +void // virtual +KPamGreeter::succeeded() +{ + debug("**** succeeded() called\n"); + + // assert( running || timed_login ); + if (!authTok) + setActive( false ); + else + setAllActive( false ); + exp = -1; + running = false; +} + +void // virtual +KPamGreeter::failed() +{ + // assert( running || timed_login ); + setActive( false ); + setAllActive( false ); + exp = -1; + running = false; +} + +#include +void // virtual +KPamGreeter::revive() +{ + // assert( !running ); + setAllActive( true ); + +#if 1 + if (authEdit.size() < 1) + return; +#endif + + assert(authEdit.size() >= 1); + if (authTok) { + authEdit[0]->erase(); + if(authEdit.size() >= 2) + authEdit[1]->erase(); + authEdit[0]->setFocus(); + } else { + authEdit[0]->erase(); + if (loginEdit && loginEdit->isEnabled()) + authEdit[0]->setEnabled( true ); + else { + setActive( true ); + if (loginEdit && loginEdit->text().isEmpty()) + loginEdit->setFocus(); + else + authEdit[0]->setFocus(); + } + } +} + +void // virtual +KPamGreeter::clear() +{ + // assert( !running && !passwd1Edit ); + authEdit[0]->erase(); + if (loginEdit) { + loginEdit->clear(); + loginEdit->setFocus(); + curUser = TQString::null; + } else + authEdit[0]->setFocus(); +} + + +// private + +void +KPamGreeter::setActive( bool enable ) +{ + if (loginEdit) + loginEdit->setEnabled( enable ); +} + +void +KPamGreeter::setAllActive( bool enable ) +{ + for(TQValueList::iterator it = authEdit.begin(); + it != authEdit.end(); + ++it) + (*it)->setEnabled( enable ); +} + +void +KPamGreeter::slotLoginLostFocus() +{ + if (!running) + return; + if (exp > 0) { + if (curUser == loginEdit->text()) + return; + exp = -1; + handler->gplugReturnText( 0, 0 ); + } + curUser = loginEdit->text(); + debug("curUser is %s", curUser.latin1()); + handler->gplugSetUser( curUser ); +} + +void +KPamGreeter::slotActivity() +{ + debug("slotActivity"); + + if (running) + handler->gplugActivity(); +} + +// factory + +static bool init( const TQString &, + TQVariant (*getConf)( void *, const char *, const TQVariant & ), + void *ctx ) +{ + echoMode = (KPasswordEdit::EchoModes) getConf( ctx, "EchoMode", TQVariant( -1 ) ).toInt(); + KGlobal::locale()->insertCatalogue( "kgreet_pam" ); + return true; +} + +static void done( void ) +{ + KGlobal::locale()->removeCatalogue( "kgreet_pam" ); + if (log && log != stderr) + fclose(log); + log = 0; +} + +static KGreeterPlugin * +create( KGreeterPluginHandler *handler, KdmThemer *themer, + TQWidget *parent, TQWidget *predecessor, + const TQString &fixedEntity, + KGreeterPlugin::Function func, + KGreeterPlugin::Context ctx ) +{ + return new KPamGreeter( handler, themer, parent, predecessor, fixedEntity, func, ctx ); +} + +KDE_EXPORT kgreeterplugin_info kgreeterplugin_info = { + I18N_NOOP("Pam conversation plugin"), "pam", + kgreeterplugin_info::Local | kgreeterplugin_info::Presettable, + init, done, create +}; + +#include "kgreet_pam.moc" diff --git a/kdmlib/kgreet_pam.h b/kdmlib/kgreet_pam.h new file mode 100644 index 000000000..f0bea7d02 --- /dev/null +++ b/kdmlib/kgreet_pam.h @@ -0,0 +1,93 @@ +/* + +Conversation widget for kdm greeter + +Copyright (C) 2008 Dirk Mueller + + +This program is free software; you can redistribute 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. + +*/ + + +#ifndef KGREET_CLASSIC_H +#define KGREET_CLASSIC_H + +#include "kgreeterplugin.h" + +#include +#include + +class KLineEdit; +class KPasswordEdit; +class KSimpleConfig; +class TQGridLayout; +class TQLabel; + +class KPamGreeter : public TQObject, public KGreeterPlugin { + Q_OBJECT + + public: + KPamGreeter( KGreeterPluginHandler *handler, + KdmThemer *themer, + TQWidget *parent, TQWidget *predecessor, + const TQString &fixedEntitiy, + Function func, Context ctx ); + ~KPamGreeter(); + virtual void loadUsers( const TQStringList &users ); + virtual void presetEntity( const TQString &entity, int field ); + virtual TQString getEntity() const; + virtual void setUser( const TQString &user ); + virtual void setEnabled( bool on ); + virtual bool textMessage( const char *message, bool error ); + virtual void textPrompt( const char *prompt, bool echo, bool nonBlocking ); + virtual bool binaryPrompt( const char *prompt, bool nonBlocking ); + virtual void start(); + virtual void suspend(); + virtual void resume(); + virtual void next(); + virtual void abort(); + virtual void succeeded(); + virtual void failed(); + virtual void revive(); + virtual void clear(); + + TQGridLayout *getLayoutItem() const { return static_cast(layoutItem); } + + public slots: + void slotLoginLostFocus(); + void slotActivity(); + + private: + void setActive( bool enable ); + void setAllActive( bool enable ); + void returnData(); + + TQLabel *loginLabel; + TQValueList authLabel; + KLineEdit *loginEdit; + TQWidget* m_parentWidget; + TQValueList authEdit; + KSimpleConfig *stsFile; + KdmThemer *m_themer; + TQString fixedUser, curUser; + Function func; + Context ctx; + int exp, pExp, has; + unsigned state; + bool running, authTok; +}; + +#endif /* KGREET_CLASSIC_H */ diff --git a/khelpcenter/kcmhelpcenter.cpp b/khelpcenter/kcmhelpcenter.cpp index c3b3e3094..aadce700a 100644 --- a/khelpcenter/kcmhelpcenter.cpp +++ b/khelpcenter/kcmhelpcenter.cpp @@ -321,6 +321,7 @@ bool KCMHelpCenter::save() void KCMHelpCenter::load() { + findWriteableIndexDir(); mIndexDirLabel->setText( Prefs::indexDirectory() ); mListView->clear(); @@ -675,6 +676,12 @@ void KCMHelpCenter::checkSelection() enableButtonOK( count != 0 ); } +void KCMHelpCenter::findWriteableIndexDir() +{ + TQFileInfo currentDir( Prefs::indexDirectory() ); + if ( !currentDir.isWritable() ) + Prefs::setIndexDirectory( KGlobal::dirs()->saveLocation("data", "khelpcenter/index/") ); +} #include "kcmhelpcenter.moc" // vim:ts=2:sw=2:et diff --git a/khelpcenter/kcmhelpcenter.h b/khelpcenter/kcmhelpcenter.h index 4715d1a0a..8bf2f3b6c 100644 --- a/khelpcenter/kcmhelpcenter.h +++ b/khelpcenter/kcmhelpcenter.h @@ -146,6 +146,11 @@ class KCMHelpCenter : public KDialogBase, virtual public KCMHelpCenterIface void advanceProgress(); + /** + * Find a user-writeable location for the indices, if the current location + * is not. + */ + void findWriteableIndexDir(); private: KHC::SearchEngine *mEngine; diff --git a/khelpcenter/navigator.cpp b/khelpcenter/navigator.cpp index 48ae76dd0..ad308cfc6 100644 --- a/khelpcenter/navigator.cpp +++ b/khelpcenter/navigator.cpp @@ -120,8 +120,6 @@ Navigator::Navigator( View *view, TQWidget *parent, const char *name ) mTabWidget = new TQTabWidget( this ); topLayout->addWidget( mTabWidget ); - connect( mTabWidget, TQT_SIGNAL( currentChanged( TQWidget * ) ), - TQT_SLOT( slotTabChanged( TQWidget * ) ) ); setupContentsTab(); setupGlossaryTab(); @@ -135,6 +133,9 @@ Navigator::Navigator( View *view, TQWidget *parent, const char *name ) mSearchWidget->updateScopeList(); mSearchWidget->readConfig( KGlobal::config() ); } + + connect( mTabWidget, TQT_SIGNAL( currentChanged( QWidget * ) ), + TQT_SLOT( slotTabChanged( QWidget * ) ) ); } Navigator::~Navigator() @@ -336,6 +337,11 @@ void Navigator::selectItem( const KURL &url ) item = item->nextSibling() ) { NavigatorAppItem *appItem = dynamic_cast( item ); if ( appItem ) appItem->populate( true /* recursive */ ); + for ( QListViewItem *subitem = item->firstChild(); subitem; + subitem = subitem->nextSibling() ) { + appItem = dynamic_cast( subitem ); + if ( appItem ) appItem->populate( true /* recursive */ ); + } } } diff --git a/khelpcenter/searchhandlers/Makefile.am b/khelpcenter/searchhandlers/Makefile.am index 65f4060b6..f2ebd57ff 100644 --- a/khelpcenter/searchhandlers/Makefile.am +++ b/khelpcenter/searchhandlers/Makefile.am @@ -3,7 +3,7 @@ searchhandlers_DATA = htdig.desktop man.desktop docbook.desktop searchhandlersdir = $(kde_datadir)/khelpcenter/searchhandlers kde_bin_SCRIPTS = khc_htdig.pl khc_htsearch.pl khc_mansearch.pl \ - khc_docbookdig.pl + khc_docbookdig.pl khc_beagle_search.pl khc_beagle_index.pl htdigdata_DATA = htdig_long.html diff --git a/khelpcenter/searchhandlers/docbook.desktop b/khelpcenter/searchhandlers/docbook.desktop index 08208c187..5c6d11284 100644 --- a/khelpcenter/searchhandlers/docbook.desktop +++ b/khelpcenter/searchhandlers/docbook.desktop @@ -2,5 +2,5 @@ DocumentTypes=text/docbook -SearchCommand=khc_htsearch.pl --docbook --indexdir=%d --config=%i --words=%w --method=%o --maxnum=%m --lang=en -IndexCommand=khc_docbookdig.pl --indexdir=%d --docpath=%p --identifier=%i +SearchCommand=khc_beagle_search.pl --method=%o --maxnum=%m %w +IndexCommand=khc_beagle_index.pl %d %i diff --git a/khelpcenter/searchhandlers/khc_beagle_index.pl b/khelpcenter/searchhandlers/khc_beagle_index.pl new file mode 100644 index 000000000..02f1b9330 --- /dev/null +++ b/khelpcenter/searchhandlers/khc_beagle_index.pl @@ -0,0 +1,49 @@ +#!/usr/bin/perl +# vim:sw=4:et + +use warnings; + +sub getKDEDocDir() +{ + my $prefix = `kde-config --prefix`; + chomp $prefix; + + $prefix = "/opt/kde" if (not defined($prefix)); + return "$prefix/share/doc"; +} + +sub addRoot() +{ + my $kdedocdir = &getKDEDocDir; + + open (IN, "-|") || exec "beagle-config", "indexing", "ListRoots"; + + my $kdedoc_found = 0; + while() { + if (/^$kdedocdir/o) { + $kdedoc_found = 1; + last; + } + } + close(IN); + + if (not $kdedoc_found) { + `beagle-config indexing AddRoot $kdedocdir`; + `beagle-config indexing AddRoot $kdedocdir-bundle`; + } +} + +sub createExistsFile($$) +{ + my ($idir, $ident) = @_; + + open(OUT, ">", "$idir/$idir"); + close(OUT); +} + +my $idir = $ARGV[0]; +my $ident = $ARGV[1]; + +if (addRoot) { + createExistsFile($idir, $ident); +} diff --git a/khelpcenter/searchhandlers/khc_beagle_search.pl b/khelpcenter/searchhandlers/khc_beagle_search.pl new file mode 100644 index 000000000..d7a1f44b8 --- /dev/null +++ b/khelpcenter/searchhandlers/khc_beagle_search.pl @@ -0,0 +1,88 @@ +#!/usr/bin/perl -w +# vim:sw=4:et + +use warnings; +use strict; +use Getopt::Long; + +sub isBeagleRunning() +{ + open(IN, "-|") || exec "beagle-ping"; + while() { + if (/^Daemon version:/) { + close(IN); + return 1; + } + } + close(IN); + return 0; +} + +sub formatHTML($$) +{ + my ($query, $hits) = @_; + + print "\n\n"; + + foreach my $hit(@$hits) { + print "
  • $hit
  • \n"; + } + print "\n\n\n"; +} + +sub beagleQuery($$$) +{ + my ($words, $method, $maxnum) = @_; + + my @hits = (); + + open(IN, "-|") || exec "beagle-query", "--type", "DocbookEntry", "--type", "File", "--max-hits", $maxnum, @$words, "ext:docbook"; + while() { + chop; + next if (/^Debug:/); + + my $uri = $_; + $uri = $1 if ($uri =~ /^file:\/\/(.*)$/); + + print "uri: $uri\n"; + my $helpLink = &makeHelpLink($uri); + + push(@hits, $helpLink) if (!grep { /^$helpLink$/ } @hits); + } + close(IN); + return @hits; +} + +sub makeHelpLink($) +{ + # Try to figure out the name of the application from the path to its index.docbook file + + my ($path) = @_; + my @pathcomponents = split '/', $path; + + my $appName = $pathcomponents[-2]; + my $appName2 = $pathcomponents[-3]; + + if ($appName eq $appName2 or $appName2 eq "doc" + or (-d "/usr/share/locale/$appName2")) { + return "$appName"; + } + return "$appName ($appName2)"; +} + +my $method = "and"; +my $maxnum = 100; + +GetOptions("method=s", \$method, "maxnum=i", \$maxnum); + +my @hits = ("The Beagle daemon is not running, search is not available"); + +my @words = @ARGV; + +if (isBeagleRunning()) { + @hits = beagleQuery(\@words, $method, $maxnum); +} + +@hits = ("There are no search results") if ($#hits < 0); + +formatHTML(\@words, \@hits); diff --git a/kicker/applets/systemtray/systemtrayapplet.cpp b/kicker/applets/systemtray/systemtrayapplet.cpp index 933855f74..51bf2b9d8 100644 --- a/kicker/applets/systemtray/systemtrayapplet.cpp +++ b/kicker/applets/systemtray/systemtrayapplet.cpp @@ -189,6 +189,7 @@ bool SystemTrayApplet::x11Event( XEvent *e ) if( isWinManaged( (WId)e->xclient.data.l[2] ) ) // we already manage it return true; embedWindow( e->xclient.data.l[2], false ); + updateVisibleWins(); layoutTray(); return true; } @@ -215,13 +216,12 @@ void SystemTrayApplet::preferences() connect(m_settingsDialog, TQT_SIGNAL(finished()), this, TQT_SLOT(settingsDialogFinished())); m_iconSelector = new KActionSelector(m_settingsDialog); - m_iconSelector->setAvailableLabel(i18n("Visible icons:")); - m_iconSelector->setSelectedLabel(i18n("Hidden icons:")); - m_iconSelector->setShowUpDownButtons(false); + m_iconSelector->setAvailableLabel(i18n("Hidden icons:")); + m_iconSelector->setSelectedLabel(i18n("Visible icons:")); m_settingsDialog->setMainWidget(m_iconSelector); - TQListBox *shownListBox = m_iconSelector->availableListBox(); - TQListBox *hiddenListBox = m_iconSelector->selectedListBox(); + TQListBox *hiddenListBox = m_iconSelector->availableListBox(); + TQListBox *shownListBox = m_iconSelector->selectedListBox(); TrayEmbedList::const_iterator it = m_shownWins.begin(); TrayEmbedList::const_iterator itEnd = m_shownWins.end(); @@ -263,26 +263,48 @@ void SystemTrayApplet::applySettings() } KConfig *conf = config(); - conf->setGroup("HiddenTrayIcons"); - TQString name; - - // use the following snippet of code someday to implement ordering - // of icons - /* - m_visibleIconList.clear(); - TQListBoxItem* item = m_iconSelector->availableListBox()->firstItem(); - for (; item; item = item->next()) + + // Save the sort order and hidden status using the window class (WM_CLASS) rather + // than window name (caption) - window name is i18n-ed, so it's for example + // not possible to create default settings. + // For backwards compatibility, name is kept as it is, class is preceded by '!'. + TQMap< TQString, TQString > windowNameToClass; + for( TrayEmbedList::ConstIterator it = m_shownWins.begin(); + it != m_shownWins.end(); + ++it ) { + KWin::WindowInfo info = KWin::windowInfo( (*it)->embeddedWinId(), NET::WMName, NET::WM2WindowClass); + windowNameToClass[ info.name() ] = '!' + info.windowClassClass(); + } + for( TrayEmbedList::ConstIterator it = m_hiddenWins.begin(); + it != m_hiddenWins.end(); + ++it ) { + KWin::WindowInfo info = KWin::windowInfo( (*it)->embeddedWinId(), NET::WMName, NET::WM2WindowClass); + windowNameToClass[ info.name() ] = '!' + info.windowClassClass(); + } + + conf->setGroup("SortedTrayIcons"); + m_sortOrderIconList.clear(); + for(TQListBoxItem* item = m_iconSelector->selectedListBox()->firstItem(); + item; + item = item->next()) { - m_visibleIconList.append(item->text()); + if( windowNameToClass.contains(item->text())) + m_sortOrderIconList.append(windowNameToClass[item->text()]); + else + m_sortOrderIconList.append(item->text()); } - conf->writeEntry("Visible", m_visibleIconList); - selection.clear();*/ + conf->writeEntry("SortOrder", m_sortOrderIconList); + conf->setGroup("HiddenTrayIcons"); m_hiddenIconList.clear(); - TQListBoxItem* item = m_iconSelector->selectedListBox()->firstItem(); - for (; item; item = item->next()) + for(TQListBoxItem* item = m_iconSelector->availableListBox()->firstItem(); + item; + item = item->next()) { - m_hiddenIconList.append(item->text()); + if( windowNameToClass.contains(item->text())) + m_hiddenIconList.append(windowNameToClass[item->text()]); + else + m_hiddenIconList.append(item->text()); } conf->writeEntry("Hidden", m_hiddenIconList); conf->sync(); @@ -437,6 +459,9 @@ void SystemTrayApplet::loadSettings() conf->setGroup("HiddenTrayIcons"); m_hiddenIconList = conf->readListEntry("Hidden"); + conf->setGroup("SortedTrayIcons"); + m_sortOrderIconList = conf->readListEntry("SortOrder"); + //Note This setting comes from kdeglobal. conf->setGroup("System Tray"); m_iconSize = conf->readNumEntry("systrayIconWidth", 22); @@ -526,7 +551,9 @@ bool SystemTrayApplet::isWinManaged(WId w) bool SystemTrayApplet::shouldHide(WId w) { - return m_hiddenIconList.find(KWin::windowInfo(w).name()) != m_hiddenIconList.end(); + return m_hiddenIconList.find(KWin::windowInfo(w).name()) != m_hiddenIconList.end() + || m_hiddenIconList.find('!'+KWin::windowInfo(w,0,NET::WM2WindowClass).windowClassClass()) + != m_hiddenIconList.end(); } void SystemTrayApplet::updateVisibleWins() @@ -549,6 +576,35 @@ void SystemTrayApplet::updateVisibleWins() (*emb)->hide(); } } + + TQMap< QXEmbed*, TQString > names; // cache window names and classes + TQMap< QXEmbed*, TQString > classes; + for( TrayEmbedList::const_iterator it = m_shownWins.begin(); + it != m_shownWins.end(); + ++it ) { + KWin::WindowInfo info = KWin::windowInfo((*it)->embeddedWinId(),NET::WMName,NET::WM2WindowClass); + names[ *it ] = info.name(); + classes[ *it ] = '!'+info.windowClassClass(); + } + TrayEmbedList newList; + for( TQStringList::const_iterator it1 = m_sortOrderIconList.begin(); + it1 != m_sortOrderIconList.end(); + ++it1 ) { + for( TrayEmbedList::iterator it2 = m_shownWins.begin(); + it2 != m_shownWins.end(); + ) { + if( (*it1).startsWith("!") ? classes[ *it2 ] == *it1 : names[ *it2 ] == *it1 ) { + newList.append( *it2 ); // don't bail out, there may be multiple ones + it2 = m_shownWins.erase( it2 ); + } else + ++it2; + } + } + for( TrayEmbedList::const_iterator it = m_shownWins.begin(); + it != m_shownWins.end(); + ++it ) + newList.append( *it ); // append unsorted items + m_shownWins = newList; } void SystemTrayApplet::toggleExpanded() diff --git a/kicker/applets/systemtray/systemtrayapplet.h b/kicker/applets/systemtray/systemtrayapplet.h index a92b8f74e..f66e0caa5 100644 --- a/kicker/applets/systemtray/systemtrayapplet.h +++ b/kicker/applets/systemtray/systemtrayapplet.h @@ -98,6 +98,7 @@ private: TrayEmbedList m_shownWins; TrayEmbedList m_hiddenWins; TQStringList m_hiddenIconList; + TQStringList m_sortOrderIconList; KWinModule *kwin_module; Atom net_system_tray_selection; Atom net_system_tray_opcode; diff --git a/kicker/data/kickoff/button-box-gradient-topdown.png b/kicker/data/kickoff/button-box-gradient-topdown.png new file mode 100644 index 0000000000000000000000000000000000000000..37881634233274e8a92a40acbef879e505022804 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^o!2~2{G{>|6Db50q$YKTtZeb8+WSBKa0w~B{ z;_2(kevN~T!AkBB-=e8Np%PCQ#}J9jr4zjQToic@%iRATBh!7Z>C?r@X@Q(xk4+4Y z75MoWC^-f^n4)An>C5j~+!9Jh-|nBfl=H05?=u$PXX?MdX!reA+>`cF1esZZD4d;B@QL(^w#JAe6R?v;NSuKNkaM}6bp0<@pO)78&q Iol`;+01Ej`UjP6A literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/button-box-gradient.png b/kicker/data/kickoff/button-box-gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c11adba3e1a89962eaae5fba340e836e8d7bb1 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^o!2~2{G{>|6Db50q$YKTtZeb8+WSBKa0w~Cm z?&#~tz_78e=6B#^AYUQbBgmJ5p-Pp3p`n?9;pcxK{gQ#9)PRBERRRNp)eHs(@%%~g zN8NyGOFdm2Ln>~iOmO65a^zs?{`a4M?~EV(rh($ literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/button-box-left-corner.png b/kicker/data/kickoff/button-box-left-corner.png new file mode 100644 index 0000000000000000000000000000000000000000..c4080cb007002648503b69e8d66980cbcfbcd728 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1SHiab7}%9&H|6fVg?3oVGw3ym^DWNq$1tX z*O7r?V_(hhz{xHqW}N^ literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/button-box-left.png b/kicker/data/kickoff/button-box-left.png new file mode 100644 index 0000000000000000000000000000000000000000..3b532f8bd534e92dd82d776376f755369d476ca7 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^Y(SjK!2~29o@0Ftq&N#aB8wRqxP?KOkzv*x37{ZL zx}&cn1H;C?n%{wwfqaEzk04(LhALGChK6PahM)g|^h*YYQUeBtR|yOZRx=nF#PcV` zA9Vw&UE%5C7*cU-%@jwzBMLmso=5)2@0fnK{lUE5+m3WhTiiO=V#bx{zooxlK73B* z>4jg%mk9+{uZ;*~=sNOrg5h#42M6ttlnXLyV$r%xx=$`HeEe>uyDYzZb^nAJTjt!D zr+?CT;*;CC+58)QmP9KBsC8}G;du6p5&h{kLNyTI@jEED1u1KrHv>FVdQ&MBb@00f40 A{{R30 literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/button-box-right-corner.png b/kicker/data/kickoff/button-box-right-corner.png new file mode 100644 index 0000000000000000000000000000000000000000..ef44b1fab80d0c26846a80c2e1908a7eb0b75383 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^96-#%!2~32*1ud1q&N#aB8wRqxP?KOkzv*x36P3( zM_)$IPKnzopr E09*A!3;+NC literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/button-box-top.png b/kicker/data/kickoff/button-box-top.png new file mode 100644 index 0000000000000000000000000000000000000000..1cac298be58eaeba5d6e3dada72087b4d942ad5c GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr7!2~1^>^hVSq&N#aB8wRqxP?KOkzv*x36P3( zM_)$IPIR>FMGaQgJJ3hHbvx literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/cr128-action-suspend2disk.png b/kicker/data/kickoff/cr128-action-suspend2disk.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ac2fe05ba6636a351c9b6aaaa2f4d06b559032 GIT binary patch literal 13797 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 literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/cr32-action-leave.png b/kicker/data/kickoff/cr32-action-leave.png new file mode 100644 index 0000000000000000000000000000000000000000..89dc15953e7a04e388fe59e729b87185ee2c133e GIT binary patch literal 1602 zcmV-I2EF--P)lhNs?5PG|@OoH26?N#`uxZ-66K|hwK&6fzi>iFW&x<69c#0d<&5=#Bqd; zB7!QaN(f5OKnRKkC2X>&ERD&FlEsDjkayagdHG-Ln;8G?wg_a|fEgPb<1LdDq_II& zQ3VB5fu6pqu8spitNxBm@Bx~wVY4v5zzZ*)A+UP7B)YZ*u?BiE~bzb1Q+j<$$X}gDOR#cn@V+lII1^If^`&tqAa=yAK@r z@cxmdg@VL;UkBUTmDR1tYtRs&3{ZNdz1+b$hjUlh0=!36`OZi8r|Gf#Zn$tc)XBHG zccHt#po$MlUIu)qa|7_+FTtf*>GO8NM>p=G0%NIoB$A{(O@`SMcd~PZGSR*=$i3C3%sHz3uJe|GjZ?qzbmK zzB*-KCKNT0aA?mkXI^je&ENc!2aZqm%$I8YQqL54;<ZzCuy zHe1ZiFW`Nxz{rl6@!_=l*EIy@m)%Og3-*RxDGJ>C`15@GV+TpB)c0hKDi7T@#XUDo zFmcTg03j&OSMozuj%8GcZRL)cR=EMFSKexT^~xB-_4`IR`Pj33_vDQX55|Zh(ScKe|)9EA6{#dT00GxhZ(-*RRN$*%xboj*n-F)rD`-q~AK{t?D2i&^_S(bqY>}PJ?`4!;Q`jtNU zpXD!+@kszwNt<(g|E|LvKQ#G&0f!KnYs}GVwkiT?iiV)}p1bc{23}oH;B!wtx(GlB z3|#m(558-FQBBy-`w3nLGAD_B({@BzG`SCxTHzIqt0-l?n zXLfd$R%;0>5Jf^_1?ObtIPSG1NeJHbS0Fh5$g!y%3Or_QbXp>_0eER?iHnymvb@|T zO)P_1g55cQbB@xvexU(~lLYlqe+Be+4=C^mz|VjB6K{+l2<>*8>FH^lD@oIs(cvLv zS4QbvbA1pTH#P4)t|+!iAWPk@ zp&=&sO<=_1eTUrnDoD5W9`D`CbqJyQaOnmSK}0adV2n}}1->k0TLc82dF|ZU15Y*Q zC5kN8Mo2fH2#CSd`C)pVHdXys6jZCPrtbS0 zsS*QY1QAn>i6BvREmEbcF?HXpjEk5kh?rmf56ve|?H+xLQUCw|07*qoM6N<$f+2+g A?EnA( literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/cr32-action-suspend2disk.png b/kicker/data/kickoff/cr32-action-suspend2disk.png new file mode 100644 index 0000000000000000000000000000000000000000..7bcb027b1fe83738a14878edc94a09ad281ba4d6 GIT binary patch literal 2091 zcmV+`2-Nq9P)+nLcbNNB3j=&kcU$8hPT8kMYsT5}pzO?8fs+>NvF)^35ks@XW9N0;_K< zW9|3c;`jgk{s6`wd4N*Smp*gfA%1cHev}BS^_VEVP$>~m0>3%B#^E0yA$sZMGKu+$ zTX}T-QUTQ4lJ7&AFCO~p9sK$mR}!U`v$crSI?gp?R;p3=T5l$tt;H;sBW}68!~^$S z4?D+tG4Z$FivnE$nLcc=JXE@FTK)XK{VZ2w=Fdg=TG&05Wwhk8T!~q!#wZc4-&NqM z(Hx8C+ALKf4(=&1b=v{R1vkss!*^XOfY<$1j&Gx{cjB=JZzfJ)X0=V6I*M5-RqL(Y zE=l}ywI!Y>*Z}Iy5CN){rkI?M0QVjo;)&Xa880tAb^NuZx`-eONfT=q&Xya3Jo|~8 z_kSJe*0ZaCXS^%)_HEp9d5L4E>#S5`ma8%AwQxL5T``K{%+hMvFSk;^oj6~>N5rp2 z)>K-lDYsLTG0GH&2h3VE&Y<)_F6$4(VY~mx3(pT0gY0F_xqJV3T3;l6ooL#AR?SuZ=!qy2uca1ykR{bFf+f-$e>3U zMI1VGCo8L!&Wckm176q!AcEwk&E(|nAznCH<>*|aOBlu00JOuH6Q|}$(u96n;zK=y zhzKWU=D`@0QVa|YV?2cv3Y?f(V`}##a|??&=kRn#Y=<4ZP=T8s_r1{1=CX!kb9I(0 zao6`@Yz+eWd_b(Sh!!&W5~WfJ5y5%^P8-@Ow8|;9$RS#jSc@Q}Ns4t2tv0GHGH?Na z`|E>Y|4lzRb#nIHWZy_1udlW-TF4mDaq6TqPRR8RqXdfmJ!~7^)|nw#qwO?SJDhW9 zWpPo+)WjgpIjprf=TQ3mc9V-J0BGMker9QXa_`g-In!CacGfrt0)%lwxgLT*qZL!F zHE}p9wFXvuhzKGMmx2$B4HvKu5}RVJ!`o0ma2E&gGUgQ(hM$U3N8l^0gPhkL2M&A> zTJ1Jb9OC;15up@hNwh|QjHhVV+LZcohfO8u+R%yqyR@R}?EE_8 z{TZ@G5%|j34aZvNNaBb>K1()}?bP3a)?l=d&uDxt$l5vwuO99u*SZ6uHUI=JuE5IE z_pDFc{rksjCs!UV^yJxI@=24#d*;^*W_O0j(6N-Ry!*{{=Hoe)dmFN< zqqm4q$Oj#VXn};xbI%km1X>?VvZWsWn5Ka~rOJtnXtJOFN2LuQq73B2pz2hi=?E`;GwT z8{FDEu-;f)GvW7SH55&>jWpNN1! zk|r!JEHE)OiBf{Yb)B#!fcEr2ZxAqe;F?YS!kd$KWPh{v-ImSw2d=-ib2!nU9VhRu z!0ha7wqPi{{@N+5wOess5F!`t1)z}6F}`#3cHlc(0<=@P_NA9ku(WuZ<%KysPvaX8 zW4vx_Jdb9hhP9STrNY$I6mbgY+LmpBBHzEA#BMt4Sg$nj{p|GKU87qoAikO%9O%cB zl*x%P28Tv4oI$@m6iJcfsca4uzf zdYWCkcF|jnXtYHJ(mBTTFrH*77J}}_%a#Yx+;aJ6V%^u0I91xy zosEaQ<@E{_0vD}0#EIqY(~F|!tK`O!k^bZF3a}9YVBYPa_Yid;?E-y3U)le6{0|xr VY`ZsyR5Snp002ovPDHLkV1jPF_4oh) literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/cr32-action-suspend2ram.png b/kicker/data/kickoff/cr32-action-suspend2ram.png new file mode 100644 index 0000000000000000000000000000000000000000..7a96cd24f57e445de2e707037aa7a34412413239 GIT binary patch literal 2243 zcmV;!2t433MZk z5M9_-CqjPL?tQfVyaR~phgv~;kdi=|`+^GQx74z7Q56*hD*HPke9#so*cHM&*=?cg zf5XszYY+S?`;7ra(>4cjZ3_CxT^Q}4`iX;HA#^)QR&53A^dtdBi&rACt z5)NTmzp(p$`PnxEsCoEyeE#*{-n@zzwlpFMK_sQ4nP*l?2#^H4(iUag)BDj59f@N& zHrfM^#HI@%eJyzdlH=x8x2@#mJLjUA7DGu5)3O;(>kK5ci6fRa7)t8&#Whyc`?&qq zOQ5#80Ehn5bE&`tfN0w0z~X-2!Y1htn;Quwbb5w0R9P^q#7U)3B{ZTlkkFBY;F1~n zv{bt28_v={qH)=U`OLm@5xCsTMD;_f&%FY1{YnZ8WXbdEDZd_0Tjg5dU23B96XgG zG@=tu8ibPuIeqN$v+S{C;iN%ok_FN6vEE^g&w^?C;~KJ};Be&0&po%>J1qeFU-#q` zRXx$wJxn}fay*jdL^MlqL?f%8-UBwVv`H*uFsgl7fxd*s@ko|au^b~g6Gaht$$7S} zExvosoXUMWcD(x1&Yinf0^)1{llFkpKG+|tn=`uvmt(x^Sr*oK|FMBo&Hw@Wq^4xs zHVzpavOtzhxk5zex&p#`_Z>Hgl474&ym&!NFc@02YuDSox~{$9@koDMvt~`~3;-q1 z@r9Jj-JqE^ZdIB{ERR1Yf-!#)pvaRvS0rRvLNP}3Yn+)TkF&&4JVT+-@4>Px0I8;? zvc9IKvObj>Z9a0O4zjt4~e<*g`%aGFqa$C+4dOco|IS6W*V;;55K# zSvEKnfnQ0K`c!LXMMae(-r2{M%c@AF(ttpW&lf@fA~0`WV?dUrx$nLAPk_x600VE| z8k@QH)hCl(1CQkUJyiHq;u(V%KaOCUHt)8_aH#?i?CFS8>r?n|FeX<>;U=%Q&|6wu zAO=qjQ|f}{%|#><>G9-WLP(NCVWAhNQ}vprslr)aMs@36+ol$JuBd6O!ks4*PU&Cq zd_snn=QqRiYpN<$mm)I|9wpTi;g+RdW>$D9F7|yTxuVFFl@(#?8l7)FLNqb*VY9U3 za^>rB9Zvh#W?C=r`=Y<0tge&`%iLsii=1wgH7rcarofI?C=RQ-ro2{7W(~}L<1DTv^yXcwr~D*qx%2&6+ZI0n8o??nSAxy%qAH)qozLjV zC~lFXd1gMz?sm#b3-NedBobp?w5lpVX=xEfMLwc~eOO1IVkl~m>;J(1-tCKoUUV%3 zZ~geHGc1^_PoKG>2lyF4N!^Bp-&xWAx*1sQyLJ6ftm;6%G&B@t=gzm$HG}&48V()m z#4t=e9w)`c1<0~Q=NIj$eShY7{l$(LzZP+t~{15 zZDP%urG!Gm^nSjNI^zZA&kOLU2NqiS&S5YOB-Oe9qYt~Z$kF{A`{e2Z_WepL}u@%d$D%wuh^il`((q6RcW& z5kqk`Xk;^>$Jw&6e#09_$~WxZ6TPMBUi0B8_rN4|9*)$84@Y<&A~OevcD3)_d*J)m zT(hES$&yR!vsq2avIo`_m=LW4;c!=XZ*Qz&@7@EOmM>piS6W(G*V{WJ8-|Iae!Y3% z*|qYuw{1YnX&em~yt;31@UqtE-vh(Z)W$^*j3u8oz*&Hjz)>Mu2Tq-eb_RpdmiqdN zO)V|WwJw+B|Md9KNxw}Kmf=?AB+oxq{^-S<0@rQ5y4Se(W&P0PSX1_a=}3rH0Tcn1 z3l`KaE-Ndzw7q@s*)7d`e!q3gjK=)h<)k`ZkBr8X7gTK4(`T$dPyd*wLHs}pC|*4$ zc+DNFhPThEQIu?!OBOzu>pts3+qTd90rMr8U!l_6uziEKaH_fItpfkA{s-*+DtKG7 RjLZN4002ovPDHLkV1iTUP*4B> literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/cr48-action-leave.png b/kicker/data/kickoff/cr48-action-leave.png new file mode 100644 index 0000000000000000000000000000000000000000..7c01634b9ec4918beea87bffbb49bd06955dcca8 GIT binary patch literal 2475 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 literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/cr48-action-suspend2disk.png b/kicker/data/kickoff/cr48-action-suspend2disk.png new file mode 100644 index 0000000000000000000000000000000000000000..9ff2148b8b4df90ca3eb39b68c4d2f32d0dae7a9 GIT binary patch literal 3713 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 literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/cr48-action-suspend2ram.png b/kicker/data/kickoff/cr48-action-suspend2ram.png new file mode 100644 index 0000000000000000000000000000000000000000..2aefa6ce4437b7b999122a3456c8adc9c219c4eb GIT binary patch literal 3965 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 literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/cr64-action-suspend2ram.png b/kicker/data/kickoff/cr64-action-suspend2ram.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb47d04f3bf734144e5713efd90889d010f3889 GIT binary patch literal 6115 zcmV<97aZt`P)|!JWRaHco=$np}Pl6bH7ljS}=SMtB(6xr$VtK*5zmb5aNp( z)z&R&`W1ixU`7qht)sLe#(DE&Tyk8TB{L$FgbjR}Ko{Uhg=tCp(++R!9N`!5BzbqY z$w+?+wrqv2u6?gi2!6!wFaJpWg`)Ej10WWEF2X?IeuOvyfJ6cs=dqx%lCNAcgR|$w z@EaO_T}*gxlG97DrN_vbdm zh>ANa@%g`rCT0S#Z~^5D=W_o=v$%eF8GcOzO@LIm3S3X(DL{cI_sbW6rU^7{^f$1z zFUNOQb@SL8y*Qhj9a3?Y0(qZBP{;+dQ05%z1? zu4LDsjVmQm<}F{B2oeeC093_b&!9!dnXKH5(f~_mM#lc%)@`z(%R-FH8%KcUbEBNP zGseqKJ?!m-Og4h!-Tx=i;41JuiBe$blZAQ`GPajbhQ^UB5OA}O#LIaFI~Ozr6~zXxKBNi`X)j4dH|@B}Iz8SP>sffyPBLH*IGcxajg zfToE!N=F7l)F(n%F8sbVNoUfTys!acp~)C}N|ClC+JOKR5Rh{u_CbaKz}VU<5Jb~- zgrMS33LPy?=)Dk#&;q>_fM9^IPvh+llg-`MK?P(B3;|Cn(zb_w1Vg}dU2Ji14;YIh z!62HUBlt4{5U+bMYU!E*ApJffevQsSi}WGJXkh@rbQGF5@wq}tXVy|=<-z3x=o-ji z08Q5bf{DhjNBcJ4IdaH{j*un*pvAn1komB#89Iip(VcS0+6V8TRbT-m6=W@UUx&x2 zkd&P3kyVA|o3$7tk3918 zg}Rd>Xm{tKblj zG(DR%-9)JAl-wWY; zsJ*@AH}~Cl-w_uk3QU7~w^FKB%h_z}$#LTBB8)?1pM{iil_F~^yaOlB0=z;K7_zW@ zO#{E?X$jdmPZ#MpVZ_PHX1mSJ3m5CUPD8_-B@GR87#<$!dhNBfMT3LMpVikd?*Fg< zdhX#s!2Q8xmtEF-X!Q%M1$3WyQ#W+<)G%9nv&2Fg;edu=P_XF*!jT|v$pd*O1rWf{ zCiCrUF(VtE&Yop@ptL+74Xv`KTAXm)Y@g3J(QdI=wCY12I_s3Huf9ZIw5YL52=!04 zZR~#Pspo(C?6bc;^-uszUJD5ORYwoqjw^*UvvdwQ%qR`AJ6Sl^=-OnhbRkC92!{{W zx(5CNd=a~+YFgN<&8jlJEEvQWD@IAlsmIr#7eXB{3?r~;QR7LA7B$k}pKO2Yt#z|A znam%ae)_*R`+V9%mKAv7$}7)IkAG&8q&+WvazNAdjk>O(4X1doGsDcdk5EvOy)1dnYZ>hc{-xh?r2IxjJZZArdL-d@LLwHE15sHj7Z3bZ9AjQ#c?J!*L87S zkCKwu-1E;rWBElFotv9IyLwnk?)Cfaz0W=O;=P9i06^3A-wQ)W_7AhCKSRi`lZg7! zM-?95v_cXD=sJ^l3n8EhZ30h3npKfVad~-3NR*W)kd}>;OkwzSR-9OaWjR>ZJ^*Yi z%bsv8|9k&6&r{K+rg^7cc;Q)ccj2VW-#qyXkrq)gJ~Da_y3=BJaUf22ttYKtMDs#hGzuA(@MfJ zS`ycW(iTqdAPAUQRm{?PC0JIzLOwn&7b+3tFNv|=kw{3)o;~x#mX=maDK9Z*fI+W$}a8d-5(lj?d6F zzVpW(Qf3}N%k}uye|O+1sa2_t#*k3;LJNi(W|pan^0=1H*r=R^9Lb_-2A7;tg=4$e zwmr_$`>cL&PjDQENF>C*z^RlHu-}M>EQ{A(@r#F0VxboB5p9~ujPfvs4*jN!IerBv zAr{t2M18b%XGgbv4l;GR9(Cn@ws)oQoLsofNG|k@l0YyNVrF$2K0F4}9=V)DW@k6b zlhjTNa@R-abD*IQwETFh0~m%*d3j0R(we|9be?|tdB-q}^De#gf>m&sjSvi{pCa_V%Ncq$sR&{^AI|y-7++q6a8DQQ`4;1Ok4_%3@fSjizaM)(G9} ze~IVB1qAm$bGWUsIoJI9I8BL_pnQRn2+>&;lotCb4;xsXWWaRDT1U4NqGx)m1In7C z838eSdL?0>K&X6t8Ogesdk1kd7KSdkd|8-j#rZ{0NlBFA;>ck=AsP))Q4z;9b7-0% zH`2$d2QFjY!a4MBUri_$|3Q^+>m3cZtJD!~j@EzlSLX|%e;&XW_7j^kjp8Cd)iHnm z1&*RW<6`FAL(0*Vrztxd54x#&(V#BsXHOT>^Kf0sfazjpY|@>Bc(#is;Or(pbIT_d z9m~p!DJlw&Q-16h0P%P+<>fJkhtue~PO7(q->tloD{i@u=_g!=XYQqE)vctrJ@ZJz z?drxOIwQ30Czt$g{&m0e6zVR|b^}9gJutHjPeG!{Pb{Pn4f;{apC1Z2Z?tv@u9O&> zMzQRv2)HA4Zm394#EQLWEUsC(e3f}9>yb@mG5b;|PvZA!oLMKRDVEsw#93xwAT=7$ z#3WCssYy^&6r#6x5M9^U+qRw;R$k9dU-~XJi!TB|rPdLzKZ*3VXIwanLsG4eo&VDO z8(!=Xn*J3jRb_JL0Ga+Yc6BkSSdj9tpJ-Sk?$e1!##v2DEnse+XE{dP^OtJVrj@Il z?dgN59I2d3#unH8SY}>`Q_iYyMN1(obIw0ujNuui-?dw~3 z;oG0!uJ8Vw>Za2H$ZmU>U{vAdkvlp709t=|?zXxA^3p$tJnd6Tu)@hYqQ8BBbTr6t zNq}%km}uCb$Y)>};PW!!NOpTu%8P|Cf}*rE&hEa9NM{|a5sRE@V`uV#)bG<-JS)ga zvwfJuL!{G%Q*WQo7|R6!bX{lBqFP2qvW$#m(RB?e6`TI&73v$RFpPXqPQ85>(Qq$9 zEJsNfz&UCF0NNiuXBfDD{tYkwOb_TcDYTQUjEj|V8Qg0U3>)}EK7wAdqDc1CR?L{A z@7O&oX3dPTWBVYfArpICtPnzH;jALgSs0=9o%Ia$m#}PE6Pq^epsOo+NC133gXZQs zy1NI+WOC@b#_*o^NN;?UMEMf_w5pxdr%&U83l`AaED_<8K*?hRU>~*q@Z4>{=N5l_ z)j~9F1+W~bb}WgV%j$Y&$DCkwTz9OnHj?bdDsu_>gZSb;hKJJ#C(DdtkIT<)pl$s| zp7_DrxUPrmdhFWO!`WvaPe(`hr1u5_Q7p?Q91gN-S3{c0oVY1`}ohUo|R1wo#CYi7tHqF zURv!$eTLaao0DMaocYvL#)(J$%qsIyq`TO*#WT*Z%t}gv#ouJmF@B-?)`^ta#@hE_>=H>>fs}sEX>N;%O z!LcnI$HN@#!R%>e(~JLy+~5w(Ri_gw(g2BaZK6dYnX`~)+QQuXEzEy{ zA3@3HD9Eh{eK=@%=iYmpDvpGS`TRb6+t$9FN=cL+$n6VquIu4AF754|^!5%?S659# z!wd!oQ>v0?p%N!>A=4a8?eVV!Tm5li6 zdGg!$v-aC_C<=|h=vY_MK?q@`E&YGqeK&>Kw+Crwu{J-+?$&pe?eNJd8v;T!&uAzv z4ix*c(Xalew)ezE%C4xfd)wRoR3YUh2t8=It{2${z`kLSN}251)kA4%6w}P&c^-TA z^s#m8ZtCi$bK{K{vu4dE)~?-*u4^c(A8YOXTy@Kx#HY_^&mZq+Sv(SBC&8}TNIL`k2@4T~xo}MHdHf+ar zJaBOF6y3_n&rkC4i{lkh()xZ9F z(WjqTllX`C+Kp8^d;GVadB6QFnA-0JdVv{RhAX$Xo8>oLV(d8miM6wSJLvcW^Fpb6 z-*{uq-Irh9Vqbdc1zRt@^nym$_4J8gO!SO>EtyP_$>bR7+(NqLA?|qKai%Xi9{_vz zQ}~KBgivIXd!DdL_*gD&;j54+*CD7SS$OeXO>^cw^Zip7ZdtkPv-5uP)3<7_RH~(a zU#F+c14f0m0wb<#3_QKDe&wL!-vzK`OW)entG8b{IGFj?v(LVexbeo%q}Hry*%Xb2 zW!?+igMuKX#Bp4;Iizdj?0F6?T!s;? z!p9JcW@HUu+j!++ioY09s>K4fj=Pi+qInZgbs;jq}5NR&?U0;LqL>oMc(JLqd9EVD0!Z0yQ?)rF0mw z{JEs*`_!CDYeIa_!^n>KGa{JkH=swXRVA{v3(W!GIV6HVe^Q0@S3_Hmg@} z|9)9n(US`nRNwI9AOHNyP$=Af_0^XJySh>}ZEd?p0RY$as9SVAwHKY${^~bY%r(<; zOnH<7;xsSgy_dg6@M~5VPZF1nfatZxI+2DDNpUG}GSih#^o1vp6A({mc2dV)- zKut|aMPp<2P2sTrqG+^u>!p`|sH~-Bd&N~(t)Q)K51M9e_~kEuJFjB*_p^V0fmOV8 z#VJsF5|o}q&+88|(DvHe*SEwTx#{6qYbv6a|L%)-UX&gvS<1LijyMjl`O;Zx=5=l$Ku z5I+ewm&GV)z;h(oH}B@(epb>SwH=4W4idBf^|K4H^sXEj^@_>qsDgk=W^#^)eP79n>$OJ>(=6a{Dy zf45}2QY}YtJmW7I0}e%_o$V5$xeurWDq35+wzjr*-8OxCyj&?~Lucp6AkdV``L?D_ zi@jSmQ&V3HczBy1p>KODkq~!sh1zyBHvOycfCEX0WxT*dUp4a&KdVE{a5EpNByq9MgR^*LNw0>!hh}b{{Y8^|9^V1N9X_m002ovPDHLkV1if_0RR91 literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/crsc-action-leave.svgz b/kicker/data/kickoff/crsc-action-leave.svgz new file mode 100644 index 0000000000000000000000000000000000000000..b6a93b05c81f77f8268664b608cfe959b6b3682d GIT binary patch literal 3915 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 Za+fw1dCEsRq4DXP{{fZ_l$T;!006MOr56AI literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/crsc-action-suspend2disk.svgz b/kicker/data/kickoff/crsc-action-suspend2disk.svgz new file mode 100644 index 0000000000000000000000000000000000000000..d73b491d9b6d1aa6f6b6bb0d8d647981b0ff3707 GIT binary patch literal 12713 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 literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/crsc-action-suspend2ram.svgz b/kicker/data/kickoff/crsc-action-suspend2ram.svgz new file mode 100644 index 0000000000000000000000000000000000000000..c38d2ed33ce8b3402544b705bca2e9c17683ed9c GIT binary patch literal 13613 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 O49mruPWbcE-h<-kTByHlO%jfHLTp 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ℑ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

    -v0bA=Vyp;AZ91dx*{}k%V7dMi_o(cyc%QKF}Z@ zWwSe2rT;(>smW^VKgZ)-X^BFvB;~o})q}km7+L{ZDdGbUHBd%1+X+rVf3r~8B74Js z4@XET^$i5J+B3R}vBzM+0gN~sMCm?;^a@Gcz;uZ)S)cL!6kInVFfHnPX#)* zr_9Kov!p4wmqlBVW3fMDt)+0=9af$ljxlhyl`*!`A|+>zm5spY!Io6?h>@YI?q;Z7 zZd)TlBMaDp_$z{8@jS6kwA}Hy=F-LIeX-(=wH)B$kyd!xw*3)elQF6m%qVw%W z6I6@|M0dUyyO5zHji28W00h?9-pn$nj9K0wR+L*+@b1bt1DAL94X5O#LkAt(-6WdV zSe7g0u?O+brp{%(ToQaEDqx9L-8nH{>oo1bmA*x=ws#kWEe8Vpp#ttie>27&z2(e} z%lb;!;*p`pL}CqevnnNaL|mf$h5(i`Jr-84+Pd!b(yb6mtX6|?2PE|71*;Qq(56^O z1{7NMFK`AjzrYnK1=i?}7SKf`R3=6obGM{!5X&zgm%#OIjM$8~*|+5k{`y9B?Bnx*th&)-Y! z3p#2`oYPH)EDQeUK+&-eZfY*Q5q~e5$4?C{>iG~~*q*`~zKaYa&88q=kNx4F&hpaRmbpga`j9}=JGn)nu81&9 z5{CXPc=(j?U5;SUvE<=cV@`JhrwmG{SS%yUS1DY+x`%;xrxlT3GWMl(T|%u@4_sS4 zF5YL@z7y*(dIFJrvsaIqvYc#!T2i_GnUl#;d~ba+RapM)9@UUQx8z3rG@pY<{yR_Q zZKgsqlEYlXK=a%h*}3M6$e~SktHZM#G{re9TeLAIr<)jvpgUnQxxNmY zivi6c<3(se@(9g@m4Utn42TMWrEjuF5xCg0;J~%=D87KQU~>=qXTJ7$lHS9Zj49?0 z3lZpYruF!;&WFkKdhDow$M*X#rxF~H4FT!jP{&fimt4>LR(tfFpt-tDUWnN!zZP4k zODiX&Bqk(zD!KXt{(~u!a($>@uuxTxMEW*SCg~f}1N;Z<>A`5x99qZRW0y5){Si!?(>pciHBz8;1JTh%7NPjIw)(fd%T0nbKrb0xkm0m{%~e2e8YxEZ$iRQQ-7f zvCg+t1f|@BzQ_&8Ht?bs(SFWhv^UGvM%lJMUf&=JzxjSBg~f0hktHSmeHtW{n#ncg zWY8TepL`N%v@dzGISkKfI*Y*i1^_25ZLc&`qN3RRNM^vvvh%6QoA92WWpkS?wN%QLuxu#KM%mJQQx0Qf zmei@E&5xd;xTuQ}dD!E6HlqwSTCUd`7xS+p8Vbk#ob_RoOPRJ(-U=Cz$+~ynIt0oh z7;eTUbx{^b`)hIx*4Ptm-M5T3P6SThx}BZMS5|p82k)bsoS;eJ2bAtYpS0>|2VTyn zc#3Ap16?u|5SEn12$0N-@wiq_ZR$=HYb4IbJWNj1MHu}z@Rksv4QHYEk}td>~%YS*ESX&s7=Ew zTF0_<_h$_;@;F|w*gjGq5ysP`nZ3KO|>TEPIr?0eJ*2}BUUmH4wt=E-XNeGvb|`vTOK zlgO;j5hF_j#H~kF(rK=BvPZ$WgSx_^liqdT#l*gXLR+)w!uJ{Hr=R;lAIbOXSpGEe zd#d3Ejh7(IL)k2bckfe{awIP#p!vb?{`Vgv~c>5yN$qSxbfD zzxZooS!Sg-ixC*|d2$5`t^5S-*VIPEKKo^CAAj4O&+)|a9C7U!ya!E8aCxCRt?UBLc-a7D;^hg+cZk$s)cChS z5a+?_>d+=pluaz=v9uzL>*8k(f~6;}mzhV$nTi4xrC$)fR#0TwICYpPsX>bLz;i90 zNw?%U)>U^NIr*o(h}dYh)CT;5Y)dh{80@Y3C*O*+9Q%~CKOZ^bTNpf`O75Wj5Pzz2 z$nSk~Z8)y*)W<+0P-ZG5&~SwRQ7d!n-AxbGJ>1adQWpGFZxxn}p81x;K!K0` zC9*`hP^vB#1*B+c0rSI+edc!#T${A>$sTE|GDy@H9}rYU4>z^fnY1&$Nd*AI?%F>Q zvmeV=X4}E-5vrX0@iabdFAx`-H&qs@=3|hX#eI~6Z#H1n#L=iOH_o5VYRMP0iu4ve z!7oC&V!K8=x7)#3`J~J0*BkucRPjFiGo&-b;i{0zvSiAW*G4#B*mDEQ`;Rb7Yn&Oxd5P&6f#`hZj)Fye0OQh zb1O_;qk2r$vNV>cY-PcONi8DWg-kr>`PKW)Y}{H&>Q-9z6ZyV&n673n6BH8|Kf)S7Bqb9!+H3az2 zJSbm<7V2gU0qw}RxCpnDNQ%!v*B?6*5dX z9sTQ|$?;nlmC7F`F;p zys+6P4W3+idgUPSe9W%5By%9&RG*D2Op$^ko8sPoX8HCMSA@*C=lX#h;(uV|MkJ>6 z>GG0#scM2$9Lz!PM$Tpc;IZl=JE9=1b~P?1tAHpiCtCsuFs4JzS0a?ieU=8K#N}bzbK%XNY{tnQYL?jXEw4u2 zW$j2Jx^vmHEIS%6v6S%#WKwdwF_>XXNZbRcV@{J=Ji2)2y0Re3TWR-Y$`K z-FxPl#&@Iy=GvP6eJ=hoJJPE^=(@^UQ7x-E1~z;$SV?~4cn#`Q@KrEsax^!JWwjp? z`8=JR5IN9}J2KAUD@s!yTIZQy3$^;U_q|>hEYXJUY+wO@H8-ShlhLENSv-w*Zz0f? zyT2xg-(xuNR>DllQ;4jUBD6nu9JKuDLoI!uA4a9sE8 zjwM>(SA3oS8BzmZ5uj)%O!PfW7g+KLdK3sUwiyetcgJ$#Zkp2GS0ByCkTtSkeUzUQ z28%?@MJ|l2l@n+*%_Bf?kY7VnmPP}4bFsO|9beY;%Wo;4>BRFq3!cXC#1}<*3m(5n z_*|;v{xUx+e%W-iyQbKFYb5gYK__^{Jxtnp6E3Ugbwv2hajt-rn{?nr|Z(env#C-+{tUrn5vWQ+#QsETR!uuwx612 z`Us@?L4yyJH*8?4Tg9T2BqI!#Fd_A?+L|>k+{Q8#KvKt~7Ecj(AO=L?e=jPaT!4HW z`HM$5YMq|BP{kVN`3+XWd;U*~`GRAbIaKsH7PT`)0KY|EV-hlZ_h@nhDBDQU%#xdrtf z5~m^Pt%~M0AB*gfH_M~fqoK;NnK^lf_Kk~k%cfH;2q~*kwq05_HHwR>m0cansTuBP z9&Q2}Wqj!D&WFA5^jtzcub0$tmEbN{7z$rc%0hd#yFrFkZxihE`yZ!ykLvt{%c>8O z!+899tSD`kh>{{$a%tPetFxaxdLuY&?M&@NZCRZneRx07({Jc2?&J3r1HKZ>>WFHB zf{)@CE_WYg25v_IOQ|P`T<6B$SPt%{uqJiB?WUBmTFGo`Wkmf(LJzE+%EI zdZ)?y?jPMT{Lq?HvIB=hU_T9=UFd=Av;i)8L_)_gmpw%~?lNV)X7Kk7mUW3pfvq+4+mQGJTT-W`q{mm;VO&1xmX@NhXL98%7H{?;0yj{ZD(f-#) z5*ozeD^V-=H_D6%imlo`h=6P{L}8lL1UI*|GW4}F_m>KaCgDRPUs+t~wnQKRUhqO4 zX`HmfcMm;Gywa7{pu)@9!{n(CRhoJ)e)v8_9^(gEaN$p0V}|)PObele`W)M#W~r&T z3brr1GavXg+` zDoa<;lF4qV7x0>SIKTJbvYEX#U0OZ#Mh3k%lhgv&?URM`+Dikpb~a*hm4AjyyYGKB ztwM(|*f7}i@0Pu>_&*!*L2g3u8B ztgxnME74|ER(`WP^=IE+B19a7R-~dNE)zlPtM&cl{nR5~Gx%qV;X53f_?p}ph`L4_ zxt`gkSp4ELr=C|4CmDx6d!_;5qo~Zayam*WtgZzr^2nR=0{gqZJYqwIaQEI4|65jC#wSrQZ!Q;479leM;*RPbV5b=D(^N**CL9aV8aWehh4n{Fn7MaRGw&$8sEW4bsq` z-%YDi#vG2+A}6o6bW};fk{g}BBQzDepQtkL7Rf{9@Jr#V!<}bIbriAGbtsGRyci^+ z14{nv*LL5Ccp4Y@GnSZi_`k+=1j3rt6Bp zhLJyUad0N&4&T8Fb4$GVXWbWrNv$XJa!PV-*7zdcdXX~?iZ}|-LlDY`&}wlIA;T|f zazUk1#H=lr?t|(4YpJd_kGJmz>Y#yW9+uO)@^D_&w=+St89kT5-ib~B@&~xXLX|IS zP^UY;EB$i(8J_ZK9HrF$mKPR0?KJZmTjIS+1o#=4T=I#V?2EaB5RRzf%4Kb|t8%vhb;f@UVO&+zEfa^w0y4I|$!)DbYmI@hj@%}f;wjj?qRIOo~(USZ*3xCqaxdF-EBW@7D{RW`Bf zHTm!|ZM?vP#S%9@&^6`S@??L=WGpC^Ll7~@105&^n>7@~RO%MRsf%RX8Lk+3C_sHQ zcm+Y;jAmds*+0EU96l$cN&frQTVUyenRCXU>Wi-7_vro2b6?wBgd@pp8KGg8qg20r zmhcVP-QWhkNEmxEF#cG5;F9{i^LN3ZSwnMzpv8`1m9z>2^f*rnj5|h47Rm&a9u3dbf!uCu?asJ?=MxMb1H4De+`^*sFQ+wG`_b=`Ppx!m=d60F0KLm-w_GhJ8b> zG84ba>T%gC!IGP_qR^yv%cIy4UAkF8=^A?FQM<@-YT*E~mW~RZU;Gd59p&Nu2!Cte zCxxjK_wCylN~pjCdJ_nbDnh_y>SDldXUnaxCo&+$oE^*4(&Le=aXqaIV7$tRyNNEz zB|G6vwHodQCj-qQKX9a}{cdKbx}>P-4O&~*;6)je$s(ut?jxDwb7XrLUD>rzIO9nY zy-W_fYo8}RAWrk64$*@sVgCo2a{m7?rM8u=?vm^KCi6=g&Ll$E3ypHT)ZC)5L}K2m zyt0_QE>3JDXTv@QVpJ>DdbZe1A>wqdRWPocA0+(_oLEM_^*LR%-cUt3dwc_ABHfC% ztP;k6FHUUV%A+TX!=~3uFe#UaQwj;W68JON<51h>y36I;rsv_N_hbPD?;H%P@H^JW z@7zC$-(s@AqjBT?YtmHwiUa8gC72J12|J4YaQ@W z9GU?C-nCMo;nAo$^1GjyYVt4N%UugPK=2Efu#)PfbS;J)`TJYh96w-4uC;Pjv(;2x zn;nQlwRhuZUdh@Im27#~d&ZRL1}ZAz4dT4FeIb#qmL)+EEN&}&hg zg$Ec=l#vx#WJFaX#DxgTtX2sKRB28ZywQ`m{LQ;#6HQtJ&X^KPMUe9j=GDU0GgRDg za9#Fw%M=gS`xq(Lcy7^~icP;Jc}6N4*{I=F%3NG%vlF*6!SxAai^ty2Sca$8)4VESyF~!GpV~E1EQp_7$fa(5sWSM zh%zd7c6fqY{r=ol&utk>)RxT|=sK`QOom@>!TK7exnRVjvr|t0#SU@!ind~UwB zsd6UR+$gaid}~Wlc9rX|!o6LG$C9KZYgfig)Q35Km+U$opFUmC_v?iOSY7-b?G2+= zd!hw0q~O4OrN11PomaGMR7{DzH+^JThoSMYOMG;x@?B5U1}cL}MHlyD_`wy4L&!E? z-%vdZ*vWOCpYR0ATQNAd!GYk;yz%C89kCpQy+L-y5qg|)=T+k#UKJ+quFdr zyrWsSZ?)Q09NQzIRnK_qdavF~`gRYL&n*?v=dY^fA$WIgJnnYB{JK$-F~bGasph3X z000g}BQD4+(Y47~wOC0dgG?DJHw5E9O@W-NLV;Lsb8t<59~(t8JQkg zOuz5+fmvjOGpVWt`-LB@se~*UncSTJ-qqTNrv6(8&EAbd5db*+|B;c{4sG2jg z1lAvsF<>7s7cr()A{1zRnFNl-ipf==_j}3sEY_B0 zb0a#BMNh7Iy}sH=m#7H-TWvx^GUpkIIaxjcB?u=%7y&ZecyJJWj8=fY2Jzpn9XiEu?pxP!X@PD2V!f$Cz_p=?4~D2z|ab!z+DlP8L3BmuUJ zB+2oyt)Rfyjx$9ki@e|N=)1>4YybXcS46q~Jg*!w&MNVrbYRoK{KJjI>p+BP;3#Vv zYNxlKg{;QYRP`0Bnef#SA!L4QJ<9-!I6!#D2+|Gq@E_jUNQ znrGu4`zPW4?#JY?r@9}m;PXqEJf?3pO*KeKp2_4GuW=u;iRV$gt+8FvQIsO2+sp=2 zw^2Q(#Mr^PC>`lx3f~>MpYhXSN%jFGZKT*M$l!Od6GCx~-1{_M(@T^|%c=>7WhdJb zsRE3E66I$GV&7r!*^-hb^Vo+){5t`~$AV9XH8%>u_3Tb3hqEdSqkq8ACIZK?&1HiY%C(?cuax616Qz5k(s{P9eXcp$UF%^i$6QbL zC`f?H@uqWXE?5LNEDD(51<%VC^@(6Svi2M+9hR$9O4*bYHAPqF!2ODcUz^?pBQzoP zhcT5wp~FLn&AYG8M3OPZXgS@2fsMT!_CuFXiQC0q*6K|}7+4Igk32RT?K)msv{+QS{BXA>qSkWb1Wg9Hs0cA4Hz+5{`n}C&(>^J;_=?iOkwGSJ zTKC?xHt%BP>i$ZLvZ_!ExH6-dcxol8z6{rk0BP)Y z5XH@++48dGHKp2Id@|(e3^FK!2GFc_R>V-LwMqHL=MZ_cs0J(KG$S!(PC2onn@+u} z4aH)nd;pssW&jEAcYf#`O1semf@KjA zPs%p-3WoxR@pQfux0O0-s=P`cH>`Oz+V3w=ExNHvn3zHRb7LJEn3za1Wz$yPys1?p zIzny@v&t<3jYY421iC5(yf#U`z7swl%c*s3vXV6UXTU|8#+Ers)Un@!(hH)zT& z^=RJy(Oq|56%AVT|27)5AY8&Ur<`IunppZ)W3krBw`zMKX|*c1o9wmJL8xbw(0ufJ z!o12(sa{uA>4!=Lh2RWiv8Zm64H$5;v!5BH)0Q-7P=zCJ;JmkVOcnfK`Xw>)?U@hBil#Kkl9+J z`Ct)7dL#kP*KLI+U|uO;y&Xwz|NXv+l47y!HW5BQV_^!)H$}-sIGhgOQq}YrJ=5Rb z7KuN;wC-F|jmz!ED?<$`K(IUvFFGCMIZzW6$**<*Ggqc3Utp+=ST4131f>q4Lvn8G zF|tHm6dW6CZh!bgQ)8&?r~uE zRc(#ae*t=HMlGTB-c{J-sdKra^^z>AG?T5gscuRk&cTyR%sz+e28$$83NdvtLVBzM zQeE5p50*&XmB&4i7X!>zxtvwOfV^$J%(}|sFY4n;G(U@JqK|A{@;ho}4|I;}xvg8f zqi6QESTjw8iQYrpcXL~^8@Gl0*AfwGQdON1*4s5bMo%I8ssTIb(AqBC#Bj?3L4q-b zbySQj5^dOWx~k4-wl!p^lLg=HpB@8*i_jIkxr6uvj3JPmI~Ze%Nfon~;X3y^kSK=q z8IKUp10QbF+$WS6V)P8-A*P$0XP6w>SU`7#F%y=RBEk4(a_~yqjTkOCM$zf!5QeXL zGW)0#U-D)UHQK+$l3JjgO3DgYoX9-t2!S1gO$BcNHKF{w7MilFpMB9fX_tfu`d+GTz>aR-ykCR2$^(a^_mTNZT3CQg- zykcXF#S+byBFWOw$d&UY9Vxq^;Ah^>pK?L5kW_dHKOiW&f^hupC-zI% ztN`V68CW{hw1IfsRhfd^Q;8#)muDG|e;27za-{!hFFFQ*BD|SRWesX*#gO~)an2Fs z2N+_it(|m!q9pUCHQq_s&eO3rAOTh`$^A)^S8Xou16$>-V)+tiL^?}lyS10GoQstX zQZQrv>}z0bu?Ro_1f)JNW2VL$F(~K+X7hEB;5?oRxF z*WtGxJ7|fyC2N~89zFp?h#9UEd(c19GtD^46hs0iv4eO~ARQ+@cOTy@n&sFcmS!my zxLW&LS4Fs@U5kJc8!K92m`p!*KjVO=xZG9YvinaD>6`l&cLKWZRMs&ciCQ0jivk4%p! zXMme>lPTQhoU#7CYO_apL${ugQ;xJTsBGAl9JJqBm;J;@=wtZHe8;(;u*3hP?KHjO z5*fy<3LTC@4!!O~ifo6QF5&F~6{{{q`3^;f?l5Pt_ub>H`Fc&BfsP6VGF)6_2TSPh ztWcp0gb(0ZkYulYhlT3%Bg*rGQbc!M+b6K^^Ko;tX>KI$==6;lpC<%k>wb97sd`C% zx$ByqXYyruIbwWWkS%B(MCU6ceGDR>g-y|}_{7L-e(6-T?N!G|0FV^{J8Qe9}B{4Yz>awe`rEwa#K7#P)ecavb zvN`|lzqeV1AL*nPU7J*r8(Udef|swN3a7a?8VIM(7!hkesrMwWlK*`y?SiE?@Q0eL z$(zu1+%$DoILq#KVNvfr+sgop@0NWySrxq9q}~q5PxvchrqlU_4~2U4ZX)GEpcgEAP?z%X7S+Dy13lc{T^QjD zTtyAEYT@7vjl?{c5%0q8s>qwUR{qN&qiLihvSPNNp!t$b6T|Vy-uI99Wt)kR0xR?j zgYEyM&%5RxYYrGhiXWK`=3Lyh~hYDGAUNZ??h^0)S}1?q|-7t)zF z3{lwc;DXPa4tiRT!4)`?aV1LcK7a4cNBgJolkY(rDvsaX#K>tfIPwdq1PJ|>Zc7df z;0<6i9!jPy0n54zX*^N$oBDqG!D7eSDgE=!7K&pix$&YsNjoPLa$+;6Z8ds5rP}d< zzv1S>!RAi>KAO?t%frC^=N7f+*rRhJgtQ2Kb&WR%IMKX@Rn)tqwN= zCvI$hOskt$9=4!^dJ9sQ2^^Fm+rU$Q8x!id9Mt>7YqhlY*u&@>_Az+x~6#YIz}@c(zs%s2uBT8K z>ZugrJTsn*GLEz|k6C!u5tNU5$PlLRg2IoOiNy+UqXtG?89#XfJtcx8tiCjd?WsUh zdm{rFGxFZcufU*_CstD7m@{+O>XaBKof;ZHMw^h&q@aKo<%u|RbLT^E70u~MhvLAd z-$dnCa$lO=fDv1muB5A{x>c5xCOmKm5Y%X%VAMjNy6ha~+DMs@Z0R;8K#WNeW$~Yq z4p!Lj3vTRgpHKXzge6goM_?h~c2GF9crqpFg{25PsGrAP#U+w)PS?A%_Gh1^c{jfK z_Aw?$P4B6p+@2=Jw?*pqFPhA{Lm&$RE6R%PPJ9Xpyx%?e4%r?)RcGB4wVms7T!Up4R9$c=ocvrK#->>PX*hBS+rK(up_rh)?~Y~%`AgsJ{S>1Q z5W-5dGm}Kfg{Vk|nj@DCY(4e@1>l*>vx$zMSLaJMyKFTO%*1ZAD|qUV-SCl}(ko0O z7M6Uu-vVOILW}%%S~8oD^xuND8gQrH*E9G}p#nDl@zk+Sum)ud&KyC1PQ)#YV^gi6 zbG3$Aqpy-=Z?8KbJ>pUpZ_CFlx(b;WiB1C^P0{fvPLhz`jYaLtK>RVd=gd@zyd;sP zNi_IxmN4#bGYHkS12yH@?hQnd9=QZNPa~HcyWUtj{lWq)TBS_b4YfQdr? zc{$BeN>GU=qWZ`R#VV^_Ata89U3t z=GkXfHl<A+N|`KFsqYUtDapT8KX@V^kVq?$McFmI;} z9QW_>;elmaur+VZ=h;}k^oU{%-=Dza%Ur@ppHzvK~ z{mZ>1j^G~UrP@xdZqf@BS@9}w?7*L#nSs_af{a{LJ{4hZk+l0A?$ex>YfEJg(4DA! zB8mW(&)UMm^?pS33XPC1()hr>A-y0b0AkFSFJ6c5x-lB4gaRz}=4z-K5+~CuPc<>L z7^mOEIrv%&cNNF3aaIkZb`B$zsZ77>%_%9~f=22{H`q^+O6J_ClyXJNbW=}%Q#^Wi zqA>VPIo7Ue4HqTP$|=*`}>mmj0C>aG6yL^ka?SGtI*=bWgVQ>w)6 z{-H@tpFd5js|9@(Q&1aG8rnXCU!!KsSJK>C9`{-GB*=*VMy^?p<(sV4#pJbhaxGf% z#2X?E{wx@pScSV^j2nE;8_6T^XWBHq7{+Zy(u%YE*h|a&b)>DJ?953x{>W-2PEv8K z++;2}jR4CX!?C9g1U&D}CdBHry?v{i|Gi(y9Wf>wKf*bGx4(irbz-wk`+ms|ee+&` zA>84a=3%+C6kN8TkwBMMsx??kcdbf&vxCpU|B^^ag|v+1@Y0t(*YX~&K;Hbv=V?{( z!QvO-ibl*)DWcMnl$p7FWp}8<@WPM+OukFtsiQFQDoiVDH_*1h z+h7u8qDS!iUUTU1V~8M@QikE#gN~=pMqj?bW2682+59v1$XQkEvUc5aZk;$YPv^qJ z*iRFh+?C0#W+Di`Nrn#;Beo^t<(G{`j6d6NvAAFt8Ca`J9fz7L<5$Z?K(LQzXsVP9 zsZuU@63K0rzR35M*HP5@@oagr-R3!oso(+adb;v+gM~rtW#!XSb!KUx?2E@Bh#aCt z3(4Hv_3#X5TJO{@?uvD_-b;i^a)mWe@C8Kyhf^P=pM|~3T)5r@^SDnLDEl05w`cgb zby0$TQN+Cqv3{%8*_E#uR&xhd6Xw^EECSVE;0l4y)&KrRXTPH7E_9cktU8rXzLlX? zy{~9Wx7sRLe`Al4Rv(FPjz>d5C^9ZOA^-hk7+Yl>_YwKJU$kx@C{`9Nf-I^-ce_yBEB~9EaZs#?5a6hQ$Wv zs(85?E?irjg;0gBIJTaLD8G>0>+t<;L(G_PsWq#_1->ApPNz~Io?Iq8NxCaF?9nR7 z7dRYxe_-RJ#vn>U>|Xy5@?z$H^P;z{&XVu@MdbXx3WnIpCo0m()avm>pL=+YOU8gn zE!E4-8UNUN7E4MUn?%ZZx$m1%Ctxa-Uk*e5RA5Bp`2M%$(C5*;^R}()mW%}_^9eua?(*uR z_)Be!`~)`T&gFprpP$qsOh6oPqm%uGrN(22ToJT+F?c5a`m#{OAhDl=3lJG8y-uL` zZAWesQe;Z%w{8qxs!I;E+%-)Kl!5_Nn_$5!_oK{o=#sodh2!(p9bX6_iia$?kj7e-a+O0#L88*b);-)O?D5a@=2 zBLb|{P&162I$47$L)KOEFgzC%<^9iON4_B~48u{gm~YX90f8P*0VHq>p%MsI`WoIf z>>gR|>MP+R*fw%1MtqZesY`1W+`1Fb6ShR;fSyyNmo6pu`NuH_nzR+tRP{I_2U!{} ziUp}fnaK?$(vRU+`6oI{TU1mYlp2xN)_*^u{E+oK7r$^m6gPAROJ~0~nf6@N9Lz#g zdeU3NY(fBEqJF8ugY{inYk;$bB?#`WW;E!1r-M)2PxON;gUs^Z$E&$I;pQEy<`@qs ziP7*iap}4?`xRg9(l|kKd>fQM4xd*-h&<>QLNTPzW-#s?GQH1?%gUZ3b_UC3Eb+=m z6xtaX&>>}0&P5lNDv;sgrQ>!-UOgUr6nSY{z0;3zccbm<;TD!zX~Si2`d92@_|>yY z=niiwcukOugF#)H!AksWM7V#G!+UUR?@Y06m1ttVVZEz@F~CgA(blRC`#wK=J1Gm6 zv0N?8BKbU$pXndVR`=a08x%{|E{ZcPs`I5vnO;t=vMg-O4^)Z#4}-K-i_OGKo~NZ5 zdYeBj{Rtu1bdmDMf4x4!iZWAF;9!N+V}<2h z(;B-@ug3@8=Md*wjFQ?OL04Bb0#f!r=E$_ek7V%ys)Fq-UcSbb^NVc4{NuJbdGca?aWH?S>Mc;i}$$}4)2cwGcwm6cR_zr`eoXz!qHaM z3FakHi)8TXnj{FFCHqiV8R#`Uk8^mevM* z3P@)pl(Dfi6XC%Ds2zl_iqkU_Cw4T?!sepwoX>qI9*LOMJWwzJP_Yd>8*;6dE@*M7 zwqOy8RPyjah7x*zRYs@BtAc|J!(bz)q`u`g73yq6xd@-o{yJpAsK0un^fF0XSaT$v zkjgW@+*1&a>aGEAo@lbbgPuVhyK_S&fag2r|Cl)x8$7cV3{8gxXzOlp3A4$Y zMf55!%ND$>^MAY}iY<)?k(My|habVh;a2uHy7Fy&ztMI0H-NI=eX~qZ7pHs_HTm`s zV?k+AIQ7rMIavSGPE~?il&@#O5+BygSp?V{3k24zH+Wl)I}^lHRrO3o6I|?(0Q&5{ zR^t9TAV^IXDg=hHEp59S*f7F~oN3QqzSg$90*i2TMw!RBbZPhY>LYWScYJ(h^M3pT z%%S}Iam4+b3Cz${KU~^U!xZJbHOymXL`Bh9Eq_fDoJ?-8F?hh8!)K(s4-5qRI(yTA zVUouP!=ml{2z_Pqb9A@z=&wtqxJBA}%_014g*ShieE+0(?25uV4!sd2$gGZ0b0NQx zJ$?LVG`Ajgzin=vQQvvs%B!Q?NUkM5#%{vufQmLlE2)H?N(#S2iBKCs%xefO^Hus- zpLf*as&{_n1LF`uWg)ZD?#yFH%)hWrOQX>RJ#YV33P;d}UEuco6RLFh%j&BSRsa|@ zW|jGqTB-?X2RrcoL9tYGrrf2G)-~{(XH}KTK2%e}Sk%vm)M~R@ljvgJ6Xp`9q0oFN z5wyzj4%Gg2ylR%*|jd_(2+UN8T*DLMJqCV!f>L$(snp$KFE4zAr8 zbJYBcpN`<#)RHHi#Paw|L{zWfb z8BS!%<@yLFGabKV6f@2(Y{H~@0J_3+>RYU#i_S}{JbBs;vbg}^`)|d`;muh3&5T@m zTlF1(&vPL9x>0K}c&>;PoA>VX_(`n~{%l(Nw$lpu?+153IvtueX|_cwk+kYx5CBCs zDaHGA0I>2k6DD^4{Bi48Q!C*^N(Oftmm074Ly0EtUc<-%P^&B*+ha|CM=$jIl zXO!t(zqDcmx@(7O{Y5*bt@I!{D>jX4cE4Q8mC!G?g*bj;ws-&il8r#%;S6Dj zrvg2!i|g&7pv%rcq5V&p3V-!SNwc9#(!E>t^`3B3=3ya)-!{>h&)!;bpHENT&BT8I z@qK=+j&2M}$mly=C|JO3#lY>UsDWK`8I2-Y2yqf27W~1emc?+3Lg(pl7UNLO%r+6s z5HsIc?>M!Q6TjQcepQ#mfk)8-fe)3d*~R^7Ct8eaav0K^7O2Agb3c!#BD#_?w$mf& z=6X*CaS)e4!*zn%9*V-5Pd?EIEEEU480ts*fktIuTo*BTrx{lhL!?EO9!JHYNpna& zY*vEIKusmg!IeiD=jX2hgcUbY@%Lf@c)Altg_l2G zK9YstfZAlUUsTUJS@lL5Us1Zs?-EhHd#&Q2j@51qLue_<90oF(NxNjTpYw3qD-9^t zAtpJi2YmENcBzGx(qv`yccG4qSK{?|ya{PioB8Sc&0{KN?Xhn)fo5flVcfqp%YSK7 zOG_cxw4iFt*ViV#`FYq65L3z|q~X`F@>7OydY#NZl#ncF3uw6yp+vLtARVkXiT$3h z$0*4pbCPP485cb5t|298J+&cU`!P(GY%4q#tyV>^Bmv9HPs>~Txl$Hfj+mwn-d#S=a#!eyM1#k&_X z+FxDZ(SvWNX1m*ft{tm;gfr2D0d9*pzLfX<_%4NfYnA@c2~%9CN>8>Jvfp4+TVqDO zb~%RJd*(0Jt3Y)XAE`%x%XnukXN|7-LpyPpi+TL2PaBL_@@)EJLmR zLvDA;URm2rlWb=krh!vFCD@9dDrzc>Z}K|7$seAbeFVdM*ygbl)3>g+kE`3f1-SIk zA7|ks{q(}RE3tnm{+e|MhZLT+*^rmhPU#wLjJQ1P>*CGJkN~+QtT{%bce1W-UI-)* zY8mde&!Z#i|B@inEUhjF232wJJaW<&Y|6GdpwtSNa4~*`m_5s^Uq#3bIsfJK=AGWg zvpV^h>dBNI@WzO=0MkXyxb%BkiCvw$`<<9OM%o z$?sV~ik^-nPi`_xx4=4&@e6;T-Ju0J*ui@F**L=wjLk(@M>bax1s{=6rxRz6JK3LO zc4jky?%xECO?Y1340poiUOB*os0R7p<{feh64^H|Ah*nsWt+^RTaf@tXerJ~^4DtZ z*@1ro5_Qjq1aQ+^Baa^pgg?#Zi zA|okD+EK}jd?$n4YC|adNJ0p-5n2BMm>aQJ{&mb5ND+BL5uE}7r9x*5Hm6-qU#kJD zbM>aYk?JDh_4CfrAL3pT_U*}+{ZNoA=qqFu*;M&Twx!w9FDX`u=U zMqAgwmt?5Zo`pn-D5f{KaLu!8?nE+Q^Hi%^3?UX{>4KzM8Le}&@pqaLo{+|PCx}O! z;!yWfwqCgiDSsvzNmzPg+wiu>*(5xH{d>fn@%}IQSYk0QUrH!OascRk;tvS0nq7a$ z4j*PAb!(57gg+cQzAKHb8Q>JpbfBXiK?x~RapLiy*-Ux2_oZ zi;VAe&QmwK$_^h?N{1uhc$Tu+cJx{upKjEmSm#bz`n{RZXu0j55tQ^B{F`8nb~V~} zu!J=yWqAeFF#8q7#Eh_Pr>{ItpT)WIswSei6)zIH+v9;TsK~5TA*z79RWJBRIbU`j zyV-Gir$9)s&kh{fG>?M z&FAv>R9+Iiw{<;{j3g%-kMC8jn5f5r+T}~ZdF%r2Om+bT9Ut~u&A592K$&i)Ippjs zLd$hGYO-6O*qB&^cKUEf+4b6;iqrOD;8Dp)1WnL&M8NrS{+orFO(;*M@DK!mCPL+Z z9a1jS%_ydOUo7&uo*ux&q)P6hsP-7Q-P&X@-kWu(R`)hzf&|14+V>Jdda^h_XB{^3 z{<^8@?Yjo=;A|C#n@`E)kk_a%2`a4!--%JHF(O+m#qG;?2SIoC%P^7JFw z{r!YTV7Q}iI*rM^84Wc+gPC)xI}!WkY_kBVKNfB)l6hHoo`!+TC2QO;!u+JuZQO`b&3>Ym&~%r zg^P49bj)?7uCC8i)R0~zg$m`08PF)hA3y+P-yfjh;3FgM=Zj=I6Op$ZL$Z**KSTYp zBsc-z(A&((g(6Kl_Iy-474fvH5eM3S&EC^3hDq?xilkq3xdF0LD=?cEIPpsf-zW6g z81kt=3!iHA+PFJ(JJ>K4nK=4lWV&z#XoHsVL|dcm%$Mb<220mBHOTreo8a&9q-3Xa zZVdBDzD$)4<-@RyBt@9V=_mbz?o>(|oVL;nY24c~6AbANL=u6tKuGzexjMzd;SwKg z02>*B$I!(fI2!F>W~T>w$aw2v5Yw8IsgIIMh6`T43@YZ$NM1Ab0K%mw6F%nw-0`5XAr4;ucM04FI71Pz2>cKvAP2qd?Sko|Z>qz_=Hi?`s>rAL-|A573-% zcn!~Gd348yL2TU&-jGZwQ&ASuf9A%B!fP};vt(*l%sqyoUb}bF?rFX)6&cNe5JG}8 z^S|tERkr!k2Y?W|{D6lFG8ymW?srl zUEes`>k`g)l@ix}_xP!wrCIW6nrE^-E>S@uFY=YV@G|-FqNOGY58L&zHO}=OauN(d z&U{D#!(=J-dW#0=3)EhKw!;?(J3!04*Q@kb49jx{57R|&*4Lc-#czL){XP{oc*a>1 z3geu|NLL7(;Jh)z-%Kx|jImsH)xihdbGm1Wul2nH5s;UkQ)yUTvuhL=_u?WMMVhE4 zg9jR>`R&?wdNq=YP9@`H(Tal>s4pJy=+C-8%gRZZiNL`xb7@_nj2M0>uNR>mAKm#p z<+q(q#jrdBKt0iHJ-NzYHUr(|~dUht!z>$>_?mUJyVXL1YI zEl+9=!&x{pcW{x;#mR^M^5O?EC@r=UZ)D*X0hxYlvUrY$`+BVfNNF3_*rCbOY6dC6 z7G29dUpfms7|MLl4P-%ymZQPy!Uzl^tkR#VWvES^ZjzwvcR32W2U(}jJd^(Zln?8r zF5=D0qm;@_EhwOr5-u_y0}JqlFftO-FS1%5TXqWGh5u=)wn6twx`Z+dM6?K;{^In~ z)Fajo5b@!A?Vs*hP?qjazq9{q{+Bk_1Ie4l7z^^ZkVz)$j^6Vk3WlVPV-bI5Bi@gj zl3&3NyP{z&bL?jhcS$;%-eJG+f~%8CEnk93NP;a@2wD*ly?2jO(>jf3CY*{&_v<0p zx;zPC!2n3mIOEq!Vx4};B!4>37U?=?ODss~kWDkT4t(so0qg5>2r`W(=rGCTtkxU3 ztXIDG!&@|q;a4PHoR6coM-Mx^n^oL*#jTGT3alxO{iPopNa!Ak#CTcm^O#ef|H?}M zF}USfZ}HAGmo5MxSz-AVp6?|fAOwBzpSw3xEY4wj-)p7XV~zzGnr5e~szy)!Hsx)$ zef4M!_0~_q@OmgcP&mlN$M4g3apEptsLr!Fe{Jh*{*lFF9G3LW_7iL?3bfMN?rTmP zk6GgF1_5)EWjQWKLsP~!;AR3@qZ|^&S^l^0`j3}(){yiAv6kUdX z=HRpHLk@G|6YMcZ{Nno4d+LoAh5Nisr{{7u6GFqTN;_so$-2x$9q%&tTneulUzIdE>$>7g_o(W{Gy|VwooGv=U;9 zm+;cshm%K##c-@uSgMT+?ht-`K{;aQtfM{J2xzt1_eI8A#X5E+TN&wlL2HPalK57k zI5n49qGue3{$&g{)5tkqGAu{03tBSOfq2CybA>SKJf%lf5%KDY&d5C8>=r^w;#?f= zIG~Q;kafSkaVuVpWSAPQj7osieF$^rQ(k7#Y#gi9KO4!s2I|WSFt@P2Ox(s~S*?B* z4$7+!*J`gvgTNSqB}bIgP;!41Bb{Qsyvhy4{`_|Px}QHPf_;j`S|qK~#WLF54)u@z zaYrx-zN=l9WN`j#q?Wz7$hI8umwKfnd&h=)Y&uNEnjt6JfavjGc;l|uEuBP5pn$+J zR=<5+3%@!mJp2L5sJ1gk0*70Ki2y$Co9MvkOX9u@TAp}^pg*<0vwwPOsltX*1iOMP-O15v4AY{hl#I)xoJB!IpQPP6EM3Eg{6=%~Cv|^#=C8QhMMkSneQP`aZ z)j*{{8=vm21QnGINt3y09YX>@{57#oM@{tGUj_)u$9M=jmP&DOQN@S zeu@}wwT{*DpoHT@Ef;?D{*mx&L<%oWZy#m0-*BLg<8PS)dmO^|y{4;QB*LN{tyw>k zN#Y-)luBtBboJUJ@oqen?NFt?vS`>#&U%5hm*04RKu5)4qKE(N7!K>CBC4bd3d(a?S@I7w!Z z1*PUN0B%O|oe%W?$|Uhktc5!Lqqc`eR1Vbp5@7SEfIcED zLXRV@qhZC1Kp^r{M$dc5Fbq-FTGdro@J}`Mg><{GsI725mFkx4@+#F_MlP*fM2{OI z+{&ou6E00CvDcoxWct5|0#pAF1-e;k4|{!V*4aFsPwH$+DME=TBwDQ0kx;4bvPN(_p9gj1^yKKM0(D zQWwR;I5E4^K1i}^ccwzcg6FacFpUW3*Qx!ibL!%8pxAvSd7Ta}{6^r*=&OvU60Ez4 z7E#Nu79Gp(%STqvSI3mTZ9PM|#HZuzY?JPqondrfiU-zy z85S1;u#HSwwVG@npRZ`ubQzh-=AF}ARfG#R>Z@1lP@h-hzFlRB%Uk_lQm_(abVrX} z#ANdkqbYG;)Y+0sTyu^XJsu-au8r|6p_%;ASR}!rQ)7oo##CAsLCayK7M(?`i}N0I z{lWLZVne}l_3gNGd#$!Ou9s;YeU=JK8HW+V>+nBpTvW34hz7m;fy$@n6G_Y$Dadb$ zEkMpjwWvg&1E+D@7R$zY&7+slqISIgU^=w%TBZ^OBpdbB8TIR&@j>9dOxHjaELHTg zOq@7{=Xh0_S-)B3luK!!OWBw_Ww6sA%C!`aQb|$sTFd#|bxk#oUt+ert?&oq?59iT z7-MWm1sx^gYm_5SR|`6FG1JQCyhvCyBiDlh;~SiqPAq*6pc~DnIJcU7=Ck225#v1y zr|qwB$6*OuHgbjZ+yh7-1x>GgCc9C#$#|7P_c+-3b0*>8!Bg58ZLl2kd z#nXj}@66QtLaF{aHx-{}`LFYq(x^LU$$Y>UEvNzbf(C*VD9xl1oa2nrsnyU+sTp7n zNR{Xw5f@L{y5w#H+x0ESWK`6NYdPWgkJN1vJinZx)3Hy@PiA4w)ujhy-B#0j%BAk= z2EuU1?I+Z*V zCE|k`plw~wV*62T8f`H^z{zA~BEt<%osGz*$|l;zBv|EsI`DhmoE0UV(DB5Tk1E)` z{6XsIRSG_QzF({&3dOJqOXaRWeKzln&wk1B*=z0zotF7%PMSdh1L(Rt;1a1bWy#=d zbdCzpc=qiZH<~Js(uu~+$j)kzy99nhotmx1C(Abe;PBchqOT?Iud_g;w&8+S?*2@e zmMt3Ex}s1L!WWd1=JuHtDVwtPxymU?{7a^A_eisH+>$}u7f^-Uvn(cp7)Imf`!!## z7#YeRYVTsTnc*rxeWRB13Wfp3PIjs6)1+ z^`E$p?Tjv5i@X6^oq7I}DwWgr(~4V~LEOWGt%R|BFmXTPhb{)6)-!NTNTeAH=7N5H z>!g3C{WwZ3ICCp@VlV$35OX?emYdJRgl`wS%GM`*IvmR2rt)!{X2U1>S{lU6R<2ee zw~zid2@2P?b|i1$r%uMWQa@YC7^_qU_GH;3v$vb6I6t*cP-HDusxc(U53Gi`QuDt+H+fCp90sfH>VIUizj6r14|0ON0_QfPb0?!1ep=5 zqJ`J9s`(aE&q8CY3c54PwNvZ2-0M5UEPt*oJBPv^rie^5tfKiuwrmV{4aaXA%n|cd zW)`nfi1`pr@F`jFJ|n=laG+eYiKmvLCvy^EI9jXel2g7N~5Mt`tr>Dw7IHr)*;f-JE$f{j>Dx8mtKWb;Y!= zLbXOiEW>e8!TStDr(`Ev?&IK1ZeyE09tSh*ebTe|-US5~nO%fQ_w8)tH97ba?VQi4 zFSBShoH?&QpdsiY@H^slS}Z`!WutG>VB!`tN!_%0!&@$=S&Gewc^{0GIG;j{4OH86 zLeY;EhS$$Lx*s0oey?4w5gh7(c-?|Q88i4iX~)<{1U`DaM))7mfcRDy(xqqbf#ll% zB)mc-hNchLt1RAFDdW<-h#waO6W}c|6$*2SqVY$ieY&l);lEKOQDZb0W)QY4)_70q zxcFQPHA^3n`HIPP`IhT(HAwBhjAx>`n>|l58Zsw^*!gYsA8w$g?f3jj>!_+|34Hw4FA={)Q` zJBqWhs>a8QxN>`q$a?gm8(TO#bO_v`r=S1s)l=4@1D(W33~ z*wy5)WIoAgH=)Odn*Y(#i`MX$u;Tco{o`2D4=FN_?Y+5Tj}P(z#pp%*QuFAV5W^}n zRtHOAA`OZ>ZX#tV>w61sw|}MS9Eo@8J69g*O_OyN@#727=LgwQHR? ztV;*e2S3(w#E1S2^S0O3!qfcgZ3;u})s8!*@_p_a8VhB@2h#fjxM5rDY+$xR~W6t9)b*k)q z$Dx8tpOgz*=_8=U1r_5HuBp;!X|_^3GYBa+#$0?RM=OqBJ0YMJDMS8xU}Pkx#lh4s+@Jh&i`7O0D`(he}4o&Zisx?Sx(Nn4^N4t#(Tpl_@cIj z50V@(VWBcWCU#GpOvxX1F-vr{=?>X2#qr+t!ZBqbt;)NxB+`YA{QDVP+yjQg9~M1G z^WJsCn%ZCh(>RtX?JL^^(rHzlyKlT}g+>e|_RgRkS(VSA6qmY@coYbWN}8Nsg2n!URMGw+Q?ZH7x{)Wn z2+QXlec7IDz;AHS{gY&0i0t^mxw4z=ERB=({6rwvQE4wx%m4PIhErC*zZC`gOEH-B ze5@uoyU;-IyVU4TJ14pA%?S1w@EvhU`%kbPSss1$8UfKm|F>mja}X``H~H|bb!czh z`Fl`cDLw52>DQlY45QwO#os-*H+y|5BDqc5MjCG8tfOj+9R)3L@eeE{kcn8-8?d%F zMZ;fsW8a7|QSoj3_VWR&sL`Q|$Ft&BJ+@wbaTXw;5x_wU;jziVs#{M+jYRIxz>9DB zlxx8C#!yZdk(*JSZ17*ig8u)n5&aJ%=$mlYNQpcFKJ&@tb*58 z3rfS59)g;S0Xl3pS4j6F28U*rgawhA--JqP7CYdqSGS>Fjn)dQyf!-?Pa6?W9Tr1E z7Dr6AdF^^Ryt&zJQtWf(Bz7{wqli+K&#&*hwvuLJ?EN~)!Lr3M3?CKg9W4KX_vG^z zd~~Ex=_Kl@?1`Vkz&-~S5CLXRk!ME-cEehH1z+uv4s-|PJRWtTCB1$EBcQ&@LP=9g z{5&_1sB)wX^e%^&D*ygoPe_?OnkK|h0kIWHM#%HeH8})cV1VyDf_0i=hkEh|JmFApw05 z-;lNkonOdroj(Fd0@r6{cmBxeM(H?~w()i3?Q^Px!QPJvz{|N3m1{V2B4)LT3tH$=8TVIXK^F8y=6UCgxbg$r3U!*Q?k9qzqiqun zP1(HOhl+7mAsgJ9@>2;YFLGte+5J^Gk8r35RZ^p~SoA{-fm>$?93jnKn6iij6h8Z^ z@Axuca-qCkvpF&I)Hy8E$BYGpiME!dP|X*V*R{eEkxpSgEYqan(0gYZG3Q#pa;ux6 z6&fvJ>AWd1q2b%lDbYaT%U?Y-wXzR3-rOb@KAs9J08z2_e92Eg=Z|4H62q4A{{NVp zPUrA%OFiOR&)o0E%ZzLUcGT%$bXKJ+NNRMPD<0qv*db?EWYH-wl23SjQ z7m1ZG?9330FXi(#Kc%S!6bT9gfWTQjwdOP&m-0r z05U2>I0mu!7krrPS1a}*&#;scOT#Vw*kzJM&kXJ=OMbm}r;GO_f3*4{<79d&e=(&q zsBjBfv5vgonxk@Fe?oKmtG9B%KmjvNt-TzLC!P8fsYfG>x1Dj*x3trKhWi*?8?VkJ z;|>A>`;otMqV(z{G{g_0*7t8jl=B1{YP_Enrv>j1bj0s}=g`?*hY)R38gPx<->PC( zs^-Yn2E!|5FQOf%xYiFDzA8m9wT3w1F%g7XJ%5=#^D znM%8UHzJ9k=YiPrD)V9F^BOx=bUTp5{SQ_t-? zN`qIkJ&nZW?$@4%5W*ebYZ+Lsa()g>Mk*v&uVT~#9Q7$A&~?>e6y;#PFlbW?a~z1< zi+@lF-n~XxQyyy@&{BoP(jxe+Zmhi7_cy=9*;w9ddRY9I-&o#duLJnC#);wj22xr0 zG73Zxe%uW2Ex4xrNqS=XPQ)s~o#^{#Ii~w+wiE6Mtu;)f1*I*b1~O?^eIvR|4md;{H$HGxfHv5hxBy@hknWL-BnOtETwRgF*eUgf){9Kb3qEe2p$IT3|(p?;b9> z$$csSm{X}TRh(P#h)7n9AIoMYnw)W=f#kmKPvh&@wy;bZwiTl`^@fjL(FMSLEM{@p z48x&|{g$Ls_s2n(vMn&^`3&<{qpLM|T>J2>bXdvKgZnuwBD+NGCF-meapLn76JJ@P zQgU0%N3N5>Oov4t{lR9z)k`}!_(eoY9A>r;#-I4u3O)O^r(jGMxPRiA3@q2ivi%Sq%ysPKNsQQ!JS0W7~Lc#ZU4GY^- zb`Q~=>r}_Pg~UI^W0{VJm}r8HE$5a{7YKF<46T4KH43Fh#8*TJ03zut$m+DR2@USj z126+8=CgqZA;0siUK`J=$-)ocWwh8wMiB z*7$5o1R_Bmq9(Vwtx}NnM;B9c^Mr#V>DF0%n!X)W9u_{|8VdrFos<3kV zJ$m3f;ZOw$H#{f>Mj~&cjNJaL1+*(xM!HcKq2;_??I&-S^q_)l1_gXARy5{qFx{Me z6K|RH+1ZmfI#6;tyVlu0s`aLsACv36;-gQSe5+lieZKCiSw;2TH8jtTMP5Q7SkX)q z>72=$LqvfDNucjHq%}vGOkGE9KbiPXmrwK69X-y+TYY+a<8&-49#a>D94F1oHF}WC zKiy4Vo z#qw=4bH?7c4%4MaY2L4t`?$6KHu1}I3{Zu&eC8Q0&kDM6uZ})UfHxsY>wA1xa(n*x zd|+$-Iu$^3l-%L6#U)3o=)QFyhBn2LU}{m5kmfHt(LEDgm`U=@*jtx3Q7}NjXU9>! z4}u`kj0;dos4+r3F6LsXFmcfx6{&Pa1^b29`leHT89Hr*GPAqk9AT40-ssa#_~UMn zmB(|H1^qq6fg{L%Woo8b@L>q*BYfx`X=LB%01VYt;JVs_IxCya(6Orbxa=4H^Xh+G zW-caPmj_^bBa^}UYn?KZVdkzUj7TcFG*rf;KP5kk^%Lu9=a;K%N37Em0+Z_l9_HEz zAF0JlGVxMUG@z63J?!}+iPk9m-E00PScj7d+y2xR^+(q!{9v5vrHmSbo`+W$iB$^*YiJZF|8~=to9eK(sqf7C zV_GttXm8n7Z!UAFXhSYt=^KVVI{=&Z)a2436#sE;if1M()mE~YQ8ia z0L;7XC=OQX+@Hy%7Y(4h45s|V*me8YX4hO*aH6ZucRwb{<>0g$MChtII;G=-SGHPD zU9XI;F@&QTPgnd*`Q@qjFn+9CVzb6kFcFU6gr|)0XSi*t`VKt?9E1>Tekm`lE{B)p zu4`~C)4?y%>ncKmorm`5WWo>9FmmqDr+JRaRdP3-AbEL46$YFG5+IC&leM}^mHQS# zL;q6iCo|WXqNKqC8G_gUWlzeT?)WfU6WyU4$EFgeQ{TyaB%JI4_qk8>cP4lD<9XMa z&ZrQlVWjrg=>fxV6dXUyuq0atSEp{H#-Koj7m@$A=A4;_GOWBQA{`Vq|1gqO|zMP3&zB1W+j?G?8GJEiYKu8 z>|2M#%vn#1WB0SRr386oMS0Zb0_=~E^IxY6dXQ1;=ty~RuL7=G8SpqgDD!c)T5Q%_ zjD!SmIKp-;y#r&nRDbb_$|0v15A=p3Uvngg4PA!fxh^5gwj?HL<@Cw_OflnU)m1Co z^+$Ie=SOP)1&bl7j}I&|BlF|ERH-p95uchboIRn9bK9?89HSu3O=Zp!07O zuNSLnt!wD8PH5I8tv)b7LU2^Cgw6*mmAEQO?mm>&nxq@5Ee{qlby%KsJwMH1rM zpI(GNQ5A~G-92Zga$FAT3lAJYIGVj3ANn)o^^M5SE7JH>5Etv{#cuds zmfNNNJyd++pp-TCj0M7_O7zWwRog?(y|~% zOZY+7=dEk2ojCyriRUER%=AYK!@OJLUrCVx3$EG~{qk?KxY41u*N!lq@5IYsr)V@x z)V6dc%ejWU3noiYuV*uM6Hr&Q;@z4umEAN(YfojQ8qM|!EPjOWzvJ(I*lsgSD>H11 zXmU?SqTFYtydOtUbglob-oVrb8b9Es1Xqvaa&=`}s7z0C` zOLG)%Ae&DohJD>>FVN6*nU3chYF=fp)HQhP9GbsN9KKyydVzNWb5-&gncUZkLF~*JXx}sx!5FZ_V^eL0QNd{O zG0Y5R$iY=DE~@mf!U(*oB|GNMFk<)!Y`q^k;tYN(Rwv-j(E-4e+a3c!7g|=8+-!0+ zt`A=k;u3Q_hveOXk8di|$D`%;gYuCvGWQGp*Zk;;{AdRN;)$ zGp#&T!UypfP2ZXZiqhcz4~t#=)8y9TQGu5;?S|qeH~=ulrM4b0%#9wXfvThA{vJ;u zXkcNNS5$8TzC#{fsHzccPvz&2P>f0 zw|`X75w-YSdpOSh^p$NweRXompcesw=JLH%v3t)#=wa`+Z>ewXh2wC%DhspbK0$#2@vUNwI@>Owbq8(xZXD zlaOrdC#wBhPUGk;MgKa6MmXAIQn0`dwM9GSrX-a8HhM(kmd?ZT;?W^v^uG0Jv6#4T zOO{vA4mTb3?o0~aqi{}BWJN!OrER)&zHyrn*pM>sV7QR4?_y-`2Nzr@72G6y1ys+y zofXX97gIPKx2oY-I&~~v;*&S68Oy*qBIb01XTCBK1BP6Vh|qkL$^^e)4`ZLVG4~tV z(23n>scI#@saZ?K_mZQJ>Ppr$kFzrAH$d`ep9nN$%x5f-X_SSgT5@6eCI^7fy3rau zezhVsCiYQI|$Y?LACF*yA7 z;wHEGbOx6!M|hli@B8=3*ET1)mAc;EbrOx{{PNXss#w^Hmc;-JVBAfp4iLwW7}14W z!A*3na9X=rL;sa&3it}j&aMV;3GM|tVBH?dOrQNwthGoJZO1=PdPb9SS^xY87{X7$ ziSd>dtARSeDAD8J9)nrYPglSHjP3f{b(^MtGoo~hB1alSrfRJiIQGI??}4=xzYL#s zfAkdyT2B&?{CIr7NB`y2AL(b)4er4-oJ3{#o75=!H-|7bV7on|0lzaZo`WqgSkDHV z@BBSv-~s)b zc3!fr*Q^S{lz&DKBdbvH&TK#LiUU3-_EEc6AbrVVg4C>K^e!8|@Lls!7>NHUELMX( z0^sYw*+Ds1qRDk#IrH66pdXKUQW_G^?D?F^ZFuVu3>X3QGu@eD+wK;@nO?RS%wI;hGd&5#)ZAef7+i~IXwuIn=w!!LMj9DnAQ8Lz1aYSwd8;r#pM!j3VpfWKj1@#=r)Rs9SRJzc`nO zCg6`b$+lH1RD0l}zrspt<^hE>gt+%vSFp30Pyjh6P+^V(I zoopgW;xyvMAIhv?sqZ@s{|HUr#R__4cStF8ARHyQyGz7hW8UJ4&=qoAqee@(^Cgdf~N zmv136mFEkjAap-n&F=F(nXtQv^P9I`s%$GV)<3(DYt|Vr!{nG;ZSMG2849DT0RV!$ zTBu;V$LFJ<1cTaP6++SRa1$E;Brc8lM_XPVHM=aIo=p3RQs>JQX+@jXPJIX{5WB5` zdGgjZ9qx2^E+jvA(8#v5uiW>uZ$Gzo8LqNg5)AtxC@!5;S`NhBLqCBxp904`a-B&~arN4_fU^1; z3h*?4!g-75uT|H$!;fns0;8SRzntwA%CT9f+A3wyvGI|@WT46kQR(PicCT>KnMl@YbF4lmgan8XC{F}^LQzdSfQSu*IsX?y zp5Xt1JTFJB!KBa0P700q{gL?d<>bBPumoDt?buXy8Ca@7Yf3b1eK@Y){H7}x7|THo zM*K(4mroU?yxC7+QF9iClg)>XQ(JWjrS9r84f5J&f^t-hcq%r}1KKcN`VPYa8FE?zy* zFAJ(H00J;AC`@<#@>V0Dzu+lnOk`kk8;zk?*oESY=xa1ngxwnO?^;cp^F28t5Du-&NMxWbrXT^|vNkhsjY@%p1`6nOGW(Y!kf?XCMdlkhXu_bx5y}X)`z~{- zbV(nU9~TgXeLf5lZz`XnU6-Zq1AtSjhP;-^V8hpNvq4RfRYyHw$vqe%K52pNuW4GmBhiEGl2~yAp^hWF=5yXBtxnvCe3#rq zXzWsC?ownuy25iYKg^NMN2zq<63>9&A?tB<&#e)OB4+xi05=psBz*4URk6UYlT*o- zh4=D^vUtTG1PIvE=kd3KGI~8vzn`7`qOjrJ!Kx{s>v2iFeAm_Uyev@ZJQm37yw?gC zaWd|dQMr#Bgq(wj)gAY_wKn(J{?bofh zPsqRYuuMDRGfFA1R&upz(DA%VkFa(#WkgM@3Mgr(ij#y_5fotUx{GS~aC~Q;zsnY_ zco^bWhNYwacKe3}7bqN*GW>ni>1ObjgKH0?=Rki~8&(@i+E$TouwAK>S>Y6?g+CQ~ zCkGW1BRgjw%3*xML2{g5Gh0sZW=)o7XGUcHH1Ok37Q3eU_Y!BE0E{Hz!YzOCo}dGH z@p1l=+Pw}bQ$&cnS{N@G)%t(jPULADLX)BtW8i_8LHvAPp2gnBcx5f4<#->%lGKA_ z;&2hR@rTiZ5#q$=oS9iGYNp-KOf}w~B{;NoT}3J_;AMQ&b*0mSbYWcaQ!coTo;sRy z1uv$gxJZfLvr2tA{oxs_is9HukHxyRB#;wo<((-+O@+vxKi;eIcZ!G?od;lesbQus zwf)QDkEgvi!as~@Br8;A-_oV{+vc+x!8)$WtjOVJusM&5l&J{}X|Ba`*%R_c=g+HG z@_MR}nVfWycpN~L$Udf6tdHT4UPted5W|rk(CQXHotUR#pkDXcp`=wIt!~~-cfvy( z_eVF=WbsU1V$2g|E4?B8q7PdLKiR94Tzj!DK7y`?dNe&wah}*wBsU@2~Q>@{~ zGrG?yay)G1GkMOovr!|S^eYxPoisJ8#1|eRLmPh3`)?TUR*K``Ur}3G7x0GkMj|@m z)+19DLUl}>&1;tEYYc+$&+F?@;8van2GHA!9kc1dNoMryC25Z`VP0Pog?wBSQCxa& z5!Gz%l*|h=foxZPs`L2TOOg`iHGzU(8gb)uB{`_Jbf^y$hvhBbu$6Th2UfS5skc_B z7)+Xc?R~g>jmBN}lu_0&-pm2VM?9kEh{cXm$42QI!q@BRTDc$q!I`+`!at241u&i2#2P($iQ?Sv6+zF;LoHX8d<5qsS1?x@QzT#%6#+ zcKImMg?FJJjJ;Gna@{*5Ol_Z^e~`gRQ4_95jl!@k8;F=+Jkw$t+iN#C4wjbAA@X702yUe6!XSQsOb!8A8Lv$;2e4a2a?L z7!!|RpfX#C(CXo*=7z>KaI1TI!lbgQ>p?s&_1K;tA8dTJ0dpST6W~rA8tvli82OY; z`Ca=IfvlKfhmhDghzkgh2SZbak_Y@;M@G(6C2RYZ!Mw&zqlH<7!4aVqFJG3+^(V~b`|XSa{`s=K2d`1(jS$Gwy>{h47G9`u)F8<8>b;gj%=Q&4ODY{Cpa}twsux@%nZbsXF@(rDD#jUSzQ2YlB}? zBgF1{`%ZwhzR~I%e@sO;ZJo@o!xi&Y7M|6>gu>6|#>r=;Bdkzfl9hXTq#PPBph`qj z>|pLXfZQn8RFXg)a0r(CBQidnn3cgXJPgo)AMd%Z%1?Kr6$6L!%grUI&c&pY3B!(e zCIaoI*`(IFG+~&T@BP~Pt7eMTvAqTCm7D&jC$m! zlA;N9IW^sGBg?UNUh`De&2Q0m)7R!Z&n{huXTtm3jncQ{i!s;-a+>$$OtijhNc@3^ zwbHDi5XEw)6HV;UvCU#D;X%K#)57ZpEPfQ20BKG2ds@ro%b-btCE`msr8KG1p%%OI zcp-X6e>R9#l{-}yYPuMrqPMWwxfa^ROl`$Ibt@%ST2GOJ_JfupqIW|&yxGg-d6O!Y z5B^MnYI(l=9I^0m#`VwVS1@@KX5aMs zMgYK!x8HMSY$?_eDhdllm7?rYQ(Vp>eDig{OTjtq=0&U{K5oDj3I!)Q>Oo@VCSjqx z`L$Un0U?{JX|zzRrh^ZA>sh|$hJXKDnTn{J*o=;D&e`~=*sjl zrAonNEGwOA7Yts_m1U~5@X0aICGx!Vo)qeKJdz1IW$K*j4e^p3F}s~@-4AH^8m$t? zeN>f<$>$(ZiNLhKS)1*j3Es-R8FSD}#~VpAQRgNyq%hs5F(B4pjb)eM7kCJq%%oJN zv+N}zo(6UZSgCJTi_BK(&E7Ql@O~LDnkaM$;jTXa+FDpMF6i%$gvKqFSqxItl)>OI zvU>?Na(j7*sHJ>dNO??jm)*+~S$X=saU5!Lz|n8TR5I3v5b2C_=oz4{tA?xD^5c*K zuisyqAmv`xlZ10hlI*B2Y}|7<&Hnn?bg|eh%9WvLXeg8u*zxZrvxF{>>MHVJ3My=U zWxG~^WTaK~@LO{HbW;m-JnfsaNHfd+%5stKQP_^5&n|BTcw8ec&4CLUzrY~zUZiH} zY8CK`ru5A#ot-sK{XF=9A?9)GQH-l6A=r>I3z2|kp65Vn>VCfa{TEk-mMkr$%`0|e zKCRn+4p9q}{j#p{70(ViJ*No*xlXOj$=1CkQYu5L+TJ0=5owsND`5pW@#yIH?a8*W z6b^wn07~!y|;C}x+FJ*;^Tr#VEG!n2$J#_WE6mgNuNzsC8by%um{Y95C zjNaio2nFk6-Y6YLvAG)ed-n+gYj9_J&IXC0pGE~mx`EUisB&A5MmA5}?I%|{;o=p{ z0hBgvf7wz+y7422B?0@BPhx_y#}oWnib5(JmPeHP`LjOQQOb|Psnt{A58yhw{Um&aHpsuq&qXxo;4mt z9jb9mv1|S11hdRCfZj_ILadi1^lMvhBfes9%2B%LlK3%%JWhr<3>JTgb8yerWcXK| z+3+*NTD=MRcnW=04&8+e-Gzp zYw}5H$R7$Qst044!$O;W8%x})LA!4H|KKv{u^LO#Lb4gui zhklig4SUviSU>Xp?&jLAsOWZ7Lf5{Jc~!h;;|y&eNkM4Tcvj`WB?t}pTah8K;FsGh zb=WXBLEbe}(h3g-=!GdH`?YF!wwepybGM2fZ|_K0AEO>>%8*nxDp6b*Mi6^P`s~-ubPD^<@|*kA z9=pQfUkPw5YgXq;d5N9nOIH*?1Th7<(e+}uo?od0NZbx7?j!Bhyfs6GLdvIC<+@)c@*NfiqCYkCtC~z<#~y5qj+WnS9@5Qak7c zo=J%ne=kRtB};U1ZU3vLOsv zlK+6^)MuX+gYRcy7I-oClk=B;WBv3u4yqWWM-p*U0Es2%Uy$xhQl|%UHT(wQIu+u~ z3QYB&h3*-Vlg>4f^<2(LNHTD{$)4s@3PZ$nLw%2+yw9|dDSh0(4^)Z41-f(d$%;O^ z@!Dqsn^7oSROJLelN~<$v8rcI2a8VhRFkPYUqqo*L_FKAo``XHLj3eR62TDfa|PdW zvK@Hr#LL5my?+I1i?dquCl6@)SuSZ*#YW!a{yXv$ZNy*ZGg-h(bggcaL2nk^0mQLj zm$ma0d3Qz(^nzKBxTIX)rttM1fH0@ajIuk}_vV7)n@~ zzZ0J)9sAYPW8mLxT3_*euwI0l{ycUN^ec5t`plg-jpKD*0qW5)3tV(OUD9!e3 zA2>?4K!zbEv01FArFC9tS9E9{zF9U&37IvDSuMq;|4o#5VoW=3bg8u@6xnaFKi%s> zO&FYc&3!|&@EEtr4nFf8ISv*$GlkAa9>tCp0&;t2-&aSr1W$|`B;Db&uDGXv0S-wA zz=E4FdwV_K`iC9Ahkh_k3f*3thfu7zooXGD6&XI&b&9icl%Q4@$%t)ILb&HN?nXkZ z#J?VJNRMn-?hCGPCx%7;O*rS(x}XIBBGMOD*BAUbBc`%Fh)h{ZrXx}>*NDPfh?Fy8 ziU_|i;Wr{K5o+sPYG@AO$Kycw9g4u3GeV~I424~tpKK%bm>-q9oBm>LnyO)$Ioru= z0a~zeZ)T}T>%UxGuy+XsC~JAhPR68tyab44#87@b^I0*=DT(U7*j6;3qcAZ;X`Sx0 z-ubB1p5^1TolVAN6(v*}r_(b$p|T{$b>viLaj%?8Y0NanJ z6=2bYas&zIv~1cinabp6F%-SR`Cx$E@O=Ga-X!#b0}LjA6OZ*`GnkXowpCQw_V>R) zE>#)f(pT!iR*Sg_pL81dzzjy^C=*yz#Qi`{qH?Vy}882$y}OIuS4BCEUa* zEqn8l{QZIfn=%uuYf_$3l!cz_Cd2!INSai70#-aFP6*6Q}CLnc4bR zdjb8Q%mi2^xV{pmBk(TXi_#epZ3%y(CCn}uqn0_#)yG8bUbn9~Dfv50u<^f99g+=AWed(O4GzJ{{Z>;s$Mi zA=HK=Q7H?S4@#Wx=_+uc#V(|`UeC-2-lMmhLN7H?1fMB_c4MdtoqSRV9tUcunts#e z$(w|Q#ip|@@1yQ_!#(({vX%+@NWKu#F@Sq%%b;uBQf7k>VEPlg(cWY>T?eSo;A4U_2b%GZ7)Na zJl$Lp_lKv+nmmAh4j$ea$PxTkdD|a0Hu)2>{5s zg71)T)lOjXxYdyxIenS)&A_?>&yEy~v3a`!0MkE_D0#sszqO6LORcC(>Cv=4gLxDp z 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

    uM& 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%0Duw=TGTIF$u_a}aN(KQm7 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 WKcG+c|3}3bKoMH*OiA&u_`d)Q;R|#C literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/kmenu_flipped.mng b/kicker/data/kickoff/kmenu_flipped.mng new file mode 100644 index 0000000000000000000000000000000000000000..2b78b40073434dc9a6824c45e5d3c7976bb31a21 GIT binary patch literal 81240 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 literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/kmenu_vertical.mng b/kicker/data/kickoff/kmenu_vertical.mng new file mode 100644 index 0000000000000000000000000000000000000000..9cd3aac2b233e8d10d3d73b6abb1543697558e2d GIT binary patch literal 62006 zcmeF(byQn@+Bf>31&WszEmpLpxVyW%ySuxD;1=B7T>=ER;O_2PytGiEe!|_EdGDEL z&NK6_b>^=#;kVhz4lG!#?C@FN>$-NVlClgI1_=fL03cJ6l~jlCRpHx9_=X1G{(M6R zu~v}44`66YsVgD<@l43CU%&J}m*~MCAlry3i2(qs>&q&-?C{6vuCjU_@V)FGoAiW( zF#HaxxR`_j{CnWHVn#sd!x3`@8Oh&A&~-m=!;fIe{pr_0d-yp|yqS0b03?8_qNbFP zGoFYmzPQ&@X|LzfenfIXWXi#`+94crVFdEw1PW146@e5=kwnS~gqmrD>Z!!q=_I`{8D0tQ? zd)KJ?m1qT)82Qy{1vKjTSLp^-8-_F*c|v5o+a$ePYmaNl-%Nz+~k+q=AYgY zl+hNH)a8}Y6Bs+Jlb&6WS{0R63(BmI$*suDZAeasgl4ya3fdB~J3!gJp?MvVd3|98 zeNlzoF$Iv+;;zKv*0fScL1{;NWp{Q}e`aleesOtCRYPr6ZBrGrw7vz>*bHszt!{2_ zYi;jt?P=}o8OVo46b;1`55||l63d4ZO9zswhBE4h^BX4fAnS>Z17%IaCD4)D*6H%L z>8j4j2IxRj_h?%utfL3k-#gONJ=xqn-PAh;?U{x2Pj>e#H1sdD_QOVo=6VMg+Xm;m zhE_U;7kh?Rx<*&~MmE~U)_W#4`e8$(u+gF6(aDj?vGKXliK*F%naP>C#nFXu7!ZXmk5uXZL7tcmHVr;AsEw_~7W|@aW{=5qzBCurALpE-x;xE-tSxudeUzKETfty_D-}0005tsjjT?`?UH0?Pq|- z=SQ^gw+D1@S1}v-{`dQqH;>;c0D$sEPEt%$cC0?*v7?3-(U^+sPN||4nHgdzgAxMF z*$^L_vFS^n<0LpY z?7H0hIJ#dzutWw~h*}Wx$dhepMM?|8p&L+jR6OHRU0t0T{pf>ludxcQ%fRQwmQ2Js zmQVL~gX9!aSLGPk$ad#X)y|SUQUPvAY6RQ(JkDr5;m%@doB3iY$82~7&-33RG%3?Z zAq~1+2f3;jv!0Yy^AAAV+CFigPpaFpoFhIOxp)M?Z*y~^ay2aK(oDATWlej3w;JM% z@qv+v*OPI7<62Cjo-r$FHqxQ8pE!?nY{gM?TZEUG6vy}o%XM`66)W_%C*S6Cf%3ew zzw3IF8M4BYB)NS*G5z~YIf%O-raV)Qp;l&$Vz()R7V6E&11)zJSVs7 zHN}XG%-9Ed?kY){sZyj*)|n$?X9N8xuD5EU>#vW#IqQs^t=p~^VxzAk41d_TYS$SX zsq;QseG%sRl}%JKdDr8UYxLpB2E@H9YaQ^8R)w7OogP!ws160g_xsH3Tb1<};P4{^ zJPC$)oA{W1A?!Zz%RBSHp45c5!a~Hjj>Li&ny$>mgc@`Q zTBNJQbJS_`6V&0*Bq&eGu#+#>k15fv$wp!ft(Lc<)=GZ~WpB)gn4DU<>+Q{Non|y!!_4P?)OmrEY##A<%i4Zr#u>(?Lw5r;dkjIv;UQ}iF{dXZxDICS!vgH1O$ zKZi5OK5V$3e0Av!#<9M~G-X)_f9cwaG}g>Fu9eCUDM9jC_IRUV^fZ3Y;1@pS2drMH z%9RVwuDl8mvDy^;+)nUyW8G-H0qsnR`5%OpHL zG1DNvNS6Gp z&!lh-1#jFJeAw+bpUw7RM28)XfyCc3UGR|QwIp#T3XnajdY(JM2M{I#AF0Gw42pAJ zd&_Ftkk{k+xQ2$`niy3dql3&P3Fqin--6?r%m>oCH9Ps{Nr&Ll>YB@SQl-6@f9Ag7> z){9|%L37H^5nq=|Z_gPt^T)=`ooRDo(6#yIh74_1-!j~oFHUm0B+rn_*c9KuV@yrx zFnt_$t|wZjeW}8Z`z6fjhAC^UPCGtDkMVR(y3gfWX67;bhQ0$4wg|c`k}feG8x6I4 zVtFVV4>k3np92#1WyIa+W2_$=-R#Yr`+9bTs@Ua7<_I#Sk*aS3&04d3W=q~`#}SX2 za_Yth(C#^&ubtOc1M^C*Iuos_T50{<@1pxSNdMHk)$ZNfuR#H^Kl2=l!Mh39t zp)5CGRx8238Xza7EZHD#3WDGL-w`V7L@wt-uHa0e3LaXlWYDVj9L}5zB5K%W09wYMsDi z70Yjz$Pf3XO)`&l8oO;0zeB39Lz;k7rpP~K=KnONB}mjZOxiwD(IG+1IYrz#Ny<4> z%rimDEnUhZQ^q}A&Mim6BTvR7U&bd#*(*=pt5D7-S;s$9J1EU0AWtozP%Svw4h~P> zVnzQ_m4Gr8|67!ZfJ#tvNT0IqTb*W0C51f({&rPX_7)`n!&2P8K+ zXF`0k+I@0bg7Vu!3Oa*-3pBYZDx)qgt2{clE+VHfv7jm=4+1P~jevWztiG@a8eR&G zE$I#~>I9c{#Z~twmbIprx8zrLBv*AMRre-UcV)v7THl)m=`Vm&wE7Q<*0z?`H$PCc zxv#9H2d+^lT%+xM5V%Gw24d@AsSN{J&9MCDv7DBXg4T(AxIAb5%I50E?lPRBaExy4ZvF#BxAs?e4%c_#4*iYLqy7Km(Bp&O2t9st`0pdMCpEwP zzX<&U-v1jyQAz%a&=5@xEwX_d1hb4=izcuL$PMr~C-%qNvgerX^m=}q6(Btj21#}v zK!Ns~RAl6%I`A0si+m*YB~CV#F^c$Ma8o|xTit`CkxxXoyCz%Y0**~B7Xde0qXTB% z7k9fqeg^OL_U;7i%@=;q%>p1PHU-Hju?*>s6IVHhP>33z>PGT{NyA~CsE@*~AzWbt z^SBwjSopa*Zvf+1m{>SC-9fIqX12fsX^@i-E^}rkDG4$0fkTh#p0YCFy`$ z-D|*4S>|w|XJ8B7QSNcfua4MPaT=A%`7yR#EWo{EiYK#%19>7L2ZOI&iG-sl^7y;8S`Zt422cw>Qym_D*V$v80m!tkP|B7j z*&N@ulaITFqKkdF*EIVgt+s4%&;N{WsN4?F?AA6w1My)>NQlFtn`Mc?d%{CUyBhdy zBlEeQTl#mwW|JJ@pjFRs`kW;(Ix?MfAYKeU;=No`@shAGbB&k5(xC@RWH_j2~tCJrw#Rm zb*3m$l5AlR#O6#TiGaF&p@~Rnn7r8~d7$l>@%LDY2owzNWUpS1JGp*;%d4kZ#IXJb zW?KkIBIIa&&0`~YMBORR>;4p@aBKdCw~b1t6QQPP&uM$EHV9vo{Opvkq{rqvjs&E8 z&&@gjL3az<4mDnU#|UsUp4}>ZQAmVB9P5V1BtQG%NWfw1wa7%si4NfSQ`b)S3A(~aBq{~66khi0ObvJQNmtsAq)O58H5bNIt0|K+uR*ZzG|w?FPgqD$ zb{*c$Tjk2F8P1pYet20D8)=&I_V@Dg@@8v^ZQ0%y&B?hvG=G;tn7Lv&8US1}YY$uOL#14|Z(a;FZqq}=Nc_-ayqcH! z_UL4?(16RJ@N@Thy*J|6=8q=qD;)OzK5WW$k|kifp0}I5y}h>COWuk7kCx@-Vw7GU zI8*xH)+L(Ys!G2&7u{A8*pxzE8chQy4?QhyKF5;v9ih3~t@NfM3rKXa z`<~X8uC+qKY>|4GZK+jdh!p=aG&J zq^2%CylPB+);ZB}jfhp<-QT2&RkO^`i~;ft_yyO-k4Xk?#6}9wu+0-y8E|`+gz!!a z5t0^c>u>?(qb)JIkFiPaUZ5bNkt#fi*hgu3bQ`ml@Z{al5`diuGe?&4XVJmC!Esrb zewY}b0l@>RscJ?PMkm7Fyv&L~PmZEW-$ZA=SSANTS`)y^M-3CE$fM0i9@5e}<<)dR zd4!cu#V73Zw#QEvr%HX0jpbVX{A2gC$cTujkh;RGLhLATJLgOmTLAYW^vtsh3D1my z2@^GApyjpjGQXk%?)pmg!~#1Qi33okT^;%(b%DVw6{i}hYS{;uT5?_BiRepFtkWE{ zknW~0Cbe%PH+jCZ4=69bQx&Rc=xgxa2^5p`y+5WExIn79kkBAx|BC)a!B9uXz(9tw z>si_yjx{I2%gdt|x0SulzkVS)-yIkN&PDEBu86qSX0jjMy<;hL#`O29)W>R(|E%(k zBX;_^P&QZL&3Ej3QUiN|?#-t`l5lJOr_f!)2RVUYgV0=+&b@Gpa}@xnvR6}o|uN7gkoq$X=`33T&XQ-jh!iQt3vvcn)}iqT{+EtS#5uywdN1B z)v1h73=%43Bq>&q2p$ zdSHvtKdkx?n@%jWO)d1yuJr%r>d?qAJUktn7@L|IfpZmZ)tLp@%;MPW{0y9{3u~~2 zm5Igmp_R?a-&|eYT-n%J+T2=)i*V314%l~^8ST%wL&BlLMn{lScbLqr6sxrrtW}}6r-|1(m22D()FqUvtEu- zx3|K|%{SvmJGQ@oS00~*Z|;O|0`_(Tf_6WHzho+aal=$_Prn@nZuEYoGA$`S4yTpF zKpj%|W#A;BpjTUrLmHr<4rgWpC?bbPMMb?}I}BpvXOcU>3m-ff=Z)4SKpBdPs=_ky z#brgHlruL?^QFL&Yd~gX#g==U8aa_iYlc>F51UwHS@d$nAI2<8M0Rx+K=4tPy^f2=Q`F-Wl3>EnFc_=Ll_eoUD7zBFZ>a+tIbl&@aloo!`pid(Dv=3W`o*Kr?q7 zJS;d(ztFp&VOYL+8fV@cYvrZ$)k+QxK1tKg1zW&8Kh)Iq?6;L=snx{^1uu$T;B}t4?K7r~2xtkEn&!r_b&y zq>?#=;`^uB9M-d@Aaz4JLt|kF0Td$xYlU|MO;%XER^zHFOM-c94Q_i;y9OiHY`$4a51Yh9+?{7fx|pb|S%B365>o|v-A|D*R#;!-F5@Ge zOIQyB30PmG$@)aBVAd^z&AIf(P@N$V#ERn5ZAWiU-Fmu5Pu+x3qfI?&_;ov1wZTKu z@_ygnb5nk_9k4ctQ|CLYYE8c(>*4mT!6$TlLGogD4B<)nPi_NoCUm1g<=}ZWGpN@5 zD0e{(Zy^BleF-){M;reBT&_{Qz5X0$5(s6T9BFS(WAd-b6aHH)n^rNw@Y<9V_3{3Cbi zf+gn!+p1+6&L?HovXZVGU%`oVvr~L(1}SPDy&P;TsxD~M5YKbE6iQlIFr+$+TZy5w z$OPNvYBXJ)=E4w>sE3OT6{-2HCWGhQGPp)RiZa5PvfUZaBSE_N0DJy(Fuk9Xm|6-7 z1hrOfP)A|$y?V~q5feG8pZV+Vx`u{^j`M`XhuX4A5<{z4mj_HHCPu#m8gQ`og`$_f zu$zjT7fJTZHeNp6`XI%o{UNsZm9#;|W*hiZJ*~ThN!blq5i+8CLcK!Ta414gc|#u} zkz*o1P^q3k>wv_l?qo$n)-U;zUvS~o=}z7U_6e$9Iz&0i#BJ5jEcIO; zeUH$WZ2O89biA`(JS9~$&-1M3tFQWF!H`hpjmwX3fb2Ia`s>`^#2VXK>FFsB_`|sp zcDJsmkUW0g(v_aj4t)6Vp{HWO_V(vnKRTJxMO#f9|J5St`*`_M_2+M6EO=0Bu7oCR z{YY5J6UQ2mbA^$hrqjsVSC7`3% z+QsK|-#g{3d=d|?a?j6mx8?5N;|+8eGJmdVZDrJ`cXG)JV&JWpbuM4H_5xY*!;!xUgTPScH#zq%mByQX0C9K%*n~Aw>3omf{0!J zCcj{N6oC#Tre=1-w} zilBDKHW4%P^#7nNO>9_<9hlAS*sPs6ZJl}T-MO8-_*}h&-FyW+{CPbBc|C&pJOhNh zg9Ti?CB6K`d_zS2f|UG1H2-&H!V&2e&gUD;|8MfqKU6dTBpMJV?hlj-3X=$qlnf4& z4F-$*g4Ezl{GZ_@FiIX6BL$3>4vUimCCG=zDo29lBf$!h3Cd9kYGKjF5iz>aVD;!& zqv&L%*i@C6WVN^?&G=M}_!RAg3^j17L1LChVwPcYx^YsrR#KKua*kGNo_0!>K~kP! zT7hmxfniL%EjZaKx-d97%|1QbG9%kAyTCd-*C{Q-H8~?7Gsh#Z&^5mxFssNkr^GD3 z#G$anwWz|mw9LD-%A>5>ue#Bvrarj7`7dc_T1`w|Q*v=Ju)GpjQWjlV6;oXkQQa6; z-w;()nps(uR^O0XUta)sWMfNML(`x5*q`4Fjc96)Yl0?1JK~`2$<3`Rk!{ThjwtEWpGgT!TzF2I3)*%%LfJ;2S*!6M(an$%f=>ZC#LEKhuVfmAY)@K zL&M!8Q;?Zi=+solOgEgBBP-o-Q_juzj<5H@OY!iJ2Te|n&CU+OH97T1_&K-m zP=sGt99Uk3Ew7HQu1{=i&i>Zq+UDxc?(%Ox zYRZ#02mgNl+4}r)`oFULm$F2q_^T{`7vU2H+n^2`$7Z-z)Vav>%XRqllV_$zu5D8c z`EsvF$4%``EpS9BadiX3tC-?rK;mKIajfZM++m@ig5h3v>lh5J)00pm?=dIw9Ver9 zTAd$#9^b^dO9vW12cLfH^O)^FEhq?3o+vE%7KXJj(!AP^K#lwsM|d3d$4|;R)Qvb5 z#4?<->zkXKI6yFGJpT_LZVUnOq`^lh2Zu+1_XvV>Uj~tR3y$t(iQabrK6lUg_z0sV zUfTR%m2Eq~1NsW)AVClCvGGli;o6b(a|WGF~$L?+VZPGZ8S(jc1lePp)OOhL_G zia4xbSY*W$71Mn~Mo`%V4knMDi4(j4%!y|41!?CKNcx46iaJZr(mMy_h8^ULf`Qs5!*%HL3ZM0Ta!! z8jpc#*ns9@gpwOn(puTq+SK%RRYhpeVos|H0R+HfsEz+6en8pjv?KIUic&F5Yo~}F zO{W3@85-eVibsKr#;!>*9#=%2!w)i1<979L}P%r zm$ytPw<5U_Pw~gp%*yBSw+{1(H<$g0AmaOq4x3p?n7rYSbiutemOgxFV3C7fn{?o-H@5F)#w&{NBkLM! z4UCL4>ec$SwbgtIaPZLX>sSzxKjri=0S~}77BLm~bYlcIG1GdgLEo?5*KF6Z+CT#6 zZ>|sgSmufkTqF<#vOdxRUGsF(%QYK5_@BPgs>!pG-$u}O-)^*j`i7&{(72%Ux>rx4 z9o0&kdF&l#UYs$@8vy~B{}*Lci%TZpz(ON(ThnQpycSBHm;tNfCtu+ab*}!$U@TPZ z*Kd{$2{f5ccq8#RFlAU+BFV^@39BfPF(TB}uI+-gi)|yvjdB|_(}3;`)JDbY`(}eb z=By5#v*C>zgsz&@g!?fzc$rh_m`q;z(%*I}f|%E~kB?6&jgZj!!d;cS7`7m0x3oIQ zqh60h`T)3rYE=qKgRMbXe$zX?v~O>BVeiHZ$p+ zTK8ZRv~F%w*AnlpH2`)<8S%)6{kBi^1l^CLbtKnz{hO{S$O0{vGa(Qm`~K{_j0|ab z9mU}C>|nga2fXQcGb7SPNhCn`BCm3u;`M4gaOpODZkgGnJxW&YmvD5L@k#SEDc(KstvEhj}I zH$^))O(QQ&vmjHeFjG4_NiRFiI4?~9$#^o`soi zrMX6>Ip!tVb`|;d<+*N^1+JxeLDj_$b)_z4rLMK59<{|jwPgW~6@HK!ua?@N-;w8U ztyUHS%Zp;FOT+6cq8jVNE6XzKYYX8*{Xfwr+@>{AZ4F`2hPdY1RA>vht0kfX65S1r z>26KzZBJ-#O6h9N>F-GE>&SiR7lo@70*5KIslKcgQry{I*V|Fv*Hhox_E4wq>2B`t zdk8!KMpC#(`~RA5K6HNeWe#@d4fd4{^)Y+S8{adKN z!_L`(rTM}6g|XF@(Z$8d^|kS>jlZUz8!MZe^XnU{+gpn}J4<_e%UgdWpgVsgpnHFx zfWozUu)lh6@DB;-L;QJi@_#{9w4y1>|5Ei|QWfRRU#Oai32Yz$|?s@%GSp=st< zh?~{*z_V7WD7H>$LTJgWwH!u}EEo)99l%9HR+`Ql-`fvILwu6#Ng8GbP$FuYIZ&^W zG<}|I%6Pq5KasJM)3#OhHRz_nAj&|pS;ZuzfA3rG=f2Nxce>XSzD$XjFV~|g3JRL% z%}pz+*qBo;E-gLjw(+NScm2sW;EAY)>9vb;V0K$_QpZ4As153KRENzNe%v&i@n`#9X3W-y{L4GZ10Yz70IhO=({#x+Mo)gf*!-M0HzQ*dIV|5ux1O?MUGDow{Q3*!Q7s~4wuG*>dBEH_`#eqz*9;1^$~U1x;iAXR8! zddDq>5e{K}$wJAF`kwxB*sAuMnw)m|$`4h&=A%VNEjc24bDOG9cmvUCZ=KB*p!)Ut zjkBwEkHl*116!b*=k_@h6>ZJ9Z^9Jx>oe`c9mbF<4B|_YB)g3Y!g>JRw2jC2i zMEi0hv8rXi>7+}=%Ti2HNwWFQa|XMUwrGiv*w!`WG@`|5pA$mJ^5rC#vU|oPDAr7n zo1j~}LbvAFL!jsMY^r&rXG2qs<=yvBPh_9Jz;C}SK$gTUSHSg!(XFF_(z|@n5X0+0 zrV^!BD4P~4OU2Rt}kl?Fj(D62u()rI&u=)<#T)nG{h#BsxjIQxn;#j z?tsPyJv_UFjR7R{#G^0gXUriB0%>9+;xw|;Q&_k7y05j*L~n;*PG_??J37RVeWQeT zheq#W!Nghb0*wo3(K*yDzZ6?2`|jEw-}ydS-E6xWPSCC6G478MS=}NXdM$!OOBGCS4kr$xgU)oU16iUc=uxyVS6wFRZ$DqC)urq{HHu)^#n(lea%1un z!Sp9lC|L0rF=!_wBq*|S7BiEQi2AS@!%KN#jED(t)?@0RU2P%&TSeqP=OJui_uyGs zUaQN?uWJ7ITmppjzFiIgDkd&sCCV$c=``#Hs}f=SV0*$Mtn1eM0x0oi?seH3W^b^v zt?q0uW)@K7J}3BMS^XDrzOfF`yGQa9G47kBRb`7UKM=B)IP3=BKE{-D7{Gz8q!Kl* zDa^LvyI@_Z70v}Xkj@GUd}nh1RR8W<4}K`ehpcI(oLHH5{MjFMT@Ig*P-sZ)8=|SczW(l_EvH6^(}Eqt%4-GFT7Bx1B$uqUfGB%u*S*to4ePs#0DX^GFr1Un;-x@Eq?vBaa-KLmWME z&zDD;3~E4f8F=l+pI*hE>|EqUMc)6>9q&?lcMk#hKdIAgoxPMPHCz5zAER-hkL4x8}~UYV~d4qI4H z_K~rzD$@Ky;S3Tq?@4sZn)rU*=c;15#~1Cxn^U&f`f14pCK4EHAu%IM$@w1@J$*A)e|ZneGi=G8z6-=>dvafzsJQ(zzkB*}=+5 zK#}wa>8x<2e2{zrNIoB=oB=e<3)3hJSIv*nN(eWHlQAdUG$+P3D~$>!zhmZiy#`N_VOnXZk+hlmtT z&x!HT*{QML)pmF?x;z7$pPOEsA6s6S*jyRgUYqzGj&5wM?rbh>Z>{ZZKlF$0?ri)+ zb0{2|hr28LyW5BV%$mnX`)~elxLFkpRED2hzy3R(1hD=d`!E;zPp6Yc{yrF;qXgnC zS2OhOHAA1S!nDs;l^xAAvW*0^U2#m!C@CG|Fexx8#2$f&@wjpE*plMej@gjamJx{E z!i6lc@Xt&+cXr-Nr*d!DwFoP6{haIVEq{@A*1RY5IUwJoub`knW@69K(^p{bE>CkX zx@{g97tho8Sa$x&a|$cucm60-mnA%o6>6vqUY* z4xwwhdVi~!!!~Z+kSa6w4&bF4Soi%oy56xjY3z5t+Vgc5_R5eset8=zVy5X0$(+CI zUa%OAr)qj0&F8yIl@M&wCC;4riU8viwlo@HxhO+Au7^nfS@iv+58&|dn;#*$q@kla z|C(~@gyk(OMuZ|&Cwnz2i5s1j6g}BM#Nv)Cp=m$60)tv+3JqyE^`LT>T4tH*z^fWv zZl$*AbJN=41IG?hN~-i{$mKI03rviRdIbcLSkcvGxvF$il|R*W)clwQIziMg%4Z`X z78YapB(TxyU(eI+?Tr{M)mr3NPTx1Z#ex9m=bzpBetqUZvuqF5u3fD$vxDj*w~{zj z$&)&#dZ$;PLq~G-X$F*qhy{eb$%-9W#O4(?_#;+#pmrDFv@ zGk#L&&ZUR2kx-z}Ff_5xO>btSWV_7HO-*r}q7RsnKgQrHZm!gk%(sSLK1MlJ`cwjai`HdlC6 z+>C^)APj={yre@1m0th&Ii(b^%lXp=LqVRh#a{@aUnC7z;awLSQeyElAJ_nJ?9^j5 zXQ=jt`Ex9N`ADWPyg05fDS75cg5>>UYxkU#oU)f6{7ZLTmybGwJ&oM-o^vm*h?_ZG zwlsf;+ya%A&n)Jz-ZKrXdSsq?`3EtUM~(EB)E2k8B->tC?{l4r2Sm$-wbfNr)cK-M z^No~qDUsXU^L-?vAS%XMMC%V&^ZlMRW^fBf#=fnzyGQ+4(HxI2F*pA>IQt+-%Dz)u@FPkDD?2wRsv zwbB^5Eb1s(qPL(Qpf`CZbeSEuWlOPi;RwD&*x3=HUkn$;>k;k|+#_tJ;bo&@W`0`L zL@`9{gK4ZnyWM`}&1{5Kx;zTW#hU5#sID{fr`UA$mSdfXVfML25rs#E>@r{?G3kBU7j!x<6!^6f z;VbxBE{fz4;ibj~8bUOEHO8;M(>9RMal15p6}?|F{&>>#{%07lwU@`ShneR4*k)I^ zm+t-jkjp^7g0%kVBY`@2Deynm!x?PA9&FC>p916`{ga_O91*%)F@`+R#sXpXLJ6k4 z$rk*{)*@-v0(mw}WiJFzqu0vD-5 zH_<|O=|W%0fVYziAldp*#Y&JtU6^`9xItZlAtXY!IZCc2O0FqVxg}b@Ia;MP zRsj;J*%V;{jaO@p*Y8MF?@Tc)4YRC@b*fKvZA=eninDG`uxv{*YfpD*&2{Nav+PWF z>dAI!OLlF^3hK`B=q&K-FM41ktjKY=%yXnNaI7Y1qAnOd-~KznY|W3TD9-!`QuY>y z_f^C<7pF8=6?Ru7_tm7r=~!3yyJimUs4r=4X@R4$x1;6%6^-TLLzU4Z)u6$u=)vm5 zfrf<9`nZXP$nl2w;rg`6X1F9XM&GX0YQQ^2(LLiq)~k`N8I;QRu>G_u6>V%6R+y zc=ytH@7h%7+EoAgWYflM*Y-jW+>;~24{7Ga_#d8}nt(TO!b!O}I|?V|`V4G!esX7d zbZ6}^!$un$D|;IY+nZ|-o`g>v{r%kgLvXpZbhy2A^q|VEqkpE#(|?1MzsKE2C#A#w z8(;qG`10FdLHU>X^4Bjhsbob$p77Zb=Q>i>b<=!rOM@snr{@l&>_e!jN<@!I#YMBE zpHp|dw_#{89Y@75`~GAebY!BciQ5ELK5|S=|I`*$n%R2v_N$HE%3gra^`;m)uJHAb zpMiS;{kz=(pBt9@Ih6#+&|riy%B`(v75TnCVPjLz552gkm#W2PQ4H8J@Ki%4Xj)O>`^f|KVy_du|v!{$} ze$sm)pb`!qbwjJfRoDwbBGBv42&(f4JXUCyEmTo6&cBW>BWRzz$Tn_vg)W#?+I0sx zNqn;s03N*)?H1C+J&Q<0`|`f<5`$fmPFlC9qoMavx+rUJ8BF$VGZNoBzQJkzw~rXI z*pO_di>SPxRw^ecb)ef3>&{g%O#*qJhU;zp!XMjbY!?KmqG6fBW?09uus?G4q@)xS zP{+{-(F#rCps?$m5J#GA$8W7{ZN0}8g&aP&)D4u`>9#K0reo)Qc}Zwl&V-NAh00Hk zT12Ukf%&Q7uBCa=rO?i1v;A67gu~%gybUTU{AmPNv0DPu7A58J^gY?PN`V2dv-D0+ zZXLb@=EPyi0D=#`;Zb8>yvd7H(VhuN^@&qS`^6eAJc(ocn)_k9m%)Wcu#0Jqf`ZTg zm|^k;h7v@!R?iquW5Vcb6>Qc@4z8I?78cmVhzld*IXg*|=v5lLDJ7|BQ2;m?t=`s)KR*jgpmoKA%J!QVHaBk22@dL`UZXk0 zv?d$gDFv4&LXeZ$URLvnyTgw`zQ^k7We%8>&kXfz)-o?_<|3u*pGn*8&s)UsKDS$W zO!B_#>Fi~|)W`A@N&QUh+Rb?3e!dKaZ;eBt$=hm}!xy@!k z9Pq<7@!x!ShSW)UB#%YK zP+b6zaZ5vIimG1XxS%~Is;G>1#Ejh}M_p=Bl6^W74-hw>k4kvF^@IiSK0l>4=@rR5 z3r1(pvt0`V508^r3pD7|)1v8N7x7VNn|TN#AH#-L5Tf#?+~<#MuJfF;=fX4u;Xavy z0s`GI=jqv5)XYP8b1mL|;Q*|lYtqmw(6BV}_~5^x zRY-AnHGRwZ%e%^hDC%WdF2BpHjS5m4I+7V5Tqj(%)hKq-g8I|oB}zc*LD**=q+duBAx4?`-a*a(L5BWE0UBk<6r;%; zugVgy$C;$cnySN-uF0OQ%aL!um1n{qZ^d6^%w1#5TV~EvWF}Z?$y;tERBg&rWyw=# z#@A@WU**74Ys=SQ&tL7q)8r)33}3E-PaEGsOm%m6)kVvAvShlrny1QCd zut|fBXsx|yovV0*hg7AvF2qT;)l&lEE!XZR)#k6z=_l14EYlkz+7}|)6`~CFQG*0) zwuBgV1!{DK7?g)Rw0HIa#rng81aH{!Gn*BtM)l{MLV4CYd zw$Dh8$3(u@bg9p5h5z4F+MW|pRg_Tz%`WRogBGPgDhm6{k~%8$d+Q3}60QHMMB8gh zp)IX&iT1VsMWPL`BKZ8z!-)DH13&Qia9zRkWH&GfnTOB%69Wz{$HrJ3c z)sQ{eoHbtyns10(Zb?{dPM?S5E_D{Jb!LsUR1CD%4tF$8G#8DxS5J48On21|^|ZnI z`X>8YmU^q^`x@8#O6CR{#|FCo0iz2ejT^ACt*8qF#(3M-WXHy2|K4mD z9H65^gK&UOjy;sqXD9yx(B+wth1u!Nse$#miM_>*TCJlR<~*;zi=**eHZChE$Z zS`-gdEi%u?meRMt@`@y2H)cu2;QTD(j~*WWe);n!W+%ilB+UM;pl`cdJ}m74-2qg; zZi{*Si}@SJFU=8CJWN9;^Mi3HQ|QyCN*KC!D0>)o-U2bf2sjC1eiM&J#7-*Cvd(M| zk(j^z2rdLMe4!#{Fm7C1dqkaXyeDEzEO+}e5C@)XGGH{2?;jZQgc{iO^1Av;Cgpxb z2tU0RdKW5xicWu;2{=98I6m2EUD8XpAsOVibb2A?+ZT4zfnDHIo6mDyZt7k!v*iyw zrR=kCnEA<#cE~$BO6B{gY^R83*kpLGYz_@$T}k1V-FbSL_S@X8h88h#Y2_-}2q#$- zj_nvBwh9pf`n5L#J34k0Wuie-2nQ9{>(_jI*O8)YS7eqj9cCICEB=7#kl;?djpSu)w8(#oAg${E{<1Ct1lW$$;v! z3rT;eV(-x9Q!^3r#Ds*{h;ZR{9pt%eHxl9uscNa$aaPskSe|zNW(q2cqn76MM?W~t z9GQ}R>S?@{R}u6jwJnXfJ@sEcRT5Bs%P&%}V)wCscKJjNZ&C2*5>uC$~fE@>$8OO7CzR z#YdAjH$On3$RU}c`Cdf?Z9Y7ubzId~g9uQg$=hf;nS$R+XcX?5;`x;dc>fOFCv=N4 z>QV8Hmc%#L?~$>OXM5wQ3eDW^Myzw14$OeF2N8^uf;)(;ofKqzAs=h@_Bs^%39)S_ z_TCYRy7Fh9zc;#g7Pxbj#!u?A_&I^O-ncfin?S&%@$q`JSbLEt)yvZ$VcriX;Uy}b zlb1s@gAnk_muufHQGfK+u%1bAgZ1;feNj^KN6}|KH{=LS0fOYG$*~a%J^~{OHkFsR zdfK&C?=kG*IkryzwuZO*Pgg%dEEUAzBe!%r&KI0kJ$&7&JOtBm z%V~~zrOVYy6=E{ZkU6H(H4`x!lKiC!^ zJ6yFMZ(vRmUzPsyX9RxgH)Hi~1m?L1+gN5M>eLc?8gW}kl} zs-PO*xwF?zi@AY;N5T=08d)_B4T+QK8nVEk8Tz16q3LlSwE*f$h5;xOxOmG7n@GtFyXd}C<%=jU{mqn(S^qGHyAbxp8ssbjy7r4ut6u@e7Rs%qjg96 znGcR$fDJM3i1y!AnWdZ3<=5<8CqN^M%;PQ?~CQA$`z=qlxa#;n5s3I zTa@TpROsr|X&W`^nln>jZBH5XqBx}t&2v3tz3ttK#zk^r=wV#n@W$bQogrglea#|oT=A> zvEQ0$z=mnSmZ{g8YtVst*onE{fqTf6XT*gW?8*#wV;S{e0eka;Y^4WXMFyN@hJ0j4 zeZ~6Rl?QxuApq?ORxFBkYYj5*h;iwO{}pGB`SFbhiVgXzg8X$xgXBj;)h8nqCZjcH zleC9JEQVt&N5b{TV+{Kf%_ifGM&qm|Q*4Hk9Q%?zhSI!85*^2~yyntP=W^^v@_iNx z92bhbey3+{Lvnd;N_$FRTXr0To-M_{ij%6Ve!G_00BkFVaPwF2+0*=AaubvmIFaEu zk?TK_8#bL2FpwWJQ5ZQ^7Cu}Y*ISW0QJFkZmorxqG*cA4SP{BV5xY_wwp1HGSDm(6 zAHLL-xz?Pt(vrR2nL7xq1~-&UwN?ytwDfg%k9RhV^t4Ym=P$LF%y-pncIW*AI_LXp zH~Xt*dRrC;+gAq~Hb&T$124^%JZabw;#57i2%z*BXyEh&pwWGVv*+-EQ0aOf zBm)YP;M#}r5$}Zj`6;Gn(H>t+wcLIGf$j=3ge)v?7mCV_7fXQ18y|s+3~4!JyGRxy zr;FfDnzDgIB9Dd+4#Ij%{uULDBb&TGD|7&rhdYSzT#ooh5}{pIprf$gy8hmo*G5h7 zTyFS&+sO;ptfmz!v#oju*X-z)6>DzWemcP&>qnC|f)n(UWW`hby9d*h;+NK9T+9Is zwmlx>dZFir@=|9%zZIOvjDaK%a4yggke8ILmX(%P5=wLe8ojnKwn?8} zUq7>Q;mST}feM+w@{pIgACwH0g2M=pm?R-{nJwl^)%-m4N~8wmb>@bR+}*j~m%N-| zV!7a4$9a8>(;ABQQ=w5wzMmDBq#^>1p$b0F^yoK4P!;i1)*)|zS+Juu99d3fbws>R zh|(yXu_toz@M*B%uo?m$op4zWj)5M?vL46w#UJDpsUd1hXjU-#3!%Duet`mW;y zPgTeLp7m5mfu11badYej{U(XoV%7+gwSktSps4sjb+)sJ#JXXN&frB^Sad{$@uN?b zbk*9u#0iFw2bQ--2q-Q;Hpxi4#Gl)Mn{Cak3Uh6BASFVrH;BUj-b#@qJz;{`G^5>k z(vrSX&KTVg@^EoUv^i<@0g7_@jfG`~d5JWmE=pqfvei_#Ripbt@+j5A&cv0*b07+U zY+f`??9)IO-7aG=UE^DAX4Bc;^%^OeN?O+QOmo(J>;`vCO-=ctuL8Y!p84BsCXQ?u zq?YRYBa9*{Bpbruz_CU`>e^1Vx5Cc?fhbU%A;>G~Nl1$DZ(A$DMA4VQtHJ^4j&=D! zmRIb+z9xL)uz)Ur(AT5aZ4yrdAMlbHaX4Ix z*uJ@LRCv#jx=A&vS&O%4-?p-Gbkw2gXb!bWDhtaE zlG$LMx%gAP6Toh&?I2-SHHD2yL|nyv87*1-etT32T*26}VY61FTy8=r9$ckvl4{RB zi4>YAnaosE2-*qgU%C{#AHAg~+v8%6pfsXdk&n*CtPi;uj1l|Q zYgB)P4Kc4?e26Y&;Y3Bn;l|K?dBs~QE%UVK!F!5Ezw zfp|j|4)~qZ2%3P5SZg`CUIl1IUM}!Q;TD&McGr%3koTgpZe}6AZlV4hk6(F3#rvB3 z&*i+?SU_O*`-uG(7oni;AF{m|imcb(L;>CSuUiy_Q9Rzfb`_dgbn!md_M=RAi}}+i zEk0O;El8=3e*9T&)EOo|{+8`}N3b^K`$yfX;-6@?o$giP@Z&>}Z!j$j3=Is@PF-!V z>4vX`QGV8|Y>+J0{DggcAs=g#ml-0(kWz_{9=r zrAq8Tae`)9$~Gy2PC3F(#rLgR>^0hgh34X|=2C6eAKINYOWpN4eN6i0hz6yIhQx_R zq=|dwi3XI3h81Y~)QE=EhzB&OhjeL16^KWbXht-NN3}`D)kr3ENhWnkz#43Q21Enq z)Ki8e;|8=-rgTFFY$K*@YbE+v|+rdq6L zSuUhF%qMxzXLzqW@Ik4|2EoiK(gSfS| z3HbYg{a<3zv6??)(wUr)v4WWX(wynykfpqcwIcu3lBli9!1c=L#nR;Ys>GS^pIQ9aYyxZYW}-59sq zo&~Y$@6X!7-o{WjMJbkn}^Cwpiw>M7qw*Hk|^knb9%tbMnoxePZ^`GaWHGdK7 z67mNOWgNigrBrx{6qrFHQlF|Ayb|-gP_5ORQeaTlw_r1hh>W-T@00hI#1l+%EzsUF z>BX3vWE_&05F~OU&L9_U*bi@3zockj+UQ#0I{cJY`NQ_xC-$<+{*#uopIzU!zWq3( zJ)_CvTOMfzq!<>;KVb9w5HccZ)#<0cc=7YOZdiC^q!8ZrSC6ioSGD}mcYQwiE_YhI z+n2)Iq?UsRn=cp`7{15D=#6s)WcgvbogE`z399uB+nWbfUciJITN4(&YbR!P_~wIX z@y3xGoT%RE7CLASMc;;lO1;+C9Hb8p18UUbYbAd(XidFTIp-PF0H1YP#^~7AYj9Y` z0`miAT@TnbzujqT@KEvaXvc59AaPLjT^c_W@U_^?P~4q;bAqI~jdTHpFquxi)NAkc zdAa?&y#E3^cBg1%a3d& z_`SP@>gW$a9dTeLTbd^}iW-42>DX(tH*ORt)Mq9c46DW%5Uyk5O3PIJz)uErdH%Va=CxDDhAUQ{ zN@{N@`F%jsab}Wn6C!_I?BxYGwxU$Yx$S`g&`5MJ%r2-Os|DYuMen=63seiO zenBy9Cn7m21;VR0cKMQE`d}>lNriaRKuXj)@A}(u`rZCSfp$qzN?!3O2W<&(dq8oN z0!vF?-G0HfIsrQzXyuxOfUX=VBmZPAhKaelK)+a_?e>kUCBt=oWlLx!pjk!Mq_RKioUc>E&oF=H)mu^ z;>6_DD=XO!j6wVJIlzkg%aZpIcT%sGR^3yol$7k(1!hYocG;;qH&)e~E#6B|T;@ST z)#7`yyP+(G!BwkRLZ0<_)ZZ{OmsWpPsSJ|kEn>=-(X>wPeK?<0N*F;RQ?q>aPJBKr z)v8`?UoZcFI=poAZqWdoG?p9cL<;VwH$ssZ@dXMie23*XX>{+FCd+h~;8vkc1Rpds z9wyVrh^EK+N5UDPc$cG(+Gh>$Z12u|*r-q}uaC~j9zYX~|dlK*?Z|^UoO6c`9-$z8q z4Uv<|ORQlNaeWcG9Z^F){p5p?7ZGuPk1i%kcJo9 zKr%vEHC;3ANn9aTAwKHkOc0CFxt2%+LSE%m@M9u8v2Yd`jRO6 zycqtpB>Joj`mzlA{0HDjq<3A+LD>bg1zvxqui{U(7J=@x|`^do&18c{EC;tin~s~ zyTP`P7zCJ=VNMWW&V^}h1Sl>C>8$(du7~Rm2ipw9`i_U&jmLW}M3`?y>n+8&Y$RDP zCb=x6Ij^L+Y$UjEW_#?0itk1%??8;(A&2mgiq4jTU*$=) zm48V>yGrt#YJZ8c?Y|Z!I5ToNBXFQ7Yau^mu{>_RGGnbcajP=U)Ge_I&r+fd&)AWD6LTPjvh3`p@|5T3fG=F5B&+QaNu!eKl zqavEz{4h<;<$I~7Q;Mbq#U;e2UEl@L{9hswAQ*7Gwi7OzuIJB>D1Z)lEkHrBWG7Xb z1^n=C1R+s80TXXHZg!mcf>cI_ME++7M@Gsb>VE2mZO?a?Exr!-hfT~wx@Jlo(<7p~ z0b$ST@$gKr%H%WYku{850t94adLPgpag7*(TgFs4zvy>7wb)_Db{;+9?H91n2C#(t zSI>R;aC-Q5(S@ZyhcgHUV1+*rhZX$1Cib(35wL4}hYD-J(-h=A>+G(**(zZa$BH-E zFCTj4^^-tPZ4s6DG{l$Oz_&n2Sy`QkFDKeLj;d9hZ77)vrzM!Mt|}WiyhjiM)V|jT zMG1@wL`P-R>m8wHB43?zz4)djXxO;IUb$d$u&pH!jR;*8z1L@1*z6@?6QV^s6=yoY z|E!B}FZJv$F#DzLa#J6%)!C+@KXu0eR4+dW4jFT}t?$8^!zFrrbUX=cl-@8-acmUw zB8`IxJ6*+v(q>I_6%gWPgYnFo{nOQ7k(#Rqv4yuH)5dyh#Fmu$23Tr)Cy zTeQ~x;ki$jF1o_QH%mAocFU72P`M*J5t!>X(Hbf+5S0fz;9Qd4^^ZN+02L) zAu3q;&+fsB;o;|KgcJ&(kV@E zFV*1+O+&XL)>4-$_-2m+4aaESZBx8w*9WhV?rRRBZBV;t1)1|$%;XPc7Egecvis)1 z%8F^4eB0DfasWDFcz#?Dt(>V@ME6YJ@lE|JXR@Va>BV;uA1glk2w1A2BEj2k)p()t z$JO=uiC`hk9Q4k`E^hgQ@>t>!TUwiIj1qMC!iQAn1?jOW&X&s!#Y9P{sLkgiwun}2 z4HrHFmub3XD(3_+5{6X|_05c(t(^&kVY#5*yAjJ(f{YkZl}kZlY#Qi4%qZK%*Mit$ zm*Am6z2OEMQ=r~+y}HY{y|B=P`D#MxO%?Ykx0(wT^%+0M_ua4b7TBQu*IFr+J|H}A zIbNAgx`ma$exyWneqD{9pOWUfAl8e>#kZC&uvqq?a^7OXUfu~$H>IZm8fEq-Jd9$2 z*8<_h zT$;s?dUuxrk6ung2Xxe2V^=zx=Yy33+f*HZgdztF#N^$QIUTa;_|w*5|DER?7~iUxVNmqp<+_nu+8W7bxblC?fltJW)B)4^n5F8!Z{bgey=L8<>-7ul&$cr{z{Vg$z+cc+G z&J}HkyH|J9T3lnCxUwYKg&ZVz zg;Lm?rHUC(45X;kT6mGM8do0UNoZ)S>)p2i%;pJQhm>gH82VScP-rJQjyNBZ#AoR; z#%c5$tlSal$r4ZUV2du8&OM1qjeE5kDRH%#c1x}zXZe^}cD9wmjpEB+cY7kyWA?6N zeC~^Rp$okp8BdBOH}r!Va|?WFHV8_ze9?mSwlq6!2-m+ekM5V1J1eTa+B7f;)Ff=cp z2{SV!8Nx(?DoMID&ixcka&uR5t)uopug5Clc5{cv<8hOBz0rD-qb3B$CanH#GqTI` z=5*nqc#8Fr>YXO8y3kLw+Sq!V??3nFf?yxbb$>2+!vs8k9`z;hVW>mtvn`V>90xW# z(!P*@qT^E4_eagoD97lYIWHFRHUC}V+CvU#qX0B90_u2SdKi#ur7>$2iQ0rodSn@z zG`MQ@IU4L$2dDsGTEGMY0L+d&!G%1-447vF%i@46MPquKRvomvzIOea)VITNtn_ z3OL{g>`MX;#Q}#hfFn7;uFT6FVcdO%mq+R-#|nTGWx$CV;1u%F0Gw(APIORqHE?%T zs7{Sgj!kg)O{jMCIQJ|$kL{=r>^YBJxlVn#z`6opbJ7bT?>Tn{!}jwWs(GrZ)b4@cB3QLkChK z2XfQqGsCu0{lG<;8zs>z73tubvWbSufyVlQu5NHEaH6wywkm%HShL(vvff;_)>gjR zTE5X;vCv+BkP~=V6ttZeds-R1Ule~(ov_`IecG6`+fu#TRdv!?@W(m*Utha#fLab9 za2@D88t*wCs6QQU_#Liee*@RKvC-ur(E8ZWU-HhyU(=ia@$u2gRPW*Z#PQPP$@1j( z($e&YXG@XFS;KLA zR`VLcD|LjML;1ZPJ3PHXUNfJyxu;y6u5jyiJ996N`6p4R#?c;qX5+skKDM>C=J%)B zOut5eZSVi=UqkDgW`pX3T11WZ3=SO${`*k~^bm~O=D|te5wXB6f~otp=7$%;87mc?HUC%} z?t8hNmWCBV%(l?)jx!LDQUFE_Rw7IuEk<+-hFrMc7bGA@g@zM#$W!xK-E--%=b-Io z3_-ZuC(IAdJ*a2fhtX4)2N~V1wc?-*cic7#0Z>US1=Pq=HQG(o)wC75Xe?3y?^aUN10qL9D|}X1YOdIZkv?bX;OV<`rZ^# z+svCMfuOmCtT7s%g(`{VRqvWRD=#lA9wZ^%kG@`*g4Eocn9c8qlV_Xst<;si@%F)` zp`etQ`VtCfxVM*10DJc#tafTPAPNZ!w<=`l?b`t}2?Zg|q7Z5GwT6-F12_#C9{k;o zyDP~5zom_(rCj^9QwyiU$0E&qZ^i>Dd6~#HRUfGes{J9GHfA1J^gKylwZ3n}SC%HX zJua?WeLwt4bv_Jsv!@SQyhg|i$e%XwZsz4e?9##cID()eCWyN`VSOGqK3RMfxfZ5V zb|O!JU_%1tM*yUScE#_&AMUk)dB{PL$(FR_;a{1U8mycj|i62?^0xn7g=Obu~4Gqe0P=8~2?~Oi>s}fzX73x{7zd;+TaRT5-iy z)p~TNQ%cNo7K-IZ3%*GVlljwY&f0G&s{Eg6K^|H%a?nI04eu8aC$sw-GRB!zz!mdU z>z{fUQT0rWBhm3ce2b=`u2kBa%iXi%%x;;+Z86(+=G2x|JI?Y&jMGLj9(Dd2SqHaF zx(KSQI9um!FP83CU#8PI|5`z5q$yv_@h}Wgw1AZXV>-2SBoMJC!b;au(YV1Fp#)U9 zxLS>2<$_t7CzxW`xC!5^nZL{Z9sDMe6pk9Gg#Ix1?13hwoRX4`uuF$5UV{G2809?) znpIxPk8&?)`iY5&S}BqQi5?cYy59Dj(33=>S ze^cUg)IrCa85j3?y;V+X><3D*@!CnxK=HR2>;B!{-LzS{i??eb$f0>(5>;m| z3~j>t^q8>*4GZ&k_y}*{S6h6)vfN^BWjir(ZZXpTyTbG-QGH5OpAyyI)c0@j<-ff> z`jn_XC8|$}>Qkcnl&C%>s{i{F)u&6OPnSraE|LBlnDw6~s&G%2NS`i|K3yVxxq*H^>qG>B0QdgZZZi^G^@vpB~IVJ(&Mr{9yj6 zNc5>l^r=Yne}h=zo{B`DibS7^M4yU8pNd4EibUsYkjiBs7e@gSBC^6Yf_edvKO#$r z3oAf={{Z>*9svgO72SoJ9RT<}7kyeydRk3-T1|Q?5`|Fszq<+w_q3Yyw3_s^n)I}q z^t77vw3?)7YvSap?_dl7xUD)$gXJWZKaa~u%OOk3NSDI`=(6DczcBP^3I1sb{%HyR zX$k)KOPxR+ z;K1u{$L;ON>*6BfSVGe=o(LVBXLmkqAGr=s>Xuf7z%&@u&cq*kH++AldM6k?3%l z=pfDbFzNU(xr8w3gfQ8pNZFKVxs({W_%OwU2<3zr<)jGtkOB%Q1zjf^y%$Z#`AeNudwK}xhqPO^S_yk%~( zSz4k~ZmNA@rgmY5K|#8CNw!6CrhRFSU164YdA?;;p>0v2U1gzTWxi`=k!Nj*dwqp- zW2HBwfa%W?rP5r#;=J(k!l3Gs(Aw&t(xQ~=%G|%Ll&|c`Zm0-tt_cLzL^f0=0vlu6 z8-rWx!#aTB9Zj)aEzvD?3GGc8J*`RIt(lOj(6Y+9+WNZM24G!vQB!?>TT4|}YjJmH zbyG7CQXAUY(a_V~`VZsrJ-t1D*3tKOr}lMZ^>r8Zch`Wr8;3wyBmKqTfvSm-is8Qc zfxhOUfx7;_PVivk$WZ$TxPEG^adNa}e5~t_x~1;Hm1git&&+t^%w)&>OxM!uVd^>svb;Tf3WEkoot$o$bY)|7-^S;9r=5 z|9E!(`w~1t-Wb7C@6zv}RQ&dg6msP8+{I476!QCThadnKHupsU0PgTFy-TToS%RN2 zE;cEksGIodYj1qs`=*I7l%Wk6?O#B(ltCFF9uoti?|p>;D>I%pvb7zA0F55+^e#{z zAcIvmv7=BStcM$~M|r+l4Nlp}XkIJ3_r9pn4Am5Fkkj?;*?Q>u*8T0%M#ob0-58(2 zd^Nl@H@897)VQ>qsR6<4+#Gs`sRxmR-4BLdCun&j=S{dB{mX(gOMK|4t*up*=YdWf z0Rq03uMSILm&AL1EF^fy3k}D&0&hkF0Rg-{wg@$68aaGC=}T9sw!9}d1wFQo5(^hb zaa-ik$#5^n0`?h=cxQnD`|YMG4J$&1TJp{lxv|>|j|qvh(?7WSkmd-MSFr;WD6o)7 zKY1NxCN5Nfg%U)td9x^&lx$OVp2vTgZNPn-nUXRD8||#+4895-P8J&oYHQ2# zUu(|xMCl(4b7O^}mrp-zBTGb0lTMI}Gks(`23?67HUw1eJe|(Q z$}(#Bf#4QNFKiPTBuIbdrISPYoJqmxF5ghrZPQ}^$_;&SwfSryTCIvrrzf0maqV3{ z4Ic`Yg9>Km1b0LoFrUh$t$SCSTU`ooTZUVnx$o+^?LN(i#x$9MFM{&%a6)TD`_rkg zhCBux;R=L9MDgNkXBM?})8~mzGDz!wp)BIWuZVXeY7B6EpigyRqp+Tc(aia} zi|bk&XmGk|v5+ws@g&2Hd zQ-c|^r*`K<^1znLS#TWGY{A6D$TPMP&=(O3y;ePYq-G`3V`|2A^`}#Z}0*wQcr(ga7S`X5AzX@shQuMW+F{fCdk^0rC z1oWnnIGZ+8%DAEF-{!r<(Ob9q1`nrpR5MAa)40^dU-*IGT!&30fBB>Ap`+7C+c929 z{}eQ&hbmhVZq&O5#L%UD8%cj7M;K35@Q5=q>oZOUAMlVPek6?Vut*+dBiW#lO5);bORc;0O%r?ryEt`C>2xe<4a^x#teMSh*ex7bt(`gSoO$itxEwv$9lh8ceK?#v zd0c$BY+Zz%Jp|l*`Q5!`+M7|lvp zEXvreD!6Q_cx~z#9h$g2{P{ft_&oy!J^Vzx1BHA-gna_VePRUN0_5#$g`DceAXIf} zl=v%ELnZyfMf}1<10y8@q9ubOWJ6*kLt>;tqGdy)<1>^Kvs4n&G~=?gl5*5iarRC{m6zFFcSmqYk<(1eJ z7P%CbITn?>m)E*hRQpsn`1~z5^Yi_ROZ^Ip!b;1+%PWG*YXhrmLh}k!OUsg~YZ9xg zb0GArZ49ibi_Qn86gFi+8t8uk6c}9B5LpL|1-3>4TjCp<(puW%n%gqkI+9x3GCDeP z+B(y^x_>o*mR8nQRu@!M|2}|J4`FD1Lw-wZb$feJdwY3P%P)hrwKsKk)_34Jlxnn z&@nhxKQRd$8*3dM>zbJ8__L^fYPxG=xf}8#9r6?6&f(GF$;mzlJ;#2h=L}>luXkp) zcYYBxzc{qG3|?8C{2iT3tBV_(^Q*r>b9H@ree;(!H#h&znp@lJ5N>X7FKzGsT{->U z{`T(vuhI8|!<~PMjaI%AQ&hZNuNB-8tCuO9pr4jj7ZTmJ_^)! z8MYSOu-0xNRsG)W_#nty*jxL}=jfr^akA$qC&yD3oSX9yh&(gcu-F1c1p5hvcLe_X z4}vN9l}I`0B9!Cvi;Ig$fDdyN=XY0DL@vR&zGrYdyL*5yP~1~@eX#5~d$;0PUs?g* zI;LD*c@bhintrDjZ{9)mbK}lNosOP-Y2t(62!oD?f?nQ#(w`ukm$_xn8e_ zKh&@Fqt$B%y?$IxO=m4C!luOKYG*887H{alU>#}CM0-3wj^Mk^ZOP>4Tdb+JinAop zj0$e|4kbWLy{;`iMjall0+#JKTRG=+`_BsO2b+e6XMI#-GCY!0=2>{5 zBQBGjCV2~WzYBYpd(|j1zfxZ&w4P06nZMG`>FiGd6;NI-?DZP%N4r2`?Ti^^zF?*t z9RiEN`z%Z;nNX<66vpbW*stqlp+@{hZis{sc)a>(^}-5bS1(`dolaup&%ATKQR?S( z9#wizfrMaHj!Hp2ph8!3>?S&sS34~Ah!x##MpdWT;VD}MCDWgg^63rd`;Sd0 zbEPvJXN;##@PThKPCggTo!oF{AJ4hZ8&ZetV3}y>`V_z%O0hRCER!JAE$D#La=viy z1pE85Ompj6s@0#Lo_AZCHv4lAaB54VA~z{%Ap!3TMkT$wW!GlbUTC(n5W~O*L**1p z2{-P=>Hu7vUBvuZrSY`c@^2DTOL3zvEvI8IKK4KdyuB@%?`NDd%Yg1`$*>qzy*NdL z<&$#hZ}B&qd1nR_dVt{V;Lm1n8mEb2vdX!dzx zq$K|~q^hP;Q(GscTE0g`Mcy?B1r_18iVhm~Yepxv-%gCFVR*?c*)WD___+E9@5i$* z73)>>ruClW7w0?fbW`~|wn9)`X*Z;Pc3G;)#Y#2T9!FHl6rg5V>$MiI51A^p zbaL9xyVQkR;Eh#ihd(1_Me5KUa&dt??quN&KT`Yk&eXy-*BvEED#K+7XwqAKb>kgW zVCi`ggAD(Y=5SsMLy7i)Jp`2rNsNvz1P6x}vy1>1F<3$V+}uYc-z;QAJF`Y9$hu(T9x^Z`!5x{rw{XZJ6gAL3Xn3 z6l?YRm!zt&L(b3mx&g0B=i2zmq$F)zO-3omvq|*`z0nH4PhvHX89A)LAAP`ahbMqw zP!amW0ec!o?4-}IL0y~+b?AVP81==_FgXd33x3#r-`sEc{Og=O|18vlDjoR%X_s*e zxqzA2YAU&P(-sI!YHvSwF7)|a5nv9J5(T^4V}`EI?XVxFD!jDmQFo4y<7GIXT3^p& z(UYE)k|Juws;T+$cxR-*HD=Z7VnWEZ(Aq2p5369ePy(GyhA29^Iy$;T3<+P9(BO;R zo^J^dh{`t-iVko%zMpOr$$}S_=CYuO^_N}77vkO)vAqLSfCMX#G1ad zdUbdV`{5mnEe)*aw+w2Nxy@JG>4m)WqC{5DkSE?)b>#dYWevW?dDX>J;%T(8&wM*) zbARSvZ^OuMWr>ef8>oYQH@4y-w`>O-n7su(=)(BIK=-JWAbBTP{tr@B(VAS*f zOwtIPww$G_?$*J(ntM<%mbj@pYE3Eg;Z~C=54~a|T%R*DCB6CVZvWmiU%KbBH zV{?j9bLtZds)LFvGm0C6OPl>5cr9;?s%#6bXpOG!46o_@8^tyz)wU%-EL-0l*U+6* z-=5LXoz~p*Yi1s@*9i$ttLh7C8h(MbxvQwTy}Yfbvaz`tqScm;rnc_7&YoYPY3o4N zpIUA0E9x35?&_Msl zabTork4+5zzNs`Z1Dco}p8P#DT>{N4 zfM=Kc7gqnsN>>+FHs*e3>-ul`=;q(&qZ>O*zs&mgVBP%#tow(%{{YtGlhfmqk0+-e zPd}dh8IJ0fO<6rr^`BA|Zt@SR`dXnIV-4E|)=#f8;7BXBJ7Y2WwBBk)%sDT!ypLde zr@@aKr?G;A2qT(gbW1E+E)_xzl?cMv7o#tHZ}i*{Nv&5#gi=;BZiG{O?tGDpRy{+z z!$oT0;z8%xhS^WQGskbd7gxL&o?Dxq-kaZI?oy>GZKsDY)Ve<|@PF$A1Ns*g}|;L~fT^^-Zcf%BMm{U{X?iV-gN7;5KOiiQ0>Qwl zZ#U;C`BeRsgkt{mb)-R8gt4>gy|DxWB8|GbdO8vg1AUk-S`gq)q*lA~Lm60tPGy$q zO`G@oGQ2ONt0MA9*O5?!(+Mm*mYm;HVFW*feRuc7qy)P~C=lvaeV}^n%5P}=^_#=O zJK+pW!R@1TCX-3M00k{FEgfD<3>KQxH1bThS0h|oX11+bWi`p@2myZa6d;0n=hcn^ z`xoO4V;VGckxk=J(y#Q8k>QFrogIf6P(;|+-bUI^Ga$cnipi(9p}dt60A)cVh>lnw zOZ}|7?=bX!R(<*rQ?pO_Lx7$D)Z!(AcIL*LJvAiw#WcWTFSeePq}tbzaAV~A$d6GW zHU;#%UKsSmN#d@-3rJP-F$OH^!|*os_0T2xh3i%>PHNR;&tBW}!iVWOk#MTDEvm%y zi%PmbeqklJG3zzaj8xz_E^A7@!0BXlt3boFBE}}39EL(K{=up#Nc~*9Pu6EzULUAD zJ;a(*!JZ31`cm+clPMC8iG&m{6KvAJPfHs>_@>eL8J}Bw$+|`3qSjt*yt`<&9P~Ys zduB3A`Z!r*Itw}-YE`lZ6UT_T@q}`zJJI#p%Q^c3H0N#vtOkLlx}=EvNH*dP+#A-y z86##e!=h0V%2!$XqJs7eH*RpU{t+4xg$NOwdd5p+!ggS2KN~Jt0s*ObOnrGEs|-b3 zp6*NAv!P@Kl2a{ctWFjjc$kJyN)%34^Dz|~p#;G;1T8kGj?toBJ1?id`H;I?3&KY9nItk?#j`)}XsY=I)(}Uv+NV zj!!Ke93&g$OG}$9A;b2;TX=2cMj)6% zuSO63)gp<+Po6thFyBT@uM^$22EIK1ZnpL9Cg{r-=nPhT8LUckydOtx%mQbtKX`8O zy<4oB`ScBv{|99$ZjC2lizj7+FXKq0;7TIzNTKXWq2@!a?aBGKj#LdGR)c(kNi>7V zwE}50BT2RW7wwP;%taFy6bFPGIysAg4ig%K(XO_HYuDnmYIYgXp`O+SR za-KzU9{C@93KhNcmAp$7d`p%7W6m0os~wbO6q0Ebk!u^C<>gh<;fI)@8h=PtFh%AfRBg=bY zi<**)8?#GWOhPIq1Ub;>zYcvkET5OWy-&@^7P~R zpR(*s%r1VCAir`Pq{R#i{T5f2fWCL`2MK~7pa9@-F>wrKs^8v zJ3R{^MfxBT67sAnW*C+@8%AM{nL%zCKWZSRE}Qa`+D_cySFFoT-8DQetGdQh&x^I8 zUVWF-tIh8}e73r}HaxecbFbCX05H;Z-eNLz{c0m`%WQn{`E`!eLfB*81%cY&p9P-R zvjp}|ze-_8M$1$^1dJdfA)}ylc-w92oB8dC23WhkqD@VGhyC{Lj%DYEUHdlCkQ#0T zf_J_4RWyJf;wJC{5SbtNWYK-`@LMeXTI-&A}(9zzBp;RSURxG(OWH*#>_ z7NNI`p?iuvccc9#zI9rh4ZmlQ8b+w8;1OrNB7HpvZY%%p`a2-tC3TQmi2iri9y%sg zGR`46tGcL|nCJ+w)Xhd3aaWaK6Axxn?UlK!2j{JiEZ=Nq#AVsk))eRD5Ky(@KebR;s_BwaWvIvW}3 zqSwPpDz3VH@*{VHZU(RSqEirg#+(2dj%u)oIcw6N4gX%%Xp^L(oCNq>gFp9cRFwMLFvtE;kSQi<+lv#|kO(gEf_i}j zm{do+PpL=%P`lI4%`z~mzzE=caZTNSc}W&=O7x=pI|IO73omw!%geD#Az$fzfIPGV zslOYjEkT9=dkqmIB4aF$FQCH>7z=}d#GYP|6|f#Y@&#EM3ZKFOhwA-^wcX<`((+Y zS;aaPS>@DDSEt^SGs+}EpfC|kup^cvHuQ7Sjny4rS98_>)82i4v*GV?07uNKSyij5 zT3hYXQd?{lq&7ucTdbn?Dz&%7ialaegi5SfHEW9)9cgWP`1Ri3Id`0UAKY`F z-GAZx=yl%j_xXN^pWT8z(dJ2$Ncy25mk#Q^OR*9L><%<^-E#q;(nj}la`r#i?Ln`= zW-SK-!=`OpBd0paxvQ1MN1Q zL{}#*7nW^0tkuld)7jbC*jDh)(7UgX%gU6we7xyK%zt1Nt2{|eN6m-AkHA8`=3mNP zTNWE34{5lB#%}WQRe;6kmE4f#8-f!-VxVZiR=3 z3w;#I)h$=U3LogP35V7k4?H&KVlGo^)8-Imie$HON8d3J?zGQ|iLWO?pin=6MW8IZ zb!#GRe#ZPAYic%(gK~etI;~wY;Vc$w3F6L-*{VIIFhk32pV;-qYR7dRH0tVT#MDi+1yqpmu=Hny- z@ip+;O_gdz0OsXr;N+1C*YbGaq`eOwtla^-kWtXUuisVh+eQ0p(jg2n;-Wi-8(&e( z(NR$^LTd`L3TR&>wMva;i3dtgwX8pF2Qb+33tuFMb~oKpn32`hp~ucv4oylV0VIh^ zjVr@X(FV?EKN)-EHt>F-I#jb4?{zFqM7C+#u2g|i$AcR5(?f2dS> z2!o;rql(XEb)T#1{w!L-9QQ+bj6)^0BAK+GGwHmztQ&SsFPi0k;uQi~4bxeTGucdG zS54up1`&LqC~k0+pi$g)qgY;}1a9L59^*s-%Oo+A)SDJC9`lr2<{3g(siJ=})-qkp zI!)>!RO(O9+9uy6(A5Si_9#QnHs|)EEE&5TnI~CtPvEjnSqhH13jflu4uuN;T=v^V zt2w}wTvBwM3Y6XQ)ZNn!Jo9wDQqBFcEdsJ0JC`WCl>yxgwcX3K+$%J_OLPcg^+0HP zRp~sfzVBNF@-Kc6RBYv6^B}O^BmiL=Txl6vZ}oR{ZPgEar5Dm}6b5&E0S}5Oe;irl z`n>jWRJCJVoojr#Ut+y?a%EstGvlFRy%OS)4Kz0le|c-`=M>{;Jk+R#_r(qG*?T811Y5VfwQy8$(TeAUy2?&<32 zN27*cqDC7!Mq18&I*dY3)^$xb6NuXTrUNsD#7wmJ&bIYUp$R@6m^)vI4r0;2aoY0- zPWy)kU%xrW>Co8uK6GHRduRqTGIL(lkK%gA7W>C>uP2vAe*1K0ac2JQ`Dsq<(gN=7 z;y)bd#J!(i#ABE6xFrHn@o)dC)IW*(={9QH+v@6;UUlY;laocVasAwtU;8nBCbzbA z_h`l2eMr&r*|U`)N!&BO9JhOK`aEVjsAIb1?iFj0%5&dqq#)|Rcke!$YJ!ox5&d@TgyFmf+%CI7OX{?7*REKZ-NtUxn`yH{9oY0l;|f1bY}3iG3=ql!L%Zjey)Z&DC3 zB0b%%dsr5>gHs)ziDi5_m*WYV`8Is4ZLzxvnnq#<-6Z z&_pfTINRFPVxmY&>Aei$%*k!Pb**1RWAKnq8lk2!QUds959=RX@9rY=*f&tZ-opQY znDnn>9p?&Ysj$R-hYQ=SCWHMozWBKtksja0mDEyKyuW$GeCS_j^lHz-67BKmbF%N5 z2_ptfuJQjohGp;TV{arq#}hNC@+UYX#CFNkb|wiP*ae}}6L%HlS?OI_?`?uTL|Cst zzXazO>w~NwSp$Ey#fc!Vx=c^;Rxr4lApP%|NP?Nl(x6V-W#+NP##Pw>f$&Q0C)^J* z1zRNQp;5ylvj^<~D76Ap7&+x~GB#^Py`!A2)>x9L%Bf{@LX(2suoYbWDsFlEU{()6 zy14lHE1`xx4Cv@7lw1dZU?;M3Vw$q?8(&X!7>?_F!+Sv1)MaTMw?!1mQs_5+{wzLe z)nXowAd8n361RJ}mN_mc>*X!#b-YzT{yf0?Y_&#Mbq?O}S=MmX{#JyXqRW8~v@}H4 zhUzraELwSjj#nFoY4}X{s}IU?xZw5ayL(3nojqYLDvC`yX zLeOM){G#6Na=oDoef<zT!(N-EksRMIk5qpM+9CAbzGt^Ls(Ox>Jl~WVLfQ1%;T{ zEl4Rof3S#i1U!}%V+PV&-uvt|=_lcgV;=9k5EF?Xj8NGX-jw0UYf6z$mgAs6T+JQ2 zOQgV(gx60f$EZl{_-cY3IBOaFJi?zJ+a!`K?hG1SQyuA~9(N9+cEBjSj4dgUQcsNV z&0}@-{ATg4O;U)+2?F7yVwRqt_`dgT3c6aFdP751q&UFoK+o66_GA6n`#Yx+TzYzX zP52KV)Xm(I2gQ@5YL#hDDBZGiRItFz)*Os&04;s)7}Aa3)ZvFGY0FE)MazYWq7=6+ zPACwHQ(0gTNKb6Dp^n@zQ>roE(wCq=iFErcoHbu#oRDTFur{yW>As^eMlG>m?!rQ= zNTmrdWn~b*$?cU~7A`Ks&HcgO1wgwMbud6pbGm?%cq#SH%&7oGTL!Qr)+mVvtp?dP zXZej6?;6Lm4%$eWCIs@lb={cXsICmlE8c#UY=6C(-rPQGWO&qGk|sOS7?bcY?T$}X z!a(WqF4d*IvxbWtw?i%gRbsv)g~L+etr#%A`*l+6B|aLy0WNQn^uCKj35<9v!i)Br zaT}lo1sMfOR)av6UV|+0I&txed9s&vL^}Okb@a8guJ=ED%bw!k5)hy**ogLfW7=81JiY`quIXzp?FJP literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/left_triangle.png b/kicker/data/kickoff/left_triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..b8ac404fd3b892a66d8234fc45fcb2ce9d2439b9 GIT binary patch literal 781 zcmV+o1M>WdP)-$l4&UP zTAW2Kyty;GGrRlOGiU!lv-{0CJ2M`S>8p%&bHFFyOYrjJe`{vjwG=O7-4gH}*a4nR zTKBv)N0Bnt%>W;OJz##?`d$Sv)-3>EfwkB@y?KR-)*z-M5y&i+mV z80%JmV_>mvjZOj>>*i5B4uP2_wOS8gtXl@Y0WL?q)&f*`{0Qt4fyY?262Mruh~jZI zckSXBHP#JKJZ3i!1y8_O_Y%e9pwu&KE8q=q1oZAVUeqfTygUXk+rWF^wydQzC4B?I%Q-sB zo|UnauH=t6c)1H+2EZ2Zkl#|8YEvk9IYC?J%WQ6Hs1Zhkmm74}-2oo6I7(FGdmwlj z2QLRGZb!{6r77D*7Q6`X7C59u+-ALrE8Gr&b>Jpv?MW)qN(3(#C~i+n)c;q-dZFOu zK6u$gf1BTzdQS0XE_gXbPvfFQ{Z_is3b*TMd!7}yt+mq?ZVypXNv^uB&jZ2B2)#27 z$bj2U2AT@DJLoOm2)CV1WWmcN+E1O-t@@ zZvp@WFSqE_w@oB&dldlw;Pwce!>^{T?_Gc=1uxeqZufzolh*wPYHGE>=x5-B00000 LNkvXXu0mjf6f#+A literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/main_border_bc.png b/kicker/data/kickoff/main_border_bc.png new file mode 100644 index 0000000000000000000000000000000000000000..05e4977633ae6d00ea5bd9f636b4c242cb192aa4 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrF!3HE-TH59VDb50q$YKTtZeb8+WSBKa0w~Cm z?&#~tz_78e=6B#^AYUQbBgmJ5p-Pp3p`n?9;pcxK{gQ#9)PRBERRRNp)eHs(@%%~g zN8NyG6+K-XLn>~u9NfsuV8Fp_;2l{d^I!f@Ur_YzR?awu9rg_IvaDX07qTb;6*G9c L`njxgN@xNA0s<+> literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/main_border_lc.png b/kicker/data/kickoff/main_border_lc.png new file mode 100644 index 0000000000000000000000000000000000000000..c440e859ee368be9834d5dcf88f50e446b0e2277 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ&!2~3WR(mW5Qk(@Ik;M!Q+`=Ht$S`Y;1W=GA z-O<;Pfnj4`&F{d;K)ynzopr E0L3^hc>n+a literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/main_border_rc.png b/kicker/data/kickoff/main_border_rc.png new file mode 100644 index 0000000000000000000000000000000000000000..6cef8af01ef55c1e4ae0eeaad7ecb8c6100193b2 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)O!2~4dW-8AFQk(@Ik;M!Q+`=Ht$S`Y;1W=GA z-O<;Pfnj4`&F{d;K)yn_E)Q!3HEdXMMW?q&N#aB8wRqxP?KOkzv*x37{ZL zx}&cn1H;C?n%{wwfqaEzk04(LhALGChK6PahM)g|^h*YYQUeBtR|yOZRx=nF#PcV` zA9Vw&_4IUc45_#kbH{C0 BJ!Jp@ literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/main_corner_br.png b/kicker/data/kickoff/main_corner_br.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d898ab65bf2c156bb84c030e1905c08df6f740 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJZ3p^r=85p>QL70(Y)*K0-AWOQV zuOkD)#=e^0fs=uJg=CK)Uj~LMRR)HJW(J0z|AF*N28L1t28LG&3=CE?7#PI!C&eFi z1F8-1ba4!+xaD)kkn6C6fb&K3n8S>yb%!8UvuMv ze4W+DgS|D^J{^gxOf=I8E!)#A#oPG!eO7{-U}vP?lX3=aez~_cPCWKNvl%>H{an^L HB{Ts5W}1?fm&bkeTPt-{0TAzrXLp{xAZS{Qu9)@FSP6`ou3g Q6(E_E)S!2~2PENq$tq&N#aB8wRqxP?KOkzv*x37{ZL zx}&cn1H;C?n%{wwfqaEzk04(LhALGChK6PahM)g|^h*YYQUeBtR|yOZRx=nF#PcV` zA9Vw&b?|g?45_%4WK-~m#a!H6+S*!MTie*!m>CRCw||$HkdT-$V`gMTghWEa%h%J- o@2~s!=kxFH`|JNdSk%DCaQT{`RZ|#uCeSPfPgg&ebxsLQ0F50wSpWb4 literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/menu_separator.png b/kicker/data/kickoff/menu_separator.png new file mode 100644 index 0000000000000000000000000000000000000000..2ba13727d1ac4e455d7058c89a6497343dba90a7 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^Q9#Vd!3HGb9_};)Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GG!XV7ZFl&wkP>{XE)7O>#8oRiFmE4xQ%gzCXWJ_ElN}Tg^b5rw57@Uhz6H8K4 z6v{J8G895GQWe}ieFNU7sOA9`W_Y?dhDcn_?K#QIY{H?u_3h-jGtc xx82=e{ra0YRTbCJK+~U(P6kDXzgBrG%D-h*lx9-=FHfMI44$rjF6*2UngCbmSeXC- literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/resize_handle.png b/kicker/data/kickoff/resize_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..c0811dc5061f3ea87cf20a677fdf2f401b58dacb GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+g!3HExhN-duDYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>FdgVosorKRF#dvcOOtF&C|s(MC1J234weE6gZq0iqCOR zRZp?Mykkir>;I^=wGRX*UYE#wzf<|rnKw^-dt*1SpP79tI44=|irKTDyD|k5PEX^s zI~&S0VU3T&;kB)ig)DzkUULU?Dx_s|2ir~9c#|U|Mf@Q1d4opf)QrCxKpPo6UHx3v IIVCg!06|DWh;P@^UJ2S8DjCQUjBbom1U`3iRVhro(DNrRWx)zXtl z+iaxBDW05a^ZGH&-dz%uI=d+MZqGBmFK{F;L|M6elNT!0iIM`dkUNa-;9;5 zmh?DNWuRmm_+hLZ87sZmf?TO%0AK~U0KOV48xi$5Q`bPr9*`L;`!U4$;A#M19T*ua zm&VF!XhE*{7$`XeCdSHcAT3@rF#xa$jE$8uV`U|TAXl0i0O$cHXx;V$%yS}yff50} z8!N|c)@?`wpmlo=TpKH!foCryw1JWVTDJ$0=Kmv>0f04NXsis4m9Odd<#U*9HJqflFg$WUQ>aE>6Kf$v#@QdoGJoG61lF{`Fndt=rTLfY$91`X9c%?B)~= zlx(4OdupuwS7*uwYVoXV0TtW>Z)SORS9Md02^7E=;KefWkX`~0z`I$V-PB!>QUX_i zxQK@|68HstnC02fXK~jCZh^P6Je&Fs=xPhi(Ub2%6Y=vE*|10@Dr`aQN(9NGcZQCOrwUWL+C9u2R;I?+7J(66Ufkd zoCKV?ln@CNz-M5mZSl}Nfhqbaa2r627fliv0{t$HPBP>83CV+hCf(mqSR1_vHy_W%EzxBTWaS$KlY(NR#d{kY-t zC`TqXj%C%=W;W%DUO_HxD=qf8@Xq*jx_7^;@$~cS+Sb34|8VNbH+fl0gRQkUqSXJ_ a-+emKX8noc7aTzI89ZJ6T-G@yGywpU+Brc0 literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/search-gradient.png b/kicker/data/kickoff/search-gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..3478ea18b94e8bb473f451036f8c0c1a9bb42982 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^j6iJ7!2~2trui4a+x|RZ&QKx8F0|rS(|(}Y44$rj JF6*2UngD-YMY8|^ literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/search-running.mng b/kicker/data/kickoff/search-running.mng new file mode 100644 index 0000000000000000000000000000000000000000..9f477c9c360ce51c4475d13278771b03cd40577a GIT binary patch literal 11888 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 I=akR{0IKgT=l}o! literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/search-tab-left.png b/kicker/data/kickoff/search-tab-left.png new file mode 100644 index 0000000000000000000000000000000000000000..507b417673575d74567cd410be6c037b99d11095 GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^JV30?!3HFK?qp^HDYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>FdgVosorK+cc`kZ8-x2qqL`sV~EG`w^JOm4jTx#{Z(7Nw-~1~pyQ$QQt-$%yjw4|@Zx4&^Uz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ-7fD1xRCwC#mAy`cP!NT`VHf<_U1LJDvoP@~thC?- zd>Ws}RtsK$P+9l@HnvnIG}0J;^jLTyu)=0*!z7d2%$IY|6mtwX1O$BdUrA!5mcWS{ z`T}a80U9$K1wBb`bzQ$CNpc6A0xKW@7J&VckW{ptW!WQe1)KxN?gu7`wg-TuB97yG z2Zhd`*9S~ev8`%mx4=8_0enhoIuDH31~_tG8q7=q2Y}yt*auj;EqVI_HoDRsz+}z9 z49vg`{9B+smEQ05H`@tBQFPWj$iq9koj{U`JkMW&Yv9s_W*1$f3Sk&txQtu5VDSOZ z%xuzhS(XnjiPn8+5(t7|T~*bSQ|jVt=URQ=-$;5+)AYtEEPe(6RG){Y3U{AS00000 LNkvXXu0mjfTV9^Y literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/search-tab-top-center.png b/kicker/data/kickoff/search-tab-top-center.png new file mode 100644 index 0000000000000000000000000000000000000000..51482ad236664b6439bb7884509525c5083a5d08 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf-!3HFEDm}Uhq}Y|gW!U_%O?XxI14-? ziy0WWg+Z8+Vb&Z8pdfpRr>`sfHEu3mW~1MKM85-ts^zq%S58(UkV jg8>k97#kZH{9$Ft+{qd)V>n?xP$`3_tDnm{r-UW|#Kk5a literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/search-tab-top-left.png b/kicker/data/kickoff/search-tab-top-left.png new file mode 100644 index 0000000000000000000000000000000000000000..97264782aeff08e2bf50fab5dfc82f546bbd93d1 GIT binary patch literal 2960 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 I>zopr0I`gXj{pDw literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/tab-bottom-left-topdown.png b/kicker/data/kickoff/tab-bottom-left-topdown.png new file mode 100644 index 0000000000000000000000000000000000000000..a96a7bf126e13d0a7dd957edf384597d84d59aba GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)Q!2~4PekAq-Db50q$YKTtZeb8+WSBKa0x0P0 z>Eal|F*A8j&FgE|{p0u5{(Y5^ewcyT=l=eh-`}2gFWjfcER^u`$HT|R{pYj%_&L#a r=Dj_&Z{NN<)xfr|_WwV5W(I~OD!NnuyB9nH8pq)2>gTe~DWM4f_E)H!3HEvS)PI@wj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwOU0ldesru0MH$b7io-U3d9M^qM8hRZrkT~}6{_nc~ zD!qJS3wO_3SRruKSEGX2|1qNsYhgiAcY~6f-TgQsCiToAd1}U;i*$vvT?NM^@Z- wEv{FJ-HcPk&>Hq)$ literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/tab-bottom-right.png b/kicker/data/kickoff/tab-bottom-right.png new file mode 100644 index 0000000000000000000000000000000000000000..86d226b51da01fc3d762ffdd7c28641b64edfafa GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRM!3HF?&tBaMq}Y|gW!U_%O``B6nI1y zGca%qgD@k*tT_@uLG}_)Usv{P?BYWDQtgcaYk@*{XE)7O>#8oRiVspZtuw^@KfHl8kyAsp9B&+O)GaA07$csw?# z@LPPx&Ys4Kq=Zd8zk_8L8$DPirny++rDt{Z{&`#f{;SR8d?S3jrSmgW??H2)%51?) QKyw&8UHx3vIVCg!0G35Ju>b%7 literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/tab-left_center.png b/kicker/data/kickoff/tab-left_center.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8c397943b586c4a395ea8bee9d8673e93a1f75 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y@!3HFyABb!LQk(@Ik;M!Q+`=Ht$S`Y;1W=GA z-O<;Pfnj4`&F{d;K)ynAYTTCDpdxChGwAF|3LaB14F3+1H-EX1_rAc3=HD=lj4uM z0o6)-x;TbZ+)7GINcfPLknkX(p_E)H!3HEvS)PI@&H|6fVg?3oVGw3ym^DWND7eYf z#W93qrtitUUd)aXtq;r9mCFoUg(j2;IsVznA{f*$RYR=lfoY{{wf3zWH#y$rq#570 zEPHg>F82QS^aFMQjsCZz6DFCQKQQ6J>2C=fOZIl`=zpamHqA?ZzB_aG;y*oS_{C!G=bUKDKP@llxOVF2 z)!u#K+6+NnC+1$gVi6lr*<{an^LB{Ts5 DUXx~u literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/tab-top-left.png b/kicker/data/kickoff/tab-top-left.png new file mode 100644 index 0000000000000000000000000000000000000000..910967a18089efd3943e9df15c1a03d09ae21bd7 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)Q!2~4PekAq-Db50q$YKTtZeb8+WSBKa0w~Cm z?&#~tz_78e=6B#^AYUQbBgmJ5p-Pp3p`n?9;pcxK{gQ#9)PRBERRRNp)eHs(@%%~g zN8NyGZ9H8ZLn>}1{rL9xcRkO64K-h9y}w_-pwp<6qdV{J&e@Ej1|PXUaC3gB|M5f6 pb;{)S?(X*Ie~z9$v8aKOL95W<$CAA#RDk9%c)I$ztaD0e0swkgK!pGR literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/tab-top-right-topdown.png b/kicker/data/kickoff/tab-top-right-topdown.png new file mode 100644 index 0000000000000000000000000000000000000000..dd672cad9a2b7e91be29dcfec57fb819780dc9f7 GIT binary patch literal 327 zcmV-N0l5B&P)l!M#euP#6Z__x(;z(w-D7h`XDER*T}I?dYhL?#}LB zgm?|2tJmPqB)tGH!9fsO(6)vclbn;!rO(6H$>f;iJIPOyEs{#|5WuF0JOQ}mc;gi--$N6Y!5Z$ywJ$zGBqO&rH})>@LxLEQrI5zVGE#Ic2QuIpTS z)9G|9z z-LfpNy!RU*8W5!bfU2Uue}FV~D1LKP<=>G8f2K`PLMd2LRSX70__{{$z7;~afa*4Z Z-G7qZU?}O7KobA}002ovPDHLkV1lKjklg?P literal 0 HcmV?d00001 diff --git a/kicker/data/kickoff/tab-top-right.png b/kicker/data/kickoff/tab-top-right.png new file mode 100644 index 0000000000000000000000000000000000000000..e96019d6daf206b001c27a6cfbff77e12e64bd32 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRV!2~2F3jA5L~c#`DBoi0*}aI z1_o|n5N2eUHAey{$X?><>&kwOU6f0Y$@J9WpFp8tPZ!4!j_a|ft%VvCco;4|xG+I} zf%$fZFN-d)hqe86)1;gV(u5yGCR}-aZH3OGaE69UQKu~5x38*V*lwig n?rWGDc(YF4NKn{N`4ab1dvW_e(;lS)jc4$5^>bP0l+XkKTwFgZ literal 0 HcmV?d00001 diff --git a/kicker/kicker/ui/browser_mnu.cpp b/kicker/kicker/ui/browser_mnu.cpp index 6802e6388..88ce30713 100644 --- a/kicker/kicker/ui/browser_mnu.cpp +++ b/kicker/kicker/ui/browser_mnu.cpp @@ -31,6 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include +#include #include #include #include @@ -148,12 +149,14 @@ void PanelBrowserMenu::initialize() // only the first part menu got them if(_startid == 0 && !_filesOnly) { insertTitle(path()); + KConfig *c = KGlobal::config(); + c->setGroup("menus"); insertItem(CICON("kfm"), i18n("Open in File Manager"), this, TQT_SLOT(slotOpenFileManager())); - if (kapp->authorize("shell_access")) - insertItem(CICON("terminal"), i18n("Open in Terminal"), this, TQT_SLOT(slotOpenTerminal())); + if (kapp->authorize("shell_access") && c->readBoolEntry("kickerOpenInTerminalIsVisible",false)) + insertItem(CICON("terminal"), i18n("Open in Terminal"), this, TQT_SLOT(slotOpenTerminal())); + insertSeparator(); } - bool first_entry = true; bool dirfile_separator = false; unsigned int item_count = 0; diff --git a/kicker/kicker/ui/service_mnu.cpp b/kicker/kicker/ui/service_mnu.cpp index fa18a7038..3042eddfe 100644 --- a/kicker/kicker/ui/service_mnu.cpp +++ b/kicker/kicker/ui/service_mnu.cpp @@ -114,6 +114,11 @@ void PanelServiceMenu::fillMenu(KServiceGroup::Ptr& _root, TQStringList suppressGenericNames = _root->suppressGenericNames(); KServiceGroup::List::ConstIterator it = _list.begin(); + KSortableValueList,TQCString> slist; + KSortableValueList,TQCString> glist; + TQMap specialTitle; + TQMap categoryIcon; + bool separatorNeeded = false; for (; it != _list.end(); ++it) { @@ -121,19 +126,108 @@ void PanelServiceMenu::fillMenu(KServiceGroup::Ptr& _root, if (e->isType(KST_KServiceGroup)) { + KServiceGroup::Ptr g(static_cast(e)); + if ( KickerSettings::reduceMenuDepth() && g->SuSEshortMenu() ){ + KServiceGroup::List l = g->entries(true, excludeNoDisplay_ ); + if ( l.count() == 1 ) { + // the special case, we want to short the menu. + // TOFIX? : this works only for one level + KServiceGroup::List::ConstIterator _it=l.begin(); + KSycocaEntry *_e = *_it; + if (_e->isType(KST_KService)) { + KService::Ptr s(static_cast(_e)); + TQString key; + if ( g->SuSEgeneralDescription() ) { + // we use the application name + key = s->name(); + if( !s->genericName().isEmpty()) { + if (KickerSettings::menuEntryFormat() == KickerSettings::NameAndDescription) + key = s->name() + " (" + s->genericName() + ")"; + else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionAndName) + key = s->genericName() + " (" + s->name() + ")"; + else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionOnly) + key = s->genericName(); + } + } + else { + // we use the normal menu description + key = s->name(); + if( !s->genericName().isEmpty()) { + if (KickerSettings::menuEntryFormat() == KickerSettings::NameAndDescription) + key = s->name() + " (" + g->caption() + ")"; + else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionAndName) + key = g->caption() + " (" + s->name() + ")"; + else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionOnly) + key = g->caption(); + } + } + specialTitle.insert( _e->name(), key ); + categoryIcon.insert( _e->name(), g->icon() ); + slist.insert( key.local8Bit(), _e ); + // and escape from here + continue; + } + } + } + glist.insert( g->caption().local8Bit(), e ); + }else if( e->isType(KST_KService)) { + KService::Ptr s(static_cast(e)); + TQString name = s->name(); + if( !s->genericName().isEmpty()) { + if (KickerSettings::menuEntryFormat() == KickerSettings::NameAndDescription) + name = s->name() + " (" + s->genericName() + ")"; + else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionAndName) + name = s->genericName() + " (" + s->name() + ")"; + else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionOnly) + name = s->genericName(); + } + slist.insert( name.local8Bit(), e ); + } else + slist.insert( e->name().local8Bit(), e ); + } + + _list = _root->SuSEsortEntries( slist, glist, excludeNoDisplay_, true ); + it = _list.begin(); + + for (; it != _list.end(); ++it) { + KSycocaEntry * e = *it; + + if (e->isType(KST_KServiceGroup)) { KServiceGroup::Ptr g(static_cast(e)); + if ( KickerSettings::reduceMenuDepth() && g->SuSEshortMenu() ){ + KServiceGroup::List l = g->entries(true, excludeNoDisplay_ ); + if ( l.count() == 1 ) { + /* // the special case, we want to short the menu. + // TOFIX? : this works only for one level + KServiceGroup::List::ConstIterator _it=l.begin(); + KSycocaEntry *_e = *_it; + if (_e->isType(KST_KService)) { + KService::Ptr s(static_cast(_e)); + if ( g->SuSEgeneralDescription() ) + // we use the application name + insertMenuItem(s, id++, -1, 0, TQString::null, TQString::null, g->icon() ); + else + // we use the normal menu description + insertMenuItem(s, id++, -1, 0, TQString::null, g->caption(), g->icon() ); + // and escape from here */ + continue; + // } + } + } + // standard sub menu + TQString groupCaption = g->caption(); - + // Avoid adding empty groups. KServiceGroup::Ptr subMenuRoot = KServiceGroup::group(g->relPath()); - + int nbChildCount = subMenuRoot->childCount(); if (nbChildCount == 0 && !g->showEmptyMenu()) - { + { continue; - } - + } + TQString inlineHeaderName = g->showInlineHeader() ? groupCaption : ""; // Item names may contain ampersands. To avoid them being converted // to accelerators, replace them with two ampersands. @@ -156,7 +250,8 @@ void PanelServiceMenu::fillMenu(KServiceGroup::Ptr& _root, } KService::Ptr s(static_cast(e1)); - insertMenuItem(s, id++, -1, &suppressGenericNames); +// insertMenuItem(s, id++, -1, &suppressGenericNames); + insertMenuItem(s, id++, -1, &suppressGenericNames, TQString::null, specialTitle[s->name()], categoryIcon[s->name()] ); continue; } } @@ -222,7 +317,8 @@ void PanelServiceMenu::fillMenu(KServiceGroup::Ptr& _root, KService::Ptr s(static_cast(e)); searchMenuItems.insert(id); - insertMenuItem(s, id++, -1, &suppressGenericNames); +// insertMenuItem(s, id++, -1, &suppressGenericNames); + insertMenuItem(s, id++, -1, &suppressGenericNames, TQString::null, specialTitle[s->name()], categoryIcon[s->name()] ); } else if (e->isType(KST_KServiceSeparator)) { @@ -304,7 +400,8 @@ void PanelServiceMenu::configChanged() void PanelServiceMenu::insertMenuItem(KService::Ptr & s, int nId, int nIndex/*= -1*/, const TQStringList *suppressGenericNames /* = 0 */, - const TQString & aliasname) + const TQString & aliasname, const TQString & label /*=TQString::NULL*/, + const TQString & categoryIcon /*=TQString::null*/) { TQString serviceName = (aliasname.isEmpty() ? s->name() : aliasname).simplifyWhiteSpace(); TQString comment = s->genericName().simplifyWhiteSpace(); @@ -355,7 +452,15 @@ void PanelServiceMenu::insertMenuItem(KService::Ptr & s, int nId, // to accelerators, replace them with two ampersands. serviceName.replace("&", "&&"); - int newId = insertItem(KickerLib::menuIconSet(s->icon()), serviceName, nId, nIndex); + TQString icon = s->icon(); + if (icon=="unknown") + icon = categoryIcon; + + int newId; + if ( label.isEmpty() ) + newId = insertItem(KickerLib::menuIconSet(s->icon()), serviceName, nId, nIndex); + else + newId = insertItem(KickerLib::menuIconSet(s->icon()), label, nId, nIndex); entryMap_.insert(newId, static_cast(s)); } diff --git a/kicker/kicker/ui/service_mnu.h b/kicker/kicker/ui/service_mnu.h index 193e4faf8..44e35a6c2 100644 --- a/kicker/kicker/ui/service_mnu.h +++ b/kicker/kicker/ui/service_mnu.h @@ -89,7 +89,8 @@ protected slots: protected: void insertMenuItem(KService::Ptr & s, int nId, int nIndex = -1, const TQStringList *suppressGenericNames=0, - const TQString &aliasname = TQString::null); + const TQString &aliasname = TQString::null, + const TQString &label = TQString::null, const TQString &categoryIcon = TQString::null); virtual PanelServiceMenu * newSubMenu(const TQString & label, const TQString & relPath, TQWidget * parent, const char * name, diff --git a/kicker/libkicker/kickerSettings.kcfg b/kicker/libkicker/kickerSettings.kcfg index ff86c8431..6f7f2427e 100644 --- a/kicker/libkicker/kickerSettings.kcfg +++ b/kicker/libkicker/kickerSettings.kcfg @@ -126,6 +126,11 @@ true + + + false + + 0 diff --git a/kioslave/media/mediaimpl.cpp b/kioslave/media/mediaimpl.cpp index fb9e01480..b55b37e5d 100644 --- a/kioslave/media/mediaimpl.cpp +++ b/kioslave/media/mediaimpl.cpp @@ -281,6 +281,13 @@ bool MediaImpl::ensureMediumMounted(Medium &medium) return m_lastErrorCode==0; } + if (medium.id().isEmpty()) + { + m_lastErrorCode = KIO::ERR_COULD_NOT_MOUNT; + m_lastErrorMessage = i18n("No such medium."); + return false; + } + return true; } diff --git a/kioslave/media/mediamanager/halbackend.cpp b/kioslave/media/mediamanager/halbackend.cpp index b6763ee84..7b56d46ad 100644 --- a/kioslave/media/mediamanager/halbackend.cpp +++ b/kioslave/media/mediamanager/halbackend.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -623,6 +624,13 @@ void HALBackend::setVolumeProperties(Medium* medium) case LIBHAL_DRIVE_TYPE_PORTABLE_AUDIO_PLAYER: { medium->setIconName("ipod" + MOUNT_ICON_SUFFIX); + + if (libhal_device_get_property_QString(m_halContext, driveUdi.latin1(), "info.product") == "iPod" && + KProtocolInfo::isKnownProtocol( TQString("ipod") ) ) + { + medium->unmountableState( "ipod:/" ); + medium->mountableState( libhal_volume_is_mounted(halVolume) ); + } break; } case LIBHAL_DRIVE_TYPE_CAMERA: diff --git a/kioslave/smb/kio_smb_auth.cpp b/kioslave/smb/kio_smb_auth.cpp index d216e1e5b..d4a48239f 100644 --- a/kioslave/smb/kio_smb_auth.cpp +++ b/kioslave/smb/kio_smb_auth.cpp @@ -144,6 +144,7 @@ bool SMBSlave::checkPassword(SMBUrl &url) if ( openPassDlg(info) ) { kdDebug(KIO_SMB) << "openPassDlg returned " << info.username << endl; url.setUser(info.username); + url.setPass(info.password); return true; } kdDebug(KIO_SMB) << "no value from openPassDlg\n"; diff --git a/kioslave/system/entries/documents.desktop b/kioslave/system/entries/documents.desktop index 16016e0c5..a2c0fe528 100644 --- a/kioslave/system/entries/documents.desktop +++ b/kioslave/system/entries/documents.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Type=Link Path[$e]=$( kio_system_documenthelper ) -Icon=folder_important +Icon=folder_man Name=Documents Folder Name[af]=Dokument Gids Name[ar]=مستنداتي diff --git a/klipper/klipperrc.desktop b/klipper/klipperrc.desktop index ba04cf594..5ad72c141 100644 --- a/klipper/klipperrc.desktop +++ b/klipper/klipperrc.desktop @@ -232,7 +232,7 @@ Number of commands=5 Regexp=^https?://. [Action_1/Command_0] -Commandline=kfmclient exec %s +Commandline=kfmclient openURL %s Description=Open with &Konqueror Description[af]=Maak oop met Konqueror Description[ar]=إفتح بــ &Konqueror @@ -1644,7 +1644,7 @@ Number of commands=5 Regexp=^ftp://. [Action_6/Command_0] -Commandline=kfmclient exec %s +Commandline=kfmclient openURL %s Description=Open with &Konqueror Description[af]=Maak oop met Konqueror Description[ar]=إفتح بــ &Konqueror diff --git a/konqueror/Makefile.am b/konqueror/Makefile.am index 0fd86b2f5..116a7a915 100644 --- a/konqueror/Makefile.am +++ b/konqueror/Makefile.am @@ -48,8 +48,8 @@ noinst_HEADERS = KonqMainWindowIface.h KonqViewIface.h delayedinitializer.h \ konq_misc.h konq_openurlrequest.h konq_profiledlg.h konq_run.h \ konq_view.h konq_viewmgr.h konq_extensionmanager.h version.h -konqueror_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) -konqueror_la_LIBADD = ../libkonq/libkonq.la libkonqueror_intern.la $(LIBMALLOC) $(LIB_KUTILS) +konqueror_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) -lconnectionmanager +konqueror_la_LIBADD = ../libkonq/libkonq.la libkonqueror_intern.la $(LIBMALLOC) $(LIB_KUTILS) -lconnectionmanager # Hmm, this experiment of a static konq failed, don't trust it... # (but feel free to fix it :) diff --git a/konqueror/konq_combo.cc b/konqueror/konq_combo.cc index 86747ebde..0a73e6c83 100644 --- a/konqueror/konq_combo.cc +++ b/konqueror/konq_combo.cc @@ -128,6 +128,9 @@ KonqCombo::KonqCombo( TQWidget *parent, const char *name ) connect( this, TQT_SIGNAL(activated( const TQString& )), TQT_SLOT(slotActivated( const TQString& )) ); + setHistoryEditorEnabled( true ); + connect( this, TQT_SIGNAL(removed( const TQString&) ), TQT_SLOT(slotRemoved( const TQString& )) ); + if ( !kapp->dcopClient()->isAttached() ) kapp->dcopClient()->attach(); } @@ -507,6 +510,15 @@ void KonqCombo::slotCleared() kapp->dcopClient()->send( "konqueror*", "KonquerorIface", "comboCleared(TQCString)", data); } +void KonqCombo::slotRemoved( const TQString& item ) +{ + TQByteArray data; + TQDataStream s( data, IO_WriteOnly ); + s << item << kapp->dcopClient()->defaultObject(); + kapp->dcopClient()->send( "konqueror*", "KonquerorIface", + "removeFromCombo(TQString,TQCString)", data); +} + void KonqCombo::removeURL( const TQString& url ) { setUpdatesEnabled( false ); diff --git a/konqueror/konq_combo.h b/konqueror/konq_combo.h index dfb2778dc..3650eb9a4 100644 --- a/konqueror/konq_combo.h +++ b/konqueror/konq_combo.h @@ -87,6 +87,7 @@ signals: private slots: void slotCleared(); + void slotRemoved( const TQString& item ); void slotSetIcon( int index ); void slotActivated( const TQString& text ); diff --git a/konqueror/konq_frame.cc b/konqueror/konq_frame.cc index 77310ebbc..149a2f92d 100644 --- a/konqueror/konq_frame.cc +++ b/konqueror/konq_frame.cc @@ -34,6 +34,7 @@ #include #include #include +#include #include "konq_events.h" #include "konq_frame.h" @@ -97,6 +98,10 @@ KonqFrameStatusBar::KonqFrameStatusBar( KonqFrame *_parent, const char *_name ) m_progressBar->hide(); addWidget( m_progressBar, 0, true /*permanent->right align*/ ); + StatusBarNetworkStatusIndicator * indicator = new StatusBarNetworkStatusIndicator( this, "networkstatusindicator" ); + addWidget( indicator, 0, false ); + indicator->init(); + fontChange(TQFont()); installEventFilter( this ); } diff --git a/konsole/other/x11r5.keytab b/konsole/other/x11r5.keytab index 75ba06ec4..c731807ca 100644 --- a/konsole/other/x11r5.keytab +++ b/konsole/other/x11r5.keytab @@ -32,10 +32,10 @@ key Left -Shift : "\EOD" key Enter : "\r" -key Home : "\E[1~" +key Home : "\E[H" key Insert-Shift : "\E[2~" key Delete : "\E[3~" -key End : "\E[4~" +key End : "\E[F" key Prior -Shift : "\E[5~" key Next -Shift : "\E[6~" diff --git a/kscreensaver/Makefile.am b/kscreensaver/Makefile.am index 75cf37640..2823d4e17 100644 --- a/kscreensaver/Makefile.am +++ b/kscreensaver/Makefile.am @@ -3,13 +3,13 @@ AM_CPPFLAGS = -UQT_NO_ASCII_CAST -INCLUDES = $(all_includes) +INCLUDES = $(GLINC) $(all_includes) AM_LDFLAGS = $(all_libraries) $(KDE_RPATH) bin_PROGRAMS = krandom.kss kblankscrn.kss krandom_kss_SOURCES = random.cpp -krandom_kss_LDADD = $(LIB_KDEUI) -lm +krandom_kss_LDADD = $(LIB_KDEUI) $(GLLIB) -lm kblankscrn_kss_SOURCES = blankscrn.cpp kblankscrn_kss_LDADD = $(LIB_KDEUI) -lkscreensaver -lm diff --git a/kscreensaver/random.cpp b/kscreensaver/random.cpp index c1cd8dcad..cd984a145 100644 --- a/kscreensaver/random.cpp +++ b/kscreensaver/random.cpp @@ -1,4 +1,4 @@ -//----------------------------------------------------------------------------- + //----------------------------------------------------------------------------- // // Screen savers for KDE // @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -36,7 +37,7 @@ #define MAX_ARGS 20 -void usage(char *name) +static void usage(char *name) { puts(i18n("Usage: %1 [-setup] [args]\n" "Starts a random screen saver.\n" @@ -60,6 +61,43 @@ static const KCmdLineOptions options[] = //---------------------------------------------------------------------------- +#ifdef HAVE_GLXCHOOSEVISUAL +#include +#endif + +//------------------------------------- +bool hasDirectRendering () { + Display *dpy = TQApplication::desktop()->x11Display(); + +#ifdef HAVE_GLXCHOOSEVISUAL + int attribSingle[] = { + GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + None + }; + XVisualInfo* visinfo = glXChooseVisual ( + dpy, TQApplication::desktop()->primaryScreen(), attribSingle + ); + if (visinfo) { + GLXContext ctx = glXCreateContext ( dpy, visinfo, NULL, True ); + if (glXIsDirect(dpy, ctx)) { + glXDestroyContext (dpy,ctx); + return true; + } + glXDestroyContext (dpy,ctx); + return false; + } else { + return false; + } +#else +#error no GL? + return false; +#endif + +} + int main(int argc, char *argv[]) { KLocale::setMainCatalogue("kscreensaver"); @@ -103,55 +141,63 @@ int main(int argc, char *argv[]) KConfig type("krandom.kssrc"); type.setGroup("Settings"); - bool opengl = type.readBoolEntry("OpenGL"); + bool opengl = type.readBoolEntry("OpenGL", hasDirectRendering()); + kdDebug() << "hasOPEN " << opengl << endl; bool manipulatescreen = type.readBoolEntry("ManipulateScreen"); bool fortune = !KStandardDirs::findExe("fortune").isEmpty(); + TQStringList defaults = type.readListEntry( "Defaults" ); + TQMap def_numbers; + for ( TQStringList::ConstIterator it = defaults.begin(); it != defaults.end(); ++it ) { + int index = ( *it ).find( ':' ); + if ( index == -1 ) + def_numbers[*it] = 1; + else + def_numbers[( *it ).left( index )] = ( *it ).mid( index + 1 ).toInt(); + } for (uint i = 0; i < tempSaverFileList.count(); i++) { - kdDebug() << "Looking at " << tempSaverFileList[i] << endl; + int howoften = 1; + if ( defaults.count() != 0 ) { + TQFileInfo fi( tempSaverFileList[i] ); + if ( def_numbers.contains( fi.fileName() ) ) + howoften = def_numbers[fi.fileName()]; + else + howoften = 0; + } + KDesktopFile saver(tempSaverFileList[i], true); - if(!saver.tryExec()) - continue; - kdDebug() << "read X-KDE-Type" << endl; + if (!saver.tryExec()) + continue; TQString saverType = saver.readEntry("X-KDE-Type"); - - if (saverType.isEmpty()) // no X-KDE-Type defined so must be OK - { - saverFileList.append(tempSaverFileList[i]); - } - else - { + if (!saverType.isEmpty()) // no X-KDE-Type defined so must be OK + { TQStringList saverTypes = TQStringList::split(";", saverType); for (TQStringList::ConstIterator it = saverTypes.begin(); it != saverTypes.end(); ++it ) { - kdDebug() << "saverTypes is "<< *it << endl; if (*it == "ManipulateScreen") { - if (manipulatescreen) - { - saverFileList.append(tempSaverFileList[i]); - } + if (!manipulatescreen) + howoften = 0; } else if (*it == "OpenGL") { - if (opengl) - { - saverFileList.append(tempSaverFileList[i]); - } + if (!opengl) + howoften = 0; } if (*it == "Fortune") { - if (fortune) - { - saverFileList.append(tempSaverFileList[i]); - } + if (!fortune) + howoften = 0; } } } + for ( int j = 0; j < howoften; ++j ) + saverFileList.append(tempSaverFileList[i]); } + kdDebug() << "final " << saverFileList << endl; KRandomSequence rnd; int indx = rnd.getLong(saverFileList.count()); @@ -229,7 +275,7 @@ KRandomSetup::KRandomSetup( TQWidget *parent, const char *name ) KConfig config("krandom.kssrc"); config.setGroup("Settings"); - openGL->setChecked(config.readBoolEntry("OpenGL", true)); + openGL->setChecked(config.readBoolEntry("OpenGL", hasDirectRendering())); manipulateScreen->setChecked(config.readBoolEntry("ManipulateScreen", true)); } diff --git a/ksmserver/KSMServerInterface.h b/ksmserver/KSMServerInterface.h index 52fdf0942..a628b92ba 100644 --- a/ksmserver/KSMServerInterface.h +++ b/ksmserver/KSMServerInterface.h @@ -22,6 +22,8 @@ k_dcop: virtual void suspendStartup( TQCString ) = 0; virtual void resumeStartup( TQCString ) = 0; + + virtual void logoutTimed( int, int, TQString ) = 0; }; #endif diff --git a/ksmserver/Makefile.am b/ksmserver/Makefile.am index 62f9d8976..19b328bc5 100644 --- a/ksmserver/Makefile.am +++ b/ksmserver/Makefile.am @@ -28,7 +28,7 @@ ksmserver_la_METASOURCES = AUTO # Order is important for --enable-final! ksmserver_la_SOURCES = main.cpp server.cpp shutdowndlg.cpp \ legacy.cpp startup.cpp shutdown.cpp client.cpp \ - KSMServerInterface.skel server.skel + KSMServerInterface.skel server.skel timed.ui ksmserver_la_LDFLAGS = $(all_libraries) -avoid-version -module ksmserver_la_LIBADD = ../kdmlib/libdmctl.la $(LIB_KDEUI) $(HAL_LIBS) $(DBUS_LIBS) @@ -42,7 +42,7 @@ updatedir = $(kde_datadir)/kconf_update EXTRA_PROGRAMS = testsh -testsh_SOURCES = test.cpp +testsh_SOURCES = test.cpp timed.ui testsh_LDFLAGS = $(all_libraries) $(KDE_RPATH) testsh_LDADD = $(LIB_KDEUI) shutdowndlg.lo ../kdmlib/libdmctl.la $(HAL_LIBS) $(DBUS_LIBS) diff --git a/ksmserver/server.h b/ksmserver/server.h index 3d5904e53..0fc900042 100644 --- a/ksmserver/server.h +++ b/ksmserver/server.h @@ -85,6 +85,7 @@ public: // public API void restoreSession( TQString sessionName ); void startDefaultSession(); + void shutdown( KApplication::ShutdownConfirm confirm, KApplication::ShutdownType sdtype, KApplication::ShutdownMode sdmode ); @@ -92,6 +93,11 @@ public: virtual void suspendStartup( TQCString app ); virtual void resumeStartup( TQCString app ); + bool checkStatus( bool &logoutConfirmed, bool &maysd, + KApplication::ShutdownConfirm confirm, + KApplication::ShutdownType sdtype, + KApplication::ShutdownMode sdmode ); + public slots: void cleanUp(); @@ -142,6 +148,11 @@ private: bool defaultSession() const; // empty session void setupXIOErrorHandler(); + void shutdownInternal( KApplication::ShutdownConfirm confirm, + KApplication::ShutdownType sdtype, + KApplication::ShutdownMode sdmode, + TQString bootOption = TQString::null ); + void performLegacySessionSave(); void storeLegacySession( KConfig* config ); void restoreLegacySession( KConfig* config ); @@ -157,6 +168,7 @@ private: // public dcop interface void logout( int, int, int ); + virtual void logoutTimed( int, int, TQString ); TQStringList sessionList(); TQString currentSession(); void saveCurrentSession(); diff --git a/ksmserver/shutdown.cpp b/ksmserver/shutdown.cpp index 16fab8b4d..a850d40be 100644 --- a/ksmserver/shutdown.cpp +++ b/ksmserver/shutdown.cpp @@ -93,14 +93,16 @@ void KSMServer::logout( int confirm, int sdtype, int sdmode ) (KApplication::ShutdownMode)sdmode ); } -void KSMServer::shutdown( KApplication::ShutdownConfirm confirm, - KApplication::ShutdownType sdtype, KApplication::ShutdownMode sdmode ) +bool KSMServer::checkStatus( bool &logoutConfirmed, bool &maysd, + KApplication::ShutdownConfirm confirm, + KApplication::ShutdownType sdtype, + KApplication::ShutdownMode sdmode ) { pendingShutdown.stop(); if( dialogActive ) - return; + return false; if( state >= Shutdown ) // already performing shutdown - return; + return false; if( state != Idle ) // performing startup { // perform shutdown as soon as startup is finished, in order to avoid saving partial session @@ -111,25 +113,44 @@ void KSMServer::shutdown( KApplication::ShutdownConfirm confirm, pendingShutdown_sdtype = sdtype; pendingShutdown_sdmode = sdmode; } - return; + return false; } KConfig *config = KGlobal::config(); config->reparseConfiguration(); // config may have changed in the KControl module config->setGroup("General" ); - bool logoutConfirmed = + logoutConfirmed = (confirm == KApplication::ShutdownConfirmYes) ? false : - (confirm == KApplication::ShutdownConfirmNo) ? true : - !config->readBoolEntry( "confirmLogout", true ); - bool maysd = false; + (confirm == KApplication::ShutdownConfirmNo) ? true : + !config->readBoolEntry( "confirmLogout", true ); + maysd = false; if (config->readBoolEntry( "offerShutdown", true ) && DM().canShutdown()) maysd = true; if (!maysd) { if (sdtype != KApplication::ShutdownTypeNone && sdtype != KApplication::ShutdownTypeDefault && logoutConfirmed) - return; /* unsupported fast shutdown */ + return false; /* unsupported fast shutdown */ + } + + return true; +} + +void KSMServer::shutdownInternal( KApplication::ShutdownConfirm confirm, + KApplication::ShutdownType sdtype, + KApplication::ShutdownMode sdmode, + TQString bopt ) +{ + bool maysd = false; + bool logoutConfirmed = false; + if ( !checkStatus( logoutConfirmed, maysd, confirm, sdtype, sdmode ) ) + return; + + KConfig *config = KGlobal::config(); + + config->setGroup("General" ); + if (!maysd) { sdtype = KApplication::ShutdownTypeNone; } else if (sdtype == KApplication::ShutdownTypeDefault) sdtype = (KApplication::ShutdownType) @@ -138,7 +159,6 @@ void KSMServer::shutdown( KApplication::ShutdownConfirm confirm, sdmode = KApplication::ShutdownModeInteractive; dialogActive = true; - TQString bopt; if ( !logoutConfirmed ) { KSMShutdownFeedback::start(); // make the screen gray logoutConfirmed = @@ -204,6 +224,42 @@ void KSMServer::shutdown( KApplication::ShutdownConfirm confirm, dialogActive = false; } +void KSMServer::shutdown( KApplication::ShutdownConfirm confirm, + KApplication::ShutdownType sdtype, KApplication::ShutdownMode sdmode ) +{ + shutdownInternal( confirm, sdtype, sdmode ); +} + +#include + +void KSMServer::logoutTimed( int sdtype, int sdmode, TQString bootOption ) +{ + int confirmDelay; + + KConfig* config = KGlobal::config(); + config->setGroup( "General" ); + + if ( sdtype == KApplication::ShutdownTypeHalt ) + confirmDelay = config->readNumEntry( "confirmShutdownDelay", 31 ); + else if ( sdtype == KApplication::ShutdownTypeReboot ) + confirmDelay = config->readNumEntry( "confirmRebootDelay", 31 ); + else + confirmDelay = config->readNumEntry( "confirmLogoutDelay", 31 ); + + bool result = true; + if (confirmDelay) { + KSMShutdownFeedback::start(); // make the screen gray + result = KSMDelayedMessageBox::showTicker( (KApplication::ShutdownType)sdtype, bootOption, confirmDelay ); + KSMShutdownFeedback::stop(); // make the screen become normal again + } + + if ( result ) + shutdownInternal( KApplication::ShutdownConfirmNo, + (KApplication::ShutdownType)sdtype, + (KApplication::ShutdownMode)sdmode, + bootOption ); +} + void KSMServer::pendingShutdownTimeout() { shutdown( pendingShutdown_confirm, pendingShutdown_sdtype, pendingShutdown_sdmode ); diff --git a/ksmserver/shutdowndlg.cpp b/ksmserver/shutdowndlg.cpp index 7b0493559..f6295a158 100644 --- a/ksmserver/shutdowndlg.cpp +++ b/ksmserver/shutdowndlg.cpp @@ -29,6 +29,7 @@ Copyright (C) 2000 Matthias Ettrich #include #include +#include #include #include #include @@ -340,6 +341,7 @@ KSMShutdownDlg::KSMShutdownDlg( TQWidget* parent, buttonlay->addStretch( 1 ); // End session KPushButton* btnLogout = new KPushButton( KGuiItem( i18n("&End Current Session"), "undo"), frame ); + TQToolTip::add( btnLogout, i18n( "

    End Current Session

    Log out of the current session to login with a different user

    " ) ); btnFont = btnLogout->font(); buttonlay->addWidget( btnLogout ); connect(btnLogout, TQT_SIGNAL(clicked()), TQT_SLOT(slotLogout())); @@ -510,14 +512,16 @@ KSMShutdownDlg::KSMShutdownDlg( TQWidget* parent, { // Shutdown KPushButton* btnHalt = new KPushButton( KGuiItem( i18n("&Turn Off Computer"), "exit"), frame ); + TQToolTip::add( btnHalt, i18n( "

    Turn Off Computer

    Log out of the current session and turn off the computer

    " ) ); btnHalt->setFont( btnFont ); buttonlay->addWidget( btnHalt ); connect(btnHalt, TQT_SIGNAL(clicked()), TQT_SLOT(slotHalt())); - if ( sdtype == KApplication::ShutdownTypeHalt ) + if ( sdtype == KApplication::ShutdownTypeHalt || getenv("KDM_AUTOLOGIN") ) btnHalt->setFocus(); // Reboot KSMDelayedPushButton* btnReboot = new KSMDelayedPushButton( KGuiItem( i18n("&Restart Computer"), "reload"), frame ); + TQToolTip::add( btnReboot, i18n( "

    Restart Computer

    Log out of the current session and restart the computer

    Hold the mouse button or the space bar for a short while to get a list of options what to boot

    " ) ); btnReboot->setFont( btnFont ); buttonlay->addWidget( btnReboot ); @@ -761,6 +765,70 @@ void KSMDelayedPushButton::slotTimeout() setDown(false); } +KSMDelayedMessageBox::KSMDelayedMessageBox( KApplication::ShutdownType sdtype, const TQString &bootOption, int confirmDelay ) + : TimedLogoutDlg( 0, 0, true, WType_Popup ), m_remaining(confirmDelay) +{ + if ( sdtype == KApplication::ShutdownTypeHalt ) + { + m_title->setText( i18n( "Would you like to turn off your computer?" ) ); + m_template = i18n( "This computer will turn off automatically\n" + "after %1 seconds." ); + m_logo->setPixmap( BarIcon( "exit", 48 ) ); + } else if ( sdtype == KApplication::ShutdownTypeReboot ) + { + if (bootOption.isEmpty()) + m_title->setText( i18n( "Would you like to reboot your computer?" ) ); + else + m_title->setText( i18n( "Would you like to reboot to \"%1\"?" ).arg(bootOption) ); + m_template = i18n( "This computer will reboot automatically\n" + "after %1 seconds." ); + m_logo->setPixmap( BarIcon( "reload", 48 ) ); + } else { + m_title->setText( i18n( "Would you like to end your current session?" ) ); + m_template = i18n( "This session will end\n" + "after %1 seconds automatically." ); + m_logo->setPixmap( BarIcon( "previous", 48 ) ); + } + + updateText(); + adjustSize(); + if ( double( height() ) / width() < 0.25 ) + { + setFixedHeight( qRound( width() * 0.3 ) ); + adjustSize(); + } + TQTimer *timer = new TQTimer( this ); + timer->start( 1000 ); + connect( timer, TQT_SIGNAL( timeout() ), TQT_SLOT( updateText() ) ); + KDialog::centerOnScreen(this); +} + +void KSMDelayedMessageBox::updateText() +{ + m_remaining--; + if ( m_remaining == 0 ) + { + accept(); + return; + } + m_text->setText( m_template.arg( m_remaining ) ); +} + +bool KSMDelayedMessageBox::showTicker( KApplication::ShutdownType sdtype, const TQString &bootOption, int confirmDelay ) +{ + kapp->enableStyles(); + KSMDelayedMessageBox msg( sdtype, bootOption, confirmDelay ); + TQSize sh = msg.sizeHint(); + TQRect rect = KGlobalSettings::desktopGeometry(TQCursor::pos()); + + msg.move(rect.x() + (rect.width() - sh.width())/2, + rect.y() + (rect.height() - sh.height())/2); + bool result = msg.exec(); + + kapp->disableStyles(); + return result; +} + KSMPushButton::KSMPushButton( const KGuiItem &item, TQWidget *parent, const char *name) diff --git a/ksmserver/shutdowndlg.h b/ksmserver/shutdowndlg.h index a1d720669..79ee8ca37 100644 --- a/ksmserver/shutdowndlg.h +++ b/ksmserver/shutdowndlg.h @@ -26,6 +26,7 @@ class TQString; class KAction; +#include "timed.h" #include #include @@ -165,4 +166,22 @@ class FlatButton : public QToolButton +class TQLabel; + +class KSMDelayedMessageBox : public TimedLogoutDlg +{ + Q_OBJECT + +public: + KSMDelayedMessageBox( KApplication::ShutdownType sdtype, const TQString &bootOption, int confirmDelay ); + static bool showTicker( KApplication::ShutdownType sdtype, const TQString &bootOption, int confirmDelay ); + +protected slots: + void updateText(); + +private: + TQString m_template; + int m_remaining; +}; + #endif diff --git a/ksmserver/test.cpp b/ksmserver/test.cpp index 846c449db..8f248725f 100644 --- a/ksmserver/test.cpp +++ b/ksmserver/test.cpp @@ -14,11 +14,16 @@ main(int argc, char *argv[]) a.iconLoader()->addAppDir("ksmserver"); KSMShutdownFeedback::start(); + // ShutdownTypeNone == Logout == 0 + // ShutdownTypeReboot == 1 + // ShutdownTypeHalt == 2 KApplication::ShutdownType sdtype = KApplication::ShutdownTypeNone; TQString bopt; + KSMDelayedMessageBox::showTicker( sdtype ); + /* (void)KSMShutdownDlg::confirmShutdown( true, sdtype, - bopt ); + bopt );*/ /* (void)KSMShutdownDlg::confirmShutdown( false, sdtype, bopt ); */ diff --git a/ksmserver/timed.ui b/ksmserver/timed.ui new file mode 100644 index 000000000..23d7aa2a0 --- /dev/null +++ b/ksmserver/timed.ui @@ -0,0 +1,352 @@ + +TimedLogoutDlg + + + TimedLogoutDlg + + + + 0 + 0 + 381 + 131 + + + + + 5 + 5 + 0 + 0 + + + + Confirmation + + + + unnamed + + + 0 + + + 0 + + + + frame3 + + + + 5 + 5 + 0 + 0 + + + + StyledPanel + + + Raised + + + 2 + + + 0 + + + 0 + + + + unnamed + + + + layout10 + + + + unnamed + + + 0 + + + 0 + + + + layout8 + + + + unnamed + + + + layout6 + + + + unnamed + + + 0 + + + 0 + + + + spacer3_2 + + + Vertical + + + MinimumExpanding + + + + 20 + 2 + + + + + + m_logo + + + + 1 + 1 + 0 + 0 + + + + + 48 + 48 + + + + true + + + + + spacer3 + + + Vertical + + + MinimumExpanding + + + + 20 + 2 + + + + + + + + layout7 + + + + unnamed + + + 7 + + + + m_title + + + + 7 + 0 + 0 + 0 + + + + + 1 + + + + Would you like to shutdown your computer? + + + PlainText + + + AlignVCenter|AlignLeft + + + + + m_text + + + + 7 + 5 + 0 + 0 + + + + If you do not act, your computer will shutdown +after X automatically. + + + RichText + + + WordBreak|AlignVCenter + + + + + spacer4 + + + Vertical + + + Preferred + + + + 30 + 0 + + + + + + + + + + layout9 + + + + unnamed + + + + spacer2 + + + Horizontal + + + Expanding + + + + 90 + 20 + + + + + + pushButton1 + + + Confirm + + + false + + + + + spacer2_2 + + + Horizontal + + + Expanding + + + + 90 + 20 + + + + + + pushButton2 + + + + 1 + 5 + 0 + 0 + + + + Cancel + + + + + spacer2_2_2 + + + Horizontal + + + Expanding + + + + 90 + 20 + + + + + + + + + + + + + + pushButton1 + clicked() + TimedLogoutDlg + accept() + + + pushButton2 + clicked() + TimedLogoutDlg + reject() + + + + diff --git a/kwin/workspace.cpp b/kwin/workspace.cpp index fe008c399..bc8914f5b 100644 --- a/kwin/workspace.cpp +++ b/kwin/workspace.cpp @@ -59,6 +59,17 @@ KSelectionOwner* kompmgr_selection; bool allowKompmgrRestart = TRUE; +bool supportsCompMgr() +{ + int i; + + bool damageExt = XQueryExtension(qt_xdisplay(), "DAMAGE", &i, &i, &i); + bool compositeExt = XQueryExtension(qt_xdisplay(), "Composite", &i, &i, &i); + bool xfixesExt = XQueryExtension(qt_xdisplay(), "XFIXES", &i, &i, &i); + + return damageExt && compositeExt && xfixesExt; +} + // Rikkus: This class is too complex. It needs splitting further. // It's a nightmare to understand, especially with so few comments :( @@ -200,6 +211,9 @@ Workspace::Workspace( bool restore ) connect( kapp->desktop(), TQT_SIGNAL( resized( int )), TQT_SLOT( desktopResized())); #endif + if (!supportsCompMgr()) + options->useTranslucency = false; + // start kompmgr - i wanted to put this into main.cpp, but that would prevent dcop support, as long as Application was no dcop_object if (options->useTranslucency) { diff --git a/kxkb/kcmlayout.cpp b/kxkb/kcmlayout.cpp index 502bf7972..7af7ae691 100644 --- a/kxkb/kcmlayout.cpp +++ b/kxkb/kcmlayout.cpp @@ -352,6 +352,9 @@ void LayoutConfig::add() // Create a copy of the sel widget, as one might add the same layout more // than one time, with different variants. TQListViewItem* toadd = copyLVI(sel, widget->listLayoutsDst); + + // Turn on "Include Latin layout" for new language by default (bnc:204402) + toadd->setText(LAYOUT_COLUMN_INCLUDE, "us"); widget->listLayoutsDst->insertItem(toadd); if( widget->listLayoutsDst->childCount() > 1 ) diff --git a/nsplugins/nspluginloader.cpp b/nsplugins/nspluginloader.cpp index e9c502169..3824334c0 100644 --- a/nsplugins/nspluginloader.cpp +++ b/nsplugins/nspluginloader.cpp @@ -326,7 +326,7 @@ TQString NSPluginLoader::lookup(const TQString &mimeType) } -bool NSPluginLoader::loadViewer() +bool NSPluginLoader::loadViewer(const TQString &mimeType) { kdDebug() << "NSPluginLoader::loadViewer" << endl; @@ -350,7 +350,7 @@ bool NSPluginLoader::loadViewer() } // find the external artsdsp process - if( _useArtsdsp ) { + if( _useArtsdsp && mimeType != "application/pdf" ) { kdDebug() << "trying to use artsdsp" << endl; TQString artsdsp = KGlobal::dirs()->findExe("artsdsp"); if (!artsdsp) @@ -464,7 +464,7 @@ NSPluginInstance *NSPluginLoader::newInstance(TQWidget *parent, TQString url, if ( !_viewer ) { // load plugin viewer process - loadViewer(); + loadViewer(mimeType); if ( !_viewer ) { diff --git a/nsplugins/nspluginloader.h b/nsplugins/nspluginloader.h index 6c2fe83c0..1748bb504 100644 --- a/nsplugins/nspluginloader.h +++ b/nsplugins/nspluginloader.h @@ -101,7 +101,7 @@ protected: TQString lookup(const TQString &mimeType); TQString lookupMimeType(const TQString &url); - bool loadViewer(); + bool loadViewer(const TQString &mimeType); void unloadViewer(); protected slots: diff --git a/nsplugins/pluginscan.cpp b/nsplugins/pluginscan.cpp index 82a5defb2..6914deb93 100644 --- a/nsplugins/pluginscan.cpp +++ b/nsplugins/pluginscan.cpp @@ -470,7 +470,7 @@ void writeServicesFile( TQStringList mimeTypes ) ts << "Icon=netscape" << endl; ts << "Comment=" << i18n("Netscape plugin viewer") << endl; ts << "X-KDE-Library=libnsplugin" << endl; - ts << "InitialPreference=0" << endl; + ts << "InitialPreference=7" << endl; ts << "ServiceTypes=KParts/ReadOnlyPart,Browser/View" << endl; ts << "X-KDE-BrowserView-PluginsInfo=nsplugins/pluginsinfo" << endl;