--- gdm-2.13.0.5.orig/debian/init +++ gdm-2.13.0.5/debian/init @@ -0,0 +1,75 @@ +#! /bin/sh +# +# Originally based on: +# Version: @(#)skeleton 1.8 03-Mar-1998 miquels@cistron.nl +# +# Modified for gdm, Steve Haslam 14mar99 +# modified to remove --exec, as it does not work on upgrades. 18jan2000 +# modified to use --name, to detect stale PID files 18mar2000 +# sleep until gdm dies, then restart it 16jul2000 +# get along with other display managers (Branden Robinson, Ryan Murray) 05sep2001 + +set -e + +# To start gdm even if it is not the default display manager, change +# HEED_DEFAULT_DISPLAY_MANAGER to "false." +HEED_DEFAULT_DISPLAY_MANAGER=true +DEFAULT_DISPLAY_MANAGER_FILE=/etc/X11/default-display-manager +PATH=/sbin:/bin:/usr/sbin:/usr/bin +DAEMON=/usr/sbin/gdm +PIDFILE=/var/run/gdm.pid +UPGRADEFILE=/var/run/gdm.upgrade + +if [ -e $UPGRADEFILE -a "$1" != "restart" -a "$1" != "force-reload" ]; then + SSD_ARG="--startas $DAEMON" + rm -f $UPGRADEFILE +else + SSD_ARG="--exec $DAEMON" +fi + +test -x $DAEMON || exit 0 + +if [ -r /etc/default/gdm ]; then + . /etc/default/gdm + if [ -z "$LANG" ]; then + : + else + export LANG + fi +fi + +. /lib/lsb/init-functions + +case "$1" in + start) + if [ -e "$DEFAULT_DISPLAY_MANAGER_FILE" -a "$HEED_DEFAULT_DISPLAY_MANAGER" = "true" -a "$(cat $DEFAULT_DISPLAY_MANAGER_FILE 2>/dev/null)" != "$DAEMON" ]; then + log_warning_msg "Not starting GNOME Display Manager (gdm); it is not the default display manager." + else + log_begin_msg "Starting GNOME Display Manager..." + start-stop-daemon --start --quiet --pidfile $PIDFILE --name gdm $SSD_ARG >/dev/null 2>&1 || log_end_msg 1 + log_end_msg 0 + fi + ;; + stop) + log_begin_msg "Stopping GNOME Display Manager..." + start-stop-daemon --stop --quiet --pidfile $PIDFILE --name gdm $SSD_ARG --retry 30 >/dev/null 2>&1 + log_end_msg 0 + ;; + reload) + log_begin_msg "Reloading GNOME Display Manager configuration..." + log_warning_msg "Changes will take effect when all current X sessions have ended." + start-stop-daemon --stop --signal USR1 --quiet --pidfile \ + $PIDFILE --name gdm $SSD_ARG >/dev/null 2>&1 + log_end_msg 0 + ;; + restart|force-reload) + $0 stop || true + $0 start + ;; + *) + log_success_msg "Usage: /etc/init.d/gdm {start|stop|restart|reload|force-reload}" + exit 1 + ;; +esac + +exit 0 --- gdm-2.13.0.5.orig/debian/control +++ gdm-2.13.0.5/debian/control @@ -0,0 +1,25 @@ +Source: gdm +Section: gnome +Priority: optional +Maintainer: Sebastien Bacher +Build-Depends: libpam0g-dev, libgnomeui-dev (>= 1.96.0), librsvg2-dev (>= 2.7), libglade2-dev, libwrap0-dev, debhelper (>= 4.1.16), cdbs, gettext, intltool, scrollkeeper, libselinux1-dev, libattr1-dev, libxt-dev, libxau-dev, libxkbfile-dev, libxdmcp-dev, libxi-dev, libxinerama-dev, gnome-doc-utils (>= 0.3.2), libgtk2.0-dev (>= 2.6.0) +Standards-Version: 3.6.2 + +Package: gdm +Architecture: any +Depends: adduser, debconf (>= 0.5), dpkg (>= 1.9), ${shlibs:Depends}, libpam-modules (>= 0.72-1), libpam-runtime (>= 0.76-22ubuntu3), libpam-modules (>= 0.79-3ubuntu3), gnome-session | xterm | x-window-manager | x-terminal-emulator, xbase-clients, gksu (>= 1.0.7), ubuntu-artwork, ubuntu-sounds, alsa-utils, lsb-base (>= 1.3-9ubuntu3) +Recommends: whiptail | dialog, zenity +Suggests: locales, apmd, msttcorefonts +Provides: x-display-manager +Conflicts: gdm2 +Description: GNOME Display Manager + gdm provides the equivalent of a "login:" prompt for X displays- it + pops up a login window and starts an X session. + . + It provides all the functionality of xdm, including XDMCP support for + managing remote displays. + . + The greeting window is written using the GNOME libraries and hence + looks like a GNOME application- even to the extent of supporting + themes! By default, the greeter is run as an unprivileged user for + security. --- gdm-2.13.0.5.orig/debian/changelog +++ gdm-2.13.0.5/debian/changelog @@ -0,0 +1,1082 @@ +gdm (2.13.0.5-0ubuntu3) dapper; urgency=low + + * debian/patches/17_icons_for_menu.patch: + - use icons for the menu (dapper-desktop-plan) + * debian/patches/18_button_for_menu.patch: + - function to open the context menu from a label (dapper-desktop-plan) + + -- Sebastien Bacher Wed, 25 Jan 2006 22:17:28 +0100 + +gdm (2.13.0.5-0ubuntu2) dapper; urgency=low + + * debian/patches/16_fix_user_list_crash.patch: + - fix a crasher when using the faces list (Ubuntu: #28319) + + -- Sebastien Bacher Wed, 18 Jan 2006 22:24:34 +0100 + +gdm (2.13.0.5-0ubuntu1) dapper; urgency=low + + * New upstream version + * debian/control: + - Depends on libpam-modules (>= 0.79-3ubuntu3) + * debian/patches/02_default_config.patch: + - fixed a typo and the Xnest path, don't set the path pam does that now + * debian/patches/11_powermanagement.patch: + - updated + * debian/patches/fix-flexiserver-segfault.patch: + - fixed with the new version + + -- Sebastien Bacher Sun, 15 Jan 2006 23:34:02 +0100 + +gdm (2.13.0.4-0ubuntu2) dapper; urgency=low + + * debian/patches/fix-flexiserver-segfault: + - added two NULL checks. + + -- Daniel Holbach Wed, 4 Jan 2006 12:22:13 +0100 + +gdm (2.13.0.4-0ubuntu1) dapper; urgency=low + + * New upstream release: + - can't disable "automatic" or "timed" log-in features. (Ubuntu: #21139) + * debian/control: + - build Build-Depends on libgtk2.0-dev. + * debian/rules: + - build with --with-prefetch=yes + * debian/patches/02_default_config.patch: + - updated. + - removed last remaining bit of SecureSystemMenu. + + -- Daniel Holbach Mon, 2 Jan 2006 16:31:50 +0100 + +gdm (2.13.0.3-0ubuntu1) dapper; urgency=low + + * New upstream version. + * debian/patches/03_securesysmenu_gdmlogin.patch, + debian/patches/03_securesysmenu_gdmsetup.patch, + debian/patches/03_securesysmenu_greeter.patch, + debian/patches/12_securemenu.patch: + - the secure menu is a Debian hack + * debian/patches/11_powermanagement.patch: + - updated + * debian/rules: + - no need to hack the CFLAGS for xorg. + + -- Sebastien Bacher Tue, 13 Dec 2005 22:43:32 +0100 + +gdm (2.13.0.2-0ubuntu4) dapper; urgency=low + + * debian/patch/09_desktop.patch: + - fix typo pointed by Mantas Kriaučiūnas , + use gksu instead of gksudo + + -- Sebastien Bacher Sun, 11 Dec 2005 17:22:12 +0100 + +gdm (2.13.0.2-0ubuntu3) dapper; urgency=low + + * debian/patch/09_desktop.patch: + - adapt the desktop file to work with the gksudo change. + + -- Sebastien Bacher Wed, 7 Dec 2005 23:57:05 +0100 + +gdm (2.13.0.2-0ubuntu2) dapper; urgency=low + + * debian/patches/09_desktop.patch: + - use "X-KDE-SubstituteUID=true" for the menu item. + + -- Sebastien Bacher Wed, 7 Dec 2005 23:38:19 +0100 + +gdm (2.13.0.2-0ubuntu1) dapper; urgency=low + + * New upstream version: + - Further redesign of configuration parsing logic. Now all GDM slaves + (except gdmsetup) use the GET_CONFIG socket command to access + configuration data. This means all configuration parsing is now handled + in one place, the daemon. Improvements to the daemon configuration + parsing so it correctly parses and validates all parameters used + by the slave programs. Also fix some compile issues that were causing + problems with certain configurations. + - Improved the GET_CONFIG command so that you don't have to include the + default value (you can use "greeter/IncludeAll" instead of having to use + "greeter/IncludeAll=false". Also you can access keys that contain + translatable strings (e.g. "greeter/Welcome[cs]") via the GET_CONFIG + command. + - Changes to peeking VT freeness in 2.13.0.1 broke + virtual terminal support on BSD. This release corrects this problem. + - Correct Linux get VT logic so it returns the correct VT. + - Now gdmlogin always uses GDK_RGB_DITHER_MAX when painting the background + to ensure a nice background regardless of X configuration + (e.g. X in 16bpp mode). + - Now check for Xserver in prefix /usr. + - Fix configure for Darwin. + - Fix compiler warnings. + - Ensure gnome.desktop and default.desktop have 644 perms. + - Translation updates + * debian/patches: + - updated a bunch of patch again for the upstream redesign. + + -- Sebastien Bacher Tue, 29 Nov 2005 14:56:16 +0100 + +gdm (2.13.0.1-0ubuntu2) dapper; urgency=low + + * debian/patches/09_menu_change.patch: + - hide the photo selection dialog (MenusRevisited) + + -- Sebastien Bacher Wed, 23 Nov 2005 22:49:52 +0100 + +gdm (2.13.0.1-0ubuntu1) dapper; urgency=low + + * New upstream version: + - Complete redesign of gdmsetup so it follows usability recommendation + mockups by Calum Benson. + - gdmsetup now supports drag-and-drop for new themes. + - the chooser GUI has been HIGified. + - now GDM warns correctly about caps lock if an alternate keymap + is enabled. kbGetState is used instead of XkbGetIndicator State. + (Ubuntu: #15792). + * Updated most of the patches for the upstream code changes. + * debian/init: + - clean a confusing message (Ubuntu: #17211). + * debian/patches/04_menu_changes.patch: + - hide the new login and new login nested menu items (MenusRevisited). + * debian/Xsession: + - use .profile file (Ubuntu: #14206). + + -- Sebastien Bacher Tue, 15 Nov 2005 10:21:29 +0100 + +gdm (2.13.0.0-0ubuntu3) dapper; urgency=low + + * Rebuild with the new libgsf package. + + -- Sebastien Bacher Sat, 12 Nov 2005 14:25:40 +0100 + +gdm (2.13.0.0-0ubuntu2) dapper; urgency=low + + * debian/rules: + - added --disable-scrollkeeper to configure options. + + -- Daniel Holbach Thu, 27 Oct 2005 13:33:24 +0200 + +gdm (2.13.0.0-0ubuntu1) dapper; urgency=low + + * New upstream release: + - Fix problem with PostSession script not always being executed when + user kills the Xserver with ctrl-alt-backspace. Fixes bug #152906. + (Jerry G. DeLapp) + - No longer set tooltips for menu items in gdmlogin. These do not work + with accessibility and no GNOME programs use menu tooltips, it is not + recommended. (Brian Cameron) + - Change the way the "OK" and "Cancel" buttons work so they are + consistant. Now the "Cancel" button in gdmlogin is active when the + Username is requested and just clears the field. This makes gdmlogin + work like gdmgreeter. Now make the buttons insensitive when the + ok/enter/tab is pressed and make them sensitive again when the greeter + wants entry. This fixes a bug where the greeter's memory could get + corrupted by pressing "Cancel" after authentication (which would only + happen if the PostLogin script caused a long enough delay to allow + this to happen or perhaps on a really slow machine). (Brian Cameron) + - Correct reading of config file in gdmflexiserver. (Christiaan Welvaart) + - GNOME HIG fixes for the Language, Session, and Message dialogs. (Dennis + Cranston) + - Define SoundProgram to be /usr/bin/audioplay instead of /usr/bin/play + on Solaris. /usr/bin/play does not exist on Solaris. + - Better /etc/default/login support on Solaris. Previously it supported + only PASSREQ. Now it supports PATH, SUPATH and CONSOLE (the same ones + CDE login supports). Added new PasswordRequired gdm.conf setting so + that PASSREQ can be controlled via gdm.conf as well. + - Memory leaks fixed. (Steve Grubb/Brian Cameron) + - Improvements to strings and docs (Adam Weinberger, Brian Cameron) + - Translation updates (Takeshi AIHANA, Runa Bhattacharjee, Priit Laes, + Chao-Hsiung Liao, Ignacio Casal Quinteiro, Vincent van Adrighem, Funda + Wang, Adam Weinberger) + * debian/control: + - Bumped Standards-Version. + - Added gnome-doc-utils to Build-Depends. + * debian/patches/01_xconfigoptions.patch: + - Updated. + * debian/patches/02_default_config.patch: + - Updated. + * debian/patches/03_securesysmenu_gdmlogin.patch: + - Updated. + * debian/patches/03_securesysmenu_greeter.patch: + - Updated. + + -- Daniel Holbach Thu, 27 Oct 2005 08:30:00 +0200 + +gdm (2.8.0.5-0ubuntu1) breezy; urgency=low + + * New upstream version: + - gdmsetup list hidden files (Ubuntu: #16253). + - fix a string issue with gdmsetup for some locales (Ubuntu: #14632). + + -- Sebastien Bacher Tue, 4 Oct 2005 11:22:59 +0200 + +gdm (2.8.0.4-0ubuntu10) breezy; urgency=low + + * debian/patches/15_usplash.patch: + - improve the usplash exit support + + -- Michael Vogt Thu, 29 Sep 2005 17:13:04 +0200 + +gdm (2.8.0.4-0ubuntu9) breezy; urgency=low + + * debian/init: + - redirect the cat output (Ubuntu: #13565). + + -- Sebastien Bacher Thu, 29 Sep 2005 12:26:19 +0200 + +gdm (2.8.0.4-0ubuntu8) breezy; urgency=low + + * debian/patches/15_usplash.patch: + - make sure to set console fonts when usplash is runing + before X is started (ubuntu #15344 , #15102) + + -- Michael Vogt Tue, 27 Sep 2005 12:19:14 +0200 + +gdm (2.8.0.4-0ubuntu7) breezy; urgency=low + + * debian/patches/14_xkeepscrashing_kbdmode.patch + - Call kbd_mode -a before trying to interact with the user, since X can + leave the keyboard in raw mode (ubuntu #6286) + + -- Matt Zimmerman Tue, 20 Sep 2005 17:14:47 -0700 + +gdm (2.8.0.4-0ubuntu6) breezy; urgency=low + + * debian/patches/13_get_lang_from_environment.patch: + - be more carefull about empty LANG vars (ubuntu #15408) + + -- Michael Vogt Thu, 15 Sep 2005 09:56:50 +0200 + +gdm (2.8.0.4-0ubuntu5) breezy; urgency=low + + * debian/patches/09_desktop.patch: + - fix FTBFS and make it apply cleanly again + + -- Michael Vogt Wed, 14 Sep 2005 11:12:34 +0200 + +gdm (2.8.0.4-0ubuntu4) breezy; urgency=low + + * debian/patches/13_get_lang_from_environment.patch: + - use pam_getenv -l LANG to get the locale + * debian/control: + - depend on libpam-runtime (>= 0.76-22ubuntu3) + + -- Michael Vogt Mon, 12 Sep 2005 22:56:54 +0200 + +gdm (2.8.0.4-0ubuntu3) breezy; urgency=low + + * debian/patches/13_get_lang_from_environment.patch: + - use /etc/environment to get the LANG setting (ubuntu #14719) + + -- Michael Vogt Mon, 12 Sep 2005 17:37:56 +0200 + +gdm (2.8.0.4-0ubuntu2) breezy; urgency=low + + * debian/patches/01_xrdb_nocpp.patch: + - call xrdb with the "nocpp" option (Ubuntu: #14268). + + -- Sebastien Bacher Sat, 10 Sep 2005 15:35:41 +0200 + +gdm (2.8.0.4-0ubuntu1) breezy; urgency=low + + * New upstream version. + + -- Sebastien Bacher Tue, 6 Sep 2005 09:24:29 +0200 + +gdm (2.8.0.3-0ubuntu2) breezy; urgency=low + + * Rebuild again to rid us of the unwanted libglitz dependency. + + -- Adam Conrad Tue, 30 Aug 2005 06:12:17 +1000 + +gdm (2.8.0.3-0ubuntu1) breezy; urgency=low + + * New upstream version: + - Fixes corrupted Session selection dialog presented to user + (Ubuntu: #13853). + + -- Sebastien Bacher Mon, 22 Aug 2005 11:12:58 +0200 + +gdm (2.8.0.2-0ubuntu3) breezy; urgency=low + + * Rebuild with the new cairo version + + -- Sebastien Bacher Thu, 18 Aug 2005 17:18:21 +0000 + +gdm (2.8.0.2-0ubuntu2) breezy; urgency=low + + * debian/rules: + - don't list factory-gdm.conf as a conffile (Ubuntu: #12318). + + -- Sebastien Bacher Wed, 17 Aug 2005 00:39:43 +0200 + +gdm (2.8.0.2-0ubuntu1) breezy; urgency=low + + * New upstream version: + - Now Use24Clock setting support "auto" which will use + the system default for date/time formatting (Ubuntu: #1833). + - Fixed some labels (Ubuntu: #12781). + * debian/patches/02_xkeepscrashing_autoconfigure.patch: + - updated. + * debian/patches/03_securesysmenu_gdmlogin.patch: + - updated. + * debian/patches/03_securesysmenu_greeter.patch: + - updated. + + -- Sebastien Bacher Tue, 9 Aug 2005 19:38:52 +0200 + +gdm (2.8.0.1-0ubuntu4) breezy; urgency=low + + * debian/patches/01_xconfigoptions.patch: + - patch configure to use "-br" (Ubuntu: #12985). + + -- Sebastien Bacher Wed, 27 Jul 2005 18:16:48 +0200 + +gdm (2.8.0.1-0ubuntu3) breezy; urgency=low + + * debian/Xsession: + - Quote all --text arguments to zenity, so people stop seeing empty dialog + boxes. + + -- Daniel Stone Mon, 25 Jul 2005 19:41:25 +1000 + +gdm (2.8.0.1-0ubuntu2) breezy; urgency=low + + * debian/patches/01_xconfigoptions.patch: + - use "-br" for "X_CONFIG_OPTIONS". + * debian/patches/02_default_config.patch: + - update of the default config to list the users (Ubuntu: #12395). + + -- Sebastien Bacher Tue, 5 Jul 2005 17:59:03 +0200 + +gdm (2.8.0.1-0ubuntu1) breezy; urgency=low + + * New upstream version: + - fix an error with an xml file (Ubuntu: #12252). + * debian/patches/01_shellsh.patch: + - fixed with the new version. + + -- Sebastien Bacher Sat, 2 Jul 2005 13:57:18 +0200 + +gdm (2.8.0.0-0ubuntu4) breezy; urgency=low + + * debian/rules: + - install debian/Xsession, fix the Default choice (Ubuntu: #11942). + - install debian/gdm-autologin.pam, fix the autologin (Ubuntu: #12012). + + -- Sebastien Bacher Fri, 24 Jun 2005 09:44:44 +0200 + +gdm (2.8.0.0-0ubuntu3) breezy; urgency=low + + * debian/patches/01_shellsh.patch: + - use "/bin/sh" as shell (Ubuntu: #11918). + + -- Sebastien Bacher Fri, 17 Jun 2005 10:40:43 +0200 + +gdm (2.8.0.0-0ubuntu2) breezy; urgency=low + + * debian/control: + - fixed the Build-Depends. + + -- Sebastien Bacher Fri, 17 Jun 2005 00:10:58 +0200 + +gdm (2.8.0.0-0ubuntu1) breezy; urgency=low + + * New upstream version: + - scales the face image (Ubuntu: #6372). + - fix gdmsetup crash on the logo page (Ubuntu: #1944). + - new comment for gdmsetup (Ubuntu: #4567). + - validate the username (Ubuntu: #9777). + - use "restart" instead of "reboot" (Ubuntu: #10232). + * debian/patches/01_configure.patch, + debian/patches/02_default_config.patch, + debian/patches/03_securesysmenu_gdmlogin.patch, + debian/patches/03_securesysmenu_gdmsetup.patch, + debian/patches/03_securesysmenu_greeter.patch, + debian/patches/10_noxkeepcrashing.patch, + debian/patches/11_powermanagement.patch, + debian/patches/12_securemenu.patch: + - updated. + * debian/patches/06_gdmscale.patch, + debian/patches/07_gdmlanguages.patch, + debian/patches/08_translations.patch: + - fixed with the new version. + * debian/postinst: + - update the gdm value for default-display-manager. + * debian/rules: + - updated for the new version files change. + - use CFLAGS="-I/usr/X11R6/include". + * debian/watch: + - updated. + + -- Sebastien Bacher Wed, 15 Jun 2005 22:53:12 +0200 + +gdm (2.6.0.7-0ubuntu9) breezy; urgency=low + + * Repackaged using cdbs. + * debian/control: + - Depends on cdbs. + - changed the maintainer field. + * debian/compat: + - new file. + * debian/patches/02_default_config.patch: + - changes to the gdm.conf file. + * debian/patches/02_xkeepscrashing_autoconfigure.patch: + - new patch. + + -- Sebastien Bacher Wed, 15 Jun 2005 19:22:27 +0200 + +gdm (2.6.0.7-0ubuntu7) hoary; urgency=low + + * po/*.po: + - uncommented some translations (Hoary: #7548). + + -- Sebastien Bacher Mon, 28 Mar 2005 15:08:02 +0200 + +gdm (2.6.0.7-0ubuntu6) hoary; urgency=low + + * gui/gdmlanguages.c: + - fix the spacing for the differents languages list entries, + patch from Seb Wills (Hoary: #8160). + + -- Sebastien Bacher Mon, 28 Mar 2005 02:07:44 +0200 + +gdm (2.6.0.7-0ubuntu5) hoary; urgency=low + + * gui/gdmlanguages.c: + - improvements to the languages list, + patch from Seb Wills (Hoary: #8160). + + -- Sebastien Bacher Mon, 28 Mar 2005 01:28:12 +0200 + +gdm (2.6.0.7-0ubuntu4) hoary; urgency=low + + * config/gdm.conf.in: + - Change default background colour. + + -- Jeff Waugh Fri, 25 Mar 2005 23:01:39 +1100 + +gdm (2.6.0.7-0ubuntu3) hoary; urgency=low + + * debian/control: + - Depends on lsb-base (Hoary: #7768). + + -- Sebastien Bacher Tue, 22 Mar 2005 13:02:21 +0100 + +gdm (2.6.0.7-0ubuntu2) hoary; urgency=low + + * [debian/init] If gdm is not running when we try to stop it, use + log_success_msg rather than log_warning_msg to advise of this fact + + -- Matt Zimmerman Mon, 21 Mar 2005 17:01:30 -0800 + +gdm (2.6.0.7-0ubuntu1) hoary; urgency=low + + * New upstream release. + + -- Sebastien Bacher Sat, 5 Mar 2005 18:37:06 +0100 + +gdm (2.6.0.6-0ubuntu4) hoary; urgency=low + + * Updated for the powermanagement features. + + -- Sebastien Bacher Fri, 25 Feb 2005 12:22:23 +0100 + +gdm (2.6.0.6-0ubuntu3) hoary; urgency=low + + * debian/control: + - Build-Depends on libxinerama-dev (again). + + -- Sebastien Bacher Tue, 4 Jan 2005 15:04:32 +0100 + +gdm (2.6.0.6-0ubuntu2) hoary; urgency=low + + * Add new option NoXKeepsCrashing to disable all XKeepsCrashing code. + + -- Fabio M. Di Nitto Thu, 16 Dec 2004 18:14:37 +0100 + +gdm (2.6.0.6-0ubuntu1) hoary; urgency=low + + * New upstream release + * Include GDM ratio-aware image scaling patch, thanks to Vincent Untz. + + -- Jeff Waugh Sun, 12 Dec 2004 21:14:47 +0100 + +gdm (2.6.0.4-1ubuntu6) hoary; urgency=low + + * Start at S13 rather than S99 (closes: Ubuntu#3143). + + -- Daniel Stone Thu, 2 Dec 2004 18:15:57 +0000 + +gdm (2.6.0.4-1ubuntu5) hoary; urgency=low + + * debian/control: + - Build-Depends on libxinerama-dev (Hoary: #3913). + + -- Sebastien Bacher Wed, 24 Nov 2004 10:12:05 +0100 + +gdm (2.6.0.4-1ubuntu4) hoary; urgency=low + + * debian/control: + - added libxdmcp-dev to the Build-Depends so gdmchooser/gdmXnestchooser + are built, thanks Sven Herzberg for noticing the bug (Hoary: #4037). + * debian/rules: + - use --with-xdmcp. + + -- Sebastien Bacher Tue, 23 Nov 2004 13:18:22 +0100 + +gdm (2.6.0.4-1ubuntu3) hoary; urgency=low + + * debian/control: + - updated the Build-Depends again, should be ok this time. + + -- Sebastien Bacher Sun, 14 Nov 2004 15:03:13 +0100 + +gdm (2.6.0.4-1ubuntu2) hoary; urgency=low + + * debian/control: + - updated the Build-Depends. + + -- Sebastien Bacher Sun, 14 Nov 2004 13:09:51 +0100 + +gdm (2.6.0.4-1ubuntu1) hoary; urgency=low + + * Merged changes with the debian package (Hoary: #3444). + + -- Sebastien Bacher Sat, 13 Nov 2004 18:46:29 +0100 + +gdm (2.6.0.4-1) unstable; urgency=medium + + * New upstream release (closes: #258213) + * When XKeepsCrashing uses whiptail, pass --scrolltext (closes: #248263) + * Fix case typo in slave.c (closes: #259173) + * Use invoke-rc.d in prerm (closes: #262625) + * Don't export LANG in /etc/default/gdm (closes: #265101) + * Move libexecdir to /usr/lib/gdm (closes: #266734) + * Keep stderr open across some execs so error messages make it to the log + (closes: #261786) + * Update de.po, es.po (closes: #258933, #267146) + + -- Ryan Murray Sun, 29 Aug 2004 21:45:36 -0700 + +gdm (2.6.0.3-1) unstable; urgency=low + + * New upstream release (closes: #255516, #222601, #241607, #250755, #240265) + * Fix typo in prerm script (closes: #251144) + * Don't fail in the postinst if debconf calls do (closes: #176652) + * Add Build-Depends on libxt-dev (closes: #256322) + * Relibtoolize. + + -- Ryan Murray Tue, 6 Jul 2004 22:42:12 -0700 + +gdm (2.4.4.7-3) unstable; urgency=low + + * Add Build-Depends on xlibs-static-dev + + -- Ryan Murray Sat, 15 May 2004 21:07:50 -0700 + +gdm (2.4.4.7-2) unstable; urgency=low + + * Correct location of logdir (closes: #240984) + * Add /etc/default/gdm, initialized from the locales package's debconf. + (closes: #133578) + * Add depends on xbase-clients until #242485 is fixed in X. (closes: #247065) + * Change "genius" to "gdm" in default config comments (closes: #243218) + * Soft restart gdm in postinst (closes: #240993) + * Update locale.conf to latest glibc (closes: #247971) + * Create .dmrc with restrictive permissions if it doesn't exist. + * Now that gksu works for me, use it to start gdmsetup (closes: #189615) + * Update debconf templates to xdm 4.3.0.dfsg.1-1. + * Add Turkish debconf template (closes: #248328) + * Add note about debconf templates to README.Debian (closes: #200121) + * Add some whitespace to the gdmlogin logo (closes: #201303) + * Build with SELinux support. + + -- Ryan Murray Sat, 15 May 2004 16:13:30 -0700 + +gdm (2.4.4.7-1) unstable; urgency=low + + * New upstream release (closes: #190390, #220492) + * Don't run update-rc.d if the init script isn't executable (closes: #213188) + * Use default gnome-session purge-delay (closes: #221448) + * Add gdmflexiserver(1) manpage (closes: #149396) + * Recommend whiptail | dialog, as the shell script works without + them. (closes: #228295) + * Add menu entries (closes: #149388) + * gdmsetup now has options for control of -nolisten tcp (closes: #155479) + * gdm no longer reads the Sessions directory to populate the menu + (closes: #218786) + * Ensure char is unsigned in fd_getc, use the utf8 string in the standard + greeter (closes: #217496) + * Don't reparse xmodmap/xkb in session script (closes: #191598) + * The GDM manual is back, and covers this. As well, it's totally different + in this version (closes: #229824) + * Use /etc/X11/Xsession.d/* for the tail end of session setup + (closes: #191711, #192252, #212120, #219040) + * Happygnome and Circles theme sizes increased upstream (closes: #219353) + * With the new Xsession.in that uses the Xsession.d dir to start up, and the + /usr/share/xsessions dir supported by kdm and gdm for programs to indicate they + should be on the session list, all that's needed is those programs to supply + desktop files for /usr/share/xsessions (closes: #84396) + * Don't always specify the charset when setting locales (closes: #213496) + * Don't ship the gnome.desktop session file; gnome-session will. + * Add |'d dependency on possible session programs, so at least one will + be installed. + + -- Ryan Murray Mon, 29 Mar 2004 01:34:16 -0800 + +gdm (2.4.1.7-1) unstable; urgency=low + + * New upstream security release (closes: #217077, #217080) + * Fix accidental patch to ve-misc.c (closes: #215839) + * Add config updating support for SecureSysMenu (closes: #215875, #214724) + + -- Ryan Murray Thu, 23 Oct 2003 02:18:49 -0700 + +gdm (2.4.1.6-2) unstable; urgency=low + + * Update pam setup for lowest common denominator "common" (closes: #207366) + * Update MinimalUID setting (closes: #209388) + * Add SecureSystemMenu support to the xml greeter (closes: #212752) + + -- Ryan Murray Mon, 13 Oct 2003 13:25:12 -0700 + +gdm (2.4.1.6-1) unstable; urgency=low + + * New upstream release (closes: #129194, #197321, #194613) + * Update and include extract-locales, which is used to generate gdm's + locale.conf Updated to move positioning of @ suffixes. (closes: #204932) + * Remove fallback to nobody/nobody from gdm.c If the system user and group + don't exist, the rest of the package will fail anyhow (closes: #194611) + * Add PAM_AUTHINFO_UNAVAIL to incorrect password error handler + (closes: #157792) + * Support use-ssh-agent in the Gnome session (closes: #196659) + * Remove links to non-existent documentation (closes: #198453, #193382) + * Update face browser comments in README.Debian (closes: #151373) + * Add SecureSystemMenu option to gdm and gdmconfig. This requires the root + password to be entered to use any option in the system menu. + * Enable SystemMenu and SecureSystemMenu by default (closes: #80800, #196140) + + -- Ryan Murray Mon, 25 Aug 2003 03:14:45 -0700 + +gdm (2.4.1.3-2) unstable; urgency=low + + * Comment out the half patch in gdmconfig until the other half can be + located (closes: #191330) + + -- Ryan Murray Thu, 1 May 2003 18:09:15 -0700 + +gdm (2.4.1.3-1) unstable; urgency=low + + * New upstream release (closes: #147637) + + gdm no longer blocks SIGCHLD (closes: #141184) + + updated desktop files (closes: #175405) + + clean rule less aggressive (closes: #108732) + + gdm doesn't open any tty that already has a getty running on it + (closes: #60890) + + gdmconfig now works (closes: #145895, #189238) + + gdm deals gracefully with missing sessions (closes: #169645) + + gdm's error messages are clearer (closes: #114933) + + username fields are limited (closes: #162353) + + LANG isn't changed if the menu isn't used (closes: #151628) + * Update debconf template translations from current xdm package + (closes: #174708, #142539) + * Create system group rather than user group (closes: #167322) + * Use a locale configuration file based on all glibc supported locales + (closes: #117652, #121889, #136695) + * Set $PWD to $HOME, which makes shells happier when $HOME is a + symlink (closes: #179814) + * Remove conflicts from potato (closes: #186436) + * remove scrollkeeper handling as it is no longer needed + (closes: #164103) + * no longer use login shell to start session script, as having *dm logins + be a login shell suprises users, as no other *dm does so (closes: #155335) + * add a conflict with gdm2 + * Change section to gnome + + -- Ryan Murray Mon, 28 Apr 2003 11:47:58 -0700 + +gdm (2.2.5.5-2) unstable; urgency=medium + + * Set datadir instead of docdir (closes: #140367) + * use gnome-db2html, again. gdm docs now use real docbook, so add + build-depends on docbook-utils (closes: #140839) + * Update french translation (closes: #140389) + + -- Ryan Murray Thu, 4 Apr 2002 01:13:31 -0800 + +gdm (2.2.5.5-1) unstable; urgency=low + + * New upstream release (closes: #138984) + * Documentation is installed (closes: #112579) + * Add symlink to "advanced" gdm documentation (closes: #123241) + * Change UID sooner, to work with filesystems that don't give root + full permissions (closes: #129383, #137782) + * Update debconf translations (closes: #136925, #137938, #139732, #132614) + (closes: #136394) + * Use updated logo (closes: #122101) + * Fix quoting and set DEFAULT_DISPLAY_MANAGER_FILE in prerm (closes: #131907) + (closes: #137261) + * Remove user, group, and more config directories on purge (closes: #136247) + + -- Ryan Murray Mon, 25 Mar 2002 23:41:05 -0800 + +gdm (2.2.5.4-2) unstable; urgency=low + + * Fix gdm-autologin.pam to not use RH-specific pam modules (closes: #130378) + + -- Ryan Murray Sun, 27 Jan 2002 11:16:24 -0800 + +gdm (2.2.5.4-1) unstable; urgency=low + + * New upstream release (closes: #128364) + * Ship a gdm-autologin pam file (closes: #128656) + * Don't delete gdm.upgrade too soon (closes: #127392) + * Update README.Debian for xscreensaver use (closes: #128387) + * Update French translation (closes: #130137) + + -- Ryan Murray Sun, 20 Jan 2002 23:36:06 -0800 + +gdm (2.2.5.3-2) unstable; urgency=low + + * Don't muck about with egid after setgid() (closes: #126936) + * Update Russian, Japanese, and Korean hardcoded LANG values (closes: #127052) + + -- Ryan Murray Mon, 31 Dec 2001 00:45:44 -0800 + +gdm (2.2.5.3-1) unstable; urgency=low + + * New upstream release (closes: #113373, #119717) + * Update prerm script (closes: #125807, #115776) + + -- Ryan Murray Fri, 28 Dec 2001 11:10:09 -0800 + +gdm (2.2.5.2-2) unstable; urgency=low + + * Fix $RET typo in postinst + * Add missing daemon_name template + + -- Ryan Murray Thu, 13 Dec 2001 23:44:08 -0800 + +gdm (2.2.5.2-1) unstable; urgency=low + + * New upstream release (closes: #111738, #117744) + * Fix typo in postinst (closes: #117127) + * Fix removal of /etc/gdm directory in postrm + * gdm no longer starts from the postinst, ever (closes: #93236) + * Lower --retry timeout on gdm stop (closes: #122202) + * Only do the password stuff if the gdm user doesn't exist (closes: #119385) + * add pam_limits to the installed pam file (closes: #118335) + * Correct debconf for selection of display managers (closes : #115776) + * Add -xkb option to Xnest startup (closes: #111783) + + -- Ryan Murray Sun, 9 Dec 2001 16:56:32 -0800 + +gdm (2.2.4.3-1) unstable; urgency=low + + * New upstream release (closes: #113822, #115543) + * Fix typo in config file (closes: #111941) + * Added de, pt_BR templates (closes: #112357, #116428) + * Fix default gnome session (closes: #111967) + + -- Ryan Murray Sun, 21 Oct 2001 18:56:33 -0700 + +gdm (2.2.4.1-1) unstable; urgency=low + + * New upstream release (closes: #108715) + * AllowRoot works (closes: #108192) + * background and themes work (closes: #105713) + * Depend on dpkg >= 1.9 for retry option to start-stop-daemon + * All other known display managers can be installed alongside gdm, so + removing the conflicts. This still doesn't solve the getty/dm problem, + however. (closes: #50707) + * Implement Pax Displayicus Managerius. (closes: #108712) + * Clobber variables a little less (closes: #104577) + * If you want verboseauth, change the config file (closes: #110779) + * Attempt to stop gdm on package removal (closes: #110503) + * Remove auth cookies, logs, and config on purge (closes: #110502) + + -- Ryan Murray Fri, 7 Sep 2001 00:32:41 -0700 + +gdm (2.2.3.1-2) unstable; urgency=low + + * Update config.{guess,sub} and file the bug upstream (closes: #105061) + * Add conflicts to current and older versions of zh-trans + + -- Ryan Murray Sat, 14 Jul 2001 00:05:09 -0700 + +gdm (2.2.3.1-1) unstable; urgency=low + + * New upstream release. (closes: #81408, #81099, #82183, #81732, #86980) + (closes: #88518, #93516, #93055, #82576, #85941, #94117, #50269) + (closes: #101867, #82264, #97586, #100587, #102194, #102691, #103931) + (closes: #79832) + * As the subject says, this isn't a bug (closes: #83007) + * Change default logo to Debian logo (closes: #71906) + * Priorities have been sorted by ftpmaster (closes: #64965) + * Moved from dbs; most of the patches are included now. (closes: #92020) + * Start X server without tcp listening by default (closes: #92909, #94293) + * change sessreg to -u none (closes: #90981) + * Bring back traditional Xsession session (closes: #87617) + * Don't ship an /etc/gdm/Sessions/Default (closes: #79300) + * Add fetchmail to ignored users (closes: #101240) + * Safe restart gets as close to this as possible. gdm will restart when + all sessions log out when given SIGUSR1. Make it the reload default. + (closes: #93077) + + -- Ryan Murray Sun, 8 Jul 2001 19:51:26 -0700 + +gdm (2.0-0.beta4.15) unstable; urgency=low + + * Added xutils dependancy (closes: #76148) + * Added patch to remove locale menu, allowing dependancy on locales to + be lowered to suggests (closes: #80408) + * Apparently X has some issues with all the clients being killed in a row, + and doesn't decide to exit. XDM kills the server instead of the "nice" + method, so now we do that, too. (closes: #77163) + * Remove non-sensical code that broke %d (closes: #75094) + * Add documentation on the face browser (closes: #75091) + * It seems updating the cookies already happens, so now the hostname is + reread each time the cookies regenerate (closes: #55712) + * Remove inappropriate Xsession session. + * Fix a syslog() format. + + -- Ryan Murray Sun, 24 Dec 2000 21:43:55 -0800 + +gdm (2.0-0.beta4.14) unstable; urgency=low + + * Fix file descriptor leak in Xserver logfile. + + -- Ryan Murray Fri, 8 Sep 2000 23:53:49 -0700 + +gdm (2.0-0.beta4.13) unstable; urgency=low + + * Add -deferglyphs 16 to starting of the X server + + -- Ryan Murray Mon, 21 Aug 2000 22:30:07 -0700 + +gdm (2.0-0.beta4.12) unstable; urgency=low + + * Remove \n at the end of LANG. (closes: #68331) + * Apply uid switch patch (closes: #67364) + + -- Ryan Murray Fri, 11 Aug 2000 04:16:40 -0700 + +gdm (2.0-0.beta4.11) unstable; urgency=low + + * Allow up to 128 character passwords (Closes: #66727) + * Wait until gdm has exited before restarting (Closes: #65446) + + -- Ryan Murray Sun, 16 Jul 2000 13:23:12 -0700 + +gdm (2.0-0.beta4.10) unstable; urgency=low + + * Update maintainer's e-mail address + * Force focus to be on the login window when on the root window and + added accelerators for all menus via Alt+letter, including an extra + accelerator for ESC to bring down the first menu. (Closes: #61141, #62837) + * Added README.Debian pointing out the manual (Closes: #61609) + * Increased delay before restart (didn't close: #65446) + * Force English to always be in the language list (Closes: #65538) + + -- Ryan Murray Sun, 18 Jun 2000 18:01:46 -0700 + +gdm (2.0-0.beta4.9) unstable frozen; urgency=high + + * Fix several security related bugs, including one grave bug + (closes: #63255, #61968) + * Fix for /etc/environment being read twice (closes: #59042) + * Fix for LANG not being set correctly, based on a patch used by + redhat (closes: #59044) + * Added translations for new locales from CVS. + * Removed checking for pidfile in gdm code, as start-stop-daemon does + a better job, for Debian. + * Added --name to start-stop-daemon line (closes: #59176) + * Set default locale in LANG before starting gdmlogin. This makes + GDM's text localized to the setting of DefaultLocale in gdm.conf + (closes: #57806) + * Changed build system to dbs, from patch system used by egcs at some + point. + * Fix reference of gdmgreeter in gdmlogin manpage (closes: #63680) + * Fix for buffer overflow in xdmcp.c (closes: #63876) + + -- Ryan Murray Wed, 10 May 2000 02:24:59 -0700 + +gdm (2.0-0.beta4.8) unstable frozen; urgency=medium + + * Fix for grave password visible bug. (closes: #55886) + * Fix for font directive being ignored when gtkrc used (closes: #51374) + * Change build process to be more friendly when upstream isn't a CVS version + * Added missing build dependancies (closes: #56046) + * Moved logfiles to /var/log/gdm (closes: #56018) + * Don't start gdm if we're in X on the display it manages, or if it's + running (closes: #53992) + + -- Ryan Murray Sun, 30 Jan 2000 23:16:24 -0800 + +gdm (2.0-0.beta4.7) unstable frozen; urgency=medium + + * Modified gdm.conf to start up as :0 on vt7, and added conflicts for other + display managers. Release Critical bug fix. (closes: #53988, #54234) + * added dependancy on libpam-modules (closes: #54452) + * removed --exec from start-stop-daemon to workaround bug #51953 in dpkg. + (closes: #53064) + * Added comment for SystemMenu to gdm.conf (closes: #53996) + * Made path closer to default login path + * Updated Exclude field in gdm.conf + * Added text strings describing shutdown/halt + * increase purge delay to 15 seconds (closes: #53998) + + -- Ryan Murray Tue, 18 Jan 2000 00:37:37 -0800 + +gdm (2.0-0.beta4.6) unstable; urgency=low + + * New maintainer. + * Disable XDMCP by default (safer default) + * Modified gdm.conf to start up as :1 on vt8 as a default + * Updated to Standards-Version 3.1.1 + * Moved to FHS 2.1 draft (/var/state -> /var/lib) + * Applied patch to solve (null) locale/session (Closes: #51846, #52321) + * Added pam_env.so to /etc/pam.d/gdm (Closes: #52408) + * Applied retry limit patch (Closes: #51103, #53065) + * Recompiled with new libesd-dev (Closes: #52245) + * Compiled with libwrap0 + * export MAIL environment variable in Gnome session script (Closes: #53601) + + -- Ryan Murray Wed, 29 Dec 1999 23:50:43 -0800 + +gdm (2.0-0.beta4.5) unstable; urgency=low + + * Added a suggests: xsm and corrected /etc/gdm/Sessions/Xsession + in order to work even if xsm is not available. Closes: #49632 + * Enable XDMCP by default. Closes: #49104 + * Updated the copyright file. + * Cleaned the .diff.gz and the rules file. + * Corrected the man pages. + + -- Raphael Hertzog Tue, 9 Nov 1999 23:38:24 +0100 + +gdm (2.0-0.beta4.4) unstable; urgency=low + + * Removed the explicit setting of the virtual terminal. It was + causing problem to people who have getty running on vt8 ... + * Corrected /etc/gdm/Sessions/Gnome to work with OpenSSH. + Closes: #49443 + + -- Raphael Hertzog Thu, 4 Nov 1999 19:53:01 +0100 + +gdm (2.0-0.beta4.3) unstable; urgency=low + + * Session/Gnome: doesn't set the PATH since gdm does already take + care of this. Closes: #48310 + * Session/Xsession: calls freetemp only if it's available. + Closes: #47916 + * Put a symlink /etc/X11/gdm -> ../gdm. Closes: #46898 + * Now use /etc/locale.alias instead of its own file. + Closes: #47915 + + -- Raphael Hertzog Wed, 27 Oct 1999 14:33:49 +0200 + +gdm (2.0-0.beta4.2) unstable; urgency=low + + * Changed gdm.conf to explicitely give the virtual console + to use. Default to "vt8 :1" in order to avoid problems. + I hope that it closes: #47425, #47451 + + -- Raphael Hertzog Sat, 16 Oct 1999 18:37:17 +0200 + +gdm (2.0-0.beta4.1) unstable; urgency=low + + * New maintainer. + * Until a proper solution is found, gdm will conflict with xdm, kdm and + wdm. Closes: #46378 + * Corrected the priority number for init.d scripts K99 -> K01. + Closes: #46379 + * Recommends gnome-session ... + * Bug closed by previous NMU : + closes: #33471, #35672, #36284, #37780, #38034, #38343, #39433, #39703 + closes: #40293, #40308, #41157, #42440, #42493, #42636, #43095, #43667 + closes: #45719, #45916 + + -- Raphael Hertzog Tue, 12 Oct 1999 22:26:43 +0200 + +gdm (2.0-0.beta4) unstable; urgency=low + + * NMU + * New upstream version. + * Be more careful for creating user/group. Closes: #45916 + + -- Raphael Hertzog Thu, 30 Sep 1999 20:54:45 +0200 + +gdm (2.0-0.beta3) unstable; urgency=low + + * NMU. + * New upstream version of gdm (still beta but it does work contrary to + gdm1). Closes: #45719 + * Does show all users (list of exclusion does exist in gdm.conf) + Closes: #42440, #42493 + * The X connection problem is solved with this version. + Closes: #42636, #43667, #43095 + * The macros stuff has moved in /usr/share/aclocal/gnome. + Closes: #40293 + * gdm is very kind with xserver badly configured. Closes: #35672 + * gdm cleans (not too much however) the environment. MAIL is removed. + Closes: #33471 + * gdm does restart well. Closes: #38034 + * You can select your language/sessions. Closes: #38343 + * Gdm and xscreensaver do work correctly together. Closes: #39703 + * Gdmgreeter does start. Closes: #40308 + * Gdm does use :1 by default. Closes: #36284, #37780, #41157 + * Gdm does now include /usr/games in the PATH. Closes: #39433 + + -- Raphael Hertzog Tue, 21 Sep 1999 20:25:01 +0200 + +gdm2 (0+cvs19990428-1) experimental; urgency=low + + * Experimental build of gdm2 + + -- Steve Haslam Mon, 17 May 1999 13:09:22 +0100 + +gdm (1.0.0-6) unstable; urgency=low + + * Don't automatically restart gdm + * Change init.d restart behaviour, no longer set -e. + * Made substantial changes to /etc/gdm/Sessions/Gnome; removed /etc/gnomerc + as a result + + -- Steve Haslam Wed, 5 May 1999 23:39:08 +0100 + +gdm (1.0.0-5) unstable; urgency=low + + * Replaced the PAM config again. + * Remove po/*.gmo files when cleaning because changes to them can't be + represented in .diff.gz files + + -- Steve Haslam Wed, 21 Apr 1999 17:19:16 +0100 + +gdm (1.0.0-4) unstable; urgency=low + + * Major rewrite of packaging files- now using .dpatch files to hold changes + * Added -lnsl to LIBS when using -lwrap (from cpbs@debian.org) + + -- Steve Haslam Tue, 20 Apr 1999 02:48:32 +0100 + +gdm (1.0.0-3) unstable; urgency=low + + * Make /etc/gdm/Init/:0 a conffile too + + -- Steve Haslam Sat, 27 Mar 1999 14:08:55 +0000 + +gdm (1.0.0-2) unstable; urgency=low + + * Use "update-rc.d gdm defaults 99" + * Don't strip x mode from /etc/gnomerc + + -- Steve Haslam Mon, 22 Mar 1999 19:55:48 +0000 + +gdm (1.0.0-1) unstable; urgency=low + + * Initial version. + + -- Steve Haslam Thu, 18 Mar 1999 21:27:20 +0000 --- gdm-2.13.0.5.orig/debian/rules +++ gdm-2.13.0.5/debian/rules @@ -0,0 +1,35 @@ +#! /usr/bin/make -f + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/gnome.mk +include /usr/share/cdbs/1/rules/simple-patchsys.mk + +DEB_CONFIGURE_EXTRA_FLAGS := --disable-dependency-tracking --localstatedir=/var/lib --with-selinux --with-xdmcp --disable-scrollkeeper --with-prefetch=yes +DEB_DH_INSTALLINIT_ARGS := --noscripts + +MANPAGES = $(shell cat debian/manpages) +INSTDIR = $(CURDIR)/debian/gdm + +build/gdm:: $(MANPAGES) + +binary-predeb/gdm:: + perl -pi -e 's#^/etc/gdm/factory-gdm.conf\n##sm' debian/gdm/DEBIAN/conffiles + +binary-post-install/gdm:: + cd $(INSTDIR)/etc/gdm && rm locale.alias + cd $(INSTDIR)/usr/sbin && rm gdm-stop gdm-restart gdm-safe-restart + cd $(INSTDIR)/usr/sbin && mv gdm-binary gdm + cd $(INSTDIR)/usr/lib/gtk-2.0/modules && rm -f *.a *.la + rm -rf $(INSTDIR)/var/lib/log + rm -rf $(INSTDIR)/etc/dm + rm -f $(INSTDIR)/usr/share/xsessions/gnome.desktop + install -m755 debian/gdmplay $(CURDIR)/debian/gdm/usr/lib/gdmplay + install -m644 debian/gdm.xpm debian/login-photo.xpm debian/gdmDebianLogo.xpm $(CURDIR)/debian/gdm/usr/share/pixmaps/ + install -m755 debian/Xsession $(CURDIR)/debian/gdm/etc/gdm/Xsession + install -m644 debian/gdm-autologin.pam debian/gdm/etc/pam.d/gdm-autologin + +clean:: + rm -f $(MANPAGES) po/*.gmo po/.intltool-merge-cache config/*.desktop + +%.1: %.pod + pod2man --section=1 --release="GNOME 2.10" --center="Ubuntu" $< | sed -e 's/debian:://'> $@ --- gdm-2.13.0.5.orig/debian/Xsession +++ gdm-2.13.0.5/debian/Xsession @@ -0,0 +1,224 @@ +#!/bin/sh +# +# This is SORT OF LIKE an X session, but not quite. You get a command as the +# first argument (it could be multiple words, so run it with "eval"). As a +# special case, the command can be: +# failsafe - Run an xterm only +# default - Run the appropriate Xclients startup (see the code below) +# custom - Run ~/.xsession and if that's not available run 'default' +# +# (Note that other arguments could also follow, but only the command one is +# right now relevant and supported) +# +# The output is ALREADY redirected to .xsession-errors in GDM. This way +# .xsession-errors actually gets more output such as if the PreSession script +# is failing. This also prevents DoS attacks if some app in the users session +# can be prodded to dump lots of stuff on the stdout/stderr. We wish to be +# robust don't we? In case you wish to use an existing script for other DM's, +# you can just not redirect when GDMSESSION is set. GDMSESSION will always +# be set from gdm. +# +# Also note that this is not run as a login shell, this is just executed. +# +# based on: +# $XConsortium: Xsession /main/10 1995/12/18 18:21:28 gildea $ + +PROGNAME=Xsession + +message () { + # pretty-print messages of arbitrary length; use xmessage if it + # is available and $DISPLAY is set + MESSAGE="$PROGNAME: $*" + echo "$MESSAGE" | fold -s -w ${COLUMNS:-80} >&2 + if [ -n "$DISPLAY" ]; then + if [ -n "$zenity" ]; then + "$zenity" --info --text "`gettextfunc "$MESSAGE"`" + elif [ -n "$xmessage" ]; then + echo "$MESSAGE" | fold -s -w ${COLUMNS:-80} | $xmessage -center -file - + fi + fi +} + +message_nonl () { + # pretty-print messages of arbitrary length (no trailing newline); use + # xmessage if it is available and $DISPLAY is set + MESSAGE="$PROGNAME: $*" + echo -n "$MESSAGE" | fold -s -w ${COLUMNS:-80} >&2; + if [ -n "$DISPLAY" ]; then + if [ -n "$zenity" ]; then + "$zenity" --info --text "`gettextfunc "$MESSAGE"`" + elif [ -n "$xmessage" ]; then + echo -n "$MESSAGE" | fold -s -w ${COLUMNS:-80} | $xmessage -center -file - + fi + fi +} + +errormsg () { + # exit script with error + message "$*" + exit 1 +} + +internal_errormsg () { + # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message + # One big call to message() for the sake of xmessage; if we had two then + # the user would have dismissed the error we want reported before seeing the + # request to report it. + errormsg "$*" \ + "Please report the installed version of the \"xfree86-common\"" \ + "package and the complete text of this error message to" \ + "." +} + +run_parts () { + # until run-parts --noexec is implemented + if [ -z "$1" ]; then + internal_errormsg "run_parts() called without an argument." + fi + if [ ! -d "$1" ]; then + internal_errormsg "run_parts() called, but \"$1\" does not exist or is" \ + "not a directory." + fi + for F in $(ls $1); do + if expr "$F" : '[[:alnum:]_-]\+$' > /dev/null 2>&1; then + if [ -f "$1/$F" ]; then + echo "$1/$F" + fi + fi + done +} +# initialize variables for use by all session scripts + +OPTIONFILE=/etc/X11/Xsession.options + +SYSRESOURCES=/etc/X11/Xresources +USRRESOURCES=$HOME/.Xresources + +SYSSESSIONDIR=/etc/X11/Xsession.d +USERXSESSION=$HOME/.xsession +ALTUSERXSESSION=$HOME/.Xsession + +# this will go into the .xsession-errors along with all other echo's +# good for debugging where things went wrong +echo "$0: Beginning session setup..." + +# First read /etc/profile and .profile +test -f /etc/profile && . /etc/profile +test -f "$HOME/.profile" && . "$HOME/.profile" +# Second read /etc/xprofile and .xprofile for X specific setup +test -f /etc/xprofile && . /etc/xprofile +test -f "$HOME/.xprofile" && . "$HOME/.xprofile" + +# Translation stuff +if [ -x "/usr/lib/gdm/gdmtranslate" ] ; then + gdmtranslate="/usr/lib/gdm/gdmtranslate" +else + gdmtranslate= +fi + +# Note that this should only go to zenity dialogs which always expect utf8 +gettextfunc () { + if [ "x$gdmtranslate" != "x" ] ; then + "$gdmtranslate" --utf8 "$1" + else + echo "$1" + fi +} + +zenity=`which zenity 2>/dev/null` +xmessage=`which xmessage 2>/dev/null` + +command="$1" + +if [ -z "$command" ] ; then + command=failsafe +fi + +if [ x"$command" = xfailsafe ] ; then + if [ -n "$zenity" ] ; then + "$zenity" --info --text "`gettextfunc "This is the failsafe xterm session. Windows now have focus only if you have your cursor above them. To get out of this mode type 'exit' in the window in the upper left corner"`" + else + echo "$0: Starting the failsafe xterm session." + fi + exec xterm -geometry 80x24+0+0 +fi + +# clean up after xbanner +freetemp=`which freetemp 2>/dev/null` +if [ -n "$freetemp" ] ; then + "$freetemp" +fi + +usermodmap="$HOME/.Xmodmap" +userxkbmap="$HOME/.Xkbmap" + +if [ -f "$userxkbmap" ]; then + setxkbmap `cat "$userxkbmap"` + XKB_IN_USE=yes +fi + +# xkb and xmodmap don't play nice together +if [ -z "$XKB_IN_USE" ]; then + if [ -f "$usermodmap" ]; then + xmodmap "$usermodmap" + fi +fi + +unset XKB_IN_USE + +# Normalize languages, some places/distros screw us up in /etc/profile, +# so in case the user did select a language +if [ -n "$GDM_LANG" ]; then + LANG="$GDM_LANG" + export LANG + + if [ -n "$LC_ALL" ]; then + if [ "$LC_ALL" != "$LANG" ]; then + LC_ALL="$LANG" + fi + else + unset LC_ALL + fi + + if [ -n "$LANGUAGE" ]; then + if [ "$LANGUAGE" != "$LANG" ]; then + LANGUAGE="$LANG" + fi + else + unset LANGUAGE + fi + + if [ -n "$LINGUAS" ]; then + if [ "$LINGUAS" != "$LANG" ]; then + LINGUAS="$LANG" + fi + else + unset LINGUAS + fi +fi + +# The default Debian session runs xsession first, so we just do that for +# "custom" +if [ "x$command" = "xcustom" ] ; then + shift + set default $* +fi + +# use run-parts to source every file in the session directory; we source +# instead of executing so that the variables and functions defined above +# are available to the scripts, and so that they can pass variables to each +# other +SESSIONFILES=$(run_parts $SYSSESSIONDIR) +if [ -n "$SESSIONFILES" ]; then + for SESSIONFILE in $SESSIONFILES; do + . $SESSIONFILE + done +fi + +echo "$0: Executing $command failed, will try to run x-terminal-emulator" + +if [ -n "$zenity" ] ; then + "$zenity" --info --text "`gettextfunc "I could not start your session and so I have started the failsafe xterm session. Windows now have focus only if you have your cursor above them. To get out of this mode type 'exit' in the window in the upper left corner"`" +fi + +exec x-terminal-emulator -geometry 80x24+0+0 --- gdm-2.13.0.5.orig/debian/docs +++ gdm-2.13.0.5/debian/docs @@ -0,0 +1,4 @@ +NEWS +README +README.install +TODO --- gdm-2.13.0.5.orig/debian/gdmplay +++ gdm-2.13.0.5/debian/gdmplay @@ -0,0 +1,2 @@ +#!/bin/sh +/usr/bin/aplay -q -N $@ 2> /dev/null --- gdm-2.13.0.5.orig/debian/gdmflexiserver.pod +++ gdm-2.13.0.5/debian/gdmflexiserver.pod @@ -0,0 +1,58 @@ +=head1 NAME + +gdmflexiserver - start a GDM session using the GDM I mechanism, +or in B + +=head1 SYNOPSIS + +B GNOME options gdmflexiserver options + +=head1 DESCRIPTION + +The I mechanism allows to run GDM sessions on demand, in a new +virtual console. The administrator can define multiple server configurations, +using alternate X servers, or different options, in the B file, and +B will present you with a menu, where you will be asked to +choose between those server configurations marked with B. + +Alternatively, the B<--xnest> option allows you to run a new session in an +Xnest(1) window. + +=head1 OPTIONS + +In addition to the common Gtk and GNOME options, B accepts the +following options: + +=over 4 + +=item B<-c> I, B<--command>=I + +Send the specified protocol command to gdm + +=item B<-n>, B<--xnest> + +Xnest mode + +=item B<-l>, B<--no-lock> + +Do not lock current screen + +=item B<-d>, B<--debug> + +Debugging output + +=item B<-a>, B<--authenticate> + +Authenticate before running B<--command> + +=back + +=head1 SEE ALSO + +gdm(8), Xnest(1). + +=head1 AUTHORS + +B is part of the B software package, which is part of the +GNOME project. This manpage was written by Yann Dirson for +the Debian system, but may be used by others. --- gdm-2.13.0.5.orig/debian/gdm.xpm +++ gdm-2.13.0.5/debian/gdm.xpm @@ -0,0 +1,415 @@ +/* XPM */ +static char * gdm_xpm[] = { +"32 32 380 2", +" c None", +". c #D4D3CA", +"+ c #EDE9DE", +"@ c #EBE8DE", +"# c #EAE6DE", +"$ c #E4E4DE", +"% c #E2E0DA", +"& c #E1DED6", +"* c #DBDAD6", +"= c #DBD7D4", +"- c #D7D3CF", +"; c #D3D2CD", +"> c #D0CDC7", +", c #CDCBC6", +"' c #CBC8BF", +") c #CAC5BF", +"! c #C4C2BE", +"~ c #C3BDB9", +"{ c #BBB9B5", +"] c #B9B5AE", +"^ c #ACA8A2", +"/ c #99978E", +"( c #72706C", +"_ c #EBE7DC", +": c #BAB8B8", +"< c #A1A1A2", +"[ c #A2A2A5", +"} c #A1A2A7", +"| c #A0A0A4", +"1 c #9B9EA1", +"2 c #999AA0", +"3 c #97979C", +"4 c #93949A", +"5 c #909195", +"6 c #8C8E93", +"7 c #8A8C8F", +"8 c #8A898E", +"9 c #85878B", +"0 c #828187", +"a c #7D7F82", +"b c #7A797F", +"c c #767276", +"d c #757475", +"e c #9B9893", +"f c #75716C", +"g c #EBE7DE", +"h c #8B8B92", +"i c #B6B6C2", +"j c #A2A1B3", +"k c #9898AC", +"l c #9192A6", +"m c #9395A8", +"n c #8D8FA3", +"o c #878A9C", +"p c #85879A", +"q c #838698", +"r c #7E7F94", +"s c #76788B", +"t c #737688", +"u c #727387", +"v c #717185", +"w c #6B6A7D", +"x c #5E5E6C", +"y c #4C4954", +"z c #827D7D", +"A c #767470", +"B c #91919B", +"C c #B5B7C6", +"D c #A0A2BB", +"E c #9C9DBA", +"F c #989AB8", +"G c #9598B5", +"H c #999DBA", +"I c #999CB9", +"J c #9396B3", +"K c #9698B6", +"L c #9194B1", +"M c #9395B4", +"N c #9497B4", +"O c #8F92AF", +"P c #8D90AD", +"Q c #8B8DAA", +"R c #7F809A", +"S c #6C6B81", +"T c #50505B", +"U c #7F7D7C", +"V c #73726D", +"W c #E3E2DD", +"X c #8C8D99", +"Y c #A5A7BC", +"Z c #9699B8", +"` c #9C9FC3", +" . c #9DA0C6", +".. c #9DA0C7", +"+. c #9D9FC6", +"@. c #9C9FC5", +"#. c #9C9EC5", +"$. c #9FA1B8", +"%. c #A9A89E", +"&. c #ABAA95", +"*. c #A6A5A2", +"=. c #9A9CC0", +"-. c #9698BE", +";. c #8B8CAE", +">. c #767791", +",. c #545662", +"'. c #7B7B7C", +"). c #716F6E", +"!. c #E1DED8", +"~. c #8A8A97", +"{. c #9A9BB2", +"]. c #999BBD", +"^. c #AFB1D1", +"/. c #D8D9EA", +"(. c #E0E1EE", +"_. c #E0E0EE", +":. c #B1B3D6", +"<. c #A3A5C4", +"[. c #C3BD65", +"}. c #CFC642", +"|. c #D2C839", +"1. c #CDC447", +"2. c #B5B28B", +"3. c #9DA0C3", +"4. c #8F92B5", +"5. c #797C96", +"6. c #545564", +"7. c #7B797E", +"8. c #6F6C69", +"9. c #DFDAD6", +"0. c #8C8D9A", +"a. c #9999B1", +"b. c #B7B9D1", +"c. c #F9F9FB", +"d. c #FFFFFF", +"e. c #F9F9FC", +"f. c #D3CF8F", +"g. c #D3C937", +"h. c #CFC643", +"i. c #ABABA5", +"j. c #9195B8", +"k. c #797C97", +"l. c #525563", +"m. c #787678", +"n. c #6A6966", +"o. c #DAD8D6", +"p. c #81828F", +"q. c #8D8FA5", +"r. c #A1A4C2", +"s. c #CDCFE2", +"t. c #F7F7FB", +"u. c #D0D1E7", +"v. c #C9C472", +"w. c #AEAD9A", +"x. c #9093B7", +"y. c #787B96", +"z. c #515261", +"A. c #757578", +"B. c #696765", +"C. c #D8D6D4", +"D. c #838691", +"E. c #8B8DA3", +"F. c #9A9DBF", +"G. c #9FA2C9", +"H. c #A2A5CF", +"I. c #A2A5D0", +"J. c #A3A6D1", +"K. c #B2B1A0", +"L. c #D1C83B", +"M. c #C9C156", +"N. c #A7A8B3", +"O. c #8F92B6", +"P. c #777995", +"Q. c #505060", +"R. c #757276", +"S. c #666260", +"T. c #D3D2CF", +"U. c #7B7D88", +"V. c #878A9F", +"W. c #9598BA", +"X. c #A1A4CF", +"Y. c #A3A6CC", +"Z. c #B8B589", +"`. c #CCC44D", +" + c #D2C83B", +".+ c #C8C157", +"++ c #ADADAA", +"@+ c #9EA1C8", +"#+ c #8F91B5", +"$+ c #767894", +"%+ c #4C4D5D", +"&+ c #716E72", +"*+ c #646160", +"=+ c #D2CEC9", +"-+ c #757882", +";+ c #84869C", +">+ c #989BBD", +",+ c #9DA1C8", +"'+ c #A1A4CE", +")+ c #D3D4E9", +"!+ c #9DA0C9", +"~+ c #8E90B4", +"{+ c #747691", +"]+ c #4A4A5B", +"^+ c #6F6C71", +"/+ c #646061", +"(+ c #CFCBC8", +"_+ c #72747F", +":+ c #7F8297", +"<+ c #9194B4", +"[+ c #999DC3", +"}+ c #9EA1CA", +"|+ c #9FA2CB", +"1+ c #D1D2E5", +"2+ c #F8F8FB", +"3+ c #D0D2E5", +"4+ c #9EA0C9", +"5+ c #9DA0C8", +"6+ c #999CC4", +"7+ c #898CAE", +"8+ c #71728D", +"9+ c #464655", +"0+ c #6A6A6C", +"a+ c #605F5E", +"b+ c #CBC9C1", +"c+ c #6B6E76", +"d+ c #787B8D", +"e+ c #878BA6", +"f+ c #9093B4", +"g+ c #9497BA", +"h+ c #9496BA", +"i+ c #9496BB", +"j+ c #9395BA", +"k+ c #9294B9", +"l+ c #9194B8", +"m+ c #898CAF", +"n+ c #7B7D9C", +"o+ c #64657D", +"p+ c #3E3E4B", +"q+ c #666367", +"r+ c #605C5C", +"s+ c #CCC6BF", +"t+ c #65676E", +"u+ c #6D717D", +"v+ c #7B7D93", +"w+ c #7F829B", +"x+ c #82849F", +"y+ c #8283A0", +"z+ c #81819E", +"A+ c #80809E", +"B+ c #7D7F9B", +"C+ c #7C7E99", +"D+ c #7A7C98", +"E+ c #797B97", +"F+ c #777895", +"G+ c #747591", +"H+ c #515164", +"I+ c #30303B", +"J+ c #605D61", +"K+ c #5E595A", +"L+ c #C7C5BC", +"M+ c #67696C", +"N+ c #73737B", +"O+ c #848491", +"P+ c #817F90", +"Q+ c #7F808F", +"R+ c #828292", +"S+ c #7D7D8E", +"T+ c #7E7F8E", +"U+ c #747684", +"V+ c #808190", +"W+ c #6E707E", +"X+ c #767786", +"Y+ c #6E6E7E", +"Z+ c #767686", +"`+ c #717382", +" @ c #70727F", +".@ c #6B6A78", +"+@ c #64646F", +"@@ c #403F45", +"#@ c #625E61", +"$@ c #5C5757", +"%@ c #C0BCB1", +"&@ c #A6A5A3", +"*@ c #989693", +"=@ c #969394", +"-@ c #939195", +";@ c #929090", +">@ c #8E8C8E", +",@ c #8C8A8F", +"'@ c #8B878A", +")@ c #848386", +"!@ c #848287", +"~@ c #807D80", +"{@ c #7D7B80", +"]@ c #7C797F", +"^@ c #77747A", +"/@ c #757278", +"(@ c #707072", +"_@ c #6B686C", +":@ c #646064", +"<@ c #635F61", +"[@ c #757070", +"}@ c #504F4B", +"|@ c #6E6B63", +"1@ c #989A92", +"2@ c #A4A399", +"3@ c #A5A49F", +"4@ c #A4A199", +"5@ c #A09C96", +"6@ c #A28B85", +"7@ c #9F908B", +"8@ c #949089", +"9@ c #9B7C77", +"0@ c #928A84", +"a@ c #948480", +"b@ c #947B74", +"c@ c #8B8585", +"d@ c #858180", +"e@ c #7A7874", +"f@ c #82866B", +"g@ c #889C43", +"h@ c #7A7965", +"i@ c #696766", +"j@ c #595E5B", +"k@ c #2C2C29", +"l@ c #323A33", +"m@ c #414139", +"n@ c #3C3C3A", +"o@ c #565652", +"p@ c #616059", +"q@ c #76736F", +"r@ c #75726A", +"s@ c #6A6963", +"t@ c #807E76", +"u@ c #737169", +"v@ c #78736B", +"w@ c #7A7873", +"x@ c #676460", +"y@ c #686661", +"z@ c #5F5B59", +"A@ c #3D3C3A", +"B@ c #292726", +"C@ c #282626", +"D@ c #1F2120", +"E@ c #1A2121", +"F@ c #000000", +"G@ c #353633", +"H@ c #3A3936", +"I@ c #5C5854", +"J@ c #65655F", +"K@ c #6E6D67", +"L@ c #63635D", +"M@ c #696863", +"N@ c #696963", +"O@ c #676762", +"P@ c #716D66", +"Q@ c #656460", +"R@ c #6C6860", +"S@ c #736D69", +"T@ c #62625C", +"U@ c #3C3B38", +"V@ c #22221F", +"W@ c #1F1E1C", +"X@ c #767C75", +"Y@ c #908F87", +"Z@ c #98928B", +"`@ c #92918A", +" # c #939086", +".# c #8B8B84", +"+# c #8C8985", +"@# c #8C877F", +"## c #86827D", +"$# c #85807E", +"%# c #847E7D", +"&# c #7E7B77", +"*# c #7E7973", +"=# c #76756F", +"-# c #64625A", +";# c #57534E", +" ", +" ", +" ", +" ", +" ", +" ", +" . + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( ", +" _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f ", +" g h i j k l m n o p q r r s t u v w x y z A ", +" # B C D E F G H I J K L M N O P Q R S T U V ", +" W X Y Z ` ... .+.@.#.$.%.&.*.=.-.;.>.,.'.). ", +" !.~.{.].^./.(._./.:.<.[.}.|.1.2.3.4.5.6.7.8. ", +" 9.0.a.b.c.d.d.d.d.e.f.g.g.g.g.h.i.j.k.l.m.n. ", +" o.p.q.r.s.t.d.d.t.u.v.g.g.g.g.|.w.x.y.z.A.B. ", +" C.D.E.F.G.H.I.J.J.J.K.L.g.g.g.M.N.O.P.Q.R.S. ", +" T.U.V.W...X.I.I.I.I.Y.Z.`. +.+++@+#+$+%+&+*+ ", +" =+-+;+>+,+'+H.)+e.d.d.e.)+H.X.'+!+~+{+]+^+/+ ", +" (+_+:+<+[+}+|+1+2+d.d.2+3+}+4+5+6+7+8+9+0+a+ ", +" b+c+d+e+f+g+h+i+j+j+k+l+x.O.#+~+m+n+o+p+q+r+ ", +" s+t+u+v+w+x+y+z+A+B+C+D+E+P.F+G+8+o+H+I+J+K+ ", +" L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@@@#@$@ ", +" %@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@ ", +" |@1@2@3@4@5@6@7@8@9@0@a@b@c@d@e@f@g@h@i@j@k@ ", +" l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@D@E@F@ ", +" G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@F@F@ ", +" X@Y@Z@`@ #.#+#@###$#%#&#*#=#8.-#;# ", +" F@F@F@F@F@F@F@F@F@F@F@F@F@F@F@ ", +" ", +" ", +" ", +" ", +" "}; --- gdm-2.13.0.5.orig/debian/locale.conf +++ gdm-2.13.0.5/debian/locale.conf @@ -0,0 +1,348 @@ +# +# This is similar to a locale.alias file, but is not one. This file was +# autogenerated from the GNU libc locales source, with some editing. +# +Afar(Djibouti) aa_DJ +Afar(Eritrea) aa_ER +Afar(Eritrea) aa_ER@saaho +Afar(Ethiopia) aa_ET +Afrikaans(South_Africa) af_ZA +Albanian(Albania) sq_AL +Albanian(Albania) sq_AL.UTF-8 +Amharic(Ethiopia) am_ET +Arabic(Algeria) ar_DZ +Arabic(Algeria) ar_DZ.UTF-8 +Arabic(Bahrain) ar_BH +Arabic(Bahrain) ar_BH.UTF-8 +Arabic(Egypt) ar_EG +Arabic(Egypt) ar_EG.UTF-8 +Arabic(India) ar_IN +Arabic(Iraq) ar_IQ +Arabic(Iraq) ar_IQ.UTF-8 +Arabic(Jordan) ar_JO +Arabic(Jordan) ar_JO.UTF-8 +Arabic(Kuwait) ar_KW +Arabic(Kuwait) ar_KW.UTF-8 +Arabic(Lebanon) ar_LB +Arabic(Lebanon) ar_LB.UTF-8 +Arabic(Libyan_Arab_Jamahiriya) ar_LY +Arabic(Libyan_Arab_Jamahiriya) ar_LY.UTF-8 +Arabic(Morocco) ar_MA +Arabic(Morocco) ar_MA.UTF-8 +Arabic(Oman) ar_OM +Arabic(Oman) ar_OM.UTF-8 +Arabic(Qatar) ar_QA +Arabic(Qatar) ar_QA.UTF-8 +Arabic(Saudi_Arabia) ar_SA +Arabic(Saudi_Arabia) ar_SA.UTF-8 +Arabic(Sudan) ar_SD +Arabic(Sudan) ar_SD.UTF-8 +Arabic(Syrian_Arab_Republic) ar_SY +Arabic(Syrian_Arab_Republic) ar_SY.UTF-8 +Arabic(Tunisia) ar_TN +Arabic(Tunisia) ar_TN.UTF-8 +Arabic(United_Arab_Emirates) ar_AE +Arabic(United_Arab_Emirates) ar_AE.UTF-8 +Arabic(Yemen) ar_YE +Arabic(Yemen) ar_YE.UTF-8 +Aragonese(Spain) an_ES +Azeri(Azerbaijan) az_AZ.UTF-8 +Basque(Spain) eu_ES +Basque(Spain) eu_ES.UTF-8 +Basque(Spain) eu_ES.UTF-8@euro +Basque(Spain) eu_ES@euro +Belarusian(Belarus) be_BY +Belarusian(Belarus) be_BY.UTF-8 +Bengali(BD) bn_BD +Bengali(India) bn_IN +Blin(Eritrea) byn_ER +Bosnian(Bosnia_and_Herzegowina) bs_BA +Breton(France) br_FR +Breton(France) br_FR@euro +Bulgarian(Bulgaria) bg_BG +Bulgarian(Bulgaria) bg_BG.UTF-8 +Catalan(Spain) ca_ES +Catalan(Spain) ca_ES.UTF-8 +Catalan(Spain) ca_ES.UTF-8@euro +Catalan(Spain) ca_ES@euro +Chinese(Hong_Kong) zh_HK +Chinese(Hong_Kong) zh_HK.UTF-8 +Chinese(P.R._of_China) zh_CN +Chinese(P.R._of_China) zh_CN.GB18030 +Chinese(P.R._of_China) zh_CN.GBK +Chinese(P.R._of_China) zh_CN.UTF-8 +Chinese(Singapore) zh_SG +Chinese(Singapore) zh_SG.GBK +Chinese(Taiwan_R.O.C.) zh_TW +Chinese(Taiwan_R.O.C.) zh_TW.EUC-TW +Chinese(Taiwan_R.O.C.) zh_TW.UTF-8 +Cornish(Britain) kw_GB +Cornish(Britain) kw_GB.UTF-8 +Croatian(Croatia) hr_HR +Croatian(Croatia) hr_HR.UTF-8 +Czech(Czech_Republic) cs_CZ +Czech(Czech_Republic) cs_CZ.UTF-8 +Danish(Denmark) da_DK +Danish(Denmark) da_DK.ISO-8859-15 +Danish(Denmark) da_DK.UTF-8 +Dutch(Belgium) nl_BE +Dutch(Belgium) nl_BE.UTF-8 +Dutch(Belgium) nl_BE.UTF-8@euro +Dutch(Belgium) nl_BE@euro +Dutch(Netherlands) nl_NL +Dutch(Netherlands) nl_NL.UTF-8 +Dutch(Netherlands) nl_NL.UTF-8@euro +Dutch(Netherlands) nl_NL@euro +English(Australia) en_AU +English(Australia) en_AU.UTF-8 +English(Botswana) en_BW +English(Botswana) en_BW.UTF-8 +English(Canada) en_CA +English(Canada) en_CA.UTF-8 +English(Denmark) en_DK +English(Denmark) en_DK.UTF-8 +English(Great_Britain) en_GB +English(Great_Britain) en_GB.ISO-8859-15 +English(Great_Britain) en_GB.UTF-8 +English(Hong_Kong) en_HK +English(Hong_Kong) en_HK.UTF-8 +English(India) en_IN +English(Ireland) en_IE +English(Ireland) en_IE.UTF-8 +English(Ireland) en_IE.UTF-8@euro +English(Ireland) en_IE@euro +English(New_Zealand) en_NZ +English(New_Zealand) en_NZ.UTF-8 +English(Philippines) en_PH +English(Philippines) en_PH.UTF-8 +English(Singapore) en_SG +English(Singapore) en_SG.UTF-8 +English(South_Africa) en_ZA +English(South_Africa) en_ZA.UTF-8 +English(USA) en_US +English(USA) en_US.ISO-8859-15 +English(USA) en_US.UTF-8 +English(Zimbabwe) en_ZW +English(Zimbabwe) en_ZW.UTF-8 +Estonian(Estonia) et_EE +Estonian(Estonia) et_EE.ISO-8859-15 +Estonian(Estonia) et_EE.UTF-8 +Faroese(Faroe_Islands) fo_FO +Faroese(Faroe_Islands) fo_FO.UTF-8 +Finnish(Finland) fi_FI +Finnish(Finland) fi_FI.UTF-8 +Finnish(Finland) fi_FI.UTF-8@euro +Finnish(Finland) fi_FI@euro +French(Belgium) fr_BE +French(Belgium) fr_BE.UTF-8 +French(Belgium) fr_BE.UTF-8@euro +French(Belgium) fr_BE@euro +French(Canada) fr_CA +French(Canada) fr_CA.UTF-8 +French(France) fr_FR +French(France) fr_FR.UTF-8 +French(France) fr_FR.UTF-8@euro +French(France) fr_FR@euro +French(Luxemburg) fr_LU +French(Luxemburg) fr_LU.UTF-8 +French(Luxemburg) fr_LU.UTF-8@euro +French(Luxemburg) fr_LU@euro +French(Switzerland) fr_CH +French(Switzerland) fr_CH.UTF-8 +Galician(Spain) gl_ES +Galician(Spain) gl_ES.UTF-8 +Galician(Spain) gl_ES.UTF-8@euro +Galician(Spain) gl_ES@euro +Ge'ez(Eritrea) gez_ER +Ge'ez(Eritrea) gez_ER@abegede +Ge'ez(Ethiopia) gez_ET +Ge'ez(Ethiopia) gez_ET@abegede +Georgian(Georgia) ka_GE +German(Austria) de_AT +German(Austria) de_AT.UTF-8 +German(Austria) de_AT.UTF-8@euro +German(Austria) de_AT@euro +German(Belgium) de_BE +German(Belgium) de_BE.UTF-8 +German(Belgium) de_BE.UTF-8@euro +German(Belgium) de_BE@euro +German(Germany) de_DE +German(Germany) de_DE.UTF-8 +German(Germany) de_DE.UTF-8@euro +German(Germany) de_DE@euro +German(Luxemburg) de_LU +German(Luxemburg) de_LU.UTF-8 +German(Luxemburg) de_LU.UTF-8@euro +German(Luxemburg) de_LU@euro +German(Switzerland) de_CH +German(Switzerland) de_CH.UTF-8 +Greek(Greece) el_GR +Greek(Greece) el_GR.UTF-8 +Greenlandic(Greenland) kl_GL +Greenlandic(Greenland) kl_GL.UTF-8 +Gujarati(India) gu_IN +Hebrew(Israel) he_IL +Hebrew(Israel) he_IL.UTF-8 +Hebrew(Israel) iw_IL +Hebrew(Israel) iw_IL.UTF-8 +Hindi(India) hi_IN +Hungarian(Hungary) hu_HU +Hungarian(Hungary) hu_HU.UTF-8 +Icelandic(Iceland) is_IS +Icelandic(Iceland) is_IS.UTF-8 +Indonesian(Indonesia) id_ID +Indonesian(Indonesia) id_ID.UTF-8 +Irish(Ireland) ga_IE +Irish(Ireland) ga_IE.UTF-8 +Irish(Ireland) ga_IE.UTF-8@euro +Irish(Ireland) ga_IE@euro +Italian(Italy) it_IT +Italian(Italy) it_IT.UTF-8 +Italian(Italy) it_IT.UTF-8@euro +Italian(Italy) it_IT@euro +Italian(Switzerland) it_CH +Italian(Switzerland) it_CH.UTF-8 +Japanese(Japan) ja_JP.EUC-JP +Japanese(Japan) ja_JP.UTF-8 +Kannada(India) kn_IN +Korean(Republic_of_Korea) ko_KR.EUC-KR +Korean(Republic_of_Korea) ko_KR.UTF-8 +Lao(Laos) lo_LA +Latvian(Latvia) lv_LV +Latvian(Latvia) lv_LV.UTF-8 +Lithuanian(Lithuania) lt_LT +Lithuanian(Lithuania) lt_LT.UTF-8 +Luganda(Uganda) lg_UG +Macedonian(Macedonia) mk_MK +Macedonian(Macedonia) mk_MK.UTF-8 +Malay(Malaysia) ms_MY +Malay(Malaysia) ms_MY.UTF-8 +Malayalam(India) ml_IN +Maltese(malta) mt_MT +Maltese(malta) mt_MT.UTF-8 +Manx_Gaelic(Britain) gv_GB +Manx_Gaelic(Britain) gv_GB.UTF-8 +Maori(New_Zealand) mi_NZ +Marathi(India) mr_IN +Mongolian(Mongolia) mn_MN +Nepali(Nepal) ne_NP +Northern_Saami(Norway) se_NO +Norwegian,_Nynorsk(Norway) nn_NO +Norwegian,_Nynorsk(Norway) nn_NO.UTF-8 +Norwegian_Bokml(Norway) nb_NO +Norwegian_Bokml(Norway) nb_NO.UTF-8 +Norwegian_Bokml(Norway) no_NO.UTF-8 +Occitan(France) oc_FR +Oromo(Ethiopia) om_ET +Oromo(Kenya) om_KE +Persian(Iran) fa_IR +Polish(Poland) pl_PL +Polish(Poland) pl_PL.UTF-8 +Portuguese(Brasil) pt_BR +Portuguese(Brasil) pt_BR.UTF-8 +Portuguese(Portugal) pt_PT +Portuguese(Portugal) pt_PT.UTF-8 +Portuguese(Portugal) pt_PT.UTF-8@euro +Portuguese(Portugal) pt_PT@euro +Punjabi(India) pa_IN +Romanian(Romania) ro_RO +Romanian(Romania) ro_RO.UTF-8 +Russian(Russia) ru_RU +Russian(Russia) ru_RU.KOI8-R +Russian(Russia) ru_RU.UTF-8 +Russian(Ukraine) ru_UA +Russian(Ukraine) ru_UA.UTF-8 +Scots_Gaelic(Great_Britain) gd_GB +Serbian(Yugoslavia) sr_YU +Serbian(Yugoslavia) sr_YU.UTF-8 +Serbian(Yugoslavia) sr_YU.UTF-8@cyrillic +Serbian(Yugoslavia) sr_YU@cyrillic +Sidama(Ethiopia) sid_ET +Slovak(Slovak) sk_SK +Slovak(Slovak) sk_SK.UTF-8 +Slovenian(Slovenia) sl_SI +Slovenian(Slovenia) sl_SI.UTF-8 +Somali(Djibouti) so_DJ +Somali(Ethiopia) so_ET +Somali(Kenya) so_KE +Somali(Somalia) so_SO +Sotho(South_Africa) st_ZA +Sotho(South_Africa) st_ZA.UTF-8 +Spanish(Argentina) es_AR +Spanish(Argentina) es_AR.UTF-8 +Spanish(Bolivia) es_BO +Spanish(Bolivia) es_BO.UTF-8 +Spanish(Chile) es_CL +Spanish(Chile) es_CL.UTF-8 +Spanish(Colombia) es_CO +Spanish(Colombia) es_CO.UTF-8 +Spanish(Costa_Rica) es_CR +Spanish(Costa_Rica) es_CR.UTF-8 +Spanish(Dominican_Republic) es_DO +Spanish(Dominican_Republic) es_DO.UTF-8 +Spanish(Ecuador) es_EC +Spanish(Ecuador) es_EC.UTF-8 +Spanish(El_Salvador) es_SV +Spanish(El_Salvador) es_SV.UTF-8 +Spanish(Guatemala) es_GT +Spanish(Guatemala) es_GT.UTF-8 +Spanish(Honduras) es_HN +Spanish(Honduras) es_HN.UTF-8 +Spanish(Mexico) es_MX +Spanish(Mexico) es_MX.UTF-8 +Spanish(Nicaragua) es_NI +Spanish(Nicaragua) es_NI.UTF-8 +Spanish(Panama) es_PA +Spanish(Panama) es_PA.UTF-8 +Spanish(Paraguay) es_PY +Spanish(Paraguay) es_PY.UTF-8 +Spanish(Peru) es_PE +Spanish(Peru) es_PE.UTF-8 +Spanish(Puerto_Rico) es_PR +Spanish(Puerto_Rico) es_PR.UTF-8 +Spanish(Spain) es_ES +Spanish(Spain) es_ES.UTF-8 +Spanish(Spain) es_ES.UTF-8@euro +Spanish(Spain) es_ES@euro +Spanish(USA) es_US +Spanish(USA) es_US.UTF-8 +Spanish(Uruguay) es_UY +Spanish(Uruguay) es_UY.UTF-8 +Spanish(Venezuela) es_VE +Spanish(Venezuela) es_VE.UTF-8 +Swedish(Finland) sv_FI +Swedish(Finland) sv_FI.UTF-8 +Swedish(Finland) sv_FI.UTF-8@euro +Swedish(Finland) sv_FI@euro +Swedish(Sweden) sv_SE +Swedish(Sweden) sv_SE.ISO-8859-15 +Swedish(Sweden) sv_SE.UTF-8 +Tagalog(Philippines) tl_PH +Tajik(Tajikistan) tg_TJ +Tamil(India) ta_IN +Tatar(Tatarstan) tt_RU.UTF-8 +Telgu(India) te_IN +Thai(Thailand) th_TH +Thai(Thailand) th_TH.UTF-8 +Tigre(Eritrea) tig_ER +Tigrigna(Eritrea) ti_ER +Tigrigna(Ethiopia) ti_ET +Turkish(Turkey) tr_TR +Turkish(Turkey) tr_TR.UTF-8 +Ukrainian(Ukraine) uk_UA +Ukrainian(Ukraine) uk_UA.UTF-8 +Urdu(Pakistan) ur_PK +Uzbek(Uzbekistan) uz_UZ +Uzbek(Uzbekistan) uz_UZ@cyrillic +Vietnamese(Vietnam) vi_VN +Vietnamese(Vietnam) vi_VN.TCVN +Walloon(Belgium) wa_BE +Walloon(Belgium) wa_BE.UTF-8 +Walloon(Belgium) wa_BE@euro +Welsh(Great_Britain) cy_GB +Welsh(Great_Britain) cy_GB.UTF-8 +Xhosa(South_Africa) xh_ZA +Xhosa(South_Africa) xh_ZA.UTF-8 +Yiddish(USA) yi_US +Zulu(South_Africa) zu_ZA +Zulu(South_Africa) zu_ZA.UTF-8 --- gdm-2.13.0.5.orig/debian/copyright +++ gdm-2.13.0.5/debian/copyright @@ -0,0 +1,13 @@ +This package originally Debianised by Steve Haslam , +10th March 1999. It was maintained by Raphal Hertzog +until December 1999. It is now maintained by +Ryan Murray . + +Copyright (C) 1998, 1999 Martin Kasper Petersen + +Originally obtained from GNOME: ftp.gnome.org + +License: GPL + +On Debian systems, the full text of the GPL can be found at +/usr/share/common-licenses/GPL --- gdm-2.13.0.5.orig/debian/gdmchooser.pod +++ gdm-2.13.0.5/debian/gdmchooser.pod @@ -0,0 +1,26 @@ +=head1 NAME + +gdmchooser - GNOME Display Manager host chooser window + +=head1 SYNOPSIS + +gdmchooser + +=head1 DESCRIPTION + +B is invoked by gdm(8). It displays a list of hosts that +are candidates for logging into via a gdm(8) daemon or compatible, +such as xdm(1x) or wdm(1x). + +=head1 SEE ALSO + +gdm(8) + +=head1 AUTHOR + +Martin Kasper Petersen + +This manual page written by Steve Haslam for +Debian GNU/Linux. + +=cut --- gdm-2.13.0.5.orig/debian/postrm +++ gdm-2.13.0.5/debian/postrm @@ -0,0 +1,22 @@ +#!/bin/sh +if [ "$1" = "purge" ] ; then + update-rc.d gdm remove >/dev/null + rm -f /etc/default/gdm + if [ -d /etc/gdm ]; then + rmdir --ignore-fail-on-non-empty /etc/gdm/Init /etc/gdm/PreSession /etc/gdm/PostSession /etc/gdm/PostLogin /etc/gdm/Sessions /etc/gdm 2>/dev/null + fi + if [ -d /var/lib/gdm ]; then + rm -r /var/lib/gdm + fi + if [ -d /var/log/gdm ]; then + rm -r /var/log/gdm + fi + if getent passwd gdm >/dev/null; then + deluser gdm + fi + if getent group gdm >/dev/null; then + delgroup gdm + fi +fi +#DEBHELPER# +exit 0 --- gdm-2.13.0.5.orig/debian/README.Debian +++ gdm-2.13.0.5/debian/README.Debian @@ -0,0 +1,22 @@ +gdm for Debian +-------------- + +If you enable the face browser in /etc/X11/gdm/gdm.conf, gdm will look +for face files (any gtk+-supported image format; see +/usr/lib/gtk-2.0/2.2.0/loaders or similar for a list of installed +loaders) in ~/.gnome2/photo or /, +whichever is found first. Note that there is no filename extension +for either location. greeter/GlobalFaceDir is set in +/etc/X11/gdm/gdm.conf + +If you want a screensaver running with the greeter, you should use the +BackgroundProgram option in /etc/X11/gdm/gdm.conf, or make sure if you start +a gtk program in the PreSession script, that it is started with the gdm +userid, and not root + +A note to translators about the debconf templates -- translations +should be sent to the xdm package. I don't use gettext-based +templates in the source, because I sync to the ones in the xdm +package, and don't have any that are not shared. + + -- Ryan Murray , Sun Aug 24 21:34:22 PDT 2003 --- gdm-2.13.0.5.orig/debian/login-photo.xpm +++ gdm-2.13.0.5/debian/login-photo.xpm @@ -0,0 +1,343 @@ +/* XPM */ +static char * login_photo_xpm[] = { +"32 32 308 2", +" c None", +". c #FFFFFF", +"+ c #CECDC7", +"@ c #6C6A56", +"# c #6B6955", +"$ c #6A6954", +"% c #686853", +"& c #676752", +"* c #646650", +"= c #636650", +"- c #61654E", +"; c #60644D", +"> c #5D634C", +", c #5C634B", +"' c #5A624A", +") c #586149", +"! c #566047", +"~ c #556047", +"{ c #535F45", +"] c #515E44", +"^ c #8A9482", +"/ c #F9F9F9", +"( c #6C6955", +"_ c #696853", +": c #656751", +"< c #62654F", +"[ c #5E644D", +"} c #5B624A", +"| c #596149", +"1 c #576148", +"2 c #545F46", +"3 c #525F45", +"4 c #505E44", +"5 c #899381", +"6 c #E3E3E3", +"7 c #5E614C", +"8 c #575B46", +"9 c #585C47", +"0 c #585E48", +"a c #5B614A", +"b c #575E47", +"c c #545C45", +"d c #4F5E43", +"e c #4E5D42", +"f c #889381", +"g c #D3D3D3", +"h c #505340", +"i c #3D3F31", +"j c #464536", +"k c #363629", +"l c #343628", +"m c #434735", +"n c #3E4232", +"o c #3B3F31", +"p c #3D4533", +"q c #4C573F", +"r c #4D5D42", +"s c #879280", +"t c #D2D2D2", +"u c #CECDC6", +"v c #62644E", +"w c #4B4D3C", +"x c #514E41", +"y c #8E8270", +"z c #7B664E", +"A c #46311D", +"B c #382313", +"C c #352212", +"D c #554331", +"E c #887964", +"F c #3C3A2D", +"G c #25291E", +"H c #3D4833", +"I c #4B593F", +"J c #4C5C41", +"K c #4B5C40", +"L c #86927F", +"M c #CDCDC6", +"N c #656651", +"O c #525442", +"P c #434135", +"Q c #918069", +"R c #7B6751", +"S c #7F684F", +"T c #412C19", +"U c #392413", +"V c #2F1D0F", +"W c #2B1D11", +"X c #4C3A28", +"Y c #624D35", +"Z c #292619", +"` c #262D20", +" . c #435139", +".. c #4A5B40", +"+. c #495B3F", +"@. c #85917F", +"#. c #61634E", +"$. c #3F3F32", +"%. c #665B49", +"&. c #78614A", +"*. c #8D765D", +"=. c #6F563C", +"-. c #543C24", +";. c #342010", +">. c #2E1E10", +",. c #4A3C2E", +"'. c #63513E", +"). c #4C3926", +"!. c #4C3923", +"~. c #212519", +"{. c #35412D", +"]. c #47593E", +"^. c #475A3E", +"/. c #83917E", +"(. c #CCCCC5", +"_. c #666751", +":. c #63654F", +"<. c #555845", +"[. c #3F3D31", +"}. c #483A29", +"|. c #866C50", +"1. c #8B745A", +"2. c #7D6348", +"3. c #47311D", +"4. c #2F1E10", +"5. c #3C2D1F", +"6. c #988572", +"7. c #A08970", +"8. c #725D48", +"9. c #463424", +"0. c #26261A", +"a. c #303B29", +"b. c #465A3D", +"c. c #83907D", +"d. c #5F624D", +"e. c #5F5E49", +"f. c #40382A", +"g. c #4B3A26", +"h. c #80674E", +"i. c #765F46", +"j. c #49331E", +"k. c #402D1C", +"l. c #4F3E2E", +"m. c #907F6D", +"n. c #EAD3B9", +"o. c #D8BC9E", +"p. c #A68B6F", +"q. c #705C47", +"r. c #413C2C", +"s. c #3A4A32", +"t. c #45593D", +"u. c #44593C", +"v. c #81907C", +"w. c #CBCCC4", +"x. c #62654E", +"y. c #5D614B", +"z. c #8D8368", +"A. c #8B755E", +"B. c #624B33", +"C. c #84694D", +"D. c #553E27", +"E. c #3D2C1C", +"F. c #594A3B", +"G. c #CBB49D", +"H. c #F2D6B8", +"I. c #CFB293", +"J. c #8A735B", +"K. c #574838", +"L. c #333124", +"M. c #3A4B33", +"N. c #42583B", +"O. c #CACBC4", +"P. c #60654E", +"Q. c #857C63", +"R. c #6F5F4E", +"S. c #594430", +"T. c #5A4127", +"U. c #422F1E", +"V. c #382E25", +"W. c #181B1E", +"X. c #3F3D3B", +"Y. c #948370", +"Z. c #837360", +"`. c #5B4F43", +" + c #1D1F21", +".+ c #322D28", +"++ c #3A3E2C", +"@+ c #41563A", +"#+ c #42583A", +"$+ c #41583A", +"%+ c #7F8F7B", +"&+ c #5E644C", +"*+ c #5C624B", +"=+ c #5E5F49", +"-+ c #907960", +";+ c #4F3D2C", +">+ c #443120", +",+ c #856C52", +"'+ c #8E7A64", +")+ c #514D49", +"!+ c #645E59", +"~+ c #B19D88", +"{+ c #66594C", +"]+ c #433B33", +"^+ c #534C43", +"/+ c #574D42", +"(+ c #3E4430", +"_+ c #40573A", +":+ c #3F5739", +"<+ c #7E8F7A", +"[+ c #C9CBC3", +"}+ c #535C44", +"|+ c #756B52", +"1+ c #927B5F", +"2+ c #A78868", +"3+ c #E6C19A", +"4+ c #F9D9B8", +"5+ c #F2D8BE", +"6+ c #F1DAC4", +"7+ c #F6DEC6", +"8+ c #BBA186", +"9+ c #433A30", +"0+ c #837260", +"a+ c #645749", +"b+ c #3B4B33", +"c+ c #3F5738", +"d+ c #3D5638", +"e+ c #7D8E79", +"f+ c #59624A", +"g+ c #4B533D", +"h+ c #675E48", +"i+ c #EBC49B", +"j+ c #F8D0A5", +"k+ c #EECEAB", +"l+ c #ECD2B6", +"m+ c #FADFC4", +"n+ c #F5DABE", +"o+ c #89755F", +"p+ c #29221B", +"q+ c #786756", +"r+ c #594C3F", +"s+ c #3D5236", +"t+ c #3D5637", +"u+ c #3B5536", +"v+ c #7C8E79", +"w+ c #C8CBC3", +"x+ c #4B503B", +"y+ c #AA8D6E", +"z+ c #DFB890", +"A+ c #D7B38D", +"B+ c #85705A", +"C+ c #A28C75", +"D+ c #C5A687", +"E+ c #957B60", +"F+ c #645240", +"G+ c #514336", +"H+ c #41392B", +"I+ c #3F5638", +"J+ c #3A5536", +"K+ c #7B8D78", +"L+ c #C8CAC2", +"M+ c #4D5A41", +"N+ c #675C47", +"O+ c #AE8F70", +"P+ c #DFB88F", +"Q+ c #CBA782", +"R+ c #6D5945", +"S+ c #45392C", +"T+ c #3C3126", +"U+ c #362C22", +"V+ c #3A2F25", +"W+ c #3A402D", +"X+ c #3C5637", +"Y+ c #385334", +"Z+ c #7A8D77", +"`+ c #C7CAC2", +" @ c #525E45", +".@ c #4C593F", +"+@ c #5B5640", +"@@ c #BF9D79", +"#@ c #B39272", +"$@ c #93785D", +"%@ c #886F56", +"&@ c #6F5A46", +"*@ c #434330", +"=@ c #3A5435", +"-@ c #385434", +";@ c #375333", +">@ c #7A8C77", +",@ c #C6CAC2", +"'@ c #4F5D43", +")@ c #49583D", +"!@ c #52503B", +"~@ c #705C46", +"{@ c #876E55", +"]@ c #836A52", +"^@ c #705A46", +"/@ c #524C38", +"(@ c #3D4F34", +"_@ c #395435", +":@ c #FDFDFD", +"<@ c #FEFEFE", +"[@ c #FCFCFC", +"}@ c #F4F4F4", +"|@ c #D8D8D8", +"1@ c #D1D1D1", +"2@ c #D0D0D0", +"3@ c #A5A5A5", +" ", +" ", +" . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . ", +" . + @ @ @ # $ % & * = - ; > , ' ) ! ~ { ] ^ . / ", +" . + @ @ ( $ _ & : = < ; [ , } | 1 ~ 2 3 4 5 . 6 ", +" . + @ # $ % & * 7 8 9 0 a b c ~ ~ { 3 d e f . g ", +" . + @ $ _ & * h i j k l m n o p q ] 4 e r s . t ", +" . u $ % & v w x y z A B C D E F G H I J K L . t ", +" . M _ & N O P Q R S T U V W X Y Z ` ...+.@.. t ", +" . M & N #.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.. t ", +" . (._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.^.b.c.. t ", +" . (.* d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.. t ", +" . w.x.y.z.A.B.C.D.E.l.F.G.H.I.J.K.L.M.u.N.v.. t ", +" . O.P.a Q.R.S.T.U.V.W.X.Y.Z.`. +.+++@+#+$+%+. t ", +" . O.&+*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+N._+:+<+. t ", +" . [+> } }+|+1+2+3+4+5+6+7+8+9+0+a+b+$+c+d+e+. t ", +" . [+} f+1 g+h+i+j+k+l+m+n+o+p+q+r+s+:+t+u+v+. t ", +" . w+| 1 ! 2 x+y+z+A+B+C+D+E+F+G+H+I+d+u+J+K+. t ", +" . L+) ~ ~ { M+N+O+P+Q+R+S+T+U+V+W+d+X+J+Y+Z+. t ", +" . `+! 2 @4 d .@+@E+@@#@$@%@&@*@d+u+=@-@;@>@. t ", +" . ,@~ { 4 '@e J )@!@~@{@]@^@/@(@X+J+_@;@;@>@. t ", +" . . . . . :@. . . . . . . . . . . . . <@. . . t ", +" . . . . . <@<@. . . . . . . . . . . . <@. . . t ", +" . . . . . . . :@. . . . . . . . . . [@. . . . t ", +" . . . . . . . . . . . . . . . . . <@<@. . . . t ", +" }@|@1@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@3@ ", +" ", +" ", +" ", +" ", +" "}; --- gdm-2.13.0.5.orig/debian/prerm +++ gdm-2.13.0.5/debian/prerm @@ -0,0 +1,68 @@ +#!/bin/sh +# Debian gdm package pre-removal script +# Copyright 2001 Branden Robinson. +# Licensed under the GNU General Public License, version 2. See the file +# /usr/share/common-licenses/GPL or . +# Acknowlegements to Stephen Early, Mark Eichin, and Manoj Srivastava. + +set -e + +THIS_PACKAGE=gdm +DEFAULT_DISPLAY_MANAGER_FILE=/etc/X11/default-display-manager + +if [ "$1" = "upgrade" -o "$1" = "failed-upgrade" ]; then + touch /var/run/gdm.upgrade +fi + +if [ "$1" = "remove" -o "$1" = "deconfigure" ]; then + if [ -e /usr/share/debconf/confmodule ]; then + . /usr/share/debconf/confmodule + # disown this question + db_unregister shared/default-x-display-manager + # does the question still exist? + if db_get shared/default-x-display-manager; then + db_metaget shared/default-x-display-manager owners + db_subst shared/default-x-display-manager choices "$RET" + db_get shared/default-x-display-manager + # are we removing the currently selected display manager? + if [ "$THIS_PACKAGE" = "$RET" ]; then + if [ -e "$DEFAULT_DISPLAY_MANAGER_FILE" ]; then + db_get "$RET"/daemon_name + if [ "$(cat $DEFAULT_DISPLAY_MANAGER_FILE)" = "$RET" ]; then + rm "$DEFAULT_DISPLAY_MANAGER_FILE" + fi + fi + # ask the user to choose a new default + db_fset shared/default-x-display-manager seen false + db_input critical shared/default-x-display-manager || true + db_go + # if the display manager file doesn't exist, write it with the path + # to the new default display manager + if [ ! -e $DEFAULT_DISPLAY_MANAGER_FILE ]; then + db_get shared/default-x-display-manager + echo "Please be sure to run \"dpkg-reconfigure $RET\"." + db_get "$RET"/daemon_name + echo "$RET" > "$DEFAULT_DISPLAY_MANAGER_FILE" + fi + fi + fi + fi +fi + +if [ "$1" = "remove" ]; then + if [ -x /etc/init.d/gdm ]; then + nostop= + for hostname in "" "localhost" "$(hostname)" "$(hostname -f)"; do + if echo $DISPLAY | grep -q "^$hostname:0.*"; then + nostop=yes + fi + done + if [ -z $nostop ]; then + invoke-rc.d gdm stop + fi + fi +fi + +#DEBHELPER# + +exit 0 --- gdm-2.13.0.5.orig/debian/gdm.pam +++ gdm-2.13.0.5/debian/gdm.pam @@ -0,0 +1,8 @@ +#%PAM-1.0 +auth requisite pam_nologin.so +auth required pam_env.so +@include common-auth +@include common-account +session required pam_limits.so +@include common-session +@include common-password --- gdm-2.13.0.5.orig/debian/gdmlogin.pod +++ gdm-2.13.0.5/debian/gdmlogin.pod @@ -0,0 +1,27 @@ +=head1 NAME + +gdmlogin - GNOME Display Manager greeting window + +=head1 SYNOPSIS + +gdmlogin + +=head1 DESCRIPTION + +B is invoked by gdm(8). It displays a GNOME login window +and obtains a login/password combination from the user. This is then +sent to the controlling B process for verification. + +=head1 SEE ALSO + +gdm(8) + +=head1 AUTHOR + +Martin Kasper Petersen + +This manual page written by Steve Haslam for +Debian GNU/Linux. Updated by Raphal Hertzog . +Updated by Ryan Murray . + +=cut --- gdm-2.13.0.5.orig/debian/gdm-autologin.pam +++ gdm-2.13.0.5/debian/gdm-autologin.pam @@ -0,0 +1,8 @@ +#%PAM-1.0 +auth requisite pam_nologin.so +auth required pam_env.so +auth required pam_permit.so +@include common-account +session required pam_limits.so +@include common-session +@include common-password --- gdm-2.13.0.5.orig/debian/dirs +++ gdm-2.13.0.5/debian/dirs @@ -0,0 +1,9 @@ +var/log/gdm +var/lib/gdm +usr/share/faces +usr/share/hosts +etc/pam.d +etc/X11 +etc/gdm/Init +etc/gdm/PreSession +etc/gdm/PostSession --- gdm-2.13.0.5.orig/debian/config +++ gdm-2.13.0.5/debian/config @@ -0,0 +1,41 @@ +#!/bin/sh +# Debian gdm package configuration script +# Copyright 2000-2001 Branden Robinson. +# Licensed under the GNU General Public License, version 2. See the file +# /usr/share/common-licenses/GPL or . + +set -e + +# source debconf library +. /usr/share/debconf/confmodule + +THIS_PACKAGE=gdm +DEFAULT_DISPLAY_MANAGER_FILE=/etc/X11/default-display-manager + +# set default display manager + +db_get shared/default-x-display-manager +OLD_DEFAULT="$RET" + +db_metaget shared/default-x-display-manager owners +OWNERS="$RET" +db_metaget shared/default-x-display-manager choices +CHOICES="$RET" + +if [ "$OWNERS" != "$CHOICES" ]; then + db_subst shared/default-x-display-manager choices $OWNERS + db_fset shared/default-x-display-manager seen false +fi + +db_input high shared/default-x-display-manager || true +db_go + +# using this display manager? +db_get shared/default-x-display-manager +CURRENT_DEFAULT="$RET" +# remove the default display manager file if we're going to change it +if [ "$OLD_DEFAULT" != "$CURRENT_DEFAULT" ]; then + rm -f $DEFAULT_DISPLAY_MANAGER_FILE +fi + +exit 0 --- gdm-2.13.0.5.orig/debian/gdmDebianLogo.xpm +++ gdm-2.13.0.5/debian/gdmDebianLogo.xpm @@ -0,0 +1,947 @@ +/* XPM */ +static char * gdmDebianLogo_xpm[] = { +"233 307 637 2", +" c None", +". c #FFFFFF", +"+ c #FEFBFC", +"@ c #FDF1F5", +"# c #FBE7EE", +"$ c #FBE3EB", +"% c #FAE0E9", +"& c #FADDE7", +"* c #FBE5ED", +"= c #FFFCFD", +"- c #FFFEFE", +"; c #FCEDF2", +"> c #F8D1DE", +", c #FDF0F5", +"' c #FAE2EA", +") c #F5BED2", +"! c #F5C3D5", +"~ c #F1AAC3", +"{ c #FAE2EB", +"] c #F3B3CA", +"^ c #EB82A7", +"/ c #E34F84", +"( c #DB2264", +"_ c #E03F79", +": c #F4BDD1", +"< c #FADFE8", +"[ c #F8D2E0", +"} c #FADFE9", +"| c #FDF5F8", +"1 c #F09FBC", +"2 c #DF3773", +"3 c #D70851", +"4 c #D80D55", +"5 c #D9135A", +"6 c #D70852", +"7 c #D70751", +"8 c #D9155B", +"9 c #E8739D", +"0 c #F0A2BE", +"a c #EE94B4", +"b c #EF9BB9", +"c c #F4B9CE", +"d c #FDF3F7", +"e c #FEF7FA", +"f c #FCEFF4", +"g c #F9DCE6", +"h c #ED8FB0", +"i c #EE96B5", +"j c #FCEEF3", +"k c #FADEE8", +"l c #E977A0", +"m c #DA195E", +"n c #E34F83", +"o c #F1A8C2", +"p c #F2AFC7", +"q c #EC89AC", +"r c #E9769F", +"s c #EA80A6", +"t c #F0A1BD", +"u c #F9D9E4", +"v c #E35487", +"w c #D80F57", +"x c #E35386", +"y c #F0A3BE", +"z c #FCECF2", +"A c #FFFDFE", +"B c #F4BBD0", +"C c #E35185", +"D c #D70953", +"E c #D70952", +"F c #DE3571", +"G c #E1437B", +"H c #DE3370", +"I c #D9145A", +"J c #D80C55", +"K c #D80B54", +"L c #E1457C", +"M c #ED8FB1", +"N c #F9DAE5", +"O c #EF9CBA", +"P c #DE316E", +"Q c #EB83A8", +"R c #FCEBF1", +"S c #EB84A9", +"T c #DB1D61", +"U c #E0427A", +"V c #FEF8FA", +"W c #FBE6ED", +"X c #E978A0", +"Y c #DC2365", +"Z c #FCE9F0", +"` c #D91158", +" . c #DB1E61", +".. c #ED8EB0", +"+. c #FDF4F7", +"@. c #EF9AB8", +"#. c #EB85AA", +"$. c #F0A0BD", +"%. c #EC86AA", +"&. c #DB1F62", +"*. c #E1477E", +"=. c #DC2868", +"-. c #E4588A", +";. c #F1AAC4", +">. c #F6CADA", +",. c #E24B81", +"'. c #DC2767", +"). c #F9D8E3", +"!. c #F6C4D6", +"~. c #D9165B", +"{. c #F7CDDC", +"]. c #E56090", +"^. c #E45689", +"/. c #ED90B1", +"(. c #FEFCFD", +"_. c #F0A0BC", +":. c #DD2C6B", +"<. c #D81057", +"[. c #FAE1EA", +"}. c #DD2B6A", +"|. c #DA1A5F", +"1. c #DA195D", +"2. c #FCEDF3", +"3. c #E03E77", +"4. c #D80A53", +"5. c #D80C54", +"6. c #E04079", +"7. c #E2497F", +"8. c #E1467D", +"9. c #E03C76", +"0. c #EA7FA5", +"a. c #FBE4EC", +"b. c #DB2164", +"c. c #E55B8C", +"d. c #EC8CAE", +"e. c #F3B6CC", +"f. c #F7CFDE", +"g. c #EE93B3", +"h. c #F2B1C8", +"i. c #FEF7F9", +"j. c #F9DCE7", +"k. c #F4BCD0", +"l. c #E76D98", +"m. c #D91259", +"n. c #E45587", +"o. c #F9D7E3", +"p. c #DC2667", +"q. c #DA175C", +"r. c #E9759E", +"s. c #F7CFDD", +"t. c #FFFDFD", +"u. c #FCEAF0", +"v. c #FDF4F8", +"w. c #ED8DAF", +"x. c #E24A80", +"y. c #DF3A75", +"z. c #F6C7D8", +"A. c #E45588", +"B. c #D80E56", +"C. c #F3B5CB", +"D. c #E03F78", +"E. c #F8D1DF", +"F. c #FBE8EF", +"G. c #EC8BAD", +"H. c #DC2364", +"I. c #F0A4BF", +"J. c #FEF9FB", +"K. c #F9DBE6", +"L. c #EE98B7", +"M. c #DB2163", +"N. c #E76B97", +"O. c #EA7AA2", +"P. c #DC2466", +"Q. c #ED92B2", +"R. c #FFFEFF", +"S. c #F7D0DE", +"T. c #DF3572", +"U. c #DD2E6D", +"V. c #EE97B6", +"W. c #DA1B5F", +"X. c #DE326F", +"Y. c #E35084", +"Z. c #F5BFD2", +"`. c #E1427A", +" + c #D70A53", +".+ c #E86D99", +"++ c #F4BBCF", +"@+ c #F2ACC4", +"#+ c #E66291", +"$+ c #F6C6D7", +"%+ c #DC2465", +"&+ c #ED91B2", +"*+ c #DA1C60", +"=+ c #FBE3EC", +"-+ c #DF3B76", +";+ c #DF3974", +">+ c #E03D77", +",+ c #E55C8D", +"'+ c #E9739D", +")+ c #DA185D", +"!+ c #F2ADC5", +"~+ c #E45688", +"{+ c #F4BACF", +"]+ c #DE2F6D", +"^+ c #F8D6E2", +"/+ c #D9165C", +"(+ c #E86F9A", +"_+ c #E24E83", +":+ c #E34E83", +"<+ c #E4598A", +"[+ c #ED8CAF", +"}+ c #F6C5D6", +"|+ c #DB1D60", +"1+ c #E24D82", +"2+ c #F6C9D9", +"3+ c #F9D8E4", +"4+ c #EB81A7", +"5+ c #DD2969", +"6+ c #F2B0C8", +"7+ c #F8D2DF", +"8+ c #DB2063", +"9+ c #DF3873", +"0+ c #E76996", +"a+ c #E86E99", +"b+ c #E0417A", +"c+ c #FDF0F4", +"d+ c #FDF3F6", +"e+ c #E76895", +"f+ c #FEFAFB", +"g+ c #E2487F", +"h+ c #FDF2F6", +"i+ c #D80D56", +"j+ c #F0A3BF", +"k+ c #E978A1", +"l+ c #E1427B", +"m+ c #DD2B6B", +"n+ c #F8D3E0", +"o+ c #FEF6F9", +"p+ c #F7CADA", +"q+ c #DE306E", +"r+ c #F5C0D3", +"s+ c #E45789", +"t+ c #F7CCDB", +"u+ c #DC2566", +"v+ c #EC87AB", +"w+ c #EC8BAE", +"x+ c #D91359", +"y+ c #F1A5C0", +"z+ c #F1A7C2", +"A+ c #E45A8B", +"B+ c #DD2E6C", +"C+ c #F3B7CC", +"D+ c #E1447C", +"E+ c #DD2A69", +"F+ c #EA79A1", +"G+ c #EE95B5", +"H+ c #E8729C", +"I+ c #E979A1", +"J+ c #FEFAFC", +"K+ c #F5BED1", +"L+ c #F6C8D8", +"M+ c #E24C82", +"N+ c #F4BACE", +"O+ c #E55D8D", +"P+ c #E45487", +"Q+ c #EA7EA5", +"R+ c #DF3672", +"S+ c #E76C98", +"T+ c #F8D4E1", +"U+ c #FBE6EE", +"V+ c #DC2768", +"W+ c #DF3772", +"X+ c #EF9FBB", +"Y+ c #E66694", +"Z+ c #F2ACC5", +"`+ c #F5C1D4", +" @ c #F8D5E2", +".@ c #E1457D", +"+@ c #F9DBE5", +"@@ c #EF99B7", +"#@ c #EF9EBB", +"$@ c #F4B8CD", +"%@ c #FEF6F8", +"&@ c #E24C81", +"*@ c #EF99B8", +"=@ c #E66593", +"-@ c #F5C2D4", +";@ c #DD2F6D", +">@ c #E66392", +",@ c #F5C1D3", +"'@ c #F7CEDC", +")@ c #E55F8F", +"!@ c #EE99B7", +"~@ c #F7CBDA", +"{@ c #E76A96", +"]@ c #F3B1C9", +"^@ c #DE316F", +"/@ c #EC8AAD", +"(@ c #F0A2BD", +"_@ c #F1A6C1", +":@ c #EE98B6", +"<@ c #F6C8D9", +"[@ c #E55E8E", +"}@ c #F8D0DE", +"|@ c #E8709B", +"1@ c #F4B7CD", +"2@ c #F3B4CA", +"3@ c #F7CEDD", +"4@ c #F6C5D7", +"5@ c #EB82A8", +"6@ c #EB80A6", +"7@ c #FDEFF4", +"8@ c #EF9CB9", +"9@ c #E1467E", +"0@ c #E66190", +"a@ c #E03E78", +"b@ c #E66391", +"c@ c #EA7CA3", +"d@ c #F1A9C3", +"e@ c #F2AEC6", +"f@ c #DD2D6B", +"g@ c #F7CBDB", +"h@ c #FEFBFD", +"i@ c #FCEFF3", +"j@ c #DA1C5F", +"k@ c #EB81A6", +"l@ c #F0A5C0", +"m@ c #DC2969", +"n@ c #E9779F", +"o@ c #D91258", +"p@ c #F3B7CD", +"q@ c #E55C8C", +"r@ c #F1A9C2", +"s@ c #F8D5E1", +"t@ c #DD2A6A", +"u@ c #FCEAF1", +"v@ c #E5608F", +"w@ c #F9DDE7", +"x@ c #FCECF1", +"y@ c #F9D6E3", +"z@ c #F2ADC6", +"A@ c #E8719B", +"B@ c #EF9DBA", +"C@ c #EB85A9", +"D@ c #FEF9FA", +"E@ c #E24B80", +"F@ c #F1ABC4", +"G@ c #FBE9F0", +"H@ c #EC88AB", +"I@ c #EC88AC", +"J@ c #FBE9EF", +"K@ c #EA7EA4", +"L@ c #E04179", +"M@ c #F9D9E5", +"N@ c #D80F56", +"O@ c #F3B2C9", +"P@ c #DA165C", +"Q@ c #EE96B6", +"R@ c #DF3B75", +"S@ c #F1A7C1", +"T@ c #EA7FA6", +"U@ c #E76794", +"V@ c #DF3874", +"W@ c #F6C7D7", +"X@ c #EA7BA2", +"Y@ c #E55A8C", +"Z@ c #DB2365", +"`@ c #E9749D", +" # c #DD2D6C", +".# c #EE93B4", +"+# c #EA7BA3", +"@# c #E66693", +"## c #E35286", +"$# c #DE3470", +"%# c #E76A97", +"&# c #E86E9A", +"*# c #EA7DA4", +"=# c #F4B8CE", +"-# c #E4598B", +";# c #DA1A5E", +"># c #EA7AA1", +",# c #EB84A8", +"'# c #FEFEFE", +")# c #FAFAFA", +"!# c #AAAAAA", +"~# c #9F9F9F", +"{# c #EFEFEF", +"]# c #919191", +"^# c #5C5C5C", +"/# c #CFCFCF", +"(# c #797979", +"_# c #1D1D1D", +":# c #000000", +"<# c #BABABA", +"[# c #5F5F5F", +"}# c #0C0C0C", +"|# c #4C4C4C", +"1# c #FBFBFB", +"2# c #E2E2E2", +"3# c #BCBCBC", +"4# c #8D8D8D", +"5# c #585858", +"6# c #1A1A1A", +"7# c #ADADAD", +"8# c #F9F9F9", +"9# c #D1D1D1", +"0# c #999999", +"a# c #131313", +"b# c #5D5D5D", +"c# c #CDCDCD", +"d# c #242424", +"e# c #090909", +"f# c #C4C4C4", +"g# c #E8E8E8", +"h# c #717171", +"i# c #4B4B4B", +"j# c #292929", +"k# c #080808", +"l# c #6D6D6D", +"m# c #757575", +"n# c #D8D8D8", +"o# c #C6C6C6", +"p# c #7C7C7C", +"q# c #F0F0F0", +"r# c #101010", +"s# c #010101", +"t# c #E9E9E9", +"u# c #787878", +"v# c #878787", +"w# c #575757", +"x# c #050505", +"y# c #F4F4F4", +"z# c #DDDDDD", +"A# c #949494", +"B# c #8C8C8C", +"C# c #0A0A0A", +"D# c #9E9E9E", +"E# c #ABABAB", +"F# c #161616", +"G# c #565656", +"H# c #A6A6A6", +"I# c #BFBFBF", +"J# c #202020", +"K# c #B0B0B0", +"L# c #2B2B2B", +"M# c #989898", +"N# c #B8B8B8", +"O# c #D4D4D4", +"P# c #353535", +"Q# c #AFAFAF", +"R# c #C0C0C0", +"S# c #DBDBDB", +"T# c #3C3C3C", +"U# c #454545", +"V# c #CECECE", +"W# c #DADADA", +"X# c #D2D2D2", +"Y# c #525252", +"Z# c #E1E1E1", +"`# c #D9D9D9", +" $ c #5A5A5A", +".$ c #DEDEDE", +"+$ c #EEEEEE", +"@$ c #E3E3E3", +"#$ c #DFDFDF", +"$$ c #FCFCFC", +"%$ c #F8F8F8", +"&$ c #F1F1F1", +"*$ c #F7F7F7", +"=$ c #E6E6E6", +"-$ c #B1B1B1", +";$ c #ECECEC", +">$ c #F2F2F2", +",$ c #9B9B9B", +"'$ c #D0D0D0", +")$ c #C5C5C5", +"!$ c #E7E7E7", +"~$ c #9D9D9D", +"{$ c #5E5E5E", +"]$ c #2D2D2D", +"^$ c #0D0D0D", +"/$ c #030303", +"($ c #040404", +"_$ c #0F0F0F", +":$ c #2F2F2F", +"<$ c #606060", +"[$ c #C2C2C2", +"}$ c #616161", +"|$ c #E4E4E4", +"1$ c #4E4E4E", +"2$ c #323232", +"3$ c #727272", +"4$ c #D6D6D6", +"5$ c #777777", +"6$ c #313131", +"7$ c #0E0E0E", +"8$ c #3F3F3F", +"9$ c #898989", +"0$ c #3E3E3E", +"a$ c #020202", +"b$ c #F3F3F3", +"c$ c #BEBEBE", +"d$ c #373737", +"e$ c #181818", +"f$ c #060606", +"g$ c #333333", +"h$ c #CBCBCB", +"i$ c #1B1B1B", +"j$ c #B9B9B9", +"k$ c #959595", +"l$ c #343434", +"m$ c #7D7D7D", +"n$ c #DCDCDC", +"o$ c #4F4F4F", +"p$ c #696969", +"q$ c #303030", +"r$ c #B3B3B3", +"s$ c #EAEAEA", +"t$ c #707070", +"u$ c #A9A9A9", +"v$ c #838383", +"w$ c #B5B5B5", +"x$ c #929292", +"y$ c #424242", +"z$ c #474747", +"A$ c #CACACA", +"B$ c #B2B2B2", +"C$ c #121212", +"D$ c #8A8A8A", +"E$ c #545454", +"F$ c #6A6A6A", +"G$ c #6C6C6C", +"H$ c #F5F5F5", +"I$ c #C9C9C9", +"J$ c #D5D5D5", +"K$ c #404040", +"L$ c #EBEBEB", +"M$ c #C1C1C1", +"N$ c #E0E0E0", +"O$ c #393939", +"P$ c #CCCCCC", +"Q$ c #F6F6F6", +"R$ c #2C2C2C", +"S$ c #414141", +"T$ c #747474", +"U$ c #212121", +"V$ c #494949", +"W$ c #1E1E1E", +"X$ c #B4B4B4", +"Y$ c #FDFDFD", +"Z$ c #626262", +"`$ c #3A3A3A", +" % c #232323", +".% c #767676", +"+% c #2A2A2A", +"@% c #1F1F1F", +"#% c #4A4A4A", +"$% c #555555", +"%% c #434343", +"&% c #8E8E8E", +"*% c #5B5B5B", +"=% c #0B0B0B", +"-% c #151515", +";% c #070707", +">% c #282828", +",% c #AEAEAE", +"'% c #A5A5A5", +")% c #888888", +"!% c #111111", +"~% c #222222", +"{% c #272727", +"]% c #B7B7B7", +"^% c #656565", +"/% c #7B7B7B", +"(% c #464646", +"_% c #808080", +":% c #BBBBBB", +"<% c #D7D7D7", +"[% c #7F7F7F", +"}% c #737373", +"|% c #171717", +"1% c #A0A0A0", +"2% c #262626", +"3% c #191919", +"4% c #848484", +"5% c #A1A1A1", +"6% c #1C1C1C", +"7% c #6F6F6F", +"8% c #6B6B6B", +"9% c #141414", +"0% c #EDEDED", +"a% c #979797", +"b% c #A3A3A3", +"c% c #A2A2A2", +"d% c #868686", +"e% c #444444", +"f% c #7E7E7E", +"g% c #636363", +"h% c #E5E5E5", +"i% c #C3C3C3", +"j% c #3D3D3D", +"k% c #A4A4A4", +"l% c #C8C8C8", +"m% c #939393", +"n% c #363636", +"o% c #B6B6B6", +"p% c #909090", +"q% c #515151", +"r% c #505050", +"s% c #8F8F8F", +"t% c #383838", +"u% c #A8A8A8", +"v% c #858585", +"w% c #818181", +"x% c #ACACAC", +"y% c #828282", +"z% c #686868", +"A% c #8B8B8B", +"B% c #666666", +"C% c #969696", +"D% c #6E6E6E", +"E% c #A7A7A7", +"F% c #535353", +"G% c #D3D3D3", +"H% c #9C9C9C", +"I% c #676767", +"J% c #2E2E2E", +"K% c #484848", +"L% c #BDBDBD", +"M% c #C7C7C7", +"N% c #9A9A9A", +"O% c #646464", +"P% c #4D4D4D", +"Q% c #7A7A7A", +"R% c #595959", +"S% c #252525", +"T% c #3B3B3B", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + @ # $ % & * = . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - ; > , . . . ' ) * = . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - ! ~ = { ] ^ / ( _ : . . . . + < [ } | . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 1 2 3 4 5 6 7 7 8 9 0 a b c & d e f g h i - . . . . . ] j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . k l m 7 7 7 7 7 7 7 7 6 7 7 7 7 7 6 n o # - - k p q r s t u v w x y z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A B C D 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 E F G G H I 7 7 7 7 7 7 7 J 7 7 7 K L M N - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | O P 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 P Q u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . R S T 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 E U o V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W X I 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 Y M d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Z l ` 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 ...+.. . u @.#.$.& . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | %.8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 &.*.=.6 7 7 7 6 -.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - ;.Y 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 >.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . & ,.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 '.).R !.- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A @.5 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 ~.y {.].g . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . f ^.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 / t 5 /.(.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . , _.N :.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 <.6 7 L [.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ L }.|.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1.] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 4.6 7 7 5. .H 6.7./ 7.8.9.:.1.K 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 6 0.= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a.H 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 b.c.d.e.f.u g.h.N i.. . . . . . . . . . | j.k.i l.3.m.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 n.d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o.p.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 q.r.s.t.. u.$ v.. . . . . . . . . . . . . . . . . . . . . V >.w.x.<.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 y.# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . z.|.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 J r 2.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ ;.A.B.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 }.k . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C.m.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 D.E.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . F.G.H.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 Y N . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I.J 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 H ~ A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . J.@.&.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 ( K.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L.D 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 M.N.! - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . d O.4 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 P.{ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /.6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 q h.r.Q.R.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S.T.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 U.z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V.6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 4.W.X.Y.O.Z.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 9 E 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 `.i.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 I .+++; A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @+I 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 #+- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . $+w 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 D .+R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S.%+7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 &+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . R ( 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 *+B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . =+X.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 4 !.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ].7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 P } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; -+7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 %+j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E.E 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 ;+# J.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . , >+7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 ,+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . '+7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 )+@.].J.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; F 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 !+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~+4.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 m.G -.K.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W p.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 &.j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . {+7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 ]+$.d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ^+/+7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 (+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 q.@.+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 K [ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !.3 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 _+W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . q 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 :+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . <+7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 5.[+A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A _+7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 6 }+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - . . . . . . . . { 4 7 7 7 7 7 7 7 7 7 7 7 7 7 7 m k.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . F.|+7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2+].3+. . . . . . 4+7 7 7 7 7 7 7 7 7 7 7 7 7 7 5+u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6+3 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 E 7+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0 5.u.. . . . . V 8+7 7 7 7 7 7 7 7 7 7 7 7 7 9+F.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ,+7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 0+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a+v . . . . . . o 7 7 7 7 7 7 7 7 7 7 7 7 7 b+c+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W q.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 5 d+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ e+z . . . . . f+H 7 7 7 7 7 7 7 7 7 7 7 7 g+h+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . &+7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 i+7 7 E j+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . f A . . . . . . k+7 7 7 7 7 7 7 7 7 7 7 7 l++.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V m+7 7 7 7 7 7 7 7 7 7 7 m+ .;+V.7 7 r 4+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . h ,+7 7 7 7 7 7 7 7 7 7 7 7 >+@ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~ 7 7 7 7 7 7 7 7 7 7 /+f+. R.(.-+7 e+n+o+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p+6 7 7 7 7 7 7 7 7 7 7 7 7 q+z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . = X.7 7 7 7 7 7 7 7 7 <.i.. . . r+6 L . A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . s+7 7 7 7 7 7 7 7 7 7 7 7 Y { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . j+7 7 7 7 7 7 7 7 7 7 t+. . . R.*.u+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u K 7 7 7 7 7 7 7 7 7 7 7 8 E.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . J.8+7 7 7 7 7 7 7 7 7 v+. . . . k.u+- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .+7 7 7 7 7 7 7 7 7 7 7 K e.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q 7 7 7 7 7 7 7 7 7 P.{+w+. . - C = . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; x+7 7 7 7 7 7 7 7 7 7 7 [+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ n+{+p y+z+e.S., . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % D 7 7 7 7 7 7 7 7 7 7 <.$ . . b ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /.7 7 7 7 7 7 7 7 7 7 7 A+- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +.p e+B+K 7 7 7 7 7 7 7 K ]+.+C+V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D+7 7 7 7 7 7 7 7 7 7 7 [+. . @ l . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A :.7 7 7 7 7 7 7 7 7 7 E+, . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E.0+8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 *+F+[.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . G+7 7 7 7 7 7 7 7 7 7 7 H+. . . I+= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . J+t+. . . K+7 7 7 7 7 7 7 7 7 7 4.L+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3+v E 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 B.(+R . . . . . . . . . . . . . . . . . . . . . . . . . . . . k 6 7 7 7 7 7 7 7 7 7 7 M+. . . N+L+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . M }+. . . O+7 7 7 7 7 7 7 7 7 7 P++.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V Q+4 7 7 7 7 7 7 7 E R+S+@.{+T+[.U+% s.C./.#+V+7 7 1.0 - . . . . . . . . . . . . . . . . . . . . . . . . . . - }.7 7 7 7 7 7 7 7 7 7 *+= . . J+/.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A u+c+. . j w 7 7 7 7 7 7 7 7 7 7 7 D+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . K.W+7 7 7 7 7 7 D 8.X+u.. . . . . . . . . . . . . g w+P 7 -.j . . . . . . . . . . . . . . . . . . . . . . . . . . Y+7 7 7 7 7 7 7 7 7 7 7 ).. . . G+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . R P . . . b 7 7 7 7 7 7 7 7 7 7 7 7 Z+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . `+m 7 7 7 7 7 w e+ @. . . . . . . . . . . . . . . . . . A K+.@B++@. . . . . . . . . . . . . . . . . . . . . . . . . @@7 7 7 7 7 7 7 7 7 R+I #@. . . $@u.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . %@(+. . . b+7 7 7 7 7 7 7 7 7 7 7 '.+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c <.7 7 7 7 4.Y+{ . . . . . . . . . . . . . . . . . . . . . . R.C+6.{.. . . . . . . . . . . . . . . . . . . . . . . . !.7 7 7 7 7 7 7 7 7 &@*@=@. . . +.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A -@. . % +7 7 7 7 7 7 7 7 7 7 7 *@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+x+7 7 7 7 ;@z.. . . . . . . . . . . . . . . . . . . . . . . . . . v.Q+ @. . . . . . . . . . . . . . . . . . . . . . . F.3 7 7 7 7 7 7 7 7 m.@ N.. . . . N+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + . . [+7 7 7 7 7 7 7 7 7 7 7 %+V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . R %+7 7 7 7 >@+.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ,@f . . . . . . . . . . . . . . . . . . . . . . J.m.7 7 7 7 7 7 7 7 7 p | . . . . '@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . y.7 7 7 7 7 7 7 7 7 7 7 b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . )@7 7 7 E d.- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . J.. . . . . . . . . . . . . . . . . . . . . . . &.7 7 7 7 7 7 7 7 7 1+. . . . . U+J.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < D 7 7 7 7 7 7 7 7 7 7 :.J.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . $+6 7 7 E !@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..7 7 7 7 7 7 7 7 7 E ~@. . . . - i.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . &+7 7 7 7 7 7 7 7 7 7 7 ;.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @:.7 7 7 h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C.7 7 7 7 7 7 7 7 7 7 T.d+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . G 7 7 7 7 7 7 7 7 7 7 9+= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o.m 7 7 7 {@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ]@7 7 7 7 7 7 7 7 7 7 ^ + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . F.5.7 7 7 7 7 7 7 7 7 7 e.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e ^@7 7 7 2 e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C.7 7 7 7 7 7 7 7 7 7 ,@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t 7 7 7 7 7 7 7 7 7 7 R+A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /@7 7 7 B.T+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C.7 7 7 7 7 7 7 7 7 7 k.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.7 7 7 7 7 7 7 7 7 7 (@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . h+)+7 7 7 Q+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . k.7 7 7 7 7 7 7 7 7 7 _@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o+5 7 7 7 7 7 7 7 7 7 ` d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :@7 7 7 &.h+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ! 7 7 7 7 7 7 7 7 7 7 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t.E+7 7 7 7 7 7 7 7 7 ,.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W+7 7 7 &+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . <@7 7 7 7 7 7 7 7 7 7 F h+} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [@7 7 7 7 7 7 7 7 7 r . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T+6 7 7 )+h+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . }@7 7 7 7 7 7 7 7 7 7 7 B.b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . r 7 7 7 7 7 7 7 7 7 w+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.7 7 7 |@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . }@7 7 7 7 7 7 7 7 7 7 7 4 F.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ^ 7 7 7 7 7 7 7 7 7 t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t.5+7 7 7 ~@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . }@7 7 7 7 7 7 7 7 7 7 7 A.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . q 7 7 7 7 7 7 7 7 7 c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Z.7 7 7 u+t.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1@. . . . . . . . . . . . . . . . . . S.7 7 7 7 7 7 7 7 7 7 7 2@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . q 7 7 7 7 7 7 7 7 7 [ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . = D+7 7 7 e+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3@B.+.. . . . . . . . . . . . . . . . . 4@7 7 7 7 7 7 7 7 7 7 |.V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5@7 7 7 7 7 7 7 7 7 ; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . y+7 7 7 7 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I.D ; . . . . . . . . . . . . . . . . . $@7 7 7 7 7 7 7 7 7 7 O+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q+7 7 7 7 7 7 7 7 ` . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6@7 7 7 7 T+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | m 7@. . . . . . . . . . . . . . . . . I.7 7 7 7 7 7 7 7 7 7 G+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . r 7 7 7 7 7 7 7 7 }.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Y+7 7 7 K o+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8@A . . . . . . . . . . . . . . . . . q 7 7 7 7 7 7 7 7 B+8+{+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |@7 7 7 7 7 7 7 7 9@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Y.7 7 7 8+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . =@7 7 7 7 7 7 7 7 6.Q+2+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0+7 7 7 7 7 7 7 7 0@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a@7 7 7 F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . #+J 7 7 7 7 7 7 7 G & !.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b@7 7 7 7 7 7 7 7 c@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ^@7 7 7 D.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ d@J 7 7 7 7 7 7 H j.. g . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O+7 7 7 7 7 7 7 7 i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . }.7 7 7 D.f+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . j.[.3 7 7 7 7 7 7 6.U+. o+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . s+7 7 7 7 7 7 7 7 e@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5+7 7 7 2 Z+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A -@7 7 7 7 7 7 7 1+N . . + 2.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v 7 7 7 7 7 7 7 7 }+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . f@7 7 7 E ,.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . w.7 7 7 7 7 7 7 a+{.. . $+@ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v 7 7 7 7 7 7 7 7 j.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 7 7 7 7 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . d . . . . . . . . . . . . . . . . . . . . g+7 7 7 7 7 7 7 0 g@. . C.- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v 7 7 7 7 7 7 7 7 c+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x.7 7 7 7 &.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . h@i@. % . . . . . . . . . . . . . . . . . . . # 4 7 7 7 7 7 7 4.* n+. . {+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . <+7 7 7 7 7 7 7 w J+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0@7 7 7 7 4.j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0 V * k . . . . . . . . . . . . . . . . . . . M 7 7 7 7 7 7 7 *.= a.. . N+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . )@7 7 7 7 7 7 7 j@A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . k@7 7 7 7 7 $+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -@p . l@- . . . . . . . . . . . . . . . . . . A q+7 7 7 7 7 7 7 @+i.. . o+<@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S+7 7 7 7 7 7 7 =.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 7 7 7 7 7 ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V (+- K.Z+. . . . . . . . . . . . . . . . . . . $+7 7 7 7 7 7 7 m@f+. . . {.d+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . l.7 7 7 7 7 7 7 X.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3+7 7 7 7 7 n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I.T+@ n@f+. . . . . . . . . . . . . . . . . . . 0+7 7 7 7 7 7 7 b . . . . $+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . #+7 7 7 7 7 7 7 y.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + T 7 7 7 7 o@d+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p@/.( {+. . . . . . . . . . . . . . . . . . T+A+D 7 7 7 7 7 7 u+i.. . . . 2+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O+7 7 7 7 7 7 7 >+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . q@7 7 7 7 7 o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . U+q . . . . . . . . . . . . . . . . . . _.D 7 7 7 7 7 7 7 7 @@. . . . z } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v 7 7 7 7 7 7 7 >+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . r@7 7 7 7 7 ,.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A f@7 7 7 7 7 7 7 7 .o+. . . . E.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v 7 7 7 7 7 7 7 F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . h+I 7 7 7 7 D ^+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . j.7 7 7 7 7 7 7 7 7 c@. . . . . s@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . <+7 7 7 7 7 7 7 t@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . {@7 7 7 7 7 =@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * E 7 7 7 7 7 K =.7 3@. . . . u@j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v@7 7 7 7 7 7 7 m t.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t. @ +7 7 7 7 K 3+. . . . . . . . . . . . . . . . . . . J.^+w@u@; F.s@e.c . . . . . . . . . . . . . . . . . . . . . . . . . . x@4.7 7 7 7 7 l o.m + . . . . k . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0+7 7 7 7 7 7 7 E d+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . y@R.A+7 7 7 7 7 Y.. . . . . . . . . . . . . . . . . . . [.M+ +E +6 7 x., . . . . . . . . . . . . . . . . . . . . . . . . . . j+7 7 7 7 7 %+d . z@. . . . + U+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . r.7 7 7 7 7 7 7 7 s.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u@$+K.i+7 7 7 7 7 p . . . . . . . . . . . . . . . . . . . . * 1 >@X.A@f+. . . . . . . . . . . . . . . . . . . . . . . . . . ) /+7 7 7 7 7 B@. . . . . . . F.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C@7 7 7 7 7 7 7 7 B@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . G+V 0.7 7 7 7 7 .u.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~ B.7 7 7 7 7 <.h+. . . . . . - j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L.7 7 7 7 7 7 7 7 c.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . J.. . ' 0.i.X.7 7 7 7 7 _+= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . g.E 7 7 7 7 7 7 )+(.. . . . . . V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e@7 7 7 7 7 7 7 7 ` f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D@c@. . . [+o+7+` 7 7 7 7 7 Q+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . = X 3 7 7 7 7 7 7 w 2 F.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . z.7 7 7 7 7 7 7 7 7 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . n+w k . . +.{.. t 6 7 7 7 7 6 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o+,+7 7 7 7 7 7 7 m !.E@+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . =+7 7 7 7 7 7 7 7 7 4 # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . J+D.A+. D@+ J.. . I+7 7 7 7 7 K F@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . G@6.7 7 7 7 7 7 7 *+s.. : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V m.7 7 7 7 7 7 7 7 E ; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . N I Z.= I+h+. . t.0@7 7 7 7 7 K j+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A A . E.'.7 7 7 7 7 7 7 *+n+. f+f+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . U.7 7 7 7 7 7 7 7 ` A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L.P V E.&@i.. . f+s+7 7 7 7 7 E H@- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . R C.- I.` 7 7 7 7 7 7 7 8+T+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v 7 7 7 7 7 7 7 7 =.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A _+I@. /.,+= - . f+A+7 7 7 7 7 7 c.c+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u S J@0@7 7 7 7 7 7 7 7 =.K.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . K@7 7 7 7 7 7 7 7 L@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . F.:.k A ,+O.i.& . + 0+7 7 7 7 7 7 t@-@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . f.T >+q.7 7 7 7 7 7 7 7 y.* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . d@7 7 7 7 7 7 7 7 I ; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2+0@. | G V.3@>.. A ^ 6 7 7 7 7 7 4.S+x@. . . . . . . . . . . . . . . . . . . . . . . . . . . $@q.7 7 7 7 7 7 7 7 7 7 =@| . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . M@7 7 7 7 7 7 7 7 7 %.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ++3@. j 9.Z+g.$+. . j+N@7 7 7 7 7 7 )+/@h+. . . . . . . . . . . . . . . . . . . . . . . } =@E 7 7 7 7 7 7 7 7 7 m.0 R.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . J+)+7 7 7 7 7 7 7 7 *+, . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i.. . j g+O@)@]@. . $+&.7 7 7 7 7 7 7 )+O.K.. . . . . . . . . . . . . . . . . E.z o C K 7 7 7 7 7 7 7 7 7 7 `.3+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x.7 7 7 7 7 7 7 7 ( p@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . %@[@#@G H@t.. a.3.7 7 7 7 7 7 7 7 6 D.w.[ h@. . . . . . . . . - % G+D.7 D 7 7 7 7 7 7 7 7 7 7 7 P@Q@t.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ^ 7 7 7 7 7 7 7 7 :.- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t.Q H+R@:+F.. e a+6 7 7 7 7 7 7 7 7 7 7 m L S+q @.y t g.O.v '.3 7 7 7 7 7 7 7 7 7 7 7 7 7 J a+u.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Z.7 7 7 7 7 7 7 7 3 {.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . $@a@N@j@S@A . 1 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 w e+N . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | ` 7 7 7 7 7 7 7 7 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . F.-.7 7 L p+@ |@t@7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 %+0.=+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . g+7 7 7 7 7 7 7 7 W.| . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . R.p %+7 E ;+M+h+g@T@;+E 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 T U@$@+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . h 7 7 7 7 7 7 7 7 7 b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v.5@I 7 7 V@k . . G@h.I+L W.6 7 7 7 7 7 7 7 7 7 7 7 7 E ( P+..>.(.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o.7 7 7 7 7 7 7 7 7 Y d+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . F.l 5 7 ~.#@t.. . . . . u.W@!+a S X@|@'+O.Q V.e@p+@ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :.7 7 7 7 7 7 7 7 7 v@+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . z I@P.7 D.6+| . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . X@7 7 7 7 7 7 7 7 7 7 W+X@t c+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . J+e.Y@x+I x /.$+c+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . {.7 7 7 7 7 7 7 7 7 7 7 7 7 Z@n+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . h+O@S+f@E 5.%+D+)@`@S h V.V.V.L.-@t.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - #7 7 7 7 7 7 7 7 7 7 7 7 7 u+; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . R.u.k..#9 A+1+7.1+O++#S@{ R.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C@7 7 7 7 7 7 7 7 7 7 7 7 7 7 @#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < +7 7 7 7 7 7 7 7 7 7 7 7 7 E s.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x.7 7 7 7 7 7 7 7 7 7 7 7 7 7 ##. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !+7 7 7 7 7 7 7 7 7 7 7 7 <.( E T+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V ( 7 7 7 7 7 7 7 7 7 7 7 6 O@ .e+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C@7 7 7 7 7 7 7 7 7 7 7 7 H@# F+i.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u.` 7 7 7 7 7 7 7 7 7 7 7 M.i.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S+7 7 7 7 7 7 7 7 7 7 7 7 g.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . & 5.7 7 7 7 7 7 7 7 7 7 7 W.2.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v@7 7 7 7 7 7 7 7 7 7 7 7 {@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3+K 7 7 7 7 7 7 7 7 7 7 7 D : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . =@7 7 7 7 7 7 7 7 7 7 7 7 %+z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % w 7 7 7 7 7 7 7 7 7 7 7 )+3+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . X 7 7 7 7 7 7 7 7 7 7 7 X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . j *+7 7 7 7 7 7 7 7 7 7 I K.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . *@7 7 7 7 7 7 7 7 7 7 7 X.u.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + ;+7 7 7 7 7 7 7 7 7 7 7 $#M@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L+4.7 7 7 7 7 7 7 7 7 7 %#u.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  7 7 7 7 7 7 7 7 7 *+h+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ %+7 7 7 7 7 7 7 7 7 7 *#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . =#6 7 7 7 7 7 7 7 7 7 4 7+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . {@7 7 7 7 7 7 7 7 7 7 9+J.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . d+m+7 7 7 7 7 7 7 7 7 7 c@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . >.4 7 7 7 7 7 7 7 7 7 4.: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..7 7 7 7 7 7 7 7 7 7 8+F.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A v 7 7 7 7 7 7 7 7 7 7 ,.(.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . j }.7 7 7 7 7 7 7 7 7 7 v+. A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . n+I 7 7 7 7 7 7 7 7 7 5.! b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6+E 7 7 7 7 7 7 7 7 7 /+P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . w+7 7 7 7 7 7 7 7 7 7 6 3@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - N.7 7 7 7 7 7 7 7 7 7 A.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . J+v 7 7 7 7 7 7 7 7 7 6 {+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | G 7 7 7 7 7 7 7 7 7 p.c+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c+R@7 7 7 7 7 7 7 7 7 O+- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; 2 7 7 7 7 7 7 7 7 7 i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . z 2 7 7 7 7 7 7 7 7 4 ##7.0+- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.>+7 7 7 7 7 7 7 7 7 7 7 @.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . h+g+7 7 7 7 7 7 7 7 7 7 4 ++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i.,+7 7 7 7 7 7 7 7 7 7 x+c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . = l 3 7 7 7 7 7 7 7 7 7 4 G+- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b 4 7 7 7 7 7 7 7 7 7 7 x.>.- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ,@|+7 7 7 7 7 7 7 7 7 7 E h.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . { 3.7 7 7 7 7 7 7 7 7 l.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . J.`@E 7 7 7 7 7 7 7 ;+a j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C. .7 7 7 7 7 7 7 7 8 /@+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u.-#7 7 7 7 7 7 7 7 7 x.F.. . U+A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - o *+7 7 7 7 7 7 7 7 ;#/.+.c+s t.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . R =@E 7 7 7 7 7 7 7 7 ;#r (+N.A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . $+y.7 7 7 7 7 7 7 7 7 7 7 >#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t.j+u+7 7 7 7 7 7 7 7 7 7 v+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . %@a 8+7 7 7 7 7 7 7 7 6 ,#- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . %@i m@7 7 7 7 7 7 7 7 >@v.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . J+z@D+6 7 7 7 7 7 7 B+-@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @r .7 7 7 7 7 6 A.$+A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + k.0+ .7 7 7 7 7 %+A@$@d+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . = ~@4+F 4.7 7 7 7 J 9+0+g.++$ = . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u.N+..{@,.X. .m.J 7 7 |.g+0.{+h+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . f+h+z { M@T+s.2+>.V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..$+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . H@3 8 $+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . '#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I@3 7 7 8 $+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . )#!#~#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . {#]#^#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I@6 7 7 7 7 8 z.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . '#/#(#_#:#]#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . )#<#[#}#:#|#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . q 6 7 7 7 7 7 7 8 z.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1#2#3#4#5#6#:#:#:#:#7#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8#9#0#5#a#:#:#:#:#b#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . q 3 7 7 7 7 7 7 7 7 8 z.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c#d#e#:#:#:#:#:#:#:#:#:#f#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . g#h#i#j#k#:#:#:#:#:#:#:#:#l#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . q 3 7 7 7 7 7 7 7 7 7 7 ~.z.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . m#:#:#:#:#:#:#:#:#:#:#n#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o#k#:#:#:#:#:#:#:#:#:#:#p#. . . . . . . . . . . . . . . . . . . . . . . . . . . . F@3 7 7 7 7 7 7 7 7 7 7 7 7 q.# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . q#r#:#:#:#:#:#:#:#:#s#t#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u#:#:#:#:#:#:#:#:#:#:#v#. . . . . . . . . . . . . . . . . . . . . . . . . . . . o+_+7 7 7 7 7 7 7 7 7 7 7 6 /.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . w#:#:#:#:#:#:#:#:#x#y#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . z#s#:#:#:#:#:#:#:#:#:#A#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . o+_+7 7 7 7 7 7 7 7 7 6 /.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B#:#:#:#:#:#:#:#:#C#'#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . '#d#:#:#:#:#:#:#:#:#:#D#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o+1+7 7 7 7 7 7 7 3 /.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E#:#:#:#:#:#:#:#:#F#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . G#:#:#:#:#:#:#:#:#:#H#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i.1+7 7 7 7 7 6 /.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I#:#:#:#:#:#:#:#:#J#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p#:#:#:#:#:#:#:#:#:#K#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i.1+7 7 7 6 /.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c#:#:#:#:#:#:#:#:#L#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . M#:#:#:#:#:#:#:#:#:#N#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i.1+7 6 M . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O#:#:#:#:#:#:#:#:#P#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q#:#:#:#:#:#:#:#:#:#R#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o+_+h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S#:#:#:#:#:#:#:#:#T#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . R#:#:#:#:#:#:#:#:#:#o#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . z#:#:#:#:#:#:#:#:#U#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V#:#:#:#:#:#:#:#:#:#c#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . z#:#:#:#:#:#:#:#:#|#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W#:#:#:#:#:#:#:#:#:#X#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . z#:#:#:#:#:#:#:#:#Y#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Z#:#:#:#:#:#:#:#:#:#`#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . z#:#:#:#:#:#:#:#:# $. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . g#:#:#:#:#:#:#:#:#:#.$. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . 1#+$@$#$@${#$$. . . z#:#:#:#:#:#:#:#:#[#. . . . . . . . . . . . . . . . . . '#{#n#V#V#9#2#%$. . . . . . . . . . . . . . &$:#:#:#:#:#:#:#:#:#@$. . . . . . . . . *$=$#$g#)#. . . . . . . . . . . . . . . . . . . . . . . . . . X#-$. . . . . . . . . . . . . . . . . . . *$;$@$#$#$g#>$'#. . . . . . . . . . . . . . . . . . . . . . . . . . . . %$,$V#. . . . . . . . 1#@$'$)$V##$*$. . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . !$~${$]$^$/$:#:#:#($_$:$<$D#[$:#:#:#:#:#:#:#:#}$. . . . . . . . . . . . . . . |$]#1$6#($:#:#:#:#s#C#2$3$f#'#. . . . . . . . . . >$:#:#:#:#:#:#:#:#:#=$. . . . . . 4$5$6$e#s#:#s#7$8$9$=$. . . . . . . . . . . . . . . . . . . . 2#M#0$a$4#. . . . . . . . . . . . . b$c$9$^#d$e$k#a$:#:#:#:#f$a#g$}$~$|$. . . . . . . . . . . . . . . . . . . . . 1#h$(#i$:#j$. . . . . {#k$U#r#s#:#:#:#:#e#l$m$n$. . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . f#o$x#:#:#:#:#:#:#:#:#:#:#:#:#:#s#:#:#:#:#:#:#:#:#p$. . . . . . . . . . . . . /#Y#($:#:#:#:#:#:#:#:#:#:#:#:#:#q$r$. . . . . . . . . y#x#:#:#:#:#:#:#:#:#s$. . . . g# $a$:#:#:#:#:#:#:#:#:#k#t$q#. . . . . . . . . . . '#t#h$u$v$w#d#a$:#:#:#w$. . . . . . . . . . !$x$y$k#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#/$z$c$. . . . . . . . . . . . &$z#A$B$k$h#U#C$:#:#:#:#j$. . . 1#D$r#:#:#:#:#:#:#:#:#:#:#:#x#p$b$. . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . =$E$s#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#F$. . . . . . . . . . . y#G$/$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#^#y#. . . . . . . H$f$:#:#:#:#:#:#:#:#s$. . . I$6#:#:#:#:#:#:#:#:#:#:#:#:#:#J#h$. . . . . . . . *${$k#:#:#:#:#:#:#:#:#:#:#4$. . . . . . . '#<#1$($:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#w#{#. . . . . . . . . . J$F#:#:#:#:#:#:#:#:#:#:#j$. . +$K$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#6$L$. . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . M$e$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#3$. . . . . . . . . . N$q$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#O$&$. . . . . . H$f$:#:#:#:#:#:#:#:#>$. . P$7$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#^$I#. . . . . . . . Q$l$:#:#:#:#:#:#:#:#:#/$+$. . . . . . r$l$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#R$g#. . . . . . . . . . 7#:#:#:#:#:#:#:#:#:#:#j$. b$l$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#S$$$. . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . B$k#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#T$. . . . . . . . . N$U$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#V$$$. . . . . H$f$:#:#:#:#:#:#:#:#b$. L$W$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#_$O#. . . . . . . . X$:#:#:#:#:#:#:#:#:#e#Y$. . . . . . Z$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#`$8#. . . . . . . . . $$ %:#:#:#:#:#:#:#:#:#j$. ^#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#~$. . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . I$C#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#.%. . . . . . . . q#+%:#:#:#:#:#:#:#:#:#@%#%$%%%C$:#:#:#:#:#:#:#:#:#:#&%. . . . . H$f$:#:#:#:#:#:#:#:#b$. *%:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#]$%$. . . . . . . H$=%:#:#:#:#:#:#:#:#-%. . . . . . . .$;%:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#&%. . . . . . . . . . p$:#:#:#:#:#:#:#:#:#j$w$s#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#>%Y$. . . . . . . . . . . . . ", +". . . . . . . . . . . . . . +$@%:#:#:#:#:#:#:#:#:#:#f$V$v#E#w$,%]#[#e$:#:#:#:#:#:#:#:#:#:#m$. . . . . . . . $:#:#:#:#:#:#:#:#`$)$Y$. . . %$'%6#:#:#:#:#:#:#:#:#7$g#. . . . Q$;%:#:#:#:#:#:#:#:#y#)$a$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#)%. . . . . . . . g$:#:#:#:#:#:#:#:#_#. . . . . . . . ^#:#:#:#:#:#:#:#:#:#:#:#!%~%R${%_$:#:#:#:#:#:#:#:#:#:#:#:#e$%$. . . . . . . . . ,$:#:#:#:#:#:#:#:#:#]%q$:#:#:#:#:#=%-%e#:#:#:#:#:#:#:#:#:#:#:#:#:#c#. . . . . . . . . . . . . ", +". . . . . . . . . . . . . . ^%:#:#:#:#:#:#:#:#:#s#<$@$. . . . . . . )#!#L#:#:#:#:#:#:#:#:#m$. . . . . . . B$s#:#:#:#:#:#:#:#^#)#. . . . . . . 2#~%:#:#:#:#:#:#:#:#/%. . . . %$C#:#:#:#:#:#:#:#:#$$(%:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#a#y#. . . . . . . G#:#:#:#:#:#:#:#:#~%. . . . . . . . M$:#:#:#:#:#:#s#l$_%:%L$$$. . . $$<%[%^$:#:#:#:#:#:#:#:#:#:#-$. . . . . . . . . c$:#:#:#:#:#:#:#:#:#}%:#:#:#|%)%W#1#Y$)#X#l#x#:#:#:#:#:#:#:#:#:#:#4#. . . . . . . . . . . . . ", +". . . . . . . . . . . . . '$/$:#:#:#:#:#:#:#:#x#1%. . . . . . . . . . . ~#:#:#:#:#:#:#:#:#m$. . . . . . )#2%:#:#:#:#:#:#:#g$)#. . . . . . . . . P$/$:#:#:#:#:#:#:#3%8#. . . %$C#:#:#:#:#:#:#:#:#9#s#:#:#:#|%4%V#t#`#5%d$:#:#:#:#:#:#:#:#:#:#:#:#~$. . . . . . . G$:#:#:#:#:#:#:#:#{%. . . . . . . . Y$6%:#:#:#}#7%n#. . . . . . . . . . . W#_#:#:#:#:#:#:#:#:#:#8%. . . . . . . . . n#:#:#:#:#:#:#:#:#:#9%:#:#y$0%. . . . . . . X$x#:#:#:#:#:#:#:#:#:#b#. . . . . . . . . . . . . ", +". . . . . . . . . . . . . $%:#:#:#:#:#:#:#:#:#a%. . . . . . . . . . . . b%:#:#:#:#:#:#:#:#v$. . . . . . c%:#:#:#:#:#:#:#s#)$. . . . . . . . . . . ^#:#:#:#:#:#:#:#:#<#. . . %$C#:#:#:#:#:#:#:#:#l#:#:#:#|#+$. . . . . Y$d%s#:#:#:#:#:#:#:#:#:#:#e%. . . . . . . f%:#:#:#:#:#:#:#:#R$. . . . . . . . . g%:#a$Z$h%. . . . . . . . . . . . . . i%a$:#:#:#:#:#:#:#:#O$. . . . . . . . . t#a$:#:#:#:#:#:#:#:#:#:#:$y#. . . . . . . . . m#:#:#:#:#:#:#:#:#:#j%. . . . . . . . . . . . . ", +". . . . . . . . . . . . 2#x#:#:#:#:#:#:#:#:#o$'#. . . . . . . . . . . . u$:#:#:#:#:#:#:#:#4%. . . . . '#P#:#:#:#:#:#:#:#`$. . . . . . . . . . . . [$:#:#:#:#:#:#:#:#h#. . . %$C#:#:#:#:#:#:#:#:#9%:#:#e%8#. . . . . . . . _%:#:#:#:#:#:#:#:#:#:#;%q#. . . . . . D$:#:#:#:#:#:#:#:#R$. . . . . . . . . k%e$:%. . . . . . . . . . . . . . . . . S$:#:#:#:#:#:#:#:#F#. . . . . . . . . y#x#:#:#:#:#:#:#:#:#:#a$l%. . . . . . . . . . N$/$:#:#:#:#:#:#:#:#{%. . . . . . . . . . . . . ", +". . . . . . . . . . . . v#:#:#:#:#:#:#:#:#($`#. . . . . . . . . . . . . u$:#:#:#:#:#:#:#:#4%. . . . . '$s#:#:#:#:#:#:#:#m%. . . . . . . . . . . . 1#C$:#:#:#:#:#:#:#l$. . . %$C#:#:#:#:#:#:#:#:#:#:#r#|$. . . . . . . . . 1#n%:#:#:#:#:#:#:#:#:#:#o%. . . . . . A#:#:#:#:#:#:#:#:#R$. . . . . . . . . g#@$. . . . . . . . . . . . . . . . . . p%:#:#:#:#:#:#:#:#a$Y$. . . . . . . . Y$k#:#:#:#:#:#:#:#:#:#U#. . . . . . . . . . . . 2%:#:#:#:#:#:#:#:#i$. . . . . . . . . . . . . ", +". . . . . . . . . . . . l$:#:#:#:#:#:#:#:#q%. . . . . . . . . . . . . . K#:#:#:#:#:#:#:#:#4%. . . . . m$:#:#:#:#:#:#:#:#`#. . . . . . . . . . . . . (%:#:#:#:#:#:#:#C#*$. . %$C#:#:#:#:#:#:#:#:#:#:#[%. . . . . . . . . . . j$:#:#:#:#:#:#:#:#:#:#[%. . . . . . ~$:#:#:#:#:#:#:#:#R$. . . . . . . . . . . . . . . . . . . . . . . . . . . . . i%:#:#:#:#:#:#:#:#:#b$. . . . . . . . . !%:#:#:#:#:#:#:#:#:#D#. . . . . . . . . . . . i#:#:#:#:#:#:#:#:#C$. . . . . . . . . . . . . ", +". . . . . . . . . . . !$/$:#:#:#:#:#:#:#:#,%. . . . . . . . . . . . . . K#:#:#:#:#:#:#:#:#4%. . . . . 2$:#:#:#:#:#:#:#-%$$. . . . . . . . . . . . . t$:#:#:#:#:#:#:#:#n#. . %$C#:#:#:#:#:#:#:#:#:#f$=$. . . . . . . . . . . Y$+%:#:#:#:#:#:#:#:#:#r%. . . . . . k%:#:#:#:#:#:#:#:#R$. . . . . . . . . . . . . . . . . . . . . . . . . . . . . h%:#:#:#:#:#:#:#:#:#;$. . . . . . . . . e$:#:#:#:#:#:#:#:#s#N$. . . . . . . . . . . . g%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . . E#:#:#:#:#:#:#:#:#;%b$. . . . . . . . . . . . . . E#:#:#:#:#:#:#:#:#4%. . . . 0%/$:#:#:#:#:#:#:#j%. . . . . . . . . . . . . . s%:#:#:#:#:#:#:#:#]%. . %$C#:#:#:#:#:#:#:#:#:#e%. . . . . . . . . . . . . _%:#:#:#:#:#:#:#:#:#>%. . . . . . !#:#:#:#:#:#:#:#:#R$. . . . . . . . . . . . . . . . . . . . . . . . . . . . . y#x#:#:#:#:#:#:#:#:#;$. . . . . . . . . W$:#:#:#:#:#:#:#:#3%Y$. . . . . . . . . . . . h#:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . . m#:#:#:#:#:#:#:#:#t%. . . . . . . . . . . . . . . u$:#:#:#:#:#:#:#:#4#. . . . ]%:#:#:#:#:#:#:#:#[#. . . . . . . . . . . . . . 5%:#:#:#:#:#:#:#:#,$. . %$C#:#:#:#:#:#:#:#:#:#4#. . . . . . . . . . . . . l%:#:#:#:#:#:#:#:#:#}#)#. . . . . K#:#:#:#:#:#:#:#:#g$. . . . . . . . . . . . . . . . . . . . . . . . . . . . . %$=%:#:#:#:#:#:#:#:#H$. . . . . . . . . %:#:#:#:#:#:#:#:#K$. . . . . . . . . . . . . p#:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . . z$:#:#:#:#:#:#:#:#p$. . . . . . . . . . . . . . . u%:#:#:#:#:#:#:#:#&%. . . . v#:#:#:#:#:#:#:#:#5$. . . . . . . . . . . . . . ,%:#:#:#:#:#:#:#:#)%. . %$C#:#:#:#:#:#:#:#:#:#l%. . . . . . . . . . . . . %$}#:#:#:#:#:#:#:#:#s#s$. . . . . -$:#:#:#:#:#:#:#:#P#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1#7$:#:#:#:#:#:#:#:#Q$. . . . . . . . . L#:#:#:#:#:#:#:#:#{$. . . . . . . . . . . . . v$:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . '#U$:#:#:#:#:#:#:#:#s%. . . . . . . . . . . . . . . 1%:#:#:#:#:#:#:#:#&%. . . . [#:#:#:#:#:#:#:#:#D$. . . . . . . . . . . . . . ]%:#:#:#:#:#:#:#:#(#. . %$C#:#:#:#:#:#:#:#:#($y#. . . . . . . . . . . . . . P#:#:#:#:#:#:#:#:#:#4$. . . . . o%:#:#:#:#:#:#:#:#P#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1#7$:#:#:#:#:#:#:#:#Q$. . . . . . . . . ]$:#:#:#:#:#:#:#:#}%. . . . . . . . . . . . . v%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . 8#f$:#:#:#:#:#:#:#:#7#. . . . . . . . . . . . . . . ~#:#:#:#:#:#:#:#:#&%. . . . j%:#:#:#:#:#:#:#:#k$. . . . . . . . . . . . . . ]%:#:#:#:#:#:#:#:#7%. . %$C#:#:#:#:#:#:#:#:#~%. . . . . . . . . . . . . . . b#:#:#:#:#:#:#:#:#:#)$. . . . . <#:#:#:#:#:#:#:#:#P#. . . . . . . . . . . . . . . . . . {#I$u$]#v$u#5$5$w%B#~#x%C#:#:#:#:#:#:#:#:#Q$. . . . . . . . . :$:#:#:#:#:#:#:#:#y%. . . . . . . . . . . . . &%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . h%:#:#:#:#:#:#:#:#:#M$. . . . . . . . . . . . . . . ~#:#:#:#:#:#:#:#:#&%. . . . U$:#:#:#:#:#:#:#:#3$N#N#N#N#N#N#N#N#N#N#N#N#N#N#f%:#:#:#:#:#:#:#:#z%. . %$C#:#:#:#:#:#:#:#:#e%. . . . . . . . . . . . . . . m$:#:#:#:#:#:#:#:#:#<#. . . . . <#:#:#:#:#:#:#:#:#P#. . . . . . . . . . . . . . %$B$^%{%/$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#Q$. . . . . . . . . n%:#:#:#:#:#:#:#:#A%. . . . . . . . . . . . . &%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . '$:#:#:#:#:#:#:#:#:#/#. . . . . . . . . . . . . . . ~#:#:#:#:#:#:#:#:#&%. . . . }#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#B%. . %$C#:#:#:#:#:#:#:#:#<$. . . . . . . . . . . . . . . C%:#:#:#:#:#:#:#:#:#w$. . . . . <#:#:#:#:#:#:#:#:#P#. . . . . . . . . . . . 0%m$-%:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#Q$. . . . . . . . . n%:#:#:#:#:#:#:#:#A#. . . . . . . . . . . . . &%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . R#:#:#:#:#:#:#:#:#:#`#. . . . . . . . . . . . . . . M#:#:#:#:#:#:#:#:#&%. . . )#a$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#D%. . %$C#:#:#:#:#:#:#:#:#u#. . . . . . . . . . . . . . . E%:#:#:#:#:#:#:#:#:#w$. . . . . <#:#:#:#:#:#:#:#:#O$. . . . . . . . . . '#~#a#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#Q$. . . . . . . . . n%:#:#:#:#:#:#:#:#a%. . . . . . . . . . . . . &%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . N#:#:#:#:#:#:#:#:#:#n$. . . . . . . . . . . . . . . C%:#:#:#:#:#:#:#:#&%. . . {#s#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#m#. . %$C#:#:#:#:#:#:#:#:#D$. . . . . . . . . . . . . . . w$:#:#:#:#:#:#:#:#:#j$. . . . . M$:#:#:#:#:#:#:#:#T#. . . . . . . . . 8#<$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#. . . . . . . . . . n%:#:#:#:#:#:#:#:#~#. . . . . . . . . . . . . &%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . B$:#:#:#:#:#:#:#:#:#n$. . . . . . . . . . . . . . . C%:#:#:#:#:#:#:#:#&%. . . 0%s#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#f%. . %$C#:#:#:#:#:#:#:#:#0#. . . . . . . . . . . . . . . 3#:#:#:#:#:#:#:#:#:#i%. . . . . f#:#:#:#:#:#:#:#:#T#. . . . . . . . $$F%:#:#:#:#:#:#:#:#:#:#:#:#s#^$6#U$U$U$U$U$;%:#:#:#:#:#:#:#:#. . . . . . . . . . n%:#:#:#:#:#:#:#:#~#. . . . . . . . . . . . . &%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . B$:#:#:#:#:#:#:#:#:#G%. . . . . . . . . . . . . . . C%:#:#:#:#:#:#:#:#&%. . . 0%s#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#v#. . %$C#:#:#:#:#:#:#:#:#k%. . . . . . . . . . . . . . . 3#:#:#:#:#:#:#:#:#:#X#. . . . . f#:#:#:#:#:#:#:#:#T#. . . . . . . . /%:#:#:#:#:#:#:#:#:#:#_#T$j$g#)#. . . . . . n%:#:#:#:#:#:#:#:#. . . . . . . . . . n%:#:#:#:#:#:#:#:#~#. . . . . . . . . . . . . ]#:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . r$:#:#:#:#:#:#:#:#:#l%. . . . . . . . . . . . . . . 4#:#:#:#:#:#:#:#:#&%. . . 0%s#:#:#:#:#:#:#:#:#;%r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#a%. . %$C#:#:#:#:#:#:#:#:#x%. . . . . . . . . . . . . . . 3#:#:#:#:#:#:#:#:#:#=$. . . . . <#:#:#:#:#:#:#:#:#T#. . . . . . . h$($:#:#:#:#:#:#:#:#!%0#)#. . . . . . . . . . ]$:#:#:#:#:#:#:#:#. . . . . . . . . . n%:#:#:#:#:#:#:#:#c%. . . . . . . . . . . . . a%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . :%:#:#:#:#:#:#:#:#:#j$. . . . . . . . . . . . . . . B#:#:#:#:#:#:#:#:#&%. . . y#s#:#:#:#:#:#:#:#:#t$. . . . . . . . . . . . . . . . . . . . . . . . . . %$C#:#:#:#:#:#:#:#:#w$. . . . . . . . . . . . . . . o%:#:#:#:#:#:#:#:#e#Q$. . . . . <#:#:#:#:#:#:#:#:#T#. . . . . . . e%:#:#:#:#:#:#:#:#~%S#. . . . . . . . . . . . d#:#:#:#:#:#:#:#:#. . . . . . . . . . n%:#:#:#:#:#:#:#:#u$. . . . . . . . . . . . . a%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . )$:#:#:#:#:#:#:#:#:#b%. . . . . . . . . . . . . . . B#:#:#:#:#:#:#:#:#&%. . . '#($:#:#:#:#:#:#:#:#G$. . . . . . . . . . . . . . . . . . . . . . . . . . %$C#:#:#:#:#:#:#:#:#o%. . . . . . . . . . . . . . . E#:#:#:#:#:#:#:#:#_#. . . . . . <#:#:#:#:#:#:#:#:#T#. . . . . . /#s#:#:#:#:#:#:#:#e#4$. . . . . . . . . . . . . 6#:#:#:#:#:#:#:#:#. . . . . . . . . . n%:#:#:#:#:#:#:#:#u$. . . . . . . . . . . . . a%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . X#:#:#:#:#:#:#:#:#:#)%. . . . . . . . . . . . . . . v%:#:#:#:#:#:#:#:#D$. . . . 9%:#:#:#:#:#:#:#:#<$. . . . . . . . . . . . . . . . . . . . . . . . . . %$C#:#:#:#:#:#:#:#:#o%. . . . . . . . . . . . . . . H%:#:#:#:#:#:#:#:#K$. . . . . . <#:#:#:#:#:#:#:#:#T#. . . . . . m#:#:#:#:#:#:#:#:#/%. . . . . . . . . . . . . $$r#:#:#:#:#:#:#:#:#. . . . . . . . . . n%:#:#:#:#:#:#:#:#u$. . . . . . . . . . . . . a%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . !$:#:#:#:#:#:#:#:#:#I%. . . . . . . . . . . . . . . 4%:#:#:#:#:#:#:#:#4%. . . . L#:#:#:#:#:#:#:#:#|#. . . . . . . . . . . . . . . . . . . . . . . . . . %$C#:#:#:#:#:#:#:#:#o%. . . . . . . . . . . . . . . d%:#:#:#:#:#:#:#:#F$. . . . . . <#:#:#:#:#:#:#:#:#T#. . . . . . ]$:#:#:#:#:#:#:#/$@$. . . . . . . . . . . . . H$;%:#:#:#:#:#:#:#e#. . . . . . . . . . n%:#:#:#:#:#:#:#:#u$. . . . . . . . . . . . . a%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . 8#x#:#:#:#:#:#:#:#:#K$. . . . . . . . . . . . . . . p#:#:#:#:#:#:#:#:#v$. . . . (%:#:#:#:#:#:#:#:#:$. . . . . . . . . . . . . . . . . . . . . . . . . . %$C#:#:#:#:#:#:#:#:#o%. . . . . . . . . . . . . . . F$:#:#:#:#:#:#:#:#M#. . . . . . X$:#:#:#:#:#:#:#:#T#. . . . . {#($:#:#:#:#:#:#:#J%. . . . . . . . . . . . . . !$:#:#:#:#:#:#:#:#C#. . . . . . . . . . ]$:#:#:#:#:#:#:#:#u$. . . . . . . . . . . . . a%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . '#W$:#:#:#:#:#:#:#:#F#'#. . . . . . . . . . . . . . T$:#:#:#:#:#:#:#:#m$. . . . p$:#:#:#:#:#:#:#:#^$)#. . . . . . . . . . . . . . . . . . . . . . . . . %$C#:#:#:#:#:#:#:#:#o%. . . . . . . . . . . . . . . K%:#:#:#:#:#:#:#:#c#. . . . . . -$:#:#:#:#:#:#:#:#T#. . . . . I$:#:#:#:#:#:#:#:#5#. . . . . . . . . . . . . . P$:#:#:#:#:#:#:#:#C#. . . . . . . . . . ]$:#:#:#:#:#:#:#:#u$. . . . . . . . . . . . . a%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . . 8$:#:#:#:#:#:#:#:#:##$. . . . . . . . . . . . . . I%:#:#:#:#:#:#:#:#m#. . . . m%:#:#:#:#:#:#:#:#:#O#. . . . . . . . . . . . . . . . . . . . . . . . . %$C#:#:#:#:#:#:#:#:#o%. . . . . . . . . . . . . . . _#:#:#:#:#:#:#:#_$8#. . . . . . K#:#:#:#:#:#:#:#:#T#. . . . . E#:#:#:#:#:#:#:#:#G$. . . . . . . . . . . . . . E%:#:#:#:#:#:#:#:#C#. . . . . . . . . . ]$:#:#:#:#:#:#:#:#u$. . . . . . . . . . . . . a%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . . p$:#:#:#:#:#:#:#:#:#5%. . . . . . . . . . . . . . G#:#:#:#:#:#:#:#:#l#. . . . f#:#:#:#:#:#:#:#:#:#A#. . . . . . . . . . . . . . . . . . . . . . . . . %$C#:#:#:#:#:#:#:#:#o%. . . . . . . . . . . . . . =$a$:#:#:#:#:#:#:#|#. . . . . . . !#:#:#:#:#:#:#:#:#T#. . . . . M#:#:#:#:#:#:#:#:#l#. . . . . . . . . . . . . . 5$:#:#:#:#:#:#:#:#C#. . . . . . . . . . 2%:#:#:#:#:#:#:#:#u$. . . . . . . . . . . . . a%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . . M#:#:#:#:#:#:#:#:#:#w#. . . . . . . . . . . . . . `$:#:#:#:#:#:#:#:#Z$. . . . H$k#:#:#:#:#:#:#:#:#e%. . . . . . . . . . . . . . . . . . . . . . . . . %$C#:#:#:#:#:#:#:#:#o%. . . . . . . . . . . . . . E#:#:#:#:#:#:#:#:#a%. . . . . . . u$:#:#:#:#:#:#:#:#T#. . . . . x$:#:#:#:#:#:#:#:#{$. . . . . . . . . . . . . . d$:#:#:#:#:#:#:#:#C#. . . . . . . . . . %:#:#:#:#:#:#:#:#E%. . . . . . . . . . . . . k$:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . . 9#:#:#:#:#:#:#:#:#:#}#&$. . . . . . . . . . . . $$-%:#:#:#:#:#:#:#:#w#. . . . . K$:#:#:#:#:#:#:#:#($.$. . . . . . . . . . . . . . . . . . . . . . . . %$C#:#:#:#:#:#:#:#:#o%. . . . . . . . . . . . . . Z$:#:#:#:#:#:#:#($=$. . . . . . . 1%:#:#:#:#:#:#:#:#T#. . . . . m%:#:#:#:#:#:#:#:#e%. . . . . . . . . . . . . Z#($:#:#:#:#:#:#:#:#C#. . . . . . . . . . U$:#:#:#:#:#:#:#:#~#. . . . . . . . . . . . . &%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . . )#-%:#:#:#:#:#:#:#:#:#]#. . . . . . . . . . . . <%s#:#:#:#:#:#:#:#:#V$. . . . . 4#:#:#:#:#:#:#:#:#:#F$. . . . . . . . . . . . . . . . . . . . . . . . %$C#:#:#:#:#:#:#:#:#o%. . . . . . . . . . . . . Q$9%:#:#:#:#:#:#:#K%. . . . . . . . H%:#:#:#:#:#:#:#:#n%. . . . . ,$:#:#:#:#:#:#:#:#3%Y$. . . . . . . . . . . . u#:#:#:#:#:#:#:#:#:#C#. . . . . . . . . . 6#:#:#:#:#:#:#:#:#~#. . . . . . . . . . . . . &%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . . . 5#:#:#:#:#:#:#:#:#:#6#&$. . . . . . . . . . . v%:#:#:#:#:#:#:#:#:#O$. . . . . Z#($:#:#:#:#:#:#:#:#x#9#. . . . . . . . . . . . . . . . . . . . . . . H$f$:#:#:#:#:#:#:#:#Q#. . . . . . . . . . . . . 5%:#:#:#:#:#:#:#:#-$. . . . . . . . k$:#:#:#:#:#:#:#:#P#. . . . . K#:#:#:#:#:#:#:#:#:#9#. . . . . . . . . . . =$7$:#:#:#:#:#:#:#:#:#s#. . . . . . . . . . e$:#:#:#:#:#:#:#:#~#. . . . . . . . . . . . . )%:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . . . E#:#:#:#:#:#:#:#:#:#:#B%. . . . . . . . . . y#6%:#:#:#:#:#:#:#:#:#{%. . . . . . #%:#:#:#:#:#:#:#:#:#]$b$. . . . . . . . . . . . . . . . . . . . . . H$f$:#:#:#:#:#:#:#:#x%. . . . . . . . . . . . )#j#:#:#:#:#:#:#:#+%Y$. . . . . . . . 4#:#:#:#:#:#:#:#:#]$. . . . . /#:#:#:#:#:#:#:#:#:#l#. . . . . . . . . . Y$1$:#:#:#:#:#:#:#:#:#:#:#. . . . . . . . . . C$:#:#:#:#:#:#:#:#D#. . . . . . . . . . . . . v$:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . . . y#a#:#:#:#:#:#:#:#:#:#s#D$. . . . . . . . '#^%:#:#:#:#:#:#:#:#:#:#C$. . . . . . L%s#:#:#:#:#:#:#:#:#:#(%H$. . . . . . . . . . . . . . . . . . . . . H$x#:#:#:#:#:#:#:#:#E#. . . . . . . . . . . . A%:#:#:#:#:#:#:#:#E#. . . . . . . . . d%:#:#:#:#:#:#:#:#{%. . . . . b$f$:#:#:#:#:#:#:#:#;%V#. . . . . . . . Y$h#:#:#:#s#:#:#:#:#:#:#:#:#$$. . . . . . . . . 7$:#:#:#:#:#:#:#:#C%. . . . . . . . . . . . . m$:#:#:#:#:#:#:#:#!%. . . . . . . . . . . . . ", +". . . . . . . . . . . . . 3$:#:#:#:#:#:#:#:#:#:#s#g%t#. . . . . {#g%:#:#:#:#:#:#:#:#:#:#:#x#b$. . . . . '#y$:#:#:#:#:#:#:#:#:#:#n%n$. . . . . . . . . . . . . . . . n$/#. . >$:#:#:#:#:#:#:#:#:#b%. . . . . . . . . . . o#k#:#:#:#:#:#:#:#8$Y$. . . . . . . . . p#:#:#:#:#:#:#:#:#W$. . . . . . l$:#:#:#:#:#:#:#:#:#i$I$. . . . . . h%Y#:#:#:#6#J%:#:#:#:#:#:#:#:#H$. . . . . . . . '#e#:#:#:#:#:#:#:#:#C%. . . . . . . . . . . . . }%:#:#:#:#:#:#:#:#r#'#. . . . . . . . . . . . ", +". . . . . . . . . . . . . Z#e#:#:#:#:#:#:#:#:#:#:#:#}#$%D$H%&%{$C$:#:#:#r#:#:#:#:#:#:#:#:#:#n$. . . . . . X#;%:#:#:#:#:#:#:#:#:#:#}#f%L$. . . . . . . . . . . . Z#3$C#I$. . !$:#:#:#:#:#:#:#:#:#D#. . . . . . . . . . M%a#:#:#:#:#:#:#:#=%4$. . . . . . . . . . 7%:#:#:#:#:#:#:#:#9%. . . . . . p#:#:#:#:#:#:#:#:#:#:#x#E$1%i%l%H#<$}#:#:#:#:#9$d$:#:#:#:#:#:#:#:#0%. . . . . . . . %$;%:#:#:#:#:#:#:#:#s%. . . . . . . . . . . . . p$:#:#:#:#:#:#:#:#}#8#. . . . . . . . . . . . ", +". . . . . . . . . . . . . . m#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#^%:#:#:#:#:#:#:#:#:#L%. . . . . . . )%:#:#:#:#:#:#:#:#:#:#:#:#e#q%a%A$;$Y$. . %$|$I#D$%%x#:#f$b$. . W#:#:#:#:#:#:#:#:#:#C%. . . . . . . . %$D$e#:#:#:#:#:#:#:#s#N%. . . . . . . . . . . Z$:#:#:#:#:#:#:#:#k#$$. . . . . O#a$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#6%b$g$:#:#:#:#:#:#:#:#@$. . . . . . . . q#($:#:#:#:#:#:#:#:#A%. . . . . . . . . . . . . [#:#:#:#:#:#:#:#:#;%H$. . . . . . . . . . . . ", +". . . . . . . . . . . . . . >$U$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#_$f#:#:#:#:#:#:#:#:#:#M#. . . . . . . Y$$%:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#a$f$_$^$x#s#:#:#:#:#:#2%. . . )$:#:#:#:#:#:#:#:#:#o$o%.$8#. . +$M$/%6%:#:#:#:#:#:#:#:#:#D%'#. . . . . . . . . . . r%:#:#:#:#:#:#:#:#/$;$. . . . . . (%:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#b%. d$:#:#:#:#:#:#:#:#J$. . . . . . . . t#s#:#:#:#:#:#:#:#:#v$. . . . . . . . . . . . . E$:#:#:#:#:#:#:#:#a${#. . . . . . . . . . . . ", +". . . . . . . . . . . . . . . M%;%:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#y%z#:#:#:#:#:#:#:#:#:#D%. . . . . . . . %$V$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#V$. . . E%:#:#:#:#:#:#:#:#:#:#:#:#s#e#;%:#:#:#:#:#:#:#:#:#:#:#:#^%Y$. . . . . . . . . . . . T#:#:#:#:#:#:#:#:#:#J$. . . . . . P$($:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#r%. . t%:#:#:#:#:#:#:#:#L%. . . . . . . . W#:#:#:#:#:#:#:#:#:#.%. . . . . . . . . . . . . %%:#:#:#:#:#:#:#:#:#n$. . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . H#/$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:$*$@$:#:#:#:#:#:#:#:#:#T#. . . . . . . . . 8#^%s#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#O%. . . m$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#a$m$Y$. . . . . . . . . . . . . @%:#:#:#:#:#:#:#:#:#-$. . . . . . . p#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#+%+$. . y$:#:#:#:#:#:#:#:#M#. . . . . . . . )$:#:#:#:#:#:#:#:#:#g%. . . . . . . . . . . . . 6$:#:#:#:#:#:#:#:#:#I#. . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . u$C#:#:#:#:#:#:#:#:#:#:#:#:#:#:#6%.$. !$:#:#:#:#:#:#:#:#:#=%H$. . . . . . . . . '#H#|%:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#T$. . . S$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#_#o%. . . . . . . . . . . . . . {#x#:#:#:#:#:#:#:#:#:#[%. . . . . . . $$G#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#j#@$. . . P%:#:#:#:#:#:#:#:#<$. . . . . . . . '%:#:#:#:#:#:#:#:#:#(%. . . . . . . . . . . . '#9%:#:#:#:#:#:#:#:#:#k$. . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . /#2$:#:#:#:#:#:#:#:#:#:#:#:#g$#$. . 0%/$:#:#:#:#:#:#:#:#:#j$. . . . . . . . . . . 0%Q%!%:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#(#. . 1#j%a$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#_$p#&$. . . . . . . . . . . . . . . o%:#:#:#:#:#:#:#:#:#:#t%. . . . . . . . 1#T$/$:#:#:#:#:#:#:#:#:#:#:#s#w#+$. . . . b#:#:#:#:#:#:#:#:#9%y#. . . . . . . }%:#:#:#:#:#:#:#:#:#_#'#. . . . . . . . . . . |$a$:#:#:#:#:#:#:#:#:#R%. . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . 1#5%g$s#:#:#:#:#:#:#:#J#x$8#. . . q#($:#:#:#:#:#:#:#:#:#[#. . . . . . . . . . . . . >$~##%=%:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#k#j%w$. . . '#S#p%P%9%:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#/$`$A#{#. . . . . . . . . . . . . . . . . Y#:#/$!%6%S%{%{%U$a#/$a$X#. . . . . . . . . f#%%a$:#:#:#:#:#:#:#/$U#:%'#. . . . . 7%:#:#:#:#:#:#:#:#:#d%. . . . . . $$S%:#($^$C$a#7$C#:#:#s#z#. . . . . . . . . . . k%:#f$e$S%{%{%@%a#x#:#!%b$. . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . '#W#,$3${${$G$&%l%$$. . . . . 1#c$P$z#t#>$8#8#Q$!$<%l%. . . . . . . . . . . . . . . . *$M%a%h#E$8$2$]$]$2$T%|#<$/%D#A$Q$. . . . . . . . . Y$.$B$4#t$w#(%t%2$]$]$g$e%b#w%-$L$. . . . . . . . . . . . . . . . . . . Y$l%2#%$$$. . . . . Y$Q$`#N$. . . . . . . . . . . |$'%(#<$R%^%m$u%=$. . . . . . . . S#f#4$|${#8#8#&$2#V#o#. . . . . . Q$P$g#)#$$Y$Y$$$1#Q$@$A$L$. . . . . . . . . . . n$.$8#'#. . . . Y$8#|$l%+$. . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "}; --- gdm-2.13.0.5.orig/debian/gdm.pod +++ gdm-2.13.0.5/debian/gdm.pod @@ -0,0 +1,47 @@ +=head1 NAME + +gdm - GNOME Display Manager + +=head1 SYNOPSIS + +gdm + +=head1 DESCRIPTION + +B is the equivalent of xdm(1x) or wdm(1x), but uses the GNOME +libraries to provide a GNOME look-and-feel. It provides the GNOME +equivalent of a "login:" prompt. + +B reads F for its configuration. For each +local display, gdm starts an X server and runs gdmlogin(8x) on that +display. The main gdm process also listens for XDMCP requests from +remote displays. These requests can either be direct, causing B +to start a gdmlogin(8x) on the remote display, or indirect, causeing +a gdmchooser(8x) to be opened. + +When managing a display, B attempts to execute +FI, or F if that does +not exist. When a user logs in, B first attempts +FI (or F), +and then one of the sessions in F. When the session +has completed, B attempts to run +FI, or +FI. Of all these files, only the +F one is required to exist. + +B maintains information about the displays it is managing in +F. This includes xauth information, so this directory +is not readable to normal users. + +B uses PAM to perform authentication using the config file +F. + +=head1 AUTHOR + +Martin Kasper Petersen + +This manual page written by Steve Haslam for +Debian GNU/Linux. Updated by Raphal Hertzog . +Updated by Ryan Murray . + +=cut --- gdm-2.13.0.5.orig/debian/compat +++ gdm-2.13.0.5/debian/compat @@ -0,0 +1 @@ +4 --- gdm-2.13.0.5.orig/debian/extract-locales +++ gdm-2.13.0.5/debian/extract-locales @@ -0,0 +1,40 @@ +#!/usr/bin/perl +# +# Takes a list of locales like /usr/share/i18n/SUPPORTED on standard input +# or on the command line, and writes out a locale.alias format file for all +# listed locales on standard output. +# +my %locales; +# whether or not locales should always specify charset or not. +my $always_charset = 0; + +chdir("/usr/share/i18n/locales") or die "can't find /usr/share/i18n/locales"; +while (<>) { + my $language; + my $territory; + chomp; + @line = split / /; + ($file = $line[0]) =~ s/\..*$//; + open F, $file or die "can't open $file\n"; + while () { + chomp; + $title = $1 if /^title\s+"(.*)"/; + $language = $1 if /^language\s+"(.*)"/; + $territory = $1 if /^territory\s+"(.*)"/; + last if /^END LC_IDENTIFICATION/; + } + close F; + + if ($always_charset and $line[1] and $line[0] =~ s/(\@.*)$//) { + my $suffix = $1; + $line[1] =~ s/$/$suffix/; + } + + $language =~ s/ /_/g; + $territory =~ s/ /_/g; + if (!$always_charset or $line[0] =~ /\./) { + print "$language($territory)\t$line[0]\n"; + } else { + print "$language($territory)\t$line[0].$line[1]\n"; + } +} --- gdm-2.13.0.5.orig/debian/links +++ gdm-2.13.0.5/debian/links @@ -0,0 +1,2 @@ +/etc/gdm /etc/X11/gdm +/usr/share/man/man1/gdm.1.gz /usr/share/man/man1/gdmsetup.1.gz --- gdm-2.13.0.5.orig/debian/menu +++ gdm-2.13.0.5/debian/menu @@ -0,0 +1,16 @@ +?package(gdm):needs="X11" section="Apps/System" \ + title="GDM flexiserver" command="gdmflexiserver"\ + icon="/usr/share/pixmaps/gdm.xpm"\ + longtitle="New GDM Session" +?package(gdm):needs="X11" section="Apps/System" \ + title="GDM flexiserver in Xnest" command="gdmflexiserver -n"\ + icon="/usr/share/pixmaps/gdm.xpm"\ + longtitle="New GDM Session in Xnest" +?package(gdm):needs="X11" section="Apps/System" \ + title="GDM Photo Setup" command="gdmphotosetup"\ + icon="/usr/share/pixmaps/gdm.xpm"\ + longtitle="Select a photo for GDM" +?package(gdm):needs="X11" section="Apps/System" \ + title="GDM Setup" command="gksu gdmsetup"\ + icon="/usr/share/pixmaps/gdm.xpm"\ + longtitle="GDM Setup" --- gdm-2.13.0.5.orig/debian/manpages +++ gdm-2.13.0.5/debian/manpages @@ -0,0 +1,2 @@ +debian/gdmlogin.1 +debian/gdmchooser.1 --- gdm-2.13.0.5.orig/debian/install +++ gdm-2.13.0.5/debian/install @@ -0,0 +1,2 @@ +debian/gdmDebianLogo.xpm /usr/share/pixmaps +debian/locale.conf /etc/gdm --- gdm-2.13.0.5.orig/debian/templates +++ gdm-2.13.0.5/debian/templates @@ -0,0 +1,206 @@ +Template: gdm/daemon_name +Type: string +Default: /usr/sbin/gdm +Description: internal use only + This template is never shown to the user and does not require translation. + +Template: shared/default-x-display-manager +Type: select +Choices: ${choices} +Description: Select the desired default display manager. + A display manager is a program that provides graphical login capabilities for + the X Window System. + . + Only one display manager can manage a given X server, but multiple display + manager packages are installed. Please select which display manager should + run by default. + . + (Multiple display managers can run simultaneously if they are configured to + manage different servers; to achieve this, configure the display managers + accordingly, edit each of their init scripts in /etc/init.d, and disable the + check for a default display manager.) +Description-ca.ISO-8859-15: Escolliu el gestor de pantalla per defecte que desitgeu. + Un gestor de pantalla (display manager) s un programa que proporciona la + capacitat d'un quadre grfic d'entrada (login) al sistema X Window. + . + Noms un gestor de pantalla pot gestionar un servidor X determinat, per + teniu installats diversos paquets de gestor de pantalla. Per favor, + escolliu quin gestor de pantalla s'executar per defecte. + . + (Poden haver diversos gestors de pantalla corrent simultniament si es + configuren per gestionar diferents servidors; per aconseguir a, + configureu adequadament els gestors de pantalla, editeu cadascun dels seus + guions d'inici en /etc/init.d, i deshabiliteu la comprovaci de gestor + de pantalla per defecte.) +Description-cs.ISO-8859-2: Vyberte implicitnho sprvce obrazovky. + Sprvce obrazovky je program, kter nabz grafick pihlen do systmu + X Window. + . + Je nainstalovno nkolik sprvc obrazovky, ale jen jeden me obsluhovat + dan X server. Vyberte, kter sprvce se m spoutt standardn. + . + (Vce sprvc obrazovky me bet zrove pouze pokud spravuj rzn + servery. Pro dosaen takovho nastaven muste je sprvn nakonfigurovat, + upravit jejich spoutc skripty v /etc/init.d a zakzat kontrolu + standardnho sprvce obrazovky.) +Description-da.ISO-8859-1: Vlg den nskede logindhndtering. + En logindhndtering er et program der giver et grafisk logind til X + Window-systemet. + . + Der kan kun kre n logindhndtering for hver X-server, men der er + installeret flere logindhndteringer Vlg hvilken logindhndtering der + skal benyttes som standard. + . + (Flere logindhndteringer kan kre samtidig. hvis de er sat op til at + hndtere forskellige servere. For at f dette til at fungere, skal + logindhndteringenerne sttes op til det. Det gr du ved at fjerne tjekket + for standard logindhndtering i deres initialiseringsskripter i + /etc/init.d.) +Description-de.ISO-8859-15: Bitte whlen Sie den gewnschten Display Manager. + Ein Display Manager ist ein Programm welches grafische + Anmeldemglichkeiten fr das X Window System zur Verfgung stellt. + . + Ein Display Manager kann nur einen vorgegebenen X Server benutzen, doch es + knnen mehrere Display Manager installiert sein. Bitte whlen Sie welcher + Display Manager als Standard benutzt werden soll. + . + (Es knnen mehrere Display Manager gleichzeitig laufen, wenn diese so + konfiguriert sind, dass sie verschiedene X Server benutzen; um dies zu + erreichen, konfigurieren Sie die Display Manager entsprechend, editieren + Sie jedes der Init-Skripte in /etc/init.d, und schalten Sie den Check nach + einem Standard-Display-Manager ab.) +Description-el.ISO-8859-7: . + + X . + . + + X, . + . + . + , + X. + , , + /etc/init.d, + . +Description-es.ISO-8859-15: Escoja el gestor de sesiones que desea tener por defecto. + Un gestor de sesiones es un programa que le ofrece la posibilidad de + entrar grficamente a su sistema mediante el sistema X Window. + . + Cada servidor X slo puede ser gestionado por un gestor de sesiones, pero + hay instalados varios paquetes de gestores de sesiones. Por favor, + seleccione qu gestor desea utilizar por defecto. + . + (Se pueden ejecutar mltiples gestores de sesiones simultneamente si se + configuran para gestionar distintos servidores; para conseguir esto, + configure los gestores de sesiones apropiadamente, edite cada uno de sus + guiones de inicio en /etc/init.d, y desactive el chequeo de un gestor de + sesiones por defecto) +Description-fr.ISO-8859-15: Gestionnaire graphique de session par dfaut: + Un gestionnaire graphique de session est un programme qui permet de se + connecter la machine depuis le systme X Window. + . + Un seul gestionnaire graphique de session peut s'occuper d'un serveur X + donn, bien que plusieurs gestionnaires puissent tre installs + simultanment. Veuillez choisir celui qui sera utilis par dfaut. + . + Plusieurs gestionnaires graphiques peuvent tre lancs en mme temps, + s'ils grent des serveurs X diffrents; pour cela, configurez + correctement chacun des gestionnaires graphiques, modifiez leurs scripts + de lancement dans /etc/init.d, et dsactivvez le test de gestionnaire + graphique par dfaut. +Description-it.ISO-8859-15: Scegliere il display manager predefinito. + Un display manager un programma che fornisce capacit di login grafico + per l'X Window System. + . + Solo un display manager pu gestire un dato server X, ma sono installati + pi pacchetti di display manager. Scegliere quale display manager usare. + . + (Possono essere eseguiti pi display manager contemporaneamente se sono + configurati per gestire server diversi; per fare questo, configurate i + display manager in maniera appropriata, modificate ognuno dei loro script + di init in /etc/init.d, e disabilitate il controllo per un display manager + di default.) +Description-ja.EUC-JP: ǥեȤǻȤǥץ쥤ޥ͡Dz + ǥץ쥤ޥ͡ȤϡX Window System + ǤΥեʥǽ󶡤ΤǤ + . + ҤȤĤ X + ФǤΤϤҤȤĤΥǥץ쥤ޥ͡ǤʣΥǥץ쥤ޥ͡㤬󥹥ȡ뤵ƤޤɤΥǥץ쥤ޥ͡ǥեȤǵư뤫򤷤Ʋ + . + (ۤʤ륵Фô褦ꤹСʣΥǥץ쥤ФƱưǤޤΤ褦ˤˤϡ/etc/init.d + ˤƥǥץ쥤ޥ͡νץȤԽǥեȥǥץ쥤ޥ͡Υå̵ˤƲ) +Description-nl.ISO-8859-15: Gelieve de standaard beeldschermbeheerder te selecteren. + Een beeldschermbeheerder is een programma waarmee u zich grafisch op het + systeem kunt aanmelden, waarna u in de grafische omgeving (het X Window + System) terecht komt. + . + Elke X-server kan door slechts 1 beeldschermbeheerder beheerd worden, + hoewel er meerdere beeldschermbeheerders genstalleerd kunnen zijn. + Gelieve de standaard te gebruiken beeldschermbeheerder uit te kiezen. + . + (Er kunnen meerdere beeldschermbeheerders tegerlijkertijd actief zijn + indien deze verschillende X-servers beheren; om dit te bereiken dient u + elke beeldschermbeheerder in te stellen, en hun init-scripts in + /etc/init.d/ aan te passen zodat deze niet controleren of ze de standaard + beeldscherm-beheerder zijn) +Description-pl.ISO-8859-2: Wybierz domylny display manager. + Display manager to program, ktry umoliwia logowanie si bezporednio do + systemu X Window. + . + Tylko jeden display manager moe kontrolowa dany X serwer, ale + zainstalowanych jest obecnie kilka takich programw. Wybierz, ktry z nich + ma by uruchamiany domylnie. + . + (Mona uruchomi kilka programw "display manager", ale musz one + kontrolowa rne serwery; mona to osign konfigurujc odpowiednio + kady z nich i wyczajc w ich skryptach startowych fragment sprawdzajcy + domylny display manager.) +Description-pt_BR.ISO-8859-1: Selecione o gerenciador de display padro preferido. + Um gerenciador de display um programa que prov capacidades de login + grfico para o Sistema de Janelas X. + . + Somente um gerenciador de display pode gerenciar um dado servidor X, mas + diversos pacotes de gerenciadores de display esto instalados. Por favor + selecione qual gerenciador de display dever ser executado como padro. + . + (Mltiplos gerenciadores de display podem rodar simultaneamente se eles + esto configurados para gerenciar servidores diferentes; para conseguir + isso, configure o gerenciador de display apropriadamente, edite cada um de + seus scripts de inicializao em /etc/init.d, e desabilite a checagem por + um gerenciador de display padro.) +Description-ru.KOI8-R: . + - , + X Window System. + . + X , + . + , . + . + ( , + X; , + , + /etc/init.d + .) +Description-sv.ISO-8859-1: Vlj vilken skrmhanterare du vill anvnda. + En skrmhanterare r det program som tillhandahller grafiska + loginmjligheter i X Window-systemet. + . + Endast en skrmhanterare kan kras fr varje X-server, men flera + skrmhanterarpaket kan vare installerade. Var vnlig och vlj den + skrmhanterare som skall anvndas som standard. + . + (Flera skrmhanterare kan kras samtidigt om de r konfigurerade att + hantera olika servrar. Fr att uppn detta, konfigurera skrmhanterarnas + initskript i /etc/init.d, och stng av kollen efter standard + skrmhanteraren.) +Description-tr.ISO-8859-9: Kullanmak istediiniz ntanml ekran yneticisini sein. + Ekran yneticisi, X Window Sistemi'ne grafik arayz ile giri yapmay salar. + . + Sadece bir ekran yneticisi verilen X sunucusunu ynetebilir, ancak birden + fazla ekran yneticisi kurulu durumda. Ltfen, ntanml olarak altrmak + istediiniz ekran yneticisini sein. + . + (Eer farkl sunucular altrmak iin ayarlanrsa birden fazla ekran + yneticisi kullanlabilir. Bunun iin /etc/init.d iindeki ilgili betikleri + deitirin ve ntanml ekran yneticisini denetleyen ilevleri devre d + brakn.) --- gdm-2.13.0.5.orig/debian/watch +++ gdm-2.13.0.5/debian/watch @@ -0,0 +1,2 @@ +version=2 +http://ftp.5z.com/pub/gdm/gdm-(2\.8\.0\..*)\.tar\.gz debian uupdate --- gdm-2.13.0.5.orig/debian/postinst +++ gdm-2.13.0.5/debian/postinst @@ -0,0 +1,107 @@ +#!/bin/sh + +set -e + +. /usr/share/debconf/confmodule + +THIS_PACKAGE=gdm +DEFAULT_DISPLAY_MANAGER_FILE=/etc/X11/default-display-manager + +case "$1" in +configure) + if grep "/usr/bin/gdm" $DEFAULT_DISPLAY_MANAGER_FILE; then + echo "/usr/sbin/gdm" > $DEFAULT_DISPLAY_MANAGER_FILE + fi + ;; +esac + +# creating gdm group if he isn't already there +if ! getent group gdm >/dev/null; then + addgroup --system gdm +fi + +# creating gdm user if he isn't already there +if ! getent passwd gdm >/dev/null; then + adduser --system --ingroup gdm --home /var/lib/gdm gdm + usermod -c "Gnome Display Manager" gdm + usermod -d "/var/lib/gdm" gdm + usermod -g "gdm" gdm + usermod -s "/bin/false" gdm +fi + +if [ -d /var/lib/gdm ]; then + chown -R gdm:gdm /var/lib/gdm + chmod 0750 /var/lib/gdm +fi + +# debconf is not a registry, so we only fiddle with the default file if it +# does not exist +if [ ! -e $DEFAULT_DISPLAY_MANAGER_FILE ]; then + if db_get shared/default-x-display-manager; then + if [ "$THIS_PACKAGE" != "$RET" ]; then + echo "Please be sure to run \"dpkg --configure $RET\"." + fi + if db_get "$RET"/daemon_name; then + echo "$RET" > $DEFAULT_DISPLAY_MANAGER_FILE + fi + fi +fi +if [ ! -e /etc/default/gdm ]; then + if db_get "locales/default_environment_locale"; then + if [ "$RET" = "None" ]; then + RET= + fi + # If there's a space in the answer, it's not valid, so go with the blank + # default instead. + if echo "$RET" | grep -q ' '; then + RET= + fi + else + RET= + fi + cat < /etc/default/gdm +# GDM Defaults, source in the init script that starts GDM. LANG setting is +# taken from the locales package by default. +EOF + if [ -z "$RET" ]; then + cat <> /etc/default/gdm +#LANG= +EOF + else + cat <> /etc/default/gdm +LANG=$RET +EOF + fi +fi +# debconf hangs if gdm gets started below without this +db_stop || true + +gdm_running= + +# NOTE: the binary on disk most likely has changed, so we can't use --exec +if start-stop-daemon --stop --quiet --name gdm --signal 0 --pid /var/run/gdm.pid; then + gdm_running=yes +fi + +if [ -d /var/state/gdm ]; then + if [ "$gdm_running" ]; then + echo "Note: obsolete directory /var/state/gdm cannot be removed when gdm" + echo "is running. Reinstall the gdm package (or remove the directory" + echo "manually) when gdm is not running." + else + rm -r /var/state/gdm + fi +fi + +if [ -e /etc/rc2.d/S99gdm ]; then + update-rc.d -f gdm remove >/dev/null +fi + +if [ -x /etc/init.d/gdm ]; then + update-rc.d gdm defaults 13 01 >/dev/null 2>&1 + invoke-rc.d gdm reload || true +fi + +#DEBHELPER# + +exit 0 --- gdm-2.13.0.5.orig/debian/patches/17_icons_for_menu.patch +++ gdm-2.13.0.5/debian/patches/17_icons_for_menu.patch @@ -0,0 +1,67 @@ +=== modified file 'gui/greeter/greeter_canvas_item.c' +--- gui/greeter/greeter_canvas_item.c ++++ gui/greeter/greeter_canvas_item.c +@@ -141,14 +141,18 @@ + menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (w), menu); + +- w = gtk_menu_item_new_with_mnemonic (_("Select _Language...")); ++ w = gtk_image_menu_item_new_with_mnemonic (_("Select _Language...")); ++ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (w), ++ gtk_image_new_from_icon_name ("config-language", GTK_ICON_SIZE_MENU)); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), w); + gtk_widget_show (GTK_WIDGET (w)); + g_signal_connect (G_OBJECT (w), "activate", + G_CALLBACK (activate_button), + "language_button"); + +- w = gtk_menu_item_new_with_mnemonic (_("Select _Session...")); ++ w = gtk_image_menu_item_new_with_mnemonic (_("Select _Session...")); ++ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (w), ++ gtk_image_new_from_icon_name ("gnome-session", GTK_ICON_SIZE_MENU)); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), w); + gtk_widget_show (GTK_WIDGET (w)); + g_signal_connect (G_OBJECT (w), "activate", +@@ -162,9 +166,13 @@ + * flexi, even if not local (non-local xnest). and Disconnect + * only for xdmcp */ + if ( ! ve_string_empty (g_getenv ("GDM_FLEXI_SERVER"))) { +- w = gtk_menu_item_new_with_mnemonic (_("_Quit")); ++ w = gtk_image_menu_item_new_with_mnemonic (_("_Quit")); ++ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (w), ++ gtk_image_new_from_icon_name ("gnome-logout", GTK_ICON_SIZE_MENU)); + } else if (ve_string_empty (g_getenv ("GDM_IS_LOCAL"))) { +- w = gtk_menu_item_new_with_mnemonic (_("D_isconnect")); ++ w = gtk_image_menu_item_new_with_mnemonic (_("D_isconnect")); ++ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (w), ++ gtk_image_new_from_icon_name ("gnome-logout", GTK_ICON_SIZE_MENU)); + } else { + w = NULL; + } + +=== modified file 'gui/greeter/greeter_system.c' +--- gui/greeter/greeter_system.c ++++ gui/greeter/greeter_system.c +@@ -205,7 +205,9 @@ + } + + if (GdmRebootFound) { +- w = gtk_menu_item_new_with_mnemonic (_("_Reboot")); ++ w = gtk_image_menu_item_new_with_mnemonic (_("_Reboot")); ++ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (w), ++ gtk_image_new_from_icon_name ("gnome-reboot", GTK_ICON_SIZE_MENU)); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), w); + gtk_widget_show (GTK_WIDGET (w)); + g_signal_connect (G_OBJECT (w), "activate", +@@ -217,7 +219,9 @@ + } + + if (GdmHaltFound) { +- w = gtk_menu_item_new_with_mnemonic (_("Shut _Down")); ++ w = gtk_image_menu_item_new_with_mnemonic (_("Shut _Down")); ++ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (w), ++ gtk_image_new_from_icon_name ("gnome-shutdown", GTK_ICON_SIZE_MENU)); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), w); + gtk_widget_show (GTK_WIDGET (w)); + g_signal_connect (G_OBJECT (w), "activate", + --- gdm-2.13.0.5.orig/debian/patches/09_menu_change.patch +++ gdm-2.13.0.5/debian/patches/09_menu_change.patch @@ -0,0 +1,11 @@ +diff -Nur gdm-2.13.0.1.orig/gui/gdmphotosetup.desktop.in gdm-2.13.0.1/gui/gdmphotosetup.desktop.in +--- gdm-2.13.0.1.orig/gui/gdmphotosetup.desktop.in 2003-07-26 20:57:15.000000000 +0200 ++++ gdm-2.13.0.1/gui/gdmphotosetup.desktop.in 2005-11-23 22:49:20.000000000 +0100 +@@ -10,6 +10,7 @@ + Terminal=false + Type=Application + Categories=Application;Settings;AdvancedSettings; ++NoDisplay=true + X-GNOME-Bugzilla-Bugzilla=GNOME + X-GNOME-Bugzilla-Product=gdm + X-GNOME-Bugzilla-Component=general --- gdm-2.13.0.5.orig/debian/patches/16_fix_user_list_crash.patch +++ gdm-2.13.0.5/debian/patches/16_fix_user_list_crash.patch @@ -0,0 +1,11 @@ +diff -Nur gdm-2.13.0.5.orig/daemon/fstype.c gdm-2.13.0.5/daemon/fstype.c +--- gdm-2.13.0.5.orig/daemon/fstype.c 2005-12-22 05:50:43.000000000 +0100 ++++ gdm-2.13.0.5/daemon/fstype.c 2006-01-18 22:22:18.000000000 +0100 +@@ -46,6 +46,7 @@ + #endif + #include + #include ++#include + #ifdef HAVE_LIBGEN_H + #include + #endif --- gdm-2.13.0.5.orig/debian/patches/18_button_for_menu.patch +++ gdm-2.13.0.5/debian/patches/18_button_for_menu.patch @@ -0,0 +1,62 @@ +=== modified file 'gui/greeter/greeter_canvas_item.c' +--- gui/greeter/greeter_canvas_item.c ++++ gui/greeter/greeter_canvas_item.c +@@ -200,6 +200,31 @@ + c->blue = (rgb & 0xff) * 0x101; + c->pixel = 0; + } ++ ++static void ++menu_position_func (GtkMenu *menu, ++ int *x, ++ int *y, ++ gboolean *push_in, ++ GreeterItemInfo *item) ++{ ++ GtkAllocation rect; ++ GtkRequisition requisition; ++ ++ rect = item->allocation; ++ gtk_widget_size_request (GTK_WIDGET (menu), &requisition); ++ *x=rect.x; ++ *y=rect.y-requisition.height-4; ++ *push_in=TRUE; ++ } ++ ++ static void ++ greeter_options_handler (GreeterItemInfo *item, GtkWidget *menubar) ++ { ++ gtk_menu_popup(GTK_MENU(gtk_menu_item_get_submenu(gtk_container_get_children(GTK_CONTAINER(menubar))->data)), NULL, NULL, ++ (GtkMenuPositionFunc)menu_position_func, ++ item, 0, gtk_get_current_event_time()); ++ } + + void + greeter_item_create_canvas_item (GreeterItemInfo *item) +@@ -396,6 +421,9 @@ + "width", (double)rect.width, + NULL); + ++ greeter_item_register_action_callback ("options_button", ++ (ActionFunc)greeter_options_handler, ++ menubar); + /* Here add a tooltip, so that the user knows about F10 */ + tooltips = gtk_tooltips_new (); + gtk_tooltips_set_tip (tooltips, GTK_WIDGET (entry), + +=== modified file 'gui/greeter/greeter_parser.c' +--- gui/greeter/greeter_parser.c ++++ gui/greeter/greeter_parser.c +@@ -1094,6 +1094,11 @@ + { + g_free (*translated_text); + *translated_text = g_strdup (_("_Configure")); ++ } ++ else if (g_ascii_strcasecmp ((char *) prop, "options") == 0) ++ { ++ g_free (*translated_text); ++ *translated_text = g_strdup (_("_Options")); + } + else if (g_ascii_strcasecmp ((char *) prop, "caps-lock-warning") == 0) + { + --- gdm-2.13.0.5.orig/debian/patches/04_menu_changes.patch +++ gdm-2.13.0.5/debian/patches/04_menu_changes.patch @@ -0,0 +1,22 @@ +diff -Nur gdm-2.13.0.1.orig/gui/gdmflexiserver.desktop.in gdm-2.13.0.1/gui/gdmflexiserver.desktop.in +--- gdm-2.13.0.1.orig/gui/gdmflexiserver.desktop.in 2004-05-13 03:39:52.000000000 +0200 ++++ gdm-2.13.0.1/gui/gdmflexiserver.desktop.in 2005-11-15 10:41:41.000000000 +0100 +@@ -7,6 +7,7 @@ + Icon=gdm + Terminal=false + Type=Application ++NoDisplay=true + Categories=Application;System; + X-GNOME-Bugzilla-Bugzilla=GNOME + X-GNOME-Bugzilla-Product=gdm +diff -Nur gdm-2.13.0.1.orig/gui/gdmflexiserver-xnest.desktop.in gdm-2.13.0.1/gui/gdmflexiserver-xnest.desktop.in +--- gdm-2.13.0.1.orig/gui/gdmflexiserver-xnest.desktop.in 2004-05-13 03:39:52.000000000 +0200 ++++ gdm-2.13.0.1/gui/gdmflexiserver-xnest.desktop.in 2005-11-15 10:41:33.000000000 +0100 +@@ -10,6 +10,7 @@ + Icon=gdm-xnest + Terminal=false + Type=Application ++NoDisplay=true + Categories=Application;System; + X-GNOME-Bugzilla-Bugzilla=GNOME + X-GNOME-Bugzilla-Product=gdm --- gdm-2.13.0.5.orig/debian/patches/15_usplash.patch +++ gdm-2.13.0.5/debian/patches/15_usplash.patch @@ -0,0 +1,14 @@ +diff -Nur gdm-2.8.0.4/debian/init gdm-2.8.0.4.new/debian/init +--- gdm-2.8.0.4/debian/init 2005-09-29 15:56:09.000000000 +0200 ++++ gdm-2.8.0.4.new/debian/init 2005-09-29 15:56:58.000000000 +0200 +@@ -42,6 +42,10 @@ + if [ -e "$DEFAULT_DISPLAY_MANAGER_FILE" -a "$HEED_DEFAULT_DISPLAY_MANAGER" = "true" -a "$(cat $DEFAULT_DISPLAY_MANAGER_FILE)" != "$DAEMON" ]; then + log_warning_msg "Not starting GNOME Display Manager (gdm); it is not the default display manager." + else ++ # if usplash is runing, make sure to stop it now ++ if pidof usplash > /dev/null; then ++ /etc/init.d/usplash stop ++ fi + log_begin_msg "Starting GNOME Display Manager..." + start-stop-daemon --start --quiet --pidfile $PIDFILE --name gdm $SSD_ARG >/dev/null 2>&1 || log_end_msg 1 + log_end_msg 0 --- gdm-2.13.0.5.orig/debian/patches/11_powermanagement.patch +++ gdm-2.13.0.5/debian/patches/11_powermanagement.patch @@ -0,0 +1,9537 @@ +diff -Nur gdm-2.13.0.5.orig/daemon/gdm.c gdm-2.13.0.5/daemon/gdm.c +--- gdm-2.13.0.5.orig/daemon/gdm.c 2006-01-15 23:49:08.000000000 +0100 ++++ gdm-2.13.0.5/daemon/gdm.c 2006-01-15 23:59:14.000000000 +0100 +@@ -597,6 +597,42 @@ + } + } + ++static void ++hibernate_machine (void) ++{ ++ gchar *hibernate = gdm_get_value_string (GDM_KEY_HIBERNATE); ++ ++ gdm_info (_("Master hibernating...")); ++ ++ if (hibernate != NULL && fork () == 0) { ++ char **argv; ++ ++ /* sync everything to disk, just in case something goes ++ * wrong with the hibernation */ ++ sync (); ++ ++ if (gdm_get_value_bool (GDM_KEY_XDMCP)) ++ gdm_xdmcp_close (); ++ /* In the child setup empty mask and set all signals to ++ * default values */ ++ gdm_unset_signals (); ++ ++ /* Also make a new process group */ ++ setsid (); ++ ++ VE_IGNORE_EINTR (chdir ("/")); ++ ++ /* short sleep to give some processing time to master */ ++ usleep (1000); ++ ++ argv = ve_split (hibernate); ++ if (argv != NULL && argv[0] != NULL) ++ VE_IGNORE_EINTR (execv (argv[0], argv)); ++ /* FIXME: what about fail */ ++ _exit (1); ++ } ++} ++ + #ifdef __linux__ + static void + change_to_first_and_clear (gboolean reboot) +@@ -3175,9 +3211,80 @@ + g_string_append (msg, "!"); + sep = ";"; + } ++ if (sysmenu && disp->attached && ++ ! ve_string_empty (gdm_get_value_string (GDM_KEY_HIBERNATE))) { ++ g_string_append_printf (msg, "%s%s", sep, GDM_SUP_LOGOUT_ACTION_HIBERNATE); ++ if (logout_action == GDM_LOGOUT_ACTION_HIBERNATE) ++ g_string_append (msg, "!"); ++ sep = ";"; ++ } + g_string_append (msg, "\n"); + gdm_connection_write (conn, msg->str); + g_string_free (msg, TRUE); ++ } else if (strncmp (msg, GDM_SUP_SET_SUSPEND, ++ strlen (GDM_SUP_SET_SUSPEND)) == 0) { ++ GdmDisplay *disp; ++ gboolean was_ok = FALSE; ++ gboolean sysmenu = gdm_get_value_bool (GDM_KEY_SYSTEM_MENU); ++ ++ disp = gdm_connection_get_display (conn); ++ ++ /* Only allow locally authenticated connections */ ++ if ( ! GDM_CONN_AUTHENTICATED(conn) || ++ disp == NULL || ++ ! disp->logged_in) { ++ gdm_info (_("%s request denied: " ++ "Not authenticated"), "SET_SUSPEND"); ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ return; ++ } ++ ++ if (sysmenu && disp->attached && ++ ! ve_string_empty (gdm_get_value_string (GDM_KEY_SUSPEND))) { ++ was_ok = TRUE; ++ } ++ ++ if (was_ok) { ++ gdm_connection_write (conn, "OK\n"); ++ gdm_try_logout_action (disp); ++ } else { ++ gdm_connection_write (conn, "ERROR 7 Unknown logout action, or not available\n"); ++ } ++ ++ suspend_machine (); ++ } else if (strncmp (msg, GDM_SUP_SET_HIBERNATE, ++ strlen (GDM_SUP_SET_HIBERNATE)) == 0) { ++ GdmDisplay *disp; ++ gboolean was_ok = FALSE; ++ gboolean sysmenu = gdm_get_value_bool (GDM_KEY_SYSTEM_MENU); ++ ++ disp = gdm_connection_get_display (conn); ++ ++ /* Only allow locally authenticated connections */ ++ if ( ! GDM_CONN_AUTHENTICATED(conn) || ++ disp == NULL || ++ ! disp->logged_in) { ++ gdm_info (_("%s request denied: " ++ "Not authenticated"), "SET_HIBERNATE"); ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ return; ++ } ++ ++ if (sysmenu && disp->attached && ++ ! ve_string_empty (gdm_get_value_string (GDM_KEY_HIBERNATE))) { ++ was_ok = TRUE; ++ } ++ ++ if (was_ok) { ++ gdm_connection_write (conn, "OK\n"); ++ gdm_try_logout_action (disp); ++ } else { ++ gdm_connection_write (conn, "ERROR 7 Unknown logout action, or not available\n"); ++ } ++ ++ hibernate_machine (); + } else if (strncmp (msg, GDM_SUP_SET_LOGOUT_ACTION " ", + strlen (GDM_SUP_SET_LOGOUT_ACTION " ")) == 0) { + const char *action = +diff -Nur gdm-2.13.0.5.orig/daemon/gdmconfig.c gdm-2.13.0.5/daemon/gdmconfig.c +--- gdm-2.13.0.5.orig/daemon/gdmconfig.c 2006-01-15 23:49:08.000000000 +0100 ++++ gdm-2.13.0.5/daemon/gdmconfig.c 2006-01-15 23:59:14.000000000 +0100 +@@ -116,6 +116,8 @@ + static gchar *GdmRebootReal = NULL; + static gchar *GdmSuspend = NULL; + static gchar *GdmSuspendReal = NULL; ++static gchar *GdmHibernate = NULL; ++static gchar *GdmHibernateReal = NULL; + static gchar *GdmServAuthDir = NULL; + static gchar *GdmMulticastAddr; + static gchar *GdmUserAuthDir = NULL; +@@ -437,6 +439,7 @@ + gdm_config_add_hash (GDM_KEY_REBOOT, &GdmReboot, &string_type); + gdm_config_add_hash (GDM_KEY_HALT, &GdmHalt, &string_type); + gdm_config_add_hash (GDM_KEY_SUSPEND, &GdmSuspend, &string_type); ++ gdm_config_add_hash (GDM_KEY_HIBERNATE, &GdmHibernate, &string_type); + gdm_config_add_hash (GDM_KEY_LOG_DIR, &GdmLogDir, &string_type); + gdm_config_add_hash (GDM_KEY_PID_FILE, &GdmPidFile, &string_type); + gdm_config_add_hash (GDM_KEY_GLOBAL_FACE_DIR, &GdmGlobalFaceDir, &string_type); +@@ -854,7 +857,8 @@ + /* Halt, Reboot, and Suspend commands */ + } else if (is_key (key, GDM_KEY_HALT) || + is_key (key, GDM_KEY_REBOOT) || +- is_key (key, GDM_KEY_SUSPEND)) { ++ is_key (key, GDM_KEY_SUSPEND) || ++ is_key (key, GDM_KEY_HIBERNATE)) { + if (value != NULL) + *setting = ve_get_first_working_command (value, FALSE); + else +diff -Nur gdm-2.13.0.5.orig/daemon/gdmconfig.c.orig gdm-2.13.0.5/daemon/gdmconfig.c.orig +--- gdm-2.13.0.5.orig/daemon/gdmconfig.c.orig 1970-01-01 01:00:00.000000000 +0100 ++++ gdm-2.13.0.5/daemon/gdmconfig.c.orig 2006-01-15 23:49:08.000000000 +0100 +@@ -0,0 +1,2492 @@ ++/* GDM - The GNOME Display Manager ++ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen ++ * Copyright (C) 2005 Brian Cameron ++ * ++ * This program is free software; you can redistribute 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 ++ */ ++ ++/* ++ * gdmconfig.c isolates most logic that interacts with vicious-extensions ++ * into a single file and provides a mechanism for interacting with GDM ++ * configuration optins via access functions for getting/setting values. ++ * This logic also ensures that the same configuration validation happens ++ * when loading the values initially or setting them via the ++ * GDM_UPDATE_CONFIG socket command. ++ * ++ * When adding a new configuration option, simply add the new option to ++ * gdm.h and to the val_hash and type_hash hashes in the gdm_config_init ++ * function. Any validation for the configuration option should be ++ * placed in the _gdm_set_value_string, _gdm_set_value_int, or ++ * _gdm_set_value_bool functions. ++ */ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "vicious.h" ++ ++#include "gdm.h" ++#include "verify.h" ++#include "gdm-net.h" ++#include "misc.h" ++#include "server.h" ++#include "filecheck.h" ++#include "slave.h" ++ ++gchar *config_file = NULL; ++gchar *custom_config_file = NULL; ++static time_t config_file_mtime = 0; ++static time_t custom_config_file_mtime = 0; ++ ++extern gboolean no_console; ++extern gboolean gdm_emergency_server; ++ ++GSList *displays = NULL; ++GSList *displays_inactive = NULL; ++GSList *xservers = NULL; ++ ++gint high_display_num = 0; ++ ++typedef enum { ++ CONFIG_BOOL, ++ CONFIG_INT, ++ CONFIG_STRING ++} GdmConfigType; ++ ++static GHashTable *type_hash = NULL; ++static GHashTable *val_hash = NULL; ++static GHashTable *translated_hash = NULL; ++static GHashTable *realkey_hash = NULL; ++static GdmConfigType bool_type = CONFIG_BOOL; ++static GdmConfigType int_type = CONFIG_INT; ++static GdmConfigType string_type = CONFIG_STRING; ++ ++static uid_t GdmUserId; /* Userid under which gdm should run */ ++static gid_t GdmGroupId; /* Gruopid under which gdm should run */ ++ ++/* Config options used by daemon */ ++/* ----------------------------- */ ++static gchar *GdmUser = NULL; ++static gchar *GdmGroup = NULL; ++static gchar *GdmGtkRC = NULL; ++static gchar *GdmGtkTheme = NULL; ++static gchar *GdmSessDir = NULL; ++static gchar *GdmBaseXsession = NULL; ++static gchar *GdmDefaultSession = NULL; ++static gchar *GdmAutomaticLogin = NULL; ++static gchar *GdmConfigurator = NULL; ++static gchar *GdmGlobalFaceDir = NULL; ++static gchar *GdmGreeter = NULL; ++static gchar *GdmRemoteGreeter = NULL; ++static gchar *GdmGtkModulesList = NULL; ++static gchar *GdmChooser = NULL; ++static gchar *GdmLogDir = NULL; ++static gchar *GdmDisplayInit = NULL; ++static gchar *GdmPostLogin = NULL; ++static gchar *GdmPreSession = NULL; ++static gchar *GdmPostSession = NULL; ++static gchar *GdmFailsafeXserver = NULL; ++static gchar *GdmXKeepsCrashing = NULL; ++static gchar *GdmHalt = NULL; ++static gchar *GdmHaltReal = NULL; ++static gchar *GdmReboot = NULL; ++static gchar *GdmRebootReal = NULL; ++static gchar *GdmSuspend = NULL; ++static gchar *GdmSuspendReal = NULL; ++static gchar *GdmServAuthDir = NULL; ++static gchar *GdmMulticastAddr; ++static gchar *GdmUserAuthDir = NULL; ++static gchar *GdmUserAuthFile = NULL; ++static gchar *GdmUserAuthFallback = NULL; ++static gchar *GdmPidFile = NULL; ++static gchar *GdmPath = NULL; ++static gchar *GdmRootPath = NULL; ++static gchar *GdmWilling = NULL; ++static gchar *GdmXdmcpProxyXserver = NULL; ++static gchar *GdmXdmcpProxyReconnect = NULL; ++static gchar *GdmTimedLogin = NULL; ++static gchar *GdmStandardXserver = NULL; ++static gchar *GdmXnest = NULL; ++static gchar *GdmSoundProgram = NULL; ++static gchar *GdmSoundOnLoginFile = NULL; ++static gchar *GdmSoundOnLoginSuccessFile = NULL; ++static gchar *GdmSoundOnLoginFailureFile = NULL; ++static gchar *GdmConsoleCannotHandle = NULL; ++ ++static gint GdmXineramaScreen = 0; ++static gint GdmUserMaxFile = 0; ++static gint GdmDisplaysPerHost = 0; ++static gint GdmMaxPending = 0; ++static gint GdmMaxSessions = 0; ++static gint GdmUdpPort = 0; ++static gint GdmMaxIndirect = 0; ++static gint GdmMaxWaitIndirect = 0; ++static gint GdmPingInterval = 0; ++static gint GdmRelaxPerm = 0; ++static gint GdmRetryDelay = 0; ++static gint GdmTimedLoginDelay = 0; ++static gint GdmFlexibleXservers = 5; ++static gint GdmFirstVt = 7; ++ ++/* The SDTLOGIN feature is Solaris specific, and causes the Xserver to be ++ * run with user permissionsinstead of as root, which adds security but ++ * disables the AlwaysRestartServer option as highlighted in the gdm ++ * documentation */ ++#ifdef sun ++gboolean GdmAlwaysRestartServer = TRUE; ++#else ++gboolean GdmAlwaysRestartServer = FALSE; ++#endif ++static gboolean GdmAutomaticLoginEnable = FALSE; ++static gboolean GdmConfigAvailable = FALSE; ++static gboolean GdmSystemMenu = FALSE; ++static gboolean GdmNoXKeepsCrashing = FALSE; ++static gboolean GdmChooserButton = FALSE; ++static gboolean GdmBrowser = FALSE; ++static gboolean GdmAddGtkModules = FALSE; ++static gboolean GdmDoubleLoginWarning = TRUE; ++static gboolean GdmAlwaysLoginCurrentSession = FALSE; ++static gboolean GdmDisplayLastLogin = TRUE; ++static gboolean GdmMulticast; ++static gboolean GdmNeverPlaceCookiesOnNfs = TRUE; ++static gboolean GdmPasswordRequired = FALSE; ++static gboolean GdmKillInitClients = FALSE; ++static gboolean GdmXdmcp = FALSE; ++static gboolean GdmIndirect = FALSE; ++static gboolean GdmXdmcpProxy = FALSE; ++static gboolean GdmDebug = FALSE; ++static gboolean GdmDebugGestures = FALSE; ++static gboolean GdmAllowRoot = FALSE; ++static gboolean GdmAllowRemoteRoot = FALSE; ++static gboolean GdmAllowRemoteAutoLogin = FALSE; ++static gboolean GdmCheckDirOwner = TRUE; ++static gboolean GdmTimedLoginEnable = FALSE; ++static gboolean GdmDynamicXservers = FALSE; ++static gboolean GdmVTAllocation = TRUE; ++static gboolean GdmDisallowTcp = TRUE; ++static gboolean GdmSoundOnLogin = TRUE; ++static gboolean GdmSoundOnLoginSuccess = FALSE; ++static gboolean GdmSoundOnLoginFailure = FALSE; ++static gboolean GdmConsoleNotify = TRUE; ++ ++/* Config options used by slave */ ++/* ---------------------------- */ ++static gchar *GdmInitDir; ++static gchar *GdmGtkRc; ++static gchar *GdmGtkThemesToAllow; ++static gchar *GdmInclude; ++static gchar *GdmExclude; ++static gchar *GdmDefaultFace; ++static gchar *GdmLocaleFile; ++static gchar *GdmLogo; ++static gchar *GdmChooserButtonLogo; ++static gchar *GdmWelcome; ++static gchar *GdmRemoteWelcome; ++static gchar *GdmBackgroundProgram; ++static gchar *GdmBackgroundImage; ++static gchar *GdmBackgroundColor; ++static gchar *GdmGraphicalTheme; ++static gchar *GdmInfoMsgFile; ++static gchar *GdmInfoMsgFont; ++static gchar *GdmHost; ++static gchar *GdmHostImageDir; ++static gchar *GdmHosts; ++static gchar *GdmGraphicalThemeColor; ++static gchar *GdmGraphicalThemeDir; ++static gchar *GdmGraphicalThemes; ++static gchar *GdmPreFetchProgram; ++ ++static gint GdmPositionX; ++static gint GdmPositionY; ++static gint GdmMinimalUid; ++static gint GdmMaxIconWidth; ++static gint GdmMaxIconHeight; ++static gint GdmBackgroundType; ++static gint GdmScanTime; ++static gint GdmMaxWait; ++static gint GdmFlexiReapDelayMinutes; ++ ++static gboolean GdmAllowGtkThemeChange; ++static gboolean GdmTitleBar; ++static gboolean GdmIncludeAll; ++static gboolean GdmDefaultWelcome; ++static gboolean GdmDefaultRemoteWelcome; ++static gboolean GdmLockPosition; ++static gboolean GdmBackgroundScaleToFit; ++static gboolean GdmBackgroundRemoteOnlyColor; ++static gboolean GdmRunBackgroundProgramAlways; ++static gboolean GdmSetPosition; ++static gboolean GdmQuiver; ++static gboolean GdmShowGnomeFailsafe; ++static gboolean GdmShowXtermFailsafe; ++static gboolean GdmShowLastSession; ++static gboolean GdmUse24Clock; ++static gboolean GdmEntryCircles; ++static gboolean GdmEntryInvisible; ++static gboolean GdmGraphicalThemeRand; ++static gboolean GdmBroadcast; ++static gboolean GdmAllowAdd; ++ ++/** ++ * gdm_config_add_hash ++ * ++ * Add config value to the val_hash and type_hash. Strip the key so ++ * it doesn't contain a default value. This function assumes the ++ * val_hash, type_hash, and realkey_hash have been initialized. ++ */ ++static void ++gdm_config_add_hash (gchar *key, gpointer value, GdmConfigType *type) ++{ ++ gchar *p; ++ gchar *newkey = g_strdup (key); ++ ++ g_strstrip (newkey); ++ p = strchr (newkey, '='); ++ if (p != NULL) ++ *p = '\0'; ++ ++ g_hash_table_insert (val_hash, newkey, value); ++ g_hash_table_insert (type_hash, newkey, type); ++ g_hash_table_insert (realkey_hash, newkey, key); ++} ++ ++/** ++ * gdm_config_hash_lookup ++ * ++ * Accesses hash with key, stripping it so it doesn't contain a default ++ * value. ++ */ ++static gpointer ++gdm_config_hash_lookup (GHashTable *hash, gchar *key) ++{ ++ gchar *p; ++ gpointer *ret; ++ gchar *newkey = g_strdup (key); ++ ++ g_strstrip (newkey); ++ p = strchr (newkey, '='); ++ if (p != NULL) ++ *p = '\0'; ++ ++ ret = g_hash_table_lookup (hash, newkey); ++ g_free (newkey); ++ return (ret); ++} ++ ++/** ++ * is_key ++ * ++ * Since GDM keys sometimes have default values defined in the gdm.h header ++ * file (e.g. key=value), this function strips off the "=value" from both ++ * keys passed and compares them, returning TRUE if they are the same, ++ * FALSE otherwise. ++ */ ++static gboolean ++is_key (const gchar *key1, const gchar *key2) ++{ ++ gchar *key1d, *key2d, *p; ++ ++ key1d = g_strdup (key1); ++ key2d = g_strdup (key2); ++ ++ g_strstrip (key1d); ++ p = strchr (key1d, '='); ++ if (p != NULL) ++ *p = '\0'; ++ ++ g_strstrip (key2d); ++ p = strchr (key2d, '='); ++ if (p != NULL) ++ *p = '\0'; ++ ++ if (strcmp (ve_sure_string (key1d), ve_sure_string (key2d)) == 0) { ++ g_free (key1d); ++ g_free (key2d); ++ return TRUE; ++ } else { ++ g_free (key1d); ++ g_free (key2d); ++ return FALSE; ++ } ++} ++ ++/** ++ * gdm_config_init ++ * ++ * Sets up initial hashes used by configuration routines. ++ */ ++static void ++gdm_config_init (void) ++{ ++ type_hash = g_hash_table_new (g_str_hash, g_str_equal); ++ val_hash = g_hash_table_new (g_str_hash, g_str_equal); ++ realkey_hash = g_hash_table_new (g_str_hash, g_str_equal); ++ ++ /* boolean values */ ++ gdm_config_add_hash (GDM_KEY_ALLOW_REMOTE_ROOT, &GdmAllowRemoteRoot, &bool_type); ++ gdm_config_add_hash (GDM_KEY_ALLOW_ROOT, &GdmAllowRoot, &bool_type); ++ gdm_config_add_hash (GDM_KEY_ALLOW_REMOTE_AUTOLOGIN, ++ &GdmAllowRemoteAutoLogin, &bool_type); ++ gdm_config_add_hash (GDM_KEY_PASSWORD_REQUIRED, &GdmPasswordRequired, &bool_type); ++ gdm_config_add_hash (GDM_KEY_AUTOMATIC_LOGIN_ENABLE, ++ &GdmAutomaticLoginEnable, &bool_type); ++ gdm_config_add_hash (GDM_KEY_ALWAYS_RESTART_SERVER, ++ &GdmAlwaysRestartServer, &bool_type); ++ gdm_config_add_hash (GDM_KEY_ADD_GTK_MODULES, &GdmAddGtkModules, &bool_type); ++ gdm_config_add_hash (GDM_KEY_DOUBLE_LOGIN_WARNING, ++ &GdmDoubleLoginWarning, &bool_type); ++ gdm_config_add_hash (GDM_KEY_ALWAYS_LOGIN_CURRENT_SESSION, ++ &GdmAlwaysLoginCurrentSession, &bool_type); ++ gdm_config_add_hash (GDM_KEY_DISPLAY_LAST_LOGIN, &GdmDisplayLastLogin, &bool_type); ++ gdm_config_add_hash (GDM_KEY_KILL_INIT_CLIENTS, &GdmKillInitClients, &bool_type); ++ gdm_config_add_hash (GDM_KEY_CONFIG_AVAILABLE, &GdmConfigAvailable, &bool_type); ++ gdm_config_add_hash (GDM_KEY_SYSTEM_MENU, &GdmSystemMenu, &bool_type); ++ gdm_config_add_hash (GDM_KEY_CHOOSER_BUTTON, &GdmChooserButton, &bool_type); ++ gdm_config_add_hash (GDM_KEY_NOXKEEPSCRASHING, &GdmNoXKeepsCrashing, &bool_type); ++ gdm_config_add_hash (GDM_KEY_BROWSER, &GdmBrowser, &bool_type); ++ gdm_config_add_hash (GDM_KEY_MULTICAST, &GdmMulticast, &bool_type); ++ gdm_config_add_hash (GDM_KEY_NEVER_PLACE_COOKIES_ON_NFS, ++ &GdmNeverPlaceCookiesOnNfs, &bool_type); ++ gdm_config_add_hash (GDM_KEY_CONSOLE_NOTIFY, &GdmConsoleNotify, &bool_type); ++ gdm_config_add_hash (GDM_KEY_TIMED_LOGIN_ENABLE, &GdmTimedLoginEnable, &bool_type); ++ gdm_config_add_hash (GDM_KEY_CHECK_DIR_OWNER, &GdmCheckDirOwner, &bool_type); ++ gdm_config_add_hash (GDM_KEY_XDMCP, &GdmXdmcp, &bool_type); ++ gdm_config_add_hash (GDM_KEY_INDIRECT, &GdmIndirect, &bool_type); ++ gdm_config_add_hash (GDM_KEY_XDMCP_PROXY, &GdmXdmcpProxy, &bool_type); ++ gdm_config_add_hash (GDM_KEY_DYNAMIC_XSERVERS, &GdmDynamicXservers, &bool_type); ++ gdm_config_add_hash (GDM_KEY_VT_ALLOCATION, &GdmVTAllocation, &bool_type); ++ gdm_config_add_hash (GDM_KEY_DISALLOW_TCP, &GdmDisallowTcp, &bool_type); ++ gdm_config_add_hash (GDM_KEY_SOUND_ON_LOGIN_SUCCESS, ++ &GdmSoundOnLoginSuccess, &bool_type); ++ gdm_config_add_hash (GDM_KEY_SOUND_ON_LOGIN_FAILURE, ++ &GdmSoundOnLoginFailure, &bool_type); ++ gdm_config_add_hash (GDM_KEY_DEBUG, &GdmDebug, &bool_type); ++ gdm_config_add_hash (GDM_KEY_DEBUG_GESTURES, &GdmDebugGestures, &bool_type); ++ gdm_config_add_hash (GDM_KEY_ALLOW_GTK_THEME_CHANGE, ++ &GdmAllowGtkThemeChange, &bool_type); ++ gdm_config_add_hash (GDM_KEY_TITLE_BAR, &GdmTitleBar, &bool_type); ++ gdm_config_add_hash (GDM_KEY_INCLUDE_ALL, &GdmIncludeAll, &bool_type); ++ gdm_config_add_hash (GDM_KEY_DEFAULT_WELCOME, &GdmDefaultWelcome, &bool_type); ++ gdm_config_add_hash (GDM_KEY_DEFAULT_REMOTE_WELCOME, ++ &GdmDefaultRemoteWelcome, &bool_type); ++ gdm_config_add_hash (GDM_KEY_LOCK_POSITION, &GdmLockPosition, &bool_type); ++ gdm_config_add_hash (GDM_KEY_BACKGROUND_SCALE_TO_FIT, ++ &GdmBackgroundScaleToFit, &bool_type); ++ gdm_config_add_hash (GDM_KEY_BACKGROUND_REMOTE_ONLY_COLOR, ++ &GdmBackgroundRemoteOnlyColor, &bool_type); ++ gdm_config_add_hash (GDM_KEY_RUN_BACKGROUND_PROGRAM_ALWAYS, ++ &GdmRunBackgroundProgramAlways, &bool_type); ++ gdm_config_add_hash (GDM_KEY_SET_POSITION, &GdmSetPosition, &bool_type); ++ gdm_config_add_hash (GDM_KEY_QUIVER, &GdmQuiver, &bool_type); ++ gdm_config_add_hash (GDM_KEY_SHOW_GNOME_FAILSAFE, ++ &GdmShowGnomeFailsafe, &bool_type); ++ gdm_config_add_hash (GDM_KEY_SHOW_XTERM_FAILSAFE, ++ &GdmShowXtermFailsafe, &bool_type); ++ gdm_config_add_hash (GDM_KEY_SHOW_LAST_SESSION, ++ &GdmShowLastSession, &bool_type); ++ gdm_config_add_hash (GDM_KEY_USE_24_CLOCK, &GdmUse24Clock, &bool_type); ++ gdm_config_add_hash (GDM_KEY_ENTRY_CIRCLES, &GdmEntryCircles, &bool_type); ++ gdm_config_add_hash (GDM_KEY_ENTRY_INVISIBLE, &GdmEntryInvisible, &bool_type); ++ gdm_config_add_hash (GDM_KEY_GRAPHICAL_THEME_RAND, ++ &GdmGraphicalThemeRand, &bool_type); ++ gdm_config_add_hash (GDM_KEY_BROADCAST, &GdmBroadcast, &bool_type); ++ gdm_config_add_hash (GDM_KEY_ALLOW_ADD, &GdmAllowAdd, &bool_type); ++ gdm_config_add_hash (GDM_KEY_SOUND_ON_LOGIN, &GdmSoundOnLogin, &bool_type); ++ ++ /* string values */ ++ gdm_config_add_hash (GDM_KEY_PATH, &GdmPath, &string_type); ++ gdm_config_add_hash (GDM_KEY_ROOT_PATH, &GdmRootPath, &string_type); ++ gdm_config_add_hash (GDM_KEY_CONSOLE_CANNOT_HANDLE, ++ &GdmConsoleCannotHandle, &string_type); ++ gdm_config_add_hash (GDM_KEY_CHOOSER, &GdmChooser, &string_type); ++ gdm_config_add_hash (GDM_KEY_GREETER, &GdmGreeter, &string_type); ++ gdm_config_add_hash (GDM_KEY_CONFIGURATOR, &GdmConfigurator, &string_type); ++ gdm_config_add_hash (GDM_KEY_POSTLOGIN, &GdmPostLogin, &string_type); ++ gdm_config_add_hash (GDM_KEY_PRESESSION, &GdmPreSession, &string_type); ++ gdm_config_add_hash (GDM_KEY_POSTSESSION, &GdmPostSession, &string_type); ++ gdm_config_add_hash (GDM_KEY_FAILSAFE_XSERVER, &GdmFailsafeXserver, &string_type); ++ gdm_config_add_hash (GDM_KEY_X_KEEPS_CRASHING, &GdmXKeepsCrashing, &string_type); ++ gdm_config_add_hash (GDM_KEY_BASE_XSESSION, &GdmBaseXsession, &string_type); ++ gdm_config_add_hash (GDM_KEY_REMOTE_GREETER, &GdmRemoteGreeter, &string_type); ++ gdm_config_add_hash (GDM_KEY_DISPLAY_INIT_DIR, &GdmInitDir, &string_type); ++ gdm_config_add_hash (GDM_KEY_AUTOMATIC_LOGIN, &GdmAutomaticLogin, &string_type); ++ gdm_config_add_hash (GDM_KEY_GTK_MODULES_LIST, &GdmGtkModulesList, &string_type); ++ gdm_config_add_hash (GDM_KEY_REBOOT, &GdmReboot, &string_type); ++ gdm_config_add_hash (GDM_KEY_HALT, &GdmHalt, &string_type); ++ gdm_config_add_hash (GDM_KEY_SUSPEND, &GdmSuspend, &string_type); ++ gdm_config_add_hash (GDM_KEY_LOG_DIR, &GdmLogDir, &string_type); ++ gdm_config_add_hash (GDM_KEY_PID_FILE, &GdmPidFile, &string_type); ++ gdm_config_add_hash (GDM_KEY_GLOBAL_FACE_DIR, &GdmGlobalFaceDir, &string_type); ++ gdm_config_add_hash (GDM_KEY_SERV_AUTHDIR, &GdmServAuthDir, &string_type); ++ gdm_config_add_hash (GDM_KEY_USER_AUTHDIR, &GdmUserAuthDir, &string_type); ++ gdm_config_add_hash (GDM_KEY_USER_AUTHFILE, &GdmUserAuthFile, &string_type); ++ gdm_config_add_hash (GDM_KEY_USER_AUTHDIR_FALLBACK, ++ &GdmUserAuthFallback, &string_type); ++ gdm_config_add_hash (GDM_KEY_SESSION_DESKTOP_DIR, &GdmSessDir, &string_type); ++ gdm_config_add_hash (GDM_KEY_DEFAULT_SESSION, &GdmDefaultSession, &string_type); ++ gdm_config_add_hash (GDM_KEY_MULTICAST_ADDR, &GdmMulticastAddr, &string_type); ++ gdm_config_add_hash (GDM_KEY_USER, &GdmUser, &string_type); ++ gdm_config_add_hash (GDM_KEY_GROUP, &GdmGroup, &string_type); ++ gdm_config_add_hash (GDM_KEY_GTKRC, &GdmGtkRc, &string_type); ++ gdm_config_add_hash (GDM_KEY_GTK_THEME, &GdmGtkTheme, &string_type); ++ gdm_config_add_hash (GDM_KEY_TIMED_LOGIN, &GdmTimedLogin, &string_type); ++ gdm_config_add_hash (GDM_KEY_WILLING, &GdmWilling, &string_type); ++ gdm_config_add_hash (GDM_KEY_XDMCP_PROXY_XSERVER, ++ &GdmXdmcpProxyXserver, &string_type); ++ gdm_config_add_hash (GDM_KEY_XDMCP_PROXY_RECONNECT, ++ &GdmXdmcpProxyReconnect, &string_type); ++ gdm_config_add_hash (GDM_KEY_STANDARD_XSERVER, &GdmStandardXserver, &string_type); ++ gdm_config_add_hash (GDM_KEY_XNEST, &GdmXnest, &string_type); ++ gdm_config_add_hash (GDM_KEY_SOUND_PROGRAM, &GdmSoundProgram, &string_type); ++ gdm_config_add_hash (GDM_KEY_SOUND_ON_LOGIN_FILE, ++ &GdmSoundOnLoginFile, &string_type); ++ gdm_config_add_hash (GDM_KEY_SOUND_ON_LOGIN_SUCCESS_FILE, ++ &GdmSoundOnLoginSuccessFile, &string_type); ++ gdm_config_add_hash (GDM_KEY_SOUND_ON_LOGIN_FAILURE_FILE, ++ &GdmSoundOnLoginFailureFile, &string_type); ++ gdm_config_add_hash (GDM_KEY_GTK_THEMES_TO_ALLOW, ++ &GdmGtkThemesToAllow, &string_type); ++ gdm_config_add_hash (GDM_KEY_INCLUDE, &GdmInclude, &string_type); ++ gdm_config_add_hash (GDM_KEY_EXCLUDE, &GdmExclude, &string_type); ++ gdm_config_add_hash (GDM_KEY_DEFAULT_FACE, &GdmDefaultFace, &string_type); ++ gdm_config_add_hash (GDM_KEY_LOCALE_FILE, &GdmLocaleFile, &string_type); ++ gdm_config_add_hash (GDM_KEY_LOGO, &GdmLogo, &string_type); ++ gdm_config_add_hash (GDM_KEY_CHOOSER_BUTTON_LOGO, ++ &GdmChooserButtonLogo, &string_type); ++ gdm_config_add_hash (GDM_KEY_WELCOME, &GdmWelcome, &string_type); ++ gdm_config_add_hash (GDM_KEY_REMOTE_WELCOME, &GdmRemoteWelcome, &string_type); ++ gdm_config_add_hash (GDM_KEY_BACKGROUND_PROGRAM, ++ &GdmBackgroundProgram, &string_type); ++ gdm_config_add_hash (GDM_KEY_BACKGROUND_IMAGE, ++ &GdmBackgroundImage, &string_type); ++ gdm_config_add_hash (GDM_KEY_BACKGROUND_COLOR, ++ &GdmBackgroundColor, &string_type); ++ gdm_config_add_hash (GDM_KEY_GRAPHICAL_THEME, ++ &GdmGraphicalTheme, &string_type); ++ gdm_config_add_hash (GDM_KEY_GRAPHICAL_THEME_DIR, ++ &GdmGraphicalThemeDir, &string_type); ++ gdm_config_add_hash (GDM_KEY_GRAPHICAL_THEMES, ++ &GdmGraphicalThemes, &string_type); ++ gdm_config_add_hash (GDM_KEY_GRAPHICAL_THEME_COLOR, ++ &GdmGraphicalThemeColor, &string_type); ++ gdm_config_add_hash (GDM_KEY_INFO_MSG_FILE, &GdmInfoMsgFile, &string_type); ++ gdm_config_add_hash (GDM_KEY_INFO_MSG_FONT, &GdmInfoMsgFont, &string_type); ++ gdm_config_add_hash (GDM_KEY_DEFAULT_HOST_IMG, &GdmHost, &string_type); ++ gdm_config_add_hash (GDM_KEY_HOST_IMAGE_DIR, &GdmHostImageDir, &string_type); ++ gdm_config_add_hash (GDM_KEY_HOSTS, &GdmHosts, &string_type); ++ gdm_config_add_hash (GDM_KEY_PRE_FETCH_PROGRAM, ++ &GdmPreFetchProgram, &string_type); ++ ++ /* int values */ ++ gdm_config_add_hash (GDM_KEY_XINERAMA_SCREEN, &GdmXineramaScreen, &int_type); ++ gdm_config_add_hash (GDM_KEY_RETRY_DELAY, &GdmRetryDelay, &int_type); ++ gdm_config_add_hash (GDM_KEY_TIMED_LOGIN_DELAY, &GdmTimedLoginDelay, &int_type); ++ gdm_config_add_hash (GDM_KEY_RELAX_PERM, &GdmRelaxPerm, &int_type); ++ gdm_config_add_hash (GDM_KEY_USER_MAX_FILE, &GdmUserMaxFile, &int_type); ++ gdm_config_add_hash (GDM_KEY_DISPLAYS_PER_HOST, &GdmDisplaysPerHost, &int_type); ++ gdm_config_add_hash (GDM_KEY_MAX_PENDING, &GdmMaxPending, &int_type); ++ gdm_config_add_hash (GDM_KEY_MAX_WAIT, &GdmMaxWait, &int_type); ++ gdm_config_add_hash (GDM_KEY_MAX_SESSIONS, &GdmMaxSessions, &int_type); ++ gdm_config_add_hash (GDM_KEY_UDP_PORT, &GdmUdpPort, &int_type); ++ gdm_config_add_hash (GDM_KEY_MAX_INDIRECT, &GdmMaxIndirect, &int_type); ++ gdm_config_add_hash (GDM_KEY_MAX_WAIT_INDIRECT, &GdmMaxWaitIndirect, &int_type); ++ gdm_config_add_hash (GDM_KEY_PING_INTERVAL, &GdmPingInterval, &int_type); ++ gdm_config_add_hash (GDM_KEY_FLEXIBLE_XSERVERS, &GdmFlexibleXservers, &int_type); ++ gdm_config_add_hash (GDM_KEY_FIRST_VT, &GdmFirstVt, &int_type); ++ gdm_config_add_hash (GDM_KEY_POSITION_X, &GdmPositionX, &int_type); ++ gdm_config_add_hash (GDM_KEY_POSITION_Y, &GdmPositionY, &int_type); ++ gdm_config_add_hash (GDM_KEY_MINIMAL_UID, &GdmMinimalUid, &int_type); ++ gdm_config_add_hash (GDM_KEY_MAX_ICON_WIDTH, &GdmMaxIconWidth, &int_type); ++ gdm_config_add_hash (GDM_KEY_MAX_ICON_HEIGHT, &GdmMaxIconHeight, &int_type); ++ gdm_config_add_hash (GDM_KEY_BACKGROUND_TYPE, &GdmBackgroundType, &int_type); ++ gdm_config_add_hash (GDM_KEY_SCAN_TIME, &GdmScanTime, &int_type); ++ gdm_config_add_hash (GDM_KEY_FLEXI_REAP_DELAY_MINUTES, ++ &GdmFlexiReapDelayMinutes, &int_type); ++} ++ ++/** ++ * gdm_get_config: ++ * ++ * Get config file. ++ */ ++static VeConfig * ++gdm_get_config (struct stat *statbuf) ++{ ++ int r; ++ ++ /* Not NULL if config_file was set by command-line option. */ ++ if (config_file != NULL) { ++ VE_IGNORE_EINTR (r = g_stat (config_file, statbuf)); ++ if (r < 0) { ++ gdm_error (_("%s: No GDM configuration file: %s. Using defaults."), ++ "gdm_config_parse", config_file); ++ return NULL; ++ } ++ } else { ++ VE_IGNORE_EINTR (r = g_stat (GDM_SYSCONFDIR_CONFIG_FILE, statbuf)); ++ if (r < 0) { ++ gdm_error (_("%s: No GDM configuration file: %s. Using defaults."), ++ "gdm_config_parse", GDM_SYSCONFDIR_CONFIG_FILE); ++ return NULL; ++ } else { ++ config_file = GDM_SYSCONFDIR_CONFIG_FILE; ++ } ++ } ++ ++ return ve_config_new (config_file); ++} ++ ++/** ++ * gdm_get_custom_config: ++ * ++ * Get the custom config file where gdmsetup saves its changes and ++ * where users are encouraged to make modifications. ++ */ ++static VeConfig * ++gdm_get_custom_config (struct stat *statbuf) ++{ ++ VeConfig *retval; ++ gchar *file = g_strdup_printf ("%s-custom", GDM_SYSCONFDIR_CONFIG_FILE); ++ int r; ++ ++ VE_IGNORE_EINTR (r = g_stat (file, statbuf)); ++ if (r >= 0) { ++ custom_config_file = file; ++ return ve_config_new (custom_config_file); ++ } else { ++ return NULL; ++ } ++} ++ ++/** ++ * gdm_get_value_int ++ * ++ * Gets an integer configuration option by key. The option must ++ * first be loaded, say, by calling gdm_config_parse. ++ */ ++gint ++gdm_get_value_int (char *key) ++{ ++ GdmConfigType *type = gdm_config_hash_lookup (type_hash, key); ++ gpointer val = gdm_config_hash_lookup (val_hash, key); ++ ++ if (type == NULL || val == NULL) { ++ gdm_error ("Request for invalid configuration key %s", key); ++ } else if (*type != CONFIG_INT) { ++ gdm_error ("Request for configuration key %s, but not type INT", key); ++ } else { ++ gint *intval = (int *)val; ++ return *intval; ++ } ++ ++ return 0; ++} ++ ++/** ++ * gdm_get_value_string ++ * ++ * Gets a string configuration option by key. The option must ++ * first be loaded, say, by calling gdm_config_parse. ++ */ ++gchar * ++gdm_get_value_string (char *key) ++{ ++ GdmConfigType *type; ++ gpointer val; ++ ++ /* First look in translated_hash */ ++ if (translated_hash != NULL) { ++ val = gdm_config_hash_lookup (translated_hash, key); ++ if (val) { ++ gchar **charval = (char **)val; ++ return *charval; ++ } ++ } ++ ++ type = gdm_config_hash_lookup (type_hash, key); ++ val = gdm_config_hash_lookup (val_hash, key); ++ ++ if (type == NULL || val == NULL) { ++ gdm_error ("Request for invalid configuration key %s", key); ++ } else if (*type != CONFIG_STRING) { ++ gdm_error ("Request for configuration key %s, but not type STRING", key); ++ } else { ++ gchar **charval = (char **)val; ++ return *charval; ++ } ++ ++ return NULL; ++} ++ ++/** ++ * gdm_get_value_bool ++ * ++ * Gets a boolean configuration option by key. The option must ++ * first be loaded, say, by calling gdm_config_parse. ++ */ ++gboolean ++gdm_get_value_bool (char *key) ++{ ++ GdmConfigType *type = gdm_config_hash_lookup (type_hash, key); ++ gpointer val = gdm_config_hash_lookup (val_hash, key); ++ ++ if (type == NULL || val == NULL) { ++ gdm_error ("Request for invalid configuration key %s", key); ++ } else if (*type != CONFIG_BOOL) { ++ gdm_error ("Request for configuration key %s, but not type BOOL", key); ++ } else { ++ gboolean *boolval = (gboolean *)val; ++ return *boolval; ++ } ++ ++ return FALSE; ++} ++ ++/** ++ * gdm_config_to_string ++ * ++ * Returns a configuration option as a string. Used by GDM's ++ * GET_CONFIG socket command. ++ */ ++void ++gdm_config_to_string (gchar *key, gchar **retval) ++{ ++ GdmConfigType *type; ++ ++ /* First look in translated_hash */ ++ if (translated_hash != NULL) { ++ gpointer val = gdm_config_hash_lookup (translated_hash, key); ++ if (val) { ++ gchar *charval = (char *)val; ++ *retval = g_strdup (val); ++ return; ++ } ++ } ++ ++ type = gdm_config_hash_lookup (type_hash, key); ++ *retval = NULL; ++ ++ if (type != NULL) { ++ if (*type == CONFIG_BOOL) { ++ gboolean value = gdm_get_value_bool (key); ++ if (value) ++ *retval = g_strdup ("true"); ++ else ++ *retval = g_strdup ("false"); ++ return; ++ } else if (*type == CONFIG_INT) { ++ gint value = gdm_get_value_int (key); ++ *retval = g_strdup_printf ("%d", value); ++ return; ++ } else if (*type == CONFIG_STRING) { ++ gchar *value = gdm_get_value_string (key); ++ if (value != NULL) ++ *retval = g_strdup (value); ++ return; ++ } ++ } ++ ++ gdm_debug ("Error returning config key %s\n", key); ++ return; ++} ++ ++/** ++ * gdm_compare_displays ++ * ++ * Support function for loading displays from the gdm.conf file ++ */ ++int ++gdm_compare_displays (gconstpointer a, gconstpointer b) ++{ ++ const GdmDisplay *d1 = a; ++ const GdmDisplay *d2 = b; ++ if (d1->dispnum < d2->dispnum) ++ return -1; ++ else if (d1->dispnum > d2->dispnum) ++ return 1; ++ else ++ return 0; ++} ++ ++/** ++ * notify_displays_int ++ * notify_displays_string ++ * ++ * The following two functions will notify the slave programs ++ * (gdmgreeter, gdmlogin, etc.) that a configuration option has ++ * been changed so the slave can update with the new option ++ * value. GDM does this notify when it receives a ++ * GDM_CONFIG_UPDATE socket command from gdmsetup or from the ++ * gdmflexiserver --command option. notify_displays_int ++ * is also used for notifying for boolean values. ++ */ ++static void ++notify_displays_int (const gchar *key, int val) ++{ ++ GSList *li; ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *disp = li->data; ++ if (disp->master_notify_fd >= 0) { ++ gdm_fdprintf (disp->master_notify_fd, "%c%s %d\n", ++ GDM_SLAVE_NOTIFY_KEY, key, val); ++ ++ if (disp != NULL && disp->slavepid > 1) ++ kill (disp->slavepid, SIGUSR2); ++ } ++ } ++} ++ ++static void ++notify_displays_string (const gchar *key, const gchar *val) ++{ ++ GSList *li; ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *disp = li->data; ++ if (disp->master_notify_fd >= 0) { ++ if (val == NULL) { ++ gdm_fdprintf (disp->master_notify_fd, "%c%s \n", ++ GDM_SLAVE_NOTIFY_KEY, key); ++ } else { ++ gdm_fdprintf (disp->master_notify_fd, "%c%s %s\n", ++ GDM_SLAVE_NOTIFY_KEY, key, val); ++ } ++ if (disp != NULL && disp->slavepid > 1) ++ kill (disp->slavepid, SIGUSR2); ++ } ++ } ++} ++ ++/** ++ * _gdm_set_value_string ++ * _gdm_set_value_bool ++ * _gdm_set_value_int ++ * ++ * The following interfaces are used to set values. The "doing_update" ++ * boolean argument which is only set when GDM_UPDATE_CONFIG is called. ++ * If doing_update is TRUE, then a notify is sent to slaves. When ++ * loading values at other times (such as when first loading ++ * configuration options) there is no need to notify the slaves. If ++ * there is a desire to send a notify to the slaves, the ++ * gdm_update_config function should be used instead of calling these ++ * functions directly. ++ */ ++static void ++_gdm_set_value_string (gchar *key, gchar *value_in, gboolean doing_update) ++{ ++ gchar **setting = gdm_config_hash_lookup (val_hash, key); ++ gchar *setting_copy = NULL; ++ gchar *temp_string; ++ gchar *value; ++ ++ if (! ve_string_empty (value_in)) ++ value = value_in; ++ else ++ value = NULL; ++ ++ if (setting == NULL) { ++ gdm_error ("Failure setting key %s to %s", key, value); ++ return; ++ } ++ ++ if (*setting != NULL) { ++ /* Free old value */ ++ setting_copy = g_strdup (*setting); ++ g_free (*setting); ++ } ++ ++ /* User PATH */ ++ if (is_key (key, GDM_KEY_PATH)) { ++ ++ temp_string = gdm_read_default ("PATH="); ++ if (temp_string != NULL) ++ *setting = temp_string; ++ else if (value != NULL) ++ *setting = g_strdup (value); ++ else ++ *setting = NULL; ++ ++ /* Root user PATH */ ++ } else if (is_key (key, GDM_KEY_ROOT_PATH)) { ++ ++ temp_string = gdm_read_default ("SUPATH="); ++ if (temp_string != NULL) ++ *setting = temp_string; ++ else if (value != NULL) ++ *setting = g_strdup (value); ++ else ++ *setting = NULL; ++ ++ /* Location of Xsession script */ ++ } else if (is_key (key, GDM_KEY_BASE_XSESSION)) { ++ if (value != NULL) { ++ *setting = g_strdup (value); ++ } else { ++ gdm_info (_("%s: BaseXsession empty; using %s/gdm/Xsession"), ++ "gdm_config_parse", ++ EXPANDED_SYSCONFDIR); ++ *setting = g_build_filename (EXPANDED_SYSCONFDIR, ++ "gdm", "Xsession", NULL); ++ } ++ ++ /* Halt, Reboot, and Suspend commands */ ++ } else if (is_key (key, GDM_KEY_HALT) || ++ is_key (key, GDM_KEY_REBOOT) || ++ is_key (key, GDM_KEY_SUSPEND)) { ++ if (value != NULL) ++ *setting = ve_get_first_working_command (value, FALSE); ++ else ++ *setting = NULL; ++ ++ /* Console cannot handle these languages */ ++ } else if (is_key (key, GDM_KEY_CONSOLE_CANNOT_HANDLE)) { ++ if (value != NULL) ++ *setting = g_strdup (value); ++ else ++ *setting = ""; ++ gdm_ok_console_language (); ++ ++ /* Location of Xserver */ ++ } else if (is_key (key, GDM_KEY_STANDARD_XSERVER)) { ++ gchar *bin = NULL; ++ ++ if (value != NULL) ++ bin = ve_first_word (value); ++ ++ if G_UNLIKELY (ve_string_empty (bin) || ++ g_access (bin, X_OK) != 0) { ++ gdm_info (_("%s: Standard X server not found; trying alternatives"), ++ "gdm_config_parse"); ++ if (g_access ("/usr/X11R6/bin/X", X_OK) == 0) { ++ *setting = g_strdup ("/usr/X11R6/bin/X"); ++ } else if (g_access ("/opt/X11R6/bin/X", X_OK) == 0) { ++ *setting = g_strdup ("/opt/X11R6/bin/X"); ++ } else if (g_access ("/usr/bin/X11/X", X_OK) == 0) { ++ *setting = g_strdup ("/usr/bin/X11/X"); ++ } else ++ *setting = g_strdup (value); ++ } else { ++ *setting = g_strdup (value); ++ } ++ ++ /* Graphical Theme Directory */ ++ } else if (is_key (key, GDM_KEY_GRAPHICAL_THEME_DIR)) { ++ if (value == NULL || ++ ! g_file_test (value, G_FILE_TEST_IS_DIR)) ++ { ++ *setting = g_strdup (GREETERTHEMEDIR); ++ } else { ++ *setting = g_strdup (value); ++ } ++ ++ /* Graphical Theme */ ++ } else if (is_key (key, GDM_KEY_GRAPHICAL_THEME)) { ++ if (value == NULL) ++ *setting = g_strdup ("circles"); ++ else ++ *setting = g_strdup (value); ++ ++ /* ++ * Default Welcome Message. Don't translate here since the ++ * GDM user may not be running with the same language as the user. ++ * The slave programs will translate the string. ++ */ ++ } else if (is_key (key, GDM_KEY_WELCOME)) { ++ if (value != NULL) ++ *setting = g_strdup (value); ++ else ++ *setting = g_strdup (GDM_DEFAULT_WELCOME_MSG); ++ ++ /* ++ * Default Remote Welcome Message. Don't translate here since the ++ * GDM user may not be running with the same language as the user. ++ * The slave programs will translate the string. ++ */ ++ } else if (is_key (key, GDM_KEY_REMOTE_WELCOME)) { ++ if (value != NULL) ++ *setting = g_strdup (value); ++ else ++ *setting = g_strdup (GDM_DEFAULT_REMOTE_WELCOME_MSG); ++ ++ /* All others */ ++ } else { ++ if (value != NULL) ++ *setting = g_strdup (value); ++ else { ++ if (is_key (key, GDM_KEY_GREETER)) ++ gdm_error (_("%s: No greeter specified."), "gdm_config_parse"); ++ else if (is_key (key, GDM_KEY_REMOTE_GREETER)) ++ gdm_error (_("%s: No remote greeter specified."), "gdm_config_parse"); ++ else if (is_key (key, GDM_KEY_SESSION_DESKTOP_DIR)) ++ gdm_error (_("%s: No sessions directory specified."), "gdm_config_parse"); ++ ++ *setting = NULL; ++ } ++ } ++ ++ /* Handle update */ ++ if (doing_update == TRUE && ++ strcmp (ve_sure_string (*setting), ++ ve_sure_string (setting_copy)) != 0) { ++ ++ if (is_key (key, GDM_KEY_GREETER)) ++ notify_displays_string (GDM_NOTIFY_GREETER, *setting); ++ else if (is_key (key, GDM_KEY_REMOTE_GREETER)) ++ notify_displays_string (GDM_NOTIFY_REMOTE_GREETER, *setting); ++ else if (is_key (key, GDM_KEY_SOUND_ON_LOGIN_FILE)) ++ notify_displays_string (GDM_NOTIFY_SOUND_ON_LOGIN_FILE, *setting); ++ else if (is_key (key, GDM_KEY_SOUND_ON_LOGIN_SUCCESS_FILE)) ++ notify_displays_string (GDM_NOTIFY_SOUND_ON_LOGIN_SUCCESS_FILE, *setting); ++ else if (is_key (key, GDM_KEY_SOUND_ON_LOGIN_FAILURE_FILE)) ++ notify_displays_string (GDM_NOTIFY_SOUND_ON_LOGIN_FAILURE_FILE, *setting); ++ else if (is_key (key, GDM_KEY_GTK_MODULES_LIST)) ++ notify_displays_string (GDM_NOTIFY_GTK_MODULES_LIST, *setting); ++ else if (is_key (key, GDM_KEY_TIMED_LOGIN)) ++ notify_displays_string (GDM_NOTIFY_TIMED_LOGIN, *setting); ++ } ++ ++ if (setting_copy != NULL) ++ g_free (setting_copy); ++ ++ if (*setting == NULL) ++ gdm_debug ("set config key %s to string ", key); ++ else ++ gdm_debug ("set config key %s to string %s", key, *setting); ++} ++ ++void ++gdm_set_value_string (gchar *key, gchar *value_in) ++{ ++ _gdm_set_value_string (key, value_in, TRUE); ++} ++ ++static void ++_gdm_set_value_bool (gchar *key, gboolean value, gboolean doing_update) ++{ ++ gboolean *setting = gdm_config_hash_lookup (val_hash, key); ++ gboolean setting_copy = *setting; ++ gchar *temp_string; ++ ++ if (setting == NULL) { ++ if (value) ++ gdm_error ("Failure setting key %s to true", key); ++ else ++ gdm_error ("Failure setting key %s to false", key); ++ return; ++ } ++ ++ /* Password Required */ ++ if (is_key (key, GDM_KEY_PASSWORD_REQUIRED)) { ++ temp_string = gdm_read_default ("PASSREQ="); ++ if (temp_string == NULL) ++ *setting = value; ++ else if (g_ascii_strcasecmp (temp_string, "YES") == 0) ++ *setting = TRUE; ++ else ++ *setting = FALSE; ++ g_free (temp_string); ++ ++ /* Allow root login */ ++ } else if (is_key (key, GDM_KEY_ALLOW_REMOTE_ROOT)) { ++ temp_string = gdm_read_default ("CONSOLE="); ++ ++ if (temp_string == NULL) ++ *setting = value; ++ else if (g_ascii_strcasecmp (temp_string, "/dev/console") != 0) ++ *setting = TRUE; ++ else ++ *setting = FALSE; ++ g_free (temp_string); ++ ++ /* XDMCP */ ++#ifndef HAVE_LIBXDMCP ++ } else if (is_key (key, GDM_KEY_XDMCP)) { ++ if (value) { ++ gdm_info (_("%s: XDMCP was enabled while there is no XDMCP support; turning it off"), "gdm_config_parse"); ++ } ++ *setting = FALSE; ++#endif ++ } else { ++ *setting = value; ++ } ++ ++ /* Handle update */ ++ if (doing_update == TRUE && *setting != setting_copy) { ++ if (is_key (key, GDM_KEY_ALLOW_ROOT)) ++ notify_displays_int (GDM_NOTIFY_ALLOW_ROOT, *setting); ++ else if (is_key (key, GDM_KEY_ALLOW_REMOTE_ROOT)) ++ notify_displays_int (GDM_NOTIFY_ALLOW_REMOTE_ROOT, *setting); ++ else if (is_key (key, GDM_KEY_ALLOW_REMOTE_AUTOLOGIN)) ++ notify_displays_int (GDM_NOTIFY_ALLOW_REMOTE_AUTOLOGIN, *setting); ++ else if (is_key (key, GDM_KEY_SYSTEM_MENU)) ++ notify_displays_int (GDM_NOTIFY_SYSTEM_MENU, *setting); ++ else if (is_key (key, GDM_KEY_CONFIG_AVAILABLE)) ++ notify_displays_int (GDM_NOTIFY_CONFIG_AVAILABLE, *setting); ++ else if (is_key (key, GDM_KEY_CHOOSER_BUTTON)) ++ notify_displays_int (GDM_NOTIFY_CHOOSER_BUTTON, *setting); ++ else if (is_key (key, GDM_KEY_DISALLOW_TCP)) ++ notify_displays_int (GDM_NOTIFY_DISALLOW_TCP, *setting); ++ else if (is_key (key, GDM_KEY_ADD_GTK_MODULES)) ++ notify_displays_int (GDM_NOTIFY_ADD_GTK_MODULES, *setting); ++ else if (is_key (key, GDM_KEY_TIMED_LOGIN_ENABLE)) ++ notify_displays_int (GDM_NOTIFY_TIMED_LOGIN_ENABLE, *setting); ++ } ++ ++ if (*setting) ++ gdm_debug ("set config key %s to boolean true", key); ++ else ++ gdm_debug ("set config key %s to boolean false", key); ++} ++ ++void ++gdm_set_value_bool (gchar *key, gboolean value) ++{ ++ _gdm_set_value_bool (key, value, TRUE); ++} ++ ++void ++_gdm_set_value_int (gchar *key, gint value, gboolean doing_update) ++{ ++ gint *setting = gdm_config_hash_lookup (val_hash, key); ++ gint setting_copy = *setting; ++ ++ if (setting == NULL) { ++ gdm_error ("Failure setting key %s to %d", key, value); ++ return; ++ } ++ ++ if (is_key (key, GDM_KEY_MAX_INDIRECT) || ++ is_key (key, GDM_KEY_XINERAMA_SCREEN)) { ++ if (value < 0) ++ *setting = 0; ++ else ++ *setting = value; ++ } else if (is_key (key, GDM_KEY_TIMED_LOGIN_DELAY)) { ++ if (value < 5) { ++ gdm_info (_("%s: TimedLoginDelay is less than 5, defaulting to 5."), "gdm_config_parse"); ++ *setting = 5; ++ } else ++ *setting = value; ++ } else if (is_key (key, GDM_KEY_MAX_ICON_WIDTH) || ++ is_key (key, GDM_KEY_MAX_ICON_HEIGHT)) { ++ if (value < 0) ++ *setting = 128; ++ else ++ *setting = value; ++ } else if (is_key (key, GDM_KEY_SCAN_TIME)) { ++ if (value < 1) ++ *setting = 1; ++ else ++ *setting = value; ++ } ++ else { ++ *setting = value; ++ } ++ ++ /* Handle update */ ++ if (doing_update == TRUE && *setting != setting_copy) { ++ if (is_key (key, GDM_KEY_RETRY_DELAY)) ++ notify_displays_int (GDM_NOTIFY_RETRY_DELAY, *setting); ++ else if (is_key (key, GDM_KEY_TIMED_LOGIN_DELAY)) ++ notify_displays_int (GDM_NOTIFY_TIMED_LOGIN_DELAY, *setting); ++ } ++ ++ gdm_debug ("set config key %s to integer %d", key, *setting); ++} ++ ++void ++gdm_set_value_int (gchar *key, gint value) ++{ ++ _gdm_set_value_int (key, value, TRUE); ++} ++ ++/** ++ * gdm_set_value ++ * ++ * This functon is used to set the config values in the hash. This is called ++ * at initial config load time or when gdm_update_config is called to reload ++ * them. It adds translated strings to the hash with their proper keys ++ * (greeter/Welcome[cs] for example). ++ */ ++static gboolean ++gdm_set_value (VeConfig *cfg, GdmConfigType *type, gchar *key, gboolean doing_update) ++{ ++ gchar * realkey = gdm_config_hash_lookup (realkey_hash, key); ++ if (realkey == NULL) { ++ return FALSE; ++ } ++ ++ if (*type == CONFIG_BOOL) { ++ gboolean value = ve_config_get_bool (cfg, realkey); ++ _gdm_set_value_bool (key, value, doing_update); ++ return TRUE; ++ } else if (*type == CONFIG_INT) { ++ gint value = ve_config_get_int (cfg, realkey); ++ _gdm_set_value_int (key, value, doing_update); ++ return TRUE; ++ } else if (*type == CONFIG_STRING) { ++ ++ /* Process translated strings */ ++ if (is_key (key, GDM_KEY_WELCOME) || ++ is_key (key, GDM_KEY_REMOTE_WELCOME)) { ++ ++ GList *list = ve_config_get_keys (cfg, "greeter"); ++ gchar *prefix, *basekey; ++ ++ if (is_key (key, GDM_KEY_WELCOME)) { ++ basekey = g_strdup ("Welcome"); ++ prefix = g_strdup ("Welcome["); ++ } else { ++ basekey = g_strdup ("RemoteWelcome"); ++ prefix = g_strdup ("RemoteWelcome["); ++ } ++ ++ /* ++ * Loop over translated keys and put all values into the hash ++ * Probably should loop through the hashs and delete any old values, ++ * but this just means that if a translation is deleted from the ++ * config, GDM won't forget about it until restart. I don't think ++ * this will happen, or be a real problem if it does. ++ */ ++ while (list != NULL) { ++ if (g_str_has_prefix ((char *)list->data, prefix) && ++ g_str_has_suffix ((char *)list->data, "]")) { ++ ++ if (translated_hash == NULL) ++ translated_hash = g_hash_table_new (g_str_hash, g_str_equal); ++ ++ gchar *transkey = g_strdup_printf ("greeter/%s", (char *)list->data); ++ gchar *transvalue = ve_config_get_string (cfg, transkey); ++ ++ g_hash_table_remove (translated_hash, transkey); ++ ++ /* ++ * Store translated values in a separate hash. Note that we load ++ * the initial values via a g_hash_table_foreach function, so if ++ * we add these to the same hash, we would end up loading these ++ * values in again a second time. ++ */ ++ g_hash_table_insert (translated_hash, transkey, transvalue); ++ } ++ list = list->next; ++ } ++ g_free (basekey); ++ g_free (prefix); ++ } ++ ++ /* Handle non-translated strings as normal */ ++ gchar *value = ve_config_get_string (cfg, realkey); ++ _gdm_set_value_string (key, value, doing_update); ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ ++/** ++ * gdm_find_xserver ++ * ++ * Return an xserver with a given ID, or NULL if not found. ++ */ ++GdmXserver * ++gdm_find_xserver (const gchar *id) ++{ ++ GSList *li; ++ ++ if (xservers == NULL) ++ return NULL; ++ ++ if (id == NULL) ++ return xservers->data; ++ ++ for (li = xservers; li != NULL; li = li->next) { ++ GdmXserver *svr = li->data; ++ if (strcmp (ve_sure_string (svr->id), ve_sure_string (id)) == 0) ++ return svr; ++ } ++ return NULL; ++} ++ ++/** ++ * gdm_get_xservers ++ * ++ * Prepare a string to be returned for the GET_SERVER_LIST ++ * sockets command. ++ */ ++gchar * ++gdm_get_xservers (void) ++{ ++ GSList *li; ++ gchar *retval = NULL; ++ ++ if (xservers == NULL) ++ return NULL; ++ ++ for (li = xservers; li != NULL; li = li->next) { ++ GdmXserver *svr = li->data; ++ if (retval != NULL) ++ retval = g_strconcat (retval, ";", svr->id, NULL); ++ else ++ retval = g_strdup (svr->id); ++ } ++ ++ return retval; ++} ++ ++/* PRIO_MIN and PRIO_MAX are not defined on Solaris, but are -20 and 20 */ ++#if sun ++#ifndef PRIO_MIN ++#define PRIO_MIN -20 ++#endif ++#ifndef PRIO_MAX ++#define PRIO_MAX 20 ++#endif ++#endif ++ ++/** ++ * gdm_load_xservers ++ * ++ * Load [server-foo] sections from a configuration file. ++ */ ++static void ++gdm_load_xservers (VeConfig *cfg) ++{ ++ GList *list, *li; ++ GSList *xli; ++ ++ /* Find server definitions */ ++ list = ve_config_get_sections (cfg); ++ for (li = list; li != NULL; li = li->next) { ++ const gchar *sec = li->data; ++ ++ if (strncmp (sec, "server-", strlen ("server-")) == 0) { ++ gchar *id; ++ ++ id = g_strdup (sec + strlen ("server-")); ++ ++ /* ++ * See if we already loaded a server with this id, skip if ++ * one already exists. ++ */ ++ if (gdm_find_xserver (id) != NULL) { ++ g_free (id); ++ } else { ++ GdmXserver *svr = g_new0 (GdmXserver, 1); ++ gchar buf[256]; ++ int n; ++ ++ svr->id = id; ++ ++ g_snprintf (buf, sizeof (buf), "%s/" GDM_KEY_SERVER_NAME, sec); ++ svr->name = ve_config_get_string (cfg, buf); ++ g_snprintf (buf, sizeof (buf), "%s/" GDM_KEY_SERVER_COMMAND, sec); ++ svr->command = ve_config_get_string (cfg, buf); ++ g_snprintf (buf, sizeof (buf), "%s/" GDM_KEY_SERVER_FLEXIBLE, sec); ++ svr->flexible = ve_config_get_bool (cfg, buf); ++ g_snprintf (buf, sizeof (buf), "%s/" GDM_KEY_SERVER_CHOOSABLE, sec); ++ svr->choosable = ve_config_get_bool (cfg, buf); ++ g_snprintf (buf, sizeof (buf), "%s/" GDM_KEY_SERVER_HANDLED, sec); ++ svr->handled = ve_config_get_bool (cfg, buf); ++ g_snprintf (buf, sizeof (buf), "%s/" GDM_KEY_SERVER_CHOOSER, sec); ++ svr->chooser = ve_config_get_bool (cfg, buf); ++ g_snprintf (buf, sizeof (buf), "%s/" GDM_KEY_SERVER_PRIORITY, sec); ++ svr->priority = ve_config_get_int (cfg, buf); ++ ++ /* do some bounds checking */ ++ n = svr->priority; ++ if (n < PRIO_MIN) ++ n = PRIO_MIN; ++ else if (n > PRIO_MAX) ++ n = PRIO_MAX; ++ if (n != svr->priority) { ++ gdm_error (_("%s: Priority out of bounds; changed to %d"), ++ "gdm_config_parse", n); ++ svr->priority = n; ++ } ++ ++ if (ve_string_empty (svr->command)) { ++ gdm_error (_("%s: Empty server command; " ++ "using standard command."), "gdm_config_parse"); ++ g_free (svr->command); ++ svr->command = g_strdup (GdmStandardXserver); ++ } ++ ++ xservers = g_slist_append (xservers, svr); ++ } ++ } ++ } ++ ve_config_free_list_of_strings (list); ++} ++ ++/** ++ * gdm_update_xservers ++ * ++ * Reload [server-foo] sections from the configuration files. ++ */ ++static void ++gdm_update_xservers (VeConfig *cfg, VeConfig *custom_cfg) ++{ ++ GSList *xli; ++ ++ /* Free list if already loaded */ ++ if (xservers != NULL) { ++ for (xli = xservers; xli != NULL; xli = xli->next) { ++ GdmXserver *xsvr = xli->data; ++ ++ g_free (xsvr->id); ++ g_free (xsvr->name); ++ g_free (xsvr->command); ++ } ++ g_slist_free (xservers); ++ xservers = NULL; ++ } ++ ++ /* Reload first from custom_cfg then from cfg. */ ++ if (custom_cfg != NULL) ++ gdm_load_xservers (custom_cfg); ++ ++ if (cfg != NULL) ++ gdm_load_xservers (cfg); ++ ++ /* If no "Standard" server was created, then add it */ ++ if (xservers == NULL || gdm_find_xserver (GDM_STANDARD) == NULL) { ++ GdmXserver *svr = g_new0 (GdmXserver, 1); ++ ++ svr->id = g_strdup (GDM_STANDARD); ++ svr->name = g_strdup ("Standard server"); ++ svr->command = g_strdup (GdmStandardXserver); ++ svr->flexible = TRUE; ++ svr->choosable = TRUE; ++ svr->handled = TRUE; ++ svr->priority = 0; ++ xservers = g_slist_append (xservers, svr); ++ } ++} ++ ++/** ++ * gdm_update_config ++ * ++ * Will cause a the GDM daemon to re-read the key from the configuration ++ * file and cause notify signal to be sent to the slaves for the ++ * specified key, if appropriate. Only specific keys defined in the ++ * gdm_set_value functions above are associated with such notification. ++ * Obviously notification is not needed for configuration options only ++ * used by the daemon. This function is called when the UPDDATE_CONFIG ++ * sockets command is called. ++ * ++ * To add a new notification, a GDM_NOTIFY_* argument will need to be ++ * defined in gdm.h, supporting logic placed in the gdm_set_value ++ * functions and in the gdm_slave_handle_notify function in slave.c. ++ */ ++gboolean ++gdm_update_config (gchar* key) ++{ ++ GdmConfigType *type; ++ struct stat statbuf, custom_statbuf; ++ VeConfig *cfg; ++ VeConfig *custom_cfg = NULL; ++ gboolean rc; ++ ++ /* ++ * Do not allow these keys to be updated, since GDM would need ++ * additional work, or at least heavy testing, to make these keys ++ * flexible enough to be changed at runtime. ++ */ ++ if (is_key (key, GDM_KEY_PID_FILE) || ++ is_key (key, GDM_KEY_CONSOLE_NOTIFY) || ++ is_key (key, GDM_KEY_USER) || ++ is_key (key, GDM_KEY_GROUP) || ++ is_key (key, GDM_KEY_LOG_DIR) || ++ is_key (key, GDM_KEY_SERV_AUTHDIR) || ++ is_key (key, GDM_KEY_USER_AUTHDIR) || ++ is_key (key, GDM_KEY_USER_AUTHFILE) || ++ is_key (key, GDM_KEY_USER_AUTHDIR_FALLBACK)) { ++ return FALSE; ++ } ++ ++ /* See if custom file is now there */ ++ if (custom_config_file == NULL) { ++ custom_cfg = gdm_get_custom_config (&statbuf); ++ } ++ ++ /* Don't bother re-reading configuration if files have not changed */ ++ VE_IGNORE_EINTR (g_stat (config_file, &statbuf)); ++ VE_IGNORE_EINTR (g_stat (custom_config_file, &custom_statbuf)); ++ ++ /* ++ * Do not reset mtime to the latest values since there is no ++ * guarantee that only one key was modified since last write. ++ * This check simply avoids re-reading the files if neither ++ * has changed since GDM was started. ++ */ ++ if (config_file_mtime == statbuf.st_mtime && ++ custom_config_file_mtime == custom_statbuf.st_mtime) ++ return TRUE; ++ ++ /* Shortcut for updating all XDMCP parameters */ ++ if (is_key (key, "xdmcp/PARAMETERS")) { ++ gdm_update_config (GDM_KEY_DISPLAYS_PER_HOST); ++ gdm_update_config (GDM_KEY_MAX_PENDING); ++ gdm_update_config (GDM_KEY_MAX_WAIT); ++ gdm_update_config (GDM_KEY_MAX_SESSIONS); ++ gdm_update_config (GDM_KEY_INDIRECT); ++ gdm_update_config (GDM_KEY_MAX_INDIRECT); ++ gdm_update_config (GDM_KEY_MAX_WAIT_INDIRECT); ++ gdm_update_config (GDM_KEY_PING_INTERVAL); ++ return TRUE; ++ } ++ ++ if (custom_config_file != NULL) ++ custom_cfg = ve_config_new (custom_config_file); ++ ++ if (is_key (key, "xservers/PARAMETERS")) { ++ cfg = ve_config_new (config_file); ++ gdm_update_xservers (cfg, custom_cfg); ++ ve_config_destroy (cfg); ++ if (custom_cfg != NULL) ++ ve_config_destroy (custom_cfg); ++ return rc; ++ } ++ ++ type = gdm_config_hash_lookup (type_hash, key); ++ if (type == NULL) ++ return FALSE; ++ ++ /* First check the custom file */ ++ if (custom_cfg != NULL) { ++ gchar **splitstr = g_strsplit (key, "/", 2); ++ ++ if (splitstr[0] != NULL) { ++ GList *list = ve_config_get_keys (custom_cfg, splitstr[0]); ++ ++ while (list != NULL) { ++ gchar *custom_key = (char *)list->data; ++ gchar *custom_fullkey = g_strdup_printf ("%s/%s", splitstr[0], custom_key); ++ ++ if (is_key (key, custom_fullkey)) { ++ rc = gdm_set_value (custom_cfg, type, key, TRUE); ++ ++ g_free (custom_fullkey); ++ g_strfreev (splitstr); ++ ve_config_destroy (custom_cfg); ++ return (rc); ++ } ++ ++ g_free (custom_fullkey); ++ list = list->next; ++ } ++ } ++ g_strfreev (splitstr); ++ } ++ ++ /* If not in the custom file, check main config file */ ++ cfg = ve_config_new (config_file); ++ rc = gdm_set_value (cfg, type, key, TRUE); ++ ++ ve_config_destroy (cfg); ++ if (custom_cfg != NULL) ++ ve_config_destroy (custom_cfg); ++ return rc; ++} ++ ++/** ++ * check_logdir ++ * check_servauthdir ++ * ++ * Support functions for gdm_config_parse. ++ */ ++static void ++check_logdir (void) ++{ ++ struct stat statbuf; ++ int r; ++ ++ VE_IGNORE_EINTR (r = g_stat (GdmLogDir, &statbuf)); ++ if (r < 0 || ++ ! S_ISDIR (statbuf.st_mode)) { ++ gdm_error (_("%s: Logdir %s does not exist or isn't a directory. Using ServAuthDir %s."), "gdm_config_parse", ++ GdmLogDir, GdmServAuthDir); ++ g_free (GdmLogDir); ++ GdmLogDir = g_strdup (GdmServAuthDir); ++ } ++} ++ ++static void ++check_servauthdir (struct stat *statbuf) ++{ ++ int r; ++ ++ /* Enter paranoia mode */ ++ VE_IGNORE_EINTR (r = g_stat (GdmServAuthDir, statbuf)); ++ if G_UNLIKELY (r < 0) { ++ gchar *s = g_strdup_printf ++ (C_(N_("Server Authorization directory " ++ "(daemon/ServAuthDir) is set to %s " ++ "but this does not exist. Please " ++ "correct GDM configuration and " ++ "restart GDM.")), GdmServAuthDir); ++ if (GdmConsoleNotify) ++ gdm_text_message_dialog (s); ++ GdmPidFile = NULL; ++ g_free (s); ++ gdm_fail (_("%s: Authdir %s does not exist. Aborting."), "gdm_config_parse", GdmServAuthDir); ++ } ++ ++ if G_UNLIKELY (! S_ISDIR (statbuf->st_mode)) { ++ gchar *s = g_strdup_printf ++ (C_(N_("Server Authorization directory " ++ "(daemon/ServAuthDir) is set to %s " ++ "but this is not a directory. Please " ++ "correct GDM configuration and " ++ "restart GDM.")), GdmServAuthDir); ++ if (GdmConsoleNotify) ++ gdm_text_message_dialog (s); ++ GdmPidFile = NULL; ++ g_free (s); ++ gdm_fail (_("%s: Authdir %s is not a directory. Aborting."), "gdm_config_parse", GdmServAuthDir); ++ } ++} ++ ++typedef struct _GdmConfigFiles { ++ VeConfig *cfg; ++ VeConfig *custom_cfg; ++} GdmConfigFiles; ++ ++/** ++ * gdm_load_displays ++ * ++ * Load the displays section of the config file ++ */ ++static void ++gdm_load_displays (VeConfig *cfg, GList *list ) ++{ ++ GList *li; ++ GSList *li2; ++ ++ for (li = list; li != NULL; li = li->next) { ++ const gchar *key = li->data; ++ ++ if (isdigit (*key)) { ++ gchar *fullkey; ++ gchar *dispval; ++ int keynum = atoi (key); ++ gboolean skip_entry = FALSE; ++ ++ fullkey = g_strdup_printf ("%s/%s", GDM_KEY_SECTION_SERVERS, key); ++ dispval = ve_config_get_string (cfg, fullkey); ++ g_free (fullkey); ++ ++ /* Do not add if already in the list */ ++ for (li2 = displays; li2 != NULL; li2 = li2->next) { ++ GdmDisplay *disp = li2->data; ++ if (disp->dispnum == keynum) { ++ skip_entry = TRUE; ++ break; ++ } ++ } ++ ++ /* Do not add if this display was marked as inactive already */ ++ for (li2 = displays_inactive; li2 != NULL; li2 = li2->next) { ++ gchar *disp = li2->data; ++ if (atoi (disp) == keynum) { ++ skip_entry = TRUE; ++ break; ++ } ++ } ++ ++ if (skip_entry == TRUE) { ++ g_free (dispval); ++ continue; ++ } ++ ++ if (g_ascii_strcasecmp (ve_sure_string (dispval), "inactive") == 0) { ++ gdm_debug ("display %s is inactive", key); ++ displays_inactive = g_slist_append (displays_inactive, g_strdup (key)); ++ } else { ++ GdmDisplay *disp = gdm_server_alloc (keynum, dispval); ++ ++ if (disp == NULL) ++ continue; ++ ++ displays = g_slist_insert_sorted (displays, disp, gdm_compare_displays); ++ if (keynum > high_display_num) ++ high_display_num = keynum; ++ } ++ ++ g_free (dispval); ++ ++ } else { ++ gdm_info (_("%s: Invalid server line in config file. Ignoring!"), "gdm_config_parse"); ++ } ++ } ++} ++ ++/** ++ * gdm_load_config_option ++ * ++ * Called by gdm_config_parse in a loop to set each key. ++ */ ++void ++gdm_load_config_option (gpointer key_in, gpointer value_in, gpointer data) ++{ ++ gchar *key = (gchar *)key_in; ++ GdmConfigType *type = (GdmConfigType *)value_in; ++ GdmConfigFiles *cfgfiles = (GdmConfigFiles *)data; ++ gboolean retval; ++ gboolean custom_retval; ++ ++ if (type != NULL) { ++ /* First check the custom file */ ++ if (cfgfiles->custom_cfg != NULL) { ++ gchar **splitstr = g_strsplit (key_in, "/", 2); ++ if (splitstr[0] != NULL) { ++ GList *list = ve_config_get_keys (cfgfiles->custom_cfg, splitstr[0]); ++ ++ while (list != NULL) { ++ gchar *custom_key = (char *)list->data; ++ gchar *custom_fullkey = g_strdup_printf ("%s/%s", splitstr[0], custom_key); ++ ++ if (is_key (key_in, custom_fullkey)) { ++ custom_retval = gdm_set_value (cfgfiles->custom_cfg, type, key, FALSE); ++ g_free (custom_fullkey); ++ g_strfreev (splitstr); ++ return; ++ } ++ ++ g_free (custom_fullkey); ++ list = list->next; ++ } ++ } ++ g_strfreev (splitstr); ++ } ++ ++ /* If not in the custom file, check main config file */ ++ if (gdm_set_value (cfgfiles->cfg, type, key, FALSE)) ++ return; ++ } ++ ++ gdm_error ("Cannot set config option %s", key); ++} ++ ++/** ++ * gdm_config_parse ++ * ++ * Loads initial configuration settings. ++ */ ++void ++gdm_config_parse (void) ++{ ++ GdmConfigFiles cfgfiles; ++ VeConfig *cfg, *custom_cfg; ++ struct passwd *pwent; ++ struct group *grent; ++ struct stat statbuf; ++ gchar *bin; ++ ++ /* Init structures for configuration data */ ++ gdm_config_init (); ++ ++ displays = NULL; ++ high_display_num = 0; ++ ++ /* ++ * It is okay if the custom_cfg file is missing, then just use ++ * main configuration file. If cfg is missing, then GDM will ++ * use the built-in defaults found in gdm.h. ++ */ ++ cfg = gdm_get_config (&statbuf); ++ config_file_mtime = statbuf.st_mtime; ++ custom_cfg = gdm_get_custom_config (&statbuf); ++ custom_config_file_mtime = statbuf.st_mtime; ++ cfgfiles.cfg = cfg; ++ cfgfiles.custom_cfg = custom_cfg; ++ ++ /* Loop over all configuration options and load them */ ++ g_hash_table_foreach (type_hash, gdm_load_config_option, &cfgfiles); ++ ++ /* Load server-foo sections */ ++ gdm_update_xservers (cfg, custom_cfg); ++ ++ /* Only read the list if no_console is FALSE at this stage */ ++ if ( !no_console) { ++ GList *list; ++ GSList *li2; ++ ++ /* Find static X server definitions */ ++ if (custom_cfg) { ++ list = ve_config_get_keys (custom_cfg, GDM_KEY_SECTION_SERVERS); ++ gdm_load_displays (custom_cfg, list); ++ ve_config_free_list_of_strings (list); ++ } ++ ++ list = ve_config_get_keys (cfg, GDM_KEY_SECTION_SERVERS); ++ gdm_load_displays (cfg, list); ++ ve_config_free_list_of_strings (list); ++ ++ /* Free list of inactive, not needed anymore */ ++ for (li2 = displays_inactive; li2 != NULL; li2 = li2->next) { ++ gchar *disp = li2->data; ++ g_free (disp); ++ } ++ g_slist_free (displays_inactive); ++ } ++ ++ if G_UNLIKELY ((displays == NULL) && (! GdmXdmcp) && (!GdmDynamicXservers)) { ++ gchar *server = NULL; ++ ++ /* ++ * If we requested no static servers (there is no console), ++ * then don't display errors in console messages ++ */ ++ if (no_console) { ++ gdm_fail (_("%s: XDMCP disabled and no static servers defined. Aborting!"), "gdm_config_parse"); ++ } ++ ++ bin = ve_first_word (GdmStandardXserver); ++ if G_LIKELY (g_access (bin, X_OK) == 0) { ++ server = GdmStandardXserver; ++ } else if (g_access ("/usr/bin/X11/X", X_OK) == 0) { ++ server = "/usr/bin/X11/X"; ++ } else if (g_access ("/usr/X11R6/bin/X", X_OK) == 0) { ++ server = "/usr/X11R6/bin/X"; ++ } else if (g_access ("/opt/X11R6/bin/X", X_OK) == 0) { ++ server = "/opt/X11R6/bin/X"; ++ } ++ g_free (bin); ++ ++ /* yay, we can add a backup emergency server */ ++ if (server != NULL) { ++ int num = gdm_get_free_display (0 /* start */, 0 /* server uid */); ++ gdm_error (_("%s: XDMCP disabled and no static servers defined. Adding %s on :%d to allow configuration!"), ++ "gdm_config_parse", server, num); ++ ++ gdm_emergency_server = TRUE; ++ displays = g_slist_append (displays, gdm_server_alloc (num, server)); ++ /* ALWAYS run the greeter and don't log anyone in, ++ * this is just an emergency session */ ++ g_free (GdmAutomaticLogin); ++ g_free (GdmTimedLogin); ++ GdmAutomaticLogin = NULL; ++ GdmTimedLogin = NULL; ++ } else { ++ gchar *s = g_strdup_printf (C_(N_("XDMCP is disabled and GDM " ++ "cannot find any static server " ++ "to start. Aborting! Please " ++ "correct the configuration " ++ "and restart GDM."))); ++ gdm_text_message_dialog (s); ++ GdmPidFile = NULL; ++ g_free (s); ++ gdm_fail (_("%s: XDMCP disabled and no static servers defined. Aborting!"), "gdm_config_parse"); ++ } ++ } ++ ++ /* If no displays were found, then obviously ++ we're in a no console mode */ ++ if (displays == NULL) ++ no_console = TRUE; ++ ++ if (no_console) ++ GdmConsoleNotify = FALSE; ++ ++ /* Lookup user and groupid for the GDM user */ ++ pwent = getpwnam (GdmUser); ++ ++ /* Set GdmUserId and GdmGroupId */ ++ if G_UNLIKELY (pwent == NULL) { ++ gchar *s = g_strdup_printf (C_(N_("The GDM user '%s' does not exist. " ++ "Please correct GDM configuration " ++ "and restart GDM.")), GdmUser); ++ if (GdmConsoleNotify) ++ gdm_text_message_dialog (s); ++ ++ GdmPidFile = NULL; ++ g_free (s); ++ gdm_fail (_("%s: Can't find the GDM user '%s'. Aborting!"), "gdm_config_parse", GdmUser); ++ } else { ++ GdmUserId = pwent->pw_uid; ++ } ++ ++ if G_UNLIKELY (GdmUserId == 0) { ++ gchar *s = g_strdup_printf (C_(N_("The GDM user is set to be root, but " ++ "this is not allowed since it can " ++ "pose a security risk. Please " ++ "correct GDM configuration and " ++ "restart GDM."))); ++ if (GdmConsoleNotify) ++ gdm_text_message_dialog (s); ++ GdmPidFile = NULL; ++ g_free (s); ++ gdm_fail (_("%s: The GDM user should not be root. Aborting!"), "gdm_config_parse"); ++ } ++ ++ grent = getgrnam (GdmGroup); ++ ++ if G_UNLIKELY (grent == NULL) { ++ gchar *s = g_strdup_printf (C_(N_("The GDM group '%s' does not exist. " ++ "Please correct GDM configuration " ++ "and restart GDM.")), GdmGroup); ++ if (GdmConsoleNotify) ++ gdm_text_message_dialog (s); ++ GdmPidFile = NULL; ++ g_free (s); ++ gdm_fail (_("%s: Can't find the GDM group '%s'. Aborting!"), "gdm_config_parse", GdmGroup); ++ } else { ++ GdmGroupId = grent->gr_gid; ++ } ++ ++ if G_UNLIKELY (GdmGroupId == 0) { ++ gchar *s = g_strdup_printf (C_(N_("The GDM group is set to be root, but " ++ "this is not allowed since it can " ++ "pose a security risk. Please " ++ "correct GDM configuration and " ++ "restart GDM."))); ++ if (GdmConsoleNotify) ++ gdm_text_message_dialog (s); ++ GdmPidFile = NULL; ++ g_free (s); ++ gdm_fail (_("%s: The GDM group should not be root. Aborting!"), "gdm_config_parse"); ++ } ++ ++ /* gid remains `gdm' */ ++ NEVER_FAILS_root_set_euid_egid (GdmUserId, GdmGroupId); ++ ++ /* Check that the greeter can be executed */ ++ bin = ve_first_word (GdmGreeter); ++ if G_UNLIKELY (ve_string_empty (bin) || g_access (bin, X_OK) != 0) { ++ gdm_error (_("%s: Greeter not found or can't be executed by the GDM user"), "gdm_config_parse"); ++ } ++ g_free (bin); ++ ++ bin = ve_first_word (GdmRemoteGreeter); ++ if G_UNLIKELY (ve_string_empty (bin) || g_access (bin, X_OK) != 0) { ++ gdm_error (_("%s: Remote greeter not found or can't be executed by the GDM user"), "gdm_config_parse"); ++ } ++ g_free (bin); ++ ++ /* Check that chooser can be executed */ ++ bin = ve_first_word (GdmChooser); ++ ++ if G_UNLIKELY (GdmIndirect && (ve_string_empty (bin) || g_access (bin, X_OK) != 0)) { ++ gdm_error (_("%s: Chooser not found or it can't be executed by the GDM user"), "gdm_config_parse"); ++ } ++ ++ g_free (bin); ++ ++ /* Check the serv auth and log dirs */ ++ if G_UNLIKELY (ve_string_empty (GdmServAuthDir)) { ++ if (GdmConsoleNotify) ++ gdm_text_message_dialog ++ (C_(N_("No daemon/ServAuthDir specified in the GDM configuration file"))); ++ GdmPidFile = NULL; ++ gdm_fail (_("%s: No daemon/ServAuthDir specified."), "gdm_config_parse"); ++ } ++ ++ if (ve_string_empty (GdmLogDir)) { ++ g_free (GdmLogDir); ++ GdmLogDir = g_strdup (GdmServAuthDir); ++ } ++ ++ /* Enter paranoia mode */ ++ check_servauthdir (&statbuf); ++ ++ NEVER_FAILS_root_set_euid_egid (0, 0); ++ ++ /* Now set things up for us as */ ++ chown (GdmServAuthDir, 0, GdmGroupId); ++ g_chmod (GdmServAuthDir, (S_IRWXU|S_IRWXG|S_ISVTX)); ++ ++ NEVER_FAILS_root_set_euid_egid (GdmUserId, GdmGroupId); ++ ++ /* Again paranoid */ ++ check_servauthdir (&statbuf); ++ ++ if G_UNLIKELY (statbuf.st_uid != 0 || statbuf.st_gid != GdmGroupId) { ++ gchar *s = g_strdup_printf (C_(N_("Server Authorization directory " ++ "(daemon/ServAuthDir) is set to %s " ++ "but is not owned by user %s and group " ++ "%s. Please correct the ownership or " ++ "GDM configuration and restart " ++ "GDM.")), GdmServAuthDir, GdmUser, GdmGroup); ++ if (GdmConsoleNotify) ++ gdm_text_message_dialog (s); ++ GdmPidFile = NULL; ++ g_free (s); ++ gdm_fail (_("%s: Authdir %s is not owned by user %s, group %s. Aborting."), ++ "gdm_config_parse", GdmServAuthDir, gdm_root_user (), GdmGroup); ++ } ++ ++ if G_UNLIKELY (statbuf.st_mode != (S_IFDIR|S_IRWXU|S_IRWXG|S_ISVTX)) { ++ gchar *s = g_strdup_printf (C_(N_("Server Authorization directory " ++ "(daemon/ServAuthDir) is set to %s " ++ "but has the wrong permissions: it " ++ "should have permissions of %o. " ++ "Please correct the permissions or " ++ "the GDM configuration and " ++ "restart GDM.")), GdmServAuthDir, ++ (S_IRWXU|S_IRWXG|S_ISVTX)); ++ if (GdmConsoleNotify) ++ gdm_text_message_dialog (s); ++ GdmPidFile = NULL; ++ g_free (s); ++ gdm_fail (_("%s: Authdir %s has wrong permissions %o. Should be %o. Aborting."), "gdm_config_parse", ++ GdmServAuthDir, statbuf.st_mode, (S_IRWXU|S_IRWXG|S_ISVTX)); ++ } ++ ++ NEVER_FAILS_root_set_euid_egid (0, 0); ++ ++ check_logdir (); ++ ++ /* Check that user authentication is properly configured */ ++ gdm_verify_check (); ++ ++ if (custom_cfg) ++ ve_config_destroy (custom_cfg); ++ ve_config_destroy (cfg); ++} ++ ++/** ++ * gdm_get_gdmuid ++ * gdm_get_gdmgid ++ * ++ * Access functions for getting the GDM user ID and group ID. ++ */ ++uid_t ++gdm_get_gdmuid (void) ++{ ++ return GdmUserId; ++} ++ ++gid_t ++gdm_get_gdmgid (void) ++{ ++ return GdmGroupId; ++} ++ ++/** ++ * gdm_get_high_display_num ++ * gdm_get_high_display_num ++ * ++ * Access functions for getting the high display number. ++ */ ++gint ++gdm_get_high_display_num (void) ++{ ++ return high_display_num; ++} ++ ++void ++gdm_set_high_display_num (gint val) ++{ ++ high_display_num = val; ++} ++ ++/** ++ * gdm_print_config_option ++ * ++ * Called by gdm_print_all_config in a loop to print each key. ++ * ++ */ ++void ++gdm_print_config_option (gpointer key_in, gpointer value_in, gpointer data) ++{ ++ gchar *key = (gchar *)key_in; ++ gchar *retval; ++ ++ gdm_config_to_string (key, &retval); ++ if (retval != NULL) { ++ gdm_debug ("key is %s, value is %s\n", key, retval); ++ g_free (retval); ++ } else ++ gdm_debug ("key is %s, value is \n", key); ++} ++ ++/** ++ * gdm_print_all_config ++ * ++ * Not used by GDM, but useful for debug purposes. ++ */ ++void ++gdm_print_all_config (void) ++{ ++ gdm_config_parse (); ++ ++ g_hash_table_foreach (type_hash, gdm_print_config_option, NULL); ++} ++ ++/** ++ * gdm_is_valid_key ++ * ++ * Returns TRUE if the key is a valid key, FALSE otherwise. ++ */ ++gboolean ++gdm_is_valid_key (gchar *key) ++{ ++ GdmConfigType *type = gdm_config_hash_lookup (type_hash, key); ++ if (type == NULL) ++ return FALSE; ++ ++ return TRUE; ++} ++ ++/** ++ * gdm_signal_terminthup_was_notified ++ * ++ * returns TRUE if signal SIGTERM, SIGINT, or SIGHUP was received. ++ * This just hides these vicious-extensions functions from the ++ * other files ++ */ ++gboolean ++gdm_signal_terminthup_was_notified (void) ++{ ++ if (ve_signal_was_notified (SIGTERM) || ++ ve_signal_was_notified (SIGINT) || ++ ve_signal_was_notified (SIGHUP)) { ++ return TRUE; ++ } else { ++ return FALSE; ++ } ++} ++ ++/** ++ * check_user_file ++ * check_global_file ++ * is_in_trusted_pic_dir ++ * get_facefile_from_gnome2_dir_config ++ * path_is_local ++ * gdm_get_facefile_from_home ++ * gdm_get_facefile_from_global ++ * ++ * These functions are used for accessing the user's face image from their ++ * home directory via vicious-extensions. ++ */ ++static gboolean ++check_user_file (const char *path, ++ guint uid) ++{ ++ char *dir; ++ char *file; ++ gboolean is_ok; ++ ++ if (path == NULL) ++ return FALSE; ++ ++ if (g_access (path, R_OK) != 0) ++ return FALSE; ++ ++ dir = g_path_get_dirname (path); ++ file = g_path_get_basename (path); ++ ++ is_ok = gdm_file_check ("run_pictures", ++ uid, ++ dir, ++ file, ++ TRUE, TRUE, ++ gdm_get_value_int (GDM_KEY_USER_MAX_FILE), ++ gdm_get_value_int (GDM_KEY_RELAX_PERM)); ++ g_free (dir); ++ g_free (file); ++ ++ return is_ok; ++} ++ ++static gboolean ++check_global_file (const char *path, ++ guint uid) ++{ ++ if (path == NULL) ++ return FALSE; ++ ++ if (g_access (path, R_OK) != 0) ++ return FALSE; ++ ++ return TRUE; ++} ++ ++/* If path starts with a "trusted" directory, don't sanity check things */ ++/* This is really somewhat "outdated" as we now really want things in ++ * the picture dir or in ~/.gnome2/photo */ ++static gboolean ++is_in_trusted_pic_dir (const char *path) ++{ ++ /* our own pixmap dir is trusted */ ++ if (strncmp (path, EXPANDED_PIXMAPDIR, sizeof (EXPANDED_PIXMAPDIR)) == 0) ++ return TRUE; ++ ++ return FALSE; ++} ++ ++static gchar * ++get_facefile_from_gnome2_dir_config (const char *homedir, ++ guint uid) ++{ ++ char *picfile = NULL; ++ char *cfgdir; ++ ++ /* Sanity check on ~user/.gnome2/gdm */ ++ cfgdir = g_build_filename (homedir, ".gnome2", "gdm", NULL); ++ if (G_LIKELY (check_user_file (cfgdir, uid))) { ++ VeConfig *cfg; ++ char *cfgfile; ++ ++ cfgfile = g_build_filename (homedir, ".gnome2", "gdm", NULL); ++ cfg = ve_config_new (cfgfile); ++ g_free (cfgfile); ++ ++ picfile = ve_config_get_string (cfg, "face/picture="); ++ ve_config_destroy (cfg); ++ ++ /* must exist and be absolute (note that this check ++ * catches empty strings)*/ ++ /* Note that these days we just set ~/.face */ ++ if G_UNLIKELY (picfile != NULL && ++ (picfile[0] != '/' || ++ /* this catches readability by user */ ++ g_access (picfile, R_OK) != 0)) { ++ g_free (picfile); ++ picfile = NULL; ++ } ++ ++ if (picfile != NULL) { ++ char buf[PATH_MAX]; ++ if (realpath (picfile, buf) == NULL) { ++ g_free (picfile); ++ picfile = NULL; ++ } else { ++ g_free (picfile); ++ picfile = g_strdup (buf); ++ } ++ } ++ ++ if G_UNLIKELY (picfile != NULL) { ++ if (! is_in_trusted_pic_dir (picfile)) { ++ /* if not in trusted dir, check it out */ ++ ++ /* Note that strict permissions checking is done ++ * on this file. Even if it may not even be owned by the ++ * user. This setting should ONLY point to pics in trusted ++ * dirs. */ ++ if (! check_user_file (picfile, uid)) { ++ g_free (picfile); ++ picfile = NULL; ++ } ++ } ++ } ++ } ++ g_free (cfgdir); ++ ++ return picfile; ++} ++ ++static GHashTable *fstype_hash = NULL; ++extern char *filesystem_type (char *path, char *relpath, struct stat *statp); ++ ++static gboolean ++path_is_local (const char *path) ++{ ++ gpointer local = NULL; ++ ++ if (path == NULL) ++ return FALSE; ++ ++ if (fstype_hash == NULL) ++ fstype_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); ++ else ++ local = g_hash_table_lookup (fstype_hash, path); ++ ++ if (local == NULL) { ++ struct stat statbuf; ++ ++ if (g_stat (path, &statbuf) == 0) { ++ char *type = filesystem_type ((char *)path, (char *)path, &statbuf); ++ gboolean is_local = ((strcmp (ve_sure_string (type), "nfs") != 0) && ++ (strcmp (ve_sure_string (type), "afs") != 0) && ++ (strcmp (ve_sure_string (type), "autofs") != 0) && ++ (strcmp (ve_sure_string (type), "unknown") != 0) && ++ (strcmp (ve_sure_string (type), "ncpfs") != 0)); ++ local = GINT_TO_POINTER (is_local ? 1 : -1); ++ g_hash_table_insert (fstype_hash, g_strdup (path), local); ++ } ++ } ++ ++ return GPOINTER_TO_INT (local) > 0; ++} ++ ++gchar * ++gdm_get_facefile_from_home (const char *homedir, ++ guint uid) ++{ ++ char *picfile = NULL; ++ char *path; ++ gboolean is_local; ++ ++ /* special case: look at parent of home to detect autofs ++ this is so we don't try to trigger an automount */ ++ path = g_path_get_dirname (homedir); ++ is_local = path_is_local (path); ++ g_free (path); ++ ++ /* now check that home dir itself is local */ ++ if (is_local) { ++ is_local = path_is_local (homedir); ++ } ++ ++ /* Only look at local home directories so we don't try to ++ read from remote (e.g. NFS) volumes */ ++ if (! is_local) ++ return NULL; ++ ++ picfile = g_build_filename (homedir, ".face", NULL); ++ ++ if (check_user_file (picfile, uid)) ++ return picfile; ++ else { ++ g_free (picfile); ++ picfile = NULL; ++ } ++ ++ picfile = g_build_filename (homedir, ".face.icon", NULL); ++ ++ if (check_user_file (picfile, uid)) ++ return picfile; ++ else { ++ g_free (picfile); ++ picfile = NULL; ++ } ++ ++ picfile = get_facefile_from_gnome2_dir_config (homedir, uid); ++ if (check_user_file (picfile, uid)) ++ return picfile; ++ else { ++ g_free (picfile); ++ picfile = NULL; ++ } ++ ++ /* Nothing found yet, try the old locations */ ++ ++ picfile = g_build_filename (homedir, ".gnome2", "photo", NULL); ++ if (check_user_file (picfile, uid)) ++ return picfile; ++ else { ++ g_free (picfile); ++ picfile = NULL; ++ } ++ ++ picfile = g_build_filename (homedir, ".gnome", "photo", NULL); ++ if (check_user_file (picfile, uid)) ++ return picfile; ++ else { ++ g_free (picfile); ++ picfile = NULL; ++ } ++ ++ return NULL; ++} ++ ++gchar * ++gdm_get_facefile_from_global (const char *username, ++ guint uid) ++{ ++ char *picfile = NULL; ++ char *facedir = gdm_get_value_string (GDM_KEY_GLOBAL_FACE_DIR); ++ ++ /* Try the global face directory */ ++ ++ picfile = g_build_filename (facedir, username, NULL); ++ ++ if (check_global_file (picfile, uid)) ++ return picfile; ++ ++ g_free (picfile); ++ picfile = gdm_make_filename (facedir, username, ".png"); ++ ++ if (check_global_file (picfile, uid)) ++ return picfile; ++ ++ g_free (picfile); ++ return NULL; ++} ++ ++/** ++ * gdm_get_session_exec ++ * ++ * This function accesses the GDM session desktop file, via vicious ++ * extensions and returns the execution command for starting the ++ * session. ++ */ ++char * ++gdm_get_session_exec (const char *session_name, gboolean check_try_exec) ++{ ++ char *file; ++ char *full = NULL; ++ VeConfig *cfg; ++ static char *exec; ++ static char *cached = NULL; ++ char *tryexec; ++ ++ /* clear cache */ ++ if (session_name == NULL) { ++ g_free (exec); ++ exec = NULL; ++ g_free (cached); ++ cached = NULL; ++ return NULL; ++ } ++ ++ if (cached != NULL && strcmp (ve_sure_string (session_name), ve_sure_string (cached)) == 0) ++ return g_strdup (exec); ++ ++ g_free (exec); ++ exec = NULL; ++ g_free (cached); ++ cached = g_strdup (session_name); ++ ++ /* Some ugly special casing for legacy "Default.desktop", oh well, ++ * we changed to "default.desktop" */ ++ if (g_ascii_strcasecmp (session_name, "default") == 0 || ++ g_ascii_strcasecmp (session_name, "default.desktop") == 0) { ++ full = ve_find_prog_in_path ("default.desktop", ++ gdm_get_value_string (GDM_KEY_SESSION_DESKTOP_DIR)); ++ } ++ ++ if (full == NULL) { ++ file = gdm_ensure_extension (session_name, ".desktop"); ++ full = ve_find_prog_in_path (file, ++ gdm_get_value_string (GDM_KEY_SESSION_DESKTOP_DIR)); ++ g_free (file); ++ } ++ ++ if (ve_string_empty (full) || g_access (full, R_OK) != 0) { ++ g_free (full); ++ if (gdm_is_session_magic (session_name)) { ++ exec = g_strdup (session_name); ++ return g_strdup (exec); ++ } else { ++ return NULL; ++ } ++ } ++ ++ cfg = ve_config_get (full); ++ g_free (full); ++ if (ve_config_get_bool (cfg, "Desktop Entry/Hidden=false")) ++ return NULL; ++ ++ if (check_try_exec) { ++ tryexec = ve_config_get_string (cfg, "Desktop Entry/TryExec"); ++ if ( ! ve_string_empty (tryexec) && ++ ! ve_is_prog_in_path (tryexec, gdm_get_value_string (GDM_KEY_PATH)) && ++ ! ve_is_prog_in_path (tryexec, gdm_saved_getenv ("PATH"))) { ++ g_free (tryexec); ++ return NULL; ++ } ++ g_free (tryexec); ++ } ++ ++ exec = ve_config_get_string (cfg, "Desktop Entry/Exec"); ++ return g_strdup (exec); ++} ++ ++/** ++ * gdm_set_user_session_lang ++ * gdm_get_user_session_lang ++ * ++ * These functions get and set the user's language and setting in their ++ * $HOME/.dmrc file via vicious-extensions. ++ */ ++void ++gdm_set_user_session_lang (gboolean savesess, gboolean savelang, ++ const char *home_dir, const char *save_session, const char *save_language) ++{ ++ VeConfig *dmrc = NULL; ++ gchar *cfgstr = g_build_filename (home_dir, ".dmrc", NULL); ++ ++ if (savesess) { ++ dmrc = ve_config_new (cfgstr); ++ ve_config_set_string (dmrc, "Desktop/Session", ++ ve_sure_string (save_session)); ++ } ++ ++ if (savelang) { ++ if (dmrc == NULL) ++ dmrc = ve_config_new (cfgstr); ++ if (ve_string_empty (save_language)) ++ /* we chose the system default language so wipe the ++ * lang key */ ++ ve_config_delete_key (dmrc, "Desktop/Language"); ++ else ++ ve_config_set_string (dmrc, "Desktop/Language", save_language); ++ } ++ ++ g_free (cfgstr); ++ ++ if (dmrc != NULL) { ++ mode_t oldmode; ++ oldmode = umask (077); ++ ve_config_save (dmrc, FALSE); ++ ve_config_destroy (dmrc); ++ dmrc = NULL; ++ umask (oldmode); ++ } ++} ++ ++void ++gdm_get_user_session_lang (char **usrsess, char **usrlang, ++ const char *home_dir, gboolean *savesess) ++{ ++ char *p; ++ char *cfgfile = g_build_filename (home_dir, ".dmrc", NULL); ++ VeConfig *cfg = ve_config_new (cfgfile); ++ g_free (cfgfile); ++ ++ *usrsess = ve_config_get_string (cfg, "Desktop/Session"); ++ if (*usrsess == NULL) ++ *usrsess = g_strdup (""); ++ ++ /* this is just being truly anal about what users give us, and in case ++ * it looks like they may have included a path whack it. */ ++ p = strrchr (*usrsess, '/'); ++ if (p != NULL) { ++ char *tmp = g_strdup (p+1); ++ g_free (*usrsess); ++ *usrsess = tmp; ++ } ++ ++ /* ugly workaround for migration */ ++ if ((strcmp (ve_sure_string (*usrsess), "Default.desktop") == 0 || ++ strcmp (ve_sure_string (*usrsess), "Default") == 0) && ++ ! ve_is_prog_in_path ("Default.desktop", ++ gdm_get_value_string (GDM_KEY_SESSION_DESKTOP_DIR))) { ++ g_free (*usrsess); ++ *usrsess = g_strdup ("default"); ++ *savesess = TRUE; ++ } ++ ++ *usrlang = ve_config_get_string (cfg, "Desktop/Language"); ++ if (*usrlang == NULL) ++ *usrlang = g_strdup (""); ++ ++ ve_config_destroy (cfg); ++} ++ +diff -Nur gdm-2.13.0.5.orig/daemon/gdm.c.orig gdm-2.13.0.5/daemon/gdm.c.orig +--- gdm-2.13.0.5.orig/daemon/gdm.c.orig 1970-01-01 01:00:00.000000000 +0100 ++++ gdm-2.13.0.5/daemon/gdm.c.orig 2006-01-15 23:49:08.000000000 +0100 +@@ -0,0 +1,3372 @@ ++/* GDM - The GNOME Display Manager ++ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen ++ * ++ * This program is free software; you can redistribute 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 ++ ++#include ++#include ++#include ++#include ++#include ++#if defined (_POSIX_PRIORITY_SCHEDULING) && defined (HAVE_SCHED_YIELD) ++#include ++#endif ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* This should be moved to auth.c I suppose */ ++ ++#include ++#include ++ ++/* Needed for signal handling */ ++#include ++ ++#include "gdm.h" ++#include "misc.h" ++#include "slave.h" ++#include "server.h" ++#include "xdmcp.h" ++#include "verify.h" ++#include "display.h" ++#include "choose.h" ++#include "getvt.h" ++#include "gdm-net.h" ++#include "cookie.h" ++#include "filecheck.h" ++#include "gdmconfig.h" ++ ++#define DYNAMIC_ADD 0 ++#define DYNAMIC_RELEASE 1 ++#define DYNAMIC_REMOVE 2 ++ ++#ifdef HAVE_LOGINDEVPERM ++#include ++#endif /* HAVE_LOGINDEVPERM */ ++ ++extern GSList *displays; ++ ++/* Local functions */ ++static void gdm_handle_message (GdmConnection *conn, ++ const char *msg, ++ gpointer data); ++static void gdm_handle_user_message (GdmConnection *conn, ++ const char *msg, ++ gpointer data); ++static void gdm_daemonify (void); ++static void gdm_safe_restart (void); ++static void gdm_try_logout_action (GdmDisplay *disp); ++static void gdm_restart_now (void); ++static void handle_flexi_server (GdmConnection *conn, ++ int type, ++ const char *server, ++ gboolean handled, ++ gboolean chooser, ++ const char *xnest_disp, ++ uid_t xnest_uid, ++ const char *xnest_auth_file, ++ const char *xnest_cookie); ++ ++/* Global vars */ ++gint xdmcp_sessions = 0; /* Number of remote sessions */ ++gint xdmcp_pending = 0; /* Number of pending remote sessions */ ++gint flexi_servers = 0; /* Number of flexi servers */ ++pid_t extra_process = 0; /* An extra process. Used for quickie ++ processes, so that they also get whacked */ ++int extra_status = 0; /* Last status from the last extra process */ ++pid_t gdm_main_pid = 0; /* PID of the main daemon */ ++ ++gboolean gdm_wait_for_go = FALSE; /* wait for a GO in the fifo */ ++ ++gboolean print_version = FALSE; /* print version number and quit */ ++gboolean preserve_ld_vars = FALSE; /* Preserve the ld environment variables */ ++gboolean no_daemon = FALSE; /* Do not daemonize */ ++gboolean no_console = FALSE; /* There are no static servers, this means, ++ don't run static servers and second, ++ don't display info on the console */ ++ ++GdmConnection *fifoconn = NULL; /* Fifo connection */ ++GdmConnection *pipeconn = NULL; /* slavepipe (handled just like Fifo for compatibility) connection */ ++GdmConnection *unixconn = NULL; /* UNIX Socket connection */ ++int slave_fifo_pipe_fd = -1; /* the slavepipe connection */ ++ ++unsigned char *gdm_global_cookie = NULL; ++unsigned char *gdm_global_bcookie = NULL; ++ ++char *gdm_charset = NULL; ++ ++int gdm_normal_runlevel = -1; /* runlevel on linux that gdm was started in */ ++ ++/* True if the server that was run was in actuallity not specified in the ++ * config file. That is if xdmcp was disabled and no static servers were ++ * defined. If the user kills all his static servers by mistake and keeps ++ * xdmcp on. Well then he's screwed. The configurator should be smarter ++ * about that. But by default xdmcp is disabled so we're likely to catch ++ * some errors like this. */ ++gboolean gdm_emergency_server = FALSE; ++ ++gboolean gdm_first_login = TRUE; ++ ++int gdm_in_signal = 0; ++gboolean gdm_in_final_cleanup = FALSE; ++ ++GdmLogoutAction safe_logout_action = GDM_LOGOUT_ACTION_NONE; ++ ++/* set in the main function */ ++char **stored_argv = NULL; ++int stored_argc = 0; ++ ++extern gchar *config_file; ++static gboolean gdm_restart_mode = FALSE; ++ ++static GMainLoop *main_loop = NULL; ++ ++static gboolean monte_carlo_sqrt2 = FALSE; ++ ++ ++/* ++ * lookup display number if the display number is ++ * exists then clear the remove flag and return TRUE ++ * otherwise return FALSE ++ */ ++static gboolean ++mark_display_exists (int num) ++{ ++ GSList *li; ++ ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *disp = li->data; ++ if (disp->dispnum == num) { ++ disp->removeconf = FALSE; ++ return TRUE; ++ } ++ } ++ return FALSE; ++} ++ ++/** ++ * gdm_daemonify: ++ * ++ * Detach gdm daemon from the controlling terminal ++ */ ++ ++static void ++gdm_daemonify (void) ++{ ++ FILE *pf; ++ pid_t pid; ++ ++ pid = fork (); ++ if (pid > 0) { ++ gchar *pidfile = gdm_get_value_string (GDM_KEY_PID_FILE); ++ ++ errno = 0; ++ if ((pf = gdm_safe_fopen_w (pidfile)) != NULL) { ++ errno = 0; ++ VE_IGNORE_EINTR (fprintf (pf, "%d\n", (int)pid)); ++ VE_IGNORE_EINTR (fclose (pf)); ++ if G_UNLIKELY (errno != 0) { ++ /* FIXME: how to handle this? */ ++ gdm_fdprintf (2, _("Cannot write PID file %s: possibly out of diskspace. Error: %s\n"), ++ pidfile, strerror (errno)); ++ gdm_error (_("Cannot write PID file %s: possibly out of diskspace. Error: %s"), ++ pidfile, strerror (errno)); ++ ++ } ++ } else if G_UNLIKELY (errno != 0) { ++ /* FIXME: how to handle this? */ ++ gdm_fdprintf (2, _("Cannot write PID file %s: possibly out of diskspace. Error: %s\n"), ++ pidfile, strerror (errno)); ++ gdm_error (_("Cannot write PID file %s: possibly out of diskspace. Error: %s"), ++ pidfile, strerror (errno)); ++ ++ } ++ ++ exit (EXIT_SUCCESS); ++ } ++ gdm_main_pid = getpid (); ++ ++ if G_UNLIKELY (pid < 0) ++ gdm_fail (_("%s: fork () failed!"), "gdm_daemonify"); ++ ++ if G_UNLIKELY (setsid () < 0) ++ gdm_fail (_("%s: setsid () failed: %s!"), "gdm_daemonify", ++ strerror (errno)); ++ ++ VE_IGNORE_EINTR (g_chdir (gdm_get_value_string (GDM_KEY_SERV_AUTHDIR))); ++ umask (022); ++ ++ VE_IGNORE_EINTR (close (0)); ++ VE_IGNORE_EINTR (close (1)); ++ VE_IGNORE_EINTR (close (2)); ++ ++ gdm_open_dev_null (O_RDONLY); /* open stdin - fd 0 */ ++ gdm_open_dev_null (O_RDWR); /* open stdout - fd 1 */ ++ gdm_open_dev_null (O_RDWR); /* open stderr - fd 2 */ ++} ++ ++static void ++gdm_start_first_unborn_local (int delay) ++{ ++ GSList *li; ++ ++ /* tickle the random stuff */ ++ gdm_random_tick (); ++ ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *d = li->data; ++ ++ if (d != NULL && ++ d->type == TYPE_STATIC && ++ d->dispstat == DISPLAY_UNBORN) { ++ GdmXserver *svr; ++ gdm_debug ("gdm_start_first_unborn_local: " ++ "Starting %s", d->name); ++ ++ /* well sleep at least 'delay' seconds ++ * before starting */ ++ d->sleep_before_run = delay; ++ ++ /* only the first static display has ++ * timed login going on */ ++ if (gdm_first_login) ++ d->timed_login_ok = TRUE; ++ ++ svr = gdm_server_resolve (d); ++ ++ if ( ! gdm_display_manage (d)) { ++ gdm_display_unmanage (d); ++ /* only the first static display where ++ we actually log in gets ++ autologged in */ ++ if (svr != NULL && ++ svr->handled && ++ ! svr->chooser) ++ gdm_first_login = FALSE; ++ } else { ++ /* only the first static display where ++ we actually log in gets ++ autologged in */ ++ if (svr != NULL && ++ svr->handled && ++ ! svr->chooser) ++ gdm_first_login = FALSE; ++ break; ++ } ++ } ++ } ++} ++ ++void ++gdm_final_cleanup (void) ++{ ++ GSList *list, *li; ++ gchar *pidfile; ++ gboolean first; ++ ++ gdm_debug ("gdm_final_cleanup"); ++ ++ gdm_in_final_cleanup = TRUE; ++ ++ if (extra_process > 1) { ++ /* we sigterm extra processes, and we ++ * don't wait */ ++ kill (-(extra_process), SIGTERM); ++ extra_process = 0; ++ } ++ ++ /* First off whack all XDMCP and FLEXI_XNEST ++ slaves, we'll wait for them later */ ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *d = li->data; ++ if (SERVER_IS_XDMCP (d) || ++ SERVER_IS_PROXY (d)) { ++ /* set to DEAD so that we won't kill it again */ ++ d->dispstat = DISPLAY_DEAD; ++ if (d->slavepid > 1) ++ kill (d->slavepid, SIGTERM); ++ } ++ } ++ ++ /* Now completely unmanage the static servers */ ++ first = TRUE; ++ list = g_slist_copy (displays); ++ /* somewhat of a hack to kill last server ++ * started first. This mostly makes things end up on ++ * the right vt */ ++ list = g_slist_reverse (list); ++ for (li = list; li != NULL; li = li->next) { ++ GdmDisplay *d = li->data; ++ if (SERVER_IS_XDMCP (d) || ++ SERVER_IS_PROXY (d)) ++ continue; ++ /* HACK! Wait 2 seconds between killing of static servers ++ * because X is stupid and full of races and will otherwise ++ * hang my keyboard */ ++ if ( ! first) { ++ /* there could be signals happening ++ here */ ++ gdm_sleep_no_signal (2); ++ } ++ first = FALSE; ++ gdm_display_unmanage (d); ++ } ++ g_slist_free (list); ++ ++ /* and now kill and wait for the XDMCP and FLEXI_XNEST ++ slaves. unmanage will not kill slaves we have already ++ killed unless a SIGTERM was sent in the meantime */ ++ ++ list = g_slist_copy (displays); ++ for (li = list; li != NULL; li = li->next) { ++ GdmDisplay *d = li->data; ++ if (SERVER_IS_XDMCP (d) || ++ SERVER_IS_PROXY (d)) ++ gdm_display_unmanage (d); ++ } ++ g_slist_free (list); ++ ++ /* Close stuff */ ++ ++ if (gdm_get_value_bool (GDM_KEY_XDMCP)) ++ gdm_xdmcp_close (); ++ ++ if (fifoconn != NULL) { ++ char *path; ++ gdm_connection_close (fifoconn); ++ path = g_build_filename (gdm_get_value_string (GDM_KEY_SERV_AUTHDIR), ".gdmfifo", NULL); ++ VE_IGNORE_EINTR (g_unlink (path)); ++ g_free (path); ++ fifoconn = NULL; ++ } ++ ++ if (pipeconn != NULL) { ++ gdm_connection_close (pipeconn); ++ pipeconn = NULL; ++ } ++ ++ if (slave_fifo_pipe_fd >= 0) { ++ VE_IGNORE_EINTR (close (slave_fifo_pipe_fd)); ++ slave_fifo_pipe_fd = -1; ++ } ++ ++ if (unixconn != NULL) { ++ gdm_connection_close (unixconn); ++ VE_IGNORE_EINTR (g_unlink (GDM_SUP_SOCKET)); ++ unixconn = NULL; ++ } ++ ++ closelog (); ++ ++ pidfile = gdm_get_value_string (GDM_KEY_PID_FILE); ++ if (pidfile != NULL) { ++ VE_IGNORE_EINTR (g_unlink (pidfile)); ++ } ++ ++#ifdef HAVE_LOGINDEVPERM ++ (void) di_devperm_logout ("/dev/console"); ++#endif /* HAVE_LOGINDEVPERM */ ++} ++ ++static gboolean ++deal_with_x_crashes (GdmDisplay *d) ++{ ++ gboolean just_abort = FALSE; ++ gchar* failsafe = gdm_get_value_string (GDM_KEY_FAILSAFE_XSERVER); ++ gchar* keepscrashing = gdm_get_value_string (GDM_KEY_X_KEEPS_CRASHING); ++ ++ if ( ! d->failsafe_xserver && ++ ! ve_string_empty (failsafe)) { ++ char *bin = ve_first_word (failsafe); ++ /* Yay we have a failsafe */ ++ if ( ! ve_string_empty (bin) && ++ g_access (bin, X_OK) == 0) { ++ gdm_info (_("%s: Trying failsafe X " ++ "server %s"), ++ "deal_with_x_crashes", ++ failsafe); ++ g_free (bin); ++ g_free (d->command); ++ d->command = g_strdup (failsafe); ++ d->failsafe_xserver = TRUE; ++ return TRUE; ++ } ++ g_free (bin); ++ } ++ ++ /* Eeek X keeps crashing, let's try the XKeepsCrashing script */ ++ if ( ! ve_string_empty (keepscrashing) && ++ g_access (keepscrashing, X_OK|R_OK) == 0) { ++ pid_t pid; ++ ++ gdm_info (_("%s: Running the " ++ "XKeepsCrashing script"), ++ "deal_with_x_crashes"); ++ ++ extra_process = pid = fork (); ++ if (pid < 0) ++ extra_process = 0; ++ ++ if (pid == 0) { ++ char *argv[2]; ++ char *xlog = gdm_make_filename (gdm_get_value_string (GDM_KEY_LOG_DIR), d->name, ".log"); ++ ++ gdm_unset_signals (); ++ ++ /* Also make a new process group so that we may use ++ * kill -(extra_process) to kill extra process and all its ++ * possible children */ ++ setsid (); ++ ++ if (gdm_get_value_bool (GDM_KEY_XDMCP)) ++ gdm_xdmcp_close (); ++ ++ closelog (); ++ ++ gdm_close_all_descriptors (0 /* from */, -1 /* except */, -1 /* except2 */); ++ ++ /* No error checking here - if it's messed the best response ++ * is to ignore & try to continue */ ++ gdm_open_dev_null (O_RDONLY); /* open stdin - fd 0 */ ++ gdm_open_dev_null (O_RDWR); /* open stdout - fd 1 */ ++ gdm_open_dev_null (O_RDWR); /* open stderr - fd 2 */ ++ ++ argv[0] = gdm_get_value_string (GDM_KEY_X_KEEPS_CRASHING); ++ argv[1] = NULL; ++ ++ gdm_restoreenv (); ++ ++ /* unset DISPLAY and XAUTHORITY if they exist ++ * so that gdialog (if used) doesn't get confused */ ++ g_unsetenv ("DISPLAY"); ++ g_unsetenv ("XAUTHORITY"); ++ ++ /* some promised variables */ ++ g_setenv ("XLOG", xlog, TRUE); ++ g_setenv ("BINDIR", EXPANDED_BINDIR, TRUE); ++ g_setenv ("SBINDIR", EXPANDED_SBINDIR, TRUE); ++ g_setenv ("LIBEXECDIR", EXPANDED_LIBEXECDIR, TRUE); ++ g_setenv ("SYSCONFDIR", EXPANDED_SYSCONFDIR, TRUE); ++ ++ /* To enable gettext stuff in the script */ ++ g_setenv ("TEXTDOMAIN", GETTEXT_PACKAGE, TRUE); ++ g_setenv ("TEXTDOMAINDIR", GNOMELOCALEDIR, TRUE); ++ ++ if ( ! gdm_ok_console_language ()) { ++ g_unsetenv ("LANG"); ++ g_unsetenv ("LC_ALL"); ++ g_unsetenv ("LC_MESSAGES"); ++ g_setenv ("LANG", "C", TRUE); ++ g_setenv ("UNSAFE_TO_TRANSLATE", "yes", TRUE); ++ } ++ ++ VE_IGNORE_EINTR (execv (argv[0], argv)); ++ ++ /* yaikes! */ ++ _exit (32); ++ } else if (pid > 0) { ++ int status; ++ ++ if (extra_process > 1) { ++ int ret; ++ int killsignal = SIGTERM; ++ int storeerrno; ++ errno = 0; ++ ret = waitpid (extra_process, &status, WNOHANG); ++ do { ++ /* wait for some signal, yes this is a race */ ++ if (ret <= 0) ++ sleep (10); ++ errno = 0; ++ ret = waitpid (extra_process, &status, WNOHANG); ++ storeerrno = errno; ++ if ((ret <= 0) && gdm_signal_terminthup_was_notified ()) { ++ kill (-(extra_process), killsignal); ++ killsignal = SIGKILL; ++ } ++ } while (ret == 0 || (ret < 0 && storeerrno == EINTR)); ++ } ++ extra_process = 0; ++ ++ if (WIFEXITED (status) && ++ WEXITSTATUS (status) == 0) { ++ /* Yay, the user wants to try again, so ++ * here we go */ ++ return TRUE; ++ } else if (WIFEXITED (status) && ++ WEXITSTATUS (status) == 32) { ++ /* We couldn't run the script, just drop through */ ++ ; ++ } else { ++ /* Things went wrong, or the user's a wanker */ ++ just_abort = TRUE; ++ } ++ } ++ ++ /* if we failed to fork, or something else has happened, ++ * we fall through to the other options below */ ++ } ++ ++ ++ /* if we have "open" we can talk to the user, not as user ++ * friendly as the above script, but getting there */ ++ if ( ! just_abort && ++ g_access (EXPANDED_LIBEXECDIR "/gdmopen", X_OK) == 0) { ++ /* Shit if we knew what the program was to tell the user, ++ * the above script would have been defined and we'd run ++ * it for them */ ++ const char *error = ++ C_(N_("The X server (your graphical interface) " ++ "cannot be started. It is likely that it is not " ++ "set up correctly. You will need to log in on a " ++ "console and rerun the X configuration " ++ "application, then restart GDM.")); ++ gdm_text_message_dialog (error); ++ } /* else { ++ * At this point .... screw the user, we don't know how to ++ * talk to him. He's on some 'l33t system anyway, so syslog ++ * reading will do him good ++ * } */ ++ ++ gdm_error (_("Failed to start X server several times in a short time period; disabling display %s"), d->name); ++ ++ return FALSE; ++} ++ ++static void ++suspend_machine (void) ++{ ++ gchar *suspend = gdm_get_value_string (GDM_KEY_SUSPEND); ++ ++ gdm_info (_("Master suspending...")); ++ ++ if (suspend != NULL && fork () == 0) { ++ char **argv; ++ ++ /* sync everything to disk, just in case something goes ++ * wrong with the suspend */ ++ sync (); ++ ++ if (gdm_get_value_bool (GDM_KEY_XDMCP)) ++ gdm_xdmcp_close (); ++ /* In the child setup empty mask and set all signals to ++ * default values */ ++ gdm_unset_signals (); ++ ++ /* Also make a new process group */ ++ setsid (); ++ ++ VE_IGNORE_EINTR (g_chdir ("/")); ++ ++ /* short sleep to give some processing time to master */ ++ usleep (1000); ++ ++ argv = ve_split (suspend); ++ if (argv != NULL && argv[0] != NULL) ++ VE_IGNORE_EINTR (execv (argv[0], argv)); ++ /* FIXME: what about fail */ ++ _exit (1); ++ } ++} ++ ++#ifdef __linux__ ++static void ++change_to_first_and_clear (gboolean reboot) ++{ ++ gdm_change_vt (1); ++ VE_IGNORE_EINTR (close (0)); ++ VE_IGNORE_EINTR (close (1)); ++ VE_IGNORE_EINTR (close (2)); ++ VE_IGNORE_EINTR (open ("/dev/tty1", O_WRONLY)); ++ VE_IGNORE_EINTR (open ("/dev/tty1", O_WRONLY)); ++ VE_IGNORE_EINTR (open ("/dev/tty1", O_WRONLY)); ++ ++ g_setenv ("TERM", "linux", TRUE); ++ ++ /* evil hack that will get the fonts right */ ++ if (g_access ("/bin/bash", X_OK) == 0) ++ system ("/bin/bash -l -c /bin/true"); ++ ++ /* clear screen and set to red */ ++ printf ("\033[H\033[J\n\n\033[1m---\n\033[1;31m "); ++ ++ if (reboot) ++ printf (_("System is rebooting, please wait ...")); ++ else ++ printf (_("System is shutting down, please wait ...")); ++ /* set to black */ ++ printf ("\033[0m\n\033[1m---\033[0m\n\n"); ++} ++#endif /* __linux__ */ ++ ++static void ++halt_machine (void) ++{ ++ char **argv; ++ ++ gdm_info (_("Master halting...")); ++ ++ gdm_final_cleanup (); ++ VE_IGNORE_EINTR (g_chdir ("/")); ++ ++#ifdef __linux__ ++ change_to_first_and_clear (FALSE /* reboot */); ++#endif /* __linux */ ++ ++ argv = ve_split (gdm_get_value_string (GDM_KEY_HALT)); ++ if (argv != NULL && argv[0] != NULL) ++ VE_IGNORE_EINTR (execv (argv[0], argv)); ++ ++ gdm_error (_("%s: Halt failed: %s"), ++ "gdm_child_action", strerror (errno)); ++} ++ ++static void ++reboot_machine (void) ++{ ++ char **argv; ++ ++ gdm_info (_("Master rebooting...")); ++ ++ gdm_final_cleanup (); ++ VE_IGNORE_EINTR (g_chdir ("/")); ++ ++#ifdef __linux__ ++ change_to_first_and_clear (TRUE /* reboot */); ++#endif /* __linux */ ++ ++ argv = ve_split (gdm_get_value_string (GDM_KEY_REBOOT)); ++ if (argv != NULL && argv[0] != NULL) ++ VE_IGNORE_EINTR (execv (argv[0], argv)); ++ ++ gdm_error (_("%s: Reboot failed: %s"), ++ "gdm_child_action", strerror (errno)); ++} ++ ++ ++static gboolean ++gdm_cleanup_children (void) ++{ ++ pid_t pid; ++ gint exitstatus = 0, status; ++ GdmDisplay *d = NULL; ++ gboolean crashed; ++ ++ /* Pid and exit status of slave that died */ ++ pid = waitpid (-1, &exitstatus, WNOHANG); ++ ++ if (pid <= 0) ++ return FALSE; ++ ++ if G_LIKELY (WIFEXITED (exitstatus)) { ++ status = WEXITSTATUS (exitstatus); ++ crashed = FALSE; ++ gdm_debug ("gdm_cleanup_children: child %d returned %d", pid, status); ++ } else { ++ status = EXIT_SUCCESS; ++ crashed = TRUE; ++ if (WIFSIGNALED (exitstatus)) { ++ if (WTERMSIG (exitstatus) == SIGTERM || ++ WTERMSIG (exitstatus) == SIGINT) { ++ /* we send these signals, sometimes children don't handle them */ ++ gdm_debug ("gdm_cleanup_children: child %d died of signal %d (TERM/INT)", pid, ++ (int)WTERMSIG (exitstatus)); ++ } else { ++ gdm_error ("gdm_cleanup_children: child %d crashed of signal %d", pid, ++ (int)WTERMSIG (exitstatus)); ++ } ++ } else { ++ gdm_error ("gdm_cleanup_children: child %d crashed", pid); ++ } ++ } ++ ++ if (pid == extra_process) { ++ /* an extra process died, yay! */ ++ extra_process = 0; ++ extra_status = exitstatus; ++ return TRUE; ++ } ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (pid); ++ ++ if (d == NULL) ++ return TRUE; ++ ++ /* whack connections about this display */ ++ if (unixconn != NULL) ++ gdm_kill_subconnections_with_display (unixconn, d); ++ ++ if G_UNLIKELY (crashed) { ++ gdm_error ("gdm_cleanup_children: Slave crashed, killing its " ++ "children"); ++ ++ if (d->sesspid > 1) ++ kill (-(d->sesspid), SIGTERM); ++ d->sesspid = 0; ++ if (d->greetpid > 1) ++ kill (-(d->greetpid), SIGTERM); ++ d->greetpid = 0; ++ if (d->chooserpid > 1) ++ kill (-(d->chooserpid), SIGTERM); ++ d->chooserpid = 0; ++ if (d->servpid > 1) ++ kill (d->servpid, SIGTERM); ++ d->servpid = 0; ++ if (gdm_get_value_bool (GDM_KEY_DYNAMIC_XSERVERS)) /* XXX - This needs to be handled better */ ++ gdm_server_whack_lockfile (d); ++ ++ /* race avoider */ ++ gdm_sleep_no_signal (1); ++ } ++ ++ /* null all these, they are not valid most definately */ ++ d->servpid = 0; ++ d->sesspid = 0; ++ d->greetpid = 0; ++ d->chooserpid = 0; ++ ++ /* definately not logged in now */ ++ d->logged_in = FALSE; ++ g_free (d->login); ++ d->login = NULL; ++ ++ /* Declare the display dead */ ++ d->slavepid = 0; ++ d->dispstat = DISPLAY_DEAD; ++ ++ if ( ! gdm_get_value_bool (GDM_KEY_SYSTEM_MENU) && ++ (status == DISPLAY_RESTARTGDM || ++ status == DISPLAY_REBOOT || ++ status == DISPLAY_SUSPEND || ++ status == DISPLAY_HALT)) { ++ gdm_info (_("Reboot or Halt request when there is no system menu from display %s"), d->name); ++ status = DISPLAY_REMANAGE; ++ } ++ ++ if ( ! d->attached && ++ (status == DISPLAY_RESTARTGDM || ++ status == DISPLAY_REBOOT || ++ status == DISPLAY_SUSPEND || ++ status == DISPLAY_HALT)) { ++ gdm_info (_("Restart, Reboot or Halt request from a non-static display %s"), d->name); ++ status = DISPLAY_REMANAGE; ++ } ++ ++ if (status == DISPLAY_RUN_CHOOSER) { ++ /* use the chooser on the next run (but only if allowed) */ ++ if (gdm_get_value_bool (GDM_KEY_SYSTEM_MENU) && ++ gdm_get_value_bool (GDM_KEY_CHOOSER_BUTTON)) ++ d->use_chooser = TRUE; ++ status = DISPLAY_REMANAGE; ++ /* go around the display loop detection, these are short ++ * sessions, so this decreases the chances of the loop ++ * detection being hit */ ++ d->last_loop_start_time = 0; ++ } ++ ++ if (status == DISPLAY_CHOSEN) { ++ /* forget about this indirect id, since this ++ * display will be dead very soon, and we don't want it ++ * to take the indirect display with it */ ++ d->indirect_id = 0; ++ status = DISPLAY_REMANAGE; ++ } ++ ++ if (status == DISPLAY_GREETERFAILED) { ++ if (d->managetime + 10 >= time (NULL)) { ++ d->try_different_greeter = TRUE; ++ } else { ++ d->try_different_greeter = FALSE; ++ } ++ /* now just remanage */ ++ status = DISPLAY_REMANAGE; ++ } else { ++ d->try_different_greeter = FALSE; ++ } ++ ++ /* checkout if we can actually do stuff */ ++ switch (status) { ++ case DISPLAY_REBOOT: ++ if (gdm_get_value_string (GDM_KEY_REBOOT) == NULL) ++ status = DISPLAY_REMANAGE; ++ break; ++ case DISPLAY_HALT: ++ if (gdm_get_value_string (GDM_KEY_HALT) == NULL) ++ status = DISPLAY_REMANAGE; ++ break; ++ case DISPLAY_SUSPEND: ++ if (gdm_get_value_string (GDM_KEY_SUSPEND) == NULL) ++ status = DISPLAY_REMANAGE; ++ break; ++ default: ++ break; ++ } ++ ++ /* if we crashed clear the theme */ ++ if (crashed) { ++ g_free (d->theme_name); ++ d->theme_name = NULL; ++ } ++ ++start_autopsy: ++ ++ /* Autopsy */ ++ switch (status) { ++ ++ case DISPLAY_ABORT: /* Bury this display for good */ ++ gdm_info (_("%s: Aborting display %s"), ++ "gdm_child_action", d->name); ++ ++ gdm_try_logout_action (d); ++ gdm_safe_restart (); ++ ++ gdm_display_unmanage (d); ++ ++ /* If there are some pending statics, start them now */ ++ gdm_start_first_unborn_local (3 /* delay */); ++ break; ++ ++ case DISPLAY_REBOOT: /* Reboot machine */ ++ reboot_machine (); ++ ++ status = DISPLAY_REMANAGE; ++ goto start_autopsy; ++ break; ++ ++ case DISPLAY_HALT: /* Halt machine */ ++ halt_machine (); ++ ++ status = DISPLAY_REMANAGE; ++ goto start_autopsy; ++ break; ++ ++ case DISPLAY_SUSPEND: /* Suspend machine */ ++ /* XXX: this is ugly, why should there be a suspend like this, ++ * see GDM_SOP_SUSPEND_MACHINE */ ++ suspend_machine (); ++ ++ status = DISPLAY_REMANAGE; ++ goto start_autopsy; ++ break; ++ ++ case DISPLAY_RESTARTGDM: ++ gdm_restart_now (); ++ break; ++ ++ case DISPLAY_XFAILED: /* X sucks */ ++ gdm_debug ("X failed!"); ++ /* inform about error if needed */ ++ if (d->socket_conn != NULL) { ++ GdmConnection *conn = d->socket_conn; ++ d->socket_conn = NULL; ++ gdm_connection_set_close_notify (conn, NULL, NULL); ++ gdm_connection_write (conn, "ERROR 3 X failed\n"); ++ } ++ ++ gdm_try_logout_action (d); ++ gdm_safe_restart (); ++ ++ /* in remote/flexi case just drop to _REMANAGE */ ++ if (d->type == TYPE_STATIC) { ++ time_t now = time (NULL); ++ d->x_faileds ++; ++ /* This really is likely the first time if it's been, ++ some time, say 5 minutes */ ++ if (now - d->last_x_failed > (5*60)) { ++ /* reset */ ++ d->x_faileds = 1; ++ d->last_x_failed = now; ++ /* well sleep at least 3 seconds before starting */ ++ d->sleep_before_run = 3; ++ } else if (d->x_faileds >= 3) { ++ gdm_debug ("gdm_child_action: dealing with X crashes"); ++ if (gdm_get_value_bool (GDM_KEY_NOXKEEPSCRASHING)) { ++ gdm_display_unmanage (d); ++ gdm_start_first_unborn_local (3 /* delay */); ++ break; ++ } ++ ++ if ( ! deal_with_x_crashes (d)) { ++ gdm_debug ("gdm_child_action: Aborting display"); ++ /* an original way to deal with these things: ++ * "Screw you guys, I'm going home!" */ ++ gdm_display_unmanage (d); ++ ++ /* If there are some pending statics, ++ * start them now */ ++ gdm_start_first_unborn_local (3 /* delay */); ++ break; ++ } ++ gdm_debug ("gdm_child_action: Trying again"); ++ ++ /* reset */ ++ d->x_faileds = 0; ++ d->last_x_failed = 0; ++ } else { ++ /* well sleep at least 3 seconds before starting */ ++ d->sleep_before_run = 3; ++ } ++ /* go around the display loop detection, we're doing ++ * our own here */ ++ d->last_loop_start_time = 0; ++ } ++ /* fall through */ ++ ++ case DISPLAY_REMANAGE: /* Remanage display */ ++ default: ++ gdm_debug ("gdm_child_action: In remanage"); ++ ++ /* if we did REMANAGE, that means that we're no longer failing */ ++ if (status == DISPLAY_REMANAGE) { ++ /* reset */ ++ d->x_faileds = 0; ++ d->last_x_failed = 0; ++ } ++ ++ /* inform about error if needed */ ++ if (d->socket_conn != NULL) { ++ GdmConnection *conn = d->socket_conn; ++ d->socket_conn = NULL; ++ gdm_connection_set_close_notify (conn, NULL, NULL); ++ gdm_connection_write (conn, "ERROR 2 Startup errors\n"); ++ } ++ ++ gdm_try_logout_action (d); ++ gdm_safe_restart (); ++ ++ /* This is a static server so we start a new slave */ ++ if (d->type == TYPE_STATIC) { ++ if ( ! gdm_display_manage (d)) { ++ gdm_display_unmanage (d); ++ /* If there are some pending statics, ++ * start them now */ ++ gdm_start_first_unborn_local (3 /* delay */); ++ } ++ } else if (d->type == TYPE_FLEXI || d->type == TYPE_FLEXI_XNEST) { ++ /* if this was a chooser session and we have chosen a host, ++ then we don't want to unmanage, we want to manage and ++ choose that host */ ++ if (d->chosen_hostname != NULL || d->use_chooser) { ++ if ( ! gdm_display_manage (d)) { ++ gdm_display_unmanage (d); ++ } ++ } else { ++ /* else, this is a one time thing */ ++ gdm_display_unmanage (d); ++ } ++ /* Remote displays will send a request to be managed */ ++ } else /* TYPE_XDMCP */ { ++ gdm_display_unmanage (d); ++ } ++ ++ break; ++ } ++ ++ gdm_try_logout_action (d); ++ gdm_safe_restart (); ++ ++ return TRUE; ++} ++ ++static void ++gdm_restart_now (void) ++{ ++ gdm_info (_("GDM restarting ...")); ++ gdm_final_cleanup (); ++ gdm_restoreenv (); ++ VE_IGNORE_EINTR (execvp (stored_argv[0], stored_argv)); ++ gdm_error (_("Failed to restart self")); ++ _exit (1); ++} ++ ++static void ++gdm_safe_restart (void) ++{ ++ GSList *li; ++ ++ if ( ! gdm_restart_mode) ++ return; ++ ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *d = li->data; ++ ++ if (d->logged_in) ++ return; ++ } ++ ++ gdm_restart_now (); ++} ++ ++static void ++gdm_do_logout_action (GdmLogoutAction logout_action) ++{ ++ switch (logout_action) { ++ case GDM_LOGOUT_ACTION_HALT: ++ halt_machine (); ++ break; ++ ++ case GDM_LOGOUT_ACTION_REBOOT: ++ reboot_machine (); ++ break; ++ ++ case GDM_LOGOUT_ACTION_SUSPEND: ++ suspend_machine (); ++ break; ++ ++ default: ++ break; ++ } ++} ++ ++static void ++gdm_try_logout_action (GdmDisplay *disp) ++{ ++ GSList *li; ++ ++ if (disp != NULL && ++ disp->logout_action != GDM_LOGOUT_ACTION_NONE && ++ ! disp->logged_in) { ++ gdm_do_logout_action (disp->logout_action); ++ disp->logout_action = GDM_LOGOUT_ACTION_NONE; ++ return; ++ } ++ ++ if (safe_logout_action == GDM_LOGOUT_ACTION_NONE) ++ return; ++ ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *d = li->data; ++ ++ if (d->logged_in) ++ return; ++ } ++ ++ gdm_do_logout_action (safe_logout_action); ++ safe_logout_action = GDM_LOGOUT_ACTION_NONE; ++} ++ ++static void ++main_daemon_abrt (int sig) ++{ ++ /* FIXME: note that this could mean out of memory */ ++ gdm_error (_("main daemon: Got SIGABRT. Something went very wrong. Going down!")); ++ gdm_final_cleanup (); ++ exit (EXIT_FAILURE); ++} ++ ++static gboolean ++mainloop_sig_callback (int sig, gpointer data) ++{ ++ /* signals are at somewhat random times aren't they? */ ++ gdm_random_tick (); ++ ++ gdm_debug ("mainloop_sig_callback: Got signal %d", (int)sig); ++ switch (sig) ++ { ++ case SIGCHLD: ++ while (gdm_cleanup_children ()) ++ ; ++ break; ++ ++ case SIGINT: ++ case SIGTERM: ++ gdm_debug ("mainloop_sig_callback: Got TERM/INT. Going down!"); ++ gdm_final_cleanup (); ++ exit (EXIT_SUCCESS); ++ break; ++ ++#ifdef SIGXFSZ ++ case SIGXFSZ: ++ gdm_error ("main daemon: Hit file size rlimit, restarting!"); ++ gdm_restart_now (); ++ break; ++#endif ++ ++#ifdef SIGXCPU ++ case SIGXCPU: ++ gdm_error ("main daemon: Hit CPU rlimit, restarting!"); ++ gdm_restart_now (); ++ break; ++#endif ++ ++ case SIGHUP: ++ gdm_restart_now (); ++ break; ++ ++ case SIGUSR1: ++ gdm_restart_mode = TRUE; ++ gdm_safe_restart (); ++ break; ++ ++ default: ++ break; ++ } ++ ++ return TRUE; ++} ++ ++/* ++ * main: The main daemon control ++ */ ++ ++static void ++store_argv (int argc, char *argv[]) ++{ ++ int i; ++ ++ stored_argv = g_new0 (char *, argc + 1); ++ for (i = 0; i < argc; i++) ++ stored_argv[i] = g_strdup (argv[i]); ++ stored_argv[i] = NULL; ++ stored_argc = argc; ++} ++ ++static void ++close_notify (gpointer data) ++{ ++ GdmConnection **conn = data; ++ * conn = NULL; ++} ++ ++static void ++create_connections (void) ++{ ++ int p[2]; ++ gchar *path; ++ ++ path = g_build_filename (gdm_get_value_string (GDM_KEY_SERV_AUTHDIR), ".gdmfifo", NULL); ++ fifoconn = gdm_connection_open_fifo (path, 0660); ++ g_free (path); ++ ++ if G_LIKELY (fifoconn != NULL) { ++ gdm_connection_set_handler (fifoconn, ++ gdm_handle_message, ++ NULL /* data */, ++ NULL /* destroy_notify */); ++ gdm_connection_set_close_notify (fifoconn, ++ &fifoconn, ++ close_notify); ++ } ++ ++ if G_UNLIKELY (pipe (p) < 0) { ++ slave_fifo_pipe_fd = -1; ++ pipeconn = NULL; ++ } else { ++ slave_fifo_pipe_fd = p[1]; ++ pipeconn = gdm_connection_open_fd (p[0]); ++ } ++ ++ if G_LIKELY (pipeconn != NULL) { ++ gdm_connection_set_handler (pipeconn, ++ gdm_handle_message, ++ NULL /* data */, ++ NULL /* destroy_notify */); ++ gdm_connection_set_close_notify (pipeconn, ++ &pipeconn, ++ close_notify); ++ } else { ++ VE_IGNORE_EINTR (close (p[0])); ++ VE_IGNORE_EINTR (close (p[1])); ++ slave_fifo_pipe_fd = -1; ++ } ++ ++ ++ unixconn = gdm_connection_open_unix (GDM_SUP_SOCKET, 0666); ++ ++ if G_LIKELY (unixconn != NULL) { ++ gdm_connection_set_handler (unixconn, ++ gdm_handle_user_message, ++ NULL /* data */, ++ NULL /* destroy_notify */); ++ gdm_connection_set_nonblock (unixconn, TRUE); ++ gdm_connection_set_close_notify (unixconn, ++ &unixconn, ++ close_notify); ++ } ++} ++ ++static void ++calc_sqrt2 (void) ++{ ++ unsigned long n = 0, h = 0; ++ double x; ++ printf ("\n"); ++ for (;;) { ++ x = g_random_double_range (1.0, 2.0); ++ if (x*x <= 2.0) ++ h++; ++ n++; ++ if ( ! (n & 0xfff)) { ++ double sqrttwo = 1.0 + ((double)h)/(double)n; ++ printf ("sqrt(2) ~~ %1.10f\t(1 + %lu/%lu) " ++ "iteration: %lu \r", ++ sqrttwo, h, n, n); ++ } ++ } ++} ++ ++struct poptOption options [] = { ++ { "nodaemon", '\0', POPT_ARG_NONE | POPT_ARGFLAG_ONEDASH, ++ &no_daemon, 0, N_("Do not fork into the background"), NULL }, ++ { "no-console", '\0', POPT_ARG_NONE, ++ &no_console, 0, N_("No console (static) servers to be run"), NULL }, ++ { "config", '\0', POPT_ARG_STRING, ++ &config_file, 0, N_("Alternative configuration file"), N_("CONFIGFILE") }, ++ { "preserve-ld-vars", '\0', POPT_ARG_NONE, ++ &preserve_ld_vars, 0, N_("Preserve LD_* variables"), NULL }, ++ { "version", '\0', POPT_ARG_NONE, ++ &print_version, 0, N_("Print GDM version"), NULL }, ++ { "wait-for-go", '\0', POPT_ARG_NONE, ++ &gdm_wait_for_go, 0, N_("Start the first X server but then halt until we get a GO in the fifo"), NULL }, ++ { "monte-carlo-sqrt2", 0, POPT_ARG_NONE, ++ &monte_carlo_sqrt2, 0, NULL, NULL }, ++ POPT_AUTOHELP ++ { NULL, 0, 0, NULL, 0} ++}; ++ ++static gboolean ++linux_only_is_running (pid_t pid) ++{ ++ char resolved_self[PATH_MAX]; ++ char resolved_running[PATH_MAX]; ++ ++ char *running = g_strdup_printf ("/proc/%lu/exe", (gulong)pid); ++ ++ if (realpath ("/proc/self/exe", resolved_self) == NULL) { ++ g_free (running); ++ /* probably not a linux system */ ++ return TRUE; ++ } ++ ++ if (realpath (running, resolved_running) == NULL) { ++ g_free (running); ++ /* probably not a linux system */ ++ return TRUE; ++ } ++ ++ g_free (running); ++ ++ if (strcmp (resolved_running, resolved_self) == 0) ++ return TRUE; ++ return FALSE; ++} ++ ++static void ++ensure_desc_012 (void) ++{ ++ int fd; ++ /* We here ensure descriptors 0, 1 and 2 ++ * we of course count on the fact that open ++ * opens the lowest available descriptor */ ++ for (;;) { ++ fd = gdm_open_dev_null (O_RDWR); ++ /* Once we are up to 3, we're beyond stdin, ++ * stdout and stderr */ ++ if (fd >= 3) { ++ VE_IGNORE_EINTR (close (fd)); ++ break; ++ } ++ } ++} ++ ++static void ++gdm_get_our_runlevel (void) ++{ ++#ifdef __linux__ ++ /* on linux we get our current runlevel, for use later ++ * to detect a shutdown going on, and not mess up. */ ++ if (g_access ("/sbin/runlevel", X_OK) == 0) { ++ char ign; ++ int rnl; ++ FILE *fp = popen ("/sbin/runlevel", "r"); ++ if (fp != NULL) { ++ if (fscanf (fp, "%c %d", &ign, &rnl) == 2) { ++ gdm_normal_runlevel = rnl; ++ } ++ pclose (fp); ++ } ++ } ++#endif /* __linux__ */ ++} ++ ++/* initially if we get a TERM or INT we just want to die, ++ but we want to also kill an extra process if it exists */ ++static void ++initial_term_int (int signal) ++{ ++ if (extra_process > 1) ++ kill (-(extra_process), SIGTERM); ++ _exit (EXIT_FAILURE); ++} ++ ++static void ++gdm_make_global_cookie (void) ++{ ++ FILE *fp; ++ char *file; ++ mode_t oldmode; ++ ++ /* kind of a hack */ ++ GdmDisplay faked = {0}; ++ faked.authfile = NULL; ++ faked.bcookie = NULL; ++ faked.cookie = NULL; ++ ++ gdm_cookie_generate (&faked); ++ ++ gdm_global_cookie = (unsigned char *) faked.cookie; ++ gdm_global_bcookie = (unsigned char *) faked.bcookie; ++ ++ file = g_build_filename (gdm_get_value_string (GDM_KEY_SERV_AUTHDIR), ".cookie", NULL); ++ VE_IGNORE_EINTR (g_unlink (file)); ++ ++ oldmode = umask (077); ++ fp = gdm_safe_fopen_w (file); ++ umask (oldmode); ++ if G_UNLIKELY (fp == NULL) { ++ gdm_error (_("Can't open %s for writing"), file); ++ g_free (file); ++ return; ++ } ++ ++ VE_IGNORE_EINTR (fprintf (fp, "%s\n", gdm_global_cookie)); ++ ++ /* FIXME: What about out of disk space errors? */ ++ errno = 0; ++ VE_IGNORE_EINTR (fclose (fp)); ++ if G_UNLIKELY (errno != 0) { ++ gdm_error (_("Can't write to %s: %s"), file, ++ strerror (errno)); ++ } ++ ++ g_free (file); ++} ++ ++int ++main (int argc, char *argv[]) ++{ ++ FILE *pf; ++ sigset_t mask; ++ struct sigaction sig, child, abrt; ++ poptContext ctx; ++ gchar *pidfile; ++ int nextopt; ++ const char *charset; ++ ++ /* semi init pseudorandomness */ ++ gdm_random_tick (); ++ ++ gdm_main_pid = getpid (); ++ ++ /* We here ensure descriptors 0, 1 and 2 */ ++ ensure_desc_012 (); ++ ++ /* store all initial stuff, args, env, rlimits, runlevel */ ++ store_argv (argc, argv); ++ gdm_saveenv (); ++ gdm_get_initial_limits (); ++ gdm_get_our_runlevel (); ++ ++ bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); ++ textdomain (GETTEXT_PACKAGE); ++ ++ setlocale (LC_ALL, ""); ++ ++ /* Initialize runtime environment */ ++ umask (022); ++ ++ ctx = poptGetContext ("gdm", argc, (const char **) argv, ++ options, 0); ++ while ((nextopt = poptGetNextOpt (ctx)) > 0 || nextopt == POPT_ERROR_BADOPT) ++ /* do nothing */ ; ++ ++ if G_UNLIKELY (nextopt != -1) { ++ fprintf (stderr, ++ _("Error on option %s: %s.\nRun '%s --help' to see a full list of available command line options.\n"), ++ poptBadOption (ctx, 0), ++ poptStrerror (nextopt), ++ argv[0]); ++ fflush (stderr); ++ exit (1); ++ } ++ ++ if (monte_carlo_sqrt2) { ++ calc_sqrt2 (); ++ return 0; ++ } ++ ++ if (print_version) { ++ printf ("GDM %s\n", VERSION); ++ fflush (stdout); ++ exit (0); ++ } ++ ++ /* XDM compliant error message */ ++ if G_UNLIKELY (getuid () != 0) { ++ /* make sure the pid file doesn't get wiped */ ++ gdm_fail (_("Only root wants to run GDM\n")); ++ } ++ ++ main_loop = g_main_loop_new (NULL, FALSE); ++ openlog ("gdm", LOG_PID, LOG_DAEMON); ++ ++ if ( ! g_get_charset (&charset)) { ++ gdm_charset = g_strdup (charset); ++ } ++ ++ /* initial TERM/INT handler */ ++ sig.sa_handler = initial_term_int; ++ sig.sa_flags = SA_RESTART; ++ sigemptyset (&sig.sa_mask); ++ ++ if G_UNLIKELY (sigaction (SIGTERM, &sig, NULL) < 0) ++ gdm_fail (_("%s: Error setting up %s signal handler: %s"), ++ "main", "TERM", strerror (errno)); ++ ++ if G_UNLIKELY (sigaction (SIGINT, &sig, NULL) < 0) ++ gdm_fail (_("%s: Error setting up %s signal handler: %s"), ++ "main", "INT", strerror (errno)); ++ ++ /* get the name of the root user */ ++ gdm_root_user (); ++ ++ /* Parse configuration file */ ++ gdm_config_parse (); ++ ++ pidfile = gdm_get_value_string (GDM_KEY_PID_FILE); ++ ++ /* Check if another gdm process is already running */ ++ if (g_access (pidfile, R_OK) == 0) { ++ ++ /* Check if the existing process is still alive. */ ++ gint pidv; ++ ++ pf = fopen (pidfile, "r"); ++ ++ if (pf != NULL && ++ fscanf (pf, "%d", &pidv) == 1 && ++ kill (pidv, 0) == 0 && ++ linux_only_is_running (pidv)) { ++ /* make sure the pid file doesn't get wiped */ ++ gdm_set_value_string (GDM_KEY_PID_FILE, NULL); ++ pidfile = NULL; ++ VE_IGNORE_EINTR (fclose (pf)); ++ gdm_fail (_("GDM already running. Aborting!")); ++ } ++ ++ if (pf != NULL) ++ VE_IGNORE_EINTR (fclose (pf)); ++ } ++ ++ /* Become daemon unless started in -nodaemon mode or child of init */ ++ if (no_daemon || getppid () == 1) { ++ ++ /* Write pid to pidfile */ ++ errno = 0; ++ if ((pf = gdm_safe_fopen_w (pidfile)) != NULL) { ++ errno = 0; ++ VE_IGNORE_EINTR (fprintf (pf, "%d\n", (int)getpid ())); ++ VE_IGNORE_EINTR (fclose (pf)); ++ if (errno != 0) { ++ /* FIXME: how to handle this? */ ++ gdm_fdprintf (2, _("Cannot write PID file %s: possibly out of diskspace. Error: %s\n"), ++ pidfile, strerror (errno)); ++ gdm_error (_("Cannot write PID file %s: possibly out of diskspace. Error: %s"), ++ pidfile, strerror (errno)); ++ ++ } ++ } else if (errno != 0) { ++ /* FIXME: how to handle this? */ ++ gdm_fdprintf (2, _("Cannot write PID file %s: possibly out of diskspace. Error: %s\n"), ++ pidfile, strerror (errno)); ++ gdm_error (_("Cannot write PID file %s: possibly out of diskspace. Error: %s"), ++ pidfile, strerror (errno)); ++ ++ } ++ ++ VE_IGNORE_EINTR (g_chdir (gdm_get_value_string (GDM_KEY_SERV_AUTHDIR))); ++ umask (022); ++ } ++ else ++ gdm_daemonify (); ++ ++#ifdef sun ++ g_unlink (SDTLOGIN_DIR); ++ g_mkdir (SDTLOGIN_DIR, 0700); ++#endif ++ ++ /* Signal handling */ ++ ve_signal_add (SIGCHLD, mainloop_sig_callback, NULL); ++ ve_signal_add (SIGTERM, mainloop_sig_callback, NULL); ++ ve_signal_add (SIGINT, mainloop_sig_callback, NULL); ++ ve_signal_add (SIGHUP, mainloop_sig_callback, NULL); ++ ve_signal_add (SIGUSR1, mainloop_sig_callback, NULL); ++ ++ sig.sa_handler = ve_signal_notify; ++ sig.sa_flags = SA_RESTART; ++ sigemptyset (&sig.sa_mask); ++ ++ if G_UNLIKELY (sigaction (SIGTERM, &sig, NULL) < 0) ++ gdm_fail (_("%s: Error setting up %s signal handler: %s"), ++ "main", "TERM", strerror (errno)); ++ ++ if G_UNLIKELY (sigaction (SIGINT, &sig, NULL) < 0) ++ gdm_fail (_("%s: Error setting up %s signal handler: %s"), ++ "main", "INT", strerror (errno)); ++ ++ if G_UNLIKELY (sigaction (SIGHUP, &sig, NULL) < 0) ++ gdm_fail (_("%s: Error setting up %s signal handler: %s"), ++ "main", "HUP", strerror (errno)); ++ ++ if G_UNLIKELY (sigaction (SIGUSR1, &sig, NULL) < 0) ++ gdm_fail (_("%s: Error setting up %s signal handler: %s"), ++ "main", "USR1", strerror (errno)); ++ ++ /* some process limit signals we catch and restart on, ++ note that we don't catch these in the slave, but then ++ we catch those in the main daemon as slave crashing ++ (terminated by signal), and we clean up appropriately */ ++#ifdef SIGXCPU ++ ve_signal_add (SIGXCPU, mainloop_sig_callback, NULL); ++ if G_UNLIKELY (sigaction (SIGXCPU, &sig, NULL) < 0) ++ gdm_fail (_("%s: Error setting up %s signal handler: %s"), ++ "main", "XCPU", strerror (errno)); ++#endif ++#ifdef SIGXFSZ ++ ve_signal_add (SIGXFSZ, mainloop_sig_callback, NULL); ++ if G_UNLIKELY (sigaction (SIGXFSZ, &sig, NULL) < 0) ++ gdm_fail (_("%s: Error setting up %s signal handler: %s"), ++ "main", "XFSZ", strerror (errno)); ++#endif ++ ++ /* cannot use mainloop for SIGABRT, the handler can never ++ return */ ++ abrt.sa_handler = main_daemon_abrt; ++ abrt.sa_flags = SA_RESTART; ++ sigemptyset (&abrt.sa_mask); ++ ++ if G_UNLIKELY (sigaction (SIGABRT, &abrt, NULL) < 0) ++ gdm_fail (_("%s: Error setting up %s signal handler: %s"), ++ "main", "ABRT", strerror (errno)); ++ ++ child.sa_handler = ve_signal_notify; ++ child.sa_flags = SA_RESTART|SA_NOCLDSTOP; ++ sigemptyset (&child.sa_mask); ++ sigaddset (&child.sa_mask, SIGCHLD); ++ ++ if G_UNLIKELY (sigaction (SIGCHLD, &child, NULL) < 0) ++ gdm_fail (_("%s: Error setting up CHLD signal handler"), "gdm_main"); ++ ++ sigemptyset (&mask); ++ sigaddset (&mask, SIGINT); ++ sigaddset (&mask, SIGTERM); ++ sigaddset (&mask, SIGCHLD); ++ sigaddset (&mask, SIGHUP); ++ sigaddset (&mask, SIGUSR1); ++ sigaddset (&mask, SIGABRT); ++#ifdef SIGXCPU ++ sigaddset (&mask, SIGXCPU); ++#endif ++#ifdef SIGXFSZ ++ sigaddset (&mask, SIGXFSZ); ++#endif ++ sigprocmask (SIG_UNBLOCK, &mask, NULL); ++ ++ gdm_signal_ignore (SIGUSR2); ++ gdm_signal_ignore (SIGPIPE); ++ ++ /* ignore power failures, up to user processes to ++ * handle things correctly */ ++#ifdef SIGPWR ++ gdm_signal_ignore (SIGPWR); ++#endif ++ /* can we ever even get this one? */ ++#ifdef SIGLOST ++ gdm_signal_ignore (SIGLOST); ++#endif ++ ++ gdm_debug ("gdm_main: Here we go..."); ++ ++#ifdef HAVE_LOGINDEVPERM ++ di_devperm_login ("/dev/console", gdm_get_gdmuid (), gdm_get_gdmgid (), NULL); ++#endif /* HAVE_LOGINDEVPERM */ ++ ++ /* Init XDMCP if applicable */ ++ if (gdm_get_value_bool (GDM_KEY_XDMCP) && ! gdm_wait_for_go) ++ gdm_xdmcp_init (); ++ ++ create_connections (); ++ ++ /* make sure things (currently /tmp/.ICE-unix and /tmp/.X11-unix) ++ * are sane */ ++ gdm_ensure_sanity () ; ++ ++ /* Make us a unique global cookie to authenticate */ ++ gdm_make_global_cookie (); ++ ++ /* Start static X servers */ ++ gdm_start_first_unborn_local (0 /* delay */); ++ ++ /* Accept remote connections */ ++ if (gdm_get_value_bool (GDM_KEY_XDMCP) && ! gdm_wait_for_go) { ++ gdm_debug ("Accepting XDMCP connections..."); ++ gdm_xdmcp_run (); ++ } ++ ++ /* We always exit via exit (), and sadly we need to g_main_quit () ++ * at times not knowing if it's this main or a recursive one we're ++ * quitting. ++ */ ++ while (1) ++ { ++ g_main_loop_run (main_loop); ++ gdm_debug ("main: Exited main loop"); ++ } ++ ++ return EXIT_SUCCESS; /* Not reached */ ++} ++ ++static gboolean ++order_exists (int order) ++{ ++ GSList *li; ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *d = li->data; ++ if (d->x_servers_order == order) ++ return TRUE; ++ } ++ return FALSE; ++} ++ ++static int ++get_new_order (GdmDisplay *d) ++{ ++ int order; ++ GSList *li; ++ /* first try the position in the 'displays' list as ++ * our order */ ++ for (order = 0, li = displays; li != NULL; order++, li = li->next) { ++ if (li->data == d) ++ break; ++ } ++ /* next make sure it's unique */ ++ while (order_exists (order)) ++ order++; ++ return order; ++} ++ ++static void ++write_x_servers (GdmDisplay *d) ++{ ++ FILE *fp; ++ char *file = gdm_make_filename (gdm_get_value_string (GDM_KEY_SERV_AUTHDIR), d->name, ".Xservers"); ++ int i; ++ int bogusname; ++ ++ if (d->x_servers_order < 0) ++ d->x_servers_order = get_new_order (d); ++ ++ fp = gdm_safe_fopen_w (file); ++ if G_UNLIKELY (fp == NULL) { ++ gdm_error (_("Can't open %s for writing"), file); ++ g_free (file); ++ return; ++ } ++ ++ for (bogusname = 0, i = 0; i < d->x_servers_order; bogusname++, i++) { ++ char buf[32]; ++ g_snprintf (buf, sizeof (buf), ":%d", bogusname); ++ if (strcmp (buf, d->name) == 0) ++ g_snprintf (buf, sizeof (buf), ":%d", ++bogusname); ++ VE_IGNORE_EINTR (fprintf (fp, "%s local /usr/X11R6/bin/Xbogus\n", buf)); ++ } ++ ++ if (SERVER_IS_LOCAL (d)) { ++ char **argv; ++ char *command; ++ argv = gdm_server_resolve_command_line ++ (d, FALSE /* resolve_flags */, ++ NULL /* vtarg */); ++ command = g_strjoinv (" ", argv); ++ g_strfreev (argv); ++ VE_IGNORE_EINTR (fprintf (fp, "%s local %s\n", d->name, command)); ++ g_free (command); ++ } else { ++ VE_IGNORE_EINTR (fprintf (fp, "%s foreign\n", d->name)); ++ } ++ ++ /* FIXME: What about out of disk space errors? */ ++ errno = 0; ++ VE_IGNORE_EINTR (fclose (fp)); ++ if G_UNLIKELY (errno != 0) { ++ gdm_error (_("Can't write to %s: %s"), file, ++ strerror (errno)); ++ } ++ ++ g_free (file); ++} ++ ++static void ++send_slave_ack (GdmDisplay *d, const char *resp) ++{ ++ if (d->master_notify_fd >= 0) { ++ if (resp == NULL) { ++ char not[2]; ++ not[0] = GDM_SLAVE_NOTIFY_ACK; ++ not[1] = '\n'; ++ VE_IGNORE_EINTR (write (d->master_notify_fd, not, 2)); ++ } else { ++ char *not = g_strdup_printf ("%c%s\n", ++ GDM_SLAVE_NOTIFY_ACK, ++ resp); ++ VE_IGNORE_EINTR (write (d->master_notify_fd, not, strlen (not))); ++ g_free (not); ++ } ++ } ++ if (d->slavepid > 1) { ++ kill (d->slavepid, SIGUSR2); ++ /* now yield the CPU as the other process has more ++ useful work to do then we do */ ++#if defined (_POSIX_PRIORITY_SCHEDULING) && defined (HAVE_SCHED_YIELD) ++ sched_yield (); ++#endif ++ } ++} ++ ++static void ++send_slave_command (GdmDisplay *d, const char *command) ++{ ++ if (d->master_notify_fd >= 0) { ++ char *cmd = g_strdup_printf ("%c%s\n", ++ GDM_SLAVE_NOTIFY_COMMAND, ++ command); ++ VE_IGNORE_EINTR (write (d->master_notify_fd, cmd, strlen (cmd))); ++ g_free (cmd); ++ } ++ if (d->slavepid > 1) { ++ kill (d->slavepid, SIGUSR2); ++ /* now yield the CPU as the other process has more ++ useful work to do then we do */ ++#if defined (_POSIX_PRIORITY_SCHEDULING) && defined (HAVE_SCHED_YIELD) ++ sched_yield (); ++#endif ++ } ++} ++ ++ ++static void ++gdm_handle_message (GdmConnection *conn, const char *msg, gpointer data) ++{ ++ /* Evil!, all this for debugging? */ ++ if G_UNLIKELY (gdm_get_value_bool (GDM_KEY_DEBUG)) { ++ if (strncmp (msg, GDM_SOP_COOKIE " ", ++ strlen (GDM_SOP_COOKIE " ")) == 0) { ++ char *s = g_strndup ++ (msg, strlen (GDM_SOP_COOKIE " XXXX XX")); ++ /* cut off most of the cookie for "security" */ ++ gdm_debug ("Handling message: '%s...'", s); ++ g_free (s); ++ } else if (strncmp (msg, GDM_SOP_SYSLOG " ", ++ strlen (GDM_SOP_SYSLOG " ")) != 0) { ++ /* Don't print out the syslog message as it will ++ * be printed out anyway as that's the whole point ++ * of the message. */ ++ gdm_debug ("Handling message: '%s'", msg); ++ } ++ } ++ ++ if (strncmp (msg, GDM_SOP_CHOSEN " ", ++ strlen (GDM_SOP_CHOSEN " ")) == 0) { ++ gdm_choose_data (msg); ++ } else if (strncmp (msg, GDM_SOP_CHOSEN_LOCAL " ", ++ strlen (GDM_SOP_CHOSEN_LOCAL " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid; ++ char *p; ++ ++ if (sscanf (msg, GDM_SOP_CHOSEN_LOCAL " %ld", &slave_pid) ++ != 1) ++ return; ++ p = strchr (msg, ' '); ++ if (p != NULL) ++ p = strchr (p+1, ' '); ++ if (p == NULL) ++ return; ++ p++; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ g_free (d->chosen_hostname); ++ d->chosen_hostname = g_strdup (p); ++ gdm_debug ("Got CHOSEN_LOCAL == %s", p); ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strncmp (msg, GDM_SOP_XPID " ", ++ strlen (GDM_SOP_XPID " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid, pid; ++ ++ if (sscanf (msg, GDM_SOP_XPID " %ld %ld", &slave_pid, &pid) ++ != 2) ++ return; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ d->servpid = pid; ++ gdm_debug ("Got XPID == %ld", (long)pid); ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strncmp (msg, GDM_SOP_SESSPID " ", ++ strlen (GDM_SOP_SESSPID " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid, pid; ++ ++ if (sscanf (msg, GDM_SOP_SESSPID " %ld %ld", &slave_pid, &pid) ++ != 2) ++ return; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ d->sesspid = pid; ++ gdm_debug ("Got SESSPID == %ld", (long)pid); ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strncmp (msg, GDM_SOP_GREETPID " ", ++ strlen (GDM_SOP_GREETPID " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid, pid; ++ ++ if (sscanf (msg, GDM_SOP_GREETPID " %ld %ld", &slave_pid, &pid) ++ != 2) ++ return; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ d->greetpid = pid; ++ gdm_debug ("Got GREETPID == %ld", (long)pid); ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strncmp (msg, GDM_SOP_CHOOSERPID " ", ++ strlen (GDM_SOP_CHOOSERPID " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid, pid; ++ ++ if (sscanf (msg, GDM_SOP_CHOOSERPID " %ld %ld", ++ &slave_pid, &pid) != 2) ++ return; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ d->chooserpid = pid; ++ gdm_debug ("Got CHOOSERPID == %ld", (long)pid); ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strncmp (msg, GDM_SOP_LOGGED_IN " ", ++ strlen (GDM_SOP_LOGGED_IN " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid; ++ int logged_in; ++ if (sscanf (msg, GDM_SOP_LOGGED_IN " %ld %d", &slave_pid, ++ &logged_in) != 2) ++ return; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ d->logged_in = logged_in ? TRUE : FALSE; ++ gdm_debug ("Got logged in == %s", ++ d->logged_in ? "TRUE" : "FALSE"); ++ ++ /* whack connections about this display if a user ++ * just logged out since we don't want such ++ * connections persisting to be authenticated */ ++ if ( ! logged_in && unixconn != NULL) ++ gdm_kill_subconnections_with_display (unixconn, d); ++ ++ /* if the user just logged out, ++ * let's see if it's safe to restart */ ++ if ( ! d->logged_in) { ++ gdm_try_logout_action (d); ++ gdm_safe_restart (); ++ } ++ ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strncmp (msg, GDM_SOP_DISP_NUM " ", ++ strlen (GDM_SOP_DISP_NUM " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid; ++ int disp_num; ++ ++ if (sscanf (msg, GDM_SOP_DISP_NUM " %ld %d", ++ &slave_pid, &disp_num) != 2) ++ return; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ g_free (d->name); ++ d->name = g_strdup_printf (":%d", disp_num); ++ d->dispnum = disp_num; ++ gdm_debug ("Got DISP_NUM == %d", disp_num); ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strncmp (msg, GDM_SOP_VT_NUM " ", ++ strlen (GDM_SOP_VT_NUM " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid; ++ int vt_num; ++ ++ if (sscanf (msg, GDM_SOP_VT_NUM " %ld %d", ++ &slave_pid, &vt_num) != 2) ++ return; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ d->vt = vt_num; ++ gdm_debug ("Got VT_NUM == %d", vt_num); ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strncmp (msg, GDM_SOP_LOGIN " ", ++ strlen (GDM_SOP_LOGIN " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid; ++ char *p; ++ ++ if (sscanf (msg, GDM_SOP_LOGIN " %ld", ++ &slave_pid) != 1) ++ return; ++ p = strchr (msg, ' '); ++ if (p != NULL) ++ p = strchr (p+1, ' '); ++ if (p == NULL) ++ return; ++ ++ p++; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ g_free (d->login); ++ d->login = g_strdup (p); ++ gdm_debug ("Got LOGIN == %s", p); ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strncmp (msg, GDM_SOP_QUERYLOGIN " ", ++ strlen (GDM_SOP_QUERYLOGIN " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid; ++ char *p; ++ ++ if (sscanf (msg, GDM_SOP_QUERYLOGIN " %ld", ++ &slave_pid) != 1) ++ return; ++ p = strchr (msg, ' '); ++ if (p != NULL) ++ p = strchr (p+1, ' '); ++ if (p == NULL) ++ return; ++ ++ p++; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ GString *resp = NULL; ++ GSList *li; ++ gdm_debug ("Got QUERYLOGIN %s", p); ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *di = li->data; ++ if (di->logged_in && ++ di->login != NULL && ++ strcmp (di->login, p) == 0) { ++ gboolean migratable = FALSE; ++ ++ if (resp == NULL) ++ resp = g_string_new (NULL); ++ else ++ resp = g_string_append_c (resp, ','); ++ ++ g_string_append (resp, di->name); ++ g_string_append_c (resp, ','); ++ ++ if (d->attached && di->attached && di->vt > 0) ++ migratable = TRUE; ++ else if (gdm_get_value_string (GDM_KEY_XDMCP_PROXY_RECONNECT) != NULL && ++ d->type == TYPE_XDMCP_PROXY && di->type == TYPE_XDMCP_PROXY) ++ migratable = TRUE; ++ ++ g_string_append_c (resp, migratable ? '1' : '0'); ++ } ++ } ++ ++ /* send ack */ ++ if (resp != NULL) { ++ send_slave_ack (d, resp->str); ++ g_string_free (resp, TRUE); ++ } else { ++ send_slave_ack (d, NULL); ++ } ++ } ++ } else if (strncmp (msg, GDM_SOP_MIGRATE " ", ++ strlen (GDM_SOP_MIGRATE " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid; ++ char *p; ++ GSList *li; ++ ++ if (sscanf (msg, GDM_SOP_MIGRATE " %ld", &slave_pid) != 1) ++ return; ++ p = strchr (msg, ' '); ++ if (p != NULL) ++ p = strchr (p+1, ' '); ++ if (p == NULL) ++ return; ++ ++ p++; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ if (d == NULL) ++ return; ++ ++ gdm_debug ("Got MIGRATE %s", p); ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *di = li->data; ++ if (di->logged_in && strcmp (di->name, p) == 0) { ++ if (d->attached && di->vt > 0) ++ gdm_change_vt (di->vt); ++ else if (d->type == TYPE_XDMCP_PROXY && di->type == TYPE_XDMCP_PROXY) ++ gdm_xdmcp_migrate (d, di); ++ } ++ } ++ send_slave_ack (d, NULL); ++ } else if (strncmp (msg, GDM_SOP_COOKIE " ", ++ strlen (GDM_SOP_COOKIE " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid; ++ char *p; ++ ++ if (sscanf (msg, GDM_SOP_COOKIE " %ld", ++ &slave_pid) != 1) ++ return; ++ p = strchr (msg, ' '); ++ if (p != NULL) ++ p = strchr (p+1, ' '); ++ if (p == NULL) ++ return; ++ ++ p++; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ g_free (d->cookie); ++ d->cookie = g_strdup (p); ++ gdm_debug ("Got COOKIE == "); ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strncmp (msg, GDM_SOP_AUTHFILE " ", ++ strlen (GDM_SOP_AUTHFILE " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid; ++ char *p; ++ ++ if (sscanf (msg, GDM_SOP_AUTHFILE " %ld", ++ &slave_pid) != 1) ++ return; ++ p = strchr (msg, ' '); ++ if (p != NULL) ++ p = strchr (p+1, ' '); ++ if (p == NULL) ++ return; ++ ++ p++; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ g_free (d->authfile); ++ d->authfile = g_strdup (p); ++ gdm_debug ("Got AUTHFILE == %s", d->authfile); ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strncmp (msg, GDM_SOP_FLEXI_ERR " ", ++ strlen (GDM_SOP_FLEXI_ERR " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid; ++ int err; ++ ++ if (sscanf (msg, GDM_SOP_FLEXI_ERR " %ld %d", ++ &slave_pid, &err) != 2) ++ return; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ char *error = NULL; ++ GdmConnection *conn = d->socket_conn; ++ d->socket_conn = NULL; ++ ++ if (conn != NULL) ++ gdm_connection_set_close_notify (conn, ++ NULL, NULL); ++ ++ if (err == 3) ++ error = "ERROR 3 X failed\n"; ++ else if (err == 4) ++ error = "ERROR 4 X too busy\n"; ++ else if (err == 5) ++ error = "ERROR 5 Xnest can't connect\n"; ++ else ++ error = "ERROR 999 Unknown error\n"; ++ if (conn != NULL) ++ gdm_connection_write (conn, error); ++ ++ gdm_debug ("Got FLEXI_ERR == %d", err); ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strncmp (msg, GDM_SOP_FLEXI_OK " ", ++ strlen (GDM_SOP_FLEXI_OK " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid; ++ ++ if (sscanf (msg, GDM_SOP_FLEXI_OK " %ld", ++ &slave_pid) != 1) ++ return; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ GdmConnection *conn = d->socket_conn; ++ d->socket_conn = NULL; ++ ++ if (conn != NULL) { ++ gdm_connection_set_close_notify (conn, ++ NULL, NULL); ++ if ( ! gdm_connection_printf (conn, "OK %s\n", d->name)) ++ gdm_display_unmanage (d); ++ } ++ ++ gdm_debug ("Got FLEXI_OK"); ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strcmp (msg, GDM_SOP_SOFT_RESTART) == 0) { ++ gdm_restart_mode = TRUE; ++ gdm_safe_restart (); ++ } else if (strcmp (msg, GDM_SOP_DIRTY_SERVERS) == 0) { ++ GSList *li; ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *d = li->data; ++ send_slave_command (d, GDM_NOTIFY_DIRTY_SERVERS); ++ } ++ } else if (strcmp (msg, GDM_SOP_SOFT_RESTART_SERVERS) == 0) { ++ GSList *li; ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *d = li->data; ++ send_slave_command (d, GDM_NOTIFY_SOFT_RESTART_SERVERS); ++ } ++ } else if (strncmp (msg, GDM_SOP_SYSLOG " ", ++ strlen (GDM_SOP_SYSLOG " ")) == 0) { ++ char *p; ++ long pid; ++ int type; ++ p = strchr (msg, ' '); ++ if (p == NULL) ++ return; ++ p++; ++ if (sscanf (p, "%ld", &pid) != 1) ++ return; ++ p = strchr (p, ' '); ++ if (p == NULL) ++ return; ++ p++; ++ if (sscanf (p, "%d", &type) != 1) ++ return; ++ ++ p = strchr (p, ' '); ++ if (p == NULL) ++ return; ++ p++; ++ ++ syslog (type, "(child %ld) %s", pid, p); ++ } else if (strcmp (msg, GDM_SOP_START_NEXT_LOCAL) == 0) { ++ gdm_start_first_unborn_local (3 /* delay */); ++ } else if (strcmp (msg, GDM_SOP_HUP_ALL_GREETERS) == 0) { ++ /* probably shouldn't be done too often */ ++ GSList *li; ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *d = li->data; ++ if (d->greetpid > 1) ++ kill (d->greetpid, SIGHUP); ++ else if (d->chooserpid > 1) ++ kill (d->chooserpid, SIGHUP); ++ } ++ } else if (strcmp (msg, GDM_SOP_GO) == 0) { ++ GSList *li; ++ gboolean old_wait = gdm_wait_for_go; ++ gdm_wait_for_go = FALSE; ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *d = li->data; ++ send_slave_command (d, GDM_NOTIFY_GO); ++ } ++ /* Init XDMCP if applicable */ ++ if (old_wait && gdm_get_value_bool (GDM_KEY_XDMCP)) { ++ if (gdm_xdmcp_init ()) { ++ gdm_debug ("Accepting XDMCP connections..."); ++ gdm_xdmcp_run (); ++ } ++ } ++ } else if (strncmp (msg, GDM_SOP_WRITE_X_SERVERS " ", ++ strlen (GDM_SOP_WRITE_X_SERVERS " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid; ++ ++ if (sscanf (msg, GDM_SOP_WRITE_X_SERVERS " %ld", ++ &slave_pid) != 1) ++ return; ++ ++ /* Find out who this slave belongs to */ ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ write_x_servers (d); ++ ++ /* send ack */ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strcmp (msg, GDM_SOP_SUSPEND_MACHINE) == 0) { ++ gdm_info (_("Master suspending...")); ++ if (gdm_get_value_string (GDM_KEY_SUSPEND) != NULL && ++ gdm_get_value_string (GDM_KEY_SYSTEM_MENU)) { ++ suspend_machine (); ++ } ++ } else if (strncmp (msg, GDM_SOP_CHOSEN_THEME " ", ++ strlen (GDM_SOP_CHOSEN_THEME " ")) == 0) { ++ GdmDisplay *d; ++ long slave_pid; ++ const char *p; ++ ++ if (sscanf (msg, GDM_SOP_CHOSEN_THEME " %ld", &slave_pid) != 1) ++ return; ++ d = gdm_display_lookup (slave_pid); ++ ++ if (d != NULL) { ++ g_free (d->theme_name); ++ d->theme_name = NULL; ++ ++ /* Syntax errors are partially OK here, if there ++ was no theme argument we just wanted to clear the ++ theme field */ ++ p = strchr (msg, ' '); ++ if (p != NULL) { ++ p = strchr (p+1, ' '); ++ if (p != NULL) { ++ while (*p == ' ') ++ p++; ++ if ( ! ve_string_empty (p)) ++ d->theme_name = g_strdup (p); ++ } ++ } ++ ++ send_slave_ack (d, NULL); ++ } ++ } else if (strcmp (msg, GDM_SOP_FLEXI_XSERVER) == 0) { ++ handle_flexi_server (NULL, TYPE_FLEXI, gdm_get_value_string (GDM_KEY_STANDARD_XSERVER), ++ TRUE /* handled */, ++ FALSE /* chooser */, ++ NULL, 0, NULL, NULL); ++ } ++} ++ ++/* extract second word and the rest of the string */ ++static void ++extract_dispname_uid_xauthfile_cookie (const char *msg, ++ char **dispname, ++ uid_t *uid, ++ char **xauthfile, ++ char **cookie) ++{ ++ const char *p; ++ int i; ++ char *pp; ++ ++ *dispname = NULL; ++ *xauthfile = NULL; ++ *cookie = NULL; ++ ++ /* Get dispname */ ++ p = strchr (msg, ' '); ++ if (p == NULL) ++ return; ++ ++ while (*p == ' ') ++ p++; ++ ++ *dispname = g_strdup (p); ++ pp = strchr (*dispname, ' '); ++ if (pp != NULL) ++ *pp = '\0'; ++ ++ /* Get uid */ ++ p = strchr (p, ' '); ++ if (p == NULL) { ++ *dispname = NULL; ++ g_free (*dispname); ++ return; ++ } ++ while (*p == ' ') ++ p++; ++ ++ if (sscanf (p, "%d", &i) != 1) { ++ *dispname = NULL; ++ g_free (*dispname); ++ return; ++ } ++ *uid = i; ++ ++ /* Get cookie */ ++ p = strchr (p, ' '); ++ if (p == NULL) { ++ *dispname = NULL; ++ g_free (*dispname); ++ return; ++ } ++ while (*p == ' ') ++ p++; ++ ++ *cookie = g_strdup (p); ++ pp = strchr (*cookie, ' '); ++ if (pp != NULL) ++ *pp = '\0'; ++ ++ /* Get xauthfile */ ++ p = strchr (p, ' '); ++ if (p == NULL) { ++ *cookie = NULL; ++ g_free (*cookie); ++ *dispname = NULL; ++ g_free (*dispname); ++ return; ++ } ++ ++ while (*p == ' ') ++ p++; ++ ++ *xauthfile = g_strstrip (g_strdup (p)); ++ ++} ++ ++static void ++close_conn (gpointer data) ++{ ++ GdmDisplay *disp = data; ++ ++ /* We still weren't finished, so we want to whack this display */ ++ if (disp->socket_conn != NULL) { ++ disp->socket_conn = NULL; ++ gdm_display_unmanage (disp); ++ } ++} ++ ++static GdmDisplay * ++find_display (const char *name) ++{ ++ GSList *li; ++ ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *disp = li->data; ++ if (disp->name != NULL && ++ strcmp (disp->name, name) == 0) ++ return disp; ++ } ++ return NULL; ++} ++ ++static char * ++extract_dispnum (const char *addy) ++{ ++ int num; ++ char *p; ++ ++ gdm_assert (addy != NULL); ++ ++ p = strchr (addy, ':'); ++ if (p == NULL) ++ return NULL; ++ ++ /* Whee! handles DECnet even if we don't do that */ ++ while (*p == ':') ++ p++; ++ ++ if (sscanf (p, "%d", &num) != 1) ++ return NULL; ++ ++ return g_strdup_printf ("%d", num); ++} ++ ++static char * ++dehex_cookie (const char *cookie, int *len) ++{ ++ /* it should be +1 really, but I'm paranoid */ ++ char *bcookie = g_new0 (char, (strlen (cookie) / 2) + 2); ++ int i; ++ const char *p; ++ ++ *len = 0; ++ ++ for (i = 0, p = cookie; ++ *p != '\0' && *(p+1) != '\0'; ++ i++, p += 2) { ++ unsigned int num; ++ if (sscanf (p, "%02x", &num) != 1) { ++ g_free (bcookie); ++ return NULL; ++ } ++ bcookie[i] = num; ++ } ++ *len = i; ++ return bcookie; ++} ++ ++/* This runs as the user who owns the file */ ++static gboolean ++check_cookie (const char *file, const char *disp, const char *cookie) ++{ ++ Xauth *xa; ++ char *number; ++ char *bcookie; ++ int cookielen; ++ gboolean ret = FALSE; ++ int cnt = 0; ++ ++ FILE *fp = fopen (file, "r"); ++ if (fp == NULL) ++ return FALSE; ++ ++ number = extract_dispnum (disp); ++ if (number == NULL) ++ return FALSE; ++ bcookie = dehex_cookie (cookie, &cookielen); ++ if (bcookie == NULL) { ++ g_free (number); ++ return FALSE; ++ } ++ ++ while ((xa = XauReadAuth (fp)) != NULL) { ++ if (xa->number_length == strlen (number) && ++ strncmp (xa->number, number, xa->number_length) == 0 && ++ xa->name_length == strlen ("MIT-MAGIC-COOKIE-1") && ++ strncmp (xa->name, "MIT-MAGIC-COOKIE-1", ++ xa->name_length) == 0 && ++ xa->data_length == cookielen && ++ memcmp (xa->data, bcookie, cookielen) == 0) { ++ XauDisposeAuth (xa); ++ ret = TRUE; ++ break; ++ } ++ XauDisposeAuth (xa); ++ ++ /* just being ultra anal */ ++ cnt ++; ++ if (cnt > 500) ++ break; ++ } ++ ++ g_free (number); ++ g_free (bcookie); ++ ++ VE_IGNORE_EINTR (fclose (fp)); ++ ++ return ret; ++} ++ ++static void ++handle_flexi_server (GdmConnection *conn, int type, const char *server, ++ gboolean handled, ++ gboolean chooser, ++ const char *xnest_disp, uid_t xnest_uid, ++ const char *xnest_auth_file, ++ const char *xnest_cookie) ++{ ++ GdmDisplay *display; ++ char *bin; ++ uid_t server_uid = 0; ++ ++ gdm_debug ("server: '%s'", server); ++ ++ if (gdm_wait_for_go) { ++ if (conn != NULL) ++ gdm_connection_write (conn, ++ "ERROR 1 No more flexi servers\n"); ++ return; ++ } ++ ++ if (type == TYPE_FLEXI_XNEST) { ++ gboolean authorized = TRUE; ++ struct passwd *pw; ++ gid_t oldgid = getegid (); ++ ++ pw = getpwuid (xnest_uid); ++ if (pw == NULL) { ++ if (conn != NULL) ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ return; ++ } ++ ++ /* paranoia */ ++ NEVER_FAILS_seteuid (0); ++ ++ if (setegid (pw->pw_gid) < 0) ++ NEVER_FAILS_setegid (gdm_get_gdmgid ()); ++ ++ if (seteuid (xnest_uid) < 0) { ++ if (conn != NULL) ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ return; ++ } ++ ++ gdm_assert (xnest_auth_file != NULL); ++ gdm_assert (xnest_disp != NULL); ++ gdm_assert (xnest_cookie != NULL); ++ ++ if (authorized && ++ ! gdm_auth_file_check ("handle_flexi_server", xnest_uid, xnest_auth_file, FALSE /* absentok */, NULL)) ++ authorized = FALSE; ++ ++ if (authorized && ++ ! check_cookie (xnest_auth_file, ++ xnest_disp, ++ xnest_cookie)) { ++ authorized = FALSE; ++ } ++ ++ /* this must always work, thus the asserts */ ++ NEVER_FAILS_root_set_euid_egid (0, oldgid); ++ ++ if ( ! authorized) { ++ /* Sorry dude, you're not doing something ++ * right */ ++ if (conn != NULL) ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ return; ++ } ++ ++ server_uid = xnest_uid; ++ } ++ ++ if (flexi_servers >= gdm_get_value_int (GDM_KEY_FLEXIBLE_XSERVERS)) { ++ if (conn != NULL) ++ gdm_connection_write (conn, ++ "ERROR 1 No more flexi servers\n"); ++ return; ++ } ++ ++ bin = ve_first_word (server); ++ if (ve_string_empty (server) || ++ g_access (bin, X_OK) != 0) { ++ g_free (bin); ++ if (conn != NULL) ++ gdm_connection_write (conn, ++ "ERROR 6 No server binary\n"); ++ return; ++ } ++ g_free (bin); ++ ++ display = gdm_server_alloc (-1, server); ++ if G_UNLIKELY (display == NULL) { ++ if (conn != NULL) ++ gdm_connection_write (conn, ++ "ERROR 2 Startup errors\n"); ++ return; ++ } ++ ++ /* It is kind of ugly that we don't use ++ the standard resolution for this, but ++ oh well, this makes other things simpler */ ++ display->handled = handled; ++ display->use_chooser = chooser; ++ ++ if (type == TYPE_FLEXI_XNEST) { ++ GdmDisplay *parent; ++ char *disp, *p; ++ gdm_assert (xnest_disp != NULL); ++ ++ disp = g_strdup (xnest_disp); ++ /* whack the screen info */ ++ p = strchr (disp, ':'); ++ if (p != NULL) ++ p = strchr (p+1, '.'); ++ if (p != NULL) ++ *p = '\0'; ++ /* if it's on one of the attached displays we started, ++ * it's on the console, else it's not (it could be but ++ * we aren't sure and we don't want to be fooled) */ ++ parent = find_display (disp); ++ if (/* paranoia */xnest_disp[0] == ':' && ++ parent != NULL && ++ parent->attached) ++ display->attached = TRUE; ++ else ++ display->attached = FALSE; ++ g_free (disp); ++ ++ display->server_uid = server_uid; ++ } ++ ++ flexi_servers ++; ++ ++ display->type = type; ++ display->socket_conn = conn; ++ display->parent_disp = g_strdup (xnest_disp); ++ display->parent_auth_file = g_strdup (xnest_auth_file); ++ if (conn != NULL) ++ gdm_connection_set_close_notify (conn, display, close_conn); ++ displays = g_slist_append (displays, display); ++ if ( ! gdm_display_manage (display)) { ++ gdm_display_unmanage (display); ++ if (conn != NULL) ++ gdm_connection_write (conn, ++ "ERROR 2 Startup errors\n"); ++ return; ++ } ++ /* Now we wait for the server to start up (or not) */ ++} ++ ++static void ++handle_dynamic_server (GdmConnection *conn, int type, char *key) ++{ ++ GdmDisplay *disp; ++ int disp_num; ++ char *full; ++ char *val; ++ ++ if (!(gdm_get_value_bool (GDM_KEY_DYNAMIC_XSERVERS))) { ++ gdm_connection_write (conn, "ERROR 200 Dynamic Displays not allowed\n"); ++ return; ++ } ++ ++ if ( ! GDM_CONN_AUTH_GLOBAL(conn)) { ++ gdm_info (_("DYNAMIC request denied: " "Not authenticated")); ++ gdm_connection_write (conn, "ERROR 100 Not authenticated\n"); ++ return; ++ } ++ ++ if ((key == NULL) || (!(isdigit (*key)))) { ++ gdm_connection_write (conn, "ERROR 1 Bad display number\n"); ++ return; ++ } ++ disp_num = atoi (key); ++ ++ if (type == DYNAMIC_ADD) { ++ /* prime an X server for launching */ ++ ++ if (mark_display_exists (disp_num)) { ++ /* need to skip starting this one again */ ++ gdm_connection_write (conn, "ERROR 2 Existing display\n"); ++ return; ++ } ++ ++ full = strchr (key, '='); ++ if (full == NULL || *(full+1) == 0) { ++ gdm_connection_write (conn, "ERROR 3 No server string\n"); ++ return; ++ } ++ ++ val = full+1; ++ disp = gdm_server_alloc (disp_num, val); ++ ++ if (disp == NULL) { ++ gdm_connection_write (conn, "ERROR 4 Display startup failure\n"); ++ return; ++ } ++ displays = g_slist_insert_sorted (displays, ++ disp, ++ gdm_compare_displays); ++ ++ disp->dispstat = DISPLAY_CONFIG; ++ disp->removeconf = FALSE; ++ ++ if (disp_num > gdm_get_high_display_num ()) ++ gdm_set_high_display_num (disp_num); ++ ++ gdm_connection_write (conn, "OK\n"); ++ return; ++ } ++ ++ if (type == DYNAMIC_REMOVE) { ++ GSList *li; ++ GSList *nli; ++ /* shutdown a dynamic X server */ ++ ++ for (li = displays; li != NULL; li = nli) { ++ disp = li->data; ++ nli = li->next; ++ if (disp->dispnum == disp_num) { ++ disp->removeconf = TRUE; ++ gdm_display_unmanage (disp); ++ gdm_connection_write (conn, "OK\n"); ++ return; ++ } ++ } ++ ++ gdm_connection_write (conn, "ERROR 1 Bad display number\n"); ++ return; ++ } ++ ++ if (type == DYNAMIC_RELEASE) { ++ /* cause the newly configured X servers to actually run */ ++ GSList *li; ++ GSList *nli; ++ ++ for (li = displays; li != NULL; li = nli) { ++ GdmDisplay *disp = li->data; ++ nli = li->next; ++ if ((disp->dispnum == disp_num) && ++ (disp->dispstat == DISPLAY_CONFIG)) { ++ disp->dispstat = DISPLAY_UNBORN; ++ ++ if ( ! gdm_display_manage (disp)) { ++ gdm_display_unmanage (disp); ++ } ++ } ++ } ++ ++ gdm_connection_write (conn, "OK\n"); ++ /* Now we wait for the server to start up (or not) */ ++ return; ++ } ++} ++ ++static void ++gdm_handle_user_message (GdmConnection *conn, const char *msg, gpointer data) ++{ ++ gdm_debug ("Handling user message: '%s'", msg); ++ ++ if (gdm_connection_get_message_count (conn) > GDM_SUP_MAX_CONNECTIONS) { ++ gdm_connection_write (conn, "ERROR 200 Too many messages\n"); ++ gdm_connection_close (conn); ++ return; ++ } ++ ++ if (strncmp (msg, GDM_SUP_AUTH_LOCAL " ", ++ strlen (GDM_SUP_AUTH_LOCAL " ")) == 0) { ++ GSList *li; ++ char *cookie = g_strdup ++ (&msg[strlen (GDM_SUP_AUTH_LOCAL " ")]); ++ g_strstrip (cookie); ++ if (strlen (cookie) != 16*2) /* 16 bytes in hex form */ { ++ /* evil, just whack the connection in this case */ ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ gdm_connection_close (conn); ++ g_free (cookie); ++ return; ++ } ++ /* check if cookie matches one of the attached displays */ ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *disp = li->data; ++ if (disp->attached && ++ disp->cookie != NULL && ++ g_ascii_strcasecmp (disp->cookie, cookie) == 0) { ++ g_free (cookie); ++ GDM_CONNECTION_SET_USER_FLAG ++ (conn, GDM_SUP_FLAG_AUTHENTICATED); ++ gdm_connection_set_display (conn, disp); ++ gdm_connection_write (conn, "OK\n"); ++ return; ++ } ++ } ++ ++ if (gdm_global_cookie != NULL && ++ g_ascii_strcasecmp ((char *) gdm_global_cookie, cookie) == 0) { ++ g_free (cookie); ++ GDM_CONNECTION_SET_USER_FLAG ++ (conn, GDM_SUP_FLAG_AUTH_GLOBAL); ++ gdm_connection_write (conn, "OK\n"); ++ return; ++ } ++ ++ /* Hmmm, perhaps this is better defined behaviour */ ++ GDM_CONNECTION_UNSET_USER_FLAG ++ (conn, GDM_SUP_FLAG_AUTHENTICATED); ++ GDM_CONNECTION_UNSET_USER_FLAG ++ (conn, GDM_SUP_FLAG_AUTH_GLOBAL); ++ gdm_connection_set_display (conn, NULL); ++ gdm_connection_write (conn, "ERROR 100 Not authenticated\n"); ++ g_free (cookie); ++ } else if (strcmp (msg, GDM_SUP_FLEXI_XSERVER) == 0) { ++ /* Only allow locally authenticated connections */ ++ if ( ! GDM_CONN_AUTHENTICATED(conn)) { ++ gdm_info (_("%s request denied: " ++ "Not authenticated"), "FLEXI_XSERVER"); ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ return; ++ } ++ handle_flexi_server (conn, TYPE_FLEXI, gdm_get_value_string (GDM_KEY_STANDARD_XSERVER), ++ TRUE /* handled */, ++ FALSE /* chooser */, ++ NULL, 0, NULL, NULL); ++ } else if (strncmp (msg, GDM_SUP_FLEXI_XSERVER " ", ++ strlen (GDM_SUP_FLEXI_XSERVER " ")) == 0) { ++ char *name; ++ const char *command = NULL; ++ GdmXserver *svr; ++ ++ /* Only allow locally authenticated connections */ ++ if ( ! GDM_CONN_AUTHENTICATED(conn)) { ++ gdm_info (_("%s request denied: " ++ "Not authenticated"), "FLEXI_XSERVER"); ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ return; ++ } ++ ++ name = g_strdup (&msg[strlen (GDM_SUP_FLEXI_XSERVER " ")]); ++ g_strstrip (name); ++ if (ve_string_empty (name)) { ++ g_free (name); ++ name = g_strdup (GDM_STANDARD); ++ } ++ ++ svr = gdm_find_xserver (name); ++ if G_UNLIKELY (svr == NULL) { ++ /* Don't print the name to syslog as it might be ++ * long and dangerous */ ++ gdm_error (_("Unknown server type requested; using " ++ "standard server.")); ++ command = gdm_get_value_string (GDM_KEY_STANDARD_XSERVER); ++ } else if G_UNLIKELY ( ! svr->flexible) { ++ gdm_error (_("Requested server %s not allowed to be " ++ "used for flexible servers; using " ++ "standard server."), name); ++ command = gdm_get_value_string (GDM_KEY_STANDARD_XSERVER); ++ } else { ++ command = svr->command; ++ } ++ g_free (name); ++ ++ handle_flexi_server (conn, TYPE_FLEXI, command, ++ /* It is kind of ugly that we don't use ++ the standard resolution for this, but ++ oh well, this makes other things simpler */ ++ svr->handled, ++ svr->chooser, ++ NULL, 0, NULL, NULL); ++ } else if (strncmp (msg, GDM_SUP_FLEXI_XNEST " ", ++ strlen (GDM_SUP_FLEXI_XNEST " ")) == 0) { ++ char *dispname = NULL, *xauthfile = NULL, *cookie = NULL; ++ uid_t uid; ++ ++ extract_dispname_uid_xauthfile_cookie (msg, &dispname, &uid, ++ &xauthfile, &cookie); ++ ++ if (dispname == NULL) { ++ /* Something bogus is going on, so just whack the ++ * connection */ ++ g_free (xauthfile); ++ gdm_connection_close (conn); ++ return; ++ } ++ ++ /* This is probably a pre-2.2.4.2 client */ ++ if (xauthfile == NULL || cookie == NULL) { ++ /* evil, just whack the connection in this case */ ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ gdm_connection_close (conn); ++ g_free (cookie); ++ return; ++ } ++ ++ handle_flexi_server (conn, TYPE_FLEXI_XNEST, gdm_get_value_string (GDM_KEY_XNEST), ++ TRUE /* handled */, ++ FALSE /* chooser */, ++ dispname, uid, xauthfile, cookie); ++ ++ g_free (dispname); ++ g_free (xauthfile); ++ } else if ((strncmp (msg, GDM_SUP_ATTACHED_SERVERS, ++ strlen (GDM_SUP_ATTACHED_SERVERS)) == 0) || ++ (strncmp (msg, GDM_SUP_CONSOLE_SERVERS, ++ strlen (GDM_SUP_CONSOLE_SERVERS)) == 0)) { ++ GString *retMsg; ++ GSList *li; ++ const char *sep = " "; ++ char *key; ++ int msgLen=0; ++ ++ if (strncmp (msg, GDM_SUP_ATTACHED_SERVERS, ++ strlen (GDM_SUP_ATTACHED_SERVERS)) == 0) ++ msgLen = strlen (GDM_SUP_ATTACHED_SERVERS); ++ else if (strncmp (msg, GDM_SUP_CONSOLE_SERVERS, ++ strlen (GDM_SUP_CONSOLE_SERVERS)) == 0) ++ msgLen = strlen (GDM_SUP_CONSOLE_SERVERS); ++ ++ key = g_strdup (&msg[msgLen]); ++ g_strstrip (key); ++ ++ retMsg = g_string_new ("OK"); ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *disp = li->data; ++ ++ if ( ! disp->attached) ++ continue; ++ if (!(strlen (key)) || (g_pattern_match_simple (key, disp->command))) { ++ g_string_append_printf (retMsg, "%s%s,%s,", sep, ++ ve_sure_string (disp->name), ++ ve_sure_string (disp->login)); ++ sep = ";"; ++ if (disp->type == TYPE_FLEXI_XNEST) { ++ g_string_append (retMsg, ve_sure_string (disp->parent_disp)); ++ } else { ++ g_string_append_printf (retMsg, "%d", disp->vt); ++ } ++ } ++ } ++ ++ g_string_append (retMsg, "\n"); ++ gdm_connection_write (conn, retMsg->str); ++ g_free (key); ++ g_string_free (retMsg, TRUE); ++ } else if (strcmp (msg, GDM_SUP_ALL_SERVERS) == 0) { ++ GString *msg; ++ GSList *li; ++ const char *sep = " "; ++ ++ msg = g_string_new ("OK"); ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *disp = li->data; ++ g_string_append_printf (msg, "%s%s,%s", sep, ++ ve_sure_string (disp->name), ++ ve_sure_string (disp->login)); ++ sep = ";"; ++ } ++ g_string_append (msg, "\n"); ++ gdm_connection_write (conn, msg->str); ++ g_string_free (msg, TRUE); ++ } else if (strcmp (msg, GDM_SUP_GET_SERVER_LIST) == 0) { ++ gchar *retval = gdm_get_xservers (); ++ ++ if (retval != NULL) { ++ gdm_connection_printf (conn, "OK %s\n", retval); ++ g_free (retval); ++ } else { ++ gdm_connection_printf (conn, "ERROR 1 No servers found\n"); ++ } ++ ++ } else if (strncmp (msg, GDM_SUP_GET_SERVER_DETAILS " ", ++ strlen (GDM_SUP_GET_SERVER_DETAILS " ")) == 0) { ++ const char *server = &msg[strlen (GDM_SUP_GET_SERVER_DETAILS " ")]; ++ gchar **splitstr = g_strsplit (server, " ", 2); ++ GdmXserver *svr = gdm_find_xserver ((char *)splitstr[0]); ++ ++ if (svr != NULL) { ++ if (g_strcasecmp (splitstr[1], "ID") == 0) ++ gdm_connection_printf (conn, "OK %s\n", svr->id); ++ else if (g_strcasecmp (splitstr[1], "NAME") == 0) ++ gdm_connection_printf (conn, "OK %s\n", svr->name); ++ else if (g_strcasecmp (splitstr[1], "COMMAND") == 0) ++ gdm_connection_printf (conn, "OK %s\n", svr->command); ++ else if (g_strcasecmp (splitstr[1], "PRIORITY") == 0) ++ gdm_connection_printf (conn, "OK %d\n", svr->priority); ++ else if (g_strcasecmp (splitstr[1], "FLEXIBLE") == 0 && ++ svr->flexible) ++ gdm_connection_printf (conn, "OK true\n"); ++ else if (g_strcasecmp (splitstr[1], "FLEXIBLE") == 0 && ++ !svr->flexible) ++ gdm_connection_printf (conn, "OK false\n"); ++ else if (g_strcasecmp (splitstr[1], "CHOOSABLE") == 0 && ++ svr->choosable) ++ gdm_connection_printf (conn, "OK true\n"); ++ else if (g_strcasecmp (splitstr[1], "CHOOSABLE") == 0 && ++ !svr->choosable) ++ gdm_connection_printf (conn, "OK false\n"); ++ else if (g_strcasecmp (splitstr[1], "HANDLED") == 0 && ++ svr->handled) ++ gdm_connection_printf (conn, "OK true\n"); ++ else if (g_strcasecmp (splitstr[1], "HANDLED") == 0 && ++ !svr->handled) ++ gdm_connection_printf (conn, "OK false\n"); ++ else if (g_strcasecmp (splitstr[1], "CHOOSER") == 0 && ++ svr->chooser) ++ gdm_connection_printf (conn, "OK true\n"); ++ else if (g_strcasecmp (splitstr[1], "CHOOSER") == 0 && ++ !svr->chooser) ++ gdm_connection_printf (conn, "OK false\n"); ++ else ++ gdm_connection_printf (conn, "ERROR 2 Key not valid\n"); ++ ++ g_strfreev (splitstr); ++ } else { ++ gdm_connection_printf (conn, "ERROR 1 Server not found\n"); ++ } ++ ++ } else if (strcmp (msg, GDM_SUP_GREETERPIDS) == 0) { ++ GString *msg; ++ GSList *li; ++ const char *sep = " "; ++ ++ msg = g_string_new ("OK"); ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *disp = li->data; ++ if (disp->greetpid > 0) { ++ g_string_append_printf (msg, "%s%ld", ++ sep, (long)disp->greetpid); ++ sep = ";"; ++ } ++ } ++ g_string_append (msg, "\n"); ++ gdm_connection_write (conn, msg->str); ++ g_string_free (msg, TRUE); ++ } else if (strncmp (msg, GDM_SUP_UPDATE_CONFIG " ", ++ strlen (GDM_SUP_UPDATE_CONFIG " ")) == 0) { ++ const char *key = ++ &msg[strlen (GDM_SUP_UPDATE_CONFIG " ")]; ++ ++ if (! gdm_update_config ((gchar *)key)) ++ gdm_connection_printf (conn, "ERROR 50 Unsupported key <%s>\n", key); ++ else ++ gdm_connection_write (conn, "OK\n"); ++ } else if (strncmp (msg, GDM_SUP_GET_CONFIG " ", ++ strlen (GDM_SUP_GET_CONFIG " ")) == 0) { ++ const char *key = &msg[strlen (GDM_SUP_GET_CONFIG " ")]; ++ gchar *retval; ++ static gboolean done_prefetch = FALSE; ++ ++ /* ++ * If key is for prefetch do it only once ++ */ ++ if (strcmp(key, GDM_KEY_PRE_FETCH_PROGRAM) == 0) { ++ if (done_prefetch) { ++ gdm_connection_printf (conn, "OK \n"); ++ return; ++ } else { ++ done_prefetch = TRUE; ++ } ++ } ++ ++ gdm_config_to_string ((gchar *)key, &retval); ++ if (retval != NULL) { ++ gdm_connection_printf (conn, "OK %s\n", retval); ++ g_free (retval); ++ } else { ++ if (gdm_is_valid_key ((gchar *)key)) ++ gdm_connection_printf (conn, "OK \n"); ++ else ++ gdm_connection_printf (conn, "ERROR 50 Unsupported key <%s>\n", key); ++ } ++ } else if (strcmp (msg, GDM_SUP_GET_CONFIG_FILE) == 0) { ++ GString *msg; ++ ++ msg = g_string_new ("OK"); ++ g_string_append (msg, "\n"); ++ gdm_connection_printf (conn, "OK %s\n", config_file); ++ g_string_free (msg, TRUE); ++ } else if (strcmp (msg, GDM_SUP_QUERY_LOGOUT_ACTION) == 0) { ++ const char *sep = " "; ++ GdmDisplay *disp; ++ GdmLogoutAction logout_action; ++ GString *msg; ++ gboolean sysmenu = gdm_get_value_bool (GDM_KEY_SYSTEM_MENU); ++ ++ disp = gdm_connection_get_display (conn); ++ ++ /* Only allow locally authenticated connections */ ++ if ( ! GDM_CONN_AUTHENTICATED(conn) || ++ disp == NULL) { ++ gdm_info (_("%s request denied: " ++ "Not authenticated"), "QUERY_LOGOUT_ACTION"); ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ return; ++ } ++ ++ msg = g_string_new ("OK"); ++ ++ logout_action = disp->logout_action; ++ if (logout_action == GDM_LOGOUT_ACTION_NONE) ++ logout_action = safe_logout_action; ++ ++ if (sysmenu && disp->attached && ++ ! ve_string_empty (gdm_get_value_string (GDM_KEY_HALT))) { ++ g_string_append_printf (msg, "%s%s", sep, GDM_SUP_LOGOUT_ACTION_HALT); ++ if (logout_action == GDM_LOGOUT_ACTION_HALT) ++ g_string_append (msg, "!"); ++ sep = ";"; ++ } ++ if (sysmenu && disp->attached && ++ ! ve_string_empty (gdm_get_value_string (GDM_KEY_REBOOT))) { ++ g_string_append_printf (msg, "%s%s", sep, GDM_SUP_LOGOUT_ACTION_REBOOT); ++ if (logout_action == GDM_LOGOUT_ACTION_REBOOT) ++ g_string_append (msg, "!"); ++ sep = ";"; ++ } ++ if (sysmenu && disp->attached && ++ ! ve_string_empty (gdm_get_value_string (GDM_KEY_SUSPEND))) { ++ g_string_append_printf (msg, "%s%s", sep, GDM_SUP_LOGOUT_ACTION_SUSPEND); ++ if (logout_action == GDM_LOGOUT_ACTION_SUSPEND) ++ g_string_append (msg, "!"); ++ sep = ";"; ++ } ++ g_string_append (msg, "\n"); ++ gdm_connection_write (conn, msg->str); ++ g_string_free (msg, TRUE); ++ } else if (strncmp (msg, GDM_SUP_SET_LOGOUT_ACTION " ", ++ strlen (GDM_SUP_SET_LOGOUT_ACTION " ")) == 0) { ++ const char *action = ++ &msg[strlen (GDM_SUP_SET_LOGOUT_ACTION " ")]; ++ GdmDisplay *disp; ++ gboolean was_ok = FALSE; ++ gboolean sysmenu = gdm_get_value_bool (GDM_KEY_SYSTEM_MENU); ++ ++ disp = gdm_connection_get_display (conn); ++ ++ /* Only allow locally authenticated connections */ ++ if ( ! GDM_CONN_AUTHENTICATED(conn) || ++ disp == NULL || ++ ! disp->logged_in) { ++ gdm_info (_("%s request denied: " ++ "Not authenticated"), "SET_LOGOUT_ACTION"); ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ return; ++ } ++ ++ if (strcmp (action, GDM_SUP_LOGOUT_ACTION_NONE) == 0) { ++ disp->logout_action = GDM_LOGOUT_ACTION_NONE; ++ was_ok = TRUE; ++ } else if (strcmp (action, GDM_SUP_LOGOUT_ACTION_HALT) == 0) { ++ if (sysmenu && disp->attached && ++ ! ve_string_empty (gdm_get_value_string (GDM_KEY_HALT))) { ++ disp->logout_action = ++ GDM_LOGOUT_ACTION_HALT; ++ was_ok = TRUE; ++ } ++ } else if (strcmp (action, GDM_SUP_LOGOUT_ACTION_REBOOT) == 0) { ++ if (sysmenu && disp->attached && ++ ! ve_string_empty (gdm_get_value_string (GDM_KEY_REBOOT))) { ++ disp->logout_action = ++ GDM_LOGOUT_ACTION_REBOOT; ++ was_ok = TRUE; ++ } ++ } else if (strcmp (action, GDM_SUP_LOGOUT_ACTION_SUSPEND) == 0) { ++ if (sysmenu && disp->attached && ++ ! ve_string_empty (gdm_get_value_string (GDM_KEY_SUSPEND))) { ++ disp->logout_action = ++ GDM_LOGOUT_ACTION_SUSPEND; ++ was_ok = TRUE; ++ } ++ } ++ if (was_ok) { ++ gdm_connection_write (conn, "OK\n"); ++ gdm_try_logout_action (disp); ++ } else { ++ gdm_connection_write (conn, "ERROR 7 Unknown logout action, or not available\n"); ++ } ++ } else if (strncmp (msg, GDM_SUP_SET_SAFE_LOGOUT_ACTION " ", ++ strlen (GDM_SUP_SET_SAFE_LOGOUT_ACTION " ")) == 0) { ++ const char *action = ++ &msg[strlen (GDM_SUP_SET_SAFE_LOGOUT_ACTION " ")]; ++ GdmDisplay *disp; ++ gboolean was_ok = FALSE; ++ gboolean sysmenu = gdm_get_value_bool (GDM_KEY_SYSTEM_MENU); ++ ++ disp = gdm_connection_get_display (conn); ++ ++ /* Only allow locally authenticated connections */ ++ if ( ! GDM_CONN_AUTHENTICATED(conn) || ++ disp == NULL || ++ ! disp->logged_in) { ++ gdm_info (_("%s request denied: " ++ "Not authenticated"), "SET_LOGOUT_ACTION"); ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ return; ++ } ++ ++ if (strcmp (action, GDM_SUP_LOGOUT_ACTION_NONE) == 0) { ++ safe_logout_action = GDM_LOGOUT_ACTION_NONE; ++ was_ok = TRUE; ++ } else if (strcmp (action, GDM_SUP_LOGOUT_ACTION_HALT) == 0) { ++ if (sysmenu && disp->attached && ++ ! ve_string_empty (gdm_get_value_string (GDM_KEY_HALT))) { ++ safe_logout_action = ++ GDM_LOGOUT_ACTION_HALT; ++ was_ok = TRUE; ++ } ++ } else if (strcmp (action, GDM_SUP_LOGOUT_ACTION_REBOOT) == 0) { ++ if (sysmenu && disp->attached && ++ ! ve_string_empty (gdm_get_value_string (GDM_KEY_REBOOT))) { ++ safe_logout_action = ++ GDM_LOGOUT_ACTION_REBOOT; ++ was_ok = TRUE; ++ } ++ } else if (strcmp (action, GDM_SUP_LOGOUT_ACTION_SUSPEND) == 0) { ++ if (sysmenu && disp->attached && ++ ! ve_string_empty (gdm_get_value_string (GDM_KEY_SUSPEND))) { ++ safe_logout_action = ++ GDM_LOGOUT_ACTION_SUSPEND; ++ was_ok = TRUE; ++ } ++ } ++ if (was_ok) { ++ gdm_connection_write (conn, "OK\n"); ++ gdm_try_logout_action (disp); ++ } else { ++ gdm_connection_write (conn, "ERROR 7 Unknown logout action, or not available\n"); ++ } ++ } else if (strcmp (msg, GDM_SUP_QUERY_VT) == 0) { ++ /* Only allow locally authenticated connections */ ++ if ( ! GDM_CONN_AUTHENTICATED(conn)) { ++ gdm_info (_("%s request denied: " ++ "Not authenticated"), "QUERY_VT"); ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ return; ++ } ++ ++#if defined (__linux__) || defined (__FreeBSD__) || defined (__DragonFly__) ++ gdm_connection_printf (conn, "OK %d\n", gdm_get_cur_vt ()); ++#else ++ gdm_connection_write (conn, "ERROR 8 Virtual terminals not supported\n"); ++#endif ++ } else if (strncmp (msg, GDM_SUP_SET_VT " ", ++ strlen (GDM_SUP_SET_VT " ")) == 0) { ++ int vt; ++ GSList *li; ++ ++ if (sscanf (msg, GDM_SUP_SET_VT " %d", &vt) != 1 || ++ vt < 0) { ++ gdm_connection_write (conn, ++ "ERROR 9 Invalid virtual terminal number\n"); ++ return; ++ } ++ ++ /* Only allow locally authenticated connections */ ++ if ( ! GDM_CONN_AUTHENTICATED(conn)) { ++ gdm_info (_("%s request denied: " ++ "Not authenticated"), "QUERY_VT"); ++ gdm_connection_write (conn, ++ "ERROR 100 Not authenticated\n"); ++ return; ++ } ++ ++#if defined (__linux__) || defined (__FreeBSD__) || defined (__DragonFly__) ++ gdm_change_vt (vt); ++ for (li = displays; li != NULL; li = li->next) { ++ GdmDisplay *disp = li->data; ++ if (disp->vt == vt) { ++ send_slave_command (disp, GDM_NOTIFY_TWIDDLE_POINTER); ++ break; ++ } ++ } ++ gdm_connection_write (conn, "OK\n"); ++#else ++ gdm_connection_write (conn, "ERROR 8 Virtual terminals not supported\n"); ++#endif ++ } else if (strncmp (msg, GDM_SUP_ADD_DYNAMIC_DISPLAY " ", ++ strlen (GDM_SUP_ADD_DYNAMIC_DISPLAY " ")) == 0) { ++ char *key; ++ ++ key = g_strdup (&msg[strlen (GDM_SUP_ADD_DYNAMIC_DISPLAY " ")]); ++ g_strstrip (key); ++ handle_dynamic_server (conn, DYNAMIC_ADD, key); ++ g_free (key); ++ ++ } else if (strncmp (msg, GDM_SUP_REMOVE_DYNAMIC_DISPLAY " ", ++ strlen (GDM_SUP_REMOVE_DYNAMIC_DISPLAY " ")) == 0) { ++ char *key; ++ ++ key = g_strdup (&msg[strlen (GDM_SUP_REMOVE_DYNAMIC_DISPLAY " ")]); ++ g_strstrip (key); ++ handle_dynamic_server (conn, DYNAMIC_REMOVE, key); ++ g_free (key); ++ ++ } else if (strncmp (msg, GDM_SUP_RELEASE_DYNAMIC_DISPLAYS " ", ++ strlen (GDM_SUP_RELEASE_DYNAMIC_DISPLAYS " ")) == 0) { ++ ++ char *key; ++ ++ key = g_strdup (&msg[strlen (GDM_SUP_RELEASE_DYNAMIC_DISPLAYS " ")]); ++ g_strstrip (key); ++ handle_dynamic_server (conn, DYNAMIC_RELEASE, key); ++ g_free (key); ++ ++ } else if (strcmp (msg, GDM_SUP_VERSION) == 0) { ++ gdm_connection_write (conn, "GDM " VERSION "\n"); ++ } else if (strcmp (msg, GDM_SUP_CLOSE) == 0) { ++ gdm_connection_close (conn); ++ } else { ++ gdm_connection_write (conn, "ERROR 0 Not implemented\n"); ++ gdm_connection_close (conn); ++ } ++} ++ ++/* EOF */ +diff -Nur gdm-2.13.0.5.orig/daemon/gdm.h gdm-2.13.0.5/daemon/gdm.h +--- gdm-2.13.0.5.orig/daemon/gdm.h 2006-01-15 23:49:08.000000000 +0100 ++++ gdm-2.13.0.5/daemon/gdm.h 2006-01-15 23:59:14.000000000 +0100 +@@ -69,6 +69,7 @@ + #define DISPLAY_REBOOT 8 /* Rebewt */ + #define DISPLAY_HALT 16 /* Halt */ + #define DISPLAY_SUSPEND 17 /* Suspend (don't use, use the interrupt) */ ++#define DISPLAY_HIBERNATE 18 + #define DISPLAY_CHOSEN 20 /* successful chooser session, + restart display */ + #define DISPLAY_RUN_CHOOSER 30 /* Run chooser */ +@@ -124,6 +125,7 @@ + #define GDM_INTERRUPT_TIMED_LOGIN 'T' + #define GDM_INTERRUPT_CONFIGURE 'C' + #define GDM_INTERRUPT_SUSPEND 'S' ++#define GDM_INTERRUPT_HIBERNATE 'I' + #define GDM_INTERRUPT_SELECT_USER 'U' + #define GDM_INTERRUPT_LOGIN_SOUND 'L' + #define GDM_INTERRUPT_THEME 'H' +@@ -214,6 +216,7 @@ + #define GDM_KEY_BASE_XSESSION "daemon/BaseXsession=" EXPANDED_SYSCONFDIR "/gdm/Xsession" + #define GDM_KEY_DEFAULT_SESSION "daemon/DefaultSession=gnome.desktop" + #define GDM_KEY_SUSPEND "daemon/SuspendCommand=" SUSPEND_COMMAND ++#define GDM_KEY_HIBERNATE "daemon/HibernateCommand=" + + #define GDM_KEY_USER_AUTHDIR "daemon/UserAuthDir=" + #define GDM_KEY_USER_AUTHDIR_FALLBACK "daemon/UserAuthFBDir=/tmp" +@@ -409,6 +412,7 @@ + GDM_LOGOUT_ACTION_HALT, + GDM_LOGOUT_ACTION_REBOOT, + GDM_LOGOUT_ACTION_SUSPEND, ++ GDM_LOGOUT_ACTION_HIBERNATE, + GDM_LOGOUT_ACTION_LAST + } GdmLogoutAction; + +@@ -1116,6 +1120,8 @@ + * 200 = Too many messages + * 999 = Unknown error + */ ++#define GDM_SUP_SET_SUSPEND "SET_SUSPEND" ++#define GDM_SUP_SET_HIBERNATE "SET_HIBERNATE" + #define GDM_SUP_SET_SAFE_LOGOUT_ACTION "SET_SAFE_LOGOUT_ACTION" /* */ + /* SET_SAFE_LOGOUT_ACTION: Tell the daemon to halt/restart/suspend + * after everybody logs out. If only one +@@ -1147,6 +1153,7 @@ + #define GDM_SUP_LOGOUT_ACTION_HALT "HALT" + #define GDM_SUP_LOGOUT_ACTION_REBOOT "REBOOT" + #define GDM_SUP_LOGOUT_ACTION_SUSPEND "SUSPEND" ++#define GDM_SUP_LOGOUT_ACTION_HIBERNATE "HIBERNATE" + /* + */ + #define GDM_SUP_QUERY_VT "QUERY_VT" /* None */ +diff -Nur gdm-2.13.0.5.orig/daemon/gdm.h.orig gdm-2.13.0.5/daemon/gdm.h.orig +--- gdm-2.13.0.5.orig/daemon/gdm.h.orig 1970-01-01 01:00:00.000000000 +0100 ++++ gdm-2.13.0.5/daemon/gdm.h.orig 2006-01-15 23:49:08.000000000 +0100 +@@ -0,0 +1,1245 @@ ++/* GDM - The GNOME Display Manager ++ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen ++ * ++ * This program is free software; you can redistribute 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 GDM_H ++#define GDM_H ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define GDM_MAX_PASS 256 /* Define a value for password length. Glibc ++ * leaves MAX_PASS undefined. */ ++ ++#define STX 0x2 /* Start of txt */ ++#define BEL 0x7 /* Bell, used to interrupt login for ++ * say timed login or something similar */ ++ ++#define TYPE_STATIC 1 /* X server defined in GDM configuration */ ++#define TYPE_XDMCP 2 /* Remote display/Xserver */ ++#define TYPE_FLEXI 3 /* Local Flexi X server */ ++#define TYPE_FLEXI_XNEST 4 /* Local Flexi Xnest server */ ++#define TYPE_XDMCP_PROXY 5 /* Proxy X server for XDMCP */ ++ ++#define SERVER_IS_LOCAL(d) ((d)->type == TYPE_STATIC || \ ++ (d)->type == TYPE_FLEXI || \ ++ (d)->type == TYPE_FLEXI_XNEST || \ ++ (d)->type == TYPE_XDMCP_PROXY) ++#define SERVER_IS_FLEXI(d) ((d)->type == TYPE_FLEXI || \ ++ (d)->type == TYPE_FLEXI_XNEST || \ ++ (d)->type == TYPE_XDMCP_PROXY) ++#define SERVER_IS_PROXY(d) ((d)->type == TYPE_FLEXI_XNEST || \ ++ (d)->type == TYPE_XDMCP_PROXY) ++#define SERVER_IS_XDMCP(d) ((d)->type == TYPE_XDMCP || \ ++ (d)->type == TYPE_XDMCP_PROXY) ++ ++/* These are the servstat values, also used as server ++ * process exit codes */ ++#define SERVER_TIMEOUT 2 /* Server didn't start */ ++#define SERVER_DEAD 250 /* Server stopped */ ++#define SERVER_PENDING 251 /* Server started but not ready for connections yet */ ++#define SERVER_RUNNING 252 /* Server running and ready for connections */ ++#define SERVER_ABORT 253 /* Server failed badly. Suspending display. */ ++ ++/* DO NOTE USE 1, that's used as error if x connection fails usually */ ++/* Note that there is no reason why these were a power of two, and note ++ * that they have to fit in 256 */ ++/* These are the exit codes */ ++#define DISPLAY_REMANAGE 2 /* Restart display */ ++#define DISPLAY_ABORT 4 /* Houston, we have a problem */ ++#define DISPLAY_REBOOT 8 /* Rebewt */ ++#define DISPLAY_HALT 16 /* Halt */ ++#define DISPLAY_SUSPEND 17 /* Suspend (don't use, use the interrupt) */ ++#define DISPLAY_CHOSEN 20 /* successful chooser session, ++ restart display */ ++#define DISPLAY_RUN_CHOOSER 30 /* Run chooser */ ++#define DISPLAY_XFAILED 64 /* X failed */ ++#define DISPLAY_GREETERFAILED 65 /* greeter failed (crashed) */ ++#define DISPLAY_RESTARTGREETER 127 /* Restart greeter */ ++#define DISPLAY_RESTARTGDM 128 /* Restart GDM */ ++ ++enum { ++ DISPLAY_UNBORN /* Not yet started */, ++ DISPLAY_ALIVE /* Yay! we're alive (non-XDMCP) */, ++ XDMCP_PENDING /* Pending XDMCP display */, ++ XDMCP_MANAGED /* Managed XDMCP display */, ++ DISPLAY_DEAD /* Left for dead */, ++ DISPLAY_CONFIG /* in process of being configured */ ++}; ++ ++/* Opcodes for the highly sophisticated protocol used for ++ * daemon<->greeter communications */ ++ ++/* This will change if there are incompatible ++ * protocol changes */ ++#define GDM_GREETER_PROTOCOL_VERSION "3" ++ ++#define GDM_MSG 'D' ++#define GDM_NOECHO 'U' ++#define GDM_PROMPT 'N' ++#define GDM_SESS 'G' ++#define GDM_LANG '&' ++#define GDM_SSESS 'C' ++#define GDM_SLANG 'R' ++#define GDM_RESET 'A' ++#define GDM_QUIT 'P' ++/* Well these aren't as nice as above, oh well */ ++#define GDM_STARTTIMER 's' ++#define GDM_STOPTIMER 'S' ++#define GDM_SETLOGIN 'l' /* this just sets the login to be this, just for ++ the greeters knowledge */ ++#define GDM_DISABLE '-' /* disable the login screen */ ++#define GDM_ENABLE '+' /* enable the login screen */ ++#define GDM_RESETOK 'r' /* reset but don't shake */ ++#define GDM_NEEDPIC '#' /* need a user picture?, sent after greeter ++ * is started */ ++#define GDM_READPIC '%' /* Send a user picture in a temp file */ ++#define GDM_ERRBOX 'e' /* Puts string in the error box */ ++#define GDM_ERRDLG 'E' /* Puts string up in an error dialog */ ++#define GDM_NOFOCUS 'f' /* Don't focus the login window (optional) */ ++#define GDM_FOCUS 'F' /* Allow focus on the login window again (optional) */ ++#define GDM_SAVEDIE '!' /* Save wm order and die (and set busy cursor) */ ++#define GDM_QUERY_CAPSLOCK 'Q' /* Is capslock on? */ ++ ++/* Different login interruptions */ ++#define GDM_INTERRUPT_TIMED_LOGIN 'T' ++#define GDM_INTERRUPT_CONFIGURE 'C' ++#define GDM_INTERRUPT_SUSPEND 'S' ++#define GDM_INTERRUPT_SELECT_USER 'U' ++#define GDM_INTERRUPT_LOGIN_SOUND 'L' ++#define GDM_INTERRUPT_THEME 'H' ++#define GDM_INTERRUPT_CANCEL 'X' ++ ++/* List delimiter for config file lists */ ++#define GDM_DELIMITER_MODULES ":" ++#define GDM_DELIMITER_THEMES "/:" ++ ++/* The dreaded miscellaneous category */ ++#define FIELD_SIZE 256 ++#define PIPE_SIZE 4096 ++ ++/* ++ * The following section contains keys used by the GDM configuration files. ++ * The key/value pairs defined in the GDM configuration files are considered ++ * "stable" interface and should only change in ways that are backwards ++ * compatible. ++ * ++ * Developers who add new configuration options should ensure that they do the ++ * following: ++ * ++ * + Specify the same default in this file as in the config/gdm.conf.in file. ++ * ++ * + Update the val_hash and type_hash settings in gdm_config_init function ++ * in daemon/gdmconfig.c to add the new options. ++ * ++ * + Add any validation to the _gdm_set_value_string, _gdm_set_value_int, ++ * and/or _gdm_set_value_bool functions in gdmconfig.c, if needed. ++ * ++ * + The gui/gdmsetup.c program should be updated to support the new option ++ * unless there's a good reason not to. ++ * ++ * + If GDM_UPDATE_CONFIG should not respond to this configuration setting, ++ * update the update_config function in gdmconfig.c to return FALSE for ++ * this key. Examples include changing the PidFile, ServAuthDir, or ++ * other values that GDM shouldn't change until it is restarted. If ++ * this is true, the next bullet can be ignored. ++ * ++ * + If the option should cause the greeter (gdmlogin/gdmgreeter) program to ++ * be updated immediately, make sure to update the appropriate ++ * _gdm_set_value_* function in gdmconfig.c to cause a call to ++ * notify_displays_*() when this value is changed. Supporting logic will ++ * also be needed in the gdm_slave_handle_notify function in slave.c. ++ * It should be simple to see how to do this from the other examples. ++ * ++ * + Update the docs/C/gdm.xml file to include information about the new ++ * option. Include information about any other interfaces (such as ++ * ENVIRONMENT variables) that may affect the configuration option. ++ * ++ * Please do this work *before* submitting an patch. Patches that are not ++ * complete will not likely be accepted. ++ */ ++ ++/* Configuration constants */ ++#define GDM_KEY_CHOOSER "daemon/Chooser=" EXPANDED_LIBEXECDIR "/gdmchooser" ++#define GDM_KEY_AUTOMATIC_LOGIN_ENABLE "daemon/AutomaticLoginEnable=false" ++#define GDM_KEY_AUTOMATIC_LOGIN "daemon/AutomaticLogin=" ++/* The SDTLOGIN feature is Solaris specific, and causes the Xserver to be ++ * run with user permissionsinstead of as root, which adds security but ++ * disables the AlwaysRestartServer option as highlighted in the gdm ++ * documentation */ ++#ifdef sun ++#define GDM_KEY_ALWAYS_RESTART_SERVER "daemon/AlwaysRestartServer=true" ++#else ++#define GDM_KEY_ALWAYS_RESTART_SERVER "daemon/AlwaysRestartServer=false" ++#endif ++#define GDM_KEY_GREETER "daemon/Greeter=" EXPANDED_LIBEXECDIR "/gdmlogin" ++#define GDM_KEY_REMOTE_GREETER "daemon/RemoteGreeter=" EXPANDED_LIBEXECDIR "/gdmlogin" ++#define GDM_KEY_ADD_GTK_MODULES "daemon/AddGtkModules=false" ++#define GDM_KEY_GTK_MODULES_LIST "daemon/GtkModulesList=" ++#define GDM_KEY_GROUP "daemon/Group=gdm" ++#define GDM_KEY_HALT "daemon/HaltCommand=" HALT_COMMAND ++#define GDM_KEY_DISPLAY_INIT_DIR "daemon/DisplayInitDir=" EXPANDED_SYSCONFDIR "/gdm/Init" ++#define GDM_KEY_KILL_INIT_CLIENTS "daemon/KillInitClients=true" ++#define GDM_KEY_LOG_DIR "daemon/LogDir=" EXPANDED_LOGDIR ++#define GDM_KEY_PATH "daemon/DefaultPath=" GDM_USER_PATH ++#define GDM_KEY_PID_FILE "daemon/PidFile=/var/run/gdm.pid" ++#define GDM_KEY_POSTSESSION "daemon/PostSessionScriptDir=" EXPANDED_SYSCONFDIR "/gdm/PostSession/" ++#define GDM_KEY_PRESESSION "daemon/PreSessionScriptDir=" EXPANDED_SYSCONFDIR "/gdm/PreSession/" ++#define GDM_KEY_POSTLOGIN "daemon/PostLoginScriptDir=" EXPANDED_SYSCONFDIR "/gdm/PreSession/" ++#define GDM_KEY_FAILSAFE_XSERVER "daemon/FailsafeXServer=" ++#define GDM_KEY_X_KEEPS_CRASHING "daemon/XKeepsCrashing=" EXPANDED_SYSCONFDIR "/gdm/XKeepsCrashing" ++#define GDM_KEY_REBOOT "daemon/RebootCommand=" REBOOT_COMMAND ++#define GDM_KEY_ROOT_PATH "daemon/RootPath=/sbin:/usr/sbin:" GDM_USER_PATH ++#define GDM_KEY_SERV_AUTHDIR "daemon/ServAuthDir=" EXPANDED_AUTHDIR ++#define GDM_KEY_SESSION_DESKTOP_DIR "daemon/SessionDesktopDir=/etc/X11/sessions/:" EXPANDED_SYSCONFDIR "/dm/Sessions/:" EXPANDED_DATADIR "/gdm/BuiltInSessions/:" EXPANDED_DATADIR "/xsessions/" ++#define GDM_KEY_BASE_XSESSION "daemon/BaseXsession=" EXPANDED_SYSCONFDIR "/gdm/Xsession" ++#define GDM_KEY_DEFAULT_SESSION "daemon/DefaultSession=gnome.desktop" ++#define GDM_KEY_SUSPEND "daemon/SuspendCommand=" SUSPEND_COMMAND ++ ++#define GDM_KEY_USER_AUTHDIR "daemon/UserAuthDir=" ++#define GDM_KEY_USER_AUTHDIR_FALLBACK "daemon/UserAuthFBDir=/tmp" ++#define GDM_KEY_USER_AUTHFILE "daemon/UserAuthFile=.Xauthority" ++#define GDM_KEY_USER "daemon/User=gdm" ++#define GDM_KEY_CONSOLE_NOTIFY "daemon/ConsoleNotify=true" ++ ++#define GDM_KEY_DOUBLE_LOGIN_WARNING "daemon/DoubleLoginWarning=true" ++#define GDM_KEY_ALWAYS_LOGIN_CURRENT_SESSION "daemon/AlwaysLoginCurrentSession=false" ++ ++#define GDM_KEY_DISPLAY_LAST_LOGIN "daemon/DisplayLastLogin=false" ++ ++#define GDM_KEY_TIMED_LOGIN_ENABLE "daemon/TimedLoginEnable=false" ++#define GDM_KEY_TIMED_LOGIN "daemon/TimedLogin=" ++#define GDM_KEY_TIMED_LOGIN_DELAY "daemon/TimedLoginDelay=30" ++ ++#define GDM_KEY_FLEXI_REAP_DELAY_MINUTES "daemon/FlexiReapDelayMinutes=5" ++ ++#define GDM_KEY_STANDARD_XSERVER "daemon/StandardXServer=" X_SERVER ++#define GDM_KEY_FLEXIBLE_XSERVERS "daemon/FlexibleXServers=5" ++#define GDM_KEY_DYNAMIC_XSERVERS "daemon/DynamicXServers=false" ++#define GDM_KEY_XNEST "daemon/Xnest=" X_SERVER_PATH "/Xnest -name Xnest" ++/* Keys for automatic VT allocation rather then letting it up to the ++ * X server */ ++#define GDM_KEY_FIRST_VT "daemon/FirstVT=7" ++#define GDM_KEY_VT_ALLOCATION "daemon/VTAllocation=true" ++ ++#define GDM_KEY_CONSOLE_CANNOT_HANDLE "daemon/ConsoleCannotHandle=am,ar,az,bn,el,fa,gu,hi,ja,ko,ml,mr,pa,ta,zh" ++ ++/* Per server definitions */ ++#define GDM_KEY_SERVER_PREFIX "server-" ++#define GDM_KEY_SERVER_NAME "name=Standard server" ++#define GDM_KEY_SERVER_COMMAND "command=" X_SERVER ++/* runnable as flexi server */ ++#define GDM_KEY_SERVER_FLEXIBLE "flexible=true" ++/* choosable from the login screen */ ++#define GDM_KEY_SERVER_CHOOSABLE "choosable=false" ++/* Login is handled by gdm, otherwise it's a remote server */ ++#define GDM_KEY_SERVER_HANDLED "handled=true" ++/* Instead of the greeter run the chooser */ ++#define GDM_KEY_SERVER_CHOOSER "chooser=false" ++/* select a nice level to run the X server at */ ++#define GDM_KEY_SERVER_PRIORITY "priority=0" ++ ++#define GDM_KEY_ALLOW_ROOT "security/AllowRoot=true" ++#define GDM_KEY_ALLOW_REMOTE_ROOT "security/AllowRemoteRoot=true" ++#define GDM_KEY_ALLOW_REMOTE_AUTOLOGIN "security/AllowRemoteAutoLogin=false" ++#define GDM_KEY_USER_MAX_FILE "security/UserMaxFile=65536" ++#define GDM_KEY_RELAX_PERM "security/RelaxPermissions=0" ++#define GDM_KEY_CHECK_DIR_OWNER "security/CheckDirOwner=true" ++#define GDM_KEY_RETRY_DELAY "security/RetryDelay=1" ++#define GDM_KEY_DISALLOW_TCP "security/DisallowTCP=true" ++ ++#define GDM_KEY_NEVER_PLACE_COOKIES_ON_NFS "security/NeverPlaceCookiesOnNFS=true" ++#define GDM_KEY_PASSWORD_REQUIRED "security/PasswordRequired=false" ++ ++#define GDM_KEY_XDMCP "xdmcp/Enable=false" ++#define GDM_KEY_MAX_PENDING "xdmcp/MaxPending=4" ++#define GDM_KEY_MAX_SESSIONS "xdmcp/MaxSessions=16" ++#define GDM_KEY_MAX_WAIT "xdmcp/MaxWait=15" ++#define GDM_KEY_DISPLAYS_PER_HOST "xdmcp/DisplaysPerHost=2" ++#define GDM_KEY_UDP_PORT "xdmcp/Port=177" ++#define GDM_KEY_INDIRECT "xdmcp/HonorIndirect=true" ++#define GDM_KEY_MAX_INDIRECT "xdmcp/MaxPendingIndirect=4" ++#define GDM_KEY_MAX_WAIT_INDIRECT "xdmcp/MaxWaitIndirect=15" ++#define GDM_KEY_PING_INTERVAL "xdmcp/PingIntervalSeconds=15" ++#define GDM_KEY_WILLING "xdmcp/Willing=" EXPANDED_SYSCONFDIR "/gdm/Xwilling" ++ ++#define GDM_KEY_XDMCP_PROXY "xdmcp/EnableProxy=false" ++#define GDM_KEY_XDMCP_PROXY_XSERVER "xdmcp/ProxyXServer=" ++#define GDM_KEY_XDMCP_PROXY_RECONNECT "xdmcp/ProxyReconnect=" ++ ++#define GDM_KEY_GTK_THEME "gui/GtkTheme=Default" ++#define GDM_KEY_GTKRC "gui/GtkRC=" EXPANDED_DATADIR "/themes/Default/gtk-2.0/gtkrc" ++#define GDM_KEY_MAX_ICON_WIDTH "gui/MaxIconWidth=128" ++#define GDM_KEY_MAX_ICON_HEIGHT "gui/MaxIconHeight=128" ++ ++#define GDM_KEY_ALLOW_GTK_THEME_CHANGE "gui/AllowGtkThemeChange=true" ++#define GDM_KEY_GTK_THEMES_TO_ALLOW "gui/GtkThemesToAllow=all" ++ ++#define GDM_KEY_BROWSER "greeter/Browser=false" ++#define GDM_KEY_INCLUDE "greeter/Include=" ++#define GDM_KEY_EXCLUDE "greeter/Exclude=bin,daemon,adm,lp,sync,shutdown,halt,mail,news,uucp,operator,nobody,gdm,postgres,pvm,rpm,nfsnobody,pcap" ++#define GDM_KEY_INCLUDE_ALL "greeter/IncludeAll=false" ++#define GDM_KEY_MINIMAL_UID "greeter/MinimalUID=100" ++#define GDM_KEY_DEFAULT_FACE "greeter/DefaultFace=" EXPANDED_PIXMAPDIR "/nobody.png" ++#define GDM_KEY_GLOBAL_FACE_DIR "greeter/GlobalFaceDir=" EXPANDED_DATADIR "/pixmaps/faces/" ++#define GDM_KEY_LOCALE_FILE "greeter/LocaleFile=" EXPANDED_LOCALEDIR "/locale.alias" ++#define GDM_KEY_LOGO "greeter/Logo=" EXPANDED_PIXMAPDIR "/gdm-foot-logo.png" ++#define GDM_KEY_CHOOSER_BUTTON_LOGO "greeter/ChooserButtonLogo=" EXPANDED_PIXMAPDIR "/gdm-foot-logo.png" ++#define GDM_KEY_QUIVER "greeter/Quiver=true" ++#define GDM_KEY_SYSTEM_MENU "greeter/SystemMenu=true" ++#define GDM_KEY_CONFIGURATOR "daemon/Configurator=" EXPANDED_SBINDIR "/gdmsetup --disable-sound --disable-crash-dialog" ++#define GDM_KEY_CONFIG_AVAILABLE "greeter/ConfigAvailable=true" ++#define GDM_KEY_CHOOSER_BUTTON "greeter/ChooserButton=true" ++#define GDM_KEY_NOXKEEPSCRASHING "daemon/NoXKeepsCrashing=false" ++#define GDM_KEY_TITLE_BAR "greeter/TitleBar=true" ++ ++/* ++ * For backwards compatibility, do not set values for DEFAULT_WELCOME or ++ * DEFAULT_REMOTEWELCOME. This will cause these values to always be ++ * read from the config file, and will cause them to return FALSE if ++ * no value is set in the config file. We want the value "FALSE" if ++ * the values don't exist in the config file. The daemon will compare ++ * the Welcome/RemoveWelcome value with the default string and ++ * automatically translate the text if the string is the same as the ++ * default string. We set the default values of GDM_KEY_WELCOME and ++ * GDM_KEY_REMOTEWELCOME so that the default value is returned when ++ * you run GET_CONFIG on these keys. ++ */ ++#define GDM_DEFAULT_WELCOME_MSG "Welcome" ++#define GDM_DEFAULT_REMOTE_WELCOME_MSG "Welcome to %n" ++ ++#define GDM_KEY_DEFAULT_WELCOME "greeter/DefaultWelcome=" ++#define GDM_KEY_DEFAULT_REMOTE_WELCOME "greeter/DefaultRemoteWelcome=" ++#define GDM_KEY_WELCOME "greeter/Welcome=" GDM_DEFAULT_WELCOME_MSG ++#define GDM_KEY_REMOTE_WELCOME "greeter/RemoteWelcome=" GDM_DEFAULT_REMOTE_WELCOME_MSG ++#define GDM_KEY_XINERAMA_SCREEN "greeter/XineramaScreen=0" ++#define GDM_KEY_BACKGROUND_PROGRAM "greeter/BackgroundProgram=" ++#define GDM_KEY_RUN_BACKGROUND_PROGRAM_ALWAYS "greeter/RunBackgroundProgramAlways=false" ++#define GDM_KEY_BACKGROUND_PROGRAM_INITIAL_DELAY "greeter/BackgroundProgramInitialDelay=30" ++#define GDM_KEY_RESTART_BACKGROUND_PROGRAM "greeter/RestartBackgroundProgram=true" ++#define GDM_KEY_BACKGROUND_PROGRAM_RESTART_DELAY "greeter/BackgroundProgramRestartDelay=30" ++#define GDM_KEY_BACKGROUND_IMAGE "greeter/BackgroundImage=" ++#define GDM_KEY_BACKGROUND_COLOR "greeter/BackgroundColor=#76848F" ++#define GDM_KEY_BACKGROUND_TYPE "greeter/BackgroundType=2" ++#define GDM_KEY_BACKGROUND_SCALE_TO_FIT "greeter/BackgroundScaleToFit=true" ++#define GDM_KEY_BACKGROUND_REMOTE_ONLY_COLOR "greeter/BackgroundRemoteOnlyColor=true" ++#define GDM_KEY_LOCK_POSITION "greeter/LockPosition=false" ++#define GDM_KEY_SET_POSITION "greeter/SetPosition=false" ++#define GDM_KEY_POSITION_X "greeter/PositionX=0" ++#define GDM_KEY_POSITION_Y "greeter/PositionY=0" ++#define GDM_KEY_USE_24_CLOCK "greeter/Use24Clock=false" ++#define GDM_KEY_ENTRY_CIRCLES "greeter/UseCirclesInEntry=false" ++#define GDM_KEY_ENTRY_INVISIBLE "greeter/UseInvisibleInEntry=false" ++#define GDM_KEY_GRAPHICAL_THEME "greeter/GraphicalTheme=circles" ++#define GDM_KEY_GRAPHICAL_THEMES "greeter/GraphicalThemes=circles" ++#define GDM_KEY_GRAPHICAL_THEME_RAND "greeter/GraphicalThemeRand=false" ++#define GDM_KEY_GRAPHICAL_THEME_DIR "greeter/GraphicalThemeDir=" EXPANDED_DATADIR "/gdm/themes/" ++#define GDM_KEY_GRAPHICAL_THEME_COLOR "greeter/GraphicalThemedColor=#76848F" ++ ++#define GDM_KEY_INFO_MSG_FILE "greeter/InfoMsgFile=" ++#define GDM_KEY_INFO_MSG_FONT "greeter/InfoMsgFont=" ++ ++#define GDM_KEY_PRE_FETCH_PROGRAM "greeter/PreFetchProgram=" ++ ++#define GDM_KEY_SOUND_ON_LOGIN "greeter/SoundOnLogin=true" ++#define GDM_KEY_SOUND_ON_LOGIN_SUCCESS "greeter/SoundOnLoginSuccess=false" ++#define GDM_KEY_SOUND_ON_LOGIN_FAILURE "greeter/SoundOnLoginFailure=false" ++#define GDM_KEY_SOUND_ON_LOGIN_FILE "greeter/SoundOnLoginFile=" ++#define GDM_KEY_SOUND_ON_LOGIN_SUCCESS_FILE "greeter/SoundOnLoginSuccessFile=" ++#define GDM_KEY_SOUND_ON_LOGIN_FAILURE_FILE "greeter/SoundOnLoginFailureFile=" ++#define GDM_KEY_SOUND_PROGRAM "daemon/SoundProgram=" SOUND_PROGRAM ++ ++#define GDM_KEY_SCAN_TIME "chooser/ScanTime=4" ++#define GDM_KEY_DEFAULT_HOST_IMG "chooser/DefaultHostImg=" EXPANDED_PIXMAPDIR "/nohost.png" ++#define GDM_KEY_HOST_IMAGE_DIR "chooser/HostImageDir=" EXPANDED_DATADIR "/hosts/" ++#define GDM_KEY_HOSTS "chooser/Hosts=" ++#define GDM_KEY_MULTICAST "chooser/Multicast=true" ++#define GDM_KEY_MULTICAST_ADDR "chooser/MulticastAddr=ff02::1" ++#define GDM_KEY_BROADCAST "chooser/Broadcast=true" ++#define GDM_KEY_ALLOW_ADD "chooser/AllowAdd=true" ++ ++#define GDM_KEY_DEBUG "debug/Enable=false" ++#define GDM_KEY_DEBUG_GESTURES "debug/Gestures=false" ++ ++#define GDM_KEY_SECTION_GREETER "greeter" ++#define GDM_KEY_SECTION_SERVERS "servers" ++ ++#define GDM_KEY_SHOW_GNOME_FAILSAFE "greeter/ShowGnomeFailsafeSession=true" ++#define GDM_KEY_SHOW_XTERM_FAILSAFE "greeter/ShowXtermFailsafeSession=true" ++#define GDM_KEY_SHOW_LAST_SESSION "greeter/ShowLastSession=true" ++ ++#define GDM_SESSION_FAILSAFE_GNOME "GDM_Failsafe.GNOME" ++#define GDM_SESSION_FAILSAFE_XTERM "GDM_Failsafe.XTERM" ++ ++/* FIXME: will support these builtin types later */ ++#define GDM_SESSION_DEFAULT "default" ++#define GDM_SESSION_CUSTOM "custom" ++#define GDM_SESSION_FAILSAFE "failsafe" ++ ++#define GDM_STANDARD "Standard" ++ ++#define GDM_RESPONSE_CANCEL "GDM_RESPONSE_CANCEL" ++ ++#ifndef TYPEDEF_GDM_CONNECTION ++#define TYPEDEF_GDM_CONNECTION ++typedef struct _GdmConnection GdmConnection; ++#endif /* TYPEDEF_GDM_CONNECTION */ ++ ++typedef enum { ++ GDM_LOGOUT_ACTION_NONE = 0, ++ GDM_LOGOUT_ACTION_HALT, ++ GDM_LOGOUT_ACTION_REBOOT, ++ GDM_LOGOUT_ACTION_SUSPEND, ++ GDM_LOGOUT_ACTION_LAST ++} GdmLogoutAction; ++ ++#ifndef TYPEDEF_GDM_DISPLAY ++#define TYPEDEF_GDM_DISPLAY ++typedef struct _GdmDisplay GdmDisplay; ++#endif /* TYPEDEF_GDM_DISPLAY */ ++ ++/* Use this to get the right authfile name */ ++#define GDM_AUTHFILE(display) \ ++ (display->authfile_gdm != NULL ? display->authfile_gdm : display->authfile) ++ ++#ifdef sun ++#define SDTLOGIN_DIR "/var/dt/sdtlogin" ++#endif ++ ++struct _GdmDisplay { ++ CARD32 sessionid; ++ Display *dsp; ++ gchar *authfile; /* authfile for the server */ ++ gchar *authfile_gdm; /* authfile readable by gdm user ++ if necessary */ ++ GSList *auths; ++ GSList *local_auths; ++ gchar *userauth; ++ gboolean authfb; ++ time_t last_auth_touch; ++ gchar *command; ++ gboolean failsafe_xserver; ++ gboolean use_chooser; /* run chooser instead of greeter */ ++ gchar *chosen_hostname; /* locally chosen hostname if not NULL, ++ "-query chosen_hostname" is appened to server command line */ ++ guint indirect_id; ++ gchar *cookie; ++ gchar *bcookie; ++ gchar *name; ++ gchar *hostname; ++ struct in_addr addr; ++#ifdef ENABLE_IPV6 ++ struct in6_addr addr6; ++ struct sockaddr_storage *addrs; /* array of addresses */ ++#else ++ struct in_addr *addrs; /* array of addresses */ ++#endif ++ int addrtype; /* Specifying the variable used, addr or addr6 */ ++ int addr_count; /* number of addresses in array */ ++ /* Note that the above may in fact be empty even though ++ addr is set, these are just extra addresses ++ (it could also contain addr for all we know) */ ++ ++ guint8 dispstat; ++ guint16 dispnum; ++ gboolean removeconf; ++ guint8 servstat; ++ time_t starttime; ++ time_t managetime; ++ guint8 type; ++ pid_t greetpid; ++ pid_t servpid; ++ pid_t sesspid; ++ int last_sess_status; /* status returned by last session */ ++ pid_t slavepid; ++ pid_t chooserpid; ++ time_t acctime; ++ ++ gboolean handled; ++ gboolean tcp_disallowed; ++ ++ int priority; ++ int vt; ++ ++ gboolean busy_display; ++ ++ gboolean attached; /* Display is physically attached to the machine. */ ++ /* TYPE_XDMCP would have this FALSE, eg. */ ++ ++ time_t last_start_time; ++ time_t last_loop_start_time; ++ gint retry_count; ++ ++ int sleep_before_run; ++ ++ time_t last_x_failed; ++ int x_faileds; ++ ++ gboolean try_different_greeter; ++ ++ gboolean logged_in; /* TRUE if someone is logged in */ ++ char *login; ++ ++ gboolean timed_login_ok; ++ ++ int screenx; ++ int screeny; ++ int screenwidth; /* Note 0 means use the gdk size */ ++ int screenheight; ++ int lrh_offsetx; /* lower right hand corner x offset */ ++ int lrh_offsety; /* lower right hand corner y offset */ ++ ++ /* Flexi stuff */ ++ char *parent_disp; ++ Display *parent_dsp; ++ char *parent_auth_file; ++ char *parent_temp_auth_file; ++ uid_t server_uid; ++ GdmConnection *socket_conn; ++ ++ int xdmcp_dispnum; ++ ++ /* Notification connection */ ++ int master_notify_fd; /* write part of the connection */ ++ int slave_notify_fd; /* read part of the connection */ ++ ++ /* order in the Xservers file for sessreg, -1 if unset yet */ ++ int x_servers_order; ++ ++ /* The xsession-errors connection */ ++ int xsession_errors_fd; /* write to the file */ ++ int session_output_fd; /* read from the session */ ++ int xsession_errors_bytes; ++#define MAX_XSESSION_ERRORS_BYTES (80*2500) /* maximum number of bytes in ++ the ~/.xsession-errors file */ ++ char *xsession_errors_filename; /* if NULL then there is no .xsession-errors ++ file */ ++ ++ int chooser_output_fd; /* from the chooser */ ++ char *chooser_last_line; ++ ++ /* Only set in the main daemon as that's the only place that cares */ ++ GdmLogoutAction logout_action; ++ ++ char *theme_name; ++}; ++ ++typedef struct _GdmXserver GdmXserver; ++struct _GdmXserver { ++ char *id; ++ char *name; ++ char *command; ++ gboolean flexible; ++ gboolean choosable; /* not implemented yet */ ++ gboolean chooser; /* instead of greeter, run chooser */ ++ gboolean handled; ++ int priority; ++}; ++ ++typedef struct _GdmIndirectDisplay GdmIndirectDisplay; ++struct _GdmIndirectDisplay { ++ int id; ++#ifdef ENABLE_IPV6 ++ struct sockaddr_storage* dsp_sa; ++ struct in6_addr* chosen_host6; ++#else ++ struct sockaddr_in* dsp_sa; ++#endif ++ time_t acctime; ++ struct in_addr *chosen_host; ++}; ++ ++/* NOTE: Timeout and max are hardcoded */ ++typedef struct _GdmForwardQuery GdmForwardQuery; ++struct _GdmForwardQuery { ++ time_t acctime; ++#ifdef ENABLE_IPV6 ++ struct sockaddr_storage* dsp_sa; ++ struct sockaddr_storage* from_sa; ++#else ++ struct sockaddr_in* dsp_sa; ++ struct sockaddr_in* from_sa; ++#endif ++}; ++#define GDM_MAX_FORWARD_QUERIES 10 ++#define GDM_FORWARD_QUERY_TIMEOUT 30 ++ ++/* some extra XDMCP opcodes that xdm will happily ignore since they'll be ++ * the wrong XDMCP version anyway */ ++#define GDM_XDMCP_PROTOCOL_VERSION 1001 ++enum { ++ GDM_XDMCP_FIRST_OPCODE = 1000, /*just a marker, not an opcode */ ++ ++ GDM_XDMCP_MANAGED_FORWARD = 1000, ++ /* manager (master) -> manager ++ * A packet with MANAGED_FORWARD is sent to the ++ * manager that sent the forward query from the manager to ++ * which forward query was sent. It indicates that the forward ++ * was fully processed and that the client now has either ++ * a managed session, or has been sent denial, refuse or failed. ++ * (if the denial gets lost then client gets dumped into the ++ * chooser again). This should be resent a few times ++ * until some (short) timeout or until GOT_MANAGED_FORWARD ++ * is sent. GDM sends at most 3 packates with 1.5 seconds ++ * between each. ++ * ++ * Argument is ARRAY8 with the address of the originating host */ ++ GDM_XDMCP_GOT_MANAGED_FORWARD, ++ /* manager -> manager (master) ++ * A single packet with GOT_MANAGED_FORWARD is sent to indicate ++ * that we did receive the MANAGED_FORWARD packet. The argument ++ * must match the MANAGED_FORWARD one or it will just be ignored. ++ * ++ * Argument is ARRAY8 with the address of the originating host */ ++ GDM_XDMCP_LAST_OPCODE /*just a marker, not an opcode */ ++}; ++ ++/* If id == NULL, then get the first X server */ ++void gdm_final_cleanup (void); ++ ++ ++/* primitive protocol for controlling the daemon from slave ++ * or gdmconfig or whatnot */ ++ ++/* The ones that pass a must be from a valid slave, and ++ * the slave will be sent a SIGUSR2. Nowdays there is a pipe that is ++ * used from inside slaves, so those messages may stop being processed ++ * by the fifo at some point perhaps. */ ++/* The fifo protocol, used only by gdm internally */ ++#define GDM_SOP_CHOSEN "CHOSEN" /* */ ++#define GDM_SOP_CHOSEN_LOCAL "CHOSEN_LOCAL" /* */ ++#define GDM_SOP_XPID "XPID" /* */ ++#define GDM_SOP_SESSPID "SESSPID" /* */ ++#define GDM_SOP_GREETPID "GREETPID" /* */ ++#define GDM_SOP_CHOOSERPID "CHOOSERPID" /* */ ++#define GDM_SOP_LOGGED_IN "LOGGED_IN" /* */ ++#define GDM_SOP_LOGIN "LOGIN" /* */ ++#define GDM_SOP_COOKIE "COOKIE" /* */ ++#define GDM_SOP_AUTHFILE "AUTHFILE" /* */ ++#define GDM_SOP_QUERYLOGIN "QUERYLOGIN" /* */ ++/* if user already logged in somewhere, the ack response will be ++ ,,,,... */ ++#define GDM_SOP_MIGRATE "MIGRATE" /* */ ++#define GDM_SOP_DISP_NUM "DISP_NUM" /* */ ++/* For Linux only currently */ ++#define GDM_SOP_VT_NUM "VT_NUM" /* */ ++#define GDM_SOP_FLEXI_ERR "FLEXI_ERR" /* */ ++ /* 3 = X failed */ ++ /* 4 = X too busy */ ++ /* 5 = Xnest can't connect */ ++#define GDM_SOP_FLEXI_OK "FLEXI_OK" /* */ ++#define GDM_SOP_SOFT_RESTART "SOFT_RESTART" /* no arguments */ ++#define GDM_SOP_START_NEXT_LOCAL "START_NEXT_LOCAL" /* no arguments */ ++#define GDM_SOP_HUP_ALL_GREETERS "HUP_ALL_GREETERS" /* no arguments */ ++ ++/* stop waiting for this and go on with your life, useful with ++ the --wait-for-go command line option */ ++#define GDM_SOP_GO "GO" /* no arguments */ ++ ++/* sometimes we can't do a syslog so we tell the main daemon */ ++#define GDM_SOP_SYSLOG "SYSLOG" /* */ ++ ++/* write out a sessreg (xdm) compatible Xservers file ++ * in the ServAuthDir as .Xservers */ ++#define GDM_SOP_WRITE_X_SERVERS "WRITE_X_SERVERS" /* */ ++ ++/* All X servers should be restarted rather then regenerated. Useful ++ * if you have updated the X configuration. Note that this happens ++ * only when the user logs out or when we otherwise would have restarted ++ * a server, nothing is done by this command. */ ++#define GDM_SOP_DIRTY_SERVERS "DIRTY_SERVERS" /* no arguments */ ++ ++/* restart all servers that people aren't logged in on. Maybe you may not ++ * want to do this on every change of X server config since this may cause ++ * flicker on screen and jumping around on the vt. Perhaps useful to do ++ * by asking the user if they want to do that. Note that this will not ++ * kill any logged in sessions. */ ++#define GDM_SOP_SOFT_RESTART_SERVERS "SOFT_RESTART_SERVERS" /* no arguments */ ++/* Suspend the machine if it is even allowed */ ++#define GDM_SOP_SUSPEND_MACHINE "SUSPEND_MACHINE" /* no arguments */ ++#define GDM_SOP_CHOSEN_THEME "CHOSEN_THEME" /* */ ++ ++/* Start a new standard X flexible server */ ++#define GDM_SOP_FLEXI_XSERVER "FLEXI_XSERVER" /* no arguments */ ++ ++/* Notification protocol */ ++/* keys */ ++#define GDM_NOTIFY_ALLOW_REMOTE_ROOT "AllowRemoteRoot" /* */ ++#define GDM_NOTIFY_ALLOW_ROOT "AllowRoot" /* */ ++#define GDM_NOTIFY_ALLOW_REMOTE_AUTOLOGIN "AllowRemoteAutoLogin" /* */ ++#define GDM_NOTIFY_SYSTEM_MENU "SystemMenu" /* */ ++#define GDM_NOTIFY_CONFIG_AVAILABLE "ConfigAvailable" /* */ ++#define GDM_NOTIFY_CHOOSER_BUTTON "ChooserButton" /* */ ++#define GDM_NOTIFY_RETRY_DELAY "RetryDelay" /* */ ++#define GDM_NOTIFY_GREETER "Greeter" /* */ ++#define GDM_NOTIFY_REMOTE_GREETER "RemoteGreeter" /* */ ++#define GDM_NOTIFY_TIMED_LOGIN "TimedLogin" /* */ ++#define GDM_NOTIFY_TIMED_LOGIN_DELAY "TimedLoginDelay" /* */ ++#define GDM_NOTIFY_TIMED_LOGIN_ENABLE "TimedLoginEnable" /* */ ++#define GDM_NOTIFY_DISALLOW_TCP "DisallowTCP" /* */ ++#define GDM_NOTIFY_SOUND_ON_LOGIN_FILE "SoundOnLoginFile" /* */ ++#define GDM_NOTIFY_SOUND_ON_LOGIN_SUCCESS_FILE "SoundOnLoginSuccessFile" /* */ ++#define GDM_NOTIFY_SOUND_ON_LOGIN_FAILURE_FILE "SoundOnLoginFailureFile" /* */ ++#define GDM_NOTIFY_ADD_GTK_MODULES "AddGtkModules" /* */ ++#define GDM_NOTIFY_GTK_MODULES_LIST "GtkModulesList" /* */ ++ ++/* commands, seel GDM_SLAVE_NOTIFY_COMMAND */ ++#define GDM_NOTIFY_DIRTY_SERVERS "DIRTY_SERVERS" ++#define GDM_NOTIFY_SOFT_RESTART_SERVERS "SOFT_RESTART_SERVERS" ++#define GDM_NOTIFY_GO "GO" ++#define GDM_NOTIFY_TWIDDLE_POINTER "TWIDDLE_POINTER" ++ ++/* Ack for a slave message */ ++/* Note that an extra response can follow an 'ack' */ ++#define GDM_SLAVE_NOTIFY_ACK 'A' ++/* Update this key */ ++#define GDM_SLAVE_NOTIFY_KEY '!' ++/* notify a command */ ++#define GDM_SLAVE_NOTIFY_COMMAND '#' ++ ++/* ++ * Maximum number of connections allowed at once. Might be useful to ++ * try and tune this. GDM would be faster if the value is larger. ++ */ ++#define GDM_SUP_MAX_CONNECTIONS 20 ++#define GDM_SUP_SOCKET "/tmp/.gdm_socket" ++ ++/* ++ * The user socket protocol. Each command is given on a separate line ++ * ++ * A user should first send a VERSION\n after connecting and only do ++ * anything else if gdm responds with the correct response. The version ++ * is the gdm version and not a "protocol" revision, so you can't check ++ * against a single version but check if the version is higher then some ++ * value. ++ * ++ * You can only send a few commands at a time, so if you keep getting error ++ * 200 try opening a new socket for every command you send. ++ */ ++/* The user protocol, using /tmp/.gdm_socket */ ++ ++#define GDM_SUP_VERSION "VERSION" /* no arguments */ ++/* VERSION: Query GDM version ++ * Supported since: 2.2.4.0 ++ * Arguments: None ++ * Answers: ++ * GDM ++ * ERROR ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_AUTH_LOCAL "AUTH_LOCAL" /* */ ++/* AUTH_LOCAL: Setup this connection as authenticated for FLEXI_SERVER. ++ * Because all full blown (non-Xnest) displays can be started ++ * only from users logged in locally, and here gdm assumes ++ * only users logged in from gdm. They must pass the xauth ++ * MIT-MAGIC-COOKIE-1 that they were passed before the ++ * connection is authenticated. ++ * Note: The AUTH LOCAL command requires the --authenticate option, ++ * although only FLEXI XSERVER uses this currently. ++ * Note: Since 2.6.0.6 you can also use a global ++ * /.cookie, which works for all authentication ++ * except for SET_LOGOUT_ACTION and QUERY_LOGOUT_ACTION ++ * and SET_SAFE_LOGOUT_ACTION which require a logged in ++ * display. ++ * Supported since: 2.2.4.0 ++ * Arguments: ++ * is in hex form with no 0x prefix ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 100 = Not authenticated ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_FLEXI_XSERVER "FLEXI_XSERVER" /* */ ++/* FLEXI_XSERVER: Start a new X flexible display. Only supported on ++ * connection that passed AUTH_LOCAL ++ * Supported since: 2.2.4.0 ++ * Arguments: ++ * If no arguments, starts the standard X server ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 1 = No more flexi servers ++ * 2 = Startup errors ++ * 3 = X failed ++ * 4 = X too busy ++ * 6 = No server binary ++ * 100 = Not authenticated ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_FLEXI_XNEST "FLEXI_XNEST" /* */ ++/* FLEXI_XNEXT: Start a new flexible Xnest display. ++ * Note: Supported on older versions from 2.2.4.0, later ++ * 2.2.4.2, but since 2.3.90.4 you must supply 4 ++ * arguments or ERROR 100 will be returned. This ++ * will start Xnest using the XAUTHORITY file ++ * supplied and as the uid same as the owner of ++ * that file (and same as you supply). You must ++ * also supply the cookie as the third argument ++ * for this display, to prove that you indeed are ++ * this user. Also this file must be readable ++ * ONLY by this user, that is have a mode of 0600. ++ * If this all is not met, ERROR 100 is returned. ++ * Note: The cookie should be the MIT-MAGIC-COOKIE-1, ++ * the first one gdm can find in the XAUTHORITY ++ * file for this display. If that's not what you ++ * use you should generate one first. The cookie ++ * should be in hex form. ++ * Supported since: 2.3.90.4 ++ * Arguments: ++ * ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 1 = No more flexi servers ++ * 2 = Startup errors ++ * 3 = X failed ++ * 4 = X too busy ++ * 5 = Xnest can't connect ++ * 6 = No server binary ++ * 100 = Not authenticated ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_ADD_DYNAMIC_DISPLAY "ADD_DYNAMIC_DISPLAY" ++/* ++ * ADD_DYNAMIC_DISPLAY: Create a new server definition that will ++ * run on the specified display leaving, it ++ * in DISPLAY_CONFIG state. ++ * Supported since: 2.8.0.0 ++ * Arguments: = ++ * Where is either a configuration named in the ++ * GDM configuration a literal command name. ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 2 = Existing display ++ * 3 = No server string ++ * 4 = Display startup failure ++ * 100 = Not authenticated ++ * 200 - Dynamic Displays not allowed ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_RELEASE_DYNAMIC_DISPLAYS "RELEASE_DYNAMIC_DISPLAYS" ++/* ++ * RELEASE_DYNAMIC_DISPLAYS: Release dynamic displays currently in ++ * DISPLAY_CONFIG state ++ * Supported since: 2.8.0.0 ++ * Arguments: None ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 100 = Not authenticated ++ * 200 = Dynamic Displays not allowed ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_REMOVE_DYNAMIC_DISPLAY "REMOVE_DYNAMIC_DISPLAY" ++/* ++ * REMOVE_DYNAMIC_DISPLAY: Remove a dynamic display, killing the server ++ * and purging the display configuration ++ * Supported since: 2.8.0.0 ++ * Arguments: ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 100 = Not authenticated ++ * 200 = Dynamic Displays not allowed ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_ATTACHED_SERVERS "ATTACHED_SERVERS" /* None */ ++#define GDM_SUP_CONSOLE_SERVERS "CONSOLE_SERVERS" /* None */ ++/* ATTACHED_SERVERS: List all attached displays. Doesn't list XDMCP ++ * and xnest non-attached displays. ++ * Note: This command used to be named CONSOLE_SERVERS, ++ * which is still recognized for backwards ++ * compatibility. The optional pattern argument ++ * is supported as of version 2.8.0.0. ++ * Supported since: 2.2.4.0 ++ * Arguments: (optional) ++ * With no argument, all dynamic displays are returned. The optional ++ * is a string that may contain glob characters '*', '?', and ++ * '[]'. Only displays that match the pattern will be returned. ++ * Answers: ++ * OK ;;... ++ * ++ * is ,, ++ * ++ * can be empty in case no one logged in yet, ++ * and can be -1 if it's not known or not supported (on non-Linux ++ * for example). If the display is an xnest display and is an attached one ++ * (that is, it is an xnest inside another attached display) it is listed ++ * and instead of vt, it lists the parent display in standard form. ++ * ++ * ERROR ++ * 1 = Not implemented ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_ALL_SERVERS "ALL_SERVERS" /* None */ ++/* ALL_SERVERS: List all displays, including attached, remote, xnest. ++ * This can for example be useful to figure out if ++ * the display you are on is managed by the gdm daemon, ++ * by seeing if it is in the list. It is also somewhat ++ * like the 'w' command but for graphical sessions. ++ * Supported since: 2.4.2.96 ++ * Arguments: None ++ * Answers: ++ * OK ;;... ++ * ++ * is , ++ * ++ * can be empty in case no one logged in yet ++ * ++ * ERROR ++ * 0 = Not implemented ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_GET_SERVER_LIST "GET_SERVER_LIST" /* None */ ++/* GET_SERVER_LIST: Get a list of the server sections from ++ * the configuration file. ++ * Supported since: 2.13.0.4 ++ * Arguments: None ++ * Answers: ++ * OK ;;... ++ * ERROR ++ * 0 = Not implemented ++ * 1 = No servers found ++ * 50 = Unsupported key ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_GET_SERVER_DETAILS "GET_SERVER_DETAILS" /* */ ++/* GET_SERVER_DETAILS: Get detail information for a specific server. ++ * Supported since: 2.13.0.4 ++ * Arguments: ++ * Key values include: ++ * ID - Returns the server id ++ * NAME - Returns the server name ++ * COMMAND - Returns the server command ++ * FLEXIBLE - Returns "true" if flexible, "false" otherwise ++ * CHOOSABLE - Returns "true" if choosable, "false" otherwise ++ * HANDLED - Returns "true" if handled, "false" otherwise ++ * CHOOSER - Returns "true" if chooser, "false" otherwise ++ * PRIORITY - Returns process priority ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 1 = Server not found ++ * 2 = Key not valid ++ * 50 = Unsupported key ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_GET_CONFIG "GET_CONFIG" /* */ ++/* GET_CONFIG: Get configuration value for key. Useful so ++ * that other applications can request configuration ++ * information from GDM. Any key defined as GDM_KEY_* ++ * in gdm.h is * supported. Starting with version 2.13.0.2 ++ * translated keys (such as "greeter/GdmWelcome[cs]" are ++ * supported via GET_CONFIG. Also starting with version ++ * 2.13.0.2 it is no longer necessary to include the ++ * default value (i.e. you can use key "greeter/IncludeAll" ++ * instead of having to use "greeter/IncludeAll=false". ++ * Supported since: 2.6.0.9 ++ * Arguments: ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 50 = Unsupported key ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_GET_CONFIG_FILE "GET_CONFIG_FILE" /* None */ ++/* GET_CONFIG_FILE: Get config file location being used by ++ # the daemon. If the GDM daemon was started ++ * with the --config option, it will return ++ * the value passed in via that argument. ++ * Supported since: 2.8.0.2 ++ * Arguments: None ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_UPDATE_CONFIG "UPDATE_CONFIG" /* */ ++/* UPDATE_CONFIG: Tell the daemon to re-read a key from the ++ * GDM configuration file. Any user can request ++ * that values are re-read but the daemon will ++ * only do so if the file has been modified ++ * since GDM first read the file. Only users ++ * who can change the GDM configuration file ++ * (normally writable only by the root user) can ++ * actually modify the GDM configuration. This ++ * command is useful to cause the GDM to update ++ * itself to recognize a change made to the GDM ++ * configuration file by the root user. ++ * ++ * Starting with version 2.13.0.0, all GDM keys are ++ * supported except for the following: ++ * ++ * daemon/PidFile ++ * daemon/ConsoleNotify ++ * daemon/User ++ * daemon/Group ++ * daemon/LogDir ++ * daemon/ServAuthDir ++ * daemon/UserAuthDir ++ * daemon/UserAuthFile ++ * daemon/UserAuthFBDir ++ * ++ * GDM also supports the following Psuedokeys: ++ * ++ * xdmcp/PARAMETERS (2.3.90.2) updates the following: ++ * xdmcp/MaxPending ++ * xdmcp/MaxSessions ++ * xdmcp/MaxWait ++ * xdmcp/DisplaysPerHost ++ * xdmcp/HonorIndirect ++ * xdmcp/MaxPendingIndirect ++ * xdmcp/MaxWaitIndirect ++ * xdmcp/PingIntervalSeconds (only affects new connections) ++ * ++ * xservers/PARAMETERS (2.13.0.4) updates the following: ++ * all [server-foo] sections. ++ * ++ * Supported keys for previous versions of GDM: ++ * ++ * security/AllowRoot (2.3.90.2) ++ * security/AllowRemoteRoot (2.3.90.2) ++ * security/AllowRemoteAutoLogin (2.3.90.2) ++ * security/RetryDelay (2.3.90.2) ++ * security/DisallowTCP (2.4.2.0) ++ * daemon/Greeter (2.3.90.2) ++ * daemon/RemoteGreeter (2.3.90.2) ++ * xdmcp/Enable (2.3.90.2) ++ * xdmcp/Port (2.3.90.2) ++ * daemon/TimedLogin (2.3.90.3) ++ * daemon/TimedLoginEnable (2.3.90.3) ++ * daemon/TimedLoginDelay (2.3.90.3) ++ * greeter/SystemMenu (2.3.90.3) ++ * greeter/ConfigAvailable (2.3.90.3) ++ * greeter/ChooserButton (2.4.2.0) ++ * greeter/SoundOnLoginFile (2.5.90.0) ++ * daemon/AddGtkModules (2.5.90.0) ++ * daemon/GtkModulesList (2.5.90.0) ++ * Supported since: 2.3.90.2 ++ * Arguments: ++ * is just the base part of the key such as "security/AllowRemoteRoot" ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 50 = Unsupported key ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_GREETERPIDS "GREETERPIDS" /* None */ ++/* GREETERPIDS: List all greeter pids so that one can send HUP ++ * to them for config rereading. Of course one ++ * must be root to do that. ++ * Supported since: 2.3.90.2 ++ * Arguments: None ++ * Answers: ++ * OK ;;... ++ * ERROR ++ * 0 = Not implemented ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_QUERY_LOGOUT_ACTION "QUERY_LOGOUT_ACTION" /* None */ ++/* QUERY_LOGOUT_ACTION: Query which logout actions are possible ++ * Only supported on connections that passed ++ * AUTH_LOCAL. ++ * Supported since: 2.5.90.0 ++ * Answers: ++ * OK ;;... ++ * Where action is one of HALT, REBOOT or SUSPEND. An empty list ++ * can also be returned if no action is possible. A '!' is appended ++ * to an action if it was already set with SET_LOGOUT_ACTION or ++ * SET_SAFE_LOGOUT_ACTION. Note that SET_LOGOUT_ACTION has precedence ++ * over SET_SAFE_LOGOUT_ACTION. ++ * ERROR ++ * 0 = Not implemented ++ * 100 = Not authenticated ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_SET_LOGOUT_ACTION "SET_LOGOUT_ACTION" /* */ ++/* SET_LOGOUT_ACTION: Tell the daemon to halt/restart/suspend after ++ * slave process exits. Only supported on ++ * connections that passed AUTH_LOCAL. ++ * Supported since: 2.5.90.0 ++ * Arguments: ++ * NONE Set exit action to 'none' ++ * HALT Set exit action to 'halt' ++ * REBOOT Set exit action to 'reboot' ++ * SUSPEND Set exit action to 'suspend' ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 7 = Unknown logout action, or not available ++ * 100 = Not authenticated ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_SET_SAFE_LOGOUT_ACTION "SET_SAFE_LOGOUT_ACTION" /* */ ++/* SET_SAFE_LOGOUT_ACTION: Tell the daemon to halt/restart/suspend ++ * after everybody logs out. If only one ++ * person logs out, then this is obviously ++ * the same as the SET_LOGOUT_ACTION. Note ++ * that SET_LOGOUT_ACTION has precendence ++ * over SET_SAFE_LOGOUT_ACTION if it is set ++ * to something other then NONE. If no one ++ * is logged in, then the action takes effect ++ * immedeately. Only supported on connections ++ * that passed AUTH_LOCAL. ++ * Supported since: 2.5.90.0 ++ * Arguments: ++ * NONE Set exit action to 'none' ++ * HALT Set exit action to 'halt' ++ * REBOOT Set exit action to 'reboot' ++ * SUSPEND Set exit action to 'suspend' ++ * ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 7 = Unknown logout action, or not available ++ * 100 = Not authenticated ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_LOGOUT_ACTION_NONE "NONE" ++#define GDM_SUP_LOGOUT_ACTION_HALT "HALT" ++#define GDM_SUP_LOGOUT_ACTION_REBOOT "REBOOT" ++#define GDM_SUP_LOGOUT_ACTION_SUSPEND "SUSPEND" ++/* ++ */ ++#define GDM_SUP_QUERY_VT "QUERY_VT" /* None */ ++/* QUERY_VT: Ask the daemon about which VT we are currently on. ++ * This is useful for logins which don't own ++ * /dev/console but are still console logins. Only ++ * supported on Linux currently, other places will ++ * just get ERROR 8. This is also the way to query ++ * if VT support is available in the daemon in the ++ * first place. Only supported on connections that ++ * passed AUTH_LOCAL. ++ * Supported since: 2.5.90.0 ++ * Arguments: None ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 8 = Virtual terminals not supported ++ * 100 = Not authenticated ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_SET_VT "SET_VT" /* */ ++/* SET_VT: Change to the specified virtual terminal. ++ * This is useful for logins which don't own /dev/console ++ * but are still console logins. Only supported on Linux ++ * currently, other places will just get ERROR 8. ++ * Only supported on connections that passed AUTH_LOCAL. ++ * Supported since: 2.5.90.0 ++ * Arguments: None ++ * Answers: ++ * OK ++ * ERROR ++ * 0 = Not implemented ++ * 8 = Virtual terminals not supported ++ * 9 = Invalid virtual terminal number ++ * 100 = Not authenticated ++ * 200 = Too many messages ++ * 999 = Unknown error ++ */ ++#define GDM_SUP_CLOSE "CLOSE" /* None */ ++/* CLOSE: Close sockets connection ++ * Supported since: 2.2.4.0 ++ * Arguments: None ++ * Answers: None ++ */ ++ ++/* User flags for the SUP protocol */ ++enum { ++ GDM_SUP_FLAG_AUTHENTICATED = 0x1, /* authenticated as a local user, ++ * from a local display we started */ ++ GDM_SUP_FLAG_AUTH_GLOBAL = 0x2 /* authenticated with global cookie */ ++}; ++ ++/* Macros to check authentication level */ ++#define GDM_CONN_AUTHENTICATED(conn) \ ++ ((gdm_connection_get_user_flags (conn) & GDM_SUP_FLAG_AUTHENTICATED) || \ ++ (gdm_connection_get_user_flags (conn) & GDM_SUP_FLAG_AUTH_GLOBAL)) ++ ++#define GDM_CONN_AUTH_GLOBAL(conn) \ ++ (gdm_connection_get_user_flags (conn) & GDM_SUP_FLAG_AUTH_GLOBAL) ++ ++ ++#define NEVER_FAILS_seteuid(uid) \ ++ { int r = 0; \ ++ if (geteuid () != uid) \ ++ r = seteuid (uid); \ ++ if G_UNLIKELY (r != 0) \ ++ gdm_fail ("GDM file %s: line %d (%s): Cannot run seteuid to %d: %s", \ ++ __FILE__, \ ++ __LINE__, \ ++ __PRETTY_FUNCTION__, \ ++ (int)uid, \ ++ strerror (errno)); } ++#define NEVER_FAILS_setegid(gid) \ ++ { int r = 0; \ ++ if (getegid () != gid) \ ++ r = setegid (gid); \ ++ if G_UNLIKELY (r != 0) \ ++ gdm_fail ("GDM file %s: line %d (%s): Cannot run setegid to %d: %s", \ ++ __FILE__, \ ++ __LINE__, \ ++ __PRETTY_FUNCTION__, \ ++ (int)gid, \ ++ strerror (errno)); } ++ ++/* first goes to euid-root and then sets the egid and euid, to make sure ++ * this succeeds */ ++#define NEVER_FAILS_root_set_euid_egid(uid,gid) \ ++ { NEVER_FAILS_seteuid (0); \ ++ NEVER_FAILS_setegid (gid); \ ++ if (uid != 0) { NEVER_FAILS_seteuid (uid); } } ++ ++#endif /* GDM_H */ ++ ++/* EOF */ +diff -Nur gdm-2.13.0.5.orig/gui/greeter/greeter.c gdm-2.13.0.5/gui/greeter/greeter.c +--- gdm-2.13.0.5.orig/gui/greeter/greeter.c 2006-01-07 00:41:06.000000000 +0100 ++++ gdm-2.13.0.5/gui/greeter/greeter.c 2006-01-16 00:05:17.000000000 +0100 +@@ -69,6 +69,7 @@ + gboolean GdmHaltFound = FALSE; + gboolean GdmRebootFound = FALSE; + gboolean GdmSuspendFound = FALSE; ++gboolean GdmHibernateFound = FALSE; + gboolean GdmConfiguratorFound = FALSE; + + /* FIXME: hack */ +@@ -734,6 +735,7 @@ + gdm_config_reload_string (GDM_KEY_HALT) || + gdm_config_reload_string (GDM_KEY_REBOOT) || + gdm_config_reload_string (GDM_KEY_SUSPEND) || ++ gdm_config_reload_string (GDM_KEY_HIBERNATE) || + gdm_config_reload_string (GDM_KEY_CONFIGURATOR) || + gdm_config_reload_string (GDM_KEY_INFO_MSG_FILE) || + gdm_config_reload_string (GDM_KEY_INFO_MSG_FONT) || +@@ -1067,6 +1069,7 @@ + GdmHaltFound = gdm_working_command_exists (gdm_config_get_string (GDM_KEY_HALT)); + GdmRebootFound = gdm_working_command_exists (gdm_config_get_string (GDM_KEY_REBOOT)); + GdmSuspendFound = gdm_working_command_exists (gdm_config_get_string (GDM_KEY_SUSPEND)); ++ GdmHibernateFound = gdm_working_command_exists (gdm_config_get_string (GDM_KEY_HIBERNATE)); + GdmConfiguratorFound = gdm_working_command_exists (gdm_config_get_string (GDM_KEY_CONFIGURATOR)); + + +diff -Nur gdm-2.13.0.5.orig/gui/greeter/greeter_configuration.h gdm-2.13.0.5/gui/greeter/greeter_configuration.h +--- gdm-2.13.0.5.orig/gui/greeter/greeter_configuration.h 2005-04-19 04:57:56.000000000 +0200 ++++ gdm-2.13.0.5/gui/greeter/greeter_configuration.h 2006-01-15 23:59:14.000000000 +0100 +@@ -30,10 +30,12 @@ + extern gchar *GdmHalt; + extern gchar *GdmReboot; + extern gchar *GdmSuspend; ++extern gchar *GdmHibernate; + extern gchar *GdmConfigurator; + extern gboolean GdmHaltFound; + extern gboolean GdmRebootFound; + extern gboolean GdmSuspendFound; ++extern gboolean GdmHibernateFound; + extern gboolean GdmConfiguratorFound; + extern gchar *GdmSessionDir; + extern gchar *GdmDefaultSession; +diff -Nur gdm-2.13.0.5.orig/gui/greeter/greeter.c.orig gdm-2.13.0.5/gui/greeter/greeter.c.orig +--- gdm-2.13.0.5.orig/gui/greeter/greeter.c.orig 1970-01-01 01:00:00.000000000 +0100 ++++ gdm-2.13.0.5/gui/greeter/greeter.c.orig 2006-01-07 00:41:06.000000000 +0100 +@@ -0,0 +1,1348 @@ ++/* GDM - The GNOME Display Manager ++ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen ++ * ++ * This program is free software; you can redistribute 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 "config.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#if HAVE_PAM ++#include ++#define PW_ENTRY_SIZE PAM_MAX_RESP_SIZE ++#else ++#define PW_ENTRY_SIZE GDM_MAX_PASS ++#endif ++ ++#include ++#include ++#include ++#include ++ ++#include "vicious.h" ++ ++#include "gdm.h" ++#include "gdmwm.h" ++#include "gdmcommon.h" ++#include "gdmconfig.h" ++ ++#include "greeter.h" ++#include "greeter_configuration.h" ++#include "greeter_parser.h" ++#include "greeter_geometry.h" ++#include "greeter_item_clock.h" ++#include "greeter_item_pam.h" ++#include "greeter_item_ulist.h" ++#include "greeter_item_customlist.h" ++#include "greeter_item_capslock.h" ++#include "greeter_item_timed.h" ++#include "greeter_events.h" ++#include "greeter_action_language.h" ++#include "greeter_session.h" ++#include "greeter_system.h" ++ ++gboolean DOING_GDM_DEVELOPMENT = FALSE; ++ ++GtkWidget *window; ++GtkWidget *canvas; ++ ++gboolean GDM_IS_LOCAL = FALSE; ++static gboolean ignore_buttons = FALSE; ++gboolean GdmHaltFound = FALSE; ++gboolean GdmRebootFound = FALSE; ++gboolean GdmSuspendFound = FALSE; ++gboolean GdmConfiguratorFound = FALSE; ++ ++/* FIXME: hack */ ++GreeterItemInfo *welcome_string_info = NULL; ++ ++extern gboolean session_dir_whacked_out; ++extern gboolean require_quarter; ++extern gint gdm_timed_delay; ++ ++gboolean greeter_probably_login_prompt = FALSE; ++ ++void ++greeter_ignore_buttons (gboolean val) ++{ ++ ignore_buttons = val; ++} ++ ++/* If in random theme mode then grab a random theme from those selected */ ++static char * ++get_random_theme () ++{ ++ char **vec; ++ char *themes_list; ++ char *theme; ++ int size; ++ int i; ++ ++ themes_list = gdm_config_get_string (GDM_KEY_GRAPHICAL_THEMES); ++ ++ if (ve_string_empty (themes_list)) ++ return NULL; ++ ++ vec = g_strsplit (themes_list, GDM_DELIMITER_THEMES, -1); ++ if (vec == NULL) ++ return NULL; ++ ++ /* Get Number of elements in vector */ ++ for (size = 0; vec[size] != NULL; size++) {} ++ ++ /* Get Random Theme from list */ ++ srand (time (NULL)); ++ i = rand () % size; ++ theme = g_strdup (vec[i]); ++ g_strfreev (vec); ++ ++ return theme; ++} ++ ++static gboolean ++greeter_ctrl_handler (GIOChannel *source, ++ GIOCondition cond, ++ gint fd) ++{ ++ gchar buf[PIPE_SIZE]; ++ gsize len; ++ GtkWidget *dlg; ++ char *tmp; ++ char *session; ++ GreeterItemInfo *conversation_info; ++ static GnomeCanvasItem *disabled_cover = NULL; ++ gchar *language; ++ ++ /* If this is not incoming i/o then return */ ++ if (cond != G_IO_IN) ++ return TRUE; ++ ++ /* Read random garbage from i/o channel until STX is found */ ++ do { ++ g_io_channel_read_chars (source, buf, 1, &len, NULL); ++ ++ if (len != 1) ++ return TRUE; ++ } while (buf[0] && buf[0] != STX); ++ ++ /* Read opcode */ ++ g_io_channel_read_chars (source, buf, 1, &len, NULL); ++ ++ /* If opcode couldn't be read */ ++ if (len != 1) ++ return TRUE; ++ ++ /* Parse opcode */ ++ switch (buf[0]) { ++ case GDM_SETLOGIN: ++ /* somebody is trying to fool us this is the user that ++ * wants to log in, and well, we are the gullible kind */ ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); ++ buf[len-1] = '\0'; ++ ++ greeter_item_pam_set_user (buf); ++ greeter_item_ulist_enable (); ++ printf ("%c\n", STX); ++ fflush (stdout); ++ break; ++ ++ case GDM_PROMPT: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); ++ buf[len-1] = '\0'; ++ ++ tmp = ve_locale_to_utf8 (buf); ++ if (tmp != NULL && strcmp (tmp, _("Username:")) == 0) { ++ gdm_common_login_sound (gdm_config_get_string (GDM_KEY_SOUND_PROGRAM), ++ gdm_config_get_string (GDM_KEY_SOUND_ON_LOGIN_FILE), ++ gdm_config_get_bool (GDM_KEY_SOUND_ON_LOGIN)); ++ greeter_probably_login_prompt = TRUE; ++ } else { ++ greeter_probably_login_prompt = FALSE; ++ } ++ greeter_ignore_buttons (FALSE); ++ greeter_item_pam_prompt (tmp, PW_ENTRY_SIZE, TRUE); ++ g_free (tmp); ++ break; ++ ++ case GDM_NOECHO: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); ++ buf[len-1] = '\0'; ++ tmp = ve_locale_to_utf8 (buf); ++ ++ if (tmp != NULL && strcmp (tmp, _("Password:")) == 0) ++ greeter_probably_login_prompt = FALSE; ++ ++ greeter_ignore_buttons (FALSE); ++ greeter_item_pam_prompt (tmp, PW_ENTRY_SIZE, FALSE); ++ g_free (tmp); ++ break; ++ ++ case GDM_MSG: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); ++ buf[len-1] = '\0'; ++ tmp = ve_locale_to_utf8 (buf); ++ greeter_item_pam_message (tmp); ++ g_free (tmp); ++ printf ("%c\n", STX); ++ fflush (stdout); ++ break; ++ ++ case GDM_ERRBOX: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); ++ buf[len-1] = '\0'; ++ ++ tmp = ve_locale_to_utf8 (buf); ++ greeter_item_pam_error (tmp); ++ g_free (tmp); ++ ++ printf ("%c\n", STX); ++ fflush (stdout); ++ break; ++ ++ case GDM_ERRDLG: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); ++ buf[len-1] = '\0'; ++ ++ /* we should be now fine for focusing new windows */ ++ gdm_wm_focus_new_windows (TRUE); ++ ++ tmp = ve_locale_to_utf8 (buf); ++ dlg = ve_hig_dialog_new (NULL /* parent */, ++ GTK_DIALOG_MODAL /* flags */, ++ GTK_MESSAGE_ERROR, ++ GTK_BUTTONS_OK, ++ tmp, ++ ""); ++ g_free (tmp); ++ ++ gdm_wm_center_window (GTK_WINDOW (dlg)); ++ ++ gdm_wm_no_login_focus_push (); ++ gtk_dialog_run (GTK_DIALOG (dlg)); ++ gtk_widget_destroy (dlg); ++ gdm_wm_no_login_focus_pop (); ++ ++ printf ("%c\n", STX); ++ fflush (stdout); ++ break; ++ ++ case GDM_SESS: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ buf[len-1] = '\0'; ++ ++ tmp = ve_locale_to_utf8 (buf); ++ session = greeter_session_lookup (tmp); ++ g_free (tmp); ++ ++ if (greeter_save_session () == GTK_RESPONSE_CANCEL) { ++ printf ("%c%s\n", STX, GDM_RESPONSE_CANCEL); ++ } else { ++ tmp = ve_locale_from_utf8 (session); ++ printf ("%c%s\n", STX, tmp); ++ g_free (tmp); ++ } ++ fflush (stdout); ++ g_free (session); ++ break; ++ ++ case GDM_LANG: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ buf[len-1] = '\0'; ++ language = greeter_language_get_language (buf); ++ if (greeter_language_get_save_language () == GTK_RESPONSE_CANCEL) ++ printf ("%c%s\n", STX, GDM_RESPONSE_CANCEL); ++ else ++ printf ("%c%s\n", STX, language); ++ fflush (stdout); ++ g_free (language); ++ break; ++ ++ case GDM_SSESS: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ ++ if (greeter_save_session () == GTK_RESPONSE_YES) ++ printf ("%cY\n", STX); ++ else ++ printf ("%c\n", STX); ++ fflush (stdout); ++ ++ break; ++ ++ case GDM_SLANG: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ ++ if (greeter_language_get_save_language () == GTK_RESPONSE_YES) ++ printf ("%cY\n", STX); ++ else ++ printf ("%c\n", STX); ++ fflush (stdout); ++ ++ break; ++ ++ case GDM_RESET: ++ /* fall thru to reset */ ++ ++ case GDM_RESETOK: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ buf[len-1] = '\0'; ++ ++ conversation_info = greeter_lookup_id ("pam-conversation"); ++ ++ if (conversation_info) ++ { ++ tmp = ve_locale_to_utf8 (buf); ++ g_object_set (G_OBJECT (conversation_info->item), ++ "text", tmp, ++ NULL); ++ g_free (tmp); ++ } ++ ++ printf ("%c\n", STX); ++ fflush (stdout); ++ greeter_ignore_buttons (FALSE); ++ break; ++ ++ case GDM_QUIT: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ ++ greeter_item_timed_stop (); ++ ++ if (require_quarter) { ++ /* we should be now fine for focusing new windows */ ++ gdm_wm_focus_new_windows (TRUE); ++ ++ dlg = ve_hig_dialog_new (NULL /* parent */, ++ GTK_DIALOG_MODAL /* flags */, ++ GTK_MESSAGE_INFO, ++ GTK_BUTTONS_OK, ++ /* translators: This is a nice and evil eggie text, translate ++ * to your favourite currency */ ++ _("Please insert 25 cents " ++ "to log in."), ++ ""); ++ gdm_wm_center_window (GTK_WINDOW (dlg)); ++ ++ gdm_wm_no_login_focus_push (); ++ gtk_dialog_run (GTK_DIALOG (dlg)); ++ gtk_widget_destroy (dlg); ++ gdm_wm_no_login_focus_pop (); ++ } ++ ++ greeter_item_pam_leftover_messages (); ++ ++ gdk_flush (); ++ ++ printf ("%c\n", STX); ++ fflush (stdout); ++ ++ /* screw gtk_main_quit, we want to make sure we definately die */ ++ _exit (EXIT_SUCCESS); ++ break; ++ ++ case GDM_STARTTIMER: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ ++ greeter_item_timed_start (); ++ ++ printf ("%c\n", STX); ++ fflush (stdout); ++ break; ++ ++ case GDM_STOPTIMER: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ ++ greeter_item_timed_stop (); ++ ++ printf ("%c\n", STX); ++ fflush (stdout); ++ break; ++ ++ case GDM_DISABLE: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ gtk_widget_set_sensitive (window, FALSE); ++ ++ if (disabled_cover == NULL) ++ { ++ disabled_cover = gnome_canvas_item_new ++ (gnome_canvas_root (GNOME_CANVAS (canvas)), ++ GNOME_TYPE_CANVAS_RECT, ++ "x1", 0.0, ++ "y1", 0.0, ++ "x2", (double)canvas->allocation.width, ++ "y2", (double)canvas->allocation.height, ++ "fill_color_rgba", (guint)0x00000088, ++ NULL); ++ } ++ ++ printf ("%c\n", STX); ++ fflush (stdout); ++ break; ++ ++ case GDM_ENABLE: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ gtk_widget_set_sensitive (window, TRUE); ++ ++ if (disabled_cover != NULL) ++ { ++ gtk_object_destroy (GTK_OBJECT (disabled_cover)); ++ disabled_cover = NULL; ++ } ++ ++ printf ("%c\n", STX); ++ fflush (stdout); ++ break; ++ ++ /* These are handled separately so ignore them here and send ++ * back a NULL response so that the daemon quits sending them */ ++ case GDM_NEEDPIC: ++ case GDM_READPIC: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ printf ("%c\n", STX); ++ fflush (stdout); ++ break; ++ ++ case GDM_NOFOCUS: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ ++ gdm_wm_no_login_focus_push (); ++ ++ printf ("%c\n", STX); ++ fflush (stdout); ++ break; ++ ++ case GDM_FOCUS: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ ++ gdm_wm_no_login_focus_pop (); ++ ++ printf ("%c\n", STX); ++ fflush (stdout); ++ break; ++ ++ case GDM_SAVEDIE: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ ++ /* Set busy cursor */ ++ gdm_common_setup_cursor (GDK_WATCH); ++ ++ gdm_wm_save_wm_order (); ++ ++ gdk_flush (); ++ ++ _exit (EXIT_SUCCESS); ++ ++ case GDM_QUERY_CAPSLOCK: ++ g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */ ++ ++ if (greeter_is_capslock_on ()) ++ printf ("%cY\n", STX); ++ else ++ printf ("%c\n", STX); ++ fflush (stdout); ++ ++ break; ++ ++ default: ++ gdm_common_abort ("Unexpected greeter command received: '%c'", buf[0]); ++ break; ++ } ++ ++ return (TRUE); ++} ++ ++static gboolean ++key_press_event (GtkWidget *widget, GdkEventKey *key, gpointer data) ++{ ++ if (DOING_GDM_DEVELOPMENT && (key->keyval == GDK_Escape)) ++ { ++ gtk_main_quit (); ++ ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ ++static void ++greeter_action_ok (GreeterItemInfo *info, ++ gpointer user_data) ++{ ++ if (ignore_buttons == FALSE) ++ { ++ GreeterItemInfo *entry_info = greeter_lookup_id ("user-pw-entry"); ++ if (entry_info && entry_info->item && ++ GNOME_IS_CANVAS_WIDGET (entry_info->item) && ++ GTK_IS_ENTRY (GNOME_CANVAS_WIDGET (entry_info->item)->widget)) ++ { ++ GtkWidget *entry; ++ entry = GNOME_CANVAS_WIDGET (entry_info->item)->widget; ++ greeter_ignore_buttons (TRUE); ++ greeter_item_pam_login (GTK_ENTRY (entry), entry_info); ++ } ++ } ++} ++ ++static void ++greeter_action_cancel (GreeterItemInfo *info, ++ gpointer user_data) ++{ ++ if (ignore_buttons == FALSE) ++ { ++ greeter_item_ulist_disable (); ++ greeter_ignore_buttons (TRUE); ++ printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_CANCEL); ++ fflush (stdout); ++ } ++} ++ ++static void ++greeter_setup_items (void) ++{ ++ greeter_item_clock_setup (); ++ greeter_item_pam_setup (); ++ ++ /* This will query the daemon for pictures through stdin/stdout! */ ++ greeter_item_ulist_setup (); ++ ++ greeter_item_capslock_setup (window); ++ greeter_item_timed_setup (); ++ greeter_item_register_action_callback ("ok_button", ++ greeter_action_ok, ++ window); ++ greeter_item_register_action_callback ("cancel_button", ++ greeter_action_cancel, ++ window); ++ greeter_item_register_action_callback ("language_button", ++ greeter_action_language, ++ window); ++ greeter_item_register_action_callback ("disconnect_button", ++ (ActionFunc)gtk_main_quit, ++ NULL); ++ greeter_item_system_setup (); ++ greeter_item_session_setup (); ++ ++ /* Setup the custom widgets */ ++ greeter_item_customlist_setup (); ++} ++ ++enum { ++ RESPONSE_RESTART, ++ RESPONSE_REBOOT, ++ RESPONSE_CLOSE ++}; ++ ++static int ++verify_gdm_version (void) ++{ ++ const char *gdm_version; ++ const char *gdm_protocol_version; ++ ++ gdm_version = g_getenv ("GDM_VERSION"); ++ gdm_protocol_version = g_getenv ("GDM_GREETER_PROTOCOL_VERSION"); ++ ++ if (! DOING_GDM_DEVELOPMENT && ++ ((gdm_protocol_version != NULL && ++ strcmp (gdm_protocol_version, GDM_GREETER_PROTOCOL_VERSION) != 0) || ++ (gdm_protocol_version == NULL && ++ (gdm_version == NULL || ++ strcmp (gdm_version, VERSION) != 0))) && ++ (g_getenv ("GDM_IS_LOCAL") != NULL)) ++ { ++ GtkWidget *dialog; ++ gchar *msg; ++ ++ gdm_wm_init (0); ++ gdm_wm_focus_new_windows (TRUE); ++ ++ msg = g_strdup_printf (_("The greeter version (%s) does not match the daemon " ++ "version. " ++ "You have probably just upgraded GDM. " ++ "Please restart the GDM daemon or the computer."), ++ VERSION); ++ ++ dialog = ve_hig_dialog_new (NULL /* parent */, ++ GTK_DIALOG_MODAL /* flags */, ++ GTK_MESSAGE_ERROR, ++ GTK_BUTTONS_OK, ++ _("Cannot start the greeter"), ++ msg); ++ g_free (msg); ++ ++ gtk_widget_show_all (dialog); ++ gdm_wm_center_window (GTK_WINDOW (dialog)); ++ ++ gdm_common_setup_cursor (GDK_LEFT_PTR); ++ ++ gtk_dialog_run (GTK_DIALOG (dialog)); ++ gtk_widget_destroy (dialog); ++ ++ return EXIT_SUCCESS; ++ } ++ ++ if (! DOING_GDM_DEVELOPMENT && ++ gdm_protocol_version == NULL && ++ gdm_version == NULL) ++ { ++ GtkWidget *dialog; ++ gchar *msg; ++ ++ gdm_wm_init (0); ++ gdm_wm_focus_new_windows (TRUE); ++ ++ msg = g_strdup_printf (_("The greeter version (%s) does not match the daemon " ++ "version. " ++ "You have probably just upgraded GDM. " ++ "Please restart the GDM daemon or the computer."), ++ VERSION); ++ ++ dialog = ve_hig_dialog_new (NULL /* parent */, ++ GTK_DIALOG_MODAL /* flags */, ++ GTK_MESSAGE_WARNING, ++ GTK_BUTTONS_NONE, ++ _("Cannot start the greeter"), ++ msg); ++ g_free (msg); ++ ++ gtk_dialog_add_buttons (GTK_DIALOG (dialog), ++ _("Reboot"), ++ RESPONSE_REBOOT, ++ GTK_STOCK_CLOSE, ++ RESPONSE_CLOSE, ++ NULL); ++ ++ gtk_widget_show_all (dialog); ++ gdm_wm_center_window (GTK_WINDOW (dialog)); ++ ++ gdm_common_setup_cursor (GDK_LEFT_PTR); ++ ++ switch (gtk_dialog_run (GTK_DIALOG (dialog))) ++ { ++ case RESPONSE_REBOOT: ++ gtk_widget_destroy (dialog); ++ return DISPLAY_REBOOT; ++ default: ++ gtk_widget_destroy (dialog); ++ return DISPLAY_ABORT; ++ } ++ } ++ ++ if (! DOING_GDM_DEVELOPMENT && ++ ((gdm_protocol_version != NULL && ++ strcmp (gdm_protocol_version, GDM_GREETER_PROTOCOL_VERSION) != 0) || ++ (gdm_protocol_version == NULL && ++ strcmp (gdm_version, VERSION) != 0))) ++ { ++ GtkWidget *dialog; ++ gchar *msg; ++ ++ gdm_wm_init (0); ++ gdm_wm_focus_new_windows (TRUE); ++ ++ msg = g_strdup_printf (_("The greeter version (%s) does not match the daemon " ++ "version (%s). " ++ "You have probably just upgraded GDM. " ++ "Please restart the GDM daemon or the computer."), ++ VERSION, gdm_version); ++ ++ dialog = ve_hig_dialog_new (NULL /* parent */, ++ GTK_DIALOG_MODAL /* flags */, ++ GTK_MESSAGE_WARNING, ++ GTK_BUTTONS_NONE, ++ _("Cannot start the greeter"), ++ msg); ++ g_free (msg); ++ ++ gtk_dialog_add_buttons (GTK_DIALOG (dialog), ++ _("Restart"), ++ RESPONSE_RESTART, ++ _("Reboot"), ++ RESPONSE_REBOOT, ++ GTK_STOCK_CLOSE, ++ RESPONSE_CLOSE, ++ NULL); ++ ++ ++ gtk_widget_show_all (dialog); ++ gdm_wm_center_window (GTK_WINDOW (dialog)); ++ ++ gtk_dialog_set_default_response (GTK_DIALOG (dialog), RESPONSE_RESTART); ++ ++ gdm_common_setup_cursor (GDK_LEFT_PTR); ++ ++ switch (gtk_dialog_run (GTK_DIALOG (dialog))) ++ { ++ case RESPONSE_RESTART: ++ gtk_widget_destroy (dialog); ++ return DISPLAY_RESTARTGDM; ++ case RESPONSE_REBOOT: ++ gtk_widget_destroy (dialog); ++ return DISPLAY_REBOOT; ++ default: ++ gtk_widget_destroy (dialog); ++ return DISPLAY_ABORT; ++ } ++ } ++ ++ return 0; ++} ++ ++static void ++gdm_set_welcomemsg (void) ++{ ++ char *welcomemsg = gdm_common_get_welcomemsg (); ++ ++ if (welcome_string_info->data.text.orig_text != NULL) ++ g_free (welcome_string_info->data.text.orig_text); ++ ++ welcome_string_info->data.text.orig_text = welcomemsg; ++ greeter_item_update_text (welcome_string_info); ++} ++ ++ ++static gboolean ++greeter_reread_config (int sig, gpointer data) ++{ ++ /* FIXME: The following is evil, we should update on the fly rather ++ * then just restarting */ ++ /* Also we may not need to check ALL those keys but just a few */ ++ if (gdm_config_reload_string (GDM_KEY_GRAPHICAL_THEME) || ++ gdm_config_reload_string (GDM_KEY_GRAPHICAL_THEME_DIR) || ++ gdm_config_reload_string (GDM_KEY_GTKRC) || ++ gdm_config_reload_string (GDM_KEY_GTK_THEME) || ++ gdm_config_reload_string (GDM_KEY_INCLUDE) || ++ gdm_config_reload_string (GDM_KEY_EXCLUDE) || ++ gdm_config_reload_string (GDM_KEY_SESSION_DESKTOP_DIR) || ++ gdm_config_reload_string (GDM_KEY_LOCALE_FILE) || ++ gdm_config_reload_string (GDM_KEY_HALT) || ++ gdm_config_reload_string (GDM_KEY_REBOOT) || ++ gdm_config_reload_string (GDM_KEY_SUSPEND) || ++ gdm_config_reload_string (GDM_KEY_CONFIGURATOR) || ++ gdm_config_reload_string (GDM_KEY_INFO_MSG_FILE) || ++ gdm_config_reload_string (GDM_KEY_INFO_MSG_FONT) || ++ gdm_config_reload_string (GDM_KEY_TIMED_LOGIN) || ++ gdm_config_reload_int (GDM_KEY_XINERAMA_SCREEN) || ++ gdm_config_reload_int (GDM_KEY_TIMED_LOGIN_DELAY) || ++ gdm_config_reload_bool (GDM_KEY_ENTRY_CIRCLES) || ++ gdm_config_reload_bool (GDM_KEY_ENTRY_INVISIBLE) || ++ gdm_config_reload_bool (GDM_KEY_SHOW_XTERM_FAILSAFE) || ++ gdm_config_reload_bool (GDM_KEY_SHOW_GNOME_FAILSAFE) || ++ gdm_config_reload_bool (GDM_KEY_INCLUDE_ALL) || ++ gdm_config_reload_bool (GDM_KEY_SYSTEM_MENU) || ++ gdm_config_reload_bool (GDM_KEY_CONFIG_AVAILABLE) || ++ gdm_config_reload_bool (GDM_KEY_CHOOSER_BUTTON) || ++ gdm_config_reload_bool (GDM_KEY_TIMED_LOGIN_ENABLE)) { ++ ++ /* Set busy cursor */ ++ gdm_common_setup_cursor (GDK_WATCH); ++ ++ gdm_wm_save_wm_order (); ++ ++ _exit (DISPLAY_RESTARTGREETER); ++ } ++ ++ gdm_config_reload_string (GDM_KEY_SOUND_PROGRAM); ++ gdm_config_reload_bool (GDM_KEY_SOUND_ON_LOGIN); ++ gdm_config_reload_bool (GDM_KEY_SOUND_ON_LOGIN_SUCCESS); ++ gdm_config_reload_bool (GDM_KEY_SOUND_ON_LOGIN_FAILURE); ++ gdm_config_reload_string (GDM_KEY_SOUND_ON_LOGIN_FILE); ++ gdm_config_reload_string (GDM_KEY_SOUND_ON_LOGIN_SUCCESS_FILE); ++ gdm_config_reload_string (GDM_KEY_SOUND_ON_LOGIN_FAILURE_FILE); ++ gdm_config_reload_string (GDM_KEY_USE_24_CLOCK); ++ ++ if (gdm_config_reload_string (GDM_KEY_WELCOME) || ++ gdm_config_reload_bool (GDM_KEY_DEFAULT_WELCOME) || ++ gdm_config_reload_string (GDM_KEY_REMOTE_WELCOME) || ++ gdm_config_reload_bool (GDM_KEY_DEFAULT_REMOTE_WELCOME)) { ++ ++ gdm_set_welcomemsg (); ++ ++ /* Set busy cursor */ ++ gdm_common_setup_cursor (GDK_WATCH); ++ ++ gdm_wm_save_wm_order (); ++ ++ _exit (DISPLAY_RESTARTGREETER); ++ } ++ ++ return TRUE; ++} ++ ++static void ++greeter_done (int sig) ++{ ++ _exit (EXIT_SUCCESS); ++} ++ ++ ++static char * ++get_theme_file (const char *in, char **theme_dir) ++{ ++ char *file, *dir, *info, *s; ++ ++ if (in == NULL) ++ in = "circles"; ++ ++ *theme_dir = NULL; ++ ++ if (g_path_is_absolute (in)) ++ { ++ dir = g_strdup (in); ++ } ++ else ++ { ++ dir = NULL; ++ if (DOING_GDM_DEVELOPMENT) ++ { ++ if (g_access (in, F_OK) == 0) ++ { ++ dir = g_strdup (in); ++ } ++ else ++ { ++ dir = g_build_filename ("themes", in, NULL); ++ if (g_access (dir, F_OK) != 0) ++ { ++ g_free (dir); ++ dir = NULL; ++ } ++ } ++ } ++ if (dir == NULL) ++ dir = g_build_filename (gdm_config_get_string (GDM_KEY_GRAPHICAL_THEME_DIR), in, NULL); ++ } ++ ++ *theme_dir = dir; ++ ++ info = g_build_filename (dir, "GdmGreeterTheme.desktop", NULL); ++ if (g_access (info, F_OK) != 0) { ++ g_free (info); ++ info = g_build_filename (dir, "GdmGreeterTheme.info", NULL); ++ } ++ if (g_access (info, F_OK) != 0) ++ { ++ char *base = g_path_get_basename (in); ++ /* just guess the name, we have no info about the theme at ++ * this point */ ++ g_free (info); ++ file = g_strdup_printf ("%s/%s.xml", dir, base); ++ g_free (base); ++ return file; ++ } ++ ++ s = gdm_get_theme_greeter (info, in); ++ file = g_build_filename (dir, s, NULL); ++ ++ g_free (info); ++ g_free (s); ++ ++ return file; ++} ++ ++/* The reaping stuff */ ++static time_t last_reap_delay = 0; ++ ++static gboolean ++delay_reaping (GSignalInvocationHint *ihint, ++ guint n_param_values, ++ const GValue *param_values, ++ gpointer data) ++{ ++ last_reap_delay = time (NULL); ++ return TRUE; ++} ++ ++static gboolean ++reap_flexiserver (gpointer data) ++{ ++ int reapminutes = gdm_config_get_int (GDM_KEY_FLEXI_REAP_DELAY_MINUTES); ++ ++ if (reapminutes > 0 && ++ ((time (NULL) - last_reap_delay) / 60) > reapminutes) { ++ _exit (DISPLAY_REMANAGE); ++ } ++ return TRUE; ++} ++ ++static gboolean ++gdm_event (GSignalInvocationHint *ihint, ++ guint n_param_values, ++ const GValue *param_values, ++ gpointer data) ++{ ++ GdkEvent *event; ++ ++ /* HAAAAAAAAAAAAAAAAACK */ ++ /* Since the user has not logged in yet and may have left/right ++ * mouse buttons switched, we just translate every right mouse click ++ * to a left mouse click */ ++ if (n_param_values != 2 || ++ !G_VALUE_HOLDS (¶m_values[1], GDK_TYPE_EVENT)) ++ return FALSE; ++ ++ event = g_value_get_boxed (¶m_values[1]); ++ if ((event->type == GDK_BUTTON_PRESS || ++ event->type == GDK_2BUTTON_PRESS || ++ event->type == GDK_3BUTTON_PRESS || ++ event->type == GDK_BUTTON_RELEASE) ++ && event->button.button == 3) ++ event->button.button = 1; ++ ++ /* Support Ctrl-U for blanking the username/password entry */ ++ if (event->type == GDK_KEY_PRESS && ++ (event->key.state & GDK_CONTROL_MASK) && ++ (event->key.keyval == GDK_u || ++ event->key.keyval == GDK_U)) { ++ ++ GreeterItemInfo *entry_info = greeter_lookup_id ("user-pw-entry"); ++ if (entry_info && entry_info->item && ++ GNOME_IS_CANVAS_WIDGET (entry_info->item) && ++ GTK_IS_ENTRY (GNOME_CANVAS_WIDGET (entry_info->item)->widget)) ++ { ++ GtkWidget *entry; ++ entry = GNOME_CANVAS_WIDGET (entry_info->item)->widget; ++ gtk_entry_set_text (GTK_ENTRY (entry), ""); ++ } ++ } ++ ++ return TRUE; ++} ++ ++int ++main (int argc, char *argv[]) ++{ ++ char *bg_color; ++ struct sigaction hup; ++ struct sigaction term; ++ sigset_t mask; ++ GIOChannel *ctrlch; ++ GError *error; ++ GreeterItemInfo *root; ++ const gchar *theme_name; ++ char *theme_file; ++ char *theme_dir; ++ gchar *gdm_graphical_theme; ++ const char *gdm_gtk_theme; ++ guint sid; ++ int r; ++ ++ if (g_getenv ("DOING_GDM_DEVELOPMENT") != NULL) ++ DOING_GDM_DEVELOPMENT = TRUE; ++ ++ openlog ("gdmgreeter", LOG_PID, LOG_DAEMON); ++ ++ bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); ++ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); ++ textdomain (GETTEXT_PACKAGE); ++ ++ setlocale (LC_ALL, ""); ++ ++ if (ve_string_empty (g_getenv ("GDM_IS_LOCAL"))) ++ GDM_IS_LOCAL = FALSE; ++ else ++ GDM_IS_LOCAL = TRUE; ++ ++ gtk_init (&argc, &argv); ++ ++ /* Should be a watch already, but anyway */ ++ gdm_common_setup_cursor (GDK_WATCH); ++ ++ if ( ! ve_string_empty (gdm_config_get_string (GDM_KEY_GTKRC))) ++ gtk_rc_parse (gdm_config_get_string (GDM_KEY_GTKRC)); ++ ++ gdm_gtk_theme = g_getenv ("GDM_GTK_THEME"); ++ if (ve_string_empty (gdm_gtk_theme)) ++ gdm_gtk_theme = gdm_config_get_string (GDM_KEY_GTK_THEME); ++ ++ if ( ! ve_string_empty (gdm_gtk_theme)) { ++ gdm_set_theme (gdm_gtk_theme); ++ } ++ ++ gdm_wm_screen_init (gdm_config_get_int (GDM_KEY_XINERAMA_SCREEN)); ++ ++ r = verify_gdm_version (); ++ if (r != 0) ++ return r; ++ ++ /* Load the background as early as possible so GDM does not leave */ ++ /* the background unfilled. The cursor should be a watch already */ ++ /* but just in case */ ++ bg_color = gdm_config_get_string (GDM_KEY_GRAPHICAL_THEME_COLOR); ++ /* If a graphical theme color does not exist fallback to the plain color */ ++ if (ve_string_empty (bg_color)) { ++ bg_color = gdm_config_get_string (GDM_KEY_BACKGROUND_COLOR); ++ } ++ gdm_common_setup_background_color (bg_color); ++ greeter_session_init (); ++ ++ ve_signal_add (SIGHUP, greeter_reread_config, NULL); ++ ++ hup.sa_handler = ve_signal_notify; ++ hup.sa_flags = 0; ++ sigemptyset (&hup.sa_mask); ++ sigaddset (&hup.sa_mask, SIGCHLD); ++ ++ if (sigaction (SIGHUP, &hup, NULL) < 0) ++ gdm_common_abort (_("%s: Error setting up %s signal handler: %s"), "main", "HUP", strerror (errno)); ++ ++ term.sa_handler = greeter_done; ++ term.sa_flags = 0; ++ sigemptyset (&term.sa_mask); ++ sigaddset (&term.sa_mask, SIGCHLD); ++ ++ if G_UNLIKELY (sigaction (SIGINT, &term, NULL) < 0) ++ gdm_common_abort (_("%s: Error setting up %s signal handler: %s"), "main", "INT", strerror (errno)); ++ ++ if G_UNLIKELY (sigaction (SIGTERM, &term, NULL) < 0) ++ gdm_common_abort (_("%s: Error setting up %s signal handler: %s"), "main", "TERM", strerror (errno)); ++ ++ sigemptyset (&mask); ++ sigaddset (&mask, SIGTERM); ++ sigaddset (&mask, SIGHUP); ++ sigaddset (&mask, SIGINT); ++ ++ if G_UNLIKELY (sigprocmask (SIG_UNBLOCK, &mask, NULL) == -1) ++ gdm_common_abort (_("Could not set signal mask!")); ++ ++ /* ignore SIGCHLD */ ++ sigemptyset (&mask); ++ sigaddset (&mask, SIGCHLD); ++ ++ if G_UNLIKELY (sigprocmask (SIG_BLOCK, &mask, NULL) == -1) ++ gdm_common_abort (_("Could not set signal mask!")); ++ ++ if G_LIKELY (! DOING_GDM_DEVELOPMENT) { ++ ctrlch = g_io_channel_unix_new (STDIN_FILENO); ++ g_io_channel_set_encoding (ctrlch, NULL, NULL); ++ g_io_channel_set_buffered (ctrlch, FALSE); ++ g_io_add_watch (ctrlch, ++ G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP | G_IO_NVAL, ++ (GIOFunc) greeter_ctrl_handler, ++ NULL); ++ g_io_channel_unref (ctrlch); ++ } ++ ++ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); ++ ++ if G_UNLIKELY (DOING_GDM_DEVELOPMENT) { ++ g_signal_connect (G_OBJECT (window), "key_press_event", ++ G_CALLBACK (key_press_event), NULL); ++ } ++ ++ canvas = gnome_canvas_new_aa (); ++ GTK_WIDGET_UNSET_FLAGS (canvas, GTK_CAN_FOCUS); ++ gnome_canvas_set_scroll_region (GNOME_CANVAS (canvas), ++ 0.0, 0.0, ++ (double) gdm_wm_screen.width, ++ (double) gdm_wm_screen.height); ++ gtk_window_set_decorated (GTK_WINDOW (window), FALSE); ++ gtk_window_set_default_size (GTK_WINDOW (window), ++ gdm_wm_screen.width, ++ gdm_wm_screen.height); ++ gtk_container_add (GTK_CONTAINER (window), canvas); ++ ++ /* ++ * Initialize the value with the default value so the first time it ++ * is displayed it doesn't show as 0. Also determine if the Halt, ++ * Reboot, Suspend and Configurator commands work. ++ */ ++ gdm_timed_delay = gdm_config_get_int (GDM_KEY_TIMED_LOGIN_DELAY); ++ GdmHaltFound = gdm_working_command_exists (gdm_config_get_string (GDM_KEY_HALT)); ++ GdmRebootFound = gdm_working_command_exists (gdm_config_get_string (GDM_KEY_REBOOT)); ++ GdmSuspendFound = gdm_working_command_exists (gdm_config_get_string (GDM_KEY_SUSPEND)); ++ GdmConfiguratorFound = gdm_working_command_exists (gdm_config_get_string (GDM_KEY_CONFIGURATOR)); ++ ++ ++ if (g_getenv ("GDM_THEME") != NULL) ++ gdm_graphical_theme = g_strdup (g_getenv ("GDM_THEME")); ++ else if (gdm_config_get_bool (GDM_KEY_GRAPHICAL_THEME_RAND)) ++ gdm_graphical_theme = get_random_theme (); ++ else ++ gdm_graphical_theme = gdm_config_get_string (GDM_KEY_GRAPHICAL_THEME); ++ ++ theme_file = get_theme_file (gdm_graphical_theme, &theme_dir); ++ ++ error = NULL; ++ root = greeter_parse (theme_file, theme_dir, ++ GNOME_CANVAS (canvas), ++ gdm_wm_screen.width, ++ gdm_wm_screen.height, ++ &error); ++ ++ if G_UNLIKELY (root == NULL) ++ { ++ GtkWidget *dialog; ++ char *s; ++ char *tmp; ++ ++ gdm_wm_init (0); ++ gdm_wm_focus_new_windows (TRUE); ++ ++ tmp = ve_filename_to_utf8 (ve_sure_string (gdm_graphical_theme)); ++ s = g_strdup_printf (_("There was an error loading the " ++ "theme %s"), tmp); ++ g_free (tmp); ++ dialog = ve_hig_dialog_new (NULL /* parent */, ++ GTK_DIALOG_MODAL /* flags */, ++ GTK_MESSAGE_ERROR, ++ GTK_BUTTONS_OK, ++ s, ++ (error && error->message) ? error->message : ""); ++ g_free (s); ++ ++ gtk_widget_show_all (dialog); ++ gdm_wm_center_window (GTK_WINDOW (dialog)); ++ ++ gdm_common_setup_cursor (GDK_LEFT_PTR); ++ ++ gtk_dialog_run (GTK_DIALOG (dialog)); ++ gtk_widget_destroy (dialog); ++ ++ if (DOING_GDM_DEVELOPMENT) ++ { ++ exit (1); ++ } ++ } ++ ++ if G_UNLIKELY (error) ++ g_clear_error (&error); ++ ++ /* Try circles.xml */ ++ if G_UNLIKELY (root == NULL) ++ { ++ g_free (theme_file); ++ g_free (theme_dir); ++ theme_file = get_theme_file ("circles", &theme_dir); ++ root = greeter_parse (theme_file, theme_dir, ++ GNOME_CANVAS (canvas), ++ gdm_wm_screen.width, ++ gdm_wm_screen.height, ++ NULL); ++ } ++ ++ if G_UNLIKELY (root != NULL && greeter_lookup_id ("user-pw-entry") == NULL) ++ { ++ GtkWidget *dialog; ++ ++ gdm_wm_init (0); ++ gdm_wm_focus_new_windows (TRUE); ++ ++ dialog = ve_hig_dialog_new (NULL /* parent */, ++ GTK_DIALOG_MODAL /* flags */, ++ GTK_MESSAGE_ERROR, ++ GTK_BUTTONS_OK, ++ _("The greeter theme is corrupt"), ++ _("The theme does not contain " ++ "definition for the username/password " ++ "entry element.")); ++ ++ gtk_widget_show_all (dialog); ++ gdm_wm_center_window (GTK_WINDOW (dialog)); ++ ++ gdm_common_setup_cursor (GDK_LEFT_PTR); ++ ++ gtk_dialog_run (GTK_DIALOG (dialog)); ++ gtk_widget_destroy (dialog); ++ ++ root = NULL; ++ } ++ ++ /* FIXME: beter information should be printed */ ++ if G_UNLIKELY (DOING_GDM_DEVELOPMENT && root == NULL) ++ { ++ g_warning ("No theme could be loaded"); ++ exit (1); ++ } ++ ++ if G_UNLIKELY (root == NULL) ++ { ++ GtkWidget *dialog; ++ ++ gdm_wm_init (0); ++ gdm_wm_focus_new_windows (TRUE); ++ ++ dialog = ve_hig_dialog_new (NULL /* parent */, ++ GTK_DIALOG_MODAL /* flags */, ++ GTK_MESSAGE_ERROR, ++ GTK_BUTTONS_OK, ++ _("There was an error loading the " ++ "theme, and the default theme " ++ "could not be loaded. " ++ "Attempting to start the " ++ "standard greeter"), ++ ""); ++ ++ gtk_widget_show_all (dialog); ++ gdm_wm_center_window (GTK_WINDOW (dialog)); ++ ++ gdm_common_setup_cursor (GDK_LEFT_PTR); ++ ++ gtk_dialog_run (GTK_DIALOG (dialog)); ++ gtk_widget_destroy (dialog); ++ ++ execl (EXPANDED_LIBEXECDIR "/gdmlogin", EXPANDED_LIBEXECDIR "/gdmlogin", NULL); ++ execlp ("gdmlogin", "gdmlogin", NULL); ++ ++ dialog = ve_hig_dialog_new (NULL /* parent */, ++ GTK_DIALOG_MODAL /* flags */, ++ GTK_MESSAGE_ERROR, ++ GTK_BUTTONS_OK, ++ _("The GTK+ greeter could not be started. " ++ "This display will abort and you may " ++ "have to login another way and fix the " ++ "installation of GDM"), ++ ""); ++ ++ gtk_widget_show_all (dialog); ++ gdm_wm_center_window (GTK_WINDOW (dialog)); ++ ++ gdm_common_setup_cursor (GDK_LEFT_PTR); ++ ++ gtk_dialog_run (GTK_DIALOG (dialog)); ++ gtk_widget_destroy (dialog); ++ ++ _exit (DISPLAY_ABORT); ++ } ++ ++ greeter_layout (root, GNOME_CANVAS (canvas)); ++ ++ greeter_setup_items (); ++ ++ gdm_setup_blinking (); ++ ++ gtk_widget_show_all (window); ++ gtk_window_move (GTK_WINDOW (window), gdm_wm_screen.x, gdm_wm_screen.y); ++ gtk_widget_show_now (window); ++ ++ /* can it ever happen that it'd be NULL here ??? */ ++ if G_UNLIKELY (window->window != NULL) ++ { ++ gdm_wm_init (GDK_WINDOW_XWINDOW (window->window)); ++ ++ /* Run the focus, note that this will work no matter what ++ * since gdm_wm_init will set the display to the gdk one ++ * if it fails */ ++ gdm_wm_focus_window (GDK_WINDOW_XWINDOW (window->window)); ++ } ++ ++ if G_UNLIKELY (session_dir_whacked_out) ++ { ++ GtkWidget *dialog; ++ ++ gdm_wm_focus_new_windows (TRUE); ++ ++ dialog = ve_hig_dialog_new (NULL /* parent */, ++ GTK_DIALOG_MODAL /* flags */, ++ GTK_MESSAGE_ERROR, ++ GTK_BUTTONS_OK, ++ _("Session directory is missing"), ++ _("Your session directory is missing or empty! " ++ "There are two available sessions you can use, but " ++ "you should log in and correct the gdm configuration.")); ++ gtk_widget_show_all (dialog); ++ gdm_wm_center_window (GTK_WINDOW (dialog)); ++ ++ gdm_common_setup_cursor (GDK_LEFT_PTR); ++ ++ gdm_wm_no_login_focus_push (); ++ gtk_dialog_run (GTK_DIALOG (dialog)); ++ gtk_widget_destroy (dialog); ++ gdm_wm_no_login_focus_pop (); ++ } ++ ++ if G_UNLIKELY (g_getenv ("GDM_WHACKED_GREETER_CONFIG") != NULL) ++ { ++ GtkWidget *dialog; ++ ++ gdm_wm_focus_new_windows (TRUE); ++ ++ dialog = ve_hig_dialog_new (NULL /* parent */, ++ GTK_DIALOG_MODAL /* flags */, ++ GTK_MESSAGE_ERROR, ++ GTK_BUTTONS_OK, ++ _("Configuration is not correct"), ++ _("The configuration file contains an invalid command " ++ "line for the login dialog, so running the " ++ "default command. Please fix your configuration.")); ++ ++ gtk_widget_show_all (dialog); ++ gdm_wm_center_window (GTK_WINDOW (dialog)); ++ ++ gdm_common_setup_cursor (GDK_LEFT_PTR); ++ ++ gdm_wm_no_login_focus_push (); ++ gtk_dialog_run (GTK_DIALOG (dialog)); ++ gtk_widget_destroy (dialog); ++ gdm_wm_no_login_focus_pop (); ++ } ++ ++ /* if a flexiserver, reap self after some time */ ++ if (gdm_config_get_int (GDM_KEY_FLEXI_REAP_DELAY_MINUTES) > 0 && ++ ! ve_string_empty (g_getenv ("GDM_FLEXI_SERVER")) && ++ /* but don't reap Xnest flexis */ ++ ve_string_empty (g_getenv ("GDM_PARENT_DISPLAY"))) ++ { ++ sid = g_signal_lookup ("activate", ++ GTK_TYPE_MENU_ITEM); ++ g_signal_add_emission_hook (sid, ++ 0 /* detail */, ++ delay_reaping, ++ NULL /* data */, ++ NULL /* destroy_notify */); ++ ++ sid = g_signal_lookup ("key_press_event", ++ GTK_TYPE_WIDGET); ++ g_signal_add_emission_hook (sid, ++ 0 /* detail */, ++ delay_reaping, ++ NULL /* data */, ++ NULL /* destroy_notify */); ++ ++ sid = g_signal_lookup ("button_press_event", ++ GTK_TYPE_WIDGET); ++ g_signal_add_emission_hook (sid, ++ 0 /* detail */, ++ delay_reaping, ++ NULL /* data */, ++ NULL /* destroy_notify */); ++ ++ last_reap_delay = time (NULL); ++ g_timeout_add (60*1000, reap_flexiserver, NULL); ++ } ++ ++ sid = g_signal_lookup ("event", ++ GTK_TYPE_WIDGET); ++ g_signal_add_emission_hook (sid, ++ 0 /* detail */, ++ gdm_event, ++ NULL /* data */, ++ NULL /* destroy_notify */); ++ ++ gdm_wm_restore_wm_order (); ++ ++ gdm_common_show_info_msg (gdm_config_get_string (GDM_KEY_INFO_MSG_FILE), ++ gdm_config_get_string (GDM_KEY_INFO_MSG_FONT)); ++ ++ gdm_common_setup_cursor (GDK_LEFT_PTR); ++ gdm_common_pre_fetch_launch (); ++ gtk_main (); ++ ++ return 0; ++} +diff -Nur gdm-2.13.0.5.orig/gui/greeter/greeter_item.c gdm-2.13.0.5/gui/greeter/greeter_item.c +--- gdm-2.13.0.5.orig/gui/greeter/greeter_item.c 2006-01-07 00:41:06.000000000 +0100 ++++ gdm-2.13.0.5/gui/greeter/greeter_item.c 2006-01-15 23:59:14.000000000 +0100 +@@ -213,6 +213,11 @@ + (info->show_type != NULL && + strcmp (info->show_type, "timed") == 0)) + return FALSE; ++ if (( ! sysmenu || ++ ! gdm_working_command_exists (gdm_config_get_string (GDM_KEY_HIBERNATE))) && ++ info->show_type != NULL && ++ strcmp (info->show_type, "hibernate") == 0) ++ return FALSE; + + return TRUE; + } +diff -Nur gdm-2.13.0.5.orig/gui/greeter/greeter_item.c.orig gdm-2.13.0.5/gui/greeter/greeter_item.c.orig +--- gdm-2.13.0.5.orig/gui/greeter/greeter_item.c.orig 1970-01-01 01:00:00.000000000 +0100 ++++ gdm-2.13.0.5/gui/greeter/greeter_item.c.orig 2006-01-07 00:41:06.000000000 +0100 +@@ -0,0 +1,218 @@ ++/* GDM - The GNOME Display Manager ++ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen ++ * ++ * This program is free software; you can redistribute 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 "config.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "gdm.h" ++#include "gdmconfig.h" ++#include "gdmcommon.h" ++#include "misc.h" ++ ++#include "greeter_item.h" ++#include "greeter_configuration.h" ++ ++extern gboolean GdmHaltFound; ++extern gboolean GdmRebootFound; ++extern gboolean GdmSuspendFound; ++extern gboolean GdmConfiguratorFound; ++ ++GreeterItemInfo * ++greeter_item_info_new (GreeterItemInfo *parent, ++ GreeterItemType type) ++{ ++ GreeterItemInfo *info; ++ int i; ++ ++ info = g_new0 (GreeterItemInfo, 1); ++ ++ info->item_type = type; ++ info->parent = parent; ++ ++ info->anchor = GTK_ANCHOR_NW; ++ info->x_type = GREETER_ITEM_POS_UNSET; ++ info->y_type = GREETER_ITEM_POS_UNSET; ++ info->width_type = GREETER_ITEM_SIZE_UNSET; ++ info->height_type = GREETER_ITEM_SIZE_UNSET; ++ ++ if (type != GREETER_ITEM_TYPE_LIST) ++ { ++ for (i=0; i< GREETER_ITEM_STATE_MAX; i++) ++ { ++ /* these happen to coincide for all ++ items but list */ ++ info->data.rect.alphas[i] = 0xff; ++ } ++ } ++ ++ info->box_orientation = GTK_ORIENTATION_VERTICAL; ++ ++ info->state = GREETER_ITEM_STATE_NORMAL; ++ info->base_state = GREETER_ITEM_STATE_NORMAL; ++ ++ info->show_modes = GREETER_ITEM_SHOW_EVERYWHERE; ++ ++ info->button = FALSE; ++ ++ if (GREETER_ITEM_TYPE_IS_TEXT (info)) ++ { ++ info->data.text.max_width = 0xffff; ++ info->data.text.max_screen_percent_width = 90; ++ info->data.text.real_max_width = 0; ++ } ++ ++ return info; ++} ++ ++void ++greeter_item_info_free (GreeterItemInfo *info) ++{ ++ int i; ++ GList *list; ++ ++ for (i = 0; i < GREETER_ITEM_STATE_MAX; i++) ++ { ++ if (GREETER_ITEM_TYPE_IS_PIXMAP (info)) ++ { ++ if (info->data.pixmap.pixbufs[i] != NULL) ++ g_object_unref (G_OBJECT (info->data.pixmap.pixbufs[i])); ++ if (info->data.pixmap.files[i] != NULL) ++ g_free (info->data.pixmap.files[i]); ++ } ++ else if (GREETER_ITEM_TYPE_IS_TEXT (info)) ++ { ++ if (info->data.text.fonts[i] != NULL) ++ pango_font_description_free (info->data.text.fonts[i]); ++ } ++ } ++ ++ list = info->fixed_children; ++ info->fixed_children = NULL; ++ g_list_foreach (list, (GFunc) greeter_item_info_free, NULL); ++ g_list_free (list); ++ ++ list = info->box_children; ++ info->box_children = NULL; ++ g_list_foreach (list, (GFunc) greeter_item_info_free, NULL); ++ g_list_free (list); ++ ++ if (GREETER_ITEM_TYPE_IS_TEXT (info)) ++ g_free (info->data.text.orig_text); ++ ++ /* FIXME: what about custom list items! */ ++ ++ g_free (info->id); ++ g_free (info->show_type); ++ ++ memset (info, 0, sizeof (GreeterItemInfo)); ++ g_free (info); ++} ++ ++void ++greeter_item_update_text (GreeterItemInfo *info) ++{ ++ char *text; ++ if (info && info->item && ++ GNOME_IS_CANVAS_TEXT (info->item) && ++ GREETER_ITEM_TYPE_IS_TEXT (info)) ++ { ++ text = gdm_common_expand_text (info->data.text.orig_text); ++ ++ g_object_set (G_OBJECT (info->item), ++ "markup", text, ++ NULL); ++ ++ g_free (text); ++ } ++ ++} ++ ++gboolean ++greeter_item_is_visible (GreeterItemInfo *info) ++{ ++ static gboolean checked = FALSE; ++ static gboolean GDM_IS_LOCAL = FALSE; ++ static gboolean GDM_FLEXI_SERVER = FALSE; ++ gboolean sysmenu = FALSE; ++ ++ if ( ! checked) ++ { ++ if (g_getenv ("GDM_IS_LOCAL") != NULL) ++ GDM_IS_LOCAL = TRUE; ++ if (g_getenv ("GDM_FLEXI_SERVER") != NULL) ++ GDM_FLEXI_SERVER = TRUE; ++ } ++ ++ if (GDM_IS_LOCAL && ! GDM_FLEXI_SERVER && ++ ! (info->show_modes & GREETER_ITEM_SHOW_CONSOLE_FIXED)) ++ return FALSE; ++ if (GDM_IS_LOCAL && GDM_FLEXI_SERVER && ++ ! (info->show_modes & GREETER_ITEM_SHOW_CONSOLE_FLEXI)) ++ return FALSE; ++ if ( ! GDM_IS_LOCAL && GDM_FLEXI_SERVER && ++ ! (info->show_modes & GREETER_ITEM_SHOW_REMOTE_FLEXI)) ++ return FALSE; ++ if ( ! GDM_IS_LOCAL && ! GDM_FLEXI_SERVER && ++ ! (info->show_modes & GREETER_ITEM_SHOW_REMOTE)) ++ return FALSE; ++ ++ sysmenu = gdm_config_get_bool (GDM_KEY_SYSTEM_MENU); ++ ++ if (( ! gdm_config_get_bool (GDM_KEY_CONFIG_AVAILABLE) || ++ ! sysmenu || ++ ! GdmConfiguratorFound) && ++ (info->show_type != NULL && ++ strcmp (info->show_type, "config") == 0)) ++ return FALSE; ++ ++ if (( ! gdm_config_get_bool (GDM_KEY_CHOOSER_BUTTON) || ! sysmenu) && ++ (info->show_type != NULL && ++ strcmp (info->show_type, "chooser") == 0)) ++ return FALSE; ++ ++ if ( ! sysmenu && info->show_type != NULL && ++ strcmp (info->show_type, "system") == 0) ++ return FALSE; ++ ++ if (( ! sysmenu || ! GdmHaltFound) && ++ (info->show_type != NULL && ++ strcmp (info->show_type, "halt") == 0)) ++ return FALSE; ++ if (( ! sysmenu || ! GdmRebootFound) && ++ (info->show_type != NULL && ++ strcmp (info->show_type, "reboot") == 0)) ++ return FALSE; ++ if (( ! sysmenu || ! GdmSuspendFound) && ++ (info->show_type != NULL && ++ strcmp (info->show_type, "suspend") == 0)) ++ return FALSE; ++ ++ if (( ! gdm_config_get_bool (GDM_KEY_TIMED_LOGIN_ENABLE) || ++ ve_string_empty (gdm_config_get_string (GDM_KEY_TIMED_LOGIN))) && ++ (info->show_type != NULL && ++ strcmp (info->show_type, "timed") == 0)) ++ return FALSE; ++ ++ return TRUE; ++} +diff -Nur gdm-2.13.0.5.orig/gui/greeter/greeter_system.c gdm-2.13.0.5/gui/greeter/greeter_system.c +--- gdm-2.13.0.5.orig/gui/greeter/greeter_system.c 2006-01-12 03:53:40.000000000 +0100 ++++ gdm-2.13.0.5/gui/greeter/greeter_system.c 2006-01-16 00:02:31.000000000 +0100 +@@ -38,6 +38,7 @@ + extern gboolean GdmHaltFound; + extern gboolean GdmRebootFound; + extern gboolean GdmSuspendFound; ++extern gboolean GdmHibernateFound; + extern gboolean GdmConfiguratorFound; + + /* doesn't check for executability, just for existance */ +@@ -96,6 +97,17 @@ + } + + static void ++query_greeter_hibernate_handler (void) ++{ ++ if (gdm_common_warn (_("Are you sure you want to hibernate the computer?"), "", ++ _("_Hibernate"), NULL, TRUE) == GTK_RESPONSE_YES) { ++ /* hibernate interruption */ ++ printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_HIBERNATE); ++ fflush (stdout); ++ } ++} ++ ++static void + greeter_restart_handler (void) + { + closelog (); +@@ -117,6 +129,15 @@ + fflush (stdout); + } + ++ ++static void ++greeter_hibernate_handler (void) ++{ ++ printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_HIBERNATE); ++ fflush (stdout); ++} ++ ++ + static void + greeter_config_handler (void) + { +@@ -177,7 +198,7 @@ + NULL); + } + +- if (GdmRebootFound || GdmHaltFound || GdmSuspendFound) { ++ if (GdmRebootFound || GdmHaltFound || GdmSuspendFound || GdmHibernateFound) { + sep = gtk_separator_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), sep); + gtk_widget_show (sep); +@@ -219,6 +240,18 @@ + _("Suspend your computer"), + NULL); + } ++ ++ if (GdmHibernateFound) { ++ w = gtk_menu_item_new_with_mnemonic (_("_Hibernate")); ++ gtk_menu_shell_append (GTK_MENU_SHELL (menu), w); ++ gtk_widget_show (GTK_WIDGET (w)); ++ g_signal_connect (G_OBJECT (w), "activate", ++ G_CALLBACK (query_greeter_hibernate_handler), ++ NULL); ++ gtk_tooltips_set_tip (tooltips, GTK_WIDGET (w), ++ _("Hibernate your computer"), ++ NULL); ++ } + } + + static gboolean +@@ -244,6 +277,7 @@ + GtkWidget *group_radio = NULL; + GtkWidget *halt_radio = NULL; + GtkWidget *suspend_radio = NULL; ++ GtkWidget *hibernate_radio = NULL; + GtkWidget *restart_radio = NULL; + GtkWidget *config_radio = NULL; + GtkWidget *chooser_radio = NULL; +@@ -346,6 +380,23 @@ + gtk_widget_show (suspend_radio); + } + ++ if (GdmHibernateFound) { ++ if (group_radio != NULL) ++ radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (group_radio)); ++ hibernate_radio = gtk_radio_button_new_with_mnemonic (radio_group, ++ _("_Hibernate the computer")); ++ group_radio = hibernate_radio; ++ gtk_tooltips_set_tip (tooltips, GTK_WIDGET (hibernate_radio), ++ _("Hibernate your computer"), ++ NULL); ++ g_signal_connect (G_OBJECT(hibernate_radio), "button_press_event", ++ G_CALLBACK(radio_button_press_event), NULL); ++ gtk_box_pack_start (GTK_BOX (vbox), ++ hibernate_radio, ++ FALSE, FALSE, 4); ++ gtk_widget_show (hibernate_radio); ++ } ++ + if (gdm_config_get_bool (GDM_KEY_CHOOSER_BUTTON)) { + if (group_radio != NULL) + radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (group_radio)); +@@ -414,6 +465,8 @@ + greeter_restart_handler (); + else if (suspend_radio != NULL && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (suspend_radio))) + greeter_suspend_handler (); ++ else if (hibernate_radio != NULL && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (hibernate_radio))) ++ greeter_hibernate_handler (); + else if (config_radio != NULL && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (config_radio))) + greeter_config_handler (); + else if (chooser_radio != NULL && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (chooser_radio))) +@@ -435,6 +488,9 @@ + greeter_item_register_action_callback ("suspend_button", + (ActionFunc)query_greeter_suspend_handler, + NULL); ++ greeter_item_register_action_callback ("hibernate_button", ++ (ActionFunc)query_greeter_hibernate_handler, ++ NULL); + greeter_item_register_action_callback ("system_button", + (ActionFunc)greeter_system_handler, + NULL); +diff -Nur gdm-2.13.0.5.orig/gui/greeter/greeter_system.c.orig gdm-2.13.0.5/gui/greeter/greeter_system.c.orig +--- gdm-2.13.0.5.orig/gui/greeter/greeter_system.c.orig 1970-01-01 01:00:00.000000000 +0100 ++++ gdm-2.13.0.5/gui/greeter/greeter_system.c.orig 2006-01-12 03:53:40.000000000 +0100 +@@ -0,0 +1,447 @@ ++/* GDM - The GNOME Display Manager ++ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen ++ * ++ * This program is free software; you can redistribute 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 "config.h" ++ ++#include ++#include ++ ++#include ++#include ++ ++#include "greeter.h" ++#include "greeter_configuration.h" ++#include "greeter_system.h" ++#include "greeter_item.h" ++#include "gdm.h" ++#include "gdmcommon.h" ++#include "gdmconfig.h" ++#include "gdmwm.h" ++#include "misc.h" ++ ++GtkWidget *dialog; ++extern gboolean GdmHaltFound; ++extern gboolean GdmRebootFound; ++extern gboolean GdmSuspendFound; ++extern gboolean GdmConfiguratorFound; ++ ++/* doesn't check for executability, just for existance */ ++static gboolean ++bin_exists (const char *command) ++{ ++ char *bin; ++ ++ if (ve_string_empty (command)) ++ return FALSE; ++ ++ /* Note, check only for existance, not for executability */ ++ bin = ve_first_word (command); ++ if (bin != NULL && ++ g_access (bin, F_OK) == 0) { ++ g_free (bin); ++ return TRUE; ++ } else { ++ g_free (bin); ++ return FALSE; ++ } ++} ++ ++static void ++query_greeter_restart_handler (void) ++{ ++ if (gdm_common_warn (_("Are you sure you want to restart the computer?"), "", ++ _("_Reboot"), NULL, TRUE) == GTK_RESPONSE_YES) { ++ closelog (); ++ ++ _exit (DISPLAY_REBOOT); ++ } ++} ++ ++ ++static void ++query_greeter_halt_handler (void) ++{ ++ if (gdm_common_warn (_("Are you sure you want to Shut Down the computer?"), "", ++ _("Shut _Down"), NULL, TRUE) == GTK_RESPONSE_YES) { ++ closelog (); ++ ++ _exit (DISPLAY_HALT); ++ } ++} ++ ++static void ++query_greeter_suspend_handler (void) ++{ ++ if (gdm_common_warn (_("Are you sure you want to suspend the computer?"), "", ++ _("_Suspend"), NULL, TRUE) == GTK_RESPONSE_YES) { ++ /* suspend interruption */ ++ printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_SUSPEND); ++ fflush (stdout); ++ } ++} ++ ++static void ++greeter_restart_handler (void) ++{ ++ closelog (); ++ _exit (DISPLAY_REBOOT); ++} ++ ++ ++static void ++greeter_halt_handler (void) ++{ ++ closelog (); ++ _exit (DISPLAY_HALT); ++} ++ ++static void ++greeter_suspend_handler (void) ++{ ++ printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_SUSPEND); ++ fflush (stdout); ++} ++ ++static void ++greeter_config_handler (void) ++{ ++ /* we should be now fine for focusing new windows */ ++ gdm_wm_focus_new_windows (TRUE); ++ ++ /* configure interruption */ ++ printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_CONFIGURE); ++ fflush (stdout); ++} ++ ++static void ++greeter_chooser_handler (void) ++{ ++ closelog (); ++ _exit (DISPLAY_RUN_CHOOSER); ++} ++ ++void ++greeter_system_append_system_menu (GtkWidget *menu) ++{ ++ GtkWidget *w, *sep; ++ static GtkTooltips *tooltips = NULL; ++ ++ /* should never be allowed by the UI */ ++ if ( ! gdm_config_get_bool (GDM_KEY_SYSTEM_MENU) || ++ ve_string_empty (g_getenv ("GDM_IS_LOCAL"))) ++ return; ++ ++ if (tooltips == NULL) ++ tooltips = gtk_tooltips_new (); ++ ++ if (gdm_config_get_bool (GDM_KEY_CHOOSER_BUTTON)) { ++ w = gtk_menu_item_new_with_mnemonic (_("_XDMCP Chooser...")); ++ gtk_menu_shell_append (GTK_MENU_SHELL (menu), w); ++ gtk_widget_show (GTK_WIDGET (w)); ++ g_signal_connect (G_OBJECT (w), "activate", ++ G_CALLBACK (greeter_chooser_handler), ++ NULL); ++ gtk_tooltips_set_tip (tooltips, GTK_WIDGET (w), ++ _("Run an XDMCP chooser which will allow " ++ "you to log into available remote " ++ "computers, if there are any."), ++ NULL); ++ } ++ ++ if (gdm_config_get_bool (GDM_KEY_CONFIG_AVAILABLE) && ++ bin_exists (gdm_config_get_string (GDM_KEY_CONFIGURATOR))) { ++ w = gtk_menu_item_new_with_mnemonic (_("_Configure Login Manager...")); ++ gtk_menu_shell_append (GTK_MENU_SHELL (menu), w); ++ gtk_widget_show (GTK_WIDGET (w)); ++ g_signal_connect (G_OBJECT (w), "activate", ++ G_CALLBACK (greeter_config_handler), ++ NULL); ++ gtk_tooltips_set_tip (tooltips, GTK_WIDGET (w), ++ _("Configure GDM (this login manager). " ++ "This will require the root password."), ++ NULL); ++ } ++ ++ if (GdmRebootFound || GdmHaltFound || GdmSuspendFound) { ++ sep = gtk_separator_menu_item_new (); ++ gtk_menu_shell_append (GTK_MENU_SHELL (menu), sep); ++ gtk_widget_show (sep); ++ } ++ ++ if (GdmRebootFound) { ++ w = gtk_menu_item_new_with_mnemonic (_("_Reboot")); ++ gtk_menu_shell_append (GTK_MENU_SHELL (menu), w); ++ gtk_widget_show (GTK_WIDGET (w)); ++ g_signal_connect (G_OBJECT (w), "activate", ++ G_CALLBACK (query_greeter_restart_handler), ++ NULL); ++ gtk_tooltips_set_tip (tooltips, GTK_WIDGET (w), ++ _("Reboot your computer"), ++ NULL); ++ } ++ ++ if (GdmHaltFound) { ++ w = gtk_menu_item_new_with_mnemonic (_("Shut _Down")); ++ gtk_menu_shell_append (GTK_MENU_SHELL (menu), w); ++ gtk_widget_show (GTK_WIDGET (w)); ++ g_signal_connect (G_OBJECT (w), "activate", ++ G_CALLBACK (query_greeter_halt_handler), ++ NULL); ++ gtk_tooltips_set_tip (tooltips, GTK_WIDGET (w), ++ _("Shut Down the system so that " ++ "you may safely turn off the computer."), ++ NULL); ++ } ++ ++ if (GdmSuspendFound) { ++ w = gtk_menu_item_new_with_mnemonic (_("Sus_pend")); ++ gtk_menu_shell_append (GTK_MENU_SHELL (menu), w); ++ gtk_widget_show (GTK_WIDGET (w)); ++ g_signal_connect (G_OBJECT (w), "activate", ++ G_CALLBACK (query_greeter_suspend_handler), ++ NULL); ++ gtk_tooltips_set_tip (tooltips, GTK_WIDGET (w), ++ _("Suspend your computer"), ++ NULL); ++ } ++} ++ ++static gboolean ++radio_button_press_event (GtkWidget *widget, ++ GdkEventButton *event, ++ gpointer data) ++{ ++ if (event->type == GDK_2BUTTON_PRESS) { ++ gtk_dialog_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK); ++ } ++ return FALSE; ++} ++ ++static void ++greeter_system_handler (GreeterItemInfo *info, ++ gpointer user_data) ++{ ++ GtkWidget *w = NULL; ++ GtkWidget *hbox = NULL; ++ GtkWidget *main_vbox = NULL; ++ GtkWidget *vbox = NULL; ++ GtkWidget *cat_vbox = NULL; ++ GtkWidget *group_radio = NULL; ++ GtkWidget *halt_radio = NULL; ++ GtkWidget *suspend_radio = NULL; ++ GtkWidget *restart_radio = NULL; ++ GtkWidget *config_radio = NULL; ++ GtkWidget *chooser_radio = NULL; ++ gchar *s; ++ int ret; ++ GSList *radio_group = NULL; ++ static GtkTooltips *tooltips = NULL; ++ ++ /* should never be allowed by the UI */ ++ if ( ! gdm_config_get_bool (GDM_KEY_SYSTEM_MENU) || ++ ve_string_empty (g_getenv ("GDM_IS_LOCAL"))) ++ return; ++ ++ dialog = gtk_dialog_new (); ++ if (tooltips == NULL) ++ tooltips = gtk_tooltips_new (); ++ gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); ++ gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); ++ gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); ++ ++ main_vbox = gtk_vbox_new (FALSE, 18); ++ gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 5); ++ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), ++ main_vbox, ++ FALSE, FALSE, 0); ++ ++ cat_vbox = gtk_vbox_new (FALSE, 6); ++ gtk_box_pack_start (GTK_BOX (main_vbox), ++ cat_vbox, ++ FALSE, FALSE, 0); ++ ++ s = g_strdup_printf ("%s", ++ _("Choose an Action")); ++ w = gtk_label_new (s); ++ gtk_label_set_use_markup (GTK_LABEL (w), TRUE); ++ g_free (s); ++ gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5); ++ gtk_box_pack_start (GTK_BOX (cat_vbox), w, FALSE, FALSE, 0); ++ ++ hbox = gtk_hbox_new (FALSE, 0); ++ gtk_box_pack_start (GTK_BOX (cat_vbox), ++ hbox, FALSE, FALSE, 0); ++ gtk_box_pack_start (GTK_BOX (hbox), ++ gtk_label_new (" "), ++ FALSE, FALSE, 0); ++ vbox = gtk_vbox_new (FALSE, 6); ++ gtk_box_pack_start (GTK_BOX (hbox), ++ vbox, ++ TRUE, TRUE, 0); ++ ++ if (GdmHaltFound) { ++ if (group_radio != NULL) ++ radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (group_radio)); ++ halt_radio = gtk_radio_button_new_with_mnemonic (radio_group, ++ _("Shut _down the computer")); ++ group_radio = halt_radio; ++ gtk_tooltips_set_tip (tooltips, GTK_WIDGET (halt_radio), ++ _("Shut Down your computer so that " ++ "you may turn it off."), ++ NULL); ++ g_signal_connect (G_OBJECT(halt_radio), "button_press_event", ++ G_CALLBACK(radio_button_press_event), NULL); ++ gtk_box_pack_start (GTK_BOX (vbox), ++ halt_radio, ++ FALSE, FALSE, 4); ++ gtk_widget_show (halt_radio); ++ } ++ ++ if (GdmRebootFound) { ++ if (group_radio != NULL) ++ radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (group_radio)); ++ restart_radio = gtk_radio_button_new_with_mnemonic (radio_group, ++ _("_Reboot the computer")); ++ group_radio = restart_radio; ++ gtk_tooltips_set_tip (tooltips, GTK_WIDGET (restart_radio), ++ _("Reboot your computer"), ++ NULL); ++ g_signal_connect (G_OBJECT(restart_radio), "button_press_event", ++ G_CALLBACK(radio_button_press_event), NULL); ++ gtk_box_pack_start (GTK_BOX (vbox), ++ restart_radio, ++ FALSE, FALSE, 4); ++ gtk_widget_show (restart_radio); ++ } ++ ++ if (GdmSuspendFound) { ++ if (group_radio != NULL) ++ radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (group_radio)); ++ suspend_radio = gtk_radio_button_new_with_mnemonic (radio_group, ++ _("Sus_pend the computer")); ++ group_radio = suspend_radio; ++ gtk_tooltips_set_tip (tooltips, GTK_WIDGET (suspend_radio), ++ _("Suspend your computer"), ++ NULL); ++ g_signal_connect (G_OBJECT(suspend_radio), "button_press_event", ++ G_CALLBACK(radio_button_press_event), NULL); ++ gtk_box_pack_start (GTK_BOX (vbox), ++ suspend_radio, ++ FALSE, FALSE, 4); ++ gtk_widget_show (suspend_radio); ++ } ++ ++ if (gdm_config_get_bool (GDM_KEY_CHOOSER_BUTTON)) { ++ if (group_radio != NULL) ++ radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (group_radio)); ++ chooser_radio = gtk_radio_button_new_with_mnemonic (radio_group, ++ _("Run _XDMCP chooser")); ++ group_radio = chooser_radio; ++ gtk_tooltips_set_tip (tooltips, GTK_WIDGET (chooser_radio), ++ _("Run an XDMCP chooser which will allow " ++ "you to log into available remote " ++ "computers, if there are any."), ++ NULL); ++ g_signal_connect (G_OBJECT(chooser_radio), "button_press_event", ++ G_CALLBACK(radio_button_press_event), NULL); ++ gtk_box_pack_start (GTK_BOX (vbox), ++ chooser_radio, ++ FALSE, FALSE, 4); ++ gtk_widget_show (chooser_radio); ++ } ++ ++ if (gdm_config_get_bool (GDM_KEY_CONFIG_AVAILABLE) && ++ bin_exists (gdm_config_get_string (GDM_KEY_CONFIGURATOR))) { ++ if (group_radio != NULL) ++ radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (group_radio)); ++ config_radio = gtk_radio_button_new_with_mnemonic (radio_group, ++ _("Confi_gure the login manager")); ++ group_radio = config_radio; ++ gtk_tooltips_set_tip (tooltips, GTK_WIDGET (config_radio), ++ _("Configure GDM (this login manager). " ++ "This will require the root password."), ++ NULL); ++ g_signal_connect (G_OBJECT(config_radio), "button_press_event", ++ G_CALLBACK(radio_button_press_event), NULL); ++ gtk_box_pack_start (GTK_BOX (vbox), ++ config_radio, ++ FALSE, FALSE, 4); ++ gtk_widget_show (config_radio); ++ } ++ ++ gtk_dialog_add_button (GTK_DIALOG (dialog), ++ GTK_STOCK_CANCEL, ++ GTK_RESPONSE_CANCEL); ++ ++ gtk_dialog_add_button (GTK_DIALOG (dialog), ++ GTK_STOCK_OK, ++ GTK_RESPONSE_OK); ++ ++ gtk_dialog_set_default_response (GTK_DIALOG (dialog), ++ GTK_RESPONSE_OK); ++ ++ gtk_widget_show_all (dialog); ++ gdm_wm_center_window (GTK_WINDOW (dialog)); ++ ++ gdm_wm_no_login_focus_push (); ++ ret = gtk_dialog_run (GTK_DIALOG (dialog)); ++ gdm_wm_no_login_focus_pop (); ++ ++ if (ret != GTK_RESPONSE_OK) ++ { ++ gtk_widget_destroy (dialog); ++ return; ++ } ++ ++ if (halt_radio != NULL && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (halt_radio))) ++ greeter_halt_handler (); ++ else if (restart_radio != NULL && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (restart_radio))) ++ greeter_restart_handler (); ++ else if (suspend_radio != NULL && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (suspend_radio))) ++ greeter_suspend_handler (); ++ else if (config_radio != NULL && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (config_radio))) ++ greeter_config_handler (); ++ else if (chooser_radio != NULL && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (chooser_radio))) ++ greeter_chooser_handler (); ++ ++ gtk_widget_destroy (dialog); ++} ++ ++ ++void ++greeter_item_system_setup (void) ++{ ++ greeter_item_register_action_callback ("reboot_button", ++ (ActionFunc)query_greeter_restart_handler, ++ NULL); ++ greeter_item_register_action_callback ("halt_button", ++ (ActionFunc)query_greeter_halt_handler, ++ NULL); ++ greeter_item_register_action_callback ("suspend_button", ++ (ActionFunc)query_greeter_suspend_handler, ++ NULL); ++ greeter_item_register_action_callback ("system_button", ++ (ActionFunc)greeter_system_handler, ++ NULL); ++ greeter_item_register_action_callback ("config_button", ++ (ActionFunc)greeter_config_handler, ++ NULL); ++ greeter_item_register_action_callback ("chooser_button", ++ (ActionFunc)greeter_chooser_handler, ++ NULL); ++} --- gdm-2.13.0.5.orig/debian/patches/14_xkeepscrashing_kbdmode.patch +++ gdm-2.13.0.5/debian/patches/14_xkeepscrashing_kbdmode.patch @@ -0,0 +1,18 @@ +--- config/XKeepsCrashing.orig 2005-09-20 17:13:36.886816597 -0700 ++++ config/XKeepsCrashing 2005-09-20 17:13:37.963423438 -0700 +@@ -38,6 +38,15 @@ + echo "$OUTPUT" + } + ++# X has a bad habit of not restoring the vt settings on exit. Make sure that ++# the keyboard is restored to xlate mode, since we're going to try to interact ++# with the user ++# (http://bugzilla.ubuntu.com/show_bug.cgi?id=6286) ++KBD_MODE=`gdmwhich kbd_mode` ++if test "x$KBD_MODE" != "x" ; then ++ kbd_mode -a ++fi ++ + MSG3=`gettextfunc "Failed to start the X server (your graphical interface). It is likely that it is not set up correctly. You will need to log in on a console and reconfigure the X server. Then restart GDM."` + MSG4=`gettextfunc "Would you like to try to configure the X server? Note that you will need the root password for this."` + MSG5=`gettextfunc "Please type in the root (privileged user) password."` --- gdm-2.13.0.5.orig/debian/patches/05_environment.patch +++ gdm-2.13.0.5/debian/patches/05_environment.patch @@ -0,0 +1,105 @@ +=== modified file 'daemon/slave.c' +--- daemon/slave.c ++++ daemon/slave.c +@@ -1711,7 +1711,6 @@ + g_setenv ("RUNNING_UNDER_GDM", "true", TRUE); + if ( ! ve_string_empty (display->theme_name)) + g_setenv ("GDM_GTK_THEME", display->theme_name, TRUE); +- g_unsetenv ("MAIL"); /* Unset $MAIL for broken shells */ + + closelog (); + +@@ -2438,9 +2437,10 @@ + + closelog (); + +- gdm_close_all_descriptors (2 /* from */, -1 /* except */, -1 /* except2 */); +- +- gdm_open_dev_null (O_RDWR); /* open stderr - fd 2 */ ++ /* ++ * Leave stderr open to the log ++ */ ++ gdm_close_all_descriptors (3 /* from */, -1 /* except */, -1 /* except2 */); + + openlog ("gdm", LOG_PID, LOG_DAEMON); + +@@ -2474,7 +2474,6 @@ + g_setenv ("GDM_GREETER_PROTOCOL_VERSION", + GDM_GREETER_PROTOCOL_VERSION, TRUE); + g_setenv ("GDM_VERSION", VERSION, TRUE); +- g_unsetenv ("MAIL"); /* Unset $MAIL for broken shells */ + + pwent = getpwnam (gdmuser); + if G_LIKELY (pwent != NULL) { +@@ -2908,10 +2907,9 @@ + closelog (); + + VE_IGNORE_EINTR (close (0)); +- gdm_close_all_descriptors (2 /* from */, -1 /* except */, -1 /* except2 */); ++ gdm_close_all_descriptors (3 /* from */, -1 /* except */, -1 /* except2 */); + + gdm_open_dev_null (O_RDONLY); /* open stdin - fd 0 */ +- gdm_open_dev_null (O_RDWR); /* open stderr - fd 2 */ + + openlog ("gdm", LOG_PID, LOG_DAEMON); + +@@ -2941,8 +2939,6 @@ + g_setenv ("USERNAME", gdmuser, TRUE); + + g_setenv ("GDM_VERSION", VERSION, TRUE); +- +- g_unsetenv ("MAIL"); /* Unset $MAIL for broken shells */ + + pwent = getpwnam (gdmuser); + if G_LIKELY (pwent != NULL) { +@@ -3388,7 +3384,6 @@ + g_setenv ("GDMSESSION", session, TRUE); + g_setenv ("DESKTOP_SESSION", session, TRUE); + g_setenv ("SHELL", pwent->pw_shell, TRUE); +- g_unsetenv ("MAIL"); /* Unset $MAIL for broken shells */ + + if (d->type == TYPE_STATIC) { + g_setenv ("GDM_XSERVER_LOCATION", "local", TRUE); +@@ -5096,7 +5091,6 @@ + g_setenv ("RUNNING_UNDER_GDM", "true", TRUE); + if ( ! ve_string_empty (d->theme_name)) + g_setenv ("GDM_GTK_THEME", d->theme_name, TRUE); +- g_unsetenv ("MAIL"); + argv = ve_split (script); + VE_IGNORE_EINTR (execv (argv[0], argv)); + syslog (LOG_ERR, _("%s: Failed starting: %s"), "gdm_slave_exec_script", +@@ -5235,7 +5229,6 @@ + g_setenv ("RUNNING_UNDER_GDM", "true", TRUE); + if ( ! ve_string_empty (d->theme_name)) + g_setenv ("GDM_GTK_THEME", d->theme_name, TRUE); +- g_unsetenv ("MAIL"); + + argv = ve_split (str->str); + VE_IGNORE_EINTR (execv (argv[0], argv)); + +=== modified file 'gui/gdmcommon.c' +--- gui/gdmcommon.c ++++ gui/gdmcommon.c +@@ -180,10 +180,6 @@ + { + guint sid; + +- if ( ! ve_string_empty (g_getenv ("GDM_IS_LOCAL")) && +- strncmp (ve_sure_string (g_getenv ("DISPLAY")), ":0", 2) == 0) +- return; +- + sid = g_signal_lookup ("activate", + GTK_TYPE_MENU_ITEM); + g_signal_add_emission_hook (sid, +@@ -216,10 +212,6 @@ + { + EntryBlink *eb; + GtkSettings *settings; +- +- if ( ! ve_string_empty (g_getenv ("GDM_IS_LOCAL")) && +- strncmp (ve_sure_string (g_getenv ("DISPLAY")), ":0", 2) == 0) +- return; + + eb = g_new0 (EntryBlink, 1); + + --- gdm-2.13.0.5.orig/debian/patches/10_noxkeepcrashing.patch +++ gdm-2.13.0.5/debian/patches/10_noxkeepcrashing.patch @@ -0,0 +1,49 @@ +=== modified file 'daemon/gdm.c' +--- daemon/gdm.c ++++ daemon/gdm.c +@@ -909,6 +909,12 @@ + d->sleep_before_run = 3; + } else if (d->x_faileds >= 3) { + gdm_debug ("gdm_child_action: dealing with X crashes"); ++ if (gdm_get_value_bool (GDM_KEY_NOXKEEPSCRASHING)) { ++ gdm_display_unmanage (d); ++ gdm_start_first_unborn_local (3 /* delay */); ++ break; ++ } ++ + if ( ! deal_with_x_crashes (d)) { + gdm_debug ("gdm_child_action: Aborting display"); + /* an original way to deal with these things: + +=== modified file 'daemon/gdm.h' +--- daemon/gdm.h ++++ daemon/gdm.h +@@ -311,6 +311,7 @@ + #define GDM_KEY_CONFIGURATOR "daemon/Configurator=" EXPANDED_SBINDIR "/gdmsetup --disable-sound --disable-crash-dialog" + #define GDM_KEY_CONFIG_AVAILABLE "greeter/ConfigAvailable=true" + #define GDM_KEY_CHOOSER_BUTTON "greeter/ChooserButton=true" ++#define GDM_KEY_NOXKEEPSCRASHING "daemon/NoXKeepsCrashing=false" + #define GDM_KEY_TITLE_BAR "greeter/TitleBar=true" + + /* + +=== modified file 'daemon/gdmconfig.c' +--- daemon/gdmconfig.c ++++ daemon/gdmconfig.c +@@ -159,6 +159,7 @@ + static gboolean GdmAutomaticLoginEnable = FALSE; + static gboolean GdmConfigAvailable = FALSE; + static gboolean GdmSystemMenu = FALSE; ++static gboolean GdmNoXKeepsCrashing = FALSE; + static gboolean GdmChooserButton = FALSE; + static gboolean GdmBrowser = FALSE; + static gboolean GdmAddGtkModules = FALSE; +@@ -359,6 +360,7 @@ + gdm_config_add_hash (GDM_KEY_CONFIG_AVAILABLE, &GdmConfigAvailable, &bool_type); + gdm_config_add_hash (GDM_KEY_SYSTEM_MENU, &GdmSystemMenu, &bool_type); + gdm_config_add_hash (GDM_KEY_CHOOSER_BUTTON, &GdmChooserButton, &bool_type); ++ gdm_config_add_hash (GDM_KEY_NOXKEEPSCRASHING, &GdmNoXKeepsCrashing, &bool_type); + gdm_config_add_hash (GDM_KEY_BROWSER, &GdmBrowser, &bool_type); + gdm_config_add_hash (GDM_KEY_MULTICAST, &GdmMulticast, &bool_type); + gdm_config_add_hash (GDM_KEY_NEVER_PLACE_COOKIES_ON_NFS, + --- gdm-2.13.0.5.orig/debian/patches/05_pam_user_unknown.patch +++ gdm-2.13.0.5/debian/patches/05_pam_user_unknown.patch @@ -0,0 +1,15 @@ +diff -Nur gdm-2.6.0.7.orig/daemon/verify-pam.c gdm-2.6.0.7/daemon/verify-pam.c +--- gdm-2.6.0.7.orig/daemon/verify-pam.c 2004-12-14 21:27:35.000000000 +0100 ++++ gdm-2.6.0.7/daemon/verify-pam.c 2005-06-15 17:27:54.835623872 +0200 +@@ -1013,8 +1013,10 @@ + if ( ! error_msg_given && + gdm_slave_action_pending ()) { + /* I'm not sure yet if I should display this message for any other issues - heeten */ ++ /* at least AUTHINFO_UNAVAIL -- it's what user unknown is! */ + if (pamerr == PAM_AUTH_ERR || +- pamerr == PAM_USER_UNKNOWN) { ++ pamerr == PAM_USER_UNKNOWN || ++ pamerr == PAM_AUTHINFO_UNAVAIL) { + gboolean is_capslock = FALSE; + const char *basemsg; + char *msg; --- gdm-2.13.0.5.orig/debian/patches/05_use_C_locale.patch +++ gdm-2.13.0.5/debian/patches/05_use_C_locale.patch @@ -0,0 +1,36 @@ +diff -Nur gdm-2.6.0.7.orig/gui/gdmlanguages.c gdm-2.6.0.7/gui/gdmlanguages.c +--- gdm-2.6.0.7.orig/gui/gdmlanguages.c 2004-12-03 13:05:34.000000000 +0100 ++++ gdm-2.6.0.7/gui/gdmlanguages.c 2005-06-15 17:25:24.551470536 +0200 +@@ -476,7 +476,6 @@ + char curline[256]; + GList *langs = NULL; + GHashTable *dupcheck; +- gboolean got_english = FALSE; + Language *language; + gboolean clean; + char *curlocale; +@@ -551,21 +550,15 @@ + g_hash_table_insert (dupcheck, g_strdup (lang), + GINT_TO_POINTER (1)); + +- /* if we have an english locale */ +- if (strncmp (lang, "en_", 3) == 0 || +- strcmp (lang, "C") == 0) +- got_english = TRUE; +- + g_strfreev (lang_list); + } + + g_hash_table_foreach (dupcheck, (GHFunc) g_free, NULL); + g_hash_table_destroy (dupcheck); + +- /* If we haven't found any english locale, add american +- * english as that's as much of a fallback as we can get */ +- if ( ! got_english) +- langs = g_list_prepend (langs, g_strdup ("en_US")); ++ /* Ensure there is at least one English locale -- the one available ++ * on all systems, "C" */ ++ langs = g_list_prepend (langs, g_strdup ("C")); + + curlocale = setlocale (LC_MESSAGES, NULL); + if (curlocale != NULL && --- gdm-2.13.0.5.orig/debian/patches/05_environment_session.patch +++ gdm-2.13.0.5/debian/patches/05_environment_session.patch @@ -0,0 +1,12 @@ +=== modified file 'daemon/slave.c' +--- daemon/slave.c ++++ daemon/slave.c +@@ -3381,6 +3381,7 @@ + g_setenv ("USER", pwent->pw_name, TRUE); + g_setenv ("USERNAME", pwent->pw_name, TRUE); + g_setenv ("HOME", home_dir, TRUE); ++ g_setenv ("PWD", home_dir, TRUE); + g_setenv ("GDMSESSION", session, TRUE); + g_setenv ("DESKTOP_SESSION", session, TRUE); + g_setenv ("SHELL", pwent->pw_shell, TRUE); + --- gdm-2.13.0.5.orig/debian/patches/02_xkeepscrashing_autoconfigure.patch +++ gdm-2.13.0.5/debian/patches/02_xkeepscrashing_autoconfigure.patch @@ -0,0 +1,110 @@ +diff -Nur gdm-2.8.0.2.orig/config/XKeepsCrashing gdm-2.8.0.2/config/XKeepsCrashing +--- gdm-2.8.0.2.orig/config/XKeepsCrashing 2005-07-19 09:53:41.000000000 +0200 ++++ gdm-2.8.0.2/config/XKeepsCrashing 2005-08-09 19:51:41.000000000 +0200 +@@ -60,32 +60,13 @@ + # to tell the user if possible + + # +-# First see if we can find an X configuration program +-# (first one in the list will be used) +-# +-XCONFIGURATOR= +-for n in \ +- /usr/bin/system-config-display \ +- /usr/bin/redhat-config-xfree86 \ +- /usr/sbin/XFdrake \ +- /usr/bin/X11/XF86Setup \ +- /usr/bin/X11/Xconfigurator \ +- /usr/bin/X11/xf86cfg \ +- ; do +- # standard shell test has no or and loops have no breaks, eek +- if test "x$XCONFIGURATOR" = "x" ; then +- if test -x "$n" ; then +- XCONFIGURATOR="$n" +- fi +- fi +-done +- +-# + # Now we check for dialog and gdmaskpass + # ++DIALOG_OPTS= + DIALOG=`gdmwhich dialog` + if test "x$DIALOG" = "x" ; then + DIALOG=`gdmwhich whiptail` ++ DIALOG_OPTS="--scrolltext" + fi + if test -x "$LIBEXECDIR/gdmaskpass" ; then + ASKPASS="$LIBEXECDIR/gdmaskpass" +@@ -93,28 +74,6 @@ + ASKPASS= + fi + +-# +-# If this is a mouse problem try mouseconfig and modify some +-# messages +-# +-if grep '^\(Cannot open mouse\|No core pointer\)' "$XLOG" 2> /dev/null ; then +- +- MSG8=`gettextfunc "Failed to start the X server (your graphical interface). It seems that the pointer device (your mouse) is not set up correctly. Would you like to view the X server output to diagnose the problem?"` +- +- if test -x /usr/sbin/mouseconfig ; then +- XCONFIGURATOR=/usr/sbin/mouseconfig +- # Note: we know this is a mouse problem and yay we have mouseconfig +- MSG4=`gettextfunc "Would you like to try to configure the mouse? Note that you will need the root password for this."` +- fi +- +- if test -x /usr/bin/system-config-mouse ; then +- XCONFIGURATOR=/usr/bin/system-config-mouse +- # Note: we know this is a mouse problem and yay we have system-config-mouse +- MSG4=`gettextfunc "Would you like to try to configure the mouse? Note that you will need the root password for this."` +- fi +- +-fi +- + # we require 'gdmopen', to open a console, because we really dont + # have one. Perhaps someone should try to figure out some shell + # black magic to get this to work on other then linux systems +@@ -157,38 +116,15 @@ + fi + + if "$DIALOG" --yesno "$MSG8" 10 50 ; then +- "$DIALOG" --textbox "$XLOG" 22 76 ++ "$DIALOG" $DIALOG_OPTS --textbox "$XLOG" 22 76 + # Support XFree86 v4 logfile thingie + if grep '^(..) Log file: "' "$XLOG" 2> /dev/null ; then + XLOG_DETAIL=`grep '^(..) Log file: "' "$XLOG" | sed 's/^[^"]*"\([^"]*\)".*$/\1/'` + if "$DIALOG" --yesno "$MSG9" 10 50 ; then +- "$DIALOG" --textbox "$XLOG_DETAIL" 22 76 ++ "$DIALOG" $DIALOG_OPTS --textbox "$XLOG_DETAIL" 22 76 + fi + fi + fi + +-if test "x$XCONFIGURATOR" = "x" ; then +- "$DIALOG" --msgbox "$MSG7" 8 50 +- exit 1 +-fi +- +-if "$DIALOG" --yesno "$MSG4" 10 50 ; then +- clear +- echo +- echo "$MSG5" +- if test "x$ASKPASS" = "x" ; then +- # dirty trick to fool su into asking the root password even if were +- # root +- su nobody -c "su -c $XCONFIGURATOR" +- else +- if "$ASKPASS" ; then +- "$XCONFIGURATOR" +- fi +- fi +- clear +- "$DIALOG" --msgbox "$MSG6" 8 50 +- exit 0 +-else +- "$DIALOG" --msgbox "$MSG7" 8 50 +- exit 1 +-fi ++"$DIALOG" --msgbox "$MSG7" 8 50 ++exit 1 --- gdm-2.13.0.5.orig/debian/patches/02_default_config.patch +++ gdm-2.13.0.5/debian/patches/02_default_config.patch @@ -0,0 +1,222 @@ +diff -Nur gdm-2.13.0.5.orig/config/gdm.conf.in gdm-2.13.0.5/config/gdm.conf.in +--- gdm-2.13.0.5.orig/config/gdm.conf.in 2006-01-07 00:41:05.000000000 +0100 ++++ gdm-2.13.0.5/config/gdm.conf.in 2006-01-18 14:29:28.000000000 +0100 +@@ -61,7 +61,7 @@ + + # The greeter for local (non-xdmcp) logins. Change gdmlogin to gdmgreeter to + # get the new graphical greeter. +-#Greeter=@EXPANDED_LIBEXECDIR@/gdmlogin ++Greeter=@EXPANDED_LIBEXECDIR@/gdmgreeter + + # The greeter for xdmcp logins, usually you want a less graphically intensive + # greeter here so it's better to leave this with gdmlogin +@@ -78,11 +78,11 @@ + # Default path to set. The profile scripts will likely override this value. + # This value will be overridden with the value from /etc/default/login if it + # contains "ROOT=". +-#DefaultPath=@GDM_USER_PATH@ ++#DefaultPath=/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11:/usr/games + # Default path for root. The profile scripts will likely override this value. + # This value will be overridden with the value from /etc/default/login if it + # contains "SUROOT=". +-#RootPath=/sbin:/usr/sbin:@GDM_USER_PATH@ ++#RootPath=/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11:/usr/games + + # If you are having trouble with using a single server for a long time and want + # GDM to kill/restart the server, turn this on. On Solaris, this value is +@@ -97,7 +97,7 @@ + # To try to kill all clients started at greeter time or in the Init script. + # does not always work, only if those clients have a window of their own. + #KillInitClients=true +-LogDir=@EXPANDED_LOGDIR@ ++LogDir=/var/log/gdm + # You should probably never change this value unless you have a weird setup. + PidFile=/var/run/gdm.pid + # Note that a post login script is run before a PreSession script. It is run +@@ -116,9 +116,10 @@ + XKeepsCrashing=@EXPANDED_SYSCONFDIR@/gdm/XKeepsCrashing + # Reboot, Halt and suspend commands, you can add different commands separated + # by a semicolon. GDM will use the first one it can find. +-#RebootCommand=@REBOOT_COMMAND@ +-#HaltCommand=@HALT_COMMAND@ +-#SuspendCommand=@SUSPEND_COMMAND@ ++RebootCommand=/sbin/shutdown -r now "Rebooted from gdm menu." ++HaltCommand=/sbin/shutdown -h now "Halted from gdm menu." ++SuspendCommand=/usr/sbin/pmi action sleep ++HibernateCommand=/usr/sbin/pmi action hibernate + # Probably should not touch the below this is the standard setup. + ServAuthDir=@EXPANDED_AUTHDIR@ + # This is our standard startup script. A bit different from a normal X +@@ -129,9 +130,9 @@ + # really a PATH style variable since 2.4.4.2 to allow actual interoperability + # with KDM. Note that /dm/Sessions is there for backwards + # compatibility reasons with 2.4.4.x. +-#SessionDesktopDir=/etc/X11/sessions/:@EXPANDED_SYSCONFDIR@/dm/Sessions/:@EXPANDED_DATADIR@/gdm/BuiltInSessions/:@EXPANDED_DATADIR@/xsessions/ ++SessionDesktopDir=/etc/X11/sessions/:@EXPANDED_SYSCONFDIR@/dm/Sessions/:@EXPANDED_DATADIR@/gdm/BuiltInSessions/:@EXPANDED_DATADIR@/xsessions/ + # This is the default .desktop session. One of the ones in SessionDesktopDir +-#DefaultSession=gnome.desktop ++DefaultSession=default.desktop + # Better leave this blank and HOME will be used. You can use syntax ~/ below + # to indicate home directory of the user. You can also set this to something + # like /tmp if you don't want the authorizations to be in home directories. +@@ -153,12 +154,12 @@ + # affect Xnest flexiservers. + #FlexiReapDelayMinutes=5 + # The X nest command. +-Xnest=@X_XNEST_PATH@/Xnest @X_XNEST_CONFIG_OPTIONS@ ++Xnest=/usr/bin/Xnest -br @X_XNEST_CONFIG_OPTIONS@ + # Automatic VT allocation. Right now only works on Linux. This way we force + # X to use specific vts. turn VTAllocation to false if this is causing + # problems. +-#FirstVT=7 +-#VTAllocation=true ++FirstVT=7 ++VTAllocation=true + # Should double login be treated with a warning (and possibility to change VT's + # on Linux and FreeBSD systems for console logins) + #DoubleLoginWarning=true +@@ -175,7 +176,7 @@ + + # Program used to play sounds. Should not require any 'daemon' or anything + # like that as it will be run when no one is logged in yet. +-#SoundProgram=@SOUND_PROGRAM@ ++SoundProgram=/usr/lib/gdmplay + + # These are the languages that the console cannot handle because of font + # issues. Here we mean the text console, not X. This is only used when there +@@ -193,7 +194,7 @@ + [security] + # Allow root to login. It makes sense to turn this off for kiosk use, when + # you want to minimize the possibility of break in. +-AllowRoot=true ++AllowRoot=false + # Allow login as root via XDMCP. This value will be overridden and set to + # false if the /etc/default/login file exists and contains + # "CONSOLE=/dev/login", and set to true if the /etc/default/login file exists +@@ -220,7 +221,7 @@ + # Note: Anytime we find a -query or -indirect on the command line we do not add + # a "-nolisten tcp", as then the query just wouldn't work, so this setting only + # affects truly local sessions. +-#DisallowTCP=true ++DisallowTCP=true + # By default never place cookies if we "detect" NFS. We detect NFS by + # detecting "root-squashing". It seems bad practice to place cookies on things + # that go over the network by default and thus we do not do it by default. +@@ -280,16 +281,16 @@ + #GtkRC=@EXPANDED_DATADIR@/themes/Default/gtk-2.0/gtkrc + + # The GTK+ theme to use for the GUI. +-#GtkTheme=Default ++GtkTheme=Human + # If to allow changing the GTK+ (widget) theme from the greeter. Currently + # this only affects the standard greeter as the graphical greeter does not yet + # have this ability. +-#AllowGtkThemeChange=true ++AllowGtkThemeChange=true + # Comma separated list of themes to allow. These must be the names of the + # themes installed in the standard locations for gtk themes. You can also + # specify 'all' to allow all installed themes. These should be just the + # basenames of the themes such as 'Thinice' or 'LowContrast'. +-#GtkThemesToAllow=all ++GtkThemesToAllow=Human,HighContrast,HighContrastInverse,LowContrast + + # Maximum size of an icon, larger icons are scaled down. + #MaxIconWidth=128 +@@ -299,7 +300,7 @@ + # Greeter has a nice title bar that the user can move. + #TitleBar=true + # Configuration is available from the system menu of the greeter. +-#ConfigAvailable=false ++ConfigAvailable=false + # Face browser is enabled. This only works currently for the standard greeter + # as it is not yet enabled in the graphical greeter. + Browser=false +@@ -308,7 +309,7 @@ + # User ID's less than the MinimalUID value will not be included in the face + # browser or in the gdmselection list for Automatic/Timed login. They will not + # be displayed regardless of the settings for Include and Exclude. +-#MinimalUID=100 ++MinimalUID=1000 + # Users listed in Include will be included in the face browser and in the + # gdmsetup selection list for Automatic/Timed login. Users should be separated + # by commas. +@@ -317,7 +318,7 @@ + # gdmsetup selection list for Automatic/Timed login. Excluded users will still + # be able to log in, but will have to type their username. Users should be + # separated by commas. +-#Exclude=bin,daemon,adm,lp,sync,shutdown,halt,mail,news,uucp,operator,nobody,gdm,postgres,pvm,rpm,nfsnobody,pcap ++Exclude=bin,daemon,adm,lp,sync,shutdown,halt,mail,news,uucp,operator,nobody,gdm,postgres,pvm,rpm + # By default, an empty include list means display no users. By setting + # IncludeAll to true, the password file will be scanned and all users will be + # displayed except users excluded via the Exclude setting and user ID's less +@@ -325,15 +326,15 @@ + # large numbers of users and this feature should not be used in such + # environments. The setting of IncludeAll does nothing if Include is set to a + # non-empty value. +-#IncludeAll=false ++IncludeAll=true + # If user or user.png exists in this dir it will be used as his picture. + #GlobalFaceDir=@EXPANDED_DATADIR@/pixmaps/faces/ + # File which contains the locale we show to the user. Likely you want to use + # the one shipped with GDM and edit it. It is not a standard locale.alias + # file, although GDM will be able to read a standard locale.alias file as well. +-#LocaleFile=@EXPANDED_LOCALEDIR@/locale.alias ++LocaleFile=@EXPANDED_LOCALEDIR@/locale.conf + # Logo shown in the standard greeter. +-#Logo=@EXPANDED_PIXMAPDIR@/gdm-foot-logo.png ++#Logo=@EXPANDED_PIXMAPDIR@/gdmDebianLogo.xpm + # Logo shown on file chooser button in gdmsetup (do not modify this value). + #ChooserButtonLogo=@EXPANDED_PIXMAPDIR@/gdm-foot-logo.png + # The standard greeter should shake if a user entered the wrong username or +@@ -343,7 +344,7 @@ + # menu that contains reboot, shutdown, suspend, config and chooser. None of + # these is available if this is off. They can be turned off individually + # however. +-#SystemMenu=true ++SystemMenu=true + # Should the chooser button be shown. If this is shown, GDM can drop into + # chooser mode which will run the xdmcp chooser locally and allow the user to + # connect to some remote host. Local XDMCP does not need to be enabled, +@@ -381,7 +382,7 @@ + #BackgroundType=2 + #BackgroundImage= + #BackgroundScaleToFit=true +-#BackgroundColor=#76848F ++BackgroundColor=#523921 + # XDMCP session should only get a color, this is the sanest setting since you + # don't want to take up too much bandwidth + #BackgroundRemoteOnlyColor=true +@@ -404,7 +405,7 @@ + #Use24Clock=false + # Use circles in the password field. Looks kind of cool actually, but only + # works with certain fonts. +-#UseCirclesInEntry=false ++UseCirclesInEntry=true + # Do not show any visible feedback in the password field. This is standard for + # instance in console, xdm and ssh. + #UseInvisibleInEntry=false +@@ -413,11 +414,11 @@ + # list that is delimited by /: to the GraphicalThemes key and set + # GraphicalThemeRand to true. Otherwise use GraphicalTheme and specify just + # one theme. +-#GraphicalTheme=circles ++GraphicalTheme=Human + #GraphicalThemes=circles/:happygnome + GraphicalThemeDir=@EXPANDED_DATADIR@/gdm/themes/ + GraphicalThemeRand=false +-GraphicalThemedColor=#76848F ++GraphicalThemedColor=#523921 + # If InfoMsgFile points to a file, the greeter will display the contents of the + # file in a modal dialog box before the user is allowed to log in. + #InfoMsgFile= +@@ -428,8 +429,8 @@ + # user input. If SoundOnLogin is a file and the greeter finds the 'play' + # executable (see daemon/SoundProgram) it will play that file instead of just + # beeping. +-#SoundOnLogin=true +-#SoundOnLoginFile= ++SoundOnLogin=true ++SoundOnLoginFile=/usr/share/sounds/question.wav + # If SoundOnLoginSuccess, then the greeter will play a sound (as above) when a + # user successfully logs in. + #SoundOnLoginSuccess=false --- gdm-2.13.0.5.orig/debian/patches/01_xconfigoptions.patch +++ gdm-2.13.0.5/debian/patches/01_xconfigoptions.patch @@ -0,0 +1,126 @@ +=== modified file 'configure' +--- configure ++++ configure +@@ -32318,42 +32318,42 @@ + X_SERVER_PATH="/usr/X11R6/bin" + X_SERVER="/usr/X11R6/bin/X" + GDM_USER_PATH="$GDM_USER_PATH:/usr/X11R6/bin" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + elif test ! -h /usr/X11 -a -x /usr/X11/bin/X; then + X_PATH="/usr/X11/bin" + X_SERVER_PATH="/usr/X11/bin" + X_SERVER="/usr/X11/bin/X" + GDM_USER_PATH="$GDM_USER_PATH:/usr/X11/bin" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + elif test -x /usr/X11R6/bin/X; then + X_PATH="/usr/X11R6/bin" + X_SERVER_PATH="/usr/X11R6/bin" + X_SERVER="/usr/X11R6/bin/X" + GDM_USER_PATH="$GDM_USER_PATH:/usr/X11R6/bin" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + elif test -x /usr/X11/bin/X; then + X_PATH="/usr/X11/bin" + X_SERVER_PATH="/usr/X11/bin" + X_SERVER="/usr/X11/bin/X" + GDM_USER_PATH="$GDM_USER_PATH:/usr/X11/bin" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + elif test -x /usr/openwin/bin/Xsun; then + X_PATH="/usr/openwin/bin" + X_SERVER_PATH="/usr/openwin/bin" + X_SERVER="/usr/openwin/bin/Xsun" + GDM_USER_PATH="$GDM_USER_PATH:/usr/openwin/bin" +- X_CONFIG_OPTIONS="-audit 0 -nobanner" ++ X_CONFIG_OPTIONS="-br -audit 0 -nobanner" + elif test -x /opt/X11R6/bin/X; then + X_PATH="/opt/X11R6/bin" + X_SERVER_PATH="/opt/X11R6/bin" + X_SERVER="/opt/X11R6/bin/X" + GDM_USER_PATH="$GDM_USER_PATH:/opt/X11R6/bin" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + elif test -x /usr/bin/X; then + X_PATH="/usr/bin" + X_SERVER_PATH="/usr/bin" + X_SERVER="/usr/bin/X" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + else + # what to do, what to do, this is wrong, but this just sets the + # defaults, perhaps this user is cross compiling or some such +@@ -32361,7 +32361,7 @@ + X_SERVER_PATH="/usr/X11R6/bin" + X_SERVER="/usr/X11R6/bin/X" + GDM_USER_PATH="$GDM_USER_PATH:/usr/bin/X11:/usr/X11R6/bin:/usr/local/bin:/opt/X11R6/bin:/usr/openwin/bin" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + fi + + # Don't add EXPANDED_BINDIR to GDM_USER_PATH if it is already in the PATH. + +=== modified file 'configure.ac' +--- configure.ac ++++ configure.ac +@@ -940,42 +940,42 @@ + X_SERVER_PATH="/usr/X11R6/bin" + X_SERVER="/usr/X11R6/bin/X" + GDM_USER_PATH="$GDM_USER_PATH:/usr/X11R6/bin" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + elif test ! -h /usr/X11 -a -x /usr/X11/bin/X; then + X_PATH="/usr/X11/bin" + X_SERVER_PATH="/usr/X11/bin" + X_SERVER="/usr/X11/bin/X" + GDM_USER_PATH="$GDM_USER_PATH:/usr/X11/bin" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + elif test -x /usr/X11R6/bin/X; then + X_PATH="/usr/X11R6/bin" + X_SERVER_PATH="/usr/X11R6/bin" + X_SERVER="/usr/X11R6/bin/X" + GDM_USER_PATH="$GDM_USER_PATH:/usr/X11R6/bin" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + elif test -x /usr/X11/bin/X; then + X_PATH="/usr/X11/bin" + X_SERVER_PATH="/usr/X11/bin" + X_SERVER="/usr/X11/bin/X" + GDM_USER_PATH="$GDM_USER_PATH:/usr/X11/bin" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + elif test -x /usr/openwin/bin/Xsun; then + X_PATH="/usr/openwin/bin" + X_SERVER_PATH="/usr/openwin/bin" + X_SERVER="/usr/openwin/bin/Xsun" + GDM_USER_PATH="$GDM_USER_PATH:/usr/openwin/bin" +- X_CONFIG_OPTIONS="-audit 0 -nobanner" ++ X_CONFIG_OPTIONS="-br -audit 0 -nobanner" + elif test -x /opt/X11R6/bin/X; then + X_PATH="/opt/X11R6/bin" + X_SERVER_PATH="/opt/X11R6/bin" + X_SERVER="/opt/X11R6/bin/X" + GDM_USER_PATH="$GDM_USER_PATH:/opt/X11R6/bin" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + elif test -x /usr/bin/X; then + X_PATH="/usr/bin" + X_SERVER_PATH="/usr/bin" + X_SERVER="/usr/bin/X" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + else + # what to do, what to do, this is wrong, but this just sets the + # defaults, perhaps this user is cross compiling or some such +@@ -983,7 +983,7 @@ + X_SERVER_PATH="/usr/X11R6/bin" + X_SERVER="/usr/X11R6/bin/X" + GDM_USER_PATH="$GDM_USER_PATH:/usr/bin/X11:/usr/X11R6/bin:/usr/local/bin:/opt/X11R6/bin:/usr/openwin/bin" +- X_CONFIG_OPTIONS="-audit 0" ++ X_CONFIG_OPTIONS="-br -audit 0" + fi + + # Don't add EXPANDED_BINDIR to GDM_USER_PATH if it is already in the PATH. + --- gdm-2.13.0.5.orig/debian/patches/13_get_lang_from_environment.patch +++ gdm-2.13.0.5/debian/patches/13_get_lang_from_environment.patch @@ -0,0 +1,17 @@ +diff -Nur gdm-2.8.0.4/debian/init gdm-2.8.0.4.new/debian/init +--- gdm-2.8.0.4/debian/init 2005-09-15 09:45:40.000000000 +0200 ++++ gdm-2.8.0.4.new/debian/init 2005-09-15 09:51:13.000000000 +0200 +@@ -29,11 +29,8 @@ + + test -x $DAEMON || exit 0 + +-if [ -r /etc/default/gdm ]; then +- . /etc/default/gdm +- if [ -z "$LANG" ]; then +- : +- else ++if [ -r /etc/environment ]; then ++ if LANG=$(pam_getenv -l LANG); then + export LANG + fi + fi --- gdm-2.13.0.5.orig/debian/patches/01_xrdb_nocpp.patch +++ gdm-2.13.0.5/debian/patches/01_xrdb_nocpp.patch @@ -0,0 +1,22 @@ +diff -Nur gdm-2.8.0.4.orig/config/Xsession.in gdm-2.8.0.4/config/Xsession.in +--- gdm-2.8.0.4.orig/config/Xsession.in 2005-07-19 09:53:41.000000000 +0200 ++++ gdm-2.8.0.4/config/Xsession.in 2005-09-10 15:34:58.000000000 +0200 +@@ -109,15 +109,15 @@ + + # merge in defaults + if [ -f "$rh6sysresources" ]; then +- xrdb -merge "$rh6sysresources" ++ xrdb -nocpp -merge "$rh6sysresources" + fi + + if [ -f "$sysresources" ]; then +- xrdb -merge "$sysresources" ++ xrdb -nocpp -merge "$sysresources" + fi + + if [ -f "$userresources" ]; then +- xrdb -merge "$userresources" ++ xrdb -nocpp -merge "$userresources" + fi + + # merge in keymaps --- gdm-2.13.0.5.orig/debian/patches/09_desktop.patch +++ gdm-2.13.0.5/debian/patches/09_desktop.patch @@ -0,0 +1,18 @@ +diff -Nur gdm-2.13.0.2.orig/gui/gdmsetup.desktop.in gdm-2.13.0.2/gui/gdmsetup.desktop.in +--- gdm-2.13.0.2.orig/gui/gdmsetup.desktop.in 2005-11-04 01:55:31.000000000 +0100 ++++ gdm-2.13.0.2/gui/gdmsetup.desktop.in 2005-12-11 17:21:38.000000000 +0100 +@@ -4,12 +4,13 @@ + _GenericName=Login Window Preferences + _Comment=Configure the login window (GNOME Display Manager) + TryExec=gdmsetup +-Exec=gdmsetup ++Exec=gksu gdmsetup + Icon=gdm-setup + StartupNotify=true + Terminal=false + Type=Application + Categories=GNOME;Application;System;Settings; ++X-KDE-SubstituteUID=true + X-GNOME-Bugzilla-Bugzilla=GNOME + X-GNOME-Bugzilla-Product=gdm + X-GNOME-Bugzilla-Component=general