kildclient-3.0.0/0000755000175000017500000000000012376346020010640 500000000000000kildclient-3.0.0/config.h.in0000644000175000017500000000426112376345612012614 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* always defined to indicate that i18n is enabled */ #undef ENABLE_NLS /* "definition of GETTEXT_PACKAGE" */ #undef GETTEXT_PACKAGE /* Define to 1 if you have the `bind_textdomain_codeset' function. */ #undef HAVE_BIND_TEXTDOMAIN_CODESET /* Define to 1 if you have the `dcgettext' function. */ #undef HAVE_DCGETTEXT /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Do we have the gtkspell library? */ #undef HAVE_GTKSPELL /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if your file defines LC_MESSAGES. */ #undef HAVE_LC_MESSAGES /* Do we have the gnutls library? */ #undef HAVE_LIBGNUTLS /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the `localtime_r' function. */ #undef HAVE_LOCALTIME_R /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION kildclient-3.0.0/win32/0000755000175000017500000000000012376346017011610 500000000000000kildclient-3.0.0/win32/gettext.pm0000644000175000017500000000020612374460043013542 00000000000000# Do-nothing replacement for Locale::Gettext which could not be found # for Win32 sub gettext { return $_[0]; } return 1; kildclient-3.0.0/win32/kildclient.iss0000644000175000017500000002154112375457746014410 00000000000000; Inno Setup script to generate KildClient installer. ; When generating the installer for a new version, the following must be ; changed/verified: ; - Version number in #define section ; - New files included in the package ; - Make sure to run strip on the .exe before compiling! ; - Generate html docs ; - Make in po/ directory ;;; Some defines #define AppName "KildClient" #define AppId "KildClient" #define AppVer "3.0.0" #define URL "http://www.kildclient.org" ;;; Paths to the files to be included ; Directory where KildClient is built #define BuildDir "J:\progs\kildclient-win32" ; Root of mingw32 files installed as Fedora files #define MingwDir "K:\usr\i686-w64-mingw32\sys-root\mingw" ; Strawberry Perl directory #define PerlDir "K:\home\ekalin\cross\i686-w64-mingw32\strawberryperl\perl" ; Directory of Perl modules (not in the mingw root, used for JSON.pm) #define SysPerlDir "K:\usr\share\perl5\vendor_perl" [Setup] AppId={#AppId} AppName={#AppName} AppVersion={#AppVer} AppPublisher=Eduardo M Kalinowski AppPublisherURL={#URL} AppSupportURL={#URL} AppUpdatesURL={#URL} DefaultDirName={pf}\KildClient DefaultGroupName=KildClient AllowNoIcons=true LicenseFile={#BuildDir}\COPYING OutputDir={#BuildDir}\win32 OutputBaseFilename=kildclient-{#AppVer} Compression=lzma SolidCompression=true AppCopyright=This program is released under the GNU General Public License ShowLanguageDialog=yes RestartIfNeededByRun=yes [Languages] Name: eng; MessagesFile: compiler:Default.isl Name: bra; MessagesFile: compiler:Languages\BrazilianPortuguese.isl [Tasks] Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked [Files] ;;; Program and support files Source: {#BuildDir}\src\kildclient.exe; DestDir: {app}; Flags: ignoreversion Source: {#BuildDir}\src\*.ui; DestDir: {app}; Flags: ignoreversion Source: {#BuildDir}\share\kildclient.pl; DestDir: {app}; Flags: ignoreversion Source: {#BuildDir}\share\MSDP.pm; DestDir: {app}; Flags: ignoreversion ;;; Plugins Source: {#BuildDir}\share\plugins\*.pl; DestDir: {app}\plugins; Flags: ignoreversion ;;; Help files Source: {#BuildDir}\NEWS; DestDir: {app}; Flags: ignoreversion Source: {#BuildDir}\COPYING; DestDir: {app}; Flags: ignoreversion Source: {#BuildDir}\share\kildclient.hlp; DestDir: {app}; Flags: ignoreversion ;;; The manual Source: {#BuildDir}\doc\C\kildclient\*.html; DestDir: {app}\manual\html; Flags: ignoreversion Source: {#BuildDir}\doc\C\images\*.png; DestDir: {app}\manual\html\images; Flags: ignoreversion ;;; Message catalogs Source: {#BuildDir}\po\pt_BR.gmo; DestDir: {app}\locale\pt_BR\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion Source: {#BuildDir}\po\de.gmo; DestDir: {app}\locale\de\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion Source: {#BuildDir}\po\es.gmo; DestDir: {app}\locale\es\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion Source: {#BuildDir}\po\eo.gmo; DestDir: {app}\locale\eo\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion Source: {#BuildDir}\po\sv.gmo; DestDir: {app}\locale\sv\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion ;;; Gtk+ Source: {#MingwDir}\bin\iconv.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libatk-1.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libcairo-2.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libcairo-gobject-2.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libffi-6.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgdk-3-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgdk_pixbuf-2.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgio-2.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libglib-2.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgmodule-2.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgobject-2.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgtk-3-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libpango-1.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libpangocairo-1.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libpangowin32-1.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libpng16-16.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libintl-8.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libpixman-1-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\zlib1.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\share\glib-2.0\schemas\*; DestDir: {app}\share\glib-2.0\schemas; Flags: ignoreversion Source: {#MingwDir}\share\locale\pt_BR\LC_MESSAGES\*; DestDir: {app}\locale\pt_BR\LC_MESSAGES; Flags: ignoreversion Source: {#MingwDir}\share\locale\de\LC_MESSAGES\*; DestDir: {app}\locale\de\LC_MESSAGES; Flags: ignoreversion Source: {#MingwDir}\share\locale\es\LC_MESSAGES\*; DestDir: {app}\locale\es\LC_MESSAGES; Flags: ignoreversion Source: {#MingwDir}\share\locale\eo\LC_MESSAGES\*; DestDir: {app}\locale\eo\LC_MESSAGES; Flags: ignoreversion Source: {#MingwDir}\share\locale\sv\LC_MESSAGES\*; DestDir: {app}\locale\sv\LC_MESSAGES; Flags: ignoreversion ;;; gnutls Source: {#MingwDir}\bin\libgmp-10.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgnutls-28.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libhogweed-2-5.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libnettle-4-7.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libp11-kit-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libtasn1-6.dll; DestDir: {app}\bin; Flags: ignoreversion ;;; gtk-spell Source: {#MingwDir}\bin\libenchant.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgtkspell3-3-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgnurx-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libhunspell-1.3-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\lib\enchant\libenchant_myspell.dll; DestDir: {app}\lib\enchant; Flags: ignoreversion ;;; Perl Source: {#PerlDir}\bin\libgcc_s_sjlj-1.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#PerlDir}\bin\libstdc++-6.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#PerlDir}\bin\libwinpthread-1.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#PerlDir}\bin\perl520.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#PerlDir}\lib\*; DestDir: {app}\perl; Flags: ignoreversion recursesubdirs Source: {#SysPerlDir}\JSON.pm; DestDir: {app}\lib; Flags: ignoreversion Source: {#BuildDir}\win32\gettext.pm; DestDir: {app}\lib\Locale; Flags: ignoreversion [INI] Filename: {app}\kildclient.url; Section: InternetShortcut; Key: URL; String: http://www.kildclient.org Filename: {app}\manual.url; Section: InternetShortcut; Key: URL; String: {app}\manual\html\index.html [Icons] Name: {group}\KildClient; Filename: {app}\kildclient.exe Name: {group}\{cm:Manual}; Filename: {app}\manual.url Name: {group}\{cm:ProgramOnTheWeb,KildClient}; Filename: {app}\kildclient.url Name: {group}\{cm:UninstallProgram,KildClient}; Filename: {uninstallexe} Name: {userdesktop}\KildClient; Filename: {app}\kildclient.exe; Tasks: desktopicon [Registry] Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\kildclient.exe"; ValueType: string; ValueName: ""; ValueData: "{app}\kildclient.exe"; Flags: uninsdeletekey Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\kildclient.exe"; ValueType: string; ValueName: "Path"; ValueData: "{app};{app}\bin"; Flags: uninsdeletekey [UninstallDelete] Type: files; Name: {app}\kildclient.url Type: files; Name: {app}\manual.url [CustomMessages] eng.Manual=Manual bra.Manual=Manual [Code] procedure CurStepChanged(CurStep: TSetupStep); var UninstallPath: String; UninstallString: String; ResultCode: Integer; begin { Uninstall a previous version (if it is found) } if (CurStep = ssInstall) then begin UninstallPath := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#AppId}_is1'; UninstallString := ''; if RegQueryStringValue(HKLM, UninstallPath, 'UninstallString', UninstallString) then begin if UninstallString <> '' then begin UninstallString := RemoveQuotes(UninstallString); Exec(UninstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); end; end; end; end; kildclient-3.0.0/win32/README.old0000644000175000017500000000525112374460043013162 00000000000000(This instructions are outdated, as I have switched to cross-compiling KildClient. The basic idea should still work, though, provided one can find newer versions of the necessary packages (at the time of this writing, the latest GTK+ package for Windows is too old).) Building KildClient under Windows --------------------------------- This file aims at giving some tips on building KildClient under Windows. However, be aware that the process can be complicated and this is no detailed recipe, just some hints. If you still want to try, here's what you will need: Mingw and Msys: The compiler and Unix-like environment used for building KildClient. Get them from http://www.mingw.org Install the C compiler and MSYS Basic System. You also need the regex package from http://sourceforge.net/projects/mingwrep Just unzip it into c:\mingw ActivePerl 5.10.0.1004 (or later) from ActiveState: A Perl for Windows. Also needed at run time. Get it from http://www.activestate.com GTK+ Development Environment: Get it from http://www.gtk.org/download-windows.html Download the "bundle" which includes everything that is necessary. The README says to unzip to c:\opt\gtk, but it can be unzipped to c:\mingw and then it can be used directly with no further changes. - The runtime can be downloaded from http://gtk-win.sourceforge.net/home/index.php/en/Home It's not necessary for compilation (only runtime), but can be included in the installer. To use spell checking (optional), download these files: - aspell-dev from http://ftp.gnu.org/gnu/aspell/w32/ It has been tested with version 0-50-3-3. Extract it, noting the paths: the installer contains a top-level directory aspell-dev-VERSION. Inside it there are two directories, include and lib. The contents of those should end in the include and lib directories inside the MinGW directory. - gtkspell-2.0.6.tar.gz from FIXME This file was borrowed from the gaim win32 port, and repacked to use MinGW's directories (and pkgconfig). To include gnutls support (optional), download it from http://josefsson.org/gnutls4win/ and extract it to c:\mingw. Now untar the source file, run ./configure and make. Do not run make install. To run it, you must copy some files to a directory, keeping the correct structure. The easiest way now is to create an installer. The kildclient.iss file in this directory is an Inno Setup (http://www.jrsoftware.org/isinfo.php) script to create the installer. Check "Install Inno Setup Preprocessor" as the script uses this feature. You will need to adjust some paths to use it, most likely, however. kildclient-3.0.0/win32/README.windows0000644000175000017500000000375412374460043014104 00000000000000Cross-Compiling KildClient for Windows ====================================== Basic packages -------------- The easiest way is to use Fedora, because it already includes most of the dependencies, with new enough versions, cross-compiled as rpm packages. Packages necessary for cross-compilation: mingw32-gcc mingw32-gtk3 mingw32-gtkspell3 mingw32-gnutls mingw32-libgnurx If building from git, you'll also need autoconf, automake and glib2-devel. (Just as for normal compilation.) You'll also need perl-JSON when building the installer. Perl ---- Unfortunately, perl is not packaged for mingw32. Strawberry Perl can be used. Extract it in a directory, then pass that directory to the configure script, as shown below. Building -------- To run the configure script, use mingw32-configure which sets proper environment variables for cross compilation, passing the path for Perl manually: mingw32-configure KILDCLIENT_PERL_CFLAGS="-I$HOME/strawberryperl/perl/lib/CORE" KILDCLIENT_PERL_LIBS="-L$HOME/strawberryperl/perl/lib/CORE -lperl520" Then just run make. Creating a installer -------------------- Several files are necessary for KildClient to run, besides the generated .exe file. Therefore, the easiest way now is to create an installer. The kildclient.iss file in this directory is an Inno Setup (http://www.jrsoftware.org/isinfo.php) script to create the installer. When downloading, check "Install Inno Setup Preprocessor" as the script uses this feature. You will need to adjust the paths defined in the beginning of the file. Inno Setup should run under Wine, thus completely eliminating the need for a Windows machine, but I haven't tried it, instead I run it in a virtual machine. 64-bit support ============== I haven't tried building KildClient for 64-bit versions of Windows, but it should work, since Fedora includes all the necessary packages built for the 64-bit target, and Strawberry Perl also has a 64-bit version of Perl. kildclient-3.0.0/AUTHORS0000644000175000017500000000051011715730227011626 00000000000000Main author: Eduardo M Kalinowski (eduardo@kalinowski.com.br) Includes SimoComboBox widget, originally by Todd A. Fisher (toddf@simosoftware.com) Includes Patches by: Sergey Bogdanov (serb@mail.ru) Zephaniah E. Hull (warp@aehallh.com) Tasci Synx Includes plugins by: Jack Mudge (jakykong@theanythingbox.com) - channels.pl kildclient-3.0.0/Makefile.am0000644000175000017500000000065712376345633012635 00000000000000if BUILD_DOCS SUBDIRS = po \ src \ share \ doc else SUBDIRS = po \ src \ share endif pkgdocdir = $(datadir)/doc/kildclient pkgdoc_DATA = README AUTHORS NEWS COPYING appsdir = $(datadir)/applications apps_DATA = kildclient.desktop EXTRA_DIST = kildclient.spec \ kildclient.desktop \ win32/kildclient.iss win32/gettext.pm win32/README.windows win32/README.old kildclient-3.0.0/doc/0000755000175000017500000000000012376346020011405 500000000000000kildclient-3.0.0/doc/Makefile.am0000644000175000017500000000001411715757515013367 00000000000000SUBDIRS = C kildclient-3.0.0/doc/C/0000755000175000017500000000000012376346020011567 500000000000000kildclient-3.0.0/doc/C/kildclient/0000755000175000017500000000000012376346020013711 500000000000000kildclient-3.0.0/doc/C/kildclient/x3886.html0000644000175000017500000001277512376345150015336 00000000000000 $world->mlsend

C.64. $world->mlsend

success = $world->mlsend( attributes );

This functions emulates the Multi-line Send feature (see Section 6.3.5) from perl scripts. Several lines can be sent at once, optionally prefixing and/or suffixing each line with text you specify. It's also possible to send the contents of a file to the MUD. The lines can be sent with customized intervals between them (so as not to cause buffer overflows that lead to a disconnection from the server).

atributes is a reference to a hash defining attributes for the timer. Generally the call works like this:


$world->mlsend({ attribute1 => value1,
                 attribute2 => value2, ... })

Possible attributes:

  • initialtext: Lines of text to be sent to the MUD before anything else. You can specify this argument in two ways: one is as a string composed of several lines, KildClient will split the string and send each line separately. The second option is to pass a reference to an array, where each element is a line.

    The following two call are thus equivalent:

    
  $world->mlsend({ initialtext => "First line\nSecond line\nLast line" })
      
    
  $world->mlsend({ initialtext => [ "First line",
                                        "Second line",
                                        "Last line" ]})
      
  • file: The path to a file whose contents are to be sent, line by line, after sending the initialtext (if present), but before sending finaltext.

  • finaltext: Lines to be sent after the file contents has been sent (if a file was specified). This is very similar to initialtext, and can be given also as a multi-line string or as a reference to an array of lines.

  • linestart: If present, specifies a string that is prepended to each line as it is sent to the MUD.

  • lineend: If present, specifies a string that is appended to each line as it is sent to the MUD.

  • delay: The delay, in seconds, between each group of lines. If you are getting disconnected for sending too much text at once, increase this value. If not given, the value is taken from the Global Preferences (see Section 5.2).

  • linesatime: The number of lines to be sent at a time. If not given, the value is taken from the Global Preferences (see Section 5.2).

On success, returns true. If the file does not exist or cannot be open, this function does nothing and returns a false value. It returns undef if invalid parameters are specified.

You might also want to see the $world->sendlines and $world->sendfile functions which are simpler ways of sending several lines or the contents of a file at once, respectively.

kildclient-3.0.0/doc/C/kildclient/x3241.html0000644000175000017500000000456112376345147015317 00000000000000 $world->enaalias

C.23. $world->enaalias

void $world->enaalias( number/name , ... );

Enables the alias identified by number or name. If there are several aliases with the same name, enables them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x4492.html0000644000175000017500000000551112376345150015316 00000000000000 $world->triggerenabled

C.96. $world->triggerenabled

result = $world->triggerenabled( name/number );

This functions checks whether the specified trigger exists and whether it is enabled.

You can pass either a trigger number or name. If the trigger does not exist, this function returns undef, so you can distinguish the case of a non-existant trigger from a disabled one.

If the trigger exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several triggers with the same name, it returns a list with one value for each trigger with that name, and each value is 0 or 1 depending on the state of the trigger.

kildclient-3.0.0/doc/C/kildclient/x3754.html0000644000175000017500000000607712376345150015326 00000000000000 $world->logfile

C.58. $world->logfile

void $world->logfile( file , [timeformat] );

Starts logging to the given file. Everything output by the mud will be saved. If timeformat is specified, it is considered a string to be passed to the C strftime() function, with special tags that are replace with the current time and/or date, and the resulting string is prefixed to each line. (See the strftime manual page for the possible tags.) If this argument is not given, nothing is prefixed to the lines.

It is not possible to log to more than one file at one time, if there is already a log file open, it will be closed and logging will continue to the new file.

void $world->logfile(void);

With no arguments, this function stops logging output.

kildclient-3.0.0/doc/C/kildclient/x4645.html0000644000175000017500000000677112376345150015327 00000000000000 Enabling and Disabling Plugins

E.4. Enabling and Disabling Plugins

As described in Chapter 13, the user can enable or disable plugins. By default, disabling a plugin means disabling all its triggers, macros, aliases, hooks and timers, and enabling a plugin means enabling all the above items.

Most of the times that is enough, but for some plugins this naive approach may not be appropriate. One such case is when a plugin has some triggers (or any other kind of item) that is not necessarily always enabled, and whose status is set by some other means.

In these cases, you can define two functions named ENABLE and DISABLE. These will be called when the plugin is being enabled and disabled, respectively, and you can do whatever is necessary in there.

If these functions are defined, then the standard behaviour (enabling or disabling all items) is not done, and you must do whatever is necessary by yourself. Also, no message is printed, so you might want to print some informative message.

The functions should return a true value to indicate success. If for some reason the operation could not be done and the status should not be changed, return a false value and the status of the plugin will not be altered. But use this feature with care.

If the functions are not defined, then the default behavior described above is used. So if your plugin doesn't have special needs, you do not need to define these functions.

kildclient-3.0.0/doc/C/kildclient/a4521.html0000644000175000017500000001210012376345150015250 00000000000000 Using KCWin for Input/Output Windows

Appendix D. Using KCWin for Input/Output Windows

KCWin is a standard plugin distributed with KildClient that allows you to create windows with a terminal for output and an entry box for input. These windows do nothing by themselves, but they can be used by other plugins when they need a window for input and output. The output area supports ANSI colors and thus is like a mini MUD window.

This plugin requires the gtk3-perl bindings. It will fail to run if these bindings are not found.

This plugin is more often used as a helper for other plugins. A plugin that uses KCWin should use $::world->requireplugin('KCWin') in a BEGIN block, as described in Section E.5.1.

Use KCWin->new to create a new window. KCWin derives from Gtk3::Window so you can use all of its methods.

The widgets are accessible for customization. If $kcw is a KCWin, the following widgets are available:

  • $kcw->{VBOX}, Gtk3::Box, the vertical box that contains the output and input areas.

  • $kcw->{SCROLLWIN}, Gtk3::ScrolledWindow, this holds the TextView that is used for output.

  • $kcw->{TEXTVIEW}, Gtk3::TextView, is the widget used for output.

  • $kcw->{TEXTBUFFER}, Gtk3::TextBuffer, for convenience, the TextBuffer displayed in the window.

  • $kcw->{CMDAREA}, Gtk3::HBox, a box that holds a button to clear the input area, and the input area itself.

  • $kcw->{BTNCLEAR}, Gtk3::Button, a button that clears the input entry widget when clicked.

  • $kcw->{ENTRY}, Gtk3::Entry, the input entry widget. Connect to the activate signal of this widget to do something when the user presses ENTER in this widget.

The widgets can be used, and the window can be customized (by adding other widgets, for example). Some common actions have functions in KCWin as a shortcut. These functions will be described in the following sections.

D.1. Changes from Previous Versions

KCWin version 2.x was based on the gtk2-perl bindings, for GTK+ 2.x. KCwin 3.x is based on gtk3-perl, just as KildClient 3.x uses GTK+ 3.x. If your plugin uses GTK+ functions directly, you'll have to convert it to use gtk3-perl.

kildclient-3.0.0/doc/C/kildclient/x4249.html0000644000175000017500000000473712376345150015327 00000000000000 $world->silentdistimer

C.86. $world->silentdistimer

void $world->silentdistimer( number/name , ... );

Disables the timer identified by number or name. If there are several timers with the same name, disables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success.

kildclient-3.0.0/doc/C/kildclient/x1168.html0000644000175000017500000001474112376345146015325 00000000000000 Other trigger features

8.5. Other trigger features

By default, when a trigger matches, no more checking is done. So if a line would match two or more triggers, only the first would have a successful match and have its action executed. The other ones wouldn't even have a chance to try a match.

If you check the Keep executing triggers after this one matches option, then even if this triggers matches it does not prevent other triggers from being tried. So, if a second trigger matches, the actions of both will be executed. Note, however, that unless this second trigger also has the same option checked, trigger matching will stop at that second trigger.

If you are having trouble with triggers and want to be informed whenver a trigger matches, enable the Preferences->Debug Matches menu. When this is enabled, information about each matched trigger will be printed to stderr. (This means you must start KildClient from a terminal to see the output.)

8.5.1. Rewriter Triggers

Rewriter triggers are a special kind of trigger that allows something not possible with ordinary triggers: changing the received line so that futher triggers work on this changed line.

As mentioned above, the $colorline variable holds the entire line that matched the trigger, including ANSI color codes. Rewriter triggers can alter this variable, and then the other triggers will match on this changed line.

Rewriter triggers run before normal triggers. Also, the Keep executing option (see Section 8.5) is not considered for them: they never stop processing of other triggers, even if that option is not set. The gag options are also not significant for a rewriter trigger; they are always ignored.

Let's see an example of where rewriter triggers can be useful. Suppose you do not want to see an offensive word that might appear in the MUD. A first attempt at filtering could be a trigger like this:

Example 8-8. A profanity filter that does not work

  • Pattern: fuck

  • Action: /$colorline =~ s/fuck/f***/; $world->echo($colorline)

  • Omit (gag) from output: Checked

This works for simple cases, but it is most likely not what you want. Suppose you have a trigger that captures messages sent from a specific channel (such as the one for telepathic communications) and does something, such as changing the presentation of the message or sending them to another window. If someone sends a message over that channel with the f-word, the channel-capture trigger will not work because the line has already been caught the the profanity-filter trigger above. You'll see the message with the bad word filtered, but it will not be captured as a channel message.

You might think about setting the Keep executing option in the profanity-filter trigger, but that would not solve the problem. That trigger would match, and print in the main window the line just with the word filtered. And then the original line would match against the channel-capture trigger, thus acting upon the channel message, but with the bad word intact, because the trigger did not change the line. So you would end up seeing the message twice, but neither case in the way you want.

The solution to this problem is to use a rewriter trigger to filter the bad word before other triggers have a chance to see the line. Our profanity-filter trigger should be like this:

Example 8-9. A profanity filter using a rewriter trigger

  • Pattern: fuck

  • Action: /$colorline =~ s/fuck/f***/

  • Rewriter trigger: Checked

Note that the line is not printed. Rewriter triggers generally need not print anything, because if no other trigger matches the line, it will be printed (with the changed contents). If another trigger matches, let this trigger decide what to do.

Now everything should work: when any line with the f-word is seen, this word is filtered out and the line is changed. If this was a channel message, the channel-capture trigger will see the line with the offensive word filtered and display the message in your special way without the bad word.

kildclient-3.0.0/doc/C/kildclient/x719.html0000644000175000017500000000425612376345146015246 00000000000000 Diplay Menu

6.5. Diplay Menu

6.5.1. Split screen

This option toggles displaying or hiding another window with the output from the world, so that you can see both the text as it is received and some other part of the scrollback buffer. See Section 3.4.

kildclient-3.0.0/doc/C/kildclient/x2415.html0000644000175000017500000001604112376345147015315 00000000000000 Advanced Features

15.2. Advanced Features

There are other things you can do besides simply chatting. These functions are accessed by typing some commands in the chat window. These commands start with /, but do not confuse them with the usage of / in the main KildClient window to run Perl commands.

Here are the commands and their actions:

/emote text

Sends text as an emote and not as a chat message, that is, sends a message in the form name text.

/chatall text

Sends text to all chat connections.

/emoteall text

Sends text as an emote to all chat connections.

/group group name

Makes this chat connection a member of the specified group.

/cg text

Sends text to all connections that are members of the group that this chat session belongs.

/eg text

Sends text as an emote to all connections that are members of the group that this chat session belongs.

/name nickname

Changes the chat nickname to the one given. This affects all chat sessions.

/color code

Changes the color used in this chat session to the one specified. code is a color code as recognized by the colorize function. Note that this affects only chat messages and the text you send, if the chat peer sends messages in another color, they will be displayed in the color the peer chose. This affects all chat sessions.

/stripansi

Strips ANSI color codes in messages received in this chat. That means that colors sent by the peer will not be displayed, and that even incoming messages will be displayed in your chat color.

/nostripansi

Does not strip ANSI color codes in messages received in this chat. That means that colors sent by the peer will be displayed.

/ping

Pings the other peer. If the connection is alive, they will reply to this request. Additionally, the time for the reply to be received is displayed.

/sendfile

Attemps to send a file to the peer. A dialog will be displayed for you to select the file to send, and the file will be offered. If they accept, the file transfer will start.

/stopfile

Stops the file transfer currently in progress.

/snoop

Asks the peer if you can snoop them, that is, see everything they see in their MUD session. If they accept, everything they see will be sent to you and displayed.

/allowsnoop

Allows the peer to snoop you, that is, they can see everything you see in your MUD session. Be careful with this command. By default snooping is not allowed to protect your privacy.

/noallowsnoop

Disallows the peer to snoop you, that is, they cannot see what you see in your MUD session. By default snooping is disabled, and this command is used to disable it again if you had enabled it.

/info

Shows some information about the chat session.

/hangup

Stops this chat session. You will need to connect again to continue talking.

As you can see, the chat offers much more than simply chatting. One of its features is file transfer. To send a file, use the /sendfile command, as descrived above. When your peer wants to send you a file, a dialog box will be displayed telling you the name and size of the file. If you want the file, select Yes and another dialog will be displayed for you to you can select where to store the file. The file transfer will then begin. Or you can refuse the file by clicking No. You can interrupt a file transfer in progress by using the /stopfile command.

By default, you are prompted whenever somebody wants to talk with you. If you want to avoid this question and automatically accept all chats, set the $chat::auto_accept_calls variable to 1 (that is, enter something like /$chat::auto_accept_calls = 1). This setting will be remembered. Set it to 0 to have the prompts again.

If, however, you do not want to chat with anyone, the best thing is to disable accepting connections. Just type /chat::noaccept. Use /chat::acceptcalls to accept calls again.

kildclient-3.0.0/doc/C/kildclient/x3007.html0000644000175000017500000000546512376345147015323 00000000000000 $world->aliasenabled

C.4. $world->aliasenabled

result = $world->aliasenabled( name/number );

This functions checks whether the specified alias exists and whether it is enabled.

You can pass either a alias number or name. If the alias does not exist, this function returns undef, so you can distinguish the case of a non-existant alias from a disabled one.

If the alias exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several aliases with the same name, it returns a list with one value for each alias with that name, and each value is 0 or 1 depending on the state of the alias.

kildclient-3.0.0/doc/C/kildclient/x332.html0000644000175000017500000001534412376345145015234 00000000000000 Input

4.3. Input

The figure below shows the Input section of the World Editor:

Figure 4-5. The Input section of the World Editor

The first section, Command Entry, controls the behaviour of the command entry textbox:

  • Keep last typed command in command entry box, causes the entry box not to be cleared when you press ENTER. The command you have just sent will be kept and can be repeated just by pressing ENTER again. It will be selected, so you can start typing another command to erase it.

  • Echo sent commands in terminal window controls whether the commands that are sent to the MUD are also echoed to the MUD window.

  • Store commands between sessions controls whether the commands you type are saved when you quit and restored when you load the world again.

  • Never hide typed text is useful with a few servers that intend to do the command echoing themselves. The sympton is that all the text typed is displayed as black dots (as if it was a password). If this happens to you, enable this option and the text will be visible.

  • Number of commands to save in history specifies the number of commands that are saved and can be recalled with the arrow keys, with the button to the right of the entry box, or with command completion. If this is set to too high a number, KildClient will consume more memory.

  • Command separator allows you to configure the token used to separate commands. By default it is %;.

  • Use single-line input bar and Use multi-line input bar define the size of the input bar. If set to single-line, it will have only one line, and if you type more text than fits the width, the text will scroll horizontally. If, however, you select a multi-line input bar, the bar will have two or more lines, and text will wrap and be displayed in the next line. (Scroll-bars may be displayed if there is more text than fits.)

    If set to multi-line, you can specify how many lines to reserve for the input bar, from two to ten.

  • Enable auto-completion controls whether the auto-completion feature (see Section 3.2) is enabled or not. However, auto-completion only works for single line input bars.

  • When auto-completion is enabled, you can specify after how many characters have been typed it will be activated. Just enter the number in the text box Activate auto-completion only after X characters have been entered.

  • Spell check typed text, if checked, enables the built-in spell checker. This spell checker works only with the multi-line input bar. If it is active, misspelled words are highlighted with a red line below them. Right-clicking on them pops up a menu with spelling suggestions.

    By default, the language used for spell checking is based on your current locale. If you want to set a specific language, enter its language code (as recognized by the aspell backend) in the box.

    Note that for spelling to work you need the gtkspell library. Your version might have been compiled without spelling support.

The Font section allows you to configure the font that is used in the command entry box. Click the button and a dialog will appear for you to select the font.

The Flood Prevention feature is also configured in this section. This feature is useful in MUDs that disconnect you if you type 20 equal commands in a row, or something like that. When you enable this feature, KildClient will count the number of repeated commands you send. When you try to send the same command for the 20th time, KildClient will send another command you specify before, thus breaking the chain of repeated commands.

To use this feature, make enable the check box Do not allow the same command to be sent X times in a row. Change X for the number of equal commands that will disconnect you.

The Send this command textbox specifies the command that will be sent to prevent too many equal commands to be seen by the MUD. It should be set to a harmless command, because it might be sent anytime.

kildclient-3.0.0/doc/C/kildclient/p12.html0000644000175000017500000002713212376345147015137 00000000000000 KildClient User's Guide

I. KildClient User's Guide

Table of Contents
1. Introduction
2. Running KildClient
3. Basic Usage
3.1. Connecting to a MUD
3.2. Interacting with the MUD
3.3. Closing Worlds and Exiting KildClient
3.4. Reviewing and Searching Text
4. Editing a World
4.1. General
4.2. Display settings
4.2.1. Main Window
4.2.2. Colors
4.2.3. Status Bar
4.3. Input
4.4. Logging
4.5. Automation
4.5.1. Scripting
4.6. Protocols
4.7. Miscellaneous
4.8. Advanced
5. Configuring KildClient
5.1. Appearance
5.2. Sending
5.3. External Programs (Linux)
5.4. Proxy
6. Menu Reference
6.1. World menu
6.1.1. Open
6.1.2. Reconnect
6.1.3. Disconnect
6.1.4. Connect to Another
6.1.5. Close
6.1.6. Edit
6.1.7. Save
6.1.8. Statistics
6.1.9. Previous and Next
6.1.10. Quit
6.2. Edit Menu
6.2.1. Cut
6.2.2. Copy
6.2.3. Paste
6.2.4. Delete
6.2.5. Find and Find Next
6.3. Input Menu
6.3.1. Clear
6.3.2. Previous and Next
6.3.3. Find Previous and Find Next
6.3.4. Command History
6.3.5. Multi-line Send
6.3.6. Test Triggers
6.4. Preferences Menu
6.4.1. Disable Triggers, Aliases, Macros or Timers
6.4.2. Debug Matches
6.4.3. Preferences
6.4.4. Edit Default World
6.5. Diplay Menu
6.5.1. Split screen
6.6. Help Menu
6.6.1. Help
6.6.2. About
7. Using Perl in KildClient
7.1. The Basics
7.2. Echoing and Sending Text
7.2.1. Paths and Speed-Walking
7.3. Playing Sounds
7.4. Saving Variables Permanently
7.4.1. Permanent Variables in the Command Line
7.5. Controlling Worlds with Perl
8. Triggers
8.1. Creating and Editing Triggers
8.1.1. Adding Triggers
8.1.2. Editing Triggers
8.2. Basic Triggers
8.3. Changing the Style of the Matched Text
8.4. Gags
8.5. Other trigger features
8.5.1. Rewriter Triggers
8.6. Defining Triggers in the Command Line
8.6.1. Editing Triggers
8.6.2. Assigning Names to Triggers
8.6.3. Reordering Triggers
8.7. Importing and Exporting
8.8. Testing Triggers
9. Aliases
9.1. Creating and Editing Aliases
9.1.1. Adding Aliases
9.1.2. Editing Aliases
9.2. Using Aliases
9.2.1. Advanced Features
9.2.2. Using Perl in Aliases
9.3. Defining Aliases in the Command Line
9.3.1. Editing Aliases
9.3.2. Assigning Names to Aliases
9.3.3. Reordering Aliases
10. Macros
10.1. Creating and Editing Macros
10.1.1. Adding Macros
10.1.2. Editing Macros
10.2. Defining Macros in the Command Line
10.2.1. Editing Macros
10.2.2. Assigning Names to Macros
10.2.3. Reordering Macros
11. Timers
11.1. Creating and Editing Timers
11.1.1. Adding Timers
11.1.2. Editing Timers
11.2. Defining Timers in the Command Line
11.2.1. Editing Timers
11.2.2. Assigning Names to Timers
11.2.3. Reordering Timers
12. Hooks
12.1. Creating and Editing Hooks
12.1.1. Adding Hooks
12.1.2. Editing Hooks
12.2. Defining Hooks in the Command Line
12.2.1. Editing Hooks
12.2.2. Assigning Names to Hooks
13. Plugins
13.1. Loading Plugins from the Command Line
13.1.1. Enabling and Disabling Plugins
13.2. Getting Information About Plugins
13.3. Standard Plugins
13.3.1. easypath
13.3.2. keypad
13.3.3. notes
13.3.4. kc256
13.3.5. channels
13.3.6. Other Plugins
14. Logging the Output
15. Using the Chat
15.1. Basic Usage
15.2. Advanced Features
15.3. Chat Functions
16. Out-of-band server data
16.1. Receiving server data
16.1.1. GMCP data
16.2. Sending server data
16.2.1. MSDP data
kildclient-3.0.0/doc/C/kildclient/x2914.html0000644000175000017500000000427612376345147015330 00000000000000 settitle

B.3. settitle

void $window->settitle( "new title" );

Sets the title of the window to the given string.

kildclient-3.0.0/doc/C/kildclient/x2818.html0000644000175000017500000000463112376345147015326 00000000000000 gotow

A.5. gotow

void gotow( number );

void gotow( name );

Focuses the Nth world (when called with a number) or the world with the given name (when called with a string). The first world is numbered 0.

kildclient-3.0.0/doc/C/kildclient/x2863.html0000644000175000017500000000430712376345147015326 00000000000000 stripansi

A.9. stripansi

$stripped = stripansi( str );

Returns the string stripped of any ANSI sequences that it had.

kildclient-3.0.0/doc/C/kildclient/x4572.html0000644000175000017500000000435712376345150015324 00000000000000 KCWin::get_text

D.2. KCWin::get_text

$text = KCWin::get_text(void);

Returns the text in the entry box.

kildclient-3.0.0/doc/C/kildclient/c2373.html0000644000175000017500000001426012376345147015274 00000000000000 Using the Chat

Chapter 15. Using the Chat

KildClient supports peer to peer chat (that is, you talk directly to the other person, and not via a server, be it a MUD server or a chat server), which allows you to talk to other users of KildClient or other clients that support the MudMaster or zChat protocols (both are supported by KildClient).

There are several advantages of chatting directly with the other person:

  • You can chat even if the MUD is down, since the MUD server is not involved.

  • Since the chat is direct, it cannot be snooped by immortals or administrators.

  • The chat is independent from the MUD, so you can chat even if you in a situation in which it would not be possible to talk through the MUD.

The chat also supports other features that are not possible through a MUD, such as snooping a session, that is, seeing everything the other player sees in the screen (if they allow you to do so, of course), or sending everything you see to your chat party (if you allow that, of course), or transfering files.

These features do not pose a security risk, because they can be disabled and the other person can only see your output if you allow it, and they can only send files if you allow them to.

15.1. Basic Usage

The chat plugin requires the Gtk3 Perl bindings, and also the Perl bindings for the vte library. If you cannot load the plugin and it complains about not finding these bindings, go to https://metacpan.org/release/Gtk3/ and download them.

To load the plugin, enter /$world->loadplugin('chat') in the command entry box. You should see Plugin loaded. If an error happened, you probably do not have the bindings mentioned in the above paragraph.

If you want to have the plugin always loaded, you can put that line (without the slash in the beginning) to your script file, and the plugin will loaded whenever you open a World.

Now that the plugin is loaded, you have two options: calling somebody or accepting calls from other persons.

The first thing you should do is set you chat nickname. To do that, type /chat::setname("nickname"). You only need to do this once, as the chat name will be saved and restored when you open the World again.

To accept calls, enter /chat::accept in the command entry box. Other people can now call you. You will need to give them your IP address. Calls are being waited on port 4050, which is the default port for the chat protocols. If you want to listen for connections in another port, just pass that port number as argument, for example, /chat::accept(5000). Be sure to inform other people the port you are using.

When somebody wants to chat to you, a dialog box will appear asking if you want to accept the chat. If you want to chat with them, select Yes to establish the chat connection, otherwise click No to deny the chat request.

To call somebody, use the call function: enter /chat::call("host"). host is the hostname or IP address of the person you wish to chat with. This command tries connecting to port 4050, if they are using another port, pass that port number as a second argument to the function.

You can substitute call for zcall. The later tries using the zChat protocol instead of the default MudMaster protocol. Use the zcall function if you know they support the zChat protocol.

If the other person accepts the chat, the connection will be established.

Each chat connection has its own window where the text received is displayed, and with an entry box where you can type messages that are sent to the other person. To send something, just enter the message and press ENTER.

There are some special commands that can be entered in chat windows, these will be described in the next session.

kildclient-3.0.0/doc/C/kildclient/x4211.html0000644000175000017500000000472012376345150015304 00000000000000 $world->silentdisalias

C.83. $world->silentdisalias

void $world->silentdisalias( number/name , ... );

Disables the alias identified by number or name. If there are several aliases with the same name, disables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success.

kildclient-3.0.0/doc/C/kildclient/x3998.html0000644000175000017500000000454012376345150015331 00000000000000 $world->next

C.69. $world->next

void $world->next( [number] );

If used without arguments, this function focuses the next open World. You can also give a numeric argument X, in this case it focuses the Xth World after the current one.

kildclient-3.0.0/doc/C/kildclient/x3212.html0000644000175000017500000000466512376345147015322 00000000000000 $world->echonl

C.21. $world->echonl

void $world->echonl( str , ... );

Prints the strings in the terminal window, each followed by a newline. They are not sent to the world.

See also $world->echo, $world->send.

kildclient-3.0.0/doc/C/kildclient/c509.html0000644000175000017500000001061212376345146015207 00000000000000 Configuring KildClient

Chapter 5. Configuring KildClient

The previous Chapter described how to configure a World. Those settings are individual for each World. There are some settings, however, that apply to KildClient as a whole, which will be described in this chapter.

To access those settings, use the Preferences->Preferences menu. The following sections will describe the groups in the Preferences dialog.

5.1. Appearance

The figure below shows the Appearance section of the Preferences dialog:

Figure 5-1. The Appearance section of the Preferences dialog

In this section you configure the colors that KildClient uses for its own purposes. (The configuration of the colors that the MUD displays is explained in Section 4.2.2.)

Two colors can be configured: Informative messages is the color used by KildClient to print messages about the status of the connection, such as the ones showing that a connection is being tried or has succeeded. Command echo specifies the color in which the commands you send to the World are printed in the screen (if this feature is enabled, see Section 4.7).

In each case, select from the drop-down list the color you want. Note that the actual color that is displayed depends on how it was configured in the World Editor (see Section 4.2.2).

How the tabs representing the open worlds are displayed is configured here. They can be at the top, bottom, left or right. Select the one you want from the combo box. You can also select whether to show tabs if there is only open open world, or hide the whole tab bar in this case.

Finally, you can enable or disable the Flash window when new text is received feature. When it is enabled, if text is received in the mud while you are at another window, KildClient's window will flash to draw your attention. If disabled, you can still know that new text has been received because the titlebar will have a (*) prepended. Note, however, that the exact behaviour of this feature might depend on your Window Manager, and that some window managers do not do anything for windows with the "Urgent" flag set.

kildclient-3.0.0/doc/C/kildclient/x3968.html0000644000175000017500000000524412376345150015330 00000000000000 $world->movemacro

C.67. $world->movemacro

void $world->movemacro( number/name , new_pos );

Moves the macro with the given name or number so that it occupies the position new_pos after execution of this function. Other macros might be moved up or down in result of this. If new_pos is negative or greater than the number of macros, the macro is moved to the last position.

If there are several macros with the given name, only the first one found is moved.

kildclient-3.0.0/doc/C/kildclient/x4581.html0000644000175000017500000000435012376345150015315 00000000000000 KCWin::set_text

D.3. KCWin::set_text

void KCWin::set_text( $text );

Sets the text in the entry box.

kildclient-3.0.0/doc/C/kildclient/x1766.html0000644000175000017500000002711112376345147015325 00000000000000 Defining Macros in the Command Line

10.2. Defining Macros in the Command Line

For those more used to Perl and to command lines, it is also possible to define and alter macros from the command line. This is done with a series of Perl function.

Macros are set defining, as mentioned above, a key and an action. The key is key keycode for the key you wish to assign the macro to. The easiest way to get the keycode for a given key is with the $world->getkeycode function. This function takes no parameters. When run, it prompts you to press a key, and then prints the keycode for the key. It also returns the keycode as a string, so you can save it in a variable and use when defining the macro.

Here's a way to define a macro:

Example 10-1. Defining a macro


/$key = $world->getkeycode
Press a key to get its keycode.
Press the F5 key
Key code: F5
/$world->macro($key, 'drink from fountain')

The above session shows how to assign drink from fountain to the F5 key. Note that $world->getkeycode prompts you for a key and prints its keycode. Additionally, the keycode is returned, and it is stored in the $key variable. This variable is used as the first argument to the $world->macro function, that takes two arguments: the keycode and the action. We could have entered 'F5' directly, but using the keycode returned by $world->getkeycode is easier and less error-prone.

That's pretty much all about defining macros. They do not take arguments, it is all about executing simple commands. Other things that could be done are executing several commands (separating them with %;) or executing a Perl statement or function.

10.2.1. Editing Macros

Before going into editing, let us see how to get a list of all macros that are currently defined for the World. Just use the $world->listmacro function without arguments. You will be presented with a list of the currently defined macros.

There are four columns: Num is the number of the macro. Macros are numbered sequentially starting at zero. This number will be useful when we start editing them. After that, Ena tells whether the macro is enabled. Macros that are disabled are not executed even if the key is pressed. This is a nice way to stop a macro from working, but keep it stored for later use. We will see how to enable and disable macros later in this section. The final two columns list the keycode and action of the alias.

The listing produced by $world->listmacro is compact, showing all macros but possibly truncating the keycode and/or action. If you give a macro number as argument to listmacro, it will display that macro's information detailedly.

To edit a macro, you need to know that macro's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->getmacronumber can be used to discover a macro's number if its name is known.) The same function used to add macros can also change existing ones, you just need to pass the macro number as the first argument.

Calling $world->macro(number, new keycode) changes the key of the macro with that number. If you want to change the key and action, include the substitution as a third argument: $world->macro(number, new key, new action). What if you want to change only the action? Since passing only one string argument would change the key, this is done in a different way. In brief, this is how you would change only the key: $world->macro(number, { action => new action }). Notice that the key is passed as an attribute inside the curly braces. It is also possible to change the key this way, just use the attribute key.

The only attribute for macros, besides the key and action, is enabled. It was mentioned briefly when we described how to list macros. It can be set just like the other attributes and is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the macro is run normally. When it is zero, even if the key is pressed, the macros is not run. This way, disabling an alias effectively turns if off, as if it did not exist, but the macro is still saved, and can be turned on again when necessary.

Here's an example of disabling a macro (number 3 in this case):

Example 10-2. Disabling a macro, the long way


$world->macro(3,
              { enabled => 0 })

However, there is a shorter way: the $world->dismacro function disables the meacro whose number is passed as argument. So the example above can be rewritten in a shorter way as:

Example 10-3. Disabling a macro, the short way


$world->dismacro(3)

The corresponding function $world->enamacro enables the specified macro.

It is also possible to temporarily disable all macros. Just use the menu Preferences->Disable Macros and this will prevent macros from running. This does not change the "enabled" status of any macros, it just prevents all macros from running. When you select the menu again, macros that were enabled will run again, and those that were disabled will remain disabled.

There are times when you want to delete a macro. This is easy to do, use the $world->delmacro function. It takes as argument the number of the macro you wish to delete. Be aware that once deleted it is not possible to recover the macro (unless you create it again). Many times just disabling the macro is a better idea. The second thing to note is that when you delete a macro the numbers of the other macros may change, so be careful when you try to delete several macros in sequence.

10.2.2. Assigning Names to Macros

It is possible to assign names to macros. When a macro has a name, you can enable, disable, or delete it using its name instead of its number.

To assign a name to a macro, specify the name attribute when creating it:

Example 10-4. Creating a macro with a name


$world->macro($key, 'drink from fountain',
              { name => 'drink' })

You can now disable this macro with $world->dismacro('drink'). The name can also be used in the $world->enamacro, $world->delmacro and $world->listmacro functions.

It is also possible to assign a name to an existing macro. Just edit it as described in Section 10.2.1, passing the name attribute. Use this same process to change the name of a macro.

Another feature of macro names is that several macros can have the same name. In this case, all these macros will be treated as a single group. The functions above, when passed a macro name, will act upon all macros of the group, that is, on all macros with that name.

10.2.3. Reordering Macros

Macros are tried from the first to the last, so in some cases the order of the macros matters. It is possible to move an macro to another position with the $world->movemacro function.

The function takes two parameters: the first is the name or number of the macro that you want to move. The second is the new position that the macro will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of macros, the macro will be moved to the end of the list.

If there are several macros with the same name, only the first one found will be moved. And when an macro is moved, other macros might move up or down to accomodate the change.

kildclient-3.0.0/doc/C/kildclient/x4381.html0000644000175000017500000000544712376345150015323 00000000000000 $world->timerenabled

C.94. $world->timerenabled

result = $world->timerenabled( name/number );

This functions checks whether the specified timer exists and whether it is enabled.

You can pass either a timer number or name. If the timer does not exist, this function returns undef, so you can distinguish the case of a non-existant timer from a disabled one.

If the timer exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several timers with the same name, it returns a list with one value for each timer with that name, and each value is 0 or 1 depending on the state of the timer.

kildclient-3.0.0/doc/C/kildclient/x2784.html0000644000175000017500000000432212376345147015325 00000000000000 getclientname

A.2. getclientname

$name = getclientname(void);

This functions returns the name of the client, that is, "KildClient.

kildclient-3.0.0/doc/C/kildclient/x3443.html0000644000175000017500000000531512376345150015313 00000000000000 $world->getmacronumber

C.40. $world->getmacronumber

@list = $world->getmacronumber( name );

Returns a list with the number(s) of the macro(s) matching the given name. If no macro with that name is found, returns an empty list. If there are several macros with the same name, returns the numbers of all of them.

The number of a macro is necessary to edit it. However, as the user can change the order of macros, create new ones and delete old macros, a macro's number may change, so you should not store its number; you must fetch the number just before editing it.

kildclient-3.0.0/doc/C/kildclient/x3504.html0000644000175000017500000001172012376345150015306 00000000000000 $world->hook

C.46. $world->hook

void $world->hook( event , action , [attributes] );

void $world->hook( event , number , [action] , [attributes] );

A hook is an action that is connected to an event, such as connecting to the World or the window receiving focus. This functions allow you to define a hook for a given event, that will execute action, or to edit the hook identifyed by number.

Here are the events currently supported:

  • OnConnect: This hook is execued when a connection to the world is made, after the auto-logon has taken place (if applicable).

  • OnDisconnect: This hook is executed when you are disconnected from a World, after the connection has been closed.

  • OnReceivedText: Executed when text is received from the world.

  • OnSentCommand: Executed after a command is sent to the world. The command is available for the hook in the $hookdata variable, and can be inspectd in Perl scripts.

  • OnGetFocus: Executed when the KildClient window receives the focus.

  • OnLoseFocus: Executed when the KildClient window loses the focus.

  • OnCloseConnected: Executed when the world is forcedly closed. This can happen using the World->Close menu, the $world->close() function, or by quitting the program with the world connected. You can put in this hook, for example "quit" to always exit the MUD nicely, even if you close the world by mistake.

atributes is a reference to a hash defining attributes for the hook. Generally the call works like this:


$world->hook("event", "action", { attribute1 => value1,
                                  attribute2 => value2, ... })

Possible attributes:

  • action: The action to be executed.

  • enabled: If value evaluates to true, the hook is enabled. If it evaluates to false, the hook is disbled and is not executed.

  • name: Assigns a name to the hook, so that it can be referenced by name.

kildclient-3.0.0/doc/C/kildclient/p2747.html0000644000175000017500000003330312376345150015307 00000000000000 KildClient Programmer's Reference

II. KildClient Programmer's Reference

Table of Contents
A. Global Function Reference
A.1. colorize
A.2. getclientname
A.3. getversion
A.4. getworld
A.5. gotow
A.6. help
A.7. play
A.8. quit
A.9. stripansi
A.10. stripcolorize
B. $window Reference
B.1. getsize
B.2. minimize
B.3. settitle
B.4. seturgencyhint
C. $world Reference
C.1. $world->{SILENT}
C.2. $world->alias
C.3. $world->close
C.4. $world->aliasenabled
C.5. $world->cmdseparator
C.6. $world->commandecho
C.7. $world->connectother
C.8. $world->dc
C.9. $world->delalias
C.10. $world->delhook
C.11. $world->delmacro
C.12. $world->deltimer
C.13. $world->deltrigger
C.14. $world->disalias
C.15. $world->dishook
C.16. $world->dismacro
C.17. $world->displugin
C.18. $world->distimer
C.19. $world->distrigger
C.20. $world->echo
C.21. $world->echonl
C.22. $world->echonlandlog
C.23. $world->enaalias
C.24. $world->enahook
C.25. $world->enamacro
C.26. $world->enaplugin
C.27. $world->enatimer
C.28. $world->enatrigger
C.29. $world->expandalias
C.30. $world->gag
C.31. $world->getaliasnumber
C.32. $world->getcharacter
C.33. $world->getconntime
C.34. $world->getentryfont
C.35. $world->gethooknumber
C.36. $world->getidletime
C.37. $world->getkeycode
C.38. $world->getline
C.39. $world->getlogfile
C.40. $world->getmacronumber
C.41. $world->getmainfont
C.42. $world->getname
C.43. $world->getpluginversion
C.44. $world->gettimernumber
C.45. $world->gettriggernumber
C.46. $world->hook
C.47. $world->hookenabled
C.48. $world->interpret
C.49. $world->ispermanent
C.50. $world->listalias
C.51. $world->listhook
C.52. $world->listmacro
C.53. $world->listpermanent
C.54. $world->listplugin
C.55. $world->listtimer
C.56. $world->listtrigger
C.57. $world->loadplugin
C.58. $world->logfile
C.59. $world->macro
C.60. $world->macroenabled
C.61. $world->movetimer
C.62. $world->makepermanent
C.63. $world->maketemporary
C.64. $world->mlsend
C.65. $world->movealias
C.66. $world->movehook
C.67. $world->movemacro
C.68. $world->movetrigger
C.69. $world->next
C.70. $world->path
C.71. $world->prev
C.72. $world->reconnect
C.73. $world->requireplugin
C.74. $world->save
C.75. $world->send
C.76. $world->sendecho
C.77. $world->sendfile
C.78. $world->sendlines
C.79. $world->sendmsdpcommand
C.80. $world->sendnoecho
C.81. $world->sendserverdata
C.82. $world->setstatus
C.83. $world->silentdisalias
C.84. $world->silentdishook
C.85. $world->silentdismacro
C.86. $world->silentdistimer
C.87. $world->silentdistrigger
C.88. $world->silentenaalias
C.89. $world->silentenahook
C.90. $world->silentenamacro
C.91. $world->silentenatimer
C.92. $world->silentenatrigger
C.93. $world->timer
C.94. $world->timerenabled
C.95. $world->trigger
C.96. $world->triggerenabled
C.97. $world->writetolog
D. Using KCWin for Input/Output Windows
D.1. Changes from Previous Versions
D.2. KCWin::get_text
D.3. KCWin::set_text
D.4. KCWin::feed
E. Writing Plugins
E.1. The File Format
E.2. A Sample Plugin
E.3. Disposing Data When the Plugin Is Unloaded
E.4. Enabling and Disabling Plugins
E.5. Conditional Loading of Plugins
E.5.1. Plugins That Require Other Plugins
E.6. Using GTK+ From Plugins
E.7. Plugin Conventions
kildclient-3.0.0/doc/C/kildclient/x424.html0000644000175000017500000000615512376345145015236 00000000000000 Automation

4.5. Automation

This section allows you to configure the features that make your MUD playing experience easier, faster and more efficient. You can define triggers, aliases, hooks, etc. here. These sections of the World Editor will be described elsewhere, along with a description of the features. Here we will deal with another section that is more generic.

4.5.1. Scripting

The figure below shows the Scripting section of the World Editor:

Figure 4-7. The Scripting section of the World Editor

There is only one parameter to be configured in this section: Perl file to load. It allows you to specify a file that will be read by the Perl interpreter when the World is loaded. This file can contain sub-routine definitions that will be available for you to use in your triggers, aliases etc., or to be called directly. For more details, see Section 7.1.

Enter the path to the file in the textbox, or click the button next to it to open a dialog from which you can select a file.

kildclient-3.0.0/doc/C/kildclient/x4048.html0000644000175000017500000000576412376345150015325 00000000000000 $world->requireplugin

C.73. $world->requireplugin

$success = $world->requireplugin( name );

This function is similar to $world->loadplugin, but first checks if the plugin is already loaded. If it is, it returns successfully. If not, it tries loading the plugin (silently). If this succeeds, the function returns successfully, if not, it die()'s. This function is useful in plugins that require other plugins, and is meant to be called in a BEGIN block of a plugin that requires another.

The argument passed must be the name of the plugin (a path to the file is not allowed, unlike with $world->loadplugin. See $world->loadplugin for information on how plugins are found.

kildclient-3.0.0/doc/C/kildclient/x3360.html0000644000175000017500000000444612376345147015323 00000000000000 $world->getconntime

C.33. $world->getconntime

$seconds = $world->getconntime(void);

This function returns the time spent connected to the world, in seconds.

kildclient-3.0.0/doc/C/kildclient/x3482.html0000644000175000017500000000534012376345150015314 00000000000000 $world->gettimernumber

C.44. $world->gettimernumber

@list = $world->gettimernumber( name );

Returns a list with the number(s) of the timer(s) matching the given name. If no timer with that name is found, returns an empty list. If there are several timers with the same name, returns the numbers of all of them.

The number of a timer is necessary to edit it. However, as the user can change the order of timers, create new ones and delete old timers, a timer's number may change, so you should not store its number; you must fetch the number just before editing it.

kildclient-3.0.0/doc/C/kildclient/x3575.html0000644000175000017500000000556012376345150015323 00000000000000 $world->hookenabled

C.47. $world->hookenabled

result = $world->hookenabled( event , name/number );

This functions checks whether the specified hook exists and whether it is enabled.

The first argument is the name of the event. For the second, you can pass either a hook number or name. If the hook does not exist, this function returns undef, so you can distinguish the case of a non-existant hook from a disabled one.

If the hook exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several hooks with the same name, it returns a list with one value for each hook with that name, and each value is 0 or 1 depending on the state of the hook.

kildclient-3.0.0/doc/C/kildclient/x1362.html0000644000175000017500000000717112376345146015320 00000000000000 Importing and Exporting

8.7. Importing and Exporting

You can export triggers, aliases, macros, timers, permanent variables and hooks to a file, and them load these objects in another World. This function is accessed via the World Editor.

To export some items, select them from the list. (You can select several items by holding the Control key and clicking.) Press the Export button, and a dialog will open for you to select a file name. Select a name, press Save and the selected items will be saved to the file.

The export function is accessible from the editors for all exportable objects (triggers, aliases, macros, timers, permanent variables and hooks). By default, it only exports one kind of object, the one currently displayed. But you can export more than one kind of object to the same file (for example, triggers and aliases, or aliases, macros and hooks, or even all of them). To do that, select all the items you want from all the pages in the World Editor. Then, from any page, select Export. From the dialog that opens, click Items to export. Several check boxes will appear. Mark the ones corresponding to the objects you want to export, and all corresponding selected objects will be imported.

After you have exported some items, you can import them in another World, even in another machine. Just open one of the editors (it doesn't matter which one, you can import triggers even from the alias editor), and press Import. Select the file from the dialog, and all items in the file will be imported and will be included in the current World.

kildclient-3.0.0/doc/C/kildclient/x4273.html0000644000175000017500000000473412376345150015321 00000000000000 $world->silentenaalias

C.88. $world->silentenaalias

void $world->silentenaalias( number/name , ... );

Enables the alias identified by number or name. If there are several aliases with the same name, enables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success.

kildclient-3.0.0/doc/C/kildclient/x3672.html0000644000175000017500000000463412376345150015322 00000000000000 $world->listpermanent

C.53. $world->listpermanent

void $world->listpermanent(void);

This function prints a list of all variables that are defined as permanent, that is, variables that will be saved when you close the world and have their values restores when the world is re-opened.

kildclient-3.0.0/doc/C/kildclient/x570.html0000644000175000017500000000554512376345146015243 00000000000000 Proxy

5.4. Proxy

The figure below shows the Proxy section of the Preferences dialog:

Figure 5-4. The Proxy section of the Preferences dialog

In this section you configure the default proxy settings that will apply to Worls that are configured to use the global proxy configuration. It is possible for individual worlds to override the settings configured here, see Section 4.1.

The default setting is No proxy, which means connect directly to the MUD's host. Alternatively, you can use a SOCKS4, SOCKS5 or HTTP server. You must provide the proxy server hostname or IP address and the port to connect to. If the proxy requires authentication, supply the credentials in the Username and Password fields.

kildclient-3.0.0/doc/C/kildclient/x2844.html0000644000175000017500000000424412376345147015325 00000000000000 play

A.7. play

void play( file );

This function plays a sound file. The argument is the path to the file.

kildclient-3.0.0/doc/C/kildclient/x4127.html0000644000175000017500000000662312376345150015316 00000000000000 $world->sendlines

C.78. $world->sendlines

success = $world->sendlines( "multi-line string" , [delay , [n-lines]] );

success = $world->sendlines( [ "line 1", "line 2", ... ] , [delay , [n-lines]] );

Sends several lines of text to the world. delay is the number of seconds to wait between sending each group of lines, and n-lines is the number of lines to send a time. If these values are not specified, they are taken from the defauls set in the Preferences dialog (see Section 5.2).

There are two ways to specify the lines to be sent: the first is passing a multi-line string, which is split into lines and each line is sent separately. The second one is passing a reference to an array where each element consists of one line.

This function always returns true.

For more options, see the $world->mlsend function which allows adding a text before and/or after each line, and sending lines before and/or after sending the contents of the file.

kildclient-3.0.0/doc/C/kildclient/x1212.html0000644000175000017500000004160312376345146015310 00000000000000 Defining Triggers in the Command Line

8.6. Defining Triggers in the Command Line

For those more used to Perl and to command lines, it is also possible to define and alter triggers from the command line. This is done with a series of Perl function.

Triggers are defined with the $world->trigger function. There are many ways to use this function, and we will start describing them here.

The simples way to use that function is with two arguments: $world->trigger(pattern, action). This defines a trigger that will match against pattern and execute action when a match happens.

Here's how to define the trigger in Example 8-1 in the command line:

Example 8-10. A very simple trigger defined in the command line


$world->trigger('has attacked you!', 'wield sword')

To specify other trigger features an extra argument is passed to the trigger function. For those that know Perl, it is a reference to a hash, and this hash can contain some attributes specifying the trigger's behaviour. For those that do not understand the previous sentence, do not worry, the examples should make the usage clear.

Let's re-create a simple gag to omit all that is said by Joe (see Example 8-5):

Example 8-11. A simple gag (in the command line)


$world->trigger('^Joe chats',
                '/$world->echonl("Joe said something silly here.")',
                { gag => 1 })

See the difference? There is a third parameter, enclosed in curly braces {}, with the word gag, an arrow, and the number 1. What that means is that gag has the value 1, or, as usual in computer languages, is true. (False would be zero.)

Often gags do not have any action:

Example 8-12. A gag with no action (in the command line)


$world->trigger('^Joe chats',
                { gag => 1 })

The action has simply been omitted, but the argument that specifies that we are dealing with a gag remains, naturally. As a matter of fact, this kind of gag (with no action) is quite common, and there is a shorter way to do that. The command below has the exact same effect as the previous one:

Example 8-13. A shortcut function to define gags


$world->gag('^Joe chats')

The gag attribute only controls whether the line is displayed in the screen or not. If you have logging enabled (see Chapter 14), a the line that matched a trigger with the gag attribute will be written in the log file normally. If you want the line to be omitted from the log file, you must set also the gaglog attribute. If it is set, then the line will not be written to the log file. Note that the two attributes are independent: you can gag the line from the screen, from the log file, from both or from neither.

To make case be ignored when matching, use a very similar construct as the above, but using the ignorecase attribute:

Example 8-14. A case-insensitive trigger


$world->trigger('^.* chats ".*joe.*"', '/callAttention()',
                { ignorecase => 1})

Another attribute that can be set for triggers is keepexecuting, corresponding to the Keep executing triggers after this one matches option (see Section 8.5). This flag is specified just like gag. Just add the parameter { keepexecuting => 1 } to the function call. It is possible for a trigger to be both a gag and have the keepexecuting flag. In this case, include both in the last argument: { gag => 1, keepexecuting => 1 }. Note it is just one argument, with both flags separated by a comma. The order does not matter, keepexecuting could have come before gag.

Similarly, rewriter triggers (see Section 8.5.1) are created with the rewriter flag.

8.6.1. Editing Triggers

In the previous sections it was shown how to add triggers, but nothing was told about how to change them after they are defined. This and other points will be addressed in this section.

Before going into editing, let us see how to get a list of all triggers that are currently defined for the World. Just use the $world->listtrigger function without arguments. You will be presented with a list of the currently defined triggers.

There are several columns: Num is the number of the trigger. Triggers are numbered sequentially starting at zero. This number will be useful when we start editing triggers. Next comes gag, which tells whether the trigger is a gag (for the screen). Next is GLo, which means "Gag from Log", and shows whether the line is omitted (that is, not written) in the log file also (if logging is enabled, of course). After that, Ena tells whether the trigger is enabled. Triggers that are disabled are not matched. This is a nice way to stop a trigger, but keep it stored for later use. We will see how to enable and disable triggers later in this section. Next there is KeE, which reports the status of the keepexecuting flag for the trigger. After that, IgC specifies the case is being ignored. The final two columns list the pattern and action of the trigger.

The listing produced by $world->listtrigger is compact, showing all triggers but possibly truncating the pattern and/or action. If you give a trigger number as argument to listtrigger, it will display that trigger's information detailedly.

To edit a trigger, you need to know that trigger's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->gettriggernumber can be used to discover a trigger's number if its name is known.) The same function used to add triggers can also change existing ones, you just need to pass the trigger number as the first argument.

Calling $world->trigger(number, new pattern) changes the pattern of the trigger with that number. If you want to change the pattern and action, include the action as a third argument: $world->trigger(number, new pattern, new action). What if you want to change only the action? Since passing only one string argument would change the pattern, this is done in a different way, using the same hash that is used to pass attributes to the trigger. In brief, this is how you would change only the action: $world->trigger(number, { action => new action }). Notice that the action is passed as an attribute inside the curly braces. It is also possible to change the pattern this way, just use the attribute pattern.

Naturally, it is possible to attributes such as gag or keepexecuting. The syntax is the same, include the new value inside the curly braces. To clear one of those flags, use the value 0, which means false. The example below makes trigger number 2 stop being a gag, and at the same time sets it not to prevent matching of other triggers:

Example 8-15. Changing several attributes at once


$world->trigger(2,
                { gag => 0,
                  keepexecuting => 1 })

It is also possible, naturally, to change attributes such as pattern or action at the same time that gag or keepexecuting are changed. All these attributes are equal, the only difference is that since the pattern and action are used much more often, there is a shorter way of specifying them. But even when you create a trigger you can use this extended syntax. Example 8-10 could be also entered this way, with the exact same results:

Example 8-16. A very simple trigger, in another way


$world->trigger({ pattern => 'has attacked you!',
                  action => 'wield sword'})

The final attribute for triggers is enabled. It was mentioned briefly when we described how to list triggers. It can be set just like the other attributes, and like keepexecuting or gag it is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the trigger is matched normally. When it is zero, received lines are not matched against it. This way, disabling a trigger effectively turns if off, as if it did not exist, but the trigger is still saved, and can be turned on again when necessary.

Here's an example of disabling a trigger (number 3 in this case):

Example 8-17. Disabling a trigger, the long way


$world->trigger(3,
                { enabled => 0 })

However, there is a shorter way: the $world->distrigger function disables the trigger whose number is passed as argument. So the example above can be rewritten in a shorter way as:

Example 8-18. Disabling a trigger, the short way


$world->distrigger(3)

The corresponding function $world->enatrigger enables the specified trigger.

It is also possible to temporarily disable all triggers. Just use the menu Preferences->Disable Triggers and this will prevent triggers from running. This does not change the "enabled" status of any triggers, it just prevents all triggers from running. When you select the menu again, triggers that were enabled will run again, and those that were disabled will remain disabled.

There are times when you want to delete a trigger. This is easy to do, use the $world->deltrigger function. It takes as argument the number of the trigger you wish to delete. Be aware that once deleted it is not possible to recover the trigger (unless you create it again). Many times just disabling the trigger is a better idea. The second thing to note is that when you delete a trigger the numbers of the other triggers may change, so be careful when you try to delete several triggers in sequence.

8.6.2. Assigning Names to Triggers

It is possible to assign names to triggers. When a trigger has a name, you can enable, disable, or delete it using its name instead of its number.

To assign a name to a trigger, specify the name attribute when creating it:

Example 8-19. Creating a trigger with a name


$world->trigger('has attacked you!', 'wield sword',
                { name => 'attack' })

You can now disable this trigger with $world->distrigger('attack'). The name can also be used in the $world->enatrigger, $world->deltrigger and $world->listtrigger functions.

It is also possible to assign a name to an existing trigger. Just edit it as described in Section 8.6.1, passing the name attribute. Use this same process to change the name of a trigger.

Another feature of trigger names is that several triggers can have the same name. In this case, all these triggers will be treated as a single group. The functions above, when passed a trigger name, will act upon all triggers of the group, that is, on all triggers with that name.

8.6.3. Reordering Triggers

Triggers are tried from the first to the last, so in some cases the order of the triggers matters. It is possible to move a trigger to another position with the $world->movetrigger function.

The function takes two parameters: the first is the name or number of the trigger that you want to move. The second is the new position that the trigger will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of triggers, the trigger will be moved to the end of the list.

If there are several triggers with the same name, only the first one found will be moved. And when a trigger is moved, other triggers might move up or down to accomodate the change.

kildclient-3.0.0/doc/C/kildclient/x4285.html0000644000175000017500000000500012376345150015307 00000000000000 $world->silentenahook

C.89. $world->silentenahook

void $world->silentenahook( event , number/name , ... );

Enables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, enables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success.

kildclient-3.0.0/doc/C/kildclient/c39.html0000644000175000017500000001204712376345145015130 00000000000000 Basic Usage

Chapter 3. Basic Usage

This chapter will describe the most basic and important things you need to know in order to use KildClient. It is recommended that you read this section throughly, as it will ease understanding of the next chapters.

3.1. Connecting to a MUD

When you launch KildClient (see Chapter 2), you'll see a screen like this one below:

Figure 3-1. When KildClient is first started, you are asked to connect to a world

Before anything else, be aware that World is just a synonym for MUD, and these two words will be used interchangeably in this document.

The list of saved worlds may be empty, especially if this is the first time ever KildClient is run.

You have two options: connect to a previously saved World, or connect to a new one. To connect to a new one, you can either connect direcly by typing the MUD's address and port in the boxes, or by creating a new World.

Creating a new World is recommended because it allows you to save options for that world, such as the font size or the colors used. When you define triggers, aliases these will also be saved.

However, even if you connect directly, you can still customize the World, and you have the option of saving it, so the difference between the options is not so great.

To create a new World, press the button labeled New. You'll be taken to the World Editor, a dialog in which you can configure everything about the World. We'll talk about the World Editor in Chapter 4. For now, fill in the Name, Host and Port fields, and click OK.

To connect to a saved World, just select it and click the button labeled Connect. Alternatively, you can double-click the World in the list.

Sometimes you may see a little expander sign to the left of a World's name, and when you click it some options appear inside that World. This happens when there is more than one character associated with that World (see Section 4.1 for information on auto-login and associating characters with a World). The list shown is the list of all characters defined for that World. Select the entry corresponding to the character you want to use to auto-login with that character. If you select the main entry, the first character will be used.

To connect directly, fill in the Host and Port fields and click Connect.

You can be connected to several Worlds simultaneously. To do that, select the option World->Open from the menu. The World Selector dialog will be opened, and you can select another World.

kildclient-3.0.0/doc/C/kildclient/x3073.html0000644000175000017500000000452312376345147015320 00000000000000 $world->delalias

C.9. $world->delalias

$n = $world->delalias( number/name );

Deletes the alias identified by the given number or name. If there are several aliases with the same name, deletes them all. Returns the number of aliases deleted.

kildclient-3.0.0/doc/C/kildclient/c2350.html0000644000175000017500000000751512376345147015274 00000000000000 Logging the Output

Chapter 14. Logging the Output

Logging can be configured in the World Editor, see Section 4.4, but there are also functions to start and stop logging from the command line.

Logging is controlled with the $world->logfile function. The first argument specifies the path to the file where the output is saved. If the file already exists, new text will be appended to it.

The file name is passed throught strftime(), so you can log to different files depending on the date and/or time. Also, you can use %Kw in the file name and it will be replaced by the name of the World. And the string %Kc is replaced by the name of the character used in auto-login (see Section 4.1). (If auto-login was not used, then %Kc is replaced by an empty string.)

The second argument, if present, controls the format of the timestamp. If you do not want a timestamp, then do not pass a second argument, pass only the file name. This timestamp argument is a string with control codes. Each control code will be substituted by a part of the time or date. This sequences are the ones of the strftime() C function, so see its man page for the list of control sequences.

Here's an example that turns on logging, with a timestamp that shows the date and time:

Example 14-1. Enabling logging


$world->logfile('/home/bob/mud/mudlog.txt', '%b/%d %H:%M:%S> ')

To turn off logging, just call logfile with no arguments.

There are functions to write arbitrary text to the log file: $world->writetolog and $world->echonlandlog.

kildclient-3.0.0/doc/C/kildclient/x168.html0000644000175000017500000001231612376345145015237 00000000000000 Reviewing and Searching Text

3.4. Reviewing and Searching Text

Figure 3-3. A typical KildClient session with two open Worlds

The main box that shows the output of the MUD keeps by default the last 2000 lines received (but this number can be changed, see Section 4.7). You can recall the previous lines with the scrollbar or with the page up and page down keys.

You can split the main window in two parts. This way, you can use the bottom part to display text as it arrives from the MUD, and use the top one to review something that was received before. To do that, select the Display->Split Window menu. To adjust the size of the windows, drag the bar that separates them. Alternatively, you can drag directly the separation bar that appears just below the tabs with the open worlds.

You can search the text saved in the buffer for occurrences of a given word. To do that, use the Edit->Find menu.

When you select that menu, a bar appears above the command entry box. Search is done through that bar. To start searching, type the text you want to find in the entry box in the search bar. Searching in KildClient is done incrementally, that is, as soon as you type the first character, search starts (displaying the first occurrence of that character). As you continue typing, searching continues, always looking for occurrences of the text that you have typed. If you are looking for a word, often you don't even need to type the whole word, only the beginning is enough.

If the window is split, then the bottom window is not changed and keeps displaying the same part, and the matches are displayed in the top part.

If you've found an occurrence of the text, but it is not the one you intended, use the Find Next button beside the entry box to find the next occurrence. (You can also use the Edit->Find Next menu.) Pressing the Enter key when in the input box also activates the Find Next feature.

If the text you typed is not found, or if there are no more occurrences of it when you press Find Next, Not Found will be displayed in the search bar. In this case, you can erase some characters and try again (if you made a mistake), or reset the search and start again, as described below.

To reset a search so that you can start again, either erase all the text in the search box, or select Edit->Find from the menu again (which will also clear the entry box). When you do that, searching will start again at the top of the buffer.

After you're done searching, click the small button with an X in the left of the search bar to close the search bar. You can also press Esc in the input box.

kildclient-3.0.0/doc/C/kildclient/x2924.html0000644000175000017500000000455312376345147015327 00000000000000 seturgencyhint

B.4. seturgencyhint

void $window->seturgencyhint( boolean );

Sets the value of the window's "urgency" flag to true or false. This is a request for attention to the window, and usually will make the window title flash. However note that the actual behavior depends on the window manager used.

kildclient-3.0.0/doc/C/kildclient/x458.html0000644000175000017500000000646612376345145015252 00000000000000 Miscellaneous

4.7. Miscellaneous

The figure below shows the Miscellaneous section of the World Editor:

Figure 4-9. The Miscellaneous section of the World Editor

The first category, Scrolling, which controls the behavious of the scrollback buffer.

  • Scroll on output, when checked, will cause the buffer to always scroll the end when new text is received, thus displaying it immediately. If not checked, the buffer is only scrolled if you are at the end.

  • Lines to save in scrollback buffer determines how many lines of output will be saved in the buffer for you to see again. Note that KildClient will get slower and will consume more memory if you set this to too high a number.

The second category, Name display, controls how this world is identified in the tabs and in the window title. By default, only its name is used. But you can also display the name of the character logged in (provided auto logon was used, see section Section 4.1). If none of the options suit you, you can define your own. Use %Kw to represent the world name and %Kc to represent the character.

kildclient-3.0.0/doc/C/kildclient/c586.html0000644000175000017500000001165512376345146015224 00000000000000 Menu Reference

Chapter 6. Menu Reference

This chapter will describe all the menus and their commands in KildClient.

6.1. World menu

6.1.1. Open

This menu command opens the World Selector dialog for you to connect to a World, either a saved one or a new one. You can also edit the saved worlds from the World Selector dialog.

See Section 3.1 for more information on opening Worlds.

6.1.2. Reconnect

If you are not connected to a World, but have it still open (in offline mode), use this menu to connect again to the World. If you are connected, this command closes the current connection and reopens it.

6.1.3. Disconnect

This command closes the connection to the World. Note that this is not the recommended way to exit from a MUD, you should use the proper command (generally quit).

6.1.4. Connect to Another

This command opens the World Selector (see Section 3.1) for you to connect to another World using the same tab. If you are still connected to a World, the connection will be closed.

6.1.5. Close

This command closes the connection to the World (if it is open) and closes the current tab. If this is the only tab, the program is exited.

6.1.6. Edit

This command brings up the World Editor for you to configure the World. See Chapter 4.

6.1.7. Save

This command saves any changes made to the World to the disk so that they are made permanent. Note that whenever a World is closed, it is automatically saved before.

6.1.8. Statistics

This command opens a dialog showing some information and statistics about the currently open World. If the version you are running supports SSL and you are connected using SSL (see Section 4.1), some information about the SSL session and the certificate are displayed.

6.1.9. Previous and Next

These two commands allow you to navigate between the open Worlds, going to the next or previous tabs, repectively.

6.1.10. Quit

This command exits KildClient, closing any open Worlds. If an open world has "OnCloseConnected" hooks (see Chapter 12), they are executed. If there is at least one open world without such hook, you are asked for confirmation first.

kildclient-3.0.0/doc/C/kildclient/c1396.html0000644000175000017500000002320112376345146015272 00000000000000 Aliases

Chapter 9. Aliases

Aliases allow you to define shortcuts for simple commands. For example, you can define df to be an alias to drink from fountain, and then you can type only df in the command line, and drink from fountain will be sent to the mud.

However, in KildClient aliases can do much more. They allow you to rewrite part of the input line. In the example above, what happened is that df was replaced by drink from fountain. Aliases such as these replace the entire short command you type by a longer command, but you can also replace part of the line. If a mob has a really long name, such as Ingeloakastimizilian, you can define an alias "ing" that is replaced by "Ingeloakastimizilian", and whenever you type ing, even in the middle of another command, it will be replaced by the full name.

Aliases are implemented as a substitution, just like the "Search and Replace" option found in several programs. They consist of two parts: a pattern and a substitution. Each line you type is matched against the pattern and if it matches, the matched part is replaced by the substitution.

For those who know Perl, aliases work just like Perl's s/// operator. As a matter of fact, they are implemented with s///. This is more or less how the alias processing is done:


$line =~ s/$pattern/$substitution/;

Supposing $line holds the entered command, $pattern the pattern and $substitution the substitution. Then $line is sent to the World, possibly having been modified.

If you are having trouble with aliases and want to be informed whenver an alias matches, enable the Preferences->Debug Matches menu. When this is enabled, information about each matched alias will be printed to stderr. (This means you must start KildClient from a terminal to see the output.)

9.1. Creating and Editing Aliases

The easiest way to create and alter aliases is from the World Editor, the place where all settings of a World are altered (see Chapter 4).

Aliases are defined in the Aliases section inside the Automation section. When you open that section, you'll see a list of the defined aliases and some buttons like this:

Figure 9-1. The graphical Alias editor

The main part of the window is the list of defined aliases. The columns are as follows:

  • Enabled specifies whether the alias is enabled or not. Aliases that are not enabled are not active and will not be tried when a command is entered, but they remain in the list so that they can later be enabled again.

  • Name is a name that is assigned to an alias. This helps you identify the alias' purpose and is useful when editing an alias via the command line (as described in Section 9.3.1). Assigning a name to an alias is optional.

  • Pattern and Substitution are the parameters for the alias, and they define the alias' action, as described above.

  • I Case (for "Ignore Case"), if set, means the case is not considered while matching the pattern, that is, a case-insensitive match is done.

  • Eval as Perl controls how the alias is evaluated. This option will be described later.

  • Plugin: if this is non-empty, it means that the alias belongs to a plugin (and the name of the plugin is displayed). However, by default plugin aliases are not displayed. See Section 4.8 for information on how to display plugin aliases here.

9.1.1. Adding Aliases

To add a new alias, press the Add button. This will open a window for you to edit the new alias' parameters:

Figure 9-2. The window to edit aliases

What can be set represents the columns described above. The only thing that needs explanation is the Eval Substitution as Perl statement option, corresponding to the Eval as Perl column. As mentioned before, aliases are actually a substitution, using Perl's s// construct. It is also possible to have aliases that use a s//e construct, that is, whose substitution is actually composed of Perl statements evaluated when a match is found. When that option is enabled, the substitution is evaluated as a Perl statement.

When you are finished, press OK and the alias will be added. If you change your mind, press Cancel and the alias will not be added.

9.1.2. Editing Aliases

To edit an alias, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding aliases (see Section 9.1.1) will be opened, filled with the alias' parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the alias will remain as it was before.

Another shorter way to edit an alias is to double click its line in the list.

It is also possible to change the value of the Enabled and Eval as Perl flags directly from the alias list. Make sure that the alias you want to change is selected, and click in the check button. The state will be toggled.

To delete an alias, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the alias. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the alias again. See Section 4.8. To delete several aliases at once, select them all and press Delete.

The final thing that needs to be explained with regard to aliases is how to reorder them. Aliases as tried from the first one to the last, so in a few cases the order might matter. To move an alias up or down in the list, select it and press the corresponding button.

kildclient-3.0.0/doc/C/kildclient/x4591.html0000644000175000017500000000456112376345150015322 00000000000000 KCWin::feed

D.4. KCWin::feed

void KCWin::feed( $text );

Appends text to the output terminal widget. $text can contain ANSI color sequences. The colorize function can be useful in conjuntion with this function.

kildclient-3.0.0/doc/C/kildclient/a4602.html0000644000175000017500000001062512376345150015262 00000000000000 Writing Plugins

Appendix E. Writing Plugins

This appendix will describe how you can write your own plugins for KildClient. It will describe the format of the plugin file, what it should have, and some guidelines that all plugins should follow.

The first thing to decide when writing a plugin is the name. Since each plugin defines a Perl package, the name should be a valid name for a Perl package. Moreover, it is a good practice to name the plugin file with the name of the plugin (although the name of the file could be different), so stick with letters, numbers, and the underscore. It should not start with an underscore, however, because all identifiers that start with an underscore are understood to be interal of KildClient.

E.1. The File Format

The plugin file is just a Perl file that is read and run by KildClient when the plugin is loaded. This file can call KildClient's functions to add triggers, aliases, macros or timers, to set permanent variables, etc. It usually also defines new subroutines for use in the triggers, etc, or to be called directly by the user.

However, the plugin file must with a header, which has a fixed format. If the header is not in this format, the plugin will not be recognized. The header is shown in Figure E-1.

Figure E-1. The Plugin Header


package NAME;
#: Version: VERSION
#: Description: ONE LINE DESCRIPTION
#: Author: AUTHOR'S NAME (OPTIONAL)

The first line defines the plugin's name, which will be used to refer to it later. It also starts a Perl package. All plugins define a package, so that one plugin's functions do not interfere with other plugin's ones.

The second line specifies the plugin's version. This is most informative, but is also used by KildClient to ensure that only one version of the plugin is loaded.

Next, there comes a short one-line description of the plugin. It should be brief but descriptive, and it is shown in the output of the $world->listplugin function.

Finally, it is possible to inform the author of the plugin. This line, however, is not required, but the author's name will appear in the plugin listing if it is informed.

After that, comes the plugin code. This is just Perl code, executed by KildClient when the plugin is loaded (with do).

kildclient-3.0.0/doc/C/kildclient/x4699.html0000644000175000017500000000542212376345150015330 00000000000000 Plugin Conventions

E.7. Plugin Conventions

The first convention about plugins has been mentioned already: all plugins should define a help describing themselves. This help can be as detailed as necessary.

Another convention regards the use of triggers, aliases, macros, timers and hooks. All of them should have names (and they should always be referenced by names, because the plugin writer cannot know which number will be assigned to them), and the names should consist of the name of the plugin, a colon, and then some descriptive name for the trigger (or alias, etc). This is to avoid name clashes with other plugins.

Another aspect regarding triggers, aliases, macros, timers and hooks is that they should only be created in the top-level scope, which means they are created when the plugin is loaded. They must not be created in a function that is called later, because this way they would not be recognized as belonging to the plugin, and this would create a mess for the user. So create them outside any functions.

kildclient-3.0.0/doc/C/kildclient/x538.html0000644000175000017500000000546012376345146015243 00000000000000 Sending

5.2. Sending

The figure below shows the Sending section of the Preferences dialog:

Figure 5-2. The Sending section of the Preferences dialog

In this section you configure the default paramenters used when sending several commands at once. This setting is used in the Command History (Section 6.3.4) and Multi-line Send (Section 6.3.5) dialogs.

You specify the number of commands or lines that are sent simultaneously, and the delay between sending each group of commands/lines (containing the specified number of commands/lines, naturally). Note, however, that the values you set here are only defaults, you can change the values in the dialogs of those features if you need so.

kildclient-3.0.0/doc/C/kildclient/x3715.html0000644000175000017500000000515212376345150015314 00000000000000 $world->listtrigger

C.56. $world->listtrigger

void $world->listtrigger(void);

Briefly lists all defined triggers.

void $world->listtrigger( number/name , ... );

Lists detailedly the trigger with the given number or name. If there are several triggers with the same name, lists them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x3227.html0000644000175000017500000000473712376345147015330 00000000000000 $world->echonlandlog

C.22. $world->echonlandlog

void $world->echonlandlog( str , ... );

This is a convenience function that just calls $world->echonl and $world->writetolog for each argument, thus writing the given line(s) to the screen and to the log file.

kildclient-3.0.0/doc/C/kildclient/x3055.html0000644000175000017500000000454212376345147015321 00000000000000 $world->connectother

C.7. $world->connectother

void $world->connectother(void);

This function allows you to select another World to connect to, using the same window. If you are connected, you will be first disconnected from the current server.

kildclient-3.0.0/doc/C/kildclient/x3951.html0000644000175000017500000000531312376345150015315 00000000000000 $world->movehook

C.66. $world->movehook

void $world->movehook( event , number/name , new_pos );

Moves the hook with the given name or number, connected to the given event, so that it occupies the position new_pos after execution of this function. Other hooks might be moved up or down in result of this. If new_pos is negative or greater than the number of hooks, the hook is moved to the last position.

If there are several hooks with the given name, only the first one found is moved.

kildclient-3.0.0/doc/C/kildclient/x837.html0000644000175000017500000000454012376345146015243 00000000000000 Playing Sounds

7.3. Playing Sounds

To play a sound (for example, as the action of a trigger, to call your attention), use the play function. Pass it the path to the sound file, for example: /play("/home/joe/sounds/beep.wav").

Under Windows, this function supports playing WAV files. Under Linux, you must set-up a command to play sounds, see Section 5.3.

kildclient-3.0.0/doc/C/kildclient/x3401.html0000644000175000017500000000465312376345147015317 00000000000000 $world->getkeycode

C.37. $world->getkeycode

$keycode = $world->getkeycode(void);

After running this function, press a key (or a combination of keys). The keycode (to be used in the $world->macro function) will be returned and also printed in the screen.

kildclient-3.0.0/doc/C/kildclient/c19.html0000644000175000017500000000757212376345145015135 00000000000000 Running KildClient

Chapter 2. Running KildClient

To run KildClient, type kildclient in your command prompt:

kildclient [-c DIR] [World...] &

The ampersand (&) at the end of the line means that the command is to be executed in background, that is, not to wait until it finishes to get another command prompt. Since KildClient is a GUI program that does not require any input from the terminal, this is the desired behaviour.

You can enter the name of one or more saved Worlds in the command line, to have these Worlds opened automatically. If the World name contains spaces, you will need to quote it to prevent it from being interpreted as two or more names. The exact way depends on your shell, but generally enclosing it in quotes should work.

You can also specify a host name to connect to in the command line. By default, connection in made to port 4000. You can specify a different port by using hostname:port. While not recommended, you can also specify a username and password with the following syntax: username:password@hostname:port. This host specification syntax can be prefixed with telnet:// and end with /, for example telnet://some.mud.com:4444/. This is to allow links used in Web pages to be opened by KildClient.

If the -c (or --config) command line option is given, its argument is treated as the name of a directory to use to store configuration files and saved worlds. If it is not given, the default is ~/.kildclient under Linux or kildclient under the Application Data folder under Windows.

Alternatively, you may start KildClient from a menu in your Windowing Environment. The exact way to launch KildClient will then vary, but it should be just a matter of finding the menu entry and clicking on it, or perhaps just cliking in an icon somewhere.

kildclient-3.0.0/doc/C/kildclient/x3463.html0000644000175000017500000000437212376345150015317 00000000000000 $world->getname

C.42. $world->getname

$name = $world->getname(void);

This function returns the name of the world.

kildclient-3.0.0/doc/C/kildclient/x3868.html0000644000175000017500000000552512376345150015331 00000000000000 $world->maketemporary

C.63. $world->maketemporary

void $world->maketemporary( var , ... );

This function marks one or more variables as temporary, that is, the values of these variables will not be saved when the World is closed. This is the standard behaviour for variables, so this function is only needed to undo the efects of the $world->makepermanent function.

The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation.

kildclient-3.0.0/doc/C/kildclient/x1499.html0000644000175000017500000001573712376345146015342 00000000000000 Using Aliases

9.2. Using Aliases

In Chapter 9 an alias that replaces dt with drink from fountain was described. To create this alias, enter the following parameters, leaving the other options unchanged from the default values:

Example 9-1. A simple alias

  • Pattern: ^df$

  • Substitution: drink from fountain

You might be wondering why we use "^df$" and not only "df". Remember that aliases are just substitutions, and the pattern is a regular expression. If the anchors (that is, ^ and $) were not present, it would match against df anywhere in the line, and substitute this df even in the middle of words. wonder would become wodrink from fountainder. At times a behaviour like this (substituting anywhere) might be desirable, but in our case we want it to substitute only the whole command df, so we use the anchors.

As an example of an alias that does not match only the exact command, consider this one:

Example 9-2. A slightly more complex alias

  • Pattern: '^gra ' (without the quotes, but note the space after the word)

  • Substitution: 'chat CONGRATULATIONS, ' (without the quotes, but note the space after the word)

Whenever you enter a command that starts with gra followed by a space, that part (gra and the space) is replaced by the given pattern. So if you enter gra Bob, what will be sent to the MUD is chat CONGRATULATIONS, Bob.

Since aliases are just a substitution, you can define bracketed expressions in the pattern and then use $1, $2, and so on in the substitution. Let us increment the above example to add something to the end. We will need a bracketed expression:

Example 9-3. An alias that uses bracketed expressions

  • Pattern: ^gra (.*)$

  • Substitution: chat CONGRATULATIONS, $1!!!

It should be easy to understand. $1 in the substituion is replaced by what goes after gra.

9.2.1. Advanced Features

As mentioned in Section 9.1.1, aliases can use a s//e construct, that is, whose substitution is actually composed of Perl statements evaluated when a match is found.

To use that feature, select the Eval substitution as Perl statement option:

Example 9-4. An alias whose substitution is evaluated:

  • Pattern: calc\((.*)\)

  • Substitution: eval "$1"

  • Eval substitution as Perl statement: checked

The alias allows you to write something like that: gossip 2+3 = calc(2+3) and have the result of the calculation sent to the MUD. (Or any other Perl statement to be evaluated, actually.)

By default, case is considered when matching. If you want case-insensitive matching, select Ignore case when matching.

9.2.2. Using Perl in Aliases

It is possible to make an alias whose action is not to send a changed command line, but to execute an action.

To do that, make the replacement start with /, which means that the rest of the line will be executed, and not sent to the mud. In the rest of the line, you can put arbitrary Perl code. However, if you want to refer to a variable, you must escape the $ prefix by writing it as \$. This way, when the substitution is run, you get the name of the variable, not the value this variable currently has.

As an example, if you define an alias with pattern ^say (.*)$ and action /\$world-\>echonl("$1"), whenever you type a line that starts with say in the input box, the rest of the line will be echoed in the screen, but not sent to the mud.

kildclient-3.0.0/doc/C/kildclient/x3253.html0000644000175000017500000000462512376345147015323 00000000000000 $world->enahook

C.24. $world->enahook

void $world->enahook( event , number/name , ... );

Enables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, enables them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x3197.html0000644000175000017500000000462712376345147015334 00000000000000 $world->echo

C.20. $world->echo

void $world->echo( str , ... );

Prints the strings in the terminal window. They are not sent to the world.

See also $world->echonl, $world->send.

kildclient-3.0.0/doc/C/kildclient/x3836.html0000644000175000017500000000525712376345150015326 00000000000000 $world->movetimer

C.61. $world->movetimer

void $world->movetimer( number/name , new_pos );

Moves the timer with the given name or number so that it occupies the position new_pos after execution of this function. Other timers might be moved up or down in result of this. If new_pos is negative or greater than the number of timers, the timer is moved to the last position.

If there are several timers with the given name, only the first one found is moved.

kildclient-3.0.0/doc/C/kildclient/x4394.html0000644000175000017500000001627612376345150015331 00000000000000 $world->trigger

C.95. $world->trigger

void $world->trigger( pattern , action , [attributes] );

void $world->trigger( number , [pattern , [action]] , [attributes] );

Creates a new trigger, or edits the trigger identified by number, matching pattern (a Perl regular expression), that will execute action when a line is matched by pattern. action is interpreted as if it were typed in the command box. Simple strings get sent to the world, Perl code can be run by prefixing it with '/', etc.

atributes is a reference to a hash defining attributes for the trigger. Generally the call works like this:


$world->trigger("pattern", "action", { attribute1 => value1,
                                       attribute2 => value2, ... })

Possible attributes:

  • pattern: The pattern to match.

  • action: The action to be executed.

  • enabled: If value evaluates to true, the trigger is enabled. If it evaluates to false, the trigger is disbled and lines are not matched against it.

  • name: Assigns a name to the trigger, so that it can be referenced by name.

  • ignorecase: If value evaluates to true, ignore case when matching the pattern.

  • gag: If value evaluates to true, the line that triggered it is not printed.

  • gaglog: If value evaluates to true, the line that triggered it is not written to the log file.

  • keepexecuting: If the value evaluates to true, when a line matches the trigger, the actions for the trigger are executed, and matching of the line continues against other triggers. If this is false (the default), when this trigger matches no other triggers are matched.

  • rewriter:This trigger is a rewriter trigger. It is run before other triggers, does not prevent any other trigger from running (even if keepexecuting is false), and can alter the input line for further processing by changing the $colorline variable. For more details, see Section 8.5.1.

  • style: Used to control the changing of styles (color, attributes, etc.) of a matched part of the line. The value of this attribute is an anonymous hash that specifies everything that is to be changed.

    Here's an example:

    Example C-1. Changing styles with triggers

    
$world->trigger('Joe', { name => 'joe', style => { enabled => 1,
                                                       fg => 16 } });
    

    These are the valid attributes:

    • enabled: Set this to 1 to enable changing the style.

    • target: What to highlight. Possible values are:

      
  -1 - The whole matched line
         0 - The whole substring that matched
         1 - The first captured substring
         2 - The second captured substring
         3 - etc.
        
    • fg: What to do with the foreground colour. -1 means not to change it. Other values change to the given color, as follows:

      
  0 - black                  9 - black (bold)
        1 - red                   10 - red (bold)
        2 - green                 11 - green (bold)
        3 - yellow                12 - yellow (bold)
        4 - blue                  13 - blue (bold)
        5 - magenta               14 - magenta (bold)
        6 - cyan                  15 - cyan (bold)
        7 - white                 16 - white (bold)
        8 - the default color     17 - default bold color
        
    • bg: What to do with the background color. The values are the same as for the foreground color.

    • italics: Italics setting. -1 means do not change. 0 means to not use italics, and 1 means to use it.

    • strike: Strike-thru setting. -1 means do not change. 0 means disable it, and 1 means enable it.

    • underline: Underline setting. -1 means no change. 0 means no underline. 1 means single underline, and 2 means double underline.

kildclient-3.0.0/doc/C/kildclient/c2202.html0000644000175000017500000001644212376345147015267 00000000000000 Plugins

Chapter 13. Plugins

Plugins extend the functionality of KildClient. They add more features that make the client even more powerful.

Basically, plugins can define triggers, aliases, macros and timers and/or new functions. Whenever the plugin is loaded, the new functionality is available.

You can work with plugins from the World Editor (see Chapter 4). Open the World Editor, and select the Plugins section inside Automation. You will see a screen like this:

Figure 13-1. The Plugin list

There are two lists in the window: one lists the plugins that are currently loaded and that can be used. The other lists the plugins in the startup list, which are plugins that are loaded automatically for you whenever you connect to the World.

To load a plugin, press the Load button. A dialog will be opened for you to select the file. Select the file and press Open. The plugin will be loaded and will appear in the list. Or, if there was a problem and the plugin could not be loaded, the reason will be given in a message box.

While selecting the file, you have the option to specify that the plugin is to be loaded always at startup (that is, when you connect to the World). If you select that option, the plugin will also be added to the other list.

You can get help for a loaded plugin by selecting its line and pressing the Help button. Some help describing how to use the plugin will be shown in the main World window.

You can disable a plugin that is loaded. When a plugin is disabled, it is turned off temporarily. To disable a plugin, select its line in the list of loaded plugins and click the check box in the Enabled column. To enable it back, click in the check box again.

To add a plugin that is to be loaded always at startup (without loading it now, or if it is already loaded), press the Add button after the list of the startup plugins. A dialog box will open for you to select the file, and if that file could be loaded, the plugin will be added to the list.

To remove a plugin so that it is not loaded anymore at startup, select its line and press Remove. And to change the order that the plugins are loaded, select the line and use the Up and Down buttons to move the plugin.

13.1. Loading Plugins from the Command Line

It is also possible to load plugins directly from the command line, for those more comfortable with it and with Perl.

To load a plugin, the $world->loadplugin function is used. It must be called with one argument, which can be either the full path to the file that defines the plugin, or just the plugin name. But for this to work, the file must be installed in one of the directories that KildClient looks for plugins. By default, two locations are searched for: one is the plugins directory under KildClient's directory in your HOME path (that is, ~/.kildclient/plugins in UNIX systems). The other is the plugins directory under the directory where KildClient stores some of its files (generally it is something like /usr/local/share/kildclient/plugins).

For example, here is how to load the keypad plugin (which is a standard plugin distributed with KildClient):

Example 13-1. Loading a plugin


$world->loadplugin('keypad')

As an additional example, the code below loads a plugin specifying its full filename:

Example 13-2. Loading a plugin specifying the full filename


$world->loadplugin('/home/joe/kildclient-plugins/attackplugin.pl')

Either way, you should see a message saying that the plugin has been loaded. It is now already working. If the plugin was already loaded, loading will fail.

To always load the plugin when you connect to the World, either use the World Editor as described above, or add the line that loads it to your script file. See Section 4.5.1.

13.1.1. Enabling and Disabling Plugins

If you want to turn off a plugin temporarily, you can disable it. Later, when you want it to work again, just reenable it.

To disable a plugin, use the $world->displugin function, passing as argument the name of the plugin. What this function does is disable the plugin's triggers, aliases, macros and timers. You can still call the plugin functions directly.

To enable a plugin again, use the $world->enaplugin function, passing as argument the name of the plugin.

kildclient-3.0.0/doc/C/kildclient/x3349.html0000644000175000017500000000472312376345147015330 00000000000000 $world->getcharacter

C.32. $world->getcharacter

$name = $world->getcharacter(void);

If autologin was used (see Section 4.1), this function returns the name of the character used to log in to the mud. If autologin is disabled, this function returns undef.

kildclient-3.0.0/doc/C/kildclient/x886.html0000644000175000017500000000635712376345146015257 00000000000000 Controlling Worlds with Perl

7.5. Controlling Worlds with Perl

In Section 3.3 it was explained that you can disconnect from a World with the $world->dc function. It now should be clear why there is a $world-> in front. Another function that you know already is $world->close, to disconnect and close a World.

There are a few more functions that allow you to control Worlds from Perl. The $world->next and $world->prev move to the next or previous world in the list of tabs. It is also possible to pass an argument to them, specifying how many Worlds to move. So, $world->next(2) moves two Worlds forward, and $world->prev(3) moves three Worlds back.

To go to a specific World, use the gotow function (which does not belong to the World class, since it does not depend on a particular World), passing as argument a string with the name of the World.

Finally, you can use the quit function to disconnect and close all Worlds and then exit KildClient.

kildclient-3.0.0/doc/C/kildclient/a2934.html0000644000175000017500000000543312376345150015271 00000000000000 $world Reference

Appendix C. $world Reference

$world is a variable that is always present and points to the current World. It is an object of class World, and is opaque, that is, all interaction with it should be done via its functions, and not via its members.

The sections below describe the variables and attributes available for the $world variable.

C.1. $world->{SILENT}

If this attribute is set to a true value (such as 1), some messages are not displayed, especifically the messages "Trigger added", "Trigger modified", "Trigger deleted", "Trigged moved", and the corresponding messages for the other objects: aliases, macros, timers, hooks, permanent variables and plugins.

kildclient-3.0.0/doc/C/kildclient/x3983.html0000644000175000017500000000525212376345150015324 00000000000000 $world->movetrigger

C.68. $world->movetrigger

void $world->movetrigger( number/name , new_pos );

Moves the trigger with the given name or number so that it occupies the position new_pos after execution of this function. Other triggers might be moved up or down in result of this. If new_pos is negative or greater than the number of triggers, the trigger is moved to the last position.

If there are several triggers with the given name, only the first one found is moved.

kildclient-3.0.0/doc/C/kildclient/x3851.html0000644000175000017500000000541112376345150015313 00000000000000 $world->makepermanent

C.62. $world->makepermanent

void $world->makepermanent( var , ... );

This function marks one or more variables as permanent, that is, the values of these variables will be saved when the world is closed, and reloaded when the World is opened, thus keeping their values between successive uses of the World.

The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation.

kildclient-3.0.0/doc/C/kildclient/index.html0000644000175000017500000006226112376345150015640 00000000000000 KildClient Manual

KildClient Manual

Version 3.0.0

Eduardo M Kalinowski


Table of Contents
I. KildClient User's Guide
1. Introduction
2. Running KildClient
3. Basic Usage
3.1. Connecting to a MUD
3.2. Interacting with the MUD
3.3. Closing Worlds and Exiting KildClient
3.4. Reviewing and Searching Text
4. Editing a World
4.1. General
4.2. Display settings
4.3. Input
4.4. Logging
4.5. Automation
4.6. Protocols
4.7. Miscellaneous
4.8. Advanced
5. Configuring KildClient
5.1. Appearance
5.2. Sending
5.3. External Programs (Linux)
5.4. Proxy
6. Menu Reference
6.1. World menu
6.2. Edit Menu
6.3. Input Menu
6.4. Preferences Menu
6.5. Diplay Menu
6.6. Help Menu
7. Using Perl in KildClient
7.1. The Basics
7.2. Echoing and Sending Text
7.3. Playing Sounds
7.4. Saving Variables Permanently
7.5. Controlling Worlds with Perl
8. Triggers
8.1. Creating and Editing Triggers
8.2. Basic Triggers
8.3. Changing the Style of the Matched Text
8.4. Gags
8.5. Other trigger features
8.6. Defining Triggers in the Command Line
8.7. Importing and Exporting
8.8. Testing Triggers
9. Aliases
9.1. Creating and Editing Aliases
9.2. Using Aliases
9.3. Defining Aliases in the Command Line
10. Macros
10.1. Creating and Editing Macros
10.2. Defining Macros in the Command Line
11. Timers
11.1. Creating and Editing Timers
11.2. Defining Timers in the Command Line
12. Hooks
12.1. Creating and Editing Hooks
12.2. Defining Hooks in the Command Line
13. Plugins
13.1. Loading Plugins from the Command Line
13.2. Getting Information About Plugins
13.3. Standard Plugins
14. Logging the Output
15. Using the Chat
15.1. Basic Usage
15.2. Advanced Features
15.3. Chat Functions
16. Out-of-band server data
16.1. Receiving server data
16.2. Sending server data
II. KildClient Programmer's Reference
A. Global Function Reference
A.1. colorize
A.2. getclientname
A.3. getversion
A.4. getworld
A.5. gotow
A.6. help
A.7. play
A.8. quit
A.9. stripansi
A.10. stripcolorize
B. $window Reference
B.1. getsize
B.2. minimize
B.3. settitle
B.4. seturgencyhint
C. $world Reference
C.1. $world->{SILENT}
C.2. $world->alias
C.3. $world->close
C.4. $world->aliasenabled
C.5. $world->cmdseparator
C.6. $world->commandecho
C.7. $world->connectother
C.8. $world->dc
C.9. $world->delalias
C.10. $world->delhook
C.11. $world->delmacro
C.12. $world->deltimer
C.13. $world->deltrigger
C.14. $world->disalias
C.15. $world->dishook
C.16. $world->dismacro
C.17. $world->displugin
C.18. $world->distimer
C.19. $world->distrigger
C.20. $world->echo
C.21. $world->echonl
C.22. $world->echonlandlog
C.23. $world->enaalias
C.24. $world->enahook
C.25. $world->enamacro
C.26. $world->enaplugin
C.27. $world->enatimer
C.28. $world->enatrigger
C.29. $world->expandalias
C.30. $world->gag
C.31. $world->getaliasnumber
C.32. $world->getcharacter
C.33. $world->getconntime
C.34. $world->getentryfont
C.35. $world->gethooknumber
C.36. $world->getidletime
C.37. $world->getkeycode
C.38. $world->getline
C.39. $world->getlogfile
C.40. $world->getmacronumber
C.41. $world->getmainfont
C.42. $world->getname
C.43. $world->getpluginversion
C.44. $world->gettimernumber
C.45. $world->gettriggernumber
C.46. $world->hook
C.47. $world->hookenabled
C.48. $world->interpret
C.49. $world->ispermanent
C.50. $world->listalias
C.51. $world->listhook
C.52. $world->listmacro
C.53. $world->listpermanent
C.54. $world->listplugin
C.55. $world->listtimer
C.56. $world->listtrigger
C.57. $world->loadplugin
C.58. $world->logfile
C.59. $world->macro
C.60. $world->macroenabled
C.61. $world->movetimer
C.62. $world->makepermanent
C.63. $world->maketemporary
C.64. $world->mlsend
C.65. $world->movealias
C.66. $world->movehook
C.67. $world->movemacro
C.68. $world->movetrigger
C.69. $world->next
C.70. $world->path
C.71. $world->prev
C.72. $world->reconnect
C.73. $world->requireplugin
C.74. $world->save
C.75. $world->send
C.76. $world->sendecho
C.77. $world->sendfile
C.78. $world->sendlines
C.79. $world->sendmsdpcommand
C.80. $world->sendnoecho
C.81. $world->sendserverdata
C.82. $world->setstatus
C.83. $world->silentdisalias
C.84. $world->silentdishook
C.85. $world->silentdismacro
C.86. $world->silentdistimer
C.87. $world->silentdistrigger
C.88. $world->silentenaalias
C.89. $world->silentenahook
C.90. $world->silentenamacro
C.91. $world->silentenatimer
C.92. $world->silentenatrigger
C.93. $world->timer
C.94. $world->timerenabled
C.95. $world->trigger
C.96. $world->triggerenabled
C.97. $world->writetolog
D. Using KCWin for Input/Output Windows
D.1. Changes from Previous Versions
D.2. KCWin::get_text
D.3. KCWin::set_text
D.4. KCWin::feed
E. Writing Plugins
E.1. The File Format
E.2. A Sample Plugin
E.3. Disposing Data When the Plugin Is Unloaded
E.4. Enabling and Disabling Plugins
E.5. Conditional Loading of Plugins
E.6. Using GTK+ From Plugins
E.7. Plugin Conventions
List of Examples
8-1. A very simple trigger
8-2. A trigger which captures part of the received line and uses it in the action
8-3. A trigger with an action in Perl
8-4. A trigger that calls a sub-routine
8-5. A simple gag
8-6. A gag with no action
8-7. Rewriting a line with gags
8-8. A profanity filter that does not work
8-9. A profanity filter using a rewriter trigger
8-10. A very simple trigger defined in the command line
8-11. A simple gag (in the command line)
8-12. A gag with no action (in the command line)
8-13. A shortcut function to define gags
8-14. A case-insensitive trigger
8-15. Changing several attributes at once
8-16. A very simple trigger, in another way
8-17. Disabling a trigger, the long way
8-18. Disabling a trigger, the short way
8-19. Creating a trigger with a name
9-1. A simple alias
9-2. A slightly more complex alias
9-3. An alias that uses bracketed expressions
9-4. An alias whose substitution is evaluated:
9-5. A simple alias defined in the command line
9-6. An alias whose substitution is evaluated (in the command line)
9-7. Disabling an alias, the long way
9-8. Disabling an alias, the short way
9-9. Creating an alias with a name
10-1. Defining a macro
10-2. Disabling a macro, the long way
10-3. Disabling a macro, the short way
10-4. Creating a macro with a name
11-1. A simple timer
11-2. A timer that executes only five times
11-3. A one-shot timer
11-4. Changing the interval of a timer
11-5. Changing the interval of a timer
11-6. Disabling a timer, the short way
11-7. Creating a timer with a name
12-1. Connecting a hook
12-2. Disabling a hook, the long way
12-3. Disabling a hook, the short way
12-4. Creating a hook with a name
13-1. Loading a plugin
13-2. Loading a plugin specifying the full filename
13-3. Getting help about a plugin
14-1. Enabling logging
16-1. A GMCP request
16-2. A MSDP request
16-3. Message sent via MSDP
A-1. Quitting from another world
C-1. Changing styles with triggers
E-1. A Sample Plugin
E-2. Conditional loading of plugins
E-3. A plugin that requires another
E-4. A plugin that uses gtk3-perl
kildclient-3.0.0/doc/C/kildclient/x844.html0000644000175000017500000001260212376345146015237 00000000000000 Saving Variables Permanently

7.4. Saving Variables Permanently

You can define variables for use in your Perl scripts. Since KildClient has a full-featured Perl interpreter, you can use all kinds of variables Perl supports (scalars, arrays, hashes, and even references to build complex data structures), and you use them just like you would in Perl.

However, when you close the World, the variables and their values are lost. However, it is often desirable to keep the values of variables across sessions, and KildClient has a mechanism for that.

A variable can be made permanent. All variables that are marked as permanent will be saved when you close the World, and will be reloaded from the saved values when the World is opened again later. This way, their values are saved across sessions.

To make a variable permanent, open the World Editor (see Chapter 4) and select the Variables section inside Automation.

There you will see a list of the variables that are set to be permanent:

Figure 7-1. Permanent Variables

To add a variable, click the Add button. A window will open for you to enter the name of the variable.

To make one or more variables temporary again, select them and press Delete. They will be removed from the list.

Finally, if you mispell the name of a variable, select it and press Edit to correct it.

You can also change the order of the variables with the Up and Down buttons. This is usefor for grouping similar variables together, but does not otherwise affect the saving of the variables.

7.4.1. Permanent Variables in the Command Line

It is possible to make a variable permanent from the command line. To do that, use the $world->makepermanent function, passing the name of the variable as the argument. Note that since you must pass the name of the variable, you must use quotes, and preferably single quotes so that the variable does not get interpolated. For example, to make the variable $kill_count permanent, run $world->makepermanent('$kill_count'). Now when you close the World, the value of $kill_count will be saved, and when you reopen it later, the value will be restored.

It is possible to make more than one variable permanent at one time, just pass all their names as arguments to $world->makepermanent.

If you want a variable to stop being permanent (that is, to become temporary again), use the $world->maketemporary function. It is called just like makepermanent, and has the opposite effect.

To get a list of the variables that are currently permanent, use the function $world->listpermanent. This function has no arguments, and prints all the names of the variables that are permanent.

kildclient-3.0.0/doc/C/kildclient/x3615.html0000644000175000017500000000513412376345150015313 00000000000000 $world->listalias

C.50. $world->listalias

void $world->listalias(void);

Briefly lists all defined aliases.

void $world->listalias( number/name , ... );

Lists detailedly the alias with the given number or name. If there are several aliases with the same name, lists them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x3369.html0000644000175000017500000000445012376345147015327 00000000000000 $world->getentryfont

C.34. $world->getentryfont

$font = $world->getentryfont(void);

This function returns the name of the font used in the command entry box.

kildclient-3.0.0/doc/C/kildclient/a2749.html0000644000175000017500000001275512376345147015310 00000000000000 Global Function Reference

Appendix A. Global Function Reference

A.1. colorize

$color = colorize( str );

Replaces color codes (see below) in the string with ANSI escape sequences,so that the string can be echoed in the terminal, for example. Returns the colorized string.

Color code table (based on colors used by the Smaug server):


  &0 (number zero) - Reset all attributes and colors to default
Normal colors:
  &x - Black                     &r - Red
  &g - Green                     &O - Yellow
  &b - Blue                      &p - Magenta
  &c - Cyan                      &w - White
  &d - Default foreground
Bold colors:
  &z - Bold Black                &R - Bold Red
  &G - Bold Green                &Y - Bold Yellow
  &B - Bold Blue                 &P - Bold Magenta
  &C - Bold Cyan                 &W - Bold White
  &D - Default bold foreground
Background colors:
  ^x - Black                     ^r - Red
  ^g - Green                     ^O - Yellow
  ^b - Blue                      ^p - Magenta
  ^c - Cyan                      ^w - White
  ^d - Default background
Light background colors (sometimes causes blinking):
  ^z - Light Black               ^R - Light Red
  ^G - Light Green               ^Y - Light Yellow
  ^B - Light Blue                ^P - Light Magenta
  ^C - Light Cyan                ^W - Light White
  ^D - Default light background
Attributes: (may not work on other clients)
  &_ - Underline on              ^_ - All underline off
  &= - Double underline on
  &| - Strikethrough on          ^| - Strikethrough off
  &/ - Italics on                ^/ - Italics off
  &i - Inverse video on          ^i - Inverse video off
  &h - Hidden mode on            ^h - Hidden mode off

Note: if you want to set both the foreground and the background, the code for the foreground should come first. If you want to set the foreground and/or background and one or more attributes (underline, italics, etc), the attribute settings should come after the color.

Note : to insert a & or ^ character, use && and ^^, respectively.

You can also also use colorize() to display text in any color of a 6x6x6 RGB color cube. To do so, use &rgbX and ^rgbX to set the foreground and background, respectively. r, g, and b are integers between 0 and 5 representing the amount of red, green and blue. X is really the letter X, it is used to close the code.

Finally, to select one of the 24 shades of gray available, use &nG and ^nG for the foreground and background, respectively, where n is an integer from 0 to 23, and G is really the letter G.

You can use the kc256 (see Section 13.3.4) plugin to display all the colors for you to choose from.

kildclient-3.0.0/doc/C/kildclient/x4173.html0000644000175000017500000000524112376345150015312 00000000000000 $world->sendnoecho

C.80. $world->sendnoecho

void $world->sendnoecho( str , ... );

Sends any number of strings to the current world. After each string, a newline is send, so that the MUD recognizes it as a command.

The commands are not echoed to the window, regardless of the setting of the command echo option (see Section 4.7).

See also $world->send and $world->sendecho .

kildclient-3.0.0/doc/C/kildclient/x2905.html0000644000175000017500000000430412376345147015320 00000000000000 minimize

B.2. minimize

void $window->minimize(void);

This function minimized KildClient's main window. Called from a macro, it makes a nice boss key. :-)

kildclient-3.0.0/doc/C/kildclient/x3038.html0000644000175000017500000000543712376345147015326 00000000000000 $world->commandecho

C.6. $world->commandecho

void $world->commandecho( boolean );

$status = $world->commandecho(void);

When used with an argument, this sets the command echo option for the current world to the given value (which should be false to cause commands not to be echoed or true to cause them to be echoed). For more details of the command echo option, see Section 4.7

If called without arguments, it doesn't change the status of that option, but returns its current value.

kildclient-3.0.0/doc/C/kildclient/x4681.html0000644000175000017500000001324112376345150015315 00000000000000 Using GTK+ From Plugins

E.6. Using GTK+ From Plugins

With the use of the gtk3-perl bindings, it is possible to use the full power of the GTK+ library in KildClient plugins. This allows you to create dialogs, windows, message boxes, and anything else your plugin needs.

Using gtk3-perl in a KildClient plugin is straightforward, there is just a couple of points to be observed. Import the Perl modules as usual, generally with a line like this: "use Gtk3 -init;". Create windows and display them as usual. The biggest difference is that you must not call Gtk3->main. Since KildClient is a GTK+ application, it already runs a main loop, and starting another one would lock KildClient and make it unresponsive. Also, you must never call Gtk3->main_quit, because that would cause KildClient to quit. Even tough the world would be saved, the user certainly wouldn't want that.

All features of GTK+ are supported, as are all of gtk3-modules (this includes modules for the base libraries Glib and GDK, and also for other libraries such as the Gnome ones). Notably, Gtk3::Builder is supported, which allows you to create complex user interfaces visually and load them from the .ui file in the plugin.

Note that having the gtk3-perl bindings is not necessary to run KildClient. If they are not present, however, it will not be possible to run plugins that use it, naturally. The plugins will not be loaded because an error will be generated when the modules are loaded (in the "use Gtk3 -init;" line).

The example below shows a very simple (and not very useful) plugin using gtk3-perl. It should show how simple it is to use the gtk3-perl bindings in KildClient plugin.

Example E-4. A plugin that uses gtk3-perl


package gtksample;
#: Version: 1.0.0
#: Description: A Plugin Using gtk3-perl
#: Author: Eduardo M Kalinowski

use Gtk3 -init;

# Is the window being displayed?
our $window_displayed = 0;

# Widgets
our $window;
our $entry;
our $button;

sub help {
  $::world->echonl("This plugins demonstrates the use of gtk3-perl under KildClient.",
                   "It does nothing really useful.",
                   "",
                   "Enter /gtksample::run to try it.");
}


sub run {
  return if $window_displayed;

  $window = Gtk3::Window->new();
  $window->set_title("gtk3-perl test");
  $window->signal_connect(delete_event => sub {
                            $window_displayed = 0;
                            return 0;
                          });

  my $vbox = Gtk3::Box->new('vertical', 8);

  $entry = Gtk3::Entry->new();
  $entry->set_text("Type something here");
  $vbox->pack_start($entry, 0, 1, 0);

  $button = Gtk3::Button->new("And click me");
  $button->signal_connect(clicked => \&on_button_clicked);
  $vbox->pack_start($button, 0, 1, 0);

  $window->add($vbox);

  $window->show_all();
  $window_displayed = 1;
}


sub on_button_clicked {
  $button->set_label($entry->get_text());
}


sub UNLOAD {
  $window->destroy if $window_displayed;
}

Notice how it defines a UNLOAD function that destroys the window if it is being displayed. Plugins that open windows almost always need such a function to delete the windows that are still open when the World is closed. If these windows are not closed, the program will most likely crash if the user tries to use them after the Worlds has been closed, so make sure they get deleted.

For more information on gtk3-perl, see https://metacpan.org/release/Gtk3/.

kildclient-3.0.0/doc/C/kildclient/x3654.html0000644000175000017500000000513612376345150015320 00000000000000 $world->listmacro

C.52. $world->listmacro

void $world->listmacro(void);

Briefly lists all defined macros.

void $world->listmacro( number/name , ... );

Lists detailedly the macro with the given number or name. If there are several macros with the same name, lists them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x3173.html0000644000175000017500000000456612376345147015330 00000000000000 $world->distimer

C.18. $world->distimer

void $world->distimer( number/name , ... );

Disables the timer identified by number or name. If there are several timers with the same name, disables them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x275.html0000644000175000017500000001625412376345145015243 00000000000000 Display settings

4.2. Display settings

The Display category controls several aspects of the appearance of KildClient. It is divided in sub-categories, which will be described in the following sections.

4.2.1. Main Window

The figure below shows the Main Window section of the World Editor:

Figure 4-2. The Main Window section of the World Editor

This section allows you to configure the main window where the MUD text is shown.

You can set the font that is used for the text that is sent by the MUD. Click on the button with the name of the font to pop-up a dialog from where you can select another font. The change in the font is applied immediately when a new font is selected.

Still with regard to fonds, another option that can be configured in this section is whether to use bold fonts or not to represent text that has the "bold" or "highlight" attribute set. By default, this text is rendered in a lighter color and with a boldface, but you can disable the use of a bold font from this dialog. You can also change the colors used for the highlighted text, see Section 4.2.2.

You can also configure whether to use word wrap or not. If this option is not set, lines will be broken when they do not fit the window, even in the middle of a word. When this option is set, lines will be wrapped between words, so that a word is not broken.

Regardless of that setting, you can indent wrapped lines by some amount. Just specify how many pixels to indent the lines, or leave the value as 0 not to indent them.

By default, lines are wrapped when they do not fit the window. This is the behavior when Wrap lines at full screen width is selected. But it is also possible to wrap lines after a specific number of characters, even if the window is wider than that. To do that, select Maximum line width in characters and enter the maximum number of characters in each line.

The next group configures whether tooltips with the time when a line was received are displayed are enabled or not. If they are enabled, when you leave the mouse for some time over a line an information window is displayed with the time when the line was received.

4.2.2. Colors

The figure below shows the Colors section of the World Editor:

Figure 4-3. The Colors section of the World Editor

In this section you can configure the colors that will be used by KildClient. The ANSI standard defines eight colors, both in the "normal" state and in the "bold" state. These "bold" colors are by default shown with lighter colors, and, optionally, with a bold font also (see Section 4.2.1). Additionally, there are "default" colors for the foreground and background, when no specific color is set.

You can tweak the colors so that they look better in your screen, or redefine them completely. To do that, click in the button with the color, and a dialog will be shown for you to change the color. The changes are applied immediately when a new color is chosen.

Should you want to revert all colors to their built-in preset values, use the Revert to default colors button.

4.2.3. Status Bar

The figure below shows the Status Bar section of the World Editor:

Figure 4-4. The Status Bar section of the World Editor

The first section allows you to change the font used in the status bar. Click the button and a dialog will appear for you to select the font.

The second section controls the display of some time counter that appear in the right of the status bar. You can display the total time connected to this world and/or the idle time, that is, the time elapsed since you last sent a command to the MUD.

For each time, there are three options. Do not display causes that time not to be displayed. Display as hours, minutes and seconds displays the time as something like 2h45m30s, while Display as seconds would display that previous time as 9930s.

The behavior of the idle time counter can also be configured with the Only reset idle time counter when a command is entered checkbox. When the checkbox is unchecked (which is the default), that time is reset whenever a command is sent to the world, no matter if this command was typed, if it ran because of a trigger, a timer, etc. When checked, the timer will only be reset when you enter something in the command entry box and press ENTER. Automatically sent commands will not cause the counter to be reset.

kildclient-3.0.0/doc/C/kildclient/x3137.html0000644000175000017500000000462712376345147015326 00000000000000 $world->dishook

C.15. $world->dishook

void $world->dishook( event , number/name , ... );

Disables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, disables them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x3775.html0000644000175000017500000000747412376345150015333 00000000000000 $world->macro

C.59. $world->macro

void $world->macro( keycode , action , [attributes] );

void $world->macro( number , [keycode , [action]] , [attributes] );

Creates a new macro, or edits the macro identified by number. keycode represents a key such as "KP_Home" or "<Control>F12". The format is the one accepted by the GTK+ function gtk_accelerator_parse(), but most of the time you will want to use the $world->getkeycode function to retrieve the keycode for a given key. action is what will be executed when the key (or keys) is pressed.

Atributes is a reference to a hash defining attributes for the macro. Generally the call works like this:


$world->macro("keycode", "action", { attribute1 => value1,
                                     attribute2 => value2, ... })

Possible attributes:

  • key: The key code.

  • action: The action to be executed.

  • enabled: If value evaluates to true, the macro is enabled, if false, it is disabled and is not run if the key is pressed.

  • name: Assigns a name to the macro, so that it can be referenced by name.

kildclient-3.0.0/doc/C/kildclient/x3697.html0000644000175000017500000000513612376345150015327 00000000000000 $world->listtimer

C.55. $world->listtimer

void $world->listtimer(void);

Briefly lists all defined timers.

void $world->listtimer( number/name , ... );

Lists detailedly the timer with the given number or name. If there are several timers with the same name, lists them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x4323.html0000644000175000017500000000472712376345150015317 00000000000000 $world->silentenatrigger

C.92. $world->silentenatrigger

void $world->silentenatrigger( number/name , ... );

Enables the trigger identified by number or name. If there are several triggers with the same name, enables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success.

kildclient-3.0.0/doc/C/kildclient/x3083.html0000644000175000017500000000461612376345147015324 00000000000000 $world->delhook

C.10. $world->delhook

$n = $world->delhook( event , number/name );

Deletes the hook identified by the given number or name, connected to the specified event. If there are several hooks with the same name, deletes them all. Returns the number of hooks deleted.

kildclient-3.0.0/doc/C/kildclient/c208.html0000644000175000017500000001656112376345145015213 00000000000000 Editing a World

Chapter 4. Editing a World

This chapter will describe all the options found in the World Editor that let you customize the behaviour of KildClient. Only general options will be described here, some sections of the World Editor, that allow you to configure features dealing with automation (such as triggers, aliases, hooks, etc.) will be described in other chapters, along with an explanation of that feature.

To access the World Editor for the currently open World, use the World->Edit menu. It is also possible to edit Worlds from the World Selector dialog, just click once in the World from the list and press Edit.

There are several groups of options in that dialog. The following sections will describe each one in turn.

4.1. General

The figure below shows the General section of the World Editor:

Figure 4-1. The General section of the World Editor

The first section, Connection, contains parameters that specify how to connect to the MUD:

  • Name: this specifies the name that will be shown in the World Selector, and also in the tab in the main window. It can be anything you want, that helps you identify the MUD.

  • Host: the host to connect to. It can be entered either as a name or as a numeric IP.

  • Port: the port to connect to.

  • Use SSL: if this is checked, the communication with the MUD will be encrypted and thus immune to casual eavesdropping. However, the MUD server must support this, if you try to connect using SSL to a server that does not understand it, the connection will fail.

    Note: you might not see this option. If it is not present, that means that you version of KildClient has been compiled without SSL support.

    Note: although the connection will be encrypted if the connection uses SSL, KildClient does not attempt any kind of certificate verification, so you must not assume that the connection is authenticated. You can, however, see some information on the certificate in the Statistics dialog (see Section 6.1.8).

The second second, Proxy allows you to specify a proxy server to use when connecting to the MUD. By default, Worlds use the global proxy settings configured in the Preferences dialog (see Section 5.4). But you can override the default settings for individual worlds.

Select No proxy if there is a default proxy setting but you want this world to connect directly to the MUD server. Or select SOCKS4, SOCKS5 or HTTP to specify a proxy server. In this case, provide the proxy server hostname or IP address and the port to connect to. If the proxy requires authentication, supply the credentials in the Username and Password fields.

The third section, Auto-login, contains the parameters that you need to configure if you want KildClient to login automatically to the MUD for you. You can associate several characters with a World, and then when you can select which character you use to login to the MUD, as explained in Section 3.1.

First, select how the login will be made in Connection Style. If this is set to "No auto-login", no attempt will be made to login automatically. This is the default.

There are two other options: "Diku", for Diku-based mud servers, which prompt you for the character name and then the password; and "lp" for lp-based mud servers, in which you have to type connect followed by the character name and password.

If neither of these options apply to your MUD, you should disable auto-login here, but you can still use a hook to send commands just after you connect. See Chapter 12.

Next follows a list of all the characters that you have defined. Each character is associated with a password, however the password is not displayed for security reasons.

To add a new character, press Add and enter the character's name and password in the window that appears, then press OK. The new character will be added to the list. To edit an existing character, select it and press the Edit button. To remove a character information, select it and press Delete. Finally, to control the order that the characters are displayed, use the Up and Down buttons. Note that the first character is considered the default and is the one used if you connect using the main entry for that World.

kildclient-3.0.0/doc/C/kildclient/x3095.html0000644000175000017500000000453612376345147015330 00000000000000 $world->delmacro

C.11. $world->delmacro

$n = $world->delmacro( number/name );

Deletes the macro identified by the given number or name. If there are several macros with the same name, deletes them all. Returns the number of macros deleted.

kildclient-3.0.0/doc/C/kildclient/x4029.html0000644000175000017500000000454112376345150015314 00000000000000 $world->prev

C.71. $world->prev

void $world->prev( [number] );

If used without arguments, this function focuses the previous open world. You can also give a numeric argument X, in this case it focuses the Xth world before the current one.

kildclient-3.0.0/doc/C/kildclient/x2834.html0000644000175000017500000000432312376345147015322 00000000000000 help

A.6. help

void help( "function" );

Displays help for the given function. The name of the function is passed as a string, so it must be in quotes.

kildclient-3.0.0/doc/C/kildclient/x78.html0000644000175000017500000002052712376345145015162 00000000000000 Interacting with the MUD

3.2. Interacting with the MUD

The figure below shows a typical KildClient session:

Figure 3-2. A typical KildClient session with two open Worlds

The first thing to note is that, just like in other MUD clients, there is an area where the output of the MUD is shown, and a text box below where you can enter commands. You can edit the commands before being sent, and only after you press ENTER the line will be sent to the MUD.

A feature not so universal is the support for opening several Worlds simultaneously, and using tabs to alternate between them. You just need to click the tab to change to that World. If the name is displayed in red, that means that there is new text in that MUD, text you haven't seen yet. If the KildClient windows does not have focus (that is, when you using another window and leave KildClient in the background) and new text arrives in any World, the title of the KildClient window will change to "(*) KildClient" to alert you of that.

There are other ways to move to another open World. The keyboard shortcuts CTRL+Page up and CTRL+Page down move to the next or previous World, respectively. Alternatively, you can use ALT+Right arrow o ALT+Left arrow instead to achieve the same effect. To got directly to a World, press ALT+num, where num is a number from 1 to 9. This way you can move to any one of the first nine open Worlds.

On the left of the command entry box there is a button with a broom. Click on it to erase the whole command line.

You can recall recently typed commands with the arrow keys. Pressing the up arrow recalls the previous command, and the down arrow moves to the following command. If the input box has multiple lines, as described below, then use Alt and the arrows.

On the right, there is a button with an arrow poiting downwards. Click on it to get a list of the last typed commands. Selecting one of these commands will put it in the text box for you to repeat it, possibly changing it before.

On the extreme right, there are two small arrows. These arrows allow you to enlarge the input box if you type long input lines. The input box can have from one to ten lines. The arrow pointing up increases the size, the arrow pointing down decreases it.

The behaviour of input boxes with one or several lines is different: if there is only one line, and more text than fits the width is entered, the text is scrolled horizontally. On multi-line input boxes, however, text that does not fit one line is wrapped to the next line. A scroll-bar may be displayed if the whole text does not fit in the number of lines selected.

As mentioned briefly before, the behaviour of the up and down arrows is different. If the Alt key is held, then you will retrieve other commands in the history. If you press just the up and down arrows, it may retrieve another command or simply move the cursor: if you have just sent a command or just retrieved a command, then the arrow keys will move through other commands, but if you have moved the cursor in order to edit, the up and down arrows will move to the previous or next line. This may sound complicated, but is actually natural, the arrows do what you expect them to do.

In the single-line input box (but not in the multi-line one), a feature called command auto-completion is enabled: when you start typing a command, a list of the previously typed commands that start with the same string you've typed. You can select one of them from the list to repeat it or change it.

However, in both input methods, you can type the start of a command and press Alt+Shift+Up arrow to retrieve a previous command that starts with the typed text. You can then use Alt+Shift+Up arrow and Alt+Shift+Down arrow to navigate through all the saved commands with that prefix.

You can enter several commands at once in the command line separating them with %;. For example, if you type unlock door %; open door, two commands will be sent to the MUD in sequence: first unlock door, and then open door. Spaces around the %; are ignore and can be used for clarity. Note: it is possible to configure the command separator to be another string instead of %;. See Section 4.3.

Another special feature of the command line is that you can execute Perl statements from it. Starting a line with a slash (/) causes that line not to be sent to the world, but to be intepreted by the built-in Perl interpreter. To try it, type in the command box /$world->echonl("Hello, Perl World!"). You should see "Hello, Perl World!" printed in the screen. What has happened is that the command $world->echonl("Hello, Perl World!") has been run by Perl, and this command causes a string to be printed in the screen (but not to be sent to the MUD). Don't worry if you do not understand the syntax yet, we will explain it in Chapter 7. For now, just keep in mind that if you type a line starting with /, it will not be sent to the MUD, but what follows the slash is treated as a Perl command and executed.

Should you need to send a line that starts with / to the MUD, use two slashes: entering //list will send /list to the MUD.

If you are using the multi-line input bar, you can enable to built in spell checker to verify the text as you type. Misspelled words will be highlighted with a red line below them, and you can right-click on them to show a menu with possible spellings. To configure this feature, see Section 4.3.

kildclient-3.0.0/doc/C/kildclient/x702.html0000644000175000017500000000653712376345146015242 00000000000000 Preferences Menu

6.4. Preferences Menu

6.4.1. Disable Triggers, Aliases, Macros or Timers

If each of these menu entries is checked, then the corresponding automation feature is disabled: lines are not matched against triggers, aliases do not replace typed commands, macros and timers do not run. Use them if you want to temporarily disable all of them, since the triggers, aliases, macros or timers are not deleted.

6.4.2. Debug Matches

If this entry is selected, whenever a trigger or alias matches, information is printed about it. The information is printed on stdout, which means you must start KildClient from a terminal.

6.4.3. Preferences

This command opens a dialog where you can configure some aspects of KildClient global to all Worlds. See Chapter 5.

6.4.4. Edit Default World

This command opens a dialog where you can set some default parameters used for Worlds. For example, you can define your preferred font or colors, and all new Worlds will use these default font and colors.

The things that can be set are described in Chapter 4, but not all things described there can be set as default parameters. (There's no sense in having a default World name, for example.)

kildclient-3.0.0/doc/C/kildclient/x647.html0000644000175000017500000001432212376345146015241 00000000000000 Input Menu

6.3. Input Menu

6.3.1. Clear

This command clears the command entry box. The same can be achieved by using the button to the left of the command entry box.

6.3.2. Previous and Next

These commands retrieve the previous or next command in the history, putting them in the command input box. They are equivalent of pressing Alt+Up or Alt+Down (or just the arrows, in some circunstances).

6.3.3. Find Previous and Find Next

These commands search the command history for a command that starts with the text that is in the input bar. To use that feature, enter the first characters of the command you want to retrieve and select Find Previous. You can navigate through other commands starting with that prefix with these menu entries.

6.3.4. Command History

This command allows you to review the commands that have been sent recently, and send one or more commands again. When you select the menu item, a dialog like this appears:

Figure 6-1. Command History Dialog

The list on the left shows the commands which are saved. You can configure how many commands are saved, see Section 4.3.

To send again commands to the World, select the commands you would like to send and press Send. Since most MUDs cannot handle too much user input at once and disconnect you in this case, you can add a delay after each sent command, so that the commands are not sent all at once, but with pauses. You can specify the delay and also how many commands are sent at one time. The delay is added after each group of sent commands.

You can also press Send & Close to send the selected commands and close the dialog afterwards.

You can also put a command in the command entry box to edit it. To do so, select a command (in this case you must select only one) and press Recall. If you press Recall & Close instead, the command is recalled and the dialog is closed.

To search for commands containing a given string, used the Find and Find Next buttons. Use the former one to start a search, and the later to find more commands with the string. To start another search, use Find again.

6.3.5. Multi-line Send

This command allows you to send several lines of output and/or a file to the World. When you select the menu item, a dialog like this appears:

Figure 6-2. Multi-Line Send

You can send a file to the World, and you can also send text before and after the file if you need. Naturally, you can also send only some text without sending a file. Just leave the fields you don't need blank.

It is also possible to prefix all the lines with a string (such as chat), or to add a string to the end of all lines. If you want that, fill in the appropriate fields, if not, just leave them blank.

Most MUDs cannot handle too much user input at once and disconnect you in this case. To avoid that, you can add a delay after each sent lines, so that the text is not sent all at once, but with pauses. You can specify the delay and also how many lines are sent at one time. The delay is added after each group of sent lines.

If you select "Keep dialog open after sending", the dialog will not be closed after the text starts to be sent, so you can make further changes to the text.

6.3.6. Test Triggers

This command brings up the Test Triggers window, which is described in Section 8.8.

kildclient-3.0.0/doc/C/kildclient/x3267.html0000644000175000017500000000455212376345147015327 00000000000000 $world->enamacro

C.25. $world->enamacro

void $world->enamacro( number/name , ... );

Enables the macro identified by number or name. If there are several macros with the same name, enables them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x3633.html0000644000175000017500000000526512376345150015320 00000000000000 $world->listhook

C.51. $world->listhook

void $world->listhook( event );

This function briefly lists all hooks connected to the given event.

void $world->listhook( event , number/name , ... );

Lists detailedly the hook with the given number or name, connected to the specified event. If there are several hooks with the same name, lists them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x3493.html0000644000175000017500000000533112376345150015316 00000000000000 $world->gettriggernumber

C.45. $world->gettriggernumber

@list = $world->gettriggernumber( name );

Returns a list with the number(s) of the trigger(s) matching the given name. If no trigger with that name is found, returns an empty list. If there are several triggers with the same name, returns the numbers of all of them.

The number of a trigger is necessary to edit it. However, as the user can change the order of triggers, create new ones and delete old triggers, a trigger's number may change, so you should not store its number; you must fetch the number just before editing it.

kildclient-3.0.0/doc/C/kildclient/x3125.html0000644000175000017500000000456312376345147015322 00000000000000 $world->disalias

C.14. $world->disalias

void $world->disalias( number/name , ... );

Disables the alias identified by number or name. If there are several aliases with the same name, disables them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x3454.html0000644000175000017500000000451412376345150015315 00000000000000 $world->getmainfont

C.41. $world->getmainfont

$font = $world->getmainfont(void);

This function returns the name of the font used in the main MUD window, that is, where the output of the world appears.

kildclient-3.0.0/doc/C/kildclient/x3411.html0000644000175000017500000000610612376345147015313 00000000000000 $world->getline

C.38. $world->getline

$text = $world->getline( line );

($text, $time) = $world->getline( line );

This functions allows you to retrieve a line from the scrollback buffer, and optionally the time in which it was received.

line can be a positive number, representing the number of the line to fetch, or a negative number. If negative, that means that number of lines counting from the bottom. (That is, -1 is the last received line, -2 the one before the last, and so on.)

If the line cannot be retrieved (because it is not stored anymore), returns undef.

The time returned is represented as the number of seconds since the epoch, the same kind of value the time function would return.

kildclient-3.0.0/doc/C/kildclient/x482.html0000644000175000017500000001327212376345145015240 00000000000000 Advanced

4.8. Advanced

The figure below shows the Advanced section of the World Editor:

Figure 4-10. The Advanced section of the World Editor

In most cases, you will not need to change any of the settings of this section.

The File text box specifies the file where the World is saved. It is not necessary to enter anything here, a file name will be generated automatically if you leave it blank. If you enter a file name, it will override the default name. This means that you can create a copy of a World by editing it, giving a new file name, and then saving.

Note, however, that for the World to be recognized and listed in the World Selector, it must have the .wrl extension, and must be in the directory where KildClient stores its files (~/.kildclient under Linux and other UNIX-like systems).

Another thing that can be configured in this section is the character set used by KildClient. If you do not know what is that, then simply ignore it and do not change anything. If you do know, just select the character set that is used by the MUD from the combo box. However, keep in mind that internally KildClient works with the UTF-8 character set. The only things that are changed by the selection you can make in this section are what is output by the MUD and what is sent to the MUD.

You can configure some aspects of the editors for triggers, aliases, macros, timers and hooks (all displayed in the World Editor).

You disable the confirmation dialogs that appear when you try to delete a trigger, alias, macro, etc. from one of the graphical editors. If you disable the Ask for confirmation before deleting triggers, aliases, etc. there will not be a confirmation dialog and the item will be deleted immediately. Be warned that if this is unchecked and some item is deleted, you will need to create it again if you delete it by mistake.

You can also show triggers and other objects defined by plugins that are currently loaded. By default they are not shown, but you can change this cheking the Show items defined by plugins checkbox.

Note, however, that while having that option checked will allow you to edit, delete and reorder the items defined by plugins, these changes will not be made in the plugin file, and the next time the plugin is loaded, the items will be as they were before. You can use the editors to make changes and tests, but you will need to alter the plugin file afterwards.

Another configuration option in this screen is whether the TCP Keep Alive setting is enabled for the connection established to the World. TCP Keep Alive is a feature of the TCP protocol that causes packets to be sent to keep the connection alive if no data is transferred for a period of time. By default it is disabled, but if you need this you can enable it here.

The time that the connection must be idle before a Keep Alive packet is sent is set by your operating system. KildClient only enables the "Use Keep Alive" flag in the socket used for communication, but does not try to set the parameters involved in this operation. The way to set the intervals depends on the operating system.

Finally, it is possible to disable the use of the up and down arrow keys to navigate between commands saved in the command history. If the box is checked, then you will need to use Alt+up and Alt+down to navigate. The arrow keys will retain their normal behaviour. This option may be necessary when using some input methods that use the arrow keys as part of the input process.

kildclient-3.0.0/doc/C/kildclient/x3326.html0000644000175000017500000000456712376345147015331 00000000000000 $world->gag

C.30. $world->gag

void $world->gag( pattern );

Adds a gag that prevents lines matching pattern from being shown.

See the $world->trigger function for more advanced options.

kildclient-3.0.0/doc/C/kildclient/c904.html0000644000175000017500000002257012376345146015214 00000000000000 Triggers

Chapter 8. Triggers

Triggers allow you to react automatically to text that comes from the MUD. This reaction can be of two forms: sending something to the MUD in reply, or doing something else with no direct interaction with the MUD, such as printing something in the screen.

Sometimes the action of a trigger is to change the line that was received and that activated the trigger. You might want to match all lines that contain a certain word (such as your character's name) and print these lines (or part of these lines) in a different color to draw attention. (This feature is sometimes called highlighting.) Additionaly, sometimes you might want to omit some lines, such as everything said by some annoying player, or some messages that are not relevant for you. This kind of trigger is often called a gag. Both these features are supported by KildClient.

Triggers are defined by specifying a pattern against which all lines received from the MUD are matched. If there is indeed a match, an action specified by you is executed. If the trigger is a gag, then the line that matched will not be printed in the screen, otherwise it is printed normally. (Note that printing actually happens before the action is executed, even if here things were described in another order for ease of understanding.)

The above description was very brief and was meant just to give a basic idea of how triggers work. Next follows a more detailed explanation of all aspects involving triggers.

8.1. Creating and Editing Triggers

The easiest way to create and alter triggers is from the World Editor, the place where all settings of a World are altered (see Chapter 4).

Trigger are defined in the Triggers section inside the Automation section. When you open that section, you'll see a list of the defined triggers and some buttons like this:

Figure 8-1. The graphical Trigger editor

The main part of the window is the list of defined triggers. The columns are as follows:

  • Enabled specifies whether the trigger is enabled or not. Triggers that are not enabled are not active and will not be tried when a line is received, but they remain in the list so that they can later be enabled again.

  • Name is a name that is assigned to a trigger. This helps you identify the trigger's purpose and is useful when editing a trigger via the command line (as described in Section 8.6.1). Assigning a name to a trigger is optional.

  • Pattern and Action are the parameters for the trigger, and they define the trigger's action, as described above.

  • I Case (for "Ignore Case"), if set, means the case is not considered while matching the pattern, that is, a case-insensitive match is done.

  • Gag defines if the line that matches the trigger will be printed. If this is active, the line is gaged (omitted) from the main screen.

  • Gag Log defines if the line that matches the trigger will be written to the log file. If this is active, the line is gaged (omitted) from the log file, if logging is enabled (see Chapter 14).

  • Keep Exec defines what happens when the trigger is matched. By default, if a trigger matches further matching of that line against other triggers is stopped. If, however, this option is active and the trigger matches, the line continues being tried against other triggers.

  • Rewriter defines if the trigger is a rewriter trigger, a special kind of trigger described in Section 8.5.1.

  • Plugin: if this is non-empty, it means that the trigger belongs to a plugin (and the name of the plugin is displayed). However, by default plugin triggers are not displayed. See Section 4.8 for information on how to display plugin triggers here.

8.1.1. Adding Triggers

To add a new trigger, press the Add button. This will open a window for you to edit the new trigger's parameters:

Figure 8-2. The window to edit triggers

What can be set represents the columns described above.

When you are finished, press OK and the trigger will be added. If you change your mind, press Cancel and the trigger will not be added.

The next sections will describe some things that can be done with triggers.

8.1.2. Editing Triggers

To edit a trigger, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding trigger (see Section 8.1.1) will be opened, filled with the trigger's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the trigger will remain as it was before.

Another shorter way to edit a trigger is to double click its line in the list.

It is also possible to change the value of the boolean options (those represented by a check box) directly from the trigger list. Make sure that the trigger you want to change is selected, and click in the check button. The state will be toggled.

To delete a trigger, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the trigger. If you want, you can disable this confirmation dialog (see Section 4.8), but if you do so and click the Delete button, the only way to undo your action will be creating the trigger again. To delete several triggers at once, select them all and press Delete.

The final thing that needs to be explained with regard to triggers is how to reorder them. Triggers as tried from the first one to the last, so in a few cases the order might matter. To move a trigger up or down in the list, select it and press the corresponding button.

kildclient-3.0.0/doc/C/kildclient/x4299.html0000644000175000017500000000472312376345150015327 00000000000000 $world->silentenamacro

C.90. $world->silentenamacro

void $world->silentenamacro( number/name , ... );

Enables the macro identified by number or name. If there are several macros with the same name, enables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success.

kildclient-3.0.0/doc/C/kildclient/c14.html0000644000175000017500000000572412376345145015125 00000000000000 Introduction

Chapter 1. Introduction

KildClient is a MUD Client written with the GTK+ windowing toolkit. It supports many common features of other clients, such as triggers, gags, aliases, macros, timers, and much more. But its main feature is the built-in Perl interpreter. You can at any moment execute Perl statements and functions to do things much more powerful than simply sending text the the mud. Perl statements can also be run, for example, as the action of a trigger, allowing you to do complex things. Some built-in functions of KildClient allow interaction with the world, such as sending commands to it.

This manual will guide you in using KildClient. First the basic usage will be described, and then more advanced features will be explained. In the end, there is a reference of all built-in functions of KildClient, which can be called from your scripts.

It is assumed that the user has some basic knowledge of MUDs and their working, and also of the specific MUDs the users connects to. This manual has no aim at explaining how to play a MUD. Even when specific examples are given of commands, these might not work on all MUDs.

kildclient-3.0.0/doc/C/kildclient/x4190.html0000644000175000017500000000451112376345150015310 00000000000000 $world->sendserverdata

C.81. $world->sendserverdata

void $world->sendserverdata( hash_reference );

Sens out-of-band data to the server. See Section 16.2 for details.

kildclient-3.0.0/doc/C/kildclient/x2130.html0000644000175000017500000002147312376345147015314 00000000000000 Defining Hooks in the Command Line

12.2. Defining Hooks in the Command Line

For those more used to Perl and to command lines, it is also possible to define and alter hooks from the command line. This is done with a series of Perl function.

Hooks are defined with the $world->hook function. This function works similarly to $world->trigger (described in Chapter 8).

The simplest way to call the function is with two arguments: $world->hook(event, action). This defines a hook for the given event (see above for the valid events) that does action when the event is fired. As always, action can be some text or a Perl action.

Here's an example of connecting a hook to the OnConnect event:

Example 12-1. Connecting a hook


$world->hook('OnConnect', 'user Bob %; password 12345')

This hook causes the lines to the sent to the MUD when a connection is established, supposedly representing a way to log in to some MUD server.

12.2.1. Editing Hooks

Before going into editing, let us see how to get a list of all hooks that are currently defined for a given event. Just use the $world->listhook function with the event name as argument. You will be presented with a list of the currently defined hooks for that event.

There are three columns: Num is the number of the hook. Hooks are numbered sequentially starting at zero, but keep in mind that there is a separete numbering for each event. This number will be useful when we start editing hooks. After that, Ena tells whether the hook is enabled. Hooks that are disabled are not run. This is a nice way to stop a hook from working, but keep it stored for later use. We will see how to enable and disable hook later in this section. The last column shows the action of the hook.

The listing produced by $world->listhook is compact, showing all hooks but possibly truncating the pattern and/or substitution. If you give a hook number or name as the second argument to listhook (the first argument is the event, as always), it will display that hook's information detailedly.

To edit a hook, you need to know that hook's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->gethooknumber can be used to discover a hook's number if its name is known.) The same function used to add hooks can also change existing ones, you just need to pass the hook number as the second argument.

Calling $world->hook(event, number, new action) changes the action of the hook with that number for that event.

The only attribute for hooks, besides the action is enabled. It was mentioned briefly when we described how to list hooks. It can be set just like the other attributes and is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the hook is tried normally. When it is zero, commands are not tried against it. This way, disabling a hook effectively turns if off, as if it did not exist, but the hook is still saved, and can be turned on again when necessary.

Here's an example of disabling a hook (number 0 of event OnConnect in this case):

Example 12-2. Disabling a hook, the long way


$world->hook('OnConnect', 0,
             { enabled => 0 })

However, there is a shorter way: the $world->dishook function. It takes two arguments: the event and the hook number, and disables the hook with the given number. So the example above can be rewritten in a shorter way as:

Example 12-3. Disabling a hook, the short way


$world->dishook('OnConnect', 0)

The corresponding function $world->enahook enables the specified hook.

There are times when you want to delete a hook. This is easy to do, use the $world->delhook function. It takes as argument the event and the number of the hook wish to delete. Be aware that once deleted it is not possible to recover the hook (unless you create it again). Many times just disabling the hook is a better idea. The second thing to note is that when you delete a hook the numbers of the other hook may change, so be careful when you try to delete several hooks in sequence.

12.2.2. Assigning Names to Hooks

It is possible to assign names to hook. When a hook has a name, you can enable, disable, or delete it using its name instead of its number.

To assign a name to a hook, specify the name attribute when creating it:

Example 12-4. Creating a hook with a name


$world->hook('OnConnect', 'user Bob %; password 12345',
             { name => 'connection' })

You can now disable this hook with $world->dishook('OnConnect', 'connection'). The name can also be used in the $world->enahook, $world->delhook and $world->listhook functions.

It is also possible to assign a name to an existing hook. Just edit it as described in Section 12.2.1, passing the name attribute. Use this same process to change the name of a hook.

Another feature of hook names is that several hooks can have the same name. In this case, all these hooks will be treated as a single group. The functions above, when passed a hook name, will act upon all hooks of the group, that is, on all hooks with that name.

kildclient-3.0.0/doc/C/kildclient/x3301.html0000644000175000017500000000461012376345147015307 00000000000000 $world->enatrigger

C.28. $world->enatrigger

void $world->enatrigger( number/name , ... );

Enables the trigger identified by number or name. If there are several triggers with the same name, enables them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x3391.html0000644000175000017500000000471412376345147015325 00000000000000 $world->getidletime

C.36. $world->getidletime

$seconds = $world->getidletime(void);

This function returns the idle time, that is, the time elapsed since the last command was sent, in seconds. See Section 4.2.3 for information on how that time is calculated and how to configure it.

kildclient-3.0.0/doc/C/kildclient/x3279.html0000644000175000017500000000433112376345147015325 00000000000000 $world->enaplugin

C.26. $world->enaplugin

void $world->enaplugin( name );

Enables the specified plugin.

kildclient-3.0.0/doc/C/kildclient/x4223.html0000644000175000017500000000500212376345150015301 00000000000000 $world->silentdishook

C.84. $world->silentdishook

void $world->silentdishook( event , number/name , ... );

Disables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, disables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success.

kildclient-3.0.0/doc/C/kildclient/x3472.html0000644000175000017500000000457512376345150015324 00000000000000 $world->getpluginversion

C.43. $world->getpluginversion

$version = $world->getpluginversion( name );

This functions returns the version of the plugin with the given name. If no plugin with that name is loaded, it returns an empty string.

kildclient-3.0.0/doc/C/kildclient/x3289.html0000644000175000017500000000456412376345147015336 00000000000000 $world->enatimer

C.27. $world->enatimer

void $world->enatimer( number/name , ... );

Enables the timer identified by number or name. If there are several timers with the same name, enables them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x2274.html0000644000175000017500000001602712376345147015324 00000000000000 Standard Plugins

13.3. Standard Plugins

KildClient comes with a few plugins as part of its distribution. These plugins will be described here. You can load these plugins as described above.

13.3.1. easypath

This plugin makes the use of paths (see Section 7.2.1) easier. When this plugin is loaded, you can type #2n3e{sw} instead of /$world->path("2n3e{sw}").

13.3.2. keypad

This plugin allows use of the keypad for movement. Pressing the left arrow of the numeric keypad moves to the east, pressing the up arrow moves to the north, and so on.

A few other keys of the keypad are also bound: - and + represent down and up, respectively. 5 sends who, 0 sends look, / sends inventory and * sends score.

The Num Lock key must be off for this plugin to work.

13.3.3. notes

This plugin allows you to assign notes to World. The notes are saved with the World and are restored when it is opened again. You can write anything you want, probably it will be something you want to remember for that World.

This plugin requires the gtk3-perl bindings, because it has a graphical user interface.

Type /notes::edit to open a window where you can edit the notes. When you are finished, press the Close button. The notes are saved automatically.

Use the notes::clear function to clear the whole contents of the notes.

It is also possible to append something to the notes with notes::append('text'). This is probably more useful in scripts.

13.3.4. kc256

This plugin demonstrates a useful extension to the 16 ansi colors that KildClient supports. This is the same 256-color extension supported by xterm (if it is complied with support for that).

With this extension, you can specify any color in a 6x6x6 RGB color cube, that is, you have 216 rgb colors at your disposal, plus 24 shades of gray. (The remaining 16 colors are the standard ansi colors.)

There are two functions in this plugin:

kc256::showcolors: Displays all 216 available RGB colors and the 24 shades of grey in nice tables, with the values that you can use in colorize to access them.

kc256::rainbowtext($string): Just a demonstration on how (not to) use the colors. Displays $string, one character in a different color.

13.3.5. channels

Channels is a simple plugin to yank lines out of the world window and put then in other windows. It's most obvious use is chat channels, which usually have something like "[NAME]" at the beginning.

Once the plugin is loaded, there is only one function to call:

channels::new("name", "regex");

where "name" is the name that should appear in the title bar of the new window, and "regex" is the pattern to match for text.

Use channels::list() for a list of currently defined channels. To remove a channel, use channel::del(num), where num is the number of the channel.

13.3.6. Other Plugins

The KCWin plugin allows you to create general purpose windows a terminal for output and an entry box for input. These windows do nothing by themselves, but they can be used by other plugins when they need a window for input and output.

Since this plugin is just a helper for other plugins, it is not described here, but rather in Appendix D.

The chat plugin allows peer to peer chat with other users of KildClient and of other clients that support the MudMaster or zChat protocols. It is described in its own chapter, Chapter 15.

The serverdatadumper is a plugin to help develop or debug plugins that use out-of-band server data. See Chapter 16.

kildclient-3.0.0/doc/C/kildclient/x391.html0000644000175000017500000001136512376345145015240 00000000000000 Logging

4.4. Logging

A useful feature of KildClient is it hability to log all the output from the MUD, as shown in the screen, so that you can retrieve it later.

The output is saved in a file you specify. ANSI color codes are not saved, but otherwise the output is identical.

It is possible to prefix each line with a timestamp, so you can see when each line was received. You can specify the format of this timestamp.

The figure below shows the Logging section of the World Editor:

Figure 4-6. The Logging section of the World Editor

In the top, you will see if logging is currently enabled or disabled, and you can quickly start or stop it with the two buttons.

When you start logging, you can include some of the lines that have already been received and are in the scrollback buffer displayed in the main window. If you want to do that, just select the corresponding check box and enter the number of lines to save.

Next you specify the name of the file to store the log. New log lines are appended to that file, so it is safe so specify an existing file.

It is possible to have the log file named automatically based on the date and time that logging is started. For example, if the file name is "log_%m_%d.txt" the file name will include the month and day, for example for November 25th the file will be "log_11_25.txt". This is done replacing escape sequences beginning with the % character for the values depending on the date and time. The valid escape sequences are those of the strftime() function, and can be found here.

Similarly, you can use %Kw in the file name and it will be replaced by the name of the World. And the string %Kc is replaced by the name of the character used in auto-login (see Section 4.1). (If auto-login was not used, then %Kc is replaced by an empty string.)

Parent directories are created automatically if necessary when opening log files.

If Automatically start logging when connected is selected, then all your mud sessions will be logged automatically.

It is possible to prefix each line written in the log file with the date and time it was received. To do that, select Prefix lines with date and/or time, and specify the format of the date and time. This is also a string with % escape sequences like the file name. The default includes the full date and time.

kildclient-3.0.0/doc/C/kildclient/x4064.html0000644000175000017500000000430212376345150015306 00000000000000 $world->save

C.74. $world->save

void $world->save(void);

Saves the current World.

kildclient-3.0.0/doc/C/kildclient/x552.html0000644000175000017500000000605412376345146015237 00000000000000 External Programs (Linux)

5.3. External Programs (Linux)

This section of the Preferences dialog only appears when KildClient is run in Linux.

The figure below shows the External Programs section of the Preferences dialog:

Figure 5-3. The External Programs section of the Preferences dialog

In this section you can configure the command that will be run when you right-click in a URL that appears in the MUD window and select Open Link. The command will be executed, with %s replaced with the URL's address. The ampersand (&) in the end means that the command is to be executed in the background, so that you can continue using KildClient while browsing the URL.

You can also set a command used to play audio files (see Section 7.3). Enter the command, with %s in the place of the file path. The default should work (it uses the SOX program, which is usually installed), but you can use other commands if you use ALSA, ARTS, ESD, JACK, etc.

kildclient-3.0.0/doc/C/kildclient/c2682.html0000644000175000017500000001267612376345147015310 00000000000000 Out-of-band server data

Chapter 16. Out-of-band server data

KildClient support some protocols that allow the server to send data to the client in a way that can be easily parsed (unlike prompts, for example) and that is not directly visible to the user. We call this out-of-band data. For example, the server could send your character stats (hp, mana, etc), so that a plugin can display this data in a more convenient form.

Currently, two such protocols are supported: MSDP and GMCP (sometimes called ATCP2).

By default, nothing is done with the data that is received. A hook must be bound to the OnServerData event to handle the data that is received. Even so, KildClient does nothing with the data (other than to parse it in a form that's easy to be used in Perl scripts and protocol-independent): it's up to your code to do anything with it. For example, KildClient does not store any previous values of any variable, it is up to you to store what you want.

16.1. Receiving server data

As mentinoed previously, to receive server data, bind a hook to the OnServerData event. See Chapter 12.

Inside the hook, the %::server_data variable holds the data received. The elements of the hash can vary depending on the protocol and what was received. To view what is received in each message, you can use the serverdatadumper plugin. Just load it, and whenever a server data message is received, the contents of the %::server_data will be displayed.

Here's a general description of the elements, followed by specifics to each protocol if appropriate:

  • $::server_data{'protocol'} hold the protocol used to send the data. It will be MSDP or GMCP.

  • $::server_data{'data'} holds the data received. The actual contents vary depending on what has been received, but in most cases it will be a reference to a hash with entries for each variable sent by the server. If the value is undef, that means that the server sent the null/undefined object (this is not possible in all protocols). If this key does not exist in the hash, the server did not send any variables at all (again, not possible in all protocols).

  • $::server_data{'error'} is set in case KildClient could not parse the data sent by the server. In this case, this variable holds the error message, and $::server_data{'data'} contains the raw data received.

16.1.1. GMCP data

The GMCP protocol has the concept of packages (with optional subpackages) and message names. These are stored in $::server_data{'package'}, $::server_data{'subpackage'} and $::server_data{'message'} if they are included in the message.

The actual data in this protocol is sent using the JSON format. The Perl module JSON is used to parse the data, see its documentation if you want specific details on how objects are represented.

kildclient-3.0.0/doc/C/kildclient/c733.html0000644000175000017500000001672112376345146015215 00000000000000 Using Perl in KildClient

Chapter 7. Using Perl in KildClient

This chapter will describe briefly how to use Perl (Practical Extration and Report Language, or, according to some, Pathologically Eclectic Rubbish Lister) in KildClient. Even though it will give a few examples of things that would certainly be known already by people who know Perl, this Chapter is not meant to be a Perl tutorial. If you want to learn Perl from the start, you should read its man pages, find a tutorial or a good book on the subject (there are plenty of these). Some knowledge of Perl will certainly help in understanding this Chapter.

7.1. The Basics

KildClient has a built-in Perl interpreter. To run a perl statement, just type if preceded by a slash (/) in the command entry box. The statement will be executed by the Perl interpreter instead of being sent to the MUD.

The statement can be anything that Perl will accept. You can actually execute several Perl statements if you separate them with ; (no need to add / again, just once in the beginning of the line). You can call sub-routines, execute conditional or loop constructions, call a built-in function, do variable assignments, or even define a sub-routine. However, the statement must be complete. You cannot enter something like /$myVar = and then enter /"some_value";, the statement must be complete in one line. Technically, each line you enter is executed inside an eval block, so anything you want executed must be valid code inside an eval block.

All built-in Perl functions are accessible for you to use, and you can load Perl modules and use their functionality. However, that is not enough, because Perl's built-in functions will not allow you to interact with the World. Because of that, KildClient defines a set of functions that you can use to interact with the World. A full list describing them detailedly is found in Appendix A, but some of the most useful ones will be described in this Chapter. Many of these functions deal with creating and editing triggers, gags, aliases etc. These will be described in the corresponding chapters.

It is possible to get help on all functions using the help function. It takes as argument the name of the function. Note that since help is nothing else than another Perl function, the name of the function for which you want help is just an argument to it, and must be passed as a string. That is, to get help on the echo function, type /help "echo". (Naturally, you can enclose "echo" in parenthesis, but this is not necessary.)

Some functions are in a way global, that is, they do not refer to a specific world. One such example is colorize (see colorize), which inserts ANSI color codes in strings (useful when you want to print something in the screen). These are called like any built-in Perl function. For example, if you enter /$colorstr = colorize("&WI'm in white!"), the variable $colorstr will hold a string that would be printed in white.

Many functions, however, are specific to a World, such as echo (see $world->echo), which prints something in the World window (but does not send it to the World). Because of that, they are called in a slightly different way. To print that string which has just been created, you would enter /$world->echo($colorstr). Those that know Perl will recognized this as a method call of the $world instance. Indeed, $world is an instance of the class World class. This class defines several functions that allow interaction with a World. On start-up, the $world variable is created and references the current World.

It is also possible to control other worlds, if you have a variable pointing at them. You can get such a variable with the getworld function (see getworld). In that case, you should use the variable you got instead of $world.

If all the above did not make sense to you, do not worry. Just remember that many functions have to be called by adding $world-> to the front. These functions will always be listed with that in front.

When a World is opened, the Perl interpreter reads and executes a file you specify. (See Section 4.5.1 for information on how to specify the file.) In this file, you can define sub-routines and variables. They will be then available for you to use during your session. If you define a sub-routine called sendGreetings, you can type /sendGreetings and the sub-routine will be executed. Or, if you define a variable, you can use it anywhere.

It should be noted that each World has its own Perl interpreter, with its functions and variables. What you do in one World does not affect the others.

kildclient-3.0.0/doc/C/kildclient/x4311.html0000644000175000017500000000473512376345150015313 00000000000000 $world->silentenatimer

C.91. $world->silentenatimer

void $world->silentenatimer( number/name , ... );

Enables the timer identified by number or name. If there are several timers with the same name, enables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success.

kildclient-3.0.0/doc/C/kildclient/x3338.html0000644000175000017500000000530312376345147015321 00000000000000 $world->getaliasnumber

C.31. $world->getaliasnumber

@list = $world->getaliasnumber( name );

Returns a list with the number(s) of the alias(es) matching the given name. If no alias with that name is found, returns an empty list. If there are several aliases with the same name, returns the numbers of all of them.

The number of an alias is necessary to edit it. However, as the user can change the order of aliases, create new ones and delete old aliases, an alias's number may change, so you should not store its number; you must fetch the number just before editing it.

kildclient-3.0.0/doc/C/kildclient/x3378.html0000644000175000017500000000542512376345147015332 00000000000000 $world->gethooknumber

C.35. $world->gethooknumber

@list = $world->gethooknumber( event , name );

Returns a list with the number(s) of the hook(s) matching the given name. If no hook with that name is found, returns an empty list. If there are several hooks with the same name, returns the numbers of all of them. You must specify the event in which to search for the hook.

The number of a hook is necessary to edit it. However, as the user can change the order of hooks, create new ones and delete old hooks, a hook's number may change, so you should not store its number; you must fetch the number just before editing it.

kildclient-3.0.0/doc/C/kildclient/x1105.html0000644000175000017500000000646312376345146015316 00000000000000 Changing the Style of the Matched Text

8.3. Changing the Style of the Matched Text

It is possible to cause a trigger to change the style of the line that matched (or of a part of it). This can be used, for example, to make some text that interests you stand out.

To do that, enable the Change Style check box in the Edit Trigger dialog (see Section 8.1.1). The Configure button then allows you to set the style to be applied. When pressed, it brings up a window like this:

Figure 8-3. The window to configure style

First you should select what is going to have the style changed. The style can be applied to the whole line that matched against the trigger, to the part of the line that matched the trigger pattern, or the the part of the line that was captured by one of the parentheses in the pattern (if they are used, naturally).

Next you can configure the style to be applied. You can change the color of the text, and apply or remove italics, strike-thru and underlining. In all these options, the default is "Do not change", which means that the trigger does not affect the style as sent by the MUD. If you select some option, then your selection will override the style that the MUD sends.

kildclient-3.0.0/doc/C/kildclient/x4073.html0000644000175000017500000000502212376345150015306 00000000000000 $world->send

C.75. $world->send

void $world->send( str , ... );

Sends any number of strings to the current world. After each string, a newline is send, so that the MUD recognizes it as a command.

See also $world->echo, $world->sendecho and $world->sendnoecho.

kildclient-3.0.0/doc/C/kildclient/x4261.html0000644000175000017500000000475312376345150015317 00000000000000 $world->silentdistrigger

C.87. $world->silentdistrigger

void $world->silentdistrigger( number/name , ... );

Disables the trigger identified by number or name. If there are several triggers with the same name, disables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success.

kildclient-3.0.0/doc/C/kildclient/c1687.html0000644000175000017500000001734612376345147015313 00000000000000 Macros

Chapter 10. Macros

Macros are, in a way, similar to aliases. They allow you to send commands to the MUD in an easier way. Aliases allow you to associate commands with shortcuts (typing a three-letter command to send a much more complex command, for example). Macros allow you to associate a command with a keypress. You could associate, for example, F5 with the command drink from fountain, and then you would only need to press F5 to send that command to the MUD.

The commands need not be complex or big: you could associate the arrow keys with macros that send movement commands, and you would be able to move around the MUD using the arrow keys.

Macros consist of a key and an action. The action represents what is sent to the MUD when the macro is run. It can be a single command to send, several commands separated by %;, or something to be executed by Perl, if it starts with /.

10.1. Creating and Editing Macros

The easiest way to create and alter macros is from the World Editor, the place where all settings of a World are altered (see Chapter 4).

Macro are defined in the Macros section inside the Automation section. When you open that section, you'll see a list of the defined macros and some buttons like this:

Figure 10-1. The graphical Macro editor

The main part of the window is the list of defined macros. The columns are as follows:

  • Enabled specifies whether the macro is enabled or not. Macros that are not enabled are not active and will not be run even if their key is pressed, but they remain in the list so that they can later be enabled again.

  • Name is a name that is assigned to a macro. This helps you identify the macro's purpose and is useful when editing a macro via the command line (as described in Section 10.2.1). Assigning a name to a macro is optional.

  • Key is the key that activates the macro.

  • Action is the action that is run when the key is pressed.

  • Plugin: if this is non-empty, it means that the macro belongs to a plugin (and the name of the plugin is displayed). However, by default plugin macros are not displayed. See Section 4.8 for information on how to display plugin macros here.

10.1.1. Adding Macros

To add a new macro, press the Add button. This will open a window for you to edit the new macro's parameters:

Figure 10-2. The window to edit macros

What can be set represents the columns described above. To define the key, press the key combination desired in the text box for Key and the appropriate key code will be inserted.

When you are finished, press OK and the macro will be added. If you change your mind, press Cancel and the macro will not be added.

To see some things macros can do, read Section 10.2. If you want to try the macros described there, you can create them from the World Editor.

10.1.2. Editing Macros

To edit a macro, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding macro (see Section 10.1.1) will be opened, filled with the macro's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the macro will remain as it was before.

Another shorter way to edit a macro is to double click its line in the list.

It is also possible to change the value of the enabled option directly from the macro list. Make sure that the macro you want to change is selected, and click in the check button. The state will be toggled.

To delete a macro, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the macro. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the macro again. See Section 4.8. To delete several macros at once, select them all and press Delete.

The final thing that needs to be explained with regard to macros is how to reorder them. Macros as tried from the first one to the last, so in a few cases the order might matter. To move a macro up or down in the list, select it and press the corresponding button.

kildclient-3.0.0/doc/C/kildclient/x4621.html0000644000175000017500000001111112376345150015301 00000000000000 A Sample Plugin

E.2. A Sample Plugin

Here is a simple but complete plugin. It will be used to illustrate many things about plugins.

Example E-1. A Sample Plugin


package sample;
#: Version: 1.0
#: Description: A Sample Plugin
#: Author: Eduardo M Kalinowski

$::world->trigger('First', 'of the plugin', { name => 'sample:misc' });
$::world->trigger('Second', 'of the plugin', { name => 'sample:misc' });

$::world->timer({ interval => 5, action => 'sample plugin',
                  name => 'sample:misc' });

$::world->macro('F8', '/sample::stop',  { name => 'sample:enadis' });
$::world->macro('F9', '/sample::start', { name => 'sample:enadis' });


sub testplugin {
  $::world->echonl("The plugin works.");
}

sub stop {
  $::world->distimer('sample:misc');
}

sub start {
  $::world->enatimer('sample:misc');
}

sub help {
  $::world->echonl("This is a sample plugin, that does nothing useful.");
  $::world->echonl("It outputs a short string every now and them. This");
  $::world->echonl("behaviour can be stopped by pressing the F8 key, and");
  $::world->echonl("re-enabled with the F9 key.");
  $::world->echonl("One function is defined: sample::testplugin. It");
  $::world->echonl("outputs something to show that the plugin is working.");
}

The first thing in the file is the header, in the format described above. then comes trigger, timer, and macro definitions. All definitions of triggers, aliases, macros, timers, hook and permanent variables, if any, should be in the top-level scope (which means they will be executed when the plugin is loaded). (Alternatively, you could put them in a BEGIN block, which would have the same result, but there isn't a reason for that.) You should not create any of those objects in any function.

It should be noted that the $world variable is refereed as $::world. It is just because we are inside a package, and $world does not belong to this package. Otherwise, the calls are equal.

After that, some functions are defined. testplugin is meant to be called by the user. stop and start are used by the macros (but they could also be called by the user). Finally, a help is defined, that outputs some information about the plugin. All plugins should define a help describing themselves.

kildclient-3.0.0/doc/C/kildclient/x1374.html0000644000175000017500000000751212376345146015322 00000000000000 Testing Triggers

8.8. Testing Triggers

You can test your triggers to see how they would react to text coming from the MUD. To do so, select the Input->Test Triggers menu item, or press the Test Triggers button from the Trigger section of the World Editor.

You will see a dialog like this:

Figure 8-4. The test triggers window

In the first entry box, enter some text to be matched against the triggers that are defined. This line will be matched as if it came from the MUD. Then press the Send button to try the triggers. Matching is done exactly for lines that come from the server: only enabled triggers are tried, rewriter triggers are tried first and change the line, the keep executing flag is verified, and so on.

After pressing Send, the results are shown in the second half of the window. The number of triggers that matched is displayed, and also all the commands that would be processed if that line came from the mud (if any). The line that would be printed to the main window is also displayed. If any gag trigger matched, that box will be empty indicating that no line will be printed. If no gag triggers matched, the line could be different because a rewriter trigger changed it. However, in most cases the line printed will be the same as the line received. Finally, you are told if the line would be written in the log file. If any gag log trigger matched the line, then it would be omitted.

You can try the triggers against other lines, just enter them and press Send. Any changes you make to the triggers are used instantly, just press Send again to try the same line against the new or changed triggers.

kildclient-3.0.0/doc/C/kildclient/x995.html0000644000175000017500000002544212376345146015254 00000000000000 Basic Triggers

8.2. Basic Triggers

The simplest kind of trigger specifies only a pattern and an action. Below these parameters are described in detail.

What exactly is pattern? It is a regular expression. In short, a regular expression is a way to specify text patterns that are looked for in the lines that the server sends. If you know Perl, you certainly know what is a regular expression. If not, it is advised that you look for some more information on it, there are plenty of tutorials on the Internet. For those who know them, you can use the full power of Perl's regular expressions in triggers, because Perl is used for the matching.

What about the action? It can be anything that could be entered in the command line. It can be a simple command, that is sent to the MUD. Or you can send several commands at separating them with %; as described in Section 3.2. Finally, you can execute some Perl code when a trigger matches, and this allows you to do virtually anything you want.

Below is an example of a very simple trigger. To create this trigger, inform the Pattern and Action parameters shown below. Leave the other parameters in their default values.

Example 8-1. A very simple trigger

  • Pattern: has attacked you!

  • Action: wield sword

Whenever a line that contains the phrase "has attacked you!" is received, the command "wield sword" will be automatically be sent. Note that in this case the received line will probably be something like "An orc has attacked you!", but the trigger matches because that line contains the pattern. This is a feature of regular expressions. If you want to match the entire line and not only part of it, you must use the ^ and $ anchors in the beginning and end, respectively.

By default, case is considered when matching: if the server sent a line saying "Has Attacked" then there would be no match. To make case be ignored when matching, check the Ignore case when matching option.

It is also possible for the action to be executed to depend on what was received from the server. This is better explained by an example:

Example 8-2. A trigger which captures part of the received line and uses it in the action

  • Pattern: ^(.*) has attacked you!$

  • Action: cast missile $1

There are two new things in the pattern. The first one is that is surrounded by ^ and $ which means that the entire line must match, as described previously. The other new thing (and the one that concerns us at this moment) is the (.*) part. In regular expressions, the dot means to match any character. The asterisk means zero or more of the previous element. So the combination .* means zero or more of any characters. Essentially, it matches anything. The brackets () around any part of a regular expression captures part of the string to be used afterwards. So the whole regular expression means: look for a line that contains something followed by has attacked you!. What comes before has attacked you! is stored for later use.

This stored string is then used in the action by means of the $1 construct. This special placeholder is substituted by what was captured in the matched string. So if the line Orc has attacked you! is received, cast missile Orc is send. If Smaug has attacked you! is received, then cast missile Smaug is sent to the World, and so on.

It is possible to have more than one captured string in the pattern. In this case, $1 is replaced by what was captured in the first group, $2 by the second group, and so on.

Sending commands to the World is useful, but the real power is the fact that you can also run Perl commands in response to triggers. Just enter them as you would in the command box: prefixed by /. If the action is simple you can enter the statements there directly, if not, you can define a function in your script file and call it from the trigger.

Let us rewrite Example 8-2 to use Perl in the action:

Example 8-3. A trigger with an action in Perl

  • Pattern: ^(.*) has attacked you!$

  • Action: /$world->send("cast missile $_[1]")

This time, when a line consisting of some arbitrary text followed by "has attacked you!" is received, the $world->send will be called to send some text to the World.

You may have noticed that here $_[1] was used instead of $1 in the action to represent the first captured bracketed group. The reason for this is complex, and if you do not want to worry about the inner workings, just use the following rule: in commands sent to the mud, use $1, $2, etc., and in actions that are Perl commands, use $_[1], $_[2] and so on.

Here are the details for the different syntaxes. Feel free to skip the next two paragraphs:

When a trigger matches, KildClient substitutes $1 (and the other placeholders) by the captured expressions from the received line. However, $_[1] (and the other similar tokens) are not replaced by KildClient. If the action is just a string sent to the mud, they would not be replaced, so the only possibility to use the captured groups is with the $1 syntax. But Perl commands can access the captured groups in another way: the strings are stored in the @_ array. The first position, $_[0] contains the whole matched line. Subsequent positions contain each matched grouped expression, so $_[1] is the first bracketed substring, $_[2] is the second, and so on. This way, when a Perl command is executed the values are replaced by the Perl interpreter itself.

It is also possible to use $1 in commands to be passed to the Perl interpreter. Most of the time it will work, but in some specific circumstances you may get unexpected results. So it's preferable to let Perl do the substitution when commands are to be run by the Perl interpreter.

If you call a sub-routine as the trigger action, the matched arguments are not automatically passed, so you need to pass them manually. Since they are in the array @_, just pass that whole array as the argument to the sub-routine. Inside the sub-routine, they will be available as the sub-routine's arguments, which incidentally means that they will be accessed in the exact same way: with $_[1], $_[2] and so on. Alternatively, you can only pass the parameters that you need instead of the whole array.

Here's an example of a trigger that calls a sub-routine:

Example 8-4. A trigger that calls a sub-routine

  • Pattern: ^(.*) has attacked you!$

  • Action: /myGreatAttackSequence(@_)

Naturally, you need to define the myGreatAttackSequence sub-routine in your script file. It will be called as the result of the trigger. The @_ array, containing the whole matched line and the matched bracketed expressions is passed to the sub-routine as argument, and its contents will be available to the sub-routine as its parameters.

kildclient-3.0.0/doc/C/kildclient/x1944.html0000644000175000017500000002615112376345147015326 00000000000000 Defining Timers in the Command Line

11.2. Defining Timers in the Command Line

For those more used to Perl and to command lines, it is also possible to define and alter timers from the command line. This is done with a series of Perl function.

Timers are created with the $world->timer function. It is similar to other functions for adding triggers, aliases and macros, but the hash reference with attributes (the thing inside {}) must always be used.

Let us see an example of defining a timer that sends "who" once a minute:

Example 11-1. A simple timer


$world->timer({ interval => 60,
                action => 'who' })

Note that the interval is specified in seconds.

Our second example will be of a timer that executes a specified number of times:

Example 11-2. A timer that executes only five times


$count = 5;
$world->timer({ interval => 10,
                count => 5,
                action => '/$world->send("chat The count is at $count"); --$count' })

In these two commands, first a variable that will be used in the timer is defined. Then the timer is created, specifying count as 5, so that it is executed only five times. The timer's action is to send commands counting down to one. When the count reaches one, the timer is disabled, because it has already executed five times.

Now let us see a temporary timer:

Example 11-3. A one-shot timer


$world->timer({ interval => 30,
                count => 1,
                temporary => 1,
                action => 'say 30 seconds have elapsed' })

This timer has a count of one, meaning it will only be executed once. Also, temporary is defined as true, which means that after it is executed (which will happen in 30 seconds), the timer will be erased.

Of course, a temporary timer does not need to have a count of one. The countdown timer above could have been made temporary if it was not needed after it reached one.

11.2.1. Editing Timers

Before going into editing, let us see how to get a list of all timers that are currently defined for the World. Just use the $world->listtimer function without arguments. You will be presented with a list of the currently defined timers.

There are several columns: Num is the number of the timer. Timers are numbered sequentially starting at zero. This number will be useful when we start editing timers. After that, Int is the interval (in seconds) between timer firings. Next comes Count, which is the number of times the timer will still be fired before being disabled or erased. If the value is -1, that means that it will execute indefinitely. Ena tells whether the timer is enabled. enabled. Timers that are disabled are not run. This is a nice way to stop a timer from working, but keep it stored for later use. We will see how to enable and disable timer later in this section. After that, Temp tells whether the timer is temporary or not. Temporary timers were explained in the previous section. In brief, a temporary timer is deleted (and not only disabled) after its count reaches zero. The last column shows the action associated with the timer.

The listing produced by $world->listtimer is compact, showing all timers but possibly truncating the action. If you give a timer number as argument to listtimer, it will display that timer's information detailedly.

To edit a timer, you need to know that timer's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->gettimernumber can be used to discover a timer's number if its name is known.) The same function used to add timers can also change existing ones, you just need to pass the timer number as the first argument.

The generay way to edit a timer is like this: $world->timer(number, { new attributes }), where new attributes is a list of the attributes you want to change. For example, the code below changes the interval of timer number two:

Example 11-4. Changing the interval of a timer


$world->timer(2, { interval => 30 })

As a further example, consider the one below, that edits timer number five to be temporary and to run 10 times:

Example 11-5. Changing the interval of a timer


$world->timer(5, { temporary => 1,
                   count => 10 })

It is possible to enable and disable timers with the syntax above, but there is a shorter way: the $world->distimer function disables the timer whose number is passed as argument, as shown in the example below:

Example 11-6. Disabling a timer, the short way


$world->distimer(3)

The corresponding function $world->enatimer enables the specified timer.

It is also possible to temporarily disable all timers. Just use the menu Preferences->Disable Timers and this will prevent timers from running. This does not change the "enabled" status of any timers, it just prevents all timers from running. When you select the menu again, timers that were enabled will run again, and those that were disabled will remain disabled.

There are times when you want to delete a timer. This is easy to do, use the $world->deltimer function. It takes as argument the number of the timer you wish to delete. Be aware that once deleted it is not possible to recover the timer (unless you create it again). Many times just disabling it is a better idea. The second thing to note is that when you delete a timer the numbers of the other timers may change, so be careful when you try to delete several timers in sequence.

11.2.2. Assigning Names to Timers

It is possible to assign names to timers. When a timer has a name, you can enable, disable, or delete it using its name instead of its number.

To assign a name to a timer, specify the name attribute when creating it:

Example 11-7. Creating a timer with a name


$world->timer({ interval => 60,
                action => 'who',
                name => 'who' })

You can now disable this timer with $world->distimer('who'). The name can also be used in the $world->enatimer, $world->deltimer and $world->listtimer functions.

It is also possible to assign a name to an existing timer. Just edit it as described in Section 11.2.1, passing the name attribute. Use this same process to change the name of a timer.

Another feature of timer names is that several timers can have the same name. In this case, all these timers will be treated as a single group. The functions above, when passed a timer name, will act upon all timers of the group, that is, on all timers with that name.

11.2.3. Reordering Timers

It is possible to move a timer to another position with the $world->movetimer function.

The function takes two parameters: the first is the name or number of the timer that you want to move. The second is the new position that the timer will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of timers, the timer will be moved to the end of the list.

If there are several timers with the same name, only the first one found will be moved. And when a timer is moved, other timers might move up or down to accomodate the change.

kildclient-3.0.0/doc/C/kildclient/x3590.html0000644000175000017500000000453712376345150015323 00000000000000 $world->interpret

C.48. $world->interpret

$world->interpret( "string" );

This function interprets the string as if it were typed in the input box: commands are split, Perl code is run, aliases are expanded, etc.

kildclient-3.0.0/doc/C/kildclient/x1587.html0000644000175000017500000002720112376345146015325 00000000000000 Defining Aliases in the Command Line

9.3. Defining Aliases in the Command Line

For those more used to Perl and to command lines, it is also possible to define and alter aliases from the command line. This is done with a series of Perl function.

Aliases are defined with the $world->alias function. This function works similarly to $world->trigger (described in Chapter 8).

The simplest way to call the function is with two arguments: $world->alias(pattern, substitution). This defines an alias with the given pattern and substitution. For example, the alias described in Example 9-1 would be created as follows:

Example 9-5. A simple alias defined in the command line


$world->alias('^df$', 'drink from fountain')

Like the $world->trigger function (see Section 8.6), you can specify extra arguments to control advanced alias features. One such argument is perleval that causes the substitution to be evaluated as a Perl statement. The alias defined in Example 9-4 can also be created as follows:

Example 9-6. An alias whose substitution is evaluated (in the command line)


$world->alias('calc\((.*)\)', 'eval "$1"',
              { perleval => 1})

See the difference? There is a third parameter, enclosed in curly braces {}, with the word perleval, an arrow, and the number 1. What that means is that perleval has the value 1, or, as usual in computer languages, is true. (False would be zero.)

To specify a case-insensitive match, use the ignorecase attribute.

9.3.1. Editing Aliases

Before going into editing, let us see how to get a list of all aliases that are currently defined for the World. Just use the $world->listalias function without arguments. You will be presented with a list of the currently defined aliases.

There are four columns: Num is the number of the alias. Aliases are numbered sequentially starting at zero. This number will be useful when we start editing aliases. After that, Ena tells whether the alias is enabled. Aliases that are disabled are not tried. This is a nice way to stop an alias from working, but keep it stored for later use. We will see how to enable and disable aliases later in this section. The final two columns list the pattern and substitution of the alias.

The listing produced by $world->listalias is compact, showing all aliases but possibly truncating the pattern and/or substitution. If you give an alias number as argument to listalias, it will display that alias's information detailedly.

To edit an alias, you need to know that alias's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->getaliasnumber can be used to discover an alias's number if its name is known.) The same function used to add aliases can also change existing ones, you just need to pass the alias number as the first argument.

Calling $world->alias(number, new pattern) changes the pattern of the alias with that number. If you want to change the pattern and substitution, include the substitution as a third argument: $world->alias(number, new pattern, new substitution). What if you want to change only the substitution? Since passing only one string argument would change the pattern, this is done in a different way. In brief, this is how you would change only the substitution: $world->alias(number, { substitution => new substitution }). Notice that the substitution is passed as an attribute inside the curly braces. It is also possible to change the pattern this way, just use the attribute pattern.

One other attribute of aliases is enabled. It was mentioned briefly when we described how to list aliases. It can be set just like the other attributes and is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the alias is tried normally. When it is zero, commands are not tried against it. This way, disabling an alias effectively turns if off, as if it did not exist, but the alias is still saved, and can be turned on again when necessary.

Here's an example of disabling an alias (number 3 in this case):

Example 9-7. Disabling an alias, the long way


$world->alias(3,
              { enabled => 0 })

However, there is a shorter way: the $world->disalias function disables the alias whose number is passed as argument. So the example above can be rewritten in a shorter way as:

Example 9-8. Disabling an alias, the short way


$world->disalias(3)

The corresponding function $world->enaalias enables the specified alias.

It is also possible to temporarily disable all aliases. Just use the menu Preferences->Disable Aliases and this will prevent aliases from being used. This does not change the "enabled" status of any aliases, it just prevents all aliases from being executed. When you select the menu again, aliases that were enabled will be matched again, and those that were disabled will remain disabled.

There are times when you want to delete an alias. This is easy to do, use the $world->delalias function. It takes as argument the number of the alias you wish to delete. Be aware that once deleted it is not possible to recover the alias (unless you create it again). Many times just disabling the alias is a better idea. The second thing to note is that when you delete an alias the numbers of the other aliases may change, so be careful when you try to delete several aliases in sequence.

9.3.2. Assigning Names to Aliases

It is possible to assign names to aliases. When an alias has a name, you can enable, disable, or delete it using its name instead of its number.

To assign a name to an alias, specify the name attribute when creating it:

Example 9-9. Creating an alias with a name


$world->alias('^df$', 'drink from fountain',
              { name => 'drink' })

You can now disable this alias with $world->disalias('drink'). The name can also be used in the $world->enaalias, $world->delalias and $world->listalias functions.

It is also possible to assign a name to an existing alias. Just edit it as described in Section 9.3.1, passing the name attribute. Use this same process to change the name of an alias.

Another feature of alias names is that several aliases can have the same name. In this case, all these aliases will be treated as a single group. The functions above, when passed an alias name, will act upon all aliases of the group, that is, on all aliases with that name.

9.3.3. Reordering Aliases

Aliases are tried from the first to the last, so in some cases the order of the aliases matters. It is possible to move an alias to another position with the $world->movealias function.

The function takes two parameters: the first is the name or number of the alias that you want to move. The second is the new position that the alias will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of aliases, the alias will be moved to the end of the list.

If there are several aliases with the same name, only the first one found will be moved. And when an alias is moved, other aliases might move up or down to accomodate the change.

kildclient-3.0.0/doc/C/kildclient/x3151.html0000644000175000017500000000455412376345147015321 00000000000000 $world->dismacro

C.16. $world->dismacro

void $world->dismacro( number/name , ... );

Disables the macro identified by number or name. If there are several macros with the same name, disables them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x2802.html0000644000175000017500000000520712376345147015317 00000000000000 getworld

A.4. getworld

$var = getworld( "name" );

Returns a variable that points to the open world with the given name. You can then manipulate that world with the returned variable (by calling functions that operate on worlds with that variable).

For example:

Example A-1. Quitting from another world


$coolmud = getworld("CoolMud");
$coolmud->send("quit");

This will send "quit" to the CoolMud world.

kildclient-3.0.0/doc/C/kildclient/x4201.html0000644000175000017500000000443612376345150015307 00000000000000 $world->setstatus

C.82. $world->setstatus

void $world->setstatus( text );

Sets the text in the main window status bar to the given text.

kildclient-3.0.0/doc/C/kildclient/x2721.html0000644000175000017500000001130412376345147015312 00000000000000 Sending server data

16.2. Sending server data

The protocols also support sending data from the client to the server in a similar way. Usually this is used for the client to request data from the server.

To send data to the server, use the $world->sendserverdata function. This function takes one argument, which must be a hash reference pointing to a hash similar to %::server_data. The entries in the hash specify what is sent to the server: the protocol, the package/message (when supported by the protocol) and the data to send, which is encoded to the appropriate format.

For example, this is an example of sending a request over GMCP:

Example 16-1. A GMCP request


$world->sendserverdata({ protocol => 'GMCP',
                         package => 'Core',
                         subpackage => 'Supports',
                         message => 'Set',
                         data => [ "Char 1", "Char.Skills 1", "Char.Items 1" ]
                       });

16.2.1. MSDP data

It is possible to send data using the MSDP protocol with $world->sendserverdata, but it might not do what the server expects.

MSDP has two ways of sending arrays: one is an explicit array delimited by MSDP_ARRAY_OPEN and MSDP_ARRAY_CLOSE, and another where multiple values are sent for the same variable (in the specification, this way is only demonstrated in data sent by the client). In my opinion that second way should not exist, as it is unnecessary and possibly confusing. When receiving data, both formats are converted to a Perl list. When sending data with $world->sendserverdata, lists are always sent as an explicit array.

Servers, however, seem to want multi-valued variables, so there is a function specific to MSDP, shown in the example below:

Example 16-2. A MSDP request


$world->sendmsdpcommand('SEND', 'HEALTH', 'HEALTH_MAX', 'MANA', 'MANA_MAX');

The first argument is the name of the variable, the other arguments are values to be sent. This gets converted to the following message:

Example 16-3. Message sent via MSDP


MSDP_VAR SEND MSDP_VAL HEALTH MSDP_VAL HEALTH_MAX MSDP_VAL MANA MDSP_VAL MANA_MAX
kildclient-3.0.0/doc/C/kildclient/c2034.html0000644000175000017500000002047112376345147015267 00000000000000 Hooks

Chapter 12. Hooks

Hooks allow you to specify an action to be executed automatically when some events happen. For example, you can define a hook with actions to be executed when a connection is established, and then these commands will be automatically executed when you connect to the World.

You can connect hooks to seven events:

  • OnConnect: This hook is executed when a connection to the world is made, after the auto-logon has taken place (if applicable).

  • OnDisconnect: This hook is executed when you are disconnected from a World, after the connection has been closed.

  • OnReceivedText: Executed when text is received from the world. The text received is available for the hook in the $hookdata variable, and can be inspectd in Perl scripts.

  • OnSentCommand: Executed after a command is sent to the world. The command is available for the hook in the $hookdata variable, and can be inspectd in Perl scripts.

  • OnGetFocus: Executed when the KildClient window receives the focus.

  • OnLoseFocus: Executed when the KildClient window loses the focus.

  • OnCloseConnected: Executed when the world is forcedly closed. This can happen using the World->Close menu, the $world->close() function, or by quitting the program with the world connected. You can put in this hook, for example "quit" to always exit the MUD nicely, even if you close the world by mistake.

  • OnServerData: Executed when out-of-band server data is received. See Chapter 16.

12.1. Creating and Editing Hooks

The easiest way to create and alter hooks is from the World Editor, the place where all settings of a World are altered (see Chapter 4).

Hook are defined in the Hooks section inside the Automation section. When you open that section, you'll see a list of the defined hooks and some buttons like this:

Figure 12-1. The graphical Hook editor

In the top there is a combo box for you to select one of the five events described above. When an event is selected the hooks defined for that event will be listed, and all operations will be done on hooks of that event.

The main part of the window is the list of defined hooks. The columns are as follows:

  • Enabled specifies whether the hook is enabled or not. Hooks that are not enabled are not active and will not be run, but they remain in the list so that they can later be enabled again.

  • Name is a name that is assigned to a hook. This helps you identify the hook's purpose and is useful when editing a hook via the command line (as described in Section 12.2.1). Assigning a name to a hook is optional.

  • Action defines what is done when the hook is run..

12.1.1. Adding Hooks

To add a new hook, select the desired event from the Combo Box and press the Add button. This will open a window for you to edit the new hook's parameters:

Figure 12-2. The window to edit hooks

What can be set represents the columns described above.

When you are finished, press OK and the hook will be added. If you change your mind, press Cancel and the hook will not be added.

To see some things hooks can do, read Section 12.2. If you want to try the hooks described there, you can create them from the World Editor.

12.1.2. Editing Hooks

To edit a hook, select the event from the combo box, then select the hook to edit in the list by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding hook (see Section 12.1.1) will be opened, filled with the hook's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the hook will remain as it was before.

Another shorter way to edit a hook is to double click its line in the list.

It is also possible to change the value of enabled setting directly from the hook list. Make sure that the hook you want to change is selected, and click in the check button. The state will be toggled.

To delete a hook, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the hook. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the hook again. See Section 4.8. To delete several hooks at once, select them all and press Delete.

The final thing that needs to be explained with regard to hooks is how to reorder them. Hooks as run from the first one to the last, so in a few cases the order might matter. To move a hook up or down in the list, select it and press the corresponding button.

kildclient-3.0.0/doc/C/kildclient/x2793.html0000644000175000017500000000430112376345147015322 00000000000000 getversion

A.3. getversion

$version = getversion(void);

This functions returns the version number of KildClient.

kildclient-3.0.0/doc/C/kildclient/x4039.html0000644000175000017500000000441312376345150015313 00000000000000 $world->reconnect

C.72. $world->reconnect

void $world->reconnect(void);

When in offline mode, this function will attempt to reconnect to the mud.

kildclient-3.0.0/doc/C/kildclient/x3064.html0000644000175000017500000000427712376345147015326 00000000000000 $world->dc

C.8. $world->dc

void $world->dc(void);

Disconnects from the current world.

kildclient-3.0.0/doc/C/kildclient/x2998.html0000644000175000017500000000433212376345147015335 00000000000000 $world->close

C.3. $world->close

void $world->close(void);

Disconnects and closes the current world, immediately.

kildclient-3.0.0/doc/C/kildclient/x4657.html0000644000175000017500000001066612376345150015330 00000000000000 Conditional Loading of Plugins

E.5. Conditional Loading of Plugins

If your plugin depends on some condition to be successfully loaded, you should include a test for whatever is required in a BEGIN block, and if the conditions are not present, you should call the Perl die function passing a descriptive message telling why the plugin could not be loaded.

For example, here is part of a hypothetical spell-checker plugin that uses the file /usr/share/dict/words file:

Example E-2. Conditional loading of plugins


package spellcheck;
#: Version: 1.0
#: Description: Spell Checker
#: Author: Somebody

BEGIN {
  die("Word file (/usr/share/dict/words) could not be read")
    unless -r /usr/share/dict/words;
}

...

When the user tries to load that plugin, the test will be made. If the file cannot be read (because it does not exist, or the permissiosn are wrong, or for any other reason), die will be called, the plugin will not be loaded, and the given message will be printed in the screen.

E.5.1. Plugins That Require Other Plugins

If your plugin requires some other plugin, you should use the $world->requireplugin function in a BEGIN block. This function will verify if the named plugin is already loaded. If it is, it returns successfully. If it is not loaded, the function will try to load the plugin. If it could be loaded, the function exits successfully. If, however, the plugin could not be loaded (because it was not found, or because it failed some condition), $world->requireplugin will call die, which will abort the loading the plugin that required the other plugin.

As an example, consider the plugin foo, which requires the bar plugin:

Example E-3. A plugin that requires another


package foo;
#: Version: 1.0
#: Description: The Super Frobnicator
#: Author: Somebody

BEGIN {
  $::world->requireplugin('bar');
}

...

If foo was loaded successfully, you can be sure that the bar plugin and its functionality is present. If bar could not be loaded, foo will not be loaded.

kildclient-3.0.0/doc/C/kildclient/x3115.html0000644000175000017500000000456612376345147015324 00000000000000 $world->deltrigger

C.13. $world->deltrigger

$n = $world->deltrigger( number/name );

Deletes the trigger identified by the given number or name. If there are several triggers with the same name, deletes them all. Returns the number of triggers deleted.

kildclient-3.0.0/doc/C/kildclient/x3681.html0000644000175000017500000000474112376345150015321 00000000000000 $world->listplugin

C.54. $world->listplugin

void $world->listplugin(void);

Briefly lists all loaded plugins.

void $world->listplugin( name/number );

Gives detailed information on the given plugin.

kildclient-3.0.0/doc/C/kildclient/x4505.html0000644000175000017500000000533112376345150015311 00000000000000 $world->writetolog

C.97. $world->writetolog

void $world->writetolog( str , ... );

Writes the given line to the log file, if any. If logging is not currently enabled, then this function does nothing.

Each argument is a complete line, that is written preceded by a timestamp, if this is enabled, to the log file. If the string has ANSI codes or codes used by the colorize function, they will be stripped and not written to the log file.

See also $world->logfile.

kildclient-3.0.0/doc/C/kildclient/x2854.html0000644000175000017500000000422212376345147015322 00000000000000 quit

A.8. quit

void quit(void);

Disconnects and closes all Worlds and KildClient exits.

kildclient-3.0.0/doc/C/kildclient/x4008.html0000644000175000017500000000602412376345150015307 00000000000000 $world->path

C.70. $world->path

void $world->path( str );

str is a string defining a path. The following example shows the features of paths:


  3n2e4n2e{ne}e{open door}3n

The general syntax syntax is "<number of repetitions><command>". "<number of repetitions>" can be omitted, in this case it is considered as 1. command is the command that will be repeated. If it is not a one-letter command, it should be enclosed in braces ({}).

The example above would generate these commands:


  n
  n
  n
  e
  e
  n
  n
  n
  n
  e
  e
  ne
  e
  open door
  n
  n
  n

The commands are send using the settings in the Sending tab of the Preferences dialog (see Section 5.2).

kildclient-3.0.0/doc/C/kildclient/x2945.html0000644000175000017500000001015112376345147015321 00000000000000 $world->alias

C.2. $world->alias

void $world->alias( pattern , substitution , [attributes] );

void $world->alias( number , [pattern , [substitution]] , [attributes] );

Creates a new alias, or edits the alias identified by number. Entered commands will be matched against pattern (a Perl regular expression), and if the pattern matches, the given substitution will be applied. (In a s/pattern/substitution/ structure.)

Be careful that any part of the command can match. To match only the exact string, use something like '^command$'. To match only in the beginning of the line, use '^command'.

Atributes is a reference to a hash defining attributes for the alias. Generally the call works like this:


$world->alias("pattern", "substitution", { attribute1 => value1,
                                           attribute2 => value2, ... })

Possible attributes:

  • pattern: The pattern to match.

  • substitution: The substitution to do.

  • ignorecase: If value evaluates to true, ignore case when matching the pattern.

  • perleval: If true, the substitution is made passing the "e" flag (s/pattern/substitution/e), so substitution should be actually Perl statements to be evaluated when there is a match.

  • enabled: If value evaluates to true, the alias is enabled, if false, it is disabled and commands are not matched against it.

  • name: Assigns a name to the alias, so that it can be referenced by name.

kildclient-3.0.0/doc/C/kildclient/x4335.html0000644000175000017500000000773212376345150015321 00000000000000 $world->timer

C.93. $world->timer

void $world->timer( attributes );

void $world->timer( number , attributes );

Creates a new timer, or edits the timer identified by number.

atributes is a reference to a hash defining attributes for the timer. Generally the call works like this:


$world->timer({ attribute1 => value1,
                attribute2 => value2, ... })

Possible attributes:

  • interval: Number of seconds between each execution. Fractions of seconds (such as 1.5) are allowed. Required.

  • count: Number of times to execute the timer. After this number of executions, the timer will be automatically disabled or deleted (see temporary flag below). If count is not given or count is -1, the timer repeats until manually disabled or deleted.

  • action: The action to execute. Required.

  • temporary: If set to 1, the timer will be deleted (and not only disabled) after count executions have happened.

  • enabled: If set to 1, the timer is enabled and will execute every count seconds. If set to 0, the timer does not execute until enabled again. New timers are created enabled by default.

  • name: Assigns a name to the timer, so that it can be referenced by name.

kildclient-3.0.0/doc/C/kildclient/a2884.html0000644000175000017500000000570712376345147015307 00000000000000 $window Reference

Appendix B. $window Reference

$windown is a variable that is always present and points to the current window. It is an object of class Window, and is opaque, that is, all interaction with it should be done via its functions, and not via its members.

The sections below describe the functions available for the $window variable.

B.1. getsize

($lines, $columns) = $window->getsize(void);

$columns = $window->getsize(void);

This functions returns the current size of the window (in characters), in terms of lines and columns. It can return both dimensions, or just the number of columns.

kildclient-3.0.0/doc/C/kildclient/c1862.html0000644000175000017500000002033512376345147015276 00000000000000 Timers

Chapter 11. Timers

Timers allow you to execute commands repeatedly at fixed intervals, and also to specify a command to be executed later.

Timers have to mandatory attributes: an interval in seconds, that represents how often the timer is fired, and an action, that is the command that is executed. Just like in other places, the action can be a text that is sent to the MUD, or it can be something run with Perl.

It is possible to define timers that execute only a fixed number of times. This is the timer's repeat count. Whenever the timer is executed, this count is decreased, and when it reaches zero, the timer is disabled, and will only execute again if reenabled manually. A timer can also be temporary: in this case, when the repeat count reaches zero, it is deleted and not only disabled. A repeat count of -1 means that the timer is executed indefinitely.

A timer with a repeat count of one is executed only once. Since the first execution only happens interval seconds after it is defined, this allows you to define a command to be executed after some specified time. If it is marked as temporary, the timer will be deleted after it is run this one time.

11.1. Creating and Editing Timers

The easiest way to create and alter timers is from the World Editor, the place where all settings of a World are altered (see Chapter 4).

Timer are defined in the Timers section inside the Automation section. When you open that section, you'll see a list of the defined timers and some buttons like this:

Figure 11-1. The graphical Timer editor

The main part of the window is the list of defined timers. The columns are as follows:

  • Enabled specifies whether the timer is enabled or not. Timers that are not enabled are not active and will not be run, but they remain in the list so that they can later be enabled again.

  • Name is a name that is assigned to a timer. This helps you identify the timer's purpose and is useful when editing a timer via the command line (as described in Section 11.2.1). Assigning a name to a timer is optional.

  • Interval is the interval between timer activations, as described above. Fractions of seconds are allowed: an interval of 0.5 means a timer that fires each half-second.

  • Count is the repeat count, as described above.

  • Action is the action that is run when the timer fires.

  • Temp indicates whether the timer is temporary or not. Temporary timers are deleted automatically when their repeat count reaches 0.

  • Plugin: if this is non-empty, it means that the timer belongs to a plugin (and the name of the plugin is displayed). However, by default plugin timers are not displayed. See Section 4.8 for information on how to display plugin timers here.

11.1.1. Adding Timers

To add a new timer, press the Add button. This will open a window for you to edit the new timer's parameters:

Figure 11-2. The window to edit timers

What can be set represents the columns described above.

When you are finished, press OK and the timer will be added. If you change your mind, press Cancel and the timer will not be added.

To see some things timers can do, read Section 11.2. If you want to try the timers described there, you can create them from the World Editor.

11.1.2. Editing Timers

To edit a timer, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding timer (see Section 11.1.1) will be opened, filled with the timer's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the timer will remain as it was before.

Another shorter way to edit a timer is to double click its line in the list.

It is also possible to change the value of the binary options (those represented by a check box) directly from the timer list. Make sure that the timer you want to change is selected, and click in the check button. The state will be toggled.

To delete a timer, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the timer. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the timer again. See Section 4.8. To delete several timers at once, select them all and press Delete.

The final thing that needs to be explained with regard to timers is how to reorder them. Timers as tried from the first one to the last, so in a few cases the order might matter. To move a timer up or down in the list, select it and press the corresponding button.

kildclient-3.0.0/doc/C/kildclient/x4089.html0000644000175000017500000000516412376345150015324 00000000000000 $world->sendecho

C.76. $world->sendecho

void $world->sendecho( str , ... );

Sends any number of strings to the current world. After each string, a newline is send, so that the MUD recognizes it as a command.

The commands are always echoed to the window, regardless of the setting of the command echo option (see Section 4.7).

See also $world->send and $world->sendnoecho .

kildclient-3.0.0/doc/C/kildclient/x4106.html0000644000175000017500000000605612376345150015313 00000000000000 $world->sendfile

C.77. $world->sendfile

success = $world->sendfile( file , [delay , [n-lines]] );

Sends the contents of the given file to the world. delay is the number of seconds to wait between sending each group of lines, and n-lines is the number of lines to send a time. If these values are not specified, they are taken from the defauls set in the Preferences dialog (see Section 5.2).

On success, returns true. If the file does not exist or cannot be open, this function does nothing and returns a false value. It returns undef if the file name is not specified.

For more options, see the $world->mlsend function which allows adding a text before and/or after each line, and sending lines before and/or after sending the contents of the file.

kildclient-3.0.0/doc/C/kildclient/x2519.html0000644000175000017500000001661412376345147015330 00000000000000 Chat Functions

15.3. Chat Functions

You can also access the chat features via some Perl functions of the chat plugin. Here is a list of these functions:

chat::call(host, [port])

Tries connection to host, on port port (or 4050, if not specified), using the MudMaster protocol.

chat::zcall(host, [port])

Tries connection to host, on port port (or 4050, if not specified), using the zChat protocol.

chat::accept([port])

Starts listening for chat connections on the given port (or 4050 if not specified).

chat::noaccept()

Stops listening for chat connections.

chat::setname(nickname)

Sets the nickname used in chat sessions.

chat::setcolor(code)

Sets the color used in chat sessions. code is a color code as recognized by the colorize function

chat::chat(name, text)

Sends text to name.

chat::emote(name, text)

Sends text as an emote to name.

chat::chatall(text)

Sends text to all chat connections.

chat::emoteall(text)

Sends text as an emote to all chat connections.

chat::group(name, group)

Makes the chat connection with name a member of the group group.

chat::chatgroup(group, text)

Sends text to all connections that are members of the group group.

chat::emotegroup(group, text)

Sends text as an emote to all connections that are members of the group group.

chat::ping(name)

Pings the other peer. If the connection is alive, they will reply to this request. Additionally, the time for the reply to be received is displayed.

chat::sendfile(name, [file])

Attemps to send a file to the peer. If you do not specify the file, a dialog will be displayed for you to select the file to send. The file will be offered. If they accept, the file transfer will start.

chat::stopfile(name)

Stops the file transfer currently in progress.

chat::snoop(name)

Asks name if you can snoop them, that is, see everything they see in their MUD session. If they accept, everything they see will be sent to you and displayed.

chat::setallowsnoop(name, value)

Sets whether name can snoop you, that is, wheter they can see everything you see in your MUD session, according to value. By default snooping is disabled.

chat::info(name)

Shows some information about the chat session.

chat::setstripansi(name, value)

Sets whether to trip ANSI color codes in messages received from name, according to value. If they are, colors sent by the peer will not be displayed, and that even incoming messages will be displayed in your chat color.

chat::hangup(name)

Stops the chat session with name. You will need to connect again to continue talking.

kildclient-3.0.0/doc/C/kildclient/x3185.html0000644000175000017500000000457012376345147015326 00000000000000 $world->distrigger

C.19. $world->distrigger

void $world->distrigger( number/name , ... );

Disables the trigger identified by number or name. If there are several triggers with the same name, disables them all. Several arguments can be passed at once.

kildclient-3.0.0/doc/C/kildclient/x4639.html0000644000175000017500000000455312376345150015326 00000000000000 Disposing Data When the Plugin Is Unloaded

E.3. Disposing Data When the Plugin Is Unloaded

If the plugin defines a function called UNLOAD, this function will be called when the plugin is unloaded. Currently this happens only when the World that loaded the plugin is closed.

If your plugin must dispose of anything it created that would be kept behind even when the World is closed, the UNLOAD function is the place to do that.

kildclient-3.0.0/doc/C/kildclient/x628.html0000644000175000017500000000602612376345146015242 00000000000000 Edit Menu

6.2. Edit Menu

6.2.1. Cut

This command copies the text selected in the command entry box to the clipboard and deletes the selected text.

6.2.2. Copy

This command copies text either from the MUD (that is, in the output window) or from the command entry box to the clipboard.

If there is text selected in the main window, than this text is copied. Otherwise, if there is text selected in the command entry box, it is this text that is copied.

6.2.3. Paste

This command pastes the text in the clipboard to the command entry box, possibly overwriting any selected text.

6.2.4. Delete

This command deletes the text selected in the command entry box.

6.2.5. Find and Find Next

These commands are used to search for some text in the output buffer. Their use is described in Section 3.4.

kildclient-3.0.0/doc/C/kildclient/x3733.html0000644000175000017500000000641212376345150015314 00000000000000 $world->loadplugin

C.57. $world->loadplugin

$success = $world->loadplugin( name );

$success = $world->loadplugin( file );

Loads a plugin. You can either pass a full path for the file that defines the plugin, or just its name. If you provide only the name, a file with that name (and the extesion .pl, if the extension is not already provided) will be looked for in the directories specified by the @PLUGINDIRS array. By default, this array contain two directories: one where KildClient stores some of its files (generally /usr/local/share/kildclient/plugins) and one in the user's home directory (~/.kildclient/plugins), but feel free to add more directories to search plugins for.

This function returns true if the plugin was successfully loaded, and false otherwise (including the case in which the plugin was already loaded). See also $world->requireplugin for a way to load a plugin unless it is already loaded.

kildclient-3.0.0/doc/C/kildclient/x3936.html0000644000175000017500000000523112376345150015317 00000000000000 $world->movealias

C.65. $world->movealias

void $world->movealias( number/name , new_pos );

Moves the alias with the given name or number so that it occupies the position new_pos after execution of this function. Other aliases might be moved up or down in result of this. If new_pos is negative or greater than the number of aliases, the alias is moved to the last position.

If there are several aliases with the given name, only the first one found is moved.

kildclient-3.0.0/doc/C/kildclient/x3163.html0000644000175000017500000000433212376345147015316 00000000000000 $world->displugin

C.17. $world->displugin

void $world->displugin( name );

Disables the specified plugin.

kildclient-3.0.0/doc/C/kildclient/x3823.html0000644000175000017500000000545712376345150015324 00000000000000 $world->macroenabled

C.60. $world->macroenabled

result = $world->macroenabled( name/number );

This functions checks whether the specified macro exists and whether it is enabled.

You can pass either a macro number or name. If the macro does not exist, this function returns undef, so you can distinguish the case of a non-existant macro from a disabled one.

If the macro exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several macros with the same name, it returns a list with one value for each macro with that name, and each value is 0 or 1 depending on the state of the macro.

kildclient-3.0.0/doc/C/kildclient/x2260.html0000644000175000017500000000604612376345147015317 00000000000000 Getting Information About Plugins

13.2. Getting Information About Plugins

All plugins should contain a help function that, when called, prints information about the plugin. If you want to get help on a plugin, call its help function. The example below shows how to call the help of the keypad plugin:

Example 13-3. Getting help about a plugin


keypad::help()

Note that the name of the function is prefixed with the name of the plugin and ::. This is a convention so that one plugin's functions do not interfere with other plugins' ones.

It is possible to get a list of all the currently loaded plugins with the $world->listplugin function. If called without arguments, it lists briefly all loaded plugins. But you can pass as argument either a plugin number or a plugin name, and it will give more detailed information about that plugin, including a listing of the triggers, aliases, macros and timers that the plugin defines (if any).

kildclient-3.0.0/doc/C/kildclient/x1122.html0000644000175000017500000001246212376345146015311 00000000000000 Gags

8.4. Gags

Now that the basic usage of triggers has been explained, let us see some more advanced features.

In KildClient, gags are just a special kind of trigger with the "gag" flag activated, and they behave just like other triggers, with the exception that the line that matched the pattern does not get printed in the screen. It is possible to have a gag that executes an action when triggered, just like with non-gag triggers, or it can be a simple gag, which prevents the line from being printed but does nothing else.

To specify that a trigger is a gag when it is created, just check the Omit (gag) from output checkbox when creating the trigger.

Let's create a simple gag to omit all that is said by Joe, a very silly and annoying player:

Example 8-5. A simple gag

  • Pattern: ^Joe chats

  • Action: /$world->echonl("Joe said something silly here.")

  • Omit (gag) from output: Checked

This trigger is a gag, and whenever a line starting with "Joe chats" is received, it will not be printed. Instead, the code specified in the action will be executed, and that code will print a message that tells you that Joe said something, but does not tell what, so you do not need to worry.

That is good, but can get even better. We do not need to know that Joe said something, it would be better if we could ignore him altogether. And we can. It is not necessary to specify an action for a gag trigger. In this case, nothing will be done, but the matched line will not be printed. So our example becomes:

Example 8-6. A gag with no action

  • Pattern: ^Joe chats

  • Omit (gag) from output: Checked

The action has simply been omitted, but the check box that specifies that we are creating a gag trigger remains, naturally.

Sometimes you want to change the way a line is displayed, such as rearranging the information so that it appears in another way. The way to do that is with a gag, and an action that outputs the modified line. Heres a simple example that changes the way a hypothetical chat channel is displayed:

Example 8-7. Rewriting a line with gags

  • Pattern: ^(.*) chats, '(.*)'

  • Action: /$world->echonl("[Chat] $_[1]: $_[2]")

  • Omit (gag) from output: Checked

The Omit (gag) from output check box only controls whether the line is displayed in the screen or not. If you have logging enabled (see Chapter 14), a the line that matched a trigger with that option checked will be written in the log file normally. If you want the line to be omitted from the log file, you must set also the Omit (gag) from log file check box. If it is set, then the line will not be written to the log file. Note that the two attributes are independent: you can gag the line from the screen, from the log file, from both or from neither.

kildclient-3.0.0/doc/C/kildclient/x135.html0000644000175000017500000001073312376345145015232 00000000000000 Closing Worlds and Exiting KildClient

3.3. Closing Worlds and Exiting KildClient

When you are disconnected from a World (either because you requested it, with the quit command or something similar, or because the server has gone down), you will see a dialog box from which you can choose from four options: Reconnect will attempt to reconnect to the same World (using the same character for auto-login, if there is more than one defined, see Section 4.1). Connect to another world will open the World Selection dialog (see Section 3.1) for you to choose another World to connect to. Offline will keep the world open so that you still see its output or execute some things with Perl. Finally, Close will close the tab for that World. If that was the only open World, KildClient will exit when you press Close.

You can force disconnection from a World with the World->Disconnect menu. Note that this is not the recommended way to leave a MUD, but it might be necessary in other cases. The same dialog with the three options will be shown.

If you choose World->Close from the menu, the current World will be forcedly disconnected and automatically closed (just as if you had selected Close from the dialog). If this is the only open World, KildClient will be exited.

To close all open Worlds and exit KildClient immediately, select World->Quit from the menu.

These operations can also be run with Perl. To disconnect from a World, use the $world->dc (that is, type /$world->dc in the command box). To close the World, use $world->close. And to quit KildClient closing all Worlds, use quit (type /quit, as you might imagine). The reason quit does not have $world-> in front will be explained in Section 7.1, but for now suffices to say that since it operates on all Worlds (and not in one specific one), it does not have that.

kildclient-3.0.0/doc/C/kildclient/x779.html0000644000175000017500000001624012376345146015250 00000000000000 Echoing and Sending Text

7.2. Echoing and Sending Text

As mentioned in the previous section, the $world->echo function is used to print (or echo) text to the MUD window, without sending it to the World. It works like the print built-in function: it accepts any number of arguments, and echoes all of them, sequentially.

For example, $world->echo("Variable var contains ", $var, ".\n") would print the first string, followed by the contents of $var, followed by a period and a new line. Of course, you could do all that in a single string using variable interpolation.

A variant of $world->echo is $world->echonl. The difference is that $world->echonl always prints automatically a newline after each argument. This is just a shorthand to make some things simpler and possibly more readable.

Similar to $world->echo is the $world->send function. This function sends something to the MUD. For example, $world->send("who") will have the same effect as if you had typed who in the command entry box and pressed ENTER. Note that you do not have to add a newline to the end of the line to send, because send automatically sends a newline after each argument (since commands must be terminated by a newline for the MUD to recognize them).

It is possible to pass several arguments to send. If you do so, each argument will be sent as a separate command. For example, $world->send("who", "look") will first send a who to the MUD, and then a look, just as if you had typed each of these commands in order.

All the examples given above did nothing that could not be done without Perl, and using send for that was actually less efficient that typing the commands directly. However, when combined with variables and/or control flow structures, send can actually be quite useful.

7.2.1. Paths and Speed-Walking

A useful feature of some MUD clients, which KildClient implements, is the support for speed-walking. This feature allows you to define paths to go directly from one place to another without having to type a lot of movement commands.

For example, suppose that to go to some place from a fixed point (such as the center of a town) you need to take the following directions: s s s e e s e e e e n nw n. This is often written in a more compact way as 3s 2e s 4e n nw n. KildClient allows you to send to the MUD all the 13 required commands in a single command. To do that, use the $world->path function. For example, if you enter /$world->path("3s2es4en{nw}n") in the command line, 13 commands will be sent to the MUD: exactly the 13 that form the path defined above.

Note the syntax: the movement commands are defined one after another, optionally prefixed by a number, which determines how many times that command will be sent. So 3s means send s three times. If there is no number, the command is sent only once.

Note also that the command to move to the north-west is enclosed in braces: {nw}. This is because if the $world->path function sees nw, it will think you want to move to the north than to the west. Enclosing it in braces causes $world->path to see that as a single command. Should you need to move several times to the northwest, you can add a number before: 4{nw} will send nw four times.

Naturally, you can include any command that is not a single letter in braces to force $world->path to see it as a command. It is likely that some paths will need something like {open door} in the middle.

Of course, simply entering paths in the command line is not that useful. But you can store the path in a variable, and then just call $world->path($stored_path). Just add a line that defines the variable to you script file (see Section 7.1), and you will be able to use the variabled anywhere.

Alternatively, you can define an alias (see Chapter 9) or a macro (see Chapter 10) to execute your path even faster. The easypath plugin does that, see section Section 13.3.1.

kildclient-3.0.0/doc/C/kildclient/x4158.html0000644000175000017500000000460612376345150015321 00000000000000 $world->sendmsdpcommand

C.79. $world->sendmsdpcommand

void $world->sendmsdpcommand( command , argument1 , ... );

Sends a specific type of data to the server using MSDP. See Section 16.2.1.

kildclient-3.0.0/doc/C/kildclient/x3433.html0000644000175000017500000000455512376345150015317 00000000000000 $world->getlogfile

C.39. $world->getlogfile

$file = $world->getlogfile(void);

This function returns the name of the file to which the output is being logged, or undef if logging is not started for the world.

kildclient-3.0.0/doc/C/kildclient/x441.html0000644000175000017500000000666412376345145015242 00000000000000 Protocols

4.6. Protocols

The figure below shows the Protocols section of the World Editor:

Figure 4-8. The Protocols section of the World Editor

Here you can configure how KildClient uses some protocols to enhance the player's experience while playing the MUD. Currenly you can configure how KildClient behaves with regard to the MCCP protocol, which compresses data sent by the MUD so that less data needs to be sent.

By default, KildClient will use this protocol if the server proposes it, but only if this proposal comes in at most one minute after the connection has been established. This is done in order to prevent bad players from trying to crash your client by sending the special sequence that enables compression. Note, however, that well-written servers prevent the user from sending such sequences to other users. However, as compression is generally negotiated just after connecting, leaving this option in its default state, Enable if server proposes after connecting is recommended.

If Enable if server proposes at any time is selected, MCCP will be started whenever the start sequence is received, no matter at what time.

Finally, you can disable MCCP altogether by selecting Disable. This way sequences asking for compression will be ignored, and the server will never send compressed data. Attempts by malicious players will not succeed.

kildclient-3.0.0/doc/C/kildclient/x4237.html0000644000175000017500000000472512376345150015321 00000000000000 $world->silentdismacro

C.85. $world->silentdismacro

void $world->silentdismacro( number/name , ... );

Disables the macro identified by number or name. If there are several macros with the same name, disables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success.

kildclient-3.0.0/doc/C/kildclient/x3313.html0000644000175000017500000000504112376345147015311 00000000000000 $world->expandalias

C.29. $world->expandalias

$result = $world->expandalias( "string" );

This function expands aliases in the string passed as argument. The result is what you would get if you typed "string" in the input box (except that aliases are still expanded even if Disable Aliases is selected in the Preferences menu).

kildclient-3.0.0/doc/C/kildclient/x725.html0000644000175000017500000000431712376345146015241 00000000000000 Help Menu

6.6. Help Menu

6.6.1. Help

This commands opens a browser showing the KildClient manual (which you are reading now).

6.6.2. About

This commands shows a window with some information about the program.

kildclient-3.0.0/doc/C/kildclient/x3105.html0000644000175000017500000000455012376345147015314 00000000000000 $world->deltimer

C.12. $world->deltimer

$n = $world->deltimer( number/name );

Deletes the timer identified by the given number or name. If there are several timers with the same name, deletes them all. Returns the number of timers deleted.

kildclient-3.0.0/doc/C/kildclient/x3020.html0000644000175000017500000000527712376345147015317 00000000000000 $world->cmdseparator

C.5. $world->cmdseparator

void $world->cmdseparator( string );

$separator = $world->cmdseparator(void);

When used with an argument, this sets the command separator for the current world to the given value. For more details of the command separator, see Section 3.2 and Section 4.3

If called without arguments, it returns its current value.

kildclient-3.0.0/doc/C/kildclient/x2873.html0000644000175000017500000000443012376345147015324 00000000000000 stripcolorize

A.10. stripcolorize

$stripped = stripcolorize( str );

Returns the string stripped of any sequences used by colorize to add color to it.

kildclient-3.0.0/doc/C/kildclient/x3600.html0000644000175000017500000000516412376345150015310 00000000000000 $world->ispermanent

C.49. $world->ispermanent

$return = $world->ispermanent( var );

This function tests if a variable is permanent. The return value is true or false depending on the variable's status.

The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation.

kildclient-3.0.0/doc/C/Makefile.am0000644000175000017500000000062711715757467013571 00000000000000SUBDIRS = images pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html #pkgdoc_DATA = kildclient.pdf manual_DATA = $(wildcard kildclient/*.html) EXTRA_DIST = kildclient.xml $(pkgdoc_DATA) $(manual_DATA) dist-hook: html verify: xmllint --valid --noout kildclient.xml html: kildclient.xml db2html kildclient.xml pdf: kildclient.xml -db2pdf kildclient.xml .PHONY: verify html pdf kildclient-3.0.0/doc/C/images/0000755000175000017500000000000012376346020013034 500000000000000kildclient-3.0.0/doc/C/images/we_input.png0000644000175000017500000014255711715730227015334 00000000000000PNG  IHDRsRGBbKGD pHYsktIME ҕQtEXtCommentCreated with GIMPW IDATxwXSWoHނVUDW-NU+FV*jmk@*x]78pj[-"[?x~?ã/7ވ<}"\}U""""RHS#sVFi5R۔#~j>gj?"9>L-fsVFbPKDDDTP< M}.""""@L'8V`P*~[\@D0D͆,C:74U+S 1ƹ>ۙmaiO.QF.D`#B-;EEc|?DRfJl+޺gjU @=E_MFѤ\hԩ~Lc,oL~d>g`XEr \ h9 u}m1Cq#ؼg|>ƍ"""" RiZ_ɏzwMhU^Ee^+Ԫ:5 M ?md&;mQʉmV|QA.x;\ G^vysAYpnnVVu_h~@VN tѶI\b[˺ԥ3l 7^޲WŁz@#TQM ջkB 1j+ԪHNZq R#KU3id-Eel8{> 5{|YVuQpZ7(>#e5{!_M=; G+s,h% Za@+n; ȷ0iq[wFi>.S&""װM#Uwg# dK?kSYBA3@KC]>MG@QDRK@l fb#6>pjj $*Vx?s+E^6:<NjEhް6 F((|G.`to;~=:xQT!6N!kÜ1uqv5H,d_h/#"""TW(u6UPQHz7_αU*lS33݂I#;4p ") x ͚C[M] Ë(L?T|^ Z6E _@;wSMEgjթwǧr#Ũ-TW(j07!Ra\,;h:p w@=;JQTU=ycPG'as45ԅ9 tlx|X/2L j\|W+/n?Fz>b1}Y[E/H%ՁH uDDDT{jEzKU1]&&jԫuX=l򉊞@r| 6VB$.ĨBshO+}gmy;ܤ|XIq"b'cn}$ryΖEQ.bqs|W>X"$U= ,C1ЂHKK Š1 qʲVZZUoɖQn˞1`Z;g!54I2KQNµ`뽮8D)aQ73dLe3rd]-a ݢl<{m&~jr `#|چx'Ÿh`z :͠% 3| FuktÙ0x)BK=DDD !4l׷|}"-zew8i˕U]o逶_vFjW U!-L>|7w<]<:n+g#oJ 54"~J뉾C' (X!{Wz=EE/ чHK %7bQTHxODDy Ǒ,В$F+?ϟUgjHgU^c {(o"Re& ;v*GjEwy< ؅ğaZkti$wE$FЭR# uhAc(E *Sz 7+ %:ЫR]Zw"-ZD"u giI *~7k(ثl_Uq*SA+T v*Kʅb:&~~,z RЮ 3/ =;ڣ^v4HZ[ 0cV>m}3@FAj+Lѳ@i)1$ FxLW5."""zsXuW(XTrmMCeFDDDTQ-*[cV@P[FUo:Ɩ~-lr]C"+B$"""d;嵄\VpP j@`+|=RҠTn^f2W UkFڒv#Uk{[~Mx jA-Z"""""DDDDĠA-Z"""""DDDDvT`LqU9'"""|rNb'6- <*Y"""Z"""""DDDDD jA-ڪ mmmD"D"!<(**BQQlق#&&GHc˞6l^x & !0%"""|q㴴4pssCzz,M$ahРvիWpAGG.vUCDDDĠD"tuuegϞ+Vٳgܹs߽{ =z4̙ ,\~~~\5DDDD-Nl6LjH|dbV[%_+-{AVIZݺuH$$%%m۶xLjj*թ\zz:LLL+??ڲz*ϝ4nbï%"""fB!9>z-KYT*{,ʕe*W:MJJ?+Wŋ\ADDDDP~ J F̐'CBAAZkRwx9CDDDĠV=>|\`[6_%zꅄ`ܹ֭ZkR.!!pttĺubj -{/ :h֬ݫV۾}; |\1DDDD j5 lXZZرc ^U&<==){q"dNĝSWtߎ?IJpr_~yojօ;n>8{􂕵-{E A-QEܿP\i?nm;0m6[7wEl{gd`uxmۄ_ĐpY7o¬wZܾ/n{tjť8x Dߒ版i{y1Ggbb ---}㜺m߉O<;XJ355DR5ŋ>} 000i͝10og\p.^:oIDD j*[.sWڵfĺuk}\6`%6ָib J` v"޾R)$UϠ6**Jڄ cQjZܹ{ض}'mO}>_:t0dWnqyg'G~TyϞ=SKq?-U렶K.؊D"mmm*yLML>j^^~F˗.L|FyʕkjZ7c?qY051ĉ9c> /_&M.B1e+b¤ϕqqv{1%"$j6LjH|dbV[nH$BBBR`t>|8ѿ|vMlp'1qs;w $8BDD7F|x U6$$  Q ۲;&x I!"JU%AKǥ? 6R)ڴiX|۶m1 Μ9;;;wŎ;diVVVwh޼9Wۣԭ[ӧ}OQjKɓ'K.xy y#ǏcȐ!3g:F9s ## .,9rz[4n^G0aXg'"FEEGdd$t... Cxx8zDCOOCÇ֑O>1bdinnn8x,uww!"""zӃڨ(xzzb BVVڵk?Z~}ŷJIIQXGRR,XYfri]vE\\RRRpy89m"""7>644T--- Y})@FFԩ޽{FXX\1ڴio:u6WћVE@;|p+L!HPVrgc-[\ٳ)@%!!pttĺuʥ7n"""!/xyy ޣv˖-o//roz`aacǎa… ؾ}; &Mںג!??A-Q5$ +#U JԩߤOn􄧧ԩShٲ%4hUCDDDThq Tņ  """$Ѯ];믜 """">u2ŕBrm5.sV<'p+aRA=XnCJJJ~:78uEĠFii^}R:U=~j_DĠX`ުWLW$MuN{=}&-,R :Fq&NXimFS|7gΜCvXfTYYbpR4o֠V-s| v!n޼3SSL>P|c1w` E;dZY*<(kصc ի?q'Иt$$\Ǭi&fϙ[V\V-[b =w!`?LMMe}yX{チf͞Դ4 X5+4Vֶz\l޲ O$ɕd̥_NΕז6s+k[̝3 !*~N ZXf%UO';!*:{cXj;˚j 4Ç1w\g4CnaQ |=Sf ??wPXX5L_( ~ܼyyy;xݻ՟w vva hP.mɢX=۶iXe'偳tGG{(㮬BcK/K77nJpgMǎ]a۲-җm̚ЪM;zsT6B.D1W8W^[}Y:vD=w5,ǬӠY3cEMo4QC)E=FLG=a6?Owm .ݔĸ=p#,3di<.PgVA~&vвeKlڸ jąbu,L1qF,fD.ͦQ= w%,Zb^=\;!~zk{"z}cSnB"ñ/@kka#JDDDĠzzr%}=v:#$'絬s%Ԟr5FMڽ'o`em/>vQBslM"bPKDjڰaݻ={Rr._}{҅3:_y FcmJL&{~28p.Wڇ)ռ9Hv'Mkc*̞5W/G/w7\ W8z$L>vߺ}QGݷvz;\n4;s\L?.ԩSx2S'qZ󪊲1jھ=Nĝŝ.N>Fu ͥ5Q>*%Ξ=7" @znߊWS""2]8C" +?v颇kwȞAH$ޭ ""c©SgcGdijbݻuExx\&M^UOl 7o݂Wu=nA~x8bcHRL8^yUEy1jھ=bO'O{p:>ąѩSKek} "Dr VI;&&&˫P,@vv6LA9ĥ gռ;~,7. ߼~ǥ|ʢnONDNN6?nP~ $'';Ǩ5j]`ӼLLac 6oMsiT\*["bP[咓Z+RRRt/VׯG P꠷[ pa̝;WlOEaa!v=UAAA#4o^8|H$055EZ3.NH} ^j_,#55BҤ%tGص;Hrݻwž?nڢ:sǦM[ѹsG@Ns }/4Bk2@D j܌3gϞ3f̐͝;CÇ TBieݽ{ W꠷X,̙3+\^ՅbgMǎ]a۲-R3kB6s̝K-@ܶ Nڀ/=Km˶ر3~V..Npp4]h\,_~f;>hPr|qet֭[=CE(ܹ,΁cJZ"yD ݦ1O򐗙C*u>|d?H$RZ;#D#++ |#,, ?۶mCNN,Y"WN(M]QEAH$*ػw/sNZJVfѢE Cƍaoo---UuQ嫖.]6"##ժU QQQޚVm~,T>oԩFsss9rX|9JIٰaƏ'O;wT+2'""""b҉1%""""bPKDDDD j1%""""z%N欬m5.sV<'Tڨ(*Qٳgۅlmo؈BYdNFUxK.:t"ҨܣG,ۦH$"͙;uڕS^dd<5keyzljAx "A-xzzVJ`?b̘1شiFZlOd69;Go :ƈC`llX SSSC~IKK <^DDo@PʁÇqE_.\_vc&U_˗/Ǎ7`kGæ[XZZX/?-QnZZG}m=SҬm}.xcŇ3Of*ӧ4-Z}q5 ڋvЮvqlf6۱{0m۠ ~\=ɥ{riii=v:#$'1v8ٴFcΝ]\~={y`HMM=l^{⯿ܸy Vֶx?k*P<%4v6 ifAED j++[lСCaÆa˖-re?/y\ߒ:::puuEJJ\ 6qQFhh,3g`ggرc65ihРAfڰaݻ={R2+-Ɓ_ [cqMYzG?]nz<461}AYqyrw+ѷ7.]8S0{<ۼu"ocq5?vkVb 9{.&K`)Xd\=<#a-_ '':?; _͛k1y1*;p/~ O`Mɼ=^8wwzz8u :&N*clPBԝOUG4=^DĠɓ'K.xFe m63ロ[b)Sg̘OOO<{ >>>1c\xܽ{??nBpp0dF9s ## .6KSݻwP=ٳgqFhTG8~VAA K2Q1ݻuADd\zn066GDªqcbtJ덈F.ΐH$pwwnsg```WnyG>zvGAAA=no @FSz>4zzzEGŠJ4q\#"" N<>S>t/ߨ;=WԞ<qi@L YP+TCYBcjCj(NjV(|Fe> `mm Ç1x`HRxxxr_5Я_?\zSL!|Y|'ň#3 ڣa۶mhѢd̚5 ښжmL0;oF_Fi tuu>###SSдy+XYۢ}GG+SRRS6bdyQ7ojj*֭}\zK711V.JvΝGNN\A|u<} /S*SՖy(KhBmSw>Uecx۩JSOOOE?#bccm1011A߾}5/%%E^___?x$I`$r .^Xi훙q%`?1n8>}Ӹ9[[<{ `hhl(kllSqQ5.yyy sUmjru~:v":u eU@rr2j׮Դ29Dnn.~5 cO©huV-sVZϫ5j]`ӼLLac 6oMs马Oc(DhBmSw>5YrTew?h@{}\t 999rŋe"-sssdf_𐕕ss qݻ7?oooiGD}4hÇcܹJr ۶GAAҰkw<}@*W^U\i... Cxx8zD4RiAæriii5ݟ6.""J>-,,ģGi&111?%%FFF}}}[T} tuu5.WZPPзo_Ԯ];W4x ŝÇgd<1`CO3\q]0?Pг< hf;.Wtp5{ uFHOj~lWkpG.~FcБHIIUM9Pz|:q'Oc0nd""bP077Gff,W(rss_ KKKDGG###k֬A>}H%X3t0{t\|ݰru'ᜈ; g'G%M_ܸqXS|)̳5pd4^Welg(AYR}gDFcb$W…8s*}j)4#Tsfb2bŊrL""bPٳ'ۇ|].XHJJR+o>}h֬ZJ!HPV-DuEEE8}lHX5n Xݺ"<<'NNA0`ll/cǎ.zvGAA|*@; hw6+k[־H$DRR2FCCS#"{o&,#ޜ ňwzM"tӚ!h^tօ à3zo>j -[Ħ빈LW/VDDo^(FDDDD j1%""""DDDDD jԖӶm[)L D۶meSoODDDĠ \xk֬AzziiiX|9.^({_KDDDD<<<>L\`` >c\zGT:Ǝɥ;0QMj0h v˖- … eωD"PxyyXn_ԯ_h׮3C ATT SSS9s'OիWQV-,^FiݺuXb*JNNƐ!C'''۷j*7NMMDƍwxpJY[[C$ܹsg1 IDATϢ-Z yG6k, :Xp\ٳb <{ ;w=s̑'~]$$$ 88^^^j5c xzzٳg3~lDDTVuIDM)1b:!/3;U0&8|V ,ҥKq]lڴ ƍCz0|ߣGH$|ppp{w܁n֭@" )) m۶Ń_li|hkkKMMYrBm;HLL1ɓ' Vw5՝4nb3DJoUU}+^e>+k[%7F|x ^ ¾}}ɝT$((YYY۷/j׮]-$%%A*B$vT-)) ,ѬYr%&mȨM>RRRԚ'q uPۨQ#4k ƍCFдiSFFF֬Y>} ˙!//ONAAʾϟ?7P[dee\ajjL|:^wjpP =pʳ`kkC"VZrg:H;ګW/$$$[nEΝUOOO8::bݺujG={b߾}GXXeiRx9-ZYY_>_m~;vlZcd߷VDRR[3VrY+)) "P|!o>}`hhSSS 4=z-,,,Ĥɾ9I}QXX_D5=4hD" 2-[7@GG^^^X{nY?O}}}`*ھ}; &MZ{;wĪUdi%իWkqSزu;ȱM񝆵+6`%7}ո>g_^7Ǐ|X~k3S`w#RZҫŋJKSNHHPqVZ8r4KKK;vLe_JSNUcj׮HiG^^ 7U!a0;YPP:8 5lѦMiذa dgǎZ7_o!ҀHsB\I<|PazُcK?EP^vp㈍Cg{4iޝEU `7oODwAQp@YDRV`pRj,rE4\*(▊,.@=3h\~xa}G>sN>,i3!H1?}aƬ@Tغu|gn PN./!8$ }ǘ`YYY0~⛰N;|v {R)M$%Wic61o".^Q+M}$Mk7n~۷û}AӾsQuwj>cl&vD"gdMCvj[C±dqr $}6V__5ږ].8}&p&,\D#4QGqNhL]OETg,]vSN077?߿KzjOC8"bPKԬ;Cuu5Νsabb7ܼu ӧM1xyF044P+UϞpwTx̬N;Bnz*MzJèQ. iNm2cCCCLr|Al&N79Uq6bdf)'i=rԵE3g22B$rj_D]'0:iLK5_#Zi4xQTT_"H9/עS= m'd5^T{ݛv;?zq/WԵkQZZ\.Hۦ|ky\2eFFF&S6kV" a^ܼyy777.],U֭[!pv0B!o_֥_5]Æ9`a"r\Z t27o0.Pއ;CxD$JKK:fo`C3ryLon|QJ-QtÇ;b$i9BڐJrneV. nu klWE]ԥڦ +0qxl޸A---{HOԝW/ǒő"u244-VZ޽WSK_;vM| }}foUUf>}<«ޗZgR ޭ5P'QQԤڴrgΜrP(HJڏou"39**w(;w O$colBx{y~vjhٻ 7mQY㇣GPN:)@ PsKh*GS\]EؕO}ijWS ;qJuէO:tUUUΝ;ꫯopƍ<|~-F*e+`emDz<1%jYFg(z&?ݽ!mwa'˵3j8ttaQ\m;v®`|9bcgSо#jVFyb*V}1?6vUUg[@S9OT+kʾ4)Duu򧢢W\;w/~7eYFxx8:Ǝ?ӧOǡCϋ/JrUUUuGDDDDͯ]ݲe `hhsŖ-[|rؼy3-Zh>>>;w.֭[\/={DTTũS~}nܸ,'//vvvؾ};k={4֏ڏa"WwDĠVW @fff̙#F`ҥXr%~mٳޠr>-lݺ.JJJGi]L:~~~Ν;bcc; -- }AbbrQ2+(lwuu5ED^1E w9blbՆd CEg/[BVx Q[7=QSK87>H[ jA-Zv(?3f®`p[w<3mk.**~je#6v1}FJKK묬퐐ap'qtF88ܨYY0~⛰N*Av {R)M$%'vz8xG庲rmA1+2AC1i()h][wOcښ)N44uʅ><*_˖-7=1%js~7{wKXx{{";&Mձ*ioBz+/_ ;''b}|BvA"?;W/ǼyXjJ>cl&vD"gdMCvNƶc(\AHZ\ #u >ޞ[Wp>3>[ui nηvڨvP3 J.aC*Ffyrr]J)X @wHIIU-?d7n,iZ{LJWW&L\.\.DŽ si@FDD-O. +?r9NLGWJK`bb022R:w~ @>ڦH$Hؽ7oDn:ݮD"Qѥƶ[!pv0B!o_/Eoʴ5ѭKZT봵54m .\caab|b% EyYY鴼4Gyͣv-ˢV-A-5Jl: ;'޽; н{w"77!nm|iSg-6<(/oD 8p :vXo;8y7ob=R);A-QmN|nݺHD"_klll۶e8>ۦ?MK?*וclŒY(/5*'ܵ"Ww'JKK{3`? ۶Tպ.Mz蒿yZY!i 4SޙIyj~^>~:m&$fe]on F8bTغu|x1%j^g33ӧO?ӧ\&%s!#2jr]LZD.@v%x{"n]|y;wp!ChXryxET^ziM_]pLb5WԆ8ܕ&!(1]1o^(VZݓA-Q*))A.]\]e:T123EǔRROgOFJJjy9СxJ HL؎}}-Hۦ2@ P[|dnnVbeݺtQ6u567p.6OeHͶt!}}}j ͛ͻ^g;SSDD jZÑiӦlق@2d6oެL '߯/ acqWXlv QYY8H!3C CZS>E`nnիDKu!Haiiڠ17IJXXX(0qx=Ο%"jN? j3!&f @^ ! ѫW/X̜1Mc~!X(, ?U1~?HG B:uR"B~A! c[-KS>rw}_~Ym:]-[ qx?;- qd2**b×T*7M!qYxx<7^;9wA-SҧMM#0q8; u/9)oalb@LG(Ӭcl"4,"#~m.dڲ4壭aHIc ^TK˰3g1^ryMe΢Qx"7wthw/$$A05џb~Byx=x5^1E w9blܭtq2fHͮ0?={٢0?QPӕqJŋ/ݻcǎ+0j }PMii)=|pg=Vvm%DDD L-!TΩ%j,@K>'~˗-CqI1,-,1tbbV~gCcm MÐ&5PQc0%j"!p\y%XdJJ$2xb֬jR~ dA-=uc};ll"7Z"""""DDDDD jA-Z"""""DDDDD jA-Z"""""DDDDD jy&d}Vv:oSp+GDD jm:^V,G IDATvjд%Kv6}dv1%V<>>q窍 hy9Dψ?bQT*eQ{fܸqvvv͖v ;uYY0~⛰N;m_/?L61?}aƬ@ESyON53PZZrCзxk9ZcemD8 s0g?ӧ30ɵN?ZY!i 4Sޙ6j^MKDĠ 6ݻѥK~j};q W._1o^(VZ]`cb"ra.qֵS5|WY0iDDUBLƍ1^("kϭBScX d :/_t 6N5TOuKDĠZܮ]p W_!>>^| nS9СxJC􀡡!&CYYvCzJ\o)`ճ'F#%%Um]*O[tP((JS6TFrP('N|BnyO cc:sC~BҥƗ=bD7|… a``"eջ\" a^ܼyyc}}}C6z4TJK`bb022R~_ uM`_RRCCCѹ*mI[n^VJKWSGRKΤڵkEjj*&M8V`ؼqC5Yee%,,, 7Wo^+m H7ǃ077WO^677\.) =Rɀdj?K_RO""DԪ^{5=z-R{5%CcgB_m \3gí<\]D/(B@R~L~F' qd2**b×T D"g>r UUUHIe2GrsP(pD2x6*lܼr}dkkz1%!`Fo͍bꬉQgpGGvBBD7DG`l۾ +?Yިjnrr믫suY8PZ!>pwX"F`ێ7FӐn/ N8qWOQef'Q[3z{]ۧja8tz г-  @u}>ƕDD8e00nsSyQ TyZB""x7DD Ω%"bNDĠA-Z""""bPKDDDDDDv\9D jy6+(]׿/!bPKDD6K===\A-Q;DOo#""""DDDLY!D jOi)qN|ktih2}ݜcZmʼnc;!a-6ooSSS7o֪}P(3 Bhjg[:9. j{ÞI:m;^sFɼ(ؔ1jB±>>Zl|'MWWWܽ{wE^0uVm+V"y@xgn%KkbDoC^u<7oܻw/VJfGsՖdUUxh/\yҥx[˗-eKǥJ-Q;m>󅡡!o//!8$ }ǘWC"7n߾}<YY0~⛰N;yclŒY(/W?OP]OY_YKRL>#jT/ cemD8 s0g?ӧ30}ldI`4Hꭋ4FsשW}䚚hw/ܽ{/xnn/?L۷ϯ]c8t(:}).]ƯfJo7/tms.-~|0uLH$P?h{6&RӦa3%"( $;ɓ'&M}U㭉߸z< EdbƮlH>8q.@\|bj]ȅκoOĭWujR_ѫcK4i"WǪ^]hϭBScX d QChXJ˗|f:|}}޺+McM=o߹[iNi"yk1ݓ *͛V9 hi?7ntZJk蘫ݗr~eB±dqr $:zTw;w%I GL:Pɧ)uy6 9moZ6.-4 ^z+HK;Lz* F@(G`."9sq"3C􀡡!&CYY!<"PfT}^ҥK~V9򅆎N}).]omj|0! }5[;՟t;vGiiVmm mۧ꾠>mD<7vbɠ7s啕_ ݺ sssr4 144-VZ޽`ddÇa{/!3C S6t95tymD"djO.|t6} 4h ٸy r9>wZC_igs݉{U]ǻ)Mlmmڵk1k֬V=l9+k;c Ӵ74V.㇣GPN:)>զ͐8s,<<ܴʧӔqє}4B0%"?wUwy u  #mN?GllIY. Mny򊊌@tt ƶjۢ)ߚE C:|:(j25.4/~dyϏWƨ\鄪ZM\&dž `bb^{ r|IK|<ʱtGZmi?n1h(.]oէ#/`c7PxΪ>6ݽôʧӔqє6b~fea' ~g ^C.+)WJ'cVPyP+C^MFҬ%VTT3q6U;IOOOedu*P]]s'``j rN-=y Hwr 6HfFvQ `PKbK0æ "DD}ND jG 1hk7Zi{%ӁCĠ}qXD9|1%""""bPKDDDD j1%""""bPKDDDD j5Q.^={p%C:&~;)ZFR(XD}c}pEdqE; #+P(NmAk]Z}-gO=Z"#6nJ@t޽;{6 * njtyjj+1%j߸spAtر4;vāq6n޺LT*}nyj+Zgܶm; `ll11#m&yd2@o7/\WVVA;3f\6+k;$$$a39d>Nc;'N&}r{r_?]!ruS]ۧMVvHw ŔwD`kk\/?L6|a7ac7#\w*elݺ^>~<=g33UZwwwddd6аp,Y+ ~Qbb"ra.q4OyUPqqX$tlvKJXXX(0qx=Ο%"jF~@3gNCL,SBŸ~ƪL㇣GPN:\Ytu! II1w^'N&!6|Im:@rCTskmܼrV֦_m \3gqɹDD͉WjOo]q}X/Lɓ&i8{i~Ly 3o/!8;PYLjh >C X\y4K;kn211F:]Ep!/JwK/~FpDUZ[wthw/e=5џb~BHKKU`!"Z=.\VSӕ.NƬ0TWWg/[:* |r5NӰxx{{㥗^½{p1|bFr4+kQ2ZBv7ŹRKXK|ooOv/[bXZXb0Ĭm.>""jO58iueJDD*(FD%DD j1%""""bPKDDDD j1%""""bPKDDDDQg"Ww&1%"z kFa~=磌T}QūDDF1""""bPKDDmL&ìِd "bPKDmzDYOۉc;!auS';;nnn011AǎoB*j C~!aP(~O*b (--U6S l]!ruMۦ?MK?C]ԩwT""D@ GFmX|)֯99H>yvD|0 A]\ #u >ޞ[ݓPoѫcK4i5S 3;8~P6hghX8,B^ȨuMpAʾ.NnA-]yй011n޺Ӧc~8z_ ԩ]1>q|MDGGO>mb8q7oS8ǃQell*jnrhR1 {QbQ]ض}V~\<~C@8E-hTU~Ͽ@qk3fī ===Ok1|(zx4VVVxo t+DZ=.\VSL0]YAaf/R+C^/HmB[=酈A-Q&ru㰈8(FDDDD j1%""""DDDDD j5 SKXY "EDD^%j'il' pBh1xSk<.UhZ"j1Q[nױCȹ#'%>[;O[kZ"?X,*SixoB SN o#Hg>m]DD jHŚ5kp i_62ݠKK\8wZI`4H1?}aƬ@tsy !a<ƌŵP''*BXe7p:-U ;v&^57վ\K IDATiNi"jr?]gӐ)ߏ zu,*++E.PZ"j5v;w.\W_}x݂ʾ}퐚| ǯE.HH؃ RI77d7n,i)`ճ'F#%%UvJèQ. ߩ GFᎪ*n(}ȑcX8JSGAmilr?1 ?#xl)ߞ=CctprD!E|7 ?~g,\E DW_paDii)sr1^e}cD"A/x4C iS>qqyZ"jRSS/ ((ΝÞ={t~NC#2;;[ܿNdiiJeff 1ƟB!u5Pq8|(~q1ZٱcG7`Рor?YZZ]vD"m>;v~`l߾ >Zȃ ~@k8z(-Zʤ:n]mۨT*Ŏ UIqr:|n."BP )i?&u=]Bvn(OP??_jH$*˜;q/\D#oL?ƞP(qm~>-, ~ۿƹs?klZ"jU ,hԶDž 0oo¶ x}vE~/~dyQ]ض}V~\:D.;ao0>]9T6y X1ĩ]Ep,9 UUU駈aQn0@hw5X X +W."g^1E w9blbՆd ED*C^(cgct9|3f'"6`z Aqn*@ D.#aw"F3(D!ѯ_?l ""D@}DDF1""""bPKDDDDĠA-1%""""bPKDDDDԺH/"6*]̷Q΁&"DDϺYAal۪*l"bPKD~`Z"""""DDDDD j%YY۱oO8-fپT樯.y8>*ps_6}l=[ mqZ:Z""[##qXL;,0qk5օ ann>Zwg|TAml􆹹.^Ġ}YY0~⛰N;:+k;ܵ"Ww'H7CmNžZgMiʳ3`wf DyLme CC1f,e>#6v1}FJKKUM{HJگ9M? o/j[u7n߾}.vD"gdMCvNWbZԷH>8q.:'sW"?ĮkcƎ (**FDͿfW> ffvOB~#'o y2?]^SaX8 y9Wʱi5˓[<5 Mm8p._ʠ}Ǐ 1aU :`;SOw7 17dN)ϔSnSi5Bޞ8z qZ:|zC(mRO)ץ1 ?#xFO۷׿v*UpY@FYD΍ahhGǡH=%nc?#Ga(N> c<`ffZͱ7梮58l(RS<RNӪ}E4ލSJ۱W_+ܹn|5D"Ay&rYonnVv066tb,iS"Mg@ֻ &&&###K$tb'ʱlxP߷a0jr9\B\FS׮](--kcN΀D"+^y/Z}LMMͰ7梮56n5B> HL؎}l~ѵ5wctv,4?h7^%F +0qxl޸A:w~Q9oDm'oT(®ʌyڴuw_\:n!m^.(>3={VyBeFQk&)77Oo]g?:,٬%K>գ?Ubߺtl6k$u i-+Vd2i]r;]\P-Zff~׏yڊ i˳y=믿Upp`#JK;}۵1ZqY c:/e0JZaZ+FyyyYҶV\*3iޱgk.Z7 |HҔ74,zCUNۋu)M[Sх(:uVݺ۴>[mةiJ K[̨=w|қ 3{Q#l 5kF}ƌi->,J;RS90D͛7+Ԧ|[*tg1h+K_%ImYƉ$=ЮuSE>/(1b%訑Çikkcul_GGr'fF>-ֵglť2_6m{Ʒu9w8 t}fW~Iyݮ7$(Y,t޽u8m/eff*(up#gm۶)Sx|z葥&J9curO2Wj\}< 7)//O|۴.5Z?+xݧgۄ8$qڵk^}eu&ÇUn$4|KU< U׳Gwo׎_Gc\}N3WjPqs0 $P */ `' Hj@R $I-HjZ I-@R $ HjZM>žI-P\$v˖0--? @R TMO=ӗ p1l֤ةm^|iRTfky>G_:uQ~Z6Zvi=@R \zO|8[/)zh>pޙ^zw):yޘ8YR) .\qsO>$GPIK>-?-[H~8bN-$OY,IeAAJ-pnUlIRڵ $@=$I+W}+VI|1www$>}`@R \/Fog9CW^~/LԢ)NNN;&Fcص조+ HjZ$I-@R Z Hj@R $I-p>}ZȧCl6۵|>É'T^딤5k԰qsE b}lţR1Q]Tb$ oWTvm}jvܦO,TVV9{^*/ȨhH׌+k=7vU@_A<<ۦ,t}%mՊq`>HL\6wT;j$mw(ҟMMݩ^S#j!@~]*> |Gsխ{$KP7;vL/Gҭ~۷_ݺgSzz]q?`;IRʆ8xHcI-pMMվC;թs7'M*1 ::Ujժ$OOJPh9jħXfͿI:?U,*s[㠴}pa/nq쭛uٻxewwwhw(33SvQ66Z$'''eff>>?%@R \|vЦ b}ǧN>c}I)*[<==5j\̙3曕+Ɵ5kja={VK\A nN<[oUf8(m888'{^Tm٪ץ6o^fY$k CW.WZ}ϯX%ɤu)~koߌF֬MRnnϻʺuʕ_h4KvmGPP-ZffW*AyAE:n!m^,cҞ}бc-XX~wS~~[Çm5wڼy~gNI-p}~IU15nR=:c+6v|95qb۲U/fp͞;O>M[̈́K?OKN J)65B˖Pm_h%t?:n:&fF>-̵g;ҎTu QͮȸR15ʻ*bJ=J[˕ewLڳ:u dWR@vM i(>q5jh8qWCHKg+|Ԝ'ZpcJ b!t޽u8m/PiN8υk PY9['$3pu5W₅ LI-q%ںjڴ} jڕ 70nI-@R  HjZ$eP888=$@Ut8m/AT{S0UI-HjZ\1S$(#IjGXGŖ-]La!H ̙3}=8qPݻOgUvvN{j} $xK/E۷hӆ$}]zŗHjU_``-rY~LAA]pY2y2 rqqO=}=?)ݻz/##C}P#w233eh R͵fm]˭YF`Xou[6|򙚷l'NJTޏO O?Z!QjҬ]eYYz@5nR}B 3WfsΞ=KR ֩#98Xԝd2ՠNShhvn#VBGU4#!^Qv-qcGk5$bbF-?jwճgwO?2f ׎[4th&Nl-25^aЎ[4lhd6MS̨ڕUCC?=jsgO\Cyf$GZN=z[QWdҺw][u+hW4eW(8(~ڡ "_֚;/2]:ke6zM)af-Y})vz-[BZg1Gծ&fF>- 񅖭}mA_ ISbаQ =%bF ӴL؋}ةiJ V&kjW"ȷu*-uB"-]?sRstk)I70JJw8mX^WT=()Iz.<]qgaj{+nܓ̕ZT}$7#vH/@|˴9֘~Ɣ$I-Pu988HjU>1$I-@R Z Hj@R $I-HjZ I-@R d$n7)C*JJF>I-p]!d' IDAT[oi@R jz꙾S l6kRTiV4)vf8ǟxZ~AZtYGhUm^>NJ/R>0Bx IRNN"_VjDL&m7Q ߀AG7~]ⲗoUG.jOk&Y.wi}{c}HjJάFgY];U۶<wڽߪQ#;4yJ\Gwg-I7]+W~qcc4vLKԿ:uiӦo+I矵i7Wuԡe/{M'O鍉%*[c}HjR\Bx-sIRhhz$}S7nZb:4R]KR6l*R@u-5%IkI)e~\geX4g|IҜX,rpp쥞xQlBoގSSj޹$CEtvgggKtM7ݿK*Rv Io$I=}R 8@}<=pJ]R^^^ؽŧ@R [oձ_Uvv,Vڵ.߼tTzr{:.'''k3 {xx(##C;o7\ŨaճS..{5@e`P!IZ+XJ]Iz3}(i]$sͺױG??UF ؑ*g~eK.I:}t@eJ-P#7eEW.9"Z?M2MG{ ܫ'LR69bͺ2FNNN6=Ayz?~[jꡰZgU~˖f4f+28 t}fW~Iyݮ7$(92N۫z6ᴽnF.Jgaj{+nܓT}$S \gv@q$I-@R Z\cSeHjj "X,%AR ݨ>HjQ UWjrpQNNW8TWjrX,vؓ$_ӰqsY{>qd$I+.\?+k]oʳ]vR``t7SFF$)##C={7,///=c:~xfYCq׊%\%?$qόxEu={]q }裏uqy8p$iW~w=zTuտ*^6o$}y^{}bby? +u~5) v R|dEFEkԫ WgU`Vt_+ڵkKoM4x`Wuƿ:1JŕZ 2e/458H&ɼOjB}Pfffoy/ Tڹ1RSwWȧwЧ}a/%~8 |;$IrD]]qmۡȶfeeոIKfm6n5Ӄamvmw>JL\6wT;j$mwPs1$JMVpڹk]c,)Kb`k=ۧ|۴ג%۲yIڷou>J))W8w$ITݺuevvyßWc(O9o࣏>n*JR ~[?,XZjUZ][#;9f#GjeȨR۹1FƌAڱ}IN;o$}ͷruu~a&uX~mڰȶNQõ+u(~zBָw1X1ڽVJj>͘vޭ++ԟ)S`ؾEÆFOicni1(iM.? ڵUܾ-똟7~DԸ>Jks\?׀$I֫R(mLI*,crq,)8C/Js*I-BϟGJ{;JHHlب=Be4Y7جBruu-rŷ\je,ggg=+LYYwoΟN}}Z~/__.Eu]zկWOAA]n]rmSw[ukWٽݑ/DM:p9;;]J^R㠴vJAEZbƎ=\Y,9:^ P%ΗυGSq,w \58PWZU1?PC Q?kԨQQF'33zuťԏb===*K+qb8p@{Px~/iݚ?U]*;;GQ3gL_^%7C5jf}mPh9jǮYoڿ*Zys)9;;k۟v JoӭU[o=Ɉ238NI1| :T畿o˓΅ ׻+ q,w \z#Ϯ9J-PAڹs٣d=#I2,=uIRnnN}vӜl~LVZ/林Ce6dɧzJۭ{VJFQ^^^]t͛l5IҳBY7AA]h'2͚6^o˺*88AY)֬c=" kPPf͚3g(//O:w\ΙzB׫_XX5t%Ω$=َ9_zV|du 5B˖Pm_hV;~XSbаQ U:u*N;(3+K?`=橓pi},ኍ*4{|M0ĺxM 3R#.Ey5\ΓOVz3ab+},Eyc0|Xvs`7of;Ѹlߖu;hN])q" U,w^зo_m۶Mwu?oV֪UUΗ{Yv^eYE[cZOWz#qip}_U1%IFmI@YN۫z6*e;88nw&z=gaj{+nܓ̍b@ENи1z(W>|VSM\(NO0UWjUaZn7QN`Hjx@R @# F1$I-Hj*@ xP< @70 ઱X,< +hW,P1̩I-@R Wӧ j!@|Z(08Tofs~N8iw][eQEPWFZBFyEkWimtBeeek3j?ewC$.Z~yIyx`0K%]~ddd3 ;л}PhAZ~&묬l=7i•c-G/_@6n5k %/6dɧ%lJPKYF`Xou[QĐ(5iZ]{h݅ڧ5i>}(33Z&I6}훽uSSwWȧwЧ}QVd*ɓ',gggԩSv]jĉz9N/._@^{}&Ӿ ׉Qõ+u(~zB#GjeȨhSϯvv.yO+ؿ6mXWKEFEkڻG cK\ϔ {vlߢaC# ՍJݪGq=xRWhƌkn%]Yl;2f ׎[4th&N\Vdjƈ#裏ׯFaW3g5qD, &M|J3V-o%&.ýҥˬu%Wzd0E%jㅈꪮA2L7lT䤈oRKSw[ukW^ _FQ!Zє ճGF;+y rssSpp<>>nؾ[werý”}UZ+W'´|r$飏>ŋAoנZjVZS/DC=(IJO}Y B{zztլ7I4guO֐*|PF&Q&)9;;[%777IKqa/-uӕ`8={)Rq-ɩS.I馛 M1U&IW։'t}TP̈́(߶W=:}Mա{tطӮuIkb|%ԬYS h-76F"JΜ9͹,.c; yýެnJŵf͚9?_̙3Y]e4o<;VcǎZ ?_~9"ɤ ͝:~J;tXfYK|GʮhOd65m5 JOO/suʕ_h4K%_7/٬k56ud2.9ExVhyv/W)ݺiѢE:w-[P$IO=٣;vp`I-puEGߪ7irF WlT4mskv=|Xvs`7ofn@:xM 3R#֌ƌsɧi+0Sqqq-[BZg1G^O}CâG)08TuԱ{9[qpBkΜ96m]ebcc5rH, :! W99O۵Ɣ$%BQU{p^k8ׯ> sT[9vdn&[W/ʏH\2S ZZcw4|$Pq Hj@R $I-HjZ I-@R $ ,cE8(&&~A\u9 HjZTwFB@U988=ŖoC*YI&iDccJRuxiPHj#Q?G=-[{dɑYY5jVZ!.Ծcg}kmU,iQOZ .!Wk ,@2H ̬b_Rmռe[5LvܮX͛@3fMR o5 ܷO*֭Md1=S UpdӧU"q;@am̟ϗ~s27kJ=TAH*OdRΙ,Kv ||)>NM]wi>3S={t$թsޘ0^/yE}7ꖧgŶqך5߅kG_~ujNk8pPRtKG^W?Ќxu >2;;G1j㦯U?Y͚6$eeeaõejW3ޜ&*vU_+5vvZxꭘdt0HN9줛ort*OֹKNQ~Ee06i]ImULh%Pr*7i~ ~MԹv ^[7(6~;~\wqG.qid ۷hHM4P#GjeȨhS+ڱ} Tֲq3jvnUOOGexNۼuxHcYJ5S2t)q?uߋ}ѣ^|wbڥ_.r -I-՝Ţ/UMUN;&Kf ~EJOב}T7nf$lU-$XzW \]]58H&~ _FQ!Z kٺ_ hݺ* }G){3dXg{"WIrpt T`9c"SEfEQgϙZP b`6W$=y|7҂\~@5v4Ma`6)?_rre1t,)sf wT=fmumzz,ցg"mxzzS\lYzzkP윹@HΙ-7hv%߬3&9"ENrqr(8;QBmy:}L)999벹?L&=owZjQeȕZS+V5S*ضMYvt"Kz jvh֬M*ަMf[_^yyp/7Dyzz*??2ߛC=:ogiyjї$&5ة\P '<\`o|ku"< \Wƽ,I2>m^0Q8AR _g 0 \ڵK~eK\V+_yE9992ԯ/m۱lQw)>>>+V*//O;w&i%7):n!mkڼ{f^!=e~J;tXfYK|GJG:ޭէ6Sjx  l~ަo oU{oUzqZ3i4oj,ֺi%ڷ󕟟}hEEn t-z_c5t;wJĐTCMݻYKKS`~۳G?۫{&׎Eh}gIDAT8P~I-zW_WO]wݩfS4|hժTݬuľaѣk̨6|u(.Fj?=S>i][om vT{ԡ*H#}Rl}o7;nV:R&1I7}#IѣFf7o^ikoh^sip;G:UD{p2/GBe-X?M?ROjkwXoF^[ܐܘ~t`W7b)Wϳ&MY[ՄYK.ΒJ=,Q woۭ{R @utSOʔo~~ڲ|zs,TnY>zv}UA#FȒ#ͺzܹHRkV$ynnr6ꕧk޺CIdb)4GGblPr#Z٬s٧o0%ޭ̬G?kִ~\D'?3%BO a2L22LzͭQssa(GG9 28:h4`0h4ѱZɤsL2d2馇#T&I99e2TP`j WQ|՝=*9P~9ըQ5u=κ_ΙL23qKe0d4e4et2xfsjpj|=hX`-3 "9p]rt$GAANNFJPh(GufA(_"%ΪQ, d6" D'^< JY,_?"GG GBR @u#ǿd/_!I-pq] 6$Z@Uu,o"8@R $ HjZ$I-@R  /j{“D׵%'Uw֤6n*ɡiGssm @UԮ-C+!ƁOIENDB`kildclient-3.0.0/doc/C/images/cmdhistory.png0000644000175000017500000004572711715730227015670 00000000000000PNG  IHDReU!@ pHYsktIME& IDATxhv?𗿨 A Pp:bĥuAm:h:>?%=%=7VJ\satD HPPAQ4Ml,Kz%K0"J]f'qqΙ@L ""]oJFQ-$vAF+Lm # Spv@B`k|_q&\↑K%qι8)ȋ0brb9g,[~ƈq#?܆%^[/jL dr*.j5jDD"cTC^nQL`D<+Fu dbL7z,]Q(*_YqK/""fĂ2#g d\8#hچ, S )mA\9o|&0w9w9'p"br-P`SD$%j\GpQd cHWesbDD2#Ή*aɂ,٫ߗX|Y7CD,7W#Uvwւ(dTD97e?Kw޾䜳 #YŴgm-!+‚!Vr1AX9]nVMjf+{̴I2rM"YfnQ9eU4mbLIUFJD$UK mTg~@$IE&eY]bA\lN^\\qIX21sZ IlO;|'smGg".=+.ycHAmZ̨P`&7^ءdIbDq+@d"d<7J%]׭ )g}UU\bA6wò<]T*s˴ UU#=ae(# |_)US\)UfU6%)t¿[J$5D-ڏxbA:H'Z,RQxb0}%˲^Ɖo> IxnWlNNjRXe䐒UC:e>~r&^szC3i}b_ޓH swu㗅ynޫUz_UɥC8MoKE"R9կ!FD ;wG7-Ǜ)WWVΝ 2mY"c<}÷ǖ"qǰH-ڗ s2?i<59{I"&U9M~W.=0I*J5`^cT_4_ e. _-L?wmu1IĭYKu1B̪9r8E~5kDIfCڎ%$SX(UCWtjG㌈8=^ԡ@!݊"]=uB7>Oj~)m[^~8zSWIbڹ5N>񂊈<0j̍"EêLዊd1.'iRQZ:תոx:LDJs8> _ZOkYvI ʱg"R -%/ꋪ]"L%m̚!Ɍ"&ck:cX7_]ZWrRn+e}|i(LasUY7RgMsD.i YP#`zi$I.'b2@rY3棐zO7J̕$^OMcV!*b*MX}?}WϯC^oTQn_:p5dQ/{4Ϋ?GYkrTXJD +Т,6~%t7 {Eukz WcQ:a{I; uFA'f5tRɲ\n،"ٵ,N!I 3}` %wٶmsSȶkUW?Ę,D,]}sqglt4eLnGz%  2&0۶헶::~N.rTuH4ted׃yQ&D̲m]Rk[PEYZ\Qk%/'e_Ɖ ?ۚFSȡPy-nSaOymy˽ Szşá=FծUU#`rmC~*O͖kȼ__+""Qę>X5fmι2"3&I6=qn[!Vg-%ĭ=DDf7l2&92'rV8QmC=kؖ,K2!Ų&2GLx>+<0lmբ,=9 Q{_j~LAuy'i2YN+]PSI/6)sstIDqKȼ1a7Jڧ'#{4Ѧy nl6>e9[TyxZ.DjjaMQ:XWTe?y%V{  QMk88wq"gmlND䴱ל%3"&( ~QTWa4y]R0-9qAEWKb}LD ؟Ep&n:뿪t\bf葙H/K1 r>\s^p\Kye^nڎEs'gcR*/>GYIwHX6/KxD.Otkv@J^Ǻxn/|q 2ԐU[}OJ{lU)[B4~O+o+.qWFc꽻Ss8.c!q,N`1Wlǡ= [sUsF=u ɉF,%>L:TIDD.5Ww?:ZIЈHj:~ɹ_UUui>Y{$i޷7w8ܾXǮ1%4ղ# >Q?)\.$%|J4hKMܭx_<:?}zts?^$c$^o=_-dZq|:-\CGn{lJljb[ը<~J#^]v\k "#])HLp8gVfl6Y\d#=g9'iLjZwN!\yG&jFW8TeL91s]fT;㢨p[,?U,)HܥǢ'RlRyX_97_6qy湡TbFEgMrHV;3LVآ椮ȯTxaO++i+33p[퐪n,a~[8Xi5w~>ٳtʖ:dn 4VYƏ*OE$#:mUD= Ib ĉ,aI`Z,wCN^rILP̚ND C]l֎H8J3ij5ܵj\".YUʕJw ȱXR2_qU!uXm5ΉBIɌQ5dA+eY~lh‡é K~KDm5G9 s2ں^u9(IJL& TyZM_Z~*Te*bFuK\Un1T ZDD\V xvPBJuֶLi$u1U#fm\ VCjdo]b)}!HD_͜5m&BP{*SUbDvx2SvWC!1X>3G/RfS˨LX5CÉL*^H;"2;ù8m 2RD{8d[B!`| $)u3Kũ;IAH;H v12FGDL`RP_] "\G !UcRDuԧ$6uC/>*rI`L Q IRTUNcu\ hK_De"1G &ĈS ;DH6fzO>,fpIyUD\!llȞ\ wqiddrΝ!"1bĽf􋢌ɲWVq8MƂ",ˎSE:p 6/'F\hl8mdE>-{g +1q-"IAl>Jbc.gA&-fw4bY"$&#r">B%݅\|~K8631YMޠ4Q5HJz|pQxoq:[rXX./ XC^%cqLۗcC!VY?d/PJڝ;F6dZ UۢyID#p-o-0 qmk%B N,-n&<ʏ?Lc@,I(O6 \ٯX/qK)ؽ{W-IM^[:/E{Ow~Ŷw^X6gmdDgml͍assy9Zs1븉&yɂL@Xw[ȇa8 2^R+zd^OoÝqι;_|).p1&!yID}!\ʬ0}xlxt*7pX&,{9tɶxL`$Qi'{\P8$:"s2vJ|c ܡ`e|%X#c^+s!1FD9$db w"&RCKX),-J#|i{zJ "r\g(^d2άW 2",1&Kr[S 9XF,w8(rL^ f\uJC{ p&.vfA֮`Nq^DdgC3w992ι8عyY?vؙ3# XOcO!E{)&BDX4aWA U9Z Dw˽Ǻ@2z@/M[GSҟ'L|xX,piԘic~!;ܑH.Uzs9 Nyc vEWON4md<5 ;ײW,d,8 K|={h_l-L`~T͂R5oZ1w.9Nd.-'z@N^"u:lBܩv6xV)[y~Y]Hq絳p~,gRS1Dկ~ uҸz${YM#T89y 8p*)22eΤVWw IH=j[I!_X-a@f[ gAp4Z/MJD4.;v"G"Zg^Y&?Nv&nO,Um*E^t\Z\[?+/]_#B.h p0zmt7rp'R~X.Wm둥S7?ֿfZm&lZ~2zC&nN5JFGf՜=H7^OǟyɽtxA(r$X|XbOIo٥AMK! x4ņE5zVț&1kMWtUUjAQ. w 񌱅i\""{֖"+k6Ժ,[3/}M4f/iPklNܜ09U8=OOe/e_i˽Jvr+tbC2_,[j,+ۀ9ɹos@4{|qݜ\?5^iQ1{aٰ\+R 懣G;r)mu^ʲiy>rŜ~8^[}[9~yEر,>bUr?ݾ}ڐ½Bc⥋]؂7,=b96² aQG2Rһ-=k{~p[\\eYvg[QZXdYV.DHd D1{D;:' gAVV[)>^icߎ<֥iQߕʿ+x❥c&jDN~@Jq;Xrڳ! xL`\XlסxKe.-Dw4)( _^:K?.+kv9SO71.?WXt>ڳ !#% 識̅zdO8LIy9I|6dsY%=F{G+eY>\?`:e<5HEWvRE"2,~^;V?>ĽWtǻYHL/5;~Z?rcw Ď>Iih^Ǭq^;"we>ˏ˹sum71Ѿ?w>fլuSSʪƎǺݒ$I$ bʌ|l˶mnL?8ʒ$ڗ2'$Y m]>?}`{rh= y xjtlk@ |?, C6슼O6-A&슼m[YM~#y6@vr^bb/9gC_2+˩S}} c]t< 1/{fz@EqyYW|X>-Ig(5NJ.B?8ɓK+مs33-! G`e// #'L|P%|(t I=y' 識̅zk2~">~lLωOb3o_ /-%BK% /K%`e 94fo]rʕgخkÜ5NV:5Nw.ԙTAxn,ƣѣ=;j66Nܚe9')gm>=*_s )/h#C燚۝g朹!kmqy;t~hԀil?fy"*>(6,+$O%I:?̥LӳSw,l$MML{fAFD[J2>[z 헗5v,{n!:$^Dk\6U$I6.`%e.eFƎoKX}F&N$rȥKX|sĭ9>v}ˊ2MO'[/h:ٳ>hrȲ\_gfQlB@^0vc,IR+V]1M@vkpP_rwl/8/;:qkBƹgm>=*_@`cE/(h|`O 'uk2 |<Uږy9~k|愢(_t9g.u:5tvau0s7rC6M&>Jx:< vי3i6:?4pj4Jx0^im(1z}t\r6y:YyAĉ5E^ E?d/g V ΦGBOMk=9>pj}i,8~kw%uHR`Oy {(IٳvH3M,KO dUe?tF+Qع89z-j5 4=%ꐩ#D$9DDӬIDvJD>CD< VŎJ%ㅡ?7$=sy#YBXHC"<&hOn<-|?|UoBkens>Y+?V־o!""Bs>m>Iq"5^5:svG$oʰ_T~(rFoFG7d=ځyOyxjK=ב)%;~k\ǎɥܷHO>VX)ܷ9rst[΃y"%Xy KJEy->,vP56=5vmlD@ >]<;#Fr漑k}d~Rٯa-_7xR&'(1Zfd~ ~Z>uc6ll9,uHK8\yKKDd1^tѪﲫ۞}f-ڗۃ,Eyj66e c7ƒ$Žbߕc愝N x!pڗK%K%Kyw-:~%5\6)/w8#o/ /L'Kq">{l3IH- [4/m{~i<5T;/DTw%LkNYhh`O #Һʬ}4zT\,M͖3ڶ'DQ:}6=pj`ΙKN )IRi*CbcKuE{rơCɏ+gpc‰HMy9uw:\[B4p@Db=bǼ$ ?pɤܛJN@ VKhoh 3Nݝ@7x-ʚEɈHLDqޕ7?KfySOK~䜗'T+mӂY1Y{lޓVB1ɮ.>(f.eȿOag p edM!TZ4>].(ozoŇC~[P+ fA}u;-IRᰗRkq/ՖUP(TVdcRf//MH$rw`G`{Pָ$;ہ $ :s/AwNhς bjibb1hot8eWC燼 W^Qxlxt*7.'q"6wOW-'\4% 3zıcM>`9N]Ӕ4+S)(H #er&0/>9$:"M27ý?G#SOᔹ,z,qXħ;_ᅆ'>J(7#c[:Aai3]K $~ߧMޚ?Q"I:)I]m˶v$w9ckeb:xxsI &0rɞP}oM-3}uL p^-tӞ4J8?̂lPSm_Q~/j-0r9M?\K|i{zJ "r\g(^d2άW 2",1&Kr[V5Y.'@KǦgkO^.wGErɍ f\uQJ۷X8[gYf kkgl=2r[7q5I#*) +E;GsڋL;ޣ95z@/́[GSҟ'L|xX,pi|'Mn;ܑH.U/AXLjr{K^`xb}+Okù1ƴlx,{5KD>ʶ64.:p} %rOhN\O7C='w7ct}j}FwFόgxo`UkrY{8 o/_%7"551˶uy,\ƭ_f;3) Ȼ|c,2KCz/ȵ76JCc򣲟/]vg=g!/vrU ^ԖײǸ _삼ll̹T? M#ժTD Í΃@ȑHYWFVgɏ]ᮉ-r.۶ZgmdA<%"sb<;jl2qkBR4gcq!پ:B-KQ[6:xv9|u8)?,+EKsW+{59 {#33_]sկ23"y<둥;F,9ܜ4dQ/Ɍf'G"?葨Y5'nOhk/ҍWg|/l3'SgR-s/f.d{~3|}ػ_ N~GٯZ j_"/&HkXP"w_wb.;cƬ5]UUUEY/b7(.53Z.=k{erIb.w/]~dVkxS /F-j7'LǣF*NOSKWڲjG.K':$)˲eY-\T[S˟ w+J Zurp`jxl:H]9a,~h#,Kd?qXőGbaY24HO$SmoX%61K׎GoeYvg[QZXdYV#G"kIN &0q>8hzFӴof _?R]`W*$≷KXXxdBsdסxc9~2^|SZ^O7g] kheYPG;9.t^5<,\r(YCD%>JT_TºM_[?u9'^SsIe?wjNӔJ9z,WCqodð "鉬|$cA<=v'ؐMHdLݰ)K%Ivi]$Kl_ML_]/}y4̅LRz/>(FEW^TWްRʏN&˽7q;5uoJٯ(hoSsRTUDʕmOƽ)-۪#E} Í)5madW_j&-whZMޙ4m-(s)}m}[ 4~s\4V_,>(jh Zn7+L 65/ ]HүR_ <5NyMh*yi6 'gv'xkTO?tʰy/W؟\Oƍ' Ia&Q.}7~xr6aWݳiCrHrܸ&+mfe; T~\.?*_^<)?j.oKJ&} @p8]4_XJrpo=MEQLl97`VF:5PWRDzΝM'O%+^-?2Al*I\8]BM*XRnhd\#izE',ۊF+ ʣJ4,E;n]׽J>{L Ui%C6fw-՚4&(ʌ>#KrCV[ܻ{SfWk Zn7Au2rt' ZK CirޔU"I4eTs<#ŠJ:^|$-\%Iڝ`s^;D5x=k+EQ.lumhvcN)w^ʯhVkb')R˭yamMtc:AM۝׸?{ Ġꏝ757_/z,:d\5o'===o#"̭z𒈴4նVM\b?V8UDiW't!$y5k^iKפMٔorvgAn9Ssy_>1w\(:7F~٧vwjKriՃޔ7F9[KgYuMLݝGha\7!=͓K{$OK#GV~Ej&-whZޮ-SvWS Xa0`mߟdiGkrד5u&OWյ|0~2>"x_X[n SWEZ<.,~) ䷿3Mkk&T7?^ʦΤED-]p>e.dV~F-ۡlkPKWoڔorvD5uk 5;>36|mo3G6I"vsλ-Z^>3UXQ7:[ QQ9s9/Fblw]@yT[dH 3y_7yer0oVP-4)߹y3-/Y0xsXwmP'hα\"aq3p-հ)`YSw;n5lJ-y_mհ)`c%y @^ /K_̡4k%?N)/"Kk`7K%y @^ /vaʷQ]]uFQgyչ9[UDu8)p1&2qKCQguFTKl(H  s :Ψ3^^Zp3Ƽl "raq9 F.ٳj:Ψ3:o:wҬo ν|F/g198X9FQguFcK+qr;/ /GSԛ.kv[\uFQgyչXo{8]NI"i+]c692_uFQgyֹemT-@%QguF[-ۚgb9wf˶vOk_:.[J]pG"\$uFQgyԹ4]J΂JFN=Oύԙe䲑kcns/v^Į"n΋W%guFQgyc]?JE,yʚ7%Y3TDk ym7s{Kf;N1 _$iCx8q+_;,NQ%e|XOOr1˙MKc:Iiۢo|Խl5 %O&_7d/ͬg|q9(eF])&$sˑ@3)M."Y.7Un…\Zh?3 ^IDAToٓgޣ>\lԒ6]^8qy3t~({9;|e8saW&xrdv>|CgB3YnՑd,FE?UM3ٴl5q}=Uod^S};r$nv핻 JKXbap;ڜ:zP--];G ?$"G"c1NkWW96v^S%msGi{NbRr r,}uƿȑOhV߆z;԰B a9,0 r Qh 4;tPR-L8ib:JX@9t8}H-ЀćdR7NBIJ~?y~{Ozorzr9w;턻|DHr7*LզLI1IwGC9Y2LĎ$omJ8<ϻi{.?+j~)W||ȃrn!GihQ}rZꞟֿ m>xGN8h\|^LS)6ClԷ\$L ԃ9lfcP{ GΏ0ƌeWIKTK퍅R!Ɗ1<:n4_x"y4{nfUv\Erb_,L?+4{~7eT<ˆ8k-]SvVꗌ%TʪJƲA7{7MH1)(kqmۙyPާvMUb '~n0nKڬ_ ,=Jfb1c"EH"w\aJ>9dhyERQV;j&R~ZѷfoŸ>B9^NmZ+>/Jg%mFS.(l˘7&ogΞJ^LϕN 6#Ҁhl5EZ,)!)caOML}O2<:w9A Vnl6;2c볺>6SF*DdeEZ&G9E~Vguʘrrm2a_6IJ,<W'nQ rUU>m)taN-ԭTow/!R#эd˗XI&ӳ<(V  l9c!qҀ³B{HwlyoFly>H`V{>&n'7HOvQEq#HjK]~kMzy!gxgxyН;jwHOm;[PVU;sqN~*3<3mZ*B bX_p8,{Wṵ`.F].(} Kygxgx@y5~%^:>/FTǖCxgxgxC W"=; gxg-c(P_/ԗK%<9Rj%Y- \j.ٮ/qֆ;MMi4؋IENDB`kildclient-3.0.0/doc/C/images/we_hook_edit.png0000644000175000017500000002422111715730227016125 00000000000000PNG  IHDR>1 pHYsktIME  IDATx_hע.ր #HA dLفms`?D&tC"ZU[رw4ށ!WC =IDТn '؁k<"oA>UpC3,ȀH?dq~`bk%i-e}֬ pz-πǓK~@EDDŭ׽;;%%.!cK %["m0t%땈^ uPl 6[W}hISJ!z/ }N\`m " >DD;@J]N"y9xhU`nΕ]cz{,!] uP@~F.Wh˶eMDpPTaX7+zh>H/gm W=/< y$)%$Ëhؕ}-*6AW-u_N GmPȀ($Dy4 HHȪ-!%DifrGAu9{MφK72 C=0C}t lN)B }7Aj~t9QޕX7m Phg9q:=&lmԶ+ߧB@,.$.c{$BvQB c$#]ׇB`bK;A|դ-%,[B)/3|j#|@1P1F{Om*Lr}i9\N.o}#Utet/}[NiC D{!h-c\Z唎sI *4Ջ2?dÅ3MÇ۾ 1q+yY]rP.T(/֨dȫ{ydf-s/;L}l^~iv{nw0M QDF5wo>rDjVܿ$l ׁdp>z۝Xz7^_߼-?.GRմ7sMZ\Cm9 Jqjo)Mʩ wlb[vY]Y˷ }3_2-qכ nf`><G`S|RB rG\}vM˂ Ki#3S\tvi$M90Z ͧLBy.Jخ]׬/G 6r5T*k*}2,r(1d]7~ _R5ez1Kw珌"1Ez!J ws=}0LC[=ӆp9"W] sHKB+;`4ͩʒĠԽpi95r; 4Ttw\NMŽī767L@l| HDUx(ͭa<2:O ?sǴ6&ը&;)_ǒU5Y;_Gd2-jK85[~r>WO9n\2ԕwTNfVuqk7gy5_=:AژG>z޴,?7lԗcV'bc\(?"t:?Jg:vK:${<4@i~]9q.o-_`Z/.IRi=>\}3u2,]y>!{oS ALA?vtrC*t]a(<2 uT7!og-Lۘxc]__^^.r8*ryb T_|R0\)/ԻJ/^-[߉rʏxfOKjh:0F_9'*O#5)S;_ ˪mn>7}}ܧG-__+PĀԄ~8 ' ^ ztXmG`\Ǖ9;Z&~a~p" JƒԠu0Xs I"_MXh^j3ܯ!<_cRKʛos~^H8rV\D{Ȯ댔nxRJ"JTMZPAZGSG]Vȯ[k GT.Jm1nwB]׻4#_O?&J 3vSEe06JV%]ԧ@Px_C|]VVMگA)}ю[Zqp5_pʗpޣ$`@@o!﵏{f<1`#P Ϣ"zFe=< =<3076:*X70y*M(ߤwmTaß!rrv3Gq 7= Dǣquo7ӘSS'c@@@?9dn/z#"z#+2ě3l r,z{lpw!m#FCX^oZuCϥm_de1~G./[O%Nê Ve֪ޜDOF{?(47"7:Z㊎Ge-MY%/⿦`?eLru:>=3c4d7S#ALQuaB?|ޟq$/*նV䇓0 kxf67"7:Z"{ Jp--/aXׁ;r̋_LC'b;" nlu8nobǣvmkUo%LG0q2ܽ&"W"\ KccT̆{#ᣣب[ѧ /j)2˶z )ڕr˶m(^H*Bl9=6֪6lhDD 6(B |$$GPױ x^rn 6khͱ'XÍ%H U=[՛:蔈 .8EۘZbm@NNWX5q4gV.V( }gm<%8R"$ΝQ,Y\`i9xK[[t4-w9ގnVUԥ$W~GGFKQ 4hMH^EB_8=ER颍z@r 3ggLmyoP-u)?O#ɧQ$4aFhW1 F 0EDD"""bpEDD"""xSlm"]"s{O vfc:;9O kd==Ǹ0EDDK;8NDD+G\7nHZ$"'q\k#N#w?I㥍UDOL@ӇE62F(#.g(4}w:E!L)ʚrնY$/nbN\_CBr5WrB5_L9.⿦`?eC"}1@nee˶ܽ1q"LBk%2(0q"¯$>I@p+[Z^° v",[ #WH]J"i,ݙݲmFW- Wk^2(o?$":K;BXo?'qoWU1zr4ejn+f`$"Hxk2?. vr-GD"?Ov9|zfc һ.;u[ءB\eUDDoMXMB}"~*ΫfU }\fQȑZ]/h51(""zY.:<1^f#"=e41^y6쒈v7"""EDD ."""s׹lm"]"s{kߨK>Oi!"z""qu_$IDzzX"""""Ѯ ŻKaRG5kDD+]OM"]EGk6?dk ._ e ƯO_)b6k^mp`) 0a۵.(S臇9 *ӂӃտ[Sqh&OaUvpoy7Mt#9Ai@$2?dr&?QX0svM&/0#y9Ux,nݼOTFn$"bp5;at~H~Hre]^x'c<9 xl_LC'b5AIDD{_WHWLϥE  De۶ e{"Ėaʠʖ#"bp(4֖Jߍ|@ꍈ:|UU%AGJ*<]M @ LiDǣwW{5i5YY=GRDD}p--/!q+'>N`KIIC;<+WsbQ 6,#u)EhcKɶ^W}&=FϝETW'"zl{j̢#!/:ȆӉhu8DDD ODD .""%&ȱH_MDD W"s{MD.$"ݍǸEDD"""bpEDD"""EDD .""k!DRBHODDa%2Kq""7l~ O VrG ö-8P[vp6Þްvpiu[&m '&?._v@oO^p^86dPCۖ ".H])KW`k] O։k=*D@s>\Z 6B !m#FCXo˯"zb>(2?ܮyڃ"qXݰ|h#q>Sq8lE~%;s멹>S:@O5ru:>=3>,Ν$S5KAny3gHmGp_S0b \rԗ)DGQX# OQe66W6vi(B`D *7wgﶀ@Ib(o =ҽl_Z^° v"lն,S@=;O+۪i6㑁Ԗ`ka}ʠ4 KB n2Uh?CMFpZ[WHfl%85ӆ> \TTRJ?ĭ3/)R0ƣ_F_""ಋ eͨc c}rR‘򕼩o&ONbl,-ۯ}}p7@t<;YMNGRYDD4U% ,ˬ )B! s 4ʒW9Ws ,_1E0[nXFR?Oc+#}$>=@X I[~^MXMBfGzŻSG>fQ[̢#@O#0 ~+@>~E88`0hqEDD+F\>.""+ .""bp1\DD"""bp1EDD"""bpkxuY3DDZOn?"k^'FDDDqEDD""~`uX7*VW?(0Y)-h! GFֻ.k`sssV+h;nc묈̞izV=`H Nu܅$Ck}}.$z, \]4G1$F"_e]FA ?-` {/i$,N[`I Y +!*mo,W6/PصBO*l8']Cv3͙17-~#. (F^ ) " H)!\(^RUx?j s:n)~-`u5mj8&`6@7] bP ǁ(ԛC{5zl(  @ >b=5x{T;.^иs<`v_~Hg;!tX/tT4M\^?# byǝp ;.a'D@d p^xpC5tv4Ws%B)%TU2~"P[>CPC[ .:i{JWnKEvn-W DiΎ 2SZU^r 3pJ8MJy9+K#Niɺt/vaqe%,* m>QS .=75{\[jhH<46l[_;RWR^(4kˮV6 J;* > .E`v''Cn!XXm}YWuu#1J=N0]jJǧpEWUuJfY)gZ-{C3s@VUU1YO^ZmgY_:z[;\Fۣ0 r."Қa20mNwZ!D{Ui^Za a,ǼQarhLe`&>#y!~ib,׻g_0M·in\UK{iNDF[7}=F]+אls Vrc33mg;~?TN1 j%NrNQSUQWuh, WBoH|@D " ԑO JgY8)hBk4"c? m O!J'GG2R .=\6ڃ<&1, 0Zڃe":-1c0|tc,Tm#]Q Fvyҙ6f`0&NLZ-YGSҶGU'+a(2w3xl!,gVWl{YC gR:|lӟ'z{/۴(. #T[;E^/V̍ Zo c,RWl7X_aYWs<Cixd@U ~-4i-YzI;_dۃ_vDiۭ\FGFkaX^B~5~]V?2;CRg@Xp+{{Y$'!]5zk0~3eKw @?zjAyvTz9m;lZͶ,ׄVQ\ƣGƎ6{~߱H]N+Z=6rxQ?PE9?fk?LG" 6}lS|FvycaA)OO1`waoF}'V]fߑQ~,&?fGD2ۭ秪Vv~,"~"/l|b"ZBb˲OOaFa u \fǹ]ltSD91/}߫Y93ٟ^=ȱsGECH^NH^UU(?D>sH^Jm$>JԼ߫N|6ԗ)̞E(BBvV .6,};7UX^ڡELMN#FDAc0sXUoO#93!Ԗ #z8UHǝ@PU!B;ͻo^w&I\D}^J@PXl7EDD"""EDD}ȿr]Ta3.$$s^1 rY˲K_%o55U7^(?di%]JV""W4ڒM.XG-+$#%`^@%_H0 c4T#""z}h*$""?d7?*.9::&=>l+}Qyy:}1|mWiފqbsa:TO wu ieo%a}'\K1|T*ݓrs3O2;*TDѶ5TᷜiC~79JwjZT+MƷ8aDt8##}=_\>i[ 1u#iSϕIerxVH0ޟ9pRfRGkFF:t,+KDo +jezk֪IY=fvf4zY&JT\hՈV;bك희%?VpR  2:e\$Uwĵ3XoxQӵFRV->z7'% *#{:Z3c;,0:СC^~A^=3 ];.S+ND[b喷A@~ wNj'Q% @p[uG0Vl q<Vkx=ŪJeVRÙ뺮-d؟S7Q29k+Hxc%8^sϲRT"-fPRe+p6ʟ Y,0ܵ#񮍛0=dmkjb#:[taYfu\\$$bȺwK6nh֭cƌ0`Ovl($׿bꄛ?t_Bs{1_z+X؆GG^FV' ’rg ǨI k`I A5CTXR^Q)ԓ©F"kf } ͜һ`x8$DRD.*lT"R8J eҤTZ_iFTY]i`yLYl`k8%a֒n2"Zْ&-VD|CZߪU+{}3f̘ /HK7u'sz1C" iÌ1߿Ot7 e}C7}9 KY>)౻U\ֺEcAKra$9eVqLhB.%;wUi#G" 9Qf*3ܮIXb֡kp6r6=guaUF9ln.㉿ɤR 5H0 >yޠ3XVqvs1ɉU+Z U5.D2iZ񼝵\ Y'r3ӷrmۖ׺ku]pjݲ 1~R Tۉ,nwojZF&4`޹-T_$NNNvvN G&}{=ϴkF::Ԩkd'qvvwt&W)WG $3n6OR""8㥸<~Ew8HRN0<^ ;N&:ٝto.oȞl9i#w>ojRd22+O419WmʪS_Yx{NxIᯎ܉ڵkŹriX ŋ/_mrM#{V=~SNU}2+ۍbcc;S64n <88̰+/WGqd0 *""U]7IիSvaki]*΃Z|U 7'UFJ$ ͢zI#U֮lS]-\Bck]^vZ Pgz)CzQ&b+U]GG|YAf6ڸ䁋o6o?is]{K! 2hڹryVo'm-OZuS<mͻrh s堷f_ޮ0T݆2v5$:0z@Uq+H$byĐD"a *Z9EWU2V0 C$T ťw8IubMigG[X;i_&ƶ١Sy]۴Rޠ6wu,.4p wx$ qmK$xaJ!J;j3M:i WW;ǗظtۜxɴZ5g KkK ƭ6L~$ywY_OŢamW `݆P$Qkk ϑK*ꊓ{N֤3>d|B&ed}}ЖqzUr{WS3ƙȪk s3Y+N1eVce R5@sH OkNJJ XYYz$f'$$<_++an޼988XX^vcDŽJJJU*8-^t\.OJJ\r;v$,BѬYctB=zƌYbcc###̙#~zNNNBBBhhM6=z(M81::lQQQ` 5{nhS) È-'HӦM^ʲ,q׮])JՕ,..vvv6^``YVeYޥ<;) Șvf<*,,,d²T* Xu%l]PPzӧOgggc7Nd2T4%%%WTjZyg@#""ك H-!!aB:thNN^_n]Ϟ=-4rϒÆ [jv0<xpp͛CCCu:L&KHHA7n܁ڵko{ܰaCXXXQQٳ sVwqqIII1 _&&.߳dHHHHH|r07}dObM~Fdžm[6hfF[&ED b+>ˤ$\.ɼ333wzꕟoTVVBh֬뉨]v.]"K.yzzb7?!˖1|(ڽSx?jk^ع[oF BCCjuLLLxxOKKy櫯T8qbtttYYŋhĈ{%~Ȑ!͏Ōݻu]Ν:B.8mƮ\ ztEl>[>"'6kWV~ p{vDG fb|a᥸PIɪ 8ٳX?xgڶm+ښ``YÇϝ; 2eJ@@ V.u=߭o1v7nޭo_,tΏࢳgWTAAAnnn'O-Z ";;"*n۶ѣŋ?޷o_bEws/pk>6$Ljo /.,,tss+--mҤIaÆEDD1~]%dFe˖`!"ɒ*++.\(Jo@GJiii ," -Zh߾X,((;uzH\<`|.xyڴiӦM3,^C!,ڵ {0${Ϳ?4$T$lZ2Zaۚ݃].Gr6W ePKdSN?cn̉~Fu=Zڳ7&w+X].xuC*l8!aC|v;+((]w.dWfϞkd^o& uo3ac"&?{7ͪ!u?R#ROrb.|jp@†'pWz4].iVlFm;99 ??EE&픖OzC'G W'{w}1m5ߤ3qո٭jkK| =z+%uo1aF* ySu{ f7u}&0hDur{S lmm,x~߇v0i۾O贻w;~|^G{W-!CGvMqOn.??''BRYPgޝ2}% $!>FQqqذ|^oj8٭U a(? q+;e1svĤ3GGO]$V,]IENz}irFb}2kFYcBGb\laAǎ[T:+Ɇ=n{jvS:;7vu^<_VV."OxS&mټ˫tF9/7_ FP9:8X[ZZ*5[[[x 1Eovp?"*0Æ'V7Ws>]\\L8::^8F8׹FUTT ~!Pc*ˏf7aKufu53'SgFjaJMN8:gIo>6]:wgKζr]GGG;w>`YҁԴ,ZE?rV%lfM {~}u}~ӿ/0^hF9tAL wm ߳7Yծ،y1,^[e ^J%%% FLlBƄ5 0dxr,::9ӾOI3&D|9:SR[SRRO:=`PIu@`H>K>[|zL!s[E߾#Iծ^UYœl0L||bޏ|bDPKj;쥋?6}fzx?0f5a۳fF-^թƯ7/\0_FM^}j6qcnjVYfv ӷojoO{?>᯿aXE2nU{/wL?1wO:m|'Nt3rmo&#zf[;u鞒6wZ 4p%N޺ՍӦ@}5k*^WQ+h޳['Z:gs0cx䔇٨QxH$۷oYR<@.o١1'xؤ'iA]M^}={m޴WAD:fc䡝pTB;wdddZ*==|WX6~~~ œ ìYqƮ;vHKKk޼\.OJJ dee(f͚_l_tqP?Exo.ݓv}x-LU{<99׷y=zHNNgD5f̘ਨ(Lvvv^^ի͛+Fa(%%eر2lܸq111#G~w삃;;wn ",,6nkkk Pr˅j}&OLDjdbm^(o|=+  ^ٖnqU]jf&9&s^xA<~޽{TfߦT*ƿ|<00={X(V]O ̸m۶EFF/'Mm۶Çd$ J۷o7j( `޽FJLL2dH 7)77/lݺٳ)Fq$ 0'{VѧkB9rdݺubdԨQsjµ]/ rwwW˖- 0aB~6o\mذ!,,8amkj޽n'6I`POfnZ׿Æǫ|>6%$l$lx.'fPGx?.O$$l.''<$A†ljay,w@+++J%HJJ2;33`СW\9N6&6::&,KI1{<̟?p~#CuSx+11eYR)>VY#FذaFYhN@¾3gDDDX[[+ʥKn߾]_tSNJR o޼ytQlllttʕ++ݵk(Є*Oa/޽I&hA }fڰaÅ RiAA5kVDDĞ={O.6{ gZZ͛7_}z999ƒ>GN 5k.ᱰ...)))Zٳ^^^»999ATy {xt...NNN>>>U;#/4 WԩSO:%<8~x???kb^9w\kkc~Vckk鄈Ga07kՄ JݦMK AxJXCDW*W&5kּkgϞ%WlEDdgg'۫nE&@Mja5Oz=V*•SLtwpp(--I DTZZڤIZGx嗗/__YYtҗ^zIm߾ȑ#[XdFٲexnWϚ| یO>?СCF6l ŋ6,..r iii ,"5zK>moo~:f %iӦM6͸]LYTmܸQ|зirꨧ}Q j^۽?Qku7 6v6V;6)gkm% /;?VlU?!`;qb1>.b"Cx_feQ=5;fHI/zJf~FDTrt.MbwY7;HTgc(z0Ud4|.T`gòO7^G;&lY:mx ;mw^mU'g(/Rش[X8C.W˸89Lzɺ3_Y-{u|}e#gr_yXb k&mGO䇫&ID!==4Z#)ٛs5"* EDr[u+.Tv쾪cQ$f42av HIS ӲEw}ݍ0_ #ee_AGFC†ev֥fzsk\_I|AVwt.+Թvm߲'M Zeef>}A>wlq+"=^ɦuǾ7eԣiWo+6oՂG{S0بn hbm+fzG7UuCMʧ/ݐ_tCaqջ{NVߚ|簡K;(, **mK+ CVj"rݵj2a&,]4sҨyo Vlʻzm蝹DT:Ml+*M7GS{kgZb^VM( Dtx~>g;l̪[u;w_ձQ(DŽWz{.4{=qo<}';wDT\V'0a%d;v/2 s7Ey*PKB};.:wWçsωk7plr2Oyoyu֧Bu\leU>\XY I:'_zf_+G>3":W7;Q> 1pkƝjPf9x,7u_Rd3<~Hy+++#""&M0`g?vCZ Nmޙ~^)6oNXPҏDŽ/7i$H^5B#ϝܻ[++~>8B'ODҫk_~ۦ7pmr?o~ϷkoN>xGnOl=kWv!"_]U7;w=GQu-~?:،{!٦l=sqo+Of8˾k999M _z%WWו+WAㅥKzxx$!$e2wff&Eٲ`=ƅ߮} }bƇș'WoYh$۽aA/}0BpCzw̞Ϸ[A]Wo؍; f)ƅ ~xfsɭO?כ6bߙL^Ņfy=QTCUqo<1ԃMf󒩅%esӌY{=ur3GNyx[VZ;vq@/MJ2 .\055544T\.ؽ{wTTT^^ޓ.o!Z]0ZX=oS{c5 bobDٗT2G|f1GSGG똍v 3cBѵkuդJrrrvvܹs>h+&&688X >}zzzU-}7 u}3/t.ycŦ=}5Ok87.DDM65[XTDCCCryFFF׮] Pͯ@;좢"qQF*J5ꚞRVXZ(dʅ #FlذA,Zxyy%&&,T*s?#ڢEۋ?xM4𰳫֮]P(BCC0,簫;-ƃ˼(""BXpqqt7nnb\ŸMq׷o!*3xJOoY&LP*vvv6m2{8f؏ߦM_ u a6Sao~̰  vՠUoG q3l Hw}c-[y/r++O÷BopfoݼcV1ig[OD#G~uF ӲjnpwoѴYk׮$nC.Fcwo <`ۛTtQ W FGPv#q5VM޷S*jo7`c?l^*vf9xNNMÆ\_\>^R""bϞ=b5==]RX"((H*JV+4-@®m۶EFF/'MdZq"6lߪUĠWbb"˲JH:4''Gׯ[gϞJ aߛV=rHpp5j?jްaCXXX֭[n-׮]P(BCC`lllttʕ++ %~n\.|qJ"L",O:UX1i%%%$h$f H HH HH؏OΝjժΝ;cv'QiiҥK =x effCgee(f͚_^^tSNJrΝBa tؑP(,>F3))I.d2ooL @~zJOO'^z'FGG-^8**JΚ5+""bϞ=ӧOK6mѣD5f̘`Jhhh\\Z ǀ$ѻwo ܹsGV(aaa%%%BǏ)5j;V&7n߾}»}IMM0}]v…?K.b`m۶%%%&-b{{{"ǫT 77'Ob@`wѢE/T*ぁ< ŠCiiiuM)J"*//wqq*jŊAAAzuVD;l0???}m߾ȑ#U ػw^OLL2d8OLLdYVTnػwoVk7lVTT4{l1dɒ#F|7UYlYhh yf!vcJ҄ @¾o<QϞ=1BD!!!!!!ԩS:\tj ƍ8pd999P֤H H H ^5)0U<3 c|Q$I&B 8ff͚57vuuݱcGZZZryRRP$00_R,XбcG"JJJ2;33kEvvv^^ի͛*;k֬9s戵6mzQ" S111 ]+bbbG;t:ݻwkN&ܹS5j(;;;"ӧOjjjFFF@@o IDAT@^^F a WWW"bYM-,,d H[nqggga!>>^R[llq8Ю]֮]>vXTH~-.Xh7''?ܚ   )KUe\5l ߿B1x`ɘf>hD$e2wff& aז1cTTTGEEY /^|e˖Qhhh\\Z  $OII;vL&7nܾ},h[l믅铚AH71^\\looODoA":qDqq[**((ɓ][Jeee%Xі-[fΜ9gᥫkzzJZbEPP aז{!CX |͓'O>}YU*UM@~d-[zj;;;v,_BPlll3hڵ111 "444!!?>oIkHƍ8`٠X%00000|}}srr3l@@$l@@$l@@$l$'''`0{'NXhk vڷoߪU41ڭ[7~ M>> Yfׯ ,رtlI":}W LXRRheeR`RR\.dޙ1//ÇKJJ4##c̘1'N.++[xqTTXiӦG5^]'N1c̙3M8k֬9sи8ZH"ǎOD[l=zsFP(„\.5jqJXYY/99dwn׮L& ޹sӧOjjjFFF@@@^^F a믉hÆ 'O&mָIJ6mT6P\\lRP&1 #Joݺ%U*UPPɓ'1b T֭;{{{!<gu+/ZnܸIRjyy^ AWWtJbŊ @67x뭷|MennaVZebu%OVSSSGiReС999z~ݺu={^^^,*ʢ"@6cȑ-Z Znݺuk+f͚~ .4mccrʯJ]6&&FP&$$`ccY3!!!!!!ԩS^JB⒒b&0$l$l@@$l@@$l@@¾O;w6~ǪU:w,,3 틍<҄'QiiҥK3a(33GU'IIIr\&y{{gff K.uITܹSZYYTVP(5k~zq]K.III߿B{3ߙR1oٵkWFuwƯZo:u!C\.g}L>{YfMrr_~yG /T*\3~s޼yz>TpL2 :Ǡ3Mt. ll@`>/Bs][?WMց=nmjũoիL !rrrzt:?YfiiiBd!۷ooZׯG{ӦMꪫ,˿oíZտv7M ZdM7ԠAoqɒ%zs=w=dffn۶Mo0`++WoϞ=:uBdee;wܳgOeĔy]%;;l6돍Fc̛@[!/_ޡC7ڵ{'$$n=D9-K&Oܹsg ߿i%22L~MeY˿)B̟?>=z>V|Ȑ!_~.ll$I.Pm7e6BҘ7-ب.Mab6   ll@`66  l@`@`6   lpL\f-)ő$ȡ}ԁu{Q%qYO.ԺUuʮ{T:y%@   lJٲes.%%%kRצ1MQcǎo'yINNƎv\۷t}gj$F &u,iݟ~:HQʂxHS׽*)!<ҴvWU\r?^wXi'~gF͔~"2ABv'][m6:ٸh;vt?\QBMh}gϞ͚GDDTfs -tߠ_-:6_qdq]a4M4EQ<>'dO=.n$l4QQuGŅ<$dЄzKCoIK;Z֫7{O朔$I`p8#퐼`ٷ^ M`#G mۏzBz&3sofs=1hgmK}ǫ#r\OgFxEŊ\n9PUl6iuf`1hFc [=h7;xoo|KӴW?ak^^ެGa3^|̸͚X!DNNcӎڿ(}g~r⥇џb~a΃{|3z4Mh&˲dJZqҟ|WXLb֤ݾ;WUMܾO|æEؤy,f}TƧ=z#"tfk{u ]fuO1m `λ6-x|Nf}8 MS5MIF!IBhBmw 3g}-;vhB6m[gz?/L̜vp~z[l+/dffݾ}*j~ :og6d$+fw02g #crs).4L>4Ϸ&u%K_BpgZs`BB{Z56O$_{>}kq(j `BwVHznذwqqqEEE#/F+ݣ[ϛ:]>.+'6QOkYV@sȯapqݝ犋-,,-bvM"IjX,aac (S f7 嫗|ͯǏl٢by#\.OGӴo;&2b2 !QNl4bbbLWWuםc{ӧEKf N5^o <<$SiMJ[E^.ڻPD^B݋{s>0ЄݺuY&.YG_b4].WtttHǶA2hȊ"+YTE?QS!IA|BqόڨQÓ'OM6㹉*)fyIFp4_q㤤(b](QFׯVc_駟cVKM4N5^@bcSm{]P.(.((*/t\܂ܜ|W^AFFfvvA/KWnlظi3O-?;/jզ+_x~bѭs^5Şi9p=]E~2u]vm"{}`ȐA۷+z kV$$l*mzղOV !fG{poDma[,psYVTUg&TMQoȲ,˲r1!ڔ`!ܥr?Cll-JdoՌjYe%4 ! T$ngrJv>a 8Vw+"2lv;vff&4MTMU5EQdY dYVм_NNa}5jXz_NHvΊŋ @J.Z᷸WFȓ$閛}\g668<<3@؆⼞z򱿽8IUtܵk;vV}MhS'>::% %I*?8*$QC~c|^n/3 PצLzeYQr(f.:Fc26jpvUU,hN3<<\/ov>$FSg#:0 jI  X"uF`ݣz r k٤YKpcݣz5"~p{#գz!ZˊAg :CQ%;;\3H$htF9N*x\y|2թ6MQϗP''kݪUDD:ʹ\Y};GeذaVJ~wH-KERh&YӴVm$yfF^,;~v \u%|Iܹ_|@}lX`0ũBH&ˁ<''<o4P)hlѲE7EDD%&)BN:sLvl|tffVq#\JzucOȸ) W^ 1PUM!/\1᯦b>0}5.*˲,Bnw#c𒥋_~(.?ֽ m<ҎWi1I.IDAT`ۗ/]*)..޿@|&E6k戌xcLz@ :&J5ɓHG"0f|_>iV  !T)Bn԰ OMxy{'٢J{VeMh!TOMY oҬuKtAK^H`tPNh=5M Mh1۶m5VM{2/l Ιv4ꓓq-ߠl[עr%re^\XT].wddJ+Wk3^3 (&Tsxdʐv{n_i5lfY&tHS4!$! EAhB ֪k_50Աjqq]v݅nvMy}Uο5mֺ*w\u2K(x3N8޽?fd*؟vݻvʗ֯ofL}j8iA{GZ^v䨇23Z:dB4 xJJJ֮]:٦%Su1"**n! IhRG~dByzY/YuoNN>[NN?"庑>\~ )IR:.v#eӅmsL3M7u<3xvן8~w 3Y~jV괎 UQ%IYEjׁqolТןp{vطoɥkՉ_͗!BZBdjޭM[lllB_kK23V,[4kk'?1 u$$$$ԭpQC}_Wҍb'ڰA2g6mR޸6uݭbZ^:ݻoMwgUt#g~ur?q&3'+hժ ]~TqAuXI&_+WS:iU5 w^|)-=صkߟ{CݻWUUY N5I:Q;o8Ilުw4V4xЀ5~~}CyMӾ;~z`tfÆwMuק[.޺mn|6t餿'S?p !V"}$4!Z?ky{ O>lDJJ]vZ2i+„:^IVf f[mǎfeg ͛_-f2M 幮iZ\,fj$ሯ[w붟vp8h&$"ˊR. ״O[_>%R^]!DXXuvwAAAxx"<<?ef[!T@ -d[vkxxxXUUDʲ\\\l,K8b%~4\pjN4!T*w_E{;+S\hj뙜,?Jױݺvvk8F=@bcc>ln% `0lք:Ç K.Jhyℒk{G4ivCו֧IKڶ./Yb&$i,͚5Qh0HI񊦪j=SDQQqIGi34:n9/+&J]$Vk\\ܸǼnBf|Y-_ lYYgo6g{BΎ޽ִh4ǙӧsdYvr$LQ!SZ$a0 4%bv[LhhYHה@LfstLLl|,*r*E{UMT*'#Zl91jr5\ />^%MӤO47- 4mR"op?d Ț獏1 %%c2ԩlEQ{vlf yk7Vd?^9fKlٰG"$SRv<ЫXa~ߤqc2|m5U<6B[ӦM222^_U.pD$&^Z7vm=l~"cms׏!YӴīī##l1%1'~Xxvll@`@`@((q])~/_ִy> 4켸MK;zK#QKQP5׶9!Po\rUr6״h=h۶m+Uǿ{ )=^^#h߱O>Sz?@`xw~a1So|j̸;|g1WbN|o,3{~#G*o^fjViҤd׷UmذiݺvY ]f~}J]?;l6y ?Oe <5-Z7m۸qI+Pc;ً ^g7+'[2 i۶{ >mذᴩ}ѣv6a3SNΓb٢Y3_{j8eׇL<-wnkߘYEsΜ׏[vEeyG׮]O{u3|<%K͚h ݃VU~7ؘ '-[bXXP?v_>,M? 2ۮa5M46L^juO"wQunKwˠ[wٱSqubpdf׺\QQؘ]}vS&"7v;&oـUGgr3Fko^r__'=zW7\˗رcg^=I;(7,sj֧2Ψ>k+'+oOeؾ =ï>ś@`o1чGf!byM|@ pXv@uI O/8p@~>Ĭi,oIm&_bccG=x{'MqϺ2q¸G{ڌ)zsώz-[5i7WâeS;uݩ̖ ̃dܽc.G"iS'#ii͚61cJ˖-ϖxۆW_\?V`SE Pf-z`/38֥%wVK]51S4Mz}*gwݩOF5U;s:k_N457ǥ+d3MP (6+l٤jښ FCIZKqT-u%952 l@M`8Y"@ Uk$Q$*'b6   ll@`65"!ƣLF MV2-[i7!BQQ. AhP5BF.zf r hEՂ=賁] 0*BV4pɊ&BQ5}+zk~YHf d !D@Mqih'IENDB`kildclient-3.0.0/doc/C/images/we_advanced.png0000644000175000017500000012343711715730227015736 00000000000000PNG  IHDRIwsRGBbKGD pHYsktIME 4.tEXtCommentCreated with GIMPW IDATxyXT03( `iZV,CZ* J.(R".կq L̥0dH#5Ape889R~93ssxס?JB!Ғ= m0@Pq{ /WFS>`*hkxt6kJǛGy\Z80L?Q= 髨Q۠h!Dgmg3& qͱlڶC%MkqFA)e)!Y5RX&<.鐴\Nĉ5>B]F/W_cUV2iy}-ghYq\ѹFJ&Jț#Y p!K%ŸQTe[`.!f00-w^4 X~RZ۠o9?yzr,ǰAY}zRx_:#S6c1OrKq%-&jj&ФZs2Ɯ~JG`8`g U/{i ҋϣoG!Z.>jjj  6F,ܼ$5uacng-ge-G3lŘQ%1xָY$MܶZg^LrŐJdxPSS@_[,C*AV]YbH&<MT,ЩËŕf„  H#.c(k*|ρOWPPlr>b*CA $BKro9C]II.""e=T%<"VQzSy}j51=o9JmHǶ.L[n[ɤDUU$QUU dֽ;nݺLںYCReeUL̪fɱ&.;C*ᅦbbco I 2DN+*Vz-ÆH$BVV&歛?p5mߑNdCcY/Zɮ_M$CSgo.5l1ߚfM5$z%Ժ$M r(16V#٬5f%%%SSʊJH%RʊJa`ffgKJJ`em2T677Wi>aETIb ̞S&/z~>yzb޼yxظaۇΝ;ݱbGB߿k2`uvuuCff ;+8pqqō70vJŭ7{ꉸXxz{l)(,𷇣_^9$-%An/Jtu,o^%.Gr Vm_7 ۶mC^^B!N$ǻ>>*j-_wyW sK  |ɬr|'g'={sӧ0ʂ3"EBD2zn޺ɸ{HnxwjhakTqQpSp;O<Ɛ0 !}Q6!}5,XF$C]Y]Vl25aX'_uURwK(oKYס%וM&#Uײ*J2>K4Y6b8-1NTFcyvG1苮F}GMM5**IR bc1c ݇T*Ç6֯T*AUU%x|>**Zm?UŖJ%سGD;#ߦ*vS>T_c -- m[}̓°fHRy-).VQd5Ieu۲20y7n@^n.&O+WݻPUU;"33 Aӂ|!23Yu1㔕ɓ#OwGa{:_Ҭ+YYv3Jm-YOn$*ku1uqĦ,a'eSF \ʲw,^bP^@n-udՐJedsBQTTᨪիTWWC"B&VQ-V}Xn= ???A|aʱ2y|X,FUe:;׿?0(-)a*xoxx`xoDbAv-Bꍼ;0}Cr lKl***0@}q⋨a0 pssCtM׶Wlmle"^sXVa襣tRF/8-P׹QMIdfH'd=*3$?t.˱oHY#76diW+츺Q{^VQw1TQ~>v ml1qIeOx|IUx<ܤF)6?ً{_C;[[8xBSrlY\MU$UUXH:qyyy>BUeN}К?zjt20ۥ+| >t;TظXYXX֭[툃77wT{; JcUČ(A{ Ip:I6I}\%\%ˆ&`i>fmټz&FK MnqRy =O|շG羳fff(--e(w;w]$žpMܿ55().rUߟ4 u[nB"mO6vSRՇm۷#+; 38x ڵku޽{Jɱ#CC`#1H$6ᆵ⵮Yww^J:WDpvvj@1|RYENθ>E"p Xs^Ù Zg?#odNCƚ:b&ɍ9Sye]AH8f{=c\X.͜IZƇ3̆U$\3=L|>lllp 07{2{\v_C܎YXR6333d;lllNcgU(,ǒJ$}\y;;[ꃻ$Ie% >|^>>:7$]ʹݻ?.\@Nٲ{[پ][G7xniχM6011Aee%,,,9x<^euql۵CiI jjj`bbvC,E>kd2<(/XbUJW0j1摦O n766ܺ,ʲj!y6 ׯQb 4v,}(ahYC*kdHRDW1LuT^^\dRt>P5n޾ s3s666bWWX635C^n,3xTwpN JSRR3(%`aVH1nx|cڴiúC:?2_=fFi$F,5!kb.TG;vK/ ^Z, Ѷ-BZ].‚u˗/ݺ9L./XA`bҠ%EYA$''ť6&L{iii7nP3wieӠVMt'黄'Nii!'InM}6~rp:^ux Y1.eKcp \ܐJq8XUJ G cǎxwoB<(6mѶ];شEYC:|fݻ7:v@:v^@]8xLXn,ڭ42r/Yb i[l7a^ڭU&ȍvz̸4Sj̶s>ĸ㸾̂U .f`>Su@GGGXYY}(++9///<ۡڶiS*$vy9#07cN3vc&\AcX [[[RKXZZ7Nb?y؍>n48%ZoFe|O9eGͲ⨈9/[KR y.Ԯd66ȬUdΞS͢ngg|ƫ˥e3MО渌But/VWk nY^u]گs\5YQ~W8\PnNx..u>Xy;6D$~=z)W 5WI?kCBEoNcbL sG!BHKbee !B!B!B1!B!B!B1!B!B!š;B!Ҳ)4sL!BcthB!jLXW'=AI׏B!F`HA4Ĉ1(,ȧ Bӑ%0pbB!4:!B!J !BB!J !B y yB!yJ#UX"Biaer3c۶(**Ɔ 0ed>N!B1rr:\8(hv3Fš5Ζ#8;v ߿/fookѿ?88tDBBr| <>|CFl۶AAXsttDbq@hlC~~-ZO?]BG!BH T\Ns/ٳ'B!G* _KKKC*.+++xaff@b:b!BZ0Ȣby\;vڪ\6m-BLL,._?h!Bi̱P(TZ' Ԟ' EE(**e[rƍĉk.:Z!B(9n|۶mnj +!//2 ;wСCX֥\nn. gغu+-B!-\\Vo݌iJ ضmIzӧѣGl.yեܺu1}z0JKK6B!7$]ϗ0kۊ VOzS0tg=½‚|ty+ i0!b4j_O*!Bi B!B1!B!:B!R?АdS粳?!BZJIT?DB!9&@팲YeL ^^W_}LFF!P4sL[nĒ%K  tR`ƌ48BH D3ǤU)V5[ȑ[{{ypc4BH 0sL 5EEE_??s !b0cBH}ڵCQQRN !q"==FC /''|<Bi891|Qv6|}}>}^F||<ׯ͕"B!(ɱH$2J,JUn UV;Ghh~K! `4/T#4t6!?-Ƨ. : 'N!BXyڴi1TTT"HMM077G@$%%qt~m!00bqr<Ǐ'~|}!BX7ؾ};< vb(-c„ի':uX[[Te"|W2e2\],prrիWq=\pnnntB!Pr[bIy  UnÇ_+WaqړϪ1n8x۷o0;vm4$*߿Æ S#77@lݺUiСC;GK*!BZF)6HF:NJܹ֬s!|~$=zAq&1֭[ӃQZZyJ\] Ji1!BH yrl @v0VOg7$$!!!c1#F0!$KC!B%DŽB!PrL!͑D"A J y: prjPܦ\s @MA-N2l˫kl`S>Ska@@8::Ν,vSۄOȣa#;+K繒 ggf1Wѵ=\\XqX0i$Lغu+HrL3DŽp@lqYYffFyy2deeIOѳg88tDBBbFD11ѫWOGɓ'ѧ b#ƎlY}i/y*ԟ]6kc~u5j$v};wTvuxxн{7;vLk{5ԕMشOcE w 'K.6 ?́233pz|o>D!%DŽѺu1w\`ȑشum?x%Gmێi#"bv IDATĈ(,Ç#"bR+Wr;k_… 8w.AHDD,Caa!{}|*mѴ_ ҥX,:aa_EO{!#Lj9_:˗G" ` \Ņ EF.L?’%۫m\Tnf_]f5OcEm۶t,nhxx???:u  ~WuttDbq PrLHzcMNB׮]!~M:%*_~BCCaaaHRIII5j4B!4H:6l._`XYY5s/ٳ'B!Gll޼wƆ Og߆!YCxXZZ*Uh_$9fff?Ҷ ;...bKqQm5ǚڧﱢNEEyBʓ}}zjj*f̘yr$9}B AkD")Dg-pqqu?rлwoc]v*--- *Mkkkqѱcuq}q"K8ڲmS\\,O:tuTUXE[,UҴXS=V177L&@ T*E}<<<0o^$*زe+^}?ʐy۷oۦM`!4+rg,+N13g,;{Vyֶ*** #m?bll޼saժƍ'b׮]QU:< ɭ"6C>csөS'/2bbbkM6۷/֮+KKKp 4䘩u^k[H$B~uȪqAL:UDHROի~~~˅L&Ν;1tmQɓ'#''G~Vnn. gغuAflׯСðgH$U^m@>|?m|>uzi!NJ~& !Xr`F)9n4noob(**RV? 1y"wc''K]K1ҥ =WH|gxefDEQuO"##""@Iӧc@gt͠Ud8~wJۖ.]58qʓَ6F߾}U>CI&#>~u{ٳTAPZoL!oILusTM'=A`0loo'__goo3gbEHNNFP4ϿmK… A U15CjBW䷺E!w2 t077G@|Wt4kҘ4U&!Br|g4ݩS'ug[+J`ZPLi}ZΚ.++ó>qB!B4yk!Ta6lyPTTT *jR3 !BQ=zAq[*ʪTsj'#B!? $$A U-`)Y+UB!BѬ1!Ҕ1xtV5!B1D؄B!J !BB!-1|ɩI?ad!jin.>ijBZ6Z> *JvZ,"?et…|*͝WybB(9&R]t+wvnnnܹ3Jb !!!rgͨݸyRR_x\֐!8|RqWW$''kGYYffFyyֺF[nnݺZcbנ͊$''...7~_82L&Â>S*ϦmP*cj\ 3 ܇+66Qk4EzWS|6O]w޽󃟟NLFFF2Am!cBa!`^à쇴T zmα׭[QF#juV^->b2L<)N!dfVG)'M%%%ؿos|p!zcܹHKMȑ#i&u8s 35VDYżH8rDc?Y-XӧO#(hE,cM?_CII_nϞaNL]N>^yW67Lc[m6ڭ=_Cᓅ ef\~qti !B֘4L6 &O5ڵo 4c< W_폃ȟ߷w/|}}`jj a(++S*4-L&ZϩSڵ+|oiK၌g1sX|077fq 2!˜miix055ŴiS508pvvBJJ} yv#\-önm KKKxyyk?~,U%DWthBH1rH\ #! VVVKKK9nYy9ڴiy{õkWqJ^h""kk#""R׮^C~Ҥm۶ZYr|1 uVRoN_i),,,vvcm(W,z]t ()ój~\sۭ=ؖCgBޮEGi<Ʀ *++>D[5_ k볲ƒ}*ﻦXmm[ )cn\|^r @"]*1Zb&O7jWz㎋D[{ʹsBTӲ EE4R"w7B&D˷ $''111jcz9991ry_~*!?:d8p Lʪ.lٲk@8>mS'T*A\\ƘQk!Hpxyy+ `4r\իgkm<ؾ1B GGFII|[II Fx={͛f5mkѿ?88tDBBӼyo>x1ɿ¼N:l^Ym9sBy /],ƨQХsg5Dؽ;K/aUH333UСtjK`˖-pss' ?笟fϚt 1O> w>̞5K>^|>aaMZno=lqЄpB";7ܟTWW*x k1憆Ά3Ə;vm}EvhڦXfΜ !99AA?jAUX./tEaA> !1 !\&s7sQFC(" ` ˷?ޫ=z썶m/%nK B! !O.9.-- K3>YVq=:tP*i[}ug֧K B![4Prl|PQQ(//Gvڷo/?޽{J4mcB!c 11R?|}}ۆ]~@UUԻ}mlqB%GG #Bɱ< 2r9bccХK=z˗Yx1K/{N~am"!Rۿ03li7n\0nxdffq^W`{ c<4]R}8tR)vލ^{6׭_vVS&iz\|"#t)^udffbEظaz;ƂEZ HHLt ]tƏ?FTV۸OiF۷ors`rrr7oݒ߸C\ 3 ʟ/++Pc(//WYŋx憷 Ç귧 BBB6 {pd2222֐!pquErrֶnܼwS))ktM`X]J4#Y[m۷#@GSR3f OO8p1P"~Xh.co5#OLL_* WW` 8<}Kq&\7G$k׮q|D"=wp.3?K>}nz޳g/~ع>k׭?nz̝;i)9r$6mڤ|IJe2y*RNB~>CZݿ쇴T zm_Cᓅ ef\~gMN~}֭[QF#juV^w<HOO>6nG=^;4wII נuxYi|4\~5'pXc_1lV}e mcEyyWp'  piMòeF8G&:8{, 33 &Gf9yrrap0LMM섔TRNk׮o{SSSCYYmHKK[o@!C %%Mi`XZZ W]`iaoood2r6t(^}?8w,OOO*"RT1fff0Hi }V:IS̴t`b4v?./+C6mkogM}en&|P{uq 2!1F(9fh4!-V\ T\ZÇƊjO(WHb1\\\?݁>{õkWqJ^m(++ liiJ.xKKKRV^ q'V߾ %%%e✎buƝxj#r:ISLqi),'NmQ^^t G]ƘkR\ >aaaغe+^z7}1J h@!-w{/zB܎8S+WO>H$h׾Dǎ@cvΜxc xgfLw@֛%Tdc077ÇѶ^Xm[YYYUX&&&pws÷_~ )[[?NKJJC ԡ>iN>^b /w -=ϥbW6cu ek۶nD"Aѣ6C- /8p wDC"̙3?/j8pS3|x<Я_?q6@dTVV"&&Fiϗ'"w7B&DMmQOQ~'#?Q[,u<bΞ5 :/v{Q)z5<<<ѫ mgs{^O,-[O.4h !l|Čn555 ah2^aA>4YYYfuwq?LGرc4pFcBZڹ3wLT.9&<̛7˖Eg!5- xO,Ax !tB!f"55UHJ=ƄZsL!B&D"iBHk%Ji!su#$A޿OYlSގ&Bd!jWO~)>Xgc`ۯoOI.CB903 M:СC6l:ĺL^^^b}EEttҌ}p!>_ as";+h(V&?^Ƙ+! r`95(A~Cjj****\bF+M11ѫWOGɓ'ѧpp舄'JyeSڵ߿_!1 2 ><Oi& CCYg\eR3f OO8pPc]3: oܸyc㇄ !!!Jw ?sf&166Qk0"99Y_9rW0 999n)Cנ-/^{W775d>`Ls,յ̶n g6kz-b1Ovӌ3!z2Jr, J 899!))Ikۺ#"bĈ(,Ç#"bW";w|ą p\&mێiBCg#,l hb|)V{qA]㨛yS5nz̝;i)9r$6mڤ20䭡8w^^HIMP{G7iAhw5asϕ`}QWH$s23annھ>}u?/*iЖe0eT:!Xdc-u:<,vpv fu再!ф_kҬiӦaĈwf~8r0:to$أFP(D@$&Wưape J'~>~fff du?ymu/e!T)t>T7 SSSL6U<==rZIq4[2dRR+>GAiA7d2BTg230axdfۭޝuއyۻ>05505Xjk}\CYk#F Aћ=:ؾ};< [|jSUUǏFxx8UUU033c666%JjA>!&&/_BNΟmkkKG!̈́X,g>zRg' PRR._믽OVVVKKK+KP^^R1:<6mڨ_]NNNXr%R rssjJ ''m|uٿm۶j^Rٻ׮]ŕ+yM:ڢ1Kս%CQBZ;c)H$ҩɓ'믣XxWU=I\՟gkN>c]^^v)mWQdܸqx8q"vŪ !G=sYY¹gU<'Cz蚘 nނ~A(llڠCUj{yeX[[W^={6uU̙ M:cm5ikk+_x !$&@U*>`s>=yA("!! !J?Wbpv[OWuBO$!?:d8p LUd GB* ..Π:=E\M1y"wc%*=k1t?^Aukd5혇}AH͟/VwaBZ|͛5kY_}"bdpwsS$}K.%1j(tOCkcC֬87z :DtdBtE3vP/:Vw9 L nzz^1! 兮(,3I˓oVG!~44d8|;~KBdR۳wؓK>+n?\>~؅%KȟTFQP4Z oAxx8BCC"BukvC":zvXYY0jhB'i/##cǎ XQ$T <YttB!HLLT*?___6>b Ç#33NNNb+q|ottB!4sOr`F99~EF.Gll t那GbmF߾}tRDGĉXVfM4/耠iضm;mB!Oޘ/1ow31a/ȻꑦWX./tEaA> !B{SZ1!pL6nO?/ jBvv6> I,Xe7x0QPPШ BҚb̙psuů'N -- -ݻwef%-]tlݲ}EZZ:|78h B(9&ھ=RAo&|c-(w/H$7bJ\x 7..fW~=[iتA!i!l]\~aas+}w~';aݺuܻwO=r曃ѧOdge;Tȑ|||?^E˗/ /z5O`Bi90S/9&5aEe,-,dw4y2h"J6|o*pN`ŬcB! 9&Jq)/Tvo_|9ܧ.ֶ޽r[Ү];!)XYYi>P #`hc|؄BHkB3ǤU P(D\\,***p1 prBແZZ>Nsr 萡_OğNN4y2C!C rrr0ɉ%ƍNN8~<&&&ի_~;!J ia^~%lXbJ ?DkѶm[/@h3$U+W~ 1?<0{VƎ6!x U+Y믿yx`ɧ0X5vvB!yh"C1&C!BCs3TC!B!rOc&B!Mu![bcc9HWmz!BHfҥKذa,"::.]STTL&!BT]s䄌prrRڮ8ر<==qL|!Bpؓ;b#ƎkmSvv6|}}>}^F||R{֮F *<. ս>mڢc,ZKd h[K@\ 7fiBk* cb"U>*(?if,ss=;wnĨQ#/_[o%G[%HKK^)))HOOqx,;;.푛Bn`ddz SVV6~mRT|`cذaVbb"F ###54>LDDDD-,9֭O\xW^+Ը_~R)||Ơ{n_eRy&x3:thΝ;᯿͛7zjL8յRXYYDA㣭DDDD0ՏrB{|/"##`gg6m4w޽{q=ڵ cƼg `ccS/?###1<|BBD$8mmڶŝ;w`ff2mVc-DMs]rHgwiN,Rloe˖c޼yZH0o|[h׮JKKeoi{{>} G=sN|vA?}9tO>Dp?5`;:aÆapwwGD}&jjIDDɑ~XԔr=@dd7ؼylɒ%;ܺu ׯWl_t)^z 11tSAAC[[K~ɓ'l}*o&g""""jѫF;w] 6#I*~=/.]<qVQM^tߐGDDDDM7}ܷC<*LHo'OarLDDDDԒWU5ǹp<Ӛ&""z(ur`!//SI"eۉŏ-1>>ͮmMUN,OS&/^ƏǕ+W8P  "Ο/`o@p=o_qqqkGۉ*?G%K (0}AXm[rbrcpTmmb 3g 3`E٤CΎWV[X*\lll0s ۊo8|v}KW^Ep\\~aaap_e%Dn.d2>^'`gV\m)KIIAHh(PUϿ>>um[S>}`hh7sDI"nbcc5O0fl}mD8~U=S SM >Z:Ѭ&!-5&"BΝ:!6+FGň#&kTrbm2Z5:z///lܸQc[BBC1/8YYYpvYk_Oƒpt^̜ٓ1C Q[6d̜11@2 6:7C qq06l(d2qnnn073ӹ_Nb!x؝6ԴTt"nn8zƶ쐝㹹pHT:!A1s&&M9s8,^}U+ƒŋa``l"$m۶(-)Aǎ۪f6I PPPXRо2X[[kU*]744ؖ˗!xG H$¦Mxl###ܿ_R'~Z9Q-Oa::"bl޼՟a̙ǫVr#O7-/4Ə/@`;ZXX\VV88m[lT̝;A]6^z yǵWѣG6FĹz=b;;%%"#䄨1M"Vc?둞\",_ cǎtb8KѫW/F8}ݫ7 //ý Q*$ /}$$I7'&!lmlp-E:nj3駟ի׮]hjWpYT޿_/pR=mv-lm6U45/`l5)q#=3rlԀgO,Z׭Gpq0ڶk>ѣd,X[0q0 sAYyʛ% 29Y=;'~]t+ŸhB,,Xmڴ+eTn[Uؿ&JnĴSq tAAF?cIbn/!]eb#"""I=Xdh1ClO/as' 9XС#dOe2ܫ|K|zاǂaOLor %&/,,L ۿH =ϘJ=,wMQ-6Hr$96TGcj㖣K9DDzݻwn#>>瘈ˎqh! """"Vr\dFDDDDs嘈1&(7""""SU#=97"""zx[c"""""UշUTr#"""ևr#""""R1c"""""U|1Zus`19&""""brLDDDD?Qk䘈C@S's `ddXGΝ;p"7Wv{]PĉlZ_r\>Z"L>}x07n_aGՆ~SrQP.9&j-lق 9Ġ嵫(}_ʕ+X|9q}tAg^xx8>stk>m۶Uԙ/cbpu,XDeQQQ8O;ݻ-\~Zk q |ONV)Sl'Dn.*Gtt4݋`5 j,??]044D^aEIHDDM9V%fu^ҺߨQ x=j$Ul,.\@xxOF`@ Rs}YKعe& H:+( ~۷c ۱-6V㘅̙3ڨ(qE2>ʍZ2 R夰o_1ۿގ|DGGXN*O|dddԋO JB֤J\1p\]c׮8Auٳ0`OɓՎ۷s33N@""jz9pWSҶ];]/!VfnnO0k#ְIeuPy~n޼ 0S< i[*@&)gmm#x)imm]lS7fEEXl CqQZqjjayW_~Xr%^p;Fii)666zԾ}^QY"Qcǎl萡H<| L+Wrcd℉066[PVV۶<p<~l޼~i@#8}4b0ApH$bc5?vOD$&&FqI"ޤHDDc>΍Z^x7lw`A?,^ssҥb< ̚WLӧOof:}brmkb' k׮3<Аbܹ)~3o1ap?SH$̜9 ?{§$"&nl0zUbHKe[_+FIN$_??b<ץ+.<--+|qU܈W W䘈1:{y16us`19&""""RUs[EFDDDDO+DDDDDL%f'} ?Z񩨨)#Dr\>H7n 'a'СCMfcj }y6Bqq Qrݍ5Mus닶BԒTɃrL$%'IIݻwe)))wp=ビNc۶XDDFlQYYy```Rppt?Rʾl{r*󆛻;RuU,{Jr vb19l T1ñppt`OOݻWQ _xSMTZ.0s,88:a̙(++{κJRL> ]\[Lh4M*oT ;v]9UWw9!>me_=ן2MsQS_u-m}iHBϹ D-Bo#jkQTT= ?#3:u^{ JIuHh(#++ ^¢B]HO;F߹S'~?#FDĚYF]W}%%%>>VDHhژo/bϞ= EL̗8{~G: ,<'LBZj*cMD:v1~8Vu DFzqƇ>/kݺhxD=wV4n7lGE4/էLWrեi.6m1hKCbz5N j+D`[nW;:ȑ#pupu#2srp<7 TvۻK```= A!鉴 r777;/'1tzoVj_W}}aff777TVV 1L󃹹9\]]QtƌyjꌏÀ066ưaC!t(i}؞]B$ G}"L 4ƘBPPD"6l/PTΝ:imK&BцLvKRqeeֻ>uR7[[_NvԑJK+..PP[cL)JWlXӇ9/B딖¬&O:Wq+yVVVjcgNO[~)km1hKb8g5N brLDo0|;/_F@@Pl:msrҿ?lmbr?pA8D˖a׮8lذaaZ۲ݻwajj۷oF7 +OVk_pL$yLc_PP={B.mv$VV8x D"Q!v+Ι=!t?llmQVTƍZ90Wj<>uZ W䘈1c"""""-o񈈈܈4܈s嘈C@X1'rsU+**`ddēMDDWq\v 3g͂`ٲΝJ6^d4Oco""&Dh,\GGINƏ? KsDFFq(n7q +VsJDDLիW#33Sо1rLLL`ccY8ϡC0HIIQl/JGGC*N,F^^kU/Uƺ_e2fΚG'̘9eee*8r$Y/֔;8S'ՎGTiӧ viN,Fee%̓ʊXدb1tذz1i뛶8xSMTZ 9j\zFV; _)(--U[`埥R)N|cG 熈&U೎*:z-УGwA;99!** {ťK`hh:WۇU+W"$4T=** =wwwD^qH$8)^EʂxjWkFGC`` 2免7ŋسgBBC%Ξ=^!,NFxX׭!HJLsꌭX\WII i]?nFG\]\̄DǎCuzϷ6YM tUu6UU|Qlݺ/_ALL ڷ E *gF}ƍpssCeeb{FF HOOOe(c9Ǐg H)5-]vH$=R>puuEх 3}ՋUlgͅDeddbР066ɓEɾ0SQ??o_1...HOWzA" <==Hp/woA!"jٱj* ;_~All,VXWXq(IIxdI>666jdC&U;}r?Ǎǹs(//G^^ O*vb1޴Ǎ7"CCE,_ nq\JKaffо^hbmmwߴQWmHd2 k%ٳxOvY1nn{ܼ +++Aqj熈܈7`;v,._U;s33XYYaXlt5޽ SSSܾ}65ɏ ^|Eţ+ݻwGW֭"XZY000"-6o\.Çۯ](//jK[}⨫={\.GvWڴ#2zhx1ts,j}ݐCgUfOGjZ: '|z熈1*j xټv$'a&>z._*s]];XЇ{С=7J57Rc͍Jݷė_|'"j=~=D[&ٳxbgdΝ;xgO, 5 \&ҡCRߖ-Qn/]MDH\9&bBKDDD5<"""""&DDDDDL19&""""@ >ʍZr\9&""""䘈1c"""""&DDDDDL19&""""brLDDDD䘈1c"""""&DDDDDL19&""""brLDDDDoq5n? 8uW¹s055D"9sжm[c۴i333 -m[{u0{-6<#+W0bHqqڵkJDDԚqZ*Iυ1mtX"9) !!駟QHH:230eWhmF@`JKKkN<_4&DDDL[lEES|annADn.b޾FFdggk}̛?tRݫz{e%V^ WWcըYf'N,ƾ&TmۿU'ǽzU丶N;TfN,FZzƘ@'~|ͭTUU 5br:v);AAA;w.v~6oެӧ}ZgLDDDLZL055չ\.׸߾}a8 www,?}:ڕJKqXYY666rUfAUUvرs'0119&jAwպX '0h`|4}mۆ5k ɐJ7nxx_~ߟ:jY[[PV&SշPhӦ ^}UoaCֶ-݇ 탍 {KPLDDD-VATwHMMEqq1zyZm=oݱ 1am7n@Zj*,,,TVV"Qkcc19VyƩSUm~w4b6mG!!s~b"""j rLTFFF݆;wC=j(?O?!//vb1Me6oތT@~_/^8˗~Uk022ӧ!24T]HLDDD-WjXn###s.7zUUU=NM}eY9>uАP8::_77w]Jޝ,÷l;QPP%K>'%'II*qs:o(..HD^m&/v{$;_bawp@JJ,??c? GG ޽{U-,I 2ToۻK+B!;'ss, NDD-VADwZvqB wh_f@eu^ Pm۶EiI :v[&Fp?=wįw^b՟Ν;q֭zrdXbb_\cccIo ,, r\(޽z=veeeƙ3gPVVR):wW<˗/CHM1=xQWi\9&jfa`` GdDV/((P$|m۵Sx[YXNNDn.~>vL8yޭyy1~mIͪزu nܸ!(f]Jro_I"jO'rs+(V122BϞ=u[,z:ڴijK9@yyw2L06l\ڶM1HKMܹsȋZ SSSLp8W^ݮzQɁ:$ /}$$Ic>X~=3!QTT+aر [3w%aa~ 9<75c#Fl$:;;#&&.7hl5ťG^^5j$Pg<(ID14v"րU=&#,%K`ݺ'^!!'|VT[A8/ڥ /_w={ĢE~zmv=Qg[Æ] >t7ҥ*e;ŋlwwwdž_(sɱD8884hl5ťœ9sPV^͏=Qk~:8K$2d(rhB,,Xmڴ8wZ:ѫF8fHr&\TtKM9vbOk:/BZʇvQq:>~̺ȕc"j6L"H ] M (ߦX3'"brL䍈4>1c"""""&DDDDDL19&""""brLDDDD䘈1c"j Z*(kH-m."&D8|0BBBL 6iKSSRR興FoN,nvԐVx($4ẓ/y@m>#NLjD"ݻ6`͸}6͟7|FFFlgͦ?-icHh(V\ WWWNl'rsiHݍqor4My;8:>5P+) IDAT۟y.Ą(\9&a߾prrDs;vn'ϢT*?TU";qqqIAvv6{z)))LIIډŨDy000X(w8txxC~~>~8鉽{ T*ԩowP银qt՝s!q_8M}2Ҷ*T7>6Κmh:F &D͑pwo])(x @Fz:6Av"كP|gĪ+*xh^p0;a*+iV:wد4xyyaƍbĈX5k(|/CSnX(w(,,}!,<'LBZj*cMD߰ؿġy\4]McB>irLwCƹG1|k"(0Hy2^[n8r$1QkSPp/gKKK?'O aii C$ii joꊢ 0f073*++!CvNY"ABB`nfHMKE׮]!憣G#x:d^7v+խk |'LC_45$!tŪ<ʴ9n܇055ׇ8 ccc 62LP325 &&&rqiv~4GmiP ut̓ow4< z!K^¹s#A-9&ҡL+++m^ý| gbL&2٭gkk[}q*<#A$aS&r&@5+~6deew1Pw!XB8-mhC)v…" {͛ס}{ߐGmiP Ο̃3gΠ %RtI~7d|ڲBy$1Qkcii2E mڴQ VVָ{.LMMqmhRDe+F[m[l\ 0(/!5aaaz/Cڐ6ѯ g8M}z{ Kk׮!t>$oiirܾ}@""fiSO㿫WO70kV`h׮-U )̝#""jrL'J{|TEq@5S\9&""""c"5b""։+DDDDDL19&""""brLDDDD䘈1c"""""&DDDDDL?>H;XcDGEEO"j tM$ >I}c^4~/FJJ XVqnٚ9Qc1ca'ͭ^9QsU+W_37뿡D+DM} BBC۔WRRR`{{{?'OTccػwJ݅7NTm2 3g͂f̜2]RN,Dw JKշ-^;_baVKRL> ]\[XjۯT*?T _?_;yyy׮a-[ڟ6FMmEDd=r(EW^Ũѣu?~UVV"x<h쇺>u! 7B}j CSQtνpZu׮]QE*oT ;vin?g!s15RmYHh(#++ (  Xr]qfv7kHO6nؠ>;Çs0שoKW%%%>>VTyn]4<ARb"Ξ;1mEEEc2QDc? qꕸ,899O>v _1b_AAZϷ+3pvjW.kjꇦ1P}AWicM154M}Kt뇜ߥ^7lGbAsn?s}0c"jvv\8K$HHHPawcذd*N󃱱1#--]miڵ+D"p;&&&DFF}t;fff^,dddbР066ɓ4Ơm 4"HKNp,\ܟ飛1*vۻK```| #=])σ~he}SSSc,4&qh껺9k:ggd$9ǎK51kLLL;WԐ> D9&j/_y!(("b6{R슋Dž E}uyDEEJaPQ[5K5^mi>v/ X"db*7 0sDԐ59׹~k>:י55ۯo冴ksss>KFmg$[mU,Yۻ[qk1rr---ٳg6tnarW=gׯ"}YtifΜrfW^~Sl㪞zꩴfa77sˢEOg.ڏuMlvk79?hL0!y!k|xV?~|]<.'xbvu5{ر'[o͗:k3L|ur7quo9c3`5G#>3STV;mȦs̱oz;ֶbG651rZ{֙_LHv|ߎwrὮ8|cAo}r_H^7lr/̛ ˗g3~ODxc@$yo:u}]vex A~!1c @8q 1c @8q 1c @8q 1c @8q 1c q 1c @8q 1c @8q 1c @8q 1c @8q 1c8q 1c @8q 1c @8q 1c @8q 1c @8q 1c@8q 1c @8q 1c @8q 1c @8q 1c @8q 1 @8q 1c @8q 1c @8q 1c @8q 1c @8q [] Eq^7#F1)9q 1!v0 lBB!Y}2@غZU6_.rEȦ&yO9q 9&Oʼ ᇳ9gg3XcZ[[ )J]vswJ^OI=o='_3_}{1wސ-jsx r}i[8imM%;75ei}T-ˬ&>t3;Gg/gX6pPHIG-iQRO[{Go51qy;SooOaɒp7abpyt7hP꭭X46ح{O;;m_ФqTjITjTkI-v1I=(gR#~iTR^({/'z-]Ew׺3g/mF45˯ߵ:hذvNWsO˳V jj[m=t29̳r$K.\w]UUӧO|Y9t;rH)_88eJ~klOo)o~뛝7o&Vl2e˲ŗRի͟Yi5*|ֹ3fCGvL0 'SNߟ3tf&M-\u{E]ɉ'~"'MΤIVsNvn9/_whv/iijz~iI}iI<%yyW+YxifRw]F m~xf̘fկU)of׳Q/7K/ܜ /د_,ZgWO~մ6ۼ2rKF>"ݺuq?oNO=2jԨT*﷏co?L\F7f9߼Ʌ"iȼSOR(S(RO!zz*zzrzԶd뭷^Mssaj)lYhQ~U}$Iܚ.f=:guwkZknn}i3j-'$zګ۫Yj%S.ӣ to(v^'Ť{cC^~5;8mݧOZ[[*/\Z,隓~\}LYE'lMRɮ}ռJ[ZI[{-jVSOyZ\L=ӻHӾ[m:hyy9hnI/uf~ppBq l9^}晼ptɓO:~g'~immMi=R1#GǦ'׹ɹk2ioos=+~y>v-3gG'>IDAT܌l!C|u!{3g'u{SSSΝJn=vf;>lu/ ^vR럦}쐃!C}إ_U2/?r!~hj=Ss5iёGMrW[ᵯrf li[ҷ&cIx4O=yfe+'~zΝ̙>"yZ^k`3zIuB!ٶwo!sw\c=+&L̤Iܹs3pР|e?u]77>u={,H[`˰ۀya܍z?Q/lYZ3uʔwmii`_,??{JupQRTRTRVs;eǭKព,ZkbT*T*\.\.X,n" J%_+'xTښJzBg~)3ǜ]we/'Bcc:ۓn6s5/hzcyIjZbRJr:Аj5j5ݺul/i'wܪGBJRjZ}BJZ:?jnmH\NCCCRR񦞗Bay) R1+Z봊bRU/[dc-qcccuzZkGW^Z^*;/Z-z=j5j5g弔JS*y[U(^; yđ?yYy\.ѐl؋ CV>WAb7 1 @͝c5<8 (_BՈ*qlqb7N`PEq j7F-V)!oe)ǫ9.c`j;-WR--zTۗѣG<8BCgoU1 [W8˗/Oݳ=mULZϋ})$Y`Q==z:b3\C<aOgŊѣGOBz5S/$|$ɸ J=vizӫ`xikkKИ-ұ֍jUԋXk' H4˷His0ՓF\c]_b ߚUugwL2r,+鞴+L{ڵS?{m_][YR:Xյxq>OߊQQOs):{oʥugV ? "U;'7H/;]Tu/ y,ޓNv:y}O=jMg%!!!p\ EDd$>Ç "21 ⏼<<\5V+h@n@g@Wy(jx~J+D,,w /4Z^B:+*?J,ץ:/ be#owImRq6]>pYKVzH#כN.U(lǒ8ե*Q/ދG06<"%Ynz,ɱPEUͶ/m턦sNށ8[PUq/޳>[4Q[=cmeޡH(^v U)_@ډ4x~A5jk]tAaa!=ڪA+{Bݡ`&`+F#bYY͉R!~CUk~:`gG&`W¯##4,r9a!U,Uxkh# ~mn|V_*tz"`eMšcQwn'OXqK/(d'ۍ 6 U/nصe>N LA4n9zW.QQQՒRؗQ',(o<h.exzeV%L#6un+68dEz1Veeg=҃wR\+΅̧ G:_U[is>E<&qYT[ amm# YM#7ˆGaAYxP윩b]롺u-VWE[VJ/V:)'@X(PZZ??FLL U. >l4n۷GHHH@z{ÇӠ:tɻI&h׾=nw҅.{iI "##2رcp݈LsQԯ_?ܹtw߬߰rJm{iikO8+' 6 fkt";ultǎtE"q1Jnaِ IhZ4=d>(JC%ucEuCk mzZ b\,PKy/dEPJ-R'7h!sOpWFT/&}ی,@x 2#yމ]j=g'4A>G7H ̄Datz08a)}}Žzv۟@}8g4͛{K/U? jUB +&h1 l")U1MFz)ez!WBUQٺ犺+&^WuIe&!E.øBZYp1Ys/~ u&e^2<ہ)"cǛnMX[mEls~v(-Hu:纈MjP&U2JRz9wܚheڋGjWKmKTtEw҇D嵰遤"϶xqEoiX_v+YN+[gMFˣH~ϪS!]ZM#\a hE(..(*,DAA>7iF?['N^ݺ}ȑS9ŲggeGfcSg?T 64C}|ܱやqKF-7l³)bW?mwʷ>1c#=Jʀ2U|%%@a2@qREe:KRe:*<*E]\kvvL-IӜ]Vݘ8iv)O+]svnRzU!2"ćES(KzPe-.M &W7[bz[hv*&h]oS9lk|7}R2U[vIص8|/ΥQg覑#}f&ԉZ23ۑ!rUN86RbvGy*b\.՝1ZQy9\>[j}{0E&b.A<ʋ-s4n.b h<+|4_gHsUTPvF*8yێK z+z(Εx<СnT]=^z#maM.7xP7O_}93y2z^3Ou],e˰r /?>18)S\ )E bYj*~KOE5Z1o1ݑ=h۶~/8lR3pGb붭?`rrrVZYfX;Э[w|p\1}v̛2.񖥦7c3gB<=#7 ={oM0c4a!7xhſNS;/o>JH&V5t5Rk"Ϫm(cC[9L'թc6]Zj&]V{@L}B*aL>biq FYTtTaLuUrӪ׊xvfSE*EMD+<۸s,ۨ*盭K\<}QWե/ }V2]!pC:{knsmn_!CYu"-?!$m_r#QXXGgƼ 뺣kI#nW_}?3OiSOSZ6[#iDR`?x`Y^وm?E^L27L: 7<"޽ݴ\o-FG}m߷x}/`ʔ)hRQS▛GK.A˖--}5MâW32ϩӦcDM>紴m  FGq-OGˎVtT[ԡ"U펡 .$ ACɲC,ҩ& BIRR}Zح3`1j ^7SK/C6qmEpvq,ϧ ˩Xy(ʭ^uqn8@cg>}>yF 7Hhˌoytv VBn +?uːr5;q1좖1HW}N}s@VWs>jժ_q=wo]6>7I)UQ>?SWX'2lHiO$ɏ#0Fo Y;,]MWo%q!nyeqYX>YʿV(O5Mfa7L;mG򳶜4[5SVhϵѮ$q)]'GqUe^hʅ,ڢnwYKb]V]ɏa q*|/R0ڈuKs?Bg xb+[# r"fc$'Q^$u&?>/&d 0oe5B8R#HewtvRS 욣]:5bKWQ j_^e7G>.I 9wa[>ɺ$47_X^Lb ʠ'L6m{g<;7 tǵA&M*5GGh%/?ǠC}2xwY*G-ѱbR4M6u\/U۷oG>}0kLǫVayh1~ٍC;買0K.?|l۶ YYС ]dkI:u>VN-X=Wm[qMfr,=żvm#yޒUV'/žNX3ⷬ˦ZPΘH *)Uql\Xt|k§]S+dWvrlEWԱK檘಴x[͘{\]#lM\yKNYYy)hҴ)&N/b_ODFKKKQ BAbޗKDHt 1  ǚ|]ӈe?GzcB\@ܹbАax?m:~ o}6jp:í۶a-ߟ~)0,5Z.й:ɣ1y=Hyv|i@ʳsGƞ={ЪU+G ~ +V({ ʕ5wqwg' ϥraD4${diU>잲2h(e6 `]姬Y=:W1Xnoo!CꏶbID,ahl3z 4l\Ķ 6.mZ]''d-TE[#zII*QҰ[B-Vi:'>I:EH7H[KVs _@+U& *GpQԄvcXץ@Ӑu6j[n/6eW:?~!!5j,i~O̿;ɻ˾ ͛c[ &c!m;8_6wEew<7'2,p9`؄ g]bc:KxΝ/W^y%}1?t`GyO87]YŽN8P V矏0#}̂K.ܹPZV; Ř\\r%7ВŃ+c>HN':wEu'Z. Y2N&3[YVBz>~ٽV!Ex>61}p١߹9|w=*b;ƣb{d^6¿-٫bPŇV˾㢏Olt\Sչ7.Ti,b)Ձz)c+QļT.x⿢5z 0i !\.x&tyX..YɪhstUME,Ӫc{Ee[(,4'M @x42[ę~/))Bxx0eV8ͻ M1^& bbM#ѳ%ҭGʮ_^OLLDޡC())Ll&OM|c._cݡϟ:uTo&yZ([TG(a/.QχDG^&Yljv.X+ԭlv)עz}upE'[ ?܊~Ś:ےXu.i ڲP89}Rd}ݪv=U>?o/؜O 4٥&7 aUqj4r>~ĐbըӾo:?A LЕ'*fΧ[vhaj}ڑWꊾ.ҙԵSo'!TZ]iQskkqyFiP>ʰc4n܂vqq1ۇ IDATۣq?j2dݑ`xyݮtMӔ:v! E{aS2WM`T՝F֏u[R۵O%n?Y\-ȣZ$'/f]c;n.dʪ;]m͵TKYLI۱3X-`o?[W-*oϫc;rU웭xUyIˍeLw+ԍUoxPinG1C綂 ئM۷ ]JPTT˅mZ[[. U5I0tfѣ54_eڭ#Q^=,\Ͽ&x:ǟGe^eA_~]Lok'2_W>oVi46o:ܛĻgWLi%=yD+xsz:^ JtS}u:./4|ZLl*6k@58닏acsՅzZn)5ӥɾb|7Kxh*cj#0o;| Ynoarldnz4Z1}DnvS]ҷ£{L\=>k!|6Pa4WetNJzR^q(oӧ"*Aq ZYsIB Px&K4g.>b<+(}:^%nӽzQ?mK=(..BнGwtEEuuAxx8\b$Jk25[vw[G~mE%%XޟuVPu1ȖqQUYU+iV@-*g0$"8,;M1¤Dn۬䥟iײ }(B(֛YĊ7)҉*BVoq27(F!M]e-NQZ RCX'IYra<*KJ Z<عklv6ppZ#ghUzHʂ[ˋR LǼ"*-uL}ExٚKֱ8^x[=Ħ]["QƛF{`~A`Yn״|T_!?/ɼk`]DnDV쓫Xxn'ic29+-M.Q֓4?4S4X \Bt kRgWzUTrx'Tj+0cŊ^k wT,ẕ$ki$QZ_@*;)?&Xu=&Rj.MoQ&ThˆA}]胰O*\gf 54>BU"إD"H38b@ŻELfGt'A EyY{դb}|(ɧR"^Q }U|/.BZ@pGr I'nlb{+_fIQDT>3t{fãLEPItI1f!B!S.K ;!B! vB!B( !B!B!aNuSo W\9.W{EYY֮~; xuKlaB!1a)/q9{n\k>B!䌦ֺ\q@db{W2?ǫG!BxjruQۺu :raWx/}艺u뺏o@^ȟG+P~[3n;vҲ̄B!Q]QRRb|?8zO,}5@zKز#M6mߏ ůs&Mۯ!""pŕWw`kr }/GN!Bi%fmLJ_r~FYY[Ѷ}܈Ǐr1Mduw6ǎ2JKQR\ߊ:u"آ!BHP9,bQ7hHgJug*_}qlMB!Vh՗YmbV:_O@`o ?nq+[!B *% e+Lѣ;JUի>]<nB!=}k/qh{ډ6m#44nw(t펫񱪲Qqm4j5B!Sk9{ #N=OH߆=z#i? }_'U7nX>}ˮcGu&vB!t뉉A#Tba1G;oX1&a+/&I/&`wV!B DIӦHOO?:B!r!B!BȩA-`[` 7Cnڭk~ ;w"_ذ3<2*B`'U~Fby8};'>mmoLڎ]Yy ! vBNxB/CXXZn~={^)k1.x Yδr5]1$SV@i>€O}ʿl t{$n0*`!Bj!!qG;3#Ij2Eȑ#hРm>땓?4MW_A߾2۹SG2qÝ&%o.E=5kS{&݅nWn!\DDuEzzzpN{. :5ر+u7 NO<+Ks_6ĭoO֭i*vi,\ x.i\5?6l y^]!,\diѢn6+Vaەd!BjĐHp̼wՋ{ :y"##q߯fL;l槬lKNؕt>'B!Bt.|@_~OeT2rҦe~+jo5P>e]D#:|NB *MN ;9+v$2رc'f{y8zT=s"BHANJp=^:s,:^Ν?v5kh@֣7x. 'rO{]H-H3vl2`v-`0&κ_yyNB`'$`4M ?f@6h\vY_,} c'ohӦ5.+~еxкu+n4hÇ߈{Hs5WIƈĐ7SӦރF",, 8'!RM x@eXǢ:t|'55֑B!6^2c5baȨ)?aaaHKKI7B!ZDĠv]}>5jIO!B(dA2C %KīG!B(ثkT{KZZ iի~0]p!bccQ~}=V';; B a7]AA=\9r-B!nޯ_V$%%!55#77ƈ#Li^|Edff~Czp[u5`èQ0~xt5š5%z-111lYB!v vh0aRN~8qnݺ;LvHIIA֭)S`ƍʼ6oތ;WNC&L9s?B!A^z 鈌<)'xbz뭸됖'M޽7o<233oFǎ߇ ۷WܰaOބB!kžÇcׯI;뮻[l_?&L%KLiBBB8.XcƌA-0qD ƸquB! ʸ&zZZBCC-w]vŸqyftF2wѣÖ>ӦMî]ФIMǍmbƌOꫯEB!RQbjJ5 ;wƼypxj999>{Ann.h"\|ʼ4hիW7oȑ#M9\{>|8 zEB!/Ӄ"U+&%%aɒ%2drwy5~ССZl_2EGAtt4Fӧ0avAwB!R#hׯq ru3niҨiA-޽{q#'')ށm;{+B!gu4oHOOٰg:;w.nVV!BܬӨQ#Vbe`C:V!ӂ`-ƻ@!Ě1&!z}X]pia'V/ʄBH09чB!ZaaF!BȩëE]N ;!B! vB!B( !Ц],M]ntFiW_A֏ISo-[ev1w+]Yۃrn뮻+T|Ν;q :7t)͇~ 55III&1_RRa5k!,uC bUK?xoF2uAݺu1vL2>lJأѺu+a[PXX-\5?JKKKS Cxx8Ǝ'M{/6{l1۷d pM7nݺ]w݅[6m cŋ1ydDGG#22ꫯ!b|5UӴ6lʕ>H$u^Ml߼y+6l܈{?ZGD4oxwA~ 9mݺ| KuW߹s'"""lӴjrۮ]L:t BH* ӧ)<3mVW_رɸҾhڤ Wl۹x<ܾ5r>eee?~<^~jC@F!6Ni@Q}i'w@Mнۅ(,,k\RRRзo_\tEʧ]v(..m۶EnnL I!i,Y֭[#$$'ڃiXp!bccQ~}=ǫ&zB+63c<oEcÆPTTw`>aC ??xycr{kG}y;| PPPk׮ONNFJJ ?|hܸ1! ocݺu(++/"233o^zu,ӰaC 6?4^)ſ5__ <󄱽:a.l߾QQQJL:4imۆx`ŊXbL<nqqqh޼9233vZ64B!mzbb"؏vސcM+N:4 F#11޽{c>iX}ށm;{+4&B!LaQ!o ==tjzmݼys`C'BH. Ÿ/*( !bgʉ|w߇FLLe={B! =܃\cѢE⋍mHKK„ LFEE!++ ` B!5СCѡCl+^{5c7ƠA0qDӾӧOGB!r>bT U )S`ʔ)ʼ C=z~!`v`5BHM|B!sYBH_Z !jrFӂG!B( !B!B! vB!BN IzŇB!rj㴰B!R`'B!8섐cC:V!ӂ`'7@!Vz^菂rR:BB!6r:MvB!B( !B!g`4>>!B!ZjsK!B( !UMU(|r+X5}ܕ+WQB`x<1c6lH;w4yРA4isy`m^d Zn!---cr2{X 6l+BHJJ JJJ< <f2/Zo>lڴ K.5oou֡ HJJr^B!}ŘbccsN9rCM7dlOJJ5\#//F-bx<>#eʒT躎\ <#FP9I]uNX'tΨNʌKKKmfr-/Bkixuˈ8t0^]=::HeF2L,^UV!::9s,X7"""p]wᮻ2o޼;""SNoyM6|G~8qnݺ;pwB9y]? m۶Enn.G1mر# ̋@vB>'VիWW/O>o'>>|(\ _qrglΝX"33WFvv66mdn_Y/^Aaҥ;v,\.n6BB!AūEY~ں$''#%%ǏG~~>^u4n~c8qۇ)S=!'q4+q啉H؀~ a(ѫ `̘1hѢ&N5kئ rY:lٲ_=>cL0K,ac"R]>.'OF\\7oL]_JJJ={bĈ s=!ex<رc>i.|H^yEL>;RE)k׮-6m6n܈n }AAAAvqa…p뭷B 2ZؽTܧ駟Ƒ#Gp\^x)G}ۇ#Gsq]8D&X*n:_{'N@AA!M{111k^jgͅ]9%""?݋C^6#ecǎ|`ڵAXz5 yf9ҹsg̛7Ǐ 44,8pBHP9cW:mܸ1z-x1|pۃy,BN%\zsi?l޼/^`l.i|j5z]|ڴ`DrۿÑx@ olҤIضm+V`ŊEGAtt4FӧXYy"66QcL>ݻw'B~z=11sCϥ%Ά7dØqje5k{Ŏ;РAr-x'h{0Eh6w2NSjsA!F-si3+1p*o 6NN!S$Y~PB!g.V!B!B! vB!B,NqB`'RґB`'R.ןuB!ЇB! vB!B;!B!B!Zgdd-e˖A4,[,}W\y+X.iluB! Ġ7|7|3,YÆ ;,!!B)0|j<|;w.233B! #A._Çѯ_*tR\hР Kb„ vM|zWux<̜9 .Daa!u  .0ҮX<vލVZca Ajj* Ɣ)SqFM6!C( Iy|Mo;v jyZj;B!,{FFFaz-w}4w}x뭷,)-- 8eee淚4v,X1cƠE8q"֬YSzr1T>!B{ P_ ""˜+~_*۳gmm۶Ennȑ#>iӦaƍЧO8޷&C!B(Q0o&n嶉'7"-- #++gBjTTpWSRRpq_Gƍu 4իQXX͛7cȑeB! vWYO?ŨQoV]%%%HMMERRn7 'N>ݻw7'O ۍ84oXvmuѢExGQFae򐳓6:>/K&bÏZy^IP*y?*W4B!T<;k"J !Qb컲=;ص{#A;}VZsBB9IC95\.DDD`ժյc$$$s"B,p 9x<âo`؍CJKK!c\;xzN ^#qP|\bbѢE7n/!BNșhǹ6o3~_2 .xQQQƫ^33D||\رc/ʋG!Pr bcիÇ=I)ozz:zer!B/a',j5 зo_^B!ex<رc,7oF׮]yQ! vB'PPPwGLL>y^:Բdggm۶(B;! $$^~%\7osۿÑx@  ̄I&(B8锐3].f; 38wugweeB!8: !`O'BH . qB!zŇB!rjХN:%B!VSkiF1qDW++Ws!B!*jv]px<(((/ .rÆ 3MYvg`%B!g`q\ѣѲej vBȩy&B,ؽ",,iϟӧ#!!_|<fΜ ݺu p)u]M婧:t_|1ϟv!)) %%%_9scǎl~i]'Bi3 77<Fmڶi&۷o& %%%%%A^^Yfo0|bΝ8rno$Bub1b["!BQ_^OLLľ~CqqQ8.+ru3nR y5ԩ;r fΜ mF6m;vĪUCN~c7nDDDI&HIIQ;{ZMB!g p@xx85?ϤS;Zlik.4kCY/Ν;-z[x1 Kbرp\: !B3bSݎӗ\&]wuزe k|Xz5?N;!BQrF.Զm[ߏ9RڵCqqqЎ׵kW7 .|[o-B!==99)))8~8믣q(deeҏ;| PPPk׮'ҹsg̛7Ǐ 44-B!=}p݈C͑kۧOݻUVO4 ۶mC||߸_fnsb1ɘu}?o7n¥g 28HT|l"}nPɩP|rmmc-ƍW\#0{jaQF}[%iRB<49#""d?_v6@R+G *IZE"-7N5==666q[I9ɉ7в1o0\IIii{5j@T:;;ѣ>|=zL∪w!VMhQeS1쮮طoܲ}_~D M X H]]]r/_}}}H$888 !!A|ܹhР\}MLLD߾}X cccqhٲ%!m7??SNEݺu]͛Ơq!qeDDDU޹sg KOODž `kk[: L&ý{п 2D(ߴi5j7oɓ'pss7hjjb ޽{x1<==駟 @xx8$E]z5rrrp]<~nj3jR12 pqq#G`%%oРV^ OOb۵Btt4-@TT0nl1ِH$ruahhXdnvp14k co//e*v"""z6={`СCKm6\]]7orٳ Cbb"bccGnRR7n,DӦM)S )) 4Ǘg۪U+ܻwOɓRۻ}vBDDDDZ|ө+nݪSSSlذϟ?ܽ{B/:T TM6\(] ,YNNN 0dee!..Ç/>*ڮV^ϟ#33;v@rMMMB&!!!_~eBDDDDL˭O>DEs,޽{FA$ ?~<\͛N: AHHP>qD<{ _>k.ݺu+ϟxzz⫯*>*ĉf͚I&8{,N8!:}bرe WǫYbd9J\q"""zsы5jHD,1j bNDDDDĄCnZGD'""""z{dNDDDD˜1a'"""""&DDDDDL؉ ;1a'""""bNDDDDDL؉[HeW H`Dj{0s߉]Eڵ Cݻy轣ʝ{1Ν;$"55Q#"""Ja D~}"00Pɓ'E:uШQ#lذ}}}<\~zz:6m4$&&o߾ӃX,1BCC"wF˖-X,W˗/>$  W>w\4hzzzGnn¾U}xyyg.][֭~aӦMrGuօzħ~*W? CPP<<>>رcqQ+9<ǣ'??ِd#''GӛyVb㦟"""b^sAKKK.-xԨQϟz׮]kzzzolʔ)Ƙ1cХKH2_円xaNoFRB<o]G\y{OCDDDLKk.[6vXڵ ЩS'|wHOOǽ{0q"'N_,ae꣯/:T TM6\(] ,YNNNB2}7C$AWWcF?N}F&طgt섡F eaa'ҳW_?.]mMѹ=?HYlmMqMtsC#_? F&݅T;a OObG'N ''۷oǃSSSYZ <}F)|֭?>ttt鉯L?~<\͛N: AHHgϞGTTFR}7C&ٳq0M4.Rg~3gbIH}#T IDATHN&̙vL0s=z7io4ۢsg@/|ܹf,1"%*gyC}=k:F7lfLԴT4m,_LٰAoȨׯǃBDDDyC@X5䞷mlJ<{˖<~u@ǎ02jCZZPxuw׉ ;Q)rXXu¾PSS/?X-1s|GٳXjP^߿~U'Xf%ZASS-uB~5= A ُ/ǿwQjT]];Z1DDDTǰ{Iٱw/|һWefx\]]bNѫ]qUt ;DoIzz:233z xd/ b`MWhkka4pBDDDBs!1Do )!1DDDDDL؉ ;v"""""bNDDDDDL؉Tu$*ղ1@*K$)DDL؉蝕xA u*A jCbv""zD "bB"""U=ƟA Bq80&DDDDDL؉ ;bhd"hwuy !fDÎq Wb1a'*xq32~=y M1bqEǓ'O"""Rd/DTIM ZZZ8p c@`X,_-ADDBxw؉*455C>-l0h0@~~>-_Khgj !HN :m&k0m0z_d{YYYbO>[^0`Ȏu L/6manaigߧO[=me'_yyyEW]~/Ni1+y[Dž*U M+rj=&D ??>6`re׮]3Xb)`Eԩp\ggGxT̛;wbbbv@Ctt\ۇA;vm]I Ϥxݵ+ZjayB݀A000@LtΟ= "+Y3bro +-f%)mq3y p-WL4""&DwڛYa(_WS& mmm4o s(Ff͚Ғ`[\r%e1uL89:@,F*-5KgعbV⛀RGU H$’ Pl,^H`vU__/>\M={4jPxW44laÆg~CÖ=J\ 077SWe577~Fr}JN Ssk Jw~k?)S┶?r\bձە[ncc5߮,r.1a' E /+wl}y7wǮ=]\e-YMʭW+=NSE+U3] UXFFFFzhiI"bNDc`g^!))Y(2@RR2Ν;~}ޮu ӧOQvmy͐V山gbΖ)f)mTP``g;Q tmw"##RiD:uRiNnݺXtN)|S `ӥjժUvp'%=Vj݅ ÇJ/$:> Bff&R)6nڌ|$>Sk+?oPը_ c0 ;UH]l!.wض>|0>eˏ9 ̝/?bP$%%+P>pGuqqF`cr}NOO]7gXu삋brR2nݺptJRBDDTVHIAvEjjJu*>~!-QHNx(䯿ưu*542Ԍ%yǰ** )[=ƿ_Gk4/K$77@dd$4#;;{k? kaI JKUw\ʃ ;Q5bcǖKWCeץ;.DDDL؉q׮V%kCT)1a'""*1 8$Tg""&/^>퐽S.a'"*4y~U2H ) /;U)~$Qp"""""&DDDDDĄ ;1a'"""""&DDDDDL؉ ;v"""""bNDDDDDL؉TC@DﲨS qvݜ ;|3d2$'` xc&DDeU5&3f́8;92HDF)Ǝx0U5kYICVXl1fNDnQ8jj8v,r戉[n0b eF& s 8]###CnLt>-S{+))w` mҫ/N|-O>Ìaa 6m' Pn}E%~86f042YD9$xݨ놡 --l0m,mDz`iL-1ɷKF9khd";1a'4>^1k1cl "184444Æ\vgD{=j.S{V,-&bN!b ׳ 峿'86 ?#$dʋ냢~ukW!)!bN'NQV'^7v`_Pb#PV-̞꺱mN"T8.]#VZ]6 ٤x߉ ;QCa9hܸ1~ }6#Gb5jԀ(= ז_hkkyf5wŶ;5jD+Ρ!>l$ jժ_/ .bY˭>(귎R6_T׍nѬ>j֬ QM( 9^#QfMhiI0Э?\ZmQ8LLv7s\r9 05[O]]]yӦM Cb;> CÖhrWˈFJv\YZhh4>(8rAM'JQ ssS>h'w@F 纺rnU)33S,??7/CSS^= gΆ 7li+fLB.(8[llmappt'Q=EAQ;q5DBTdddյRDnTuC:_'*>!1Dй bԫWWx޼y3v ??]*,];1x,-: ++K\GG[T^eݶm pǒE0e*'uBӧOQvmṁAsƌrÁ T6c(__ HT ATdgg#>&M*W ;w 33>ĢT^E f=a7ʉxݨ,\>T}!L(۶DFF,=:uڞѣ|q1a'|~c|1] cM<nΰ/bʥ wO4o]A.O{-]SskL2 % |"]w3{,SyIDi^z Mg;([׍n3z{gܿ˗.ۆ:lŶ~ǎmKmohw<&*(""B)w_2V:d$Uhɉ7 *7^׭342y.<<{2Df-Ozꡇ#M--{y-#Wx-KJ7/דǠ.fp ;JaVSc"bN.;q2m`hd3 ru֭6]/X<A`naA < Gi6f8qշ܅ߧ_e'16KrF&;~.9\zAtt BSŶL?5TRtVnk{ uo߁ .&,w͏X|,;%l~9z}prtX,F53 Cȵ7h޼lhڴ)rss_%B0|H$ԪU >^HKKksႹh#bx,,\0ŷL?3C# #FBG2QsK^Z~{8v8n-~5`2a9^#QfMhiI0Э?\ZҥXB,q1ktx"%qjH$Ƒc Q#=wF m"-I׎'xv1a'zw ==jՒ[3ϻ;q5DBTdddյߌ,7Nu%ƅ.(8[llmapptQfIoB'ѻNѹ|/ܨ!y>}}8~,}V]geˏJ_ϕt 54 ;;Mֈ-]F喵mm۶w߀wx͐>hTi}[t"AݺuIn*IT(snvVs33=Fǎ/ǝ099p cȀTQNR ;w 33>ĢxP1sT^֝ai+WS^f =v042f(5 ]pR,V\Z-]SskL2 GTx@ѹ|WTnei\ /@>pZpN]l!.wض/_j @=yL!sppݔ;˔Z9T8|C&1Toe+c$'`0x"^xU8/3Df-1DՍw81Uu ;Q5?D c؉v""""w ǰ{v<&bND8c"&DD*ʮ<&8 ;1a'""""bNDDDDDL؉ ;v"""""bNDDDDĄT*eNDDDDիWńHhii  ;J2a'""""RCDDDD8$HqH j"""""!1DDDDDJ֙8&DDDDDL؉TϟC#Uvx[OA_KDDDĄJED~d(s.\0O/U'ῖ#p%Ϥx$%1a'>233q%hhh`!qE uJRxY놅K>hcl^}qDxL;vڦ+;W9z ""bNϜENN:t4ǝ;!''NGU3gbIH}HN&̙ΡG1o"q> 2 L}Tmv +c8p^U+1a'R 2L>wB`oSzJuiSӾz`XJi3(NBb`hhiiW8L8ճ㋃ ;wu<~ZlYzz:Ν _N*5J@$*ɩD;o" ~jIn^Xv"Q0fo,I 7b$/8<<Rk}Wb/>}hۦ5`x9-[ 05m//ݒfpQlٺR6tDe}ADDDL؉ބ97[n`믑d01n 7~ڛY!(8H[zzz]0m,h_o@Pp,:a_~a엟ʴ3d`@ 7b)t {/ʕX`.L۷&Z`Eښ2yի X,L k׬Dk##hjjа%6|;ٔʴ9|(&MGںh֬@#D2M쬬eJu*>~!Itɉ7в1o0Ődhcl< s3S?q&~ l){1dU"A DFFBa!E"tl3gb谑reUQ!1DKI^Ӄ:ׯ!6u2CDDvj~zXf%ADDv"""""&DDDDDĄ ;1a'"""""&DDDDD:hʘA ""/0)! ;IN N\8$H1a'""""bNDDDDTyN&DDDDD/ygNDDDDDL؉ ;vF~~>`SskxyW~?)ȤJ!0n6 $%%ڧTu m_cW}8vSr <ۡ<j",ZCB׬YNG@͚5_\44`meco8;9l'bBxYbQ!]~/x.%.>,;\z-r_q*|ʺ` 6]ev>{Y^DDauUo¼2 |Eԩp\ggGxBqQڱ ukWd184444Æ_>NA\9p$0$%;2^f̚{g̘9A!H}G}Cttk<.wBںrŢC6f͘eWyCTx?a2p.b/Ơk_|={R})ؕueg"q`09Vj{eymUɓ&mkub jCFFtuus(Ff͚Ғ`[\rUΜ3ѴiS@g'*]NŨQ|}Fa<(8{@[[#G CX Ca9hܸ1~ }6S:#ŖܹÆz(ըQ#pƎ/@DZj iii_Y_a!B&1뙥WQeDXx-wtt ~q ;Q9Ԯ]SX?ШQCṮ.?ߴ6J+ON Sske$''C"k?+311bqU>r O7ߣ,ZJ@Fz5j>BÆ ]FTt4RR+Էl,'$$^ݺern:|>Å 66XJ&;Q9oo/_.<"t>BMS|܌, HJǭU꾗b/p/C<ܱ]`h1wוEe!d,Z\*,(8g|?#F ݖu^Y]WADT^ZZla=ZZa롥%ë)Q9 ;v!??HYbb>"<70h ϟ={V}i޼RSKFѢrrrvesb?)Q^2@RR2Ν;~}bei-- ĜP,];1x,-: ++gW71%W#Vx_n%b@D*KGG;;ر'T}aNT}>酚5k/ƍãG{^)' uǶ;4 CN:An8p233!Jqf+W믑BVVo?Bw!p'%=.vek$7s!%.;cFا c'KԪU\LSkW(^::lS544pd8d2`܅ASE Jx/^ƋaOʄ#uSa={Kزy4i,]l!.wض5 ]pR,V\*{nΰꌰn|hwKmWfb7a#9Ǝkk+xZjF b?ll,*8֭ An% 05Ƥ)0Л*ۚK&Wz*z?}rssakO󎈈AǪ˔Z9T8|C&1Toe+c$'`07 SU37_ke3?#O2DE Jvoۛ^`#H̠"##9K .={ߵYu_@Og<-[WO1a'7"w*:~ Sزy#^W´鳠~}?ԯ&10DDL؉}wo [. 1a'"""",;\z+742A`>[`aJ?nނvaܮe[=me'_yyyp16 :t$$$2426Ĥ^oi1-\< ;~.9\zAtt BS-=} 3fΆU'tŞ1a'7aaa^lZ~Bnٯؽso]Ǻ?~P?a2p.b/Ơk_|={׮]3XbR Fq"b3'x5\$)!^=`o gOCCC?l>ukW!)!bN'NQ:Ů[kEbRXqUw1h>-?*oqf3NqlBFHb ;Q%ȀΟ͛z8;!77Uz Ç D"AZㅴ4B[[[hC:A!ڐH$9b8_bb5jԀ(=Pjttt ͔1|r13{&6mZlL*υ eˏ 9|p\뗯.bY$"""q ;Q9Ԯ]S~AWˈFJvzMidH$'96Lͭ喽>>,[~~#GDjpr6Ť/O?[0~z&iiOrkbl̓UMpvr,<"4;ؗ-[ ]ѰA88<+Z'77L񗡩Yb+W!T ##}ڦZWZL+DJ PIDDDL؉Ҁؾc;I<p4K@D/[~Ei999&5o iFeC۶mжm pG| pW:at?O:::HMMEÆ n%$"""q ;Q9j֬Ͼ7n"//=={1"Lt[::lS+ 7k$M(|g"##{r>*-7O 8L;));w\ys3L<|/IDDDL؉H$†'OI{ /b hDK,7L>^k-usUgwcF0k$aVX\>YG LX-7ςYcZ5ߗ9L|EHMMEWgz)WiԼ#""B)wPW)rԩpL&c$%'@VHN`{!/g$ @dd$ǰMr~n"""bN1!'"""E8 ;1a'""""bNDDDDDL؉ ;v"""""*NTFQ""w]7'&Dՙx%ɐx ;ѻp2b"""j7K ;QһoUTxcEDDoNTv"""""&DDDDDĄ ;1a'"""""&D)??{m0u5+r LTaOm=Z5]0wBHYkD=1a'z/d2L4aa'0w,\3Qc>åK*&%% co DDDĄ>r <-`nnX ]]x S` RI"55hiia8v,!""bNT`7Ջ ߮[mN;Uvhcl'_}ZJ]}:XvBc3+Wnhd}0ÔZ~ܼ]ø] ;))B{? X{XtEN`1JCEijh@SSS886f042YDmq}n;042߄e݇]7'/;-[ ֝C<|x<} 3fΆU'tŞ@(DDĄm b444r~ېx:֭]2 aoos1{1]ֿv:ΞĪKZgo`0ׯaG{.=? )? ~DG~,啟bw0h?~2֭]x9g'G8Er+K ' F6_Xv)7X[Yx}'rssu*.+V.5'86 ?˵MDDĄ ȀΟ͛z8;!77W(;t Ç D"AZㅴ4B[[[hC:A!ڐH$9b8*9 'GbԨQ>?@}(:mof|Sw){vz_*E:h" EԟFcL(v_xh  (tޗzڔYi.q3sfg?_{;nuHIIQ<$IJLL]>^ՂF֋/T9c_ߨY| 4LqVO|KǟNQFF xf}."_PW]KIYj֬i|۩/8`= 6۽[78VzEk\>{Η:k=M}k^yU]{D g#5l0}Mvb {j6Cyyj޼1iuеkuE^2A˗Ѕc'޽zi;*7'WRig{_'OQ߾e$)3vܥ-[H)))SӦ=W@c؁Zr޹())I7xVX)۶7~w}ҭVjjZHD˗m8Lh>|ޜο`\|y0M_3T^^P(e]yյG=o5yJ|۫ A9gׄ ?4M]4~^x N%i1ǫTYYB}o4hpӻdk׮]z9PvX1 C/['ݡ=땗_RV-}HϿznS]wafUWhrH>3忺]8fB|Tii9ROדOݹ;=ӇcYa,KƎ*/8]ǣCk3p"O<4hY}X @3ٳaÆi󦍊+n z/>5"u$j+ԡS7_Nמھ5 Pf[ۮNs̡  NgZ@`ݷA0 O]c:;;;@`@`   vv;;;@`@`   vv;;;@`@`   vv;;;@`@`   vv;;;@`@`   vv;;;@`@`   vv;;;@`P84׮ER@`!gw5a5աS7P к5i#mDwmD`!us6@FqF!1 8Zˢ*(Ty.-)A)~sE"Qemݪvɲ뺮RչcGPZ亮‘z:ڙ#CaJm3ڨO>S)JLLi/T[ @f}Y/ةDJBԵ9L7ѣH λP))U{s]E"ZJY۶*C+Uxfe**CCAA4Mfz}շz=:?9 ڹs\wg~ qշ:[WuE@g#UU۴#qm([V=mPzB3H,qD`O6-e9veΡ(@,f)dEa9#uʕG$U˖dY6NX*lZ~s;t5 Ѩ-Y̛/߫ƍ())\vD#5HKU^'kUڶ}wR~a:@ mWo(7tڧ(GP.Ӝ'3h˕m۲mGHd?R9"Ւ(?V;nQ(=~܅˶TZZ*q`w[n*xFF TZZ*bXN>3MN=G$dmtʭb}cd UAtIGo}E#3gX}se)!\UM.:Ӊ灺m8G5c/((EK…UXXHQa0LQTT+wjP=ڦ)3C*ߦe_IMKi()7/O*9%U)JNJV&MԪeK5hPiiJIIS4S(a2͚]xzu-(QJmtEU*וL׫fyB<}m`GN2 z2L4L0/x"^qYT?]ǒr7Պzs?>҈ÔgY|TeyQQ4z`k-?2 Se*Q^VYZkj)TFr<|m)b}4ys?'))JMMQy(vDmUDr帎ᰊ =;[VڵkeY5mrH!Sx>p wGd~_uF5ukWC.Zň mܴUH٥m۷i Zf֬]m۶*ȟMYd[ztv0ͩ7_w~)׫y5^w_mTmOVN?\fTR=U̼digʎ՗Yo4Zp?'W?=N{2L"x,KsLF#GןzZԿ___0ok͛@^њUܳOvKM U 5@t*Xl)ݏT5L<ӛ7g86`@j欟Сղe {]Uq'b`7MS- h"-|5 jR&o4G[hцu:!rLovu_ڡBrbRSSEݼZnJJ亪 xUhZbd5lp0e1|~t5W?ueA뇝UR̦J4H2亮L丮&VJ6WԎZ_@_oUrXp=w)#tWi=+ۍiIΧza5zfzfzyͲ+ Ð{Mk좉~tYNc;W*))I`@Ǎђ%K}Ae`FQYY$iG`u֒NcuhQ8j˩ Ʃ=$qdۮוc]WN05zc͋Ə3uM$m{=[~޽{u]ٶ3Sfꔚ/visvV15i?@ρf~^-gUPPK)HHD+0yXRJMI{ ׯߠTyγ`dCYFK+ۧKۖɖhx %W}\Gy)ئbGӒA5-9]o{1sP͔_pKçNt2 ƤDjRpV}$i*{Qsi* E5nHݻvUAAB,˒e2MC>O JKMQjJ<umlxK)'˕WP4 N$1N`PRjuUJJRR)12qVNv~!1rںMyQ9ٲWo08cV-׿6/_}{sU'i!7_hh̅?kf@֬Z}J72))oqYZ8?uH|mߜL}l}z~XswYzaj]r`lXW "Hi"VuۋfklӊM;#D9Zy>gYtqs8]}gko~s}';v}q]Ve&rn[X(gf(?_Y+WݓOp3eeeJMM^}.R%''k&*??:nZt,+l[4QJLLT ЕW\3ލ/2m>L~_ {RV{ŊB )&6J2LSiJ2ʐV\dj;,ǕmrUq$T$f)BAA6lߟݰaCWy7&3δ73ϫNCb@g ex9 HѨI)ײ&\vaCό:dJv䕨u*NNNRIi :ڼ9K=L~{~ӵ~sC;=Cr9 ȵmyN;MNo(ȑ؁{{Ew9_ƿ4u}jѢ2/+˲/hZfyz#^a:4M1G>YhҐyaY GYxvqJK j'uFUݷO}|zQ+#G W&MS7V֖~%-[&;;[>}ODe/Xvl"P5v̅z8^֮]3g)oS\|p8\}o.SXl۶P^^Qim΋ ;靏jGNN44Ws L5ө]_աe6Q6Ut={\_O*ezU^^2=/=uzLZΝq#gh%D"׮o e/_+WC3[n8,mؠ睧;%%%oҊ+e۶rrrƿnUO5njjZHD˗mѾOh>|ޜο`\OrB!o/ʫ=5ٯcc=}U:mޜD x^y%j2c>?'y}lkMjī3ϾxP0IDATп^x'^<9RPH:@O>%Oo 5vxIҴ6}GzſjUݺ7Z>Zl=xZ99ҡݘ={;l0m޴Qʏu<wpuM׮붿7L^CY'ث\W*[H{@#ۧV} go:!:t7Hv]k$CzuH9ErP+0dTvpOl@@4gz@a۶bҮ~x{RoQV*,,X}{9Z*լG-zml߮^mWu&CAЇc7qdYlۖeYp@S5K13 Six1My^y<y*tl+t Pɲ,b,+&˲8=GeTmq\!%)㏕~DxW4Ts?VӶmEx;,KVR~**,:2 SG^W^W^W>oՋvb ;@%Ӭ썭 :e#W P;S*'=*7: èNL&;>$czdz*뛦u@ r]WȶWvʕ4x*B|׊xG#tNu|82M<3vgv_hVyF a{ɏvN8*h3#8fuZGXMuD\bZGbDG`P}QQwvv;;;PB!;PWҥK hu@0T^$IhPHʰ.IXL_99m;  ƇK>O99JedYrX=f}0hT/Oka0 Q1(` u'#I2cHTY[TeQ=hʰnYJK˔ubVLW%C[f볒YhNwrZEa^/v٤Pٲ^>mܣkUZʼe`͜Fx*vVYM`x%6Ye%ldᕸ{@ +;+QJ[}o-Mw8|X{-0ɣ)RI5-^PN.\䞶]0UBanq̼4͹^v8.Cgˬ^įr ݇k zhݹ-m|T6@h"?کg ~89yu]g}5c#baoeY]$Dt.J&rMLpS]oZ r^4k٢/`2f',4#R"!!v֢_ 2 YC\T%؂'#a-OL~PڸXUDXZH<ÑTs/~'װL䞶m};|U}aIvCoi8Q\3gX՗hn˹+%?yR DDtVyg=}S]D2](9 ݨ'd.8uOI𑎆=+G9 o>[Y e#?:׵C+!"9~N "p}p<\LNm08q½m/=NK*a9HD)VfE|mՒK(D. L-{j,Uac-XE"e9" rz#rTD" .un(kc I~NeVe[HD D$K%,itz$Xw3(WCD9E$F~3=KiD {TK]78ǩ{r8ۈVM%,j٤>uh2#q9Dt#SGdݧO+ю;Ǝ;p}+6i|Ѻ_zbI9f<1 PXysmDju"Lj-ptrD.81Cdz qe3 [ )s$>_y/}ޙA\"+ HD$dR\//RE"+4ڐ(ME Ui ԺbJ4hWΉ)g 'm*%M_/e +P7kN$t3g zWy+*DyW\ֿ+~_[gDtȑئPm--$'j^,9zZ.cF$M8N*=WHfeb"**>UzuH3k ;o*d(DCZYIz"f`3%봨'u~ 2H*K"No-e]~Ɓ9h38b4:Mm2Ֆ&;oe9"*((pl3B)of4I"nUqÈKvVDlKD 4=B~]m%6g#cJo܎.hub=b 5@zV>G\F'u bXN0rzAg0H$|lK?Z2U/Χȥb8OQkue9:X3#3UmSmХVWmIuC"1~rbrTձ&?KtVhC(;׷g5QPDgt$!9C.3f 

7Y:vrV{ψPJ;pBmF)kmvjnfЖ(\Y97wDJId4:nϻ{"fCtB fJoCmg;ۊ螊ճ"˰g@ *,aD$D"1rC8D"FD+'Ӱh\nJ*3 uzCN^˲)N *Ưz9^qډH8fc[ąί4I:Ak␓_l`9H*,V!'2$ijjzlm,lh1e^ҳ`08?:yIeU2t]I@"[36=Os 5.#Y}W7`e~@d0a {6@("ivj>i&%l ,InPGre9&J' K$ӰXs D "WX(N_q]%N^{OV CzA?'"ÈDH$+(l}ƬʤĿt[l"Jfvf.&= F1:_߮[AAϋK0dA2bzz1x: Ԅ]dR$I8/saҋg3q±m ʼn?-є=&"{EGIH*tĕ {[g[Tr.遮}}wsyuu嶾ETl\$gKoijNGjCU ٪&Ѹ.D$,#0篠XMDđT"3=[,D O"$bVqWP68VYcbqW\4:eLdm^ө.<̽z+?R$Y˭ݚ b9[#)M, Ws c9ŵ$ڛm8cqmfI9<j"[˱ +bh"1q CVrXp:4,>DO>oɾƥҍ3ǕhլD"N&beR{: m61ZkN~-䋇9|[U ˷6Dl$r,Y:8k?nQyr)l L' )#عv@[/gD.ٹKl8V*mEK#F;ʿy0";!]hw9y$aIG :5,{QrN'2 jϷ8'1Ҹ'<ݙc ^jKXc H,E2kDnƜlDs|xȈ.ze6HeILD˹zW]fWW,}N^/euO:V['D^'"fϥb"Zyj̱2D =L=Q(Dv. e~^^_enRR,W0" PYr"a8Vy53YpW\:Z^O*>$NrkԊ3qʢ5S#0*NT*חC-],q۠,4S wo\2h2k:r[F$#b#Dl{hTճVc3}3au8%T0mqb,k mAp*g]H"c-_-jll@@l@@l(I9O8zaxFxac6M1q\Z5{4Yh P{x6b6 f fb6QLLL&c*660 :"`}wG>v~!00_޴iә3grss|||T*09^lL&sڵ#nݺoٲ} OM7f̘3g˳f /((OvvR4.[VΜ''' D—2^,-ZmpgZd춼w: 333S*bXlceG֭[wŤ$40u߸T*KQLL}JV88^o'8.44t`@̮_9Kz~={Ps 6W^k֬A Z:N*FGG 7ѣZPsnݺuٳgFbvöV-|aDƄ' ◧LR:@m{ fb6b6 fb6T7ӚҖvO4^%A:wf͚+߸&<jF>w<=;ѹsL^in].t:DtQnپc ou}"_|S@ӕ1oM9f t]Q7o͚=>d+˦oO:ɔD٬s|Q_-+'b6@yegܹsWP 2?dgs̮&M/_5ω(33 ?矗/&3bLDC28TVNjdT$<uhN,_0?޺mׂoݾhcolB|}a}3"'N1cF~~%KOND#F8p:t(]zڵmMD;磲F)s}ԛiB~{FuD4uGYz&Uex1NwLtx‘I?6ރ0 PyIҕ 4>ٳ?lԨQ~~~˖-㝥k3 㸓'OΝ;_}}}ӼkZIK-n{7U9h86R]]]ϟ?/7lؐ EvvIG͟??00e˖|J=nܸq~P 1l111R$%>>^RZ_Hsss3)q\hh+',,GVVVf@~GGGmvΝDTO.]h"##M 6W^k֬Gyf???1~^tT]:oڴiҤI!!!b8 07)ugggϞ=[Hӧ^GlB~%//N:uTE)S ϟСCf~#Gj`]}* ?? /<#111BZ-zPe==ٵ fWɄ{ٲe2,&&FHvttݻwFFF9l?oɱ鸸۷ge= ?#hxx찰0[[@N'$Ν;:$$d޼yZm8.- JeĆ B.nilj>/>70Wg]5Yyyynnn&/PUïg!ï!YӶo|nOP`:o|ҥ&22200OJ111ŋ-⬬,DDxԬ`>%:::88aÆ[RƅC$N:uT"Y塡?̳1|pI':[BJ_<毴5WʙXfUUTijqїX0|st ^pquT&ݽޚܮCz~>'njq E,wA5CW)TbVWK$!jQm/>][nj7#zs)+gZ-ڵwp~ܾ}dd9} Kݪ毴~Gn{=r={7~/f7b7/1DAN]{W~vڿ߰铏?bmmݸqE '=I2αqGZزuaG=Xᶽ~=%8xç3r84x+% ^5}5++ isBU*O38ݿ]C|,|3G3~:v2n{o{!x|"xˁ+>x2١oOtS, r~C1&ֲ&/_9kYj5lϜ:~RRGWosAY[r#诿|9""IJr${1ah~jۦuYOn޸*,XX{]ݻjjpl?ݗ-]d?x͝}ʅ?|Tm^ԏb IDAT1in⳧+% nXz@;rfZ9%R=[[[, //_ч=^M8vܤ_6kT" <0H Y1okOxo!gvKo>,`D">hq gK' gtXp1A{f3i{{{g xV)NJmmm˳anemL9`o);' 'qV}k_ io'J#ֶm02*z+-)V7SztO?j)7R;w,X*㷊ʲ:ĭ(wVuMT=kv]v>v.\5:[S*?lz9?}{{~w]y+o;v,9[R] *=UR&"GGǪkyTڱCnҹH$*X*uBUutHEi4'N<ФȀ}o2 v '4`CZv+>_t2VEM$ssshc+V=h|nؤi~/!7WU2dmYY%% jW>]"))Q]3%B 5pS߿wk 9/CQ4p=1Zv뱺cvdd$0QQO8ӳW-iybU.[pO kaaGcԎSM=Kmyw?,Z0O>#جY lpݺuCƎyVYfvÞٍϻW U tIJN|rW{|urR%/O8=yf-t_t>cԎ*meeէw(lO_]~=|^0NwLx‘I?~[58H{nKUI}[kZ ?Fmgmiڲ=f {?p[+en޸Z_cСllJ%$$Y&>>^q~!CY~}ݺu]\\נALtnݺoٲl*_lq>.ݼw/׺`'ܿѓ΍x*Q7jQ붿dz93"?qݻND#Fo\pᐐT:nܸ aaavvv#GLJJ E``pW3F.?\rVnkkk\!sLga[rfZ}w}jDNN|"H$K&=znݺ/&%YVY+˸@g̘_}UaGz׮]ccc3ZNTG ʵ|Ϗ[VV/<~iŸoO?4|pTh"UXUN__5jΝC-&lذyg.]Rʡ'vV[6V'ܛUC՞:ujBʨQΝjS,Y"V/_اKޝ[/޸dYbzDY]=q>J_NO!˳o&2Uᅭvk>fKCO ^Xok٤,Io]/&˼/?w,h;ycxTb\q"5DT~|˧otn"Zy|b'wv+b6Բ8o&ӥM˦ho'*l7$&/?gkm%{wɷn/xZ*d}b^a#ھ?'B;WbX{n߯DD\ևGD-_[{#>۾==sm"pD,:u1.$zgZ>qէ?g>t )Qh :nƬUG&M1O8r=G,7rN]h}[AdiE2"N]LliRX{n+7;nJD|Lȩ˶k ,?e}{~o: lMǎCiucWmƧtʽz{bWɋ՚M"|2/[U0m֌lմe[3sL*kMxf6͈S&|~6VU?n֐vO(|rtZL&C?ȃ|wSfn>hv6|5˲ܭXm\P7Mj 뢒ǯ/WƕWKJ3e0Dܸ~[vw-g9:vu_7$|ोiii|ǭ_{+W*'1OOk׮Q U/`S;U~\xVP\g_ ^}Um Jx,V%JkMn ȧ׵[ r_~Z3ޚ5]HU F?~Ovvvjj݌3Sr$NNN.O6 /~F)ukwЉInu"ѐ˧Ookԝn{(6^.Ksz7鍊TbXKm+7{;Ɖ٤䴿u-gWoՑ<[>tK.Z[[+e˖Z+ʽ{ s k׎0Lttc޽322-[!bbb̾}^ODc͏\6ͳu?~=G5hYA1~ sɽ;˺Hw]382tWnju }3r喳-1G{yѴ7G,ڰ :"5z߸YtժUGf ҥ˄ F'֫W&5ťo߾>۲e qfw߿?99966688/|'%UP~{=3)E%sЪr*"?sy/]N^پP:uxp7_Ib-er F}ϳOOn7Ly,9,:*aÆ?|ݺu'On޼ydddN7nT*/f6AdzJeaa!ǩ|}^^^yj$<77Zu:uT*1J1 ^{+Vddd/[o߾|z^v}ԩ-ZXaҥ&22200OYYYO\#nݪh/^QOr;wiӦN:[n"%K awww &www.\o>777\Pjl;;-[NoӦg|*ԩSNj6fsBBN۶m[n0P*eUM-͛0aRT(۷oyyvz;m߾j̳0[+KAC_NUA?Y)ŋJŋKJSN;:Qr+O ooo+eE!f@ڶm[HHw}Tz͛7ʕ+q\7nc_rǎ[|cNJ(;;{ȑ5liiizjڴTtT*˗/ٳL7""}0'<<|Μͻt/\pannn[˪_P6!f[O?Y[[OD4ѣG߸qܹsB/b„ QQQsSׯb "RtcfL29sfoqW_}_'?sNXXXZ~n6 fCM8fw}BD񸸸#Gӧ N<9f̘ݻ?Oٷoߙ3gq;wD 6 ښd9sM@@?"o~駵koB/:u_WPP Ϯ͛/ `?ѣGQvv6Z8R 6msNRcǎѣG33ۀDdҀ7nذa…-˜1c|}}'LШQ=z`³kCCC~g]z3,,a:tݻ5ͪUݻ߿?11k׮|JϞ=###Rn֤I.]dXRSS}||wqF 욷7@"y7˚/gffeB²e<<+,,600P8i;66EUוP#Ucv9g2227M 5i/:w@\m|F:uK!322Y%>>^RZ+T*)..^h8bĈ[j4ŋmܹS"(J ٕ/:::88aÆ[.\o>777BQz6m&˃1,dz:-'~Qhh(윐m߃Ÿq²W fOJ<<* ͞7yv y6Ufذa()))--mݺuKLLLIIo.dZ6i$4lY*mg͚iӦy6k8U8GSSvG.]l޼ŋo0LFFFݺuzT*Ϸ'=vРA|AϞ=7Y:ݸ*mW]\\RRRKTmﺶ?ZCx'P}͛Ϫ}DΝ$"OO?Otqq!"DBD|P1˸yT*Ѱe k̞]YzZdBXX??rZьӶyyyӁ]͝g_P ص qaaa|a*bawxrj^z޽ԩS-Z@‹-^`AvgffeՖsss|||lԉ3lԼyKJ}\3jۥK.Ydذa2l"WӧS>󀀀w^vrY &O777P3fج^zƍP3Ղgt1{>sBBN۶m[n,'>|*@12*1aRP(o.fso)ׯz4jwQWΞ=/OѨInO~5M7޸Iӻwnѝ;7iVV?Eݾu`0ݼ!ć֫޽Bn$/OŲ?o5nBN̳K,7lظiz#"N' C֭Zsvt3'eكb2?ogm6'bvy{dffCG6p&||ݽgkCf[D4uԏX5.n6'@MSs7n,%gJʵ&ewpt{vFFzF4iڜ8F-I$ҲͰY yv~Juv쨐.]Dҙ7`\nuBo=!zO<{dCo=k!'bvaW)?AL,[X}[7+IGw4VV}&fsԸ -11*/kkh̳11M /GСÚ5k?׬YӡC f8III+W'e˖%%%1&:~8;vGBzbbbnryl'o^TݻOafڵ#!Cdggbbbd2T*>wȝw IDATBĉg̘dɒӧf ݿiӄ;}4M>}رBZ6i$ @̮>}W^3f\.?~|nn.x_W^iiiBQF) ":|pHHT*7nWccc|}}K f?m޻wwرѣlRHurr2AHɱ#";;;axTTJwuu=< fW0^^^/޽X,8 yyyeUT*ٙOtqqWTVǀݻ;wQJJʰaze|1X^v}ԩ-Zz~ΝC;wH$JR|@}j&1{֭ǏΞ={t#F~Y|ypp ?6m4iRHHX,ƀ8z/)D/O2_hӦMjjjxu=z*1ýK111111[ͽw)09cϙM46j߾qa0֭gϞ d>CnnJJ-X]vD#ɤRc01$%%[n޼y)))f /((c իWoܸOܴiSXX\.ƈERӷO"1>/O2_0&[X399xBggÇlI~̳11111+[رf͚: <{B%RV\ODyyy˖-KJJ_2g8;}LzR(M;]]+cC@7X]EzGZN2)ny8fDW% 5s{g~{29lrzɓ'5k-No߾6w999en޽mڴZ5k|9sfݺu-7|SҺufZ{gA|oJ;vܰabÆ ;v,9ða͛x^~ѣG>>lٲ'Zf͚7v_|Ս5j.k&M &&&~Æ +g&M>|x~~!C 6 i|!Ļ~1*lZ?zq $I9r7oxVZ˔$IУGG}}v]aLL###QFJJdRUnݺϟ/EQL&S`jVV.ZjIII#777!!!==Pɣ$<-PY_*6mzcǎ%''hѢ yNNNcccwv:Eg0͒$K.)S 2/^4Y`vvB8񀢙TWg$Ir˴iڵkg4KaÆ9s_o ->O4MdY.ku}4M߮^+uBb/)⥾m*qf !:v_3[W&)222:tXtΝ;$&&ʲhѢۗǏ8CE1+U ӧeYꫯ7opԩm@~:u|ee… G}]w/Ro1cN̚5޸qcF>1"++/]ٳg6{ڵ'|7G9ӧǠ4t_W4d6   l>$+KחબK,ۖ,YB]PPiӦ7|sÆ }ݻw [pޒ$HJJjԨb޽mڴZ5k|3g֭[b|7zɓ'5k-No߾6w999e2+W[jժu7\Ro|g={-_vbݺu B5j.k&M ,055511Q9f`i>e&Nh5kV^^رc_|ŲV KrСCV#Ng`/rpp!C~޲e˖#GvA !F!C%W @gxVX_7Np8<f BԪUKK.Fzj߾"==wٿC.322ZNgDDDі ٬?6b+qek֬i۶֭[ccc].m۶ӦMС`BW4}wk ->O_,zcɕ@f_dɒc3F?z|6mZ`jLoB?~|:tx7_K.]s΄e,/ZHRlv9dȐ@߾}v7u?uiܸq`j~v{^|#4hРAW4cƌӧ8p޼yzˬY&O4w 荥LZ#__ +g-֏;^4JV%N9+z*(,,ܸisr9@ߨHHY)rٽ?q{<^"5vvqՆuG&{j$0Fմq/Xj%]t}'yPn+V5Վ^[';*}өu5~e8UVrZ Z:}w/ζl ۿߙ|0E!4"СC T7fs]{N$x߾d2{8m٨4M4MQ|~]qwV4htNmа6J:rНCeoNNvN3//`T5s&TRRҥKi.]J|}0*P꣉6z#wy$d0$o?F%k{y2FUbOUM4MUU_W٣kG QLRRRCS'{>Ih4C׌3 d0 Aj^}6/޴t 7'S3S%I$a0a!7mt=} fMfr t=?>Hꥴ%Kn6Avwٳr}v=QEN>ssڈ*/@Q%FU4M4opS+d7Fd40$%Y톁K?+9甿1MM^?~ys_ճ>7fҔ zsntt"33 ~q_mޘ3+<<\'_bɓ2qÏ?4h&4MeY2H ůݾVMK-& \M7m{0Q1r\5Gg_T{ÆML0ǞmA >!4Uռn3/dkB?huHr]d6p5%'S7.2FWGoqɚ/[B[ ߔ<$muݻwBmuzfo޴矱Z>2˯sڈ*OW>q<73~UeΪ YUU3L+ k-%zG{O}u'AAAz_#l6[z֭L&Ӡ{+0g^=*{4i+S 6qwx}^MQUUe5'աUmZ昘ho2|Cbd9˃ZqYYٗfsL&[4׻q+W)B`kZjJkĵ]գ[G8[QT\ylgVKB\r5 !%77W3888'''0gXXh(ollpYSS/lܽMV U4E+Uf79B&l6;6d2)HqEQB_d6p5+=C?,WdEӴKii]>u_̋3 vзnޢy?z_:mѽ{|Ñ \j#3uk箷o:++_&|̣زBa (uq]7;s6[;IVb .dPUEQ5Mj06{HH`(YF?>OϞMnҤq9$#}CcNw[Ӵ~l1qqq>2."#gXJ;B3̚4kvCB [~ɲuuV_׋/((HNNEp}F 7u]EJJ:{\9Mz_ߋOn3`҂Mv2,9\Z_}ՐR=KeYev/^k֬۲,ر~̪WN|\ӧ(_=`-(%>{Ç\~3?Q=&78j.W^KN-Z_[:4͛7;iB#F~_HB"d=Ç }}bsZ忶"1*$hպ?_H̛Z=nI&ɠW{f=̙?3z;wntmf6Go6cրgӊU-&fןW{ WK֧KNwBڵfܵ[uN;/IKK_z"FDFVGOO:=ߥ0vAAAΚmаizM[cZ}d\eODDD۶m>qӞwSi;YϞ~ޥ^z!nM~acL&S׭N@}Lj0RRRߩӭ>/++ٳ'N8|FIJ =~zm۶yvԯ#l6!63L߸i/իge9^Ӵow λ090.キhcYawtqٻoΝ3cK^4+gҎU599 _?Wѣl=ZѴi[bGؖ:@ֿ ccUHdZm6sPM?j KNN:{tzF`հuBh&d _7<Z5f(( w8bW߽|p8G> ɠȲmԞv߽#{ڬ遖5 !˛sssmBJti=wC:rx^tyh4ޒwfgPF7RU+%ssv/;z4qٝo홗Oޘsy+E*"Jٚ[_O7}Uso\4m¡G5o,*"f +#}ttt~~vV*YfZ=fFzz"#!!͛_wбب!u8hܶv@ض_VqC\EʲA! h$iBeCP_ .Ï>Ɩ~_z>;&::*//?&&:P%c G>qyU+ j~dKd2r22,7p8~b=X}v[Æ }enp8M4zo7L 2{lGej^^^nNnuλV򻙛OY6QFAB=zt[|{wSFYɲh4Z5kתn k4FbX,6%(v}MڭkSIEwQlR Xk+Th+~MlJx\G~sb-~K`/l~s` +⚔tzϞ>p{N/X-_8(s7nRe5vT;$I}M߮t"?싞ĘhZb=twԩ-7/?̮gRUq{<MBh~UOۢOz7 Z-R_^[} ?5鍹o>9/:u;zx_M(BBM&c||ShlMU:mOOlO?=a+Qzvo]`sL~ ~۾>{F%jϽ,tۺM]{L9q6}=ԯ_n5.Z]::m-7y:3jf+rXXhHHY\9VFѨX*jɟemp8_8_|]Ê<7+Q}~ nۭAV}l][R傂fX9,9<<| *lS,uj UQ g}b*+xsxLXdANlK>_^~96q0Ǻtԥ}}Eg,tH`Ycc ˕ q"#c(^)&2dUضZ;7adXVqgx$QE_:uhwf_k M|Aeff\`FCtLhx13==]eW^/H=EB={i$ ="4Q76ra-6dMmd6GDFF:a<ů>^ ,}vXX؄[,fʭAlT}ujr!%MӤO43-jպ־K-VkFwٲe}e2zbb"FCa̙3g_(Jtbf"**C.d +v`0-v`X$ Φy=(̱1#-f OJA>pJJ㽒 '9!qqU@6[LLL[4m8\ʮ{/^>Biq oqqqׅ:GH; ƦMOpj_~G$d,uֹzo%I}Ƶ4X]߰ )E9Vj Qz ?)}?LqqqqeC%d6gOez@S8գz Q9p"3?2d6d6  l@f@f2cMs'G:ckd6@!N8wBP[lOz掴2q<~Ȼ=ǟ|vmԃvd(~{v}{~z¤I;~l~G<}ĜWP֍%}oӧnnS:!mܴe~߁{ uҽQk]ٳ֪-yğ=&78j.W^G'>P2nO9?ӓرjҹ͟okO̚w7fZ}z{??[҅tqtk˕_ǟu1k.w-:?Zjƫl߶[7FEF:icX  ?#vW,_?Bt!_JM+Z3'<<,4*22,;wۧfb lן_ݯk92""+;ZLT4+/,,Tg_$&;~ц[ iW}|:EU՚ujԬSCa02(5$YVNK@z=m~M-gJ+ԪM7o <ݷw ڰaw,v aaaǎ8uȩG'ȁrE"r;~ڷPBkv́7mnӦui!&N;32lvbNv{gWulظ;~⅗^}}ӧtzkn׎$ouӍk֬ݷo}n]J:(_/s؈ R.eʕ}#gR=X7n߱o߱sΜyƎ L5B >~*~^@E mOM<q֠atOa_}7?_I}#O9 q<2nl yzć~,7z˳Lzr]ԯW9*`~ص;wo߭wgDv詴 i-z]?sW_q*))Aٳ7iҸlqq mʿq>pG '4I:y3{EA.ژ)*-֏;7ܠaSMӮ>叶;woߣo闝]~ోiOT B7/79l(uotOaˢ.)>VG[5MtjMM~)WU Wl<fIմk~k+,2*Yn$`4T;dU'=YUTخŸd6\5[6d6I$I2 d6q94l@f@f2d6d6  l pGbioi&#w~&+Z"p0Aa4E*Tpu Bӄ EK$_\m& IPT rf4$M\uɪPT-rf=5,$I32j¯h&-kEg\5$J΃{IENDB`kildclient-3.0.0/doc/C/images/we_protocols.png0000644000175000017500000005023211715730227016205 00000000000000PNG  IHDRj pHYsktIME,_ IDATxwx3[B5PB'c Xrm^^E!D)]"% l5n6K&<><3L3Y}BI)B {-%[x< YaaKZ>jB(BI^Щ*$u?FiGٶuZwd#TBߣGi]:It'ޝ2^UJBUObWX7G$+")ŞxŞvCIVd0a-|=tgp3~cSv=\ǚzxO3Uϱ<҈VY%zH~c u=o^TT BH]xU+ݴr^Yף^c7Yod_=lP/^~fk'JVTr=vh^xe92Q:1gGuLrbI˖uBw3}/e{W;ȊώoRƥ$jDUխVdͳ\}<_Zv58 =T6;cr,So4I wbˠm{BD_]_ʮ]FߨS2r&U9nF^- 8~ٖ܏.[Zw.hY߄5Q\Yɜ}Rf {T2a]F e8^T-mR<uGI]}KxJV:VI/d͍"}tQ|o(SdrܲᤥIe㣥kIg_\ШB~/]=eۛ&/1gTkoOv޽0ȲB]I+)Qys,+J>pUp=\R'8]VmhuOܘtBә,3{W>j"o$*N3qkҜ*D-!IݿBgz |gLIeӉ^UЬA-^.n;eUJ!&f+Q#?;Z[:/,f)Jy?0VurEȣ~V!<%I2vYdYȲ"k?$+RQhmQ)`oN +v!szVެ^f$+PE-i+ka5_nȿw4!Nm_t|>!&ʐsY^m-[H\{"5oU(WFV^^ YJRGw*]{}:YnRYmvف:s ipB.BݻwWܣgGM$j EsK!= ҬmYVL>7w.M. l:(BRү$IIf^SEBVT,[Uz-=ǒk0dtBt:Ѡ(fW`R rCB\ЗH脳_3\ط !bcc O:]Cqm֩v9cfPD\Yrluf$I:.|LUUk7&f^q//dK!L9%[)3XBq2ťl zI@3b{fy/\n W&'BJ?k2yku !JUO(*q/ IbΝ/]9u%V%ػg7CPbŊ'}!{Xe3xyIʿbGK,Vޮ(LR2Uް،zMNRT$|ܘPv&RJM)唌oL=Mمo\>7?k\{ `U!ĕ,S?eYV9]p|r)?',*WEu7I{mgb-M}o\ZEMޘVOSj+Q& Iމ vj :Ǫz$??M_ !lذ\Ѓm p3ݙdsBO?+:qu(.VU``A*OPde(*+NQdE,I:!!ʊ,+e=1os-t4^c)K{;^~5-B\0Xe!Tu& zYQ\L}_"2rR2s M4JtvFY>vj1emchrHt}o;|q9>O}wt`Au}p,]N&-6lԟ_OFU>,g^wB: $٩& w`˨ڏ 6YmDO[m9G~^BȲX} {p4qr>A[(!dER7EFf ɠ(j?&N$T} ;h~ZNʖB4QMs!D]y' Ė'%In6L!Nt:Iedp ѯ̣é^=[?f{[8D:|jn,\ )U3=^.++K>{x_fo9&Al9kd WؾnQ0rd6TUͼnS7)B>B, gBr?]fh]WשeE5Ak>7{6{8uۑm+U3o={ow/Uuf%{ܞ )\M{rozx⛟sSvYH*mEEVNBhПu:IcL}Nb+˪S抢JSEFvBvS"S ^`վ]<ިFG˗rڱ3~)qǏG<~zDK 炽Y鴫Z:7KT?#n~y !ZƯUKz%4^FY[3.i/=m.څhb[|ȊݢXo(vȒN3u&OyM۴Ih?\LЛ3>]^9ɷ}Wvٹ͋rs1?"5dQؿ'!X#9]\_gBUr[MHI[l]YW0 I,kVTUb"9[n!;lћ<=K?7{L^:IH:I{ǭX/=!UUr|6UoRlBUEܼTHCs%!Ef8ٶ=aPEӠB;66  mpw sG,;.3;B 5PU5q<䱭gk6k mm@lbk׮5L$yxxlٲ偍+I@l^f?S111 Pc;""bٲe^/\zxxt-==1E9sf*UL&ڵk|wի' 2*TXx1@l ͦef&L^kYYYF}zdd$АBˊn;|Ԙ|J$Io6k%˗?`PJ*.\ꤦm[Pk׮,Y2p, UޡɒNZJbgҌ{60];T199h4jzyTӑW^O>|3a@/F[Bk:8 jnw-k:rsyꩧvU-ٳgBBn_hQ֭tr˚z 7o0ylٲf4cbbwEGG?۷oUtr˚K,2dHjjI8bj//U͛ Dx}˚ 0`zر+PLpSm@l@lbj5j]rEqaGV 4n&MZ?!%%MmZ5iKc32FܸqS=kYסS {vCoI=6m @~<y N<%Jؿkʛ]ݘݔkN\;S7m٤Y)okل?K'"jmTag /TmYDmڼUѬY5kqf6BMIq͚6q$^Sr.$!^g lܴYQzuT{1/;c-^:& \y;ϜŒ徇ǎ[f9tfg_opࡉ>YǝǟE1/\>Ï:#G7~Oب ܬᑣ^:u !DՄm3 ÇԬ<==CTrŲhR!D!yOHB-[ƩUk=zuB|rcQ֭ uaa7ntիV_Y/֯WWqeGc_ڵb]:!D.u"Xa";;[W={lQ6nHq!De '83bpiӦB&hٶƍN *TQ^eaSޜwQVVl6;5nu˩rJJ˫=nQdIu!2@d!D  !.]$xs$5]ea!`0!Eqs83bplWT=g7k"H:sP9}ةģh??߼q˖)#B/_ޱ(׹jJ. 0=Rj5-UO~Bk޸O>۷ooUP-bOqqqIcUU6i7 vƍoWFnܔRzuN}B|7mB 4M'{Bl޼៫ը8v[=8'?lBt1>{ !}UQɧ !?QAS?__%(U*;Fm^ޠA=NKw_%cǎ$IN&I~4=tk͚%ԯdg3gjܴh]&BڵԩyWB u9<7ّ#d쫣srrNZZ6Iʕ~gj˖#ǏͿtWnܸ1gμ7ڴi=sT!ćs?wFz^&M5卂 `7pob_V wSoIIJ.jժ'wޠվo{ٲeU'o_ҩUI:uj ح_^QhͺUo3gvö1hi={۫V v]d2F9z$)&&DmڴѮd6+Txb!DZN:%8uT9ŗd~ض]۶O4 *۷oɭ="sN2e[^t駟~ם :4***33s鑑B>}lذA߇qn];omY;x8UbP=z萐{vmٲeǎݻwOJJr{gJ;vlfyȐ!iiiNaBرCwl=z([+WB:5z[oկ_5kj%-[ 4Z*@l;6W 7U"w4pp=8 <wpSGEj-38{Q܃ g`~1_:p >%%t͛E j֔?foU9{`0}$L0qRXX޿ǰ-! IDAT&Nz,4_Vw;nm[niӣ9wz_\ٱwpʑ`bo9W?㣕T\yȑ>k Q C2f9tġh7l̶Q%,t9(. w۵km GM26%KҾcԩS!!!!!!W{yyEFF-YEtʕ[6m;g+ck%&N9bχDE> _,[nQ#=˩g6!"`9WƌIǏ=ʼnOv[+wik!={;upN{Ͼ}{vY9mFtaG~KNy/of7eMox#St..vw۬s:vh+.:{bEמ{;w~grrr}Ys{-h]{ۣGٵKgݮlmXXwԻWό?#vfe;v:۶W`ڥmߨAvvmla޺vN=ĶN#zܕ]{z 3 {ؾcV.k~s\t(rӧW&c.?K{kp_z׊{qj:(w t¼]?@׾jEB KF1==éɵki5k7^o>~#F`4Zn:nzBh4a⿬VkSM7e}'˗.N篙-v\:veo˚<7<33/mieˡRS.%%q?{b/VdqJJNNXqƻvݜ5nX{\Tfۅ7|s:DDWT[h/Gѣ6l`XFBݽ`? `K,˷n1}{nٛhlؠO4mX׮.]*++;oBݐ7r===_^D 7\,測yCpǻ;++[F[ZH.?JOY~y$`<Ћyo5}[޼gѢE۷j߾E֭fw0Й3vҴIϗ}|괙e]8 ޱCIgdY^r!{X7 -{С?֮.XhZokkf,o~sHnZYqY1MKK oڤ[:ܩK--$CűuqV m_fذ'6y^^^իW߱cGޥ999=cͶ~ ̜޸_|~Twޞһ*V[^긨T}|p˞ۯ>qQ:nY-};m`hӪUY/}}b+z˖g?M+5 9.kvm;?z>!js/9\Ǫm1/꼏>yQwmM3%Iz$iƌͻ|[%IZbs=W^իW-[6okǔ߁Lѳϝr*πeggRmw|~w>_n7?ŋ 111­[^t駟~ j5],7Lu^`V,XPN2eJ7Ʃ=|JpDNxiP ]wbl;555 ٳԯ_?ժ9rbݺu9?_%}sqlb]_%f3EO6p,o3uIaa=1++{zN8wʲ\PûNM ُږ66=Cyz` {fϹz5r#G _,[nQ#=˩g6!"`9Ӭ1|cF~qV&0pBڽG{N:ܲj޳oߞ}~kNݳGؑҥSދ[YqY!!p :RNǴs۷ !v iB$@tWmZ}ojժ}Zjn%$$Mu@7SSS ZZЛ% t˯V$$pXZa43\Vv^/FW^?b FeK֭7?!DA&j&<դq[wR|9DZZzBoooǥo\,測yCP#tL5jٳ))|E[Uնkamk^9w1o޼m۶j{ʕ;]:~K42eYf֭+V4Lk׮* *,^en:9sf*Uv;PTd7K*u jDDO?[~1!b??>yc ~e/9'M1f46?M4t;kiBlrF?W%ܴrY-Utm۶3w^F f-gw|0۷o[ɽqVZUXe˖7n,64hPvvv~"##u9'OLLЖ:4***33sZ}:ŋv;ܺull [@gڱCH&?_UfZ,ݻv|+xO'ey"~a7nd0K;&Cvs?XB~`j]Ữ]\Ю]wȲ!ۺif7eM@קHץSǯWn y>o鎏5ƶܣG q̞Xzu޽}Yzua߼yFO>w9ʧL۷o#G=ǧ_~6M[zر!CMy;6ߏ.yaÞ.y?=s{O9*U}rqc61r,ﲩUsΫ]ٰBҾG6w0zrZٽg︱_Ĩ/߰-['>M+5 9.k?!!v,̑ʯY,c;t({7bz;w5&lU$UU wnnn```vvիW=<<~N^; vk(FQ{@$I8x;ի|ÇIS<SǫVtnfs.\3`ëTsv(Y"e{oKiҌ{6v3[6o\CfͶlْ˻ZVVVw(ݿȑ#ׯ_ZA^?nL2ԩ`[/XNeʔoB^Ay/{ b$_jըQ?1bժUBѸvڜS:!D7l`ۿ배BXbbb^͛O;|cS7nвe __-[lܸa挩o1zo&EvM͟޽+']}mZ۷h"GIx ժ;}t=zTT)77ߏxg:tlٲBؒ%K :iҤ}:JsܮfM'66^l0Jb}n{тeZHHv06 (v o?/Uħ.]y󠈁<ٶNWEK, 'ܿǬ 9a⤷ߙ}KyޱV[]t#_^(g׎䫅i+ѹ5{ի)Ǐ'h%+W9rϚ=gBԸ:qg?k΢+%Z.46:U%9TNɓ{_f#|||VYwē'oO.g?1f[֪Ӱfz?p ^+~֮ۨupUk$$g^s?##skȣ{aϾЯD8 %Kr+22jɒ/ U.vS+cƿƤG'k&N9bχDE>#Qe׭]9jij3g9&Dr8~P uꧦ&;Jrrr֯[%h޲S]ogϴh,xƋoBOۺ-oбS}{w-]z0uLŲ{.]ء3,\z@f۷s<3=^ߴBUU=<ʘeuD;{baÞ+-''gL; 9O5_{}t:#gNoi/>?*owޞһ*Vmb?PA4}CnC:_[zr].?K0ɼcGNv޶][pլQuOr*πeggoݪe5\ulǢƍm޴iihhnL&N(Qb/łpob_V wSo,lX PzSp,7uqof˖-{ʕM6BkĂns3lҌ{66Gz7&vzտ=L3&9 .۸5C;  ۻ%(G̶  mm@lk4h0oޟ_F2o޼ h%IܓG#GfϞ)Ș9s#GEr0(B-hժΝ;qqq-[?Q^vd25 O:U~oF+IKK ֭[zzzA *,^1̙3Tb2֮]+Wtl6w5555TjPcM6۶mBl۶M6+DDD̝;777wʔ)Ç _{#G_~謬QFM<9}HGŋbbb"""t9hР~m^ޒBˊn;|Ԙ-Iґ#GzÇ7h`ҥM6$I{ѹsg??^zu֞ZĀGW˗?`PJ*.\ۉㅃ,455UQeeʔIJJȨ^իW:wEPҩUYiP Z|z]n .8q~kذa ˗/OOOѣGٲe<,Y2od(I^|rA]zׯ_͚5 M׮]B:.;jpo=ؖ$UVӦMkѢ^_!00p۶m|A=B?? ܵZj .44TUUsa@@@NN"++TRNMxǶM6+Vpƶ6 C@@#W^o߾իk%={LHH-jݺuAc%&&+888\ra7l`ۿ배0h4]6''gԩW{l۶j-(.\8|pƌ}IKK/'|rjZ|yAc-YdȐ!&MrV.;|#""y:,[L+nd>}zo-iPL=;Fl@lbb6   ElW$]$=] @1UVwժUztl_~}ǎ۶m[NNVҩS' j%իWOJJB$%%ժUKd6+Txb,y̙UT1Lk׮ O:U~oF+IKK ֭[zzzA@lƍUbŖ-[nܸQ+|מ|+W8p@+ѣǖ-[[nݻbСQQQӧOttxńGo#G\~%YYYFjw3ؠA:ts͟??..N{B Ν{GTUݺuG}7<cǎmӦY $hDPS| EQTrCwҩUI:uSAK3bbby!onnGrrbŊZ:b9ruBW~'eZ!IDAT>rH>Ƴ&--dɒyKFZ; {p7oܼys͚5Ӯ-[633SRdj޼iӂu:"44TUUQ222jjv0ZjըQ?1BO>˗/X,ӦMs,ѣ[o-HLLիWppy܏z}U^]+ٳgBBn_h6w/hPm!Zׯ{ZSN]n]ʕk׮XٵkW%K 2ZjժUs?Ќ3OޫWsj%QQQ^^^sY`VrPzKvܒŔvK7   m@l@lb66  m@l@lb66  mmv6   mm@lbb6   mm@lbb6   m@l@lb66  m@l@lb66  m@l@lbb6   mm@lbb6   mm@lbb66  m@l@lb66  m@l@lb66  mm@lbb6   mm@lbb6   mm@lbb66  m@l@lb66  m@l@lb66   mm@lbb6   mm@lbb6   mm@l@lb66  m@l@lb66  m@l@lb6o΃M1S r8*"DE@NJrX;*㔶3:j=B@@™@AD }c3+Ɇ|>8}@@ddm@@ddm@@ddm@@ddmmC 66 ll 66 ll 66 ll 66 ll 66 l 6 l 6 l 6 l 6 l 66 ll 66 ll 66 ll 66 ll 66 ll 6 l 6 l 6 l 6 l 6 ll 64Fiǵ/ 4lahdg,Sm_>ddHviG"MءMێF݃#q~9Dz[vq$15'4mh0ddmh ]bil@riӶ?"ʪvk&9@気"i'2[dApڱm׮ŕUUE;6@26{ш1/wϪ6m;5H_m۷o p OkZ͞74gzm_塇ݾ}5_mAl}x:\8`%Kts^{c @MAbovUܢ#8?`=#ne1,y7f#^Rtux cW-7nԘ16l,>|;ʜsHMMmE9u籬e߯iӦX^^X?b=W^U]]]_\{5]:w?yo+q'{{iW <5}WfߜrzniiYffFbe%6{ɒWYf{ os{3hN=5aEŞS 7|`ƒ>Ȩ"rDXu˶X,vYqA4;MITWGܰyo\֗333ٓx晉֭qOM~zU;_d }tpgż0$8{]ArY"'={z9##cCM7X&ob؁c(/X2oC%~ ^|q䧞 `}V6]PV2 'Ӻv?wou_o߾  zߴeWݥs9G;KN~Q^ުW\_sy^6oFsCnNfض+vw..Y7o[G{g<8w.9wKlmҤIM6} ?:Xo$WS^PXPV?MێU?lqvtѤ'1㙻ܲeoyMMS'O5z|iY=Eƍ}WL69f1ţpV,zi}]~U&Mӵۋ6o*Q&/H4mS&M8ei=m[Vg7]mZaǞ%}zVZRtAN# i1 c=v˺WjOp5vn/*XW$!Ly+^` DCC/Eþ`#;evXiIm;w}{f7ѓm+1r7i ~r$ QvMIMiwԮ38ʽ!ٲ YddmhI@=tAAmYj"AmYB8Nbp~ANIddm@@ddm@@GܽA,޲mi :Zs9'o;#=%Ԕ  .O)A0Ƃ0 sM+cuH96ԷH$htM1LѠ:zoDu4X#&?Fa"0ՌA?F <({E"Ay`1IENDB`kildclient-3.0.0/doc/C/images/we_scripting.png0000644000175000017500000005377211715730227016177 00000000000000PNG  IHDR0 pHYsktIME -!N IDATxhW?.p@7@d62[Xi2)DC Bnay n'5d,V jmM OOGZ[č sx2#eYsΌIsΌ1ma"NDDƘ3jF~"N9U Җ87$HȈe-SyD!EF;̷ċ~!NI6b6ƮNDj`D4[IE4Ή7hydh"WJ@ >"q""͠{;q137?ʒis6lZw DDscdQ$"ImdBDS ixiPVd㼍AuI8%nІ$`npuy}+^(Ԕwb_3Na[le> ̕)鏘\Gx]팈 se6*k͙GiVZC,&-9l,AK6"x]woƭvAAcmÆ"26h|W.qnp2٧:7xI[o7 nfo">JKCu??,[Vմ7k^()Du3"ĉAJ;\ }v9ۈ"}v~C~&2q[hKG3/7Ͽ7>eR?Vh QY> F>XN K/+i OȖmWlԷ%ُoU yjeeXK'e~|N}MI+\ĉN"d!8K$"ʗt/o(LJ{$,b16 U!_,A;1U'ot%ʢz̃G ZS-و^hhv,fDz~Dn *^7گ/NǛ|ޤU-0٨blo:ڠQ{bDNK>9cTX NW;#QY ׬ 4]:L䵊ipCR#"}^5-μ[ldM+ڀ;'2جdmĖ;mtlyTїn̦nˊFD +Y6zCt4o8d*|N/53{ɯ7ղ,fDd#xJ$2o m0oln7bޖM[. pF>Dl착:jZjXyD}Zj9dgAj}* 8.UAF"fڴrC.K҆:4_:W,Y*|NM* rp>лlm׬Bd~ȹA3E5s9Zr;iE໌ Z3d5l1J G8^|ı }B^-^K.AԶ Zi됍ö* jC*[*meQ/iZVlUQ#E$ImjOOR&wNcm!$fU#(+W 7hf~իf6~vՆ9mS_;ɘ /`ÁpF>6mz%i :ŗ*V_j9|p!~e6Vra:'êncd#V^:qƉ[=/UZ1q[5NoUNDٟ DV=zZEF_*QsCd6*,_eMt|YOpSqƾfUVzD"*<-mh/b5ϡ[;j;lkZ׮1;N_ADdd0n#VwT$dn#2̩!NĘz`Z4.:Y}V6}Ӯ(x5|R7myݸ_6bJY'kwd=HXxQrSn1pP5_^jc/y=̏:hyZ5.%7D"DQ8]=~nJVD[+?+/7 QnQw{9ۨJ%v=LlqKNE<"S`p0uoJH?Y^;i~o6+}{i8lI[VFN&1"Jſ̽AHD${1򞨈P#"cAVku6 6">[r2Egq2P:31r%RD9Vr‹b<7Hl#Nb FT{2Q 1#RLn; O˳JRe;"cyZ}WLv)VgD&t"v7æ¹V:ŲΉs8.bLcncd0v]m/AIXH'ּY쾹WG.eqFD{; >>>>޾~hoHx`";>١-0k>>>c#ɴ`L#Mv6->o>ғ` Vj5rNnLTSS~i`(@+8$vv +yl~|iڀo@ }if ".L9ױ.W݂]e9U3a 0pzWBX,>-AuMQgr3D<\zZ4%BZ%3.Rz#7é 6G,~)uU*jJEuVm ^kUC<_tv()zkSH\M.H1Ǫ3:5-hO|>`OiY6Lɴvji͆5^yBh>c>RS@֕S_s JIxz<-ٰfB0zv''JFmWoՀ&:J=HgÚɯ9P\3Svt):,8b-8wB@@ݡ/[>:X*픏vMx4]fgw3@-וy%wF/_f꫃תF>൉"g3_3(r%:-+s|MwfVOf\}gʂfZ6?mz1+?to1MMr/j ?~?Oܙ\LSB Y/;ɦfs3ˑȵ( u71hmFsE/G/J>Q)ׯ]DGn&N/&v~yb?oWjѰفw{<_ŗoDEF>VB7 wGSɯ:"q\.mҴ$M$"M6uIV+i ADe pk~ /ީd}hp:D/iOeAӗ8-&U#pÇM 2{ yT0_RQz23G;}g6݈eewk6fM=/eeU#pÇ9PQ]u0gdAz2-.t}^MI8qxz=ښ_mOn.Ȳ*av*gE"*>+v)y'F.Gd3r-8-#"ע~=/ _1Kbע&w)r9;z=qw3.qL`d4d:<~jBhxN"}o[}.WWjwƗ _ W*" eӑC<_tv(|ba7R87\QV$Mz33Y_L(c,t>4h\aoj-><QQƚJqu%n'tgr9"{gS3lr|IOVn pkcrCmA\~~zo&7-h3J8o&:]]?z~=ln䑞Lݾ.Ngɠ݄[yY14ͼ= ])WS]f!kcߺ#W"c ޴].ovd:;OtH>DEɠݤzO` oZ8@8\uUDP!y':GEQ#8kluR=*X#|g>7e'#&wwW=Կ'{j8c׶9]A[;Ɇ` "7m>sDDFjOZ* 1n#ƘcoʼnFFx`3&7J0H[tc9ٚ n09 l28'b(p@e h2K9g6q" 5O8kc_u]w8D */hӹ`4ЊW^H ]v"[1Fd8t/r;鋕 c(X(.眈9ڪ6XIjc nىTV7P8qwݢ DgYz2-Bz2m;Otnת  IҘB l+E׹ى:W!n[MӢף-Zmdṣ4(+8Gͻog;@_s8˃\7+ovEKnp&&ZT~2Α}]e#*"(П/VbmN=Jg㏬WVk֞Or+Ȍ ).aXMVAO xppҀ|[ ,'U>Aʂ}|[wiќ-+(e"K|ǹlءy$IJYOP }#7Js 䈨sS9Dg/?sN{×#oG[[+uzN{RsúG-U4cj5_;:‡r\1ODG re<\zZ4~ bRa}j=? pC9`8rNPP_v&n'<672^y%j[59{dN.6kNu' #+KM6i<91F`(d`(-r%U󲔵Dޙ 419ޙ W `ڥ Z1E9>)sf%={9 uNQVjש.fYF^o0TN(fzؐY.vl'"hژ+E-]Oz&r0X N{=:8ӥ(d#_on.slYædgd#{3AMk|3=# QlЯŸ\6ÇXX G6Rn"̷3"{zVn7!8dfY4ss~h|4ET|n] h 9o=O״fp(9+;9۝ռuM/| ^[ƝaV1J2U0Ƙ뮓LU~GYL~)V.NgS),Zz~SVݿq_Ƞ䃴Z1=M?LA٦8t۬fYI]!{D [o%|B?6DC"z%Ot&nuS`oC{ޮGDR)DgA2r"i|uleˑܓwJ.#+ǻ>obCt}lo*\iv1 =oZso`!󁣍%T<]6 D4tvڪ\وldu,88;Yy9MA9`ۙ3&12ybJK6St0HeΡo53Z2va`_$I֗#za'9ƙVhldz.z4@9*(J6b#[w0c:E鈼q`7%'Rx`ԳѫQZLz9LUVZ9V6Z@aLzAb%uwkM ||"2ϻ=~_x4Cu%INiѫUЮ s}6N\nwV-Au]p;q75^Ѵͬe6bmrL̯;%Ɂa)\řogDQ G>iQYnpPyzzD17yưtEz'/U+?>6F{~OM22sX[}]{O髂 uEDɴ`u+]G,Qi}ShKÁ@U.—›|Uř => IDATjj4x!`VhqZ ]9;9QT4Hb1ι|TP݂^uƈtiAU/:;\ 0eqF{|C9_&9w'ڂfƘdڥf!8 HctMOG͘Xl'"vaW i}Q58@ "479?2/}{I2(054l*uL?H$Jk׫! 1%u?sE.GK{CHMo~w+.j>\`;zO{k& M[JD=+y[p0_?(˲`:Ot~[/m7!ǀo# AR|Z~?[T"kj:jv Q]VgU1oukg\fFFcce'wpT*ƘT[RyY!"A(Qߚ=pΥ#ϻ<_tv(y N+q}P)kQ.ZOn.Ȳ*qz2-.t}k'|e,z%͞:ž{ɉ,_bz2]`ְD|0r9/khxmAuxU5z5lZ~GJDlb-LnG@ {zŔG.M: z* Zy}}OG<kf!yXOM{y-:kc{ƴ 1b]gg5=Y[A["W"_<ѹnSS$I?ɷ]O{sn=uƭij~/T{Ͷ$ ?_i\WlLs#W#':D$RL*yhZZ48lE#z-6n`R3_Kd>N~Tϩ('VWHO,SnBN2r%"uPMO5krBKܺ`3SFXp e?-8>>>>>cAؖ~2>9:'s k!E\>* v!= ww^/gjfb~JTܷJ0 kXV`߱ֆ#W"1Y?+ѫQX|H8vmCŵ'6V^,oy iN%,2@~kQ2(y7]^bdsYgC@8$Gq&v-f+ReYvr[g,؏3.Rz#1g[\*ayEgR/V8#| 08s.>c'ӂ '4vw+>_CB/trw6a5k1`t^|Qqn?E)(*Z}S-u ő3aTW@Bv"x> &n'qfb v>MӬ/I:"ef, 9|[ ,'JvGW >̜ѐ60(q'10 < c|c>4 TjB(|)lU+X(K[pIRU`rD_ԣעn-_,7QK g\fFFccΎY3sl*y'/i7dq}tD*KqreŬPyYE2H X$d`oҭx+Q7|١8`>hk>?6yV~/;fؐ1VhCli0+4݌~*-/8\6\a.5ZY#܏sņд.%ND|&xЅé5?BؤDR~1v񓋵e6JO9瑫,%%ɠô߷ɍ~*AO'~+޴[> JO4P<#& sE,SnU$KĽ !$&7lzNUE94ֲuS_v; >׻ă,޲}ۃ`a>>yN|c5$|`_W+ɚpG֘.n&ӱk %66yūKMC>rOƈ|g̶̗8>{FNLZO%QL=e>֗xz$$X|V0 }S#T7~ a zbeI^Qzjpo蕋1ApOFf?Vw/V~^;zZ m,zqjsa)O7y7A,Mg[r)v#9oѱD7o/5=|(\[hṬTG3n:Ln;voV5?tXOiEw{gzz pxsqrEgg؍KDl.i ;͗\Z\4M3E.onO|>PZ(D26ۏyaEk%N>z3ӥr җGis؃ܿ1Or#[LAo3U/m*LxdɐA麥p0Gp(T(FFC@OBB)ta|)pa2K>Iu?v9@YPm݆=}nfCV]]8\ޜPV(ˬԢhxz,W|6bv`S(<+w`>yduҍ7 l>82-iwMVô |z.sp :| | |ǶHڂfy |lKI=zy |lkc@Q3k(Lk$)E*".Lɴ`u+]Ga|ǿTCR1ߴBX,>-Z:~s ^8Zp*+riafZM= c+Ѧ"W"1Y?o70}?}#-jU2kcDp6 bC9 2|;ppa]kf Mӈ\.o.NgE}ָ_a'ӜՈUUwdPZttL?H$Jfp&YݧV&JbbtJ>*{z<'y':pdq=ł%YUq菵[̷3D-hI}p@m]$I>rΣףXoŃ8?ہCP.+p8| ; |+UHH]%A:ꢺM}$ſoX8B}3=`Nu8჈DQԗGÁ@T߰0v=Vիs>AuxU5z5!沉3.Rz#1g z͇ XK,Y+ϗr/%NJRC}>ȧ#^c}C)q+q}>0SªsB,tv87(, tD*kLOq>$)$c`{( 8DvjiU8[~/&ԳjN ^. ?Ƞĝdzi"DZ ĮR|TM 7/]؍ĝڮw+.j~ ]lj=řogH[DQl]8_-6 䀌|H}GG- coŃ8?- `wƏ )݅v@@@*=!=/ |lЅP(mN/s?M產(E嘂 `_#ۉ c,x>X[v?w rZdZ ]:Օ.gj6B} ,|x?NIn`rD_ԣעѰY7ǫѫY ǮǪz5p.iQWH?Lw )帒~^\a Y^oa&8=,z8:"gdEM8\#e9B@MKZOw~|loK`(oǃAiI-Y_ժiUy36F"_Ǻ\]D-h}>.g 'ӂ]Bשw94|("2YrȑA_W烑}Q^Gfax4<صXJREq&7CD×C^ ]/Zjj4x!#-*qZ ]9;9AV_J?#EQ>UU BY"c+}Qgm#RXbms.+/+Dc|:4=HEgR/V8}qm`(d`(PEDTysPna23ƴڴK~s>$Id l}>cr\ }R+,圇.NY(ѪC]KEp:;/ƽ^7|Q0LOƥ @ߊ[~_q JOGD+$%ɠôgvL?H$J D0BDɯ9UQʈHF|cC\7!8df-$$#W"]P dO/8m[ӂS8H>>>>۞3AVUA>0i@hɚ!e\:"IGLqVe.'fM|]{O4_Ǻ\]DL vA ]rp4 |lcT,%n%—ù'b~JTWãXU"#V+Qgr3D7ǫѫ G0PqZ ]9;]k> T^Vv 삾6V_A/%NJUtaϻ<_tv("}a%.3#bHT[5kU'rY HGrl[5SS$I?y.V_U-M+LgE}ָߋ} dPNY[DgA$QV[e;?[F\ oԃ ;CJ6JOh@ ZsW1zwM=s9; 7@@@@8C K |‡E[}]{OӴ8=`Nu8@Vʇ/ U _ (4ſJ赨TToW_UW A;wrVDeVjQod4oclO1vx>|١8`>h_O6FD1mAkQHDGB<_JRS$I?15|"_Dė.($D*z%:rytvZ_o{8>6%%ɠôעFAi"DiT@h7!8dfE%v=BMIFD);ƶwai}9ojB= K{ svn2pGaF:"q_0H{ 𺯶n<|%y7PD)0h|W_pXJmba*1'nw`dYN|0_ac].CiZ?\]}>mAkخi.ߧiWӓi.vTW>(r%FGa`rD_ԣעѰUAřL}ՌߊgGm ǮǪz5p.\eQWhB 3.Rz#1gu+y';$<+̭z ^AuǍ>V,JN dRD/%NJyc#xz=y<_ġ;eqF{RhZעjmA\~Dg}e3y[$"5rz. tD*fa~s>$I'y@[Ç.W(\^yBhT4zpΝΆ&bX}UXi}Q58჈Ws\ ?ov2(8U} dPN1 ;OtH%ysd=_'sjeedEruMN7j@~utjIRUQ~ v˾Yp   | | | | |u'M4NܝvwAؖ YlW/G|F[a5M^țO~&%ɻIY?>%0HNXOԚ%IO ؅S]rfi_u8':OVo@ }Տ4?w r⫄q,؅dEڂk(ikC99ϒG rڵ:FFj$<zZ,x~0v=Vիsz F.GE=z- [bR_ z5t!n6sX\feVjQod4zcfsYŢ*,R"i 딫T*c=Xa`_yRX_iT,69ʕ[Q/:;|>ʥ@^R[В@:)$Y3,y\ \.QmA\~Dg}<6P[X#"Ƙ9Xv!|(8WYl6IDATvq:;/ƽޕ`4Y}UQosz8zv(|_b6ٴsAD@0=]y3 MD(Y <} L[~_xS!zz=[ִC_/y/I}ZU'ӜH=Dޜ %$#W"]PY"#{+/]؍ĝĺ~Tϩ('6XҴĽ !$&7k\*˲eG®ÂS-3@@@@@7L LWA]y/vkoWxB(e>!d_~)EQ/1|S#ۉ c,x>ʵ'I-JgE+':($,ˉjAʂ}e*G4կ:'yp7 ؅4M[op‡A;ᏇhĝW£a_|g|G"<}D<\zZ4<z-ŧ:ZE=v-< ccU8\]xjJDg\fFFccΎ7%IO_ħSO'|)?'"Y ?v<_{} zg8߀ 3 $ D +}h]HD]m rk<%ABn - vR @Jjxx$FFV|H:9sΝ;W??ύO8G;boǎb1/V1_k-$q1prVu}އ{j/|ʵؼY|B{/щ&BV.^^ !4n5ޞ|ZY_(E^bomvGassc;yՃ;O5sN[ܸO{oss3OcC_>?xr0/3iNbW~b>g|^!-LdH{S}c__吅7V?^/ υC,l\.g[ұ±3K^x .u}mK>t)8N'zo > > > > > > >@|@|@|@|@|@|@| > > > > > >C@|@|@|@|@|@| > > > > > > >@|@|@|@|@|@|@| > > > > > >@|@|@|@|@|@|@| > > > > > >@|@|@|@|@|@| > > > > > >@|@|Dwo~Q5dK xpp$ >ݓϫkݨ6k6P}؝;wBNc_ ^{&Ot~񃵴18ṿV!{iBiKBp +Vǃ'NJ mjX[~oyFa&1y9ّiB1 [faYzoĘc!`R֮w/L>"xyqᏋ080pO8n*vx b i,iiȚ!),MCi_ lj4MQ?7^BO1qujiLB4bCBM!'b#f, !4 徾nlX!=3ʍJHڍfNZi6!k>TۖĐc/zq-+J/?jT~9MByp+tך5C6ofPHLwC,CHSnQ,$=iv|RvHӴcY,IH#Yڼ IHӴeX,N1ZO|cmGi3Yxh>fi4m@  7Q1 9E|K4 Y3j4{!koF[fi4L4K,-vI'r}27!4M\2J!p<A|pDtӴ>o!]O->^85i.?O>5sZk{vWgޘũ''iۢ'[ԭ |6J=սH67korm50zzdownr;FKS-p נLعO !Q6u~3g+텓/Ndhl]7ۈGiSË,nWiܪ__KiWXvl; [Seb.z&pG>Boo +7fKg~9Kӳo^j/~Qoߚ;tdsώ}633/Oo{{n7]b!Q !<=beggǖYZVYn֊}sϟ}yKfX,u,|V8Ճwwf˭6~}xhxkzig?n8,V^سc3δsCG YEʵWfFOm-peLS?{{~cͽ6y߼#_{FO,~XVCcCHPTv}}jǨv;8@ ,6n5X4%m:">8J;fnP8r,\?WΎ !w7|U%[[4Dh  M'4J;]`Vv^WiFյO֯~ұ :Y~꟫ӯL,Lz\.vkj1b HuOg߸]zWspjO1ՏW۟^_]~5tf;3vK{X,9GX\xuz˶tࣴkydz6n>YkG'՛\[Y=ӯL6o^[eR[.u!95 yyLjtT?_ʇWƍ7g'?z:zzdK.޳l#W?Y Ysʹk/~4d{3־`W&L,{5=/jk'W߿u%?wnFh6CYl\~s;7Ty̫ӡ<ȯ(%~vq^B(o=hV㣕G+d'=?FG+zⱾf}~׋'Ox4_0lјd?h?|qjWf.l-|mv߼ooB>B(u|e(H>ErRkieiʮkK/ޞ[za|Ů#Vcv¿\wB,A|p4G>v}ٱS#pϾew {9j@Lop [c~íĄS˯II}CakCB~۫#+9%[#YkҘ^ mG4JߪcJP:Qp4i1Mcǫl_cOOQN (>bLӴTiޭwМ| I!$iEzw*JGsX<KgݕoH;|Cc,}/7Wc#7Jb! cѥ񟞝}m\{p<6oޜbx8do򷆏fe}űӣ!9Q8C웏(>=R1(hؙW'_R nnqݴ"Y͵-  A_h:(hT,[!cw !95z+7Fo}O/.bF jiPo4z=P\{wb,Jا^i딊x"e>$R/. I ! Qo. > > > > > >I/ i5-Ee!ĭ(B_IH r7>jF!! 1Ƙ4ĝ Ћ4&! ]#MCҘNG!k7ͺG3?6f 8ɚiG|,$w1J_dx=IENDB`kildclient-3.0.0/doc/C/images/we_mainwindow.png0000644000175000017500000014111211715730227016333 00000000000000PNG  IHDR}E sRGBbKGD pHYsktIME &R_tEXtCommentCreated with GIMPW IDATxwxE='RHH"f! DB/ HyADPl R(~ J"EB/RS)Gr6[fINBwdwvvvvvg|:'<~   %Ӝu3{֓U ,f%̔i#^qu8Yw|(Z$>= !x<.׏ \燔kq~WNԨ«Z_߫jqgMO@Q67/~}_*5NhʯYp57F9/I88yN㞒w$!q-YCbNMKJ\./eMJgM^7ޢkW#r(p<R%a"^?6owƳuOpː(iCw:98n5 ESim + z&DMU rI> FH9[Υ|.LL`2{T/oG9jRrb@A)rN.UYM O㜚dR\1J*fy؜H@j o;f]OKr6̆ޥ俋߱ܟ']↍e1@NYyCvŢJy-^.Eh6y8^^쩦CV/1%܊RlgQ.7(:i0CoR&Xy™ӨU׉;,m6D\䷝tD1-l'TVjmhaqL&l6"ۚ 9ǭ3$:j[nGZZ*6+L&fR(h=L@<ꗷT@X9y1eUQ9 "N bmwCW.׬ D=dU 9뜊PgUZB]Q)2,y(5"ĕ^$j$lԎ3~e,XHa2-x2pUne EhO>)-3 Lk8Tš()Zf=!n4ҠHwnpȎd%@Y#Ȅ5S{Ӫp( kPk nިk~>#u3*;:g( >>(U4B*r5 d2jƥK|wu9;aQߎ쪡x%=/5 ټe IIIA@@#gU`|E%ֹPTkEDb_rβR*O-Ƣrih5!S]q¡Vi nGgQ4 *.V^Zba JN.Y" ?佉mhaHtE"Sd5b Qdrw9S-n{5Lv8A>:a 4Fzu\xQT燬|FX#P %vvb^@6g䬜ɟ3 h['|8wM?.^DB||eTzuG۝[KJ4>^ƙ>y:uj Z%Z͵*=5ѭhbPDqC6b`_ZKYVxYXvՆ_f9}U-"*~FW,YB^O0IS0ލ\j>AMCұUi\\GFPM/H WKlԂW3D;ߏC^DZ#gbkЖhU^ ^Ny2M<0A[^ Ł>60UNJ܉_s.~gUޅ>˭J˾[+!]?+$:N6/7+jGyYUj E>3ߣP#M1I"t\7&t閔^6_e[y>w,q}˕üy }Y֛hؠ+&k=wt 4wѽ=+={0rxݱ&ĉo`ĈXhDkV3QR%Uxd4l_^ <&y?/snผ RS̏s .r)TdpeԬEl8@!j#k7Ácɒ%Xd1&2e]NK… UV,رcBBB,_s^rq7~z7:r0`=0Lx)xn}^C8_AՒKp80n8-[6'CLLo,^#ŕirʚbU378O@^/E|nxHs(PcE5 eBŇUʭ`K+llDĊ[mc 6XK&*&=QT1 da-kQuE G1_D7OҩZ&"\Nob)1Z ]m0mg%؊rX5Z.\RS/&AʛB%7 6Y5Iy\לwa@īnjʆ;wYNXP;r-¼\g{Ϊ%܅͉Xya2 OOOnʕ+ܹ3F tR,[ ;v@ٲea2q(\"d6Kv ԥKukѬY3\>>>8p(]q6ji0`x`?nz%q5. ӧO *U&`՘8q"2ϥ ȶr(_4n|.=Uĉ5 Ŀٳgqm۷uA*USO}|P|y|IL*U~>sՄ54-Z;*ʵ'֪E+LfIU²*r ,Pd%]Dy:݆:[:K t8/2j&ro-s9?ֺ޲XN>'@n -!,˚Jk<Ji٤cD*KΩliXmUwgF:u"[,0Ek IFv KsQ.w# .`XEUʨFOmYg@!K$*ܓ (0&&e3! ;q|(ȵa';U]ETs`ojms:FIb@=ZquyV+|}`2yc䨑| 0˖-òe#00Ppaۘߣ$kq_~>s|νh]@?W7k /த%a~qDFFbI;p"֩`tPbe=~M,̋N?5k -- -[j yk^e+r_ѫ&vY>6^#c.9϶YV1Vǚosaݲ|-너ť"̙漸LˇX]|^8sjڍiRS-ߟU9Kic2 j!g4!|H:ՒcNbr s,ģG~N77'> b!) vƙ'ƕGpCd"y!HgЄ=İ:;$w@" Qw85Tڮ澈|ʜeϝ/eiViOW- iWAgN1h 9>bI:9Y>厜k~B[q՚,X,зO?8,X8`kcRϗP XJ ;;[ZL&!,Xp,[LWpXp{!waJ˗caժUzW0?|ϝ3/{X%@r&!yf͚8rN:ڵs>u_|ڵ9U-[?GDHyV->tH'Njծ]?|)ԩSeJ]U!#rJXy =_իWcѢEy3/ΟǍ7P^=XHHO/5i%JVZ[3fAxO>HҥΝHJJuqZ ==aaVbŊTΝ;+̥ÆWG?d2O?d+ sY$]ti撉zq6_r+VQѽpw`ɒ%о=\N s/5ˮ]x嗑)+ԫWWI۶m1cL\z EaРB8GtFFN~@V-s BŊ%6m jE푕 "iSVp~0mڴ3qUo@g3Vո* uLZ5b'7H7tvtR5E5R /^7Z2s?wx#*#?kCe'Ikx,ϫ5Vʗ,(ߖ\\T@qxX r˕3-|1/[Ǟ=xoɷJ?x!gX;:?gPt,׋HG1J)Mm}jQ\b~ %e":qa F3q2ˡLR9g`}@x5oɵgwzhRٷ=f v G p~cٴ)V\?bb*!kݡ E-~u)' kvLջK fjh ;z`\Y~u75j8WJupC9/o]}w߮wh ˱ֵvY=fA<0W1W[8c.»Iuoai~O4R8Ɗ$j( [\åAZ ZQqX}Q{*.*w늠?)7~dw/Z;ҪYpjeҏ4Sə IDATDNK U=g~g-ũc ]wa>ܕiLΝbN9f0&/*3;; <0M Oҕ J^g9l.N7*W9:K(@ N<+9+ZAORZ.SlU_ |P_؝YLxe-}AgF2Xb- E}h^K^bNV~{Jp4uFl:c*/Cp|` [_cʈIqޑUN&ogJ{nxYa| >L!(:ӧ[޽{Oѭ[WGVV=aÆQI"  >aŋ`! X(>iiixPz5^,ZsgܹsPc>|FE%  (\?Clf5ta|.  x\$sgQRe?w2  ,X\"AAA#8߷nbPR2  |C,5}{/kV~D&(99iiiAA0'Wׯ`Mh޼9oɄR<ʕ´wޡ% 9AB˖-1QZ5X,TR~!4p) 'tҰXJ ==2  Uǜx0:JѾ}{k۶ ڶmCNA.d1'  lCBAA s7oޒ_|&7oޢ7HAA0wg[Ϟ=Gtt4/^CĖX#8>^~Æ hѢJ*E  (0E/W\ ={`AXrUEHKKlFΝqtu{*U 8f< 4h0燑#_ŭ[7Ѿp8p$  Eۭ>bq>gE&`5j$Zh> .9tPP^1{,˒GGGĉHLL۷}y*H^{)<  K'8"vVu)i1c6lQ#GX*,\G*ҴX:_P&Mٳfe˖E<ʼn?$ Y EvJ, ɄRJؼy$ҥKZaܹiXԵZ٘:u*"5Cnp<1@%~DӪvעct4"4@ƍt׏fÄ7@ }mڠid$WJ~Թ34l(èsZ5j^cp!f0c ³=;wj}ߋ37 ** m᧟~_~m(p"Ǝ}-[BƍѽG>P+9rm0`@yu^/42@ sx źo!==]8]? oܸeQvm|n3>+WBÆ KB^}U;}:_@&~Ep`~N ޽{1tLgg[[`mb*]֥{=WQ':M6a;qܱCIѬY$~Gšs1 zC\;ٶmoۆ9|`(Vid 2wqh1oG7Cg ___Dw숍7N]qqhݺ5, EEaJ[o0@֭an[mG ^^^xN믿$a&NP /a6ն-6ol~a'^ Ƹ]wAeȑC푝#Kگנ{Dɒ%ѯ_$'qsjr=`x{{|Hf#p'AOM_G1ǠOٳIh٪c3酽t||sZ9W…K[ ߿L{gƎ}k֬A֭1tPsӯlIg" =׬|)h-2eʨ=r(~}/_9އ^ q)Qa= 7 sZȜ b20x ;v oM"saXt p8ܚvs%Fo2oNcܼYs|7Xj%cq8CV&{1M7a5ׯ/7ne.nyNWZ/;A{oEFCffX͚5,wO/lHp~+fQp ã\8VZ5DFF oHjժHIM3Ŧh'bڥ+zIdfwj˃# 9AH׮/`_KloY{NB22UWG0 6* {fC||p.\@HP;jZԩoEff&233};*>^$$$y\pgϖѳ'~gv\zU){^z [lFff&nܸ>PQ-gƉ'֔)n{NUGA$ UD\Xҿ'W\ !%$"!~Bm4'9P_V4qF 1z(4k={č1ׅ0111~:uBmס0¾}YQ@yWb7ns;xb">c׹FFرx饗$ߞ2K.E&MA>[tǎ9?zF {biXt)7o)o9އVO4hD \?E9CFYvaWzbPj L<ҳ|P-&]yH[ǵT+6-6O,.om.OA-0l*VWJACsˁ^Xû*˞Ц?9lQICr^±%0U0b;XSB7~Bm|4*yn$L4*+| *F6и0q.ͪjk^Ң<:-d`_߼R#&]*zbՠj& 'eKOCX~in C+N00U _±;#&Ӂ.)YudYuL'*JA0!@9H1mr\ObB O<]Zk){1sq =*K=<V'RPxu* <^G/A $ \ɟa @_1,Ia_÷es^R>qWq5%gՂ;  y+ ?V]4 x汒8t!w~m#wiuz gƏǓeu u|ur~}gP;P/G.ޣ  {H8Iv ,)χajq^I13ih\%GGT*IwX#*o\{Ϥ~=Ct%pWc@NߗQ/d{7QO0'9AA s7ˉD=CZ?]4&>[r&jNf 08{TPCd,&.-[4s873nM##1|p\zU8_?"o:wF Ѩqc$$$>!!7FFЫw >${͈j-Z{BFFpŋ;ul 7F=$Z1uTD6kݺxbٖ.](l s΅nAn !!={7<==ѣG9ryq>Cn/(]4, 6… |2I;Z E׮]pEfza~ԨQ:^[H0ˣe˖طwzx$Сl&9ck^rlڵ ;H|`-1{,L<&OYw^ :ߙ.{oŪUX4}Y޵&YH㏈C:b{ W\ ◄xwz^7n@``"vvԪ]ߐ ܂l:ܹx&MkWŋP|y1>/0sLfF®[ʕC+p?G G08v$%%nܸwQjI۶///<|'_0'NDhh(uְlEzz:f3ڶ͛%qO?aaaFݱwoAekн{wxzzdɒׯwšuְX,h 7Cg ___Dw숍7R 7мY3|;dff"55 -z(c1q' F^wuFŽ3>>>B4ft Gc֭~a.\???o??ܾuK&B{]?i;ի,Yh֭+^ti\#GxbL~-SrҥKa$l #"W\BAn`8vZiI0=gx_P% KJ:RJƍ.{…  ސ A9JX<Sp )V-\_Z5DFF o`ڵsW[OrrtO=$23%׆#33pܾs Agu<iҕ}v_Ƿlقe&VZ)))ɪ WŠUVΚfcHӾ}^۷gԩoEff&233};*hz}=?fի GƍoOsmÞ#;;'N[SHm={f!>>^|Q8B22UWGP 7еkWl۶ Vk6R^<|ذϱl2ܸqزe ~{ |-!\޽7 #\UtW:l͛7fŋ4I#O(xh"cbbp A7vaА usg3y=?R˯4ØL&L>ӧOg mW:iРd-  PզAAAœ  BœAC^~dՃ^7AAQ\yvŜ   HAA+ AL|.  H8  H~o@@A AA s   HAA s   HAA s   H   yao"j׮ BРA>#v!LϺ]!((PrJ%$%њAA0y`G˖-oqJ*1c q9~ԨQ:NAP J*a%HKK+W'Ocvt>dkpiƍS СC| \|Ǐѣ ?55>'֭Gr**AAC-X¬YТEKkuEÆ UIHH~ȑf; HKKlFΝѹsgr *Eӵ8ye1=#A¼###Cr^z}[] M:ׯ?5jLyyűZj!** fŋ]/##Kv[⍚>?]kOHH@ƍӧ[e}>ArgzV娨UcϞ==f<.̼6*ɝexسg5$\닅 ٳZu-[{a|||p$'',=zÆ )oX qL$|ddSl޼6 /^b1۷ok׮1ă¤ɓ1{,Y[Z~F(,%wƫo/X1G={}%ɝq6f4>9#H?pL&xGϞ=Pch,׮]Ō3zFM֨S6c9X1 > E4++0t/_111t˒~:s| BZp.Xl4i۷୷G<8[5B18$gtRDEEeV;w.l X\t | -Zȑ#?9Áy>C6m42G իWl6̘9msaΝ͆ oU?"o:wF Ѩqca2*U?"i9QQ0p|ZtFD4dѢEh٪fyxM Beԩl ]u|/oE_ ?T^ZO^ /bѲU+4j{wwoC}_͇{r ݻzáCQCP:%fL0&LP 3qDL8QE8p@[ᣣq5Ix/q wˍ 륏~֭-Z _0ؼy3`  ,XXV{7Y}oo$̝3ߙ;vb 5mڵk;v>_TT~mې7xCBU?"BbM2r_x""!!&O1smۆ۶!55UYvK,AxX$MrlيwbHII#xYW\yr*4lo6~W;}:֯_rVţ}(N1i+?yǬgFȾԠ1ckR&aK,Mr~3$#|߯W9}v=׹t 333uNLLѳ5?޽zP(⃉ j>eM2:uYf.o!( jժU~ON]uAQbE4ir42tߏ'*TKT_%/mJAqq4kL3,]}~]~~~RR%zc`H??ͿOx'C!}n֬qq% x=g6&OHHLHGv'9z c333.]~~5ϫs;Oe.&$PjU7xàvSVڵK)Z~Ӆ Y?%ܯcqvZߩ`UvuԱ)XR>i\\e+ K@.e _ 5^@z5^kܨL4׫_[.1ݽ{5jO]߿~~boذ!w]}ۮYnyْ~~ܹ2_]ǐlmeEFFAIǫs 33BJ߲tҥݷ+鋝] 22>=k6bnnn̘9!\+c=hNF+ggޛ0p>v18?˗_^Up̽v)kؿo?6UuR_mK e~%V%r'5v\EwD_~Qi.(ӓ="pOxMʁɋc+r%<ٺTAdĉtЁL֮YecgׂtΞ=믿!BC>|{!e={L _2c.ʤ>c./IHHtҙQI(226Kg_k֬YKЂ/7ٵi{ѿ_?Zn- ?Ń\e$0 !Bdeei'j N׮]edB!s幘1 ʋ~liiIb Y!B!yW\9U*=*vlu!B!pi㤤$VV춗/_QB!? ӧ͛7IKKoWҲ?TPpT*.\`ʔy+Vȅ HMMA!BH`$ F888p}kuZ*.jd;v8ڷi&r4!BgLʒ¢1,_/ooooʔ)L2E!BL.B!Bs!B!KYTR= oB!ϥ̘ !BQH`.B!B!B ̅B!(#똫/B!e\!B2@s!B!$0B!BH`.^:]vɉD=zGv8:9NNN8:9ѥkקRG''tB!OMӦM8]V!e̟Bֶ!>={ʛoIy׸}6dddРG4Lxoߠ055VZ\xaÆRbETX\111LyvvvrNJ6l8/\F!\G1g5jM|}{\Slm}]h\[zk֬5k`mmExxAe%R3;xV9MFFFHII)u+++y(bF+M|(- ?}B!˗/VZ<;ΝGT2|uuw'ٷo?۷oȯ+pBCøu++%0pD%+ϝ?>vr^ϿtW.60611x޸qc>3oJ+tڵU*/&==ksY~w IDAT!kBB_DFQYѣPre֭˧.ȯ+ԯ_oooJ/Qvsȝ z4tv\r̷Jq ;w|*u,9}eTT ۷oklhƶm[s=(@!Bs.^LjժժU#))I?v-Zȯ+(K<{ N5jLʕGyW055a<,S7jD ?-[:,KdԩTVW^yɓ'?:s_>*TE=ە͘1իSzufΘIr!k?o  ;;J/E˵Kwq_L۶uk:vHǎMbS?_u,|{{oۦs[ߞD!! m{yjj**TP?7yy/S'/!Bz.qFIOOgӦԫWO>t0V49sF~](} !B KK"}w7oޤi&4k֔XBB֩P(k^zkT+/!ߎzB!F~A{U}Pwtr"4, |jSCVpvq(`Ŋ(J<ڵcd"""pvqٙ~{"r)NNNEzwFRR 8:9qiֽ;=Ͽ}{ڸwILLhofytP*ܥ wه׮]cGq`̘1u>ux1U_}}PN5B!J!7<R-˗b ,,,un߼YsΟ?Off&7oՕ .?Ofywɮ;Yp!SNm[WkS6mLUXRϿD팈˖q,: :m:m۶XXBxx8vV&lܰA>u4, 22̝3r)oNj#66qq'&{{֯_%W_}ifٵs'V~z}ԩ;}{Ցm۶ÓsJs̅⥡URңO{҂{SϬ -7ضl٬F<&&`>Sɉcǎm]]hӦzclcccu!CP(UVnp.???LMMTIMQޤ`ccBϏȨ{ʔ)ԩSOOO ҶѩSgLMM\2]m6uyʤallCŠ-G6Ύ֍occcppp`t捙ffft֝}M^P(XYYĉlj׮ ;zq?3IDW}} !ꩬ2|0n ^M@@W˫Ay>|fZlCVϟu1e ˗?~<&&&݃CӶm[~(>>>uueΝɡCGpwgmm]h_qqDEErU8}PzfԏWέ[uj.6-!"ibL>!!!xzz6ޞ-[1sLQb2d(W\\9SRńV~Wy133ҥKID碎5B2z*ט*D37nx.\ɓ'5g^;G3g5Ʀ=zFUk넆n/>QX[[?0` M_W}fjYFE=̙3:tHTuDGGC\|<3NNN-t=J6 |BB\jY¿o_'}|WGJǣ\>T*Gԗv8:ݭ7ndܸqD?/v_8 mmINIիddd`og 8uԫ[ؼ9|A~AF}to>csy-m,1B K!!k냉)}aڵz͛NNNQ?^|j9w lllz%aݺu 4n]9EkBB_DFji1cUVW/_2336m oooEDD0lp077g̘Ѥ$Z=R~}BeؘqƗ8; Xd~Yx ɤ=4P|y"""PT\r DW}9v1B Kّ#Go(to^ի-ԫW}>/j^_YZ52jynʛ?UPtt4AA 9rAS\\mڴxm۶̞5[777f̜ɐA݇4̙Sm0`н{ww@Ll >N9c+Vu:JڦH.]oo@VV-Z* {{&%%ѹKtʩӧYjmw׮u_xu/:z߯J//bcb=zu[e3MAc;֘ !/hgS6PAcxۏn߿+tI񧥥ƥ"XYRV0v\vM} fNNVVHJJ.r{m׮]_͘1cxױcenh={EwR_mK e~%òe,NN0B!Dl4f/0p+W~78q"cϿYlǢ ZӦ6mڌ5v$x*֯_w۶XXBxx8vV&lܰA*VdggGll '022"...7OL mwɮ;Yp!SNm[WkSoڴUx:ڭJk|tci-X@dd$#;gֲ>:qcǰo^:mV6JjDEi!߽GZjWΟ@5&+N:\7?˗,yz;%G!x恹OYWX"u`O=ԯ_"#_]رoooLLLѣ;o~UT㣾&SL>===VnzBʊ&N ̷ѩSgLMM\2]m61'í'soQ퐡CP(ԪU+^TT`ccBϏ(u[W誇yʤallC´5y kĄ8uCHHf`y3~{Ն{RbEӁtU&]tauҚ m>wJ:Bo)o̻ܤ\rXXXйsDcuj!!!xzz}iffƥKo,Y¹iܨ'NR=#U*ʕY 6bm5]ߟ#FpUmjйSqBgyh|y7t?zyرƍ,]_߿_Mx~ 222*6RT*t!/NC[[SRr*١N:EzF-ЄvmpqiMYlT-]vk]pkƍ_|;1ƾA˺u3{67o{jj<|){o*U1RB7E?TϝB߸Q#\]] XdFz~GV3j(P(r ٷ <=̛7o?s$2rϘQh%KCRRyfZ4owvҢ}e޽d䐘SELzz:CCqϖuuO>g{*Uw==<<شidff[uu{Gd|.\41tBRy&M6YN>v8ڷi&zm?i$BCS~=,l},Zڵ+u_xuH0`н{ww@Ll >8p }s ++-ZJ|ߊ1cL (_o?D>1gu[W]9c+Vu= ~Pzyѣ5ï6f4lhKƍطoo3?o&ӧ?7oWpB9ccc3~x~sqBg/h߳)-"} |uB˗jRU>G''_+eu F6v=[JbaaS+g<^m`J*C!r=Uq |Ȗ-[´ȈZV֔3.NIB\H0.Jʳ}{4i—E|\rX[!++[2B!,A709|mۣGMy+OtB!Ϟ̘ !0ȁBs!x9.N!BQf2B!Bg}//)S!B ̅B! !B!B!Bs!B!$0B!BH`.B!DY UOOOnRd֭[T?x_ƿQB!x erxݻzZZ_}5'Oƫ_KNNQB!Ͻ2{)K] ݮΝ;ܹkgñʪ=N{0ѣGQ έϢE yװmiSYNj/2`lm`mmE6 רۚ5qpfX[[i*ѣG̙3FbcS_ߞ\zȶ0cLz{ӺMz{3c,bOJ!\?eD^X~k[lgOb`o~'Ndܸq괥K OZp*j֬I\\<'Nao#Rr9|Mxx8aܺʕ8Br/_FZ8ywΝ;RdzO.''x|:v޽t2{cG/E#={F:A@!O2;cޠArrr8{,7o$997xrX30?+x RɐCr*&Gv8קNNÃO>]@zz^m.8=t;}|h٪..XRGv,^|n,3z=6ɩYZG''4y2-[*Ԏڦ/mmzȬYpm^8uFYMWJg>=طoYYYڵ guټy3iii|g:gV$>>wyǠ*lܸtٴi#SWPpT*.\`ʔzx2wp/Y𹥥%o.v_ƴtrرc@lyǗEiF=k~1Zl:CP(ԪU BԔJ*0;M666( ,j=SLN:@wf0:uꌩ)+WƻkWmۦN7\4Qv@XXXӦgA[ߏ'*TKdӦMy ҕk<򳷳#&qud|cB!G/_^j,y>s-ZHIȤIn~z-`ٲf}wގƍ^/ŋQ~=}ƍkPty&M6YNKZ50?#dWNJ?k7oB#=d^yswY~(mڴ+GrCںоY|9>N>} 7kLnU>Svi hN}y7nPϞ3sЯ_??jӳ ׮]bŊ-8nKWޞؘu2X=c[ \LмM-7Z!(_+KjԨQlٲ?BUE;)W3g2sLݽJ'~~}ܶt[\9ΝܹEMbb?ēiժ? &w-/8?8۴櫯"''x;991{\Ӊ(&y= eҚ5,ѳqG]'FE)[[76nȭU -5MO"7Ekk#}Zptt]_C[[SRr*١N:EzF-2qEmB<eP(eǎKOO믿*U 666L̙3L16K$NOgʹhެ?ߏX*QG˞{!11˗M +Wp=f#ʗ'""Jŕ+W *QRɑH9p BKW[͛70222HJJbɒ%O4B!$0T35,iӦ5k֬<|ׯfj\]PҒѣ Vyɻ}XvFʕ+ˉqO,_իT*Y:XcիWM1b^^JN?}4'44[X[GӖ.].\䣏3~8uZp*j֬I\\<'Nao謷BK :?3999[A0`@֭ !''GͶm[2d+VƆ?Q9e˖a&;Ka133ܜ1cFQԯ_oooi;vzCXC^133J*ۗ`-B!^^e}R^}lmm^۷N:pY^yu-Z7iҔW_mƍ~ZU.ev~7n~=fׯoru?Cc?dfflxJ:m֬Y0ggg3 E5hЀbꪷx~pϛONٻw.]f}tܹh"Kċ3 OOoʤɓdIC ̟;jnjjJ`` !!7dݺӹy&ӧOؾ| 6ŋ0XcjժLyw OGVVvY6p@6oLZZ7}zu[|dtkA޽ȴݻw3`'SuzU~!C?Q>1.Oe֭[ }:JW. 1b8nzuYx1ǎر,ZX !-صkC+2}ذر @qwwgϞ)  4_|ŋ_ƍ5&M"4t;#(h˖ʻѸq#"5(ΝǏz*UT6*Ub5DGGsy;{ 6l(YR*3?^YϐcQZ+W˗/qƜ='NՕ+gԩvgԩV ̟ccc>RuuUTȑHuǿǟ?X3-,,| jxݝcǎs_DFFG#oQ™5BUܸG:r1sLׯ`ӦͅUoQ[cǡP(nP(=z ֯׹OwIL\ʄ Ѯ..CDDLȑ#Gόgm۶T*bϞ^g8W0_Q/m s{vвU"b J%ڱxb߻[7HHHɉSOH ͼTҹKO3strȳnzz{ԲvւYpm^mѧڎAdСz)>q+]\pvv_YI>!aq,ZPڡCGPP(͔Bs!;Ѹ뵭FGܮSN|ck?Co:umۺ租8?]te'|r;=%/OxbbOc\v?@ЂL6͠(}剈˖q,:~mۊ+ko5i ܏1Ȉ8~ 6mʚ];wjʛΛsA;fp[EV9"ѣGܹɳsNvɢ S\}'}ƭPӦ``Ƣ$,;v⭷*v*W̩SBs!ʢ;w`aa׶ܾ}[vumlxŋHJJT6n055RJ $55Z5kҥK֭_GHH.. 3v̘+uÇ.fffxzzj|[>Js_yLB:u g0:uꌩ)+WƻkWmV~숉=@||nm8䮨X(Ϗ?w^( `D>}:u/jh}I R*ٴiv2t BI<ꓟ>V|ʕIKKehFUd{wXy Si:!ˡt^:)))X[[699Yczm:v;v ӏx)EnOTT$\ӧ4>bW^e֭ŖTu|Svb.Ѯbg˖-~9s&?b2dh<ZoD-ͼ׮] ݗc(֖GW} Ϟ3 '$$OOOhtm~*ВOsia#FfxW ̅Eiժ_綿 έZ{u$``ƍGxna]B@ \\ZS>=4o"Z*wSSm~m*iT*GP4ۻ8=Cٲ4b Ğ,RH,AT4zVD-uT(QK"%qh-A,%D"LfDIdD2m=9nKlrZa~]]w)6m6"~2csM_X\cB{O;ϼyr'd;exAs.wz֭ēO*Z<~|y$Gqd//MxAG便7n\ B&OK.d **RQQot ~:uc=wm?TVVf˖޲eL<9sWy'SSSG>]ΧʶgqjqKo{lmV=ˎSc[ <8Ç׾WhYlm 'cfvL;Gɩ~gW_y{`BQhѠ>:t) F5n;4k/}\fΜM74{:_v`:***UP(if֬Yl6^7onfΘw1B92I2a9eטڥkvj XVv9oe˶[8]w +3s7/aDϿl6·?0 u./sC3=:sW3Y,kj>@zֱ{@ɟ a a a a aЄHvmӟ{5{k׮p@k٩Z{shr~d\s5:ujڷoA 7ze׳:]nH]]]swrߨoK.8/jJJөӮ2xHzk8ט笳oL81g3Q_W9sff͚KqiƌS?s~^x1UO?s>_~Í) wylܸq) 7j%-yFg]%,<2#O|ӦL$/kč7:p W_I?L֭sOO:8餓ҪU$y7xI50'xb̙3ǁט|ƌzCYK?z.眓:H޽ӳg\~e+>}k`'pB^~eKfv٥MTEEEٳg.ty甕ew̯~GFͳ'dMRV,_6 |N6dl&2xR/x饗{iѢE5k3.@ &jXB$I-G>N>5BMz{b~Lz{f(|,LEee^j^v֙%Nr sXœ?a=biٲe:u׫]J9+.eukKY9/eiܥ,n|* a)5xw<X!gS E$.km:nOaw{wƍֆ}-{mg]k{֧qX,i4KY`-/}'ݻwo^2nܸ 2$γ̖.bu>1[3sX ʼWS/<>kK7n\{^9 /5=F={]g)9~e1Fƍ7|+ .!9s,۶72}wwOnMVUM_ٲ=;]X-ӓ$'NݺW^IL6-Yv[o!n{ܿ|lrÇw~//q?wPF4"Zm8ޭ[=tWnݯ{X/8!zΉv*{nouT66Ξ=; ,uƱϿd؅ҫwܧO|AEs ϤI3|lYZVyyyjjj;%_'|2'zХyGFxc_٦7W^uvݷ{4Q9蠃Ӽyl9Cr]w}ҺutЁi}7-ZX6fWw_䔔Ou]?dMpY/8!O=d&MW_yo;^HPԲWfiݺun3f4xzclW5Vg#v͝wY?&C 9?٢]ύω'~A۲[ֱ]'N|+=oٗZZeeg7t^ocquZOcvE'jSN͗v۴}G~G/Kvim۶AyklFW>FsL3Q}\z{#~{>xp 7~~|ӋBB]rsϨ{rͷdoeソ7,qd/~[o睗;gWv+]X-ӎ;32yʔTVVk.)$ySQYm۷oжF(B!꩔%meƌkC]ʶsm׍O(Wu+7f?osG7!5vςKY` h߾}n}d84k|-wܸq)-];ݻ?'|7?9cF6hrq >.]:rW82vؼO>}m>sέ|ܹKϪ7ƪwec/]w574";uJt)7\_.f~z55j_?]O[mTUUn } ^N;Kk9g०i&v_Zjmnٲe&O\-}2lğW5}e^wUc.];ȮGONcevT۵* **RQQoƖq\\c>׍O|mջwxG%֘--)1G_~-U-G2ӧOe]he`謳^5̗5d ><__aaI}Lַҷ?~?.suÇG>`L>=>_y%W\~ye/keZR.:;wNt%B!]kU{dy۷o+a [c_Sm8u^vU'>6r3ۣG~w56lاߣ$9# rȢ;,}9aWt%wL g%IhѠ>:t) F5n;dۈnM3vmw)G^o7%Y%_l^O4HXUU;S=F=X8XOǎs ޠH0>H~oB/+  a a a a a a a a a a a a a a a as0as0as0as0as0as0as0as0as0as0as0as0as0as0as0as0as@09s@09s@09s@09s@09s@09s@09s@09s@09s@09s@09s@09s@09s@09s@09s@09sC a a a a a a a a a a a a a a a as0as0as0as0as0&tu0Fe #2rXC\c J .la +**Zw+oa4)^myt#K]Ak0`5 p99s q9D-|ݼ}~ꩴ)|bĀ'Fcb0 IB!)dѓR{.gE4rk\~yv93+?o%۶5pXm]!7>j+Z4Om(5uI]!&:]4)5thO]iѪU:x`&]0~oI瞗:+wKGI :sSWkܨU<Ҕ<>aJƽ0%cOMe0ҴjT~Q2wn s]YfϧvvgҢUmvwk>cO^κo).^EEEIBR]TR][HuM!U)^ .֢GN2͞.}vMwLa.L7Oqf3R($gnTVAU5+$5uIm]RSWںd_q@فfaQQ>|l9sŮ&3g˽zB! sܓW]e}4kV.xAkslc7{nMTT[ɿ-{/=()$+,dmoa}f!+~}E̙Ӡq;sMb<h:4/~zz̝S㤓|39sRױcze+bm?s;95w\NwӪULb=Ԥo߾ޛ Coy:_m+i^p_Z>5+9Talm4qL{ٴvd֬zQO޽ueq]ƈnAUv=..>'O/<Ͽ|*++Ӿ}|oР'Yts~o{/ŹWWWeذ 3G[ /Lǯ~~ÇwܑꚚvgo}_||}myFcSZYIҼ$KӲyY6R%3f/Hmm]vmz礓ڲev-}[n%N2}9u9/r) $.X)SS^*uӦRV^{Sft 1nܸ_u??묳3桇ر9!-k3O?K.8g}vn1{g7. CO?e6ߟGW;vc:|+?G޲Mxw^ yeskάkGהyތѼs)]<;ts==i<@&h ~ڠl.|S7uj fnҤi3gfke__ż;z뭗;hW[r1ǤyiժU<>f}gyff$Iyyyjjj=2vlSVVzȑ#wA͛g 6ȡ_|}|R="$E)*.NRBRWXdںBj -Eo0TZR5ilL<)[lr׻m2w>1c5.v߭}[hr&i`Aү_{.Jʒjj6J5+%-[p9_z2&Oɫ۬ dԩҗi't5XkBRںPUkRBJ iYVeEiQV\q'-sn]zKzД)?:#JsI2m=\ ){T젃R93%}[G9g{ꦹRlٗ26SgTfTVե6K+vںgV-sۘ}ZvnL,6sƌknM49'e-/I}o sɘ꫙tt?䥗R;mZJvͿ~8{nΝwNse}ͼgܗ^Zz<~Gr\qůsO#KΩjvoնm*++;}GMs3vSR\^ۦ[W^_"w"w"_~ܾMTd›[OҢK-O>= ҳgϥD;hfx&3.e].}…~i/_{-;_|Q^8NVvX^2$}rI'eªxiժU_sWK.uyɧr@y뭷r ݽzO>z5ȏ8syfvDP0 Wo߾Y`Aua kg6z.sk$ɨ}5k,W]uUW>ôi&{ʅÆ27tӜr)_~ޏ_1<\_16$iޢ{=mFnWg=ҩG<=ztʴ%B!ƏϴN4<Ү]gNg|ѱ䤓OZw1BSyc i̫y6}V4 EtST,&Wicd ?iœ3rΘMCMmmjɷ<}l|Sh֢iڵ-[kL6-:+5KICg5 Ԥ&iaInxxNfΜY?_qqq4K=t9GyMM_S :*MuMMΝRT\N˄%zJv85oꪪY8kASuUUX}uA3kR\TҒlQ6i֬YJG%ϲ%RRWEoYIIiiR\R⒒5o2ǧhS g-6H]]m,%))Y4}KKKJM"̛7of͚P(.e]qPH^eEK񩫫KPHmmmjjkSqZ||JJJ/c).)q|9}|uVֿwiii=1  ѱa_Uq]IDAT ץ>@$0>V1ޟG  a a aXVEEEǥN\XYi3 &dM||Ƽge˖ԹsJ˚/ 6(MIl#l" g)pgߘ0aB***Mf'IYiQs8&LHeeX:uӺeIRӻ/B!*jώnfiݢԤ,S?_ߜ [?(JBayy|̾g}gNא"#<00ovxO GI='"^0Qv32F8#qFAon_a3$NOE6 ?nYd7f|'ڸ)T!󒽓$rTB:ȥ@)g$7;I{㢔~"q.w 6Z?\JJKXT?<h z]Zܟܡl#G ʨ[Gk@akn%Q-Ï9U?Lm\$RpqFO[ӎry,YBD4pƆ:E!YJsH$yUկw>FDEvy:Tufc_}]l3 > ~_o_;ȥ ɤ̩az9w{׼ź|N5.C`#TP.7z8HIn7XQxAGd0\&5pFF#<F3r 4UWTV*ɽmC< 8#~|*g{kT*Jr3F#o$h[wt[lrf(Aߐv=Rfb4[yv-|(+JQ3/TZ&QH3bPOMNqB[+ݻS'G(\fhADt1Oߞ=3 M7㎑:QVe>M- &rNf'PGFᶺB0Vlh8#o83#O<+,+j psZɂ:X-Xa]lTJ$"㌬DF#_7-l;ke"e!DԲe+_-! q6r2hva }N/5f@#w'N^&9NI#/apO Nq,Ȼ]7 HlW" R7򼝵\huڪ VD_V L}5۶r(tqSzJ*lL⌼Tyj\Ss\*wt:]UU_xģg:0nK>uJdggoHBf|ԨQD/3>-ѱc\+vggg{Gg"qFEI_q$3me7KR""hzKq;x4FΨ7pDd0Q0Fy83r"MgTyYu{'nNvsX=v=Xo7OT|ʉXZKY)9yxT/lwV?roWy]ԥe75iF-i~dbK]1žlxW?[9ϕ:F888V|KOD-Do™Q]eٿrw9U# ڵkm-ݖ+t@@#PRViyKFqF 09h䌼K* ViѴq Cna$F"h*8iʬaKeo5׻12nc9bao{ZjHغyYY-XdO,\ z0x: 4]QeR<ϗVT9iޫ2<m ՉH8V>&"&}7|%R ydDo]|O:u!Y#o3wj! l8xE[Ͻp(pQ ZV'-n>lCJhlwk"s^K8bx+$cI%RRVjuU:=eZ2ZW7y! OrDT7=]`H^w\Nέ<J./Yi?gX+:4 cFeUuj!{mu]aYWI,1vz:ܐI{ENҔL/Rlp3g@cP w0F(a(D"a2yFh0Z֞rW>zȑD%\jʦY[J.kzz+s`L֐V$6Jbm9Ft%ٱEu)iogG:7YHo>O]YNP%aMԂq%ZXZtn![Ś?nk'2q=IChp<99())I.3 cee0 V6 gC7n\bb"_|ūzFU*֭[CCC[%%%AAAVVVV8..K.'%%Y.`;QzzBhѢƍ9z!a F5c az֬YeeeQQQsfff&&&T*%=<}:1<ˉh '8Z(w4PDԔ 0b f!q eF͛72EEEJҴnm%Mgq˲B-Y?r/;4!7k&t{Z=S𲰰P& RT,&$lSvAAիϝ;5 o\&())I̾JR<`]K<o>`@ξƍҶxVHHHff`ذaC@@FZ2++kذa={\jV0<6Э[T*^/Sǎ{a ܵMË̙ u:]KrrY1q%„?z.@ll@lx8>Y^G P qc |űݼyOA={yFjۥsǿ\t)]bu6n/KGx91!M%>Z{T]$#D`oODnh4'Gǯ#s23(&o|N})3oܛ5#"Miiii)yxx?GJɓha'Y#^Vk4sG8AF3̚JJJ2K.GMLLtrrի0t3P(ZhqF"&looo`ĈaDw}BDcF-(3`0DrgD4U&ED..Jt)@}l0mzJZrV{fϞmVe„ ѥӧO'Ç߿Cb5?vĈOXތFmAg˖}{:YoQB֭V,C/'5/lhѴCQSL`3 #'2.7+Y:88;b*--m׮]^^^qDz,Ǐ7o?4eʔ!C`M r/}]TެҙmIHHPgΜZ"";;"* m׮ѣիWO:շo_ox Cή8LRRL&3 ˗B"h4͛77|dd}Tcbbzaee Ǎhݱc˲JtHdɒm۶U6lXϞ=WZ%aÆ cx<<}#a{e2Ybbb~1cHRӌֿ/ҬʦMË̙#{m09/P^|?33zSN:*aaaaaa~(L9ssmڴ:'=g7򻠌1BV>~7xl! EarvGvvkoH 8///\$zꕟ_}h.LxdLIIQTmٲeٵ=~h7k yyTǟCB}:<zɻ?{q:vܘ?r=.R^ȸ8sܸ؅~~O|jY7~_9i{c;?`y xm؇ualz0`P7/ !"4b[:vYZZ&?_w>K9xHO֮]7cz(>Lywu͋|) 򒵵O?h[oF{.ވT1X?1.wxc?ѱЏ.5csU-_!/H~?e8d7>sw^[~}~9yѩS <==u%!C32hЀű1X_L5~hq܃|̇(@ΆG1Y߾BC6mZ,Ҡu{oK _E,.)0/ZR}2eٗN;jykO>{HnzzFx$p</͘N˺ݭk"*..i׾T*K:9:899999)¼E܄<ϗ9::F%"[[[qxm \=X---utphkS q6kW/ee^h ӎ/{Bw;rGٳGQEE#jvveeMG6r6<) \ģ+q;wS[(JKLvhߓ'E}lOOX|夨GL婇TUU]ɺѼ7^ upqKۧ.I{)gϞ0(?CwS#7ryo,0;X'ʪwBpL>yT֭Έj4.5؊x9aKG=ٶm[xxmƌcX._ m2 ޿%'rOpM;Fэ·nfͤΏ`k׮#Fڵr̬YmkMح x6S; ***VZZYY)6eڬW(/ma֬YӬY377-[IIIBt???BѢE7ز⼼L{%fe}hr0TClٲGkD4}ѣGN>],z?8===++Kxj KKKcccZ5.^mfff6=lu9Hk֬}M6M,qI}ٶmn۶k׮D斕T*1Ya*--m׮]^^ٻDQQКpvvyfVx'@#>mKT*W^MDk֬y/\@D%%%Bz6U=BDZ"";;"32;99 wl.4}JR8Waʔ)BAԥB"h4͛7Yj!yc+xW>ʸ>}={޽ĉޖ[XdIUUնmBCCT*}]g=|M6UUU-^[ gŲe:oڴIıÆ [r<==<`!yY/\p޽͛7򲳳Æ\>mooq:爙NO:uԩ%b5uqqIKK7oÆg7RǏW*vvv[l!qvz lق0ll@ll@lM.w-==]GSX݀xy222rĉV64iMޥ,˾SL>z8]XXꫯ^|yܹ|efɒ%VuVbbΤ$J󼯯+ć~9vOZg}ֵk׺裏BBB>)))*JJZredd޽{#""rrr=)xr<}IqhBѭ[ 6ԥʁ222͛W#bbblmmCCCz_?SRR "^ƿjץ׮^z8j9ۖi|'''"𨱰R4$$$T`\֭[7l!|>FM: ҇1֫HvuuUBcu77TZ|`l5-ɒ*++-Z$iӦŋױ__;v,T*M?rvHLLTTZj߾\p޽{7oeggWv֯_P(T*Ubb"6 hfPo"&\\\z̪͛)Ngffbk+J;;-[x84$-[WUUm۶:n >k>Zck,=qۻ۶BGߦO^ꅌ:]C~%&߯OfͰߧ 8 LNίMk y\69۞sΜy%=gomgORuㅌ#Gг]_33 oєFL|CǮ""KK˄`IIk#t{q]u_3_^)tZ5jB0n|u_=^ppt>Yʺ}?+W7#⡔oM?K HK;ڵKww.];r!Q~Eđl4hx ԣ%vh_Ÿ.[ѿ_v-׀ MlH]ޛlmmҠA|`СCrB4RMV(=zwzM,˾4hCBHѡC(w&OE=3k͆ŵ.ջmmm umllL?K >hoS駇ֽ[?$V2eٗN;jaSzڽGrʡŋ>#? {wޮVVlxHj;h)**j+YW\H&*%wR_vp[/^.R,ֶ. wo3UUU r]F#oMoӌ酲ovp*w g)b[DJ꺵/^$$*W.vҵ2/AWWr!q2 q܁鍿Geٔ~8t:5Eq N`^^OWJ>}ùg͜$޷S_l]`>uʡR{hӦ},pfƌuץ{={Aŗ_x^?#zښG͛#շo`MΞUN=rpyzoۦ6uʡlC8x9aK0Z.G`UN61|$I@g>`0zϾnݲ kW/5W͚I!1&&c  >ciwiIBtC3 `; b ++T$e2Y.]9MҸŧOd^:=˧B g[qIG}r˗/[Κ5+>>,**jܹTT+Wj111D998qy,#BCCS!C`l,,,d H[nUo3!!AV9s4}\]]js~~R͕d5斚j༼|ӦMŋ-CBB233;t_lذfMČ9RT? °XOh^p+'̙3G<]c0>>~رIHH#""ƌ#J7\Ov[&;M_...iiiz~~~~fMޥǏW*vvv[l-d-[@U]yolh,dV{$\bx4x'%6 g4͡as̀ץXE'L6 E-6nXJg&..K.'%%a5r6@Sc.> ^|yҥD4a„ӧ[XDJnPx9aG '˚ `ڶ/l<MD8p;`mm-&7n,k4n޼)T)..~K'vEmdzKkt/_~9cY0DQQR$:zfRHgje}]cdlj/ AKkrb1RPP0vY^f!a4N53ۼZ|`]<`@U׹s~M|ݵkڪl۶m̙ ###ۇ e۶m Øl?haRRReeEĠ;X5}raÆt]u .|w CNNΌ3K-TyϜ9s9"6lXϞ=WZ e׮]#FصkWp pQVڷo/ׯ_P(T*h+V[]WǍ7`Bѷoq>HVn ˲3f M6m۶m۶X/t5s***Zjѱc\鴑ɓ'_pe9III*y__+VӇJJJz'11ɩ+Z9hoٲe=8P[$5yhu޽{/LDÇ߽{wm.]4j(B^RR"SRR҆ ##BCCc$/KM5gkovҤI ü~VdWqJK gUrr / žKxGݯ$$rv]ڵ+**J|9qZ$5hl8u:݉'6l FF9oH+0hCä~:((P={v͛7o߾W_}%ެY~BX3fիW?FEEYꫮ]iXe 4>|ʕ+*_}$$$QRRJywŊ}ywN6r/7\[UTZxi$A3wU|;AZGoL Lxv^[KO0!::466vBp֬Y6mXɓѣGUT*ʕ+ZmLL~Y~W޽׮]+NjK. ᯿_ûG׭[T*MG9Rx#99>dcǎ LII2dHhh(6tFd@پ7o޼rsω񂂂燆kN 8;; F^81jupp3gAr}b/T*AAA< {ŠpZmM)J"*++f[jjZ^|ypp06@ξzھ}l"6lXϞ=M/ٳݻO8]!C߿`0رcС8~ǎ,*Jq 5{[әM6͙3G .Yd%%%_~ev.]RƏ߯_[ GDD3F*&&&bGՏSߥ7_agڝ)vg77Gn]c7&J9ڰKMyoUM_+wFc#tR In~xBPp^[{g&v{T IDATށewmmrv̀>wpFƯ:V~?<Ϟ̞+K6FMB>]1bbD]V1_[cP˥_.ѕ_oNj{89 v8kd_F'` lxsvff'qbgyӖ+2 sZmI۴is󑚚ֽ{wyJjҤI6m_nܸNOOS(-Zظq8P^`AǎM5$s߿l%%%AAAVVVVB0))I.d.]9r[ g{W?^RRBD&--m&L.-->}Xɓk+3f̘9sg͚_VV5w_WT+Wjژl1mN.3&!!m6j(kkK.5JP \0rH;;;굕ׯ߁w^Lg!6dȐl1]/6m4i$"*((?~hhhvLK:;;խجJaaL&cF*޺uK&$$`ww3g`maΝB y>22r߾}V_~!"V۬Y3*JR<`nnnjzb9foɓ~meVVְazj*k+9m4V2b*!!!aÆ Bwǎ,*ʢ"l1]#FjJ̯6m o۶m۶m-W5kvzEUYbźucbb JJLL ؗeM" ~0azM8mdff,*...f oVl@@l@@ll@lֹsg'vZs40޾H쌌e˖F2g8qℷ 4 6lm^YYYÆ ٳ5f5!C߿`0رcСBP&%%%UVV.Zb#ϲw:~1cHD!dɒÇ|B$>>~رIHHm^6m /**3g奪KTo֭BP8s>66bԣzs g gr6r6 gr6r6 gr6r۶m0!ad=gڵkĈvB4ޜ]QQjժTDt8::_^x{{QNN)-ZlܸQyyy$!ݩS'Rg!RRRdee5x`Z]L}5u}?!pVV;Q'N-bQp qjuՁ{*{$r%997>>'mի߿_kkkruÇA8r䈵 ^^^YYYAAA >}͛/ly޽SNմgggE }vuo 2d&P---:T4_>d==#Fk68k,CCCBuӧڷo gϞ͛h%_rN_{%To߾-[ PjUTŋ*UP^=:udW^m׮ +WrիWnԴثmyⅎX,4{QgvСZڴinffQ_ ڷo%B޽U*zwٯRZb^PP~Q\n,ٯ%$$h:99go2lsQ֭[}m߾}DDDٯҾ}۷M6UXYYݼyS.]V=jӋ@f eΝ+(( ܽ{w >c>}H$=z[nĈe… n 200XlYTT<9#ª_Xɣ.U*%ВhҴEҝ[7fK(ll@f@f2d6d6  l@f@f22d6   ll@f22d6d6  l@f@f2d6   ll@f22d6d6  l@f@f2d6d6   ll@f22d6   l@f@f2d6d6  ll@f22d6   ll@f@f2d6d6  l@f@f2d6   ll@f22d6d6  l@f@f2d6d6   ڔ;7((T*E2] oll@f@f2d6d6  l@f@f22d6   ll@f22Ҧ5iڂ"5"ԁ=JE/Dҝ:}(E}?^P1d6oZPP)ge\/Tyyy'NzD_biջX,, ~xI/ʤi޼yoH?ŋWs'qC===HDMgr:qԭ{t%=ϊݘP(( /_;ϰvF5?vfմO9zJzxs=&N/Ξs'wڳxIhЂA, ek‚Ak֪Ys=Gv;w^>=_7־C氉f0~8?#6okjXWWc;+;ӣϯݸ6 EBfBzQLʕ+ FՌz*_tδ4~>xHn]A#>u򴿟qn[&,\o=շ#G8(7\T'166j׶mɵ<&344޽[Gn400ݢL Z _n9s3Z. [YG>{śb_>liyҬx. II~gWjjR|Cb(ЭV}RSI__뷪_OUa5ӴWҒhV֖IeEd'O`9 d2==WiiB3ZJkW]7l\UV{DGqB,,*degzԭNCCÒ+ԩS[ uKffzMCCÌ ͚FF*AyjtzL`cԀQrEݺU*U)"Iw&=~$ TnIfBճGjjՋ BR%t;ش]Z#a5DH"H$E?9s>~h7ݺuQFNNNժU5+ڈ*=-s.m۵z W~VfΣ:rE0/?'ZI{~ݴ5ggԬYC<ٕH$STu(ml\&Μ052|L*311.u@ꦯ^(33FuSMnn\^XPPh` ҪTW"QQ?:TmwV3 ШQLutZZڿw6XpA֭E׽ YYZj#*=B)V{jJP*ARBTZs*Ukk佉ԳAرÉ'{Ν+XnbbR;+3sn05`l?gϞm;_bΝ|D?'' ;th'>Rv͓qt0[lTPbjժƍ7216V4haF7[AqW4o aqυS&=vCnM|YZj#*BF-?켬̜̜̜̌W^f|qʋM̛iFVڵsLPLm>7ͻS:wFFFh=7lMas' ߡC7hРy{ް'G5^hn}'Ov풛8(NbJ'wA#N;$NHu;UV-وak`K\TgJT) P.rŭu >iR"}vfRwo0atџzuӸ 1~O\Q JioеGi^3}i~Ν=jJzSlа'-Lk֑ _L][Ĵf~~njS2(_$Ij_^=$HpڛNUqOL_"gBRTJRJBr\!*in7hP }.ֿvmNߵգӧO8G<aÆzzz>ԫ:kgx|@2/D^={nq񴎎MkCC2N mo>vRN_wwisҪ]L&}QBͭ\./lWg&M[lOshr@&$IIgI˖s Ż|MXlhhh``7*J]@[˸Li%)k S$ C_cdddhhR_#ZZZ|{4.ZZb]]_Ϥs8}(E}Fy9Q=٨2xӛfWw;VG*'2J|f$գzT4*22@yP(M*6+޽9/_\ 劧Ϟ|׶;?xN4xYYd2ߔǬJ +;w˴3s'xL)z7ywZF_Am&)UQ))mzʕ5Lo޼)̚=;ރݻgѵ}4L8tOtoAjLwUZ~~> …&{?ܹs[s9r$###!!/Jٳ_e. nߡ}|- 裏gD,_ZaaK>zE*:9+nlP:wwDžE^vcA/^r(wϞ=:tOw=~((|󣉁+ٻ |yTh`⾳G6NKȌi!K>(cǎsTR{ڹ/MI}AqlTf7otss۷o;fooQ1N͛7711n;";'733|݊5~255ݵ{nj 2r#wN{WEVM>;$$}{º#ڹ~={?R*`͚5;X,[{fsJ (VK"cƎ7%bW;fvPȗ_~)Jbyrr^}]>yw7ѣS*8{[lYruDDСC/_>t# bŊCndɒϟ9SȪ͚-DFۦ}ȨuNŽ=Æ (/O>8p{lG6vFGoٱ>&|֬v9n!C'Nts0d4E"Qw΍}PƋjjUU/^xMr˾Io\6u={ܣvǮZV|SIDATnpCM [c?ae*tJ}GGO=3g cWT*bM=O@2(l={=z...;vlwvv޵s;\\\6o4h)ÇjldѢE6[MHs^}'##~?L( ;vY8-1qۮv4yQΞ7DZ3i[}Ih uڵ͛7ԩ]UתES޹uܠm۶u}9\ڌ]n]tttbbȑ#]N0mŒLz_SꙚ9+fG@>S-\=odK.7i\l7 9^zՖ-}ا妸>qۍ?쳙~CV=?UǓ'757/Y Rto蘸*I? }J/^4syDPÖ-ܹ훭 ٞ٪-Xԩs~G Yk׮nJ]V^4RUTᨵdŞRri4v_...O>g<@̤Z_mڳg÷nt68[OO잶Gs7޺vޗzy^^}X=2*W&pf͚.v8f()K=/:EX>222AH}22*&%%UM ]M[WYC2W{y~oڴ_6S\\Zl’efOn{%C ~pY3so|QK䘩ܪ_,۬X_aWXXYE]z- {`hHp[z疽:k)JAӥm>}Z.ݮ߼}%j ؤi[~2fQH>׬wppHLLl۶Lq5Z߼vmٳgǏY''Qk' ^dۯ/?^ڵs AԮ}k7nڂ |OM͛_~{ܨyCާzM49lSTGk̸x񢖖;/K֧a2gbqL/y 4ld.cOf8C9࠾uyFK}7M,NK(h=yM{'8۫M=ӧ- ޸qc^֬YӮ]1a{M*9.LLkܵ+N]M|"Ej&Fnݮ^ O<۶y&Fn߮^LO>D v}M/޽+10|yӦy t]"1VEOdzQQ{vܹKDDa#"‡]seĚc=mZwu>sԌGO/((H5)(cTjblQWI$ݾ}oFddh۩,-{Ϝ9w{0?,lqHŋiiRlA"kVE߲'ڹe܈#G>z1DG6m ?7oveow:==YfYZ~ޓL>gNS9;82n1c]Bl2~01=ff~^O͕ $zzz BT-RY1D*j, ->cMB픙>S ?rrĊe7᭟b611՚5jW75 &F&> \YxþqTq],-6lzXKK1c\})??;Fv _w߽Y5|J|R߀rss+V<=V 2?zm)~cV{n_7eKNX3cgOk[ '''߽}}]Rj Xs8;($lKcwM;fъhak7{u[?q81uq퐧ˈAr<;==ѣ*^ɓ Jwƍ  Ի~J%ܻK];H$4-q>tC蘁NkmƮ]TK$/{[Z8qY2ngϞmڴiLZi8uj̀66TϐMg8<͗JnÆGV*)}1}%[׎yvoYb#'O>ny3<=/\8gU}J$ݾCǔ' |M={KOt9x9>[Y?=byĸ,z^SJK?\h۪Ul'{*Ѻqug-Bo:uO֭ݿu^nvE"H__O*yM$|vqaSfx{ޜyzzo 7RӠaZԯW+~Y^^ny9#ª_Xɣ.ZMEtF]8thZ|{ ۶48!aV,6ȑC ߱#aР!;ov o߆ WVYL---:$iRk֪nF6H~4eKr}b[*x,'I ZukANNkD؍ply˪UDaJR$?Q' bVzaaAAJYZvUݽYS=A23;~h^=7xpϩǸ^zeؘlGzL>tA>zAUT)թ03#-/79s-ZeiqXmVQ=,wuȿzŨT*T*,>lTa#C-]khhX^2{`)kAGKԟb{ߦ{?0,&3٨+cccn:lΝ Æ&l2c۶-Çرm;8x S˸:R|~Vfz8 ]FFf-}<,X:y7lX5fӧ̝g,YnjbZFJPhjUϛj X6w)fصmMTavsg[1vĽ&N;?t ۦxg bU3#UF?,?{M@R$ 0wμ~Vϟ>F%200(#KOaLS"4ht!Qܼys̘1[=a뀁շ [ clOj3pp¶!l J:7+ Dr>Ego9aWTTWDDI|fe2a|*U͚5Ma]@nco0h0I1Qc{ؿwhDZ#VmuoؼR#XU ؖJesfXhIu:bDR1٨<왳Ĭ\>taCmG^>t-+†ڎZ6J7ӹKg__I=Ã',q*1;͛;wK̷w;w̄ckժś 2ttfzyL ~ؘ CcWϘ5D7mti2km|G&޺U}>-(N:{{`7'';i̘V}jԪkٻg z{4g٧gM}z֪ʲY݆}zh!zɤUy-^غu71_}y^͛:) ` c u.ի VAjԨa u9~!6̛}p2b[, Q5Az 4n!4ԩ-u_KA~|QAhc%AA T75kƍ PNmA׫[q6  ߈G>y"P=G@fcF(գzTd6*>x6d6   ll@f22d6   GOt%gJ^قA6!g@f22Gڔ!MxowHt2V0o}eyGebH8gJiM8 @@f@f2 sVoەly2rļY緪gfd /mm r4^o=_`lj$<{<5?_/MyZq#2W`u\XB7kš ,*Bf@yv-}b}ֱg]|Ͼ?g觊Uw Ru͵3gYZ4o񹥕x/!n%d6@Gj[|ƍnGYg'i~36l~IgHW 5i|~|{on\m}k׮{{M!jkfFV4ѽWQϹz&l ev;oKء>Z]n[|~i>xU/j{#,G'wtʮ=~ꘒ/-YQޞ;thשw'N*N Ν_8Z8 vz4e42 …uyX~E }|kr`:))&-[1q%xq!VG\H땟 Ĩg%;edekyإK bb8,D,# ٣eucFFfuSRܿO^}234$Irut__~ıCcO4i򡶶vݎ=^;'+vZ=m?7<|VVuOS=7==H󰺩iZzzzꩯ f=oeSWiijT?TTYYFFAx*-nS͛ݺcFF6eTi}>|k`?XTmPn: hi>(;%m۸ ;9(;;X&&ƚ׮]_bAP?_V;N<|;: jAQ+H*olddۍ_޾~[7-ρRY]YDfzOՒ-7|})'O}Uà L2q/lfF=ڋtxU/ =~L&3f9:V/w~.ufEC_|[ꖮ]:MP(m>xr'+|*Դ_.]Ozn.KB;}aa߇8i?ǯ?}7%Ϻ{f޼}3#M=̼YTiƦo}n֭憄,;.zFS/Z4Tqn.eok YK[|}<'M M>pihp9,η]n쨣[J=rݔg)^~E _x7)yŋZj}`ӿߜ~_њ9 J5ވ5i"΍w}֚.ژ*{4rɣ.͛TT^GIAwR<Ư=rrrqueASb2ݬ>c z`]U*嫗*2=-/zd6~ oVT'k]g^nPevMZƼq@nܩMf*[lWߎd63Od6IH$d6I ˡPs  l@f@f2d6d6  ֜=Yeb\*C=AF-AZB)(REoJPRP~יTEZhD JJUA-PiB+T?'WJATiv~:UrA$Rk_A *JPlJm3"Pr)}&IENDB`kildclient-3.0.0/doc/C/images/we_vars.png0000644000175000017500000010056311715730227015137 00000000000000PNG  IHDR]| pHYsktIME  &2 IDATxy\Tea54-ťTLmeiZVzɮ+כV ^3o M4M4TD[.!* Թ0yz:rsB&bkaK1tlI-gs6R˳vJἆӿhx~6]v:#V+~gUr/EJlk]V#l[al'%==lEVWuax-f=Fi#+ҝics`b񾌃74ܩɻrv@6p~ GvNa깪zQ?_QЏE6O1?>oӌwez>ɪkYUXcR38;tllߎWrޣ=:"Az&bX*clx;gDt H`ἆk~@M%ngINK-g⾮"t[[R"\{dgttWg1r{k/7t7@Ƕ3*ywOiwT ]$#7#`VMMI-+Ѣ21s˨ֳ{NYY.ͬ [kJCҎ.Z&by?W~#M8_ЛZO.6о-c>+jT"<νNÍ,r5^zs z*cN""N϶Լ3/"Hp?EDe~tzEFuFc9**$sXDDQʇaίVAvy\&3D$3gE S7Κ7 M9qf KkYO1ɔZF8X"[adRNjz=˲qIJ^::0z W?5^,ۇm-:Yʸ6}wkpRڊbX,1zcY%e9[^#}Gbz|$D_ӶwjnhWW]"W p{Bi0"V.uD,rDzt,GǕW5%54J_ihIrxlZ&DD^JD"T²\VDzD"u⪛zjvaZ]sk1S)nL]SkvMܴa}l:9KY^oш;C('+%Z"ߺJD۷o0as=wN.|~g?w/ݐZw}d 7&^)ݾ,C˞]pъd#BN2jʥTgHp ^X㨤Q<9̑f=o:ygNvzX׳G,G""X$:IX$;I+lՌʨXZFڮ}gR{jC^Irua.{5q`=ܥDCfm̔rZsJ]DվQQQ'O:7me.60ZX"/ xnWvpu:V.cF$ 8N*.VKfeb"S.툨A _6]/e]l$ѕ3w[.~X,] IbXԠيrD[]kLj<`׵JMIGL̥Z&og,GD555=FXheRߛ1MБoyu"IR! U"j߾#_-#Xb qv2ttm$MGg tC۠ъu,a6XjT,ba9ðqGNZ:DJ{[YIemӛ%rNe9Na+KmcglFQQA\Me}'YzrG"3\g9a9jXS]ק+ɨl)Q76"GGGBiIBn[6~x"ڟ5"":qℋ:E!rrrRs"7nܩ(D$Svhvm+21QY|_YVjuz"81 0DZqZ^ӳzꎞU<٨QnQq>Vx(!-7O -z_3y˭;mdwv1⌷:5 6uzn>,Id>}&t6c;N#w^Vomel/"iY8@em=#"X$!@C"HBĈ8,6^T)7k͵:}yeҜrW) x8r։H{sOtIZ^*jڮNr T"bY:qȨZ_W{܍OWnxx^Q%7vTvŧnxkJJzٻ~TՓ/zE?t^z _3'He\\qqGz; 4~4O&azzH<,Mn`k#L²O#GյqXl5"qwR_}޸'Μyg1 tzVwD #1"3ynYQ'7cz>)ꇺfV]ǜ˹Njݑ^?jld[XD%$eNO q6<|5uj""/ebX$_CH"D\4hԩz(5{sbDUժ-7'FC2G/|}sA}:w튋 !/[Gg^,gM:9K 뚒fp5,1vFSviD7`_d[fwרY=DLʤ\l;ع\;pI[:OlLwV֨fr;"Z2$zr,Yd Z{)5 {=k<}h޸B0e{`G45%jV %2KbĉH^K%Ǹ_Kոt1H D4_UͶUԎ%1?:<7ģsۖkypbp?IPGD+gu 5pEHf+ͦ,5d'Z0J/V\@.I_;8hҿ/F)r^5Tڻ ERH"r "f:"Z}e̱2D[{=KWKtU!rW Szޛ57< X`D}މ{s7%?Ȣvx[]->G@ź}9u'9 w;zIlۉ6DDFoSZ#0E kjT*Uo/91]rgn6VRWX~^S'ںtE2;DF!ϟr4TV9#-Qq-X0[ a ?1IS6~8@uD$~>N _\ 4&;u'c@̾gZؼǿjjjbcc,X ԹuVnnnjjjtt嚞O&SΛ7zsg &Z"ژ,;uxZ[Sa3_y D²͛7:eee*ʰmc5˝ 7% pӏKz @2asի}^5#!?HR~Y, mB...ްaùsrrrI#UKR4 WRi48t:kPfΜo>|}?RSSL‡ma9*<<<77W%%%Z5ƌ~z|h{[njR455U0iҤGv-%%B'w0 fh44*45&,ߵfTTTTT<{l mr fb6b6 fb6.=txʚw'MjX2:|o?\J~ιۥgXxDZn -ꕋ9yyr|7k/O=s&۰1aDo~dt"3&)~E\ m\.1/DD>ҾO`ܢZVb2uƋQwbt6~W) v!#5rKj&ﵮ]˳|wDTXx';&\{QII*6vz߾Dtv4kp8 /[غ!Xo5r$Z"zͷ/?z6\Z`11 %zv٫[jL踿- "LPDTXX(T3lخH/e7o|1t猳I$"oh[؜QMF3dF,eaF`yWJ -@P^ø!8 s$B^[n_|m<,gg?vpP2|͹ek>}:5-l);mG:$MB媪*HLDNNwcnj5'f޽{Fg?HWxǗQWiii2L*;vLX8hР" ^^^6m"nݺQ~~>V0p"ڳwߏgUMP(…S\S*-hC3ƛu˕?yD4$x]9^}vP:Z,9;p-@l0lSg EGG[NVM6M(?tPaa/5:uy󪫫/_>w\";vlzz:8p`[ٳLvc ɚd_}͵E-kgT>bs6Ddkk3rsu˕{|~ߝ] <#1cj\KP9Z"ژ,;uxZ[w{MInZӴ7 /Of@~=eʔT={رC"T*!+m377f̘ cǎMJJ \xDH}l.T*MMM5 ӦM8qX,6ޮÇ/$''O<> 1޿Tm* 77״œ9s̙cITTTTT<{l~ٳ}ܹ3>cxcgA7n]m[}}`6;B1111F'-^O [d#҄TGGAe-[rss333Ӈ*,,ܲe>8vC8u'7Cdcv\\}DDV .\hkk;qď>6--x|pW鑍*ʴCDP(LO6w$5Ϻ栕QUU*(XbŊm۶EDD%R4--nҥB5X\ZZoooWWC-^/IMMСC݅jaaaҪϳO: ̙3g&¬3g {'g4L0LN;Іc6?ڢSSShƍ8!gj‘#G ^^^elhUK,!zpԩͫ^|ܹsq;zɓ'q֭|ŋǏ/'O\QQ oFF+|aqqE"""vS VёI1eY044㸙3g۷1Bppprr2IR0//o̘1AAAׯ)@옘]vɓ'O)Lbhd2 M׭['< IDATajjj¨(~y8KV4޶m0)))7> s@_qkrss}BlqZݹs'++kG3ˆ >\.9Rx607ntsssuuݵkסCڷo/ ٵL{y||am5fCU:h߾ZΝ;a„ڈ`B.RsК}zRR^ @+jÉhذa|aYYٸqx/1?OV -z饗\? fUػwOD;vܱc_xСqrܱ SNP}_/,++'"OOO"l ;v$C,P#Y1m۶QzzT* GsΆ5k fUXhW_}EDږ-[… fddݻK.8EIh42 |;yJqP__V!!!vvvαMie_M-'ٓ'O5jTYYY~~R7o^SZYN۔j3gδUT;w{Rv- /^ܫW/40 ***V/d4dȐ!k׮ň",,lɗ/_|gΜo߾wyGyi:TXX/t}֭\|ɇ~~K.*z zݽ{~/?~)Sy"## Q .8q,l(..>""B%3f̰]p!V=o\Rmذ7n+DTQQdTٴ:t@D rӷ@9::s=lRT\qz+??/wppjJ%%%DTUUqOvqqv:/U —ܹԩS~~~{XbECCöm"""X\ZZzM;699aٲeJ1.V^믿%;;;99Y˗/3f̺u,zСŋ%aaaw%KcYlRi&=zyS ̙3gÚ{1fsVVVݼyps&ԩӱcuX=L+9`&=H3%\SSS###7nwOͅvigZylj#G$tEEEÇ#G俤g"44fԨQ~a/JAafܜ嵡|2=(b6K,!zr$tsΝ0aBmmmDDܹs ϟPSS`an:Z7m4씅ߜ嵫W~{իW7z>0Omgb¯ Rg-rYf8p@&%%%M29mᛸ(ʪ*???>gƍeY7o?o6z7,}7k*~ޟ ^ q6__ߌ "JOOWr$tJJiT0X,}6_RYY~Y ,v֬YO5k>th^J+**hĈ,ZuuuDTSSlVpqN ]]]9RYYf͚{ڱ؜֭ klR|V4TjfHHHzzN۱cѣB!]xxxnnNKJJ sǎDRY-,677رc|MVV˗ɩJS#>>>**bbbveʕ+cbb uVO`V&MtnݺkM6qDX -?QYX;gΜ+VڮXbΜ9Be\0Qjm1L&ׯ_vvP~]᪲ڟg{fΜ9c @̶jW^1i8zKJJ v&f2E 1O?o߾M_~%L3a͢}َvJJJjJ3f.\l8{{V˗gfffee+djshjEEEDii&谰0Lկ_?\Ϡ8 hoX***jbɢ}wR4--nҥBرc-[~$b:tн{wpɒ%{Q(M'111..N.GGG YU?naPh3g YYYZv 0jbا`E2rF&<mXLLJR([l[twwwJշoߓ'O6Vt`cqV1m۲eKyyyCC÷~JL>ի~ʕ+8 Zmxx8 6LH_PPԩS 5wΗO=Gݿ+a8nBrrr.]ۗգGgy~AAA-׭[׻wo{rQeeeTT/XUUyyyZ JĤ&pBNNNRR_7_F.ѥKΞ=jժ+V={6;;[pљDt#FXusDhѢ?SN]d .?x5iAڵk?|L&[n̙3NNNk׮YqT*Q'zՕ/4]kI^^Nsss~: ə3g.]{W_}k~'6GDݺupD"aYw/^ĥ()/-lwqJputiǎ*j/+++lȴdӦM.\h,)"H$Dd_zٳ Љ戨͍_Ÿ8;ʲ,_T*ږ]&nE"×-[ֿ\~OG؞X~ASQQQyyyyyyII .@m6"JOOJ|>o߾l s(??ԨQ>_|!NZ7z[>ըQ\n:j(\ ppoZɢENJDږ-[>hɕ7nglllEEŜ9s‘#GիPxll Nw14gΜy ??D\ p0V[v[\0B?mʶMDSLY~g'!B0\~ڜ7aŋp,^RR2dWW׵kZ. 5j?٨ϴ4L&J;Kӧ K>ׯ~kljjjbcc,X`gttuju\\ܴipb4J[1c [[[tf ۭ[7T{n>333BBB֠M~4;UQQrHsvnz %KMMutt4h2eڳ]jVr f܅%K^(?̙3;ϟ~zjjjtt4_2uyUWW/_|ܹ Le|ܹ&LФMl|*,,|}Ӄ2es9:Қ4Z^:k֬d)Sk^^ᛵ)//󱘾FK$)ouk,,(ʪ*??abZy D²͛7_x]L{|?o 1 ä14]iIqq Ν;ӔmYo6+J"R*@LKסC"R(M`sru7ѱF,_PUUu׶7-͆FJUWWGD555ڹ遘4<<>x3<#L߿ffٚf@Md6Cbcccg̘av85l' F9uꔐʑ"##OϖdW^5,',9**OIDgrssuvv>xQٚ`4L&k+L>=))V^o?xW\ilnjD4lذl ((SNjܹ===/駟{9ݻW@_Åf,ӞKJJƎY^^nTZJrJq fZjb?IIIYpPx…ӧ%o믿5gBtki .qFxx78t 'x5i]6Çdu֍?Μ9$TST׮]stt䗍:|ZA uk.]={VPTWWߟ.tZagP^Z:\Cԩӎ;T*_z%>fWVV.ӒM6]pҥ&/BݚBPB0 E{J:vȿKmС,JmߔnʶZ[=;99Qmmpkn۶Ӆ>}om~~Q}Y!ֵPf{~8F||pY񜜜իW888TUU߸qo xy䊊 SL ɋZX,CCC9 TƺRTuuuDTSS9rr͚5aaajXޜ!ӓ`6g_ӏ2zQQ.Kl3(--MZN]'0N,?vؔe˖ ṹ:.)))00)JiiiuuuK.5݊ 9~;699b6<^k.pŊ˗/3f̺u, aaadnҥKӡCݻ ͛gggv/)ncfYޜ!ӓr 6(]vZB[Gjْ%KWs/qVqYVy攔]`ͿZ9h;f!xj؅jbbbT*Bزek y߱yT iM[lFن/7nk׮Co0Sc/^ܫW/#T*1Alذᣏ>3Je6ӧ(::zݺuj:..nڴi1)q """Bkۭ[7Ta:22.RPP[+I$"FQ1 #o߾- 9RRR*++Ϟ=[ wMDzȑ5kքj㮉zcDR#9%@kz0iҤGv-%%ŴBbbi&N(SSSq5b1˒vv>xrssq@| L_eE^M1hr|ȑk4 ;D&ɤRcpbv ;w jkk#""Νk|K.\׭[VMgB'N(J'M~ Djժm۶_{ )((È3\TRn-$)))aaagϞE-HRQMMB"ڶm{キ`GWW#GTVVY&,,  ftNcǎѣG[(kgϞ=wsǎDRNU@nN+WܰaBصkתU,$IBB»KDqqqr<:::55 k9F%nnnG5ZkPhJDl@@l@x<ۼ㔵ikgG$` 8.ZHf3 %|}<-7Lt1ےK K+v$dum녖bf;<!|S?^*?='ۻUߩr_֡|fkQ'oOJcEͼi}t]wD/2 ]g^ `''][agCD>]81/:|*jNGG>/T.lؼaC+;]V7h 7V3e+kgtyLg;TW_uۯ fퟸbagO2nF)/\USƼ;-Br+vI6}j; gVk)kΎף RnZ8 AA:asի}K ll@@ktok+ۺ1g fb6 f f>}_^q}yN77f^srrUM `E1?NDǎ8p9--M&IRcǎ{VTwK***BCCmllFUYY河  ˽6m$l+>>G&Y谨hr|ȑeeex˻ ІcA9BwXSPAܳZEvYkuPDā%bq (*@EQuj:p@3 ~]^;'焯w}Νĉ;v,U```NNa߾}3fд;::zyq[[[WW״4???Mo߾m6++V2lذ KKǧ {~܃-_nccsڵ/2<8@{k`s?Cf@f22d6  -[D.|P3;::zєқٙN >qwAxu-&&& 6kL˗/nZWWvaaaŋׯk.u{ ccݻw[{׳gϔ6 k׮N:m۶=x:>>ҥKss#Gp~ `kkꚖYo߾qL7c MzzWqSLL: Ci3͛C1bDrrfyyy3gtA=Ra޽͚5ֶ oRN?RNN΁m$BŊsrr^zUBAԩ^sζ2۷!!!a׮]~zuJrrrʕzJ[[[}]"h lo>|SoVFiiiU/w-\CbX޽{T*NRRި\.W7(dюcǎU߿֭[e2… 5ϝ;Wc\;w۷C%oC111/^411QXXXܾ}[._^=j/nBnnŋ---5-<|nn={իgiӧT*ѣ FѸqƍE700PꪯbŊPuc4!šGܙST*JV޻Ȥy[V-xk}:Y|)pR 22d6d6  l@f@f2d6   ll@f22d6d6  l@f@f2d6d6   ll@f22d6   l@f@f2d6d6  ll@f22d6   ll@f@f2d6d6  l@f@f22d6   ll@f22d6d6  l@f@f2d6d6   ll@f22d6   l@f@f2d6d6  ll@f%$-d6J;JEFiשlx8 ll@f22d6   ll@f@f2d6d6  l@f@f22VZ]#DޤT*u(/^2{(u1@}/(ll@f@f2b%]/YYY'O~TOjnѻD", Ç.kNvN,G"͚5k׶TG} ^%4n§ D"j8S&lO*JR)ʌlYvL'~8{ط`6nQ.ݼu}P<,%%)%59==U,Q~ڸccc?w~AS/_sAN!Q}N1'vHh[[%g軹JJJ \Gw3+/=I+V"׉S6ߵ^H䴩x}Ͳ2ϞXz捑`{Tmg [>}ڊEM7[SBBL;9{ѸQٜA2eS/+5TAhڬZryFMjz?|4"bر+TۧNi5jN>ӫWA/Y֯j,^bbjvߋDRT $A$:JUFFVZjΊ޼wTRxw;yٳWZX>v&Oǭ ;Sv]tBA.0m{B?E~ KVV-fV}}#G͛7G,a;.hk[#M2m["M7yNK4ӗoѮͷ EBfLzI Ly*r:Zo^ۉ٢kw%%%IgGMM `f>}ꌗ N۶G,\w<#G)U\.W*UZZZ522l߮]&O```нӶܬߣY&8Rrysfkiik"pf=ђly9.3]?v{S'Np?@&&&% kԨxF| r_H4V~Ê?#Z=ތ e^8W<)9ȵWA:U )T)))% +֨Q=77s>|4c]v'|+W~5F!WԮ]SRN??8u##'kiieggT(OݒFԫgW**.>sߑF lРD" "Tj9T* _}Ŧ0MQv]05ZjՌ+&%%k.UrRZN]۵:%\?|-+reyY? ZFF\[&%%WZ%==Z͆H$UTvux;֎täܝDž*W6*r@*IIIiժVdffyyR\^FY4nlRrrvVJ˸D LTPK[["ki<|dذ!C SӮff?8x嚐PͽE6S*99y2^gegjZJH$R*JR.W99ii7߭_Vl!\gL۷zV :u;6j"QUTi2ҳR3R3SS3RSR3RSӓӒS_~iW7ьZ5kn ӧMVtwW>rs[tҩz }۩߼Λ:Aǎ?Qnƍ(t}?6k/JzY熍Ϟ֭kfF:lTĶ:U*T_ ıCo<~Xmmu!FV++V,܈aok\TgJT) ;/O.rŝh!9;L3;ۍ9Tb)ԩvzt:eYFۏyѣFTbu>oak\\:>;;wQtjѼiejٙ qltJ ɉIY%|"J|MVSݯཫQTz#GHb1??&7E 69E,НPz&%d6d6(řS({Td6J;]NC4<ޱz=W?W{4%գze6P6J;B}~ljjZїiLR*qqq kBBw~ڵUo߾-zϙў=SZ>&>r]-\$R%]NLΦt ?]tydmm .?^}yGDGG߼yKG_| Ry܅Ĥԥ:v1+pӦy{{7g|, ^vO?~,55ޕ o:x֨Ygo,7v}T1bD1nG#'Vb̲+>icԴtBA@fo|gaaa k׮]HHHv֬YӾ}5ktaU]tvpp+ժ|6~2N,ǘ+Ľ3wW-ܬVV{gOd``ȍ&Oq]k%ŋVVC.ߋ[aU/ ^辅A+C?pI?w =3`='es 5)''m \'8d6ʳ۷o;998pĉvvvǏ=vr̘QQQzzz͚5\pȵ UxXt'=c=.^:p֬9>vv1F{.oPUxYيaǻsZrbiHı5t j GX hժUNN+,}ի<=n5=z:s rACg^v۶mWׯ_ppʕ+V :jժUVVV7E,]t .9`VBB smpuʎ=Æ,+/ϟ?4葽#팉t?}Ɛ‚h6#'j0ei|̴sQMT +שVo;0u7flܲ^Ѝ-߹Xsm}Çgt ܸs洉?ace*ʸծ >egMrfjR)HQ@ig;::ݻw111;w888޵qΝ[l}̙3[9EFn ݻw÷o8vqn=ࡣO>g?:=xa={fgٵdxoۣwYZ%˗ .&ta.c<}j;쁅u[ze«! n.ݵ߮Gn>d6🎳ۯ_[?`˖- ز%r["#mzIKW3_.:thzz[+&&\sƎ]LVݺuNrC6dˑ]lY?k;{;Ygg}=zϞ=vcǏ1nuw9Qw<%;;3/W&ѓG *kdd=--}7BTI4R5{߅''tڱ= Us\\n,a2ZaSvs~}:& `XЬi A=Uk2x3o<22rM9EG7)&&qܸ/Z4:yٓu|̩9s=ܹsc uhϓ˕JeN|j~~QQasDE/Y:,,|7F,\8kYlݲK^G5];rogMu;c4َƏu6qqvƏ5f붺MO?51=[5kָ|_PdffyyRRT*tuuK,mD*jEímVn d=y]td?,sa?đӂWؼy꣥%122իUTɰj?ll\Шo,ga88{6Eoss1c=|mviOO]GZ߿˷f?իWU*յ߮j333V\\<׬ >+l}8;l0}ǪUKg ^>{eC )yGOaB.Bzunܸ!>_JD -]oZ6fXlu>7F Z\,<-OzuO8abXSvϛr͙g#""B֬8hӦaÆGl 755wK4qcSg={8-M 69s/^e֫WgclD EM'Ou^p鶨':)"dY&;e֢Esݽ׆ء: uj %-{u)> ڶ޷oߣG Sa#Eޫ.%?=O޲yDY Ϛx%sݣqs #z.X2cݳ\gi~ԡCۊ [=wpڵk/3#]vmZ9wgƬ!E"nNuAˇ l=}v:ϝ_\`Ozu.t˯Zfeeԩ]/Wˬr'Zw!C55,a3;Nl5e][%|}}7qȱ&M~{;<$:zW 6CC߹3z;cvmn=lGzu+UIS,רUWWWPz-u/Y^܋ߥy}W|Ҁ5:Lвe ;yݺ`_բbŊ"(nRTqԉ"D"^Tj,7WVE[v=} .S=ARSӆۍaֽ?y`pSnjqpYtqi3j}~z^*T(ժS?5%)+3Cߠ/^:q̄qDUV==}uz(:{^**''G&X2|ب!F.[$hr]]nO=y|?/7WOOD]tmJ]woKoS,d:^:""b(aw6:zǶIΓw6|Ν; }!ևL<8S)ʗϟ&sA~RRR7opҰ@qӶo m;qӦ5cL8~,y<]쀥K%%'W6.PkP(4*ѧ{5,6voݠ3qu!Vlڰ1rsk2iǂeӝB6Rx]8 TUSϔĔĿ,x )A1wO ̋.K"ꓗ+Ӕ('';^({n߾=f̘ۢX>petC1hИ햃D:zwmkqv!J/?0yKPТŋ󏳷l 454tkpԩK&Md9ZZ%ժHժU0mfԦ >8rQ6&Ou  ?qm?y˸~k6y8`"#@U MKylz^xi ZTZ1쏹(?熇o Yd5|dȪ@+QkY eUU&>]_]v:%(oÔ6#6oZc?fĉ͛9qҥ lmΟ?;iի(L3w\'Ϛ0j㺈=ЏGڲnOA;fύ { WcضL&T*:#Eb8ʞcSzm=֨c޻guVykճ0]v?mيzr>*)y_⿨eˎNNcZ2wGރ7n,I:9:Tb,L[AZTg!cGϢqϦMb֣Ì*Wի~Jv#ww8w6oѽ{nn.+!uuu$ Q5mڤjʫVg%/]fgg/_ JTqIW^ !kVfϟ;dȠNz8;c׳!kB$„ rիRJצ7G/>SƎ tW^+Z, ;+_ZjBY鑛6T0Ћ˕ Z>pb[" QH$fMPnA6ˏ j__sA~ Ca C/[PŸ2]pl7l@ڵj PN^ #g_q1@ҎTQ=(njd6   ll@f22d6t[ Ҟ*zP3S3|@d6d6((K4hvHthܤ7J. 3bWE"liɧp<d6ʭo۶/OlJMZ]}=;3;5%Mo۶/;q(uISF>FƆ |Ұދqq/ss_$ݿ]6t4+Ѝ8`֏?|*Bf@znu=}ھG]z/[~ſlǂ %s͚enayO"-^JfA߽i~l :s^_/6oݺ4y99{-gt&Ş17gzp%7..ܹ[xoܸ:z )I RKYn^zH >]0@8_eGNqm;6kՑoΦ>Znw7#4!--Lc vvvN usֱc{]]Ν2eRHHhe7n:Bl(CfIx˹~ ҥ˦]57֭xX߮^ru_L||‘CW,e˯}},?!J*vFXSߵo))K^q'-]npw:.5Ka~·mw2m߭g'm";ǿWY.X~lIFK5oY4r@̟^Ѻ  {!x4w3Y?M`oLz4R̩cSJ~PT^G۝Lۛ,J{p?^>}n)92 aN_2B=.nUhE_+HJm+J>]T*edR˄Wo 2T=2JQlc\rlkkk)Uϊ%wݲZd6 G ݬX".]2Olq^y l2Pbud6d6 0o9u"@&v""@&3NBq/@f22TtIDATd6   ll@fA!iIWkr@KOugJł HĂB)(RE0$bA*AT?#Mff+k=-5X$RTJPdvfJ,$ APKNPɕB~ٹ urH0CA*JPl*Bm>H(<|?S8'&IENDB`kildclient-3.0.0/doc/C/images/testtriggers.png0000644000175000017500000003635111715730227016222 00000000000000PNG  IHDRAg.{ L pHYsktIME 2kfy IDATxahW7_&pT/h N@l#nJ\/D&"хVix?EJ^]Cma`6ȆV~ ]pRv `d^_"+H;ڣ9g9#sf,8 CH~0 p(3җ͟c\`s&#"Kpߓ@q I9HbecĘiv#{F ^ g{~0{$1""98c玿'V@Bu^k眅ydmZ/pnY :C 25=VͲjcs{"eCrg2k,5'ysؖS,qlD7Rc2 j`U [s97Ș($I,2Sv IHp'g.V>t$ÂnGSD ffDz %qsD&0, ð44ߎEN說{6VT*϶e*G# R8. >_#fRj\sԭٝ H#D+"ۆ#$)]NŬ'Ң)1iҪEB\QTkOJJŇEW+P̷"I[#DN޴ dhHi)ɪYG)oqnL$Z.%6oĘ1kP).) I4*Us⧒8#Ğqe`SkWo9U&3Zs3ZF[==T'"^{kDӕ'U{cχz4p}uwMH u6]"RB5~Hd֯VIͩ;JXI&@|17-dƟ1O\ϵ,0_!m(d^_7˕v\~50ghX?]MsU"dwգ_m"$ mˋ8q"fy͔"Fʂ$Za'IL;OD4Rڰ"ǔOİV}\"Ĉ(5lH}6!|[[Xw[{DDFDVM'<\`G=]Rɶ=n:=%ٳm*'$:3q6gKq\\U6*$1&"jO!řRu*<>a8ڨ2cs11QMU7qGfMd2ra[q8#W57kzTS)VyG#b(n!' 1ƽׇsOoW,9斌C}?Խّٝ玮1_$ 6DNq]:_"xmu~-=*殻S(D'4~BLS|ץ:gL""ۜCg0juȎEU4Gf7Ĥ8r-iYX)t9>Dש3$q4vb1c3~VTV"IGnKOSS4*?27D4MB=ώ_ʩs)k?Բ7ˏ-ˏ3zĿ<\SIsH!b9#&0gv9W5sndKN4{dkZd~%=Dm2&YIyQThs[9DRnK!-oXtF<*6ښXlrgS=GfE16-r\Vjb&""B }ݖ׫\8 kŋ Q_Jcc߲ZfR8Woo!C=yn d;$1D2$0lgS18%&(V qalmzL*U-Ҏi2yD\kI+-{ Xl4'J 9oÉp|\5k,1U~Ped۶24b-w|ak8DeM*\(U CI+H@\.?⺚ xDd#‰B0YVߕpZǞ; Ɋ@,n#E$ُSk舂2;}.qbĈȓY?@n[&};6/MO^lVkFR޶+H0ZUg({-;/WU{ާs3f_oƷ迃=j|+pOή-wZ8g LEQ+Cbnk5b@cGJTZ?n 4^C݈1 srH5cՍ< G`@#x Js+R5$o_VZ-U"z׋lKt]/=*!1TPSOALR<"N|1E&~nᅢ=jlO`7n ^Z|bUwFQ+gQg:8~ "]VQ uݥC_*cn6kt*m8߀F;6Ykڶʥ?Og+0t|'LS"_}BL^$I26=$ɭ(Q@By}Ƅ~w؀hX5ҽ%hq$궱kojWWɣ|TbO߾`KWc'ƏFt2ukXQ<*bN;vr,'f߀hby4c~  DBlkvһnOh:CP7n{ΰsb4\^f.gUqo,:_h_UYԼe5t8,L_ޫf];w\DdP)rչs;Q]),/ s]2;۝v:^ Wm5ܗppx؎ƺ]{vzO}Dkwң0߀~x e+6ąf-?ͿzS; oI+ @  @ngxAs ow\Io7C~aw |.y\ιj/{N1vIɾ)x.61j~HDb{s\18ish1[fcԺ=d;vs=gc{r\\:眓@L`䑳᝭+hgڸBϖ1溮6jm5;aXs]<oyoߌlsJq%޷9uG!uqHDP3#=֣8ug`-aĈZve?KGSvS²d̓bg?gn/IEG-Qs{}Omde7S89(q6\~W0xyGD/.-bTUuǟHI`'U4djɲlvk廞a-zfy.XXm' a,3QoZ}ϿǗ/Q\[!`2h⋉r,RgSv;C37fb# o2=+INF>sma-ڹ+""Y8sCGEQlc㿗)$xDl/2 ^n<]-6Tx+a0^UpX0xQٶ-2y9wD$ٛl&?EѶ]$vCdž̟L"E15CڣkM/~}gSVĆc=>ĩDZV@wE0]rEڳO9M46_qvlh,q21d/*\+^( Dq^(n4MݝMva.oɈ_.n'䐬jd"G$I$IĝTe=؉؎O'ƚa,I,< "ɒB,f~5WqOU1͕={B2  d2 0igӑÐJ}ޗ i .Zߏ^a @  @2  @2IQ{m[^/YJATҟ*[kco@.|pd^x2/7];۹/|XLl8eY^Mm ҟg==hX;spmԀ K}*=*YO.+HEk׊բv\SJsu%O'mٔ2$$ݺ۬*w+9u;y&mEmckm͍c'O'5M޸m LePjmEM{adʕr|4 *q-7߭_}󶵹u7YZUX4V{4,YдFO aD\sy\^/\^V7훷ϝ?!w'WZ-M^^6꿒ôeZ׮6$+lxr2Tr vn-{-;/WU{-23H +3Φ ,Cw.2qGx:km/am[K?;V[a6$m[l?~*8o[[mޝ 8~ZG `_>ÔJl8|yYO-.wa$IƆg$Ir?$eYUػ$/["/;8RG?z3mmRH"gD`a<=8O}=s5 +;kq,yT\-GU(78]<>_zD-,G#w&F wȣ7nX4VxP "bch$O'h\v][|4^|T$ +X4{;>vr,'f ALr?GcڎKlrFQ{^.uQQ{KͻBET5Lau]q]UePRm>wȉбKlVNQ׮ݘ5A}45=(DW;-a;v,kt^{:~/PG%i0f0Q۬E5:v?=Fx0d2 a0d v?7YܭX>+jo |IDATwÚaVJNΦ,ZkXbñWV6wߘ|b8 }7_!fd7w8V|XCLJE{۱5dSEk׊բv\SJʕr|4 *q-7,>z~4mk7"*AET#z;Z\EMۦhzbQu(8'n֘V=jSݨƆc[uu7u6ȭE$T8)ìU\Ό'-JMe.gzyLZQ-Os S,\ʴVkfiԺgJ6>76re+Ν?7smŚfjd{w,_a6 ,GDT|TdJDT\-G=ƧɕVK&ôeZ׮v nƹTUUiV^/!nD(Ju*2?Őo_aGV=Zi$V͊cLR<"N|1z EQFU~]X),_%$#z^^:JƻO*Q[˕V#M׌ /eT 3#JV*pLKs`^0R{Rk}Y_8b'2< 5"ߡMlǞv&YV=R[ \[9;~v|HnT`4S|8^Z+ܭOeˉKhأ3?$l]r6ePQeHjS1V*;ΰH\ؚy<,h|$Iu$US8穏S|ၰw߲$/[Lkۙ1$jreI^1{|WQ{Mۯ3<n)0;dR>ҟ.w˕rRfT#FKȣh|hh$O'hmn;9_ȓGgcXAX~ئ]JG/ņc[9#Parw>{f,yT\-kJEdR0=5,}c/ſ.*toy˛>wȉб{N_^ǚu]o-~۫ʠr7&R6[HqFps̰gڏ8O w/M7t%QT%w37uɶ5=Kp@  @2  /,Yd~7!kpX +1v_B< =d a0@ a @ a @  @  @2  @2  d2  d2 0d2 0d2 a0d2 a0d a0d a0@ a0@ a @ a @  @vWVa01dp(3 Kpp`-a0d a0@sվ|O޴o@=NQ_٭ڧ kW*g`|?Yk_ Myk<p2liʠRX)[K:2(J|$^^/wsX4f=QUɌEcPqePюk:zWn;vLRTgc5;B5Q ǒtnl?[w*7S[K)=͖(>zs@xmݣZ;yMӴZaZԎos~oa[wӟUUEcJs1X8fFR}:w̵kꛩ =*gt8Z|T$"cV"j1>ֆ S,\d.g MM+\Ό'-JMl+{%FuSNZ0dd0mxr굫Fu<9,ED$}m{YZ+5o9Νgnk3kFݞo+䙤؜4$lp`XCŵ66*+~)(JըʒP䙤xDbB?LQ[= +KdDKRgSOx`x 75M+Őr7G hqZdfEHE)WJX!4]36 Q1H ۱#JPjUܺFR?Ő͖֒fۓ$FUpAw>t]W nֹq.$N&Jk%il^U<6nҟώ3V:>=\t[JV.r"z`;vfSޕ;L28LDJQ!aґ(۬5)G"C/o^[- :V?m!to(naY 8fU֥/;")C{Ka{!QsN.K;};DT,K}  q%Ir?$󕴳@޴.w悕a>-RRx~WlooRH"oF`_/ X4VxP "b'1i޿Fn?h4>܁ӣh|y7)\~7YɱB<>ۭygɣjqX@U(78Qjة]c]+xGg{ >/̌ƋQaм]hf|_f^Us5vg|$8s{gsENDm-K&F=*^.uQQ{K;) =:k45=E|8,L_nJ6s9JfnAU=h{i.n_p_"=x˵ӁK 0x% d2 0lg6 O~aVKQI5%N%1q= +d a0@ a @ a @  @ p;-9N , 28Va2  d2 ȰEcfJAQJٌEc;SQ>7ڛ.J>hEo~Epm{:i^x *}M{NN*JTªYx2,q*Q|XlX\-jhՖ-}jklxt0{-m{:۹n߼͙+SiN.~}o_LКaKGk[4e88a?f 4TQg˰=%"Q1>'"ED.wȉَ_~->,@cJJfh;۶8>[In.=*ϧs7sb쉝~X4!J륹sD;0r؜8ۈL‰8LDJdIPV.yz8XoCT7&m:6iVغ>OmvzZ.;ζt?ϖfCg.gYxs2Ҏk/DKDlI='I[wŐrW:q*~Qq8vrRZ|T$ +C]`3k-h^8˲vo xC2,>g5o_nk-ſ.*to_YQ]M*8w}WA]NJ6s9Jfn~B_0}iRST굫jm1 fl;;vq|d.g n/Wpм׊بddW1(p؎ P%N&Jk%ilxD8cjQ.npqog&.L6ki084O8@XKd2 0d2 v$WM4 ZWupz a0@ a8*uK]$2 ppK^[Ds9~F/(p1&2MeHwy<G$?Ɛa8c̟i%1"u9'#g+Cj_/1Ƙ\uFwln ld_w]<?ԓ2؟ry+dN3ph2u]qzFI:i ]{qiޔ ?WtjT]ݪQ@tLFy,vP6׶sZi„(pRr7r1*FˍYâ*.?\07 ܜpc`9g~kM8w^w| r仕RŠeZ[[8-?Xn9?/8ƙk3 񑸱a4葈([f=0úm{y<]v+Mxܱi e?fe!6,Ћ`_G㭇$~j躮$IF]qOQ &W=,7fۻQ0CaQݫjJ&?N޵*bq-W=i4 liY6u&/>,[ݨfͦΦڎ;+ɣյX4oLIHEޘrŢ1IVH~kooƇYɭ؅ ){%ԙSs7r*jXm}?WW]0Z"_acB_Km뇝dYPb{:<9;|0oc!9ecxD<]z?L`~hr 0C`ؐID(2ƶ+!(Ddlʲa@T"%wE}c$C՚d1\9q's98bXdbgi_Tt3WC(=F9w3iZD;C_NFHN~]wzAN29$8I$Ipxfc1۱DZA1 weId 07@$ {׸C&d1_ #/a0d a0x D/bT::UGE doi0jFӔ4 8\uXIENDB`kildclient-3.0.0/doc/C/images/pref_proxy.png0000644000175000017500000006203311715730227015665 00000000000000PNG  IHDRNT sRGBbKGD pHYsktIME   TtEXtCommentCreated with GIMPW IDATxw|?w  D  #5kYJ@AT4*!O#` HݽٽM>+N3r.Ej & AAo2`椿QP! -  hLdHD$燼HJLDZZf3d'.Cpq."8sq39Qqo;Ú^9YaO09s $Je7ON(K`X3Q'+|V+Ӫe2n[(m;ʩgA]Kq:y'a\!Kl8qy"G{`?+z5 yNNN(Z('HxRSS%tt *9jwUĘF#(:-N+%a #R#CbQY"8Q>y;OD٩Xd59em63Wk*ZNٱK;C: i}c\WY_98:N`6e갴Yҙ )f˳e#iZm2͐t`+Y>X:N)5Acok:!0KS3v!܃^a)8*"Uu!FlfU="(Im̶2ͨ#(UÔuN C&U9߫ uXIPbR4pgΜ*Td$4iuPZ8{cBIǪVk'bȑJPլTêmUQ ˓E!8pPtZ2cUR L}kkנ2:~RE0gj! ZckguRJjU, JylZ,f蠳m0jBM)ԎQ4&c=3 (eQ=RWg߈EBB_ ᡯRָ"HPĝ֡6~>1r'\\\pya0}! Ә~멠"C3(݃tt`T,|V'e!UeFΌQ&!Sv#KAi)kq̸ ,!ePkXZTQdZ_bPu-mp_iw$QxkX˛Z2Y1җZqX#~VYUCp`eg',ymSpќSGuTCeފ-iVcZʻrLTݠMѮsgMZVMٙS& az 03+qML&ܼq'OS,SNh|?͛C&js(C\Z)Tv?[)pqH@qJұ,P21u(0!yZs39UZ (˟th?#AWC2&I^hNK*DB @rmAˊ*#N0|G1eެ"^0WJ+ ҪOYG%M& 4eV4)Wk8A8& "ȟ??&3AAĝ;wl6(ݻlOeE;H(_ Si/^vV‰W8dBll,lb~4j}:Ty)S_}`Ne(80>xyߐ8 be)G&ܭUY>E5Z/ u$=jg6~[9U!F28cUfUN}(8Aj~\,ς$}dz2>5f>[3٨ ̊jtMRXyl=^:Al嫤Pr OxY$M5vAO|;e>)]fOR~[俙uUIٲB'H뢤ˢTISi+E%R Yl /F|ZsSf `HQYgg-3Ϟ=|"%9))d$%%"_|ţG O=gq^Jˏ]{Hӧo^_\r_L[nˎy&&MW\ȗ|~xbIII___ъiӦaʕ’%KЬiSx+~ݴ^Ti|3ڹ qy=hd 0M5/#~(^̙3q?/ysqRpY|l촤#:3AGppI 0͚7mcX|.^ʕ+  {U,X0QQQG@@{}jZ\gΜsΉ4h07o.>Y3qI#Oցg71ݖp]~+I-B`_FلT˯-9Q(H/2Y~VuKNgUjAEwd!P4S܂ٌԔxy{#a3+M& OF'Oܹs0lpTV]7[TT+aHxy{#"bFR]۶┠U0]#S0h@TX b)h׮`[{aO[R0pT3cfC%1m +ZVƬ31f'Xn= p}zB1y(ѪUk1Rؾx{{ci6l(MaÆ"::Cx-VC(Q]:cb2FN} 5;q]:޶C8,Upp)1]nnuF8Jժ ڵe_r\ҥqWWWjիa(X YQ6_XK@1[^ Tma`mZIH]"FkC<*QyͥZ 5sk\FȝʟZj aǩLv% qH#a%*@v u-E-q&5J;ŠD'$H.},j{TDT2SʊEi"0gLK! %SʂNV9j٪ .DǏx+ -Z`0U7Ug -],^1__ 칱38~ .!Æ9@0s<.&idL::N\z...-z-Xј~jrb[b3[eZR%KIK'||ĴsX8ΡgXh3 :׮ Bgd`i45*!A13" o 7`UJ&2d(GDD ,%p}:u 7nUWdq*TH5lӧ7Lӧlٲw-ZN :t!b V\sÆXj58À +W<-VeB3cBs'r5_,D9O`T^uPQG(Zq6Q͜rR 잯â?rR|XajAjR,1#X": bFQyt5]v-%n=:@MLLg4/z]L4'O`4:}f0Iy}иyK <,{Dy݂h[IF,1`@"EоK͋~cˆS\>: ɓ'0xqgNnQ|yf *{ǯ^Ƒ{zpvv)OԹڍs:QS @Jjj,\ ӧOjUaa/PVJ*a5X`uJe Oe t7hYɤ{OY XҝȕVwmifFa~9eɊRsZ=%KP#'v@2J gT(Tb$EG%zꬬ[Ç(.\X}E?15Ba…pqqaVP}I)?58i:3`cj:lGK>MaʑwEfmӔuogSR)f HJ VQ>N >NŇIfsSv|D_ ԊtO*^L6qlr] H|CDl8)}|LS6}~/`NVo-1=x-0'=ğIHKf8>Gm+re^gMWH {bIK<^FU$>gfA'/ޛyisW21k~m_&>NN幋I!ǢXѢܼ֒q ll5 jBB??BgLeZ@^OHÇtݿPajz.S9r痉&psɰ0ըU 6oE޽ҥ8U۽G!8Nu1=G6:Q%a-; X]~"Fho &NҰL8M髜H)W,fB5ǑVJt>\wr`dŬ5:,%:N|+د q:C+GcM^C)nU%Nۊ3<ݺzt!Sz:.^|~/XP濔{!X.|ىt陌*L˩{ʾ_ڤ,EWy||`2p1"L{R"K8fQ]XK"޷ c͚5ի֯^ IDAT['ggѡX9z{jerJC8%| (cuDٱZ` Q*RGp\FRdi9#uX?G}t',3sFet4f:҂JT[rd[[MȦYtZStOcZ4EcOyѳw*CpA+Yx̶Uǂem75|Y]I:GXmE"ҁQnCpss7sq?t )))01ߥ0(??pMA,%JrժDJrr!'6?ǣW0cZUW.agIƒ%KUh0k͓[z5~Yz(cmuFa4Řڈ]l򂠒V8pxx-K VP7N)kI鱂ٖUPB$(qHMKERbbo6XMx Ұl7CJJ2ꕫ iN{z٘T?Juv7Us΅638әVr;rAi[uH1NZϙJfַB*YMdauѲ8AyzZ2+2ݟkq|$An2M ԦqUQNC7_EUU@ڞiL+ k]DvrTf9Wx a0RRb['绖`3alpdKU,ߡ$l#ԔT$3}prrqrhx{;о,qNR[ޢTۮK;c֪dV|ՔD./gvj'^-+Qkێ0eyg,Dz.ꠑ%0M&3l8} r}yָ 7KO]8/RWed2!11 HLBvSuv &Ya}J9Y7VV F ts b1QByJ']k ,XVb(2霸k۶!ͷE 8xNC q ֕1kql%I, Ux;Jⷎ~233L7g|=\9YM܂tjf֭iNNl}ϸ8l̶$9ն㱥"*ⰕWR<^UXهYu|B- Vk7'C&Qt0WFS;N6eu^i|3dggf'T8ZۊH}+,-GÚmu Ht_ GqkI8κJMPCzmAvQ3re`+m*ڊ.̀e~yfeHtIfآR\5*HW*[?gLqoI 9N:ȒX}x^Zlmus[ yI ֭(lY8^ Ks ,YV]I{+f̬~mbjE<~vq8N i4nLk\s 'OEaOppvvBʕޠ J x[ԩH3\Oz~ {O+<|}^:B@tsIٌy&9ӾLDī#v7ĞH8 D=j8+trgBϰ[sINjg)l/QRSS5r;̝cFQ%PySߠ ' צ<ϋ#E1c@O lV F#\]]P|9|6~,-ek'8ew8prr` X:w R3fDFjP|t ׯ3Dܴy+:t슖]/996D|g}ڽ5h `uة;B5CGΝӬhѢEe:st?O<мe;i [n{ɛKyhզ#֮p-|5uv+m=j u5]Q>)ˊuThѨ.YEhԤ%>PܺzqC;gp<ݻ{Xf:t 6Czдy97n7͈żs 8vfϜX|q>D<&Mao_LUֈBkXj ֬^ɨU"n[дiD̒+غy=&|6V9 sCa 8iU˰{g$׫ O֝fgBa6cm߁ewiYsPλKǎ5ӥ׎2Ҵe=~\<B:'9b6o* 7oaH1L;r7|RG,d8 .$%'[D:o?pJ}{vm>|"+_@퍸G6ATaaѼe[Mk@Ti@Ŋ!׌gϯh٢8j{C!e?ϟxo Ml(/(ܽ{/_Kg~stNBUpqQ_'z . Y:ŋ9̌zZdjzM5q&+~/ .-8v}է?>xjC=*+Z,eY{{yyD琕zQx1UWMOGchݪ8C:AO]cM͂]<ݻuҥ1c*~Z=D$_ý{c"h"23i ~''mm۾km@n]PzUk^ sxT4g2eAbEѾcL]O~Al:Mn\Xuzf9S!kޠͪV}&.]Ʊ'pTЬiV6U,AڵXgٵ */'ZwF[`8~OB= AI-v9ȅpqva{ )~:J.%6Z^^^‹)G@t|y% Y9GJŐ;J^ڶoFWÊ3͓cD\#тqƍ,xZ׮~ml+bPҪVz.9YJECq ɓ'~u/%Kd mW\E?Wԩc{,[Æ~7`Hc!bT"bWdX'@ GfMI= Aؿ8+:wP8ϝi2z!ZJxzI{k) Sg oެ D׫^}h4ah}7ZvVx.h% IɨT&JV< fΚgX"ӧ&;hr.;bɏ1x*T(/|;z y`Uu6Px1tZȱ7?,X߿/ΝRhӺ%/Y{YKk#~Cv)08:vl_qc֣|f3ǞKNҵKg_;T\ |20o шɓ&d:=y3h ء:vh'~/T .$Z x/"1:Oz*g91^"^2qQ3̓'O |{ظ~wsxY]!_R)%%s~'''>DCࡺA/W w ggg/<}BJߐGrmP2+I|t4>`0eA) ĉ0bLOOO4iܐ:z,P& 狣iyQjTFAρ ╁  t"Z!  ">"AAN׶AJrֶ#(Q.!"yٶ" ^bqYնAr9uh H x-9tp '   '  NAA$  H8AAp" x PD\! ">"AANH8AAp"  DAA‰  AA '  7˒w'''_8 AA/┖g‚KIAAIɵ+1=}C>jzRAA1…zǓ'O8r>:oDzz:_>#Gʖ A^al݆5?Çqxo@)jժ8zqjR! NA!(Y,*Wyfw\]} &1ÂE]t'ХsGX 3b,Kb *?Pf ` *  9ocѯoo>pssE"EcnjƎ$ 198ܺu<ėS&I&? ɄOf^AA_]…  /׀2&$9N~޽{11QJe@QpMl޼?FppIG  &Eҥ3"f!! f̘(_x̃Pz5oC\\^w? kAApRb$s\&6l >9k<}}zx_$$>(_Ν;ժˋJAA_O>Ebb"E  9FjԁztΝ:PAAIK1P&A MAAp"  DAA‰  AA '  7ڎ D2 K q$@A‰x.\z2x8tpeA/54UGAI2  ">"A}4F ' D! Ap"  H8AAp" xIzJS Ť/DRRK{~}%q aA`^+ӵ+1ߥ?ۯ;QXQLrK>Jㆍ#/A൝ynnnԩvMO: "f~MAAopd4InX:w f̈*jl*ֽ_=f6oŹiVt-[^rr2jmi.TsC~FԨU+8>^vGuPJML2&zYnx3gO? H8Nv8{Ӳ'MFϞ=D%F^a|d={ڵ v Q3]6k[E&1},O>EMPzm:Y9˷/t;к\ B/PHMM&f)%Ջo\&޽wa=}9vnPpHxSnOn<BC!|А/GCC{Y!mӦ89]PP!8pF쑒իע}kWbtKs! @)T.ʗ//D*5QL4k{OM@5QV]^Vvp4h{PLB\; j7r  QV]T\cƎٌQZ--_ݺ7TaA!Ai@~tDmOMqM8zx?NF?_$;&:9%QyzYu0>d*33>dHԯ_ǏSGѾ]|6 1|_q8qlZ7wJt:ΝkWbpA4iCN~ڍm7`5ذn OOOLhk7-_t:Q'IF9kX+1Ae&1 Ʀ[Ьykt j(pqq}yVY\ ;#oo,i%RSSX|흥Xlۺ=úпӨ_.Qp!?VvpV IIwww ];"unqcQx1xxxx_>}F ۸i \ѩc{;w> Bkʕ2>s0 ,Y<p XMv`}/Z900!!eyK$wmw (Jx;Kq8t0n .h=2e2JtϘ!~ٱ ]thܸpv#ۍˋ G\#߿[AII uCf3.''' ؀;ntK1d+>%oď?.ǀPnȟɎ1Lbk^n];JJHNN{yyÇ?pz;ѽ[Lj2-#?pv# ,b ~}𿏇aL&ܺuOAu[#!11IIIXp1+yG>q\C %%111bhYxb$&&"66_Mpݪu^V\teӁ ڍm7/!66IIذq *U u˖gϐ["7o^p-ܿ Ai8 u5B UPZUC֐=}4Aq*4f͚0V-xо]ØL%}?+VÈQc0P`@ČCԩ-[w@˖3֠k{73cnԨUA!*:ᴌv#w h֬ lM? bT5 ouOk7h`kEtzLpBCC Szr"+Q _HJhr>7DZuzZR=&N/!CG۹qJ =&aQb!00Gljch4dqDG_#0{tmw`O?h|;w6 i民_=ӧ}6l8/_sw ;wm`ُq:J'Hf|tAwrTߵ«VgΊǮ].7E>jU-_t:Q'IF9Ͷc_q8qlZ/1A8N X\ IIwww ];"%4n ggg`@ؼe,&NE6itں=úпdq~9eJx3 r$+ƎSO: U&(8D+W*z//O|2j娾kWRg,)55;wogOAUpڸi \ѩc{;w^툊: c^Ѫ8Ց*_a{ХKGƍׯ@dq E]*p8{:|n z+Pl]1Tpa ^eZ[ꖣ^jy=`Y:/ڵ/;v[8},}/= 9Q^C=m8ojjjxY~@8O?yГÏ;s&f;nbAU9wcḋ>$I/~]x޴%%%׷o\2eZL+kWIm֭[~[f{nThɤs??屹H]]}/o\ޤ}95 ^yegONˆ RWW~ps9wzlݻwܹ! ,̗/]}ߋ MkVk{k{C&NI$gNM Ód3rmw6uuѣNNɆ |\GSq7vݨ#򕿻" tB :!^{}Wd?_f2Ђ-q5[N:@ ' pNGKlCq:'fL8' p8bq[FN[NNfH8' pN' @;"7 PlcfH8' >ȚrY]Vtt[:3Nm$pN @8'pN @8'ΕmE7u}d v誢9'-iT}8pN @8' N @8'  @8'  @8' p@8' pN' pN' pN  pN  pN @8 pN @8'pN @8'pN @8'pN @8'pN @8' N @8' :ݽùsfU@8P(Q@8Q`epN @8'pN @8#;}sf!8‹dwN[w@+4dȝV@GbpN @pX>a7{~{bhvBN8@;VAλ5N |[=y߶Va֬YaÆ$IiAb|}vyqsG-93s/IMM[AUTT^gfMx 'hzŗ2_O{0߸:իVwNj /o^}]=**S?~SΓO?s?sV;|ʫj3^ PmAʰSUUf¸1yd)wſ'ge{TrO/{̠^:ݺvڵkrʼʲL;&zlx}YhIƎ>%/B֭[ ZUח/oqߛ7oΏqyԱ9ߠL:̛75^qLhrU_5!f<ѧ|2˗kצ>+VfȧƜ_~1j~PZُ=/颷X,/_5kʯ}5GyD#? /M~C K8-0rؐ1˗gyJ&qZ:#]TfSt˩MϞ=SVVx05w3-I3SR(W]i?ݍWkvN?9yLhz_f}^{՜1洌>yD^^Rjkk=R֩sP.|n <}{si{ƍrM_y|矯ˀA'c䬳?%K~߼џGaefѢ;{7|?Dg7:^ @2r)r>g}RYYڲ,]4555ڵksԇrym4%ɂϦ~-n+++ˡ[o#;gf5jD_rYE 'd˛OիWŬ/KYYY%`3(<2,=z쓊IMmMtNy`|avMIR[[ݻcrޤsRUUʊLFy{nR.IҥK|/Mm~da)//OΝ3ss?yOƫ(m;AY:ټys8UHCCC*tM\^Yfmz./Rw=w*Cg))dۗ,}7h}tpwp=Į^%vs|qYli6nܔ;MM~456e6$ɩ:>y5ϙ5 vRk;)ӧޗ.ܹ6cǎIeԳ SNxĩ:hv%n<`a/,[ Jiii^ 0m]ݙ _{L^}uٖhRB4̜57U]sYvMVZ'Mx:}E_,\lb?ʗ.4_vi_7a;R[[ѣy)w6IWRV3'SeÆ M?9;yp=P[fPy`Z~3M]tIJJ2_ &eS2SQQ-nڜ0h@y`Z~޲B ?^vE?6&yrG>9o9)--FCӿܼ_f)Yxa[Nb{tRWWnݺK~\pgҿ1I͚i3~͆ MduYn}{~т̝33Vc$ȁٳ--3(hVTʾbb_}4+VL1;YsүOt.bkcbB 1~ƫ5 ک8]W+W~3ҹ:0׬MMiڼ9B!G92 9OȲW'B>{քl j5NN%|HϞ=SWW/^8)stJRVVҲtzם2'>r!矾[Duj'h2R(oK:MMMijڜMXƦ4555+)-IYiiG OiiiJKKSRR|nO/{F@Ph-*;TS[i{k #vJߎwpvdOXݞYFfh7ܓqN }QWW'MybqE'"27qI's"⦥;AL,?툈QOcDDIuV<"u=~~z"359&t^bx2hHDC|9t"&`?[DL "Z8scuN #c]9i^s1d/Ѕ(Hrhd "\\甫R$FÃrF`Dm;οԉRb5Mj +a$Iu6rbD -!-LY3a*'ev]>8Ͽ(ZBig6HbI+7LƉ$uJ.OV^1'+R^ R̨T v.I.L^L9$PsH`TKʼn4]6Hek;5ꉸ[a]& DDtasNck&əʿ^L*xќˈr/g]B?lirC %*Uy:[Q^56g2~m~ 6"a"eɒTSislR_׈s {[z~<8}CZgH_M0~7$QsmUW`Eb^?aV:&'ȯ[17yYo;7L7]aDn3*Bݼl1MmJi7eME1|J 1kְCJ>̦|""DsfO0=^n>SZVʚVeіc47TW5y6FYg54Cf^+SUM"v撽r\˾tlſH?OC'G2OinO G n*Yz87/ihy7SZXѵ%}=/7Izh6aGvi1?>2ʰ"b NX#Hd8 *kR)k2 v^ c޷UĉH9DDzk&OX#əyMd09aJ㗈.h߷){k&^jz=*'HDtZ$bg4 ]sDd:Pd2 BM`fC" %qyr=M7= t[{b9IdVl?nL"VVÓv[ {\'y@ba=Md`g|dym'Q-r`;T N&q$Vt˚tDVlbgo v.s#۹K. ֜ҹ. hmh^\'!J<3o] f}|ćl;t&v%}`Zꗝgk1MPWd&ٗ@H6] k`FNDGlne+s{NIX#F.*IzW)&"VSRrDJַg_J+J"1&PEL3E(2;#"&{E5̲Y4"b$lz\Ud=l"038@\`$Sۮq \89s=/k @sg.2Ι"Glo7 /5F-뗇%'gĒ$F7Vf-m3D41 )H}ʓK1^HDT\HH0{VgO\a4"29kNd9DD'q?2L+b C-*\!)LӻR_?k5{5W~TsK7DEL z_/ʾ !%}֋&i`1G=BνyXjLq>(Qn(Ij/Zl'&}x5"z\zZ~y?T,o9Hc>r^x.{-9N-sO>`5s2 P䅟뷛 5?ki(0(zk@!<-k{ԏĩaI-+Pb 9`!}&qx@." D[ Q}L9T3N&W C0KGY/J7I:${?Ddn7+TQ1"dO_~)(*geId11ϯkQ&9ۺr$Sj K1&>?13 LiWj>r{&'2$niXPd$?oȅg\fo2/Pd""EUҚ8 #Fz^eW "wK|,#z%<#DN`@OzĈ#^3Pd"|O [`Ax;>7)sX ޾"zV3\ed|De 6G?Pv)]^Cҷ c%0zF۹*(rW$.M'&6N^:?Q^[M\J8W+B>ͭ&kE]dykkʿ>G] ʊscH,ƫąiâ#"cёqR&($Pd$Ecs^Jb-KOΔC]i bUþ`8ü%>OnIʥ_k E S'Rߧ?JSptZLJ]Ec[Adlq[7gΞ G I^I$&Էss7gj8ZW~ ϸ0G1Xzہ5@Gt"IG.s9xQOw\W`A!o= |թ[ƒើP!=F@]~đ PdPd""#wwb?y%~ft (;L|,0<V7P= wđ vW""e"JoRs#{ZBgE`G|ͤ=Zyw5K06BjpN*s?gP>|/u'<{i@".+}QMN"*XSh:>0q~lW+,>JB4|˳J uabDL\MNJ&O֯RO3qg#6t"J^OCj?ɷ(rW\0!2kf)P(2Y\:L0uH.g(\Sܣё ,Y1 q -Cjn9צ)KJEOEr6>NHȰu4zsW,eQhjGj󫾮J|/p_xؑ%I*O\M?Q|, O|6q_hWɤ{?-~/RHd6I*=\]}|ں=$9gL|k}?GVW׊dRBhs萚3O+>+N©hWܼZy` ~PdPdx/W%<gPO7x#όxG7xle PdPd""@ 8Ng7Oόm@mc=W 7Pc=wđ v<@1D}>{Q/j;-|{G9KQ>ƿpip< -+S.>JWg'h6GY%_[j!$h7$<ި.Fh޺,݈rH4sJe/Ԗryonݾ@71NJ"y}"Ea_gvyI]ޛޫi}ʊ$Ia{h?.zƤH9Jo?_t ܅(3">/Unw vzTKהBAJ?J8o\tFyVOk뱱Zv]|/u'<溺Z$$AWi,8Zȏ~:lrjR"q5i\Xzɺ,&G?מWwk%ͭ&ux쏮{\~lޮw7Xއw۴DTb!wJ[\qZme((.?#CCd-Ӣ=Z,eBEF"KY{5-2,f7\S=DH`bwh $PT$amlT ٥&DƢ#k(MCDF"ri2Kxl>!vo=}ꐺRuhWq =g]dݘ+"uYq*av45RŧCiEEI`:kgD:FD&&;pb}pܲ=ݰnt@u!doccrj_:<7zOw˶UO~)r-5gO]JRo.L[׽$ڤÃ&NK}G"q%I2\0sIOm4>ba dZBhNkݦ=C>RdV&iSa7fBsU< :E??c} uX]]+I S_zL{/:m;~H;/J, {Ƭ9%$Wr_۹3ܧ-)oݜ9{n248:_dX C&$Rߦk7fo}=co(-M'볤;-a>׹{ngOW~m.\msRb\p0<{oba2y%[9nlg\f-Z>ҷ]:Sc7I%p_sG?.$'3?V|]ףGDl4y% !U2Gn<;){rG"t"ȫ|Xl~H&OE7&S>)r!=(2w/ڐ4u?g߆v~LI[}6q)@kC_Rvj\C6Nx|}Fx0&onGE{t= qd+@ PdPd"3K}2>۬嗕di D]a_)EN}==J=OoFyVO뱱Z]#};lC@[cRn:~ ?ɬ/NMz9X4Z^{?O\MKVr:{n#"bq)?W*DUR͟.e* ==zئlT ٥ HVyxᙽYqR,QEI`aD$2 4 "wuO\zˊ|'y$2*L$E38$0lm"}z/4W`jv9K&->ȄOj5MPԅ dRf)hY3K/_~6x~LJ^IM}nz52,+{ rtJMkx8k"*<2+8o^$ڿ1FǑ{oNwoE|թ[ƒើP!=F@]~đ PdPd""$2ڧMvG BL+DTyY4/gE"uͨr3YQ6Y#ml˴/ں]u9Եb[g{bkET#Ps֞GWd}]#rᗼ^9iU]ݭY4[$o^D4qw.gSff'&SVWw)"J^I$nȚ["ÑƟ#"7:ȭHpCu!6z:̎ Wr37fDƈh"/IRq!|">reLDLcԼX]wޣXwG?Pv)]^Cҷ Njt=6V+(K} $|De oN^ 7mh$JDpeV#}BJk@bxd!v?.7c_=5kENZٳa`PWfju58>Y?<RlʹoV;u'<vlP7⃌J:?.{rӪqMڛ{[kȨmx ݷW{˗Y֥CRZшzSV72Wg.-Y^{>i^\ͯf&7fW J7ΞH8Zȏ~:Z˕4Z^{?O\(Jz_$ S'kK ꐚ,eeա$HDCjv9KDc,#gG[ҹsG aIuH-'fl;jݵ"':ߨE3oul2v:V*^85y~]m:6zX?޴ۭڥk%mvd| ,vOnyZ55n)v+jeWѦЮ{}{^EO9q &IDAT ƑP[ʍ^Zd2E!"#ťXx´aёHiqqH%O}#Gة V"#dG#Xw\]ꐺ:!Wԡ(J}#rvY|ҫ"O_$} X6%}}.tIZѦS {vh-}]٥LtX%"G{޾tlw/_h@f)[^QTbЌݓ[|ָe] ު]u]͑`X㭝#ѫ.+.!Airgd_tvr^5]O}*>-7;}vu $I-LfUwgeU %ɥcqytwV?{c& 6!0 GwA$?~3z|; C>+sP\tMZQZi u5![޾lѷܽ]cn|zrV5)v+oem;nu{}-Sʕ[Y-`W5\snpNÕAVW׊dRBhg#ދDA2)U]gة@8C͸5|rX)Jvʹ0éR{cEv9ti谚OI_uiF_5kE)⃌9ƍ:5SOu5갚]ΒI27}7Frn>It:[rָڭ ʮ}Ӂt{ݗ`8568'/7KrT;{sC^^խ8k>o$$Wr_۹3gT r]ԽEon:ye3gM֖RdR+Vaι$Juh 8.uRK\X9 kr526 \+hO>ID߿}]b6%]1{ko{7୛3nJscu=kSvoVwme׾{:F=wÞlcxn%(Pv9;UϹp-~DTxeVz5΍>kkں== ;?.$'3?#Oiiv.FW`W\c락&Jk"z:ˮ.bR/uB'W O.xs= nm/YwH\o?tg[[cG-z+@ PdPd""EE(27KXry&l ;#sn^wF# >![1Alܯfp=-sc_uAu]#rY"J^,-+׈Ъ:*j۠r%ȔrTZ%"E lod,JoqdGfxkl9Y;®GRwRaY[|6 u$*+}`(㼝xI1NvBQdrɷkcqytwMJOjqIʥFwgew?jQՈs\-晇1I*$smܿRTl` !>]EG" YauuH&.DN谚OI_ϡ!jaT9yDM+dMnmi_HC"mf(ߺ9sܤk:Iv1M5dI^IubVǔ7/%ΞO t؋x5q;qS)>Dn(s9x#5QZ+ހA&<[윏#^ PdPd""EEEߜ{δS PyYj ?5G(2(2@C LiP(O§C`(qPW̅/v3_zydüS[`R}c"ԥD7)`1L"dGN*(k| |}iJ$?U">ʦ<>lsM""&XOE1c"c]Z,ƿg:cLvk݄"1ԝ=]*ZG`e*w?Eƈs֭+1s9' A$s"9IR\grQ^-eD1)eSdYh]iFc_ B2"#jSu9ĉ$YwFyNīa(Z`e]W|n$d1"Jdrf >P#v]d%!H埬 nV?r ah+.~%"㕦1敤ZRZ+Z(;$ J&+)G.#VZ+/s-ơu6drZHT8Da9s"M.f'Hi쏐xBp L#}RU5~'yCpu{Ex+ M֘qεW$I r\߉DD% D[+(}cd )27,&۩okr"s̮3V|dNOT\&OV߶8c2(2ad7xNH7PLM&9797q :Vc{ozGW554 M׉Wr2&'>"z^z޼y`mx ]r "Lnl[XL*G9{mZ$2 ʙ@bQ `;%`HҗשR-]vn_4l; IVļȃju۳^ڶdY.~BBFE6siO8O{86\R<:J};*ٶ,}JR?CG]:\5?0dRq>ܜ}$tug aH :jt)CDI}c|+]pJGF|z>S&]5,n4.Zr+E k˳G\o1O;WԨ3S6Qz_}%o3MkZyTtTb}]ZS丨i~)W[DjH L9$&~ZصaP8wG-6Dܺ ^x`r<`Uެ2u*>W1bl`H1gbLݙ/kS=buKk"Kl"&$oɋÑ_/ >|,+pWM[Ba@x0Pߧ!5p<]dT'M#b`oxx`\ם{v=9y+`ރTY`kU]kt~3KWgd0_S秶sʚUºxVs-Vɩ76|JE?H1})1u~"Z0q6sˁ{RᓽS]$ $}U*Է$$yXh)cz{ݽڣ"{l#@q\Is!+Ra] ^t3tZ$$r&$UG NZ۸M\Jp|=7}1O?9QNqO7B{RRL.뵔ŅV MVess7KӕJEOo }S]X-pE`hҚ6 rLݹO.&_H4M[PzQbE ֊t]C{a+aX?u9 m9n'j+ʹDžr!|XW5b'+=+&.%Ȥ_Ja.W IL`ۉZlrM5-3W<-?s+;{ ӈDf;MՒ$y$I\n˱􄈵!}[oXr\5Zq{\=5ŵy/%k`]A/&\I^-&8b;70 ]Wd0ҲuʒWrlpۜaM.-$Y?^ԡpcMjgB92ltXZ[%X2avZԟiTvZrKё񅻙VWrE+Bn)ZؙtX$ΉRpw曙^8uqj4&q;gY8\ D-pxb=-Zr0fTO.GnI |}ҽ=K\M}3zMZOTJR+_&ד}>_RbcdᗂrX|rCvă[ZXoSLN$?9*QdDm0K˿ [>r&<>fr+" ':)ܘ(Wa5q=ݤ (M21f .D-%A-V6 ewo{yuZu937f377Y!D-0-&&T"52ҋVqJɫIן!O#iQs8L`Ac a^*֬md+Mv&=osUʙ9~ζ цqasyw;41 CBD%&^v1W.U$J $&J0JT"8'b9IJ&'˵uzLi djMf >VI2{DBij,'HrzxL*ܤWX5dQy-.-z ]9ޱSW:es3Wm^md ' r蕝DtHd;rU Dcǎӧ?3{x@!,'+֧^+8w>OaBK^qP|jYCnƖ#\f'`(xFN1:2*2\2$axr&==}8矟D#<x;du# ٿ'߈SL&=G)O}644ǃ%?N< YTTq}ɱ=ǚ=E[?sU˧ddR#K{a]FDBM#K0БOX{IA0va%bY"?1%)q7cbF)dw'9Vk'cx< ڀzIq¹OU522[j x:]4߿uF?w>rY'Ox7ÐeUD$aH$u_,p('$1~WKy,1zʔN/Wy;ᐽ=P(d2$5Y-dv'RȥlӁTx;ͯU1<m+͉H8-7=&"N}>Lh2 H%8d[TB3u$%<:OrkeRT"a2D! z:9gbTYޜFML.vXק!- lݾ_}!wUxl%r""-SZ#0ZڃqFJ$zy(9;A;QZ^њU. [JD FOHl{Zy'+\q#Ϛı<VjGᶸpY1RcP<U&w"?pFhkT),H-d62l@f2 lhY39lfQd^ a;<ș-&kאg  d6QzzB`&++랭al@fF`Ϛ5+55?>hsm6Z-,'%%}K666&Ljx^^^ "==z˗׏|}}J-[}یF؂iӦ-\PX^hQBBBuuutt%K:W^h4aaakvĉDU} &X mfGzGrEF~TaFA<,t28//+WuT*yۦjeYL&2_ì\}qgvdGsQ*XZZ*˅eT*V\S5.))Y~ӧqO?ii"JOOWR y7LV:e@磢ۇ ;:k,!kȅ5dڼyítr˚!!!֭=l\Vo۶-,,h4T񒴄3g>|w)))V:e𲲲ŋc2c`04,wss̴(4jL\ePay޼y +Gw)2l@famE g‹b ">| ).,޽wsaC|߰OS9z̸#_dV ɧo.YO?MIbӧ%mgbߖ?yؤlh˽z=!,W&k׮Q=D4~ܳƏ#}3VÇ g!W_~];cf( g|弭ް&gg*, -))%!CѵkVv?,vpph/~+ngd|M pW}g_?4܈w'.^8{%i'8)S&i++,]p컙*==]Pr\T#F[tT*===lBD{.,,$ž={b7'ў?C'gΊhXgsa vrtzh"rsSamf<-\6l.,,,11QEFFv /oZ4!ɓ'߿⋉'b7mVk׽0;rĈ^а<=zԜ!S I:VCDlޑCѯ0МyE͆vO>ĢIrrrxxxYYŋ‘#GL&d6 nKV/i4ϟ?F N:5`ݻcÞm.(SL ys> d62@f2 9@fzd ہFoHn ի EzzX2bĈSsavWj40]u7|'|<{H!lx،z6jh .]jkk;cƌ~]~<{`3[R5,֭98858&|f}ð{|> eⅳf]mY:uxaCwy78y߇0,7{oWZo߮V\^WWb T*q*m+v~˗ %aaaݺuӧX-((k׮yP7s/ϟ?MjxUyTTg9<͛}dK{2=zhfa7ZmGgw;ٮ鍅1NFG )C}jDf֡>b{it`my `C`g^t.]<~B6&>#+YTƍYOEiچ-q۱ۓ'ߎ{ouB/:1x`_M쳩5<۠v28xXY7nޝ3RT !-//S#>ܾ622(%Y_O\^_ ,|cqԜ8;/~UXm){? YtƜ97=lk ]3)$G~16l-ʛU_}eHLo~OF֖0;}2_~sgXDqdЉk׮Wݼ%U AnܸgV'۱.'@'ss/l?`MmPSQMDG9~)S&ޚZ^t{w>ͩkǎu bSFO+=k2/3NP(&WVV5+Jrذ9I}}{e2q<-81@T8? IDATo~Ciq+=SpKkSn[Əgggӣnj5V[믿 (&9roǺ/3 gƊb;! ^,8;;? g/^8[9#vСFtc0R[yķG7:ropA%M c?N}>Lpť]{믿yr@^pG}uu-]lkJ;fCU*W.}3 Æ70ގ{+~ջuJ1x6E~5هsz o-Fqp˲_d>=zP(ɲ}ac3ߎ_dfM*8-/2h𠁙Y?pqMڋ;>>?ܔd0?0~\<13c>O7 7l۷og&%%z5_- _ ]o}6Q//3n>M3܋ވ_Go[|P3C_eL;v8c[ʺF=(c3G9n6`@:%|t7߈4eG'df\BPh䨱=wo۱Ngτ~)Ѹ0vIQ/w||vG96Zd$_?aGyzvst6?#ډ#9"_[M:yDfmXՇyM)*<׽g~@xgqq>xoao ]dJ|mMnⅳuGs}:? \Ľ<"3c:tA!C+4 G U=~6_?wn 2 -φ{9W7_APvVa{]vDw8x!~  rq]zi4{ gС]18Xl̦1**VR^:--M(/,,߿JO51 |~OIMMuqq1bDqq1:OjWR(Baiiѣ׮]9@x%$$٭]vӦM«IIIqqqJ2,,,55բ 2-Z|yTZRR"/Z(**j߾} ,+wĉ=}~ȑ#f7zsԩ=,]vƌ_|۫j(ddd̙3vҥ8JZc~ U*뉨jÆ /3gբr"֭988矚ZEIqq `>5͛77IFFƜ9slmm.]h8{{{Zm4QFeeedmgtcǎJ5qŅ:wheJeQj<<עyⲟ_/`ݺfϞRnݺqFc<ںu++` l@f  ld6 Vm* 4,)0M}al%h3 |~KKKGvZ666&LmgzzB>>>8D}:w| z+88ҥKΝ^hѢ%K43,,,11QEFFd:uŃ322̙ckktR{ݻ\.WջwnQrrrp2ιZe녥raTz}hڠ SNdvKСprzJ2 <zaffUi4yv={Jrppغuƍ`}?mݺg2Md62@fG۷og&%%E,ab}ڵkʔ)vj}MmmmNNκu벳,^yyyJs˖-BazzB>>>BaEEE``̈́ Gk7U}222t2lذEDDVUUaaa:....22R(\hQBBBuuutt%K@f߆I&ɓҚviӦ) pԨQYYY999EEEB޽{{-jݻ@f7N;pܹsy8YRRl2ZݫW/0%%Eyxx:uJ(,-- Hׯ[ n̡C2dHVVV5yڷoXj׬Y$T* th2@f7׮]̙DTPPn:{Ν2LR d2m޼yVj `0?~\V%SNo C=zѣXT*RSS„X;;knڴJMF6P(.^h^bcc#\ &~-[\ ͛',i4n233-  y6 d62@f2݆ 0֭0` ۜ*++W^}ȑ#D;l0| Qhhhhh 5}덿<0t?WfُvquMbf𨞏t~{io9Ո)c|~(tު/zabʚ荿FVX)ǟ;ww%DN-3<33sƌr|̙RHD?cQFeee dv L,///wtt$"GGGcF ///~cJJV 8u@f"JUWWGDnnnV hoƒ%7oj׬Y٭( `&iΝ'NR(xO:ui"޹sL&ST /U@fw}w{gP .\HDIIIqqqJ2,,,55 <8%;v<|ūMO`@f2l@f2 lhhvʲXc=[ohfj 2ۚ>}tbIvv7lxrdv;wnrr-[^~弼<___Req|~OIDO;vlII+**mll&LjtB!}||rssq2s=wر "ə>}zDDDlllUUU|||LLXs'N0oT… x 5.Z(!!:::zɒ%BaXXXbbNlK bƌ)))D}iӦڞ={vڴiJ2<<\sԩS̛7U3..f̘1kܻwo޽rZ޽{P8jԨ"1nDttLDs%e˖^ztuuhTΝ; (//hRZZ*Jׯ_ SRRZmPPǩSp2=zprr y>**j߾}6U#"NױcG&*`0|PsNLRp2qSL֭=zѣMܰaׯ_b & vvvk׮ݴiPT*RSSq"k" ̿-.[hW!6qss̴E}̳ d6 @f26`'v[n20w߿Ifv~~_UUEDW^2g8&"??#GQnnaN \. Rv-TTTL0A6<___Req]WR(V:,..;vR?~ NIa1bDvv6egg1aDN).Z(**j߾} ,K,Y"""bcccbbWj4԰0+L>FV7oZt6?#J#9"_Oϟ5kӧ G D(IHH9sÇ{Ժ/^l}Tv͞={̘1۶m +k5hO} 2 ld6  d6 wn 4upa&/+h뙽k׮)Sڵ fvmmmNNκu벳Rэ7ygg礤$gϞEEEDTTTԻwo"U*[lǫWR(BaaaaU*ݻ@ &hڦV CFF_.] !.Zh̙'OJ&M"تëWj4boQQQ[`XP]]dɒV CZZ'ONKK|ڴi666beffgٳgMT*+**jhJ92k,aND{ݻ\.WJ8=[N;p@jjܹsQؔ:88Q.]GÇ'ן>}:??߼OJe WWWR\.,KRbgߔ9tPwC >𨪪rTP(rJDBD< z[_SeeE a&I(lRdMv튎3gpɓSRRzʕ+W-[&|0ND!!!֭ǏS( h4&i¬ `0?~\V%SNo Ê+ӭ[>}N8v=zѣZ*>>>$$$11Q(IHH[vMFW Ж1Ijh3;";s(2uڵs{-*<תkڂT97xޥ2 ld6  d6 d62@f2 l@f  ld6  d6 @f2l@f2 l@f  ld6 d62@f2l@f2 ld6  d6{D&%AEŲEW]{GEAқTMQDbEEZG|, ON23M]I!..O_p\a|q[x<nWk7~)~:}Q wޭk#dCCCǨvaaq>%f'v}%b EQE6x:'ٙ 9uŹj|D?xV[QQVQY^]]Ig<4??ѿ¢hi/.+%~˅ViQ쟿xUSS؎K 糡#dv(J +=vtiǎњB={-y%[O#DL3detW(Nt:NƌYGQ?= v'ED3Jt4v rXGtNͧ Ѡ3aH_rm4mB@ (,*/''+..bZf/_r$,͹l6G8a{==\DK8:Z>_^^kh(qq@@Q c `0??|-Mk^nMXxEQJK\ݼ"ƒgLW.z݀j[BJJJ_9a%W:ee}eR7o ·nINLN6gpp| G{U[|CVo IK6uKr23OeloL٫w2E4R]Z o2K) qay뤤d33Ν:5sÆURR:׳gih ju?ђ-N-{IW%(BhD 4!Gl~ٵk+|əSΟEKky.;myBA| !6jiN۳7cf%)*Kb{`_a7nN:d48rwok=sr5gchbegRT.+`qqNA]]T`,NY"]Ҙ98,>OQTaQѤ9c _HPUUe04Bc2i3{_w% _/7˻8mΝ;nq"|;UU1܆:67t"&++>y\\Akuu(x-jkk';&))IQrOe9Y9ҷͷpXc26r+Õmq@׮UVV)tx ,NPWBfC{I4++/gױ)Jw@jJNVFL\AX,yyy1ќ㺺E/,^t4iSէ:h8'B' 8i.u%uZQTSN@ S_UUsN=eYQiǟ9;s#Gs&O- \NN]'wUeFsv: _╗gdݝGvQbJ^rm\3e?{޷jG:Mp}6S s=ӧ46AQQQGOUeҬ7o63ԯ_pW4ʼn5x ]oIiaMu]UeMUemeeMeEuUeMeeuyyUYieiIEIIEyYEWS %S=w9j|ޅN+S<\Rv눜'<=\e&Lm稜 0gu'.Xhquuu;>S_YǶ::p_~HΝ)߼:uJmM5m"ILQ_{&.!dJX?OkRRR̩BxXD:';wn>~KZ/GSE_x<?z\i&aAݍGw칉aߡkW] M~oJ]YYig_W~4ǪgϞWWה\;cM>rԄI[xiªj׸\ I<_ &7w*啵N+V:U8z7P?n3I u떂Çyz뜝]8tpYyE]]V]򊊜'_~M_et"ࡒ262/W\x񢴴 ,… 'Nȸk7@ ˻XZV8n}ܽ"S[{޵|7n뇈TVVu5CSS{0?~]Ag ]-kjz"FgTPYUQ=@f|?/Z(>>~̘1cƌ;vlLL̸qntrSN\C8Dž?4y,*~ #{𡕕UvvӧO:eddtIᣩYZZԠA-n?<Gڞ8~cibFxy 56ۗU^Ծ i<_=|keF>Ͳ_nat2F(u۶^69z+,И}WW݇R ̘q9|> e?{k̶={lݺU[[;**JGGg˖-:::[D-Y+)888,ŋ &!6.:-͍LKN=؟dA{پ}vB3Yߗbe픘eG||dڞ >>L7X/=~E=h'Q*UW߿huO JL̴K\4O&ujq6DNsD~6.]ZZڿ֎IQVCGbb֮ uwu * Z?jl϶444ܷo8`nnq`~ ݩ/qsҎl=s/_vST$ jߵ_OX TTTM߿?31!*+뀑i8\gwsX9zֹٜ>}z?5YP۽{Gn\aZ BӧOnjpo8 ;w2000^iB*:ؗ劋ﴯz;;$7Yhc +_֯O+o-cñqhm۶iiiٓ6{씔ٳ5SSRfkj5Kbv:$jj7B8c )|xO?R;::o4yzDɓ۷[{},ٿ/E{Igo44 4uW%S>KczV1N !7IYGr&oi>q[o[gŤe[觤̞={ڵȕ&8vntҽ{ZYL%%%[oiGz#GO4ԃ>#)qظ7n8bPXBM=B6 >CD[l듚QQQI)~_PTTL)HMɩ{mO|%2?g>=wԹs祦Ν7/55e޼y))#FnA{,%KTWWr͗\0@Յ5; i63Yz=sJ}蠹twGNL>+2oY.3ڞͮm}=wJ{B\>nh//)SN۱sEpm;i3{Dcc㬬1cƬq[0dYZ;lll̶p0Z6zh.ǎ;R/_:urބjq=x`B|Z?oo#}j5c徾K/..vY钰?lyDj*Ϡ~N]F?ؼ>Uzvب( sӈ{]499JfPVPII!D]]sY9֣G*t#yS0jv] ]+駟tEZg?sj"GO7~6i"c9C>3-y}TTz>zɒ~[nĈߞ>}dIySֿ?2}t&ե(φf&^Lh%-eds8r_X^%cOձFz=45gYv֬vv3}}7FDmrwN< Yҝ/"sN?ToQQ!'NxmRRRHHÇ>lhhx!c3 ;ke[#?|I?ОͮmBddd^g0l6%݉r亾zDLLᰤ? Y,VѻEi\~ߦ7Nw(.}" Wa?;20/jf=i) Fky}{8 2}}pQXTj{^t]#>OIIINeiiniio_C9{yĹv] 'gk7%oOXiZWW}NM8al+|hK'))-2]"R2W[Hu k3妖!w:9^tImO{*)uzoC? X,d$ %h4EQk}7m^ew8{=5nL<ONN$|rI lRqq199[**(vt;8~55vJ3G;yWϝ>p cIdxȄ >YU7oޤ(;-njkkW=cbBwD:9y&&9IjgTT[C/^/^>sn,b?UXXRsElmadVXAkӀx c#vZH25 ؚdalll./xpy~BoU>GQQy}"ϞwWcI$%% yzI] ̷̈́NLFѤZ6i-GW3g П(+w߿=a~6~vRRRl ڕ4)1a4u?_̃AILnMٮ_ GH>bعK>ݻA4pݦM{vXp>vlϮؕN^+Vz{o[y:77m1Ǎuo:Ehsf? !d/^;GJgX[+,Qm;lw',es6y9X Z疶7=d{|B:-Q+ xn ZmA/-+ƍYf_OΝ9c*!DFFfgbJJjTBƌyׯ(+w7W=6H&%%p]#Ö.֏JsZ* 6HJJXZ`QWeh]]M׮_j;֏b !$&NL+˝=ibျմwOrD.)y?} -ػ`-QKN8d3-Z_,M=EnUzuҹ/L:ԣ$X[D_]YWD/R=w8+[RFF_F_3snjÆMܻ7~"@33ۣ uHΝi4Zð EQTQaB F=L7Ƶjqnweӳ[vGZjl&,^Oc,u^`bjyzI ;t 0$hX]u0II iiV[dz^J)#pMJe7S>}|+mt*~A?k?;j֤{tt8>=}ҥ/^?cwwjnTWU|hjjwOڼ e]p1#cϒ%/\d_ g-]p$$E; &yBsd怀X[[P;;@GG _Ϟ=0@刉IRW)**X鑶koT鞴,Zkgmc&vΖ1͏dxӤ_m<9:՛w1Lf簿̆^.!!1vkRb"u.0%:BGoytTM3_[[3ydwwwǕΑf [ wŘؘxznX98xՅ mmu농#!rupYb~SZCⷭph޲i!>#=\/_O+o^s\.M rw[qTWњMYsLf**Ԝ=SQzhiRR=GkV_B444\wU%YY>aÆ A oee:ru5f-ڰK_zɒW._0U [!S`srK)hhh:u126Y6wìv%'Ϙ>k%%%%؀̆vo rQ5UF5QQQ갰BL&*Et$Pްo'\`СLMgΜ+ +VX74ԫ(_6mgO %nօ*6m`UIZ*-)&!!.gn޼o/ý}޾-{ϟ$PvM5>&JByLB- lNqŢ&V-׻z9sﳀ-:c2h1{n.o^quurvv%&%߻w #jaEƻ>1۶;:ih`2?m\w=Q _!Cǎ_}c¤izćixrּ#ǜ8yCrOÌL̫E`۬2ml6wƹ:?~䤉lcc,…6/w Gftخvv6S|-oriSD/{O+..+7)**>~,+"71$YJ:uqc?~=Ӗ7tA#UW/޸yn&ܳgrώ9B/!dC~XQy2SxV;hO^^eb<(8\.GV g={|s[ӦN:eg|>?=}bem6 ^ >~)WIq_俾yN? p񏆆  0'HHHx{y644|ÿJ`9W>|L8LmbNݏ|aC|ׇYڵezYVWTh}%.,m++Sݜ\.]үo߰6Xk.=vⴱSgNh!޽-ziQAѝ>v qcTU?o}7V/mBHL֝4#|f~?y- 9u֦=ib/6`EQ_{U5!IwJ@+~pwo{Fn0. !o&TZi~6@[!X7ߚskqI鄽m_>{2E JK)wŅ?zl6۟m<b:sΠ7Of!YC+=hp:~!u7'|62:Zlw d69{E@f :" Iφۡ8_Ơ  d6 d62@f2mXC| _&S$ϖa ! : _@*m0脢"|"CfWŽ5C%j܉ٵF|S8$O@JtCfNF1]mBiS|PM3G5^fh4ҼRʚCqIENDB`kildclient-3.0.0/doc/C/images/we_statusbar.png0000644000175000017500000010743311715730227016177 00000000000000PNG  IHDR0 pHYsktIME ,o5H IDATxohY7fGnPæhbe<`4D"XtC2 {7nA񅌜VF < "tyX  6bcMq/JeYe'!rU?*tΩ*~F6$|>Lĉȶ1@3ˬH ~"6s*/sn_IHȈE/RqD;zEF{$Aa).sU-S ocbڈX90-"U's"&ɢվR'RK8kMt%chfft]O~%U"nӾhDF(R2L:ާo S 5߄e@D0'AVNIlu0f+˻J&HrMLN_)z"Hrpmٺ-ѲwG)L.&2ȝy>^DMNe7A M`Dߘ"?4M]4U@˭Iu࿓C|5Mz&FZ2M"?q37$oҏ?F(_d5CDD\ &&pFM"qʞ\֥rg&phK%<% I/t{])<_=LnHXM5T`v'*%!NLk5Qa4DtԪTnQ&sҖwO- im^vX0Ej$1 i˜Ǚ[$JN{ݜi[2^TwgIE&'"$i"DHu^ I&K%"✺975 }|OSIn7 9߳/7iTN*nk/ yu*i/hDv2"Q,DɟV59~.Z"6"t0w;e}+#&}^(rw;#"u[zrPQDg>-SxF/_s6ia\f 3rmP%$^~jonof3^dnߘj-`C`)w,>,/h:&'Ә_6<45}ޕT$2[1n/S*Ӿ.޳פmk?Sc$2۳\*yA#"ۉLjgDQW;#v"$]c.K }bEȈ 7asޖz-/_[iJ+V{%kFi*|0ZAVCU 1_K<%M/Y=%2/ˏ٨N%9zT݇lI%U%ڙ??CFD_(~2߇D5I_w,VT+ĉ<."d%8[$"#=!=,t헱Z–5RWa"bކ6LfyUKD>."J/ kql@ JխՌ NdT JFeLH+FUo`md_]n`Jr$P| N dD>+w۸\^crUw")0ƨD K.w;$S땂&rD>2Liy5ܒXDd+[Z0kySUfC*r;'Ȉ V32rtÄJ;ŭC+c7v&Tn/+Փ_Kvjf4r@ t[RDFHNΓzL"Y le {s2ɚ<,|`KX=fuچjl DoQGu{MV[MR'94HU3S}V[jUU$.roR\V2;Mى=-kT tn[TĹXTwDn{V/fl9Fz}Vܤ1(s(,Ec,zG 0TIظ1<.FDRI:QmCk+6CƲx9UDqمu93<;_!'+(7rlY|2&PMV2>ަк-t UxT2٘RY+X38@#7EѫzjR18թ:g|O*[ eF#"ʦ"sztPn+QhpSd/H׍.Dkkj34+.==>;azD"*,EHp [6tg-f!alHEdr^Gjw\T=烈Hd2.zBd2Lkh1&0b,s}bqIo9]6ؚ|XJ>,URiꔘլ٬[u"+7Id_}jR:w:`RFMP[{c(Dǰ [auVVV(S[4|WqeC(I-Ne'R>`.x6 eo N+HΨK%k {-[ >RWNZʽ+T2z]`d]Lv1(_Z!c,2"Jd E!;s"xzxwz@$)nUVuyɤ.H&:I`vj~$K] FT~{?DU3@7cF$(v5=1;<?q._U1|,?]S\/qshp"vә L{+|tM[",NdIk=`vCv_ŵ#K q#X@+! @>{΅qɩszADWb8^к\2پ>u>@픭f{mpޭ#u;N8.1P9w'?NOI? 8T<ǧykY!ߐ~]׭6-e\: l۩{N}EDnO&IRN3|±+cep|:tD(fsY" ~/x4%"?7v.`96F!bV+Xׂng%ЗصXB>SZ;"Peކ%u;UvqJElST8C38n1tp8X?*wZ?}_ dRFmϖ{~.^oz`Oi鰋?9 Y.x`8q螾5 -L~ Jc=Naa)ʄSZ  C%Y={MBIrrIw z>`NqAǤݲ+zretS:Й=ݳwT5vq|4%v=&9ĿIĮ{|~>~mB_#T5ME|4ϰYk7D?U~~!"s>l6[u/vld[7&hcEX$"CWXE4|y-ˆ"t# >lk27"x,@Dtz&MDO9֬hc~2עk!u;ekl]rU&n$ٽ^}I'0鶵$IJ|Vvʝcj!O c# E"ё?il< ~¡@lQf`N&M\^?_ꜻ+Z µ_? FGFtg- >nTINmWlf/Z`ݷ{(As<4;);ObeL=ǎ#pp:SRD1"Gɤd ?Ao7~}#50&1w:ܑ8HN%+HHF.Flm@uh"˲iOϥc$',ˇAd=mtc.1~cWbywji%bQS 8kꐋU h1Kv1iƞ]߳{{cǶ`0 ]=78| > s=S7jVN0nf5yNSSS6-u;UY>V;u6@ǮƪmzJ4SA&H6||8}']1}'ȝˬ#3);x7?$_Z@jf#3s‘'\"689:Q1u JFΎ ^1VBgVYVΙ c,s/c-[2sgASGUfcsͬ}z k( {C52۽dGYDH|7-ЧkƘ:9J;F^3@3ޙ }""#wA?=3m# znRjql,ς?4yMº[e)PQV7vo\?=v>+PCI'{V/6@gFQܬ25++ְ$w*CkZYpNL?Ϋyn=,u]|> Irӝ9qFGo_YXV |k|ͤ'o&O"G.Fu[F(6YS,e~W沜̽}3,.v\1#"Ƙ[eee8##Y]33;iobdv.P(sb--> |2ty4e5znk=;3-.DG̑{4j$~HffGOgacYVN (r苐l¬E č%o&ɤZCxҧL}b7\j虑lj:z%Z"N@g֢ŹqVKfgz_$,u{QAt]wD$\[fZԭvǮNz_h( BՂA"s!,!yg9}7#ǚ6v%d۳9eے?$+|>]׭qe@᜿ >}kG{*͆(D{VWV!Ӛ`px8oK)[ImIl<,ؠVvuj nԭٓAyx4j_ҭZ= ͗>Vyõ"k,>)Jc2VYq6Pc0 ݕ+8gl6==ӆOWVݕ+JCgee"gee[ϻp J&t=]"e@YX,I[)߆u*J~Lwֵak6[߰{)ԽjB68Qy2ZJZ (ɩ$4q-KjWg[x{zmhԘ'2C{"#\ֺۧbRΠHRT:ԙ:IXwkb$uB:yX%7.b=SҡԭdbqUPkFgnj I(ҠVGr^ȫƬ~XV:ɫSG{]646D=w -vkl֗c.1~cWbl_+>W]rC-q#ֳhC_emAh^|@| *RCn$iwl8>v)CR){?>2sM^>9?$xk%7'}'=||w/JofM}ED)[f:ܕg""&oʑ#'Wp[EQD86r%z)<e[mv{Tbm|ߩs0ιt@*Z""lxa0#~16/c^oVx-Z[mtχ|PV5e}IƘTgإVk%M89dtqA̞>%u;U1}'v/s"\lk6jp7sxaL^T\>ΎŮƦnNq#gF""&ߠ/y3I&fRA_M[PgVs|UxG5:˼3F. pq9d$䜈qNزs&7#H@j8s0/av"&tjM\hүuqAkFc1f'/JjE뭙ZsNDdsey.]opIwBι\2jfԭ N־ȻR̝ap2kouAM207ԭ^~ L_ eN3z>%rL9_ a9 9 IDAT)w&/uhr)brn\&'!O\3[\*\șx>up~>%:ŪTEL_R˂!hgb/ObDHF:|!>yZ2z߉Z(s/c$CA,=ǿI1"E.E*;0NRs> Γ7#_#gӷ*J[ ʯ }6k"Upk˺֒:kEQrQ!p,u^?ID]IO:ܕ+ϻewu yUSz~דIIdRN;Ϻ0 u]{#q}B>$Ǯ%#i 1"69; =R>T,|.h`cLN߉B>NϤ ta.z)k}G}k=գ_ no={I{4.fWM>? I]5VP%o'hn' q!\bxHPY^[\r英 jbpI߁6hV?6}>=3z!e.0"(xܯ|޴W3c+̽twK>(Qǻhd{ěIވ+[$1eeףku"+yl+$K pM[#;o7^iADܥq.?ʧL~ɏW #Vחj/=yd\.z{ErJ\OjTcFd&VM'_>n:.f힏uW2L QVJPf >!n7VbW#cYOߙVUu[9_^0^4v37&ȣ%JChf/sQ%RXbTЧʅZPYDD#/@ыQ\ɰj?Ŀǿ ҧeCކ>]iH/_ {!IrϞjtnu:G$r.:g{킱:@ˈbj&OQpne;=&x_)L 5|x(陔V,IƲ>{'UQ$皷Wq=;B9ԭO3l.CDɗx(n'+32y%$SVw#x2M$9!*J<9E 9uF26y5/cjF'a b1Ƭ `wvL Ƙ=FDSԲ |@+ E/E=foc{ bZzƣiEM2^'}} 5>Gz|p賠C)7%"k&ܘ_'nwXeL FOt{?$'KbQ>(}ݞnQEӾ ־\y{zGzJJ%k)B% ɘt:E0oUE`.`/`ÄSxfp- f{-E9>ƙ@:3cl6[˸t@RS {vo^TXf.?NN*+ss_K`\x+++`ٵ|D.Fccg\F/EcOC%୴k=(n\psg@Yrj6a)/:%?$V'G.E xdY;tl|& 8-ҁκgOMڳ'o8#ǔ>zv{mAloЅ.xjPY@̝8v6L&ſI8@t2Jb-g%"#dn&l.[S|>;NPx@]T+[ggݾROU|K;y{SA:#u;eRS[if"xss ]/ms}z*Y,ΕgKإh⇩ՉƹU:=)??>|heS&Gƣ3hp8cu) #CD )}C8;}rOa@ux5r:.3#Ou&"ߠwGDӷwVD<>U,.dV6E΅G"e6&Lߙu_=;ZO!̝4ҕpv9mqBha£gQRսl^_XwDtHH|~d? &NTG35[ UokҐlWqNL:3$ֶ6tl$%IlvK (DPeFbh>?ODޞc_O2 +K̉Hl7f}{}cHؿF {"⌚a! 7#_#s k#'Wٵ֥𨠩Zz"|>{S'ˆG6i iUU^߀BD۩y@2hjy)hO#5C]R>;FDRT4q5V3t":u M}\ဏrm^E9b?7v.t'n$XSٙt|?蛺/-]r|.+uI4.y>`!Vyʀrw >vǮ ?Tmj[#^I޾~ȝ %x w4$[SMW^1 cf"_DėyAs<4;EcpP(h5" ~xZwmDlzclhyک@)yRdma- 7dRj&5YhBp8Ưf[ I_ǂ'q@maRvjϵS26ukLftJ9l;%9eے?$M>8eY>$ͶbgÞ㇯kM}w7|fMx s>`yw|Z|4 >@>||̨$I6[~6bZdP;=[ےt6Ρ6?\0_*"#MYaw{«ӊE߉@p8-.nO'o7Zxט^Y HϤG2DQĿy=շ=^QzbPਏ&'ĒSA]A!ʏbXTi n<ԙVlOtj0f%n$ٽ^+6UPYH6[vRPt:_1@3{O|3srI׭`iut&n$~4^XZ"\&\Rp8>q-ӁJA'5M?rrM'Cp0ri-T3^j\6v)2e!Fmgc.1~cWbM7*̽/}r0I*cl/c/ kf+j6M{:\|ˇdMӪY*DQ^)I2+>/J>A\uujK{u-¿^?ࣸTd3+pYKeYǺzhie; uHg|h5r5L:pOD[IVQcJ}I!Dͤu.މRYI _ݲq{zs^[O}E̦Vrm;E*\Ẃ {ݶ(Z3! 7F~͜M}=++tlqmMjwY7Ӗ^de ػGPdO|94dm si2)u;yho(!8VAB77dRWؖ7陴|>9;=RKLLJem ( 2)y+;ϐIwLhjh@IN%ɤkQU+fgtl[֞i1kSj|6-r>2}sq>,۝\:6^N?wJfMNjegWxzb$|fthtjV:ԙ^l \J:_Fb$uB:yJ߀nHa-:W!vw>paW/!T*+NhM8]Nsio7z%S2FMfE |l!~=cX,*}J$km xa^x-~C>@|=VtN*ol; VViϴ@tUu OJ(2XyIsn_iUUՃ)e]~2^YY2.lm픵2u;ekl]r"?u&+|"Xfv 4-(_wUUEurk+/Wσ2v97t>Usl~&KZSK:ɝwoIHkRм$@*N%Y*,&N6jvf6x2^!r1Y^*tf.=YīVw97yB6Ֆ4ι̵b&7?gO^=~Oi~gw6KTdFDWDQYc }2DDY<8vsP(R#=$"nr}-ir$0Рѩӣ]qy·^.*&]1y}RTpe.M+@SUr==ҁN{N{NSr`'_%ΛphW*dP;'zуt3q#9٘;2b>ܝZNIT+[RU^\6UJNq#"ucč6Mԭ9E'~Qe.KbT %wyb4ɐ$8\ϊoO:=Y*k`Jt<)[O]jꓱ#gG"م|@tCFφΌh J>% ee!\6EI<JbԴt@4u0y#'?Nu2gprn|gfeG$o@es숝fRU2A ݸ\&{?)𙰝11^m{w}$1%R{VSzp7Ll,/T~ .Z^QIRme= \{][t:7nuEM&;\uzqwvD$:J|i$Y l65um:\Ddwɿ_BUW==Z|I\6t:3syJTG> U$1#/?k&3Dڢ(Zwozmrpދԭ$6 |v_kC .e\33}+5(/:KlRSG'ņ}tjV:ԙ^4Y|J{Gr^H{'._SG+!.ݕpnlcSG{]uGLj> l֤c.1~cWbl_+>W]r/j=/?W rL"`gQ$}@7=hI:wҒ>t`^, :KҊdٝ.CvIN;dRoK/O(:="`v0.pؗ~C>w|l+kn<|lC%ha w0>lrwQЌJrofCynlm6[pW9\"zAD(fs5sÚ\[1VGG686r%z)l6°^gZ$I2+>/J+g /nMjWcc26~o~":8l}d7 T/{>6HTV:\[,mm6|Y,794|!әǵkLι%e33\V_87SW^i+NMۭ]) Ukg`W%WEQuQ+ŒVj{]2)CBTJp9R S@2/嘒8*,=k44=y£y:%w7dRtbԴt@'ꮌ_mW'^\lqwkHOU.#ƘCt`'_%ΛphGD*wҒ)ɝ|ekVJvwJ|^N;ysZOU"R:mTuK1=v6*dP;'UwW޾&˪!ÔpӝdܞuuXWč爷rDd,ʿ̛<ua X};y3U[VZ1̥vIljr tėrhRTS=;=.5IFφΌh VO#CD{ohcAuSmVzB0 JMb4ɐ$8l^ ;3dYZ|.^Xաlkl>{BU5K ><Ѩ{ V :UB~~~eխURܯ.=)h&=>.әpΣWJ`%2n#0yyN|ܓd>%{𙰝11^&IݡA ,x_ }>e|䔾MYFI ߀4}>kZL3eU lhWcm]8;`k]t,@A꯰e úHe >3y[\zh@!6>Md1hϞ)o(5Ct։5EsW*%U0g D$u`g*t=vu"h?̗t}>?vj=v[񄝱-'RT&6SV&*Go<{%];]+acX[\{Zu)h&=>3mu] |@V.IbVwV\ccf86{''(n%'h೵Y˺ r΃~n'ĺ=۪RmVzc(Z3 Iipdge*#>ў5Yúǰ.W:[Ƨ`˚ʹ@DȤ\.9ء/iEh)p֭^Ydԭ ǪǛ!Y^S76ݫjSLLJe68ZogePk2,,Ȥ䭔hnv7PSI2i6FZ)J~L7:Mפ60vwt=s/}U^|N%5~m!cNN^Y6y5vʄ$w:=Z.ݕpnlcSG{]=WI5EuSmVzcыԬt3u+X~?5ɱ}HެuzO[߀ KQ݅q#xDGx%RD huZ8O`"EPr ;rzhP V6Q.R ҆ Ġ -+փN/DQGfihfZ733&;V5ƒym4-Ul4M\;>qjd{2{{uD{{la)o"bPTMuݡ/}:*#ZĽ"z:Z ڿݫ۩ Zk.\4MS*eEq8]~ݥ9[ Zw``հ(}vTU'=^߿W{p |o7 NY[I͖0 6m@x9f|dorGqau𸠿dzmGxӈ(O#om{ȻBui@ж6ZMXHj|Qj4~5fȧhi9v!6qj:1Ixks(L8V^>2=m3'xGv"V3/CGB|:9^CJϧCGKPݞ#v 5fNngҶ ?,jv*"= U~?kYV=U'.//l6MěEQ.ӵ_[4ESN |զkՔŇ%1 ˲F>=WvwwOW!6~mCU˲deYb*ĿOGQcMH|d8\ټ:>NLSu%^9&U,*f𸰰IO/,d̕e_6v 浏,bSon Yd9yc皌Ù.>.u\'&F ~޼cLx83{s͜xSʖ%KR;UUQbU2.EDGM NLe dG^"[CKSm?51uqҵn6'~}Ia¯y=a:EĪXJRTZ\ؕVCܝԱccǖW>g^vKc`eKqAsKEEQT{bwHE-,kw4ݭnc01W4q3{#R l.g 5$n\NM >֛.tP^5#E4:)Z/|ub4CGv}诿Us'q#~R>+rѡ(֪ukjSRfZ^d+ǎM O ?fsG|c''OэO~#淚`㆚.j=7y毱ңGbc#B~̩cK"Ñhݎ~]O{e9cbFeV>*Z崬ryZo|SޛOg/F~6}ĄCQBR[ܻ ]|EߘW  Fo㆚.j틗Oyu] ͯ/= b@ҡ!K`HoșEOGBaFpx@[šŢl٭ZO-b/3r9Y{gqnh]"R{*䥩o܃\4KӥZm 抩n{KͲi6}1M ס<#.qNg*"y~@/<)4MR>U[xRTñ;G(.= ٧~ivmY$r4bYVHۿN_OMj3Z,<*ڸ6\Tda!cY֖J1=.<;UUim};1-}Fʳ9.HEߜ mm:ǯ%FuytMj3R^* &痢"swRZR|lo^pH\OHE.t^<1Į(OOf!Ҫ->~-h4֪QHfYvtzӗ&NMj:f=^?}yqcJfi?iiVKzbg#1 okc41=}dF_6utx_"z:*W;-|[J?U'هR\-IE.ݡt݄YG3x$\k hW}|`\._siiR)+.PRЊĿ|e vTU'=^߿W|cЉ]s};Ț׮zKai1y3+`W?s&[ڛΞ |‰O'&%B |*GlJf&fG_mMӴff8v8܃k$6moS^WDs yvY%y+igyy~X T,TiHt85Q8qj"i̕͡+C|J*"R?CFB* l>NLSu2˵9JM?m~Η>v>DDd=I| 뺮ܼ"2sifoS6-z::{cqm3f߸ns3n%&g}'g92v!ݘ; KkJ]]-LkCGB#~eFVnU-3w1qE *kS2шPOF,Hyi>K;qPדO/x|=jZ؅oslsg+.= <!}w[Bf\,vqj1.d2}Xrx'ӑPX2qb٧)]Ct竍pt)@#E jOڪݎl3_8tJϧ5M%oZff0 y6 f۔䭤mͶ=]a6B1~%>qzbBa0l&NML^\+ ֖RU5'k"G8xv?[|f~+ݪTĶV~ZV4M+Z+琧X,V?9` (2q_QwRcox֍(4(l䑙ڜ$"#cWQ"v*br+beػnT,E[+_CF CR,R6Db)vXiP s^*gpt'o&Eĩ: VŲi B\)_X7_{NU%st 6_4=ޜm!q51HeYݣlYR._ SU!v)Z%syƙ%v-uj=I rl3+Wy^Vnw1A +EUu.{^UuU̕Rq(kP rY+^ ft2ݨX\4۫4QQKu+vTrɲ:\ap( DJ:twh,=hq߇5KU43Rs'q#Y꛹;)Mwk f>MLoHT\ jIܸ^Ds |/>EV-[S-Z4K֪GK"ÑXy .g2}XQL]F>6)sXḧ́cf1 5jbtVfH#-"{i?aժiY򪵳gnҡ!K`HϧsCQꯗtTMj> .'?|:s723'&8u{wC+Cesc@vΡŢl٭ZO-b;YiՖEihѥ`ݪh.WgrP|m%"&/䥩o܃\4mE“KӔ.S'EŮ(G+VUjHٲTUp ϵU} 鳸NUMLM^?׿:sytuo,˲"GB=^=Nh>\Tda!cY֖J1=.<;UU[}+ T$56|)4m4R3Xg/rL]\9ڀ#K!t8_Kl)Uu@^x<=%Ld~~[ٛÜ\Zyj;>6}yGlt69t'o&bgRAiƒIӗ&_tcH$"~f/95޸ȱc=~{όd"G( rxr'هR\-IE.ݡt&v^J+fH8s.6=WXo7w5V\.)8.}ҜE}+" ]}x:U0pW_j@xil6ۖ`%.{.%'>c1Wc6ZO M'֜OH&o%ml}6! >ٞU>zrtZym󑉓m&VLX]X+Ixks^}7Ѧbt)eioVm6۷6M<9׀1(_}UeV?I=|ۥڵ(fW,צ~?kYV=q@v!?UKVL볱M-?-O_6vCčT$y;D :s";y3)"NչxS(rk/(jo̥7ĵM'L^8 5q5=? ~?qKÇPUŲ,xYEc^v_ƞIkSM|tbmcШ =Sg6q5HyՌ| UhZM P"ϡčdl*Z#_z}ه_A%y |1|,bZZvk[>*eiUErXh܏\6Q8v.e'FKƧFGZDFqCMjz|>c+ǎUDK"ÑhCPλ:3gbv!3y.8f)C¯˙V>5sg+.= <hZM 3|.mq鶚*z.:*Ϝ;WaIS^Zu>v9-\^,"|:s727;81PǡԽE2bW"j7Uǂ۸KzѯFR&}/:|f1l^䄣K ?GZzgN|ʫbP`nc-a:lZ|: ]&Nu7-Uz>4.Á̽K IDAT@^.?zTSgj=%V_ϔgō"wKilP2KS#_^1zifsYmK3{n}B4jp(ʶ )j r;֖Yo־U빟a1WLMwkC=i6-i?Y\MKlZ}y &4KJ{+'EŮ(N;jl]TDqXK+WMWֳWhIJȑзן=x.Nz6mTjEBٲԆhRjGvԪ0 :,a:l~稍R+:mKF t>\Tda!cY֖J1=.<;UUhPꣶ^27Pm<{cT_ á^Z~oo\7wtV[o7R|oeNlYSf.mP71h,."p%lU󍂃FzB*2u9jiA#}?- :.k.)f^&cKZ5~HLf.ڏHpW_ǎM_ /""ӗ&_tcD=39v|}>TթR^lt69t'o&bgՉF==Vhgb{I&0hx}=]ioff.MvXjљх_hZhv}6_A%eGbiJ|&.NTٞگ/?),gf Kys$(vҥj{w(K+fH&q.w5U4򑺝ri5PMӮo<2RliEFh.3|>~Ыu]z<=jmѓ}6>w!"ѳpeȧhi9v!6qj6gz l5̕l.;'VM8V^>2=~%Ixks<] ߿rrO#goWĶo}l6[if9Ţ咊85gR"-]sS,EdPe/>;w m۟vټq6V}0v!Vkaѳp(>L/]NUde>fsYeyY˲NgQs=|K|!cȰ,kso5geYgk5wwOW!6|Hl,t$TK|d8\il9R|:qx"@T$~5]}НGd^}1t$#]"|$\Z)mm9CM׼\r뵓K3p^G\M|9$,v~{wjpEUU6iU=N]`št)e)ǩU] {UŲ,*[\vE5EQn^iZڨ;:ngEΞ |([T,Kb>TUEq]ʫV\^GWQ;IR\leUչ{U)"V2WJŕ8ՒC_ ;>V,;?TvbqYRx\\.ov_NzOWHeuP@6Ii[`0cifRxCG¥Ǫ1tדq:/<.Hqozӥn^ʫf䳈CG#Ukc517}N,fWs'q#~@>EV-[S-Z4K֪"[9v|l\Xx4~rtfV1ˆ? Ŷ,2vrbhqi1z:7HH^6nR޾xsg+.= <!11:*Ϝ;1>l,Q(2HW_3v!f\60mojiY{oj>`CNp(JP^z"{wC+CcscmPӥZm}R)]CSAC<ܻ>^:t8$v 9srԡ(RH(,v.x8TuXѣ::UeU,z\.?x,nܭmKD]Jco%Ӝ45Xן{+f65viT\15ݭp{Z6ƶ/iV:gvѥ6VEDs:/>V')]Tګ:CIQ+ [W;U5y3Q\z4y!,VL)CDF,ˊ }x\|8iR~UUG__TiDUjeڦr\ݮ.Wa+|4BƲ- ;̕bz>]xwҥtꣶ^27Pmt<{cT_ á^Z~oo\7:tV[o?1h,."pmb~Z*2w')y;)Iͧv!TdL>z|=7\vS}o^ʆjyY+(OO423_֪Czf20v95֪QHv]};>6}yX4}X}4t7s̩E{{f/iuoT!v6=\M_9q69t'o&bmGA:s: >u^<iub|KϧkM?k׿Q]a .'هR\-IE.ݡt݄Y3x$\k hWM('C:W&9w5V\.)8.}ҜE-Hx`0Wxm>ǿls7LH䭤mͶ=]a:4p(p8ݹ` hg@;ӹ_mMӴkfgKJYb[&i_r]ÑOGG~C?;=f' veE$Ϝ,TOӗ~_E>_O'&"FO˓&#nN8V^>2=vHt85Q^( Kgß۬p#''`Ӓc=bfYWn󱶶v-N_>1]Lcc@QF -m 5M+Z+琧X,J6T*UlBB:v@+Vڲ%=V[nxvpF\17G3eYNveyetlgl?8k}.52Wh8vtOo T(JԼ𡿧#_ջ0nnniyʴ1dlJ9~_iQcȰ,kstjZmZn1ٴ/9xCD"ÑddeAwfRD30Hͧ"[P s^*[0S>2g̴/[ Hv2P..[I˲Kt8V\D$q5=? ~?[8sifoS6-z::{cs16ui*~5r%Gºit3f߸ns3@Vj;k_rPZ⍣)My NN`RUǶ*[e { W>YVYJEd<%'TK^DLT^ڬ<՘WcTio`O[tӴ0~od_*^.׬AkmK{ x%̕s?eҖeY"RZ5<\^5c&2Zx]19],;A/ۮe5W^WqT#uvY=<}dXEk.dJ|ӈGoįG>]1w:_*9_'|`7Z^)bw("j@Y5]RwR[tKUjq߇~MwImY/<.Hqפ:;M? "U3YDݡm;)Mwk f\eqK:IH6t[VxQZ;N\9 _O}U_W/|}QK6]}6-@}oZ,üvDT8{;9޵?$D$CAMw{|=_N34-L]hyӃvۃſʦ3l[3^:t8$v  ӦVϜeD$}?=H>-W]"e ĮD>YsIvVi܅31Aɗ_e-3_/N`hݨtjʫVd{7b]j?7c%沉O7fsj_ό|9,ؕ՜0٭r5tG:;Yi6>mfuUEyoSƢSe3z7^^2?f5^kvE*fυ|U'Zq?/^o~Mgض~M5[p(< }j:fk3>󦶋&(6~9ZXSKZ_ K;B-ly>L]lJU|._SU7R[g|.jm]٭6}|qgֶUTlj5-Km8嗞5_R<}7ueE*-r4G\sɎm[m폥f3l[~Y/{]f|djjXrX"R|>~->zG]~#~wƠ$n&Չj;kn9žY98h$'"Sg:oÿjA#}?- *-y;)IͧAV;eM]|]Q߯gF_D}č>E/Po?~-j ۶0?;*ΰm;߯oe_Qx\X|8}ezb 1ШjYt9njV_bYW^LDOE4RN蹘vffdu4}X9fgNGd|}~߇Nm!M\;>qjdmlrN;NLF{>{P`˹4F߲ZyczzVN^ܶٲƃvg\_e-vtMVX:kνQmVŚ89qjB+$e'/Mښ[w߽wWO/<. '/LF>&N^\+ .vFCaWsi^NU4/)-_+[ə^Ϗ>ɉ MjdY;MΆC/Gv4fJeZQM –aQ5M+Z+琧X,6.W>՗oh +5| y`ƠqwEĶ϶!,hbI;$sd|.+<.G-1ׯm3gl8 RmjZM\5;uuEdycQEQz|=c'ǼkƐaY#svqHUƇ0n~Չ o''꟫VeX?W f{v%S>2gllU`(OIEjڸM ~HVr?0o^L^hVոP$Ku]׷{foߦl[ttlm16ui*~5^tyݏ͢MyCw>@ |>@ |>>@@ |>@ |>@ | |>@ |>>@ |>T |>@ |>@ | |>@ |>>@ |>@@ |>@ | |>@ |>>@ |>@@ |>@ | |>@ |>@ |>>@@ |>@ |>@ |>@ |>>@ |>@ |>@ | |>@ |>>@ |>@@=jCIDAT |@'5U^GH\ \/m>>`SR!S.fŷr5s|/6ښ~4sIܸ>yyc;Xhi ;6~:%<=~:"k `劈XRyKw."χt7qP[}++iy>&o%.H^:~5>m@aYVEDDCQ>qXE(Ep|Sȧg#H-%' ǽOvչGU8E,Kw+XeYTbwHŲDU0^,?XR8Jxch;4-RbUQTD[kXJbXrp8DĪ򊩻\!"VKFd.Fd484WX=ٔeߪ}+bWEQTRuridn),+ߵZ-(VL4dRU}.۶VEa.X,U=-TŮ";nm@ͪ)Ngw,kK{f-KU?Rʿ+XUzZRUѵҊ}s="NRu{]%>/'|X)Ǫ[zb8,,u8PKCƉ%EEQvشhS۲R>5*T=eQ^o7î?JZbYQ)-˪XVrvUUגv=0~j̒XѢD٧*xIt-^uPĮ4"qz7Tw;[KSUEDl`{]hp h>ʿ7*ܶ,2~``ݲu;eUmtzĮT_UK;Px\<ZEı'h>6e6U C>{tZ)n u[UUGb9uns\xZzThABD 2"bϸ\Z.W].Q4&d)(&<$""E;7O).""b1Y$z::LX81!D>АrdsҶ=l㶶\_j.N|98),d&/DOG.qiG;)[Zr8֟4ٷm@+Va ѡ6?j#_*)o@2~5>H`(;KJ][ofAe78n젖Z%Sޞ&_Dk3DF<bWE1؅lrqZx dw/4Rf) blMbf}>ov#?w-z{{w˿)1+B*Y[V-u'e͕ѯF`-jIGS˿!"[=c?fP\^5G_dN]M/<)n'/MN] d̎8MXecd;O(kID}ĝ:Wp ln!勏l}ڥ𸠪-?\HNu~cZ\fhhЦ/z6S\vӰ]1+log}5&vgHeGy^:z*joOOGOGɘ<3q*Ur]n[EVKUK~NP(HE_r~VDB.}/V] @9I\ ~U-ٕ;/pBo^}B K]߸QA)JɛBoӪl}D4_OcI)R>W-5 ;bߺ5W/쏹ԝ]JټQ~Z &NMHEFsTuo^SPjr4Um1o^M>egjY$o7889QCKSWjcfg2 fg&\U_RkV͕Rl-y4pb?8nq&-v.vo-j%|ZJ'ןjxWDet6μ9N\lb,2~Tx\0<7Ϝkod~H &R#_4_nW{ڥZjJݞ E7S"|q1c.u{JR.K\/^y=r4ܸNrx섔˝]-Ev կކ~q[SS9_Mww˿c燿onnˋݮ̕󪪎|:';=3Msӑڦޏ|985r+2-TB-DС2`AhBt*J6KIDP%nD^ .4t9p'Ytuc'ݻ޳^o>[ɓXkViͭk(H'wwvwnnmO\z﷞4?l⦪jw5}'WɪU">02cԈ4=͇\Gǫ>s׳8ֿ/eR#/0éj*MY\oL5{Oq{;ɯsӑ,)URbAL=FŨ5Ӻ7)L]K$:{5DXcl K/cJNUu4*P,؊ },?"]\r*GJqV€Sx:5"= pC`Cm*J[۳d9U ̷Z|&luԄR5RVp.w۶t)Uj}rP~IӠ!hnox Mܭ=UU mVE@>TCkЃ{0'_X1!nQ f5{\*iU]U15ԙq"x؛ UժUK*"{7j3Z~Uk+Puv߮%M_ oΞڊ=\RWK2II6~zԹUֽwԾrZ1r.t>>m\jxR92ŋݴ"Y!}h4^g5<^hںٹXUj]nyܼCD^}9>yݝ`P'5UW^i-7sZ;Wtߜ*͢jwA&`0H$\9z*U*>8usZ7x{1jRvaT̸>@ |>#H ~“e߃ Wa$di30 |kT '_ PDP#A$ aLAG>. {Ƅ4 Y*b !>$ 1/, IENDB`kildclient-3.0.0/doc/C/images/Makefile.in0000644000175000017500000003424312376345610015033 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc/C/images DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(manualimgdir)" DATA = $(manualimg_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html manualimgdir = $(manualdir)/images manualimg_DATA = *.png EXTRA_DIST = $(manualimg_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/C/images/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/C/images/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-manualimgDATA: $(manualimg_DATA) @$(NORMAL_INSTALL) @list='$(manualimg_DATA)'; test -n "$(manualimgdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(manualimgdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(manualimgdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(manualimgdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(manualimgdir)" || exit $$?; \ done uninstall-manualimgDATA: @$(NORMAL_UNINSTALL) @list='$(manualimg_DATA)'; test -n "$(manualimgdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(manualimgdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(manualimgdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-manualimgDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-manualimgDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-manualimgDATA install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-manualimgDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: kildclient-3.0.0/doc/C/images/we_alias_edit.png0000644000175000017500000004257411715730227016271 00000000000000PNG  IHDR >!sRGB pHYs aFtIME *>Z=tEXtCommentCreated with GIMPW IDATxw\2 # %'@ZU*m:ubZkk[[nUuZܳ%asG&P[s>u]̡M?DSmB2$o<W10 oRk%*$٘8ޖx7N!`xZS@.Ǚ,&l]zu9o *my4i{*[!ۚʢ ?QdE<5*l*Mӆ*b9RwWC&g稴F1XR{V7cegօ#':P'f-[+] !tvg\zLwNs^1NSdEqo 3BA7^B/W7u82|jăAv}KB4Oәhf+Ѧ&viB5?zGP|<3Gd~Ɠ=>X[X^T:>?DܺK'*+."k;8vL w ,)G"V=},u^B"BoA5 Vq5* ['QՇ⨊%wj%(PUI qDVdtUbP*OYj !ۑ/Y|nʩaZsg鉲{_eBI]؊}|0z>m"aI6I{ omN9]&-{x6gŦM-9jÃ?x )NEQ] Ys5,^ݯiB]r۠g8F=1q}YL7 Ilx_ ^{[ 4ɲ kR6VR*M6' Z7q9FtIqPnNM&TuA6ld ט0?!hz&j@6Xbe=y|ҥ$AMSHޭ}egg9sO~nn  rϞ=mfC6dF7;wMhZrı7Rp lE~ )rwP7dUH$@xC/d b7 5xWB@K7"_͇ }YZA~R_6fd{gȣoʀ1d[NGD$2 v 4l@Ѳgld9Uyz8Ǚ+2jwOLyMe\[);4y`L٤/-\)̀]=znRwW2O\x*hRـ>X~BQc`IqWӴ!Asco9:;}vO[aAc|J&<P7oΉS4S?E3]Ge77-F zW);<X\&ȫ?eBƒ=嫫kz)IG#a@7 ԥ]|KrSw_OQ&,nGH!hzـ0 _mlPcr.o]{Ke]Ev 3nRQH:v‹p`6 [:SƬ:?#|EmVi!IK#}]=V$1"h]z} Mh-;w~5sdo޴k"KEМX rwYql$$qlx2ӧy(+T&lxz9>=;4A޷oD @SIާ;ddwlFhlxJ h!z @6loh$TL&łlxX,V֓Ǘ.]**,48K$N!=zx~˗u>}10h(>{ ݠTl?/Ν@S\$u:qwM[Eh= *`$a( D8 p/H?"!d|r`v\jz Qýà{kzf .˽"W^,z~oMkoٕ7&o+H.MpbM8t)K~{QY!oW=;`@'v+w#)fCUc7g|_p퉎R_6/Dge'HkBsB0} e:u_zr D RĻIF䯝5bgriW 2B+`į=M=i*ҶC EP]ۉC2qg!x7b6T;9ϻe ;fi-bL[9iW6i/g v~vNܟb:kω}r*zLVq9Sڷ&e)ޤݤ\<9f +(-j!ĿYb6'$Tc*{YX|uTPcp[r|cqp@!G#_%rԎ}ie#\1ϟ<{qz-pxC\9ӷ(,,L.XPyE]@,GOvˮV> WG5]%"Ma=;LveRzdmlPcr.o]{Ke:> $meym09O?*5kg,h}"TۖnQ\fTXNws]Vf 1tvwkd[U^)?%C=;4AzDaT8.q1w4Eh46 kVH}x7ld @6ldQ am3gϞ;wO80𰰈f2A?O}$RMG`oP֮]ph6Miihh4111RڪFMf)5 A$I("h4 M/)zjU['KD.#-94^2~p5SB[KDb[7ܮ0cF_D$35]ydnx%BcK(]VFY.#.v.,hBR_6ivҾkgmyh@./;פ'I;}?^),8)]=znRwW2O\xZhnƎNrf]#ԧS5)OO8s|EfW}i|9G\N<,$ ByK ^^H""GG/(HD\S2 6Zu6+{2<0l闖.ޔfȣ+44dqY {^y,xN1MʞSɱ8q.WVopդW WcԶ˙:4{O "d!W;'tω}&<P7oΉS4MyfW{8#,!@HqWӴa,(*!L&ϑWHճȚƱb5{Ȇf_MT?2`,oQMkoٕ7᫨ʭ~`xsԬSOI94 TfGӏD /퀸;řn+ZW]+mk mf~<8jpzɒ?׌ r^nOQz %6ӷQJ,O%ktr,Lzgv#$}fRcL m-%npA] Z̾r+d׉TչoIJn#rN+F[Gor|ߍl7zm%UhiN7"- Fo|˂z7ݓUi2_ΎPsMTv||n͏\JGMW\ybZ]qg{okԿܚkRLZ1Ǔvb"o*7Om?oxDj]z'W_FYKUk荭LvdLVfhr^l@F1gO kuj{???l;X]J t'3zZp$6(шց-k+䖙1 +1 BYvV~kz n>j8U/ΆS[?b=QrLS!gOiWz:VWfZNWp}suwyU\.^M!\ ah6L,Kyc"*6-xE)l\1&gyk;*Bm:]-m|c 6þ=s߸+)ڎ[uk:]1[+RiW :ʶkLmJV  6_huWv,YuGt4lt1JxaW~ovr _l|&09nl[{xMvnv AQ ^cQuw#8e0wtK˲TݽHzh\<`!E{cC^m1;>;6ۻ۬%됯ms(jWWʬ2_z o8GY4 ZCQA^mn7mk?i,7Z>O(÷K &i~k׬:;;CSE Νm͜9ٛ7mv]$^\T͌-|Up( $ *RƗF{eΟvZCӴi M4MSEӴF JuKt,G#BHb+OK~G7g33D!I(0`0zK šw?iMmsN]?U_6.ng6i/g v~vNܟbZ:9-EYк]Yj{+rtw6_y x`)1TU?D noODIxwr&"D$g\yZPAZyOgbGuHqVHRᕼ,G#ZD[fmeBSgbBX4~NR1$='muO):λ4_ijjCj4ve= 2^Ono=[?ӵݲyv91Yhwe]Fގ} xam^psq)EBQgdB!˹ua-gW#)U]xn~E7s.o^c6㇘- tcȳP .SsutK˲T0&bW:cxV1`qÜE3^5fihhAK;Rҳ!$:iHEB1tvwkdzFAQ ^cQuw#d3qc]ãovX]mGvkiWJx.ԾtK˲TݽHzh\<`!E{cCllwK-cvi!IK#}]=Vdk mFF Z)'4M5Eׯ_]hјѣ:t MKnNM7&hL}3A5T*&KL).*dCxXXLLq<<<ì:Hh700@PXa/Ќ!$J~ @6ld @6lZȆ$&^*//ȆJ͛...j ZciN< )ٗHuɟ~cXXkR]G"g_%12@ I(dPyqFa8nC1cJI x̴\t7 D73tuKqx$E+ kSnfJhkH,q4BQˆ%"s%OIɟkFHDb^SjC%tKDbQ_+{ۦKDN\,! /)BFHG6\ȼs}bc hn@uI<4;i߈<4 <=mbws_;ɧE*uWJoe$Ujܲo]=znRwW2O\xF-E}Y7葴+Uoxy` Fn۩V)$m4ROvnfޕ,Byx/H\opդW WcԶ˙:w^1OkgzEΙ|mՇ܄=ɚK&<P7oΉS4iw'𦬚"d!WhŁ7l\1.u)M޹ܔiMRޠD q3)Bd_ϋٜ\|WiOjcf#5;5%9i{WWOz)IPi񍪂lY[2eAliȸq~Ley74ًv__*d3{VMi `AVwg"T,GOvfbծ_R`j`F#ǔH yB{:IHl:# y ] coU_fZNWp}suwy5 r}0̸aӏJF" /V Oൟm^b6д܂8.JczY1tvwkd[AKq~vta]Jr/8CHH_gF BKw-p=?ێh.).jP)Gb'^{D z}e!3<)Mӽ?oV:t%7'{MހL1IⷊhDFN58l)XbBZiL6/!-ܐ>f  nP(,} f0@3T*?4Wo @6ld @6ld dMлwB@ҡCdóshi`L d lLhZiiΟW(Hh[3R4,,ϯٶ}Ll {GGpd?N3>I9OOO8c}Zp$03ﱫv}<;?)R9ujرm|}}0 m|}nj{)Zmpwzviq_k raAAdR<77w%qss{R6FOr {jf/BD'"[ْ5k׵?w3R/aWuÇIЌv4-00Ҝ9ٛ7m (44k-s`ܕ ƔhI@5 a z@7ePD/D!0 4MQh'Ω~Ny@`! !FEpm`\F*k$[.Q"ID4IOos 7lN2|ȸ^]ee|[lXiFRkFJwrˆ#G$d1J5q'L (孷M BB1it"G܁ײ0?\oey*TO@ DA"ʄ  pz]މzÈ#_j 1L#J!#F6@K7UOߖ5e{wDH2!aሢh`h4OO<qe=߁~Ë>¸A8t:/1aQQF3p_nC6o0h'D \S/Aл4:Ied˗K>TkFCĮ;_]o lvNzWI+݂7kb4ۯ,<aeeցF I#a$H?}V( ,izHׁMЪ7h׻1  7d9l'z ,D駈`J$.~˔J1 BڍeL`juUPFz 3N.n w,7{ ;,W;c0^{@#a$bx}A)Z4p.d_Y%ӵ!\7ޘ~  L Fߘ]Sn׬1BHuT=W#hL㫎yھ6Oߙ߬-@QGǖ i' Em\t"@!剷=ng+VEe7@n1`WK)B p:2%nQ_8A;Vh==;CkL):"ݶ#l/z['[I}a^_FZԘ%Tg ^fMe)⒜_;34M#Jw9Eiq~9}}=MKMzQS)jWnf5l)EJ%keoMFqeԎ0 J1bvxJ2dYɔ5YyF(p@!l'?-I%mczp5%DẓI!F$EIdhI)@aF&F0꜖B-2S,L+W88o΋lu 3ZF&`@$1ܮ]kjFsr(\^Ys*:@'nXiֳX"=Yz4tZFT9:VUANnN_TOz*AAѲ O?~ˎmZ`}RnJ^(a4(Q"hDP42И*ǔt:? 5UVRˮ<&Y*A%m&x295jKٱ^ ZcJ?ӀaN+V\sC&#t:Ӄ(fUpZ=~/in_}7AzyX{:=䁟_~ϫ|<=m 5. l9w"hAJg$e iIDIB{/[uRbFşg/h2GxO_ϜT_)x<ǫ7<]`wml,@UBW^.} S#G2g4]{`;b">e”5?gם(72328|nTFٚOyGo1\5ڽ?ӼΦ mArKR=[M{ݻ~`0T*H (A JOThf_؝#do+:Dj ΨLi9˧}ʠzrir}SWm#';m5rե2v`1>"m0u:~ǎKI=hÆӦ" LnU% 6nmI ў!~_Kw_^#իQg}LO1{Vѭ[{~< !ny}l`[WW.$0[ɳ+ΩG=3ޢq)yWL4EYxIDAT'˜O#!0 1FbuVasš vokՠVj ؍'98nH#vQ}h!~䳥K;Dd( Cw1c`:2Lqݰ!+*l^IvP"yzҥOc>~(V4bLG'~&[%Ԧ Jv$ FU7Fk茰6r)O\x`3~3(LOB0 ײM4O32LG2iTIj(OؽkW0,GGv22׳|aI"&8V4CZ\nz/Ǎ?@ JL&ÞINjϝHaAQk ..Χsr.^TXteݍ(bD"a65> 0@:.y6[mc#K\y<^ZoI ?kTvv%O ={#IeJr 5{w=w5 tttAhj|68`I:Iͷ`p\kcc/oo  7Tڕ @K3H$ш3%=f,M غys=<=[&?yÇEg_)whyir/|?UKhY";|l "ǎo3;χC}~:ru՞\;)5A E1bIYd-监o;{fo~>I{cq&S* up\Y^a&Q'Zclׯw!Ø-ZVT-aKq&g+(((((h bf9=s0@K{lQǼ_ O d @6lDdCCh̀JfIENDB`kildclient-3.0.0/doc/C/images/pref_appearance.png0000644000175000017500000010413711715730227016605 00000000000000PNG  IHDRNT sRGBbKGD pHYsktIME  c-tEXtCommentCreated with GIMPW IDATxwXǿ{U`o`D,{ƎivݨXFQ4 {5{o1nݛ-Qpw;;;3;;.:v5|ۯo2@A6`0řf~XVwusC@EA[)= 'G#'N+j򾾾ヤDl6Cy2.N"<σ88#?hiU}wX+>GV6qX)Nk=&?GOֶaVMt\vDTq}='n!v iXSW(/4½UI'9GG=xykZ=?F;+ižnCeٹ6T3g^KO:icjx>$3m?p'I&:ցq̐s/K/YςFφs/N]/{D2i̽3s~VuoEupp`#)NFnn'O-AG@#?Zސ& L:lԎ(1#|#TEX('ˀ,&'fvMVS<1'vd `^6شyc\Wr"\- s8lWz9E#lLH.:ɢa>*tQ*&(;5M *BX֣=cM}QqL&ܾu 11Fe%y>F$||<ʕ +nhղv>2AGK_1k,<|<…˜jSACĩ!D"YꓥyQȅ{'մ9$<) "8Px% ZV{2h$B?& 2%dX?BI$6Ys2? AWtJzTIJ"LZb3\HcqFļ!o7%0DxEBY?D;N##ӕE M|&Wyk'i[P\,3Lt<-- wE.w )W.8p /^Iu._RJY}iiiw>==3&/]B`Rpqqu/K۔ AAAe E ϷPV?‡AW6ǣ1bܻ` UZXɄWI0v$$$k9cҳ6}NT/ɽ'Of>,@uD}Fe-dr#V[ӋU>ț͙*e`Da)WʛNZ/jkVDG޿yQYi>- ;YB_ sr2eBNQsY /F~j9%x1$,Gp>HINFjj ĞDɛ>x)"AyB;On<}*{e+.?6㍬jϟ>}p5L|2ܹ+I{mL].y|*1g$Eӱfxxx`Ŋhִ)Sx~/;Ƭu /;A\\,ΝǙ3Xd1<i(Y2 Df̈́ˈM/^qϬ 冬ܒ~1xQꞩE38I3jſԖ r8b!.7=}ڏ ~nDyBfjKDn=!rg]/H.tAx&r\n޲r{/oR/+ ,mi;p">AނVeka,}P4d rrGzz7OOD ===Cd2pg} ,X0ÆGj===$iL/{!O޼XB ½ljZ(a\ mOOO̘1Æ 3Ѿ];1lP? }zB'cWuyF.Fr\F,`} uR>+8g׷^^TzNVXJN*&Y7Gqb?_@_fM* c9LCN=@DZH2 >LvaL,MzByzֳqd<u@"tݿȭС * GNHMMř[^~QVݻOFrr N%Key>#og'&=2L0ޭ8q81Q9jfϚsz:J@݄;99"%99c7n| JeϜ96m",, ב?_>?;wk _,>N\Ƅѭk7i- ~Sf*:k۷)4Y۷/N>-d` ..kׂ pYE(YS<8C\\jժ رSqQLYlɟ Jpm|6X;de׊,bwH僲_mfbeڦ)6P ?Z_SLTNIpֆpx-J*@FA L"p&jvEOHMDXbTIH7Syⱅgh7yϘu]CE&e^ew'lΟCll,=}+ތ~~hѲȏbZyy?;gWµ>3 6ti_DdpV} *!Æ0p 6\a^j Nܸ~4h0r(YGFRJ2.?T{Ɠ8έb+F1 =z eGV<8v츐Ԡ"?~"Cvy,;+ou?y2 !G|`8v(잉-j>W1*c`yLT'E.\ZD$ R/WN<˟c>% >>k[ x+?yx ?!<p:yڴѠ+#KX2pWxx_l/gcSz|/?'iGG]">Z/vtX;x.WP?\7EZu;wX򈊊™3Q^}]=j])5/fS_i8TXO@ɓSd5k"*T'O"T6hܾC…1k,@bb"~;x#FիW:;ppɕe`pDd0/(ĀR}Ns^FOuc4:˗.BZj*1+\1==&YV$x̼w jՑWt8uUא8f*J}i? @"EЦCgDnلߡO{ja Ξ;=z=k?NsP+T!eK @p[ <YP`AN <~QQQظi#֮Y|Ħ!C0̚5  @x1Nf >}ԩS1c +W<.×Ӧy : aa0kL]spGpУg/TRphՂʕ:XLfB5M|34Q߇W鏪FiAzwʫM`Jf-4R*8g|E)Ii2KH«yx*JxWf,K1JHceS<N 9$rlj0Icq$JL+TIlqKm}E!K6}BJ>N)>NV0'yn-1֘@BdA[|`DNHܖg \ s쳖OJ+ăҘXz!Y25&VGcAYnzm̉_I}$>b̸L8N%,Ҥ&Vq'r߅K|%}XkfǏPHUmIJJ nߺ G[IOϻ`!Z^jݲq~ Ugț7DhW S5wsz}OS{0$һaL#Y(ɲ @_>éNu&^|e7E;h JT^yaNKֳvbF$ֺCW Q_~._(l㵮2^C%E?366wUؾMdLt2 TB`ȓ'p27[zBӽ IDAT ptr&yyh5ܤG8%0k PcuE:Za²yg{dѡ4Yj6Q,tI&K{Wy9C4yp jN,+V{+ 3fӊdm՟RTS e, 4^SҠV֬ vWتcÃ|1 j/yDERB,w0$2!0puu[p~f&RRR`0D))̺k ?~#oyʅT[sxg77 3|yoŋ󐔽D@ TZHINk2ʃ{_|>^Xb^4D`5;5|=ŴcfѳD٦Tk'|*WƔVukOl#9̛"'"E/I`ide6͚oSAv`y4 4V!a*=/?2j/2w< cf5gl &'q_fD^\WnCP/V1bҘV{xxXc.xs)Iljk0σʘK#Cy3;}fd 55^^^ AJd\\\ 4$%%J9xq2 瑖 //OTEJ"˛CZZ%uK4Ks,nbajRVⴼ9UQbE$qHMKERbLG>Nqqqb ҰLn7 AJJ2BW; =Gl=yɟ hVtS}St.TgaRRa !&кiCZ%{'{*R$^x:ֻT5LP2ڣpr2qۈ%k+nxsW>WboYjC"aוYt[1vn)~iyWlWV۬)VqLWZoBWi&zhD:ɊE9II3U{eboΪM9U;ThldVޞR\3,LU2yC]kfˢLU>ʂ)F#X o;Fu 3KUJc/3#V,hc; RTmsI{,d2#)) /u[iγ杞dMXYspvㄹHYR{& I@b6٨.j~1a:&S"V̙8j[3^3!RFQ e6 ɝtOL ̼e'X:mT}+!ɣ]l7#w\2L 2Sm[y|W%+R9MK‡G52M=OFLV/  W7[n5 AA>Hp"   '    Hp"   '  '    Hp"   '  7cG=J,Ky5AAx}J,K & 07]  W%߽};f $ʼnc@Nh#k 9ǏF ވ@} ^ogAA"H$Ɖ  B'$8AADA N;wB@`vEOAkKGmZDmhٲ9݁(~-\ ''GTR{o^u_:T)~WzN^G[~?8@mEě&8=}g8{wa戍7݅`H:}G GѢEnk0cu~)xUqu{ cg6HMMAD6_cnjڊ K5m 7jOO4jXw"9Pf]TRcƎGl\oR*Sd2 ܹAktيh֢ v+T::wmhШKG%+Q'!ʖ;ˬ+Wc¸1(^F..ΨX<&M=M{p \\\вEs?5Ao :utlҬY7Ñ'M}|O#h4boCDz8v N<`Di_0w lݶk_kWs1dHOÑ'O޵gNCM0de g00'"E c$}{j[$ZFu^t ~f8tpٳg>sl6:aKVIb3V^|*4ot 5nYi3ˮݒv+6SfFk֭ѬE_0zx4o6Ca6a/FFr</-ZG&-GCq=V]6W04h ={(ڵ{aϡCQa3 m`1uv축R8C;z)))Щ={F3 Ad?wC|\᳞vr"6cℱ;QFuDFlĎm[дi̚3/K1y(11O%y*T wpp|?s,;ܹ.054r)Zbo޼ eCϞ|*~W̚ʔ./|f[Eֵ >< az y 1 , #Ϟ&~ шaÏ*K-m;0)pqqA.:#|,/5MC`ڴ=k> ƍQtN=zt+.߭\&|vv._::99PhҤz|WN^;waάpssl ?h}穧.GeұC{,^->d8 `O\ puuEmѡ}lj+>ԩC;_իe>˛~ނѣ,C$8eȭq}̙;__1%47͸|0 +WƀPn˛ 5S_9.=ݤV/=f)Fj.]ƞ1{<̞5 p=4iZ΅ RF\\"sJumΝ[^*0oۢWA U[_8"N_+WxYȓWXZu)V*ȟ_?cc߾hݪ8ujRCu`7yJxg  *K Ad?q...̷hgϞCJd˗ &i///Iz~~؃/\~CY9GLHKKSʜʖ-E}noSւۧVXr._ǎ($&&Y//VJ}m۴ 1~o׆fxl/g܆}D^=E$#$%%c-\$.;""r+˖OqOO:t)))xFY#KطևMێˬ8r Ppa<}{.1޺u+yNqɮ7o~]l|msbo/EѶM+/_)))/!/Z<˝r^T]J @۶1v(̜~1ZmևڵmΝ8u4mAF/9<==GG;oÇ͚5AmQA?5c$~}sojd)̙3C8>cXT`9bW"~TZvƢuY/ݺvƄqq:th'Cǎ1?n z ٌ}{vfX fϙi3fhӧ> S.d91:JejVË&`蛥HIIh'QtI>م P 4"---ce#%J뗲\ Ρ{|3 69v3鍭r+W?,<낋kF8'''͗x/%+Zw=OfOhP5 ݇גTlٲ͛5 7वڛŤI hڼ 4 z?5 ݇ג+ӻ'5A WEj!݇יwR#[  t"hx>  Ȕi  t"#xof8WAAt8.˛˜]2˟_CH8% W x#9tp/ NAA   Hp"   '    dq+AAR(S>"AANHp"   '    Hp"   WlBvT *U?8kw^A znVs][O BІ믿iFo? F}2|˗ %%ϟ?ǡCѽG9zkM1//o^a)F'УW?A$8׮[^([2W F׃a3rv4i e*eط͵~X#׬Bq߸ 5jzͺXv{M$ A߰fދOF O|zJhh]_w[EJة\&~AU.FŋuԒ^t)[ի>|[7opQ9g܄3 T$%%6lW+{b1}pu|PD:-ϧNCtt <ƸɓhDG`_bKD$f#G[gjլo~ǰ`2вes)]6S{z 7?_qiD!x5NxfKڥ3Μ:.;y|xin84>2 p}sϦu٪VW̟7.d2aw4Vt8]:뾾n];KQD` TJ|PpssCƟq DO}'Zic+:ug0wL4Nbߋ2A$8ِ+dbT cFcdhj_#焅 . hղ9}.Թ;|qqf6m~+flxs̜o{ȕ+_w7$/t L&;v"5\ :4y}@O}'Zic+#Z4o HMMу WG2GNnWG~8q"`GT*j9 |)2#TT.Z"Lj>9'KgRxWWw=x{y,3'_޼(Nq<}7G 66%'j~C5ЧOO.SO/zcO?Ɋ@+oc+>'''5 Hpzt!Cr&;T\tnjɓQ>3sf93*T(,q代# Z2Ij\\\{GRR|&V% g3˙ڐҥ3fARR/Y.[$,_TL-OԠ~=A2e8Ìm=hBvi" LvmѬice񅷷7LQaqpp@jUcF~Z{&FO}'Zic=9 >prriT!x7h,) YʬDɲy@.ܹ?QFu;j ?hhw<;9 _–ϟ#11@  uww  `pYj `@:    Hp"   '    Hp"  Hp"   % N<[^Gtݽg/J!`23u,׉  gFoiБz\;3x0͙  [t4mҘ>AAvFj 5C`(]"v+~6͘9k.Cj\`t 7oޒ~FTR~4ke*Y#M[\ܹAktيh֢j: cbb"jmظ8 AH:\OjJٵa5bj=\v]q2oBTu6씏̢A[+8m;v<^0CiqyC"4iΓw=|sg~[,^8Ν;⃏ rvZu`ȰW/ǎĩGо]L8E\F߰ ԃ8~?F#/V}-5.ؑhҸJMG@pl߾SR얏̢A[-8M8E4mi7a W\puuAqܟ4777~bd(Ыg$''㋩Q([#6gpqq;ͺ߯Ajj* S?_ނոQ899-y[vkxxx )1 憞=k ѳgwpB8a AD>N*{ȟ?11O%i)ls^gWW@BTuYwܹs/\U>?-ޭ nہ(Q͛PR-w{ˮu3Ġ};~A.a hܸZmsu߃h ^Mpz0Lo)!|V\n:ȗ7/4j<b츉ҹ#D8f6qY8::ꮟe׺F-g<>\gؿX4'ׯ}nj!wlFݺc~~6s2eJLޭ .^vHZmXO"O_r|A&:ulU@BByK$rΝC/aђ㮮}?~}hٵѪunh4>6=튟և#)) >Ĵi3s|AANku̙?9~ӿoB5o`kE|תes+Zڷ)Z VQ0gΌo#k̟7;vB v=6]tFzz:6BNѺuKY.pA 4-JKMRf%J뗨UN\\<ڶ  : rG'73 ,'kHTV[#%%ODchѼ5 ARy#'kH b2o,X*V#-- #! ^*Kԭ[[  ^NAAAA NAA$8AADAAAADɲt'  DFApz AA:\*#2AADde2AA /O'  rC2˂'  rDAAAA NAA$84~4{c۳w>xfA/GOkKGІ6}uU}A 8M</DBB̛}6?[ cЏ%ݸvQtli-xǔ^H-  )_޼̝ۧ/}W Яo/˛?Y׮!1) U*+1(\ ۷|!\ z=)AǩkNq&Νp9ܼy ]t|T5i0Lf̜5!5QB0u7okGH{m!i᷿3=hѼ'rɉǧ&J^.~\&MM{I! ĜlMXs#qbdL={I)~}? F|? ==Eԉ#hҤf[nz*8uvp)] 6m~:u!Uy>WQd;w1q rə4nǏ–%R58gΜ' #G CTt#G #鿂_14o vDV-WL$lDF ggg Dh-r傫 :ul/hWi;7`߾թSQUAp~&/nX2/U7m{`U.9QQP^]899P?~MAYV`L65`oԨO Hp/1p@?qqXa#uҹ#7ظ8DGǠDw1o`@<ۧ޽\ZnjFf" 5\]]tB  ZW 1v %BMx UːkժǏcݺRZ'7c)!!>>>%WmwEGG'wnz lW@hh|z<<<^:SHJJe%'Ա=V HJJ--0VyKsXRE3NqܸqS& _khKLJÚuHLLģG崙6inܼA9BΜ߯5\ءLꀴ4Ep^-'OF.v*_}"/>3k旈FІhٺZln(4AAp4h~T@zZR2+Q,n^+y>< vn}eiѪ.^(ىHA,܋|^47]|)Y1:Q`!8p4NEJx^^:Ju s&  ,2#,f+-âob  JH$YԪYjxe~ A!LuAA$8A2 {o_G2A#I;ܕ AANӡ{nAAJ|#  IFV#AA8AADAAAA NAA$8AADAAAAAAA N0i}8w슲*B {gϞ{knh@`k7AA1yGFll,&Oe 99{K/DHHUAA׶"۶Çppp899[0p~9[#6' BVH$10p@ 4С}5[n61s\D ֽn޼% ®_Y6(T ͚H4nˣtيؽ{\L4fa݉J-.]݋[엯]~.ֺHkJĮb\RZV)J5L# [zͫfss9Rddĸ?SOꌊO?gѹ \b[X~Zj5:tS̞3r\ݭ';8`GRq{ʵG~%""˔Iܣ.JI GG{e"mid2E#x{{bI2u6mڂ5߮@1txD;G X"':' t:g~Ruxyo'{'""TGaw ccDX{e033#p6|zyc*ulĵ˵GS˘.QtfĩZ-;`ddD!~|^esfMwG@QQΙ-[zy{A&:F`066FpPrrrTjth~$B__o1J;|.xyz@__={;vF !1꣑ؿO5͝= ԶG~%""tfrxÆ a.̚h\[h޼򹩩)rr,ӺwD x*:={Ǐ##.\X,t"ѳChcm]ӯ־k_LOOX,ڣM18;s婶<&zzWs}͕ 6!88ѬiSxx,W\.WnW$VlII .C Ԗdrn5HW̥b()))WvZ?|naa{26/X۷`C耢*obblWS+]ܼs*,oO<Ԗ~%""bpҠ_>022'~K.C.#+>~ڶ)!RiDFqƯͦ&?b\䐩UZ[7Qި}(,,T*źc`_EQQ=|'Ӻ=_4Xz%1)d*l::oNL†kP('ٳ` Ūkak LØ1AUZyFw7+]>0`Νtb.],._ pt#GU˵n~獘}JժM[k_^%""\|\4Mpv d^BDDDT]:uc181818181818:mZH0@XG"]P~ n5m:""""'""""'"""keW=#pxuو#NDDDDZbp""""bp""""bpD,l8y7DDD|h 2 +W"-5E?o6x$&&, """t}O()gGL """t~I& Me =;-lc]0WZN.̇\.WrK+DE퇇uD;k;%g KCL4tSy==vE<% aw ccDX{`غyR\?!IDDT/L+]o@LT[r7nl0 an c<=ƞȽ5W3E^^dK""zA `9P[@ ԉǃע*ӯ־kBPrhٲr X3{uNX7}^II .C .($HDDTI$b[ ?x ֬D"S"GHTyv47ojQ)lܺc`bbRYpR(=t2\xzNꇽQPXXTu߭ǨZ3ffM̬Io2={I/BE?!DeRH$R{[oHRtҥ .'"""Q/8•K{~x===L )!Ԯ\]^#""ڏH:9USK:? 5#NDDDDZҙ8Eh&G;q9NDDDDJ NDDDDڄd18UF"b:""""-Tv E郈FG(Twꈈ4)TgOiDDDD%'""""'""""'""""'""""'""""'"""C+P\~!""zNO#NDDDDZcp""""Kk7wXZ[\vΰA['r͛`ieV6yT=Ӊ2t8l::3։}ADD N5º}{K JEEEz5U}vŐJ066umD0QNq,8R.]F>>8|4顤/ں=.]RSx+qh4o vZƑM}ʲ^>`iek?lK+Y XZ٠O yts퉎vNxf_-lP~mo CCCN.ӫ7ΝK_mv톃S|0bFFF~NhocxV u{ ""ҝdzli@F{S{/HKKǓ'OpEL>SY7 Gvv_[ĉbd_L8q$˫gH?8c=ն1}׸w"؃ߠWm̞֭?ń/u,k+-5_7n`.$'{^X~0}\H>|ػg'RSpEDEmcMQFveöB-crYzI];+UI`hh>{?~ :-'caddqcʭEӦ_NwKlafIg~233]ϠiS3۩mk^ް툴Wm>8vL$ ƍ ָNIIIe %'EK1u L&R_gi7.7 4t{"j ~2DJOZ<{z}P\\=֭MѴ}mUem(Y/za˼Ǎ1,]z'k"":JQ^#dguroEPY`i`ᢥJ k]K-vT.S6e IDAT)j4i͚6EԾoo U[G;wqWmy5`Ï JvHRXm<_t١C֟. ?|yj|ADDT7O֕0vP^xsfĩ2clusF}.cg`W\{]ahh\{=r9 ^.!8809d*?~M>}H;9Ӊ/&LFG;geSmѸ1|4jܹgFuQN[[@")ٰl###ydpP/>}|ͬhԨ5ms˫'V,_wРAXZ+ѵr}}}vە^VtrtuRQ_>fL4mjCCC 4ӦTi5Ñ`hmZbPe_;gl;v@ Bk]NhРw[N/=%d"4yW[""bbbfK_ȫUYHvZG( \.-GIFMq2!DDDuV|\4MA-[#66v9,kW8qRy2es=vAtBFA(̬ WtHDDD8Tϙ5KDDDZ?B9I2w 5qĉHK NDDDD NDDDD NDDDD NDDDDٳ;+(cѸ/}*kϑAoZV"""T 5{1DBx1Q9C?ꈈTedĸ?SO8K2{"ӻ`)xaYZ`tu }9ss%%%X8N וGF;k;XZΡ3"5J/|5mcieUhgm\$""zO N%!t Fe[~† T1t?nRi[a׎0$1f~@&!>.'KB=kτ\J'&LRneRS^Ӵط nހ+rE(O)W?18= {#0rpb#8(999*|=sZ6 q9chժ%8IIge#0 FFFH7&&&J9b8~i|5s:ZhL3DigϞ=Ǒq .^,WޡwD7*Vo6GN7oyf禦*ø?Ł=zVy4mZl3I{;vF`ÆMkw4k>*UP(r\{Owڍ(((_z_3DDD NU`Dov-2iih߾ѣ|fJr5;NEÆ ew/oro۷aHIՌz3ajj(..FJ%LZns 3+ Ri?W9wdffB*-®H88)ˆ M[PPP{"иqcey~-,܁H>J$@VreCDDD NUp\Z0y4Tn~w:w '1qg޾፻wbʲQ puD78{l޸^Y|.A&Tt|I,bccucQ""" :]uDDDD?ΰFDDD NDDDD5KyNADDDDr#NDDDDZ*ǜJB'8DDDD5'""""-}ڴ$""aV H+Z_ꅈ5m:""""'""""'"""ke5'"""ǎgp"""""'""""'"""&坳ѸLm18^ EV6 JDDDTmTGDDDझ,Z N] ÆrK+wt/gan."""-, ]K+ꂍ@&!>.'K^8x[a׎0$1f~ 2y"t2y"S];`ddD!~|^eӿDV-addHJ:ÿ"""-,?j===`[h޼򹩩)rr,coo7+'"" B,RtRyťo)BaNWC.;DDDT}֬»VVwn*H$:>8YX޽L󼼼r\=77 6_Q`7:>8 RiDFq*̝J+"v<̬ ~;5)0`B!\=͵Ξ7WY}wyC/MӦT^PhBDDTqr8k/&"""'""""'"""'(a&""~#G3#Nqjʵڵ4T"tsܼW]m'ܹ|~,ltFڝ;wK붅{G }Dis>Ut.VXk֝". <պ9DD N̯gOv2w""bJy@vD"֬^m]e]RSww7JC z écޭ+~ܸEYVv--5 h/umyM[ %Tٷ nހ+rE(OQ)o5 /w낆 Mk|U9&NH:sV<|NoqNL:NNZ…8y"KV|LU6mݺ5 v!x 1oԏ?&{T$11 [ofR<|.xyz@__={nϾ9b8b1e9-~8e R!Fj"vG"0` 1oϫ,hѢd2Yz>6I-[a^vrLqipz1]_EAA ) 'm6nl0 anުSezi_U022BPh$=7ҦM?jsj3qrE]R''DgjcmR~T^Dg!qdd…˕wlo(/Z8>zY#}u-4oL99Tiٲzzœy qj*ڽk$+nU¶>r]tFV-ѭ{8p0?Igbn[oW6MSezi7lRM?js\|T8JJJp94hPw Whִ)<<}Tv##> 0p`W<) 1|?~q/[ FjbU9&Vm-0i~Xb||6mѺmseSejXW6ǟ6b5WBvvN_p ·oEEEIKKWQ>|Jy0|?̛}Y#naa{2]8|(qo8+nU{gGΥ#,YYY 2l4OTXk+m?77 6srÖa(,,Dff&_R?{R[Q+O"FFLMMHI!S˭3{dfeA*-¾]Yַ`l WKA/c lܴJ'2 7V]͚6;>? }zm˖J:d0]N91&ڦ|LU6m;w233!aWD$ݏDD Nŋ!;;z·`V) |sn8KVX1A8_y9nႹXz-l;ai3&:|{÷ t'Nbϔe˗-CG V6O^ՄQ puD78{l޸}4W8)[cL^h2U=ڴ}wݏDDu &&Fၛ7PPVemZ#ڥlg]u_aш~jK+Qqo\^:B,EkG]7W۶c ""5:Zɹ{ ױ32ϰ "ZÉHԗZZTy~q)iKF mXE k5^WݯmԦWϿZ"="vAteD#ku_Lcv&שq={6x䉈2/ƕ+W`cj32nbǟ YO%ZY~h :# h,RSԱq{Ne繺{ΝoIgݹsn=ŨU嶓L G.pma*.))špl0lHO^v>i_+WF'ppsC.k/f2Rv^L\ѶN=Q*u޳SM.u}q`股87[OXwpȏp##Jan.DAAzss5֣'"Wi͚5qдiWCS qH:A3yV>!+W"-5 kl,~ڲ׮^?!Dtyh]DDQtԮoAlݼW.̯gOv2w 7mL&C|\4O'.{vUg+lXXX x ~;y "k~u?T*K٥mY_᧟”aڵ4Sں*=8g_tE<% :w G٤S'W86j==|;v;5lM=N~ 'XnVXQz*^MuoFX ccc ''GYnbbi`hh#AՑgܼd2Y7ǏСXhѢ$&&xÌ_;`ddD!~|Uu+}}} 8h4Dպome׋*ۖD"E1utT8@菰iV<~ ɰqHz4DDOg!887niӠ_z:s?~pEE aǟ@^^=UiٲVqrvB]>r]tFV-ѭ{8p0?Igbծ_vrr@$zvjX[߼y ͛7S>755EN΃nWu֭l?ӯ־kBZ{U}l#Lw,-THsE-Z]C,q sXcOdǾaimڼU={""N111y&ƍ~ ~Žذa͚6;GF G| `!cy߱ &|e+V97rCz6re[D"m*+2κWII .C *rիڠkeW=^ٷ/uNksξc2FG3?*SdnnCaƌ000x[p ·oEEEi߾ǂyo]Ӄ"vܹYYY =A611Avvիg^y^^^ܼs^V^c۶>m߁j˞ںT tՋ:-\0V}'L2 c/_KW7XZ(?TL^6'hyFw7˽1 B{k=6o\_#} |sn8Ki{/oca ʶ9弦6m׳f25qjꗀp G8r(]DZooj R;4DD Qxxxf ?$Vo^DHv~WFи ~KGb1ZYFllnMMc"""_]u EDDD%q""""bp""""bp""""bp""""bp""""bp""""bp"""""'""""'""""'""""'""""'""""'""""'""""bp""""0>.JDDD N(18i#-5=JDDD:sCDDDTok* """" ɭW>'""""'""""'""""'"""L. "",l 5,-5HW) vB Zᭂ^st_ټ'(<<koہij1z0Xi!z_ NDDD:JU~GWQ. #1jz:, vv%lW/'"""ʃ`bl\ܿw!h19lRS1ooܼ\<..efwb[Nsk<҄7$""T݈aC w ==̺ki70My7! {,?\ &OÇ1nb>3~ukVS':_ NDDD:Jᆢ"83 +3=] =Q`h(q?QPP333Dy 6ջ!ܻw~PǰBO y ooD/MxX>Yf022 IDATF~#] >-Q50$x4:9;s T <Dz%%%X8N וGF;k;XZΡ3"5J+WF'ppsC.h18頪>=x7 H oF~~>!cOA|8))hL$;Ֆmܴ2 qH=ޞXLY>~BVEZj N%&MQm $o'A$aktLUGP|}Ao@l F~~> ahhbD?>44@AALMMݑ ###H$b rH CCC1F)w삗a``PӎnJlHbe.!14>haÆx0ffM7oyf禦y&ø?Ł=z*ӯ־J.T18鈪~Jlx*\u_Oаa#O#erxpžCG}zyVXWǎ69x{_&&zzkծ(pH>q? @)РAW_RQUa6Og{6 addP###7/9í" Ħ[QRRRڵ4@zw}-Ӿ}; fu"_*[!;;v!89ݿJC!z 1024rsAN\`~}|.] \iv|>~LRAظi aOd7n,o0ם;] ꇽQPXXTu߭Ǩ5_ NDDD:H]petyW9dhh!I|2&F%/ Oyy "IXz%1)d*l::oNL†komO`(B{k=6o\,_l :nQ~Νtb.]Xc &&Fၛ7P\T <jK+( _|) |):X T ņ8}ƌ G{[/1qwgtvCaa иxy:N_Zj 4n0% b,Z#66É*mFP,["+;MhBBGÇyKde݇ w| P(aZB@ Plcm/M(mFk,Ϛ0GzF*F;a.dO@^R@6(*.F̱j& pؐZj4'"":JԬ / ӱpHHHOo Gnxc  $ l ~EǏԑJ}ߓ'O 2,reA-Ɖ]XHРAʂ>6ܐ!{EDDD:4iz2Ǐq9XY@O1"""^$P(u?BO}@P\nƣ|d2տ44d2x"{wZ}ګB Td爈^kԨ:9;L<>oIENDB`kildclient-3.0.0/doc/C/images/mlsend.png0000644000175000017500000003104111715730227014745 00000000000000PNG  IHDRT pHYs : ÀtIME  IDATx}2Ch&$r1k-aزNP .B"c)IJtWtT'H1xLV]jpՒ!YWZxJ癙}fofDL^9%e):ZhT)KB = jo֏q?XCӵWNb\WW*eIy"RP6枖oG]Jj?"Hqө2e, "DOCQ;?fI5g}a6^.|?zI(% 3*$P :}Q_L2iz2 TݢԖw?gߔ"vT![׵o<7Dc($UVZ F>%q,Z7<=Xo_?̑}fڪiz亹P--wD<?^>-Ǣ2u LLZ ~'~*eKW>sgO9ˍ''I'_Q3e y~&?UUZdž;[?|q]?H}_N&Y&*7xIe? Ӳ3e0}W&eʔGuca@*''=_y࿹=jjXJRpr&se6fBIY~,*D2tZD%ɽpZz׊~6BKˤ{o_9g {,XvXf?I~Y>g?]Θ<gMSSW֧.o0"c#Bdy/ >|Gٮ!V?~FmG~=g#b,c'˿*F'~FU't,?nPٗ_ec,Ũ¯@ʔ)\OЏE)яEKc?6־?~\־TyQ3:֛Kh[{kkڡ+WRA{Hu%3ښ&22jRIm풚4[D`־4.7Р{sz}Mew 7 cۊ(CyDDe3u^qDDJt)y?׾u!ߨ~:Z|췘jvYD(uk)S=:e]*kEkQ(CJ'R*+ChvpiyWn$""O\Y(]%R='2+!W"r m*ˮ%ږtФЗخr]S[iRq w:oIZhM.NϜ Q[q]W)u}??q:=6/\~GrepLԡ~ZAOUҽ7׵Q_[tɕbYfeGHSӒRYn/ngrzJM+~1nuUrSjY|O \1>\-^c_+IQ_P[^)Se^3Yk"A"^mZDd /چN־|W;wTsy]W)Jirߕ""iUYuf"673 S+8ODgn"}/!xK[WG=?{Or-8m'jVZ}}/ߔIz7s_kUxg1WF }oҹ#{){ Zu/]tei%"ٗN\Gj'j^)Si)OR"~U`INyUu95ͫ#V ˬoކpsyR5M;E'fVu%USqZ)(\4E'b>,:Մ*%Oku!Cjp=RIk5H[G_TGϺZe7;u;m5;}ɿ>RbxZ7-_ZSt]\&nYDdv*2M`ٯbxݏ'~h V[UnɤLM6ԬIȋ_{0HpCvybJy581 HD{ S M+DOEeWtj"vg)Ci'J߾68iYte\Z1%ܕ?BCQ[&\.[3W ++1mDDqkENwӧ^ o٣fSDxpkѭθ."r7?/^+/K$xF2eڣU x/mޜ> j .}gMKYeƵ-'eWTh)k'49= "Dmur8| [,7YEKiyڝD}SZSJzqXY~{)Bk⮻'Op9P&N^yBn~kFU8x'g^zՓ ^w} +_}+ju!hqWdV^DN>3y^pXj_-][-/]ʔ)\rӨ\hX9E|mRr-Cs'9=qq؏;Eyxj֞ɘ[Κ1|V#̪j+i(eq|]'"ZbbZ~TNnYHp=ޑ}դ>7U[nZ!\\Mw\:7 2Vf6ʃBr_י= ߼`=Qܹo.{_97Oݭ/Nϝ=6ݳu7*}7W\kfoe{m32 %9vtL=wL>qq͆Z]о>}Bz~cc=w /~|&cBpUK2eʽ,{Z<_;=f&d̮T&cf2)ky0I+ir"WhކՓ/ZKGO/Q&v~Qkh.*McnwQ{=bzw6s`JMXIxL\YxKk_o܊":Ȱ+Ԗ׋3(D>[Vά;.S.ZGMXzw7`kuL}S2ʻKN%ֽt)SӲ^6nZ|}R7Tiyx:\{pgj1;&EvqN I[r愥/ٲE_4{^s{2/]ʔ)\\] Cj輤oܼʐBgkW\8N}≼zKGnw۵.Rv*M'2j"2YSeD5E]eȥҹI)rni]<Ѧd:ڗfԩg.^R{r2fKl2eڷ^t^/Ti+g .-7GOS7 u~v O+\Bպ)Q;ERo1gO+x,+",uq57{RT53)sYD* C~F-̨kHOWWһb͉H!SL{0qʶD7Q*3ayR7ؼfmKjiH~-$tp 6Ѩ=A0~3$.ף:o^,:޴`_h94a$ϗˉYH $մYi|\G`<_gҍեg>c>v۳nh`[<H~$?`|_QԡR4ݞkV><X}iW|. 3,'՞՞C @$?H~ @ɏ3$?H~ @$?ɏ @$?H~ @$?H~@$?H~ @$?H~@$?H~ @$?H~@$?H~ئgμL:ɓ`lԡ) 0^ɯT*eH~\ ՞$?H~GEnRulp+p;;(a$_]x &ٶ]=ULm죄+3jfVbLVd91KIVxo^nR}1=9 iT!~S`Ȓ_4P_hT ,'\5 7ݶ66/N$ܰ'bBE0R/-aͦb*$YEN6o7{[V`d_Ɓ2h>b([zq$?Gw?Wַ0+)ĶWG0,ɯt }<|4]BMߞQ8&3inɗnsg4]Qdfj$߰:\`0_jז 7ʻu;{a.gݞIԤI u3n$`41M~K~IK\شv{6XDnU}kjϩCSl`Um& =c=coxa `A|L]WOip0uhJs.ߙŦl}+gC?([hZ)s< [K'~sI~ %rlI Z-|d ;|]YL wmCuE${m>lwW>&osI~2sp]wӻ/r-46z#Ui+_T/̳u2Fܥox1D Q",|ٯ*yhd2#̞LNu 懛l^7uCmE(Ctٛ|;!ڗSYwݙi+ [c6kNusӳh-ŇEkP"bF%Y/mwO*nWf߆MZzn%/3 dmQ3` `_"_ʱf-I'fikBoXP,}H~ IDATO<__[*G9{a.g /金0tɯ={:5:~t`oɏ_u 0b/՞vnTTjZs XӇOs)Iv~AD&wOҿASZ/%՞՞C @$?H~ @$?ɏ @$?H~ @$?ɏ @$?H~ @$?ɏ @$?H~ @$?ɏ @$?H~ @$?ɏ @'?WZ/wN~F7}x.t`\ԡ) 0^ɯTl'`DW{.q''q'`(XV՞&W{W{H~ @h&?˲Z}4~f&mWk.[;\cbK`eYm(f#jm<^@oGl߷ПgG0(/ {d9i_xBjV4ߒVIxWBRZ<$BB %_f'(p.xЋ䗺ꙆtcuY: nFHh'g 3SS`Hw{&|>FL7?C#F/K~Ý^i0MJɯnѭ5}x/:03?jO!H~ @$?H~ @Gg$O~Ӈ8'?#a:4E+J% 0ɏc@$?F-Y37iZHK,ti'0|ϲ,۶pm{Gбǭ_dj25cjkCoިBuj]5і'F۟$PoIC_NP- 3QjRHCD.-TYT_ӼfW|f|5ccL™=vv}Q=.6\mH؄$?َ+#1h`?ur5P?;({~1'$0au-%~1;oc9(%.׋2)atwi=1" J~zfzp4M/3~cˉSn(=]y mH~>3:=ӴfLjêG@ݯ餣AI~G$VVWFz*rMVtGt؆8c3 ][Wğlz.tf ٜ:O~_q;>XJɝjg~]I!c݊o`ے_ϯ擞 jm'<^XWC}{W|fӵI1z{㻔Ӟ@_ 5=5ZxNǼpo<~+nr{̦]1 $mU^p9rH/8t?Q?VS|?'?< n$><??Mf() mCS߃|}H~۩T* ~ӼFl1I~;0noW{H~ @$?ZnOWĦM wYF8ݞkb><]?W{#ǯhH ۲= # _^hP߬rQg0&~W?Yg"CR%ٌ&vvj7Zx^jYDp&2Z "G3iM+$Dd-1#_U˶mF%M`ē_燿g"urvնb 6'FQPѷkO*ƒX3[/O(5'm<߅[ۆox$*'V_CoӅwex Kcj_x ["OE>ZYf}ٌFulT3mW$\x'ִCRWW=Pn.}=pVn׋oxޛl'gI~Ӈ^ɯ=Ma<w!Ag~rlc=?%?~@Cg`0IiKz_{gvc=$?H~ @%?`(,^;~8^D&?`X,9vF֛}C~C0| W_jW{(c#tBK#H~|cP㫄#_|%?>0]ˌ7ɏ= 53]879N̹ˋ$I3?#`fDZvӁss!#3̀]y$?#=9N[Vl;1zǧͣ$?C=W y̞LCfd6g3#k6Wvx']Q3z{ddn>?w9?Z2$Aظ\_h:s(:vn+$?0FGF 8\C`+N? Ve/o9~kɶK`YV}pșf:%moo|\g~FSוVQ!d6sI~| 'W s[K"r˲: ]$l۝?i_i*oz$?ksѪYsD\_Y5LIPmO~|`G7/fЪ?̯.9ѦQ0IW?9ψ`x״·gp}=1 /pd:%1,]A0t!PC01[:ɏox]>?%?>0dG.:!r3?%?0TF3?C#^NsH~5:!/On%?]jO$?H~ @$?H~$J~F🌕(C9_L2etاLCzAH2eʔ)8>zYnIENDB`kildclient-3.0.0/doc/C/images/pref_progs.png0000644000175000017500000010664211715730227015643 00000000000000PNG  IHDRNT sRGBbKGD pHYsktIME  'JqwtEXtCommentCreated with GIMPW IDATxw|ETB B H ]@QAD/J +Ho+5zo $!=wqwݽٽM(|?|rw;;;3;;gj}rvf3  ͸"L.Aa~ pqq" _9=wc&Hi~y|}4X,(,OUp N. 0>#rٿ1w~=sTi-csd/nd/S "eyW ʸ>ke&ȣ:}FHV'`!:{r֪Ӛu:n(o;>;Sόe\H8am`}uPbqW "fcC:*f= N4S?zgr2[&vI+=g%>CV_WWW*T?Ǐ4^^G11HMM}.cXPYc.HC!t:<>{`UwBsbHG,Ĭ'IeOuNēQw*Y}MAx[,UevP`lEq~^8 ' qA X,Zϰ93:r,{GraL*?Bf:ypla©E14k)"OC, iDPqW"\C6«FDP&E@Wm"<0Y 4ySūՇA!MjNY1kĤ$!)1)iN8XCQqwZV'A#oJ(Xnʠ:)rfbJX[}X ==P&LcƭUfQvȃ|tdT|UV'u%e+FΜQ=zSF[ѐM%S[3pjR E3 ӛTӀ#oy˹jS3%*NnkϯboZ&g-gH_nyuU: lemSpѝSGuTTCuJmi֚ZzTàMծ {&=|v癞S&3cq3+q5 w(Qrx{#)) G7o^/WWWAf׮^ţǏ;wn,UJcǐd|yIOOǵkcɝTi?~8R\\\ 內Od/@$dB//C\2%Ju'BBBqhִxTBǙim8i"/0p9]1i԰ :#d-1H=},/ZxɌx MIkD]d/,a!t ԝBtZiJu!,`G8LꇺBÙ`ҝnwDE?ɦDΈQt%xQeQ4-ԂINQ2Q,syZZnܸV# 7|Iz*.\ŋ]ٕ}iiiy}|I/R8<<<]hd}˲6֭[ɕ "ro~_V-ԭ[?=z[ػgWT9.^f3|3r$: ÏgJquIc|?C:1њWD9RӊIsK{/FP bCiՂGd #:S ɩ ' i 'S_ U9+de;- %gٵU&F) HXޢ!^0(+ciUǧ~FO?4eV4kT8A8f=xlAlSQ48޸u)bÇțܹ L瞢ˊvÇ7_L7ސK\8Z7x2ĄݻQAٻ9T9((UƎ XpS⿭"2'@ppn!s eeUG&ܭ 1E9E7Z/ w,=Z3|ԭ`QNp **T}6ug,2ddR;yTgtZ~oy@VgZ=։*:7Y=╱=|P%b(WY'Ow%- O+Vܼr՞~u.'^8T^'?doᅵ :}A$w(k+(s 4XT"MgznY^xAl $ 6\}u&!!9r7/RbOINFRR"'O 흩'O}jpeǡQQop3̙y|q%3 ׯPvF.]>}䘌3@RRW"aXx1r̉ѻr3QͷܿaZ_Ôe>ũS5h|y'Nq2ƍVhh)'~Ͷt9sp ̔R ={QҵqL2 - *`($|2fϞǏ#66AAAW/4k\zN83ԩS5?'7n,ݳw`I8v(bcc;wnTR߆ HIgHL 1 HH ̐ʐjAB i i$[%ZG<f,bwO9"^kvE1ygqmBFxqͽLSq)>-O_h #~V0QyZd33NJz&˗V3h((Ih]Ɛa-O\* f!O7z(NJ(GHŭ5U"&}ʕXz5݇9s ((ׯ]C^GpsAG1n6Ej^Dٕj…4y2ʕ+ș3'"8RвeKEŎ\>nDTѣG8AD 8mqș7O@BdRL4 C|+pYt4 [0g,4k\Jwxn(_6lL0 hղ%3g`]b#?`e`$?Af X흪Yy}[2ˋר߉?Cs̛39b=a/.M:ctz{T"G,PBv04lj7^n@l0kf L&0p][-[FBpoBhn W7W̭Nl,n;7ocF!99ߎY砐gYvwCjj*LM_h# ,m}GѣG` <&N%=EmR\l]id{nVn]<|hɓ'Э[78p/_Fy1ѦMI]}˖-8s4qt 1m?j8]ڵ+Nk׬EH`!6.5WC"Eq&jK.]ĉ_6 BB^à Zn]4+(.;WY 66ժUE"Eifi͚5(YcHNNFŊ6Uxn8rϛ5jpͻ:u¯Gtz/ӧOQJe)R[l/==K.C|f-2޶ lu Hq:ozvAo e[z7Q;Jk kuFDC& YY9COD9pB36*9Ao}w4Ͽ#:+3=A09-^=3ߒڏ,\.6ڣ)))HKOՕظqoEqm|3r8>}D ooon9"ݜ. @(0Z4?1l1+~|3b-KY'3a%*@FC+:zΖ"LOEN5() 2qHlU "8|g`=X(o[Ǻd>c]v %wM)3՝zԴY =s O>'EKp,\0`&Mpq1in@;ݿ'GHqu ']ˡ_#_|Rܢb"v@?80 _huթp'˗={HP ŋcȐ!HJIƅ;Gy|818} ©<(j{a̙QVd90>"š72uD#G-yq+/^#cǑ3gNȑ_wꔩ2u*>\x/^o'ObժՀ $Z$3||l>N)i$||N'8~8.B6-Z>Npm1|)d= _ [ܢ蛥$pHUA'2"p$Ҩj_!EcZѸ~jzg$--#2Gg۴8K8DAvQ&^D1'Ij 1gVDZ3 t!.9ψ$ϑ',jc+#+0^C@޼rqu5$ '{Ν;ի?_}شy3fΚKa+iK)V/ǘ%hS&Γ%F+bUǏɓ'PvC=h]+iZfĉ_QN]oO \X=ǎFѬ]D-[ǎ_^z,'o^ 4Ww9KVE]IJ'8y gz)><{@Cts/Z/NJ;gM9ݍ]k -^^u΄UI?)ݜDkKAkZ),c`tUM ٺn@ț} ӑ 77w~~aX*¤kש o//T|2ɮ5'ە(vuk*Z,' E6ZgqXOIi4epOBN8-;ߎMZ(F@вWU,#m_{xwL8x뭢x!?UWa%܇L>5н{7L8GѢx!;իWaɒ+88XΝ;oń PtiܹssqC~ѭ[WL@5WZKBw:B6ZhJ_T3UM|8: hot꣮0w^#"8{wΫMԾ`Z;dsaC,.%yaRO9i xZAiix53xOhw9nqְ΂XQw=0/0O봮翤M_GҌ}n8TUO! >>& 4\\\Yy|РqSSWQF("m#2VɤH3 D#w<Q#3?s 5C||<\\DiglNoÇQlY)3hY/|nGjZ\+AGTP|y,YsFxx8={___TzUCW|y,Y sgRQl^ޖs{qhuSspeʔȕ5g6>/^{Krtϙ= ݺu;1pzꍥ˖bnGмy 4ȩO vQ^&strK0}l3d> *n !L;$y͌ê ૷zJ1ʗڟG.N6X#~A VU ^QI:+lyˉ9RKKAe<{QUjRar #"xzzJP !iiiHHH@^IEiSǭ%lX*uxj+o%B'Wn@h\\ίF2;g/{p (̾$ٔciO|Ez]!M}Rҭ{:vJL1K{6%1NlqRɬqb6&q>N$JV{Rgc'&WLnH>.q:Md{cH# dL#/Id9IYS+*>{TB L;ǔ{bvl/#e]*R \3|Sf˷(/cAJ#f/ؗɾ(ؼArUw) '&[b.THZkW"U삭eAØ,?۴^kdZ.RDl\=1|Ls(Dx[-LVεЩS','Ȝ#Pg @dPĘheű |zGyy!?Yff2;o *&Ncq71gWّfy}SX̄x.k35 ޟz{ZN|Vw:UBwT:Ɛ/Nxl6cήǛ罆 ZSܚKU(XT=իp|d[\`NO|+RSSq<BJ8M1>r!=qEi9~OZu޶*w\08`\=5b7۶XnxdEҳVZ[HvwVېD`|kW`t)))pE-*))ܼ0uݵm/_>xzy:'nQ\wHMMun)d=. }ub@ހxyzڵk8wn"Eo)əjLzБBll,:vhەpl$3 ||0|b ׭AoZzhsif%1liy|gөLWi˘PV&8WϤ ҵlede|,G-?"[ 4?RǗX>Ku*4v`aDXE*=X(!{l bhfK cbN|9TEQKqeKe[+G1=~z,34~Ҕ04"Ө#ו[2!*XL ۮpnomKk{,ASi\L٧u<,d(UiHJL-遮Sll,rş'LKq]GJJ2j [u=4[dʟ 9 gMB]H0X~vv>2Xp x;m;)2aAVϙJe6B.YMcuѳ8A<|FJNYڴ(Z+Mka4Ӵe8e#o[_[sQt2eY&28\sθe_EnnpusfaHMKEJJJ?Ŵ|]\\7776LMKEJrrK5,ߡ$(V.&0fAjJ*RR^Z989yi4||riw3; YjɬZa8Z4 ߺ3JSș|ne}޲2+Cebdel'dV,[:6EN0٦k,@i̝n&{hTE)gIZe(zivVیZ2S5ӡRJNJT#$ǰTԖmƛJW>V3^tQ,r60 ۮCISX6d;V"Ym;RksEyX4g|qSRb,  xz9vT,AA DAA‰  AA '  NAA$  H8AA$  H8AAp"  DAA‰  ÔIb+S!a DlD%!'8$^:GAK%ۅSЛŨT_ 7]2&߻non\L7 H8YR}ԨUzzt ^Fd-#Wr8r AsL߈dqbGAAtLʼn   $  H8AAd/{ꥭvq{>ҪΣ n:d0<=="Aiͷ3zխCw 9z8o .^nnP<>$EʷHKxޥ}?_.ObAJJ -Ęa1Qj@ޟÝ WG8mݶ ö;I8e#k뉓2x .t3t "&CvYKIǿqQ>hupҩ Cjj EoT@Ad}Ź1x`?=sqqt ax"0LpGX2W3d0Vf: :L  UL8m*U`̷`6c!X *TFKEGo@R J ;s_AUPT5i8\M&b bX*J:ʕx~2 +VA5Er,/!غm5iШqsADFwrg(Q* !+v.=ۢ(M4= N;wAիb׮=5jdžѢhԤƍx৅Cq0etEgw k4nkaׯ߈FMZޟ>g]GԪu5R"P~c|o nݺm8FD)*TQk" _Y~1>b27m-?@Ժ03e3oB4nx+"W9LdGĒ%$pXdF)MyyH)Rٍ#d2a欹8Ϝ9CIo؄[Kǩ~c_ڵkAjGR~, ܥRRR H8emwiMav0{4DD9 7pBX6WdrϋIG~3UTFUش! '+%[#e;waN5#G}+^ytBlڵjb7c ("&G1>b2o؄7o:3r=L<5kTÆ՘?w6mު.6mbMSJ,7 ;UB:3حE?Ĉq2t8z";v3gNi58ݾs+[V} ,1 ,hQW7b)Eۏ>gGs>y oRӿ__ԪUCYn؄ӧ 4CvT"?~ -0qQDqn4 0|=~4FL&ˋ/A4ӥWM?v4<<)VCѻWOijZ50u \rEmR }.ܹss*5 T'Qtmd3f] "rڵy~~~]G9(x8KPTI.\o1" gMvWtrl۲|ʖѴ:G#|v&a-Yw._H (S- )'OJ,Y%K@ܹh, ũvqq{-cE*|=l(֬Bn >dc&^Ξ;w7wؿΝ^rEw`xf:f̜ӧPLi8M{VΑSPakwfCBɝmzjz7Tf1Vѓ1d0L___L0CCRR2׮_Ç1ۼu둘$̞3?W||rbHIIs1pА~+,\3Q K_?+ E-yiּ5.[w͗ABHv~tOXׯߐ|ݏo݆ !WGmR÷mہ6mZk6[eNSDL#$'`Ӧ(2uoެ mہ$$''ce7K鸷7=T\t4Y9GNMp! %%7klp,LEQVGOztGVJMݺvƳgPNCNu;+&O\aڌY([=Ǿ[pqqAQf<pt ==5kGڡyS/*/S~MrZ VٽL6mȕlٺr$'`|=l(r΍a"lLZ*>r4֩9!aݬnݺx}Y- zE[zz::u Ǣr}}ѵ[O,YkƢ-dBInUF-`ÆMHJNFa՗NA8q&OQPAtcuVΑ~#VQYΑ1xHMM"zF\~iiixh֬'663gþ}Eѽ{0e<X#Z 777tgž]Vf=\|ؗ@llkM;ѽg?`tz^8a`ےbҥ#Bc/_N᫹ev<6uD5?}z OpssC@|سgϋNYw㟂3nbe$^"oS#5D|3,icɽXj瘄AIb!.5o;v!55<%QNm*O?!;hڼ0pT0$55QQEb1Q#Gì0nDx{{azӻ'Kf/]3MBɒ%0yx* rpfvȾ^T~b@xٹ}3A :  H'ƬAAD.#8AADڎ$gm;Lċ" !"KBGGvyY#vp AM MAZNNAA$  H8AAp"  DAA‰  5@s  B2Y  B‰  AA '  NAA$  H8AA{0Qzm<|]; ( fPIIIߎ7nDM;8$sc?GQP&P~= r AĿũTɒ/.]$@rr2xɒ%^zq_Xt93l$  7 RVt&~?uښ8њSXӅ 9y.qgvC5  ‰` -eF6)@ݺ&J,N7P26o]fըR*WKe*} b )j+St,8$!Xj Wwmݺ7GRahԤm){Qs?,DpH(fΚrCBn?.]BvQty ]qE:^Z PbErm8RN-N]:waq`8,eNwĠCquҥӷzþ11c3Q뢝.4CBQlE?*ÔNt7'C@\z r*~4hP~]~4lh 8q7"))A_JTYJA1©pBɉGr*^?TZy+Wqmlmc 3fζ "p嗃ViS6ѸpjP[ JSWfX2SA ' {H0VPLifD\ (Q"D}[JG>i{9r'=4Nؑ_лWOf֭3<==P`A3g_  j:tuu_XXY'p5hS8) uZ xńSh)} M0ԚQ6nXq=~ܹr\\\lgϧ0+*gN B"%%sw̙;)))W c/> ˅{6}$2[A ' W0#Ç1p!!SLƅs+,Djfϙ$̛xJ_RR2.[w8^5e3~N7ժVAހDhذ_|+/ƊeVڵt IDAT/*eN+AA0Sb_YX1e˔ 'ݺ`!"L:1oLos.9=wu&FЪes_OD4(Yo)LjUD/_PB9lݶ^^^Vmώl2SAAd7*X"Gܹs#( ₐb9h CѢod2!w0udnj ?ΝG@N pwwG…^8s4S&xH\]]\fU*KaPfu@0d jՀvڏ?v􀻻;WᅬRYA5ݻwu{HKM$d)JTAA߻{k丹[8nnnȗ?{졗AAAA '  NAA$  H8AAp"  DAAp"  DAA‰  AA+Iƨ@  ]$Gdq" 0u;NAkN: H8e{EA)1\|Sv*AAd|  "81AAEdq" 0k/ALA '=(PFC QQQcGE5_v k׆;*U˗/ӓNAp;vHΝ;yfL0Ao߾1cҤc_rr28ł?\q<c 8r|}}_*06lݻ|o0`)\sT/Fɒ%?;۱cׯ1c̙9s >>ѣG[N73==sEuK۶mHmVql4iR:e˖x1>ctڕt "[v֭"55Ȋ+,ܿw''unnnD֭!cp5j7o*,*fYaqmi ٳg 11 ӧO[nW_}C! *`ƌhܸ1"##+VHaQP!޽ 4[.Ѻuk|Gǵkא3gNu._uNӯL'xyy!11P|QQQXlVZ-O<';wnnAW.ϒư?/u]ݼlgϞ?~,YR[ɒ% N1E7VȮ鮙3gb rʅo3gԫW{QףZj([,V 6(A{,N(:L@b$є]iy%==#F{ 5ٳguWl8qWNA-iϞ=h޼9;70l˗ѫW/=Z3bӧOqI9;v;vLwA8|0 8ut|޽;[nӧO#00~~~AG(R1o<\x1U/TlEEE!**J*9s^zccݻhժڵk{3f믿1sL'  EѢEe߿?:|9+w6L ATT(P;ɓ.>}'J=zk 'OBj׮]~C͛7oV߭ 23tP8qfBPP-Z%Kw[4ӯ|VKl̫ݷ.0e9Rq8;'ix17[Fjj*RSSѺukDDD << .DNмysDEE!::Z%KĥK駟bر5j=AsZ:-&1>|ժUc 8s h1b.\+W*7oݻ}Xd 6m$u QF ,ZJŸ?طoqmɓ'(X|b+=fx!Mo߾9r"OѣѧO9rL2Xh\\\ J*~g)DS`` .\pwww͛7[V+#F 66i<Çǰa4lrгgO̟?ׯGN4ú+,XѣGcĈ3f >AsZ #FW^SxTT:w5k|||лwol޼Y7ٌ7noAxx~A"~gL<wޕ~oܸ15jիc˖-HHH@BB6oތjժAh֬"㫯Bnݸ֭ 0M7`i7nDll,qeao,W|֭z-Y{8}4N>@MO=AAIN>}ХKԩSеkWZ -ZPS3'6l|aȑNq9X{ 6 ~-qaߕ  99Ysd4d <} . oooijg}O=3--_~%ƏS;Y|9"##/_>p\͘1c;wn/^ ªUaL>e˖ŋ' ̿ljd<1hw  28] СCX,T+łݻwsw  S2e ڶm;wxzJd2@{eAī]1p7ҺuknݚjsB  NL  0>NAAk5Uw# +-' ji@&  ^8DAA‰  AA '  NAA$  H8AA$  H8AAp"  DAA‰  AA WP?lݶ#Ӧ33!y/-e_؉PTة8vimב*A0?0{3sGgKپc'Q|9*$q  Etԭ!%(LޏfR(_ |;fYߊU(W2|Ԟ{=^ Xik;ojԪRˣCvtb bX*J:ʕ4nݶ@rhԸ9~ EM)\~=?D04j!N{qϰvTZKнrwV87]%Y8+95kݻW^CpH(zB{Uz6*7G_xn= +/2l~f!+v.]68{Vb6ÔirAӿ6a3q S}^:'}^<E_vȡ}0L9k"3gЁ=~k]{` q4+V۷n_ѻ 3Dڢ{wуhذ>&}"E~Sqch} D߈ :SV Ԯ] ůU>b{yXT0þ+&*!& (;I2je "V$*,{)22?a6pޯa{|39ss.ǹhމ=UD^UCEKUbR1cwDNep!"z٪܏6 ~ס76n Q6eW۞ax?{n.>cZ獺S$8z8D"|m m۶;5I_Z ts_ю]puqtuu8qY'hR z!]8tuPe ;000Ǝ }|vc044x!.l}CoCGGFA,cyhݺ8;a===!pxdff|l.\#tttТ[3s*qHcNR%&OС߱v8q" {hҏ;Z.<<!*¶)[b\#?/```Q8|0⅞eoYҖM!hdljSsT\ƮaiCoBPyV-ծ:OW[nY&&&|$NvelBa4&6OFJm\zUdf>]sUPQM[MbR۶>r=ѦMk881b/b.b*];Hº*[b\,[AZ-x@7W +=|QF 'uMK m%%%'\GQR6쳼b_q۠hНaذ!M4ZǦX_HXlc+o{u*1)c =YY 3O`LoH1>QUmg'؍Wu2gCsÇqQؿy'8!Pm6|ٮ) \njJgggX.Y;`p_tX,Vk{cccdddH߸/"yi1҂vAzZ:z,ҧ=ҰmXKUQRR'9h޼Y(:w~Xh>~Y>[&O._8Q}}}LIAZZ߽|y=Ǝ VʨO?_8X X;vbȻ>|)8cOx5jckbb3(((@|5̜ZwBȖmCjj*-^Vk"e% n`޼/5&vv6Xj5|daXvt"h%HMKC~c_Ww}e1W==u{ ĹZ7pF]*O'"&NJM9|{1O:\2aX_7t_bwKժW2QwǍ?o_7Ƒ#Gf*B!\c/,]K93Dv"dddo euP6YcgKMѣ^jLlmPTTo 7 UG1 =sxWw}e1W=V.CGЫw?[1ιeɬ2ð'Q 8;;x)HQa;tAr5F^11h"!~IWWoh('""""&NDDDDL81q祪NJyڠ#-SW׹s1!"&N MPL*cRqeզvQ{$$FrQtqtb3s Xu'!!!QN.y7afn 1/sM/ Ocdzc?^=/X,xM'>/+]o"o}e}16v[(IX,deeWYuݴ)N.б+:uc5:CUV*o0k^9x%]r A ֕V=z +{u)ʖ[`G.XQ*Qy Z2FegOg̖ b.J݉Ν:",lob.|&6 ~ס76n .۶=8{:;HFڧI}_6,_iR2y䭯,s.ǹh)sikfhذ!N>+ ԶQQ-do\~_&U~Jي<[lîm8{:FFF7dzϞD_g5t|gY{ ѧO#%6\*,!!obYX?e@~ҪUKx 1qNq d4 77Cy3?deecG.̘>냕߯222Ѿժ@ rYII mmosIGաh^(..DBc/ ?7eyVTj7uPcu3 6#0p<i&pvqTʖWl:*;/^yCD:u;Ν;,_֭Ohii a =-={٧=ҰmX&TQRR'9h޼y۶mBQ>ꖯyu)OY,!}~FBbG"))zXT縪U)[1zXfeeAK.ǎ!16!e?xܲ4hOTE7D鍭vHܻ_}Evv6Xj5|d|ycu՞.AjZطJ`o>!??~^5nH$c!Hp3%-T>͔W*2euXtBȖmCjj*-^V7mN:mQ(j<Wu*e+j< .Ajj*ݟY#:  3g}*ñ}NÇX\Ḩ eS4'Pu86V\W~03~ڥ7,[[|QXXX1Ӿ/Μ=M.0~,rrrЯz: 1];["(h ƌV}?齉WiD2euX|l222зxxzcPbNOJJV:)\QQU)[Y+rww wۥ˖.Yku̜{o̶|QTT~.OO!/ucl&DYDu 22R{w@IqFɉUzݽw!z3s+~VV6SQ}8&MNK Eů\[wj逈}PPP y=Qĉ~\rNb^ IDAT0aoaս'<CCCM(w+W>l6LLg`W\<(l?nu.ߥWdDqq1Οx'ʫh„C-ˉjkqU ɑ&e =@ oMDDTa&"I f\?]8~<5twǏ?t;u,;dg?e,-x[W}_Zga޸}d٤|g~X#WܼUK8']]]n""8E> A֭dnjpD$ ,t|4}&Y!tg!O@7+;ݧteۄ =v큖N\m}Q# w1etxID<'Lx6:[XK?A7)Cd""8]OiԪBԶ4qJMKC\e,\0ݺB[[LMrŷzw|3o.6lM`埪suW}ֆY{=5evvF߾}%d#H'/ Bi'!tBo6D"6l?a~wDDD/ 22R쌻wnB kߡ 14o$.}/ibEDDD>yk~kAtuЪukDEEK~_7999Pz^"ңW_cpf@8QU 8TGDDDĉz84A,3q""""RD__VVVo.aDDDD&NDDDDrpHEI")!"""rW(̡:""""eJ,:""""U8'""""&NDDDDL81q""""?_Rƅ9I8'""""&NDDDDL81q""""?qDRFNDDDDeyxʼnHEЈy$~]8ՔA٣(DkLj:DDDT Sq""""bDDDDĉZH x1w ttt.?D߾}kd?7oބtuuѣG$&&1q]FPbĈ2fϞ˗~0tPdffbȑ?~ӧOe˖!007rM0fxzz"<< =}tt xh"iB5oȑ# !!ٳg#)) M4WZ˰dffʝJYAAAС>S8q6lP_~% )] Bll,lmmLtuu!abbذa,,,p\~HCuvaÆ8rb1bccPi?G^^6nX[oa󃯯4aQ˸|2ƌ#`ii~ O<ܺuKfyE|-Z'O ==֭Cvv6}=Z:HDDD&NIOqF̟?=z4>Js5.kʔ)vt| ,Y-燠2۷oGhh(5k@PiyEGÆ ѱcGj vfXZZb˖-DDDʔEr#AddSRPP .ͦJ4*}.HN}8&MDO 2)))prr­[шjPr5r )!^^C붦WXQf؍~J x7ѳgO:t ""bT0])nP'"""U^'S##""""&N/TDDDD/81q""""bDDDDĉ'"""Cz;ɳ""""zϏxʼnHE"w&"""zIdWTĉ'""""&NDDDDL81q"""""&NDDDDL81q""""bDDDDĉ1q""""bDDDDĉ'""""&NDDDDĉ'""""&NDDDDL81q"""""&NDDDDL81q""""bDDDDĉ1q""""bDDDDĉӋffnGUG~?VuX:!ewy^Qm KIJvS?Fye^[1"ڌCuDDDDL33@D~8üS7tbǎK.?lѫ/c(..)oG.XQr'MBA} ot펀1q3%E˾]#G#9_:pӧ"|o\zTۤB=:u;C*Yձlsacg^uǹbܕA^ᤊCYPQucIy,$;wWoGXg,ڑOJb88@VVvY""&N[6o@+6}I ۶gOGs OȔwU;˗Vڗ2DT~ لWe>۾c'7nG 6<aڴϓ!q\,\|J2C_)6mR4fdzϞD_g5tJ~ \]s߽aa{[u<Ս&)N5-۰+tΞ~Z 6g+أAjDD&qRurWs@V\QTTTe;Bw:::EqWfI000@۶mTW*,/tg"Y"z8m6D^}kg*(LMTh ;;r<~o 11I퍍MKrܸ/"y1nyN5 ֵt<++ 4Ш~pq}AqXx+=g]|adfJ ~>yyyǺcjQؾc'#]> C|1GQF/=&&ƈ>_Y}wk+lنǏ@n#GbU2 B8:?bcM_Yd!V =0sgxijmE@~ AjơSm;["(h ƌJcnyN5y 'g7y%"OĠCvP>غu`KDTKnذ~ADLa+qP"z%8TGDDDĉ'cѩ:uc͎_j}7NJyT>G~?Vey[VM&c5zAqqE{&"&NTM_!ayK.~Iԏ>2&[VmjϝP(|mZm:FDT=T]PTTn;oܤ1wfu"W\q23]a6s8+Kf]_3QRRe߮mjiL+WFw[{6WXfJ-!ڣS+3DfG~?w5yׁ0Mrj|2keCf'NBBBu\pob$UFM Ocdzc?^=/X*R>yu7EQT~Y9GWy+EVV6GގغmFOLLWub1 ++:M!ptrA]mUӤ({Pt^kn"bmٲ BHaW,r*͊[)8EEE>y< 77,_R=sgwN8p>+9YprgO"毳:_ΕGpp~\= >}Vf}=40Qm'[&$޸Zos\ՉE뇢Zvœ/>G6ahh!&F&yAa`` M&vc044x!.ra-[`_Tg2 C(#33Sf } pšCcqDrss11aWsЪeKcN Wg@WWaO*R}ԧ&הX\''GE0guLHl,nHJ_GžqyNSs-7oG2[j)֭h֬6 x7-,:Wg2 6OFJm\zvL-[и\qZ}?ahԨ4*JR޲8p0|%ЂbG޾'ڴi >8p0F EXuڥ\\MaiCf}PXeYODRG+`ѥm8 - .<;׬To?EHe:&"&Ne/ hNDUe Æ  GǾhڤ ]ܕC H >|#Gᙪ&pv݈|Q'}:tH2;ῇ!++;Bwa?_~5ݐ߮VŠ_JeӾ[:;UbQ\\,g"P Bƍvbl޲#ոڤSJrSZ"}P YYYhРMMTlɮcWeر=#֦;bKVɓtΝ;,_֭Ohii a =-={'ߧ=ҰmXW;KJJ>~$͛7>o۶ 222*O;wԪC^]S cccdddHP*j9d?YcUUk"bB,\cWX8wW<0 C|1GQFF;beJ`bb3(((@|5̜KMHW&`OolݶC:G2+U#Pƚ=1/\Դ4狱o8:.ވ}C~~>cVYE"fJ [V}))HKKTneRq}enm-ېT,R*jk&M섩f`@UYvˣqU&*zPv^n"bZpww wۥ?aXB8:?bcMˇ\=J//]K93i*_l9>5ZZkʼneV\W~03Rdk"x{UH>QXXX1Ӿ/Μ=M9V999 v=ׅ|*R־tl)3zZQVlj5 IDAT&bᜊ˔եbE@~ AՊ=P:I<))YpET縪Jr~(;m4~gggJgBFɉ^IC-^]0:ƞC{0*`O{"zOĠťSPƴ+t@ľ(((@zz rg`^)((֭;5]=&N \-~u# 1s4?}p|89 z܎E\fwtt{ kW.6rT+NDDDDL81q""""bDDDDĉ1q""""bDDDDĉ'""""&NDDDDL'""""&NDDDDL81q"""""&NDDDDL81q""""bDDDDĉ1q""""bDDDDjU"""b⤌@ `D*Q"""8lj'""""&NDDDDL81q"""""&NDDDDL81q""""E~W]&MCr5HIԯ¬>'""""&NDDDDL8D Q`fn ԰x&NDDDuD"aj@ h;&NDDD oT=չ781q"""=jK)qvvƭ(B!O^$I"H-Ԟ\㗔11h:œËKA額i;DEEQmŤNjQ-ӭ;w1apiwcޛ "#Q'"":H+()nca>"ba>z7o Ņ0fcμE|ċQ6¹# IyrBq#_ 44oVV]mW'"":J+(=a!8yJ&yڼ- :xnJAvvSS]RR;vg8tK?a.]eKRSuF þCG0x@>@VVyw0vG@jZ:n!Ν[E! u,fNR3f~ǏcWsХKg8|wN~\=j]8Q$ qᎴT0ʤ e"n'w٦!q\,\|JigW )!Ϟ Ϙ-]m{(LMMqt$8w "?KNjQwWx`ch !''99000(L 77&&&j9lw8& CCCa.K#?/```Q8|0B|G.8CGG8{xM 툈j'Mg@_O%%%<FAzfr4hǏиj֭h֬ 2dsEzC8x~~>hutyr򿰴!Sš'"":BOmڲWGw.>-D Q\\'O;],[7 }\u TW9J?b7._AhDGAnn.t?񗠭%ꈈj)u r5{wCCCBCGGY|;{{ E-()),11 i[<|PٕܹGaɢes鲶m ##NjQꜝ_"uvăJ&CB=q #ah` ]]]de=ƣL8:}L<CCC|Gv#--mݎf`rM!E~{#ШQ#غmrss߇H|{#!//XzXbDDDTreW>\Yt^i200p9|x <Q@OO::SvvzŮ}8gLr~Zlml0c֧fACׅlXZl!>ƏP( #6ol޴^|8xz3s o~`]w-x)#8;;VMPHDD13D"Ar5sea׽ 򑟟cccKxoll-"Obߡ yyEFoqV6g?D}8&MWL zzzhcQQQNDDT[rŴmked !H pϋvm[#--H`ݭ+rrrp4$-, DG=$ 4:NRQ-i'y ::HNI@mg%%fD:6ރT@ ^d 8R$MDƍ/Ƈƣe7E"D"E"h?{-_ ~O͜JDՓx)+NDDD*WP4~OAqq1KPTT"}X: %ԂH(Ā6BBZZZa/&NDDDuI@ &A/ q*ގ%JoG@?Lj0I6'""""Q-Q[o'""""U˗/C>SF}}}XZYAO+j>}ĉH|=^Btutb邲[ջdI__:LgeemmmAWGZn PTXhQN4{).]s-h QUqN$ 3  :>ѐF&?,0a䵶Wefn`-, Ѽ21cϓJY(DU)ewOkbzk iKgqV#IDb1%Fմ^HY7}bv=lY3+?/!(wVN"{[Fֳ-\A5;tT Gg uYS/sIJsϊD"YuCADTy:&sۊM Du`HDG~Rk s]'u!3D$3G~ٞÈGEu5N[Pnhb/&N0=ȚaTg Z 82 ,k`D-XBj*i+{lwX%۵맣GF ywQ>{ R0t/*GK;ѹ;z+ 8|tO%rWYgE!%vE(PW1rX$2 k,ղNo"ueF"YYB%-& ?ɮkR\*؊D""e H. \No0pX,;KJloQQ.칀Δp"ppKc7ȱ$Mz~q!^pLMx9Cm*":"^z}/N$75_~;s/,Ou[|6c)IwٓGݾd13}ha|xslD:cD9ۈ trD. q!b}!8/.+/eJ7 s$=?>uS_3GqY#qD`YǑ#X,IrB#lbkQT"JBhȑ]VQ|bY)'sH1Y5pb’ kY"9 bpg8ӱNXCaIkP}Iu;.nԳ&vDdcݐX$Z=GuwUK kNЪIٹ7 UTTT+$7^YǪJS>4EK "*? e 4b<ͺZ>|/rs1U ]vϼم$9M!Gol7և'e]]:$,q<XJDZNd05X k W\V2MksfRꬁ-(pnd+{NqO'"He]UVXD n_uIyCTTRYPR!HH21SkdcUk.'ik 'S]gWJ'soz{FnuG]^ՋE"VaQYU#=k 5E^|w:.m~j\R)gozU?2dey:k~ik)w9m?3`NGXmµSK=MX K8ضDȖT=&"v'=ު.jl7"ZPd$-KR@NxTw8fA}J)lYLV'Y3ɔJ\vhrS[*5E^f"wh*qDҺZ6\i+TdCdR 6 #S15 k;Im $# ,s]^*-m'2Ij:'1NU{tgmA_XF$I"H"mDyˈh)U(lz>/}m G1_2b]7 GɠWtw:V[GDnQg '"fۉJ"v_>3>xaPG+)CD7K G.WfQڊ\"W;w =g4w\/%w*bINezGsϝK~O8&Sywn.U)trgv_:JVDD-ktOj 䩫c4誕JeǦrbq6xB䗳[%'XmXfmR,lD1"8BxxuOjGgȻV|c{ :2@8[ e ,i+Y]54<[BD0(fԺ~Ax" g gr6r6 gr6r6 g@HY@> S+1Om&0^Or/8<9ǐ=ѐ\8 M(JIIyd0 V6 gC~78u`q9[ROr\\U\\`ee5`Z-L-Z.͗?~(##G.7mt͚5X}t:y#G1c>^Vfff -ZB(,,4rΝymۖtyyyG}W)rv&RI%55UV q777*DžܹJ$0`@dddݭ9o`ܴiD"Q*S꯿zÆ &UΝ;7hР={.]T2dXtxgGK҄ 8...44tb87oťo߾?Ik׎;p֬YBW^z9j3具|}}srrj:uԩSk2bĈ#FSL233;uԪU+cxseСg?:S@ll@ll@ξ/Zkzd g?j!9rvL-Z.`BB_^^^ͩ9lgc7rrrRRRT*p|z޽nZ~~Z>8vãq m5_H[[`N'̙cmm=zsb?B? gڜT*k[hAD p`x`䳳{0V/?h>˲řZRRfV,|>| 'RFGò믫7lGRibbbee bb<bY9y...{?>IHHPT-Zh׮P,00yXyLyƅG;N:uT*Yaaa?5grvfOV0φ'X=MZmL|ĭ׋cCˎ[sW2ACm{uWJgOkٓ<(h`]ers/=Y#ϲƄͳfٵ3<+WէG){d2YaBOy4"bJB9qswEōۙ3mL,\MA>pDvӽKIkW_/}degڗoccIYX,ݿ?J&vW@F_  S@¯f8kFEپ]} /6}~Kwbn=7v IDAT|𞵵|dOҎe2AA%%B?xO.wR?ߛ_SjD"y~{M~IIJߛLھZsϏ{sRk,'a>|$߯o4>gt$U~(sG32Ȼk&U~4P" ?퀙mYŻ{rʾ FneeIxPu,ʡQ#Haa7l9{y㸋3IRĤJQQqveaXXTdccCDvpI.:zW_ܵWJ𡶶阅8u-ի{yu傂“'_~YnNeU\]]-KKKۛ[RRo¾Zg߾ K <.R _2:99TiԨ3'.?}s9'syy9^+Q>]{eQvBD-ODӦ~lwH$/vR/rYΝ:r=

3 /LN7#bڊqaN|,W^ݳW_㺟~;wKN;Y}[j%Mh߯ݴiъ]'77wx@ھVe!!!ljD[V<% gZiЏ>W_EeX=۶ܵk-Oxt~ZW21ϳUQQtʚ^~yyy}寿p`a+V4ne۶m{m֬L&KL;%##G.7mt͚5lE7,8郺Nhg|۱sğrDp9rFwgxRRofͺwtƉhF*//>}P&;;;77ws8wNGDDFEEj^]߸q#''ǸAgى?qGE g91sǀP(=O>=rH\>vXBٸq]ͧm k4ݻw'$$L84jmΎ/o|ҿ I$-ZwY|yVVVv`ոRĖO<$mgK/ ;һu떒b\J%们\8 ۹sbu5ͳ̏kڲeKxxr„ [lL=cφ_|>>1llxxlxsN ` 3 c!:utRҥK;ut)JtriUj>͛|y2k׮[IߖQIIɢELVǏ_paiiaBCCc?~-E~ʰ &`lx1 3w\cT^^rnݺ __Qzzz݅x+((ׯ_FℒW\ح[+WߵKǏ7Ūg?%[o#lСXYY 0@Ve2T*JOO7zkB&"ǘr}Ν;9s/55RSSx9s1c=Z# ۵k/ŝ>}SNw,))ֶ[n/_O?5Ͳe˺t"D4ir~gϞͿR,Yh"##kn~r6'l~uj;///!ޫWZsvKJJ9r3c//SNUWWOOk>~xTTTiiҥK'Md9[/m6@* "ڱcT* ޾};n޽SRRssskn~rFb?.sgcǎIҎ;N2ĉBgϞrJΝxOfL?uTAAСCYYYqd2ٱcDŽb5߼yb^JKKẏ~5͡C>^Vfff Z솕occ^#atS%Ψ|͛7o޼sΛ7/22xy{{\2++L1a|}}.\/b!^s\]]qFllyvڝ8qbʕ`0~\ź~*JV˧v^]\\RSSjuLLL```Z#Ǝ;` .EDD簙w3A0{,3H~g)c[;;6nhcy^7~ސ!C㫫.\(~…;*Ja??<- -rwwd|0??O>...?Dsů%׫W/Vk˗+m۶-^.XnѢp3fΝw?oZ[[/X &&bGaccj*>)U*UBB`k]#԰z >C6O>ƍO`&..NR) a~2 ;?Y~f>(+,| ,HIIQT6mڼʕ+4%v <_OsV\ɲ;vخ];B={Ο$S1͙3zѿ t|$))i„ sp~+߸R\|9X⭷:y$ '^ jFEDP(#@u}I$//4ia ,zT*s? .q{{9YRRvOW?mΰa/^WYYhѢ>}={nݺmڴ1_]]]aÆ`>" C Yv-νzo\Ҿ}{gg猌k 8**jРAK,1B]\\;|>ؼy~W_}c777ww=>mggǟm}~rRSN:ո?lRֺNNNiii:nݺu>>>PCqq1Yg?FƍS* b+WĀ AU^~=6<0T 0PgǙ~~~hժU&w/~׷q}9{*_0,vrss3g u̙e˖Qii%KΜ[(O>>G1 ]v}@oi}lGq$1۷N,XбcG!oсsvjjaäRSRR޽{*˧O^#fΜ/wq…jzD_19$$䫯Ar64w\~V JMMH$={N:%=<MDӧOOLLOHHO-j,o,k*K:|mDׯݼyH wߕoٲ>ؿ'&&[, ˅iKYYnoݺbŊE ?ޚ5k]o̙_~a=zߋYrǏ2,,l„ V%H>s0P(Ǐ6{۶m31NDKNN۷onZ]]#[lE% O}4Ͳe˺tRŸ}YPPО={>Z ܸq#'''%%ERiZ"RTK, ۱cGhhhnn.pc,\^0 ...;v0)oooyf~N>}Og e 0϶ 0 m۶իWקJRR҄ ̙SkH[[`NGzݠ.'~] q<DV^͝u**00P&ˆS;Ϯ'sVj5Y%55UV g?4R411rBpȐ!k׮^pa=ܴiD"Q*& g? *Eڵ_}Վ;sa EFFrJ,EϮ`O&0~)--Mӭ[q6e__ߚrtt iܸqJRP_~ʕؘl ~zWx! P?{OZlr7SaN"$c3 O޾qaϟߡCx~~~>}\\\bcc ?fۤDL&JӱrkҤɑ#G#}YPPիWϜ9c>8s貲ٳglSR-YDDFFbb`줤 &X[[ϙ3|pǎR488x5ݻwJJJZZnn.6@ξ5̜OR)0b5یWՁD9arvvN*JVqqzfS...j:&&&00 g?LC Yvmuu… rrrzի{Q)OOM6I$RYXXMjǎnnn¡Z666VT\\\dd\.WT DBH,&at:ݺu||||oNN emhwBC& %Jʧ.ZKD?p)_>q |ΰ7%pCҁ ū_lIDڶ<}?ӳi +>ء^ %eTkkVNYCz)miJv/tl\Z_hͩ_7򄸃/4w}ƺʤJ `gc]QFkokNdBɣzvfkM(z y&=!X*LJD6VҊS{Iy~RM^%eQ 9ɽL5`3Wrr͸d./4_5z?R6bȯkc.es&nϲ*;[l`$J$bjokiBp_L^n{vl;!Sro]`w}ƠzVl}?Lj\.>^VfffbkRRj98NךSSSjuLLL`` @~8 jj&&&d2T啞-M 6СCDTRR6jԨGDDFEEM>](ܤI#GW?~|ƌ|'Μ93::,<<||PR-YDDFFblS2lDaÆ#GZ[[>}zȑr|ر|:煄( uzWL>qǎR488x|w)))iiib9?]vĉDtΝymָIݺJ6i҄APTTdR%??_*2 #o߾ju``kff&@ήE֭7olggǧހvin]%;FDq&UJV88^]\\RSSjuLLL`` @ήݻ{M4yܹAsҥ+Urڴi&%%eС&Urrrzի{===7m$HJeaa!@ήСC[h!׵k׎;u֭[6_+Vҥ,X`R%:::""&66vժU|0...22R.Tl1H,Q#F1_2e `|MldNNGUM:kRl@@l@@ll@l쇭SNOXtiNea}R"*))YhQvv6=1l"=pw޽911Q&IR//t>x…;*۷ ++>.##G.7mt͚5g-Z]&%&&i0//o߾r_i<7m'8gQjj_*jɒ%&22244Μ93,,lΝӦM"eeegϮƏQZZ5}t!~ƍJeӧ5<88ظz= 1qʉhŮ72S@ھp60oFVVVN֭[ͷ0 п{{ɓ'ښr9R)4դIk׮I$~uF˲DxoM(Yk7͵+))iӦ͝;wL7m {L6s/iOy([ ZG+1̳===_~+WtܹfxZ*<9ѸX~~T*eF,߾}sμy󂃃۶mk7Nf,**#";;;a߸8'mQla|}}.\/\\\RSSjuLLL`` /))1IZ8z}]q_|jmPTVVVQYYI,^kMD~~~7n`6?ߴiD"Q*BR; aTwڡ:p(.QYp1"(*@EQ{Qm]ug Gmy$K>s7m۶=|ƍU-nݒdk׮mӦ͛u޽{m۶9f%*q=z􈋋d[nիQKKkǎ999~~~G*۷o^fÐ!Cb-[T ,ӧOjj T-666Ǐoڴ͛ߴu :499ǧ.Zz:uڸqQ5rrG4|pArƠd6d6  l@f@fs6mDoBH$KAV @Y옘}Pznfggg8q"$$رcߥիW]t100Xfq 7mT/~w:::kW.\X~}mm;v޽_ܹSՒڳgO]]ݻiڷo_֭ԩ?۷O8yd .Z:$Ç---AP/ٳgnR8ziNNN{4i% 33yڴioZ)dbccUܧOXu4HWWW,7n4hСCSSS 9sUAAԩSm۶UAؽ{wӦMԝ+֔w-[ Pr弼<]]ݗ/_VTI:u駟Rkڴi#BRRʕ+^zڵ466.T##-/_R"+~kUV&&&Uͩϟ?m۶ STvz*U|Je2J _qvvV?tttTӧ͛RSgϞ1.۷{ݶmېҶm7nXbaaq-LvZUM+ϟ?oeenׯٳgvU^?\=W^[n֭:ti+Z`޽T-zzz˖- S5R2њsY =ΠN8}lVlZa!b:'+3ǸM_te 66mEt u'!TW( 4άz],A&jk?PR±}ĩ-Zhɓz&EK,{ [9gzQ%'J?KJR)"AS,D"AP ߩPfed- Z~U_;w=p٠={9qj3gϟ?{b݋/+"öljիn۬W{9svm{"ogl氾cƍj3vƦ =32sG:>~ۭh%W-d6ʥG׫aˌR2@gP[ \ճ;RRR$3]tK2S|uttƌvݲ5F5gd2T*s7-~6^!C_)d2B/A֭>v~׮]ƺO:l^fGJۢWPrUg̚i|Yrݺu+٣)yy3gyL8wpPǾNg?ei@`b‹;544 Żz033EFo߱0>$]]nܮ2@zl: $'$bY>SrvJHT"W <Źz*fIf\ѽ[RRԵKqr\T&$&{q4h kD"k)H C?}_}!2\v3tTZʕ+g.ejJFZiP&*GU`d|iANn{O5MCC))ժU̪^:xT-U+HT*kש5}vr7c$oW7mؠak+ϾrcQ._c#GХQOSKlDW UZJNHHNOJOHJOLMHINO~UZjJ'/_72m%]jvgΞ8]23js_:xOرC{ |rNl0]v999o?Q^F Xaw>kW_JT/s'Ou);+~6P&b[JRKKoHK[K"+ ȁutt=(VPUk՝ʕ+ozL&W(T#ĕ RP( ]P d2Zz_4o.9:L=7w`?PqԆ"Xᧄ NOOܭ)zO:a/gώ>TT)?_jhjjdɯsssE>32D[D ɪTw&&&ɯW&&= B)( BP(rL&/(drAPJ_ұkzu )bgj4}:?{/^8q/ׯ_PPSJꙋ~Zjr$zt!SZZZV}-K9-Qۨw9--]Iᆬ}ۤF͚&RϚoe2Y)d85jܬx{ݛf4iT"t]_4o;[&Thzz?ڭT*UTݾ-\eJ+L\CE&HT^P}}}goA,'d6>&hhٜPLJ llP1 S'PQ=(8gl{Td6ʇw Y՝cۣzEѿG[Q=WN oc  ll99ŧg|y̬WɔKL_޺m}lמy"!##T*3qC#e2B& seKOΛ|i-}izz[W>~cRR?:u?Y2gn:Vf2thN^Tre>ihr^ ޺u֭[ZM6Vj۶ʕ+:vtkԼ~"ACeߞ7oZ- дzkWTPPy.Z k&, wGBVk9k%`IDATvF[jeԩ}bc 6f<޽_WWpIٲ;c߬o;Xy$rW!3ZzQCf~yyy_X"!G^gyWԈ7֭ǩe?{[lYreHH˭/4zŊ7D.^xi˹s)pfB",ɮHKhXQ}'fϗgϞo}n.c\GM\>4d-GϜ`Fn d4n ŋ/ulRVUW_|9~-{Ǐyvv [?;DhiST32#h)Cm-+GT*FWzݵ/4:tY3L3uǨUKV* X-omd6Pλw1bDllNNN;wprrޱ}M =2|icz8y?zFj,\b_Qfwo8٩׭G奛8}#Fsݹ#}ʎQ'ز9cP6g{;:9vX(u_yfZ5k^UJT 8qʬ[7Om۶]?7@IQ֭ 6l˨ cG8X+J֖ϔz&%%yaIS;e´˗/6jXXo岟zj -[{W/MQQͣT7~W3|Z{rXN?ԴGg ;uۅ߽?mR/_<]-رklf>bc6[=6ʲ?u5gĈQwܹE#٣k* 'ݻPȸ}"O)>pKnYg`իWYf v1ƷQQv=dȐ[:;.]M)}Kۻ'OAxUŹM;wy=<''wak#;q׫[cv zꋖ.?rMl~#}~o"ZX>cAHz*4,"11IԴM1]M[WY#2O{춴y>}nڴO߾6EwSTT[le{gls |pISo/SUnǏuZbQׅ03>bUA~; Zۣg%Clu垛]2kլP(Ljm[8uNܸuGC/6OUQf?d`^׬kݺ ՚޼vm3gƌsGGak X?Jҗ//\ܹcAئm7oŚ bcFӦ~{ܠp_߹eTOJJ=ܱSЦI>L~% w_x ,^JeZZϟŹRԯW Z.Ύ666GT? g?|Ct7v߶Ӭ[vyy:uZjj|w ibڠWIGGcBNÆ =0$ؿk7աKZ ӯ% Y;8m۶{%~sǟ62MKy+yq)ejݛ? ']iX';չ #zN[pԩ 6nأG5kִi&$$idк<gҌ kT߹3Vmƍz(Y*FzoߩZ O>ֹ9FzܩZD/BɃrb8xX0~_I8xta@;&j ,^zܾ}[VwDO禍d еkWDJ%u;Fyg޵cN!! 2fyHH33!kjӧtt1uڴ|DW2?y')UDwdd6<1cVϞw^PТ͟7I/TKRW/Բ?y-MxOEFFٳmϞ=#Fصk(#W-~ٟ7meێqss ~xWSS3//OOuPOO/œrqRi|9Ȯ]aV;p RVZ%:hOZN>bkkd2HysrT{t]qQQQ7npqqeFO2}e>nN5k1=Ϝ93GgD_PP(PcƎ9k^ttĢE+#L~}͛7sY7mоM |NGGg̙o_~xݓ&Mlg6kDNcƺ8;h7|(5&Myv-/^A2YA~~Du@GGG.+R(Y^"HTΚ9m߂!67q_n3qIS6!dŲ oE"422۵ժV56 FF> \Qίxþq~Ν;-6lrHss#|:>>>v>!xY` _rET^{@P>VN8-|mĉ>#Vyl^7q+O{ʕKX;~EOlԯp΍{v.ZP$J.`-;lQz.9nȅ+>)h]Xek\GX2~XضCԴ/F W ]'N(O6e ԫWƍJpO-~6v E" |xEoNK7,Qu<;`ըk,tuuKKOu?ޤIci^^5Ϝ9Ӹq|i^"l~vddd誕Vo9x]N{΅v:f}N>]UjZ: mQ|utV.$˛~xo^;jǁ^37DN8uӦ1u3WjGU_GP"E϶:$&<Z޽ÇFF}zשװ dWsN?{DMqnC{Ot8.u[g{,=ϼE'޼s[ڹ/mc߶رݻu`ZLߝ<}ɓk2';GZ|E?嵟|edd֭փ3xM̶-cܷm2d_ֆuX]թ ŋgU3S ǹ ^`wii͚5?qxx˄[G؍ٰaȑc8L;gxQpВTc#R UVr\]"_}4U]~=O2cmkBΙ5mllG9n̜aToPz&&ugGop9 E" S&Ϟbys"G5Dzzz۶S/U(//pt!Qܺukȑ[D_ۘ- A1[=hޓ'ikkogWٽ . )޴)tXϰ%nn!!O^wp4ib*ijRWU^}):rKf~v6j}{p2n}V7^b{i<,\~X"~ clT~#"և 2,tEpի ݲ"f%ήcϮ쬎:N>s̙2f\Ϟ==v̨5j(T7{׸3gxO3?zȈ D>sq6CGoh?voI#M_L ~‹WcضT*P:#Kĸq?Y#GUFmݫ1ٽI^ݫ5սFz=MjmSϗ- ѣTQUP.+;w-[suwgϞܣ瀹s'jk4vA_國SZZZժƂAjժI] +%utt45 Q}YjՌVL HU L \4P*RY^ʕCW(ϝ;o:tׯomG޽oHUbaQU*eQC/SdJ:+Wȗ,]?#=eܜ̨ *FGKW/RE)- }(bqϚPnA6ۏ j ]$ aЀ> |UsAi PVMA֩[~6  {l+N8Bգz Q1"Q=2ÿw]q<2d6d6  l@f@f2掿{P3[TR/zfwhF'e&%I>.ݹQ MF!8ϸ9uȻqB,gNSAͼ dz(ll@fa jc⍗~>GfP6iV ArsZئ6%M/BIzϟ$$HK|T~_ e+ϸykgV$M4kfIl8L"i񊡿_=eڔɞ]5cm}oxyN$jVZʼkV?έGnAO;v: y6m;nٮ>[.M}}i>|Eok}= Gf_sp,=fⱝWʳBCü<&kFGGǍVdΞ=7orp2*lW{^3˼WIy9ΔKP.\ҥaݺu.SqrtO $&&:lIEփ]7eW/dYMqa ϓT'wʫK?_*~+۷S?_~XxuZ(?k$?snLKKjl\vC[[۲EzzmD"L&7-=j9zxFjjjvce?2j֮ݢ_]m/]rjT6OxX乩iUSRS ?]WWLE?\ֲQrJJUJeFFAAS6Eߺ;9Fkh`Pd!Uc_.[' vZACNH&#~]^ن722TO~~7ߴ (9ѷ9y+`"Jka+J_HJol``ݹq΍۷~/ˁSBQ]QHzjs^xx` ?qR}J &[24K2b~dVzzE;~R*q3G&ݿs~2m#ɿ\ڥkOUKN?݋/˷mh=' 7*)7?r/6yqಳ=w~ɒ WgGT---AMSPP_/7[wnF6i[۲e ?9KGZ6Uϛ8;5-ms 2jlzzE'zF~tI@,ڥϵM.m:w]Bxx牿_~ [p/>iE5l |bշ9|PW\ ~3=Q|kfIy9oV:qy\iJSzoC6f=ky]P&H/%޺~\`\UAtWg@YX4O)rY~$SrYJ"URHMIER˷v9 e(1?x.=4J5'ݲYd6 G)ݴYc F1nPqbw+j`Ցcøqs@fT։D"@f2θ y ll@f22d6   A\ gKO˯dre6h  AJ*!JA A3_gvzBձiлJB.י b +%'+e APw~|*ؕ2A$Rk!ڂ r\)(fLYx&A6H$>[)MKDIENDB`kildclient-3.0.0/doc/C/images/we_misc.png0000644000175000017500000012323511715730227015120 00000000000000PNG  IHDRtsRGBbKGD pHYsktIME,tEXtCommentCreated with GIMPW IDATxw|{RH! p1.UD %(+ "*.bPBXQA/RQTsξ$gevϞs3QU 9n>k$˞q(Zr픐 aCO^-!G0Q>+׮D@>|. 3nA"F@*\.M_S;,zm!{Ua\d= IfPO6se(~o{&*m֍s Tc7UޅS? ;S|p8z/'9dY!Ѽ([OeH6DZ>΃R{/{0:|QL4"!Cya^<ꗢ:?@ ¾(*l3Y|I нq܂E_5eA~IK=p4Ep!x j'y—nROSSD/Qwuur j~|_VwM_2=&ZvY?4'u^6R^ja/-zV^2KzZN>s(S *Vꑑ.씞SO#Y\ryyWɻ4ReuȨDv*%u9 ٲP/d-Rh{qh|I,&D1LN[80lWA- NmOsu9-\X&>`l'C}%4QkԂ x0uJ+sjR+ qIPg֥l5"lRkZY ע"motLq&]+VfكfBZpMfB4Gs 6Ma4LZ}7㺕O)Y]7y?i ׅY/b]$d\j*ʕ+Gٲ!SQR%vmJ^ѣGru!*m׷TɅ]A@3 ~>mse"((4ΥKM6j2|߾һ鿛fݽƩ'vZԭWODgV:qro0`wraX D+JJnKSaaRc[i%N-|j4b/ͤ@-Yh_̮0d-0ِ,ʨш|AjR% S Tp7/$y &K[ WicE/E*ͥfW.JMV4Dmk4jM! L z $a3b D.i_= jU3q__ jVJ.aYqtà lMOMwqk 3377ǏGpٲ~}-Lfj֬4~w:tC2el!''ǏG`"@IO׸0]:wܹs a4i8_]#L_ Znu'ObO?i_~9߽h:?) f&m7½v86^.V1B?E1@hHEBYE˸B ]h 60=][ W6hu!OKَi@YMZwO;6&:j} g&H vj2du#țΚLM\@/'f.a&괡LZ'mԅ`U+I <ݵ%86MjL<">NXº> Vc'<=Mhٳ* 7'jp8Zk!88'ODk)\.=w*Dxw5sMeƒ,~Û9N={9-_=z`m3z5_$m6~ڭvE;v p)KMU:ޞ=y{/h@0,4G^MT/RbJPV֒9zY̆(&ZBiܛ/sdD_͢j4lWo+0-{Ӝ+˥ԅzz)tBFEn!tz\V .~?A2&.=)e &/dSY|e]Y6[m4ߛ{EA]}:]WwehFRkcͤVfSjrkrKj-tʰ9Yl70uY7)"MDH&>5c&cbA=ͯgIQ LDf~Y4ь,&]nF?!p!330Ƹ\.˸(_<.^|iii : .\sS]~f=cǏk9s&L*Tٽ2ȳ)_^c"K/ai| j1hE;kBB^w~2d Cԇf]p(.f $k5RחlQE`孫Ăk˺pɐ@r?W{m)i,d8$ɼ>|Gb^wu?sWf3?CQP2wh jACp~Z[z_Я_qkOߩH0eьni\j5*+![;A闎ΏW *2=Et~7^ѕ\ bUз;5Gv)uP]+_pH( GB`` <\.dddlHY\pN'|My ' yڵ ~ ͛{Ю˾vZ|q"[曈ıG1fp<ʔǸq.W{Yrrs*!Ξ=;W_EjJbn݊V-[Ï><9u-76ʕGݺ?HsLϞw>/{A=p1VZ[a}ԨѬYs| 8L2?,xڵ\oUB <8Tm0mShժ>#HS&{4q@F2>4r5?$͡ ^o(QNH((!:m`9ZxYdi5l"Ƀ Ez,1[6.0# ܩWq< 9CQ݆zné>dQ;xQϖZѾX{ukJ`B#y裲H65"Z~*A[IOWֵZзw:d3g'w>/'矣Ͻr/ktݜ8q_zYYY 7 TZU]> &wϟ== cǍsBv:Qvm S{%_yjGѽ{wRŊ7o2|/~0a$DDD&NA{#mɿݻ_8|٧؛gvC;p\8q"*sIvvz{w F{j鉊k_dAyFmIgǭO}d6qP0`ٸW h2meYRץ^64n#Ms6 & . njsAPk"ꃬD㴻5s+$p+Y( ^&ݦG}_mT@D1e\=#o͛Is!AFqw<*e<ןzi͵Ξ=k;F_v\V= ʅ!4$1jhEX/LٽҰL29r$jTI'cҥ:u*2pqddfJ^/Rxviy={믿"++ 7_ h N @~3ѢEsyt{G_23 ֆeavY9.@v.唑+#әgӮYNl 钰a/6*YѠT6{KxnK%_m᮶Bԇl7/;TОyZzɲ>}-|==I2{G՛y[J¥Sv!ס]+S ^[m?ܛst{ j~IWV}m_R tl%H>d]}(6زlF#c{Oվ4v66AQI:ϔ Olg@,Y}w߫JgнFUxɳ-՟~ύۆnv ߦݡ̆=l^paY aItyr *`Ɇ?r 8NȲAAw@4i\kݳM*F] PjU^ll=+10A+W{u݋!+_}7d0V? pD(a]^)Æ DŽ 1s+wʕDž  ̄VZҴn?k֮ uk:tIأaԨ/Á7^ ÁGG>*-O$I°#0~8%OI4nf+ Y-}Y./olEvʒ lpy`8 ֭-=6 Ni`Rf/cm l# 3TͪROȦWԟa5aNvɴߛ,k{)ķ͞OcHaSHxOiXy-i1'1IlڱE/.z ؈nѮ`rh"Gۆ.L.zbf.R(J~ 8^՗u  =#e d f;jQ#3jL^:wS(ǩwI/oTAGXX8ׯEzZ~;xmw;s)f\2~ |ŗVn5j{}5֭~NwÇ}}m=zhoڵkg|-XvYgp=0l؃>kx:,qNR`% Zӣ6}1 |۶ynhgu:ɣfvrw]S&Zߥ`uً|!-3ێm uvUv?QܢEuՁ,} Wukv*+G*M֒CZgR ~um!Ea;\ϰE+eU\f%B湲z2Ҹ T9Ӎݦz*!9 eIΔUѼg:{{aKZqߋ,Cݗ[Pڰ˚=$xW` چ]oZuKp?QreKpVV;Q|y8s̻̒)ɲp7owߡB amn_C#4$·GŨ,>j^Ls,QIFYGރSD3vɦu}r IDATدvYp{1_]o]_|/x^{u+Gm%I6XZ\a68oVe-l}u [G`fH-{E~mFeK_,c},V}7Ml}Y|3YQ`.yz< әxUʫKFaGjÿ ?P&n=t:q89aaX;;;gNQш+i%wIs5nK`w\o7jת0P1 ˗/G\\VZ_??\Ý_.Y\Ʈ{[RiM_^ڼCln5$ %mEEEuE+vӛ n^꟒$*^:G mcXƪEjvq\ת̖Eۚ|%Y&dX)R0^3)=)}yܓOuϢqάlvfQE{[ Ez'&7>߹,SW&{n"g` KlĿ*UBpP~w|[8].8ΆuEmPlYdefJ2﫠)=.]! zha/{0k bѢEb)פd^h>]43` B%Vp׆5̬He>%MwkgWE.YzTwRk)DKAԃK3TB/%]eUƓEixi510i6I%k*B=?ri\eU=I7iT.d]jq7o.qҥzi Ocj@ojodltj!L]>WvvW^*pgT+nK WӴ"x'{"{ݮ@Fьz!"ڥ6 ڽMϽ\Iq;QHYqT}V/Y8Fɦ ӢR]_0=nɢ8[S!;YFvvBѢe 4mYYe(S ld{%d%/lU69/]0aXVN6م#gN-DQReJqO^U>eeȻ)βpOkI 3뇾e5[q1 Zƣa"d!]W^6-~ƁGͺPۮCBXoZ!V}}%LOk\.[{X^KwK-4n:͎6;AKވҫ+IXQ-s4"OɃX`}6YT[ ¼ak*?v'gT`AEX0ڱM=1jEe/Oqt%eM^ԓR(`\Qs'J/[xӠ>GYv.]K*S_k!p`aEV28,Hwi4+޽˭MӉ =e̻)zԘ@k.~Ph'f Yuj;:52f5 cy?I21T m8ziHur8m/ڲʪ%1g\n+8@='h hÏe#bb"I?uU c{J2r]r $Yef!kSq :ZȊ7Yq$5ַ&m"Z_!\K4{gt7{HOBF(.^iS HKgz/1c,Px(xb-HGkN\Qo*iޥڕZh+A2v{Ş*1M@ثnU[Wۀn_'T{m1ˢIdCu4&im&\F,mzQ8}_PYzx7 Czڧ&C/h:n@5vn0-T ɤLЧӎpVavM>k׆U{aaah۶- %%}Axx8eȓB!V`,Áe*yԫW'Oğ ???⋚4˗/͛t:X޽NҥK gΜAjj*裏GB!bE0+yPFhľ˶o߶#F\;U%I2o֬o߮NBNp%]JJ ԩ#̿0dee! @ST~GRv(I9 BMA@`a׆]ZV BHH&jժe5j0۱c6n܈޽=B!;7v˅,7:EJ.\#FZj3f K&B!r~~~8|SΞ=[k&ɓGA푑D!Bn=!!qqq]͈#tR?HKKK/ݻ۾Va҇cƍĞ={0d&B!rC||>^q„ |2jԨl߾]b¤_x1fΜaʔ)MB!)^bB!l8X-B!^TO%'B!bɩa'7-[}c!AS4h}폏.j&^uENh !rs* 7#˖fi~;o8<Ə{D!R5dޛ} '2NN$6!B3oEPPb=4qW^axj3Spf+WEm0hJƍ{P?1z_nULdlيz݋ۣdMѲut~~e/Mk! \ 7ѾcW8u!_|iOO_L^!޴+W 0(w;ĸ8ő#cw;\GG}`ڴgO>|.\'ĸllB!;!S&O㏍D@@Ұ䃏е]xvLddd(.Z'}k׬Yhocޟ0gy,1g,~م9  %ѡ};66!BL8m߂ɓ& 44NW$`j3o)w@F q89 ۾Ґ 00UT''#44y2$n>i8dgzr##bcB!7.,Gכ7brYskˡ >U%er d#B!j\ LuE㣥ː@ԪU T V.M t4WLxpkF쒅_VM?@FFBΡNnJ|E4n a⤩1W=0IS1߃@1EᇆVAmz:8M%r_ X" &B(r1fxr$ԭ[ DӦM71d@%^^wϠB_I޽+nW~~~S6ڶi]7d&NPԭ[o>@>!BOukV2J}f9Nn.DQ8raYQ?1N'V,M7— SPB~+B) Q>/زd4۶]0$IDCbc^\ٷ$m< &?!;M]YABuJ]t)]e_BB4B;5+ѻ""n[f<B)T111Xz5:w\񈍍&`믱"!tzj]$(f,$I EϞ=qMERJ qyuRRRЧOQQQHLLDRR64@ժUq,B!RΝ;nFll, 2N>}b8ov؁'O"44=i^z™3g8<裈-܂/Ԟxl2tʕc"B![`w GF.]~Un(,, iiieh`ܹ]6BBB0qD|¼ك ŤIp9ѣ1gM7|T'B!+mۆ~EPPU%K`С{iF\Jc<4h4hޯ_?$%%a߾}۷&B!;2yiطmVbO{?{ѣG#>>^G}Dž bĈVƌ1ȑ#B!dyKLÛ4i&M`ȑسg7o8%|߾}hѢ6'OÇQB@RR&|ȑ[.N-[g"B!Jz))a=.. Far%cǎHOOŋѶm[a^ظq#233g 2D^re1110`BCC٣!BHطnZ,ºXǣ_~4+V@BB*U Gtt4jԨ'N>xb̜9!!!Ô)S qFB!%bSº7FGG{t#9qDL8c^ݺuCJJ&\eDdd$5kD!Bdffb:t(+B!s-UVذa+B!P`/1&B!B(RʨS/4XqB ڰRdYgoՠ)4kGG0k/*B!'ˀ#\}◭0. zY|y +H'Ɨ!o4!M{8}}ѲEs2t8ztJ"BnBhCHiylذ{_k~{oЩ+4ŐѣJXzXMƀ\.4o 5G89eOzXSt7D"_UנuێhҬ5ӸxR#B(B1 O=,OM{ X ش3ٽ=쁱c;ۊ9,#bѣ^32O?GƼ9;nR3ýprf3ҥ˱:a9k-[<\#B(B|Wcs[ouy=,ΜSj zAAACOiC B5k1|F``{vyiZ*ݑ[iAdd5c{O\B(B(ѩ#8V\WY-#G`OժU4ߏ;J**CCCqg'jժk~ҤI#UB!n:%Ӹq#ԨQ;vQ~uzL1,2q8Śes]BHIB ;!n-W׬Y999^]FuY˗ Uʧ?qc|tŠ!RvYG F?1_oW\ѣ0}L<%^̀زe+233+WϽ-_,#!##ף\r^򱛟/6},㏣G1c,M@q(ΝKU~5%={X&M6.R~B(Z $IWZk׮e ל<翃axlqC)=8~ :@mq&'>>>xG7{,,Ԥ8򱛟m7ȑ14n&#}}cХ[O州={^.=p2"G!\sxA]eL4[oی#>v[]JǮ^kI9up$`,_a|u]`ɷ B`Xe?7RX(섇K!q]l:$ ]6|||DMEPR%a8&\߫iC'Г-znn.[B!P`۷O|y\~wt,^m۶UYѣGk#99'{!B^ѨQN8>@ s{E>}0fM)Sy !BڔZ/1j"w&N' ׯMO>ӧOgo B!S`9!B!L`B!Rz!vPJ!BnT|YBoJPѩswV! !ňX []>rAvB!t 7"$ٺ7O'zBnXvBȵZsBnv29B!RN!BvB!x˕+W0GqV! !P^tK_~usi.k]OE-˦6~TchNZp9Hds#44˗ǰa_V8N=۷Q]%P`'pr5'ƳI1v$1ov>>>ׂ$t,k,XuŹsp1TV C ~Ï?ϿHvB!Ě\٣;߯ޠA/{F2e~[n~xn38=7v@B(B 9KW!G5Ʀ5hٺ6oϿYvԩM[a؈Gby:. /2[EF;0GnZvO;zF>: MAywlj3.^"--M_zz:w슋.yע֣7-|:uET2t8zTs ѤYk Bեu{ЬE?/^Xv˪wao,"uR/QƢz--_jRGDDr)pBnµ>RO?GƼ9;n|EjԨ?=%mrp89 ;߆ݻa܄MH9XGmѣG7:giY=]oIN6{_3!<, ݺuŊ4LX]@xX{-J=z{+VBDD6m {vD;{`؉_ok&b߿/g>x -[?8|%|=8ֽUk B@@:~NGBPPW,T]ӨZ ʔ)^֭lթݲ+q Ʌ.KQz-*IIIOW6{#\P}@UZaGFMZj~So{y (|@]m_رT=44_0oz{~Gc5jTGtt%|S6j׮e^RǑ#GMUV)R]i J#aNuuXC e) vX_Eܹsg??? >QQQ5kn> ) c+5㯿[+._1^*ʗ/HI9I۪UKbrбc{85k ''+&K7\<թL8

MXPyԩ Y9>r|}.+/aƾuӈs vSC 4۷ϫpo(μHǓ6> !ۜ;y7a2}z!\=D2uk3l0̝;W\Azz:>CDDD(=}]ԩS8Q{Ȉpo(μHGBG!EHH/z!!! BnbT+H$ &R v؁M6)i~a 22Z5n<{CqE!Bnfd\ذP`a+ɖ… hڴ)=Zm !{0mح ;!7.~Rbˁӈ̛7?.]9s &&vxq^BfRB!!Fe˖'_^"Rܨe`_ 7={DϞ= ^"R|e.!;!RJԹ; !7V!B! !B! !BN!BN!BN!BvB!BvB!B(B!B(B!BJF`߶m[j*HUVyvڵ׼e$B!\[K.&/] B||i p+X_Y!Bȵ &&B{jj*v܉cǎbB!eYVիWYh_r%^O>Xr&\d^MԩSQ|yC8t&ڵk2eoǗ_~>ՃIIIA>}DEE)2l<]ڄB!B#:ܹsx >0l0b$dܹcǐ}⩧Ҥ{ױvZ\|#F@~l2lܸN UƢW^8s RSSG}Դ jgؼyڄB!G0+y`׆hʹx1rA$Imƌx琖 ;|0z~Mzo6lذu1\Gtm}x aDFF3iذ!Μ9OJJBTT ==?PF 5dee! vʓܯkhI9up$ TB!(aJ֭moc֭^ @faÆiÇjzp뭷*˕+sivmgwWn;bРAhРAVZ칄B!71%&o۶ 111Xz5:wue˖aڴi$I6m-[f&778N… 1bTV cƌ_~Yzӗᠫ|B! %@Q;w"00Pct+S ~a2ߺu .>'Oo<ڷo iK<B!- +y0cǎ3K.!11,#99G Frr2OyWΝ+W ==~!"""tظq#233g 2IJ jJ<B!GnZha=''[lA\\0|Сشirrr)ӧƌ;e4o\0a|}}*U`ǎشiSuŘ9s&BBB)SXAMIأNhԩeV]/P^B)/1%%-`q!prR,r_/uA!(\u/1v._^}C$ քB vrSӨa|i?ŐРQs}pyMе]HI9>Fе]M? =ۣ=}eVeh2nmuªk zߒ;0Q axp)C+W]hѪ=&Bvs;Q^4N< 8q$ԋF=! gNO8&Nŏ?Bff&rrrtSf7Yp?q&cK8~O^͘4Iq(rrrQcaL˙z|EyiOOxo'LO{~Fvv6222c?a!޳gsx"f<7 o4Oh۶5?Юmv4B!;!#:: qCᏣGλq>^ O\ 8v! 'iS3Ӑn#J^*N/K>406{3?~'s5 1ۺhӦFPw !R8|Yfgℱb&"w=8{Æ/w >>QL{" o@C~{}e<|8OGŨ.K\b : :u@XX&ިQ#QlY<#XfS[kVn|t:syN!jMOpp0y?/ $Ix՗L ԜL$1M43g[ ب' 2ҵ}9y[E PVM\p}/^<BNHSG|C 8^Xw{5JE1W퐹m_~ ]'Fa劥X<Ϥ1{EPLrׯoho[PN!4!$wsʗ+t^@ٲe? 5oTɴ#?bɚ߻t ߛ/LCĸHx=?^/,?qx|֯Ts-3Z5k:ҏޞNsoޘҬgê7 "<74ETAԜRĜUWsd21KYj$P8$ ^sr@sb#'yx:笵Y{}e:jذUre*p={ɓTreppS^%sUٲeٳݿzjVޝzt-͢Ƣ}:VVVj֍ 7Ժt-޽Ѿ1Mܥׯ+%%EͿ b'3=ޮ ǀp;ׁ{=F%a` |s)Pnaaacmmڵk7Α-o /cPRRx 3 ~O;jir)88X+W^)SF666 SJ!IK/U^:tСCsf̘uVJJJ2}B+VT=tD<ځ=''GgϞ[o`ӯNߵkΜ9KJ̙Lj(EGG+%%E5jW11qf=oקvnW7+ʤ˯V~ޢ?Z~fRgZxׇ֘$ݚr,)d*L~e+WVttg{UT1OǼ0A;wR\6튏Q~}7ooͱDlS7_7qxLIRժUUA1\IR?mZ#IrppPʕ%I -QVVoRu棙瘼V͞9#?9t%x5p~XmuN%C`J(99Y?IkԨn;!a:w(ժ^{e+lllTlY|F"Vycҫiݻ{ yZ,2ymɒetP!uu $[[[/_^!#GҥK *(5%UͿ< ;Oß 1};;;r.\(z^} y{wc \R*VTzzjL{Ӳ/ƍ3gϚL5)G{͜[0OgγZhnܸ4T*U(Ʃ$^v.LjtsSӧfΪYAǍ)V3OUrr:t^}ԫד&#ԥz)>af͚fvF_@ t- IDATؐuo65ݷ'OFiRZ$GfUc 3}z)==Cweee}ձvIλgǣsPzYLdԵZWuАa۷EiOnj$.]հ=XZ2\;t1W5((Pnm\c3<mʼn 6?]*[J p/[?徥kٲ)4@ze?saFNM-kDoͥ }z <,W˖.2YuUZu5k*ϚeʔQ˖U/axgNn&=x}9s#R=_ԼE+QkO4pTb>5k~CB3^eW233uڹG]|Xe+W97k![[;?bʕ?mڪs YZZڹ#F999bjK[-Y[[+ڕC'Ol[VW`Жˋz_ ScgY[Yb}r1(^,dm]FYY*SjԹͿMW \L96j,oZ$IfJMM7_A;OEZr-r$ͽZO kW:rl^rvn򆎍H]v̬mޢ,--2 jBnm=[Ʋq@T =>^OTBvgddy:tI(mܤ~233afpv֩(;;[ڿO7n:tΤN\l]'O,KKK߷SSؿWѤC`W5.(JNNcjQǏ-~խGo5hHG zZVjҴnCrlXeʔuriSqYYYZuuV},}&RWnFNMf,Q $I*UWb J'GO0lݲQ^ծ-7'ث6n١ʔѹjsc{ƭ u2mS}:tQN]uiWB{Q{`^РHΞ= ߮1o^U"`& j]E!ӬocIs]xa#g?zpnQ|ˁGcJ WE`Jxө29WR̚!^B.-_v)99YժUS۶(w6 (1w!;;[|[zyJ vԻw_֔w]d[N86|7nRVrs4Snt_5Oy||i=yΞM>=(rrr?P[FjϞ~<b,[F~Z:XvHTrAreeei(%Qn>9{{@?nӊ})l'Iz{d5l@666:dɪ[769'ƍX~kqJwY2\zlmm5|]S/SQa<,,Pjtծ]ȺϟWjnҥ˲llR~jnڝrWSN#IjI $I.. f='Ni&eӧM?uS`,-,^|#nwӻqԻWO[ 8qۓ'Of+VԥKMگSvG~Ix񱝝$vZg9Q\*U\Q̪1(lǏ1g ;a ;PBڼyYuU o[kmm*rrrt(qǒucK˻x[YYiPP*tWץW<_~u=c6l-gRջF~#omݶ]~mEF5/mݴw>effj[ar+r:effjrss5{| |q-dcaaQ`ru9N-Z4O{XefaIm7Gߜ1*-+#@`S\RZrY Zi((8xfΜB륤h֬Y 1+Td#GLWWq%'_z 9hP۰QǎW\{Ouߝ6S˿ZjZiiiy4mDԷǚfNNNNfjYZYѱiul(ՑjҴɕܹW^-u<˜q*–=O/UNNNGiuu'+33<4&pG`/.]~Z_|JNh'??]~=:׮]:xyɩmvi%KTJJΟ?L7) 5JIIQjj>;Oß 1};;;r.\(z^} y{wc \R*VTzzjL{Ӳ/ƍ3gϚL5)G{͜[0OgγZhnܸ4T*U(Ʃ$O=U\9Cօ Ųq8a}碶 [4}|>_y~?R/^8}駊5ǿ5Taaa:}222tijtqcSW?Iy~:u&^OإY_;tHh7;^ͦ>3tqҨQ#Mߟ3Sݠv̸j<=>{[޷O/g҅ ᡹sX>yd}'{&wC)0?zP 9?xZ2\;t1W5((Pnm\c3<mʼn }u/{[K/B7gZ?O`I7l~ꩧ4w\aaaӧV K.^CI/RQQQ֊+tܹsUfM:ts)9 8XI~w)SFN}ǣݭfxW{(͚"kٲ)4A~1[Gƍo$өS_?cǎ2 :zvcǎlٲTÆ ߫iӦ[[[XXXѣ}-MѲ˷ھ}q3gԩS'?~ȾG YVmԲe ͟y% {]}ҥ1bIX_|ɓ'K9=7\5/^ѣG/IXՆ tQڵ+O4hP`:T`X-}:$ ;P_NYl^}UYXX^}U-[X`0ܱ6Ǐ׌33g^0͛7O#GTݺu;8\ԷF(==]scE(=..Nvvv&a7lٲڱדW\YΝ3n~v:wʕ+SNNz"ĉPyyy)55X}trrRFFF厎:|E(}ҥ3&ey-]TԾ}{}Ǻ~Ξ=q rH-]Tׯ_׍7XnNR333yf :4aÆiƍԢEt9խ[W-[4Y%ՠA n- ,[o *hСzϱcj޽WTppUկ__իWۍhH2EM;V(%㯍Ub_5a> uvBnbv$%$_+>aUZ5mAArwk ;p5ͷʫowk׮+>>A{տ^~]oMyGEʋc l{(5qn%7wO}?ݹ999jJ(]#Cg6Vk.]{_z||i=yΞM>=18@`}Q܎xPS|yPlIJz$+++KݻL2/u1>^[;wN ϕK+بb _)SqR˫bڴi>x C^ ^> ؁G̢EK/޾z0a-ZjvW\+N[{e_.SÏ>{jݦ}i7NV>=Ԥ8MQƲ8^}yߴ4yu+W);qFYn^M[GϾnMqtjVjP%%-p\Z4>^uF{ϯ7䵅 cg5jd駣S3-_\\)``yաSW97o!F' ss}(.cNn[wruuQNjݺlf,3 /OϛWsrr4}lqPm4h>s߮Mѳ6sQ'(::F#۽Wmun?F޼U6ǒM|}4v9Bxb![Z 9{},05svV͚?nLڝ1}աSW^4)1\ׯ_W.K 4k+~FaCֱc 4״wG|.?_5jIsfjΣW1>Cquո /Y W=٫viTv-~d ӡGԩK7yhÆ = 3}z)==Cweee}ձvIλgqqA()i Aժ[)¼۷Ei&kհ=XZ2\;t1W5((Pnm\c3<mʼn }cu/ξ?*jDVw6rwkܷt-[\=Ł! ([[OlB}`PZX&_%t bv;;@`X3Jۢ |׊OإdUVMmۺkPP0@,pdggkoWP>O)>>A׮]W||zޚ򎲳j/''G_-_ܼZkDp{OMGDDF6660)۹s:tg |JKKu,,,?w's fх ʗ/o|N: O?4ҋ|4nK?4Tiin >#ݓ~?t,)㠠 X8##X6qD͜9Ӭv{N~~~TCgnE`J#;eoookUDڵk#IIjT`{k}sidee%IQYZXhiZ:/7Ιi|=""BQdǏ5{lo/OUbZh^|z.{{{M0Q--ʯ5*$oOs޻uѩY:qS8S3jV#F*)I=Gf999>cڸ{y6 4TǏl7GϾjE=Eo^rjBM[i㦨BxdeeiҤIzwsN=3ZdI~u)ÇBN:z=~1c֭+[[[y{{+))!&6.N>>>fULL\u%2kkk5l}3v>`%%*.fh츉d s,)x%mQJn|4s;~AYO?@{W@1\N )~}l;X^M)S"""2eHΝ]ѱm###գGjذIY?UVZ`hu35kСC|5p@>@`Pd988UF|:7nPŊI*TԔTI7 >}Zaaaj쬚54~\-,,'MxIZ^}K}ڵo]qӖ=9 :ؤo7G'9:53+tH(oeee}ձvIλ:zwG7zQFzs{VVyz(Q`;vݫzJ* Wxx8@L-+a|`۷Ei&+ǏTF:~`k®jpL䋪^ڶsנ@q`Q7¢TcdoMwVlMd^pwk#w6 PB7>+z e `ϏN;`J RU; ( @)թ/Ws;;@`@`@`  vvv;;@`@`@`  vvv;;@`@`@`  vvv< v})#=6vvvj٪lR`0>$SbR)1@iǔtbJ P1%(bv;;@`@`@`  vvv;;@`@`@`  vvv;;@`@`@`  vvv;;@`@`@`  vvv;;@`@`@`  vvv;;@`@`@`  vvv;;@`@`@`  vvv;;@`@`oì eAP< EB.~Jz2vhi^RSL<KRN';_) 4oR& 0^p ̳֬~7 v`v@`;v@; @ `v`;v@`; @;  v`v@`;v@; @ `v`;v@`; @;  v`v@`;v@; @ `;v@; @ `v`;v@`; @;  v`v@`;v@z8ȌIX( kbhg`; @Ko "R)LmۼkZV4qntms^5UA,&I/k` &^{\Jwkqஃ:OV*4ngY*0#Ox݋Nm5x_(NwiuS毛wN8+3>'M6;l|g_O#*oUER)Ȓ#o]":&;x͸+/$ нϜoɌ/MW mdޢkF+o{&g[J(HE2Q-/zDqqZ-Ϟ}nv)0thZ{9{̯#{<2t<7Eљ$^FcWo+ٯOK{L||~ Ҕrձ]=NZM&cܤ-|9,X#:(-}d#2b=̱(:rvLdvTJ""j$"]"]"]){Ɏ`zO;%'NL6(EggJe̳ǜAGA)R,^rsrh4r'v>{D&O~֫2:"wr]OGgϓ,9(Z#7Zz#i׶M3dw>87|ŋNLv;#7zt?=DJ{1~62$MzsZvK㥗Ȣ O/p9AYēN-2gL~;מ9rUEgGg=玟_^RR$iK"-Hٖ/x8\q裎;>p_9 s5GyL>sgY';r)cmogS2ԱI[[/QT)fH1~ /Ƞ O-x1&ts^~N29S.r7˄ox[㪈Ηkv?jZ2}2xф$IR;n|$5Ǜ4n5ݻ2*;}?sF3s9S2lЕ:qX{4 Y=2imMY_]qE?oN=uߐXKaD}syGޞ̘N u^./\.K.ޞ$W|U?Μ9s3|М}֙j^\ujo}կ׶29Ӳרy:_3TIRJs%TIj9{5ZR*%[zѽUW_sm=ebk\`)9oo-3i[&;͒j,Zj߾KٙƬY?dv50!6ɦ_8bǘ:1l۪jUҘ˨o˾xNׯ-3&r7̙3g}ׯd7Ojm㯻!{gZkC ݽ}3z]ܜ^z}&WPOi}vMWIJrJrR(\dZo5E,j]n^_mz z뭗/UW_'LOn6]|YΊXH_xqz=4~8Lr9EKhQ꭭xׯ_Z[}ət=yٙy}-|?;cƌea;.\e5|Bʊήz#)Fzz#z9Eg=RJjHRZJii*w_4jKe .s}mۯrwkL{nf.”|أrW^';:ڝazW~~s_Swi=S̙ܹy^ !+~ǝww?2ӳ&CVki4yb<3}jSOLY㹲ΰ~74-_+ yᕎ[XKGg#zH {HS~}z_NNm̱G xp?Yӿ:}np kƭm,|<yG$?Yޚ8#mmmlM?F‡͂߮8WhfO?o}+Q<`0bx:::kjZ+Yc2sr'flv*RvqvQvn|=fm7Э7v76[ϢZx)^uw+Eqe9(_rY-Zڿ =}mcO=97lb|j7Ƭ.NŋS4YSOLˠ&2lXw˰},3}r1eڴ'R3{r?1'9{uY;&ݛŋgi9i)ojOLGGG:::r}>6!-J{{{>IDAT{ϡ9|ʎoC<(/xsþ>>~m|\zS~ s꧶_Q#;ݓI{{{sݓN;}0~x}]NO{{7YkeQ#3qpذ4gZ[MƧצW8Oz6eJ6wLqWȇ_sR~~ǜ瞛>};|lM=ܳg|-vzcBƜ|~}\|9̳`rewoa]Q=vtUDf믕 ?;ZnOpn1r)Ϳ<ēI۽7|t1;4vY笔ΪZlNkJ*eϽg7eQyছEdCRGO?3|0䭷ul:#OXaHn){Wet6"WL1/f˸(JF/1N?ÔfSazz;_Y7ߐu;&uޒ JcM3{ѐ!y33/^/sו7du,}xFZzZOa6Z+h˜s+)K)W*˩VT*V\f',UUK֕Z'M+Z-mm Rh)KiySSrK=lq^Jsov*:z:;ߧZ-Zۤ9iKh\*RZZTMSuz#M=}`ryإS)WRT*J)ʀ-'㖄`)j%J%MMr_feFgTZ}Zrr-7X+F{IL\It{irK߯wdG=>{EFzX7RH\NRYKD㭎h(үF#)˕T*J#'gʫ+yf͌R}>SVKtzWvu2my}o1O; ߁z vxgEƝ]b@;  v.`M)Ssqǟ00&ݻw:4զ^I}t[fzd-ޞ޽{eʔttt,YݻRҩ7ޓ({~h5Ӡ>|R1z:#4兹]gF[iXJjQ)"^pimm]F V}.te.џIENDB`kildclient-3.0.0/doc/C/images/we_logging.png0000644000175000017500000015364711715730227015625 00000000000000PNG  IHDRtsRGBbKGD pHYsktIME 7 KVtEXtCommentCreated with GIMPW IDATxw|E{\ it顊 WA Ң*J.]V@@0 KjGrٽ|Dn3<4;Uur|j071VOwgE^gd캝wcq'?Z%%!S?lፘٯ้γVB](C<%p-șS HV=DE6楧$I=ji+eL[X7 ABWSt}"f غ _APFoSA2 <$M,\py( ??,+|z& UL~}wwڴy3uʘe aϟY4js&˹&< CUG6-w|&zm|'%c 6;JqYJn>g3D>`kAk=ޗ=R tHR3k|x~ 8@\xf1QxI мa܂E_QLh%YVM xaCTlK3)d}NDA|ȲWs䜲9o'sDžz( *%DeIƦG`?w5%H΃] Zвk5^VL"Vp2 Lc5 (* m ĈIhL8&?- E+ai@df'w&B^(䵅䥮VLwTZwIVCa[  kfBkܳ"kWW4ډ Mkj#X+sF'^: h¨M$8XZ93`O)Y]7x?i[ӂҮEXMw:8ŋ=4>u [˖w ӉG")) P;]eʖEn/RraAD ) `^ ݎ@0W\AhhW7Y^]wN7#N<ŋfZﯽš[{)8>Ma"׭[g^SANH%e!_0xXZ㵗&&5:e\,ߪ4K“YPCY7}Qj,"ah[`!Q nA^0kKN 4|H$h_42BeDϫVx7X5Z9mhd^Clf`%.[7,&&犙,)ϑM/Uf/& "A]U^3֙FIJL`Jkgr!B+2|]a]8nn]i à l O·HFB//=4N'?bAAvm R&36 UVEjj $PV-Y*CVV?bPۋQv_7[#۬mo)S%%%a8~Gn؊0}#h޼9<۶;vdkSoݺM;k7̬hӽlk{h|# E3NB(Fk F Ch- M/tIلlh.3h5.Mlq 4ZwO;6q~r&Xh=M,FKF6FY hzČiFFjAhs.ZI>i֙MhMEZ$x%3[MXº6 vpSYlgn) c ϟGR%Qti8Hp^f?UbŊɓR v"2_ҥKyvxx8|||nXew\yS ˅#]?Щsg[#G{%lmV˗/رcӧNBRo۴m+~1XEg9jBHF=%pcw5OᑻM.(7i_Ɉ&<W^c)7 ztV'T9WYVxo"F(S B]Li6V gk7hjWmV LeL2d=)e /dSQx,V4M^Q!߷CQm/]h7jYƪI&}զdnr rK/_6'&OȠ3'/cH6l !ݛW~Sϒ`AN_vY4Q̯&]nF;!~:CXXRSRcdYFjj*]%KD|򥤤X`i_t˜|<~ ǎW0i$ؿ/Oe'---ۦD ̻ヒ9s"88}-B_MgϠr*< &2VMc5oI}v]w1___deea׎ԹsM6J͛7oƁ=0jJlٲLY+W.c׮+0}+cOzLBz,t!˕]22\ .)3d:LC3 'dr1\p)# XKlq^Kka$X&8UIVv wDT yʛK LEՆI> ΜMȝ3{Ӕe7C`!!;;=&>00U}Vl]\| 0;4}H4 ՔzlKM/Y裊I[Sy3uI@r?W{mNДTٛt =PƯ& /9ަ'TfZ&iԶ6ɦ\_"LaH0iQfߩp.TjwH3~Rl8_ro8'\P0=E4~=^9(;YmMR̵rvv{09w;wr n$m,ːdddx\eiii ¥Kt`7&g+\ ԥeL xv4nu7BΗ}X47nʕ+ѣ9Y\JNG^ RJtbAl,>#?m۶G~J*jŬ[/5mf?ʕ+cl3.]bŊsNtǎCRRU+ШQc\ l6&>7Æ=ӿBVT-E~/yu㥗^Dfِ$ t ?WYn͏$Ii~qׄ ։ߌB>BkXPT iMnE9VM›y*WsGSNHHH@2e0uTD&h[Ȟ1{qQT)пo-Z >mݚ-cbbbؕ}[ަɿ+ȲqơtN9ǎ᫯{Vnh.If|]v:cs?9 x$8N_?thF й}4h5NEjLddP`%͋ɣkPpRt "W|G1VSF¾A^m^35\Da`uQ>fK ]FP-u`fà0ga,/kH#@fg mbnAރO½HPg&Fv.Gkf<̼͓C3V}OϺ&HSN/4M1T^y wuW {3g"!!v;VZ>"sџjժ.H7o >=޽{PLDDDbJ2;֭(p`~wnX;UZ5±i2Pf vM)k2h_Lc+i Tl5f2}kF۰sA& omuܖJ]my7.Fml-dZz{\ʖZ[vM$V͸-%ҍz IA9kS.h4pl Ǖ{s{fR L4eQ%n_Mc.ARlݵ4`3fF%c{OUTv6AV$ TgJ'o͕M 00ͺB*Ϡ{o WPyɶ-՟vύۆnv ǦM:V$m/Kʢ[K%SBO2Yti?3׮]s#+WPd)fY^m,c{).<iɓ}h:O 507aGd. VlԅJ2AӚDY֢ OgR#r9 5F6eS\׺68įm]r7(Pti 6?άL8<:d(uNr >mEbhШ)ŠkHھ 7*†/X\}$TX]|V,CkX\yŋ^]0p|CtvS9.^N^) رc0哏|򱥸ŋK8rUf)NͱmV,Z([P-ܗ,^ hӶ*3O?ÇO>͆>͆>-MO$I C0fh%MITnd+ ڙ-}./olEvʒ hpx`8 -=ő6 N4 Mzxso*ԡXgh$H0>8&UdԓflemO}\&d WZ|L|4Q;67ٙmhO=Il\k=Bp2i`#IϙlIA]@G];I^]s]L%(g(NtWf!X\٪DI7[لf-۪uv:3j ЦV8w_([Iіp(^=a \))8/Z[^C8z.\h\r l>>˯Tսz to6N9;wព1rBCCѳOVuӲE?]6mkުU+L6N <]܏LLrZj ^:toӧ;cРѽ |[ :LqNR`Ō ˇhm _q }oBmM|ڙǽrC̵㼍7\9g7o|aYUnާhRb9G>֛+mZ 6ɦ$; \Qg{{aKjq cPi%hV4>6Lur_l^m%FUiym6\rϝErL8~*V%J43 3¦0;m$fӦM(]JXl-[b͒xG &ۣb^tpn%J&19lWl%%Me^lؙx]o/XGoi$u,ݨ{ 0ayk\CY 5m_m0( qi4qhԯ-p2vZbfڧm{]8~fPf+s0uף]]r IDAT|y03EW\8f@M~P&&n=rp8>a(S;33gNŋQ;"JԹQi67vY*nyW}Ǐ㏡ ͛,\v__ĝE_.\ƪ{[\4//om!u7-_$ %mEEEuE+V n^7럒$,V0;61,c"VPP5:8QPvV5+eҶF==$Ä3EF"V&'e^01/|{nY4 ,30io3<_$Ч?<;g;uev[!2qq06&'w-b8r6m,#Bff&>6ԬQM@PP2ӭU PvVt8ϟÕ+W3p.܃Mmv= sW*IyE5 Zw5QI2MG]҄Nxg_:?|nI]2}pw'Z Q~{ɭzU %LU_L9qaO>@ @3'r~~$\WOvͬZ1NյӔOkʻO/ ~e{i O1#P7~]3ZuCBQ_oj!_&k*Y|1׽$RYƋF%MNc NPǒ7ֱ~8eHS-t L5$f6g~C/yak(?s;QI3L CCOZqQsS?+gyzIjn ?)e)Qq'ϭ[x£d6iXVˎ/ k!&p`a)JwU=]uՊwrFr!55 HM+p0.l v%!o ܛ1wj; Sv0 ja,')[v Ц !$4%0m/2nILr3V& A}0lO<6\=*&&Rʞc@_W)1@vec£n;qfLݞ|[q/\m9o.L~$7A0o,Lk 5 jf~I`IHR Źa6^W lw\=BzqOd<v1#*C/unx'p)|AA;Aif<;zӉ#lڴY xs;t?gGӥc%FÉ={K+>ѽNv;ǩS-e츉-HOOGVVۏϿz39l۾HKKtAAN7`>ؾfŞ][Ѧu+]:Vѻwv܂?zT܄P#%%3gFN]듐*Tg8 bYBcMX/Q.Z0: AANٳٛ+'<`'tX cW>>>?n46mƏEHH0\.͏o1]a/NWu*˲u0/pUA#YUC!,%K8M7,, <$X#G<X83f}C$|^eVVҥ˺k&F=; 3ggAw$Lδ;Aj}7>իի^*_}KJ#$~vPjsjԊ9?"%%V 0P/_|Yv:5ct(?qXaڵ --M:ҍ/F=;?͟ر: AANK?7O>1`5ifaaJ~̛_[C+aB^70ɨ߰"6¸@u_aaa&Z_J/!9AAAq"#<;zoteջR;?M v tS?wת___ԨQӿ -[4W qcG!445kg~ Vܛ0y!/1 O5kp 6W>pƏAɒ%p8puLFU6mZaly7Pnjx8|L6muADR{kXЬlcF5K7_!CGӑDkF 1a,c #rahP~m ƌ}eJ[ SXyAq|9hh߾}fETT*lAM 2-6JZlM6T:u`9LaMAAw}X~}abcc8U8|{x J*~} SXyAqc/郅 [Ӯ%** sE߾}U> fPTIL|) )M .D>} D.~L\\$IBHHt邽{~w([,BCC1x`$'' IHH@=Áa߾}[W"-- +VĥKgAAE[`o߾} F`ٳ' _`8y$BBB3խ[79sIIIO?H,Y*?N:x;  ([h1b>ސ EJJ ((Æ Si`ʔ)^:1n8lܸQ1l0 $$ǏDž #F  AAi /ĺuxCnh̙xGѽ{waٲe0-ZP>WPIIIm޼:u(GEEa߾}ؽ{7`Æ  ;2yiׯ__hO޽;v؁z+WĈ#0w\U`߿[ 2*Uȑ#U&0vC'|AADpy7^oР4hCbhܸ1bbbwF&MɆ6&LÇQti}Tׇ5kbĉS"  BSXzLL bccիӧڵZ;njӧO#553f@˖-iaHOO1p@rD>}QAAD׭[W º$I}bܹNyϟX-[V {Hĉ5k03f`ҤIFLL {9]#F`dCAA bSº7a###=7nƍ1;"!!Au]e\2*WFQo"  UAIOOǴi裏ReaԨy_idڞo^7  ,Y͚5êU2}6AA~{⍩'4AADaA&1QȲ?Dzѷ_ Ls4lM3fL0̮k?/[3jEmZf-jGGZ߰ y q\_z@m㼟ѣ0hظjGGzkI2t1peò}hڼ 6nIoM\n  n3fΚ Ӊ b˿s)6oZK` YZs~೩cyNgl8;u ÿԱټq`QNyI{Ԙh^zl_pꛪ4~=5Oi3f5o~,??a1m7y*7AA#",ZCb޽zb׮bb~@ +/{W_BŊwәx elيvp|rx0p@?#((O dU2*V???t֭SBtxĐDZ$niMAH&MQ;ve˖Q 9=>>%KPGFޣ麖J*^6-{C+A>`lԩaKsȈ|}NlظGǞ{uiԩ~@@'+15h'O&  qmϞZfXZ<k-Ʈ{nlذ )))xa'i.X￟'m۠LҸcU$YYq`Nݩy)7AANUpy/_pUZjҥ(U$x{C~Ӻڸ׷ۏ x"ʔ^]8!/}CYHH8p"6ڵ뮲|T {[n ЦS(zꉙf#%%iiX ŋWiii8w&O~_uoOZv~R\:}Ze:a=gRSSqycCBa&ddd`߾7~.Io. --^m K-Gjj*ǟS vEQ+R=m۶;oD{;"w?tMe7'O|Vy{QVň/^D{;[(t5iנ)MxO>9DFn]h֢ 6cF5xc~:mMlGUS f!EPMf(?ff\y2ttFDnz$&ʕxgonMd^AA<~A-0=a'Afl ddd )"[<еAAEN`gAɔ?w@Э{OdeeaQd^AA%2y#I 3Yx1zMamm۶̋  J   H`'  6%IܹsQzup ..NuCٲe#99Yu]_&AA ͛kr!66}U]/yf< AAfnzt:|q'ʳaZ| AAY]ndd/^0#G  o$cƌӧ3fe˖5___Ł1x1BXbٳgGAA$zBdd$q ̚5K*cѣG9RCƍ=AAčڰ.E7ƍL:^u AADrANAA7Lnj!ܹ󸘜LqAon "xgϞáPAqg QDzVeW۸/: ѠQs > '¬uM]ix|?$],ي(֬]bA!)  ^ IDAT9iW d\~аQ#4h]ǎbr2NkSLF͚5`M'7߹rCQX,t9?ycO?c8 4iiimٺ?UVG8y<Bq(\EAĭ.3 CfVRR#X5keB8v8\!ٰjjU?5jE*?=z C[vD}ty~[V_V$~]#4 K-AXdKOt_,^ѽň ?̞bŊy?qϝBffc`L/Rog&N|fby~\,[ /_QY8x(??7!=#4AqCL^ ~ػ(pu<[.I6l>IPB.]IIp \LJ+n~b kbWhղ4&MzJPV$S~5f<>Ϧ~Ӊ9sW;)aً͛…$TRYFA{aa}"Ge˗k(h^zud|(S4,"++O |ċ[1<;rBÊ=Щc;dff !f`TXk֬Ŗ-;Ѯ]+.=A Lbu)[+$cf6a N~~T &H-Ĥ7_CxIt^̙Xt! 3'*U*ߐq8t zm(-]Ga3lnwޠ~ zQDGGb81,XWuwĄHL؏кukɣ(S* O@Re=TgPJ?~˔NApTQHa=[ 6[cW^=cTb422޶xv0ڵ?XW_{};0;aF=z{]X DEҥq:3޻W,[+W.#((4M?[4iɗ.aزm':wlSik(WΝ9 YkGZZ0+Wƅs" :6Aqe (h$H96;>p:õkװw^ع J@zyó#g&v"+(W}tfV֌?/Y^XHya=n~KX#5:.%_ĜQ Ggur*eYOf!==@ `P& H`'[^\ϱll6u8,:D5Qt)z퐘xD@ɒ}FGѸQCIMIE^tY{Bz+7/_䋦1VYMVV(޴܆L]3gΨQ& H`'DdW4~I>HL<ݻw"+3˕Ga-iz #?k׮rcxIx!Jw(.\HcÆM}1nDyi(hÒ%ճ~eUDGcxO_ZRѰ*Q4u"~_8},233Õ+WqfԯWWѠv\pn"U'dt!>!/_, N ]w,Խ ٰDa풄s/}wbr(I2(QNDVVU ?>ѹtzr,cmxݷko_Axx 4Ox4/mkѻW4^| 4/l0^xy z|0^xa"|0&NG IjA(Y4vދsr!,, E֭qR~::u*dY'nܽd/WFS~PzUz.$L28{,.UΒp8 I23pr2])^4Š$I8rd Rr227ΡxR` ~ /^, # ҰA:gC*Up `LႺn`dxẌ́u!HxAKp)Ťst0K-=AA,H`'FeT cL ߧ5#,-j4AqG$aPҺ!v>~'n=76^TsI̊iY0([2 .,E90TDQX[+OA$烞|YfxxgU&έSŧU=]Үi%‚q!9Xc#$(fk+7dZĭkn ӵB1wz2Cpz_6nm!n?('{wVt 2-#IU AA08WL{E{ocbpTGzg`סxyJ_ځ1Qr:ͨUPiE:Ւ  \d5|30cZXb>z@P?zuja:,{vGBJZ:ܲ3~| "  5lߟ| "   rS H`'(Z :*ٛSEANQ4I,' I֜ ؍8""  򇍪   .dCyFHGGi]c'`ꔏLBQ ;AƘ˜VZ5v_VIKKÀ%J`РA8w-ߟ]. 6ap\^IAwAۚQM[aݢ8v ώ:}tԬY.\cPR% 8oIoM 1^QWFϦ~7 [UVS[;2!_~'|'O,˰n]=țo7xm7Ӊ;OAz 5jEbٲq_.U.jGok'n~hsoDiGeە+WKQh޲-~.g۠adCS w5jE9s6ڶ눚wދ=z C[vD}ty*m DZ߰ y eQZ5{R 2dY1ԏެDȲ?Dzѷ_ XjwkԊ_נ=pOdt7n:ǽo7mugGCZزugmӘbNޖ+f]fufʧahڼ 1LjH`/x֯__`i-X$a^]xM`m*^9?|{ԏ1jxTRm l7FS>&:u6o@Xh_?nǴr/GߧZ}:̝= ś3݋Z =W^}3z }ܩ#F`ZV+\pwNcOmo~"fΚ Ӊ b˿s)FYfcSk F²+0ou䩏{S[lEvmp8P|9 ?.DpO yKzۓ@*/]AAAxb $''+׃ enL[{r {j{oo8 +vWt}7Pz58 tTI\G7طƙXW|T:n݆&Y>voZ7zW]! *ǫD/;BS .D}Eq4HlD(MłD bJb -cFQAE,APlEMbJX฽;D_/_ۛݕ:\z999000@aa!POBparssMUTT,pfظ^Yi_e.ؓ~_jm$&%!/޻'~/vNnxLIII`zmmmҚL˺_3c}/i=|jjj(**nPۭZY1ܹS'Ǹ$gai#o=6VV 3cRL)$.3ET?5^ҶGKvլlGS]OsZHωرcpwwoҙp=prrBx<8aK_-&TTT0x`dff l{qCQQFFF8w:CCCCAAQQQ6prr:`ll̤ ũOhh(M>SY6ǒ+鷙s S5%XGt'O{҇ ũ㰵KO}}ӡCyy_YY vfgkq?qlc\gO>˗q cߞlsscKA_TL~S%m{g[5uܒ@LΫڰaÚbڴiOOO}*<|pvvƒ%Kۼy3?W^ ...8|0bccQSSxxx0{xx`ԨQx1 0i$|ց8 CBBвɧ[7=TUUIxBY麺:(,,j}iJkmDC s3TTT4XȨ'{c/gv_u611h"mۖf3$O1_zTqiH'P=Sl0̞=666(++hۜ0d"''GPQQ'_.NPPٳgAAA!\\\T̜9PSSsg֭֭вɧ_DEE***p$(F ]".><ʕLPH3f}NFǠ Sz7Z7eee//ϟ/OMMQYY ̛H kG g/Su3b eee E=h`J1E=[78 ӒcW\lc),-y]f.ؾcvOUlm0q8~x)kCBL]t ;vŋ"Ѷ!!!ds8L6MOt+ /uuorr2VXozi}oGHϩy aB׭F3'MH߰bQH9%%%2lڴѺ͘1uk_$͟ߺm.6y ~^7X0&]Gk)S?@XlݺW\C̿W5kyl}򓗗P[ [8WoRnaj8 &ߞ203ET?5WZS8w7TWWz-\Ǝ( ɧ.7~h_,'K k0݃ŋMBggg3]]]6m0+))9CSSS.,ۻw/0|cǎo4O*7;=49IsOis#0㲶L>%_004k#!/_aXq1 }wSpu%իPVVW^v_"ѣMM  ''ZZZti9  "''bʔ)(gaiaaK=^.0+jO2n-CBB+6csAHHM6CVVfϞ-n۶m'Ox{j`` ^~2 vQh;!N!RB!BY B(`'VBBZ!h6!JB! !B!B!B;!B!vB!BB!bnH&B!vB!BZ1 ;_'B! yMg !BiZmpq\tsAYYY>~x !B!U<dee[nmRnnnB!vVTNm۶ŴipQ9B!B{kԦM(((09ك>  bѢEԄ Lf^ZΆ еkW())YYYL8׉8{H$B!v^[[|Z ӦMHKII@`` CK,vMuEAAAFff&q1l@DDx<H$B!Bq)yTqx1L+VBM%%%t &Lŋra``۫W/={:::|x1 ַDRRU򴴴I&cΠ B'AN^yZ=tԉyϟ7=뒖 '''rrr3f NB!" .nH'שq-ܸqgΜAll,^~Mg !BP僓z|}qqq744ě7odV)|||o!&&'OH!B>x5pAoߞIo۶-FLL Q^^ ]޽{c׮]x5ÇhӦ DB!rAΝ8&}…@ZiiiՅ"##)vy9hkk0w!-Фi=!BHKhw!9#*JXB!%&*B!"& D8qDǜadbQ8"5!BdΰO>('Y_>++!4$}--q !"BX-9p#2#đ@ IDATPSS}PB!D:Bbr:N>iMy0;԰BNjkk./**!BvBdhcMaoG"BH3HkT021e*3g5!Bd9N"N_͛7~<|ڵ-/[LC!D|JĹش:¶q.ԠBi64%B! !B!B!B;!B!pAiXjr !B۷yf,/)) pmfG7$B!8{{{9sF`٩S0b9B!B6f;vL`ٱc0zheSS555888޽{oذ]vlll%rJhiiA]]fkvv6#**Jׇ<ʭŢE  <B@v!B!KdHIIAii)a_kkF@DDx<3AAAFff&q1w!P&]B`` &M$4_KKK$%%AYYYh9Ѯ];!C 77AY뫬000h۫W/={:::|xqu]Z 0FnvBJqġ<Ys9vp GÇ1n8=z|px{{CNNcƌa333 UUUq5Srr2bccݻwܜtԉyϟݎlB> !|І kL'Zʷ!@+ӊ=O\p[=qttĭ[p 9sx5sfm>zmm-*++ Q=݋̟?ر#֑i555Ov!/?jB!$.$&ogUTT0p@,YVVV B cjj SSS 55L`jhh7o4ٳgҥD\`rrrHOgr{|fJLqq/څ|zxBȇS"A}È#nnn-2e޼y` `ƍbSXX̞=...]$ˎ;0b ܽX|9sRI:!XN+Hfl+֮ؽ>2 9QQQ1`J:)Ø1cܼySwlܹ;v`Lcǎعsg!PN{ 8x(ThzHL0JJJh׮<4WB_;0iTTT`+ѵۧގCuu5~x1@AAQ'އxֹAAA022"fϞTUU1o<3Ϣ ?TUUOOO n]` !2GDS'㛉SHtСAzjm$&%!/޻ [7=浲sNzX&///uyfͥ.P:ՃFΝQPP V999ķx9޽{lnn.... .[ h߾ srr999,_ӧODZcݻw"##acc}}}#<<3f˗uL(++= ̟?/ecNr 6366̙3abbؘ> !celټI -h$;ooOX[F--:ۢ"3@!/_"77(Ioÿerk_DFF"-- @*B .`׮]9s&W^P\\={`ժU///Xcǎųg`ddԠMeZQ|sPSSÔUBBH)1Ȁ9pJ6"!xs***\ dRcСG;wEEE/ѣz8[_K.qF0 Ǔ'O0tP?~]vap8\fQseY7044lp&%}+m9x)ݻ;w"##wFF=B;!ڢy255U$&^Fee%30o&抓1(++Cyy9vŔR%^m۶EVV|?MuuuL0ׯ!qyV*$$| BCC !᳦x:88B'Uz*rrr```B?^#B!V}p=prrBxx@zqq1mmmڵ {>wڕyرcѣ 0ٳԄf̘G ۷oǷ~< nݺ!**JAAAFff&oaܸq}6`044?e˖a͚5XbȺ;Bȇm5^-y|xsb ={;ѣG̃0._ kkkxбcG l S[[O`VwB!SrիPVVkOQQ׮]ӧvwgСPWWǯZ[-XIII1c rhhhgϞ=k4B!ڀ=$$Ι3!!!+++l߾%%%χj* dXTTT 55'NވAyy9SSS& !!!())Aii)֮] ;;;&]B!*?&M>ydš ӧOѵkW[胕ƍݻcʔ)ߏUVAUU&M… %Ҡ DFF"22R«W#11@B!q[wN+K !tB!|jx|]bY!Bi(`'B!vB!BB!PNCGk4M\eVYp^hZ|y̞G'c_\|ze߁i$EZ$cTo)^|%:E3!vBZc'P\\ܤ<|?WfYGnކR奥ܼ i2&N-lO۶m'0`]ԁt,R !J m5頥S&aSfnI蠥ETWWcڴi^rX1,-QZZYYA";!X[BiYL:X!}Wo xܿ a`h"0-b0,5aئOs\ܾܿ0ݍ>V枽0xp2ɞ_^>΂zH''} 60%zH.ꦟY?xz@VVڷ>Q 뿺R6nBuۆ_baLL# d4FjDӹsՈW#peJ|i릎"5LK֯cEcgD4f섐fْEXaSBuu5/%+ƀ@Bd3ÎD@OOW.Zrعk ?ʟVXgiXƑh߾=bO#5*Fw;w>W.!8q#܇wuK|K]'9Yzl翀Igk_Ip=$_68۷ bl_DǜF=Bۈm,-ciaۍ;[lm-catڵ?ɬ~ b탈6(`'ֆ{<*4=xyNA۶moa# PTTT:)QtuuWp ǯGBWWG8Q#%%%L<bN OFbPRRBv剢"lrss$rHLJB^#ܽwAz] * og 9Kݾl ӥK&Cnzkem۹S'̋/Y? /M1$_n05ͼsmecCFA<-_l͛X5鷛|biqXjG#ox{{z0:hiA`990_6Cq*8KHLR$U'w8cFh7i,,Ɔljd1$9>FA9"#O4.>}N:^z%2]]ϵLMUUUkmąߡ 1CgdFF=1iҴZ}@aQQBSCIcQTbl/{˗dV?Y+l+MKz4!Dr4VfyܼM`XWg8RWDT44$eee//ϟ\q2:eee(//i*p\'yyXr\qETTTGi+˨Dzz_Դ3,™{.+P_Iڗ-'iaQԽ{76.'/K8mԱzZ<{ 83>2[+ Ҵ1[!vB>xpw=s a=!5egLgwgiSPRR!aonLMTL݁ ɓ&sdd!an9qؾ}׭]m;vi_[OjR9p#ΜEC``h)Eo}l?qH [ڧƍ q&+ulm#`FP{<~֭YXXHBH㸭y8x)^>~ѽI3΀~cfgPcܿ0=#|c{6f MZ)"+<޻T^!b:a'N_;? 7o0nLF !cA;!wY0.1B2pb<[3M!| ;!B!sQ !B!-Nح\ ;!B!섴2H}`N3 IDATw jjjbŋL_9۰5kKKK-Il㦵h,5?!vB>X=jo}\H~5-=e^ZB.1|01ޮB !"9:N{+,YV?~:[@afaU?*c`hc05q&:ll`K4uOXEգnj deelQpV/^`Y0BO>p엸剪/[W[[`wzIK~ 8ڢn/j$W[[$6 M{.#`db tQ'a7bT%JӟҴ?!C yw!-bp\KND񣈌;]!Ǒpy-SSo#1) yyp=4+i>|jjj(**i?^q վM-_E,;Mo):w$d$mB555k.W"36ڴi:qk1f(NEGڝx)QZZ1c͓ipG#ox{{z0:hiAik9MQ8#oS'qXۊҴ$)iB(`'BtYR祫"|vnĩQOxwg`Ȁ=''FF=_vF\HcOSW^diߦ/iyܵԱ*!9센Gf}p($ eeex~Y^\q2:eee(//2[SVVyAځ_;pX8JKK Lifx9+s43ijjHLJg`E۲V_Iu3Bii)+p"*R"8`?_?Ig_ǝƹ-i?!vBB 2]0jWR5s JJJ0d=, )شi̷7c87vzl܈3gc0wqqW3Y +ɘ;I[v5؅ަ}1o>K`[+iNyyyX aHM{nOIEql[~ϖ;Ysi[%mBHq[>G\X'^Jxt+H r3B$־;~gNg !Bi(`'B!vB!BB!PN!BB!B;!GYV}[Eœ= C=^,.>=q'݁IbׯÁ!t,ΰ,q& MzAZ~&g !V綊<9'Q8sOÙn |6b ŋ3 N9u2 _5>`+\I`yT)wGiW$c+XB>B>HV@jmxե#0j33S<=><_H dz{ee%cK7ok4p5! ΰJbX^-1~rsX'p6YXoط@E} 60ilea`h>f5YY0Y0BO>p$P #Լ?M2uﰳ*l3Kjjjyg]7-.ZMԴz-3s Mp3OfY~c &<unہ ~^mD05/Ë/8V|SǗ 8ڢcoU\~]_)z~a3>pһ?<߸G/_a0B8N؄09&#P]]K y m1 I?y|"N8ӧ lϖ^_̩39Y6!i^u9rq%89Yk߹1t\r )7y~\@wCظNx"S;0'OI.'mBxz`LtH0Gʟ0"fʟkih}aG"+Ip-p\ܵG`0Õ h׮Iy8ujl7u| _C~p1&N}hjj7vc p|b?Ȃ;ḖG! ;!D(L󜂶mBYY c]v/:CYY;w lϖ^ߊKѥKh0 CҼTUUQ^VPQQ ƿ, 㡤vEEEJe#z Tċ/#c?6u]]XRR"/H ɘS8y ??` Ξ=۷(-- K{8;[(((@QQ^Sq"6˖.NWm^Ӧ"4y8u5e=` ;oHvZLQQ3c0paDqq/WÈ36Eo7o`Pk(((SXl1}`¸>v潚YY&H`{vhy_ |g~+8r.rHLJB^#ܽwAz.e^&1;֙yp61lc?6#p?#yo#l999̙,[[ߝ=@ؑc`e::]1h@>;<ƹ!TL2Ѻܿ۴2yyyןݠ-$͓ũ1/V8 حpP( RNkc[MONNNfy SǑv..^JDbeb'Gľ} k蠥tiʬ/:4=6 ,KSXӧSo]Zߏ|g;lqu = | 7-`"wo>ѦMijl/NDyY/6ļPUU'catw7W,^=q'.,-%`믚f.W> O.>}N:^z%nh/о*I$Ȩ'zb;30Žf;4,~vvTL~n݆[]z nNpSOn̙>PTTx?,`aa_BNN} ݋N`+4j$'_ØюBqq˗4zV[5V֭߈oԿ .<=+~[.9TUUറZRR!aonLMwqpWFc=?~ 4)OqڟN_E7hTV#;9Be 36EٰbQlBZm]<=0D^^[;&^Ja 0Fnv5/_hbT,gBl Mu !CVSnWꈸNg PXӨDAA!vȯNeYD/>B(`'}a30WtYESBAB!DtB>փ`m=HtYEq~tB-:N!BB! !BBFӸzA\|@ZZx$v~o ŮwKRM96h B;!W[n#@|^x>8 S'KU9ϥ6i煽4iytBHR]]v:q hffyf5YYb'q_6[IsL:ꏁZЫ\mBxz`Ltm~$(ڷoHM '4)9Y_C~pm+N}D'Nܽ{ɗ/"`:U'am">ׯÇxʕW.~ .ODn1|x)7_-6҇;!2q[1AoByyX'^Jx<$ 0FnvG&8@ j`h7on`hس14+e \.; sAEES0ϟ j ?3wʟF1.> 6n Vȣa@ZCw2\q}?oB퇪@ήvJJJb= Mwzz2i['M߰m#Nggq!ÿoq3IlIz-iӞ~ȯ`ԩ#q)pw^#b:a'}ڵHLJB^#ܽwAznzkeAVN"zX&//ߤ:ڇb&cce4}[6YLM>| ''9Òe+}k`};X$m[qѥKggauQ֯>3r9 nC섐fvF\H&穫"|vAUU9`i0G/ = [UU%u&mj}m$=ˌzȨ'{#==c\ܙ'ݞ.>}Ly]tJH+˨Dzz_'}dǶIoڔO2ι8v:}Z#Gv*M-\8Iҟ9-/ɽ5>Щc{͝7_qqq24t)8@`Ə|*Uk魷u/WafYvڭɓ߳6L0FQQQjаZ֭[fl'L;tַ_9=-eշoo}8r$o^:z6n5ڵ4kT~j׾so3۞6͓^If9*VQԫWTN:I׬Ugw}4e8޺F6S}ڻwo@6[bc%N)}K W;;;p?%n;@`@` 6M&NQZ*5Ե[OEF4i3UF]ժ@sR彼|J5k! U֭@@`s͗bQئ ڵc5Ӥ)S߅,$m۲Q˖.ѪUk25$XZ c5c 4 #B }{+_|pWu@<(;MzR1|X旤F Sҥ%I͛bdę3gUd  ҥˎ'ThQso_ʔ)MG@`]Vk2$ dgY?<66֩I]x~xDvwS;od6'hir)RQ.ZDfYϟر25?  /-(F~X{7srw "߆~Щڴi-WW ϟ*9KMUڍF{f۴An'"OQ'+):#11z}'q=juq<-5kt5O>+jقG`rS&ȧZmn^źt 8][?+   vv;;;@`@`@g _e۵hQ>TIT绪Sٲ^ޒp@`2˜^;p \k}3Lշc.M};ن!1OZ}t<<5nڿw۩FCKB Gڹsk'#su؁Z| IDATDosNʟ?˧N4t`IRP彼U[^ƪY]ة9ʩCvj}sɝVXW:q…߿>tf_ |AU/ ql0d;uU5@vgMd['Sm9c5ɣє)ب< p]Ưwm*/ Ui$N"E8rOVR#-KA"٬phm\arU[wI r;Fp) Cbn#W!1@Nwǐ;sZixL`r0;@`@`-&Ț^ޙda:d W؁`3Qk֬Uy/oY6Y'Iې$eg݇q~ڑ[d~HvȲ+ԶMk-[2Iې>UȎ> !?r>cH \|Y{֪KEGGpt a\arU_,X@~MkSkw{fӄST3zJ uS9ͻjѪ*zWUmyV.[.U*TѺ>}F_~UjUJ>jѪ<6$m_VMUjѫN>SrIn> T11֭ߠ |T[>joq"צ^ NUQ@)֑$M6SjU: 4{μdU+įE6#˺ŷΝw|6ӓO=gD4Pu񨱲Zj{Rik96Z^Fړվꋉ{Fzͺ.  -_N:H:ule3>,ЇΛ/ŢMkV5kIS:7o|}:k۩ze@-_Jsgc5c 417Qu&޹U۵چ;-ZŋkUڻWhLSUpam޼+W~*T`yӧdauiЛoCڶeLn$6.d$iۖZtVZ4zIXZ L]5kT={σbrIڵ{jլxƍv\8~(ٲ-nY۷"ɤO?2m쾖c#UվGk 9sV1SVMEGG̙Y3Pз'wu^;M3zH+ԳGw%$$h*S$y3Y,!eYzt&wwwϟ_ҥKjOnBy敻zꡕ+Uݽz5]?Qqqqݻ}#}ҲMyQ`>Z,m쾖c#חiOzK*vڭF|R˛*a ;C,[B:⢀N|J |}@OJ,x^`A]titbbb$s@GM>S-Z4ST%+DfruuR3ed[^ZOfۗZ>6@`/wwv:f}3"m._V$IǎGd<32S`PU|T\Gk߸[^] - RUw4=:jl_|}.k׾PzU )>>^.\И`۶j\:N[lbq|SճӴ/Owv xooF6S}ڻw]uњgRz{^|_mS>tq5lLk>kii;-z<'#SiS'iLCv|kLjJꃤF]:bȷ:t6mZ;]M<32[WeXԱC$'!tiFիjظj֮vkYOűI})i7qEEEAæjݦZn+q ޵vh4fg6mP2@FE8rOVR#9}Yo~u?սGm@gLLkIl\\ YVÌa O] Ծsܺլ]_#-ʕ=gZl\`H N/Yԫmꔉ9V[۴Wbbzs`˳sY+r<[_\\a  vvv kLt5彼3=Ɉtwng/#'w=U5hٜpW\~*TQZdZt$%u?듮9qKxyjl^97'#;ޯ֯Q2wUA5clҟ[>-}m^~Fl޲U ԻģL@`r?X6mi0C:uК5kE͛Օ4mٲM @`|'NԱc}wC\M&][Aߩj: VV>5VV1|,ICN~2 :,v%|J5k! U֭4}jn)-jշK8r}ܹ#;^ڵ{sR?i?HܹOO>tSLL6BkUg|pQSgWUF]U:KmiKRi՟^Vv٫ukKl6&LUjk-}1>Ҿw׫E]U-Z[lҾv駟ԩSZhz,at͜:up*;xm٨)K-nY۷"ɤO?R!飑o9B؉'2+Wk7qfL;jt{Ɉu&5Ӡ7Nq95kT={σbڮ{Tf R뇟6nԷCڝԈ?_Sm8-S1X5ԯ[7iέj߮(/IUFCz \˗S޼yơ/ŢMkV5kIS/f4o|}:k۩ze@-_Jsg} R$ܹSOz鴲OM띷tKʛ7ʖ}fhN~MU*g*ݴb XuÇ])v>> ~j׾q^6-Zի@R7:?T>n$-ZTҍ{se̴ۯ;Tv-YV_PRHbccsq}r+ưh4jȐ!r;tԲ+/٬ϿJ;ٜ!Ciℱ*Z&!C5e}϶項cھiS'iLCv|kLFuY,u>ITo8}~j׾sT2qEEEAæjݦZnT>~h3UZKo=T//gvWݴmjP~f4O}k}fWZyv_o[U F;^4365l?(C?dV#*d%E8#ۗXW@ZC:c +xaưYEoIp4@v;;@`NI垬D'< \\\5b ;m@'_װe'AvSkv;{AM  A彼Si>[ Tc5hЀ8t55o:CV5wu\&폌Z~*TQZ\X7 [b&k-mڵ_({5i$v j*66VVhzyeqU ֌SԤq#F\ap_%&&CС3<:ԩ : Ѩ"En]}( ŢJgvfi)Q=]v彼V.qZjUբem޼U˖˿ykyU |n_ <}ը |ԢU[Gv,Fqƥ:ĉULI&p͚5KׯSO=>HϟgApu53?Q: TF]}igsmeS[7~dҧ}… ϯ-q+(;5mH JuԎ唎;T;#5ma ~BB:攖Hf*NC }{+_|pWu@4_ T޼yUcFr垐z讄5Reʔ$5o/~ŲMʟ?եK}}յkWXXM6M|A7~Wҥ/ڿ+!C*TԩL^*zͺKC;p&rssSݓСӍUxToH=z<<<ҭ;**Jsќ9sTzum߾ :yvbz+4]doRkn,+oJZ\ݺv֊U|9+Du,gFF/teLwJ^>xI>-@Sz%`;/ W T⡇į=]?S!!!:p7z|˝d׮]Oi&G7n?̎L˛7V>fL? ?l:zx7YGsw2ɖ兇+<<\zr +Vl6l6/PժXHhIDATU;vPϞ=`칺pvQ˖P||f>+4 }{kԧwOO22oRwI3~Q/Xx]pAcNp*l{1LZ~vN>#Ggy;ㅾe4O}k}fWپFk'JZzz~N/Owv|}_;hܸqN ސzˠAt-[VEQHHBBB9pO=h)}G}oo]zU 7SsnMcƌn{RWնMk+#7\̇õ}WrE?P@d=2RXټyd=1yo Rf7֔I5m,9 ͘>Q.I_~5[,ԥKUF==3f~.bQaCSl[N~꒦QUu⯫,O"A2]fdGWϛG..RTLVc-.Z);4W)5vDM8^pҖ1$ZxSo|ǎɵIZBGQ_JÇz)L&{qo VF Mڽsڷk#>rgZlE;ӧhAKTxq[J{w͛iS[7~dҧ}Ɋg5kqu}WJs7#Fğ:y.F\VQ:rouE/_3SqSR=}saۯ^y v{|MyV<=e٣e;sFs='OL8,X0catYzt&wwwϟ_ҥKN|0bJ.-Ij_Q$D[P޼y޽zh劥Dnnnʓ'ef_am:kDE\  \dl7ZmvYlvYvu㇓LF%Z*ZH.Zbcc^["-[R߇,i3uʕ\3$JO&Y:vmuU2dXP!eT)TcTx -w ۼYOC)S:y###FoRki8L&%D]׭6ٯ[g2pu] v]2Hy\w~(SӕWUP̙1m ^?5cj׹rk:C={dZe[WO=%-dtI˗UY3>>++{k%!zzGԫWw͛UpeH=^Y,4bt~8;~4Е+Wd,_^={x۳OWNi7 dْ8qR+Wr<7~W.Q2Tbbbe>Kz4(~R/FB2\U.JNd +J|O(HC.Oϲz5n{>4m,}0r^Z5khiMl6NZ9J'}0~koU)xhnrOVR#g_UiP;VRקv)n>]>R#]2Uc+ OyDmڠ~dDC{yng3fkO';2F]Qлd" qnsI{FX!<7 ;=VUwO]7|UY/=l-[Tre;]F4`2h4Ք<7rqqqN7d0CyeYCb ƛ.77d@`,ɓGnnnlZVh0h47"r{;l6&22 F#ۉnV4󌜻n]%g;I]dOGm@'9Qn"; 6~~G  vvv;3v p]p;lt xxxLy$IbM2^qjul6Coȣ&'/N-7<<\fY;".ך.EÕpc8L* ;FIeek-6{"JvSw#=!AˉyEݍWI2vv1p}+W5_VJ.]F-;/Uʋ,k% $TFby1HX? l͜93s439g̸]F'U|DDDuFhF}x""@Q|_w7॔UB?**&)lp[嫺8ǔUɲ%" ^so v_L/:-`@Vd@K|^@i""uP; wsquŷNT d"Wd/-mnqYQTD`5-eUXVKԇc+*T>u%(/1o @gXF fj1i/ʪn7jcgp-//۽ˋuݺuCBUɠ_: k)”-`]/ BAK)C DIZLh>́UW˻h\}0`& Àt[gW $a$u1 fÐ[*(.J.U `c>m6ܵkU}bL؁^*PVnTx7ij&NEK*ݨ@m| `s&sד򢁉+i1t'ocI"3CR?[3(KHaغ(-Jp[릸IѦp\ljE[8!%*~ Zk󪰮d֚ ۚί@m%6!.5ivGYܭ| C"q5 Y51P |lIr~Wqg:g0~`<]yoU3)$;ѦxU1IS==𙾦|_Zgȧ|/%** c4 c ,Rc k|^T 4!k+[` @iwʧ u`L|FeDc;؟`;Emd'mifA+5Lۃ/gP(pNcޝ{PtmH0קx/tFߧ Du!WR^z"zz$TkSzƒFʵ T=y% +@ojf&j3Un3uqc+X&d՚<|$<@$P߲U)uw eyj:'R"Y^qhΧMH3kofP@colFSyP(!=\׭VGcmҕJ:Rfй~YRJ/걢 ZbjGTֱ޳5߮)Ԯ{ƙE,Ui} Eڞ@7*7|KFU]_Xj=JH>4?(m02ПE ]~߳02YZV==LSU$>{ٻV{1P,a Z& c8EAT٪gXy/MTM^Ua[T$l-G?@i7׭k-On+ЋUeXQ[JLUk0$*R@b|Jί҄n}j|Z/Sٵ&MyD9w9uM=<B " b4#A,TDTBJ%Ihkm~#}3 /p6 KOR?_ YzDDFcITD|z+ћ5z2{_1ZZp !3D@6W -ZEW:#ܵ{ Wc]- K_iK(>-c7|0|0|48(Q|T4%4MChyˏx5A?"«<,v*9HzJZ1( f\ Xw&"z6KV˧~\=ivϧv״*ߧ}M*`cgf=D+n_Jԧ X&/k>hӼunl<&`[!b5g^7h[^Ӭxݏ_:.C?P@y x"$NmhU;kh*Pxg\[7zPnfu~y0R,BQ5(^=DDc[gǸ 2<*{iCs|\>nJ93agPY}~C=m*GƶZw xDQ΄W@UZki[-W`,q(7<T?w/cIנ i^׍DDVM 1Vox;#":CJjח9l}e* UP%7i|C<^mP]fѽ@#ЯGIGU厨eU$%[@G~5 v2t(u EQ;-DDWm~^ ZIJUV1Q5#Z)%*K4(x}A@x`zObGH"W7Y cEizv¤7""zUFZnxMX*DDD/?0?XDDDe_fg"""a艈?"""r艈ĺ~xJO[oBݳ;ٖᥧ% ul ٿqkɿ?pcG0֕_,Tm?am@~~ADDݚ}Dٻa{yoCDxKxXX@D%֕W|} /-<}M;A%1Lcb%>k;f=C(c-+@TlnDʬ߲IDDF T*CJh3p:&6£jmpl6`㇈'IDDZ^^^.<\l1#r"*Z!k Pq(䯿 ^? h(?/񮔖fnD~sqL~8EQQ^ʾ! QA<_:B(NeO#y|gb H~:@Z6'P|B##$w$)Jzn hR#P@y (Eөh w(/I++ byDO g(+=<dc!WK@@T>@D@u(-qہ@ eU!c9EF8P*Ҁ͑+\Y2q dp @kU+K~_J^`LV7+ªٻwzlmQ_zs~RsƮX h '`1k[@8.З_pľ1|$ 䗀auYlE[=u/ڴ~M뼓k ,<7j'x8VNpךrRJ% C "kM_(sEiOT$0u|yBVPXxnqH*PfUBJ크J*So:UVr-x6ކa֜ڑ HHH)[n Q+ mtK?pIC@)~j*-ǃ:2 *Q(K)є-fәˣ"?0z62ˣb;lZq __صyp xIūCddޜ.탃lFpP}V'X?G9xcT!0z/@' l>>a qWn( (~g%_VTp~ &Ά0q=wل]V@Mצ>FI r;j򲩉zkxV. U7 N]Mip / Q;dzeMo]Qk?-~ $[| 0;ȕgOoK3%ú#@հNuV3}rnO|PǬ.((쁿560f8荽?ĕ$-80ZqMuʆU>+ChRXZөls>pK-eOx4USo-H V{*8" rMB e/@ ?լ9}O"^KWZ}Y?i |@ fy@$`QVDs/xz Ҭp  S VOmV$j /V O< ~E@ %> a;;ZzPv=[Z5(r(=)AJ^_/£j8(nk:(@'Z& ]CMi^msdwIzc,5'vmXM^i=<-AZm=ToR+;{ϚUpB@*YHM) @~#o  w/' U{G1{'r;?0N >R@ng`V%ο?7fqmPcgB\q0:^1oyiBjRpG=:* h:v?d7`JyAä%y@EJ=VkI~|1F=@U"E2v4kYϵPkA¬ ^$뾍d o1ؒ+kaqmwk~MmL 7 'at:B~~RJ](T\Hm!9~Wm y;Zt^?HpaO鱛Z: JzlTuE>EM˵PS^W uڇ>woE}/4"uy6Wט\ǧp#aoOco{бc=j}yocu5;4pLAIQ1xP_ !ݏ7@ e;_ )0+PT vv iՃ}$jk+6=,-T,}ioG$3 LUGnXa{@-l^띮%Mq  dczk@ȜU`H E%-`u4kY~ u }>.zcvX}_Z> O'Y f!v&2,|40z&GC] !Ec`S_1uג02cH}/8h+þne*Ӹ%:|J An6/>hcV9(9XԼ1@70uJAdS4uG/o)Zֳ_-ŧ%Ȫ@aӾѫ}c}'ywβ@/{cи.qqDev%N>Rv3}h>ZW~&1 d qm2W惪!{z#fcDD⨂}G|sLLƏ(ng üzM( IDATdeH H"yWd'G ?4>q@E8Niִ}QF2-Pc-_]^>Hиǃp~~6,z:]QTdnW +i @z1Trl GZtbţ2A0k!*[Q{N{ '0yTAI2LLY`QGޡ*:4Ok 2?tN{TAQ黥Ym=b "P|ZBk~p7nc<34MZ .W_gpcԚ v`)zKu+[JM~kE(b=-^s!ZuSH4J (h*A1!̻&ձyvW Ci P}*P%#M[mr{+8Sp 6wjӭږjh";?[@Ѩr*e ᳞7'?fm u/;nv `Hwr(/C#je`Kr*X6ۖFvWJe\ukL+IBp[@Ѱjy`U6 !{b:˫y+D=OK/XOi֋R`pO[emu~^x;)SJh= =^n߾\4#7llŧ%DP|<A~pX?m{@ -)N.QHg9:%O u7ZFWFE”\!<0zRU0Xm{UB4Mvm^UUVk]R{qWjnJ:q]ªk;oRr{iXPv6ɜЄ3WN r0y<;+>? U`ver6I>7ia[h 5rMN]R''ݵw rkhk].M_/$""\.O~1mq+k DDD[X_g'""ڢVU`g<""-j kfQY5艈艈艈ji=$xxDDDۍp 랫g y\k2"""Jˋh+y\ٶA DDD[ȹ51u=mf%EF )Mz<> ciUe`,kc RZAFVk݀LX0x`cjWGOW҄aTPzZ|9a,*=BR"q2o#t$k^۷ëUY4O3rļ6s9^kַI SJȪDQF^Cv)$$>F.0rsB z0G_MD'?x:*̵k9z): n撄 )MK[0G|C_q,r3v,`nc^fqxp'OE}띿=Nnhߎ {7y+pK0n^듽C<d0rvc!Wy=u<܊2ʼ k.EAYq`vMYdUp0`?B;4ҕ cT (>*أ /R8b!s38t83?@}vm1 | a$L)Qw/RI\?_rm:,mi](=/i^T%_̖O]Ϫ\q-p%(3gO')^e]Z ~6)%giUEԕ$bW#H|@`k}|C>^zHF TEA ?O!F}L)(J_erau4jxAJٱXԑCiX'#e%ڨOG4a<|\@YDN:+]xyju iXFK糕OJbd$L 9Z3ɣaɦ[zadnf*0sGH}F/t$Wi[ޙVs|xe9hs0@`@^y! 0f(^O[z>$.&۽CG(H~$/Y״2ԧ+]R/ӸYc\x]ڧS1<¡=ڧS|u?yi||M||1 !V2aݛ?|$)eۼff؏o3H^JYZ'u O$ FTve@ቄ&u?/ca,Up7 Mݏ>?<}6ѯO['ޙF/͓fzͣ<0C.n ([S`Rcg<CӠuijB!{i*? 052dØ{:^X\.õursYd˵yc@Rh {A~%cѰOvA^zN vNVm|>_4ʐ_=EqGXli>ca܆_R KqCD 1N0(=)U;iH+I dnd;&r""PVR3Ѷş:B99AVwf9FCD= LJ9 eTПt0df1usOS8y<.L:FD 7&ؙ~?6ԧ)ܼu. >z540>=47lV__&0񗉞y*CʪL۰(g-_m=z2  FODD` DDD@Oև艈艈艈i o̦Y\.ޞm^zRZk_\.׺ޞk hlr~k+t7Q7 4gF.2,]7͵ 3-[f9ά;5AD4h 4h wZk9L]Bn @[*- 'cCD= D7A ZS;ϭfj$LJ+ k  \.6CCmOjW֛;^ Ɏy/vp!kru?}\Z/FcSOɟzbﲈ|TsYf>hgGl.c1L~4ْ(5yaT^TPxPLM_/&1uu 2Fό"q1aõϮae$?I"nruR*Pz\?g{;2ѳu 'z|}Tn"ve?3wZġ(Jۼ澛ػc-u5_/sw8@t 3y?oRBCu~q!GD=1p{5\Jܽ `5 !ڮ[ǭT^,Coe\z)Vuқ~3ROBUU~턣Xs-ND;= p!!#aGSeH\%i|v@]yZ/jy.ܱ'20_5O7>?Ee݉hgbaٖZ;SWZj;kԧ)Lm. ܚe v&ˑD~oY=?g:>ZzZz=M<l7ue 33iѦ5z^̔!>:"z&jD_|]6}v#z:_i8ֲnyV(PhSFO H^M"|4B!M@O >O!^]XS?"A`=+4zvv>"=19=19=19=1ӆed;-V~ͮyԟ""zڰȩ{t}?83쉈hmi $q㦯N#q)B""0@DNExdd[׿Ekc5MCtǼV6Ok gqƢccpra-Mmю@O@jeXjҮőDJ&ʷT*dnqŲw0Qk~ ?CD;= LtaCPcѰ?,>DLBkQ.8=sge8ND;= TR+V>y%rmX4@,γ[6 !`,8d 4P3Q1yŖaH)1mx^ʐd'$!މVbK^J"z&ӾS8BGBH}|"'"U`,"'",|"ig|AL ~ 'i 7o݄BFR۵Ȉ^7^ٙa3QDDo~HNW~W|"" kDDD@ODD` DDD@ODD` DDD@ODD` DDD@ODD` DDD@ODD` 40.I֝m = џ;cJQ@IAD+aWF.IL4 傦iHAUUYDD@O}Rʐb#q1$&/L&/L"r"ʋ  ,L"`jFo4qk|=a!gB` ð}7w7`a E@ q?d P.Yv_>^47:mbW0 $$?*"Um1_?FJHD;Vo\/Kjϋ!7ʐ8>e v&bK~boǠ}a4RO@hGZO^e^UDD=Oe_xsѳ,T"ڑS5z""m艈艈艈艈Ww h Y9999h# IDATӖXq~#"r:^-hTQRڻdb`^],>06$1u51L|GIe|~cDcXx0o,H~21$?d0{nM7o>r%õϧ1?t%\rB|Bh$)sHH>v~m= j18B#aF-㣧i^ޟ@SXDDa=m*0:AL9N@Or<^KS}M]U$>B&"Z#69=19=19{Ӻ  ab艈艈艈艈艈艈艈艈艈艈艈艈艈艈艈艈艈艈艈艈艈艈艈艈"(?/zZ6@Okš<kDDD@ODD` DDD@ODD` DDD@ODD` DDD@ODD` DDD@ODD` DDD@ODD` DDDƷцU@uAAIUے.Sn[j9)%d *܀GưjcTeH@!vb(!q2z 1n@"##D|oWEp]Xjk*},lcIrt8<=18xF:\@A• Qbp{|`t,ƒ%qx1-CmS<㡚V r{wr˼5~TV }K$<&Ds4XjAڃ> BB>C2B\۟ކ˔;17/bjj nipua=1Rjaz1ۼ?!ۖ [F];Y==lX$K$WK7Uq)WKl6Xbb+DcȶD&_?]CIT*T^ 8<'"N=̃%~i&+^#XW_-쯇22apXqwPn[U:I2I0=祔D"x.@h_\|g*߄XDـW*ܹpKXXz^Pػl֡ʔ KWQSӸ5ݫx\,Dm 38y $FԖ{ek+ĭ5TOL1Ɨ ml`7EH} 0}| ʧk`x{en%qx g8q,{@ j33܃7#T`ꇓ<80l8?9ni^CalV=gt~ރ*<$FE[!`,VG70,XA'qwW0َ׿9{/>0ύc);B|/|usߣ-oS0^RnK4j+`2ULRFROp.\)ݮg̿p kyy*3/ zb(CXn^݆Nr:.~Eǐm!9GHՙjev7jiu>t{R{=zƗ룛K(2|b***#JeHb岲 pTA !i Vq͋ﮠ6d^ڽm^P(U9GDBbw;9_?sA0 nM4ͮ~;czj>{ٮ.;JSX@%Eb+Dj!j!l5llqf6 CZ!–@-1sbϜοV;U5tNVy`2ض$$艡w݀y;NQRwoծ- ߼͍uj3Uܻԡk3ѵkήl=kHKP<pj'XO0Jm_]ߊB>>w1=5/7zg XGPD&°"|(n~&\CujzK7qTiL.H%qx AO E~䓕tNgPy24uiPWxzu( 0/5| 3UdΛuk9w0=S^"۸F{qPvn?fYH <~Gٿ09YE@c[XtWX|:.^w7@ؿ%z}{ͿavK@6zb8zNL歛9XdcƻX[7n\s?]=e\ˬMlgKU#d!szͩCg}?3\mK"GM^w] ^r+wWss qO! w C1@p9U9zi4@ N7yIHCAȂ}WﰎJK|ha0-9=DcĖ0KZH1.~8:j΍(%>3Bl,ghp$@T @ڗ<SQ%qV400GaAN]=OwT` V%wqvC8LOMvˋ?7JG!N.#LXҼݼ$$艡yLOM2w Ow/sV{iS{ Y4 XԋXx߯Cn>ਏ*?4/G7/ z⑨̠zbQHZ埦oʟrσP߬SXҼXc*#" Rp&y8kK8ā>zbd3I%%Ah(  1$ C  1$ C  1$ C   "! z ؇HMړ' }P sPf< ؗH a@%&89zn5$ b?Bmc/zB  AK{?JIA>3<'AOA*d"> 1ewwaAA#d"R$=4q A\|]v 1 #AO쉷iIp@\w;瑠'=$ R!o] z ا`0gwmTAOn'uW]A' C z 8Đ' C b?H$Rf< 8h0A|9xAwomdm  1' }% C % Î%{eL- C  1' Vr9ې@)c$ ' z`+1H)(oQ5dBD1 ԦmDBBDh~Ľ{kX{ l7K֦"a_]@PDP¯. lF[bOGAN2 y=1$L$_5vo V_a-'m ,{or_c9, 8tX=U?A<湇RC!Bpa@c'fR%DBlEB0B# r:~6JjjT/8xo!Bwq.HC-4˨̀}11GXJ"~o8\1GE:~ܵ-!x~Փ? ^$^w=N&1BD4q?Onw=v^C.B;K83sXÃ]ko\W-!5 ~Ү}IUTK.v:ֿ\;vx޻=]gs~<\pXV>[d6_m~}ٍV1?wpX{<Gjj}'P;5C_xL0e; e$XXg1艡p9G+ 1BMd"۲CGB 8W?œ2avK}xOl {n!MkrџL޸Hoc/@QQ l60sfQ"{ !\wvg_E~SS671{zvYsn?xpX~>}ٍDі{ {qK ++zBLH6\HuO EPD:]b+gh~ӀǕzi7z<-c0F85]+̜jj- QG)aǷ0ف9g"gNװ|cHS;UC7P0<807ӧ5bodPLc*VﬡB }@g]5.^KKXکY׍wq pWr-~/-vr @]o{<ޟ&6;}ie,^Z>x_XG%C=|&؟~w}Oؾd:_4Bf_lSgéo[Xr vdTqJ#x.@hw*rm y I(}L=?+4(=򾑡8\ ʯg}=]p$6p"~j #lʱ- oHe$< P'_ @𣖛CL`Ce;FmQ*EKܨp# qpsxSSh<1AeS?u ؅]1BW2A}oeI)$W0)[eOiߤA UG[” pi[k$XA@v8Cd' ,ׅ#hjU1,i>Ɣ!;Q!'' d殂^AX ݁@+ H)!P 2sWA/3AK.iퟞ$JaTmkIӎ 8 #7{2u!t%($Xol 7r2Hc#QAAd79RfObs{er ?Uc s{Zr]  G?n-3R;0+b c bo{f; ⠲+*3wWǖ`+1@XVfqVkAvBfzPt&ǫ-̜'+6E̵ ′MNZf:u`_|(7\ IDATPpkLhll@XxcK:^1?\lUcK 8&7S&Omgu՞̗kSHuo7sT ?ʓ,ջx-,zu{6l`|v$ rs ~9px]F;-`WJOϠ\yo *Jmv- 8@ *77{ 3Ͻt/N0/NV?]/g1{z 1R枮EAA妔k:[cN]} ss?r/AԊpe\PHHq?ád" ǀr3Y9vݏ2s0g.;;-Zb E 1}<-#(-p̽2kAAaPic A})o-,YyXk4qNS+q,w^EO~s8,߸ַMA㼎ͮ>ށ):1ӽ*Xw*Gh6C[Lb{uǧ'9G%(u8PTOViͽ2Hu=BK^íoUK\0G%HuOgf_A  Bh{{f{U00'ߨ;}2^P̝0<*GA!f/F!3 ;:1,iZCRyZ 82s=+1ȶqD:NcpRA Q$M `3j2s4Q^10L )c ޸i&<ϧrH>B%h 7Tn@f*^9_ꈶs7: :hdaq,Qp3?:S=UA b02yT:Sٹ9\E,|*[Ep,@T g^ G<$En.3 ]{j~1*pK2x \FOA5Aq( pz]} fnv/Y&^ QTэ/*p:ޏ*| P^Vsyf{,8ҬٵڝUO rTC R b(">M,$ܫgQySv@oB#2!]}"q\v'[CZ*wN$U}fDB`}cF3 3 nv;Te?qŁBes\ɚ)Lr_ߵ]9d?~יuRJ̿2?>}%ʋ\LOMJAa<0`o%,ZorW$\S7?YA,%76xio P,v ?ٗ,³fgs/afGwzAAT?RfS8;wo<ʋ}i5LbQ:wV& 8r~V.u ^{g< |P;YJAnEwnWޙhK+g{V`{R6)᳐>$ 123N*VߝAy #l_02 Pӳ4~s8,߸Iy 03FPA2< q `F% 4ٗIuI6eB=& zQ2)1~0kEʀhC04^%'b0HF,#Y9':ϓ   $@ |7fH(2 YFZQ0jj<4Vz Ʌ} K8 RIDB?:2Q'>%ɨq[b\{{P=U;@葤ݼ;{̇ TOj`#twɸ A O%)zs.%$򖴷R!2Aq0xݨbF7gӼj  wh+4@!nK?cΪw n}`R<|m%!IaE ;8s4 O)k7um<>1{zKYŕwG%Z,g_KBe?3m? svzc7H*^@Zfw:,-^O&VXѓޞsus O~Wb]r;< y>> 8 S)!S[㪧!c&!Q#]Wm^)tUdz2I"NұAG9mQ/3mpYǥ_|Wfu\…|,.Nuטn'e}quo2'8e+`Zrؓ q̾L]xjf'~s-b)9ēf q;7y10+q$k?}k鶡D8w] Gv,RBH ގ'^?sEE1\K>ikKT 8H0R=Sy3HD5{̬K``IVJ up"C*cs@!X:KLkj c}-KKSPQb c(N\]bKh]:εݱƻq :<)s9ОȤ?qdT >WaUN G9y NJ=cA" E~wa9MӻmT4t X=c-azH8i \@H$\ fgj\% 4VKN|e@iXm<0 E5'1")~#Eq`M1Za 6f2]t1'/,ahCUa \,$sED&bS±\_2Uv;ߏȴiݾ^ ŴtAMvիSPgFLIg,ENQ B؛@'bD[C?Xf xZO16t)mGm-#aci.81xiꚝ/sPXr;bЄܐIdW!L$<\6h- EB;BK/lc1~M*2Vr׵m҉N{E)sB1$+łҶtOېv-)LG+RA`D qutXWռw,&R EϯZeH򋟜SzjC yf9B݂߲>e>$bB#.Ur2;L>ZBe ˄l3sݎ=i9L Yfș^8H0%̢E&psv36g;ԥx Rq@W*yKmi6{$9cڡr"ljGo*L|){~ 5GN'wXNmvayAfG|߳׬d,Oa@avOxݢ% ?r w\'bp0Ԃi<땧+yv.K.Xu-ƘP籒^8V/)92RiZ]-8jS583nQ.jk<]pd\WkhKD[!T!Ç\9@fw<R}(n#RZ ,ԙByZ;NoTs07rvn dz7]'2Ԟz:=1^RGv02nŅ #` ,1xF8Aﲵ\hK$$V^m3E W{K8O7H"  czg;LKze2FJjw$P?\k rGgvՉD&Jιbhzgd&SяYvwg$k}!3s 0&peNhA[=&v2{eCR6—ݸK|y^1`Q^#@Z P(  92uή+ =Fǖ܎uXۙs`h *GE$}bG"j P fSJ\ `M= Qb9UwVwjܖD3Ɯng.ЊuNaHi.`+1-x|-ȍ6+~_J"|EpW2*]פQByXB} d}| c.<ń%Lmm41pb;VR8x*Vq!~jF6:֚rRg:) lAfC04P- k%>17igΊH Pm9pԳ\휍3 d [ `+ˆ:jg=v Ll>?+v3] ю'z cK*G96!x&uD};v0B #4QQ2.Z[agHnX;y8 ;CL%1QoRw൮M僵G&;dAJ?DsiC&̋) sq]:K5 V6;@]3N߅1KoPBEYqROnx+m R3nft6YhOsWRBevj@K (qzτ}z| `x'QKLpUɵ6n´|ӑߚeJM/yp'alRBc[JsRda񎍛BH腄Y>T*;K$*+: Rmp j6Xmo[0fB ؾZa!q{Pt*Y|_դ  -l(' iݶ1}4z*t셌3.ЗtAv:ɛ+=Aey{#c3)y[ C#1Jmc$14[LⵐOیWR jGDx2k/86h) "!L(zi%9% e2 {Rf!_.gC(R <,7Ip\Gۙ6DQ1>m' /@.99EkEeHyhG:uLR&;߹ nw C/ 7%0y cV~}s^_8sKn4A#C6@e7_EmiӘzqϒ整gNsm|啹v읬9ؑ"mlw:r Imy X9O"!(emоLG **N5,DpK@nGKvb~; у!4 i}^r0;֜a`gN/1Y mux};PHSHXDf}#l@GLw\Lbpec]zM3[25s@'~ЋRWx+l22D;@⌁q(U|j֍Z,s :DJI z|܃YfZ-M_^&/1xppglRgMd.wr~SݘìTLI+ջV(kvb;FՂޝ-:ثf+eUzjЮL ꡣz[7wR(l+QyAGaJwKhi! 뤵p\({Am޳HAL;X,=|5D:1wr2_]\!sQd<AVʼZe` zwyV;BJSRzg cO(W,uZDBpi C&㒩]xhovdjVQZ+ӎor.+^*]k{*_cC$Z 7pP\-¬D9 & 'tDil2@]|mv lgg3y3U?\G~|;ЂЀv .1`5;gbP@%lY X}EvfCN֮,^'Q9'dA DBu,<'2Uj1( Uu({ݲ)+ 8Y2%)I+.Zž{#ZuдZS9O}<ۨi{E) 7Q>6Ixi1%lxԖI6p%kY2%{ CU!wRVuDl9!x0m DI+jʬjҨEakA"=##0GL C!LR O?\H@9."\h@SYB&+ S ˕8 _C<})nE$Ω;A HP Zsq!6 aTl?aameHSy!x>ȴR }TrpPbiJm6"B[c̘dvdjݣՓ3,j_e߇bG[D,ҴcY,~*{|TB'RR"Wf^ p\Qz#D@Z)u!,qKfc.V ~3lV7=dnݤ+VodpǸ?a^١'Vxjp]+%Y:mJX{ƏbzS@1o$x#j{!z"|Є! DHaq0nUvlPNOפK0]UTdGŦW_S;R%)PъՂ'y][k'YYHѻzOp:mF3GeKs0aLSy{Iz7_&' 4 Me1ݘ;jq-Dg7jnz U$B&=<=&|Av8}IG-UpJ+$U[B8;'LA0pK,u4[ٗg\u6 c79 񴰊uy%Ȧ_pFf %+w`Qb]ti(4VAfqcɜd;ʍGe.ld Kg2ha/x˱o,Km:!_LJC;攀X. uƺ.XYjOE߆D?EB3ֱٸ_|PQ z5U0C{`@(B@!WΑIkJ" kK+3\1&;}uuM'JNCzיPj6hf9紡? V[i7֮ĩw_gG-X 6NPkAJu>Ήצyl`cc_6ԗ_1}iL8hl1S+ʓ:y lŢʮ.q_{K- !:!"'e^Cل_U[61} #WP{6\\egOT|8-]g["uh7dV1XI%B%>_ `Ϊ1@s["xcW@#ҏЊZzsCEah¥|/҅c.,=UwUL M4@ kXo>.v4˅:+-"a9:;A_gwؽoB; KY(@z1rKY \5=Bn*/`s40ZU~S(OxXoGҪm0=5\+q\fڦX=ҙHFC FӉ jGQKJ'|0GN$V>]54ufhK3`_azj`WBC+ZJm X<|J.T؊CիuWaI.w KU儧o#$V,S]4-97}BtRu`L˾VYScv[Ų{3 s",aȒcKXJ\5.`R~LW~pev[JrW >퇇[!0x:ul=`,9\r3y~މ.|4S")aݐJ9)͂L'-Ok{PǷP.X6f_ef^ilLMMc۸~*վ7vʋH 4tx s堗ɽs_yN՘xp/AHYi8JY"6Z7CҔf'TiNg=Yft)ʬ:kf*A{'wBj !gr:i‰Y.$NzNOO0}| NO>ֿ\ǭ旛JA Xx: mt֌3G XBd ܧa`b2.c23ʶD(C_ԩvD;s^RN*cJM&7/n˪veK0l"8 8 ax8ɪ+&TjrR 2XpYbz.\,`D*RMWs!BRݷ܌{ .CKiDmQ08b[2{.$`Q+ _BZYn5Ve6rSL`;͹Lrq@EDzO}4.?X|U~^2>y Fޯ~6/y2f<`cLa0J9Se?R;k1*&+.[J99S7B9n3LDpG6M [)d+q^cYY,[3C.lsEwR9suyW? av>h6mai{uΤ [!¤D<Μ~q"||Ҫy-Py~`\uQ/XMp463+/>5-l0G݄ez IĊDT9Yٖo4?K{g,O|W@;@nDZqvOX;WQ8uIz^UNlGN' #:TJ>lUOot9ݵdSLXV`#-ΝE66%蓴'ss`R?6a:['8xg;x]U0q+L ܹr! _eJCL!@v)ڒWmg_z7Wxq"p4kfc븗b>,{4+\=|EAn7|;!t}Yr4̞jCQ-+1 eqM5d P;Uۅڕ]g_` jmhԃD2~LZ7 }+1tJm-`_p人;uL)Ц_@B)P&[PAքa8 rƘk}tإ=!Ϝ{1G"GsO]'_աb>>P!cKqe)֬:4]xw-Pz{beI[-"3s4{67?Sfю*jr[ r)ﺔ)ka >(~aJmv-hln㍯"VZVP\ Ն~ mΦwb]s@<_HLMd7]=C|Gcxn9mh,AI`*PެU?4LfRkb+"J 12+DT'#cY*5^ıAKG_BV7?b5Z.>0vbQNgnn`%r.3 j;bDfŞ}Yͱ}LKMf@ 3gX=좵lAU:'}Ucu#͠Σ9yU*m[ЮTJuc5Q~gi} >Ӎiw";J,`toH6N ;K1^WP=MCޟ"8)fzQ鹕j&5Isv ?a!b &+f<ђГ O@69U:3Im/3*J &?)@j]7/<//qfh^%%ByoAaFd}tb)uxu'ʐ= ÍL#1STy)ӌtk9@kTK։zMz;i8uՃeWg9tEDh5ײ_=\rD.2F]1s ɛ pRUǡ*ȍө՟|!"PSc*{ι*W×a&}nԫ1Y<>BA\4gfF$GNz"h>ȃ&X_3h~YEK?y u]XfFwI8{_Ý{wX,p|NxmkyѭYumSUYBbBk4[25g|R  VUwWXkp=-xFp߿i\H~Ђ`ϰdO-eODvYŹno",$|{1{[^a=TJ4 ڶE=3Jј#oMYbINɧ%q>T*MƦl`s5g͜r/@= $H 1_Dوt?6U(^aL~6k<^7֤'$liwm% ,?Yk,6񌔕ժi?3C?tш&X[FAZbȫ׾RKfl#"{y.v9ؙgNu_2g\|Y^/pKG^G`UsK/`->FWs]P Br\k'W&CZY=AzE@˵3!. ئ?KFwG{#˫llnՂAϷ}@5N,18WspɦWDQ ȜQ3`z=GvXMcf3ϸtױ_`y܄:tHҪTd|"s n/j*9H׊Q41s'L|KwWUtmA4gYJ=kmW+V h1I0R_%;F{b@QhIXeءss`>@,oAKXaVO;,ÎA#նjR<ט~'(@B?J^_׆H ?[u_ ț@?.bf bK:1;J"T (~a(oӔr> M}y+}E+ Le̛~c-^zϟDwZugl~$&ox aX]Vhm5ٷ@gM' ڇ]q|!x_p_˱seNr ({hv1 p }sαb(r,$_&ڶ>.TEMUf=*['Ԝr|wZ "ǐ] YfT6ah;OHΐ"zOǀ7z v/N{y/>dEh~iziC!R=i3Οݛ Y|ʧ&؟kS6o`{-I5 _wXj>;Pp e9.3,4 U~ sܺ>^VIEARd8h|ĭZ̛~)kYJȉ=miĥl{wµo%}M>3^1\OoOnkB0fsgr*F˽J>d9|FoLEaG~< /> .J8j _hd>cD9:6X6p1>yG0L:Xb߽wZGWq^18}?wHsc3[h ˯߿ >lG:g^~Oi\uܹ{9}(_.4X~Jp+簺w^Kvl|VKhұهS%.> uxwqpp+_"@Dc}7gb[;-v]`>h'78\dQőjf>;Э8{v ݏ>ĵo^Ǖ/_UĖ'4#8ΏG>.],Y}/?ynqp|*(qW`eG2,(ӈ_򲵂J4#vE'iƟϹvO`ܨ'Λx<}>MiN:$5bB:*/ŗTqcm~u\u_B۶k_9+s櫐imx ƓY>+/]_vyhU]\Qƭޑm1@F|o[p~v%e d%{6,Hc*%s_;]]f}w?퟼}Ͳ IDATq }xڽ9V+yo/])旨-f`gn|fDG]ҟDje/-kY7LJ`؇ݻó+cÔY4{ -М]x1V;|/6bըHu#< d>5MPQ҈:{cnSwi:Wt(Ey~ ~$Ru|"tJf:T]u UHnzVk8PK}5IAVծӌ۸WqY[wnJu@*Jٿ#YNJbBVß=||jX,^@ͺ] yhvh۔(xa;07{pyf>R{'K.ry 4{hYEo]кc294/D[/uVa+2cuײ SQ;x<::X@lzƵ+cf >:/`ŵjQk)y {vrRFoYOlTJSvМ&8U[ZQ >$Q/Qք^ؙQx#|Gz?;"{Cq[(VƽMI` ̮U7`\J'`1kkH6 ui(g/`A¿u>ueSefB6^RqTRƍzՖҤrϠ, Os%$wkF"3uVrFܽLR s='ms!MOsrԥ^Pۣ`2=F UM_ܩ+ t~p A "OsnW+,ʼn+_۸[F|֏Ýwz M\kX{]˛+nOoڷn  JCTcgO}Yk߼7.}2nn|F Zx>: [B-gEF`s0t&dV)ÏA0iN̺ʄh6/hGU" ̸3A!d *Ertµ?RƟpM4V8^>//u713?AX o^/Է6v'=p˸o7$Hm\..| ײ1 %W~r y5|W3 ߾~u:a-NZ:=ju -ILU$w(r=c34SJ]+=+(ua ^w!؊P бǝw1ag}35V;|x.n-`ʹ-D6&TT]a!ktA5꽹TJrϭˆ)\@ך^>~GVF&&@r`dUf29X= 9)@SO4>@f\IنyC&Pe}qɌ '&?^e d63|>+2V6EGSy/3|w+W sa`5.P^{x ̚0A)xO.^'ӬauxGay{Z5|{xpvbqn!4ߡ[3l,^r5zoEDfEhKcrX=֍3{ݻ8wOp4 IVz{ f4;P.-N,fUT ;GsժEw>X] ; ca/y17flxJ;ATGVYrPY_ @M[PJ+z³l=(./3iOx BdJ JJg p]NhߧxyT")οzw~vw{?z/ kmGI̧Z l|xTy>b> lw# dm0imͥh_`"o k}F<&OR"f\:؝:x5̛EU.x*k7w׾F<ƥW/Wm\x<\x Xc,^^[ޏoڝK߼u?昚H}RåwMt??A>g3_%Xx뿽Xi-NZÓs,GpTf,2evJ6ԸsN]h'%-9Ydu+&kLv3V3Rvq iKi!SWиTvD{*S UC>^Qb5J6Fā^zϊL/\o_vP+.V?"`b9Dc>𫼔/S@ *ho !8hޏ^"RcxMƒ13Y7㛸p^}uڰ'9شk*fk=16[ q@z{N u0>3\haTGRז\@=5v?l/ ~Ώދw??~CsSq` ş7.9#w'Z/^"/e4:U4Û")B-78Y$_u-j| ¬һ{ܤ9SQҾ;Q)_r99jcC(֚Ϭ )%j 5u1n-*p܍fM4 !Kt΍60N)[vfTsEQ &[m*~tHRP|i(a([ ch [Ԥeq_(MF,^3\[{y8n&xb#\8Nʃ_/~L|#m>]`2t -ܣp2Lj%gSIyq|6'OSI2oDw>{Bæy Yiq yb{`6J{@L,DNoH*ke$kkSD@\P <VV[Z=v=|mkS'fW !s{Qz䄘H@怵T;UNGs*xR^8[8zSqR8rWFxL-[uΝ5i@d>yf! Awhu‚8Xf!=S$~*Sd٨&ǒ>nd}fpOqO[XsTgO.k9̕vͩz!M߹3z%XkX$\ 8*X203u+ER8K V=lW.gQ?ĽqY7ǽΧ n^j R#풄l:5!.H AzT v'-Rm~=,@p7) z=nzMkq-*"3>!˘{Yv*@n{ptӛxQp-Q=/Nb6H.$r>yE p/Ƃ9y%xnKs q`lspG,475iCzF-Uw@排`fTT/;׉(̚S 20ihG34`"!`8nNE tkI%ٺ. }/%=n]i(4Ep)Iþg0=Gu?)JWJ(rzE`ٲJߢTGƄn2V4N?OiD0_;߄]gu*LjyrlވL!fuolu_!niFn=PA=3O\߮óY5BFQ̛݋[Ǥ@uc- 񢮔7Nr|#!RIzbnw ]'973ݭVh>p.nj<3V;ѬF=`=lˊEK-fu*~/(71ZU2˦ خjR"(0~LW"]*-]P*l\\ ͈8nH~rxVB/+D;lp8xP/d_eiwi!w1yxUffy~ ZǙ-km6YE!J}a"}܀]_5r'\LoAʃ׮79 rΏ|,g;:y S/;T=9'6ҥDZV-d79w wTN86˶mjFu 'u7߱xfq1mpj'~#@%ؑnXe"}(en[ !st&;/(ї7dHhL* D| H02S?"KT)Rժ&pPKP$Ef:'@ẕ]g7gKvk%VDCHSјRgdUzrM9}c[xp jQYQgB=]ކMDH3BߥU \yfI9M Hڌu] f4.9,U%]\É~}Dsv^W1LXF @gSf0]~LJ (/DX\7ghq5ܜ#a_g 2+%|E=Xw(̝͋!C_q:<:ia9KgŹuq/tiRB)j~f4e $ 2 DAL}',[S^`]IWz:t] ?ՙyԻɤS%,Oj̈́5w],DR1yÚDl<,9 Q  ]!OY"(B.d!-(&qϙ}"sԃ1 7>@BʷhQMX$=aLqTQa2l%xr;1Yr!( "׿R:n [!2Lfgrar)~zg1 wAo3/&M 'F(q]E\ }~u>"#IJ9~qq E6[mҫP[[w\z"|yO_PZ5gh[Oe ?eДɎ{%'}|&>/J%ic@Ұ{Cmd]-*C x9a$eWFMDl¦Ip#D%྘}l',6hryf.ZR&zTq W%Ǹӂ5q(*~'3w\>6cg~x p scEe#?_p*Fz(9Ol2P˫p_x1Ɲw>PDAt!xK \x _MH):jHo&~0UIVyɱn|e+U&94pM&M~N}z@dt/4k{֌f7L/͑ˋ ]\ڈeqD AE6ZqW%f9%LH69,Ј@B)}M`|3O~~pgͯi:`ЦgSTSiRPJ[kM#ƲuLv~ua8f9 L;H|Js%)@_Jd|4! (H{!{;\D Dw;,@!>:\XFY=X*TZU5ɴ7<ձj"T\ SQO|Q }̐w4!?A_+QICxm[d&z^0[/-&|LxF_cMَa>Sَ3g ۮï:dí} ndjhwBo"g >sNnuC_A-Wsa+c'ރl.*C<3c$NqZ{MBb3T]*Uu?w؊`Q%H ;^(߮L "BZE߼ͪ~g4'Pt'94fMx=/W,jwgʂ1|O5Ci=CŐf.ھ>3?ً;1]6h ltcF8  r7̀4, t&[O ,ðcIDATq@˃>@8*k5Sqy`ڈ t1_ =|CB?P׶c;c;N3RMKFIXemvՂn"kmq֪ F]EO a_= G]L=ߑ 8 愞ym K-D˅nIY%}Q`fQgܸdz9V]U^i׊z_`x^kvBegua>94cu/ 9` N)h)uOۏ6bW=A=༟Gߣ8.=Q(@b7 ˀ r#ߨ`}w;c;2 ט`(X""PZ4Y^{]>p^sFffAֱ(BX{ؙAg87pXF~X!Cפu%J|s:%8ēϰaZWLi)# %0ZA B `-p>˯f؆*0!E-u֮'(eqW*lTHUp'r@Vj7W6!y^-$m=CXV#V\= QJ6%۞vlv3갓6D5 *[EN.z֔Nh:|3c\c$gr @'Nm 'B7\pO07i3Cpއcȓ;=55xҒh[1:IVjOZ >@u=˵#m"{>thcJVБūL8P+|2~$1+ASH;T2 <5ki6Ŀ\̄@\2s۱qSrp`tPuQ-Yx,'KkTfj8R;!q_q <|KZ6rE>E:g/PςG&ʞDs,۩d{(uʹ@ydAAh.s_~Td(IݕZU^3bJdPφ;$%Yhh sph ;BぷuxFMQ"UEߎ؎'|ԩ{^؞96)"jxd=掁P o>jA:s `#Z-k^rhݡ}p_)hE!M}cDF].OuM {׉GUlS@fýP">iͅdv8PoE؜r X@1Q+8C:|d1;OHIg+MvZΆɇ"`׬ s7c@CNh&۱۱'`sedrU0v*JDhk4@fHBT0riv5gb3<^W x;k"+TKIK_+4#{#F;fıl_W1B@TٳUY[' C gYj{TTQ̀'Dsa d9rԤ4Ax !`'{!inÒԈ gx=&?8Ouk^ߣ[)rg"/ٟSr lƶc;1FԪV"Jcfu4-kAf/,N-qDkhF께۸Tu+[KyݨN"rH~&g>=yv Տ]XŸTHuwuUWhtN2x"yT­:ԳZ5Ï*JhLl&W]32*[Bӎ*l( t7f'2b){LȳN)Fwf¿.IS]#Xr`SRg;c;T;#$L+`w[fM!kG]q[غT$WG.{ Pq ^,}yp ع$*xsփЮQ(uke @WGn`TsW++V(\PJQ\O7p -Gp]/?,Xm%[A}`~L ʾےvlNj52Skl*BjiЗv$n5SutF;P/y`}NDg:%RwhP[2CWȠҬzFGk`<ރ{ء=ta+c2gWҼ< QENWf­K;ٳlVߪ{]**oYOFY?95 ƛ(Y6MAY\R>5Ց?Egz彛Qv}Q7 eṽ`ή+7W#g/)rΛo(#+Ыc (},qmߎxAOĨ>砙ecQ?wqSms9QL|k~+ ?z{F(Ls`fؽΉD.*Hp~z~%ʴfF 3Ue@5{[J)d9l*jR:Dkv7 c[ [`_]3dzAC\@Ū3?pCBeT']_X_c FE.&u DdM>,By-Nj!NzG]^,o@T266*]h);Buz7y5*mGh)G~Slb4N),a;Rr^:LֶjLүs"F4vi^Z>YDDK%r̘Nș)/5U`E,LDT(jSYI&GC?.#$+IZ[ ܲ5/QQ"}o~9LUx]2ַgJEEND"HaL(d^FHR0YPsomsOAڂj}O+SFEb-KPD,‹2b7aXWye*ԞSjʈhFY/<}Ɖ,e[D4}RSohDu>ybN9=]`"hJئu0P: yLT$^7?6}[2^H6rVK$0i4+WF8/r*("*x+rTHT1b)RojYYR˥mE2H`Xx_"yN!":Ɉ('NFE:"9lu:76V q^]f%l- 씞zg^DEHT.# u4T`]4OTF_HAy+;yTESmi6*SVޮ֐w8{f2bTy0"J?CgD+/j"V`$;9lDD,y> 8] "X,1;7-Kؒʍ+;JEyKD>.HUdꫂ~yl@fb+#23 Q"E-ׄP/*]dYzfeIrd& ˝DGZ,s*W}_^RfrcQnlNKdF*׌ jg`\a-J]BWQy&bKg R94IU5R{uRsVΘSOERTVBe # fZ7RB.Z-Su?u^VT*c}{hZSK("(pծYbf}Igd΋4#sn#"*r X?< !FD \O26/asL#"eA0? ΰshG[k=6bx9Dy :d&Fd1眙ˣCTXTiWEӚjXl9$ͮn۹/m|'#mbXp`nT-$tυSZу2bnċ4bŧzYmbdņbZ(rI6>re^djт`'|{5""Im*"FK-\+oHT^X |Xbnfd&kGy 3'7OLQR13q+SQkIs`_Qe~+\d(P;wD0>\-|O #(/̔[ `OU|y\MQ_:I^SM&~VuSe Ýޯw}[gj^&ūZҨ-[%˹m0N|iNJxݶaad[;EʛK#ffs X8.[|]T*Q:goMQY|ݒt!1[x2VsGz jݢ~ v-~-Nϭ3{WZͥa13fLkcB#/Z:Ⱥ\,cGI`D5[d-0fEl>χzȼ͆mL,Yx)"wJ+Is-?.\<" uya'}|+OT1d2fD^ÎܓSN}VΊn5Wh{JTsQOp- u  >@>޾v36v& [= Ql\AD. U6|@|Jvt% a6L8VJ}dT*JCYwy#7=MJzF<>*R|nG]dDo.;4m=de:Ú M&S웘G42Rx?g{]&QqƘ&t&-Jٰ,9y+=m 33D? ^""!L Jer)M;}NMhO}( I[튢諩*BeFk^X["vSUn!ۺ$s Oc Q6 ]unH#gkE~eYl-ec/KMGJK&ٴ\5NLGVq{Н{"oĝ}&\3[;1c-eC/xF<ɄWy{vI>-L j|`K061v |9=K?D]zŽM}ò6v&lwRp&F6֓3E~4 4а70|=} +m93ޤ? #yYh s]剫=%" ||Qx[Ale7~{U ǾG.?. s9{*O-m8s6t:}4H|V$wq;z)~B{>j/~>"ʿiD?闟ϞgV?5[Z~Webwa7%M׈{EDi"JKH;7D)@wKGOQ>_" Vmi> >Lv*pk2֐&R~LǯNX:X ,eU*/D/EX=Cg=tRDDB~RU~O={Tg_`?gr,cf-Z: T ~-~={.G/vGz>JKp?bv"7N \]Vw3~m3tD.GUe.΁ÎׯMT`̝xD11q%ڤ0E.E|}ѡc޾?ſh~R1?Y}oeѤKBǂ"K/]qnEφ8"="voIOȚz0v&4~9j뒪?h}u%ov&~LMBgBϞ3;KDCΝs9BD`27p8\4y+9j5ۺlD:X^mA {=+#mAYUO;mW_}EW9cv]}h0#TvBp?s1t/U}y>l Ak8.H={􅬃9>tχ}N14zx εiR~?y+Y3qwvU/r)BEJT -Ϊ4.k.taܑ=ML&<#7a.24$bk'LJ$_1="S:FwldȲ;|5XEl]ݱ>wliE:Q۳˼Sw'T@zkR(pt?  @>|@:z'oNV-q$dj'YSS)ɔJKr3\՚>/hm5M\d6Idݴgn=s/I鳳a3hdp7q3<1\:Ά-眹zbhe89AyCcgB"1܀nw=5صXf(ٟO߲N[B$i*k2&\dC:'21&?=Ӕu"u}-341\v.z%jd/≮\[IA3.[lwfv3n㗣> >}e:>pkdn|?\݉|TeY~"尿ǼWO܃̽{؝v3왾;4vqՖ6Й{}{M?ݟ=:u[9s/<}ԗѷ.P,XZ,tzlKE{:7O>6m|1PNΞI;s/8;?bwao;Nߝ^gñoctjOu;c\k fe\nA޼mHC;6wܗ̈́︯#mA {=^Z 45"~ <~Dm)VY01-h22GsG3e 73H۲HC>"i$}~f9ztq'w9ӗ]~_/~I:m|1J9E&cz 89 W6/H۲HC>.ϟJU]s!o9wƮ֖wěJM<Þs߈S"oq7Tԝ̇CKrˀkC!4A@%~"BDޣ^Irvc{Mfx!z9:pFDgX9i?&b_nj5Mӯ8hSL\~rdDsm;zX3HC6}7-鞾ۺꂶE~ImuoE8Ў-}Иex9-wQ}9Vi$UcBr U4ϐut m9>p>{.+,uZ\(=S$v5:._[k֫D SS{н=THܦJK }d4oE lwu{w3l6749'oL5O=M?qNNUxw*ۺ%!{{ș9{P6=3y;5U{ mN>`g2+r"TrNjJt0t&,0h.t*1LL$ъHth>;7vE?^:sgz#aEç.Ūl$8_MWnaZ*"7>_4̙5y3AE>zz:7YpXu-] q?z"MAZ<9P{FɩVu[\.`e-5(/xZvEF fg:bssff܃nX{v^\ve|4(Zr*p{f rfTˈċGgyq9> neOPKD3s6,Ab5~u UY$gK[lN4w"x8223ߖ IDAT}tU-`Sgyʻ̌""EasFƗSm,t&%+핢ЩƒSt3U!ˮ^z:X/pԖeaZ.kНqW?x*w3:fpv=k^K- Ft^m$c_φGO.ix!$\49ܫmoOȔ&덝 _ں$Tٶ!ۺ yö"RY' ߖ*:z+@9BcCl-M`[x(lC&k|bEqW6L8j[E@Y/Wd@Uՙ3ob8f[>Zb\QZ>)]t{̛yq T&d^Ưs󩩔o}CSxٙ-Z"rC6)/iok?ݟ=:v>Azy'~LM'ϞoEڎEXGv/Vpyg:xwm~?{A\t^=Ft!Q|I`i577x@Vs>!՚9vuĕZ:}7::ȉ/rSJS}WA)r*j^:c^NޜgOgGAwfr6wn*Xk o)df g&0323QUc3H{dr= {Ʈ&oN,ďՓ47a.7y+vaTM# 95LIW9"4߶b.u._"LML&SeTMk /[bX,cpYӴ!bgծZNeqi;ysj䏓ϔoyJW5=cK`yg߭>5Ε^ߕ3|MJKi>[95-?%?KRu3!ظ?x^[TE5x{c%"uQS5u9MLӴs5wԗ632ȝ*aF'KU}J]RgFD쪪*&X kSEYlJ2J4-r9%r7eZnwݧgͲuVV;䉖op\?4֙1TdL|''"Ǜϑ^G Ϟ<:XB$}']B^&q1:XfW7q3a1ό#Q+]oU ?g{]&QōO1ciдtOů-']W{v/BvKz{5Lz{떺ITde93>ɺմ!PU59cuS5/J?obͳ_ 4:jq{g6릪VE7vY/HmLrWR_*/[DD|@=obDՏ&߹uݴ>3왾;MD{iב:7Uɲ,?|HN%jg7n#y֦јЙ{ЭTZ\φ KЙܘnV,B)p2:O%RW{CY[H[o{XAF}RB_U6EQ""/6nUu-J>#eIT>EQf+fU2iKGfΪ/UrM#úUѨMFfqWjߟ5y{ߟ`bctT*gg, 3*JT( ׯFsXKD4Ĺ |:QcP(MuOR3tT9)J䭤FUժ-ݥ56S?Yam#ͦTKRҾ^Q3W&Y BP:Fe\?iT&Q9\G\cs J{Э׀=FD׿Q_5߲Vխޖԗfkg[&o8ͪne6ZؗŮwT*^*릪VEn076 }{T>|ldqA=~-Zy/R|nnUz]cܭ׬Ǿcz 89zh4ar29;;ҕ%Eksj9m XU]ˍ]J/iߦ&W$kSmuy75|ޤaLڢJK`L'[aGmžyzxwDnnhx(5 ܙ{QoX5:9'n&\ծ#8i03R~gjZ"w5QCȥ>5{Ḣf~͵sy+,aqw9Yn66:Y5kHE.EHo2UC\*ZIXwM|μ;.JՊW/ϱle%ׯ]s#98L.[BVUTϼ.ϪR)>=쮽0h7F^܃n[-10&SI2 ׯ]_^x+)A^֭Yd&`}Y"z&?kyn^Wj u_G2WgΔK3%S#tuEFR눋d2M]xRcVskjXMlِ*^vC6ΪԦ{VEWj07 m bw#LiJ _7#!ۺ {hrm &S9;>px촾M/"h20mRQKcɞ6Dl$87\G8mک,`Z[Ig3r9CgCB^+>{.|>_wrjvB]=`~Չ&wC;A>T#v5؟] TlI~"^ͩjLY0Ϲ<: ;S~WJK?  K5HI, $3w-h\߇0Z N>RCBTY-FPw#WF[F̈́w.=u JRc B=NLN{ZNg~LM'Ϟ<]N׿hAPR@L~J6虼9Y|ns swuFr/]lEQ?ns?wsscg1-ha۽l?Y-d,iPTz->6ui8vlQ-FPvQuVE ^ aWS-hߌNGWT>ka+"M\mU2327.̌̌Wc#E.E23zML]R~Wy3챊G$~Hxz%I/VBV{+݉i{̛[iqM-B;Tɖ/T2}']HTn[>rI]x+7FT{ǁFh*֛:g3yKt;6]aߙ_1gͬ6T%){#lxwKfJ_O.?,-=7i=έ6uia$\:1ViۘnVv[w[!^7C|9>xWy-^^XwqA{eۨ-dWy3VuO^G/來VgvhB&?/lwz5~ Uj^G~\Eoj$jWnm݅}*RDŽGt :us[ں+6*,}mRYzغ$"⋅nχʹF5~r ǟ|ItHUȅHl׽C@5M3nf}xh1? OlMaLBgCc~UQ}'|H$"Oosx7U}W'leۨ-kyуXa^/pe˖R^(M͸5 #"zFVy4#?Ǽ ushTF%پӀfr)M;ua|!ۺ yöQ>-ſ=%Tbez:l7nj>Y+d]^X;ٺ۪?y䰎!"i47;g*yS[--+P]éYI\6:>V~"-[J4" J]RLnVkrTQeAuNR[m2}7Hz3fwcɀ{v[,Ag^fZ'NĿge?(ʲld͸:vrN&3 ߙ|jFnz^EσseM Uۭ{kwr3%Enw7Q7FM޼$oW}}?ۻ *KUfh ?Xq.f>tP*.}jfh[h^7+mӨGxsgϥn*; WT$QoֶB]SA\vcc|$OQF=ef66.4de4MS^(bf]B~&Jzzץe[Mh]fK-+nVB7$ι0ҒJ}S>iL\O~3%~L5&Ƿۭ#z%xߡ+Q<~-~̹~fWw拏Hl~pj@}Y}'T_.8.^{eҲIfمf^3jHY6K`e碭՚ͱA~2_N8/p^B33TtrsWN7t1Ckf |1}/:ZȅvǡiO?+n8^&n%uIc꿺ױ7&_FrqQk+SluWhU j^=bAFZ7FMl}pn !آ_C]Fizx~O@USؙOr9qoS:+wZbbajbGd2|fmGVj==DU@#u3@UMc;(۫oxdgҾm9ɝ&&ML0~#nywdLU/l;vEe}a1ouy Y ]-RiƎ97]ٴ#|>x*g\0' 3mژ?m]6"b,DZ@y"4NZ 2@""Tďɀ͔JqWOj*e2RSk]wٚL&4|ľNbZi?h3l5>XIAӹ\u~Ӓ$M IDATeidemA{vC0J+ӑ3'kь_=b8:le:ÚkƾYw[;̽(]t?g{]&Qkm71qϊ<`=ΨZ_(RF @>|@|lGOhe}/d254Ϸ&CcGȥץGsφL?A{k;|賈 FD τc߭f G5i1:Z4Z,ٟB4{U\L1Lq{gS9*W0ľ{D.Sj*elj}|$n&&Eqhj*-g|:^Effg}8T>LԽ"˲DNJzy EEsxs&}E4YoLhr%m|g5y_>"EQe؊1 ek&I]u"KT~Z T.EQ~"}Hl/ &R}ŭ}?ݟ;3V|U#*.Q~!|[zH,2I[ƿ{i*Rj*սy>K*RDŽw<oĩHC_`gKL^.dߕ蕨QJl&)|6l$I%}/TNXEk;e^&SIqs9V.f BGA+ߏ}96XTvͺɅNa i ZX-<ۥ՚G.G\.T+v5oyϒ%C!7wܧ,=v]vAmk>Ls =| gK?vx|vG[Wj|.8fעӑ7 6Ѷba1@A E^Ҍ񾰨EΏ>2V ~;.gُ:? X;k[Jͅ@>|u0L KR:UKQE.)4{U\4j}kp=de:Ú晚JvLL={fcM`}mg03;S$t&;NOm0z9:}`:~#>:QwT37`A6}E4YoLhr%mBW0LW*?EQ~"*+d&mA+Raaؗc~'cl.i#CMi3.*\tc۵CVB^_h벵Xϛv䙼yf8>t!nF p*>#ϷX)^ ug^&N,xGq*RRB;8GE߈;YuNNU#R`wnh?Op]@:S,rӰ & {g~I]p 4#?4Vf s|tWSiҾ_v:93'93D#3WgD^z}ô#q'Q;x@yG\뉥2 @K?w#v>$V9, H]QAh>>hOs˨yfe̢47|.-/{U˿#Ȳ!SwƏ|n[-58*ݞpqQHh?sқ58U'Έ!AQ[Du=Fl ;oǵ[n|l*z=P(G&#a#+Vbuc/)VXmw9nd>:urScS3>_+#a"k1Xl"|P$8}Ȱg3%;uLM1zUFJU^d @wFZyřl]S3}92qvJ|CQTQ\DD2ZzGB&t{g-"akWȳ]QO[FǛ"鼪/*rcĒV&݈ږ~6Vt=M>1K1.zm(:]O'; [x$twЩ$fx;uIŒOVX,Uй{NjgІcoYV S;^h\ mtXUo~=bJ5| 6"jwTPںn9v_߹MMNg#6\qE$i1(}$'<vKTxپ7⭶{YQF>20잢[m_76EF#v#?gc7b+i- >>d/(9#mla"RUrvxmݔJ>B[Sh|8uFӖ5eF%VWŐw;08`LNpG?YcdPX,C{a)`serMɤiey9 ,]0G }ƒ6{}V͑mP VeM|9>k󻏸ώ $$.k1Oѡ=n޻NE|r祪ѓ99 _ N1=-CC#odrըM?L;:wMR{0? h'| > @>tݚ9ӜB xd#W#UU5<E O[qOc(6w3ވO.cE1]91f>.#X,3_ 9H]Q,=c:fVI'-=KeP_ =|H$"2d!pCBk-|% #SAYZ\ϮG* ,fh婼fKoJKa9?j6J%"Eonr*83'u,Rt/_g$!NHQEaUJ{^FDy%z\/_|16IwմIҿO*TP\t`U~!w`p`uP7z0"c*c1/$n'8磟vb w]|HI)׀t@2˜s8X`f3ʉrO0G>H?^kg5`DI+FלwqGG͑O~tJ'+ψT&ߊNɻIψ908$"`dqODU\(c{+I4~F$z5:f ]%n%j5gY?ţQKfh3M'"ܓ .4\>^ιNDĬdc^}tqgbJ1}H.4\>j<#ڭ\gs9YmsN8'A@ yyU3+q8`eYKgL%⫚i6NUǾ W#p mR|7ika1Ƙt.Ţkhp!S>ksMJ&׉dMSQhpPM|U%]{C q7|AJ8s Ys^|]֋bC We!C,_;:cb=喞,t%״gca6\>]0׌uڕ$NLD658^ksE>"/>JG^*DvDDb>{$\nqֻc-N5\|X,ڑRb)?9q3jFTYwk#tuf5sss=p8^;u{yx8qqԼtSts3¨6yt7 yʪN9V 4( }vASUqa vgwMU1]ss 9;E>}&HfN=zWwb_.9N'T>nd\ƭ.{""ӕ}^}]g9g~QUUA$Is&2K^'4żcXFSwSiQ-=|QK؟jN5̐cIKc:4W6kwUܮV>'$?%JVlRCd@v?Mfk۵g.yE^[Q'xb&ds i?{rK~ך78[h:3'OK/>TIOyO{KoJD F# b7c T ,f{;{mv|3iGjxVOSs/)/i@f%2`b1OĨlDD$;9V?G 5G?:|K`7\D'Q,ދ%RMW>. P>@pQ.sUO1Q9O3v?]X)zG4\|}] -3fwQ"Z|؉=m{k|fTR6< V^DU^TQ!SP6R߃_OH{ ] ~ r|L-;>F]pRvYI%"pe{/cn"CҒӥHSUNE΋5k*dߙᏇ_Ϭ霈— O8:_G64pBPl'n6<=3:}KOEgWDr}TNMFucBW­CTn|ņH]U׾ZH$+zʈ1ƵZTU6:߂]A)9\.jt":k7?^3#b7c:I;I" vG*l7螪c7Tq$JUƏHHC"*ռnI͜-ʞQN>"-# Q<'<|>Gi ' |;mi.$IZdDE<D]~I:q*'+3n1ۮREI: ":*WlO釋ZivըM?L;:w 7^Rv^P'Vբ|DU׽'"kVT~ϓN {m oxUUbT+˹OWT9`13{rte}mjdn眓Uug2tبb濍 4}v.+MӨ'T= st^(gan5svvF?d.#\wQs*;5݌5W[: ^=z},pM$}Tm1(Pb\hjgkDv)OAi!JMžJ ~1ʛZ;p!v 1Ÿ9涞MvE;S(󒣗 Vcy:'S"{ 5Z0kC.&"+#+Y5fmQ3p*Sw>v9]UMǚ3+:{"&>Q/*dv[&6f+ 2.0et$ ۮkvBs[rCt<ƪMzp`/6\D&Ggq6}'IVbVRU/A>{qtr:vBm IDATbW{Tv"M n=pg>t::JKy_*:gV&(sEQJqV.Ю}X/ufm[ 4^G`6\FSz á;*VĬس h_4Տc؁C4\_F_4Fw0 h>ng"׺Vu6rcCEa@Å! :犱33ƌuy1c#"bPDT WUX,UV3=9D0[/1[Ogw:UƘ:i㞣2YBՕ&ÞOp*8m:M=k9ז荘p9]vPhp!6q)>[T]sWAm>pezO{ӏQ9q;aHWDOzO{q660v6F UU-F]sc v]Bխb;~>3<4DkzxO{g͎1O=}u.W4nI:}@ձ W3fw.|tSH>͑Gy%z\/_X,}Fl1h|16I7c{xҿO*TВ@<{oUWTˈ1MFQ^R(,cOGv{qm5ʉrOh2shzcOVtJMzF108$"`WU&Ws,6KxZHSd:*=~3X NO&5M>;ҜD>.WX?^-v @>@낏ݔC;DQ5|rŲOOyKa&——/W ] |WHMca_qtYz,(ƾZ,gCTq nJ"r +jrUUZz,tLU˟&瓖2th( . >(t1iYBH{SA3 94J].Mcr!8LGJZwP>=흽6[zS _ Qoޚ,$Tpf:ҿOj ߌ;?vfgg˹ d)ob^k>6]_+'E1"OVRWT!G>'c1'G܌-KTx@+Ȩ76 ةʛ\r>;z=|F)CBS~{[5gē-G:nnc@N삽d 8vj,~+^lq)oqmRzF<$9NW^708HIs3<=%+%n'PoZw8 N`tMSe|@|  x{.k\ȹ\N1lX˂@W_ʷªgSoV7S|vn7~_*Ir>iXz,C2#UUym6@q9XX9*Ye鱈.f..MT/Zz,d+1Xk:v,HDd\g;C:9M=흽6[zS _ ϕT֯"W"##ӑV.-^k+T(TINxO{p&Xw`f,$Tpf:ҿOzY,R_ο^˟"IW1L@DcɿOc(*bk̿ȓqȑ+cҳiX2e?RA6syюj;ߊ+jVwW7Mvs>n7V _BcX,BB5t1 T7"MgcL]Ql]5Gt@ 5 0>AZ>+끂^'eMh9 ,]hzug( |_BP4_s>r>5108$"`7;xzF<))94O`xF^6_3xSn3)'Rr>9] 5_]F?`H!R\RcWl;6vgA[BK?8 /S\8[ >N5"ߌ.,=iovzb.GN,3Wgb7c gc{+I4I3^ݚ,k*JʳT N~\ gp~r྘Ɍnino1 KS>qP>b)O>jXV qΗb_/ngp yrckzQcxQyph)Ҁ484vʻK:/]vrIh2v/ Ҁ|sY+y؝X{A[偿MHCc(t!d@juUnFޓ~s +sωѪIݔs[\QQ=B@Q"BХpߙ<`Di(]si}4yF<`DTxY "_y<{'xNx(uoqrywV. 5LKkn'1huU'< Ʉ8̿3cOsmA>"kn$L (}? >`_<˿xcgm[xqgm]h :+ar)АӕjqװW BrFg4\Lo(c!P|oeni-agBD6[TFZzs|@Щ$[.}cv줇f'NLDTTUcM(?3DYQo 5"z[6yVaK|Q4hsޢ U[ N''l*FԽV{#Cb><}+҆$HԽE+#TQfFWqyWB0q>(o ]9?v#nkK3{}~cΏߘhƘHJx񉿍O\ ̿[n) !+S+a_x:2z;p+5Z6f3".Di t%;달m+aƘ\TQE<'`H؍b&CDn mj$vkn1,0Hj|DF{P|(ϕ' \$IyH+31Y?c3ǫ+1n7b? (#^ XDQ}WNfXDǒ\{1f>Κ#G=˱?3T\EN_c7c{ASAψ]{ixQ^x?t!W•OTEy$n'gk-r%_{Sp*xSWjs>7ƿ#Tܓ'^bTJKž% 7ySEQ'KOy-KX4{mEQQ6B`0>oiŲ>5JxD;/䣲3?鴘YʼnH]Q#"_s솳Bۼ +ȃ RjwjZzS2ido|'ctM:4dD9 ,] tG K7F.vI VjaM|9at;]@xD ._s~}]%X<#锜OUrFpu |蔜OQ23G:E#EI4Z{u|{Oy%I7zzb.ȉeyoKt8@>>VdlɊ@%pG$v3d v+6/1v#1-JggxF<{áAiPJ'"Wá -]&O|'&RFʱ٫tBpa>a=q+^R~^Z|N$"򓥡C'KU=.Ǿ"W+aC奒RxSb>1N:;rk +˥UT2@kmcdλ2̇9pbfue~X.._cQ9x>G-(}?: "GES,]spљ~E5NMS>LBH>*Ges3 DlOou^|D#rJL0׉--7 0-}$uEI'rrG8\eeV*4)&;;t3&> cܭ9we醮v}bQ.]֤"ӑTp feb=QE#uUmtcc6'Dqcf){}gl<*~hwv&n1pvzNx^咚aAR2s|dm6طQ)Zx~HIiaUnך MEZd&)a[﹥bE)|“1bQy˂͊fLۘNa2z\vh}&a(D\IӡEs3^yјXnHĽ\yvvRi"J?ʸQ+Cr>?5Zʟ4Y)0͹Pp;-vv@]cU> .1Kudp*%+}$E# l=&qv>21OםCRO.&}̕k(K{6FGcѥj\x8?ͷZfVLV*>ˠq16fn--lV4dMvv:RDD߹MMNg#$dYW+TIJۖh"ʯmԽTଯ%"ӵ[TvV@t)O<|@=wxogT9:|{Ć%@U,xÔbY.tT l=cx?wj=^ (hQDh+| ]bP(RrfEqmZ9gړ?ά-USz_3t9]sF4W%򵳍~.ow|Mne@{V\;Z|o1v o bqbx.xwR=ΡcjtȊeFFTuu'_N&WvWwM$&N>M7{64V>`S}Tė3>Ƙt@}k۶ニ*zc'7l=pd;}z/Kl #=wknvK%9,>κ.KEw1Z;7vgSRS>_wϾ|nn44gr ?Xy['5 (+qTZU-v+.6gnB6VRf}m53֝.&W9\[+˷ެ6-"nOo5zu+d_P5+9 ^3% ~ HDOZz,С̿2U˺ߗCB9٨M3Q5o(Ve5?Nq벿dCcf}doJؠm|@ Ngk-r%?޼.?Y r?]ipp*Hk ae^Hj;.=8xٟ'xcp*l>jѲ<#ݤKyF6->Sm-YmZD$o&";C:9hyU<^-EQJe֮gijpoӌô1lT|%|emk']/33U[TzT.Iڄwت^.e&1Yw>NJ֭ޝa\\z_XiBPnLMƪɿȗJ%Vsh27_FԜJ,YmZFR)p.nD4{mUTVkJ.saXT˓\x\(JQ3y*.}1b|g|֭UXWe5ɵ.[u|ޘOMrk+aFEoLNg#$wKԶ69WG氺FEr٬\1FVܒ!Pb>8X>'$}g}ee=YNrUnО|>keFk^7s rrkLM֤iF ߖjE볪]7yNg IDATr_\~,%b|,>|k>#*%1"/(~1"/"e=5,>Zt~4&;5f.4版tv"–TԚeխdM'ou+aF<.R#2Rd\id,w_z]v%Y/stD.A܇ݑNˌYyD6瓘K/'/Lr}bEZVS o[gT'y_[LJ֯-72mvgē"&wQלwqGWk}1&OFFnqγ_Bkޓunψ'[t݌F4.Zv*ψ'~+N:%&릯` MIOqIoL4ROrCBԊfiA>r>zI?mtԘ5/ڕ2G噯gF=G;I" 5;=ɵr0<'EFX/WfBԝ4Ѩ [|d$7o^+*6-3q,\jj7|t6+֚4[,J% R\?-/bZ)LT>˭HϞ>k36OzT-yM܄ڭ[H-뗏˵ɛdoܼ%!}>]˱P˹X۷^&@V?Йbv/sY>4M~Nj& >@>| >@| >@| @>@|  @>@|  @>|@| Y>@| @>@|  @>@|  @ϊ,6(T !>@&h*>`e^\뉥2 @J?w#:Ms> ΛaV,*OsBȱ.TL}}ZAuO?C^[o]a|:'i]ӉS.[qr;tEYaDưWvktweeJYz7V2u]Uʶ-#ǺLo9`>urS!,V0* N@8uGƭGuGEŭkeo|@׫7*TҨJ$c<:,{%|tuje񇕑.Vp[W}Zb힒%"Ґu-dBAGG}C֐r/7VV yHڤTҶp>: V7 _um0+[1^zS[1ZQLo'l-Jyօкumy)Ϋ".g]?|,iEn l8BMr\׶ݺZz4ІZW_938;뵱ފC犺"ۺO*wIlZ( ӺKN؇\ucbs3}uSb9~z h]эzl/Ftզx{YT4lTOxGxXQsedZAuyR*(;YIɩtjJ>}o[m|daւ[m;F76EF8m8,}@| @>@|  @>@YmDIS;YQ( ڿosu""f%c]E3ƭ1@A P(жJO*w6ƈsvF^qq9kd9a[[ @mWU9׉ VF:ʍeY/Sif#"SaEwvCA P(/t86)\4ҵ]VFVcF:^bQUw2 @AxA 6)_=5ҹ|f%uo8h'< P(^.\vvUUv qΫ-nNxO13+qε7f%yuQ[/ @A݂h5=zpsmoCA쩂Xd:Q(&ku]'ҹqhFvt^gO4ιιwYAt=\?gfi GtTA ̬:'+{+.eBUorfrpD׽WL&61,?w~DXT^(Ike?ȨS?Ͻ*8;ækDl=~՜|sqU6;KOOmb\7г˭d^?(oz&춂+s1vG;uRjD.K?J_/Jv]:,%qi?e-V[3;98E*j 'F&dk []G 6ѴPǷ>zEFDTc'?rKgӑu1n j-pj bL&3yiRYQ̽.Î{Iu> 4?j.d|"Λ}͚I~:x>Hy)ж no2~9n9'|2s%Qc8_'vNVb }u/sQ9"/آZyoy\ެ aCƘS'6Os}Ľc= *0{0_WE9YqHJgRdg 8j|\LG&O,?Y#>֧^zpI$ M'ip{vB<0D&S|nyOxwΜ9^]]];qslg;# SKO+2O~SW^ZC\UC\=vӋ#CCʂ02'B:+|\n4n/+_ &de'dG-m,clQUr %]]:ŽV97&T+uI B!dClt<11&+/ËAͭx"I);OQg\1qi_ ғ+z:%&Nh'10?\K䚏F&wPK$6M|dW1 Wj$t>]ȑkbrRk3'`yKޱ G"3ɜ )|)?pqfN5su>u"|%r:i9->J{F<3x̽k "9{'*ľ fxͱNvg-bf1Y$G9Ee>u7YtxA Vաi[8ɬ,$'9_{_bX,(ʬL9U^N?LKI(rDQIi{1(' |HIMOݑ-tl Z\[U56s*g1< NT_cQ9x>GdZ{Ѕ'rW"\'OzǼeNq᜻ n\qf{? c8̀  TJlZ4VɅBlRC"`> Э!؁ V(R+ch@f #ei$Kb+h4wߙoYǂ6y"C*ID._迎LҾKӢ2|:R-ڃ% 5aWJs5‡x~;/sO㟌;oŚvKf#OYZcՈicEtCԜo43GOG-}Ns1 Uo0,Bx.nz3aLIqkfDdI֭3=\'+3LӬR'wU?BĚ(,N]B4Z[[T}kOdf&>,?* 5{ou"h̏3虨Wb3(o<=r]jSS)c(>+R7z?UYTx"P|.?Jcc0Ȧگ:_q_!dIffEQrY_O me߯ (ajυ-oVKADUXۦj (΍EF"a$%o2V(J~?<8,9eWe6}sZ;ɒlos":nWXvo u];9?zཀΆ`:?ez%Bd꧉lLD=wr. %yR-$~{;s8HNZYso&s>`p9V[Ufk>6W9)~ }>?ޛ}E=mx>oQ!Dcx8X"ۚlB'BYǹphcUṻsp5!%J/JRdBO]Oٖ/ܼ,0c,+`.2SD}LlRaxe""?5elL;a@6RגT/|D(};:rݽ>f D`ll'9ko|sT$vNзr{sq.}wEόſ?O${p?VxlsGZ|ꅉˉ˓߇9~a"5*>+jkW7׽[I'Sɯr#A0y-,t.\<k$RRc+I!,G> 0WMe@>/#e?'BbVH4`.{̿\e}5J'?rԵ 7§:_)p"Գ@6iuZ0V4Wtv[5yzeF{jŽc9v/5U+R{>Woy6Us3_ocͨ!|4ccuw"󏟍o9Wzb*5I5/|h}K[M'k2,!KK#ٻY8z:*QK\|ND~sAF"{/˘6=&R/L2s$Ĕe˸Z{3(>`B7}%(JA'BDD,qgm%©6&.LD\@w6=I%ljHT!m_,[a{4IRww=\j PMDEDlح-ܮ|ݹ%K̽\HD]s[&!H#@-, )n_9Mc{d@"$b.[[8BUY8MܸiIIN ]+$@"=OF>`hl,^~q_n̲ob"җuHD {|.?;JiLXckrEX%{m͛M+#}+e$@"=O%DXཀ* uuk?5vsBXbqt C*3ID Hqׯ_QrM^Nܸ>ЉV^Am奾W )- 셉oKvX C(~_z;$@"2{&4M0]`;w.#2+ g$@"$n._wUQ}|zD HG@{P D N@(>@P|@(>P|@P|@(>P|@P|(>@o;W2؍#sg+>0]9P|B/<+bRޗm`0z?v߽~?hK;7;PMN\;Io, (tlJUD4}+ɝ]`MD}tOc$J;팳 P .F}kjxdf^%lB!ȶH Ei( !&8 Q/=/'me 6.O5M!K$lDdI$M"fY%2 VVMko,,.1D==hQDJ%;ɚ1Ʋ,}6Ibff+Yl2 levD;(i5!/JxLY-^ K$K&ne ʻn F&:Ԃ.РY3IUuB_njL[D9>b ke+CQw":PQrRUP|@wa9]iߞg[϶ n\YY]RPBqiϣL,u84l9k">ސr*-fٶ,!--dڮ[7%Gf++a !Bݫ?D . ӳ{[ĞhG?/{Uh WCQj0i'cD%wpNaaW&n{լ#ڑ&0 OEkJ%ʼVH<ڊRr%EHb|@cQۢ&np2䗹zwȱGb\s}'I-߂(oEG f_ifh/Jm/Dm: IDATRN}uq"#䕫>Ɏ;2eӜ4j% N ,I\'Rii(04*Ç#dž#_.{gϔĥ>xt<ܨ8(m+</WGŚH]0>M6$$_1MsˉV>[(rLβ.hC8 hVp?ʣd_?+.'HL?GOGYb]-57M|RP.DQ1qy"<HDc3K̑Hl+ʣ QJP|@ m;;w|7fMCRчBM7,i ZʁhZ]/.+;ǹ D"#‡䕤i͙dFeTj䦟5(Ջ32MA_?3I/sg |MT'6 j2wf0ޗQ$yAT7pBphq /tMiGDd9}YwlJ|<1WMaמ"kf($|$ mE^t$ SS|~4DiqIE/<-fj jo|hszei2=q9A6MiBӴ! 0ʣoV%}uf~L~8<n+''yB~nei⫄e[hEQ/Ρ(JI>Pyxmi"cΣ(5<~-7QxZp+t\}Y>9pT_ SmQ|@~^6pONy!-PoQ(2mB-:6pV?l=6˲QTנ (?W~3(E[`M}rs>P|@GbX,=\mFyAٸ~hQڶ`QAz.Ŷg ƚ()J?QE]b NJuFsr_;]vIj/80(1;l%p ޜ8X"-}ϾIv..;.Fivn,=ʒVhP|ؕ^%[{+8m]ROUM8l,K0\7̆^;}*3(Wrg7(>KBUYƽ[7o$$UTUu&(q?+jgÜ 8t.cl;*1zH_w-+ˋvࢤ*2r+8khj*}3b-b:ll[3Hd2ҷ2ёI$((ENfWe &.'TU۴"*3ߧ@(Rի;'OGV'ª(VDׯ_Q24_XHΔ iq듷KvX C(~_UvV?xQ|@ l2L4 ÙP:Wڝ*R(>[zw$%cD)c.dXF(éP|(>@(>P|P|!?ABjh] BJa]_leӔ%&%/h`%G! |@7ؕ ۣa[D2f b[ [8غ`-3?-+>YIENDB`kildclient-3.0.0/doc/C/images/typical.png0000644000175000017500000016753011715730227015145 00000000000000PNG  IHDR[sRGBbKGD pHYsktIME #L2$tEXtCommentCreated with GIMPW IDATxwxǿ{w!j]H%)҉ "`Qi6D:JQ:J7C k[fR<=~wgWү+wAAAD(+f;*HY_fق+E:`faJ{0̦q~82klQ}0u\ 'CuX;v-m:Ǭj>Uݖh XQ w311;_1O`XmV6"tnƒ,&8-63ٹ2W#evO0ҕ 2Ay c̛sN5R eݸۖbCGp?--+iPֿy_$htfX̿*D$mt2d(E~^qC d9@ȗ!k=]yfs 2qLGnaLmXu~(Ise&8A#<N"p3U$3ܺ7 &@lAXp(@ݞ/(Ũ&MS:WVߟsJQf-v:iA!>كWhA"5ɠHO4_|k+m{}x,}q,~2grUVDk(MΉm1r?1(0N~Ṅ}ϥ/yVZ,U'|͎PTRf@ :zI;$s& tF)whv<.d@ҽ$lVL&_ep8p^lvL&3Q yB9jr Ox>zvUTs;`1 GFoY }p?}(n6=,DZi>(%k;GdsZr=LQfiAvk$M&}k6á<e~|KLcd@Ê+?)Q⬲*D^gP3ixyP.D6B&oi,FgCwwZEQ\8HW\;ȏl#f Hΰ.rt3BQ>EDŽIU>Oei}(o7zb|џLnݺbZc̟gIk7XҎyL{H?wLPn}OL( X,u&=ӧO!)) ɞ{?$8arlrT as}M=vg+UBDGj6F;ٌ>8q DFQ$ݻwq%=zw­7LgQ\y8|L3˗/2p8ή .]L]7oق!C֭[dZ opy-9V[uW)FMI&mQi ǕE%@ z5j5їesK;nkr`VY0 4QsFƳ;10IjmUgPc"*8RKpĭ^Y]s3,'$y(;`Q:HhCmԽDԘU[5Q Pb΂1璢rG\mOwVQ?}v3RKt߻{ƩS#6)jDFΑ/~˟V?_W&"wȟ/v;ܴkԐ/ˇ*UQķbּ#5255i21zBzz:fΘ;fۇ~Err2FT&:ljm뇰\0g\ڳ  [vnɘ\?~fիW{o%K UV|hM2w5o IL hH9jf̘kWTfDbb" o6mj?Á1eʷ8tV*T(Wf͛;ZqcvZrݻXnѺUk?1c>dBxx8c"44kr59q7_sfѣ0ͨQ>x$J,y9mOH#`r*x7Q~}iPW_c98qRSSq2 ~T|:t +ΐlbeHHHs)V)Vi64rB@PA*  HN$Aϋ'- I+(pEYdp$AZ;ۺ^e1]uyxe1 ܃M&AE:3~\;+) y~S֋[yj&w]q)ɓﻁX7Fc# )AvUwÏ2w ( oۆb`SY;UuiEFv'e NddFܝ*{{W^L&ר^|W$hCZٳM,s>烈βK& ;.2ϵI*pmw_| (S<ґiGDax|U.9%Jpul6n]_(_B1JϽQS-<ۇ՟ïV#,, Ǝ0&}ڶiõʕ ͚5ǪU_~AϞ==uʕZhӦ-ƐUנdɒXx`0fX]K3m4?KǼy0~8 6,Y jWY7od з+9sS|Kܹs([ 7jDY@xN}Yx4 Jl ޷Y*F(EE|_L*r="z'W5Sttq.'IQ&W'bʭfi?yEܺ煲t~U8FBZ9mzCeX VP۱%K#Ѝ6HJ+Wif1\tEn/^@ѢP3&>{hb\}O/&L_[o%WBx+z _(>/cڴi~:d(Ct8λ_;110g@łk"""" ?l;p80{,෇  E./;u4|ݔ)1b"""o1}4Qő#GL2Ν_ĉq1n8@z"?cnj'qIO8qc(PnYP4  @hX6mf:uRuw=d;E̘9+onᅬ… {[l}?/]qqXW,^=z< /Yt3B3ܶ];{?e˖tǍѣG=y2[aヒ @0ر|7)%}y֚t ȉ./Fp\?!Qd)S9Z>Zu% ,!h [+/w,ɏ|E+Bf<_v z B?]r3=΋o'ݗ68$[| tº*E:|sQr߯e9 vkbR4\k3CntaɄ{ܹs!:pEio&zt3L>3fLڵkQ@LrfsCfUnO?-D1{lwc}hW^`oݻg ym%>/}i_~(U$ yaذaHDZm(] ɋIwQ(O^ w0vX7Ŋ͐>qB~uF7ر .W|O/Ik"_u܍ Ͱw^lK؆wbMHII3tYh1@``g[bŜnYV)n ;cQ:G8݈ڶS?+H[32%J}FHo/(Q5k;wƍ"))s;wt'(-gG~eKt+Eɗ4•IDNAP=ЕsܑPTaݔ3 xgxzrN|=Qutb3 k"8"0|FF&ڪq3â8'U[Vz"[uQcL~h7pTԚ`3 (D?r n=+zJK$fxmNCk=up:DeYEwVG h(V a0E#"ƛooc zŒ31ct <fZ|7u*Vy[[-ۢjqF/^z ]u9? &N fK=/WӧQr,Is7H'fHe22 # CTTD&Mܹsg>C1ܨ-:KTjL{anxIXh1jԈĢENk{% :G|Ν^lAOkJӳZ,Kmr:G=\p@UDU綺 "l &"9]ΐb_vWI*~xeIK> rK7,}TsԯWYdt:g^{w!qi^L^:]X V^<+nT/xI^;WէYH&Z ޮs>&ԅēq$D>p&A@0lV! G@=! S=`޽4p:u 6 !!9VUޮL&Oii˗.aƌ4p:r廉E^̜9{ETT0gKv?yKxu uhۭ+؃PD)@\ c;uFقQ矣yX"WГZ A 1!oNkڧ[\qxMEmU'@Ĝ wA]W sF# ~+2 %I[b&Z68mJzRERCpdYFݻ#,X :QtxڟfdAXh(zNIs\(X~ϟ_zҽ{w4oy!:|IN`٘5{N;a޼y:u*cݰ>{_jժyEDD װ $ۀu Ԩr5ܼw/ÕСcGGbw>^{б{0yD?0yD~mZƱcGp╗_A"Ep^?Z3g:[o +}_ eƍسg-[y?3fv(y[8s J.mtΝ;M]6/(bVZ52u/&` 0LYJw}0~x)Re˖õkװg,YW,X 6B|٬Ao#0?c3r _GKڛ;чfwhv(;o^ǛXw6rʍK3jj| *9\+Rn}_T7jr^/_Ygao!.#Dݺvc"Mf?o\ IDATwqwDV_IwoڄW_}iiiFc(m۴g}A0O<&}ѤI).]ƢOhݶwOCݻӻjժX;W'ˆEÏP\9kDn]s 8KMzȝ;7ڶm A(z2?Ķ< O?-DPf$yoaȐ\Ȥײ]{ Mŋ10Uc^/XrʡO>xڵ vlߎAPR_G"(J_N7&!qơr>|8ڷoэ5)p^,~}L1v11hܸҭV̘>;R#%l2't 6gˋxIyXΊGbc*Y%9LGwih 2pӻRI0(yV~q}}|a# (ژ|ҺrMUXۥiI}e1R eiLuwp'm;\A()ʘRs1^ǜ[^_Y޽۞ ;Fv?yUUǜcxhQ$11i,;/0tڥrA&(Lgq-U-q}6Hrsv;r̉zQQ8vnݾ (pp.([PIIMuE\{aaܹ\v !ҴQI;`BXt:uKXd)g(B؍Kj[ĮW~klݺ : ¹8װiJDիYg!WX#ba\C 7~. 5:hZ~}~%kqNpөk`Yh^VУ)AP3bSZkwlsj[;ߝfUq=>ޮVvdX[7vwJ9{k񖗕*8ȗɤȗG=hOdAUך 7`yW@y,rK&Jxח.IչGOaʘXG\I. kP7`eLrK$mAg/O_U~iu3Kի Cg{i.g\>*xyQ9@#n$ǻ v9C9{bwRRoxPREجV:L@PpHMZz*+3yuقs5EkRVLyMLKz`P0. ݻŋ` d! *g|k R%~:֯000 =7'V_fӈ0iPj.㶐Co/֢rXZo1LDD$Hr?GOOsRhhx;;O_ZQAc̀F=hv5H&Htz:@ST}۟J)W0Ii{6a\mZ2ܠ>W=ׇ?ҧ6.(gT9+YBc$R=iR%ŧFRuxi VQg#L T>܀ [4Gd(RCy޼'߿Uʔ)m۶!>~3DHMME(]4v펼y"=݊ԔN}0)~r ;2Wn'ݻȝ;77t W.hAgPP' 4=kwr?~HvqD2bY BA=lY_J#YZWA&e~rCX֡%Ě)>>696+̽Nft׎;Iˇ(W #XkttG|&JێZ3G28VR+|Sg|-9Oh:zZ/ӏ-jNMY!} !}%mi|DR@k/jg^:zk_ Sˁ D8"55 !! >N6MyëJA rW_x- hW^ ؋lHy<7frt Ay#JӓYZ=d?^!5_=ۊjq./3cricCT%}d?Q.BDN$uDU Zb =Jva1롮((6+9V9s_6#k-UQPF m.57PkH1Ιb~r)cyΨx*e$-jQ#i[:Yb[vye<( Aխf,/SZ@٨$TwgW*DxvJG eef{zD,,}.p=cZ9wjm&}7ۣN\lni^MOKKjE``  aa #%% lK;μ[@d밮U0Q3~,jx~yҜy) wUit"<+AO޽0$F<83"B)2Z "'juYn8(W;Q'|gMZᷪwf4- /ϒ*1<*La)#l8yI|CI .+w.Q"'[X9 F6;`ճGU1iSGZfJ5ZQT'8d.y Kd[RjɪiISe1x]&}Hk'ׂm?̞a brG#B~sVܔw:p3>ei=BPDbϱ*D dz¦gNd]9oYu!3~("y#HϹ6 tS$QFKHZ,p"\{"N&dm@NK \W7My]W)GO &C7wڨHpNh9ާ`݈uqe>қ\@Rߘ`$me]Y' 7.cİsQUQ)#yVw.r#,IߣŻ) i4xt|b2|)kQaRLCkQ#Rː?e`2_eȣդHѢ! '_.? dF.^/3T[AAln!  쇄7AAA&  AAA&  AAA›<'O<AA:vŋeԈ[ʶ_x:vp&kDFfw={/gʊ%+D֬aػpΝLuktu >>>[уlߟ|=2AO.ذACl߾:ٶk.-[wB =oG s߾,;fCVYZ)))a̘1Ns;f 5jDwN~OGFtttm  2O-ލ7Dٶ]vcعkl{BB5v oQW_#:&ZpeϾ5"#q!4E޽Uh4E-nݺVYIfuFd$XmڠfZ*fHXMaF1HMMUABBBмyslKHyOX4j&Lo1wPV-gFf⣏>BThߡ;&+^n}ڵR8ׁlith 1{ II< FƍQNĽ"?sΪѲer]e7Z^ xh»Zj￑r ** ZZoTZ pBϟ֮Ŗ͛oLj*^ ǍSwѢ(\8W9spVYF.o_[Sb=;fL\8wlX⫯6nvV+,u^l) ǚ5kfj<]2~'ퟑsٳVZ=>:>5󛯴;voW0jlkѰ|h>|׏o6`h٢%>s-[rΝ;e[^i.\㬸g "›>0ͨ{pZGEիzݷ5kքlWjVZc{`*THuסcF…!YV|F6l-)yŊCpp0c·RRRlR6i{-_f͚#00xeK,[L[`?#ЫM7#::hEOXh(a6ۤ V\P|mC G\\3gN wt"ϟ/#.s=Sţ~A L-IaFؖc]hӦ ~TVZa۶h듛xaaas͛t#""43ȝ;J+fYf繍RH߫V7o^\v432Lȓ'5l(3QƲmW3r:pBBB2G~AcF߾}=|ӆ<;w\y?vԳ=::'NFrp௿(K;+S=* A)]^]|;[84yT:`͸xvޅ-Z<ȟ{  F ⏭[vS^=ܹSVZnի -- iiiXz5pҹsgJ8q,D$I`/pubxwb >>1$&&bرDݴmk׬EJj*RSS1g\c4;`۱eK,>_ mÁ˗/WtW>ڐ0l߱V'N| =>11ș3#َ  Lx3KCWl{eڵ+_-ZE˖8z&Od|/‘Ъ^Moekr?ѣu&cu֭ 99#GQvm 4HaY6'G֭Ӥ ؏џβ3zWom@ =z?L>uDɎv;|Y o%׆|ǘ1}:4h>zPөӋؽg:>hy _<ڥY&Pshb8w P HK.~fjg '-7py+Xp'WfdGg,#|WZH~;Պ%KZR" d"{T_c>TncbPre|E P" XM# =! `*   AAA›   cp}lD5CAA)AZ!  gKdT OAA7$žQWSC瞽ゟ qތ9?D6a5` EKV>PǙ|=|ݻ˗/c/e!Dܺ}}{uI|Ac\&56ŋ٭3pRE/nG>=q&|wrr2ƍf͛Nݺh׮fΚ٧Fdd7#馤}٬m6w;w>wv6mF[$øElxIcXmhU6ҊA8Α=Ѭm{ -\Z?R~ԯW7m0R9мi t4nP9Gaeر};Ν{ԩ}ܷD`5ׯ_zu"O<|kX>|"6v/&cINW^EΜ9hԠ>= Iɨ5|)S۲%8ֿ?8E7m4ժ# /˜۽OTV%SܺmZj9sd2!O<٣'Vų:lRƢIlSa.cbPN]r%b6EFcӧ#667Ƅ `XݥRg,ZDÂ?{H< FƍQNĽ,oR[b9Zij$"kDĠ^T^._,;Ch^{_틐95a (Wyܻkz:Fkȗ/ۂhު mB;w~/`!btClP$bPZ:o5tZֲE,-oakoB%ڴh \XQOHNNl˗/6oڨyaŊ9 /\ºk1v 1BE1wlX⫯榹lR5k`xreߗ@T)lK&۾c-[>|׏o6`h٢%>sCu;:{Qi…ȟ??֭]-7#** N";~ժUXjƏ3ۃ ț7]Mc$^\`-;d"0 xw;q%*JV*$ٶ6mTXs!~D3+V"=<8[~^Ï}; V.?/uF/Urjbkڵ}w8w.aaؾc'V+N8? KӺuk^iiiHKKÚիQD5~?7n@ ep5#a,X{nO˘6s6= IڵE+Pr*sfPqL]p܈Lzx~E7o9=tٴYK^(-ÁkNJg -SPbܑBӦ(%4Pf|,?Ͳ_ %-+󈰭w!44'BC{.^Oʵ3u1曨ߠ:u7uCѺu$''cȑ+'G֭Ӥ ؏џ~Lt4*T&111fL ?D=<]vѼE hGI2^Ž(\C``v9 7y=l ).* DA!B؍KU(wqw|O͚|2qGwx9>_hkV ?r_e` fA Uݺ!3D'P˯l_Çjݺs:O͚ AqA}cEM` o9=VAL;1z|XԎ|3pqΝ ڵc ?/_٪Of"9% èLyV8wm<5"#wE~['Dp B`w8 :`aμyJ-ċݸ!zthMxo?=/U4AA<]^{͇ޙ!5~w8~uZ"Qe8|J(s+, -6(` ))(UΞgUA&1>E Gf0mڌ5#C{"-- v&9_q1x>{d"MAr;v8v$0[,f&χY_w Y  K%TfC0A  ' LAA$  7AAA$  7AAA1Mbq̿(Y4UAAoDرÿs~Fy֬tQfGA1\x$\v5녷[8\j|@>@@^@N@c׭なUA ~}9>Xƿ0@m@v)u^ȝS૯-X~̙@ٲ]>#qТ0oS ?~p~׀(~+We8;~6sW\s`l3>}#OXGfL7o׮@YW> x\z2ݻ'vuܽsǿnd\aβsgc=/s{gnXlIbż,v +]L`;v;Iv,X ;s, @Vm`j˙=gNt~Z_*+Ѽ:;bŌ?i9gFXf?vXdz7r.̺ч>}_=3G۬гg֦OJVEQ[b/߆ NW5baClyhΉYͅ Nߠ 5^L';Rh)Z|]%vZby7GfۧGдs">?L…rM?+~' ?;߼ L |3@ZS<+X,N1Usg1gdx07#G_~ ΉdJ~3*EY_9۷KҜI৅?7mg>tɪ8Ɏ|ر( n22>p.O `kC =8tuEky}U3mjx駝[zdgiӜ{6  e37v#S5 (sgϠT2O|e/Y tR={6  LJg|al|< sur^^ O;]M h i%?z! xaQ!VmqW,[ܸᴀ AAēg k-˗;?AAYLTAAA›   HxAAa 74!  {xTսr# GEM'XO j۟TB1XE7lbт@<H=(rH-~!d$3(6Ϥ-[|s'(N"ZۇHBJLVz-9:~^(mn%=:L|sX暔dzcIW^ί~%M ^yU\k`[i\?h[V 4>5-?4{{ʍ1)mw̏~$g<]_h1kIwwO)o2ݻ$$,_.3zٿd~}id.]d^]?j_1ڧ}e:t/Ojֺ_g?̌!su211߮v _'+׮v3{9然NOCۚ8Qf:ϗIL2b̢Eޯ-^,}U2Ft,:9XWIN ?'1d^{M? ]jbo*_{Vl2YǶ{w^9uyyǩS2mȼ{ɴm+sdK2UlkO0r'rx7wڵ27` 7XCx)ӭ2ӦjMIQb0'۷[Y^ǎ\269_'oW򆎯 wl|o??^Nzx2={6n_bbi]Xϻt)/iߴoN1 OWsre<՞RqMڴ dƌ.VS_?޽e6nN언8k?~\BKv^weY vv_C;_quzl9 wȧwtusXGңoL_}eMߨ9 LٽBO{gKڰA}FslkKMk5Xmcڿ_?5W_ G|ح6+!II.K׿6][o_{c={B޺՚G~R\\~>Kڳ'-+.J:v^khy{!W_muW~ o51۠AkO@̺WۛoZ _ܹ?ڴi\|ҺZI{*'Xyy`޾ob~ki:5K**n"Lo__k].Sγ9Tw~i(dٷu͓~ں[׮^SjZmn v W }! m/ON{N*,~o\sL ѧ4c?^ޘ/ᇭ4_pu OKKĽvo`˝`2^Z/ljͱOLizHfH1Y_'ӆmj~[jcw}>ṛ:fAo+s2W\!{̕W:/[,IH+?d IDATu߷P/''[jvڻ_]|-gaa_)[&k[[f(ooȎʕ2?X۽_{Mwdx6yyfLQ`2zm/_ۗd=-[NWPw=v %:x_{~w|Wk3ھ]h(~vOI~ůz?c#FHntTگ͛}_׊U W_;y@?oh:]vr=iF#@?'n:v.uS?I.k/;\骫EzUw&]xUz֝[֘\\fh;dN&&&+v8Qf:Ϸ>~^񶋟6?̽Z sNw2{?~͆[`?b̢Eޯ-^,}U':qqtUi%S"\?'1yi}%%ɼO,O=e>c]UhXveƍm2/`N˃?Niƚ{X}dK2Ult"27W_뱋O,,,-p]{].k}{ou^s5ҳ?A?\gM5_?2_pL۴~\]<&11tw"S^.Ӯi{Bxs|j@cre?*~Tt6m6Ȍ]v25owo9%.J*}]~bl~ݔ:?Mšo=v N5Kc:N]꾿[ޣ|ǀ_}%]v.mk~Ү]!9Y_٭[3׬FS TW{?>'XSEcU˓6m~q9=ށP8a?l?WWyuPiCkMݩJw- nM#?~ >rDΖ:u_LK)1њru/]~Pݻ86U3ucOSC{Y3CDsBk~uv=o^k~睈?of%$))Xs)W / 6?/s5wy֭<+⚶po^={B޲2K~cG:vl~\w@{~pW[sU@_GiiKMO(ocƷAݵמ'n`駭_} vTTt4_KօnεӷԦMYF6|{ڭ<+IIѹsWw9|y=FN}ZmL}!//d /^۾ݺpavP޾$=~:u OrsRaU'f`ѧ4c?^ޘ/ᇭ4_p4yS_c_c`iɒo2ӧnVkrI&=z12_~|.Ln̥KX4f>OA+[=V!eˬyɾ{۵Oțʚ3r˿]{u=_ `r `׿{c7 |Sxڻ߻ׯӘ:tRW19c=r\cCD*k'ѼzJm\ -U[B%lx7Vv61 8L3@  H&o' 4o @ x$Ho$7@  Hx$HJ+@ g M1u7Ho7@ x Hx$7o nmd BN~ݖteffO>:s駟g'|BpTtkƍVffl٢ & 72eB >  㕕>}(99Yr\ěVٳUTT 6JǎӚ5k /ukx]Jܹ3g%hUj@f͚'*11QҥKA`L@ ۸q6n[oE`ˌ3H‰9 s 37!@b \ @ x HP~4m4M6M>c |@8_NڪᘘSN蕚+??_999JII!0!z衮]tMzuq@BUVVREEE6lX8p`@3=z [m]. W^yg9'Wm$c-iiiڱcyYY꽯`@\sݫ/g9'zukxG=zTױcǔP}yyy ~FժvKҰaôtR土orehrJ\z饭jwϞ=%Y$QJ?~$)>>^&0̉7W;C4Ļe())Qjj6o,IիoN`<>_0` VFFF矯.U_9X#GTRR4b-[@zFFRZk˗3 W#Ν;pBT h׮]Huu5ASN߿O8H?kdڲelB :z_k}qegg8L5SMv,oMWoaÉhyjx$HVgܹ^sݞeʕh^\sݫ/`4Bii)AxC4 &nh~1FGƍ5}t뮻Էo_>|WyBB=cJoذa7oh<4ē_:751oA顇Ç%I9ZXEмjر`h$Q,!!A[^UUXxOq*..& _b֭zK۷o'p?;uEiӦMFLLΜ9C m7n:wx=^9r#FhٲezYYYZ|9ӸlmV*))!@(!^:s&M'NvkȐ!;wj… ,Ю]h:u'~̟?_=zЙ3gTZZ9s;:\.WUbd{Z|unٲE[l D <?lрSM_*Њq;/^ݻȑ#z7aԨQgo ukxM HXnc H.HRÝ-G^^dj+@ Ho$7@  @ x$mC,1oI~tmIV\[zn222T@IMMUNN󕟟$СCUXXJUVVHÆ #0"SMLG{>S=3Od.S޲uiii*((ٹ|s1Ƙ=廍, ,3f0?OwӱcGs= 4]e_?֮]k9SPP`M6mڵk=nYOn,,ͱ)Y=:œ;]^d<ɯ_|d|˜MwOvxkά_h?-}ZQx?fܹ'ޭm%j˯ko!>>^YYYӧ+dwyǟ>{RllgzI||>1's?O5w˟g\ve&11Ѵk.,?[v6W_}C3i$W[3 KK]MеkWUUU\;wք |g ]7w)oEkjoX#GTRR4b-[,bOEh,a֬Y8qo>-]6$''e.v;t}sN-\3dڵk{nwH?4wXo;OSG$I=D'DK/?jOnŋ^#Skr^NcrСJ^';$I%op;ܢ˖}O$GEG~wbh] @ x HJC0ׯMiӦ)==IR5qDZdnƀ\N};vʕ+=vRH0n۳\R'OVbbbmGjs~">_0v\)7:t UYYJiذauI}ӟѣUXXw۹sgǡ_0ĉZbzIn!/Rگ-m ;pǡ<^ jo ;yҴc29^o6moٲE_~;)KԥKmڴ)cǎ=EPKR\\m۶&~Gjs~/?T\?R?Rzz{1ZJk׮s=RCy^ Z:96?}G@*!!z+++5h 曊ȑ#};)5jϫm5?аd?^***҃>/E1FGƍ5}&~K(3>_4o]fϞ-cNM0As}8OvuUWW˘?/x'cɓZdm_^j$*&&FԩqT/ąs-<]yc"}C{#O2yaa5O o#8Kua{'%%)333d'6z㌌ w$l;}(99Yr\QsF/W:|.$z޽{{y۾]{sM_|E*##C-ҢE :*oG{y?7\iEjG;3g4ifϞ]viܹt뭷F$|X#GTRR4b-[Q۸Kt=hŊoW^DNkOHMM$uh#*oG{y?7\ڿvڶmL4iv*sΚ0aBԞ?ho}sN-\Qق ] Wr+W*66V_~.\ܟ={'dûn~pǧO(n g U|eѣΜ9R͙3I7k,M8Qڷo.] h\Y32w\{Jz=DžݞNjGN=޽~աCZUe-1?:o0h $7@  H?~nd֭[*SNu] رc4o<>|8C _ZZnFr-8p dՏ:v쨢" }z<k+hN5sr,YǫBEEEzUQQ{wٳeѝwީ &{a|7S]]-cL˛˥^j{/ QEE:uy={8?e煅>|8H AUUU)66VǏ${î]S{:Ǒh=R>}؈0@JJJ͛7Kz۷;.on ЀPʍЈ#Զm[-ZHw}$E}|Ϟ=[EEEڰat1Y _ BqqF$%%%iĈZlH8y^j^ZBc+55强w4a|=ڵT^^Ν;k„ Z;wj…,Xu[r:Ϟ=OJ]7ng|.>uaމYfiĉJLLԾ}tR.\Y32w\{@{=DžݞNjGN=޽~աCZUe-3?:o0h L5AT>$@XhTh^ IDAT @ xGs|cǎZre5iӦiڴiJOOsn۳\R'OVbbb_w3 ZgKKKӃ>ׇ5e f[6_kk1uT1w ϯ}~,Y?|+''G)))!+%!TvvvޭGyƀ?\.lB1=zP׮]ĻJXBUVVREEE6lXý8qB+VPϞ=#8pHOǏG|FjkF€- po?~} >qFFTPPyLǏ<)_[\\ m۶5Y]. o;eJLG{>S=3O/_Ku%K.ڴiSk@B՜k^_dƏ TEE$)!!AGUAA1UBBg7kmѣGqFM>b]wo߾ӧhzڟ?~y͞=[y睚0a&ivtDj ҍ5h8?$ޭPllbbbTQQN:yU]]-c4)ߜ9h =C:|$i޼y`M2yaaa{8;T^z߫p~H[w7y*z>%Uon ڿ? 㕕>}(99YMEOo h­ 81bڶmE$Dڼy$W^ھ}{HʛbͭBݺuӾ}hp5w={aUUUرcZfM@/&&FgΜ6_ 0@ ښ]M;vx׾$kȑJJJRRRFe˖}k^j^#>@xq;={ԓO>)ɺpΝ;pBGu ,p~$8Ϝ9I&ĉr2d SP?_?:RYfiĉJLLԾ}t&kv7|CgΜQii̙U#ǿHqe|qwֳ)E :5Arn: 8`?@ |E/ꑩӵwOw_19cuPV|UcrjguՏi%L5q/WUU4SMxbu]G /@@|M-o$ިgԨQh/SkNL5Ho$wT@K/oXOӦMӴiӔNc HiM%87}[h jIMMUNN󕟟 ݾiHZBUVVREEE6liE=p8mߌ/A$Mɓ<\\.3gGյ^U;vx)--"R'_-}nm6lr]wo߾ӧ5|p=zT2(77W 4|=}j/voS/኷vp4h}Y>|XǎӼy|Z40!Z?/7wx~UUU%I:|0 2D/wKNwkov/?|. uoyIIRSS={۷ C6Mg#}o7 n6<\V^qƩsΊ,o?2۷Rٍƒ&k<19sF&M҉'v5dOΝ;pBG ,Ю]'99Fķi?ionho;O="IJK{뢋{DYf饗^L0/|E/ꑩӵwOw_19cuPV|UcrjguKΏi%\Ft0aA Dor gdd$H]Mo z}7$@>HNs=WQLr%"ԩSuuR`~tmIV\[zn7_"thܹzO;>@Ç Z'- %Ќ<7]=Եkz*''GWNNRRRX#Mkdddhݻ#,v TDѣGCUaa*++UYY" 6?F'NЊ+ԳgOn`|N5!FKԥKmڴ^YZZvy^VV4Ylm۶E?_4ZSMf5j(W%)!!AGUAA1UBBA @͜N1FGƍ5}tn`|jOu饗][uuL-"9Rٍ/©fɮSͬݒTUUX?^78b7~0hC9h6 ?5zK۷o'plٍi|љ3gh@ FZj^Q\\#G*))IIII1b-[v}Y 2vGƗH׶m[effFDB$T;w… =/X@vz/ ֝L0ϟ=z̙3*--՜9sh7?a-[h˖-_׬Y4cƌVWc|-]C㇓hCH5a„V/\UUU4Hŋս{w9rD/@85 A @ x "_DT:uzׯn6Iʕ+u֐G'_o֢@ꗖoQrHc"Wz衮]{=55U999W~~rrrH4gh?33Sϗ1$ހsGVaaaׇBUVVREEE6lX#]?Мӧ4pK.Q.]iӦzeiiiڱcyYYBV{LVڵksy]Q w5sL=裺k'OҐ~H5nIJHHѣGUPP|;vL !+۵qFegg+33S[l pu]k5g=Nv_4$:hė+.RWk1&SLz^XXÇ7YACÒy(ܮ~1 v| ij$UUU)66VǏ${P+++K}Qrrbcc߿'Fkl 2` 0ڷ+))Qjj6o,IիoyogVQQ6lؠ*;vLk֬i uMӘ~"s222jkȑJJJRRRFe˖k׮Ryy:w5)W^qƩsΊ}zDկv߯;/rhJ#@UWW`Rr$7UUU)66VǏ$í~x{磺@JJJyޫW/m߾/r$@Gu9kȑJJJRRRFe˖[ ]yo?%%EoTPP[nEԻwP>G X͘1CEEE:~WF?XO<')o)Gߗ?Ozl1lhtyhޜA4_ lw_Zn["]tK/ >}Z[lѴiӼ޳~]s5u']uUoСZx>C>}Z;vP^^-C=ŋ^ٱcǴrJ-YD-jdGѴiF:thĻgKZQǎu믿LG{>S=3O$IݺuӘ1ctWsr\5j(: oQڵӺuo;^ҠAԿ}7Z~w۶߯=zrO?s=3w%G՝wީ.L?zwC'O;Pqq1>߳n:͞=[{oaÆy.B}7ھ} /޽{/\:NGFF]|j۶mrۭCjԩ2=^{B~N믿^:tڵkdv GA`wڵk>YG _'2e~m a7~n| E|> 6hРAZti?;9wSϞ=o>>|X^zn6NOC.>NYd|,|,+5;J1)m$.nkYrINNϘ1'?1wLǎ=c,X)/**2z3.ӟYfdөS'3m4ӟnx hbccͽkn=lƌ56mLLL[͒%KBDg.\hnVӾ}zۗdNjVZeڴiUC{H2w^[vi۶ t;NŋM޽6'O6{baWs8gL~Z(0w7z뭎O;nvO2g 5,ݻw7?|!dp2O6lС4/R}C`Gc1baY,ɉ./H2Uz64Y32A'ޒ2]t1F2]vfK.5C 1At<..,\0UrȀZwf C=d^~e8q3g'ׯ3gNpu>RSSmѕW^䲡Pnݺɓ'~ Wl89N3g'NƧgng?3&11s:~=~v_OҶm[o6 n U=>k׮5:t0LڵkO?\wHcTYYŋGx(++K}Qrrbccr<&M5x`ǫD ,Ю]$I~?!!AߧNWӧO7:O~ֿw^͙3G]v~_۫wׯo^'Otݪ*%&&ꫯ|L/ _~W}v4V_|5Uo;=ҦMkqOKK|lXNǏώl|jsN6Sow~۳gn6ZJ7|mX;;>ڵo R G'1{liÆ ұcǴfOg}ӧK:tCJ:_W:tm٭BݺuӾ}|}LL\.g].bbbBP׮]>O\k֭ym̙+yfI_;ĉ;k_ii*kai|v׮}|Wٳ>w1\Ƿ{hnP}{nF8nI3g.BM4I'NԿ&?_O>йr2~;~ر;-\P?rrrS3g {\]k?v.>@ ɥ˥D}^ڵT^^Ν;k„ ~CС˗/ף>.U^ZƍSΝ_Kg~ y-[,S$5 A j+-=p@}ᇞ篼F+Bڵӥ^s[>lcw|ǒ%K4yd/+N_Izכ}[?TÆ 跼SN[5b`޽{UXXɓ'`'`S^4v v vcw~Qnnn&Ç`]kN ;h?@CVj#Ghڵ͚5K'NTbbۧKz}_V׮]eǵuVM4+;u&O .@mڴÇ=W<_\\3gxgv5dOEg|뺠 d v7nԸqt竲Rk׮SO=ı|z'L?o~뮻N}z'<奥zg .@zm?,bw|믿SN闿."mCC=.zka , i)ed* ;^!/]43D3"J QLMT./=)1(^Hn縇egg>ϼ3ofgvgcǎ(,,~k9'''3f̀5p:OKt͵Ϟ=x{{رcƷ{9s&n޼);~MN8\۟?_MxЧOl63~;挚)R3g|NII V^ ߥ/uKŏTK\uXD&=\ɉSllܹ3Œ-rE"!!AʦLOBII J%j5yI. "鑑bɒ%bcc1qDDGG֭[Î!bMDԈ9#G#2Մ7o"""""bMDDDD$~M/54maҤIHIIAFFѿF QCMSmT!ƤGذa5jv ;;;b_wknnnFnB_Ǐ7[pAAAXh<<<0(;(,,D||<:ٹǘ1cc!cƌO> RYkj_BBu~UgAxx8BCC|ۇQFD>3 :?RPJBFFFG{8tS|9[+[jj4,ZHu.'CylذZ gFNtG6{[j5 [nķz|93>L=޽-8::b8tKY'73g-KihNbРAyYf"$$D$&&꬯ߺu6lPBPȪ1Ӄm oojۗGFF.]TF]ڊaÆ۷5MNNNbٲe"))I 6L4iDgؼyҥP*5G,X@sEĦMo2dv~ȑ"88X7nXjprrbҤI:hDhhPA,YDOllpvv-Zl)U>?9eHŷjXl޽{ORSzzzǭ9Wj׋W^yET*1j(eŃiϞ=GXYYɎ_GjǗ_a%uzg녇G:rz8~NQ9i' "?Ͼ].&'ƜDmllDVVSSSE@@puuh)֯_otKV[.vډYfO$?HKKٳgm|wEs՘6mڴik׮aݺuf_Ϝ9*%%%Xz58`a޽x7n:om_83>L%7O8\E0SlSllܹC{#^vډ5k47QxQ(ѷo_|֭Ů]x|3>pe}=\Y,u/ӧOǶmkoxyy!==J͛7G>}}2H]@1sL8;;!DLll,&Nhܺu _5bbb1DDLVZNG%x9rGaG]@DDDDě71&""""z4oFwҧ-KMWf]h4Us/'Q,ѿ5o)))xWjO,]nϞ=?~Shk===uW~r0j}äI $'' }}}F͛7[t|o[CLL lll̺2fVOO6^6؛[HH{ sƇ7,, 7nDFFF_}ƈ=|}}j*u~={Zd~1m4K.:t(233% 7!!!Xt)N8Q/[]FLL ZGuFxSjڴ)uSN3a˗/g'Ԡ9JJJk{mx饗pRƬUVX`vĉF'u'O|Űabҥ`poSZxAAAXh<<<0={bAff&:~>}J ĨQеkW!77WB#УG#++ZRbIIIFxxQn:|G8w5wwwL>FǡC_Ij4DEEaرpwwGaa!7y̘1x'T*믿b񵾒R5b~JxꩧP(ui<9i~nnn={6:uꄼ<cǎ=zKWuj)?WĊ+p%|W[SEitWNKϦo777[npppB0>ƌ;v@ap|o}/U9㧡W)c}7@m+WrW~95[_[9|5i$lذ?΁|(..̙3ѤI8p@k֬gƝ;wp1Yu=z49+V@cbΜ9 _e˖ƍY_N 1u}8vx x{{mwM{n 66V?vmt}Y#>>gϞ߿?V^K.aРA Ӟꫯ>ٳgkI%Rmh7j#G7ƍeŧT"##q!̞=&r/E~_Uyy9JKK?oQQ\=z`Ŋ&Œ籋WuMsmr_;66۷oG\\nݺetbbb0sLa׮]HOOOM2H_YSJjgCa[M^u 8ǏćT r'~??Bq/hd{5һ,99YjJ;VERRRe׺666"++K;*x˒d)֯_/ϕJHIIjZm۶ RiT$NrTu%''gyl^9Pt kR)zzzPTPT"==ݨKMR3|}m裏ڗWj[byM7q&"##Csm+u|* E]vb֬Y"%%E։kʎO)gΜ^ZpH{9s&n޼Y}/~M1c!ܹUV]S~Xhmm4GBܾ}'ODDD=)Sׯ_Gzz:>j[`f͚;PT=2>5YO?t>RT՚)WrᝢD߾}[vb4)66Vt٬%sⳮ&B&9J"^^^HOORDѧO~mÏimD7Q#'"::n_v =6oތm͛!ěב#Gpv#Rc&L7o"""""bMDDDDĻ.h4xxxT{͘rj?v7>71cggI&!%%HNNFkUEZZ4 6oȌO_C:Vj߇y "&ޏG]I|]gϞiӦ5x7m4 <k֬u Ꟑ,]Ju> MD=_'شiSt N޶˗/㥗^•+WPVV7"Z‚ 'N'̾b:3gY?44Tj ,Y-xŐ!C#Gy???+E-DttX;Nhرc/_nv-Z$#uA͛f͚]>n8j*$ŤItߺu6lPBPT۾Tj4-݅6lؾ}K#???yfѥKT*cR+7j$-[&İaD&M?rP29k4)t7LiǷ'5>IŇeL{M=>5I?9㣹'N gx5_˝6~ k E (oOOO~z HNN...hѢOu'7771||BBrBZrrhժv^V:K :VVV:2iN666:姦'xSSSE@@puu{Ғߪu}K1wrrxgd/U_mSvĬYDJJxkI唯hW\wmOj|s:LMoi#58qj\w'OzҾ&ݻ1zh[8pt888hKJJt !PZZwuuEjj{R + mڵ+aooS~˖-q׏q0rH8::";;ڏzRT[ejҥKXr%1}tZ޾?ngOR!u|Y)gR㟡DpR6&&&wymHJJ–-[WmyUڵÕ+W󶶶P(3 lmm1uTKgi+V֭[qaܸqEEE8xvM9A IDATk憼tP(RRP\\ltJTKپ};"##ѽ{w(J&111ѣlmmca:`Xz*ڵk훣 OR!u|?r__OCf"D15611:޽)))C `֬Yر# 1z:پ9$RǗ#JDT3&N hSڵk3f@b˖-݀DDDd~Xh1.] {}MV&'LD~u|7'LO9g?z(q]ӧOǶmu+~4{̙pvvw1%Z{7o"""""bMDDDDě71&""""bMDDDDDLx1&"""""&DDDDDLxo"""""&DDDDDě7o"""""bMDDDDěx=\Bh4y4 4 كٹYƤ>ߧDBj4xxx|bbb///~)ڴi6m`˖-1,^﨨(pBo3g`ժUhѢM6ͤZ'6"'$$e=&Mk"!!&L&ǎH{{{'D_<񎏏Æ C|||)**۷^^!:oոiӦ֭eزe ^k׮O?EPP6xw֗[?"XJSV;w.>S̝;)))7of͚U>СfΜsΙ} #F@=P\\, ֭P(믿bhO}E* G4 h"xxx ''aaa'RQFk׮Cnn.V^YSSƗI8{l˒j˞{9$$$`ߞH{ׯ_/^yRĨQĖ-[ږ2???+E-Dttݾ~[ 2D;?rHlTDGG wwwakk+ &o.|F#Ǝ+<<~ ON|:i)W/."==];rJm bʕ:Ko__9͛E.]R 5m_jھڜfeSNt/):j6';mc@_A~w¤\'&BR BR9edl-x{zzx)S"44Tym(~C*~ohJNN|8ك!Cf+RSSu^+//~IIμOiiΓrʯMm_˖-qe?""ƍȑ#l$&&j?J4?V>cj|8::"00]v3uK?rg(Le㧶NNZikkSBMmߵk憼}DY]?s̱=DaP'ޱ8q"+lذΈ^%CD\#Gȑ#܋d1~&""""bMDDDDěx1&""""bMDDDDDLxo"""""&DDDDDL7o"""""&DDDDDě71&""""bMDDDDěx1&"""""&DDDDDuOihFǏw爈 y/2^{5/Xp!{܉7!p]ڵ :ubI)j8}={Ā`ccL:tHgFAPP-Z ,, `t P(_1~TNDhh(z)( bݺu(++Ӗc7|ĨQеkW!77W?ٳѩS'塠;vѣ%ۧhc <G0sL;wNh#"""b]3F!nݺGbe~~~|b̜9M4tʘ4i6l؀B뱱ؾ};p-e Xf `ȑx7qF{իWҥK4h´ѣqXB;sAHH 22ٳ[}7oܹs?| BBB0w\v( FQ#'|}vٸqj*\v oG}1cT+#==?CZTvvvzݵkW۷O;g/yOTTΝ;8pZ.?><;wݻHNNF;t耽{?SToߎ:֎S2҈9)+"55Uj;~#""0n89FbbV !PZZZc}JKKu.;::"00]v3u_xÇǞ={0dȐji_EEyu̞xcԩϯϟ޺RЯ_?,]AAA[[[( rB[[[X[nÇq IIIXd &L˗/7k0twwwXYվ(BJJbNˆ#󁁁8qr]\\p \p3g &`ڴi8p Ν[վ8FQ#g;whӦ QPPb-%%%...B8y$"""7mڄ0idڵy yyyHMMv3gneڇ'Mm_?,qS.c|C;=K/O=򍏊Ç_Znu! ADDDԈ\7mEqk2:+/fMDDDDD0"qY'zt{Ȝr!}vF<׶;]90o++k!Pt&߃(V13n ī}'"+Ь $""""2[7/ *Pp\ٻDDDDT'iӦ[p&ĆCpʾ=1wq5v ?u u~""""P\zﯶa^Z'iZYA(-Nx 8>jxw """"2;B ǏK Z MoD+(@yy***pNx o"""" Z aa8s :wU+WƦAԯ։w{AphEZ!By>JJJa[Ri޽h """"j޼9֬ FaqL47o`Vۺ:Dy3WD_%|`nf;`c$ũՎkpu⭸AoADTT܃Ba߯TwZ/>}MeQUTJhҴ  ({ @ޝ|(mTi""""jj 7vMPg,}vpM[t{hn5COprEDDDDX=Fی5(_+W[Bzyl;?qf]@[g 65Zդq$e<QQ^RQ˚ ?:eolx9x{H+vo"""""&DDDDDě7QcdOHMj\[oajXQe7Qa׻aFě B ^^/ jB( &DDDDD`ccU+WsΝ;cUUyLjмysY׿bмyZŇ+ Pgr9oMVf5 DDDDTy8n.BF{^Z' K|_ϫDDDDTyJ"""":+1=5}#FbMDDD !~(HkR&DDD~?,HMDDDDěC᧟P֍x1M,Abxe+ؿCo\F^Xnmom\%!1W;= Yߗ_F޽1w\h_~3{zF޽1gX{`BDzQTT${yM1djaջ7grM^ԩ8zh_-er_ňY]^6yC7?LJMc9˺~}[$K۷ow&َ87;g֮[/pJKKպˉgU#$]a͛_}m1|ѷO_h{X~x'}ukD^^Sϛ+WT[m6o8xwۛ> k5cGZ.er_kᩎ8xK,G+OxW1aW 1,+9v{L7mތA0*P*_cqLΠઙ/ڳ'&M?C篝]waƋ=zСCo~Xr%u:n…٫F Yb2,~1^~ZWT_u6 2/xyUkTy‹=z_W䩓^ii;ѿbMջ E+nݺ?ܻwOJiq1^yeWL.{@`PPxjCq$'NO/oUA//|2EDO߾ ٜ'`oOk_Kە!CI&h޼9&L?h-lmm1dduoO`OS5h(F_IDAT+cwοx]̘I*CL:__%yՎ{ , kV)0~=;˖ay턓SK۷=))7&”)SxRJM֭݁]_`SRm&~EUZZ'5ks &޿q {؋Cwca{+>g>>>(++Q#G]3mVM9r>k(cwFVf&+8r'6-_*CLmmldwYg-pʃ5mj8 ,pO]hڴJ˅ ppp?۩Q!/iTyQhƎILUN66-[3ݟ[7|=hChݺN""zҗj|C&|S}RpE#ڴqӻlʕdea䈑:.Y!!Q9ro&֯__6͛3go&^Jˍ&t~wT׮]5kVv]ĮX $ F`? $$ڲs}.ߔs)糆ȑ#T*Ç{-_*C<㹵}ׯ_Wׇ1p-0j6\*2|4\Vտ+,^[3vݫ7oߎkWbcFܹ{͘!ڞ16f$$$`HޒSj|7lo:zx Z9aiO}1V0N¨߽{v>nw'핮;~>4i<2"vv_Rrc5oa[VV7u{`ggwʎS@HĕqZe07 ^j˩a())ʕ+G:KM95|,U~ӦMu699أk׻wO|wjgdfꜜ=oݾ |F߶m[0`[?4KY:tJ_{ި/ޱ#zY3gʜ~7%%%غw1M]au~XlBuN#9-UPuK錚20!Ηg&`F1NT-,!;u(޶h/ RN{9OϽ=^߂w:~ ezry(D=㻱<}\x,rSS}}}&@R[O&Iڵ5rdƻ;?E궋< w`@@ӧOcƍO,e9^\-giӰl2uMyPx-7QD({:tgG@oh޼D‘\444`0Yddd yyrT*N,(E'Ov{UO̚9 OE ˓['%hmmňTSSӾfm!"t:m֭ {ۛ3w.Y@:2 0ͨAZZUqICVfjU2?`4QYYvsW,;k>v|۷oC`̘1N}~Ȑ_T =шA?`YB<(#"݇ZƉ'`2Q]]|'$8\qǡ F#ac{\WO;KO:-y R?uw^ r2r-ME֮]Kڼz5ۘxf+$r4;v F 8uK{:}!~6Aؽkʠ&PNbՒDt:LDt22vt[ѬoJr~^aRΜñ}HM([p!ϟ鑑m+QH7ʩJujm޴ 0aB dzǍWB`xXj5Fvs [cOqϝŢ%aqaO&fXn=z0; }h"8휨C d0<h6&"z^ xo>䣕)سw!{Cʊ =V0 c01]MDDDD7Q/-22DDDϱYl#'ޖ$""""k{jt`׉ȵ[B:|G+>d`!{-~y Rc#CDDDDF >& :p^0Z +:rU#JO&Aq=&DDDDD.$Z(f߮'H>|$fh6 6C_@#""""r&Em4k1W-eDY?0wKČr}FDDDDCAdOu%0eIENDB`kildclient-3.0.0/doc/C/images/pref_sending.png0000644000175000017500000007164511715730227016144 00000000000000PNG  IHDRNT sRGBbKGD pHYsktIME  vtEXtCommentCreated with GIMPW IDATxwxǿ{Ћ -w$ {&MT+; *!P"=RBEHBmvf~']nwggfߙy}ߙ>] 1ÛfAAx z8v(?p" l28د.AAHKMEVV, $'p <σ8Ozw =h} </a˯Yla-\15s hkE\Ku1d ,{N\/CwQ Ҵm鱾+wZi)Q?=V<5:C}l犟<1YIeݚgէj׺!Flaɪ%AIi˪OGkhHXMVe*a:sK''g:ĺPjZ رc|ʕD]^YZ<V'NlL! JQlePjvLҲR cX\VUʇ䊆¤nw⾏)^yzYyOJiT\rI!NR"9Yf<++ ׯ_@@p%J -5W\ٳgꫯ[Ǿ,ܸyre+Lji9W_}hl~Z&Ʉ7o"W{XP/Jche>** 6W_~iw-blY@$3Y-XdjM$G:/TeXrU4(\d=tRڬzՖy 'V՝dNYɏ\yQ[X:sXApq[,9Qy9Y,2%c]*[ɾ@obv>2>9DOd ?;̤ Ay =#=iiȗ?CvD8vޠxtM7&ղ :8f;I$q~$f` xɹDBNXi̽PSqֲ19LhyuYy8 ΋{<,`|KcxQʞcE38I3[ſȱ|8b!7>b#ۍ(m^HVkCx|0̙ÆVZsʅeM[U$' U11Xz5~;,X\z~ #F W\H A3Vۨfgʦ/^Y&bVČ3q]DEFb̙(^)ӱjy@B픬t}[\\ zUT̕ ӧO1)c ڵm+m {9ro9UTElbFڵk'+V=駟`uajK#W.L6Ækb~L: ŋ˖a㏰be 8u4|csQ><7nĂyЪUk!Cժհq&ʕ SNСC0e4oy :NoEQH|Ç/²<|<2Y-8 q>c۠*|W>v5QTzNfXJAjro,Gq#~wRN' ˬmĘS Psq,+kqŹ#I^:xkִ;ߠ݀|Ve8;^l6`qX~-ڵbŊ ݺybѡC)RF#<< k0;mo/dffDI)Mgd6a[q!$$$>Ĉ?Ča1PT)tMȻ'2ӳWi,pv7lvhӶ-}ŋ(XFΝ; ڵ-T"ԩӂ5칳|htMbqZv$o߾8v(֮YW_HLJBDM6 [l8v(֭]2aaDԫBCBiǡZ~},ʔ)#7QQ!11VؼWi͚5(WԖMF J㜓1K^2K1b)QN zdK.t}i(Y ɋI('Yɓ3 t8@{ ׺"Kk<8x𐐆Ԡ:t8[ryl{wVڒ΋Չ3~H%Jsf9spܿΝŹsgXj5q4e),e1Ni, Ҟ'4]q5Ca$ M"Xq9zlRDq/|bLX Q|$ȚAlQRqq$ΠoQXheB]h8c@+$?oh85M "9Yb3Q-q5 gȎ+3Eb0$ x9X!^MY ]i)!b[9Yq_M,N,=1NX!N4g&q6dkW>*`m\r*Ӂ"Ku"R ŗWWN(X|9}3IIXB#xȟ?(>Ӡ83rKK|#M9i sd)Kw1+;0 ZxYw D$K%ҧ82zO?lW|7oV(7.ブPL(;+F"Q0O^XP~]=l]) 5/[fKرhР!3'qR2>#G!ڔJ*ȑ#;F 1PhQL>qy| ނȱb a2<1Nz^9♞J PP7snb8װͦP 7sZzV% +K ;`UO7(m))mX>ϙXIM;L&-aJ%lᅴ7h??TUyEqQviڞc+PQG~^$Dz%?Rtu89 ˖>DPpw_' CѮgyE+ᕲ+_&Xz:!rm;g@̘> Fɒp=aUyF&v <QP!*UÑ#Gz*2I 8lKc}},`o~6tp&LԩSQBܾ}&O2d(Ӧ잫V`q={Z Dժ^4*0\;+8:x JӀfJ><*;Hu"ֻT^m"S!xy݆N.YcXT.'K1Rl- i8 u^+RFbh[vBYbQJ{Z (Xfe$M_GMmTAУw?c7E5(M ^^3@vޠ`4iҮ'''au(=o[PQy+h=_@EѾKɛ} ºU c9u !99agu)N׮_ǽ{PR%0 Fo6t{- ^^^ᕐ,Ε D|*U矗a0`?~ ԬQÆU|UZ?/[ϓQZКWvi( v9y+VD[0|>yGEU{yׯpZjcaB;X|ƌZn#FhZı bk%J˄Yq*TvS=\,kgb2x (ĻAۖ>Y'=R, A:D.ؽkK53㌂૶zJ2ա5TPrq+.qVTyԱAmWaN7Jlsd™3g/8 /eff۸{.ʖE|+wnLۦ4q){_$y뢫ÅߥXv,Xȟ~z*w!{ҥPF  #=ݡ~hs$&&Wv紪Q/Ŷcȝ+~G|g4oBJd9(k;fi횞%ӺvzwWv^US|@* yae?.Ne{^T'҆e8iuj^񻼑ڿTĪ]ȯ"[4}מGsH_EN X( I`dɲԚfKUNm1۽\>96!b-*#/Ӓ7ixb[9+G~˞HFeM28Ȍ?w$^Fd%js_,^ǁٯ0^߀ٗXl"^.%qbgR}(|K&ȝ;7׬U ͪ,Jd֎8^ydee"w\^*W Y*)+^bYRcyz+S6L-9yQU*WFZ,̬L:>yˉq㔘ܹsYYx.7CFF:*VFɂU ~O^AgB)`ܿ)< Dō[{1;eȾna7vTS88`bxV%%sgҰR)-+ZV0.j'PNOUQѴT>@^Ikd&(qxE;w!qߢ}oEg*xu˚^Zg֑b0 O//xx[xdfe"###gm)w`xzy  .32n`o=w6IS`0xZ/FHgz)ehʕ[kR* J9-r ?{u`Z:&]5%2I<Gˊ5V -R6xyYyQ[Dq9hw#:v*M xel!ڹbtM4x埙nDo͉!PpHYr')|RL\,κZSRJŊfHSjP[4+]^%7ԭfv<'g8;b3gUۮC y^bRxY'c%,EYmBjZ\X}];ԇEqR0f Ґn8)}Ґ[<[ڦ4+,‚<bA;T"eJ]f3RSӀ4vٙ.f~1a:&ߧDlX{㨥oPxa$ȇK70!{S,7V(ENk>A11p֕ctNصm["4 q=KNC]㱵!ȑWb:, ؝+K.?f J lՖys4Dk56v(d䃙5y#ӗy5U{ϐqUqRm`!n:Y(\!iYeisw%+I~vV iKn*~֣g]!Je `ݡ_` ,:Y$fޢRX5ʋW*['k/.|vq!'>O48$Kd12gv1IC2aI0d 3[`m+l801,=* Y6@og`g'Hhڻi+&Vc/>. MIp*|쮲=%,]V_Ϋ|<\KJI\|Pvcγ{lxדd/HNαґ)`*#Hx۹ed n= s!Sq;qN7X$ ׺3 w4t: W9}og﫶C=tU1SĊJċ\MJ|qyvN WUg_z-'_UtU'C}ôD؂Gugv= G]5ۙ\L)-5AA/3~  }DAAAA)NAA8AADAAAA)NAA)NAA8AADAAAA)NAA/Ɯx)UK[ϐAO^)Q2+qB< ApR *vAEH~V_H Hqj Q/K_$_طw6d=%&NCS x&'#  DzH?"AANHq"  ʼn  'B?؏n{|R6yw0.][:,  ^4v/&`h԰=7_p!L0%J"+˄l z?6iT,XGDMϒ=EQ-`0 ((/"#;oǛA/ev4i[ ɍ̞ ~߽ hD1cd)N W|~O q,Xŧ|H Su%&&"|8|NGbR=w=Hc䷯~#Pz0fY8V:,Ѱq4VDm3Lg#GZ:]7˖-w۩_͞f,i1t?o>>>h٢9v* Qqڱs7""^C@@ի;wKGD5MMNnLGRRӢUhޢ-fFܺu: [EFջ'IÆMnoknہ{!A4h-9˖DNѰqs|0d8n޼;zп/>56g#Gcej\r忬Dhh( ш}/9gXp3 b4nCbݚ^V5_ji^{`n_M~}b7i4e_ۊI 7saɊ,hɒ34UenhѪ=7mwkoHEhޢ-Z+WIvջ6F^pHlن=0g}h(QѬy  \6pdhw獁v@NݐL# A[@˖-[DcvY󿛋ukV3f}؍(^֯] a4z`1_G:~6o\f͚bLi_1پc'|5{1fXM ʋe?/–_cQ?*;zykĮ[ƠH"XvFN? X M71Xn$1GXbfMd2 ⎢~HxyyH5S|b*(ZF>ވCvzaz֮ňCξ;z\VdA,bq~-^*)|ŬZ Ʉ5cu ~߼2alBlY'ö-ЪUsm߉/gNc ?v4݉u1/Ntٻd蛯BܹpH$mwFj Hqr[o#99+UT\ uEݺvƉt߰a"OOOxyy[.m о-׻wG$ (Vky DEEH 7Q7:w?};ώ^" f2Y Uc \|Dp GF$/^Lh)̬|}}ѡ}[,B]u&C:Ê$i^۵Q ^0Zp֭ѲE?qhղ9mہ 9g(UT_~M[Kt<í[p|.T7k.Xׯ[y<;Kʕz Eo OOOemڠOf!Fz^r%o;oBhhKυ%+jG\-#+_nF|%ʕț7ae.^yݦ*XP1ߣ>: ;wFV-8DF{bL])PTT/_AR%׉d Rb}o,^:,VDq2<$ʕ@|-ؽs+<=ڰq3V\ݺvFTG= ʁVR^}dJ*) 9VW t>HHH@_p:aae#a:BZ`hQsa)jG܁b8:.fVkuh={#qHMMCt&OL+%@6b* ֐ ^XD=/s/[!yzy">p96&%%/Z(>zoルmZb ̻3׈)^8Lǵ~}bߑ ٌk׮㋱y]:w HMMEZZ/}>UTƒˑwbiN]ˊΝ;BZzv:֭Ų?a}F\v?wʒ/V '˃K,G"WYYʔ)m[O>Ĵ)1a┧!jՕ k ŵkq؟hִ c=[sc:Qg`- 3uoݪnݎ4c1dG>L\p&L̻3׈iݺ? ddd v&?Hw28n>"bxYz|]`=~Q Fz8w3gN}&!!!Qвu`[Gڥ3L&"Chݺ 30i4 Ƀ}I!=={͛>wʒl1 er-o߮ bc7!==o=w ֭VHu]iPpp0^[ GcA'dcͣ"Q!H~T$z]{ݻ5cjǻv錔Tt-[w_'NbhO?¢K45Ow̿3׈ҹ#.]N]zyvؽwL<;BNf/89'6m\.;JG #8~q ϟcm`--o޼2y=GwJߕ~6;vm(P Se ltNI y;Ǭ/g[_ҭ۟d;ԩx|tx-a2бswֻhҸIec=hӮ3" &ju%Cбc;\vtڵoذ!YYY34 )Qtf^9NF| Sa矡ytS$'?Ÿy{@AC^HNNFoau6LJy ÚUhY B{nz/jtO\Zn, 6*)Ӫul۾x! 6O XnG7 #U񬈌zTϘ1cFb0ytiFxAT1Ҳu{+W3O RZfwr]&jתI";J@/# Љ`q?  "G/Gdq" Љs#Hwn;ReLOi+g!# Rt8?}r#(P0{;NHA  {vDA ʼn  '  R  Hq"  ʼn  @s  BGdq"  )NAA8AADAAAA)NAA8AA<;v>Ξ=!ҥzK.]gkC^A.7AAl<7e~ʼn't=w'LƜylƝ;w0sl|0x, I*AAÜ7Oɿ0iljgK⟪҅x\<N@زu;V\EJAϓgl;& ~~~ֵ3.]G}sc7lBfP. Zn;wK Gpܹ*ةΝ 9oe]7u^B̪vyhK^#ШIs t81cFe7vCs5*UG*hס N<hаJ֭[7otX84pݺB UQruycnݾM- xEb蹱8u 0{\ԋlI۶}F| ^,\p?qGٝ{qedee9rplX0 p~FBw^ݰq3ƍƍ`p䵺u.^r6 !==YYY?? [6`Cσ{HKKǁ0tGԚ FqaxAAJJ -^FMc㑖&Ïf?10Xb4;uꀓai -Zн[v;.pQD{: 8U~nunoԩ-Ql6ƍ 1˩A8=K<<<0bۻ\a6;npٳKH UN8iaC͛233c.]Ǡ7ΫZ6Л pNl SsIL63L08xpVUS7HLLCA<'O@ڱ6`qf<-88ew̶WҵiKtRNON]^q9cXQd <|k׮ǣGV&MU*o AAx-!JceHII/J, Q>̞ gO**G,ʾ:m&ݼn% Z4̛ua2p)L2Юmkoc:w7o h:x^h6'.V+g7*tAA3{&rZX G| xw{0d(^EXwdW\opO9w,e%*VGt_k+Kѩsw\|+UD]*P޼- p~DQX";uѸi @JA8=K|)S^^^EժU0٣p^60uD*UFyA.0gLעE4ƍxs皵#p]޽+:w@   ɗ/xgxZ%GAz AA)NAA8AADAAAA)NAA8AA8AADAD9x*  ыY  tBAA)NAA8AADA<  `Edq" K8 W˖ݞ7yǕ˶;P|eԨf[$yYYݧ6T]i箔\=_^r0-<4!#Yhؠ><<<^$ ?/2,25 ʼnxL&4kڄ*AK8(؍h8ae+lض}p)6~=[Ԭ`HpX UF=chDo2VA=$&&᳑QFԮeW؝+׮]ǠEuP|eDh#ˤtX8bVFR6>t%& E^zٲu;[A*nǢIvrL:#76[pTZ } .*֛ӦBuQRut /_-zU.GVn'sQzԬ?-Vuw8]uyY\o{ӿ9RjqD% +TE}q53v=}+@ɭGSgXp3 ct!^ ?vЁa4ݼ%:uƬSJvލ,%y{O1&ЁX&WWKCG~(ܿGGvmq׳R,]V.?v! KO^ŋoğGйsG`n؄E g.]{дIc ]x L&فѴic̘nYՓ=Rj_zdUo[Ukۍkciӯ2swɹꮾN}Gw/+b/_>l۲ ǏDtƕvU%ɭ$=cFDb͚6dRLsUhҸ!u% zsN?V8_=wG EƨQ:\I_={t0_R9ܟ^]?8*1ѲE4>{bㆵÙg5zWځ}pTRS<XU-z)0sux.ǏknOURI^PAE8#7ӦN ŦͿK0p4iHw=^~ ϕ+]]jɪVKMdՑvrE^N}OS]iOqT!/_Kp;sVJ;p/ HqrΠgXp6/xzz*Lv{1BFK魌Y c@Ѱq]A.E~3qn{&M1v N<{b}HIIAvm[ђU<)VRUGrF}u3ߙӺ;Q3ODƵc\iO/ Hqzj(Ts{@$$$@\Joص7Yg/^R=͛. X!۝ܹs;gq3qVnʕ+rʢ{.?v,CCCp])RTYj{ВUG +!_`A4Ⱥ?>G}Gw_RT%j.N8 W]ý{]:w HMMEZZ/}RZ8zϪU*cHMMݻw1i4˕+{CFF`ڸшmwy\v cNt'NݻwUסjʺLA!7Zw+s:ǢKt]y:TN<dzAZZܹ.8tɹ+Iɴҹ#v܍t1hӶ[\cځ}Anܱs].ٵ_>x14EZp$(fΜPij=ODD5Bвesқ:e"~;?%m+D^-W ޽zTh޲-7lӧN֝g Zu lu j׍Bpae#y@dƨǏ-rj%еKgL&DF5FNѺuKɹ+IɴFo=wQ Zزe;ۭp1Z@i;' k.aÆ Lu*Re3T[]ZZK$m NrN/ {@ACn_^~//o*\w&WA/&5jCM hMCKD WB媵вu{deeaT1AMMDXي([2mv],Fu0dxsEZO,1a܌UF=X,6}׬ [^|$uG卍݈˦wtX8*Wą fGG:߾a!"|ٻ/^>gv:.V+#E4-11 j5vH,[BRZz^UOrOKF])#zDKPO}8J͚5ѭ[7] Q}ig[]x fNy;w; FMX{\8w _ϙCFHߒp;"Oǖ.:;F#SNݘ5c*3O/d=;wx?6mziaf,Bfٴns^i2C_'NtR"ö-pAD7k*+kpp=۵鮷_Cƍp^[իJժ71竧uvQ_=jՒCpۗF$/)N< /2 DtߒNcℱ(U$Ыgcℱ(^Y&0Lk= Ŋ7ZlݻV\&  ]^r7!!0z:AqI٘#QlZy DZj={toc@(iejl ???OظaCt8z͆ѳGw Ńt[\Qԯ ///)RF}*V޴pTGF])~]-Z~PO}=;4WH;}7^[@DPữh"TP^t/._ | *U)9_]XQ_sʒ+W.>>.ә5Ǐknۃa44%ǵM GA~zdԕ:S_]PO}M7k_zK8yxxF`3{,zώqłn;)k`p:58qvً{!%%ڵArr2nܸrAL&t8zʘXp1 ȟ G7[m5=tכɃȨ+u~]-Z~PO}ah`\yiUWz5^P=͛nߥKQ\Y@rc*TP8 H~sܹsE$%%=zԓrʢ\ޭ Ϡ].h׮ 3OOOz.NGQ{[޼ygTTI}zZ5֌BMXFnmthǷoj-jڼjޒ]ղE7E YڄaPsmٲU{O_ϛx}6/h*sw5eֽpVado~t[ܟGÂQ4LbH-?2yS!**sg(==]d0ib5k)u28lߦǕ3)h9,"ҞoUfMpǶ~eZ=CdފzG kI"(::lqr;} ѨޝqMԜo9홨e"8|f 8+WJn|K8 @FYhcgLp;K΋wP66N' $9*3=g#k a'n"k^ J-,lڄe$8>zE@bZ'p/$3 i։nv!Ϊ 8JJJO)))Thmj[uW|*o6*ɶ~M PPeX ɝӿ)}'XwɤW*URDD.\333V 4fL&xනX,zf83cwT?z94a O%Y>eq4w,ٽCFgNڹ+V-[>F}ծ][qqq:uz! 80Ϝ9S:uΟ?*U矧m^2]{Voڔ'g>,Tޚ&Wéedd}Xʕ+Wm׮ nقtm޼Y:u|||4rHEGG+333?~ʗ//OOO=쳊m^<)Wū'9UZsAkk iA~shA˯9}|lVu6\,XT-AfjܴC[˖T`æwC3ߘFnFN%87y+VR lT/%]ILw ߞ޶+h[e"節M1|=fnXo5kġmH]|:hn^yU1Z\=GVCjr}6mƎ@p*eW*]Çj/b//_^#G(!!A4x\_xhn{SrssE/\ګ[a:L؟}Oի_(v1۷}8'~Qƹ^+sNSUʽ羾JH\}-0R1޶9cF?6lܬ>}zж;w9Bmz֨Q=$kZ9Tq -!r:ur WPff-0eff=I@VX!ժ_|QC@6~K3{LxClXjĈԽܣvl_.',3kѧKdMR)rծ/īZ|7IR=5{z}kw4Y-L|&M ݟQ||ySխ(s/!!AJ*:sl/_*Y?Xh0͝3Z=uJMMd~!CG9bbv)--MGr_{QHHkmsءʗ/_6u]dֺԯ'O*.$)(f=O}zw1ܑi&[IDAT7={uӻ:ZfYfYKP=<쫥Vd2… >}qz +%%E&Y׬UŊm]]]mZIM3*55U}j׮ {OfYÇd5>vzkڇ8-X%''U05i[os3^yᆵ5~ 9?<>O)<[ ]MԮzvkֽpBPPok׮:;2gCǟ~V6aj\[l;~oPpvѫ:w{HtXFnmthǶgY=X}=F e:cxW ƌEbo[=MmܴEM}[-[(Զֳ(킼1sղU[wTW1dرC+WV*Ue͝;7{r6mt=ZjJOOԩSm)_<)e 3)=-M^լ],gΞՀĆ,1vѷ66Q:lߦZƎ C`;gX1l|7k >/Z"RԿ..Yu)::lt/nE%K{|J&-4ձC5zc h4whs5g[?KNAMW4Ԕ`g7ޜ|}}յK'=>χNd@Dq-|ga:(٬7ø&mJۉQ'pRŌ. uNK'Z 9@p 8N'u֬n'N' Pv|Ur碜'N'@Ib2NCl6 驀yxx 8(Cu7nbf=#G8!Paؓu>g8r"88@p 8N'v˕7PPYo)0 @p 8udf=$.7DN' @p 8@p 8&{Xx'N'@If;.봺9uٹz:ZDp 8N' ' @p 8P0_r#Z+WYisȊF?EN' @p 8@p 8N'N' @p @p 8N'N' @p @p 8N 8N'  @p 8@p 8N' ' @p 8@p 8N'N' @p 8@p 8N'N' @p @p 8NekqO0f6 N * N8~}N' @p @p 88U}eưQcuE NԪMh , @p(\)Ρ?E(fǏ!8PZYVP C#8dTG.M'_v'~:2DEEYCBBtJ3%IF#O(!j/t^G(f6 =NR-~PZiqY|N8)G?&8Yßw6h14e.z(iA9y괦Θճ֮߬["k:jլ&OSe^'J)GZP}BCIIգl3<-\n:R|RYu8re Rʑ˗/˧|y%&&ҥK:wzu뢭Q;rEu uQNիJOKSyoo]x1igffj޳m1l[((IrssSb0hʴZ*=I9z!oڪ+oJNN￟W.ԡ~;sZ)))P\˹j iXJ#G z~32335YjԸo~ĉ_l÷~M P-?4ht\Ә;]5nR 5kSbkNBiA1LOM_RJTrr~Μ9d/_^nZv6$$IG ꪚs؂۴Xӛfۆ7AsG'vBism#.W3J!WWWG^/La[P;*rssSիJ6Zhͺ^aGnZSeff2رZ~CU^M.ܸ.իWoyc=iф6ZO"8P8g? ?Q:lVh`֯wh[T|+MΝ~?b(.>[T&Nx.z +%%E&Y׬UŊm;u%˔"I:{\]o ӻXN2LÏ5db Rȑk~T=Gl-M^^^ڭGFKޱKrs OW&yFZf| \5jPMx^cx}wxAT *ՠUC$ WW]rwsj+WUVMYV [)e,Iri_G韓*=-Mnn:q멇W+ʸvML #sZvĪAz0T>N8)GB=/r2zfTԯ'\]]etuU뿗suU-ԷGW%%TzDzCNʑ{*߭bbTF5yex*#"b; btѨmZCX[FFӕz( xP"PN*6? r8QPy9 #}ApNΌ>N ',Mhq 8Dpp$4>|X׹$t*pOOOG-j Ny1Lq_k׮MdXl/1P’0]@@ʕ+Kqqrws_= RƵkT Дݧ)atf&"M_DH`DpO, h-)$"}F4]޽z\N8e4_@kFªDL ")p/FWE4N 9.1F +NƬ公 )RDD~eWrv#UFj7\ K\ y65[ rr2242;yYY/5K+V~yXQ NDA9'2JLB'Ӹ%I <qNzᅧY$m)/xy)8w22EQuN$3YnКdaB+sn/ev,PSFDC7kz?Ăo1NXhd2/hzsԿ){ꏘ@rOjp}=dy\DD&8[""Jo4G =lE?c͋5[&yn}tnHN|P2('Q^^yR˿ͩڀb偆t31"D:Q6[sBټۼ+uXnzR$P؄N =deV}]H1xFsydQz\K/@9\n49O3A]Va, NnNFD2'"WTT T^R:;'2 KqX"](&X7G6nD&d2K=5/ DTl) 4n,q)s絊D^Z]\ذQ%'h!r\B݁VU\ ܖM{Q ;a﯉XwhSРTEj^yi^>Y>p2 /@y4a$9 =kRł\5KߺZK暈Sͩ]4")tU_ӫ"'R e87h.o1(-Ԑ^"FC fDΕߨj>*ظay\Kye `}hh6)D(m pR;6C1"Q(BD$39gB!:$_*ϛe5.U#`RTYt~#m첿,GD wܝ2j {YYCl^:YvVOSlac|(" 7DIК="(EDVJK1*ndW&<׋‡H .0Hv\gND_y6_Q 9"kd^([C'OF#G$">.Ƞ$1^.Q:sCb/H&$ݼ'IM>۳6@PDD9)ʌ$ ^`Gx>هnWtb^U༰Fw\d "8 l;;A@dSC1T>MвRYK.6vTJ>kMsLwO'yfʝ*~Q㎳?gkURݼz-\#*LEʰ:Pڇ|p;3۽Q߲RNr9Yi_ *-~+|Z$yDvA5qQf~N4WUz$Eiq)&s9)Ǿ.dV"v㲩?hG_]=(TQn2\TyĘ ;ͽV5w\ć@$l݅&g4|ɠtv7(N&ɤJlv7HV.b"yZ&{--dbH?--|WLom]$U^*H$A@|@|[O猍Ç3ߚνs⃈&N@ȶ5yh; > >; GDdnp8`o`wĝDp88}{zuuuuu5лC݃ʛNoOO͗gɠBEX%v Ky{ ZӴ!ߐq4M3G_qt9wsNmKD'>Oˡ(J VQ Ƙy1v~lĪ:|j8|!led2ӁӁ9%I#{JGư1<I8VWW(+, ɫéQdɒ@ڒ>ff|>/Ix+9Y- rtJkɽ̸@r&|ةV!\UcA6tGߣ=:AߣV^Fχݞ>ED._i|U;daAɇ͔5|D (9}{yzP؇g`W3{|ǽD4{ov5dyyuzF4"=> eyk|v1O@ 4kyA3 s=ܞ{DJNG=?|^j1o|C߉:y̽G=|n~ޞa!>-i" }vnjB$H~Y̩,IS&#?g·{=}wňT".rD$:%Y#:z`{>VTpk1:T*QO{RzE'e>v~Af\.5-i YW{tpԧJ'܂m$]˨\%ѿZ5UOGHV?ɈkkrC(ru"<ȹG7g]8Lzmo >a uIE+t嘺>5ǑĝOΆnLnRS_k{^worw.>X>'sS~M?MO]GCD{qSs/@r&׌X]]5=(&ޝMO}0\0Bf&,Bshn:g͚+2 n?61\t4|!YSOJ1}."bNZ-iK?`^iKvX/4+}Ɣw$5U_z9硳%s2;@c vذoOWI| "Y9"GȠ2荲,~?*9`WkEnt ~+?_ ;4QUUENTUU}d%:ZJɲɝ\.=]L/̥]Y4ucڳ"G  >\t]u7@|4BGڅn's Lf@|?q ""&XQHl/60.cLI0+`׊>O3[ޚ6ZWɽ{<@}a|N"L'MQ32=7 m@1✄Vw`s9: "1IQc>R?&M϶4-r5!ՠT{{I+%q7a %is28\[ X@1ȶ+7(uʬ zŭou\KHMX/HM'k t]'њ}cdpUL_:*[ؗ1ehty9ľ*ds8E_qt9w5{df8Dy!" ^戈/׿fڒv{LR;DGǬ9Cpk?{Ԟ" TзU ,8fFad,'ow+=2;?V]O_r$]|E[ڒ6q}"S:j zxz}z ߊ7~s|>L-k0dDӖ4^ ӷiGӻӹN%8qXhqKÕ0nHsY6(Z+c a= C{a:17_Cf GDߠ/] J-U>GPQ&|C*G;aFe &U4Dϼ.LZX®0스"VMDTſNTUUl07cŇoGN6vܣ9EUn9DGxzԪY4Q/y{90Y9 WA<~6Ӭ°K^X""BgT:+Y|:z usEk)JDxf c6D&$lF Θז<J]V fߋx$j/fN6px 2Q̷<_ם7Pd>'bMuIۃg^j*ѬɇXx[7_?YmZN<3LjKZeNi`֊؎[Qբ{ZmcVk^qkMl"cZմirDDeF6i-ԹV~Ls<%TsOG"W'vY+Hjnaelyu]/_o#2'H%I2W/iDd[(k u6y=V1]Y?6n%z{d̽ف#J f֚;s4ثe+L:bVudּ7q7AOV=t'&m3DLF}Cŏ 85j_oVYGŪ©k~| D.c_Ɣ=WNN]Gl1;Ƭ5PE 4JmRY{̭yȥtbF9Г>x! [f)sJ:"c:YpwHvJKdPld<;Ξna/\ nUʿ L2gfZχo00{7>(<,9;9lyoQ J=WQD4Ipn>IDSv-E=6d1ƸAd-DD&cLÈ("#U إsַW$I YG±nDBD9h%Cu|B.9P։\-ЉfE U>Mw[p8VWW(+, ɫ >m_uSs/lǩAA,K["s}!~srW !^,WI$YtQ0+`Kap^Ӵ|>96LfLeYY`>}$1'sC`0e7f@|#b"> k >vOa'M׹|T2?9EQ]=Wzz+5.f5qC!,X W3O3+ |B8!wkfh"_<1ukƉY(mISj<9a폦ιW_޹N8X.:X=jdt޽-YROR}>GCQW օ:q'r8z9߸%|O~6wGɿM{x5nnpwƟu6YW ľNGn[n"Z]]%##wOBUdIt`GwOt~_~ݱ $in~O/+lQ /60.c Gì-]L5|4ć SY]t{Ǽc82j*Ke66ymRQ3gGuĴAYM3/YW9o}CAs9: $IQMǚv"$;Pڒ6q}"S:Je^dڒ80s::C+sG+xݙjKR @Oݘ}f]#&kNF[xFc1&Wy3Yk!Vfl ->'Mfe mI|2^RR荨&5JIp×=z'H䚚LyhZd<<ltGC'+U3k75 N{0 u#2I>Jst9T%;qm|/+y&8PUU=Pg=8Ps4_ ;Ӂ5`m2P2Լ#h?!º63H`浾Rt$`Vb> 1GsƘ()/1[әgimgYιd9ɸ$IUUщDiX1F: b- WnY tsq"R0+`dB_1>av V|GQgk=n =x}R~9[ @ǃSmA;zxV9kYz|\B)fms`V >[a v9Zy-]R꜊m+ Ts@|`M QsҤ` Sja}=֟z7%O@߳kmd`ef^[?L>L@||g*_ZGbj'|) nclY#W'/{sw< y)o Y80@휯VMmc b2zD' 4Gk MKvWU.|lt{-I~OMw SZ> Mް5lGȊ'ЗAE ˅[5&>. ͺMf7 UzܽM{B"wOˑJj<\oQ}WOu kxkVG{/szjaJ}3d >9k1^f^dT1<81^/|@ʉwqjE'`M6\.r`mJyqۧ;WZ~fBv4Fٲ&p פbW]1Nmᚶ;|1guX19x{ >GuP9Yn)Tt]'DAo0>')6p4%L lX34?zY&uö_7_o}|6$5UEf @V隂B#mޠbZJGޣͭss ]|D#Sצƭ p(q'/֖4[# @\("83~D&ص f`VMCUUQGӷ gLߞHNg'"[a`[ƄH4~ݧT'q ¬@|l>ZGG NF|&3&ɲ,Ir>Y !{02E >}E1 5`1t񑸓p8;5srhZÁ#E4t6"fN!V4^-v6Zc>8 wg1jEF}CmY[ҶE60j98b_Ƃc/c5ՌymT Ǽ]c?i3ET+{ٻIEQ]9ԓTP%Uڵ݌5B͌|:2|fxU_ }:feKf cO3O3ӷ a֢^LNŐzmo ׾YSs4<wϣ̗G>Whڞ(,s2ι_73KrtdAZu%IjV]u<>52G@r&yAD/ɇI$*FM&ڒf Ƙ=hCꖨ03T>)J6X$q6MXҤ0CMWWJ1"/hm5K_DėyAp4w9 ܝisc`nؗO7d\XdM3AHDBzF9Fėu]EQ4ܒ\r-ˁV5kv)#15S`V^Bd=q flhu9+ bpM +L4't]7$Y`Rdp2J 2GϏ1[әgik N$ruះY`sJpb+D:׹8G3Ȇ^6D.8;Ȱ=ֵyaٚ/kfo%@djx`Vr%0+NA;zx6FI.%+ <UU"PjIa0+|97 *jAT9*Tٷ WA< fmY]/nQQ0sZuĊPKPze 2soVQ{=E{46k{fM>LQ{=7=gɇI]O)r+͗u8M3r&s- x|ҤZ=T\ksB1hO.'c_ߘNkO:y O|Olhu^ G'{ >M_<ͬ.<^e6<C&sהԱjGxzZĮ?Ra sS' N'#cmZYfmWY%Iu+E4Q(ѓznIv cȟF$IWMY[`vv RrY ,37* Fi4&:3浲'el1"җAE ˅f'v39<=3fwYQ{a{3Pụ_F4bkLV f>.a%w >ևX/n)kM(=zRO pLmKGLae`]D?*G#q'a,ϣ{YBG+|$uڷʯ7i9j,?;CD#}<Е\32%1vYGuqzi|{'?*/Ee>×#D#ޣtja+<cĿ(>9H;?|/''K? 47?WQpt,5g[2Lifttl6Mr^UcjadPDQ'haCAVo':ޟUU7蛹_HD?muV1fͼȨjb>'#woaO{+#Ig' 4II߸U5"ЁtR[۞O>LF&&ć ݙS$PTМ)\0Bj;/c~7bԵ)XR$U OfD έmZ~%Tkb\Tg:xn "ss-iZ$f"Ni-bh/sjb3c nDƴiMn^_&cCbIwgR_WV;2-K*#rK9NC+GwDXn7so0soItj⭚;֬ۨ0+s2йf(Idf9ruK-mm2@iyl$Iͅ\$7E5z0lfJFr\{YjP ZX7}2fZK4sz{ɠ ߉@kgۘUݧf25&G6y=8Y7q7AOz{+2oɠ륨L&'>'MVP5M} WXޟ%&Ώ=A=ԵqkLiKԽ;p2Ө=Ԩ}]rQPCIaW$ 4 &VbhGÏY}cbDqd_7؍$XnVŬ=OzY[ "i a.^q(v$'s >Gd<|?8qmB4[ 6a rnd=.?yue>&'|'}W'&MF?ي!R,Oߞ82ل!H`ەAEĨQgUmE1%UB8#5sȮ4kXYe+pW>l~Kh >:h`.Z^MZؼ߬,I fzĨu(.5zM0k絰nfs 5n>3l.7H".o  cBi$(ƈ6҆f@|6D&"&+g-Qւ&'f` #- U0U]E$$0& L1>Y[ <csYf\`dp2W*60˜kx>@Q͓6c1nm+31 0"ʼ{r+H IDATQ|NE.G yB@Y'Vp C'"n]qW7qQo]`V  ΏeYҩWVZwYi: T˘ fp8kIǽ148ñ <6Pl>žGoL5@)oA_O$IER0+`wz>,yN"qhkV:b?p?iZ> NF|&3&ɲ,Ip ¬]*>J'>38O$d.w LQ``VUL)ֵi`!993zpL]\r~"JIN}"~<yE1 5l|GN_S7^<GJIp×VZd v3FE#MVs'}dI6 >j`N(9T(NL+&ߌ/]@~AupCa[{4GDڒfwXEZ_L/y,Iyj{ ~RQvng únQQ*0oì3'^8 $2Vx@ ^m`\ Ƙp) ; enEƈsZ9pq9d$dpN8'IBG >!is&7I#HhC3'ӈ(D -i˅/ "~Y3u ڛcdpUL_)Q 0+ I!J }Z 2{͂Ӟ8d? a &VIsz)28Ҙ̳5Jf'9:ì]'>Gubņ3ѹN%8qXhqKÁ H:7'ć*( (:D6!r1>2#Fċ [kD̖Ή'moAc7+mìt88襊 1b櫢09/E J^,b) 2ߟx`S@|>co^Mhv{L5|C.DZ4ĝr<̰BP&/N%` Kn%+/hvJ:bA96׬0+$IsscglԚW'VS :SקVWV##A<"7+qQiJ:~MpTKyE\PE{J-TpnMO}Z=̬me50|?hVhf^3&|$SfcK5$Pd`tu#ٻIߠxD3SݫQ!,aQ&U9ʝ"wYFKX2ru"|a f]iiY#W'/{aDx't6:/#sVrfkk\p8^9U9}{s>,˩')<"HyVQY{_S7^<"[%M&V*|b(V\ `5ֳ0^AR! ӈ\, X2j&Z庽]^g FDٗ9"Z1YH(43?ͺ.ޛ ԗyFݢC}V;{w<c nȠxqoЗ9MnjI| "Y6{YH+R"+t09%""e{/uUU }tN=Z剋>}xw |)xw(yp8!$%1QIQ0k.f{]X1=&J[؉GG Vx>ǖ01>1V+v=Q31z-zs1ym2v3V]Uf<|)rNocCR뷬;W{$ ):+#8-ٜ7>?ZޟUU7蛹_7/0?'|ǽI"&QQ2t64{E|44k;v1kEFUU<81^ֻE~2@cݪy/(#ֵ-C mIbQ%>ܢwE<: }RSb`e!1S9+Mf_j7ja}7T_mISԵ>h&:6o1Ѿ}}cj=bh/sYcUɂg.ݢrDDe/c r~s5A o)F5/Uo5;cطaBXY %z[&$e3ϭaklfιE's%gFf̺Z2'Msv\ݮ6ЀSV0-܄-|t7tBڰ ][µ o඾۸5J"\i+?\74\ .-d?&ժmE&'gfy<:hDd[<}N( >vh'b柙hDzj́+Iksr11*кeȇ ee O'u (ɇI2(8Pw1嘇<rr/nM-Xƌ{4%c1 "lf 2&2cOY:0 M_c/Xuk%YF;\vߢOȌcЅQ->%x\9瘇q)byԙ9cw Mk4&Cqܒ$9$KvB|S.~.kMܜd2Vb⧄{KDs\hyyQ9GfNsx=}M dpjLHH`v$M M1CM߭9e9*'Qe@ Wޣf%=I?!bwcʠRwL, 9N>$Nm6Y) M ؏#6 ]1vXd$sgb|7Kv+TT:8cwc\ PScPArᗅ?z#WkR_)3~(Sq荨ğ~vq&'޳]v>V@3 > > D{&⁀Y`oOHd[|@1l > mW@1✄f7`s9: "1IP}*>.wbhdx}C>mWS0t2V5BߺRqV'c(>FGb1ct:8>fg.p8biEQ9ܓy^luW:lVI>H:l[Q3v=5*C ΄4[,]EY;CʟDg;͓AtZDFԓj^}Ni`Mfmh֦:7?/IRӹwu:%I>6mԌ`u߂ iy6G_؟F+˽ֱ 8p@_Ƭ3uu%Db@|Иuw&fbfx%8x<5\*ְ}wI:q/%)Ⱦ1khqε]W"S˥H |:2d3 /J;k> >جKzVqKٖN{"z[.NGƤzeR}f61kUNM~@ %]ut'Bߜ{Ë@|hἡc%=6u6[;Y`xdڊ{{zY[!̬|lӻhffiK""Gww*0 ?hzo&5VRsu/JX$I-$)Y{O^/ZNw$̦s^}Šf +[뫜ubx1.Q˷xФqG72u%lHA&oCjm?(s>yWN(/dP~R=fmIyˬ9mze@I>LAiDZ %>'&r|H{@|аj># l&)*Ϣk5,UmAπRX-\8Vs_wyeEW#=ht}ՇnT25|nӻDYxJ"/Ϲy\}s>^,`wa.VW49R3UVqw㽻"Q \8Eq}^$%YM7Ggbn-vS2vFkjɎ٨<[p 7:7h]YN +;ߢ}.u>Yιۅ]6awl6[Z`ס: & zq=I8ȴ.a@f ȇa&fx/]dm^v2| n}X Bm@yzʼl 7 #TpTH%;j֗%(ʶo²RgX i@b.AYaV >lSWD! |X^YN HӴH 8 (y6qc"6[.&$gD<}}?*D:cB'icI`EYaV >ڗl>O=J.#\qn.&O _ Oݚ2ϒ$in~gS7F8| ,\BhNaD X"@9^.2 Qv:|Cٱ?Ǵ}8<$CăR,p:`zAcJa*8PM +vI76Mn"A$1H`1 >Rd'^^^uԘ2cL{OyhٜsLWkJ+ng\`dp2V540 ! f;o[SʠNsNcDoLAdLd10"ʽ?u f@||ꠚW X~pO~쒽zICb\ 'b0` 0'" ؝x\Ew=Y;A荨ğ~vq&׈!?'?%P_TCC/#N]ח׈֚Yi8 Lt:t:.}cYHqj7`.&Otމ7\K27?ϾX(hZ˧!0X$~$p% ^z#,2ZQ4M+ 3!"v4Q0+`GKZV:Yd sZ(0<0+ ( )`V? >Ͷi\/`S2t`ңD<0+ڊ?O?K+J⧄$I-VG( ?'"gXQ>L obO1D]aV>"6F/ <Ǔ3 ?ܮh[4Oݜ2?nNq4 8XzĶU^^Eƈs8pq9d$dpN8'IBCvqe~4}} IDAToobhD,^uS{>gs8(P/fvl:67?g]r1611O7\ ː_8L C,IRL`p"V9_-k$}nI¬m~Qp3F7T[X'#"Ƙ5H$ԣe+%Ss=TfRwA(#1ۂ-4]`V=nRW9U.uI (1\]+?IV5 *ͤ`dp}jufiOƂY%A5~/N%&AA"@#_d_d3,:9z$'.5MC=hj{9kT( = D3KutaVΰ[?73s_SOxD'xBD?g$PA[)28 cC-)L|&-kDι90+`?hsܤۚ) E9Qa}bvo :ש'n[o0\5H$ҹ Fĉ09fF7tٮ1bDĉWl~ٍ9tpٱUC7;f>ެ`V,ZJG+B'n[9*r<)m1k  KlfD0D$O,O)ekf'6Us@|`@4\ I=Qϣj5)>ʠ7 YxT;Vn̚~| "Ov<+[ͨz@io'.+@lL 4VnVdFcj)EoEfw (׬<¬듗'l_/̹>w? +$^NY80@휯V[0ǙV$Y!o18@Tgz3 uGv^fSH{Ѭs$:b4U0;':$ثhR3zb U 4yj&SߙQ|DžLF:7c&4w:<|2{|818G)Zw[gռ~ۚu͚z4Wk<:hHŻč;~$zEث{k5Y*j1eScjyRy6^ ɠYDK;/f4r1|)1#'>/sْ?|u_"KSk+=zyYs_'%zo[=fֹ_2߹VGwIݯDK@u"e@f^,X=|w=\nTg(Mk!5v/NDqI߆FJ z78; ](-zeHTg._5hԼ~%bh5*'%1d|,e'#ћb}'}$zBI?$M=N|~(y+)˹W9@s"cu=b#ej V>{bm7F+Ōa*l [O='Pa*x~e˖u.WNFDn+Q[rib5ߞfmڣfܼWeY`x$tiMd:D4{TQ`|ÔS{1f#6}m| .2o,NLAikO+ %>'&ׇi(U(- ȵ*'O`z>5Bɦ3ikƂ4plTWٺLݘ8yw}r]}ȕpjq'6ޘh"Pz]oORY=}s%'zg@)._H:$#U˗\<>C|'U銔zR;)"<\$"6qc"6[.l6Q3'e G⧄Ե'iZ`$zRO c|3]:E6(Mʳ5pTk$vwr;˝ֱ].I j9풔wR֬g7Gػw;YN[bbv" _ G&EGLG@RXG#rIʯP/gVt!0'.&Oߍ _*>3SEFg7bAF}<޷=g޹g:ћQO{uoc̺jSWymaEsviy1}ڊfF{,f}}@@EhUƘzBMT-3pyIocJa*8K/Po>K$0(4דL4 $ dl+X Κ>1zaٻ]GYoD*/]6/~I@h+x$LD#VMܜd6,S]/g9L򲭣rK⧄{KDs\yY X>Dxz#2C-#5p{T'}nv(62(۽OmG/|5<|6&(2rFOiڊ&uIS./T0R$ ݍ)JT$v ցiO;v i䍒1k6}L>$o'3|5$Nm6Y D'f@|=[E1? 7`- >-]{33wg.ylٶFuؕ#č]a5M\d1?m>}C>)FGb1ct:8>Z$I[a=;󼙨iEpOyJ^[/Tyqܶ}n[qa%$\P[ю++t-g2,7O9Y?usڻHlQ._DRw#Kz |_ ox$t1dr\⧄G/ CB 5KR , Gf{ݵ^˿Oݚ:dYf+cc0V\pr9룕'yԙ˯c0QP(HT2dL%$A5|5ܸ䠲}]?@"cŏ b ¬'>NBB\(c<J073qoCbiyę{;qiay荨j|8U S:K6 (2FƁs9'C'A$s"9I*s45v8ͯhs&!$e'"mՂFXMƮ0+`_- 8¿D u E 1ƘHtK ͦ`dp}jufiOƂY;GOpNDqzta 35& ⺮fIwZ)28 cC-)L|&-kDι90+tSN `4$e jHsar {lF#"xXު@)?RE6Lcf'l6%Yhp ZJG+B.&JkݖREm !Vy1kk  K,6 +` e򏦶() {ͪ2 2* N˜o8{\.wl:62kK4 D ,EQmR$՚Z:Q1c!uY)~ɸ~>Z1=o':7r)0(Id< (‹+Qt,E1"P̥hǕva{~F"<ϸ]n[pľ/flѿEPi~_Ş=+ѫzmu\[FTxڭuE8sc T \*_H6F pp,Η_$^~Oyi e\дS/fmz/6GS^d$qx$z3ja|'}$zBI?$M=N|~(MI8e:Q:؏ѯFh؏1 ] j߅̺lWOG)"J=J*/zd<*[9^?%g_D8q}nHR}AzZsJFPb UO]Ym_P. [+ǔrӹ躘;?'.7 Ųibά-CdhJ7GMl"cZհi.W(@@|%&{g2ɟgra}4<$,YO?Nc1;c?+aƘog:gA-fD' '$|˱BglRsWCNGqK!*:c)L&|)mdV7Ga,e*e[f?///׻/yX6*JP%&J#zSC ݱhVj4yI Aʉ1q~O!yߙ56GS\HA&oC~vɇI2(8]^L'L Y r^`0CM߭u ;6% cnG{M% *$zUn* vj> *HFղRߟ~4-e~ |aG,&e{R{$b!U0zL*YwO)=}sG+3V /+Drq'y?R隽|)<|u+Ů?y%bӱЅPLHoΛa!/ujoQs̅f#1O&tA58E%$-7:f5N<}AZه%=6,6 jKZ:ݷEn؝zBY[ 7O=eewI|n)~'n_Z;YN<3??Z|C*1:N>Hq"yOc3gȠsÒ\%_e&ND[R8q/a%p&&oLZs[j43ZT}lsT.Fv& ZM{޹oFa=U-kksUnpEsvдXNrBD>i_Q,`K]ғ@;emc1ne331 ˆ(*gYvO'0kdvubEWy0t"D7H[݉J]`VxA5t12<%y}hy ιDcNr7.v7uܱ譩|uJ!7]nI$]D+ >({  d 0;cn$<0+g$ɺ &k02EɀY`V@Q`DLO j @|@|+D{&⁀Y`oOHd[|@1aSi$4qsIqN f@|C^8L n'FЂVgL#⫺(7hyEp7][ 1ƘHdmi¬@|# UзT ,:X0+`G @ΉH_#n[0Aߖ.@0Ds@uC, N+E'4!sb%$re^23899S/] IDATf@|=u*É&$0lA tsq"LY`ot }Cy=> 4ݲbY1toXJ`VVR*QYB >ḭb02p5CWE ZD5)csrG)G)+%*9v{O + _+X7ܛ'6(o8AL >@Q /:期gsJ󯗊݀¬듗'l][e+x6aȕpd|/@y1 Z/ b7|Y_<[/PgsD44 (D𦟥rxf ݾ5uW0>|u_"KSkuuw.vx+)oR`$ZyxDP Vs<([m5 u;8MDgiBD ŌH?0UPd;6jzeHT+ìW9Y˵]DoFӴ羅RO(>? \? T dJX O&3OCD̂yٜRrhC[r`OQ2̺OWYcUGMl"c1%ٻ$"rtw_biЦ`S.2 %t9<3S<.oB!fsID¬fV:C皴.q$I2KUٻY*gXH@O\=+C8^*)oYoXTSRn][ ee O'0>1|@j 4mf?T15pP Ǭ$=ȕpE._ ?sJ<}p@{a.k$v|HYd,rqCJ'SYAl]0~3o_{_y+wOOU ><5A[VT1Wb6[ǰ"9w\x-6Fc & dlM@?f:[—Ʈu2~6^ڷKp{,ʼLhuQew^)pqA,Oz 2Ď]0¬@|P1ϴz 1$v"ì0+|`@MD X"@9^.2 Qh6L ]$0XKhr%v " DuaVhz+ng\`dp2V540 ᱀Y; <ȇf17 ޲Șb?aD{,Y;'M?\O52;:i:ql-0+<} ~pqNEFּJ\_d1v _]xTAZ> :%T.$I.Y`Ou=}M dp2i1nK`Kdo5idg+(0"&⧀YL > >@|@| > >@|@|{rr›~ه)W!vM4mbr;W'r_h3 .)ƙCWo>ߍ}M}*?%}ufK؅~IhD$I`sGeӣWpaYd,U0z)~6l`t:hn~ý7|)L5a^|^ܣ {6o}[zL:H(AלGݲ7rZF ?NFDx$05q=vBIű%S._/ &wX旹ܫ:%U5q+>61!Х07gd('7 s9@Gh1BTՓ*%$ju~挌_;|pMF5{q" d~|<1%iFDܫE(iDm~4c;z{q՛}>]ŐD_q; bdzEjLGX'+uS>@|,m~$KKR)o')3^(h BDs,TmN@|@VDhGx PP{aDDL G< i`\ ƘlڅC (2F27sNNHDs$]]@|C^8L n'FЂ1#:FWu]EQ$"n&ww@B`@)h6ͷd-ތcL$o fPдv ]@| U T *zˉX]]8O"月5 m; M5&{] PP{y Q 9v1Ԓg߲VH1څ#\#AlMFMA"un0"NY ]]@|75 }tˊe޳T=Sl6[3K22C8h;U0 G3FnғխzA{PP)0`5^R 8S+~RT."b牌Gݻ{ۨ^z1|hybEjBW`, v͆s^{ŋE2*]SNi`M|ܻx[7(h8y hM8c?,{Y.kwY?\}3(U^*Qw^kwG_؟F͏ 2u=N;~os^ϱ /W\DM`v,T9{?+1|%?Ϳ\ W#Vd?y8KDɿ\^/f\ -f7\&sҷoM|e@f^,vvL?!4hbRت i_.xoΗ_'cly%8 >|p^Q kdYiI PҏK˖Ɉ(8+$:ήgH?NNDB6iU5|aTd;Z*R mlPڿv-e'#ћQ3}J ,8=@ޓ'E"e5 8:ozK֎_uK>hfEƴu5DhrʲѽaFC:)U%U_k#+acAb?IJe\ ˚FB=imE˿YvϔAM|}{$:$̐UL$IW5"ʯ,e 5]݅QvW uYF 8Ӿ?JգSvH؅ 5 @|}HɇzK˳ze@I>LAiR# ee O''{ 4(s>y#ڸTJ|&NMތvUдɛ1PdN=J~&f<ǎN?˾ZiWχQxo*r%H:$# t4z% _ >Jܮ>/k:w}Ԯv+pP S7&}}=$Wtqɩ<45 k,Fb{M0f 2%)y2]f7uo8ej>Wb,Xd;'Pvi""I{R5_Wy'Ǯ/..;{1W+z3wڵ-TTQ~OuFS & dl+ol'F/-,&QIyjVQ4+eng&{ _.46 ; ą 0F~D&ر \jȰ cB IQ`xq&ˡvvVߔ@-f"081Q)jj; ͆ +_rFbHI`L cڅhzng\`dp2H440 @B`'43*g1neS"1 ˆ(*gYڅ> @y#W#&v0}NnND0o ;qu@)jj`WPˀnt*:5mVs}!NǜNo]]@|G.wn$U-IdhPP{/hV(8'OIv]pvv`KdodvvlFD } > > eGx PP{a6@"cŏ߃b ;vvi$4 9眓 ݅{:48Ђ,XJl`%6p$&VEd2 $b3 l Xk8\U|#g!B6ځV+!E H Y Q Ơ y/Zn˭K-n˥ !XR]]>`h% "Eb2m83 cH,麮˲LD EMǗ ``)Zyu }[co&Y&Cj]i;ev @wC'C Cۗ+a\zIڅ%9z} eJ;%f!e{] 'vv `ЅN$ #us7]DЅDW%vv qnjkMwC7ϞͦL| YjPesA6d"2_6̶\vXr"NX9W> D6kv mn ! Bo) җͳg`ml--% .cwְJ~VsؚȀ}?O%myJۚmvsjW}d`E;-֮o?.׮ԨNRޙܝPf3TB#UMmlư!է4Myd }/.w;;v+N4HhZ;]=QG*/VʉйP4}tdp}:o >]vqχ[5\a37̟WXrΤ>? DSӼ]H(L֛\?UA(4VU(x:8Ai>t&$3ǯ˧~5&3Zkt;;v5^14"]#8]=Qgg đ![: ggYdf'![OI }]>.#/X蚦G^Yk$4qH!"gwJ\IDڢTGǼ ʅsǭmnT٬}jV+['mLCj([UMKݞ~5?᷶Y4\kZv=bPS.t!CE;>YsJe(QeqaVk06;نHl36Gdo fa-K?vm]O9r>" {zJ)MDswj,9Z[yQ5P|0PU&gk dPi>p*`xT CMt}w}D8Y"23O<"&碌HV'9]drûs^[ceõkj-ЙOHy2hI% ^v=F]+k0P]^fHLeG3 ۻ_Kss9*57HL:MNޮ&%<ǽ>i?q>Wޝ/Ti:B-.mz>kըV)߽aH{iс[w~j>]~{"*,\ih|b<XEj oՅm?FsDӴ.ח)myhT~&/]>YQ?O.ԣ.U4@i_5ЦvEPi;ׇ#yQEcFl)rT{.IϻkWcmm74 W^u$&e~;"W,IdfgT?|vt+^t.Mcip Qam{Sj)@@;0H>@B"!Ў\oAf{cv$ȰvZ@km^P l,{?۴Lvo=tnڅvҚsùo@m%fG=MQPv^ct]\gHA>@$$1KD:NLQPz>`!1 a5o!~X>@%Zvvl%|@G]e`fab.df%bfA&N]][@@%o&ձ X_& U'Q0̶AjL>mIDATp0P'..xbáTח{w ~xC{ixkg jj݆/Ǽo7wY"SԏUEq8d4]]>`O|㾪ijU2; Yq8/jj؃ϡ(!7?0%7  (KL2P \j >@| @>@|  ydQ##Ņݸ ~Nu r>oo>`yUy*5%%fB, 32ߧ""<$gf#ŸEZYEԏ-? V_Qr'%Ƞ9瑁8r1<27nl2"<3d5 J޼:U][MX]ԂgÞGMaK:Q@`6.g=7c^::]pGZmS_nb1x&Tԣйpe{A9" +c\j<_H˲zT-.gԏ``Zqc+ C~!l+o^rͫo&'N%(~-e6q3Qg15*XXYm8*!3_* Ů쨳ǖNR)oԡO?Fs;ّۘ8\xP-)?D Lz>`wspq7ܓOgD4hb_Ei"JKQh-!d~Ql-)96:ׯom]c&Lz4mT޼=pGociD"R~]~r U$Ԣswj#Bdf+ YEQBB6}yf}CQZf{,CYӴφ)}/}28Tz]N6WHmScIOhN=Ρ cnMk(Ui޼R~ED$q"z)&-7ސ~"jZUӬ6!6;F'7w].W7Ȗfy֗nwmgC{wCgbIv ],v9(J91x*@DGE瑁!sQ"I66D/6#gD{=QHPsw&w 5c~"*L*V"\Xt w#顁n!g99QW2s(9pBr<5Y/fCJlΕ3Vۤƒ"f}HR49J%c _5齸ΓKy^tͤ(ዑJL*q3*>K¾O|Nv#l[:0 _Oz~.*z=Nnd4>1?v[\x VNnj5| > zzI7H!Qv|,@/!AD̵Fm%9 |8Ku4뱮LBD`! $ !XR>*&`AH " @1 cH,麮˲LD EMM\ _*fu m$&Y&Cj]izAADdB}6(K$ `a0<'BhKU6#d>=- ǯIK]@tM,`ɡ.|P֖K=i6d !J-t vvաKUa3jBV6IcPef)EQ6-j!dUU/Ns7D]rXfmI8{O=`N0ka0BLDLoz9oUӉSxTl=^ _{np0@]5CA NòLB>k~`HŨ+iMSk 7i)0D]?$K `-M[s>'͌0YVm$cQTQM%p*t"rC.!E%iZH%E{ܛ}] ]lE)|6>gf?q1Kk5Kb:=TzQ$Mk n{PXDۿq!j3?7'Yu'jvVN_S1x2q5URk y>Y8<8 C4nc&8!}>QͿ(ԯO%N=ͥƒɱ-Ou2aE꓍G\r<:eCزT/9 ޽ӏB:|G> GFGOr7:<2sޤ=:Of}?͛˾O;ф>ʆC 6fJZjUg"K5nzJE/EWԣ)eL0q#aYxʦY A 6Vx~N= 5t[@mdBsطY7ğFkGCMӼo!q%nH‹Br:q+V{TၦikLp:[}PV<̖.ϛifqejZ#[y%oMkKj,2u5}~:z>`|4iz$p"P:r-1 s(9$ "IV?VSG*,f۴`h(J.˲늢4nR*TGZ==hBtPEAU-$1aev{|^x DO`>ozT岏s%"?1]Mըj8zqoInL6 Q6rB۴x..~uo(?SNBӬ}g=sw!.fB#_EY% _@$^G{C_&"`G##9z),V߸nn915_6ݦ>M'O%n&ny;OF*F%n&2bY?$n$5M~V&o$7Ϥ*KX2>O\eU;-%Fd-(y#odxQgJFF*lraumǟ:ILj&$[l{R,sCQčy%c5lSNnjCȼ&BNNֿ|2@E;`13r}]G/tïaz|/KD>Maz<,Ҙp {bIs8aj}%A{"I&IDժ1q|@/G]e"bf6o@ilIfY"fvd"*.;~Yz>g7Xq/מcעo y0HWM !xbá'L;`! 佴z^3-z×c^7}fUMK}:z(?jVViAD$Yq8Bv=Y}ot~Ęp {9%&b2؟p- >@>| >@^x[F@/̃).@l >C_ .‹Re'sy<^o=QSpr+W29aoc& lȵ~<(uȵćaXn cDD,wMg;t6=?BZX / GDɧMGn,5 @CaD2sQ[bm,3&0_*E5#}RJsEiyzְ z>UCڒ &z !d$dABtU4;K\"B}RJPSX,US5M "1D]cXu]eA IXx1,QTpR`0PzQ" /#72&@s_*fc:7IbffZWjZ'[/Kf"G~+%#UHD嗥%MY0t2\ K$K{m7AfPe ɻfy?A,11mxR ]E{á/6as[V}[&f%!e%BTUEy7KѾ*%sY+9&Gg]9gCBdtt,sJuݸPRb&flpj hq-y(mNCڥ CeCׅifUGj ;QժD$zܽ?Z lҙ9=[|0It`@ WWWnX vֈC9Ea"R?r>/XcZK$ &@C_M*\Y#? !HSAʝu;%ڼNN$6* (t _Qh|\8j2 ! T*9e?]8~v>*+s5rb,9E]Fn uz9ڦvpu讔>^wHB%9v+?3KDA~g.|hȕXGR0&m6Kn{T'nyV*MBDJ%|1dR_qbdkС!j˭+[*u}ٹBg:?SK"9>KȠٹĵqƙMbcM)rJ0z>9lVnhΰaEjֿ$ߦG,zDMLfe{k p lZEјmhmd|r $ǒS٩-cJIk%6C4Qz#SSAX"ϹVoN.:0c.ٰŸ]Yv3ߥ1wija1Rh^_Dry1Y꺔Z}̓›4 b8WUaKun)O6nٗ6mxW =ua5Cpg +ᯆIbL>1D@`0P[4> LGZnjW(0<ɔe2y<촵L$ * s̬TuN@2ڢ:< *%k#/>`354\Ph4kAKW73:/ǛJO VѬ$P~rzA[f/na"| }ٯG#Ϲψ Ѹ'r.>:x2r!d{~zY Zo_Y?Βgs!ke<LE/Eng]Y)5=dESy[)Kו馉\8>zP.͓K>7ׯ$nI;^RCv :m2|`T2#gg2=?;8i7L&nR%yIL|O#IMӢG_bɱd|4ߟX]y3YwQ=^qvkr+,w[JMMeá!&WVJ/J7ҿKS閩I"*HD{/3+MKL+0Lyb?G֥$̫6K[+hšSNy3cn6!mݝ4~=3ړt3Rwˇ-p6a[}l,L88X"5mϞ#$ ^]66ӝ R:P[d-$D> N=mJiGEmJOư l~c낙`f64i٦2sW;}~.%f*I`+n]Þ|!I&I{Tj5pDg)q+}p86|@sQyLF3ټ٠2,3;2_vvxVn/uߕCYKm`s%o&ձ X_=]'І'NI$q'r0K)_8W!cl.q_t0>^~r8nn][1zXv\^5ܼ|JPeDTY8oͥϔ^ţOv #5{=^EQNCQ=7G)u"tij՜PWޝf@R6 8{:'e70 co.dXFQ>. @>@| `HDY8Z{ BZa0_|M%&%čtCDHI! l|\`3$;aD2Ѕ- CXCIkf~KIENDB`kildclient-3.0.0/doc/C/images/we_macro_edit.png0000644000175000017500000002300011715730227016260 00000000000000PNG  IHDRQ8Y pHYsktIME{ IDATxohWL7 I 2b"*y,Ԧ8] [g E͋^/zD ȅS5Q^*X(@XGfH~̜33;9{o"@@!]wkUoOR !ݬ]VSdU׵FT 2n7(`q+5Tnm }Ho:LH[ jF?0TPV8J"2k_QUn$9 EuױPg8 EPy:x} \/n3zcu"p3a ~/]5"GaqEU Nn.OY5K S#ʪ/fұ\Q/&7LinV S7c%PJ!0كa^v+T(b{&NI,"VMRH:&8!C4 8 `yEgJh0"~@y' *&8JiJDv+t~P!}qAt(/Ip{ Mt#8KcxQz~C X ͍Ll?W0,$"pW"at^R'3AF Iv:5~qJ)h" ͑<%X8Ѩ!(wu[sE9fU' uv.2:X!x<ƤGuYDp\\ bhK4$n8 k'6{$ѭ/.[Ďf)x{u]J)!Gs a <&߈?֋?~.#VjH R"ZZܐ~IIzWUY2 ɾ.#\^p߿h?)V ;Rd"XqP(G۳"k&ұqqtl(l"8>sA\Eu4ĈȿNi>\ v,G)OsD1i,6Z RdL._[c.dLea/dQ:6bSl.z(ȔuvDV*~ =DŎubm˱}ѩ),ט+>Hߑ|a+1_: zWHVyxK_0˺.cu=:$aJXڻ7>Č 1jKaa MouAK(IY؎KhІNS`?uz*?›4t- ?YD܆pvàݲ]!uz}s*^;B0@T,Fxַ*H (-a2#Ol.PvlO 56Vt,Mҡnnt ꭛5 <( R/-_ʗBv.PhD[o(׃(N\!Wvb77o)TQɘOJeGuJ[=CLtCН.+pQp:LeYi&ny Ήe@3zT\RHA,>މmJPc'F*/o|/$!}UGÆrod c'$hѐ ?Lҹ+8-_|M;oPuPPxUC UQJ$J%׆#Lrua'Cg=gs匑9*FbwQHG8p^PB, ?E4SSg⌑?mF*\XpV.8!sTDCQUyb{:ut?JG<\:6˶}l/5 ֌r C5[`qAO Vh\-)?1<(1 If<@'c ջ΅SFxܜ?m]Sk* `ꞓ<`s\`VgbGj3ع~߲grh&欵J0z086~@eyňQ˘t?MHpf1?-Oo֯/5)x4H(gxp5cwJ.@o,G1?iN_&Gus۩Oh7 tcw꺇o`{o؉iHQȊ2I'G5~}7<$J WQb) dz |]`~bF5 kt$/Mpe~\G~˪/ۿT7@tiMs@"3|̈́MpmABn:HBuM{nJo}Ϟ=|^*.0L:8ϯjݫwҋr@I$NQsıD4W*]H$f̭Yd͞[SBMnMܥ|S>r.V'.^^*/.._ʻ 4qyk>$eoJ`Bc3$株6 >#2p:S_ӈ.2p:39;7kА9+eB~v=Ibn/O).TW+ό3‹-;O(i XDd*o ^~9aXՇƗA0hF1:xf?U~!S <oNg eB:Iu?^lzۊs#=^l"p6_Lyy9տݱ?̞=BHbT95= .M\{Z~8􇁏?'D.Il,\~Dٹ^ӄ\);.OքW}OR]^D !ݦ'>_.Gz _]ĪHCԪqqkWovlv1m5y4&BHF܆p9 !]nM,^/ʄ.R]^} !>wBHHmkmB*,NNBv ! !ABBuBB$ !F:lq3BH;'qye| N93LلmBABn:HBup[ܚ왹5'2ug-2u.AJ~'xqh_BH`Fq!h2V055w#o,ޫp; gfp֮ e`Oz!y<7W#n҄WO=ogȞ,~[]5X,]8?vsa .0`-?̞.+wK׾JB^QMNL!w1.Υ~*!K|3 !0.,R'RۚqBJS|g]mG!ABuBB$ !P !:H!ABBuBņl>RJ\e !]*B *yB_y\_Mo:80'v[YwN?ӚeBm86뱕=. q?%wc3׮9=ۨj!uвV r?VfVbcвNa{탾?(~`v EDSqg֬X.O͞DdxҽJoemi*ǭ9wqgp8TgNBvL5ۿX&UsԻ-}2])/.[['؎n_li ]pT8A;NgIAU[u3?<M'ҳwJM&4dNgfJRvp?8ǷNidO :j<VbLfnѪ Z?.'n(gf$Gv0d셧SOgRٷ}]XOR1Y: ðfl_K!;k6 ]ʢDD RR/*gSo? 3MYҧKx(ޜΜ ցSd.~oح)Dt۶B X}j+O):zW>xscut؝OzO)Kbn/ 8l'^(#G9\{'T\-Ϟckۣ4.!URaٶ?8r򠢞nFA BH} $v !P !:H!ABBuBB$ !P !d7icoaCAqq:P[}\컄@+Oղ0HtF41K_Z&#z\*~R|lw31mMjS]ΚG."'N&B3 '-`l[w`1wB PI렷AQҽE%99QO,UXXQ;Tg"aN,ry͡czbox>=[ qνXJ&7{w#q=OkuKowVaŲdc< KͶN:{k)eI˶>ͭ}(g\Qb`z}PƗҽ`4u2=lCA{cks/?:~>mț;6UV-x*~ ?_S~*Je&9ŕHpϪ&AhL$]NK dNTQў{ūUӬf{f 3GUmq(muq8[q}w-y'_H5fw]?Ԧw"Fwjk3qRm0Ӫ*r}ol0K#MCф$dwk\BD+=07N?՟ 7~]͜\ja Ø;?lI:ϲq`gjEy'kB'ӕھ[siL?lY:ZW.͐] -՟/X{D4zrӖ}kM47ҽAPQ5}2Mbfql٢KIDATṥ;zCjm~4tzdFkؕrZ6 cߧ6wgҍ;{OcXj|ypBS;IIlOz}[KϤ ȜN7Ɇ/VJ xG.B@?9sՁ{S':Dy."+^﬩Ʈ[<|=yk~?`x!ħqg͉aG7i0-*B3irlU}dV o/= !?d-\}pRJ4[RI> b]sEP;Zpql?g0u6X]sMR((tԨ[`m* >]!bDd]Kb}/nG^mN\P:#WU33$afzB6ᶮY1hByw:.U]שNCc;` v,@33*" Ѹbo`7u +' h8{AVzEEpCG茋I#\WRIUp ʷP1#P'GuZ aᡕD DAҥ:(FEstMt M'mOhj]d( TCD1$hOBnE'>F۬_bV4jH<cVU+Eu]t}7C7'D+^] j#/$"נڪByJ)w\U!H%bA!"RKK٬y88ZQr*i}ɾaT\,(ҹ/,)V-ڎnc 0x0,P.,UTד}ǶB$݅q۶տd_ $*bD;AZi#d\LD C"jqv .rURkNSJm!ABBuBB$ !F $yܸ' >Eր`MeEBS^ur 6#tJ4(]K=.VPP !{kx u=F幀N$tzjp6BmM+a0 !Z?Og95tIENDB`kildclient-3.0.0/doc/C/images/we_trigger_highlight.png0000644000175000017500000004541211715730227017657 00000000000000PNG  IHDRbjx pHYsktIME  '~- IDATxwXS"RTp HXE *""ւ"**b (Ej\I|̙s&LwX)\jడ!]xϭ)QUT4ӎHA77J[Snl_O"De*˛/D ! zQ5dNnld)"ov)LH85L2#qjt%$Z7;"IU}[}e_wy oLg |]Z- ɝi=L w+7~=c95 a q fGZwAQT8}qPE>"txuU!&࿻ՕK 2XFSYSɘU?@|`gvcvE} H>D:LŠ+8WEk,z+sy/$ۉ 1A.ukj'bq?nFIDqאSUwDBKkUwI}쩄*US44{ &Ѫ_g7*S ')v=BoK|v7e?{;(s 0yH1f߫}u*z$+u:M{ߞ-1}]KH!rԕA} !) dϝTVŞo)43Z{X:sY~]Wbn0In>J!4o9$ Bo}5tBueص afm[!8;?iսEoIDMg"HKHdz2zB [$hꈬx,y$l:Bhǩ >(j0߫2s_6|*CO.ZJiq6Rdܛw\~{[q!?vcQ8]c_SwCwxB4UHO?#IB 4ΚC*1ȯJ_xTT0!L z<(&IJ p޿}n<#-E_v!I?(PȽW3H'p)9kN/IoӣABJ/-Ow}WJK=ƪ~}h׸%L Jo%Xt1hdPW U- CLc~H.0{e?qҲ_wcQs2Re# RHQ~_ &4OhQ?DH rصz?744\_74V!TW_mq>a[&yXt{WV -3?Q!7ᇦ3糫3?VsBY{}6BP}0* 7%j? ?*65_"a$!͇KCByZ/C5UVa Ʈ̉=U !Db" !>YWVA4Į(+ D ( ]ad FF".L0Y援ۣoW%]Ow ^]i p{nR3f=U~F=ݞ*_]je=5q˴'äUSV(,>پ]{ :_KƿYoDѹBrIe].&*BLJ6FT ^W^Re 0BHHJPa 8#<Ҹ{ 5e=*zOC/f\vTi(4LYQJ"cd nL0EUwGW]!!T2fGU7> {(!d>3󪄮IW y#ޖV)c@3^T"C !ݍuL*K&=6 Yh8bw.ЈtnTVJ[?@SД1쳛_Y@IaH.Αi :afeWҷ{_C)i0A&aaj K9>Ju1Wa'-;]x.D12<@BX -fy$o~|Oi $*iDBLGI$N1t% )H!ÚP:6D/z) s>x__w!{.+ss55f#}~>h P+;etWoJ*Yt0!!aRe R|#۴#8'B3I.Q 8f ߡ*хCaUū0I+Jӎ\>:RcCF!S.sqIxHjv=~~b5BH h<0D& '-f#)׭GRQ<ǟ!ԳrNCöoqu2_ @@.Z*!&)Qr{0ՌzwGUؕ|ex[pROm9BLc SD(4fΛJi6w׵r~y8' =p~T=Ib$%r @P{KEB]տ4|q:LTiWO)髎vSIU@#!:}ŋ"^]W60Ҫy:!&awWιԡ_׃ `FHD(pճJ_S,L(gbWWȖR?rhGX8'sʬ|7qJQ#Kh,uX \" R R RHH"""@B&h=wEs'D]]} 㼭,-eFR_f톅~vzUU#G/\t <Od*}CcqWoQ|"rV}ɓ'O>mܳgϠ ___o?w,\0il#FR$srn>G(鸸[@C!< D䩠0c2Ypbw@?#ID]{MͭWYrr[:77O8=7o\%YXh1~8lBp~?."LKsuufZ \v<"<;BfOFFܼq%V JݳwTwǯOq@ll2=b"_#\.7ZrFM77ao6wq$$$F9,Eu6[n"t֭Tk׬J2c\]~ht:=0/LBSw>B\t]ۯ\^SS{DJgLÇo6wqXT[[u8]~AKKK\>tU={j7 /hjE$gaiq2B⥤6=_?~%/*zٽ~RVV۶." /.Brr2XytM >Y!/a6̭LO .h6wcuI{m@`Э"߭ 8UZZ&YLMLbOǕ3P6֥%'OF+CWW=~]YY)Cm[jnVuu`[mg¹Z6o?iMXZo۾a_5#HDMM ]w:.^UUU۶."̛;[CCȨ^zU__իP7wv[,ɸIHYs\ϱr-?20)32޶uO/s ƭ~dmH R RHH,l`9HJNbڐڻ<"K@2i1AAA={hi1O<}$"SdM_vZfΚm " sQ.v\VpZ ȣHşM>2>tbrssrssQ<-FGol:t7ğu:Q1EgY326b4N@ !;gf(,q***,]nfac3ĉHqK"_v.Zw,t\EK&Bg>\j>~NiӦ]~Ӧ}­sݻ?̼o!g記9󜜆^ͼU>]Ւ.%޿{kP5]]o=}F(ߦvVZqI\ss?zՊF y\]~RVf8;% 8:km`jnh!lRSNk=ʄO$‰NxZ̺hɓ&խ[WJ;d2)M휊9=jp7eҹ8'#!4MKKsٲͶH;L&c --//_h-LhTs^^cB^g;}+˖h6@K.))DH¹D6**r_Q_u{Ko6`aiq}{TkN;N޺~kijv~`؈"#07NYY9iQ-/Ύĉ3yD}}=뤊^VVTu++ˏ?ğieK̩S'ą#L=x(qbU {̡qB<%IIFLH#w_ʵd dIӂɺ'"=~H)"%Jdf}hw@Αi_bs)rU@D /t0LBv"@G @Y`s)@w2ޛpSG' *;wO2_6"^|BӧnNIIlvXjٹ{ArɏQ5k֋/;5k7ܺu;} -M~^zT+as=i} vqq!vn?VZzrHJvkJǟ͓B Dl~y&6'NWiQ cLͭMoh|6!uxBm۾#"]0qiŕ_nWMqMݨjbkk;~x@dG=t{8wvɾu󚛫˜7DG?thlGH􀼬iWnaq`#IiWN%;/<"J,$> &oFsD|'߱XښZ|9iℋ$4D+/Ң#GzZMSPP :"X|vzNd24W,_*<"J@nWM qUZ\KsR~qR {͞|wFjaˬǏEF仦œMNuf y0sM4`/x";Z+''WMӱZeDVS'A\վA!ޒ R#|H:=i\\~;8ڵ)7nTVUyf% N"D^*ԌSȎ4$.\BS7{b&?jS"pʢ;ۼi][e ٣lJ555q*'uIjQV)7R&NkrzMpw)RrDd51\MUk[mN{1^ׯ&}O<5xv'/xAnX ?O7]N$}X[bP-Fa IDAT7C> ڤ=w}m2L탻 0h`Xgdq`$ppspvH FRmrt"d HޫK@Бe8:v0 s@@D uRg`p D]F @D kkX@h/$S "{ Rm RAI-~Z8Ν }Cy'a2%/^JO'.~[`[iǏ&BΜ=LYssS"ʹ6ҴYsܽ6&-6$%c{إE*`[h.hYXh1~y157ٹk5\.aa]f6V!\F%"c74>:ܰߏL.'}ZQQQdr3 'NDgkc};=khffr5

8~@\jG'7Avw2nxs\G^Gsb;ַgMn[6/-+wt5Cˈ/=lԻ(|H~pKD*藩c}Jh7 `_澯*9˒UTT~Ug`B(Zr`P Cʵ%񏬢[ȁFtrˆTUU:|da@d¶l`ee1G-\0:T``@SH#8_sH FR2g"%;zvD D D )6Iɂ4 äYr"%#}0Xr  R|^[{"@h9AwD O0&HF>!Cu\+g sGP7+KIÇ}m&RHhGJ.c'VݰqhFs9)yEaOfΚ'J(M315,tsy"S___Oafad؈ї>->dl4lҔMp],l>B8PQ1&"|-aVZ09?@%lBp~?32!VQQdr3 'NDJpZS\.WFeYTir7-fpbw}q'qSQ1.?h4:w&na6&Blm7m\#d8eeg7g޸ZX2c"IAAO?:Ǜ%_lE\]VQQ)++o={j7 ,++P>Q"eEU">qT~~@S+% : T*uS>|db2pT*IH$uS&O,*zI/CCCcCryt43AB|gJK/R\>@dF$II)z;+JVfْO\ygg=мO}`Xvt?7jVMԨ[ulx++ˆ"N޺/ٰ~RPPf 1³9).~_WVVSXX$MkO=oL ֤)vk,fEorÇKGVB%y =Ox%bKALޞX%.]Ւ.%޿{kP ?rS%gtss*#ysG1 Q_H+W}Xؾ~Y82z5>T¹ܼq%V Jݳw?ܺys<ƽQc͝5ݽ؉L&R^^..橘ӣFWPP`0~S&Kl]{L`"xh+/n4 24vJ^KG削0djiiXF~qg<`i:[k"zu< vAw?ƍ—YKVPP`0:s]VQQ)+-={j˜Vi_B?_0qM~~@S+%L[SAR05G&&AR[i"u22:<<"0nmWCLM9#'zpK"ɜV)Qdyggݧŝu` nbZo"eW/!HٻnCCCerR2uuukj@UVVNKӶGCCnBϞӫ /'iQSS;|ͦ#eb2/JJJBʬTdRx{^zEF=Ƴ3(Լv_zyzaNūJoJ\ZhMkKߏ8}EEǰu6l7\bmm-޷4c RAL<!i]4;QPOd'O;[^׮x7! #C\23 ? eqiB3Ǜ:8:>UWW;:Yq74tc@+}___Urԗ!%zF}0AEEW):!)גBdR%O -yd.orݹ8NIIF m|}w~#l Mthhh{ Ni1,8898A;5[78wV_sH FR2g"%;Kik`t0' R R RHNJ `&͒C)5H2pk@{G)ZE{o "{ RH7n0h3B.^{6qqk@V8߯{Ʋq~F&wNQB@nib'"So]O K9kţ|;F%~cjn=n8c۶¯wcemojnzz.VTT.Yf"_Pxx]-ioTN5YXh1~5::ܰߏUi 98 04%Ea!&*,, >¦ɰNdyB۶2?tpD& tC84l[T/Kptr]䏨{ 8r #+qZհD:~9B'#uuun޸~+Jٻ|jW[)cbO^ {2{Sry:-Er)ג3ols G<ȴMOp22kWK6-$d.& 3iHZ{>ޞX%<1qd2)-j|ܩsٛ@g`9?qoystHMM]fV3F;)((9%/c\]~ht:=0/Lqwlb) vJzL8X[[f?ɠɱ'kkk׮(Π~1zP.'% /V^׮ 5o;^G"jjjq-wqiU.21++RRR9Nv;.*:ͮ+..ްap"{:BM۽gˏ&3gͱ<7藩c}J+p܍W]]f9NO_mټyhO&_(_[N>o2%y =Ox%g`Lvbh=!DW)OfsfODL[fe>,[4f݋}_׮\RRRBQ(+K7L E vwJ&$:7c?#INTTT.YfIvcemojnzz.K؉157Q'2# ;)I . ꤦ\۶2?tb a m B%$$F9,k现+W8J9{ ddWoP={oee=NKuS2g_,[xQ1-*LlLJKw*$y{Ǹϛ;G^Djns>#!4MKKsٲDWh4N ;@4MAAAGW2`DjjB|5+bO6b縷oI_~ LK`i:[k"zu<Ң4 $gSir S.Fw8/hjE$ĵ䒈HȨ?Bhì>x0?:tp4USSůg@2T*uS>|db2pT*6[ Rʬj|bRwBt:ifo?I0U055ݻORI6(oXw_$tF>tׯ_߻ ܿ_͖~9ӫ [! B45AYY9~yVDMMjjjmb"?eSnulvI8 IDAT[6leZTf&ǎ-..^n#p.fZ+k[J`o3g_z\&8HbLfoذY+_{n.rrrBcb!Smټ~K6{Gg왙[m;lUhkH_p455{744?S|mLGY |`_澯*9˂=v>rIԀr-90(D!ZْU4z FRVE>Av+W,RUU}ÇA@=ve[ؖ-[,\|h FcX>>^/X~7mbGL9ɐPSn8uipy9)fڭ_|=D6jH D /PO?Ϻ+=˴@2,¢3,l 1rR2qMHtvn~F&D@ !;gf(,$ܵz\.WnGK͛T: Nt!bBf͈8vQ-X$t&SSPd)@S]ǜwS}]>OMOaP(:uȜyNNCRfK\*"ZBBbđ9ϲv =<ݵZҥwo 2չyJ*g~IY >xݛuS*+){AeeucyeiaԠ`$'_ zE9)@~ LM|(++KK\Oٴ9xbRmmmP7Wbdt*t&2o$<<*:&dFCNI U]Y0wg<ðgIFQUպmb1&L]TSS$^;~2N.07cd =MJNhsczW qϼq#e={j7\PP/hjEl`H WW|>_g͞=B$gWD¸\^gyhbUuu"XTr04[l_;u"ȣBIɀF4 ߫x&?/>$~.'r{#>u?/'{\I 5oTlʌYM !dnfr;,[Fn'NFйDzQ T}7c=M<~eQ&lhhh${늌ӫAPo^nWWD.42yjkkkkkw7yH͏?{Vd)+TBjwQk6ѣ ͘SCIı3g>xeeVJJ*~2f x{^zEF=ƓO8X[[f??M~FRwoMtJŏ>}U,q?qtw7~l6f?~$4m Kfa$|T<Vd$fJۻ 46#lڸnM_ԼOy䩽KIڎUWW;:Yq74]a<'uvZʿiW.M?y9MEOoQZY滷,mS@p $Vk5=fAovkopgd@"Z4t9)>uYz$W>;n Rm߷ R]?Eo; i%,AW"fD {:7phvD D )))>-A#K9h,u$N  W?A k+HIENDB`kildclient-3.0.0/doc/C/images/we_trigger_edit.png0000644000175000017500000005245411715730227016641 00000000000000PNG  IHDR pHYsktIME "VY IDATxwXI) ծ(tQ)4, JٻW8 "6Y`A[@Bc IEz||633͇牋@ 8U~&BHU% (WVP֮i#"?Viz _O Q6z" zԻA'VϿC$MV,tEv=2F@䭡#"i2kL1NC(H?Ɍc8IZr58$h&W m4_)|~;Z^yAOןHhZ=.U%5*OuE?vO=3Zi |BθBA݄';|j2KYڃ 44rIaNIv#lVrԒWɘ>@}Vl뼊;9QMA?eXh˳@t5sVNz|?9<;BX|PyeuvE#$og3i Z JkXi\MWP4 YU`X]n*ג3AB?d}ֵ5K]0Crےd5]+aFEe BpHU`+|vHTU>KF|zR5~ۦZ~I> B* ޖgg(uyt7i{;nøK' f}hl6Uݒ+ B.c*o 4zJO8DZ{RCdnsZLcۂؙB!|kj/vd}~TEꚧ٩J.<ꮢ ;Y Zue9,G[!\2J&/>+kZ>K;UBQ^.l.]2q1/C`]kTkf4$D,R 'T;&=,+ Tv12rL>xxUނtTB~ #iu!mNQ<-C"'e0D `,ն* >]l,N~U!3t1+_SA^Y:"hUI:8Kxvj@c̓ \\@Z2 S8.eL;^kЗ.|qJ@&(W6`| M) 4"|iTm+GlȦ39 6)>:SzO_K?28l"KNW`љl#DHK'/%*VUH:(@sZhK2YWZ~%Pme#l;J SZ{EfUly#( DCuG3 }X! !'EtBHj4[ >Zf|:pO={it:5J{WL]ݣj2k@W0ӳePN^MAe]^mNy)ŋ ZBe:%$| mٷ}HPFk}AAm5sѽ4v7]W{J·ē`<-PZ?k8}7tk2l{`Kf4YV!3Ff]|Ƌ5f:M[$6&(4ъyy%M,yH_K-,s^MI!k~eZ'h m̬d^|{H:!Z#qoS?Oѽ&L~y2E%7 EOX]Ϛk|WT)uR{J[ 7EE[>dj*hdyhtZ7sV?D he@+Bj5~b>'vʳWoB۶`IMom݇l{:)0Y%"R# LZ;ZKTyPf,~-'JmuZ=" ! v)2,:rtFTgkv)2Yh &ǀښȡfJYJ4h] :I _L4wYUnߝAYP&:|p~;-=*{ *Q`V^B:FRTW`b09&{]X|/4.;K=Dc D U(u%ڥQo=ڏԪNbF_Z^NFW`uؘhVKȿSB;~ދ)y$TNW5;+pT*mh4tZ&^Eǒzm=~Tinw{Bo@@+P3m]AAIz-7JrK>֯,SGi#"+4S v X{K@=Ti{H        \4ox~(ޱeHBȤxV #q T G E D D D4gq"fbSŋmlllѣ?~HYȓJvܹ{={~SL9s u"!rޜY7 522RTTTRR=|ٳ eeeܕ2` S~.CG\|E4d M]<}欣0=lA,lL̬V5|!O###ESzkj;==}ĈL&•rTT!׿xbhh`28о}{555 XjU۶mfϞ]UU HB-ٸj9p-wR+A[p>sC=}}[ zT:x(N&xTah].k:ws{xX!^}_X]2)`kRRR>|x…?]t+XUUd24-55R^^ Qի "deeYYYeggf033kժ! d?@gl|0U~~vmۊKNOz#n>Mܩgd1>d02CX? 6m穽7o޼xbzzzRRh^zQT֖Xy~ -- 'O|S-XxYv<"88z@mf8 $->LfX_իW&{ٲe۷o_f#.fq|q s3umaʦͿE򴴴ǭ myy۷;bgt҄~ǏF~~u ]ݜa-1DB,^ek𡪪J\\BeeejE~kmnb˹\}|'7o3fLLLLQQKOO1cƒ%K걱'NG{]yyC/wҤIǎ+---++[~#6"555nj>ܰ~M}L,,Z:ujOiiE_뻉I\oYdɒ%K֬YӥKVZ͜9{С_~EEEe„ ¸Y':::_ uttڴiwmߜ:njϝk|;&t y"@SVP- @@Im3"q"%wE D D D D D D|c"_3 rۧk&|DYO? p-!!!H]=C^`3畫exYWp,YTߓԿ|k.^'Ȭ$nIYh m:pǸ]AH  "2` S~.CG\|ZЅTA,lL̬V &fVcgc;o`LU+YFOmBVZնm[55ٳgWUUQOf24MUUBd=ݨ9p-wZ.υۄ::7޹k^a>p-pattLhȁo 3wp/gϞ={y&;;d]!޽{U, DE8ml1wʢ./Fp8wbAA#"1LstpWJJJ]+~ZEqvrN6j߾}#GdXl6{޼yTZii)!UVӧOOMM9Bu۽W=>&"kvp[Kh.]'O|§LfX5wKBo\.f92)))))󱱱8-CͿ]rASS,-];uuӵkךͧMv}HS^^r;lBȤI;VZZZVV~zGO׻wݻwB2337EBdCmX&h>& -:s:ehb~>vN}&&놺 k{!dݺu#̟?XGGM6qqqG?~<""}4],Xs>~,=w&IsN-#q5x SMEJEoTB$B!424HHF Q6hY!H1FkPC3y~K"i`xm9^\fHhf͞WX:B$B䗷eky?K+B 4]=ó170t 7n 4os܄LaH3+T]V6&fV~Y$^%ػ`#^deQYY/05o`2tЗ._703467igiªdvûwzI޽wCm:e$_iKnl!F~gh2<>3g_36fNQYZSW]?heT.q|Ą>3hng9s^"KRJZk}e< GDzp8;wZ2]+~ZEqvrΞNQVVpc\ 0uvWZGAL&b:]'"O~?l8\}&˓p8l?߉TJyY9!DIIi.>ٽ{Ʉ؋vmzFYY!$)?!r/?S%5WѝdN]QQfʮ]_yJZk}e<2)`$JKKԠ DwuU3˗ڷoGm~=kiungdd1>d05d[u/9%>>!+G֭6}VƎCy,s '!/߯Sv1_t/gʨ\b~1ݺPҹS'+X d< UWWKxkz >LfX2x4M<88z@mf8 9uKJFXz=u?d(**85lBȘ1┗ߣGwq\F嵎O:_yJZkm"A$|/h۶ !D4::9:u$K˦5//&cUUU(ioW\$^Gaa]S_~ ,,̶l rww\w#W#<7r8y2=BpxvG7|Z)~> v}J_KVZZjgdnbүnwOl,_xyGV*}5A;w1\hԩC6~>֪!uw[cYx<ѮY"婼wI=;CG 8*=ǒ^*ͣK⑮cn\ӥE/ai"!3]=CE_W,wvr())=x(d1-wB[%pӾ}MZUU` NKdֶ}ʖ>buuu&i``@B lܸQKKf4(--Mx-[tڕN)'OVWWС{ IDATî]2hy1cFBƸ9yv~,=";˗L~ԋhkw%pĊ p{өSGj:3l7 \@U(VVNqׯL +4Mt;==]WWWlW~Μ9ӡCB͛7mlldŵjՊfff֬_lj``@)//WVV~ⅎNF UUU1L*]4y\\rCSNiرW ! H({4%L6uyl1g͙=fW۷ tr"J=zԶm[a5ɓ'**(((ȮҫW/jCII-1͛7/^$1ӧOj޽{Diͥ#F!lt̫W *LJH~o՟/>Mp&$f\Ŀ0 I_<{ٲe۷o/UY[K ;UDF@ސͦ., 1̿OMGx+@ٜvvv]\\}-#?o߾o.XI&;vlZuu؊'Jɓcbb***\޽{MLLd)۱cGii۷o48D޺稑GLH|'>~̢ŋw}ZO2u`gR~> v}J_2r/^laaѭ[7yLRUUեK}7dN?~qqN6m$޿C/***&LXd^̝;7%%K.'O]ֆ]t1660a^v'vG LMMLoTі=.l,mڴ =ztQQQ``thQ nرcK.UWW޸qt@lA\\\\\\O  6ocH1Fk Bnޒ+γ+c|hY;FFٵ6?phiwn%޹9cmw߰mά 5osgر[9snx t]E4_n߹x"(ͦRڙtuп,-GSS킅YYYٳ^zzbx<#'>cǎϘ>M)***sf=rL4d M]<}欣0=Ɨ._]h x֖A,l z0my?}c#KO2bXKt #"M̬zB|M{YΊQDdU[3?./,*,BwC s''%|rΠSzxM9lt̡{Ӟ>ܾ-p܅5Rk{)NJ:`o%\;sD?-x+Zʽ;no ssJkÇn%\ ܼ_Isaszt"*i#D[uHXdD˗SY/HCCffqq+{d2'Xze׮]!N<Oc?> p:we3Q^aN,((ҭNZZ0uvWBH~>{YUcv)p=}&Lߴ#^UUU'ijhԩ1::9Զ%zҊ RTs277oC..-bbƷ~oh2g;9@iK:rK/]VZ;̙5' XhQh)c\_h   M?X&|Y69?vF}ǎ|l=-ԱM[~Sw&LJyKK[X?E-(D*Qj@l6?phiwn%޹9cmw߰gfϓ'(h׼sڱc]s.ܾ- ?M|1 q#.Gl6b?txgii?4n,ʞj*@ E;v|iHQQQ3{Fc^l!F~gh2<>3g70tPEŋ]l 25giesP0Vˀi3L !_Z~BȐ!kZgibf>֛7n 4os܄:uV"iuh֬|{.K+3UxxBpC s''%|rΠSzxM9lt̡{Ӟ>ܾ-p܅5RkK=Vd)~+ڙS'y9o[ Rpw[+e'XVZK>|t+Z PwJ❛NNԣb)%xwn)**ڽ/@ 44kkjj YGL&sx5Wvڅ(&yaxD8Oӹs?-Gp8wbAAnuҟڀ_܎:yGYYaqsA;+N-SxD &b|NƋZw-U+Ru5SM$[OaB:wTp\δtMM j_W='ZQQQ ,~Um55wVZ2Z.>&‡M@3 fw$]"$ܹ{Ĥ$FDZtCiP[2\v~yGZdu6-G|>?a2k.'N޺-\4|{. Xy‡zz=҄6~Ң[b/D'iX3467igi5G#+e ]z*#Ӑ6½+vJ>ͤD{iȰ8 yYGabU:2^2u=Kf"\7)`]Ѿ8EE]N'9v3+jKbU+W=FUϏ [rnybLrmg9sԺ\zZsr ]H%FFb09u"  xqׯ$޹9p]vhhpGJyK&lX~zu'GyIXP[ho?Vµ{w<ݖJfu# q`2J;%df2AT#;O6}朳1Y*P4yhؙs'oTRR"+<"adX~>NGN',_c׮]'MM\pr8M-Y`e7p2t"Æ())lE_WLKK(;5ΓtiO$:yGYYaqslZ^JJJlҚ-#]fB{3g<9XPP +$OBL ZzeݙLkV1U32^2u:K1ȗ/_mHgW_FFfKC!;bb҇ءCa= 6rⅺ=dgd {.Z5555m#Ci־};j[MM-?@eVgy-1fKK֭6}VƎCKlҽW= [67n2Nuӡ6ICN72^2uj^=Gj;{^^I}bj^v.㙖,!ȓǫhT]]]tN_AQ@ZѐѓMZ AgNx(ѣj^< пu.}4d/Z)!4B01ҭKb߮^Iy_@hAgyټFovܼq\.}.ٻw2MZ:!d͚999\nEdiSS oX˭Xt٦4557mXd2.Bv^QYYYQQq<Ĉn((\|E dxrA9vF'ۃv9J ;}3qv%X%K2D(Ygb=K sjGn *Vfqi"N1[ Μ:}Z hA!RxFOy.YH ttd2Y,ϩTw/RYY{ҎW(++#$%ݳ'DLUڡ%V.gY#"yr8Ν;i< l|M _`Ԍca544{322X 2 By؋שSG;[/xuO3ʬY%V.gY55?uР7m())͙=ϿlHӅԇ,K4^O#ND͟72f߶8ѽfYeed%i o4ۅsf S勷N716:y*/7ؿU^n^XX M^L+o8=gif@s t:MCBws1\.w>t -[ݨ4u={5p8y2*4^c#"܊u6֚^f@K ;,Z0o?ϧɢĤ_to܌㹍v,j SLra?YFrf;dz г˟>z2` S~.CGu F v[4?!d S~V6+11ZZ'mAgHm>K.u u w_QQam;X4֣Ԫֱ7[7c9nBFF1m5%M41rX=h!r/^ k۶lOL' ::‡W]?ms.H~ୄk)x-1!Ҟ>uJvԉs 3Ѿ8EE]J[>OK}󺓣ü?w>OKUWWK܀s1(uCBy<^+wn:99l"cLD/ZGnX=h!رc_&$&&ڵk۶m)++SUUe] !NYI(o/O|'iXHqsN+~Z&0dX,?Sk6@EE4{\y<{8,|zS4V/_j߾0s~~Ac(@ɠչq{ n3e90],Zb|~d%Μ:Qq%%nGf`0<= uGy{ )Qeh%DJF'Qz <ڄmm/_\먑!|Leܴ#^UUUHOpVEo]O^Ʈ[jKJX~qo9j"Q8V::9vqqq"mDee~4BOmK,3s؜f~Iuu96kE .PYYxѢk=H.";;{ݺtws1\.w>k6XXxYY! f;#Enn!]۶ =wVZ Q>Vc\CBʸ܊hhh(JAA+ ŋH+(=h!Nh4ڞAf,6m2txҽCtIv rS:l3naTOiiE_뻉If٭m|U;]=C6>u${=]c-Q>V~> v}J_(>Ӧ mH67pUzǏ%Tj}Fx.7no߾X_ݣ_hd~eR\|&%L6u]E~kN%% Ҹ8z먑'oU]K@3Є~M6.^?UUՑ#_xAX}@llmmm\@J]HHF!h Ch4 B$HN4Y           53{|I3Hi~TWPbAiu|oA0oK]\z1)nӦMO<144w zgc;o`|oz0my?}c#鄐gκ nfoE5j/ky<XTTe?7ر8ˆݻwx",,m۶ '::&4@Ӈ۷ΙJ3o[ Rpw[+C=xp7l -xwn)**ڽJU܎;u4hyرׯ_Bwڵm695 i!Q8>p8ĂaZչ36lȵkkHGAL&b:M'&& hd2;w|8@zޮ9x̙3_zd&)O)ٷktђ~/9%>>!+GDӍ BTFFfKCAm((|굡hy՗/_aaa3K҆пu.Åd*O}bj"g4~$hkk?>00Pbj,6vMMMBȳ4]ii醆h^׼N:oߞ3 k֐ cɒ%_}*qq -ץ5k7wEEEmmm zE)//r{L9V^^zzBd]ɾ]#цkvcb`ҩS'a߻ZZ'̛3SOiiE_뻉IӴtڼߏps9g@ 8*=ǒ^*8y*ŧh[{Ҧn"3_6B!|s}        lvM+hH,5DR90LBhhp-!!!kP@ԣF=OKAWD1Jlfg@` [RϿ"  .MZ}cIa/"likzF Pg(;ss""vJ"wu|Y]"- oB$|Y['mnVXFI` 5#qr\%zFp\nEoB$3L(Q,L8RFO502567i_FڗZ9?vF}ǎ|VVVΞ /:tXhyPSG_d5LE.gZG D#2 Zc=FnTPTb9Tkm-[j-ȡDlEфp D sTxIo};~vߊ -"Z/V#J24lD"ٳ;~Bzx)z:A@Sa :@(+ܦD"am ^3 Hk H~,hx#ihh8s@"(ʕDFn6GG lÏy<~ᅌss\LLLdc9.Y׮s,I}aGY$(ރ%E Ag~]jp%a׵uA69Ns``k9xfuj)R^>^X<|fFZ2DB$w+d>ȾXc[k ł!\6@0"0n3a3YjJ$-#F ׬ܼM9^J >H@ ="^dff&5RGⒼ'ƭ4 ԨM61=JejSEb~GQzAT"Qb~ڦa>m:TuuO"[6o}4~` ]/^kedR rd. /էN&~Z^{{ QVW؟r=5B_X_EQ򦵰BӏyB͚y|>:<ѣS2a<E38ld٥2-8G9WĮ|F ݻw]qyYл,(ѼMeEG%Z?<|$A*Ri|B:#wD\ʾ\@ u?D`~g҉ͻ|c"1y㦐JQGGǫWM)[BB#C.7_P]Vrn+ \qar<ξ#Je2| ,Rpsq ;/^Q#xR14lۤ)  Ϝ>>v%V vO ǒRa;Oe2F{ha,N>_(˾^+(hP+Qg UO랕T({gࠣǎ3f03Gw񈝝{u<"Iϋz ?wIwm,|^$əRnzD7-_4|%/ߏD"aEhvjPӛ=D>E7 Н QVnрO}tQ7E@/ ;hc`%рأ[EЯY$nɪʇsZ @ѥ%x`7,o!w N?馟!Dl@): @h=8E U,mP$( E LCKoAᘏIENDB`kildclient-3.0.0/doc/C/kildclient.xml0000644000175000017500000123075012367156733014375 00000000000000 KildClient Manual Version 3.0.0 Eduardo M Kalinowski 2004-2014Eduardo M Kalinowski KildClient User's Guide Introduction KildClient is a MUD Client written with the GTK+ windowing toolkit. It supports many common features of other clients, such as triggers, gags, aliases, macros, timers, and much more. But its main feature is the built-in Perl interpreter. You can at any moment execute Perl statements and functions to do things much more powerful than simply sending text the the mud. Perl statements can also be run, for example, as the action of a trigger, allowing you to do complex things. Some built-in functions of KildClient allow interaction with the world, such as sending commands to it. This manual will guide you in using KildClient. First the basic usage will be described, and then more advanced features will be explained. In the end, there is a reference of all built-in functions of KildClient, which can be called from your scripts. It is assumed that the user has some basic knowledge of MUDs and their working, and also of the specific MUDs the users connects to. This manual has no aim at explaining how to play a MUD. Even when specific examples are given of commands, these might not work on all MUDs. Running KildClient To run KildClient, type kildclient in your command prompt: kildclient [-c DIR] [World...] & The ampersand (&) at the end of the line means that the command is to be executed in background, that is, not to wait until it finishes to get another command prompt. Since KildClient is a GUI program that does not require any input from the terminal, this is the desired behaviour. You can enter the name of one or more saved Worlds in the command line, to have these Worlds opened automatically. If the World name contains spaces, you will need to quote it to prevent it from being interpreted as two or more names. The exact way depends on your shell, but generally enclosing it in quotes should work. You can also specify a host name to connect to in the command line. By default, connection in made to port 4000. You can specify a different port by using hostname:port. While not recommended, you can also specify a username and password with the following syntax: username:password@hostname:port. This host specification syntax can be prefixed with telnet:// and end with /, for example telnet://some.mud.com:4444/. This is to allow links used in Web pages to be opened by KildClient. If the -c (or --config) command line option is given, its argument is treated as the name of a directory to use to store configuration files and saved worlds. If it is not given, the default is ~/.kildclient under Linux or kildclient under the Application Data folder under Windows. Alternatively, you may start KildClient from a menu in your Windowing Environment. The exact way to launch KildClient will then vary, but it should be just a matter of finding the menu entry and clicking on it, or perhaps just cliking in an icon somewhere. Basic Usage This chapter will describe the most basic and important things you need to know in order to use KildClient. It is recommended that you read this section throughly, as it will ease understanding of the next chapters. Connecting to a MUD When you launch KildClient (see ), you'll see a screen like this one below:

When KildClient is first started, you are asked to connect to a world The screen shown when KildClient is first started.
Before anything else, be aware that World is just a synonym for MUD, and these two words will be used interchangeably in this document. The list of saved worlds may be empty, especially if this is the first time ever KildClient is run. You have two options: connect to a previously saved World, or connect to a new one. To connect to a new one, you can either connect direcly by typing the MUD's address and port in the boxes, or by creating a new World. Creating a new World is recommended because it allows you to save options for that world, such as the font size or the colors used. When you define triggers, aliases these will also be saved. However, even if you connect directly, you can still customize the World, and you have the option of saving it, so the difference between the options is not so great. To create a new World, press the button labeled New. You'll be taken to the World Editor, a dialog in which you can configure everything about the World. We'll talk about the World Editor in . For now, fill in the Name, Host and Port fields, and click OK. To connect to a saved World, just select it and click the button labeled Connect. Alternatively, you can double-click the World in the list. Sometimes you may see a little expander sign to the left of a World's name, and when you click it some options appear inside that World. This happens when there is more than one character associated with that World (see for information on auto-login and associating characters with a World). The list shown is the list of all characters defined for that World. Select the entry corresponding to the character you want to use to auto-login with that character. If you select the main entry, the first character will be used. To connect directly, fill in the Host and Port fields and click Connect. You can be connected to several Worlds simultaneously. To do that, select the option World Open from the menu. The World Selector dialog will be opened, and you can select another World. Interacting with the MUD The figure below shows a typical KildClient session:
A typical KildClient session with two open Worlds A typical KildClient session with two open Worlds.
The first thing to note is that, just like in other MUD clients, there is an area where the output of the MUD is shown, and a text box below where you can enter commands. You can edit the commands before being sent, and only after you press ENTER the line will be sent to the MUD. A feature not so universal is the support for opening several Worlds simultaneously, and using tabs to alternate between them. You just need to click the tab to change to that World. If the name is displayed in red, that means that there is new text in that MUD, text you haven't seen yet. If the KildClient windows does not have focus (that is, when you using another window and leave KildClient in the background) and new text arrives in any World, the title of the KildClient window will change to "(*) KildClient" to alert you of that. There are other ways to move to another open World. The keyboard shortcuts CTRL+Page up and CTRL+Page down move to the next or previous World, respectively. Alternatively, you can use ALT+Right arrow o ALT+Left arrow instead to achieve the same effect. To got directly to a World, press ALT+num, where num is a number from 1 to 9. This way you can move to any one of the first nine open Worlds. On the left of the command entry box there is a button with a broom. Click on it to erase the whole command line. You can recall recently typed commands with the arrow keys. Pressing the up arrow recalls the previous command, and the down arrow moves to the following command. If the input box has multiple lines, as described below, then use Alt and the arrows. On the right, there is a button with an arrow poiting downwards. Click on it to get a list of the last typed commands. Selecting one of these commands will put it in the text box for you to repeat it, possibly changing it before. On the extreme right, there are two small arrows. These arrows allow you to enlarge the input box if you type long input lines. The input box can have from one to ten lines. The arrow pointing up increases the size, the arrow pointing down decreases it. The behaviour of input boxes with one or several lines is different: if there is only one line, and more text than fits the width is entered, the text is scrolled horizontally. On multi-line input boxes, however, text that does not fit one line is wrapped to the next line. A scroll-bar may be displayed if the whole text does not fit in the number of lines selected. As mentioned briefly before, the behaviour of the up and down arrows is different. If the Alt key is held, then you will retrieve other commands in the history. If you press just the up and down arrows, it may retrieve another command or simply move the cursor: if you have just sent a command or just retrieved a command, then the arrow keys will move through other commands, but if you have moved the cursor in order to edit, the up and down arrows will move to the previous or next line. This may sound complicated, but is actually natural, the arrows do what you expect them to do. In the single-line input box (but not in the multi-line one), a feature called command auto-completion is enabled: when you start typing a command, a list of the previously typed commands that start with the same string you've typed. You can select one of them from the list to repeat it or change it. However, in both input methods, you can type the start of a command and press Alt+Shift+Up arrow to retrieve a previous command that starts with the typed text. You can then use Alt+Shift+Up arrow and Alt+Shift+Down arrow to navigate through all the saved commands with that prefix. You can enter several commands at once in the command line separating them with %;. For example, if you type unlock door %; open door, two commands will be sent to the MUD in sequence: first unlock door, and then open door. Spaces around the %; are ignore and can be used for clarity. Note: it is possible to configure the command separator to be another string instead of %;. See . Another special feature of the command line is that you can execute Perl statements from it. Starting a line with a slash (/) causes that line not to be sent to the world, but to be intepreted by the built-in Perl interpreter. To try it, type in the command box /$world->echonl("Hello, Perl World!"). You should see "Hello, Perl World!" printed in the screen. What has happened is that the command $world->echonl("Hello, Perl World!") has been run by Perl, and this command causes a string to be printed in the screen (but not to be sent to the MUD). Don't worry if you do not understand the syntax yet, we will explain it in . For now, just keep in mind that if you type a line starting with /, it will not be sent to the MUD, but what follows the slash is treated as a Perl command and executed. Should you need to send a line that starts with / to the MUD, use two slashes: entering //list will send /list to the MUD. If you are using the multi-line input bar, you can enable to built in spell checker to verify the text as you type. Misspelled words will be highlighted with a red line below them, and you can right-click on them to show a menu with possible spellings. To configure this feature, see .
Closing Worlds and Exiting KildClient When you are disconnected from a World (either because you requested it, with the quit command or something similar, or because the server has gone down), you will see a dialog box from which you can choose from four options: Reconnect will attempt to reconnect to the same World (using the same character for auto-login, if there is more than one defined, see ). Connect to another world will open the World Selection dialog (see ) for you to choose another World to connect to. Offline will keep the world open so that you still see its output or execute some things with Perl. Finally, Close will close the tab for that World. If that was the only open World, KildClient will exit when you press Close. You can force disconnection from a World with the World Disconnect menu. Note that this is not the recommended way to leave a MUD, but it might be necessary in other cases. The same dialog with the three options will be shown. If you choose World Close from the menu, the current World will be forcedly disconnected and automatically closed (just as if you had selected Close from the dialog). If this is the only open World, KildClient will be exited. To close all open Worlds and exit KildClient immediately, select World Quit from the menu. These operations can also be run with Perl. To disconnect from a World, use the $world->dc (that is, type /$world->dc in the command box). To close the World, use $world->close. And to quit KildClient closing all Worlds, use quit (type /quit, as you might imagine). The reason quit does not have $world-> in front will be explained in , but for now suffices to say that since it operates on all Worlds (and not in one specific one), it does not have that. Reviewing and Searching Text
A typical KildClient session with two open Worlds A typical KildClient session with two open Worlds.
The main box that shows the output of the MUD keeps by default the last 2000 lines received (but this number can be changed, see ). You can recall the previous lines with the scrollbar or with the page up and page down keys. You can split the main window in two parts. This way, you can use the bottom part to display text as it arrives from the MUD, and use the top one to review something that was received before. To do that, select the Display Split Window menu. To adjust the size of the windows, drag the bar that separates them. Alternatively, you can drag directly the separation bar that appears just below the tabs with the open worlds. You can search the text saved in the buffer for occurrences of a given word. To do that, use the Edit Find menu. When you select that menu, a bar appears above the command entry box. Search is done through that bar. To start searching, type the text you want to find in the entry box in the search bar. Searching in KildClient is done incrementally, that is, as soon as you type the first character, search starts (displaying the first occurrence of that character). As you continue typing, searching continues, always looking for occurrences of the text that you have typed. If you are looking for a word, often you don't even need to type the whole word, only the beginning is enough. If the window is split, then the bottom window is not changed and keeps displaying the same part, and the matches are displayed in the top part. If you've found an occurrence of the text, but it is not the one you intended, use the Find Next button beside the entry box to find the next occurrence. (You can also use the Edit Find Next menu.) Pressing the Enter key when in the input box also activates the Find Next feature. If the text you typed is not found, or if there are no more occurrences of it when you press Find Next, Not Found will be displayed in the search bar. In this case, you can erase some characters and try again (if you made a mistake), or reset the search and start again, as described below. To reset a search so that you can start again, either erase all the text in the search box, or select Edit Find from the menu again (which will also clear the entry box). When you do that, searching will start again at the top of the buffer. After you're done searching, click the small button with an X in the left of the search bar to close the search bar. You can also press Esc in the input box.
Editing a World This chapter will describe all the options found in the World Editor that let you customize the behaviour of KildClient. Only general options will be described here, some sections of the World Editor, that allow you to configure features dealing with automation (such as triggers, aliases, hooks, etc.) will be described in other chapters, along with an explanation of that feature. To access the World Editor for the currently open World, use the World Edit menu. It is also possible to edit Worlds from the World Selector dialog, just click once in the World from the list and press Edit. There are several groups of options in that dialog. The following sections will describe each one in turn. General The figure below shows the General section of the World Editor:
The General section of the World Editor The General section of the World Editor.
The first section, Connection, contains parameters that specify how to connect to the MUD: Name: this specifies the name that will be shown in the World Selector, and also in the tab in the main window. It can be anything you want, that helps you identify the MUD. Host: the host to connect to. It can be entered either as a name or as a numeric IP. Port: the port to connect to. Use SSL: if this is checked, the communication with the MUD will be encrypted and thus immune to casual eavesdropping. However, the MUD server must support this, if you try to connect using SSL to a server that does not understand it, the connection will fail. Note: you might not see this option. If it is not present, that means that you version of KildClient has been compiled without SSL support. Note: although the connection will be encrypted if the connection uses SSL, KildClient does not attempt any kind of certificate verification, so you must not assume that the connection is authenticated. You can, however, see some information on the certificate in the Statistics dialog (see ). The second second, Proxy allows you to specify a proxy server to use when connecting to the MUD. By default, Worlds use the global proxy settings configured in the Preferences dialog (see ). But you can override the default settings for individual worlds. Select No proxy if there is a default proxy setting but you want this world to connect directly to the MUD server. Or select SOCKS4, SOCKS5 or HTTP to specify a proxy server. In this case, provide the proxy server hostname or IP address and the port to connect to. If the proxy requires authentication, supply the credentials in the Username and Password fields. The third section, Auto-login, contains the parameters that you need to configure if you want KildClient to login automatically to the MUD for you. You can associate several characters with a World, and then when you can select which character you use to login to the MUD, as explained in . First, select how the login will be made in Connection Style. If this is set to "No auto-login", no attempt will be made to login automatically. This is the default. There are two other options: "Diku", for Diku-based mud servers, which prompt you for the character name and then the password; and "lp" for lp-based mud servers, in which you have to type connect followed by the character name and password. If neither of these options apply to your MUD, you should disable auto-login here, but you can still use a hook to send commands just after you connect. See . Next follows a list of all the characters that you have defined. Each character is associated with a password, however the password is not displayed for security reasons. To add a new character, press Add and enter the character's name and password in the window that appears, then press OK. The new character will be added to the list. To edit an existing character, select it and press the Edit button. To remove a character information, select it and press Delete. Finally, to control the order that the characters are displayed, use the Up and Down buttons. Note that the first character is considered the default and is the one used if you connect using the main entry for that World.
Display settings The Display category controls several aspects of the appearance of KildClient. It is divided in sub-categories, which will be described in the following sections. Main Window The figure below shows the Main Window section of the World Editor:
The Main Window section of the World Editor The Main Window section of the World Editor.
This section allows you to configure the main window where the MUD text is shown. You can set the font that is used for the text that is sent by the MUD. Click on the button with the name of the font to pop-up a dialog from where you can select another font. The change in the font is applied immediately when a new font is selected. Still with regard to fonds, another option that can be configured in this section is whether to use bold fonts or not to represent text that has the "bold" or "highlight" attribute set. By default, this text is rendered in a lighter color and with a boldface, but you can disable the use of a bold font from this dialog. You can also change the colors used for the highlighted text, see . You can also configure whether to use word wrap or not. If this option is not set, lines will be broken when they do not fit the window, even in the middle of a word. When this option is set, lines will be wrapped between words, so that a word is not broken. Regardless of that setting, you can indent wrapped lines by some amount. Just specify how many pixels to indent the lines, or leave the value as 0 not to indent them. By default, lines are wrapped when they do not fit the window. This is the behavior when Wrap lines at full screen width is selected. But it is also possible to wrap lines after a specific number of characters, even if the window is wider than that. To do that, select Maximum line width in characters and enter the maximum number of characters in each line. The next group configures whether tooltips with the time when a line was received are displayed are enabled or not. If they are enabled, when you leave the mouse for some time over a line an information window is displayed with the time when the line was received.
Colors The figure below shows the Colors section of the World Editor:
The Colors section of the World Editor The Colors section of the World Editor.
In this section you can configure the colors that will be used by KildClient. The ANSI standard defines eight colors, both in the "normal" state and in the "bold" state. These "bold" colors are by default shown with lighter colors, and, optionally, with a bold font also (see ). Additionally, there are "default" colors for the foreground and background, when no specific color is set. You can tweak the colors so that they look better in your screen, or redefine them completely. To do that, click in the button with the color, and a dialog will be shown for you to change the color. The changes are applied immediately when a new color is chosen. Should you want to revert all colors to their built-in preset values, use the Revert to default colors button.
Status Bar The figure below shows the Status Bar section of the World Editor:
The Status Bar section of the World Editor The Status Bar section of the World Editor.
The first section allows you to change the font used in the status bar. Click the button and a dialog will appear for you to select the font. The second section controls the display of some time counter that appear in the right of the status bar. You can display the total time connected to this world and/or the idle time, that is, the time elapsed since you last sent a command to the MUD. For each time, there are three options. Do not display causes that time not to be displayed. Display as hours, minutes and seconds displays the time as something like 2h45m30s, while Display as seconds would display that previous time as 9930s. The behavior of the idle time counter can also be configured with the Only reset idle time counter when a command is entered checkbox. When the checkbox is unchecked (which is the default), that time is reset whenever a command is sent to the world, no matter if this command was typed, if it ran because of a trigger, a timer, etc. When checked, the timer will only be reset when you enter something in the command entry box and press ENTER. Automatically sent commands will not cause the counter to be reset.
Input The figure below shows the Input section of the World Editor:
The Input section of the World Editor The Input section of the World Editor.
The first section, Command Entry, controls the behaviour of the command entry textbox: Keep last typed command in command entry box, causes the entry box not to be cleared when you press ENTER. The command you have just sent will be kept and can be repeated just by pressing ENTER again. It will be selected, so you can start typing another command to erase it. Echo sent commands in terminal window controls whether the commands that are sent to the MUD are also echoed to the MUD window. Store commands between sessions controls whether the commands you type are saved when you quit and restored when you load the world again. Never hide typed text is useful with a few servers that intend to do the command echoing themselves. The sympton is that all the text typed is displayed as black dots (as if it was a password). If this happens to you, enable this option and the text will be visible. Number of commands to save in history specifies the number of commands that are saved and can be recalled with the arrow keys, with the button to the right of the entry box, or with command completion. If this is set to too high a number, KildClient will consume more memory. Command separator allows you to configure the token used to separate commands. By default it is %;. Use single-line input bar and Use multi-line input bar define the size of the input bar. If set to single-line, it will have only one line, and if you type more text than fits the width, the text will scroll horizontally. If, however, you select a multi-line input bar, the bar will have two or more lines, and text will wrap and be displayed in the next line. (Scroll-bars may be displayed if there is more text than fits.) If set to multi-line, you can specify how many lines to reserve for the input bar, from two to ten. Enable auto-completion controls whether the auto-completion feature (see ) is enabled or not. However, auto-completion only works for single line input bars. When auto-completion is enabled, you can specify after how many characters have been typed it will be activated. Just enter the number in the text box Activate auto-completion only after X characters have been entered. Spell check typed text, if checked, enables the built-in spell checker. This spell checker works only with the multi-line input bar. If it is active, misspelled words are highlighted with a red line below them. Right-clicking on them pops up a menu with spelling suggestions. By default, the language used for spell checking is based on your current locale. If you want to set a specific language, enter its language code (as recognized by the aspell backend) in the box. Note that for spelling to work you need the gtkspell library. Your version might have been compiled without spelling support. The Font section allows you to configure the font that is used in the command entry box. Click the button and a dialog will appear for you to select the font. The Flood Prevention feature is also configured in this section. This feature is useful in MUDs that disconnect you if you type 20 equal commands in a row, or something like that. When you enable this feature, KildClient will count the number of repeated commands you send. When you try to send the same command for the 20th time, KildClient will send another command you specify before, thus breaking the chain of repeated commands. To use this feature, make enable the check box Do not allow the same command to be sent X times in a row. Change X for the number of equal commands that will disconnect you. The Send this command textbox specifies the command that will be sent to prevent too many equal commands to be seen by the MUD. It should be set to a harmless command, because it might be sent anytime.
Logging A useful feature of KildClient is it hability to log all the output from the MUD, as shown in the screen, so that you can retrieve it later. The output is saved in a file you specify. ANSI color codes are not saved, but otherwise the output is identical. It is possible to prefix each line with a timestamp, so you can see when each line was received. You can specify the format of this timestamp. The figure below shows the Logging section of the World Editor:
The Logging section of the World Editor The Logging section of the World Editor.
In the top, you will see if logging is currently enabled or disabled, and you can quickly start or stop it with the two buttons. When you start logging, you can include some of the lines that have already been received and are in the scrollback buffer displayed in the main window. If you want to do that, just select the corresponding check box and enter the number of lines to save. Next you specify the name of the file to store the log. New log lines are appended to that file, so it is safe so specify an existing file. It is possible to have the log file named automatically based on the date and time that logging is started. For example, if the file name is "log_%m_%d.txt" the file name will include the month and day, for example for November 25th the file will be "log_11_25.txt". This is done replacing escape sequences beginning with the % character for the values depending on the date and time. The valid escape sequences are those of the strftime() function, and can be found here. Similarly, you can use %Kw in the file name and it will be replaced by the name of the World. And the string %Kc is replaced by the name of the character used in auto-login (see ). (If auto-login was not used, then %Kc is replaced by an empty string.) Parent directories are created automatically if necessary when opening log files. If Automatically start logging when connected is selected, then all your mud sessions will be logged automatically. It is possible to prefix each line written in the log file with the date and time it was received. To do that, select Prefix lines with date and/or time, and specify the format of the date and time. This is also a string with % escape sequences like the file name. The default includes the full date and time.
Automation This section allows you to configure the features that make your MUD playing experience easier, faster and more efficient. You can define triggers, aliases, hooks, etc. here. These sections of the World Editor will be described elsewhere, along with a description of the features. Here we will deal with another section that is more generic. Scripting The figure below shows the Scripting section of the World Editor:
The Scripting section of the World Editor The Scripting section of the World Editor.
There is only one parameter to be configured in this section: Perl file to load. It allows you to specify a file that will be read by the Perl interpreter when the World is loaded. This file can contain sub-routine definitions that will be available for you to use in your triggers, aliases etc., or to be called directly. For more details, see . Enter the path to the file in the textbox, or click the button next to it to open a dialog from which you can select a file.
Protocols The figure below shows the Protocols section of the World Editor:
The Protocols section of the World Editor The Protocols section of the World Editor.
Here you can configure how KildClient uses some protocols to enhance the player's experience while playing the MUD. Currenly you can configure how KildClient behaves with regard to the MCCP protocol, which compresses data sent by the MUD so that less data needs to be sent. By default, KildClient will use this protocol if the server proposes it, but only if this proposal comes in at most one minute after the connection has been established. This is done in order to prevent bad players from trying to crash your client by sending the special sequence that enables compression. Note, however, that well-written servers prevent the user from sending such sequences to other users. However, as compression is generally negotiated just after connecting, leaving this option in its default state, Enable if server proposes after connecting is recommended. If Enable if server proposes at any time is selected, MCCP will be started whenever the start sequence is received, no matter at what time. Finally, you can disable MCCP altogether by selecting Disable. This way sequences asking for compression will be ignored, and the server will never send compressed data. Attempts by malicious players will not succeed.
Miscellaneous The figure below shows the Miscellaneous section of the World Editor:
The Miscellaneous section of the World Editor The Miscellaneous section of the World Editor.
The first category, Scrolling, which controls the behavious of the scrollback buffer. Scroll on output, when checked, will cause the buffer to always scroll the end when new text is received, thus displaying it immediately. If not checked, the buffer is only scrolled if you are at the end. Lines to save in scrollback buffer determines how many lines of output will be saved in the buffer for you to see again. Note that KildClient will get slower and will consume more memory if you set this to too high a number. The second category, Name display, controls how this world is identified in the tabs and in the window title. By default, only its name is used. But you can also display the name of the character logged in (provided auto logon was used, see section ). If none of the options suit you, you can define your own. Use %Kw to represent the world name and %Kc to represent the character.
Advanced The figure below shows the Advanced section of the World Editor:
The Advanced section of the World Editor The Advanced section of the World Editor.
In most cases, you will not need to change any of the settings of this section. The File text box specifies the file where the World is saved. It is not necessary to enter anything here, a file name will be generated automatically if you leave it blank. If you enter a file name, it will override the default name. This means that you can create a copy of a World by editing it, giving a new file name, and then saving. Note, however, that for the World to be recognized and listed in the World Selector, it must have the .wrl extension, and must be in the directory where KildClient stores its files (~/.kildclient under Linux and other UNIX-like systems). Another thing that can be configured in this section is the character set used by KildClient. If you do not know what is that, then simply ignore it and do not change anything. If you do know, just select the character set that is used by the MUD from the combo box. However, keep in mind that internally KildClient works with the UTF-8 character set. The only things that are changed by the selection you can make in this section are what is output by the MUD and what is sent to the MUD. You can configure some aspects of the editors for triggers, aliases, macros, timers and hooks (all displayed in the World Editor). You disable the confirmation dialogs that appear when you try to delete a trigger, alias, macro, etc. from one of the graphical editors. If you disable the Ask for confirmation before deleting triggers, aliases, etc. there will not be a confirmation dialog and the item will be deleted immediately. Be warned that if this is unchecked and some item is deleted, you will need to create it again if you delete it by mistake. You can also show triggers and other objects defined by plugins that are currently loaded. By default they are not shown, but you can change this cheking the Show items defined by plugins checkbox. Note, however, that while having that option checked will allow you to edit, delete and reorder the items defined by plugins, these changes will not be made in the plugin file, and the next time the plugin is loaded, the items will be as they were before. You can use the editors to make changes and tests, but you will need to alter the plugin file afterwards. Another configuration option in this screen is whether the TCP Keep Alive setting is enabled for the connection established to the World. TCP Keep Alive is a feature of the TCP protocol that causes packets to be sent to keep the connection alive if no data is transferred for a period of time. By default it is disabled, but if you need this you can enable it here. The time that the connection must be idle before a Keep Alive packet is sent is set by your operating system. KildClient only enables the "Use Keep Alive" flag in the socket used for communication, but does not try to set the parameters involved in this operation. The way to set the intervals depends on the operating system. Finally, it is possible to disable the use of the up and down arrow keys to navigate between commands saved in the command history. If the box is checked, then you will need to use Alt+up and Alt+down to navigate. The arrow keys will retain their normal behaviour. This option may be necessary when using some input methods that use the arrow keys as part of the input process.
Configuring KildClient The previous Chapter described how to configure a World. Those settings are individual for each World. There are some settings, however, that apply to KildClient as a whole, which will be described in this chapter. To access those settings, use the Preferences Preferences menu. The following sections will describe the groups in the Preferences dialog. Appearance The figure below shows the Appearance section of the Preferences dialog:
The Appearance section of the Preferences dialog The Appearance section of the Preferences dialog.
In this section you configure the colors that KildClient uses for its own purposes. (The configuration of the colors that the MUD displays is explained in .) Two colors can be configured: Informative messages is the color used by KildClient to print messages about the status of the connection, such as the ones showing that a connection is being tried or has succeeded. Command echo specifies the color in which the commands you send to the World are printed in the screen (if this feature is enabled, see ). In each case, select from the drop-down list the color you want. Note that the actual color that is displayed depends on how it was configured in the World Editor (see ). How the tabs representing the open worlds are displayed is configured here. They can be at the top, bottom, left or right. Select the one you want from the combo box. You can also select whether to show tabs if there is only open open world, or hide the whole tab bar in this case. Finally, you can enable or disable the Flash window when new text is received feature. When it is enabled, if text is received in the mud while you are at another window, KildClient's window will flash to draw your attention. If disabled, you can still know that new text has been received because the titlebar will have a (*) prepended. Note, however, that the exact behaviour of this feature might depend on your Window Manager, and that some window managers do not do anything for windows with the "Urgent" flag set.
Sending The figure below shows the Sending section of the Preferences dialog:
The Sending section of the Preferences dialog The Sending section of the Preferences dialog.
In this section you configure the default paramenters used when sending several commands at once. This setting is used in the Command History () and Multi-line Send () dialogs. You specify the number of commands or lines that are sent simultaneously, and the delay between sending each group of commands/lines (containing the specified number of commands/lines, naturally). Note, however, that the values you set here are only defaults, you can change the values in the dialogs of those features if you need so.
External Programs (Linux) This section of the Preferences dialog only appears when KildClient is run in Linux. The figure below shows the External Programs section of the Preferences dialog:
The External Programs section of the Preferences dialog The External Programs section of the Preferences dialog.
In this section you can configure the command that will be run when you right-click in a URL that appears in the MUD window and select Open Link. The command will be executed, with %s replaced with the URL's address. The ampersand (&) in the end means that the command is to be executed in the background, so that you can continue using KildClient while browsing the URL. You can also set a command used to play audio files (see ). Enter the command, with %s in the place of the file path. The default should work (it uses the SOX program, which is usually installed), but you can use other commands if you use ALSA, ARTS, ESD, JACK, etc.
Proxy The figure below shows the Proxy section of the Preferences dialog:
The Proxy section of the Preferences dialog The Proxy section of the Preferences dialog.
In this section you configure the default proxy settings that will apply to Worls that are configured to use the global proxy configuration. It is possible for individual worlds to override the settings configured here, see . The default setting is No proxy, which means connect directly to the MUD's host. Alternatively, you can use a SOCKS4, SOCKS5 or HTTP server. You must provide the proxy server hostname or IP address and the port to connect to. If the proxy requires authentication, supply the credentials in the Username and Password fields.
Menu Reference This chapter will describe all the menus and their commands in KildClient. World menu Open This menu command opens the World Selector dialog for you to connect to a World, either a saved one or a new one. You can also edit the saved worlds from the World Selector dialog. See for more information on opening Worlds. Reconnect If you are not connected to a World, but have it still open (in offline mode), use this menu to connect again to the World. If you are connected, this command closes the current connection and reopens it. Disconnect This command closes the connection to the World. Note that this is not the recommended way to exit from a MUD, you should use the proper command (generally quit). Connect to Another This command opens the World Selector (see ) for you to connect to another World using the same tab. If you are still connected to a World, the connection will be closed. Close This command closes the connection to the World (if it is open) and closes the current tab. If this is the only tab, the program is exited. Edit This command brings up the World Editor for you to configure the World. See . Save This command saves any changes made to the World to the disk so that they are made permanent. Note that whenever a World is closed, it is automatically saved before. Statistics This command opens a dialog showing some information and statistics about the currently open World. If the version you are running supports SSL and you are connected using SSL (see ), some information about the SSL session and the certificate are displayed. Previous and Next These two commands allow you to navigate between the open Worlds, going to the next or previous tabs, repectively. Quit This command exits KildClient, closing any open Worlds. If an open world has "OnCloseConnected" hooks (see ), they are executed. If there is at least one open world without such hook, you are asked for confirmation first. Edit Menu Cut This command copies the text selected in the command entry box to the clipboard and deletes the selected text. Copy This command copies text either from the MUD (that is, in the output window) or from the command entry box to the clipboard. If there is text selected in the main window, than this text is copied. Otherwise, if there is text selected in the command entry box, it is this text that is copied. Paste This command pastes the text in the clipboard to the command entry box, possibly overwriting any selected text. Delete This command deletes the text selected in the command entry box. Find and Find Next These commands are used to search for some text in the output buffer. Their use is described in . Input Menu Clear This command clears the command entry box. The same can be achieved by using the button to the left of the command entry box. Previous and Next These commands retrieve the previous or next command in the history, putting them in the command input box. They are equivalent of pressing Alt+Up or Alt+Down (or just the arrows, in some circunstances). Find Previous and Find Next These commands search the command history for a command that starts with the text that is in the input bar. To use that feature, enter the first characters of the command you want to retrieve and select Find Previous. You can navigate through other commands starting with that prefix with these menu entries. Command History This command allows you to review the commands that have been sent recently, and send one or more commands again. When you select the menu item, a dialog like this appears:
Command History Dialog The Command History Dialog.
The list on the left shows the commands which are saved. You can configure how many commands are saved, see . To send again commands to the World, select the commands you would like to send and press Send. Since most MUDs cannot handle too much user input at once and disconnect you in this case, you can add a delay after each sent command, so that the commands are not sent all at once, but with pauses. You can specify the delay and also how many commands are sent at one time. The delay is added after each group of sent commands. You can also press Send & Close to send the selected commands and close the dialog afterwards. You can also put a command in the command entry box to edit it. To do so, select a command (in this case you must select only one) and press Recall. If you press Recall & Close instead, the command is recalled and the dialog is closed. To search for commands containing a given string, used the Find and Find Next buttons. Use the former one to start a search, and the later to find more commands with the string. To start another search, use Find again.
Multi-line Send This command allows you to send several lines of output and/or a file to the World. When you select the menu item, a dialog like this appears:
Multi-Line Send The Multi-Line Send Dialog.
You can send a file to the World, and you can also send text before and after the file if you need. Naturally, you can also send only some text without sending a file. Just leave the fields you don't need blank. It is also possible to prefix all the lines with a string (such as chat), or to add a string to the end of all lines. If you want that, fill in the appropriate fields, if not, just leave them blank. Most MUDs cannot handle too much user input at once and disconnect you in this case. To avoid that, you can add a delay after each sent lines, so that the text is not sent all at once, but with pauses. You can specify the delay and also how many lines are sent at one time. The delay is added after each group of sent lines. If you select "Keep dialog open after sending", the dialog will not be closed after the text starts to be sent, so you can make further changes to the text.
Test Triggers This command brings up the Test Triggers window, which is described in .
Preferences Menu Disable Triggers, Aliases, Macros or Timers If each of these menu entries is checked, then the corresponding automation feature is disabled: lines are not matched against triggers, aliases do not replace typed commands, macros and timers do not run. Use them if you want to temporarily disable all of them, since the triggers, aliases, macros or timers are not deleted. Debug Matches If this entry is selected, whenever a trigger or alias matches, information is printed about it. The information is printed on stdout, which means you must start KildClient from a terminal. Preferences This command opens a dialog where you can configure some aspects of KildClient global to all Worlds. See . Edit Default World This command opens a dialog where you can set some default parameters used for Worlds. For example, you can define your preferred font or colors, and all new Worlds will use these default font and colors. The things that can be set are described in , but not all things described there can be set as default parameters. (There's no sense in having a default World name, for example.) Diplay Menu Split screen This option toggles displaying or hiding another window with the output from the world, so that you can see both the text as it is received and some other part of the scrollback buffer. See . Help Menu Help This commands opens a browser showing the KildClient manual (which you are reading now). About This commands shows a window with some information about the program.
Using Perl in KildClient This chapter will describe briefly how to use Perl (Practical Extration and Report Language, or, according to some, Pathologically Eclectic Rubbish Lister) in KildClient. Even though it will give a few examples of things that would certainly be known already by people who know Perl, this Chapter is not meant to be a Perl tutorial. If you want to learn Perl from the start, you should read its man pages, find a tutorial or a good book on the subject (there are plenty of these). Some knowledge of Perl will certainly help in understanding this Chapter. The Basics KildClient has a built-in Perl interpreter. To run a perl statement, just type if preceded by a slash (/) in the command entry box. The statement will be executed by the Perl interpreter instead of being sent to the MUD. The statement can be anything that Perl will accept. You can actually execute several Perl statements if you separate them with ; (no need to add / again, just once in the beginning of the line). You can call sub-routines, execute conditional or loop constructions, call a built-in function, do variable assignments, or even define a sub-routine. However, the statement must be complete. You cannot enter something like /$myVar = and then enter /"some_value";, the statement must be complete in one line. Technically, each line you enter is executed inside an eval block, so anything you want executed must be valid code inside an eval block. All built-in Perl functions are accessible for you to use, and you can load Perl modules and use their functionality. However, that is not enough, because Perl's built-in functions will not allow you to interact with the World. Because of that, KildClient defines a set of functions that you can use to interact with the World. A full list describing them detailedly is found in , but some of the most useful ones will be described in this Chapter. Many of these functions deal with creating and editing triggers, gags, aliases etc. These will be described in the corresponding chapters. It is possible to get help on all functions using the help function. It takes as argument the name of the function. Note that since help is nothing else than another Perl function, the name of the function for which you want help is just an argument to it, and must be passed as a string. That is, to get help on the echo function, type /help "echo". (Naturally, you can enclose "echo" in parenthesis, but this is not necessary.) Some functions are in a way global, that is, they do not refer to a specific world. One such example is colorize (see ), which inserts ANSI color codes in strings (useful when you want to print something in the screen). These are called like any built-in Perl function. For example, if you enter /$colorstr = colorize("&WI'm in white!"), the variable $colorstr will hold a string that would be printed in white. Many functions, however, are specific to a World, such as echo (see ), which prints something in the World window (but does not send it to the World). Because of that, they are called in a slightly different way. To print that string which has just been created, you would enter /$world->echo($colorstr). Those that know Perl will recognized this as a method call of the $world instance. Indeed, $world is an instance of the class World class. This class defines several functions that allow interaction with a World. On start-up, the $world variable is created and references the current World. It is also possible to control other worlds, if you have a variable pointing at them. You can get such a variable with the getworld function (see ). In that case, you should use the variable you got instead of $world. If all the above did not make sense to you, do not worry. Just remember that many functions have to be called by adding $world-> to the front. These functions will always be listed with that in front. When a World is opened, the Perl interpreter reads and executes a file you specify. (See for information on how to specify the file.) In this file, you can define sub-routines and variables. They will be then available for you to use during your session. If you define a sub-routine called sendGreetings, you can type /sendGreetings and the sub-routine will be executed. Or, if you define a variable, you can use it anywhere. It should be noted that each World has its own Perl interpreter, with its functions and variables. What you do in one World does not affect the others. Echoing and Sending Text As mentioned in the previous section, the $world->echo function is used to print (or echo) text to the MUD window, without sending it to the World. It works like the print built-in function: it accepts any number of arguments, and echoes all of them, sequentially. For example, $world->echo("Variable var contains ", $var, ".\n") would print the first string, followed by the contents of $var, followed by a period and a new line. Of course, you could do all that in a single string using variable interpolation. A variant of $world->echo is $world->echonl. The difference is that $world->echonl always prints automatically a newline after each argument. This is just a shorthand to make some things simpler and possibly more readable. Similar to $world->echo is the $world->send function. This function sends something to the MUD. For example, $world->send("who") will have the same effect as if you had typed who in the command entry box and pressed ENTER. Note that you do not have to add a newline to the end of the line to send, because send automatically sends a newline after each argument (since commands must be terminated by a newline for the MUD to recognize them). It is possible to pass several arguments to send. If you do so, each argument will be sent as a separate command. For example, $world->send("who", "look") will first send a who to the MUD, and then a look, just as if you had typed each of these commands in order. All the examples given above did nothing that could not be done without Perl, and using send for that was actually less efficient that typing the commands directly. However, when combined with variables and/or control flow structures, send can actually be quite useful. Paths and Speed-Walking A useful feature of some MUD clients, which KildClient implements, is the support for speed-walking. This feature allows you to define paths to go directly from one place to another without having to type a lot of movement commands. For example, suppose that to go to some place from a fixed point (such as the center of a town) you need to take the following directions: s s s e e s e e e e n nw n. This is often written in a more compact way as 3s 2e s 4e n nw n. KildClient allows you to send to the MUD all the 13 required commands in a single command. To do that, use the $world->path function. For example, if you enter /$world->path("3s2es4en{nw}n") in the command line, 13 commands will be sent to the MUD: exactly the 13 that form the path defined above. Note the syntax: the movement commands are defined one after another, optionally prefixed by a number, which determines how many times that command will be sent. So 3s means send s three times. If there is no number, the command is sent only once. Note also that the command to move to the north-west is enclosed in braces: {nw}. This is because if the $world->path function sees nw, it will think you want to move to the north than to the west. Enclosing it in braces causes $world->path to see that as a single command. Should you need to move several times to the northwest, you can add a number before: 4{nw} will send nw four times. Naturally, you can include any command that is not a single letter in braces to force $world->path to see it as a command. It is likely that some paths will need something like {open door} in the middle. Of course, simply entering paths in the command line is not that useful. But you can store the path in a variable, and then just call $world->path($stored_path). Just add a line that defines the variable to you script file (see ), and you will be able to use the variabled anywhere. Alternatively, you can define an alias (see ) or a macro (see ) to execute your path even faster. The easypath plugin does that, see section . Playing Sounds To play a sound (for example, as the action of a trigger, to call your attention), use the play function. Pass it the path to the sound file, for example: /play("/home/joe/sounds/beep.wav"). Under Windows, this function supports playing WAV files. Under Linux, you must set-up a command to play sounds, see . Saving Variables Permanently You can define variables for use in your Perl scripts. Since KildClient has a full-featured Perl interpreter, you can use all kinds of variables Perl supports (scalars, arrays, hashes, and even references to build complex data structures), and you use them just like you would in Perl. However, when you close the World, the variables and their values are lost. However, it is often desirable to keep the values of variables across sessions, and KildClient has a mechanism for that. A variable can be made permanent. All variables that are marked as permanent will be saved when you close the World, and will be reloaded from the saved values when the World is opened again later. This way, their values are saved across sessions. To make a variable permanent, open the World Editor (see ) and select the Variables section inside Automation. There you will see a list of the variables that are set to be permanent:
Permanent Variables Permanent Variables.
To add a variable, click the Add button. A window will open for you to enter the name of the variable. To make one or more variables temporary again, select them and press Delete. They will be removed from the list. Finally, if you mispell the name of a variable, select it and press Edit to correct it. You can also change the order of the variables with the Up and Down buttons. This is usefor for grouping similar variables together, but does not otherwise affect the saving of the variables. Permanent Variables in the Command Line It is possible to make a variable permanent from the command line. To do that, use the $world->makepermanent function, passing the name of the variable as the argument. Note that since you must pass the name of the variable, you must use quotes, and preferably single quotes so that the variable does not get interpolated. For example, to make the variable $kill_count permanent, run $world->makepermanent('$kill_count'). Now when you close the World, the value of $kill_count will be saved, and when you reopen it later, the value will be restored. It is possible to make more than one variable permanent at one time, just pass all their names as arguments to $world->makepermanent. If you want a variable to stop being permanent (that is, to become temporary again), use the $world->maketemporary function. It is called just like makepermanent, and has the opposite effect. To get a list of the variables that are currently permanent, use the function $world->listpermanent. This function has no arguments, and prints all the names of the variables that are permanent.
Controlling Worlds with Perl In it was explained that you can disconnect from a World with the $world->dc function. It now should be clear why there is a $world-> in front. Another function that you know already is $world->close, to disconnect and close a World. There are a few more functions that allow you to control Worlds from Perl. The $world->next and $world->prev move to the next or previous world in the list of tabs. It is also possible to pass an argument to them, specifying how many Worlds to move. So, $world->next(2) moves two Worlds forward, and $world->prev(3) moves three Worlds back. To go to a specific World, use the gotow function (which does not belong to the World class, since it does not depend on a particular World), passing as argument a string with the name of the World. Finally, you can use the quit function to disconnect and close all Worlds and then exit KildClient.
Triggers Triggers allow you to react automatically to text that comes from the MUD. This reaction can be of two forms: sending something to the MUD in reply, or doing something else with no direct interaction with the MUD, such as printing something in the screen. Sometimes the action of a trigger is to change the line that was received and that activated the trigger. You might want to match all lines that contain a certain word (such as your character's name) and print these lines (or part of these lines) in a different color to draw attention. (This feature is sometimes called highlighting.) Additionaly, sometimes you might want to omit some lines, such as everything said by some annoying player, or some messages that are not relevant for you. This kind of trigger is often called a gag. Both these features are supported by KildClient. Triggers are defined by specifying a pattern against which all lines received from the MUD are matched. If there is indeed a match, an action specified by you is executed. If the trigger is a gag, then the line that matched will not be printed in the screen, otherwise it is printed normally. (Note that printing actually happens before the action is executed, even if here things were described in another order for ease of understanding.) The above description was very brief and was meant just to give a basic idea of how triggers work. Next follows a more detailed explanation of all aspects involving triggers. Creating and Editing Triggers The easiest way to create and alter triggers is from the World Editor, the place where all settings of a World are altered (see ). Trigger are defined in the Triggers section inside the Automation section. When you open that section, you'll see a list of the defined triggers and some buttons like this:
The graphical Trigger editor The graphical Trigger editor.
The main part of the window is the list of defined triggers. The columns are as follows: Enabled specifies whether the trigger is enabled or not. Triggers that are not enabled are not active and will not be tried when a line is received, but they remain in the list so that they can later be enabled again. Name is a name that is assigned to a trigger. This helps you identify the trigger's purpose and is useful when editing a trigger via the command line (as described in ). Assigning a name to a trigger is optional. Pattern and Action are the parameters for the trigger, and they define the trigger's action, as described above. I Case (for "Ignore Case"), if set, means the case is not considered while matching the pattern, that is, a case-insensitive match is done. Gag defines if the line that matches the trigger will be printed. If this is active, the line is gaged (omitted) from the main screen. Gag Log defines if the line that matches the trigger will be written to the log file. If this is active, the line is gaged (omitted) from the log file, if logging is enabled (see ). Keep Exec defines what happens when the trigger is matched. By default, if a trigger matches further matching of that line against other triggers is stopped. If, however, this option is active and the trigger matches, the line continues being tried against other triggers. Rewriter defines if the trigger is a rewriter trigger, a special kind of trigger described in . Plugin: if this is non-empty, it means that the trigger belongs to a plugin (and the name of the plugin is displayed). However, by default plugin triggers are not displayed. See for information on how to display plugin triggers here. Adding Triggers To add a new trigger, press the Add button. This will open a window for you to edit the new trigger's parameters:
The window to edit triggers The window to edit triggers.
What can be set represents the columns described above. When you are finished, press OK and the trigger will be added. If you change your mind, press Cancel and the trigger will not be added. The next sections will describe some things that can be done with triggers.
Editing Triggers To edit a trigger, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding trigger (see ) will be opened, filled with the trigger's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the trigger will remain as it was before. Another shorter way to edit a trigger is to double click its line in the list. It is also possible to change the value of the boolean options (those represented by a check box) directly from the trigger list. Make sure that the trigger you want to change is selected, and click in the check button. The state will be toggled. To delete a trigger, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the trigger. If you want, you can disable this confirmation dialog (see ), but if you do so and click the Delete button, the only way to undo your action will be creating the trigger again. To delete several triggers at once, select them all and press Delete. The final thing that needs to be explained with regard to triggers is how to reorder them. Triggers as tried from the first one to the last, so in a few cases the order might matter. To move a trigger up or down in the list, select it and press the corresponding button.
Basic Triggers The simplest kind of trigger specifies only a pattern and an action. Below these parameters are described in detail. What exactly is pattern? It is a regular expression. In short, a regular expression is a way to specify text patterns that are looked for in the lines that the server sends. If you know Perl, you certainly know what is a regular expression. If not, it is advised that you look for some more information on it, there are plenty of tutorials on the Internet. For those who know them, you can use the full power of Perl's regular expressions in triggers, because Perl is used for the matching. What about the action? It can be anything that could be entered in the command line. It can be a simple command, that is sent to the MUD. Or you can send several commands at separating them with %; as described in . Finally, you can execute some Perl code when a trigger matches, and this allows you to do virtually anything you want. Below is an example of a very simple trigger. To create this trigger, inform the Pattern and Action parameters shown below. Leave the other parameters in their default values. A very simple trigger Pattern: has attacked you! Action: wield sword Whenever a line that contains the phrase "has attacked you!" is received, the command "wield sword" will be automatically be sent. Note that in this case the received line will probably be something like "An orc has attacked you!", but the trigger matches because that line contains the pattern. This is a feature of regular expressions. If you want to match the entire line and not only part of it, you must use the ^ and $ anchors in the beginning and end, respectively. By default, case is considered when matching: if the server sent a line saying "Has Attacked" then there would be no match. To make case be ignored when matching, check the Ignore case when matching option. It is also possible for the action to be executed to depend on what was received from the server. This is better explained by an example: A trigger which captures part of the received line and uses it in the action Pattern: ^(.*) has attacked you!$ Action: cast missile $1 There are two new things in the pattern. The first one is that is surrounded by ^ and $ which means that the entire line must match, as described previously. The other new thing (and the one that concerns us at this moment) is the (.*) part. In regular expressions, the dot means to match any character. The asterisk means zero or more of the previous element. So the combination .* means zero or more of any characters. Essentially, it matches anything. The brackets () around any part of a regular expression captures part of the string to be used afterwards. So the whole regular expression means: look for a line that contains something followed by has attacked you!. What comes before has attacked you! is stored for later use. This stored string is then used in the action by means of the $1 construct. This special placeholder is substituted by what was captured in the matched string. So if the line Orc has attacked you! is received, cast missile Orc is send. If Smaug has attacked you! is received, then cast missile Smaug is sent to the World, and so on. It is possible to have more than one captured string in the pattern. In this case, $1 is replaced by what was captured in the first group, $2 by the second group, and so on. Sending commands to the World is useful, but the real power is the fact that you can also run Perl commands in response to triggers. Just enter them as you would in the command box: prefixed by /. If the action is simple you can enter the statements there directly, if not, you can define a function in your script file and call it from the trigger. Let us rewrite to use Perl in the action: A trigger with an action in Perl Pattern: ^(.*) has attacked you!$ Action: /$world->send("cast missile $_[1]") This time, when a line consisting of some arbitrary text followed by "has attacked you!" is received, the $world->send will be called to send some text to the World. You may have noticed that here $_[1] was used instead of $1 in the action to represent the first captured bracketed group. The reason for this is complex, and if you do not want to worry about the inner workings, just use the following rule: in commands sent to the mud, use $1, $2, etc., and in actions that are Perl commands, use $_[1], $_[2] and so on. Here are the details for the different syntaxes. Feel free to skip the next two paragraphs: When a trigger matches, KildClient substitutes $1 (and the other placeholders) by the captured expressions from the received line. However, $_[1] (and the other similar tokens) are not replaced by KildClient. If the action is just a string sent to the mud, they would not be replaced, so the only possibility to use the captured groups is with the $1 syntax. But Perl commands can access the captured groups in another way: the strings are stored in the @_ array. The first position, $_[0] contains the whole matched line. Subsequent positions contain each matched grouped expression, so $_[1] is the first bracketed substring, $_[2] is the second, and so on. This way, when a Perl command is executed the values are replaced by the Perl interpreter itself. It is also possible to use $1 in commands to be passed to the Perl interpreter. Most of the time it will work, but in some specific circumstances you may get unexpected results. So it's preferable to let Perl do the substitution when commands are to be run by the Perl interpreter. If you call a sub-routine as the trigger action, the matched arguments are not automatically passed, so you need to pass them manually. Since they are in the array @_, just pass that whole array as the argument to the sub-routine. Inside the sub-routine, they will be available as the sub-routine's arguments, which incidentally means that they will be accessed in the exact same way: with $_[1], $_[2] and so on. Alternatively, you can only pass the parameters that you need instead of the whole array. Here's an example of a trigger that calls a sub-routine: A trigger that calls a sub-routine Pattern: ^(.*) has attacked you!$ Action: /myGreatAttackSequence(@_) Naturally, you need to define the myGreatAttackSequence sub-routine in your script file. It will be called as the result of the trigger. The @_ array, containing the whole matched line and the matched bracketed expressions is passed to the sub-routine as argument, and its contents will be available to the sub-routine as its parameters. Changing the Style of the Matched Text It is possible to cause a trigger to change the style of the line that matched (or of a part of it). This can be used, for example, to make some text that interests you stand out. To do that, enable the Change Style check box in the Edit Trigger dialog (see ). The Configure button then allows you to set the style to be applied. When pressed, it brings up a window like this:
The window to configure style The window to configure the style to be applied.
First you should select what is going to have the style changed. The style can be applied to the whole line that matched against the trigger, to the part of the line that matched the trigger pattern, or the the part of the line that was captured by one of the parentheses in the pattern (if they are used, naturally). Next you can configure the style to be applied. You can change the color of the text, and apply or remove italics, strike-thru and underlining. In all these options, the default is "Do not change", which means that the trigger does not affect the style as sent by the MUD. If you select some option, then your selection will override the style that the MUD sends.
Gags Now that the basic usage of triggers has been explained, let us see some more advanced features. In KildClient, gags are just a special kind of trigger with the "gag" flag activated, and they behave just like other triggers, with the exception that the line that matched the pattern does not get printed in the screen. It is possible to have a gag that executes an action when triggered, just like with non-gag triggers, or it can be a simple gag, which prevents the line from being printed but does nothing else. To specify that a trigger is a gag when it is created, just check the Omit (gag) from output checkbox when creating the trigger. Let's create a simple gag to omit all that is said by Joe, a very silly and annoying player: A simple gag Pattern: ^Joe chats Action: /$world->echonl("Joe said something silly here.") Omit (gag) from output: Checked This trigger is a gag, and whenever a line starting with "Joe chats" is received, it will not be printed. Instead, the code specified in the action will be executed, and that code will print a message that tells you that Joe said something, but does not tell what, so you do not need to worry. That is good, but can get even better. We do not need to know that Joe said something, it would be better if we could ignore him altogether. And we can. It is not necessary to specify an action for a gag trigger. In this case, nothing will be done, but the matched line will not be printed. So our example becomes: A gag with no action Pattern: ^Joe chats Omit (gag) from output: Checked The action has simply been omitted, but the check box that specifies that we are creating a gag trigger remains, naturally. Sometimes you want to change the way a line is displayed, such as rearranging the information so that it appears in another way. The way to do that is with a gag, and an action that outputs the modified line. Heres a simple example that changes the way a hypothetical chat channel is displayed: Rewriting a line with gags Pattern: ^(.*) chats, '(.*)' Action: /$world->echonl("[Chat] $_[1]: $_[2]") Omit (gag) from output: Checked The Omit (gag) from output check box only controls whether the line is displayed in the screen or not. If you have logging enabled (see ), a the line that matched a trigger with that option checked will be written in the log file normally. If you want the line to be omitted from the log file, you must set also the Omit (gag) from log file check box. If it is set, then the line will not be written to the log file. Note that the two attributes are independent: you can gag the line from the screen, from the log file, from both or from neither. Other trigger features By default, when a trigger matches, no more checking is done. So if a line would match two or more triggers, only the first would have a successful match and have its action executed. The other ones wouldn't even have a chance to try a match. If you check the Keep executing triggers after this one matches option, then even if this triggers matches it does not prevent other triggers from being tried. So, if a second trigger matches, the actions of both will be executed. Note, however, that unless this second trigger also has the same option checked, trigger matching will stop at that second trigger. If you are having trouble with triggers and want to be informed whenver a trigger matches, enable the Preferences Debug Matches menu. When this is enabled, information about each matched trigger will be printed to stderr. (This means you must start KildClient from a terminal to see the output.) Rewriter Triggers Rewriter triggers are a special kind of trigger that allows something not possible with ordinary triggers: changing the received line so that futher triggers work on this changed line. As mentioned above, the $colorline variable holds the entire line that matched the trigger, including ANSI color codes. Rewriter triggers can alter this variable, and then the other triggers will match on this changed line. Rewriter triggers run before normal triggers. Also, the Keep executing option (see ) is not considered for them: they never stop processing of other triggers, even if that option is not set. The gag options are also not significant for a rewriter trigger; they are always ignored. Let's see an example of where rewriter triggers can be useful. Suppose you do not want to see an offensive word that might appear in the MUD. A first attempt at filtering could be a trigger like this: A profanity filter that does not work Pattern: fuck Action: /$colorline =~ s/fuck/f***/; $world->echo($colorline) Omit (gag) from output: Checked This works for simple cases, but it is most likely not what you want. Suppose you have a trigger that captures messages sent from a specific channel (such as the one for telepathic communications) and does something, such as changing the presentation of the message or sending them to another window. If someone sends a message over that channel with the f-word, the channel-capture trigger will not work because the line has already been caught the the profanity-filter trigger above. You'll see the message with the bad word filtered, but it will not be captured as a channel message. You might think about setting the Keep executing option in the profanity-filter trigger, but that would not solve the problem. That trigger would match, and print in the main window the line just with the word filtered. And then the original line would match against the channel-capture trigger, thus acting upon the channel message, but with the bad word intact, because the trigger did not change the line. So you would end up seeing the message twice, but neither case in the way you want. The solution to this problem is to use a rewriter trigger to filter the bad word before other triggers have a chance to see the line. Our profanity-filter trigger should be like this: A profanity filter using a rewriter trigger Pattern: fuck Action: /$colorline =~ s/fuck/f***/ Rewriter trigger: Checked Note that the line is not printed. Rewriter triggers generally need not print anything, because if no other trigger matches the line, it will be printed (with the changed contents). If another trigger matches, let this trigger decide what to do. Now everything should work: when any line with the f-word is seen, this word is filtered out and the line is changed. If this was a channel message, the channel-capture trigger will see the line with the offensive word filtered and display the message in your special way without the bad word. Defining Triggers in the Command Line For those more used to Perl and to command lines, it is also possible to define and alter triggers from the command line. This is done with a series of Perl function. Triggers are defined with the $world->trigger function. There are many ways to use this function, and we will start describing them here. The simples way to use that function is with two arguments: $world->trigger(pattern, action). This defines a trigger that will match against pattern and execute action when a match happens. Here's how to define the trigger in in the command line: A very simple trigger defined in the command line $world->trigger('has attacked you!', 'wield sword') To specify other trigger features an extra argument is passed to the trigger function. For those that know Perl, it is a reference to a hash, and this hash can contain some attributes specifying the trigger's behaviour. For those that do not understand the previous sentence, do not worry, the examples should make the usage clear. Let's re-create a simple gag to omit all that is said by Joe (see ): A simple gag (in the command line) $world->trigger('^Joe chats', '/$world->echonl("Joe said something silly here.")', { gag => 1 }) See the difference? There is a third parameter, enclosed in curly braces {}, with the word gag, an arrow, and the number 1. What that means is that gag has the value 1, or, as usual in computer languages, is true. (False would be zero.) Often gags do not have any action: A gag with no action (in the command line) $world->trigger('^Joe chats', { gag => 1 }) The action has simply been omitted, but the argument that specifies that we are dealing with a gag remains, naturally. As a matter of fact, this kind of gag (with no action) is quite common, and there is a shorter way to do that. The command below has the exact same effect as the previous one: A shortcut function to define gags $world->gag('^Joe chats') The gag attribute only controls whether the line is displayed in the screen or not. If you have logging enabled (see ), a the line that matched a trigger with the gag attribute will be written in the log file normally. If you want the line to be omitted from the log file, you must set also the gaglog attribute. If it is set, then the line will not be written to the log file. Note that the two attributes are independent: you can gag the line from the screen, from the log file, from both or from neither. To make case be ignored when matching, use a very similar construct as the above, but using the ignorecase attribute: A case-insensitive trigger $world->trigger('^.* chats ".*joe.*"', '/callAttention()', { ignorecase => 1}) Another attribute that can be set for triggers is keepexecuting, corresponding to the Keep executing triggers after this one matches option (see ). This flag is specified just like gag. Just add the parameter { keepexecuting => 1 } to the function call. It is possible for a trigger to be both a gag and have the keepexecuting flag. In this case, include both in the last argument: { gag => 1, keepexecuting => 1 }. Note it is just one argument, with both flags separated by a comma. The order does not matter, keepexecuting could have come before gag. Similarly, rewriter triggers (see ) are created with the rewriter flag. Editing Triggers In the previous sections it was shown how to add triggers, but nothing was told about how to change them after they are defined. This and other points will be addressed in this section. Before going into editing, let us see how to get a list of all triggers that are currently defined for the World. Just use the $world->listtrigger function without arguments. You will be presented with a list of the currently defined triggers. There are several columns: Num is the number of the trigger. Triggers are numbered sequentially starting at zero. This number will be useful when we start editing triggers. Next comes gag, which tells whether the trigger is a gag (for the screen). Next is GLo, which means "Gag from Log", and shows whether the line is omitted (that is, not written) in the log file also (if logging is enabled, of course). After that, Ena tells whether the trigger is enabled. Triggers that are disabled are not matched. This is a nice way to stop a trigger, but keep it stored for later use. We will see how to enable and disable triggers later in this section. Next there is KeE, which reports the status of the keepexecuting flag for the trigger. After that, IgC specifies the case is being ignored. The final two columns list the pattern and action of the trigger. The listing produced by $world->listtrigger is compact, showing all triggers but possibly truncating the pattern and/or action. If you give a trigger number as argument to listtrigger, it will display that trigger's information detailedly. To edit a trigger, you need to know that trigger's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->gettriggernumber can be used to discover a trigger's number if its name is known.) The same function used to add triggers can also change existing ones, you just need to pass the trigger number as the first argument. Calling $world->trigger(number, new pattern) changes the pattern of the trigger with that number. If you want to change the pattern and action, include the action as a third argument: $world->trigger(number, new pattern, new action). What if you want to change only the action? Since passing only one string argument would change the pattern, this is done in a different way, using the same hash that is used to pass attributes to the trigger. In brief, this is how you would change only the action: $world->trigger(number, { action => new action }). Notice that the action is passed as an attribute inside the curly braces. It is also possible to change the pattern this way, just use the attribute pattern. Naturally, it is possible to attributes such as gag or keepexecuting. The syntax is the same, include the new value inside the curly braces. To clear one of those flags, use the value 0, which means false. The example below makes trigger number 2 stop being a gag, and at the same time sets it not to prevent matching of other triggers: Changing several attributes at once $world->trigger(2, { gag => 0, keepexecuting => 1 }) It is also possible, naturally, to change attributes such as pattern or action at the same time that gag or keepexecuting are changed. All these attributes are equal, the only difference is that since the pattern and action are used much more often, there is a shorter way of specifying them. But even when you create a trigger you can use this extended syntax. could be also entered this way, with the exact same results: A very simple trigger, in another way $world->trigger({ pattern => 'has attacked you!', action => 'wield sword'}) The final attribute for triggers is enabled. It was mentioned briefly when we described how to list triggers. It can be set just like the other attributes, and like keepexecuting or gag it is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the trigger is matched normally. When it is zero, received lines are not matched against it. This way, disabling a trigger effectively turns if off, as if it did not exist, but the trigger is still saved, and can be turned on again when necessary. Here's an example of disabling a trigger (number 3 in this case): Disabling a trigger, the long way $world->trigger(3, { enabled => 0 }) However, there is a shorter way: the $world->distrigger function disables the trigger whose number is passed as argument. So the example above can be rewritten in a shorter way as: Disabling a trigger, the short way $world->distrigger(3) The corresponding function $world->enatrigger enables the specified trigger. It is also possible to temporarily disable all triggers. Just use the menu Preferences Disable Triggers and this will prevent triggers from running. This does not change the "enabled" status of any triggers, it just prevents all triggers from running. When you select the menu again, triggers that were enabled will run again, and those that were disabled will remain disabled. There are times when you want to delete a trigger. This is easy to do, use the $world->deltrigger function. It takes as argument the number of the trigger you wish to delete. Be aware that once deleted it is not possible to recover the trigger (unless you create it again). Many times just disabling the trigger is a better idea. The second thing to note is that when you delete a trigger the numbers of the other triggers may change, so be careful when you try to delete several triggers in sequence. Assigning Names to Triggers It is possible to assign names to triggers. When a trigger has a name, you can enable, disable, or delete it using its name instead of its number. To assign a name to a trigger, specify the name attribute when creating it: Creating a trigger with a name $world->trigger('has attacked you!', 'wield sword', { name => 'attack' }) You can now disable this trigger with $world->distrigger('attack'). The name can also be used in the $world->enatrigger, $world->deltrigger and $world->listtrigger functions. It is also possible to assign a name to an existing trigger. Just edit it as described in , passing the name attribute. Use this same process to change the name of a trigger. Another feature of trigger names is that several triggers can have the same name. In this case, all these triggers will be treated as a single group. The functions above, when passed a trigger name, will act upon all triggers of the group, that is, on all triggers with that name. Reordering Triggers Triggers are tried from the first to the last, so in some cases the order of the triggers matters. It is possible to move a trigger to another position with the $world->movetrigger function. The function takes two parameters: the first is the name or number of the trigger that you want to move. The second is the new position that the trigger will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of triggers, the trigger will be moved to the end of the list. If there are several triggers with the same name, only the first one found will be moved. And when a trigger is moved, other triggers might move up or down to accomodate the change. Importing and Exporting You can export triggers, aliases, macros, timers, permanent variables and hooks to a file, and them load these objects in another World. This function is accessed via the World Editor. To export some items, select them from the list. (You can select several items by holding the Control key and clicking.) Press the Export button, and a dialog will open for you to select a file name. Select a name, press Save and the selected items will be saved to the file. The export function is accessible from the editors for all exportable objects (triggers, aliases, macros, timers, permanent variables and hooks). By default, it only exports one kind of object, the one currently displayed. But you can export more than one kind of object to the same file (for example, triggers and aliases, or aliases, macros and hooks, or even all of them). To do that, select all the items you want from all the pages in the World Editor. Then, from any page, select Export. From the dialog that opens, click Items to export. Several check boxes will appear. Mark the ones corresponding to the objects you want to export, and all corresponding selected objects will be imported. After you have exported some items, you can import them in another World, even in another machine. Just open one of the editors (it doesn't matter which one, you can import triggers even from the alias editor), and press Import. Select the file from the dialog, and all items in the file will be imported and will be included in the current World. Testing Triggers You can test your triggers to see how they would react to text coming from the MUD. To do so, select the Input Test Triggers menu item, or press the Test Triggers button from the Trigger section of the World Editor. You will see a dialog like this:
The test triggers window The test triggers window.
In the first entry box, enter some text to be matched against the triggers that are defined. This line will be matched as if it came from the MUD. Then press the Send button to try the triggers. Matching is done exactly for lines that come from the server: only enabled triggers are tried, rewriter triggers are tried first and change the line, the keep executing flag is verified, and so on. After pressing Send, the results are shown in the second half of the window. The number of triggers that matched is displayed, and also all the commands that would be processed if that line came from the mud (if any). The line that would be printed to the main window is also displayed. If any gag trigger matched, that box will be empty indicating that no line will be printed. If no gag triggers matched, the line could be different because a rewriter trigger changed it. However, in most cases the line printed will be the same as the line received. Finally, you are told if the line would be written in the log file. If any gag log trigger matched the line, then it would be omitted. You can try the triggers against other lines, just enter them and press Send. Any changes you make to the triggers are used instantly, just press Send again to try the same line against the new or changed triggers.
Aliases Aliases allow you to define shortcuts for simple commands. For example, you can define df to be an alias to drink from fountain, and then you can type only df in the command line, and drink from fountain will be sent to the mud. However, in KildClient aliases can do much more. They allow you to rewrite part of the input line. In the example above, what happened is that df was replaced by drink from fountain. Aliases such as these replace the entire short command you type by a longer command, but you can also replace part of the line. If a mob has a really long name, such as Ingeloakastimizilian, you can define an alias "ing" that is replaced by "Ingeloakastimizilian", and whenever you type ing, even in the middle of another command, it will be replaced by the full name. Aliases are implemented as a substitution, just like the "Search and Replace" option found in several programs. They consist of two parts: a pattern and a substitution. Each line you type is matched against the pattern and if it matches, the matched part is replaced by the substitution. For those who know Perl, aliases work just like Perl's s/// operator. As a matter of fact, they are implemented with s///. This is more or less how the alias processing is done: $line =~ s/$pattern/$substitution/; Supposing $line holds the entered command, $pattern the pattern and $substitution the substitution. Then $line is sent to the World, possibly having been modified. If you are having trouble with aliases and want to be informed whenver an alias matches, enable the Preferences Debug Matches menu. When this is enabled, information about each matched alias will be printed to stderr. (This means you must start KildClient from a terminal to see the output.) Creating and Editing Aliases The easiest way to create and alter aliases is from the World Editor, the place where all settings of a World are altered (see ). Aliases are defined in the Aliases section inside the Automation section. When you open that section, you'll see a list of the defined aliases and some buttons like this:
The graphical Alias editor The graphical Alias editor.
The main part of the window is the list of defined aliases. The columns are as follows: Enabled specifies whether the alias is enabled or not. Aliases that are not enabled are not active and will not be tried when a command is entered, but they remain in the list so that they can later be enabled again. Name is a name that is assigned to an alias. This helps you identify the alias' purpose and is useful when editing an alias via the command line (as described in ). Assigning a name to an alias is optional. Pattern and Substitution are the parameters for the alias, and they define the alias' action, as described above. I Case (for "Ignore Case"), if set, means the case is not considered while matching the pattern, that is, a case-insensitive match is done. Eval as Perl controls how the alias is evaluated. This option will be described later. Plugin: if this is non-empty, it means that the alias belongs to a plugin (and the name of the plugin is displayed). However, by default plugin aliases are not displayed. See for information on how to display plugin aliases here. Adding Aliases To add a new alias, press the Add button. This will open a window for you to edit the new alias' parameters:
The window to edit aliases The window to edit aliases.
What can be set represents the columns described above. The only thing that needs explanation is the Eval Substitution as Perl statement option, corresponding to the Eval as Perl column. As mentioned before, aliases are actually a substitution, using Perl's s// construct. It is also possible to have aliases that use a s//e construct, that is, whose substitution is actually composed of Perl statements evaluated when a match is found. When that option is enabled, the substitution is evaluated as a Perl statement. When you are finished, press OK and the alias will be added. If you change your mind, press Cancel and the alias will not be added.
Editing Aliases To edit an alias, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding aliases (see ) will be opened, filled with the alias' parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the alias will remain as it was before. Another shorter way to edit an alias is to double click its line in the list. It is also possible to change the value of the Enabled and Eval as Perl flags directly from the alias list. Make sure that the alias you want to change is selected, and click in the check button. The state will be toggled. To delete an alias, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the alias. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the alias again. See . To delete several aliases at once, select them all and press Delete. The final thing that needs to be explained with regard to aliases is how to reorder them. Aliases as tried from the first one to the last, so in a few cases the order might matter. To move an alias up or down in the list, select it and press the corresponding button.
Using Aliases In an alias that replaces dt with drink from fountain was described. To create this alias, enter the following parameters, leaving the other options unchanged from the default values: A simple alias Pattern: ^df$ Substitution: drink from fountain You might be wondering why we use "^df$" and not only "df". Remember that aliases are just substitutions, and the pattern is a regular expression. If the anchors (that is, ^ and $) were not present, it would match against df anywhere in the line, and substitute this df even in the middle of words. wonder would become wodrink from fountainder. At times a behaviour like this (substituting anywhere) might be desirable, but in our case we want it to substitute only the whole command df, so we use the anchors. As an example of an alias that does not match only the exact command, consider this one: A slightly more complex alias Pattern: '^gra ' (without the quotes, but note the space after the word) Substitution: 'chat CONGRATULATIONS, ' (without the quotes, but note the space after the word) Whenever you enter a command that starts with gra followed by a space, that part (gra and the space) is replaced by the given pattern. So if you enter gra Bob, what will be sent to the MUD is chat CONGRATULATIONS, Bob. Since aliases are just a substitution, you can define bracketed expressions in the pattern and then use $1, $2, and so on in the substitution. Let us increment the above example to add something to the end. We will need a bracketed expression: An alias that uses bracketed expressions Pattern: ^gra (.*)$ Substitution: chat CONGRATULATIONS, $1!!! It should be easy to understand. $1 in the substituion is replaced by what goes after gra. Advanced Features As mentioned in , aliases can use a s//e construct, that is, whose substitution is actually composed of Perl statements evaluated when a match is found. To use that feature, select the Eval substitution as Perl statement option: An alias whose substitution is evaluated: Pattern: calc\((.*)\) Substitution: eval "$1" Eval substitution as Perl statement: checked The alias allows you to write something like that: gossip 2+3 = calc(2+3) and have the result of the calculation sent to the MUD. (Or any other Perl statement to be evaluated, actually.) By default, case is considered when matching. If you want case-insensitive matching, select Ignore case when matching. Using Perl in Aliases It is possible to make an alias whose action is not to send a changed command line, but to execute an action. To do that, make the replacement start with /, which means that the rest of the line will be executed, and not sent to the mud. In the rest of the line, you can put arbitrary Perl code. However, if you want to refer to a variable, you must escape the $ prefix by writing it as \$. This way, when the substitution is run, you get the name of the variable, not the value this variable currently has. As an example, if you define an alias with pattern ^say (.*)$ and action /\$world-\>echonl("$1"), whenever you type a line that starts with say in the input box, the rest of the line will be echoed in the screen, but not sent to the mud. Defining Aliases in the Command Line For those more used to Perl and to command lines, it is also possible to define and alter aliases from the command line. This is done with a series of Perl function. Aliases are defined with the $world->alias function. This function works similarly to $world->trigger (described in ). The simplest way to call the function is with two arguments: $world->alias(pattern, substitution). This defines an alias with the given pattern and substitution. For example, the alias described in would be created as follows: A simple alias defined in the command line $world->alias('^df$', 'drink from fountain') Like the $world->trigger function (see ), you can specify extra arguments to control advanced alias features. One such argument is perleval that causes the substitution to be evaluated as a Perl statement. The alias defined in can also be created as follows: An alias whose substitution is evaluated (in the command line) $world->alias('calc\((.*)\)', 'eval "$1"', { perleval => 1}) See the difference? There is a third parameter, enclosed in curly braces {}, with the word perleval, an arrow, and the number 1. What that means is that perleval has the value 1, or, as usual in computer languages, is true. (False would be zero.) To specify a case-insensitive match, use the ignorecase attribute. Editing Aliases Before going into editing, let us see how to get a list of all aliases that are currently defined for the World. Just use the $world->listalias function without arguments. You will be presented with a list of the currently defined aliases. There are four columns: Num is the number of the alias. Aliases are numbered sequentially starting at zero. This number will be useful when we start editing aliases. After that, Ena tells whether the alias is enabled. Aliases that are disabled are not tried. This is a nice way to stop an alias from working, but keep it stored for later use. We will see how to enable and disable aliases later in this section. The final two columns list the pattern and substitution of the alias. The listing produced by $world->listalias is compact, showing all aliases but possibly truncating the pattern and/or substitution. If you give an alias number as argument to listalias, it will display that alias's information detailedly. To edit an alias, you need to know that alias's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->getaliasnumber can be used to discover an alias's number if its name is known.) The same function used to add aliases can also change existing ones, you just need to pass the alias number as the first argument. Calling $world->alias(number, new pattern) changes the pattern of the alias with that number. If you want to change the pattern and substitution, include the substitution as a third argument: $world->alias(number, new pattern, new substitution). What if you want to change only the substitution? Since passing only one string argument would change the pattern, this is done in a different way. In brief, this is how you would change only the substitution: $world->alias(number, { substitution => new substitution }). Notice that the substitution is passed as an attribute inside the curly braces. It is also possible to change the pattern this way, just use the attribute pattern. One other attribute of aliases is enabled. It was mentioned briefly when we described how to list aliases. It can be set just like the other attributes and is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the alias is tried normally. When it is zero, commands are not tried against it. This way, disabling an alias effectively turns if off, as if it did not exist, but the alias is still saved, and can be turned on again when necessary. Here's an example of disabling an alias (number 3 in this case): Disabling an alias, the long way $world->alias(3, { enabled => 0 }) However, there is a shorter way: the $world->disalias function disables the alias whose number is passed as argument. So the example above can be rewritten in a shorter way as: Disabling an alias, the short way $world->disalias(3) The corresponding function $world->enaalias enables the specified alias. It is also possible to temporarily disable all aliases. Just use the menu Preferences Disable Aliases and this will prevent aliases from being used. This does not change the "enabled" status of any aliases, it just prevents all aliases from being executed. When you select the menu again, aliases that were enabled will be matched again, and those that were disabled will remain disabled. There are times when you want to delete an alias. This is easy to do, use the $world->delalias function. It takes as argument the number of the alias you wish to delete. Be aware that once deleted it is not possible to recover the alias (unless you create it again). Many times just disabling the alias is a better idea. The second thing to note is that when you delete an alias the numbers of the other aliases may change, so be careful when you try to delete several aliases in sequence. Assigning Names to Aliases It is possible to assign names to aliases. When an alias has a name, you can enable, disable, or delete it using its name instead of its number. To assign a name to an alias, specify the name attribute when creating it: Creating an alias with a name $world->alias('^df$', 'drink from fountain', { name => 'drink' }) You can now disable this alias with $world->disalias('drink'). The name can also be used in the $world->enaalias, $world->delalias and $world->listalias functions. It is also possible to assign a name to an existing alias. Just edit it as described in , passing the name attribute. Use this same process to change the name of an alias. Another feature of alias names is that several aliases can have the same name. In this case, all these aliases will be treated as a single group. The functions above, when passed an alias name, will act upon all aliases of the group, that is, on all aliases with that name. Reordering Aliases Aliases are tried from the first to the last, so in some cases the order of the aliases matters. It is possible to move an alias to another position with the $world->movealias function. The function takes two parameters: the first is the name or number of the alias that you want to move. The second is the new position that the alias will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of aliases, the alias will be moved to the end of the list. If there are several aliases with the same name, only the first one found will be moved. And when an alias is moved, other aliases might move up or down to accomodate the change.
Macros Macros are, in a way, similar to aliases. They allow you to send commands to the MUD in an easier way. Aliases allow you to associate commands with shortcuts (typing a three-letter command to send a much more complex command, for example). Macros allow you to associate a command with a keypress. You could associate, for example, F5 with the command drink from fountain, and then you would only need to press F5 to send that command to the MUD. The commands need not be complex or big: you could associate the arrow keys with macros that send movement commands, and you would be able to move around the MUD using the arrow keys. Macros consist of a key and an action. The action represents what is sent to the MUD when the macro is run. It can be a single command to send, several commands separated by %;, or something to be executed by Perl, if it starts with /. Creating and Editing Macros The easiest way to create and alter macros is from the World Editor, the place where all settings of a World are altered (see ). Macro are defined in the Macros section inside the Automation section. When you open that section, you'll see a list of the defined macros and some buttons like this:
The graphical Macro editor The graphical Macro editor.
The main part of the window is the list of defined macros. The columns are as follows: Enabled specifies whether the macro is enabled or not. Macros that are not enabled are not active and will not be run even if their key is pressed, but they remain in the list so that they can later be enabled again. Name is a name that is assigned to a macro. This helps you identify the macro's purpose and is useful when editing a macro via the command line (as described in ). Assigning a name to a macro is optional. Key is the key that activates the macro. Action is the action that is run when the key is pressed. Plugin: if this is non-empty, it means that the macro belongs to a plugin (and the name of the plugin is displayed). However, by default plugin macros are not displayed. See for information on how to display plugin macros here. Adding Macros To add a new macro, press the Add button. This will open a window for you to edit the new macro's parameters:
The window to edit macros The window to edit macros.
What can be set represents the columns described above. To define the key, press the key combination desired in the text box for Key and the appropriate key code will be inserted. When you are finished, press OK and the macro will be added. If you change your mind, press Cancel and the macro will not be added. To see some things macros can do, read . If you want to try the macros described there, you can create them from the World Editor.
Editing Macros To edit a macro, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding macro (see ) will be opened, filled with the macro's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the macro will remain as it was before. Another shorter way to edit a macro is to double click its line in the list. It is also possible to change the value of the enabled option directly from the macro list. Make sure that the macro you want to change is selected, and click in the check button. The state will be toggled. To delete a macro, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the macro. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the macro again. See . To delete several macros at once, select them all and press Delete. The final thing that needs to be explained with regard to macros is how to reorder them. Macros as tried from the first one to the last, so in a few cases the order might matter. To move a macro up or down in the list, select it and press the corresponding button.
Defining Macros in the Command Line For those more used to Perl and to command lines, it is also possible to define and alter macros from the command line. This is done with a series of Perl function. Macros are set defining, as mentioned above, a key and an action. The key is key keycode for the key you wish to assign the macro to. The easiest way to get the keycode for a given key is with the $world->getkeycode function. This function takes no parameters. When run, it prompts you to press a key, and then prints the keycode for the key. It also returns the keycode as a string, so you can save it in a variable and use when defining the macro. Here's a way to define a macro: Defining a macro /$key = $world->getkeycode Press a key to get its keycode. Press the F5 key Key code: F5 /$world->macro($key, 'drink from fountain') The above session shows how to assign drink from fountain to the F5 key. Note that $world->getkeycode prompts you for a key and prints its keycode. Additionally, the keycode is returned, and it is stored in the $key variable. This variable is used as the first argument to the $world->macro function, that takes two arguments: the keycode and the action. We could have entered 'F5' directly, but using the keycode returned by $world->getkeycode is easier and less error-prone. That's pretty much all about defining macros. They do not take arguments, it is all about executing simple commands. Other things that could be done are executing several commands (separating them with %;) or executing a Perl statement or function. Editing Macros Before going into editing, let us see how to get a list of all macros that are currently defined for the World. Just use the $world->listmacro function without arguments. You will be presented with a list of the currently defined macros. There are four columns: Num is the number of the macro. Macros are numbered sequentially starting at zero. This number will be useful when we start editing them. After that, Ena tells whether the macro is enabled. Macros that are disabled are not executed even if the key is pressed. This is a nice way to stop a macro from working, but keep it stored for later use. We will see how to enable and disable macros later in this section. The final two columns list the keycode and action of the alias. The listing produced by $world->listmacro is compact, showing all macros but possibly truncating the keycode and/or action. If you give a macro number as argument to listmacro, it will display that macro's information detailedly. To edit a macro, you need to know that macro's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->getmacronumber can be used to discover a macro's number if its name is known.) The same function used to add macros can also change existing ones, you just need to pass the macro number as the first argument. Calling $world->macro(number, new keycode) changes the key of the macro with that number. If you want to change the key and action, include the substitution as a third argument: $world->macro(number, new key, new action). What if you want to change only the action? Since passing only one string argument would change the key, this is done in a different way. In brief, this is how you would change only the key: $world->macro(number, { action => new action }). Notice that the key is passed as an attribute inside the curly braces. It is also possible to change the key this way, just use the attribute key. The only attribute for macros, besides the key and action, is enabled. It was mentioned briefly when we described how to list macros. It can be set just like the other attributes and is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the macro is run normally. When it is zero, even if the key is pressed, the macros is not run. This way, disabling an alias effectively turns if off, as if it did not exist, but the macro is still saved, and can be turned on again when necessary. Here's an example of disabling a macro (number 3 in this case): Disabling a macro, the long way $world->macro(3, { enabled => 0 }) However, there is a shorter way: the $world->dismacro function disables the meacro whose number is passed as argument. So the example above can be rewritten in a shorter way as: Disabling a macro, the short way $world->dismacro(3) The corresponding function $world->enamacro enables the specified macro. It is also possible to temporarily disable all macros. Just use the menu Preferences Disable Macros and this will prevent macros from running. This does not change the "enabled" status of any macros, it just prevents all macros from running. When you select the menu again, macros that were enabled will run again, and those that were disabled will remain disabled. There are times when you want to delete a macro. This is easy to do, use the $world->delmacro function. It takes as argument the number of the macro you wish to delete. Be aware that once deleted it is not possible to recover the macro (unless you create it again). Many times just disabling the macro is a better idea. The second thing to note is that when you delete a macro the numbers of the other macros may change, so be careful when you try to delete several macros in sequence. Assigning Names to Macros It is possible to assign names to macros. When a macro has a name, you can enable, disable, or delete it using its name instead of its number. To assign a name to a macro, specify the name attribute when creating it: Creating a macro with a name $world->macro($key, 'drink from fountain', { name => 'drink' }) You can now disable this macro with $world->dismacro('drink'). The name can also be used in the $world->enamacro, $world->delmacro and $world->listmacro functions. It is also possible to assign a name to an existing macro. Just edit it as described in , passing the name attribute. Use this same process to change the name of a macro. Another feature of macro names is that several macros can have the same name. In this case, all these macros will be treated as a single group. The functions above, when passed a macro name, will act upon all macros of the group, that is, on all macros with that name. Reordering Macros Macros are tried from the first to the last, so in some cases the order of the macros matters. It is possible to move an macro to another position with the $world->movemacro function. The function takes two parameters: the first is the name or number of the macro that you want to move. The second is the new position that the macro will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of macros, the macro will be moved to the end of the list. If there are several macros with the same name, only the first one found will be moved. And when an macro is moved, other macros might move up or down to accomodate the change.
Timers Timers allow you to execute commands repeatedly at fixed intervals, and also to specify a command to be executed later. Timers have to mandatory attributes: an interval in seconds, that represents how often the timer is fired, and an action, that is the command that is executed. Just like in other places, the action can be a text that is sent to the MUD, or it can be something run with Perl. It is possible to define timers that execute only a fixed number of times. This is the timer's repeat count. Whenever the timer is executed, this count is decreased, and when it reaches zero, the timer is disabled, and will only execute again if reenabled manually. A timer can also be temporary: in this case, when the repeat count reaches zero, it is deleted and not only disabled. A repeat count of -1 means that the timer is executed indefinitely. A timer with a repeat count of one is executed only once. Since the first execution only happens interval seconds after it is defined, this allows you to define a command to be executed after some specified time. If it is marked as temporary, the timer will be deleted after it is run this one time. Creating and Editing Timers The easiest way to create and alter timers is from the World Editor, the place where all settings of a World are altered (see ). Timer are defined in the Timers section inside the Automation section. When you open that section, you'll see a list of the defined timers and some buttons like this:
The graphical Timer editor The graphical Timer editor.
The main part of the window is the list of defined timers. The columns are as follows: Enabled specifies whether the timer is enabled or not. Timers that are not enabled are not active and will not be run, but they remain in the list so that they can later be enabled again. Name is a name that is assigned to a timer. This helps you identify the timer's purpose and is useful when editing a timer via the command line (as described in ). Assigning a name to a timer is optional. Interval is the interval between timer activations, as described above. Fractions of seconds are allowed: an interval of 0.5 means a timer that fires each half-second. Count is the repeat count, as described above. Action is the action that is run when the timer fires. Temp indicates whether the timer is temporary or not. Temporary timers are deleted automatically when their repeat count reaches 0. Plugin: if this is non-empty, it means that the timer belongs to a plugin (and the name of the plugin is displayed). However, by default plugin timers are not displayed. See for information on how to display plugin timers here. Adding Timers To add a new timer, press the Add button. This will open a window for you to edit the new timer's parameters:
The window to edit timers The window to edit timers.
What can be set represents the columns described above. When you are finished, press OK and the timer will be added. If you change your mind, press Cancel and the timer will not be added. To see some things timers can do, read . If you want to try the timers described there, you can create them from the World Editor.
Editing Timers To edit a timer, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding timer (see ) will be opened, filled with the timer's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the timer will remain as it was before. Another shorter way to edit a timer is to double click its line in the list. It is also possible to change the value of the binary options (those represented by a check box) directly from the timer list. Make sure that the timer you want to change is selected, and click in the check button. The state will be toggled. To delete a timer, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the timer. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the timer again. See . To delete several timers at once, select them all and press Delete. The final thing that needs to be explained with regard to timers is how to reorder them. Timers as tried from the first one to the last, so in a few cases the order might matter. To move a timer up or down in the list, select it and press the corresponding button.
Defining Timers in the Command Line For those more used to Perl and to command lines, it is also possible to define and alter timers from the command line. This is done with a series of Perl function. Timers are created with the $world->timer function. It is similar to other functions for adding triggers, aliases and macros, but the hash reference with attributes (the thing inside {}) must always be used. Let us see an example of defining a timer that sends "who" once a minute: A simple timer $world->timer({ interval => 60, action => 'who' }) Note that the interval is specified in seconds. Our second example will be of a timer that executes a specified number of times: A timer that executes only five times $count = 5; $world->timer({ interval => 10, count => 5, action => '/$world->send("chat The count is at $count"); --$count' }) In these two commands, first a variable that will be used in the timer is defined. Then the timer is created, specifying count as 5, so that it is executed only five times. The timer's action is to send commands counting down to one. When the count reaches one, the timer is disabled, because it has already executed five times. Now let us see a temporary timer: A one-shot timer $world->timer({ interval => 30, count => 1, temporary => 1, action => 'say 30 seconds have elapsed' }) This timer has a count of one, meaning it will only be executed once. Also, temporary is defined as true, which means that after it is executed (which will happen in 30 seconds), the timer will be erased. Of course, a temporary timer does not need to have a count of one. The countdown timer above could have been made temporary if it was not needed after it reached one. Editing Timers Before going into editing, let us see how to get a list of all timers that are currently defined for the World. Just use the $world->listtimer function without arguments. You will be presented with a list of the currently defined timers. There are several columns: Num is the number of the timer. Timers are numbered sequentially starting at zero. This number will be useful when we start editing timers. After that, Int is the interval (in seconds) between timer firings. Next comes Count, which is the number of times the timer will still be fired before being disabled or erased. If the value is -1, that means that it will execute indefinitely. Ena tells whether the timer is enabled. enabled. Timers that are disabled are not run. This is a nice way to stop a timer from working, but keep it stored for later use. We will see how to enable and disable timer later in this section. After that, Temp tells whether the timer is temporary or not. Temporary timers were explained in the previous section. In brief, a temporary timer is deleted (and not only disabled) after its count reaches zero. The last column shows the action associated with the timer. The listing produced by $world->listtimer is compact, showing all timers but possibly truncating the action. If you give a timer number as argument to listtimer, it will display that timer's information detailedly. To edit a timer, you need to know that timer's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->gettimernumber can be used to discover a timer's number if its name is known.) The same function used to add timers can also change existing ones, you just need to pass the timer number as the first argument. The generay way to edit a timer is like this: $world->timer(number, { new attributes }), where new attributes is a list of the attributes you want to change. For example, the code below changes the interval of timer number two: Changing the interval of a timer $world->timer(2, { interval => 30 }) As a further example, consider the one below, that edits timer number five to be temporary and to run 10 times: Changing the interval of a timer $world->timer(5, { temporary => 1, count => 10 }) It is possible to enable and disable timers with the syntax above, but there is a shorter way: the $world->distimer function disables the timer whose number is passed as argument, as shown in the example below: Disabling a timer, the short way $world->distimer(3) The corresponding function $world->enatimer enables the specified timer. It is also possible to temporarily disable all timers. Just use the menu Preferences Disable Timers and this will prevent timers from running. This does not change the "enabled" status of any timers, it just prevents all timers from running. When you select the menu again, timers that were enabled will run again, and those that were disabled will remain disabled. There are times when you want to delete a timer. This is easy to do, use the $world->deltimer function. It takes as argument the number of the timer you wish to delete. Be aware that once deleted it is not possible to recover the timer (unless you create it again). Many times just disabling it is a better idea. The second thing to note is that when you delete a timer the numbers of the other timers may change, so be careful when you try to delete several timers in sequence. Assigning Names to Timers It is possible to assign names to timers. When a timer has a name, you can enable, disable, or delete it using its name instead of its number. To assign a name to a timer, specify the name attribute when creating it: Creating a timer with a name $world->timer({ interval => 60, action => 'who', name => 'who' }) You can now disable this timer with $world->distimer('who'). The name can also be used in the $world->enatimer, $world->deltimer and $world->listtimer functions. It is also possible to assign a name to an existing timer. Just edit it as described in , passing the name attribute. Use this same process to change the name of a timer. Another feature of timer names is that several timers can have the same name. In this case, all these timers will be treated as a single group. The functions above, when passed a timer name, will act upon all timers of the group, that is, on all timers with that name. Reordering Timers It is possible to move a timer to another position with the $world->movetimer function. The function takes two parameters: the first is the name or number of the timer that you want to move. The second is the new position that the timer will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of timers, the timer will be moved to the end of the list. If there are several timers with the same name, only the first one found will be moved. And when a timer is moved, other timers might move up or down to accomodate the change.
Hooks Hooks allow you to specify an action to be executed automatically when some events happen. For example, you can define a hook with actions to be executed when a connection is established, and then these commands will be automatically executed when you connect to the World. You can connect hooks to seven events: OnConnect: This hook is executed when a connection to the world is made, after the auto-logon has taken place (if applicable). OnDisconnect: This hook is executed when you are disconnected from a World, after the connection has been closed. OnReceivedText: Executed when text is received from the world. The text received is available for the hook in the $hookdata variable, and can be inspectd in Perl scripts. OnSentCommand: Executed after a command is sent to the world. The command is available for the hook in the $hookdata variable, and can be inspectd in Perl scripts. OnGetFocus: Executed when the KildClient window receives the focus. OnLoseFocus: Executed when the KildClient window loses the focus. OnCloseConnected: Executed when the world is forcedly closed. This can happen using the World Close menu, the $world->close() function, or by quitting the program with the world connected. You can put in this hook, for example "quit" to always exit the MUD nicely, even if you close the world by mistake. OnServerData: Executed when out-of-band server data is received. See . Creating and Editing Hooks The easiest way to create and alter hooks is from the World Editor, the place where all settings of a World are altered (see ). Hook are defined in the Hooks section inside the Automation section. When you open that section, you'll see a list of the defined hooks and some buttons like this:
The graphical Hook editor The graphical Hook editor.
In the top there is a combo box for you to select one of the five events described above. When an event is selected the hooks defined for that event will be listed, and all operations will be done on hooks of that event. The main part of the window is the list of defined hooks. The columns are as follows: Enabled specifies whether the hook is enabled or not. Hooks that are not enabled are not active and will not be run, but they remain in the list so that they can later be enabled again. Name is a name that is assigned to a hook. This helps you identify the hook's purpose and is useful when editing a hook via the command line (as described in ). Assigning a name to a hook is optional. Action defines what is done when the hook is run.. Adding Hooks To add a new hook, select the desired event from the Combo Box and press the Add button. This will open a window for you to edit the new hook's parameters:
The window to edit hooks The window to edit hooks.
What can be set represents the columns described above. When you are finished, press OK and the hook will be added. If you change your mind, press Cancel and the hook will not be added. To see some things hooks can do, read . If you want to try the hooks described there, you can create them from the World Editor.
Editing Hooks To edit a hook, select the event from the combo box, then select the hook to edit in the list by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding hook (see ) will be opened, filled with the hook's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the hook will remain as it was before. Another shorter way to edit a hook is to double click its line in the list. It is also possible to change the value of enabled setting directly from the hook list. Make sure that the hook you want to change is selected, and click in the check button. The state will be toggled. To delete a hook, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the hook. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the hook again. See . To delete several hooks at once, select them all and press Delete. The final thing that needs to be explained with regard to hooks is how to reorder them. Hooks as run from the first one to the last, so in a few cases the order might matter. To move a hook up or down in the list, select it and press the corresponding button.
Defining Hooks in the Command Line For those more used to Perl and to command lines, it is also possible to define and alter hooks from the command line. This is done with a series of Perl function. Hooks are defined with the $world->hook function. This function works similarly to $world->trigger (described in ). The simplest way to call the function is with two arguments: $world->hook(event, action). This defines a hook for the given event (see above for the valid events) that does action when the event is fired. As always, action can be some text or a Perl action. Here's an example of connecting a hook to the OnConnect event: Connecting a hook $world->hook('OnConnect', 'user Bob %; password 12345') This hook causes the lines to the sent to the MUD when a connection is established, supposedly representing a way to log in to some MUD server. Editing Hooks Before going into editing, let us see how to get a list of all hooks that are currently defined for a given event. Just use the $world->listhook function with the event name as argument. You will be presented with a list of the currently defined hooks for that event. There are three columns: Num is the number of the hook. Hooks are numbered sequentially starting at zero, but keep in mind that there is a separete numbering for each event. This number will be useful when we start editing hooks. After that, Ena tells whether the hook is enabled. Hooks that are disabled are not run. This is a nice way to stop a hook from working, but keep it stored for later use. We will see how to enable and disable hook later in this section. The last column shows the action of the hook. The listing produced by $world->listhook is compact, showing all hooks but possibly truncating the pattern and/or substitution. If you give a hook number or name as the second argument to listhook (the first argument is the event, as always), it will display that hook's information detailedly. To edit a hook, you need to know that hook's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->gethooknumber can be used to discover a hook's number if its name is known.) The same function used to add hooks can also change existing ones, you just need to pass the hook number as the second argument. Calling $world->hook(event, number, new action) changes the action of the hook with that number for that event. The only attribute for hooks, besides the action is enabled. It was mentioned briefly when we described how to list hooks. It can be set just like the other attributes and is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the hook is tried normally. When it is zero, commands are not tried against it. This way, disabling a hook effectively turns if off, as if it did not exist, but the hook is still saved, and can be turned on again when necessary. Here's an example of disabling a hook (number 0 of event OnConnect in this case): Disabling a hook, the long way $world->hook('OnConnect', 0, { enabled => 0 }) However, there is a shorter way: the $world->dishook function. It takes two arguments: the event and the hook number, and disables the hook with the given number. So the example above can be rewritten in a shorter way as: Disabling a hook, the short way $world->dishook('OnConnect', 0) The corresponding function $world->enahook enables the specified hook. There are times when you want to delete a hook. This is easy to do, use the $world->delhook function. It takes as argument the event and the number of the hook wish to delete. Be aware that once deleted it is not possible to recover the hook (unless you create it again). Many times just disabling the hook is a better idea. The second thing to note is that when you delete a hook the numbers of the other hook may change, so be careful when you try to delete several hooks in sequence. Assigning Names to Hooks It is possible to assign names to hook. When a hook has a name, you can enable, disable, or delete it using its name instead of its number. To assign a name to a hook, specify the name attribute when creating it: Creating a hook with a name $world->hook('OnConnect', 'user Bob %; password 12345', { name => 'connection' }) You can now disable this hook with $world->dishook('OnConnect', 'connection'). The name can also be used in the $world->enahook, $world->delhook and $world->listhook functions. It is also possible to assign a name to an existing hook. Just edit it as described in , passing the name attribute. Use this same process to change the name of a hook. Another feature of hook names is that several hooks can have the same name. In this case, all these hooks will be treated as a single group. The functions above, when passed a hook name, will act upon all hooks of the group, that is, on all hooks with that name.
Plugins Plugins extend the functionality of KildClient. They add more features that make the client even more powerful. Basically, plugins can define triggers, aliases, macros and timers and/or new functions. Whenever the plugin is loaded, the new functionality is available. You can work with plugins from the World Editor (see ). Open the World Editor, and select the Plugins section inside Automation. You will see a screen like this:
The Plugin list The Plugin list.
There are two lists in the window: one lists the plugins that are currently loaded and that can be used. The other lists the plugins in the startup list, which are plugins that are loaded automatically for you whenever you connect to the World. To load a plugin, press the Load button. A dialog will be opened for you to select the file. Select the file and press Open. The plugin will be loaded and will appear in the list. Or, if there was a problem and the plugin could not be loaded, the reason will be given in a message box. While selecting the file, you have the option to specify that the plugin is to be loaded always at startup (that is, when you connect to the World). If you select that option, the plugin will also be added to the other list. You can get help for a loaded plugin by selecting its line and pressing the Help button. Some help describing how to use the plugin will be shown in the main World window. You can disable a plugin that is loaded. When a plugin is disabled, it is turned off temporarily. To disable a plugin, select its line in the list of loaded plugins and click the check box in the Enabled column. To enable it back, click in the check box again. To add a plugin that is to be loaded always at startup (without loading it now, or if it is already loaded), press the Add button after the list of the startup plugins. A dialog box will open for you to select the file, and if that file could be loaded, the plugin will be added to the list. To remove a plugin so that it is not loaded anymore at startup, select its line and press Remove. And to change the order that the plugins are loaded, select the line and use the Up and Down buttons to move the plugin. Loading Plugins from the Command Line It is also possible to load plugins directly from the command line, for those more comfortable with it and with Perl. To load a plugin, the $world->loadplugin function is used. It must be called with one argument, which can be either the full path to the file that defines the plugin, or just the plugin name. But for this to work, the file must be installed in one of the directories that KildClient looks for plugins. By default, two locations are searched for: one is the plugins directory under KildClient's directory in your HOME path (that is, ~/.kildclient/plugins in UNIX systems). The other is the plugins directory under the directory where KildClient stores some of its files (generally it is something like /usr/local/share/kildclient/plugins). For example, here is how to load the keypad plugin (which is a standard plugin distributed with KildClient): Loading a plugin $world->loadplugin('keypad') As an additional example, the code below loads a plugin specifying its full filename: Loading a plugin specifying the full filename $world->loadplugin('/home/joe/kildclient-plugins/attackplugin.pl') Either way, you should see a message saying that the plugin has been loaded. It is now already working. If the plugin was already loaded, loading will fail. To always load the plugin when you connect to the World, either use the World Editor as described above, or add the line that loads it to your script file. See . Enabling and Disabling Plugins If you want to turn off a plugin temporarily, you can disable it. Later, when you want it to work again, just reenable it. To disable a plugin, use the $world->displugin function, passing as argument the name of the plugin. What this function does is disable the plugin's triggers, aliases, macros and timers. You can still call the plugin functions directly. To enable a plugin again, use the $world->enaplugin function, passing as argument the name of the plugin. Getting Information About Plugins All plugins should contain a help function that, when called, prints information about the plugin. If you want to get help on a plugin, call its help function. The example below shows how to call the help of the keypad plugin: Getting help about a plugin keypad::help() Note that the name of the function is prefixed with the name of the plugin and ::. This is a convention so that one plugin's functions do not interfere with other plugins' ones. It is possible to get a list of all the currently loaded plugins with the $world->listplugin function. If called without arguments, it lists briefly all loaded plugins. But you can pass as argument either a plugin number or a plugin name, and it will give more detailed information about that plugin, including a listing of the triggers, aliases, macros and timers that the plugin defines (if any). Standard Plugins KildClient comes with a few plugins as part of its distribution. These plugins will be described here. You can load these plugins as described above. easypath This plugin makes the use of paths (see ) easier. When this plugin is loaded, you can type #2n3e{sw} instead of /$world->path("2n3e{sw}"). keypad This plugin allows use of the keypad for movement. Pressing the left arrow of the numeric keypad moves to the east, pressing the up arrow moves to the north, and so on. A few other keys of the keypad are also bound: - and + represent down and up, respectively. 5 sends who, 0 sends look, / sends inventory and * sends score. The Num Lock key must be off for this plugin to work. notes This plugin allows you to assign notes to World. The notes are saved with the World and are restored when it is opened again. You can write anything you want, probably it will be something you want to remember for that World. This plugin requires the gtk3-perl bindings, because it has a graphical user interface. Type /notes::edit to open a window where you can edit the notes. When you are finished, press the Close button. The notes are saved automatically. Use the notes::clear function to clear the whole contents of the notes. It is also possible to append something to the notes with notes::append('text'). This is probably more useful in scripts. kc256 This plugin demonstrates a useful extension to the 16 ansi colors that KildClient supports. This is the same 256-color extension supported by xterm (if it is complied with support for that). With this extension, you can specify any color in a 6x6x6 RGB color cube, that is, you have 216 rgb colors at your disposal, plus 24 shades of gray. (The remaining 16 colors are the standard ansi colors.) There are two functions in this plugin: kc256::showcolors: Displays all 216 available RGB colors and the 24 shades of grey in nice tables, with the values that you can use in to access them. kc256::rainbowtext($string): Just a demonstration on how (not to) use the colors. Displays $string, one character in a different color. channels Channels is a simple plugin to yank lines out of the world window and put then in other windows. It's most obvious use is chat channels, which usually have something like "[NAME]" at the beginning. Once the plugin is loaded, there is only one function to call: channels::new("name", "regex"); where "name" is the name that should appear in the title bar of the new window, and "regex" is the pattern to match for text. Use channels::list() for a list of currently defined channels. To remove a channel, use channel::del(num), where num is the number of the channel. Other Plugins The KCWin plugin allows you to create general purpose windows a terminal for output and an entry box for input. These windows do nothing by themselves, but they can be used by other plugins when they need a window for input and output. Since this plugin is just a helper for other plugins, it is not described here, but rather in . The chat plugin allows peer to peer chat with other users of KildClient and of other clients that support the MudMaster or zChat protocols. It is described in its own chapter, . The serverdatadumper is a plugin to help develop or debug plugins that use out-of-band server data. See .
Logging the Output Logging can be configured in the World Editor, see , but there are also functions to start and stop logging from the command line. Logging is controlled with the $world->logfile function. The first argument specifies the path to the file where the output is saved. If the file already exists, new text will be appended to it. The file name is passed throught strftime(), so you can log to different files depending on the date and/or time. Also, you can use %Kw in the file name and it will be replaced by the name of the World. And the string %Kc is replaced by the name of the character used in auto-login (see ). (If auto-login was not used, then %Kc is replaced by an empty string.) The second argument, if present, controls the format of the timestamp. If you do not want a timestamp, then do not pass a second argument, pass only the file name. This timestamp argument is a string with control codes. Each control code will be substituted by a part of the time or date. This sequences are the ones of the strftime() C function, so see its man page for the list of control sequences. Here's an example that turns on logging, with a timestamp that shows the date and time: Enabling logging $world->logfile('/home/bob/mud/mudlog.txt', '%b/%d %H:%M:%S> ') To turn off logging, just call logfile with no arguments. There are functions to write arbitrary text to the log file: and . Using the Chat KildClient supports peer to peer chat (that is, you talk directly to the other person, and not via a server, be it a MUD server or a chat server), which allows you to talk to other users of KildClient or other clients that support the MudMaster or zChat protocols (both are supported by KildClient). There are several advantages of chatting directly with the other person: You can chat even if the MUD is down, since the MUD server is not involved. Since the chat is direct, it cannot be snooped by immortals or administrators. The chat is independent from the MUD, so you can chat even if you in a situation in which it would not be possible to talk through the MUD. The chat also supports other features that are not possible through a MUD, such as snooping a session, that is, seeing everything the other player sees in the screen (if they allow you to do so, of course), or sending everything you see to your chat party (if you allow that, of course), or transfering files. These features do not pose a security risk, because they can be disabled and the other person can only see your output if you allow it, and they can only send files if you allow them to. Basic Usage The chat plugin requires the Gtk3 Perl bindings, and also the Perl bindings for the vte library. If you cannot load the plugin and it complains about not finding these bindings, go to https://metacpan.org/release/Gtk3/ and download them. To load the plugin, enter /$world->loadplugin('chat') in the command entry box. You should see Plugin loaded. If an error happened, you probably do not have the bindings mentioned in the above paragraph. If you want to have the plugin always loaded, you can put that line (without the slash in the beginning) to your script file, and the plugin will loaded whenever you open a World. Now that the plugin is loaded, you have two options: calling somebody or accepting calls from other persons. The first thing you should do is set you chat nickname. To do that, type /chat::setname("nickname"). You only need to do this once, as the chat name will be saved and restored when you open the World again. To accept calls, enter /chat::accept in the command entry box. Other people can now call you. You will need to give them your IP address. Calls are being waited on port 4050, which is the default port for the chat protocols. If you want to listen for connections in another port, just pass that port number as argument, for example, /chat::accept(5000). Be sure to inform other people the port you are using. When somebody wants to chat to you, a dialog box will appear asking if you want to accept the chat. If you want to chat with them, select Yes to establish the chat connection, otherwise click No to deny the chat request. To call somebody, use the call function: enter /chat::call("host"). host is the hostname or IP address of the person you wish to chat with. This command tries connecting to port 4050, if they are using another port, pass that port number as a second argument to the function. You can substitute call for zcall. The later tries using the zChat protocol instead of the default MudMaster protocol. Use the zcall function if you know they support the zChat protocol. If the other person accepts the chat, the connection will be established. Each chat connection has its own window where the text received is displayed, and with an entry box where you can type messages that are sent to the other person. To send something, just enter the message and press ENTER. There are some special commands that can be entered in chat windows, these will be described in the next session. Advanced Features There are other things you can do besides simply chatting. These functions are accessed by typing some commands in the chat window. These commands start with /, but do not confuse them with the usage of / in the main KildClient window to run Perl commands. Here are the commands and their actions: /emote text Sends text as an emote and not as a chat message, that is, sends a message in the form name text. /chatall text Sends text to all chat connections. /emoteall text Sends text as an emote to all chat connections. /group group name Makes this chat connection a member of the specified group. /cg text Sends text to all connections that are members of the group that this chat session belongs. /eg text Sends text as an emote to all connections that are members of the group that this chat session belongs. /name nickname Changes the chat nickname to the one given. This affects all chat sessions. /color code Changes the color used in this chat session to the one specified. code is a color code as recognized by the function. Note that this affects only chat messages and the text you send, if the chat peer sends messages in another color, they will be displayed in the color the peer chose. This affects all chat sessions. /stripansi Strips ANSI color codes in messages received in this chat. That means that colors sent by the peer will not be displayed, and that even incoming messages will be displayed in your chat color. /nostripansi Does not strip ANSI color codes in messages received in this chat. That means that colors sent by the peer will be displayed. /ping Pings the other peer. If the connection is alive, they will reply to this request. Additionally, the time for the reply to be received is displayed. /sendfile Attemps to send a file to the peer. A dialog will be displayed for you to select the file to send, and the file will be offered. If they accept, the file transfer will start. /stopfile Stops the file transfer currently in progress. /snoop Asks the peer if you can snoop them, that is, see everything they see in their MUD session. If they accept, everything they see will be sent to you and displayed. /allowsnoop Allows the peer to snoop you, that is, they can see everything you see in your MUD session. Be careful with this command. By default snooping is not allowed to protect your privacy. /noallowsnoop Disallows the peer to snoop you, that is, they cannot see what you see in your MUD session. By default snooping is disabled, and this command is used to disable it again if you had enabled it. /info Shows some information about the chat session. /hangup Stops this chat session. You will need to connect again to continue talking. As you can see, the chat offers much more than simply chatting. One of its features is file transfer. To send a file, use the /sendfile command, as descrived above. When your peer wants to send you a file, a dialog box will be displayed telling you the name and size of the file. If you want the file, select Yes and another dialog will be displayed for you to you can select where to store the file. The file transfer will then begin. Or you can refuse the file by clicking No. You can interrupt a file transfer in progress by using the /stopfile command. By default, you are prompted whenever somebody wants to talk with you. If you want to avoid this question and automatically accept all chats, set the $chat::auto_accept_calls variable to 1 (that is, enter something like /$chat::auto_accept_calls = 1). This setting will be remembered. Set it to 0 to have the prompts again. If, however, you do not want to chat with anyone, the best thing is to disable accepting connections. Just type /chat::noaccept. Use /chat::acceptcalls to accept calls again. Chat Functions You can also access the chat features via some Perl functions of the chat plugin. Here is a list of these functions: chat::call(host, [port]) Tries connection to host, on port port (or 4050, if not specified), using the MudMaster protocol. chat::zcall(host, [port]) Tries connection to host, on port port (or 4050, if not specified), using the zChat protocol. chat::accept([port]) Starts listening for chat connections on the given port (or 4050 if not specified). chat::noaccept() Stops listening for chat connections. chat::setname(nickname) Sets the nickname used in chat sessions. chat::setcolor(code) Sets the color used in chat sessions. code is a color code as recognized by the function chat::chat(name, text) Sends text to name. chat::emote(name, text) Sends text as an emote to name. chat::chatall(text) Sends text to all chat connections. chat::emoteall(text) Sends text as an emote to all chat connections. chat::group(name, group) Makes the chat connection with name a member of the group group. chat::chatgroup(group, text) Sends text to all connections that are members of the group group. chat::emotegroup(group, text) Sends text as an emote to all connections that are members of the group group. chat::ping(name) Pings the other peer. If the connection is alive, they will reply to this request. Additionally, the time for the reply to be received is displayed. chat::sendfile(name, [file]) Attemps to send a file to the peer. If you do not specify the file, a dialog will be displayed for you to select the file to send. The file will be offered. If they accept, the file transfer will start. chat::stopfile(name) Stops the file transfer currently in progress. chat::snoop(name) Asks name if you can snoop them, that is, see everything they see in their MUD session. If they accept, everything they see will be sent to you and displayed. chat::setallowsnoop(name, value) Sets whether name can snoop you, that is, wheter they can see everything you see in your MUD session, according to value. By default snooping is disabled. chat::info(name) Shows some information about the chat session. chat::setstripansi(name, value) Sets whether to trip ANSI color codes in messages received from name, according to value. If they are, colors sent by the peer will not be displayed, and that even incoming messages will be displayed in your chat color. chat::hangup(name) Stops the chat session with name. You will need to connect again to continue talking. Out-of-band server data KildClient support some protocols that allow the server to send data to the client in a way that can be easily parsed (unlike prompts, for example) and that is not directly visible to the user. We call this out-of-band data. For example, the server could send your character stats (hp, mana, etc), so that a plugin can display this data in a more convenient form. Currently, two such protocols are supported: MSDP and GMCP (sometimes called ATCP2). By default, nothing is done with the data that is received. A hook must be bound to the OnServerData event to handle the data that is received. Even so, KildClient does nothing with the data (other than to parse it in a form that's easy to be used in Perl scripts and protocol-independent): it's up to your code to do anything with it. For example, KildClient does not store any previous values of any variable, it is up to you to store what you want. Receiving server data As mentinoed previously, to receive server data, bind a hook to the OnServerData event. See . Inside the hook, the %::server_data variable holds the data received. The elements of the hash can vary depending on the protocol and what was received. To view what is received in each message, you can use the serverdatadumper plugin. Just load it, and whenever a server data message is received, the contents of the %::server_data will be displayed. Here's a general description of the elements, followed by specifics to each protocol if appropriate: $::server_data{'protocol'} hold the protocol used to send the data. It will be MSDP or GMCP. $::server_data{'data'} holds the data received. The actual contents vary depending on what has been received, but in most cases it will be a reference to a hash with entries for each variable sent by the server. If the value is undef, that means that the server sent the null/undefined object (this is not possible in all protocols). If this key does not exist in the hash, the server did not send any variables at all (again, not possible in all protocols). $::server_data{'error'} is set in case KildClient could not parse the data sent by the server. In this case, this variable holds the error message, and $::server_data{'data'} contains the raw data received. GMCP data The GMCP protocol has the concept of packages (with optional subpackages) and message names. These are stored in $::server_data{'package'}, $::server_data{'subpackage'} and $::server_data{'message'} if they are included in the message. The actual data in this protocol is sent using the JSON format. The Perl module JSON is used to parse the data, see its documentation if you want specific details on how objects are represented. Sending server data The protocols also support sending data from the client to the server in a similar way. Usually this is used for the client to request data from the server. To send data to the server, use the $world->sendserverdata function. This function takes one argument, which must be a hash reference pointing to a hash similar to %::server_data. The entries in the hash specify what is sent to the server: the protocol, the package/message (when supported by the protocol) and the data to send, which is encoded to the appropriate format. For example, this is an example of sending a request over GMCP: A GMCP request $world->sendserverdata({ protocol => 'GMCP', package => 'Core', subpackage => 'Supports', message => 'Set', data => [ "Char 1", "Char.Skills 1", "Char.Items 1" ] }); MSDP data It is possible to send data using the MSDP protocol with $world->sendserverdata, but it might not do what the server expects. MSDP has two ways of sending arrays: one is an explicit array delimited by MSDP_ARRAY_OPEN and MSDP_ARRAY_CLOSE, and another where multiple values are sent for the same variable (in the specification, this way is only demonstrated in data sent by the client). In my opinion that second way should not exist, as it is unnecessary and possibly confusing. When receiving data, both formats are converted to a Perl list. When sending data with $world->sendserverdata, lists are always sent as an explicit array. Servers, however, seem to want multi-valued variables, so there is a function specific to MSDP, shown in the example below: A MSDP request $world->sendmsdpcommand('SEND', 'HEALTH', 'HEALTH_MAX', 'MANA', 'MANA_MAX'); The first argument is the name of the variable, the other arguments are values to be sent. This gets converted to the following message: Message sent via MSDP MSDP_VAR SEND MSDP_VAL HEALTH MSDP_VAL HEALTH_MAX MSDP_VAL MANA MDSP_VAL MANA_MAX KildClient Programmer's Reference Global Function Reference <function>colorize</function> $color = colorize str Replaces color codes (see below) in the string with ANSI escape sequences,so that the string can be echoed in the terminal, for example. Returns the colorized string. Color code table (based on colors used by the Smaug server): &0 (number zero) - Reset all attributes and colors to default Normal colors: &x - Black &r - Red &g - Green &O - Yellow &b - Blue &p - Magenta &c - Cyan &w - White &d - Default foreground Bold colors: &z - Bold Black &R - Bold Red &G - Bold Green &Y - Bold Yellow &B - Bold Blue &P - Bold Magenta &C - Bold Cyan &W - Bold White &D - Default bold foreground Background colors: ^x - Black ^r - Red ^g - Green ^O - Yellow ^b - Blue ^p - Magenta ^c - Cyan ^w - White ^d - Default background Light background colors (sometimes causes blinking): ^z - Light Black ^R - Light Red ^G - Light Green ^Y - Light Yellow ^B - Light Blue ^P - Light Magenta ^C - Light Cyan ^W - Light White ^D - Default light background Attributes: (may not work on other clients) &_ - Underline on ^_ - All underline off &= - Double underline on &| - Strikethrough on ^| - Strikethrough off &/ - Italics on ^/ - Italics off &i - Inverse video on ^i - Inverse video off &h - Hidden mode on ^h - Hidden mode off Note: if you want to set both the foreground and the background, the code for the foreground should come first. If you want to set the foreground and/or background and one or more attributes (underline, italics, etc), the attribute settings should come after the color. Note : to insert a & or ^ character, use && and ^^, respectively. You can also also use colorize() to display text in any color of a 6x6x6 RGB color cube. To do so, use &rgbX and ^rgbX to set the foreground and background, respectively. r, g, and b are integers between 0 and 5 representing the amount of red, green and blue. X is really the letter X, it is used to close the code. Finally, to select one of the 24 shades of gray available, use &nG and ^nG for the foreground and background, respectively, where n is an integer from 0 to 23, and G is really the letter G. You can use the kc256 (see ) plugin to display all the colors for you to choose from. <function>getclientname</function> $name = getclientname This functions returns the name of the client, that is, "KildClient. <function>getversion</function> $version = getversion This functions returns the version number of KildClient. <function>getworld</function> $var = getworld "name" Returns a variable that points to the open world with the given name. You can then manipulate that world with the returned variable (by calling functions that operate on worlds with that variable). For example: Quitting from another world $coolmud = getworld("CoolMud"); $coolmud->send("quit"); This will send "quit" to the CoolMud world. <function>gotow</function> void gotow number void gotow name Focuses the Nth world (when called with a number) or the world with the given name (when called with a string). The first world is numbered 0. <function>help</function> void help "function" Displays help for the given function. The name of the function is passed as a string, so it must be in quotes. <function>play</function> void play file This function plays a sound file. The argument is the path to the file. <function>quit</function> void quit Disconnects and closes all Worlds and KildClient exits. <function>stripansi</function> $stripped = stripansi str Returns the string stripped of any ANSI sequences that it had. <function>stripcolorize</function> $stripped = stripcolorize str Returns the string stripped of any sequences used by to add color to it. $window Reference $windown is a variable that is always present and points to the current window. It is an object of class Window, and is opaque, that is, all interaction with it should be done via its functions, and not via its members. The sections below describe the functions available for the $window variable. <function>getsize</function> ($lines, $columns) = $window->getsize $columns = $window->getsize This functions returns the current size of the window (in characters), in terms of lines and columns. It can return both dimensions, or just the number of columns. <function>minimize</function> void $window->minimize This function minimized KildClient's main window. Called from a macro, it makes a nice boss key. :-) <function>settitle</function> void $window->settitle "new title" Sets the title of the window to the given string. <function>seturgencyhint</function> void $window->seturgencyhint boolean Sets the value of the window's "urgency" flag to true or false. This is a request for attention to the window, and usually will make the window title flash. However note that the actual behavior depends on the window manager used. $world Reference $world is a variable that is always present and points to the current World. It is an object of class World, and is opaque, that is, all interaction with it should be done via its functions, and not via its members. The sections below describe the variables and attributes available for the $world variable. <varname>$world->{SILENT}</varname> If this attribute is set to a true value (such as 1), some messages are not displayed, especifically the messages "Trigger added", "Trigger modified", "Trigger deleted", "Trigged moved", and the corresponding messages for the other objects: aliases, macros, timers, hooks, permanent variables and plugins. <function>$world->alias</function> void $world->alias pattern substitution [attributes] void $world->alias number [pattern [substitution]] [attributes] Creates a new alias, or edits the alias identified by number. Entered commands will be matched against pattern (a Perl regular expression), and if the pattern matches, the given substitution will be applied. (In a s/pattern/substitution/ structure.) Be careful that any part of the command can match. To match only the exact string, use something like '^command$'. To match only in the beginning of the line, use '^command'. Atributes is a reference to a hash defining attributes for the alias. Generally the call works like this: $world->alias("pattern", "substitution", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: pattern: The pattern to match. substitution: The substitution to do. ignorecase: If value evaluates to true, ignore case when matching the pattern. perleval: If true, the substitution is made passing the "e" flag (s/pattern/substitution/e), so substitution should be actually Perl statements to be evaluated when there is a match. enabled: If value evaluates to true, the alias is enabled, if false, it is disabled and commands are not matched against it. name: Assigns a name to the alias, so that it can be referenced by name. <function>$world->close</function> void $world->close Disconnects and closes the current world, immediately. <function>$world->aliasenabled</function> result = $world->aliasenabled name/number This functions checks whether the specified alias exists and whether it is enabled. You can pass either a alias number or name. If the alias does not exist, this function returns undef, so you can distinguish the case of a non-existant alias from a disabled one. If the alias exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several aliases with the same name, it returns a list with one value for each alias with that name, and each value is 0 or 1 depending on the state of the alias. <function>$world->cmdseparator</function> void $world->cmdseparator string $separator = $world->cmdseparator When used with an argument, this sets the command separator for the current world to the given value. For more details of the command separator, see and If called without arguments, it returns its current value. <function>$world->commandecho</function> void $world->commandecho boolean $status = $world->commandecho When used with an argument, this sets the command echo option for the current world to the given value (which should be false to cause commands not to be echoed or true to cause them to be echoed). For more details of the command echo option, see If called without arguments, it doesn't change the status of that option, but returns its current value. <function>$world->connectother</function> void $world->connectother This function allows you to select another World to connect to, using the same window. If you are connected, you will be first disconnected from the current server. <function>$world->dc</function> void $world->dc Disconnects from the current world. <function>$world->delalias</function> $n = $world->delalias number/name Deletes the alias identified by the given number or name. If there are several aliases with the same name, deletes them all. Returns the number of aliases deleted. <function>$world->delhook</function> $n = $world->delhook event number/name Deletes the hook identified by the given number or name, connected to the specified event. If there are several hooks with the same name, deletes them all. Returns the number of hooks deleted. <function>$world->delmacro</function> $n = $world->delmacro number/name Deletes the macro identified by the given number or name. If there are several macros with the same name, deletes them all. Returns the number of macros deleted. <function>$world->deltimer</function> $n = $world->deltimer number/name Deletes the timer identified by the given number or name. If there are several timers with the same name, deletes them all. Returns the number of timers deleted. <function>$world->deltrigger</function> $n = $world->deltrigger number/name Deletes the trigger identified by the given number or name. If there are several triggers with the same name, deletes them all. Returns the number of triggers deleted. <function>$world->disalias</function> void $world->disalias number/name ... Disables the alias identified by number or name. If there are several aliases with the same name, disables them all. Several arguments can be passed at once. <function>$world->dishook</function> void $world->dishook event number/name ... Disables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, disables them all. Several arguments can be passed at once. <function>$world->dismacro</function> void $world->dismacro number/name ... Disables the macro identified by number or name. If there are several macros with the same name, disables them all. Several arguments can be passed at once. <function>$world->displugin</function> void $world->displugin name Disables the specified plugin. <function>$world->distimer</function> void $world->distimer number/name ... Disables the timer identified by number or name. If there are several timers with the same name, disables them all. Several arguments can be passed at once. <function>$world->distrigger</function> void $world->distrigger number/name ... Disables the trigger identified by number or name. If there are several triggers with the same name, disables them all. Several arguments can be passed at once. <function>$world->echo</function> void $world->echo str ... Prints the strings in the terminal window. They are not sent to the world. See also , . <function>$world->echonl</function> void $world->echonl str ... Prints the strings in the terminal window, each followed by a newline. They are not sent to the world. See also , . <function>$world->echonlandlog</function> void $world->echonlandlog str ... This is a convenience function that just calls and for each argument, thus writing the given line(s) to the screen and to the log file. <function>$world->enaalias</function> void $world->enaalias number/name ... Enables the alias identified by number or name. If there are several aliases with the same name, enables them all. Several arguments can be passed at once. <function>$world->enahook</function> void $world->enahook event number/name ... Enables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, enables them all. Several arguments can be passed at once. <function>$world->enamacro</function> void $world->enamacro number/name ... Enables the macro identified by number or name. If there are several macros with the same name, enables them all. Several arguments can be passed at once. <function>$world->enaplugin</function> void $world->enaplugin name Enables the specified plugin. <function>$world->enatimer</function> void $world->enatimer number/name ... Enables the timer identified by number or name. If there are several timers with the same name, enables them all. Several arguments can be passed at once. <function>$world->enatrigger</function> void $world->enatrigger number/name ... Enables the trigger identified by number or name. If there are several triggers with the same name, enables them all. Several arguments can be passed at once. <function>$world->expandalias</function> $result = $world->expandalias "string" This function expands aliases in the string passed as argument. The result is what you would get if you typed "string" in the input box (except that aliases are still expanded even if Disable Aliases is selected in the Preferences menu). <function>$world->gag</function> void $world->gag pattern Adds a gag that prevents lines matching pattern from being shown. See the function for more advanced options. <function>$world->getaliasnumber</function> @list = $world->getaliasnumber name Returns a list with the number(s) of the alias(es) matching the given name. If no alias with that name is found, returns an empty list. If there are several aliases with the same name, returns the numbers of all of them. The number of an alias is necessary to edit it. However, as the user can change the order of aliases, create new ones and delete old aliases, an alias's number may change, so you should not store its number; you must fetch the number just before editing it. <function>$world->getcharacter</function> $name = $world->getcharacter If autologin was used (see ), this function returns the name of the character used to log in to the mud. If autologin is disabled, this function returns undef. <function>$world->getconntime</function> $seconds = $world->getconntime This function returns the time spent connected to the world, in seconds. <function>$world->getentryfont</function> $font = $world->getentryfont This function returns the name of the font used in the command entry box. <function>$world->gethooknumber</function> @list = $world->gethooknumber event name Returns a list with the number(s) of the hook(s) matching the given name. If no hook with that name is found, returns an empty list. If there are several hooks with the same name, returns the numbers of all of them. You must specify the event in which to search for the hook. The number of a hook is necessary to edit it. However, as the user can change the order of hooks, create new ones and delete old hooks, a hook's number may change, so you should not store its number; you must fetch the number just before editing it. <function>$world->getidletime</function> $seconds = $world->getidletime This function returns the idle time, that is, the time elapsed since the last command was sent, in seconds. See for information on how that time is calculated and how to configure it. <function>$world->getkeycode</function> $keycode = $world->getkeycode After running this function, press a key (or a combination of keys). The keycode (to be used in the function) will be returned and also printed in the screen. <function>$world->getline</function> $text = $world->getline line ($text, $time) = $world->getline line This functions allows you to retrieve a line from the scrollback buffer, and optionally the time in which it was received. line can be a positive number, representing the number of the line to fetch, or a negative number. If negative, that means that number of lines counting from the bottom. (That is, -1 is the last received line, -2 the one before the last, and so on.) If the line cannot be retrieved (because it is not stored anymore), returns undef. The time returned is represented as the number of seconds since the epoch, the same kind of value the time function would return. <function>$world->getlogfile</function> $file = $world->getlogfile This function returns the name of the file to which the output is being logged, or undef if logging is not started for the world. <function>$world->getmacronumber</function> @list = $world->getmacronumber name Returns a list with the number(s) of the macro(s) matching the given name. If no macro with that name is found, returns an empty list. If there are several macros with the same name, returns the numbers of all of them. The number of a macro is necessary to edit it. However, as the user can change the order of macros, create new ones and delete old macros, a macro's number may change, so you should not store its number; you must fetch the number just before editing it. <function>$world->getmainfont</function> $font = $world->getmainfont This function returns the name of the font used in the main MUD window, that is, where the output of the world appears. <function>$world->getname</function> $name = $world->getname This function returns the name of the world. <function>$world->getpluginversion</function> $version = $world->getpluginversion name This functions returns the version of the plugin with the given name. If no plugin with that name is loaded, it returns an empty string. <function>$world->gettimernumber</function> @list = $world->gettimernumber name Returns a list with the number(s) of the timer(s) matching the given name. If no timer with that name is found, returns an empty list. If there are several timers with the same name, returns the numbers of all of them. The number of a timer is necessary to edit it. However, as the user can change the order of timers, create new ones and delete old timers, a timer's number may change, so you should not store its number; you must fetch the number just before editing it. <function>$world->gettriggernumber</function> @list = $world->gettriggernumber name Returns a list with the number(s) of the trigger(s) matching the given name. If no trigger with that name is found, returns an empty list. If there are several triggers with the same name, returns the numbers of all of them. The number of a trigger is necessary to edit it. However, as the user can change the order of triggers, create new ones and delete old triggers, a trigger's number may change, so you should not store its number; you must fetch the number just before editing it. <function>$world->hook</function> void $world->hook event action [attributes] void $world->hook event number [action] [attributes] A hook is an action that is connected to an event, such as connecting to the World or the window receiving focus. This functions allow you to define a hook for a given event, that will execute action, or to edit the hook identifyed by number. Here are the events currently supported: OnConnect: This hook is execued when a connection to the world is made, after the auto-logon has taken place (if applicable). OnDisconnect: This hook is executed when you are disconnected from a World, after the connection has been closed. OnReceivedText: Executed when text is received from the world. OnSentCommand: Executed after a command is sent to the world. The command is available for the hook in the $hookdata variable, and can be inspectd in Perl scripts. OnGetFocus: Executed when the KildClient window receives the focus. OnLoseFocus: Executed when the KildClient window loses the focus. OnCloseConnected: Executed when the world is forcedly closed. This can happen using the World Close menu, the $world->close() function, or by quitting the program with the world connected. You can put in this hook, for example "quit" to always exit the MUD nicely, even if you close the world by mistake. atributes is a reference to a hash defining attributes for the hook. Generally the call works like this: $world->hook("event", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: action: The action to be executed. enabled: If value evaluates to true, the hook is enabled. If it evaluates to false, the hook is disbled and is not executed. name: Assigns a name to the hook, so that it can be referenced by name. <function>$world->hookenabled</function> result = $world->hookenabled event name/number This functions checks whether the specified hook exists and whether it is enabled. The first argument is the name of the event. For the second, you can pass either a hook number or name. If the hook does not exist, this function returns undef, so you can distinguish the case of a non-existant hook from a disabled one. If the hook exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several hooks with the same name, it returns a list with one value for each hook with that name, and each value is 0 or 1 depending on the state of the hook. <function>$world->interpret</function> $world->interpret "string" This function interprets the string as if it were typed in the input box: commands are split, Perl code is run, aliases are expanded, etc. <function>$world->ispermanent</function> $return = $world->ispermanent var This function tests if a variable is permanent. The return value is true or false depending on the variable's status. The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation. <function>$world->listalias</function> void $world->listalias Briefly lists all defined aliases. void $world->listalias number/name ... Lists detailedly the alias with the given number or name. If there are several aliases with the same name, lists them all. Several arguments can be passed at once. <function>$world->listhook</function> void $world->listhook event This function briefly lists all hooks connected to the given event. void $world->listhook event number/name ... Lists detailedly the hook with the given number or name, connected to the specified event. If there are several hooks with the same name, lists them all. Several arguments can be passed at once. <function>$world->listmacro</function> void $world->listmacro Briefly lists all defined macros. void $world->listmacro number/name ... Lists detailedly the macro with the given number or name. If there are several macros with the same name, lists them all. Several arguments can be passed at once. <function>$world->listpermanent</function> void $world->listpermanent This function prints a list of all variables that are defined as permanent, that is, variables that will be saved when you close the world and have their values restores when the world is re-opened. <function>$world->listplugin</function> void $world->listplugin Briefly lists all loaded plugins. void $world->listplugin name/number Gives detailed information on the given plugin. <function>$world->listtimer</function> void $world->listtimer Briefly lists all defined timers. void $world->listtimer number/name ... Lists detailedly the timer with the given number or name. If there are several timers with the same name, lists them all. Several arguments can be passed at once. <function>$world->listtrigger</function> void $world->listtrigger Briefly lists all defined triggers. void $world->listtrigger number/name ... Lists detailedly the trigger with the given number or name. If there are several triggers with the same name, lists them all. Several arguments can be passed at once. <function>$world->loadplugin</function> $success = $world->loadplugin name $success = $world->loadplugin file Loads a plugin. You can either pass a full path for the file that defines the plugin, or just its name. If you provide only the name, a file with that name (and the extesion .pl, if the extension is not already provided) will be looked for in the directories specified by the @PLUGINDIRS array. By default, this array contain two directories: one where KildClient stores some of its files (generally /usr/local/share/kildclient/plugins) and one in the user's home directory (~/.kildclient/plugins), but feel free to add more directories to search plugins for. This function returns true if the plugin was successfully loaded, and false otherwise (including the case in which the plugin was already loaded). See also for a way to load a plugin unless it is already loaded. <function>$world->logfile</function> void $world->logfile file [timeformat] Starts logging to the given file. Everything output by the mud will be saved. If timeformat is specified, it is considered a string to be passed to the C strftime() function, with special tags that are replace with the current time and/or date, and the resulting string is prefixed to each line. (See the strftime manual page for the possible tags.) If this argument is not given, nothing is prefixed to the lines. It is not possible to log to more than one file at one time, if there is already a log file open, it will be closed and logging will continue to the new file. void $world->logfile With no arguments, this function stops logging output. <function>$world->macro</function> void $world->macro keycode action [attributes] void $world->macro number [keycode [action]] [attributes] Creates a new macro, or edits the macro identified by number. keycode represents a key such as "KP_Home" or "<Control>F12". The format is the one accepted by the GTK+ function gtk_accelerator_parse(), but most of the time you will want to use the function to retrieve the keycode for a given key. action is what will be executed when the key (or keys) is pressed. Atributes is a reference to a hash defining attributes for the macro. Generally the call works like this: $world->macro("keycode", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: key: The key code. action: The action to be executed. enabled: If value evaluates to true, the macro is enabled, if false, it is disabled and is not run if the key is pressed. name: Assigns a name to the macro, so that it can be referenced by name. <function>$world->macroenabled</function> result = $world->macroenabled name/number This functions checks whether the specified macro exists and whether it is enabled. You can pass either a macro number or name. If the macro does not exist, this function returns undef, so you can distinguish the case of a non-existant macro from a disabled one. If the macro exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several macros with the same name, it returns a list with one value for each macro with that name, and each value is 0 or 1 depending on the state of the macro. <function>$world->movetimer</function> void $world->movetimer number/name new_pos Moves the timer with the given name or number so that it occupies the position new_pos after execution of this function. Other timers might be moved up or down in result of this. If new_pos is negative or greater than the number of timers, the timer is moved to the last position. If there are several timers with the given name, only the first one found is moved. <function>$world->makepermanent</function> void $world->makepermanent var ... This function marks one or more variables as permanent, that is, the values of these variables will be saved when the world is closed, and reloaded when the World is opened, thus keeping their values between successive uses of the World. The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation. <function>$world->maketemporary</function> void $world->maketemporary var ... This function marks one or more variables as temporary, that is, the values of these variables will not be saved when the World is closed. This is the standard behaviour for variables, so this function is only needed to undo the efects of the function. The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation. <function>$world->mlsend</function> success = $world->mlsend attributes This functions emulates the Multi-line Send feature (see ) from perl scripts. Several lines can be sent at once, optionally prefixing and/or suffixing each line with text you specify. It's also possible to send the contents of a file to the MUD. The lines can be sent with customized intervals between them (so as not to cause buffer overflows that lead to a disconnection from the server). atributes is a reference to a hash defining attributes for the timer. Generally the call works like this: $world->mlsend({ attribute1 => value1, attribute2 => value2, ... }) Possible attributes: initialtext: Lines of text to be sent to the MUD before anything else. You can specify this argument in two ways: one is as a string composed of several lines, KildClient will split the string and send each line separately. The second option is to pass a reference to an array, where each element is a line. The following two call are thus equivalent: $world->mlsend({ initialtext => "First line\nSecond line\nLast line" }) $world->mlsend({ initialtext => [ "First line", "Second line", "Last line" ]}) file: The path to a file whose contents are to be sent, line by line, after sending the initialtext (if present), but before sending finaltext. finaltext: Lines to be sent after the file contents has been sent (if a file was specified). This is very similar to initialtext, and can be given also as a multi-line string or as a reference to an array of lines. linestart: If present, specifies a string that is prepended to each line as it is sent to the MUD. lineend: If present, specifies a string that is appended to each line as it is sent to the MUD. delay: The delay, in seconds, between each group of lines. If you are getting disconnected for sending too much text at once, increase this value. If not given, the value is taken from the Global Preferences (see ). linesatime: The number of lines to be sent at a time. If not given, the value is taken from the Global Preferences (see ). On success, returns true. If the file does not exist or cannot be open, this function does nothing and returns a false value. It returns undef if invalid parameters are specified. You might also want to see the and functions which are simpler ways of sending several lines or the contents of a file at once, respectively. <function>$world->movealias</function> void $world->movealias number/name new_pos Moves the alias with the given name or number so that it occupies the position new_pos after execution of this function. Other aliases might be moved up or down in result of this. If new_pos is negative or greater than the number of aliases, the alias is moved to the last position. If there are several aliases with the given name, only the first one found is moved. <function>$world->movehook</function> void $world->movehook event number/name new_pos Moves the hook with the given name or number, connected to the given event, so that it occupies the position new_pos after execution of this function. Other hooks might be moved up or down in result of this. If new_pos is negative or greater than the number of hooks, the hook is moved to the last position. If there are several hooks with the given name, only the first one found is moved. <function>$world->movemacro</function> void $world->movemacro number/name new_pos Moves the macro with the given name or number so that it occupies the position new_pos after execution of this function. Other macros might be moved up or down in result of this. If new_pos is negative or greater than the number of macros, the macro is moved to the last position. If there are several macros with the given name, only the first one found is moved. <function>$world->movetrigger</function> void $world->movetrigger number/name new_pos Moves the trigger with the given name or number so that it occupies the position new_pos after execution of this function. Other triggers might be moved up or down in result of this. If new_pos is negative or greater than the number of triggers, the trigger is moved to the last position. If there are several triggers with the given name, only the first one found is moved. <function>$world->next</function> void $world->next [number] If used without arguments, this function focuses the next open World. You can also give a numeric argument X, in this case it focuses the Xth World after the current one. <function>$world->path</function> void $world->path str str is a string defining a path. The following example shows the features of paths: 3n2e4n2e{ne}e{open door}3n The general syntax syntax is "<number of repetitions><command>". "<number of repetitions>" can be omitted, in this case it is considered as 1. command is the command that will be repeated. If it is not a one-letter command, it should be enclosed in braces ({}). The example above would generate these commands: n n n e e n n n n e e ne e open door n n n The commands are send using the settings in the Sending tab of the Preferences dialog (see ). <function>$world->prev</function> void $world->prev [number] If used without arguments, this function focuses the previous open world. You can also give a numeric argument X, in this case it focuses the Xth world before the current one. <function>$world->reconnect</function> void $world->reconnect When in offline mode, this function will attempt to reconnect to the mud. <function>$world->requireplugin</function> $success = $world->requireplugin name This function is similar to , but first checks if the plugin is already loaded. If it is, it returns successfully. If not, it tries loading the plugin (silently). If this succeeds, the function returns successfully, if not, it die()'s. This function is useful in plugins that require other plugins, and is meant to be called in a BEGIN block of a plugin that requires another. The argument passed must be the name of the plugin (a path to the file is not allowed, unlike with . See for information on how plugins are found. <function>$world->save</function> void $world->save Saves the current World. <function>$world->send</function> void $world->send str ... Sends any number of strings to the current world. After each string, a newline is send, so that the MUD recognizes it as a command. See also , and . <function>$world->sendecho</function> void $world->sendecho str ... Sends any number of strings to the current world. After each string, a newline is send, so that the MUD recognizes it as a command. The commands are always echoed to the window, regardless of the setting of the command echo option (see ). See also and . <function>$world->sendfile</function> success = $world->sendfile file [delay [n-lines]] Sends the contents of the given file to the world. delay is the number of seconds to wait between sending each group of lines, and n-lines is the number of lines to send a time. If these values are not specified, they are taken from the defauls set in the Preferences dialog (see ). On success, returns true. If the file does not exist or cannot be open, this function does nothing and returns a false value. It returns undef if the file name is not specified. For more options, see the function which allows adding a text before and/or after each line, and sending lines before and/or after sending the contents of the file. <function>$world->sendlines</function> success = $world->sendlines "multi-line string" [delay [n-lines]] success = $world->sendlines [ "line 1", "line 2", ... ] [delay [n-lines]] Sends several lines of text to the world. delay is the number of seconds to wait between sending each group of lines, and n-lines is the number of lines to send a time. If these values are not specified, they are taken from the defauls set in the Preferences dialog (see ). There are two ways to specify the lines to be sent: the first is passing a multi-line string, which is split into lines and each line is sent separately. The second one is passing a reference to an array where each element consists of one line. This function always returns true. For more options, see the function which allows adding a text before and/or after each line, and sending lines before and/or after sending the contents of the file. <function>$world->sendmsdpcommand</function> void $world->sendmsdpcommand command argument1 ... Sends a specific type of data to the server using MSDP. See . <function>$world->sendnoecho</function> void $world->sendnoecho str ... Sends any number of strings to the current world. After each string, a newline is send, so that the MUD recognizes it as a command. The commands are not echoed to the window, regardless of the setting of the command echo option (see ). See also and . <function>$world->sendserverdata</function> void $world->sendserverdata hash_reference Sens out-of-band data to the server. See for details. <function>$world->setstatus</function> void $world->setstatus text Sets the text in the main window status bar to the given text. <function>$world->silentdisalias</function> void $world->silentdisalias number/name ... Disables the alias identified by number or name. If there are several aliases with the same name, disables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success. <function>$world->silentdishook</function> void $world->silentdishook event number/name ... Disables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, disables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success. <function>$world->silentdismacro</function> void $world->silentdismacro number/name ... Disables the macro identified by number or name. If there are several macros with the same name, disables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success. <function>$world->silentdistimer</function> void $world->silentdistimer number/name ... Disables the timer identified by number or name. If there are several timers with the same name, disables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success. <function>$world->silentdistrigger</function> void $world->silentdistrigger number/name ... Disables the trigger identified by number or name. If there are several triggers with the same name, disables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success. <function>$world->silentenaalias</function> void $world->silentenaalias number/name ... Enables the alias identified by number or name. If there are several aliases with the same name, enables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success. <function>$world->silentenahook</function> void $world->silentenahook event number/name ... Enables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, enables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success. <function>$world->silentenamacro</function> void $world->silentenamacro number/name ... Enables the macro identified by number or name. If there are several macros with the same name, enables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success. <function>$world->silentenatimer</function> void $world->silentenatimer number/name ... Enables the timer identified by number or name. If there are several timers with the same name, enables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success. <function>$world->silentenatrigger</function> void $world->silentenatrigger number/name ... Enables the trigger identified by number or name. If there are several triggers with the same name, enables them all. Several arguments can be passed at once. Does not print a message in the screen in case of success. <function>$world->timer</function> void $world->timer attributes void $world->timer number attributes Creates a new timer, or edits the timer identified by number. atributes is a reference to a hash defining attributes for the timer. Generally the call works like this: $world->timer({ attribute1 => value1, attribute2 => value2, ... }) Possible attributes: interval: Number of seconds between each execution. Fractions of seconds (such as 1.5) are allowed. Required. count: Number of times to execute the timer. After this number of executions, the timer will be automatically disabled or deleted (see temporary flag below). If count is not given or count is -1, the timer repeats until manually disabled or deleted. action: The action to execute. Required. temporary: If set to 1, the timer will be deleted (and not only disabled) after count executions have happened. enabled: If set to 1, the timer is enabled and will execute every count seconds. If set to 0, the timer does not execute until enabled again. New timers are created enabled by default. name: Assigns a name to the timer, so that it can be referenced by name. <function>$world->timerenabled</function> result = $world->timerenabled name/number This functions checks whether the specified timer exists and whether it is enabled. You can pass either a timer number or name. If the timer does not exist, this function returns undef, so you can distinguish the case of a non-existant timer from a disabled one. If the timer exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several timers with the same name, it returns a list with one value for each timer with that name, and each value is 0 or 1 depending on the state of the timer. <function>$world->trigger</function> void $world->trigger pattern action [attributes] void $world->trigger number [pattern [action]] [attributes] Creates a new trigger, or edits the trigger identified by number, matching pattern (a Perl regular expression), that will execute action when a line is matched by pattern. action is interpreted as if it were typed in the command box. Simple strings get sent to the world, Perl code can be run by prefixing it with '/', etc. atributes is a reference to a hash defining attributes for the trigger. Generally the call works like this: $world->trigger("pattern", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: pattern: The pattern to match. action: The action to be executed. enabled: If value evaluates to true, the trigger is enabled. If it evaluates to false, the trigger is disbled and lines are not matched against it. name: Assigns a name to the trigger, so that it can be referenced by name. ignorecase: If value evaluates to true, ignore case when matching the pattern. gag: If value evaluates to true, the line that triggered it is not printed. gaglog: If value evaluates to true, the line that triggered it is not written to the log file. keepexecuting: If the value evaluates to true, when a line matches the trigger, the actions for the trigger are executed, and matching of the line continues against other triggers. If this is false (the default), when this trigger matches no other triggers are matched. rewriter:This trigger is a rewriter trigger. It is run before other triggers, does not prevent any other trigger from running (even if keepexecuting is false), and can alter the input line for further processing by changing the $colorline variable. For more details, see . style: Used to control the changing of styles (color, attributes, etc.) of a matched part of the line. The value of this attribute is an anonymous hash that specifies everything that is to be changed. Here's an example: Changing styles with triggers $world->trigger('Joe', { name => 'joe', style => { enabled => 1, fg => 16 } }); These are the valid attributes: enabled: Set this to 1 to enable changing the style. target: What to highlight. Possible values are: -1 - The whole matched line 0 - The whole substring that matched 1 - The first captured substring 2 - The second captured substring 3 - etc. fg: What to do with the foreground colour. -1 means not to change it. Other values change to the given color, as follows: 0 - black 9 - black (bold) 1 - red 10 - red (bold) 2 - green 11 - green (bold) 3 - yellow 12 - yellow (bold) 4 - blue 13 - blue (bold) 5 - magenta 14 - magenta (bold) 6 - cyan 15 - cyan (bold) 7 - white 16 - white (bold) 8 - the default color 17 - default bold color bg: What to do with the background color. The values are the same as for the foreground color. italics: Italics setting. -1 means do not change. 0 means to not use italics, and 1 means to use it. strike: Strike-thru setting. -1 means do not change. 0 means disable it, and 1 means enable it. underline: Underline setting. -1 means no change. 0 means no underline. 1 means single underline, and 2 means double underline. <function>$world->triggerenabled</function> result = $world->triggerenabled name/number This functions checks whether the specified trigger exists and whether it is enabled. You can pass either a trigger number or name. If the trigger does not exist, this function returns undef, so you can distinguish the case of a non-existant trigger from a disabled one. If the trigger exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several triggers with the same name, it returns a list with one value for each trigger with that name, and each value is 0 or 1 depending on the state of the trigger. <function>$world->writetolog</function> void $world->writetolog str ... Writes the given line to the log file, if any. If logging is not currently enabled, then this function does nothing. Each argument is a complete line, that is written preceded by a timestamp, if this is enabled, to the log file. If the string has ANSI codes or codes used by the function, they will be stripped and not written to the log file. See also . Using KCWin for Input/Output Windows KCWin is a standard plugin distributed with KildClient that allows you to create windows with a terminal for output and an entry box for input. These windows do nothing by themselves, but they can be used by other plugins when they need a window for input and output. The output area supports ANSI colors and thus is like a mini MUD window. This plugin requires the gtk3-perl bindings. It will fail to run if these bindings are not found. This plugin is more often used as a helper for other plugins. A plugin that uses KCWin should use $::world->requireplugin('KCWin') in a BEGIN block, as described in . Use KCWin->new to create a new window. KCWin derives from Gtk3::Window so you can use all of its methods. The widgets are accessible for customization. If $kcw is a KCWin, the following widgets are available: $kcw->{VBOX}, Gtk3::Box, the vertical box that contains the output and input areas. $kcw->{SCROLLWIN}, Gtk3::ScrolledWindow, this holds the TextView that is used for output. $kcw->{TEXTVIEW}, Gtk3::TextView, is the widget used for output. $kcw->{TEXTBUFFER}, Gtk3::TextBuffer, for convenience, the TextBuffer displayed in the window. $kcw->{CMDAREA}, Gtk3::HBox, a box that holds a button to clear the input area, and the input area itself. $kcw->{BTNCLEAR}, Gtk3::Button, a button that clears the input entry widget when clicked. $kcw->{ENTRY}, Gtk3::Entry, the input entry widget. Connect to the activate signal of this widget to do something when the user presses ENTER in this widget. The widgets can be used, and the window can be customized (by adding other widgets, for example). Some common actions have functions in KCWin as a shortcut. These functions will be described in the following sections. Changes from Previous Versions KCWin version 2.x was based on the gtk2-perl bindings, for GTK+ 2.x. KCwin 3.x is based on gtk3-perl, just as KildClient 3.x uses GTK+ 3.x. If your plugin uses GTK+ functions directly, you'll have to convert it to use gtk3-perl. <function>KCWin::get_text</function> $text = KCWin::get_text Returns the text in the entry box. <function>KCWin::set_text</function> void KCWin::set_text $text Sets the text in the entry box. <function>KCWin::feed</function> void KCWin::feed $text Appends text to the output terminal widget. $text can contain ANSI color sequences. The function can be useful in conjuntion with this function. Writing Plugins This appendix will describe how you can write your own plugins for KildClient. It will describe the format of the plugin file, what it should have, and some guidelines that all plugins should follow. The first thing to decide when writing a plugin is the name. Since each plugin defines a Perl package, the name should be a valid name for a Perl package. Moreover, it is a good practice to name the plugin file with the name of the plugin (although the name of the file could be different), so stick with letters, numbers, and the underscore. It should not start with an underscore, however, because all identifiers that start with an underscore are understood to be interal of KildClient. The File Format The plugin file is just a Perl file that is read and run by KildClient when the plugin is loaded. This file can call KildClient's functions to add triggers, aliases, macros or timers, to set permanent variables, etc. It usually also defines new subroutines for use in the triggers, etc, or to be called directly by the user. However, the plugin file must with a header, which has a fixed format. If the header is not in this format, the plugin will not be recognized. The header is shown in .
The Plugin Header package NAME; #: Version: VERSION #: Description: ONE LINE DESCRIPTION #: Author: AUTHOR'S NAME (OPTIONAL)
The first line defines the plugin's name, which will be used to refer to it later. It also starts a Perl package. All plugins define a package, so that one plugin's functions do not interfere with other plugin's ones. The second line specifies the plugin's version. This is most informative, but is also used by KildClient to ensure that only one version of the plugin is loaded. Next, there comes a short one-line description of the plugin. It should be brief but descriptive, and it is shown in the output of the $world->listplugin function. Finally, it is possible to inform the author of the plugin. This line, however, is not required, but the author's name will appear in the plugin listing if it is informed. After that, comes the plugin code. This is just Perl code, executed by KildClient when the plugin is loaded (with do).
A Sample Plugin Here is a simple but complete plugin. It will be used to illustrate many things about plugins. A Sample Plugin package sample; #: Version: 1.0 #: Description: A Sample Plugin #: Author: Eduardo M Kalinowski $::world->trigger('First', 'of the plugin', { name => 'sample:misc' }); $::world->trigger('Second', 'of the plugin', { name => 'sample:misc' }); $::world->timer({ interval => 5, action => 'sample plugin', name => 'sample:misc' }); $::world->macro('F8', '/sample::stop', { name => 'sample:enadis' }); $::world->macro('F9', '/sample::start', { name => 'sample:enadis' }); sub testplugin { $::world->echonl("The plugin works."); } sub stop { $::world->distimer('sample:misc'); } sub start { $::world->enatimer('sample:misc'); } sub help { $::world->echonl("This is a sample plugin, that does nothing useful."); $::world->echonl("It outputs a short string every now and them. This"); $::world->echonl("behaviour can be stopped by pressing the F8 key, and"); $::world->echonl("re-enabled with the F9 key."); $::world->echonl("One function is defined: sample::testplugin. It"); $::world->echonl("outputs something to show that the plugin is working."); } The first thing in the file is the header, in the format described above. then comes trigger, timer, and macro definitions. All definitions of triggers, aliases, macros, timers, hook and permanent variables, if any, should be in the top-level scope (which means they will be executed when the plugin is loaded). (Alternatively, you could put them in a BEGIN block, which would have the same result, but there isn't a reason for that.) You should not create any of those objects in any function. It should be noted that the $world variable is refereed as $::world. It is just because we are inside a package, and $world does not belong to this package. Otherwise, the calls are equal. After that, some functions are defined. testplugin is meant to be called by the user. stop and start are used by the macros (but they could also be called by the user). Finally, a help is defined, that outputs some information about the plugin. All plugins should define a help describing themselves. Disposing Data When the Plugin Is Unloaded If the plugin defines a function called UNLOAD, this function will be called when the plugin is unloaded. Currently this happens only when the World that loaded the plugin is closed. If your plugin must dispose of anything it created that would be kept behind even when the World is closed, the UNLOAD function is the place to do that. Enabling and Disabling Plugins As described in , the user can enable or disable plugins. By default, disabling a plugin means disabling all its triggers, macros, aliases, hooks and timers, and enabling a plugin means enabling all the above items. Most of the times that is enough, but for some plugins this naive approach may not be appropriate. One such case is when a plugin has some triggers (or any other kind of item) that is not necessarily always enabled, and whose status is set by some other means. In these cases, you can define two functions named ENABLE and DISABLE. These will be called when the plugin is being enabled and disabled, respectively, and you can do whatever is necessary in there. If these functions are defined, then the standard behaviour (enabling or disabling all items) is not done, and you must do whatever is necessary by yourself. Also, no message is printed, so you might want to print some informative message. The functions should return a true value to indicate success. If for some reason the operation could not be done and the status should not be changed, return a false value and the status of the plugin will not be altered. But use this feature with care. If the functions are not defined, then the default behavior described above is used. So if your plugin doesn't have special needs, you do not need to define these functions. Conditional Loading of Plugins If your plugin depends on some condition to be successfully loaded, you should include a test for whatever is required in a BEGIN block, and if the conditions are not present, you should call the Perl die function passing a descriptive message telling why the plugin could not be loaded. For example, here is part of a hypothetical spell-checker plugin that uses the file /usr/share/dict/words file: Conditional loading of plugins package spellcheck; #: Version: 1.0 #: Description: Spell Checker #: Author: Somebody BEGIN { die("Word file (/usr/share/dict/words) could not be read") unless -r /usr/share/dict/words; } ... When the user tries to load that plugin, the test will be made. If the file cannot be read (because it does not exist, or the permissiosn are wrong, or for any other reason), die will be called, the plugin will not be loaded, and the given message will be printed in the screen. Plugins That Require Other Plugins If your plugin requires some other plugin, you should use the $world->requireplugin function in a BEGIN block. This function will verify if the named plugin is already loaded. If it is, it returns successfully. If it is not loaded, the function will try to load the plugin. If it could be loaded, the function exits successfully. If, however, the plugin could not be loaded (because it was not found, or because it failed some condition), $world->requireplugin will call die, which will abort the loading the plugin that required the other plugin. As an example, consider the plugin foo, which requires the bar plugin: A plugin that requires another package foo; #: Version: 1.0 #: Description: The Super Frobnicator #: Author: Somebody BEGIN { $::world->requireplugin('bar'); } ... If foo was loaded successfully, you can be sure that the bar plugin and its functionality is present. If bar could not be loaded, foo will not be loaded. Using GTK+ From Plugins With the use of the gtk3-perl bindings, it is possible to use the full power of the GTK+ library in KildClient plugins. This allows you to create dialogs, windows, message boxes, and anything else your plugin needs. Using gtk3-perl in a KildClient plugin is straightforward, there is just a couple of points to be observed. Import the Perl modules as usual, generally with a line like this: "use Gtk3 -init;". Create windows and display them as usual. The biggest difference is that you must not call Gtk3->main. Since KildClient is a GTK+ application, it already runs a main loop, and starting another one would lock KildClient and make it unresponsive. Also, you must never call Gtk3->main_quit, because that would cause KildClient to quit. Even tough the world would be saved, the user certainly wouldn't want that. All features of GTK+ are supported, as are all of gtk3-modules (this includes modules for the base libraries Glib and GDK, and also for other libraries such as the Gnome ones). Notably, Gtk3::Builder is supported, which allows you to create complex user interfaces visually and load them from the .ui file in the plugin. Note that having the gtk3-perl bindings is not necessary to run KildClient. If they are not present, however, it will not be possible to run plugins that use it, naturally. The plugins will not be loaded because an error will be generated when the modules are loaded (in the "use Gtk3 -init;" line). The example below shows a very simple (and not very useful) plugin using gtk3-perl. It should show how simple it is to use the gtk3-perl bindings in KildClient plugin. A plugin that uses gtk3-perl package gtksample; #: Version: 1.0.0 #: Description: A Plugin Using gtk3-perl #: Author: Eduardo M Kalinowski use Gtk3 -init; # Is the window being displayed? our $window_displayed = 0; # Widgets our $window; our $entry; our $button; sub help { $::world->echonl("This plugins demonstrates the use of gtk3-perl under KildClient.", "It does nothing really useful.", "", "Enter /gtksample::run to try it."); } sub run { return if $window_displayed; $window = Gtk3::Window->new(); $window->set_title("gtk3-perl test"); $window->signal_connect(delete_event => sub { $window_displayed = 0; return 0; }); my $vbox = Gtk3::Box->new('vertical', 8); $entry = Gtk3::Entry->new(); $entry->set_text("Type something here"); $vbox->pack_start($entry, 0, 1, 0); $button = Gtk3::Button->new("And click me"); $button->signal_connect(clicked => \&on_button_clicked); $vbox->pack_start($button, 0, 1, 0); $window->add($vbox); $window->show_all(); $window_displayed = 1; } sub on_button_clicked { $button->set_label($entry->get_text()); } sub UNLOAD { $window->destroy if $window_displayed; } Notice how it defines a UNLOAD function that destroys the window if it is being displayed. Plugins that open windows almost always need such a function to delete the windows that are still open when the World is closed. If these windows are not closed, the program will most likely crash if the user tries to use them after the Worlds has been closed, so make sure they get deleted. For more information on gtk3-perl, see https://metacpan.org/release/Gtk3/. Plugin Conventions The first convention about plugins has been mentioned already: all plugins should define a help describing themselves. This help can be as detailed as necessary. Another convention regards the use of triggers, aliases, macros, timers and hooks. All of them should have names (and they should always be referenced by names, because the plugin writer cannot know which number will be assigned to them), and the names should consist of the name of the plugin, a colon, and then some descriptive name for the trigger (or alias, etc). This is to avoid name clashes with other plugins. Another aspect regarding triggers, aliases, macros, timers and hooks is that they should only be created in the top-level scope, which means they are created when the plugin is loaded. They must not be created in a function that is called later, because this way they would not be recognized as belonging to the plugin, and this would create a mess for the user. So create them outside any functions.
kildclient-3.0.0/doc/C/Makefile.in0000644000175000017500000005116412376345610013567 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc/C DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(manualdir)" DATA = $(manual_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = images pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html #pkgdoc_DATA = kildclient.pdf manual_DATA = $(wildcard kildclient/*.html) EXTRA_DIST = kildclient.xml $(pkgdoc_DATA) $(manual_DATA) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/C/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/C/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-manualDATA: $(manual_DATA) @$(NORMAL_INSTALL) @list='$(manual_DATA)'; test -n "$(manualdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(manualdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(manualdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(manualdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(manualdir)" || exit $$?; \ done uninstall-manualDATA: @$(NORMAL_UNINSTALL) @list='$(manual_DATA)'; test -n "$(manualdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(manualdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(manualdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html-am: info: info-recursive info-am: install-data-am: install-manualDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-manualDATA .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ dist-hook distclean distclean-generic distclean-tags distdir \ dvi dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-manualDATA \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-am uninstall uninstall-am uninstall-manualDATA dist-hook: html verify: xmllint --valid --noout kildclient.xml html: kildclient.xml db2html kildclient.xml pdf: kildclient.xml -db2pdf kildclient.xml .PHONY: verify html pdf # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: kildclient-3.0.0/doc/Makefile.in0000644000175000017500000004377412376345610013415 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = C all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: kildclient-3.0.0/compile0000755000175000017500000001624512302342414012136 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: kildclient-3.0.0/mkinstalldirs0000744000175000017500000000672212073641104013366 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2009-04-28.21; # UTC # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' IFS=" "" $nl" errstatus=0 dirmode= usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit $? ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do case $file in /*) pathcomp=/ ;; *) pathcomp= ;; esac oIFS=$IFS IFS=/ set fnord $file shift IFS=$oIFS for d do test "x$d" = x && continue pathcomp=$pathcomp$d case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr= chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp=$pathcomp/ done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: kildclient-3.0.0/configure0000744000175000017500000063717112376345610012510 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for kildclient 3.0.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='kildclient' PACKAGE_TARNAME='kildclient' PACKAGE_VERSION='3.0.0' PACKAGE_STRING='kildclient 3.0.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="src/main.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS RES_COMPILE WINDRES BUILD_DOCS_FALSE BUILD_DOCS_TRUE LIBGNUTLS_LIBS LIBGNUTLS_CFLAGS GTKSPELL_LIBS GTKSPELL_CFLAGS KILDCLIENT_PERL_LIBS KILDCLIENT_PERL_CFLAGS PERL GTK_LIBS GTK_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG MKINSTALLDIRS POSUB POFILES PO_IN_DATADIR_FALSE PO_IN_DATADIR_TRUE INTLLIBS INSTOBJEXT GMOFILES DATADIRNAME CATOBJEXT CATALOGS XGETTEXT GMSGFMT MSGFMT_OPTS MSGFMT USE_NLS EGREP GREP CPP GETTEXT_PACKAGE am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_dependency_tracking with_gtkspell with_libgnutls with_docs ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GTK_CFLAGS GTK_LIBS GTKSPELL_CFLAGS GTKSPELL_LIBS LIBGNUTLS_CFLAGS LIBGNUTLS_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures kildclient 3.0.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/kildclient] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of kildclient 3.0.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gtkspell use gtkspell for spell cheking (default is YES) --with-libgnutls use libgnutls to allow connecting via TLS/SSL (default is YES) --with-docs generate the docbook documentation (default is YES) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config GTKSPELL_CFLAGS C compiler flags for GTKSPELL, overriding pkg-config GTKSPELL_LIBS linker flags for GTKSPELL, overriding pkg-config LIBGNUTLS_CFLAGS C compiler flags for LIBGNUTLS, overriding pkg-config LIBGNUTLS_LIBS linker flags for LIBGNUTLS, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF kildclient configure 3.0.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by kildclient $as_me 3.0.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac am__api_version='1.14' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='kildclient' VERSION='3.0.0' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ac_config_headers="$ac_config_headers kcconfig.h:config.h.in" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi for ac_func in localtime_r do : ac_fn_c_check_func "$LINENO" "localtime_r" "ac_cv_func_localtime_r" if test "x$ac_cv_func_localtime_r" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOCALTIME_R 1 _ACEOF fi done GETTEXT_PACKAGE=kildclient ALL_LINGUAS="de eo es pt_BR sv" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in locale.h do : ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" if test "x$ac_cv_header_locale_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOCALE_H 1 _ACEOF fi done if test $ac_cv_header_locale_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if ${am_cv_val_LC_MESSAGES+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_val_LC_MESSAGES=yes else am_cv_val_LC_MESSAGES=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 $as_echo "$am_cv_val_LC_MESSAGES" >&6; } if test $am_cv_val_LC_MESSAGES = yes; then $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h fi fi USE_NLS=yes gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = xyes; then : gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5 $as_echo_n "checking for ngettext in libc... " >&6; } if ${gt_cv_func_ngettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !ngettext ("","", 1) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_ngettext_libc=yes else gt_cv_func_ngettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5 $as_echo "$gt_cv_func_ngettext_libc" >&6; } if test "$gt_cv_func_ngettext_libc" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5 $as_echo_n "checking for dgettext in libc... " >&6; } if ${gt_cv_func_dgettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !dgettext ("","") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_dgettext_libc=yes else gt_cv_func_dgettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5 $as_echo "$gt_cv_func_dgettext_libc" >&6; } fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5 $as_echo_n "checking for bindtextdomain in -lintl... " >&6; } if ${ac_cv_lib_intl_bindtextdomain+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bindtextdomain (); int main () { return bindtextdomain (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_bindtextdomain=yes else ac_cv_lib_intl_bindtextdomain=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain" >&5 $as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } if test "x$ac_cv_lib_intl_bindtextdomain" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5 $as_echo_n "checking for dgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgettext (); int main () { return dgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dgettext=yes else ac_cv_lib_intl_dgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext" >&5 $as_echo "$ac_cv_lib_intl_dgettext" >&6; } if test "x$ac_cv_lib_intl_dgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes fi fi fi if test "$gt_cv_func_dgettext_libintl" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5 $as_echo_n "checking if -liconv is needed to use gettext... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5 $as_echo_n "checking for dcgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dcgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dcgettext (); int main () { return dcgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dcgettext=yes else ac_cv_lib_intl_dcgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext" >&5 $as_echo "$ac_cv_lib_intl_dcgettext" >&6; } if test "x$ac_cv_lib_intl_dcgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv else : fi else : fi fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" for ac_func in dcgettext do : ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext" if test "x$ac_cv_func_dcgettext" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DCGETTEXT 1 _ACEOF fi done MSGFMT_OPTS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5 $as_echo_n "checking if msgfmt accepts -c... " >&6; } cat >conftest.foo <<_ACEOF msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" _ACEOF if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5 ($MSGFMT -c -o /dev/null conftest.foo) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then MSGFMT_OPTS=-c; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } echo "$as_me: failed input was:" >&5 sed 's/^/| /' conftest.foo >&5 fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CATOBJEXT=.gmo DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : CATOBJEXT=.gmo DATADIRNAME=share else CATOBJEXT=.mo DATADIRNAME=lib fi ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi fi if test "$gt_cv_have_gettext" = "yes" ; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po ac_config_commands="$ac_config_commands default-1" for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5 $as_echo_n "checking for catalogs to be installed... " >&6; } NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5 $as_echo "$LINGUAS" >&6; } fi if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.10.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.10.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.10.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.10.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.10.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.10.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.10.0" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.10.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.10.0) were not met: $GTK_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi case $host in *-*-mingw32*) ;; *) # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PERL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PERL"; then ac_cv_prog_PERL="$PERL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PERL="perl" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PERL=$ac_cv_prog_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_perl_modules="ExtUtils::Embed" # Make sure we have perl if test -z "$PERL"; then # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PERL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PERL"; then ac_cv_prog_PERL="$PERL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PERL="perl" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PERL=$ac_cv_prog_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$PERL" != x; then ac_perl_modules_failed=0 for ac_perl_module in $ac_perl_modules; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl module $ac_perl_module" >&5 $as_echo_n "checking for perl module $ac_perl_module... " >&6; } # Would be nice to log result here, but can't rely on autoconf internals $PERL "-M$ac_perl_module" -e exit > /dev/null 2>&1 if test $? -ne 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; ac_perl_modules_failed=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; }; fi done # Run optional shell commands if test "$ac_perl_modules_failed" = 0; then : KILDCLIENT_PERL_CFLAGS=`$PERL -MExtUtils::Embed -e ccopts` KILDCLIENT_PERL_LIBS=`$PERL -MExtUtils::Embed -e ldopts` else : as_fn_error $? "The perl ExtUtils::Embed module could not be found" "$LINENO" 5 fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find perl" >&5 $as_echo "$as_me: WARNING: could not find perl" >&2;} fi ;; esac # Check whether --with-gtkspell was given. if test "${with_gtkspell+set}" = set; then : withval=$with_gtkspell; use_gtkspell=$withval else use_gtkspell="yes" fi if test "$use_gtkspell" != "no"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKSPELL" >&5 $as_echo_n "checking for GTKSPELL... " >&6; } if test -n "$GTKSPELL_CFLAGS"; then pkg_cv_GTKSPELL_CFLAGS="$GTKSPELL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtkspell3-3.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtkspell3-3.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKSPELL_CFLAGS=`$PKG_CONFIG --cflags "gtkspell3-3.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTKSPELL_LIBS"; then pkg_cv_GTKSPELL_LIBS="$GTKSPELL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtkspell3-3.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtkspell3-3.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKSPELL_LIBS=`$PKG_CONFIG --libs "gtkspell3-3.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTKSPELL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtkspell3-3.0" 2>&1` else GTKSPELL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtkspell3-3.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTKSPELL_PKG_ERRORS" >&5 GTKSPELL_CFLAGS="" GTKSPELL_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found, disabled" >&5 $as_echo "not found, disabled" >&6; } elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } GTKSPELL_CFLAGS="" GTKSPELL_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found, disabled" >&5 $as_echo "not found, disabled" >&6; } else GTKSPELL_CFLAGS=$pkg_cv_GTKSPELL_CFLAGS GTKSPELL_LIBS=$pkg_cv_GTKSPELL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else GTKSPELL_CFLAGS="" GTKSPELL_LIBS="" fi if test "$GTKSPELL_CFLAGS" != "" ; then $as_echo "#define HAVE_GTKSPELL 1" >>confdefs.h fi # Check whether --with-libgnutls was given. if test "${with_libgnutls+set}" = set; then : withval=$with_libgnutls; use_libgnutls=$withval else use_libgnutls="yes" fi if test "$use_libgnutls" != "no"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGNUTLS" >&5 $as_echo_n "checking for LIBGNUTLS... " >&6; } if test -n "$LIBGNUTLS_CFLAGS"; then pkg_cv_LIBGNUTLS_CFLAGS="$LIBGNUTLS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnutls\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnutls") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBGNUTLS_CFLAGS=`$PKG_CONFIG --cflags "gnutls" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBGNUTLS_LIBS"; then pkg_cv_LIBGNUTLS_LIBS="$LIBGNUTLS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnutls\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnutls") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBGNUTLS_LIBS=`$PKG_CONFIG --libs "gnutls" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBGNUTLS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnutls" 2>&1` else LIBGNUTLS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnutls" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBGNUTLS_PKG_ERRORS" >&5 LIBGNUTLS_CFLAGS="" LIBGNUTLS_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found, disabled" >&5 $as_echo "not found, disabled" >&6; } elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } LIBGNUTLS_CFLAGS="" LIBGNUTLS_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found, disabled" >&5 $as_echo "not found, disabled" >&6; } else LIBGNUTLS_CFLAGS=$pkg_cv_LIBGNUTLS_CFLAGS LIBGNUTLS_LIBS=$pkg_cv_LIBGNUTLS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else LIBGNUTLS_CFLAGS="" LIBGNUTLS_LIBS="" fi if test "$LIBGNUTLS_CFLAGS" != "" ; then $as_echo "#define HAVE_LIBGNUTLS 1" >>confdefs.h fi build_docs=yes # Check whether --with-docs was given. if test "${with_docs+set}" = set; then : withval=$with_docs; build_docs=$withval fi if test x$build_docs = xyes; then BUILD_DOCS_TRUE= BUILD_DOCS_FALSE='#' else BUILD_DOCS_TRUE='#' BUILD_DOCS_FALSE= fi case $host in *-*-mingw32*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$WINDRES"; then ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_WINDRES="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi WINDRES=$ac_cv_prog_WINDRES if test -n "$WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5 $as_echo "$WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_WINDRES"; then ac_ct_WINDRES=$WINDRES # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_WINDRES"; then ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_WINDRES="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES if test -n "$ac_ct_WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_WINDRES" >&5 $as_echo "$ac_ct_WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_WINDRES" = x; then WINDRES="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac WINDRES=$ac_ct_WINDRES fi else WINDRES="$ac_cv_prog_WINDRES" fi RES_COMPILE='$(WINDRES) -i $< -o $@ $(RESFLAGS)' ;; *) RES_COMPILE='$(CC) -c -o $@ -x c /dev/null' ;; esac case $host in *-*-mingw32*) LIBS="$LIBS -mwindows -lregex -lws2_32 -lwinmm" ;; esac ac_config_files="$ac_config_files Makefile po/Makefile.in src/Makefile share/Makefile share/plugins/Makefile doc/Makefile doc/C/Makefile doc/C/images/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_DOCS_TRUE}" && test -z "${BUILD_DOCS_FALSE}"; then as_fn_error $? "conditional \"BUILD_DOCS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by kildclient $as_me 3.0.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ kildclient config.status 3.0.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "kcconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS kcconfig.h:config.h.in" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "share/Makefile") CONFIG_FILES="$CONFIG_FILES share/Makefile" ;; "share/plugins/Makefile") CONFIG_FILES="$CONFIG_FILES share/plugins/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/C/Makefile") CONFIG_FILES="$CONFIG_FILES doc/C/Makefile" ;; "doc/C/images/Makefile") CONFIG_FILES="$CONFIG_FILES doc/C/images/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi kildclient-3.0.0/share/0000755000175000017500000000000012376346020011742 500000000000000kildclient-3.0.0/share/plugins/0000755000175000017500000000000012376346020013423 500000000000000kildclient-3.0.0/share/plugins/easypath.pl0000644000175000017500000000052011715757621015524 00000000000000package easypath; #: Version: 1.0.1 #: Description: Adds a shortcut to paths: # #: Author: Eduardo M Kalinowski $::world->alias('^#(.*)$', '/\$world->path("$1")', { name => 'easypath:path' }); sub help { $::world->echonl("Makes # expand to the a path, as the $world->path()", "function would do."); } kildclient-3.0.0/share/plugins/channels.pl0000644000175000017500000000536711715757602015516 00000000000000package channels; #: Version: 0.2 #: Description: Separates out regex-matching lines into a new window #: Author: Jakykong # I, the author, hereby release this file into the public domain. Hack away. BEGIN { $::world->requireplugin('KCWin'); } #Gag everything, but we'll echonl things that don't match. $::world->trigger('.*','/channels::check($_[0], "$colorline")', {gag => 1, keepexecuting => 1} ); sub help { $::world->echonl(<<"EOHELP"); Channels is a simple plugin to yank lines out of the world window and put then in other windows. It's most obvious use is chat channels, which usually have something like "[NAME]" at the beginning. Once the plugin is loaded, there is only one function to call: /channels::new("name","regex"); where "name" is the name that should appear in the title bar of the new window, and "regex" is the pattern to match for text. Use /channels::list() for a list of currently defined channels. To remove a channel, use /channel::del(num), where num is the number of the channel. Enjoy! EOHELP } #Holds the channels and associated windows. my %chans = (); my %windowlist = (); my $bank = 0; sub check { #Check for matches. Echo to the respective window. my ($line, $colorline) = @_; my $result = 0; foreach $k ( keys %chans ) { if ( "$line" =~ m/$k/ ) { $result = 1; $chans{"$k"}->feed("$colorline"); } } unless ( $result ) { $::world->echo("$colorline"); } } sub del { #Deletes a channel, by the number given. my $number = $_[0]; foreach $k ( keys %chans ) { if ( "$k" eq $windowlist->{$number}[1] ) { $chans{$k}->destroy(); delete $chans{$k}; delete $windowlist{$k}; } } } sub new { #Creates a new channel. my ($name, $regex) = @_; $chans{$regex} = new_window($name); $bank = $bank + 1; $windowlist->{$bank} = [$bank,$regex,$name]; $::world->echonl( ::colorize("&rCreated channel #$bank, $name.") ); } sub list { #Lists all open windows foreach $i ( keys %windowlist ) { $k = @windowlist->{$i}[2]; $world::->echonl( "#$i: $k" ); } } sub new_window { #Returns a new KCWindow without displaying the clear button. #Syntax: new_window(name,func) where func is optional. my $n = $_[0]; my $window = KCWin->new; #Pass a function to new_window to have it run on close. #Default behavior is to simply hide the window, #so you can show it later via $window->show(). if ( @_ > 1 ) { my $func = $_[1]; } else { my $func = sub{ $window->hide(); }; } $window->set_title("$n"); $window->signal_connect(delete_event => sub { &func(); return 1; }); $window->{BTNCLEAR}->hide; $window->{VBOX}->show_all; $window->{BTNCLEAR}->hide; $window->show; return $window; } sub UNLOAD { #Destroys any remaining channel windows. foreach $k ( keys %chans ) { $chans{"$k"}->destroy; } } kildclient-3.0.0/share/plugins/Makefile.am0000644000175000017500000000013411744137121015373 00000000000000pkgplugindir = $(pkgdatadir)/plugins pkgplugin_DATA = *.pl EXTRA_DIST = $(pkgplugin_DATA) kildclient-3.0.0/share/plugins/KCWin.pl0000644000175000017500000000605012367156733014666 00000000000000package KCWin; #: Version: 3.0.0 #: Description: Creates general-purpose windows with an input and output area #: Author: Eduardo M Kalinowski BEGIN { eval "use Gtk3"; die "This plugin requires the gtk3-perl bindings" if $@; } use base 'Gtk3::Window'; sub help { $::world->echonl(<<'EOHELP'); This plugin defines a new type, KCWin, which is a small window with an area for output and an entry box for input. These windows do nothing by themselves, but they can be used by other plugins when they need a window for input and output. The output area supports ANSI colors and thus is like a mini MUD window. Use KCWin->new to create a new window. KCWin derives from Gtk3::Window so you can use all of its methods. The widgets are accessible for customization. If $kcw is a KCWin, the following widgets are available: - $kcw->{VBOX}, Gtk3::Box, the vertical box that contains the output and input areas. - $kcw->{SCROLLWIN}, Gtk3::ScrolledWindow, this holds the TextView that is used for output. - $kcw->{TEXTVIEW}, Gtk3::TextView, is the widget used for output. - $kcw->{TEXTBUFFER}, Gtk3::TextBuffer, for convenience, the TextBuffer displayed in the window. - $kcw->{CMDAREA}, Gtk3::Box, a box that holds a button to clear the input area, and the input area itself. - $kcw->{BTNCLEAR}, Gtk3::Button, a button that clears the input entry widget when clicked. - $kcw->{ENTRY}, Gtk3::Entry, the input entry widget. Connect to the activate signal of this widget to do something when the user presses ENTER in this widget. The widgets can be used, and the window can be customized (by adding other widgets, for example). Three common actions have functions in KCWin as a shortcut: $text = KCWin::get_text Returns the text in the entry box. KCWin::set_text($text) Sets the text in the entry box. KCWin::feed($text) Appends text to the output terminal widget. $text can contain ANSI color sequences. The colorize function can be useful in conjuntion with this function. EOHELP } sub new { my $class = shift; my ($windowPTR, $vboxPTR, $scrollwinPTR, $txtViewPTR, $txtBufferPTR, $cmdareaPTR, $btnclearPTR, $entryPTR, $guiPTR) = KCWin::_new; my $self = bless Glib::Object->new_from_pointer($windowPTR), $class; $self->{VBOX} = Glib::Object->new_from_pointer($vboxPTR); $self->{SCROLLWIN} = Glib::Object->new_from_pointer($scrollwinPTR); $self->{TEXTVIEW} = Glib::Object->new_from_pointer($txtViewPTR); $self->{TEXTBUFFER} = Glib::Object->new_from_pointer($txtBufferPTR); $self->{CMDAREA} = Glib::Object->new_from_pointer($cmdareaPTR); $self->{BTNCLEAR} = Glib::Object->new_from_pointer($btnclearPTR); $self->{ENTRY} = Glib::Object->new_from_pointer($entryPTR); $self->{_GUIPTR} = $guiPTR; return $self; } sub destroy { my $self = shift; $self->_destroy(); $self->SUPER::destroy(); } sub get_text { my $self = shift; return $self->{ENTRY}->get_text; } sub set_text { my $self = shift; my ($text) = @_; return $self->{ENTRY}->set_text($text); } kildclient-3.0.0/share/plugins/notes.pl0000644000175000017500000000475412367156733015054 00000000000000package notes; #: Version: 2.0.0 #: Description: Assign notes to worlds #: Author: Eduardo M Kalinowski BEGIN { eval "use Gtk3 -init;"; die "This plugin requires the gtk3-perl bindings" if $@; } $::world->makepermanent('$notes::notetext'); our $window_created = 0; our $window; our $text_buffer; sub help { $::world->echonl("", "This plugin allows you to assign notes to World. The notes are saved", "with the World and are restored when it is opened again.", "", "Run /notes::edit to open a window where you can edit the notes.", "", "Run /notes::clear to clear the contents of the notes.", "", "It is possible to append something to the notes with /notes::append('text')", "This is probably more useful in scripts." ); } sub edit { unless ($window_created) { create_window(); $window->show_all(); $window_created = 1; } $window->present; } sub clear { $notetext = ""; update_text_view(); } sub append { my $newtext = $_[0]; $newtext .= "\n" unless (substr($_[0], -1) eq "\n"); $notetext .= $newtext; update_text_view(); } sub UNLOAD { if ($window_created) { update_text(); $window->destroy; } } sub create_window { $window = Gtk3::Window->new; $window->set_title("Notes for " . $::world->getname()); $window->signal_connect(delete_event => sub { update_text(); $window->hide(); return 1; }); $window->signal_connect(focus_out_event => sub { update_text(); }); my $vbox = Gtk3::VBox->new; my $scroll_win = Gtk3::ScrolledWindow->new; $scroll_win->set_policy('never', 'always'); my $text_view = Gtk3::TextView->new; $text_view->set_size_request(400, 150); $text_buffer = $text_view->get_buffer; update_text_view(); $scroll_win->add($text_view); $vbox->pack_start($scroll_win, 1, 1, 0); my $btn_close = Gtk3::Button->new_with_mnemonic('_Close'); $btn_close->signal_connect(clicked => sub { update_text(); $window->hide; $window_displayed = 0; }); $vbox->pack_start($btn_close, 0, 0, 0); $window->add($vbox); } sub update_text { $notetext = $text_buffer->get_text($text_buffer->get_bounds(), 0); } sub update_text_view { return unless $text_buffer; if (defined($notetext)) { $text_buffer->set_text($notetext); } } kildclient-3.0.0/share/plugins/Makefile.in0000644000175000017500000003414312376345610015421 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = share/plugins DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgplugindir)" DATA = $(pkgplugin_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pkgplugindir = $(pkgdatadir)/plugins pkgplugin_DATA = *.pl EXTRA_DIST = $(pkgplugin_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/plugins/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/plugins/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkgpluginDATA: $(pkgplugin_DATA) @$(NORMAL_INSTALL) @list='$(pkgplugin_DATA)'; test -n "$(pkgplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgplugindir)" || exit $$?; \ done uninstall-pkgpluginDATA: @$(NORMAL_UNINSTALL) @list='$(pkgplugin_DATA)'; test -n "$(pkgplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgplugindir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(pkgplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgpluginDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgpluginDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkgpluginDATA install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-pkgpluginDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: kildclient-3.0.0/share/plugins/keypad.pl0000644000175000017500000000247111715757634015176 00000000000000package keypad; #: Version: 1.0 #: Description: Allows use of the keypad for moving #: Author: Eduardo M Kalinowski $::world->macro('KP_Home', 'nw', { name => 'keypad:keypad' }); $::world->macro('KP_Up', 'n', { name => 'keypad:keypad' }); $::world->macro('KP_Page_Up', 'ne', { name => 'keypad:keypad' }); $::world->macro('KP_Left', 'w', { name => 'keypad:keypad' }); $::world->macro('KP_Right', 'e', { name => 'keypad:keypad' }); $::world->macro('KP_End', 'sw', { name => 'keypad:keypad' }); $::world->macro('KP_Down', 's', { name => 'keypad:keypad' }); $::world->macro('KP_Page_Down', 'se', { name => 'keypad:keypad' }); $::world->macro('KP_Subtract', 'down', { name => 'keypad:keypad' }); $::world->macro('KP_Add', 'up', { name => 'keypad:keypad' }); $::world->macro('KP_Begin', 'who', { name => 'keypad:keypad' }); $::world->macro('KP_Insert', 'look', { name => 'keypad:keypad' }); $::world->macro('KP_Divide', 'inventory', { name => 'keypad:keypad' }); $::world->macro('KP_Multiply', 'score', { name => 'keypad:keypad' }); sub help { $::world->echonl("Allows use of the keypad for movement (and a few other", "actions). NumLock must be off for this plugin to work."); } kildclient-3.0.0/share/plugins/serverdatadumper.pl0000644000175000017500000000114311715757645017273 00000000000000package serverdatadumper; #: Version: 1.0.0 #: Description: Dumps server data #: Author: Eduardo M Kalinowski use Data::Dumper; $::world->hook('OnServerData', '/serverdatadumper::dump()', { name => 'serverdatadump:dump' }); sub help { $::world->echonl("Dumps server data received via out-of-band protocols such as GMCP and MSDP."); $::world->echonl("Just load the plugin and whenever data is received, it will be"); $::world->echonl("displayed (using Data::Dumper)."); } sub dump { $::world->echonl("Got server data:"); $::world->echo(Data::Dumper->Dump([\%::server_data], ['%::server_data'])); } kildclient-3.0.0/share/plugins/chat.pl0000644000175000017500000014136412367156733014642 00000000000000package chat; #: Version: 2.0.0 #: Description: Chat directly to other people #: Author: Eduardo M Kalinowski BEGIN { $::world->requireplugin('KCWin'); } use Glib; use IO::Socket::INET; use Encode; use bytes; sub help { $::world->echonl(<<'EOHELP'); Making and receiving calls (commands used in main window) --------------------------------------------------------- /chat::accept Accept calls on default port, 4050 /chat::accept(port) Accept calls on given port /chat::noaccept Stop accepting calls /chat::call("host") Call host (or ip address) on default port, 4050 /chat::call("host", port) Call host (or ip address) on given port /chat::zcall("host") Call host (or ip address) on default port, 4050, using the zChat protocol /chat::zcall("host", port) Call host (or ip address) on given port, using the zChat protocol Commands valid in the chat windows ---------------------------------- To send some text, just type it and press ENTER. Some other actions are available with commands that start with /: /emote text Sends text as an emote /chatall text Sends text to all connections /emoteall text Sends text as an emote to all connections /group group_name Set the group that this chat belongs /cg text Sends text to all connections in this group /eg text Sends text as an emote to all connections in this group /name new_name Changes the name used in chats /color new_color Changes the color used in chats. new_color is a color valid for the colorize() function /stripansi Ignore colors on received messages from this chat /nostripansi Display colors on received messages from this chat /ping Pings the chat peer /sendfile Sends a file to the peer /stopfile Stops a file transfer in progress /snoop Requests to start snooping your peer /allowsnoop Allow the peer to snoop us /noallowsnoop Disallow the peer to snoop us /info Shows information about this chat session /hangup Hangs this chat session up Chat commands to be used in main window --------------------------------------- When a command requires "name" as an argument, you should provide the name of a person with whom you are chatting (as a string). /chat::chat(name, text) Sends some text /chat::chatall(text) Sends some text to all chats /chat::emote(name, text) Sends some text as an emote /chat::emoteall(text) Sends some text as an emote to all chats /chat::setgroup(name, group) Sets the group that this chat belongs /chat::chatgroup(group, text) Sends some text to the group /chat::emotegroup(group, text) Sends some text as an emote to the group /chat::ping(name) Pings the connection /chat::sendfile(name, [file]) Sends a file to the peer /chat::stopfile(name) Stops a file transfer in progress /chat::snoop(name) Request to start snooping /chat::setallowsnoop(name, value) Sets whether the peer can or cannot snoop us /chat::info(name) Displays info on the connection /chat::hangup(name) Hangs up a connection /chat::setstripansi(name, value) Sets whether the chat displays received colors: 1 to ignore them, 0 to display /chat::setencoding(name, encoding) Sets the character encoding for that chat session /chat::setname(name) Sets the nick name used in chats /chat::setcolor(color) Sets the color used in chats. color is a color string valid for the colorize() function Variables controlling the chat ------------------------------ $chat::auto_accept_calls If true, chat calls are accepted without you being prompted. $chat::default_encoding The default character encoding to use in new chats. EOHELP } ################################################################# # Constants # use constant { # Chat types MM => 0, ZCHAT => 1, # Chat commands of both protocols NAME_CHANGE => 1, REQUEST_CONNECTIONS => 2, CONNECTION_LIST => 3, TEXT_EVERYBODY => 4, TEXT_PERSONAL => 5, TEXT_GROUP => 6, MESSAGE => 7, VERSION => 19, FILE_START => 20, FILE_DENY => 21, FILE_BLOCK_REQUEST => 22, FILE_BLOCK => 23, FILE_END => 24, FILE_CANCEL => 25, PING_REQUEST => 26, PING_RESPONSE => 27, # Chat commans specific of the zChat protocol PEEK_CONNECTIONS => 28, PEEK_LIST => 29, SNOOP => 30, SNOOP_DATA => 31, ICON => 100, STATUS => 101, EMAIL => 102, REQUEST_PGP_KEY => 103, PGP_KEY => 104, SEND_COMMAND => 105, STAMP => 106, # Used in MM chat protocol MMCHAT_END_OF_COMMAND => 255, # For file transfer MM_FILE_BLOCK_SIZE => 500, ZCHAT_FILE_BLOCK_SIZE => 1024, RECEIVING => 1, SENDING => 2, # Chat destinations PERSONAL => 0, EVERYBODY => 1, GROUP => 2, }; ################################################################# # Variables # our $my_name; $my_name = 'KildClient' unless ($my_name); $::world->makepermanent('$chat::my_name'); our $chat_color; $chat_color = '&R' unless ($chat_color); $::world->makepermanent('$chat::chat_color'); our $default_encoding; $default_encoding = "iso-8859-1" unless ($default_encoding); $::world->makepermanent('$chat::default_enconding'); our $auto_accept_calls; $::world->makepermanent('$chat::auto_accept_calls'); our $chat_port = 4050; our $accept_sock; our $accept_id; our @chats; our $zchat_stamp = int(rand(2**32 - 1)); # The stamp is a 32-bit number our $n_snoopers = 0; ################################################################# # Hooks (for snooping) # $::world->hook('OnReceivedText', '/chat::send_snoop_data($hookdata)', { name => 'chat:snoop', enabled => 0 }); $::world->hook('OnSentCommand', '/chat::send_snoop_data($hookdata)', { name => 'chat:snoop', enabled => 0 }); ################################################################# # The $chat_session (reference to a) hash members: # # socket => The socket used for communications # type => Type: MudMaster or zChat # window => The KCWin that holds the chat # window_has_focus => Whether the window is focused # io_watch_id => Id for the IO Watch callback # timeout_id => Id for the timeout callback (to close connections that # are not established after some time) # id => zChat ID (not used for anything, really) # group => Group name # remotename => Remote nickname of chat peer # remoteip => Remote advertised ip # remoteport => Remote advertised port (used for incoming connections) # remoteemail => E-mail of peer (just for displaying) # remotestamp => peer's zChat stamp # remoteversion => Version of the peer's client # remotestatus => Status of the peer's client # allowsnoop => Whether the peer can snoop us # is_snooped => 1 if we are being snooped # stripansi => Strip ANSI sequences from received data? # pingtime => Time (as returned by time() function) of last sent ping # pingstamp => A random value sent in each ping, to detect the correct # reply, if several pings are sent # filedirection => If file is being sent or received # filename => Name of file being transfered # filehandle => File handle of file being transfered # filetotalsize => Total file size # filesize => Size transfered so far # pending_op => Operation code that has been read, but that has not # been processed # pending_size => Size of data for pending operation # buffer => Buffer to hold incoming data in the connection # closed => 1 if the connection is not open anymore ################################################################# # User callable routines # sub call { # # Makes a call to the given ip and port, using the MudMaster protocol # my $ip = shift; my $port = shift || 4050; generic_call($ip, $port, MM); } sub zcall { # # Makes a call to the given ip and port, using the MudMaster protocol # my $ip = shift; my $port = shift || 4050; generic_call($ip, $port, ZCHAT); } sub accept { # # Marks the chat system as accepting new connections # if ($accept_sock) { $::world->echonl(::colorize("${chat_color}Already listening for chat connections on port $chat_port")); return; } $chat_port = shift || 4050; $accept_sock = IO::Socket::INET->new(Listen => 5, LocalPort => $chat_port, Proto => 'tcp', ReuseAddr => 1); $accept_id = Glib::IO->add_watch($accept_sock->fileno, 'in', \&accept_connection, $accept_sock); $::world->echonl(::colorize("${chat_color}Listening for chat connections on port $chat_port")); } sub noaccept { # # Stop accepting calls # Glib::Source->remove($accept_id) if $accept_id; $accept_id = undef; close $accept_sock; $::world->echonl(::colorize("${chat_color}Not accepting chat connections.")); } sub setname { # # Set the name used for chats # $my_name = $_[0]; broadcast(NAME_CHANGE, $my_name); } sub chat { # # Sends something to a chat session # my ($chat_session, $text) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); send_command($chat_session, TEXT_PERSONAL, format_text($text, 0, PERSONAL)); $chat_session->{window}->feed(::colorize("\n${chat_color}You chat to $chat_session->{remotename}, '$text'\n")); } sub emote { # # Sends something as an emote to a chat session # my ($chat_session, $text) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); send_command($chat_session, TEXT_PERSONAL, format_text($text, 1, PERSONAL)); $chat_session->{window}->feed(::colorize("\n${chat_color}You emote to $chat_session->{remotename}: $my_name $text\n")); } sub chatall { # # Chats something to all open connections # my ($text, $chat_session) = @_; broadcast(TEXT_EVERYBODY, format_text($text, 0, EVERYBODY)); my $output = ::colorize("\n${chat_color}You chat to everybody, '$text'\n"); if ($chat_session) { $chat_session->{window}->feed($output); } else { $::world->echo($output); } } sub emoteall { # # Emotes something to all open connections # my ($text, $chat_session) = @_; broadcast(TEXT_EVERYBODY, format_text($text, 1, EVERYBODY)); my $output = ::colorize("\n${chat_color}You emote to everybody: $my_name $text\n"); if ($chat_session) { $chat_session->{window}->feed($output); } else { $::world->echo($output); } } sub chatgroup { # # Chats something to a group # my ($group, $text, $chat_session) = @_; $groupformat = sprintf("%-15.15s", $group); broadcast(TEXT_GROUP, $groupformat . format_text($text, 0, GROUP), $group); my $output = ::colorize("\n${chat_color}You chat to the group $group, '$text'\n"); if ($chat_session) { $chat_session->{window}->feed($output); } else { $::world->echo($output); } } sub emotegroup { # # Emotes something to a group # my ($group, $text, $chat_session) = @_; $groupformat = sprintf("%-15.15s", $group); broadcast(TEXT_GROUP, $groupformat . format_text($text, 1, GROUP), $group); my $output = ::colorize("\n${chat_color}You emote to the group $group: $my_name $text\n"); if ($chat_session) { $chat_session->{window}->feed($output); } else { $::world->echo($output); } } sub setgroup { # # Sets a chat session to be part of a group # my ($chat_session, $group) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); $chat_session->{group} = substr($group, 0, 15); } sub ping { # # Pings a chat connection # my ($chat_session) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); $chat_session->{pingstamp} = int(rand(2**32 - 1)); $chat_session->{pingtime} = time(); send_command($chat_session, PING_REQUEST, $chat_session->{pingstamp}); } sub sendfile { # # Sends a file to the chat peer # my ($chat_session, $file) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); if ($chat_session->{filedirection}) { feed_and_show($chat_session, "${chat_color}A file transfer is already in progress.\n"); return; } if (!$file) { my $dialog = Gtk3::FileChooserDialog->new('Select file', undef, 'open', '_Cancel' => 'cancel', '_Open' => 'accept'); my $response = $dialog->run(); $dialog->hide(); return if ($response ne 'accept'); $file = $dialog->get_filename(); } if(!open($chat_session->{filehandle}, $file)) { feed_and_show($chat_session, "${chat_color}Could not open '$file': $!\n"); return; } $chat_session->{filename} = $file; $chat_session->{filedirection} = SENDING; $chat_session->{filetotalsize} = -s $file; $chat_session->{filesize} = 0; # There must be a better way to extract the file name from a path if ($file =~ m{.*/([^/]+)$}) { $basefilename = $1; } else { $basefilename = $file; } send_command($chat_session, FILE_START, "$basefilename,$chat_session->{filetotalsize}"); feed_and_show($chat_session, "${chat_color}Sending file $file to $chat_session->{remotename}\n"); } sub stopfile { # # Stops a file transfer # my ($chat_session, $file) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); if (!$chat_session->{filedirection}) { feed_and_show($chat_session, "${chat_color}No file is being transfered.\n"); return; } send_command($chat_session, FILE_CANCEL, ''); file_stop($chat_session, "${chat_color}Transfer of file $chat_session->{filename} aborted.\n"); } sub snoop { # # Tries to start snooping the remote party # my ($chat_session) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); if ($chat_session->{type} != ZCHAT) { feed_and_show($chat_session, "${chat_color}Only the zChat protocol supports snooping.\n"); return; } send_command($chat_session, SNOOP, ''); feed_and_show($chat_session, "${chat_color}Requested to start snooping $chat_session->{remotename}\n"); } sub info { # # Prints information about the chat session # my ($chat_session, $text) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); my $window = $chat_session->{window}; my $chatheader = "Chat with $chat_session->{remotename}"; $window->feed(::colorize("&w$chatheader\n")); $window->feed("-" x length($chatheader) . "\n"); $window->feed("Connection IP : " . $chat_session->{socket}->peerhost() . "\n"); $window->feed("Advertised IP : $chat_session->{remoteip}\n"); $window->feed("Call port : $chat_session->{remoteport}\n"); $window->feed("Type : " . ($chat_session->{type} == MM ? "MudMaster" : "zChat") . "\n"); $window->feed("Group : $chat_session->{group}\n"); $window->feed("Remote version : " . ($chat_session->{remoteversion} ? $chat_session->{remoteversion} : "Unknown") . "\n"); $window->feed("Peer e-mail : $chat_session->{remoteemail}\n") if ($chat_session->{remoteemail}); $window->feed("They can snoop : " . ($chat_session->{allowsnoop} ? "yes" : "no") . "\n"); $window->feed("They are snooping: " . ($chat_session->{is_snooped} ? "yes" : "no") . "\n"); $window->feed("Strip ANSI : " . ($chat_session->{stripansi} ? "yes" : "no") . "\n"); if ($chat_session->{filedirection}) { if ($chat_session->{filedirection} == SENDING) { $window->feed("Sending file : $chat_session->{filename}\n"); } else { $window->feed("Receiving file : $chat_session->{filename}\n"); } $window->feed("File size: : $chat_session->{filetotalsize}\n"); $window->feed("Bytes transfered : $chat_session->{filesize}\n"); my $remaining_bytes = $chat_session->{filetotalsize} - $chat_session->{filesize}; $window->feed("Bytes left : $remaining_bytes (" . sprintf("%.0f", 100*($remaining_bytes/$chat_session->{filetotalsize})) . "%) \n"); } feed_and_show($chat_session, "$chat_color"); } sub hangup { # # Closes a connection # my ($chat_session) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); close $chat_session->{socket}; Glib::Source->remove($chat_session->{io_watch_id}); feed_and_show($chat_session, "${chat_color}Chat session closed.\n"); remove_session($chat_session); } sub setcolor { # # Sets the color used for chat messages. # $chat_color = $_[0]; } sub setstripansi { # # Sets whether to strip ANSI sequences or not # my ($chat_session, $value) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); $chat_session->{stripansi} = $value; } sub setallowsnoop { # # Sets whether our peer can snoop us # my ($chat_session, $value) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); if ($chat_session->{type} != ZCHAT) { feed_and_show($chat_session, "${chat_color}Only the zChat protocol supports snooping.\n"); return; } $chat_session->{allowsnoop} = $value; if ($value) { send_command($chat_session, MESSAGE, ::colorize("${chat_color}You can now snoop $my_name.\n")); feed_and_show($chat_session, "${chat_color}Snooping allowed.\n"); } else { send_command($chat_session, MESSAGE, ::colorize("${chat_color}You can no longer snoop $my_name.\n")); feed_and_show($chat_session, "${chat_color}Snooping disallowed.\n"); stop_snooped($chat_session); } } sub setencoding { # # Sets the encoding for that chat session # my ($chat_session, $encoding) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); $chat_session->{encoding} = $encoding; } ################################################################# # Internal functions # sub generic_call { # # Makes a chat call, of the specified type # my ($ip, $port, $type) = @_; my $socket = IO::Socket::INET->new(PeerAddr => $ip, PeerPort => $port, Proto => 'tcp'); if (!defined($socket)) { $::world->echonl(::colorize("${chat_color}Could not connect to $ip, port $port: $!\n")); return 0; } my $chat_session = { socket => $socket, type => $type, remoteip => $ip, remoteport => $port, group => '', encoding => $default_encoding}; $chat_session->{io_watch_id} = Glib::IO->add_watch($socket->fileno, 'in', \&call_establishment_data_ready_cb, $chat_session); $chat_session->{timeout_id} = Glib::Timeout->add(60000, # That's 60 seconds in ms \&kill_pending_connection_cb, $chat_session); $chat_session->{window} = new_chat_window($ip, $chat_session); $chat_session->{window}->feed(::colorize("${chat_color}Calling $ip on port $port...\n")); $chat_session->{window}->show_all; if ($type == MM) { $proposal = sprintf("CHAT:$my_name\n%s%-5u", $socket->sockhost(), $chat_port); } else { $proposal = sprintf("ZCHAT:$my_name\t0\n%s%05u", $socket->sockhost(), $chat_port); } syswrite($socket, $proposal); push(@chats, $chat_session); return 1; } sub accept_connection { # # accept()'s an incoming connection. accept() won't block because this # is only called when there is an incoming connection (because of the # IO watch). # my ($fileno, $condition, $sock) = @_; my $client_sock = $sock->accept(); my $chat_session = { socket => $client_sock, group => '', encoding => $default_encoding }; $chat_session->{io_watch_id} = Glib::IO->add_watch($client_sock->fileno, 'in', \&receive_establishment_data_ready_cb, $chat_session); $chat_session->{timeout_id} = Glib::Timeout->add(60000, # That's 60 seconds in ms \&kill_pending_connection_cb, $chat_session); push(@chats, $chat_session); return 1; } sub call_establishment_data_ready_cb { # # Called when data is ready in a chat socket, for which no connection # has yet been established, when we making a call. # my ($fileno, $condition, $chat_session) = @_; my $socket = $chat_session->{socket}; my $tempbuffer; my $bytes_read = sysread($socket, $tempbuffer, 1024); if (!defined($bytes_read) || $bytes_read <= 0) { close $socket; remove_session($chat_session); return 0; } $chat_session->{buffer} .= $tempbuffer; while (1) { my $nlpos = index($chat_session->{buffer}, "\n"); return 1 if ($nlpos == -1); # Wait for more data if ($chat_session->{buffer} =~ /^YES:(.*)/) { change_remote_name($chat_session, $1, 1); substr($chat_session->{buffer}, 0, $nlpos + 1) = ''; send_command($chat_session, VERSION, get_version()); if ($chat_session->{type} == ZCHAT) { send_command($chat_session, STATUS, chr(1)); # We're always available for now send_command($chat_session, STAMP, pack("L", $zchat_stamp)); } $chat_session->{io_watch_id} = Glib::IO->add_watch($socket->fileno, 'in', $chat_session->{type} == MM ? \&mmchat_data_ready_cb : \&zchat_data_ready_cb, $chat_session); # Remove timeout Glib::Source->remove($chat_session->{timeout_id}); $chat_session->{window}->feed(::colorize("${chat_color}Chat session to '$chat_session->{remotename}' at $chat_session->{remoteip} port $chat_session->{remoteport} established\n")); return 0; } elsif ($chat_session->{buffer} =~ /^NO/) { # Refused $chat_session->{window}->feed(::colorize("${chat_color}Remote party refused chat session\n")); Glib::Source->remove($chat_session->{timeout_id}); close $socket; remove_session($chat_session); return 0; } else { # Wrong reply. Let's ignore this line and wait for another one substr($chat_session->{buffer}, 0, $nlpos + 1) = ''; } } return 1; # Continue processing } sub receive_establishment_data_ready_cb { # # Called when data is ready in a chat socket, for which no connection # has yet been established, when we are accepting a call. # my ($fileno, $condition, $chat_session) = @_; my $socket = $chat_session->{socket}; my $tempbuffer; my $bytes_read = sysread($socket, $tempbuffer, 1024); if (!defined($bytes_read) || $bytes_read <= 0) { close $socket; remove_session($chat_session); return 0; } $chat_session->{buffer} .= $tempbuffer; while (1) { if (!defined($chat_session->{type})) { # First line my $nlpos = index($chat_session->{buffer}, "\n"); return 1 if ($nlpos == -1); # Wait for more data if ($chat_session->{buffer} =~ /^ZCHAT:(.*)\t(.*)/) { $chat_session->{type} = ZCHAT; $chat_session->{remotename} = $1; $chat_session->{id} = $2; substr($chat_session->{buffer}, 0, $nlpos + 1) = ''; } elsif ($chat_session->{buffer} =~ /^CHAT:(.*)/) { $chat_session->{type} = MM; $chat_session->{remotename} = $1; $chat_session->{id} = 0; substr($chat_session->{buffer}, 0, $nlpos + 1) = ''; } else { # Wrong header. Let's ignore this line and wait for another one substr($chat_session->{buffer}, 0, $nlpos + 1) = ''; } } else { # Second line unless ($auto_accept_calls) { my $dialog = Gtk3::MessageDialog->new(undef, [], 'question', 'yes-no', "Accept chat call with '$chat_session->{remotename}' from " . $socket->peerhost() . "?"); $dialog->set_default_response('yes'); my $response = $dialog->run(); $dialog->destroy; if ($response ne 'yes') { syswrite($socket, "NO\n"); close $socket; Glib::Source->remove($chat_session->{timeout_id}); remove_session($chat_session); return 0; } } $chat_session->{remoteip} = substr($chat_session->{buffer}, 0, length($chat_session->{buffer}) - 5); $chat_session->{remoteport} = int(substr($chat_session->{buffer}, -5, 5)); $chat_session->{buffer} = ''; syswrite($socket, "YES:$my_name\n"); send_command($chat_session, VERSION, get_version()); if ($chat_session->{type} == ZCHAT) { send_command($chat_session, STATUS, chr(1)); # We're always available for now send_command($chat_session, STAMP, pack("L", $zchat_stamp)); } $chat_session->{window} = new_chat_window($chat_session->{remotename}, $chat_session); $chat_session->{io_watch_id} = Glib::IO->add_watch($socket->fileno, 'in', $chat_session->{type} == MM ? \&mmchat_data_ready_cb : \&zchat_data_ready_cb, $chat_session); # Remove timeout Glib::Source->remove($chat_session->{timeout_id}); $chat_session->{window}->feed(::colorize("${chat_color}Chat session with '$chat_session->{remotename}' from $chat_session->{remoteip} port $chat_session->{remoteport}\n")); $chat_session->{window}->show_all; return 0; # Remove callback } } return 1; # Continue processing } sub kill_pending_connection_cb { # # Kills connections that have been open for some time but have not yet # been sucessfully established. # my ($chat_session) = @_; if ($chat_session->{window}) { feed_and_show($chat_session, "${chat_color}No reply from remote party, chat closed.\n"); } Glib::Source->remove($chat_session->{io_watch_id}); close $chat_session->{socket}; remove_session($chat_session); return 0; } sub mmchat_data_ready_cb { # # Called when data is ready from a mudmaster chat session. # my ($fileno, $condition, $chat_session) = @_; my $socket = $chat_session->{socket}; my $tempbuffer; my $bytes_read = sysread($socket, $tempbuffer, 1024); if (!defined($bytes_read) || $bytes_read <= 0) { close $socket; feed_and_show($chat_session, "${chat_color}Chat session closed.\n"); remove_session($chat_session); return 0; } $chat_session->{buffer} .= $tempbuffer; while (1) { if (!defined($chat_session->{pending_op})) { # Get the command code return 1 if (length($chat_session->{buffer}) < 1); # Wait for more $chat_session->{pending_op} = ord($chat_session->{buffer}); substr($chat_session->{buffer}, 0, 1) = ''; } else { # Unfortunately, FILE_BLOCK blocks have a different structure if ($chat_session->{pending_op} == FILE_BLOCK) { # +1 is because there is an END_OF_COMMAND after the block. # This has been discovered in practice (and MudMaster does send # this byte), even though the specs says there is no # END_OF_COMMAND in this message. return 1 if length($chat_session->{buffer}) < MM_FILE_BLOCK_SIZE + 1; file_block_received($chat_session, substr($chat_session->{buffer}, 0, MM_FILE_BLOCK_SIZE)); substr($chat_session->{buffer}, 0, MM_FILE_BLOCK_SIZE + 1) = ''; $chat_session->{pending_op} = undef; } else { my $end_data_pos = index($chat_session->{buffer}, chr(MMCHAT_END_OF_COMMAND)); return 1 if ($end_data_pos == -1); # Wait for more data dispatch_command($chat_session, substr($chat_session->{buffer}, 0, $end_data_pos)); substr($chat_session->{buffer}, 0, $end_data_pos + 1) = ''; $chat_session->{pending_op} = undef; } } } return 1; # Continue processing } sub zchat_data_ready_cb { # # Called when data is ready from a zChat session. # my ($fileno, $condition, $chat_session) = @_; my $socket = $chat_session->{socket}; my $tempbuffer; my $bytes_read = sysread($socket, $tempbuffer, 1024); if (!defined($bytes_read) || $bytes_read <= 0) { close $socket; feed_and_show($chat_session, "${chat_color}Chat session closed.\n"); remove_session($chat_session); return 0; } $chat_session->{buffer} .= $tempbuffer; while (1) { if (!defined($chat_session->{pending_op})) { # Get the command code return 1 if (length($chat_session->{buffer}) < 2); # Wait for more $chat_session->{pending_op} = unpack("v", substr($chat_session->{buffer}, 0, 2)); substr($chat_session->{buffer}, 0, 2) = ''; } elsif (!defined($chat_session->{pending_size})) { # Get the size return 1 if (length($chat_session->{buffer}) < 2); # Wait for more $chat_session->{pending_size} = unpack("v", substr($chat_session->{buffer}, 0, 2)); substr($chat_session->{buffer}, 0, 2) = ''; } elsif (length($chat_session->{buffer}) >= $chat_session->{pending_size}) { dispatch_command($chat_session, substr($chat_session->{buffer}, 0, $chat_session->{pending_size})); substr($chat_session->{buffer}, 0, $chat_session->{pending_size}) = ''; $chat_session->{pending_op} = undef; $chat_session->{pending_size} = undef; } else { return 1; # Wait for more data } } return 1; # Continue processing } sub dispatch_command { # # Determines the command to be executed # my ($chat_session, $data) = @_; my $op = $chat_session->{pending_op}; if ($op == VERSION) { $chat_session->{remoteversion} = $data; } elsif ($op == STATUS) { $chat_session->{remotestatus} = ord($data); } elsif ($op == EMAIL) { $chat_session->{remoteemail} = $data; } elsif ($op == STAMP) { $chat_session->{remotestamp} = unpack("L", $data); if ($chat_session->{remotestamp} == $zchat_stamp) { $zchat_stamp = int(rand(2**32 - 1)); broadcast(STAMP, pack("L", $zchat_stamp)); } } elsif ($op == NAME_CHANGE) { change_remote_name($chat_session, $data); } elsif ($op == PING_REQUEST) { send_command($chat_session, PING_RESPONSE, $data); } elsif ($op == TEXT_EVERYBODY || $op == TEXT_PERSONAL || $op == TEXT_GROUP) { process_text_message($chat_session, $data, $op); } elsif ($op == MESSAGE) { Encode::from_to($data, $chat_session->{encoding}, 'UTF-8'); feed_and_show($chat_session, "${chat_color}Message from $chat_session->{remotename}: $data\n"); } elsif ($op == PING_RESPONSE) { if ($data == $chat_session->{pingstamp}) { my $elapsedsecs = time() - $chat_session->{pingtime}; feed_and_show($chat_session, "${chat_color}Ping replyied in $elapsedsecs second(s)\n"); } # If not equal, let's ignore this reply } elsif ($op == SNOOP_DATA) { $data = substr($data, 4); Encode::from_to($data, $chat_session->{encoding}, 'UTF-8'); feed_and_show($chat_session, "&c>&w" . $data . "\n"); } elsif ($op == SNOOP) { start_snooped($chat_session); } elsif ($op == FILE_START) { receive_file($chat_session, $data); } elsif ($op == FILE_BLOCK) { file_block_received($chat_session, $data); } elsif ($op == FILE_END) { file_end($chat_session); } elsif ($op == FILE_CANCEL) { if ($chat_session->{filedirection}) { file_stop($chat_session, "${chat_color}Transfer of file $chat_session->{filename} aborted by remote party.\n"); } else { file_stop($chat_session, ''); } } elsif ($op == FILE_DENY) { file_stop($chat_session, "${chat_color}$chat_session->{remotename} rejected the file transfer: $data\n"); } elsif ($op == FILE_BLOCK_REQUEST) { file_send_next_block($chat_session); } else { Encode::from_to($data, $chat_session->{encoding}, 'UTF-8'); $chat_session->{window}->feed("Received unknown command #$op, data: <$data>\n"); send_command($chat_session, MESSAGE, ::colorize("${chat_color}KildClient chat does not support command $op at this time, sorry.\n")); } } sub process_text_message { # # Processes a text message (personal, to everybody or to group). If the # zChat procotol is being used, this means checking the stamp. # my ($chat_session, $data, $op) = @_; my $message; if ($chat_session->{type} == ZCHAT) { my $stamp = unpack("L", substr($chat_session, 0, 4)); if ($stamp != $zchat_stamp) { $message = substr($data, 4); } else { return; } } else { $message = $data; } $message = substr($message, 15) if ($op == TEXT_GROUP); Encode::from_to($message, $chat_session->{encoding}, 'UTF-8'); $message = ::stripansi($message) if ($chat_session->{stripansi}); feed_and_show($chat_session, "$chat_color$message"); } sub change_remote_name { # # Changes the name of peer for a chat. # If $quit is defined, does not print anything in the window. # my ($chat_session, $name, $quiet) = @_; my $oldname = $chat_session->{remotename}; $chat_session->{remotename} = $name; $chat_session->{window}->set_title("Chat: $name"); unless ($quiet) { $chat_session->{window}->feed(::colorize("${chat_color}$oldname is now known as $name.\n")); } } sub process_input { # # Processes input typed in the Chat window # my ($entry, $chat_session) = @_; if ($chat_session->{closed}) { feed_and_show($chat_session, "${chat_color}This chat session is closed.\n"); return; } my $text = $entry->get_text; if ($text =~ m<^/emote\s+(.*)>i) { emote($chat_session, $1); } elsif($text =~ m<^/chatall\s+(.*)>i) { chatall($1, $chat_session); } elsif($text =~ m<^/emoteall\s+(.*)>i) { emoteall($1, $chat_session); } elsif($text =~ m<^/cg\s+(.*)>i) { if ($chat_session->{group} eq '') { feed_and_show($chat_session, "${chat_color}This chat does not belong to a group.\n"); } else { chatgroup($chat_session->{group}, $1, $chat_session); } } elsif($text =~ m<^/eg\s+(.*)>i) { if ($chat_session->{group} eq '') { feed_and_show($chat_session, "${chat_color}This chat does not belong to a group.\n"); } else { emotegroup($chat_session->{group}, $1, $chat_session); } } elsif($text =~ m<^/name\s+(.*)>i) { setname($1); } elsif($text =~ m<^/color\s+(.*)>i) { setcolor($1); } elsif($text =~ m<^/group\s+(.*)>i) { setgroup($chat_session, $1); } elsif($text =~ m<^/stripansi\s*>i) { setstripansi($chat_session, 1); } elsif($text =~ m<^/nostripansi\s*>i) { setstripansi($chat_session, 0); } elsif($text =~ m<^/ping\s*>i) { ping($chat_session); } elsif($text =~ m<^/sendfile\s*>i) { sendfile($chat_session); } elsif($text =~ m<^/stopfile\s*>i) { stopfile($chat_session); } elsif($text =~ m<^/snoop\s*>i) { snoop($chat_session); } elsif($text =~ m<^/allowsnoop\s*>i) { setallowsnoop($chat_session, 1); } elsif($text =~ m<^/noallowsnoop\s*>i) { setallowsnoop($chat_session, 0); } elsif ($text =~ mi) { info($chat_session); } elsif ($text =~ mi) { hangup($chat_session); } else { chat($chat_session, $text); } $entry->set_text(''); } sub send_command { # # Packs a command in the appropriate representation and sends it # my ($chat_session, $op, $data) = @_; if ($op != FILE_BLOCK) { $data = encode($chat_session->{encoding}, $data); } if (($op == TEXT_PERSONAL || $op == TEXT_EVERYBODY) && $chat_session->{type} == ZCHAT) { $data = pack("L", $zchat_stamp) . $data; } my $command; if ($chat_session->{type} == MM) { $command = chr($op) . $data . chr(MMCHAT_END_OF_COMMAND); } elsif ($chat_session->{type} == ZCHAT) { $command = pack("vv", $op, length($data)) . $data; } syswrite($chat_session->{socket}, $command); } sub broadcast { # # Broadcasts a command to all open chat sessions # my ($command, $data, $group) = @_; $group = substr($group, 0, 15) if ($group); foreach $chat (@chats) { next if $chat->{closed}; next if ($chat->{type} == MM && $command >= PEEK_CONNECTIONS); next if ($group && $chat->{group} ne $group); send_command($chat, $command, $data); } } sub format_text { # # Formats a message to be sent as a TEXT_PERSONAL, TEXT_GROUP, # or TEXT_EVERYBODY command # my ($text, $isemote, $dest) = @_; my $destname; $destname = "you" if ($dest == PERSONAL); $destname = "everybody" if ($dest == EVERYBODY); $destname = "the group" if ($dest == GROUP); my $string; if (!$isemote) { $string = ::colorize("\n${chat_color}$my_name chats to $destname, '$text'\n"); } else { if ($dest == PERSONAL) { $string = ::colorize("\n${chat_color}$my_name $text\n"); } else { $string = ::colorize("\n${chat_color}(To $destname) $my_name $text\n"); } } return $string; } sub start_snooped { # # Starts a snooping session, in which we send all received data # my ($chat_session) = @_; if (!$chat_session->{allowsnoop}) { send_command($chat_session, MESSAGE, ::colorize("${chat_color}$my_name does not allow you to snoop him/her.\n")); feed_and_show($chat_session, "${chat_color}$chat_session->{remotename} has tried to snoop you.\n"); return; } $chat_session->{is_snooped} = 1; if ($n_snoopers++ == 0) { $::world->enahook('OnReceivedText', 'chat:snoop'); $::world->enahook('OnSentCommand', 'chat:snoop'); } send_command($chat_session, MESSAGE, ::colorize("${chat_color}You are now snooping $my_name.\n")); feed_and_show($chat_session, "${chat_color}$chat_session->{remotename} is snooping you.\n"); } sub stop_snooped { # # Stops a snooping session, no more data is sent # my ($chat_session) = @_; if ($chat_session->{is_snooped}) { $chat_session->{is_snooped} = 0; if (--$n_snoopers == 0) { $::world->dishook('OnReceivedText', 'chat:snoop'); $::world->dishook('OnSentCommand', 'chat:snoop'); } } } sub send_snoop_data { # # Sends data that has been received to the people that are snooping # us # my ($data) = @_; foreach my $chat (@chats) { next if ($chat->{closed}); next unless ($chat->{is_snooped}); send_command($chat, SNOOP_DATA, $data); } } sub receive_file { # # Prompts the user if he wants to accept a file, and if he does, # start the transfer # my ($chat_session, $data) = @_; # It should never happen that another file is offered while a file # transfer is still in progress, but let's play safe if ($chat_session->{filedirection}) { send_command($chat_session, FILE_DENY, "A file transfer is already in progress."); return; } my ($file, $length) = split(",", $data); my $dialog = Gtk3::MessageDialog->new(undef, [], 'question', 'yes-no', "$chat_session->{remotename} wants to send you file '$file', length $length bytes. Accept it?"); $dialog->set_default_response('no'); my $response = $dialog->run(); $dialog->destroy; if ($response ne 'yes') { send_command($chat_session, FILE_DENY, "$my_name rejected the file transfer."); return; } $dialog = Gtk3::FileChooserDialog->new('Save file as', undef, 'save', '_Cancel' => 'cancel', '_Save' => 'accept'); $dialog->set_current_name($file); $response = $dialog->run(); $dialog->hide(); if ($response ne 'accept') { send_command($chat_session, FILE_DENY, "$my_name rejected the file transfer."); return; } my $filename = $dialog->get_filename(); if (!open ($chat_session->{filehandle}, ">$filename")) { feed_and_show($chat_session, "${chat_color}Could not open '$filename': $!\n"); send_command($chat_session, FILE_DENY, "$my_name rejected the file transfer."); return; } $chat_session->{filedirection} = RECEIVING; $chat_session->{filename} = $filename; $chat_session->{filetotalsize} = $length; $chat_session->{filesize} = 0; feed_and_show($chat_session, "${chat_color}Started transfer of file $filename.\n"); send_command($chat_session, FILE_BLOCK_REQUEST, ''); } sub file_block_received { # # Called when a FILE_BLOCK message is received # my ($chat_session, $block) = @_; # It should never happen that we receive a block when a file # transfer is not in progress, but let's play safe if (!defined($chat_session->{filedirection})) { send_command($chat_session, FILE_CANCEL, ''); return; } my $length = length($block); my $remaining_size = $chat_session->{filetotalsize} - $chat_session->{filesize}; my $bytes_to_write = $remaining_size < $length ? $remaining_size : $length; syswrite($chat_session->{filehandle}, $block, $bytes_to_write); $chat_session->{filesize} += $length; send_command($chat_session, FILE_BLOCK_REQUEST, ''); } sub file_end { # # Called when a FILE_END message is received # my ($chat_session) = @_; feed_and_show($chat_session, "${chat_color}Transfer of file $chat_session->{filename} finished.\n"); close($chat_session->{filehandle}); $chat_session->{filehandle} = undef; $chat_session->{filename} = undef; $chat_session->{filedirection} = undef; } sub file_stop { # # Called when a file transfer is to be stopped, either because one # of the parties aborted it, or because of an error, or because the # sending of the file has finished. # my ($chat_session, $message) = @_; # At least one client sends a FILE_CANCEL in reply to our denying a # file, and in this case the file transfer has not been initiated here. return unless defined($chat_session->{filedirection}); feed_and_show($chat_session, $message); if ($chat_session->{filedirection} == RECEIVING) { unlink($chat_session->{filename}); } close($chat_session->{filehandle}); $chat_session->{filehandle} = undef; $chat_session->{filename} = undef; $chat_session->{filedirection} = undef; } sub file_send_next_block { # # Sends the next block in the file transfer # my ($chat_session) = @_; # It should never happen that we receive a block when a file # transfer is not in progress, but let's play safe if (!defined($chat_session->{filedirection})) { send_command($chat_session, FILE_CANCEL, ''); return; } my $remaining_size = $chat_session->{filetotalsize} - $chat_session->{filesize}; #print "send block: size $chat_session->{filesize}, remaining: $remaining_size\n"; if ($remaining_size == 0) { send_command($chat_session, FILE_END, ''); file_stop($chat_session, "${chat_color}Finished transfer of file $chat_session->{filename}.\n"); return; } my $block_size = $chat_session->{type} == MM ? MM_FILE_BLOCK_SIZE : ZCHAT_FILE_BLOCK_SIZE; my $bytes_to_read = $remaining_size < $block_size ? $remaining_size : $block_size; #print "send block: block size is $block_size, we read $bytes_to_read\n"; my $buffer; my $nread = sysread($chat_session->{filehandle}, $buffer, $bytes_to_read); #print "send block: read $nread bytes\n"; if ($nread != $bytes_to_read) { # We have a problem send_command($chat_session, MESSAGE, ::colorize("${chat_color}Error while reading file.\n")); send_command($chat_session, FILE_CANCEL, ''); file_stop($chat_session, "${chat_color}Error while reading file. File transfer canceled.\n"); return; } #print "send block: adding " . ($block_size - $bytes_to_read) . " padding bytes.\n"; my $block = $buffer . chr(0) x ($block_size - $bytes_to_read); send_command($chat_session, FILE_BLOCK, $block); $chat_session->{filesize} += $bytes_to_read; #print "send block: sent\n\n"; } sub new_chat_window { # # Creates a new chat window. # my ($remotename, $chat_session) = @_; my $window = KCWin->new; $window->{chat_session} = $chat_session; $window->set_title("Chat: $remotename"); $window->signal_connect(delete_event => sub { $window->hide(); return 1; }); $window->signal_connect(focus_in_event => sub { $window->{chat_session}->{window_has_focus} = 1; if ($window->{chat_session}->{remotename}) { $window->set_title("Chat: $window->{chat_session}->{remotename}"); } }); $window->signal_connect(focus_out_event => sub { $window->{chat_session}->{window_has_focus} = 0; }); $window->{ENTRY}->signal_connect(activate => \&process_input, $chat_session); return $window; } sub feed_and_show { # # Feeds text to the window and shows the window. The text can have # color codes, colorize will be called automatically. # my ($chat_session, $text) = @_; my $window = $chat_session->{window}; $window->feed(::colorize($text)); unless ($chat_session->{window_has_focus}) { $window->set_title("(*) Chat: $chat_session->{remotename}"); } $window->show; } sub get_version { # # Returns a version string sent to the other part # return "KildClient " . ::getversion() . ", chat plugin " . $::world->getpluginversion(__PACKAGE__); } sub find_session { # # Finds a chat session for the given name # my ($name) = @_; foreach $chat (@chats) { next if $chat->{closed}; return $chat if ($chat->{remotename} eq $name); } die("Could not find chat session '$name'"); } sub remove_session { # # Removes the chat session from the list of connection # my ($chat_session) = @_; # FIXME: Actually remove it, and change UNLOAD correspondingly $chat_session->{closed} = 1; stop_snooped($chat_session); } ################################################################# # Automatic functions # sub UNLOAD { Glib::Source->remove($accept_id) if $accept_id; foreach my $chat (@chats) { next if $chat->{closed}; $chat->{socket}->close; Glib::Source->remove($chat->{io_watch_id}); $chat->{window}->destroy; } } kildclient-3.0.0/share/plugins/kc256.pl0000644000175000017500000000422411715757627014553 00000000000000package kc256; #: Version: 1.0.0 #: Description: Demonstrates the 256 color mode supported by KildClient #: Author: Eduardo M Kalinowski sub help { $::world->echonl(<<'EOHELP'); This plugin demonstrates a useful extension to the 16 ansi colors that KildClient supports. This is the same 256-color extension supported by xterm (if it is complied with support for that). With this extension, you can specify any color in a 6x6x6 RGB color cube, that is, you have 216 rgb colors at your disposal, plus 24 shades of gray. (The remaining 16 colors are the standard ansi colors.) There are two functions in this plugin: kc256::showcolors Displays all 216 available RGB colors and the 24 shades of grey in nice tables, with the values that you can use in colorize() to access them. kc256::rainbowtext($string) Just a demonstration on how (not to) use the colors. Displays $string, one character in a different color. EOHELP } sub showcolors { $::world->echonl("\nRGB Colors:"); $::world->echonl("green 000000 000000 000000 000000 000000 000000"); $::world->echonl("blue 012345 012345 012345 012345 012345 012345"); foreach my $r (0..5) { $::world->echo($r == 0 ? "red " : " "); $::world->echo("$r "); foreach my $g (0..5) { foreach my $b (0..5) { $::world->echo(::colorize("^$r$g${b}X ")); } $::world->echo(" "); } $::world->echo("\n"); } $::world->echonl("\nGreyscale:"); $::world->echo(" "); foreach my $g (0..23) { $::world->echo(::colorize("^${g}G ")); } $::world->echo("\n"); $::world->echonl(" 000000000011111111112222"); $::world->echonl(" 012345678901234567890123"); } sub rainbowtext { my ($text) = shift; my ($r, $g, $b) = (0, 0, 0); my $length = length($text); for (my $i = 0; $i < $length; ++$i) { my $char = substr($text, $i, 1); $::world->echo(::colorize("&$r$g${b}X$char")); next if ($char =~ /[[:space:]]/); ++$b; if ($b == 6) { ++$g; $b = 0; } if ($g == 6) { ++$r; $g = 0; } if ($r == 6) { $r = 0; } } } kildclient-3.0.0/share/kildclient.png0000644000175000017500000000312611715730227014516 00000000000000PNG  IHDR00WbKGD pHYs  tIME 0L{(tEXtCommentCreated with The GIMPd%nIDAThklU(ےgA  j0Q֨hDI1|jQ1 HPH}@1Z(-Þ><$;3wyϹ?X*pv, 08\̓>~`P42yP 'ہٹd~ l9LUExḍ9]lV (0{5_6q e`Z&? ܙK/3C^L\ A\(.8(n4¶>Uj5ץ+$_Ygk/O&u 8 L:WzL#S]@gہ5K4JOKIO4דoF$@H]| /+%.z>W IxD_UO[!Υ:ГA*\)SnX_i9%3ۚw=qR㱚g >?JS)`"qp0#0- EPT -*`CV)5ҕa.*l CGmr![lVv`fm/`|/04̀X ,lBrJa<)_vP Ԅ~ u:%J,1fcWp0df}=i;kUYhZI+8X$G:kP ٤QC?45kS^E5竰XbI0< Ԁ4Nm0v"Am_ia`9 H>Jcnj'Xl8I`[%ʳ.UNPP=Gt]injd"Ʈw:ѧPxp9 Zx ζаuǥHGT-t9N\%"D"@0=_x4>Յ!Ejc.pl (1S y$N_j,Ày4`rj(KNh>pWoِ^of}g܎\\8nL$gfN ȀY5߻cC'tz< q@+(Ā\a|ٚ;D.Mw:-ƀD}L25QSctm^/=0 3Kf,M}4,jXmD70,)kT(?Q\рw Fz&ZD*0J}V4_nWTei`>W~/LсEFni3kljҨ7t Jo;{|-#P ' B#h.7/if%~[)*.oXdoAA)B:t^0%>N̩^) 5@1bkZ~wrAV2|IENDB`kildclient-3.0.0/share/Makefile.am0000644000175000017500000000045411715757550013733 00000000000000SUBDIRS = plugins pkgdata_DATA = kildclient.pl \ MSDP.pm \ kildclient.hlp \ kcworld.dtd pixmapdir = $(datadir)/pixmaps pixmap_DATA = kildclient.png kildclient.xpm man_MANS = kildclient.6 EXTRA_DIST = $(pkgdata_DATA) $(pixmap_DATA) $(man_MANS) \ kildclient.xcf kildclient.ico kildclient-3.0.0/share/kcworld.dtd0000644000175000017500000001331711715730227014033 00000000000000 kildclient-3.0.0/share/Makefile.in0000644000175000017500000005624712376345610013751 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = share DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man6dir = $(mandir)/man6 am__installdirs = "$(DESTDIR)$(man6dir)" "$(DESTDIR)$(pixmapdir)" \ "$(DESTDIR)$(pkgdatadir)" NROFF = nroff MANS = $(man_MANS) DATA = $(pixmap_DATA) $(pkgdata_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = plugins pkgdata_DATA = kildclient.pl \ MSDP.pm \ kildclient.hlp \ kcworld.dtd pixmapdir = $(datadir)/pixmaps pixmap_DATA = kildclient.png kildclient.xpm man_MANS = kildclient.6 EXTRA_DIST = $(pkgdata_DATA) $(pixmap_DATA) $(man_MANS) \ kildclient.xcf kildclient.ico all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man6: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man6dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man6dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man6dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.6[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^6][0-9a-z]*$$,6,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man6dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man6dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man6dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man6dir)" || exit $$?; }; \ done; } uninstall-man6: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man6dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.6[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^6][0-9a-z]*$$,6,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man6dir)'; $(am__uninstall_files_from_dir) install-pixmapDATA: $(pixmap_DATA) @$(NORMAL_INSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pixmapdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pixmapdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pixmapdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pixmapdir)" || exit $$?; \ done uninstall-pixmapDATA: @$(NORMAL_UNINSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pixmapdir)'; $(am__uninstall_files_from_dir) install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(MANS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man6dir)" "$(DESTDIR)$(pixmapdir)" "$(DESTDIR)$(pkgdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-man install-pixmapDATA install-pkgdataDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man6 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-pixmapDATA uninstall-pkgdataDATA uninstall-man: uninstall-man6 .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man6 install-pdf \ install-pdf-am install-pixmapDATA install-pkgdataDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-man uninstall-man6 uninstall-pixmapDATA \ uninstall-pkgdataDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: kildclient-3.0.0/share/kildclient.xcf0000644000175000017500000001056411715730227014516 00000000000000gimp xcf file``BB / gimp-commentCreated with The GIMPS gimp-commentCreated with The GIMPgimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) 1C ...     ';gimp-text-layer(text "C\n") (font "Nimbus Roman No9 L Bold") (font-size 70.000000) (font-size-unit pixels) (hinting yes) (autohint yes) (antialias yes) (language "pt-br") (base-direction ltr) (color (color-rgba 0.215686 0.427451 0.400000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) 11} @7 @m @f $$ (R֩n+dU ߌ2>dar7 (\q'7d2Ed r (d  d d Ud dPV d<dd+Odddqd" `"N C" -" " " " " " " " " #" 8"` Q"$ q"##.#>#G#p)GnCPV  ^ '^ B }M @7 @m @f t%},-o6Av O.6 /+gΪy; X 7 m f \ .NK     -gimp-text-layer(text "K") (font "TSCu_Comic") (font-size 127.000000) (font-size-unit pixels) (hinting yes) (autohint yes) (antialias yes) (language "pt-br") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) xN \hN K <L$;6U=4644# "6  } ! _B *!4f > Ipm ZV-k; V |Z 0 6 za;YL(;-2g3)R(>pZ(m1 S""#?:"d"H! y4 f ;{k7 G  02P cf Hc *=mPOJ{ S8jrW5  CMzBX1 XK@v  y  k P|d I>b _ e  mG wz F  W"/#Bw$T'D%el&t()KV*+,1o-~/33355"?7*,5   *8@@9 '  Fw `C$k 69'G#kildclient-3.0.0/share/kildclient.60000644000175000017500000000732012331157477014104 00000000000000.\" Hey, EMACS: -*- nroff -*- .\" Process with: groff -man -Tascii kildclient.6 .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH kildclient 6 "2008-01-29" "KILDCLIENT" "KildClient Manual Pages" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME kildclient \- A powerful MUD client with a built-in Perl interpreter .SH SYNOPSIS .B kildclient .RI [ options "]... [" World ]... .SH DESCRIPTION This manual page documents briefly the .B KildClient program. .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBKildClient\fP is a MUD Client written with the GTK+ windowing toolkit. It supports many common features of other clients, such as triggers, gags, aliases, macros, timers, and much more. But its main feature is the built-in Perl interpreter. You can at any moment execute Perl statements and functions to do things much more powerful than simply sending text the the mud. Perl statements can also be run, for example, as the action of a trigger, allowing you to do complex things. Some built-in functions of KildClient allow interaction with the world, such as sending commands to it. .PP You can specify the name of one or more saved Worlds in the command line, this/these World(s) will be automatically opened. You can also specify a host name to connect to in the command line. By default, connection in made to port 4000. You can specify a different port by using hostname:port. While not recommended, you can also specify a username and password with the following syntax: username:password@hostname:port. This host specification syntax can be prefixed with telnet:// and end with /, for example telnet://some.mud.com:4444/. .PP If you do not specify any World, you are prompted for the MUD to connect to. You can enter the host and port directly, or you can select from a list of saved MUDs. Once connected, type commands in the separate entry box and press ENTER to send them to the MUD. You can edit the commands before sending, since they only get sent when ENTER is pressed. You can recall previous commands with the arrow keys, or by pressing the button to the right of the command entry box. .PP There are many more features, many options for configuring the program's behaviour. For more details, see the KildClient manual, which is usually installed in the .B /usr/share/doc/kildclient directory. .SH OPTIONS This program follows the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. For a complete description, see the HTML manual. .TP .B \-\-help Show summary of options. .TP .B \-\-version Show version of program. .TP .B \-c, \-\-config=\fIDIR\fB Specifies the directory to use to store configuration files and saved worlds, instead of \fI~/.kildclient\fR. .TP .B \-\-display=DISPLAY Specifies the X display to use. .SH SEE ALSO .BR perl (1). .PP The full manual in HTML formats is included with the package. It can generally be found in the .B /usr/share/doc/kildclient directory. .SH AUTHOR KildClient was written by Eduardo M Kalinowski . .PP See http://www.kildclient.org for the latest information on KildClient. kildclient-3.0.0/share/kildclient.hlp0000644000175000017500000014405012331157477014524 00000000000000[index] Use help "functionname" to get help on that function. The quotes are necessary. [help] help function: displays HELP syntax: help "function" Displays help for the given function. The name of the function is passed as a string, so it must be in quotes. [quit] quit function: QUITs kildclient Syntax: quit Disconnects and closes all Worlds and KildClient exits. [dc] dc function: DisConnects from world Syntax: $world->dc Disconnects from the current world. [reconnect] reconnect function: RECONNECTs to the world Syntax: $world->reconnect When in offline mode, this function will attempt to reconnect to the mud. [connectother] connectother function: CONNECTS to anOTHER world Syntax: $world->connectother This function allows you to select another World to connect to, using the same window. If you are connected, you will be first disconnected from the current server. [save] save function: SAVEs the current world Syntax: $world->save Saves the current World. [minimize] minimize function: MINIMIZEs the window Syntax: $window->minimize This function minimized KildClient's main window. Called from a macro, it makes a nice boss key. :-) [getname] getname function: GETs the NAME of the world Syntax: $name = $world->getname This function returns the name of the world. [getcharacter] getcharacter function: GETs the name of the connected CHARACTER Syntax: $name = $world->getcharacter If autologin was used, this function returns the name of the character used to log in to the mud. If autologin is disabled, this function returns undef. [getmainfont] getname function: GETs the MAIN window FONT Syntax: $font = $world->getmainfont This function returns the name of the font used in the main MUD window, that is, where the output of the world appears. [getentryfont] getentryfont function: GETs the command ENTRY box FONT Syntax: $font = $world->getentryfont This function returns the name of the font used in the command entry box. [getconntime] getconntime function: GETs the CONNection TIME Syntax: $seconds = $world->getconntime This function returns the time spent connected to the world, in seconds. [getidletime] getidletime function: GETs the IDLE TIME Syntax: $seconds = $world->getidetime This function returns the idle time, that is, the time elapsed since the last command was sent, in seconds. [getsize] getsize function: GETs the current window SIZE Syntax: ($lines, $columns) = $window->getsize $columns = $window->getsize This function returns the current size of the window (in characters), in terms of lines and columns. It can return both dimensions, or just the number of columns. [getclientname] getclientname functions: GETs the CLIENT's NAME Syntax: $name = getclientname() This functions returns the name of the client, that is, "KildClient. [getversion] getversion function: GETs the KildClient VERSION number Syntax: $version = getversion This function returns the version number of KildClient. [next] next function: goes to the NEXT world Syntax: $world->next([number]) If used without arguments, this function focuses the next open world. You can also give a numeric argument X, in this case it focuses the Xth world after the current one. [prev] prev function: goes to the PREVious world Syntax: $world->prev([number]) If used without arguments, this function focuses the previous open world. You can also give a numeric argument X, in this case it focuses the Xth world before the current one. [gotow] gotow function: GOes TO a World Syntax: gotow number gotow "name" Focuses the Nth world (when called with a number) or the world with the given name (when called with a string). The first world is numbered 0. [getworld] getworld function: GETs a pointer to a WORLD Syntax: $var = getworld("name") Returns a variable that points to the open world with the given name. You can then manipulate that world with the returned variable (by calling functions that operate on worlds with that variable). For example: $coolmud = getworld("CoolMud"); $coolmud->send("quit"); This will send "quit" to the CoolMud world. [close] close function: CLOSEs the current world Syntax: $world->close Disconnects and closes the current world, immediately. [commandecho] commandecho function: sets or gets the status of the COMMAND ECHO feature Syntax: $world->commandecho(boolean) $status = $world->commandecho When used with an argument, this sets the command echo option for the current world to the given value (which should be false to cause commands not to be echoed or true to cause them to be echoed). If called without arguments, it doesn't change the status of that option, but returns its current value. [cmdseparator] cmdseparator function: sets or gets the CoMmanD SEPARATOR Syntax: $world->cmdseparator("string") $separator = $world->cmdseparator When used with an argument, this sets the command separator for the current world to the given value. If called without arguments, it returns its current value. [echo] echo function: ECHOes something to the terminal window Syntax: $world->echo("str1", "str2", ...) Prints the strings in the terminal window. They are not sent to the world. [echonl] echonl function: ECHOes to the terminal window, followed by NewLine Syntax: $world->echonl("str1", "str2", ...) Prints the strings in the terminal window, each followed by a newline. They are not sent to the world. [send] send function: SENDs something to the world Syntax: $world->send("str1", "str2", ...) Sends any number of strings to the current world. [sendlines] sendlines function: SENDs several LINES to the world Syntax: success = $world->sendlines( "multi-line string", [delay , [n-lines]] ) success = $world->sendlines( [ "line 1", "line 2", ... ] , [delay , [n-lines]] ) Sends several lines of text to the world. delay is the number of seconds to wait between sending each group of lines, and n-lines is the number of lines to send a time. If these values are not specified, they are taken from the defauls set in the Preferences dialog. There are two ways to specify the lines to be sent: the first is passing a multi-line string, which is split into lines and each line is sent separately. The second one is passing a reference to an array where each element consists of one line. This function always returns true. For more options, see the $world->mlsend() function which allows adding a text before and/or after each line, and sending lines before and/or after sending the contents of the file. [sendfile] sendfile function: SENDs a FILE to the world Syntax: success = $world->sendfile(file [, delay [, n-lines]]) Sends the contents of the given file to the world. delay is the number of seconds to wait between sending each group of lines, and n-lines is the number of lines to send a time. If these values are not specified, they are taken from the defauls set in the Preferences dialog. On success, returns true. If the file does not exist or cannot be open, this function does nothing and returns a false value. It returns undef if the file name is not specified. For more options, see the $world->mlsend() function which allows adding a text before and/or after each line, and sending lines before and/or after sending the contents of the file. [mlsend] mlsend function: Multi-Line SEND Syntax: success = $world->mlsend( attributes ); This functions emulates the Multi-line Send feature from perl scripts. Several lines can be sent at once, optionally prefixing and/or suffixing each line with text you specify. It's also possible to send the contents of a file to the MUD. The lines can be sent with customized intervals between them (so as not to cause buffer overflows that lead to a disconnection from the server). atributes is a reference to a hash defining attributes for the timer. Generally the call works like this: $world->mlsend({ attribute1 => value1, attribute2 => value2, ... }) Possible attributes: initialtext - Lines of text to be sent to the MUD before anything else. You can specify this argument in two ways: one is as a string composed of several lines, KildClient will split the string and send each line separately. The second option is to pass a reference to an array, where each element is a line. The following two call are thus equivalent: $world->mlsend({ initialtext => "First line\nSecond line\nLast line" }) $world->mlsend({ initialtext => [ "First line", "Second line", "Last line" ]}) file - The path to a file whose contents are to be sent, line by line, after sending the initialtext (if present), but before sending finaltext. finaltext - Lines to be sent after the file contents has been sent (if a file was specified). This is very similar to initialtext, and can be given also as a multi-line string or as a reference to an array of lines. linestart - If present, specifies a string that is prepended to each line as it is sent to the mud. lineend - If present, specifies a string that is appended to each line as it is sent to the mud. delay - The delay, in seconds, between each group of lines. If you are getting disconnected for sending too much text at once, increase this value. If not given, the value is taken from the Global Preferences. linesatime - The number of lines to be sent at a time. If not given, the value is taken from the Global Preferences. On success, returns true. If the file does not exist or cannot be open, this function does nothing and returns a false value. It returns undef if invalid parameters are specified. You might also want to see the $world->sendlines() and $world->sendfile() functions which are simpler ways of sending several lines or the contents of a file at once, respectively. [sendnoecho] sendnoecho function: SENDs something to the world, with NO ECHO Syntax: $world->sendnoecho("str1", "str2", ...) Sends any number of strings to the current world, without echoing them to the main window, regardless of the current setting of the command echo option. [sendecho] sendecho function: SENDs something to the world, with ECHO Syntax: $world->sendecho("str1", "str2", ...) Sends any number of strings to the current world, echoing them to the main window, regardless of the current setting of the command echo option. [interpret] interpret function: INTERPRETs a string as if typed in the input box Syntax: $world->interpret("string") This function interprets the string as if it were typed in the input box: commands are split, Perl code is run, aliases are expanded, etc. [getline] getline function: GETs a LINE from the scrollback buffer Syntax: $text = $world->getline(line); ($text, $time) = $world->getline(line); This functions allows you to retrieve a line from the scrollback buffer, and optionally the time in which it was received. line can be a positive number, representing the number of the line to fetch, or a negative number. If negative, that means that number of lines counting from the bottom. (That is, -1 is the last received line, -2 the one before the last, and so on.) If the line cannot be retrieved (because it is not stored anymore), returns undef. The time returned is represented as the number of seconds since the epoch, the same kind of value the time function would return. [settitle] settitle function: SETs the window TITLE Syntax: $window->settitle("new title") Sets the title of the window to the given string. [setstatus] setstatus function: SETs the STATUS bar text Syntax: $world->setstatus("message") Sets the text in the main window status bar to "text". [seturgencyhint] seturgencyhint function: SETs the URGENCY window HINT Syntax: $window->seturgencyhint(boolean) Sets the value of the window's "urgency" flag to true or false. This is a request for attention to the window, and usually will make the window title flash. However note that the actual behavior depends on the window manager used. [play] play function: PLAY a sounf file Syntax: play("file") Plays the sound file whose path is given as argument. Supports WAV files. [trigger] trigger function: creates a TRIGGER Syntax: $world->trigger(["pattern" [, "action"]] [, attributes]) Syntax: $world->trigger(number, "pattern", "action") Creates a new trigger, or edits the trigger identified by number, matching pattern (a Perl regular expression), that will execute action when a line is matched by pattern. action is interpreted as if it were typed in the command box. Simple strings get sent to the world, Perl code can be run by prefixing it with '/', etc. Atributes is a reference to a hash defining attributes for the trigger. Generally the call works like this: $world->trigger("pattern", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: pattern - The pattern to match action - The action to execute enabled - If value evaluates to true, the trigger is enabled. If it evaluates to false, the trigger is disbled and lines are not matched against it. name - Assigns a name to the trigger, so that it can be referenced by name. ignorecase - If true, ignore case when matching the pattern. gag - If value evaluates to true, the trigger gags the line that triggered it. gaglog - If value evaluates to true, the line is not written to the log file. keepexecuting - If the value evaluates to true, when a line matches the trigger, the actions for the trigger are executed, and matching of the line continues against other triggers. If this is false (the default), when this trigger matches no other triggers are matched. rewriter - This trigger is a rewriter trigger. It is run before other triggers, does not prevent any other trigger from running (even if keepexecuting is false), and can alter the input line for further processing by changing the $colorline variable. For more details, see the manual. style - Used to control the changing of styles (color, attributes, etc.) of a matched part of the line. See the help for style for details. [style] style attribute for triggers When a trigger matches against a line, it can change the style of the matched line, the matched part or one of the matched substrings. (This feature is sometimes called highlighting.) To specify that a trigger should change the style, use the style attribute when adding or editing the trigger. The value of this attribute is an anonymous hash that specifies everything that is to be changed. Here's an example: $world->trigger('Joe', { name => 'joe', style => { enabled => 1, fg => 16 } }); These are the valid attributes: enabled - Set this to 1 to enable changing the style. target - What to highlight. Possible values are: -1 - The whole matched line 0 - The whole substring that matched 1 - The first captured substring 2 - The second captured substring 3 - etc. fg - What to do with the foreground colour. -1 means not to change it. Other values change to the given color, as follows: 0 - black 9 - black (bold) 1 - red 10 - red (bold) 2 - green 11 - green (bold) 3 - yellow 12 - yellow (bold) 4 - blue 13 - blue (bold) 5 - magenta 14 - magenta (bold) 6 - cyan 15 - cyan (bold) 7 - white 16 - white (bold) 8 - the default color 17 - default bold color bg - What to do with the background color. The values are the same as for the foreground color. italics - Italics setting. -1 means do not change. 0 means to not use italics, and 1 means to use it. strike - Strike-thru setting. -1 means do not change. 0 means disable it, and 1 means enable it. underline - Underline setting. -1 means no change. 0 means no underline. 1 means single underline, and 2 means double underline. [gag] gag function: adds a simple GAG Syntax: $world->gag("pattern") Adds a gag that prevents lines matching pattern from being shown. See the trigger function for more advanced options. [distrigger] distrigger function: DISables a TRIGGER Syntax: $world->distrigger(number/name...) Disables the trigger identified by number or name. [enatrigger] enatrigger function: ENAbles a TRIGGER Syntax: $world->enatrigger(number/name...) Enables the trigger identified by number or name. [silentdistrigger] silentdistrigger function: SILENTly DISables a TRIGGER Syntax: $world->silentdistrigger(number/name...) Disables the trigger identified by number or name. Does not print a message in the screen in case of success. [silentenatrigger] silentenatrigger function: SILENTly ENAbles a TRIGGER Syntax: $world->silentenatrigger(number/name...) Enables the trigger identified by number or name. Does not print a message in the screen in case of success. [triggerenabled] triggerenabled function: checks whether a TRIGGER is ENABLED Syntax: result = $world->triggerenabled(name/number) This function checks whether the specified trigger exists and whether it is enabled. You can pass either a trigger number or name. If the trigger does not exist, this function returns undef, so you can distinguish the case of a non-existant trigger from a disabled one. If the trigger exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several triggers with the same name, it returns a list with one value for each trigger with that name, and each value is 0 or 1 depending on the state of the trigger. [listtrigger] listtrigger function: LISTs one or all TRIGGERs Syntax: $world->listtrigger Briefly lists all defined triggers. Syntax: $world->listtrigger(number/name...) Lists detailedly the trigger with the given number or name. [deltrigger] deltrigger function: DELETEs a TRIGGER Syntax: $n = $world->deltriger(number/name...) Deletes the trigger identified by the given number or name. If there are several triggers with the same name, deletes them all. Returns the number of triggers deleted. [movetrigger] movetrigger function: MOVEs a TRIGGER to another position Syntax: $world->movetrigger(number/name, new_pos) Moves the trigger with the given name or number so that it occupies the position new_pos after execution of this function. Other triggers might be moved up or down in result of this. If new_pos is negative or greater than the number of triggers, the trigger is moved to the last position. If there are several triggers with the given name, only the first one found is moved. [alias] alias function: creates an ALIAS Syntax: $world->alias(["pattern" [, "substitution"]] [, attributes]) $world->alias(number, ["pattern" [, "substitution"]] [, attributes]) Creates a new alias, or edits the alias identified by number. Entered commands will be matched against pattern (a Perl regular expression), and if the pattern matches, the given substitution will be applied. (In a s/pattern/substitution/ structure.) Be careful that any part of the command can match. To match only the exact string, use something like '^command$'. To match only in the beginning of the line, use '^command'. Atributes is a reference to a hash defining attributes for the alias. Generally the call works like this: $world->alias("pattern", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: pattern - The pattern to match substitution - The substitution to do ignorecase - If true, ignore case when matching the pattern. perleval - If true, the substitution is made passing the "e" flag (s/pattern/substitution/e), so substitution should be actually Perl statements to be evaluated when there is a match. enabled - If value evaluates to true, the alias is enabled, if false, it is disabled and commands are not matched against it. name - Assigns a name to the alias, so that it can be referenced by name. [disalias] disalias function: DISables an ALIAS Syntax: $world->disalias(number/name...) Disables the alias identified by number or name. [enaalias] enaalias function: ENAbles an ALIAS Syntax: $world->enaalias(number/name...) Enables the alias identified by number or name. [silentdisalias] silentdisalias function: SILENTly DISables an ALIAS Syntax: $world->[silentdisalias(number/name...) Disables the alias identified by number or name. Does not print a message in the screen in case of success. [silentenaalias] silentenaalias function: SILENTly ENAbles an ALIAS Syntax: $world->[silentenaalias(number/name...) Enables the alias identified by number or name. Does not print a message in the screen in case of success. [aliasenabled] aliasenabled function: checks whether a ALIAS is ENABLED Syntax: result = $world->aliasenabled(name/number) This function checks whether the specified alias exists and whether it is enabled. You can pass either a alias number or name. If the alias does not exist, this function returns undef, so you can distinguish the case of a non-existant alias from a disabled one. If the alias exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several aliases with the same name, it returns a list with one value for each alias with that name, and each value is 0 or 1 depending on the state of the alias. [listalias] listalias function: LISTs one or all ALIASes Syntax: $world->listalias Briefly lists all defined aliases. Syntax: $world->listalias(number/name...) Lists detailedly the alias with the given number or name. [delalias] delalias function: DELETEs an ALIAS Syntax: $n = $world->delalias(number/name...) Deletes the alias identified by the given number or name. If there are several aliases with the same name, deletes them all. Returns the number of aliases deleted. [movealias] movealias function: MOVEs an ALIAS to another position Syntax: $world->movealias(number/name, new_pos) Moves the alias with the given name or number so that it occupies the position new_pos after execution of this function. Other aliases might be moved up or down in result of this. If new_pos is negative or greater than the number of aliases, the alias is moved to the last position. If there are several aliases with the given name, only the first one found is moved. [expandalias] expandalias function: EXPANDs ALIASes in a string Syntax: $result = $world->expandalias("string") This function expands aliases in the string passed as argument. The result is what you would get if you typed "string" in the input box (except that aliases are still expanded even if "Disable Aliases" is selected in the "Preferences" menu). [getkeycode] getkeycode function: GETs the KEYCODE for a key combination Syntax: $key = $world->getkeycode After running this function, press a key (or a combination of keys). The keycode (to be used in the macro function) will be returned and also printed in the screen. [macro] macro function: creates a MACRO Syntax: $world->macro(["keycode" [, "action"]] [, attributes]) $world->macro(number, ["keycode" [, "action"]] [, attributes]) Creates a new macro, or edits the macro identified by number. Keycode represents a key such as "KP_Home" or "F12". The format is the one accepted by the GTK+ function gtk_accelerator_parse(), but most of the time you will want to use the "getkeycode" function to retrieve the keycode for a given key. Action is what will be executed when the key (or keys) is pressed. Atributes is a reference to a hash defining attributes for the macro. Generally the call works like this: $world->macro("keycode", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: key - The key code. action - The action to be executed. enabled - If value evaluates to true, the macro is enabled, if false, it is disabled. name - Assigns a name to the macro, so that it can be referenced by name. [dismacro] dismacro function: DISables a MACRO Syntax: $world->dismacro(number/name...) Disables the macro identified by number or name. [enamacro] enamacro function: ENAbles a MACRO Syntax: $world->enamacro(number/name...) Enables the macro identified by number or name. [silentdismacro] silentdismacro function: SILENTly DISables a MACRO Syntax: $world->silentdismacro(number/name...) Disables the macro identified by number or name. Does not print a message in the screen in case of success. [silentenamacro] silentenamacro function: SILENTly ENAbles a MACRO Syntax: $world->silentenamacro(number/name...) Enables the macro identified by number or name. Does not print a message in the screen in case of success. [macroenabled] macroenabled function: checks whether a MACRO is ENABLED Syntax: result = $world->macroenabled(name/number) This function checks whether the specified macro exists and whether it is enabled. You can pass either a macro number or name. If the macro does not exist, this function returns undef, so you can distinguish the case of a non-existant macro from a disabled one. If the macro exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several macros with the same name, it returns a list with one value for each macro with that name, and each value is 0 or 1 depending on the state of the macro. [listmacro] listmacro function: LISTs one or all MACROs Syntax: $world->listmacro Briefly lists all defined macros. Syntax: $world->listmacro(number/name...) Lists detailedly the macro with the given number or name. [delmacro] delalias function: DELETEs a MACRO Syntax: $n = $world->delmacro(number/name...) Deletes the macro identified by the given number or name. If there are several macros with the same name, deletes them all. Returns the number of macros deleted. [movemacro] movemacro function: MOVEs a MACRO to another position Syntax: $world->movemacro(number/name, new_pos) Moves the macro with the given name or number so that it occupies the position new_pos after execution of this function. Other macros might be moved up or down in result of this. If new_pos is negative or greater than the number of macros, the macro is moved to the last position. If there are several macros with the given name, only the first one found is moved. [timer] timer function: creates a TIMER Syntax: $world->timer(attributes) $world->timer(number, attributes) Creates a new timer, or edits the timer identified by number. Atributes is a reference to a hash defining attributes for the timer. Generally the call works like this: $world->timer({ attribute1 => value1, attribute2 => value2, ... }) Possible attributes: interval - Number of seconds between each execution. Fractions of seconds (such as 1.5) are allowed. Required. count - Number of times to execute the timer. After this number of executions, the timer will be automatically disabled or deleted (see temporary flag below). If count is not given or count is -1, the timer repeats until manually disabled or deleted. action - The action to execute. Required. temporary - If set to 1, the timer will be deleted (and not only disabled) after count executions have happened. enabled - If set to 1, the timer is enabled and will execute every count seconds. If set to 0, the timer does not execute until enabled again. New timers are created enabled by default. name - Assigns a name to the timer, so that it can be referenced by name. [listtimer] listimer function: LISTs one or all TIMERs Syntax: $world->listimer Briefly lists all defined timers. Syntax: $world->listtimer(number/name...) Lists detailedly the timer with the given number or name. [deltimer] deltimer function: DELETEs a TIMER Syntax: $n = $world->deltimer(number/name...) Deletes the timer identified by the given number or name. If there are several timers with the same name, deletes them all. Returns the number of timers deleted. [distimer] distimer function: DISables a TIMER Syntax: $world->distimer(number/name...) Disables the timer identified by number or name. [enatimer] enatimer function: ENAbles a TIMER Syntax: $world->enatimer(number/name...) Enables the timer identified by number or name. [silentdistimer] silentdistimer function: SILENTly DISables a TIMER Syntax: $world->silentdistimer(number/name...) Disables the timer identified by number or name. Does not print a message in the screen in case of success. [silentenatimer] silentenatimer function: SILENTly ENAbles a TIMER Syntax: $world->silentenatimer(number/name...) Enables the timer identified by number or name. Does not print a message in the screen in case of success. [timerenabled] timerenabled function: checks whether a TIMER is ENABLED Syntax: result = $world->timerenabled(name/number) This function checks whether the specified timer exists and whether it is enabled. You can pass either a timer number or name. If the timer does not exist, this function returns undef, so you can distinguish the case of a non-existant timer from a disabled one. If the timer exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several timers with the same name, it returns a list with one value for each timer with that name, and each value is 0 or 1 depending on the state of the timer. [movetimer] movetimer function: MOVEs a TIMER to another position Syntax: $world->movetimer(number/name, new_pos) Moves the timer with the given name or number so that it occupies the position new_pos after execution of this function. Other timers might be moved up or down in result of this. If new_pos is negative or greater than the number of timers, the timer is moved to the last position. If there are several timers with the given name, only the first one found is moved. [makepermanent] makepermanent function: MAKEs variables PERMANENT Syntax: $world->makepermanent('var1' [, 'var2' [, ...]]) This function marks one or more variables as permanent, that is, the values of these variables will be saved when the world is closed, and reloaded when the world is opened, thus keeping their values between successive uses of the world. The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation. [maketemporary] maketemporary function: MAKEs variables TEMPORARY Syntax: $world->maketemporary('var1' [, 'var2' [, ...]]) This function marks one or more variables as temporary, that is, the values of these variables will not be saved when the world is closed. This is the standard behaviour for variables, so this function is only needed to undo the efects of the makepermanent() function. The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation. [ispermanent] ispermanent function: checks wheter a variable IS PERMANENT Syntax: $return = $world->ispermanent('var']) This function tests if a variable is permanent. The return value is true or false depending on the variable's status. The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation. [listpermanent] listpermanent function: LISTs PERMANENT variables Syntax: $world->listpermanent This function prints a list of all variables that are defined as permanent, that is, variables that will be saved when you close the world and have their values restores when the world is re-opened. [hook] hook function: connects a HOOK Syntax: $world->hook(event, action, attributes) $world->hook(event, number, [action], [attributes]) A hook is an action that is connected to an event, such as connecting to the World or the window receiving focus. This functions allow you to define a hook for a given event, that will execute action, or to edit the hook identifyed by number. Here are the events currently supported: - OnConnect: This hook is executed when a connection to the world is made, after the auto-logon has taken place (if applicable). - OnDisconnect: This hook is executed when you are disconnected from a World, after the connection has been closed. - OnReceivedText: Executed when text is received from the world. The received text is available in the $hookdata variable. - OnSentCommand: Executed after a command is sent to the world. The command is available in the $hookdata variable. - OnGetFocus: Executed when the KildClient window receives the focus. - OnLoseFocus: Executed when the KildClient window loses the focus. - OnCloseConnected: Executed when the world is forcedly closed. This can happen using the World->Close menu, the $world->close() function, or by quitting the program with the world connected. You can put in this hook, for example "quit" to always exit the MUD nicely, even if you close the world by mistake. atributes is a reference to a hash defining attributes for the hook. Generally the call works like this: $world->hook("event", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: action - The action to be executed. enabled - If value evaluates to true, the hook is enabled. If it evaluates to false, the hook is disbled and is not executed. name - Assigns a name to the hook, so that it can be referenced by name. [listhook] listhook function: LISTs connected HOOKs Syntax: $world->listhook(event) This function briefly lists all hooks connected to the given event. Syntax: $world->listhook(event, name/number...) Lists detailedly the hook with the given number or name, connected to the specified event. If there are several hooks with the same name, lists them all. [delhook] delhook function: DELetes a HOOK Syntax: $n = $world->delhook(event, number/name...) Deletes the hook identified by the given number or name, connected to the specified event. If there are several hooks with the same name, deletes them all. Returns the number of deleted hooks. [dishook] dishook function: DISables a HOOK Syntax: $world->dishook(event, number/name...) Disables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, disables them all. [enahook] enahook function: ENAbles a HOOK Syntax: $world->enahook(event, number/name...) Enables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, enables them all. [silentdishook] silentdishook function: SILENTly DISables a HOOK Syntax: $world->silentdishook(event, number/name...) Disables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, disables them all. Does not print a message in the screen in case of success. [silentenahook] silentenahook function: SILENTly ENAbles a HOOK Syntax: $world->silentenahook(event, number/name...) Enables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, enables them all. Does not print a message in the screen in case of success. [hookenabled] hookenabled function: checks whether a HOOK is ENABLED Syntax: result = $world->hookenabled(event, name/number) This function checks whether the specified hook exists and whether it is enabled. The first argument is the name of the event. For the second, you can pass either a hook number or name. If the hook does not exist, this function returns undef, so you can distinguish the case of a non-existant hook from a disabled one. If the hook exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several hooks with the same name, it returns a list with one value for each hook with that name, and each value is 0 or 1 depending on the state of the hook. [movehook] movehook function: MOVEs a HOOK to another position Syntax: $world->movehook(event, number/name, new_pos) Moves the hook with the given name or number, connected to the given event, so that it occupies the position new_pos after execution of this function. Other hooks might be moved up or down in result of this. If new_pos is negative or greater than the number of hooks, the hook is moved to the last position. If there are several hooks with the given name, only the first one found is moved. [gettriggernumber] gettriggernumber function: GETs a TRIGGER's NUMBER Syntax: @numbers = $world->gettriggernumber(name) Returns a list with the number(s) of the trigger(s) matching the given name. If no trigger with that name is found, returns an empty list. If there are several triggers with the same name, returns the numbers of all of them. The number of a trigger is necessary to edit it. However, as the user can change the order of triggers, create new ones and delete old triggers, a trigger's number may change, so you should not store its number; you must fetch the number just before editing it. [getaliasnumber] getaliasnumber function: GETs an ALIAS's NUMBER Syntax: @numbers = $world->getaliasnumber(name) Returns a list with the number(s) of the alias(es) matching the given name. If no alias with that name is found, returns an empty list. If there are several aliases with the same name, returns the numbers of all of them. The number of an alias is necessary to edit it. However, as the user can change the order of aliases, create new ones and delete old aliases, an alias's number may change, so you should not store its number; you must fetch the number just before editing it. [getmacronumber] getmacronumber function: GETs a MACRO's NUMBER Syntax: @numbers = $world->getmacronumber(name) Returns a list with the number(s) of the macro(s) matching the given name. If no macro with that name is found, returns an empty list. If there are several macros with the same name, returns the numbers of all of them. The number of a macro is necessary to edit it. However, as the user can change the order of macros, create new ones and delete old macros, a macro's number may change, so you should not store its number; you must fetch the number just before editing it. [gettimernumber] gettimernumber function: GETs a TIMER's NUMBER Syntax: @numbers = $world->gettimernumber(name) Returns a list with the number(s) of the timer(s) matching the given name. If no timer with that name is found, returns an empty list. If there are several timers with the same name, returns the numbers of all of them. The number of a timer is necessary to edit it. However, as the user can change the order of timers, create new ones and delete old timers, a timer's number may change, so you should not store its number; you must fetch the number just before editing it. [gethooknumber] gethooknumber function: GETs a HOOK's NUMBER Syntax: @numbers = $world->gethooknumber(event, name) Returns a list with the number(s) of the hook(s) matching the given name. If no hook with that name is found, returns an empty list. If there are several hooks with the same name, returns the numbers of all of them. You must specify the event in which to search for the hook. The number of a hook is necessary to edit it. However, as the user can change the order of hooks, create new ones and delete old hooks, a hook's number may change, so you should not store its number; you must fetch the number just before editing it. [loadplugin] loadplugin function: LOADs a PLUGIN Syntax: $world->loadplugin("name") $world->loadplugin("file") Loads a plugin. You can either pass a full path for the file that defines the plugin, or just its name. If you provide only the name, a file with that name (and the extesion .pl, if the extension is not already provided) will be looked for in the directories specified by the @PLUGINDIRS array. By default, this array contain two directories: one where KildClient stores some of its files (generally /usr/local/share/kildclient/plugins) and one in the user's home directory (~/.kildclient/plugins), but feel free to add more directories to search plugins for. This function returns true if the plugin was successfully loaded, and false otherwise (including the case in which the plugin was already loaded). See also requireplugin() for a way to load a plugin unless it is already loaded. [requireplugin] requireplugin function: REQUIREs a PLUGIN to be loaded Syntax: $world->loadplugin("name") This function is similar to loadplugin, but first checks if the plugin is already loaded. If it is, it returns successfully. If not, it tries loading the plugin (silently). If this succeeds, the function returns successfully, if not, it die()'s. This function is useful in plugins that require other plugins, and is meant to be called in a BEGIN block of a plugin that requires another. The argument passed must be the name of the plugin (a path to the file is not allowed, unlike with loadplugin See loadplugin for information on how plugins are found. [listplugin] listplugin function: LISTs loaded PLUGINs Syntax: $world->listplugin Briefly lists all loaded plugins. Syntax: $world->listplugin(name/number) Gives detailed information on the given plugin. [getpluginversion] getpluginversion function: GETs a PLUGIN's version Syntax: $version = $world->getpluginversion("name") This function returns the version of the plugin with the given name. If no plugin with that name is loaded, it returns an empty string. [enaplugin] enaplugin: ENAbles a PLUGIN Syntax: $world->enaplugin(name) Enables the specified plugin. [displugin] displugin: DISables a PLUGIN Syntax: $world->displugin(name) Disables the specified plugin. [logfile] logfile function: enables or disables LOGging the output to a FILE Syntax: $world->logfile("file" [, "timeformat"]) Starts logging to the given file. Everything output by the mud will be saved. If timeformat is specified, it is considered a string to be passed to the strftime() function, with special tags that are replace with the current time and/or date, and the resulting string is prefixed to each line. (See the strftime() manual page for the possible tags.) If this argument is not given, nothing is prefixed to the lines. It is not possible to log to more than one file at one time, if there is already a log file open, it will be closed and logging will continue to the new file. Syntax: $world->logfile With no arguments, this function stops logging output. [getlogfile] getlogfile: GETs name of LOGging FILE Syntax $file = $world->getlogfile() This function returns the name of the file to which the output is being logged, or undef if logging is not started for the world. [writetolog] writetolog function: WRITEs something TO the LOG file Syntax: $world->writetolog("line" [, "line", ...]) Writes the given line to the log file, if any. If logging is not currently enabled, then this function does nothing. Each argument is a complete line, that is written preceded by a timestamp, if this is enabled, to the log file. If the string has ANSI codes or codes used by the colorize() function, they will be stripped and not written to the log file. [echonlandlog] echonlandlog function: calls ECHONL and writetoLOG Syntax: $world->echonlandlog("line" [, "line", ...]) This is a convenience function that just calls $world->echonl() and $world->writetolog() for each argument, thus writing the given line(s) to the screen and to the log file. [colorize] colorize function: COLORIZEs a string Syntax: $colorized = colorize "str" Replaces color codes in the string with ANSI escape sequences, so that the string can be echoed in the terminal, for example. Returns the colorized string Color code table (based on the ones used by Smaug): Note: if you want to set both the foreground and the background, the code for the foreground should come first. If you want to set the foreground and/or background and one or more attributes (underline, italics, etc), the attribute setting should come last. Note: to insert a & or ^ character, use && and ^^, respectively. &0 (number zero) - Reset all attributes and colors to default Normal colors: &x - Black &r - Red &g - Green &O - Yellow &b - Blue &p - Magenta &c - Cyan &w - White &d - Default foreground Bold colors: &z - Bold Black &R - Bold Red &G - Bold Green &Y - Bold Yellow &B - Bold Blue &P - Bold Magenta &C - Bold Cyan &W - Bold White &D - Default bold foreground Background colors: ^x - Black ^r - Red ^g - Green ^O - Yellow ^b - Blue ^p - Magenta ^c - Cyan ^w - White ^d - Default background Light background colors (sometimes causes blinking): ^z - Light Black ^R - Light Red ^G - Light Green ^Y - Light Yellow ^B - Light Blue ^P - Light Magenta ^C - Light Cyan ^W - Light White ^D - Default light background Attributes: (may not work on other clients) &_ - Underline on ^_ - All underline off &= - Double underline on &| - Strikethrough on ^| - Strikethrough off &/ - Italics on ^/ - Italics off &i - Inverse video on ^i - Inverse video off &h - Hidden mode on ^h - Hidden mode off You can also also use colorize() to display text in any color of a 6x6x6 RGB color cube. To do so, use &rgbX and ^rgbX to set the foreground and background, respectively. r, g, and b are integers between 0 and 5 representing the amount of red, green and blue. X is really the letter X, it is used to close the code. Finally, to select one of the 24 shades of gray available, use &nG and ^nG for the foreground and background, respectively, where n is an integer from 0 to 23, and G is really the letter G. You can use the kc256 plugin to display all the colors for you to choose from. [stripansi] stripansi function: STRIPs ANSI sequences from the string Syntax: $stripped = stripansi "string" Returns the string stripped of any ANSI sequences that it had. [stripcolorize] stripansi function: STRIPs COLORIZE sequences from the string Syntax: $stripped = stripcolorize "string" Returns the string stripped of any sequences used by the colorize() function to add color. [path] path function: generate sequences of directions forming a PATH Syntax: $world->path "str" str is a string defining a path. The following example shows the features of paths: 3n2e4n2e{ne}e{open door}3n The general syntax syntax is . can be omitted, in this case it is considered as 1. Command is the command that will be repeated. If it is not a one-letter command, it should be enclosed in braces: {}. The example above would generate these commands: n n n e e n n n n e e ne e open door n n n [sendserverdata] sendserverdata function: SENDs out-of-band DATA to the SERVER Syntax $world->sendserverdata({ ... }) See Chapter "Out-of-band server data" in the manual for details. [sendmsdpcommand] sendmsdpcommand function: SENDs an MSDP protocol COMMAND Syntax $world->sendmsdpcommand(command, argument1, ...) See Chapter "Out-of-band server data" in the manual for details. kildclient-3.0.0/share/kildclient.pl0000644000175000017500000007664012354321115014350 00000000000000### Copyright (C) 2004-2014 Eduardo M Kalinowski ### ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, ### MA 02110-1301, USA. ### ### kildclient.pl ### ### This file contains some built-in Perl functions used by ### KildClient. ### ### This is not the best place to define your own functions. ### To do that, you should configure your world to load a ### script file, and define your functions there. use strict; use Locale::gettext; use JSON; use MSDP; our $__helpfile; our @PLUGINDIRS; # Convenience wrapper sub _ { return gettext($_[0]); } { package World; sub echonl { my $self = shift; foreach (@_) { $self->echo("$_\n"); } } sub sendecho { my $self = shift; my $prevstate = $self->commandecho(); $self->commandecho(1); $self->send(@_); $self->commandecho($prevstate); } sub sendnoecho { my $self = shift; my $prevstate = $self->commandecho(); $self->commandecho(0); $self->send(@_); $self->commandecho($prevstate); } sub mlsend { my $self = shift; if (scalar @_ == 0) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'mlsend')); return; } my $args = shift; if ($args->{initialtext} && ref($args->{initialtext}) ne 'ARRAY') { $args->{initialtext} = [ split(/\n/, $args->{initialtext}) ]; } if ($args->{finaltext} && ref($args->{finaltext}) ne 'ARRAY') { $args->{finaltext} = [ split(/\n/, $args->{finaltext}) ]; } return $self->_mlsend($args); } sub sendlines { my $self = shift; if (scalar @_ == 0) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'sendlines')); return; } my $args = { initialtext => $_[0] }; if (scalar @_ >= 2) { $args->{delay} = $_[1]; } if (scalar @_ >= 3) { $args->{linesatime} = $_[2]; } return $self->mlsend($args); } sub sendfile { my $self = shift; if (scalar @_ == 0) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'sendfile')); return; } my $args = { file => $_[0] }; if (scalar @_ >= 2) { $args->{delay} = $_[1]; } if (scalar @_ >= 3) { $args->{linesatime} = $_[2]; } return $self->_mlsend($args); } sub path { my $self = shift; my $path = $_[0]; if (!$path) { return; } my ($num, $cmd, @cmdlist); # Splits the string in groups formed by an optional number # followed by the command and adds that to the list. do { $path =~ /(\d*)([[:alpha:]]|\{[^}]+\})/; $num = $1; $cmd = $2; $path = substr($path, $+[0]); $num = 1 if ($num eq ''); $cmd =~ s/\{(.+)\}/$1/; my $i; for ($i = 0; $i < $num; ++$i) { push(@cmdlist, $cmd); } } until ($path eq ''); # Sends the commands $self->sendlines(\@cmdlist); } sub prev { my $self = shift; my $num = $_[0]; if (!defined $num) { $num = 1; } $self->next(-$num); } sub gag { my $self = shift; my $pattern = shift; if (!$pattern) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'gag')); return; } $self->trigger({ pattern => $pattern, gag => 1 }); } sub _listobject { my $self = shift; my ($target, $function, $objnum, $objname, $extrafirstarg) = @_; if (defined($target)) { if ($target =~ /^\d+$/) { if ($extrafirstarg) { eval("\$self->$function(\$extrafirstarg, $target)"); } else { eval("\$self->$function($target)"); } } else { my @found = $self->_getobjectnumber($target, $objnum, 0, $extrafirstarg); if (scalar @found == 0) { $self->echonl(sprintf(_('No such %s'), $objname)); } else { foreach (@found) { if ($extrafirstarg) { eval("\$self->$function(\$extrafirstarg, $_)"); } else { eval("\$self->$function($_)"); } } } } } else { if ($extrafirstarg) { eval("\$self->$function(\$extrafirstarg)"); } else { eval("\$self->$function()"); } } } sub listtrigger { my $self = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listtrigger', 0, _('trigger')); } } else { $self->_listobject(undef, '_listtrigger', 0, _('trigger')); } } sub listalias { my $self = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listalias', 1, _('alias')); } } else { $self->_listobject(undef, '_listalias', 1, _('alias')); } } sub listmacro { my $self = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listmacro', 2, _('macro')); } } else { $self->_listobject(undef, '_listmacro', 2, _('macro')); } } sub listtimer { my $self = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listtimer', 3, _('timer')); } } else { $self->_listobject(undef, '_listtimer', 3, _('timer')); } } sub listhook { my $self = shift; my $event = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listhook', 4, _('hook'), $event); } } else { $self->_listobject(undef, '_listhook', 4, _('hook'), $event); } } sub gettriggernumber { my $self = shift; if (scalar @_ != 1) { $self->echonl(sprintf(_('%s: Wrong number of arguments.'), 'gettriggernumber')); return undef; } my $name = shift; my @found = $self->_getobjectnumber($name, 0, # Trigger 0, # By name undef); return @found; } sub getaliasnumber { my $self = shift; if (scalar @_ != 1) { $self->echonl(sprintf(_('%s: Wrong number of arguments.'), 'getaliasnumber')); return undef; } my $name = shift; my @found = $self->_getobjectnumber($name, 1, # Alias 0, # By name undef); return @found; } sub getmacronumber { my $self = shift; if (scalar @_ != 1) { $self->echonl(sprintf(_('%s: Wrong number of arguments.'), 'getmacronumber')); return undef; } my $name = shift; my @found = $self->_getobjectnumber($name, 2, # Macro 0, # By name undef); return @found; } sub gettimernumber { my $self = shift; if (scalar @_ != 1) { $self->echonl(sprintf(_('%s: Wrong number of arguments.'), 'gettimerrnumber')); return undef; } my $name = shift; my @found = $self->_getobjectnumber($name, 3, # Timer 0, # By name undef); return @found; } sub gethooknumber { my $self = shift; if (scalar @_ != 2) { $self->echonl(sprintf(_('%s: Wrong number of arguments.'), 'gethooknumber')); return undef; } my $event = shift; my $name = shift; my @found = $self->_getobjectnumber($name, 4, # Timer 0, # By name $event); return @found; } sub _delobject { my $self = shift; my ($target, $function, $objnum, $objname, $objnameplural, $extrafirstarg) = @_; my $deleted = 0; if (defined($target)) { if ($target =~ /^\d+$/) { if ($extrafirstarg) { eval("\$deleted += \$self->_$function(\$extrafirstarg, $target)"); } else { eval("\$deleted += \$self->_$function($target)"); } if (!$deleted) { $self->echonl(sprintf(_('No such %s.'), $objname)); } } else { my @found = reverse($self->_getobjectnumber($target, $objnum, 0, $extrafirstarg)); if (scalar @found == 0) { $self->echonl(sprintf(_('No such %s.'), $objname)); } else { foreach (@found) { if ($extrafirstarg) { eval("\$deleted += \$self->_$function(\$extrafirstarg, $_)"); } else { eval("\$deleted += \$self->_$function($_)"); } } } } unless ($self->{SILENT}) { if (!$deleted) { $self->echonl(sprintf(_('No %s deleted.'), $objnameplural)); } elsif ($deleted == 1) { $self->echonl(sprintf(_('One %s deleted.'), $objname)); } else { $self->echonl(sprintf(_('%d %s deleted.'), $deleted, $objnameplural)); } } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), $function)); $deleted = undef; } return $deleted; } sub deltrigger { my $self = shift; return $self->_delobject($_[0], 'deltrigger', 0, _('trigger'), _('triggers')); } sub delalias { my $self = shift; return $self->_delobject($_[0], 'delalias', 1, _('alias'), _('aliases')); } sub delmacro { my $self = shift; return $self->_delobject($_[0], 'delmacro', 2, _('macro'), _('macros')); } sub deltimer { my $self = shift; return $self->_delobject($_[0], 'deltimer', 3, _('timer'), _('timers')); } sub delhook { my $self = shift; return $self->_delobject($_[1], 'delhook', 4, _('hook'), _('hooks'), $_[0]); } sub _moveobject { my $self = shift; my ($old, $new_pos, $function, $objnum, $objname, $extrafirstarg) = @_; my $ok; if (defined($old)) { if ($old =~ /^\d+$/) { if ($extrafirstarg) { eval("\$ok = \$self->_$function(\$extrafirstarg, $old, $new_pos)"); } else { eval("\$ok = \$self->_$function($old, $new_pos)"); } if (!$ok) { $self->echonl(sprintf(_('No such %s.'), $objname)); } } else { my @found = $self->_getobjectnumber($old, $objnum, 0, $extrafirstarg); if (scalar @found == 0) { $self->echonl(sprintf(_('No such %s.'), $objname)); } else { if ($extrafirstarg) { eval("\$ok += \$self->_$function(\$extrafirstarg, $found[0], $new_pos)"); } else { eval("\$ok += \$self->_$function($found[0], $new_pos)"); } unless ($self->{SILENT}) { $self->echonl(sprintf(_('Successfully moved %s.'), $objname)); } } } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), $function)); } } sub movetrigger { my $self = shift; $self->_moveobject($_[0], $_[1], 'movetrigger', 0, _('trigger')); } sub movealias { my $self = shift; $self->_moveobject($_[0], $_[1], 'movealias', 1, _('alias')); } sub movemacro { my $self = shift; $self->_moveobject($_[0], $_[1], 'movemacro', 2, _('macro')); } sub movetimer { my $self = shift; $self->_moveobject($_[0], $_[1], 'movetimer', 3, _('timer')); } sub movehook { my $self = shift; my $event = shift; $self->_moveobject($_[0], $_[1], 'movehook', 4, _('hook'), $event); } sub _enadisobject { my $self = shift; my ($target, $newvalue, $function, $objnumber, $extrafirstarg) = @_; if ($target =~ /^\d+$/) { if ($extrafirstarg) { eval("\$self->$function(\$extrafirstarg, $target, { enabled => $newvalue })"); } else { eval("\$self->$function($target, { enabled => $newvalue })"); } } else { my @found = $self->_getobjectnumber($target, $objnumber, 0, $extrafirstarg); if (scalar @found == 0) { $self->echonl(sprintf(_('No such %s'), _($function))); } else { foreach (@found) { if ($extrafirstarg) { eval("\$self->$function(\$extrafirstarg, $_, { enabled => $newvalue })"); } else { eval("\$self->$function($_, { enabled => $newvalue })"); } } } } } sub enatrigger { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 1, 'trigger', 0); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'enatrigger')); } } sub distrigger { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 0, 'trigger', 0); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'distrigger')); } } sub enaalias { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 1, 'alias', 1); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'enaalias')); } } sub disalias { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 0, 'alias', 1); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'disalias')); } } sub enamacro { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 1, 'macro', 2); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'enamacro')); } } sub dismacro { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 0, 'macro', 2); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'dismacro')); } } sub enatimer { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 1, 'timer', 3); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'enatimer')); } } sub distimer { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 0, 'timer', 3); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'distimer')); } } sub enahook { my $self = shift; my $event = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 1, 'hook', 4, $event); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'enahook')); } } sub dishook { my $self = shift; my $event = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 0, 'hook', 4, $event); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'dishook')); } } sub silentenatrigger { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->enatrigger(@_); $self->{SILENT} = $silent; } sub silentdistrigger { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->distrigger(@_); $self->{SILENT} = $silent; } sub silentenaalias { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->enaalias(@_); $self->{SILENT} = $silent; } sub silentdisalias { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->disalias(@_); $self->{SILENT} = $silent; } sub silentenamacro { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->enamacro(@_); $self->{SILENT} = $silent; } sub silentdismacro { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->dismacro(@_); $self->{SILENT} = $silent; } sub silentenatimer { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->enatimer(@_); $self->{SILENT} = $silent; } sub silentdistimer { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->distimer(@_); $self->{SILENT} = $silent; } sub silentenahook { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->enahook(@_); $self->{SILENT} = $silent; } sub silentdishook { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->dishook(@_); $self->{SILENT} = $silent; } sub triggerenabled { my $self = shift; my $trigger = shift; if (!defined($trigger)) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'triggerenabled')); return undef; } return $self->_objectenabled($trigger, 0, _('trigger')); } sub aliasenabled { my $self = shift; my $alias = shift; if (!defined($alias)) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'aliasenabled')); return undef; } return $self->_objectenabled($alias, 1, _('alias')); } sub macroenabled { my $self = shift; my $macro = shift; if (!defined($macro)) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'macroenabled')); return undef; } return $self->_objectenabled($macro, 2, _('macro')); } sub timerenabled { my $self = shift; my $timer = shift; if (!defined($timer)) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'timerenabled')); return undef; } return $self->_objectenabled($timer, 3, _('timer')); } sub hookenabled { my $self = shift; my $event = shift; my $hook = shift; if (!$event || !defined($hook)) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'hookenabled')); return undef; } return $self->_objectenabled($hook, 4, _('hook'), $event); } sub writetolog { my $self = shift; foreach my $line (@_) { $self->_writetolog(::stripansi(::stripcolorize($line))); } } sub echonlandlog { my $self = shift; foreach my $line (@_) { $self->echonl($line); $self->writetolog($line); } } sub _getplugininfo { my $self = shift; my $file = shift; unless (open(PLUGIN, "<$file")) { return _('Could not open file.'); } my $nameline = ; my $versline = ; my $descline = ; my $authorline = ; chomp($nameline); chomp($versline); chomp($descline); chomp($authorline); my ($name, $vers, $desc, $author); my $fail = 0; if ($nameline !~ /^package ([a-zA-Z_][a-zA-Z_0-9]*);/) { $fail = 1; } else { $name = $1; } if ($versline !~ /^#: Version: (.*)$/) { $fail = 1; } else { $vers = $1; } if ($descline !~ /^#: Description: (.*)$/) { $fail = 1; } else { $desc = $1; } if ($authorline !~ /^#: Author: (.*)$/) { $author = _('Unknown'); } else { $author = $1; } CORE::close(PLUGIN); if ($fail) { return _('Invalid plugin file.'); } else { return (undef, $name, $vers, $desc, $author); } } sub _loadplugin { my $self = shift; my $file = shift; unless(-r $file) { foreach (@::PLUGINDIRS) { if (-r $_ . "/$file") { $file = $_ . "/$file"; last; } elsif (-r $_ . "/$file.pl") { $file = $_ . "/$file.pl"; last; } } } my ($error, $name, $vers, $desc, $author) = $self->_getplugininfo($file); if ($error) { return $error; } my $prevversion = $self->getpluginversion($name); if ($prevversion) { if ($prevversion eq $vers) { return _('Plugin already loaded. Try enabling it.'); } else { return sprintf(_('Version %s of this plugin is already loaded.'), $prevversion); } } $self->_startplugin($name, $vers, $desc, $author); do $file; if ($@) { $self->_stopplugin(0); return sprintf(_('Error in plugin file: %s'), $@); } else { $self->_stopplugin(1); return (undef, $name); } } sub loadplugin { my $self = shift; if ($self->{WORLDPTR} != $::world->{WORLDPTR}) { $::world->echonl(_('Cannot load a plugin in another world.')); return 0; } unless (defined($_[0])) { $self->echonl(_('Plugin not specified')); return 0; } my ($error, $name) = $self->_loadplugin($_[0]); if ($error) { $self->echonl($error); $self->echonl(_('Plugin not loaded.')); return 0; } else { $self->echonl(sprintf(_("Plugin '%s' loaded."), $name)); return 1; } } sub requireplugin { my $self = shift; my $plugin = $_[0]; die _('Plugin not specified') unless defined($plugin); my $prevversion = $self->getpluginversion($plugin); return 1 if ($prevversion); # This plugin is already loaded my ($error, $dummy) = $self->_loadplugin($plugin); die sprintf(_('Could not load plugin %s'), $plugin) if ($error); return 1; } sub _enadisplugin { my $self = shift; my ($pluginname, $newval) = @_; my $pluginver = $self->getpluginversion($pluginname); unless ($pluginver) { $self->echonl(_('Plugin not loaded.')); return 0; } # Triggers my @found = $self->_getobjectnumber($pluginname, 0, 1); foreach (@found) { $self->trigger($_, { enabled => $newval }); } # Aliases @found = $self->_getobjectnumber($pluginname, 1, 1); foreach (@found) { $self->alias($_, { enabled => $newval }); } # Macros @found = $self->_getobjectnumber($pluginname, 2, 1); foreach (@found) { $self->macro($_, { enabled => $newval }); } # Timers @found = $self->_getobjectnumber($pluginname, 3, 1); foreach (@found) { $self->timer($_, { enabled => $newval }); } # Hooks foreach my $hookname (qw/OnConnect OnReceivedText OnSentCommand OnGetFocus OnLoseFocus/) { @found = $self->_getobjectnumber($pluginname, 4, 1, $hookname); foreach (@found) { $self->hook($hookname, $_, { enabled => $newval }); } } return 1; } sub enaplugin { my $self = shift; my $pluginname = shift; my $prevstate; $prevstate = $self->{SILENT}; $self->{SILENT} = 1; if (!$pluginname) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'enaplugin')); return; } # See if there is a custom enabler eval { if ($pluginname->ENABLE()) { $self->_markpluginenadis($pluginname, 1); } }; # But if not, use the standard one, which enables all items if ($@) { if ($self->_enadisplugin($pluginname, 1)) { unless ($prevstate) { $self->echonl(_('Plugin enabled.')); } $self->_markpluginenadis($pluginname, 1); } } $self->{SILENT} = $prevstate; } sub displugin { my $self = shift; my $pluginname = shift; my $prevstate; $prevstate = $self->{SILENT}; $self->{SILENT} = 1; if (!$pluginname) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'displugin')); return; } # See if there is a custom disaabler eval { if ($pluginname->DISABLE()) { $self->_markpluginenadis($pluginname, 0); } }; # But if not, use the standard one, which disables all items if ($@) { if ($self->_enadisplugin($pluginname, 0)) { unless ($prevstate) { $self->echonl(_('Plugin disabled.')); } $self->_markpluginenadis($pluginname, 0); } } $self->{SILENT} = $prevstate; } sub sendserverdata { my $self = shift; my ($data) = @_; my $protocol = $data->{'protocol'}; my $converted; if ($protocol eq "GMCP") { $converted = ::_preparegmcpdata($data); } elsif ($protocol eq "MSDP") { $converted = ::_preparemsdpdata($data); } else { $self->echonl(_('Unknown protocol')); return; } $self->_sendserverdata($protocol, $converted); } sub sendmsdpcommand { my $self = shift; my $msdp = MSDP->new(); my $converted = $msdp->encode_command(@_); $self->_sendserverdata('MSDP', $converted); } } sub colorize { my %colorsubst = ( "&0", "\e[0m", # Reset everything "&x", "\e[0;30m", # Set foreground colors "&r", "\e[0;31m", "&g", "\e[0;32m", "&O", "\e[0;33m", "&b", "\e[0;34m", "&p", "\e[0;35m", "&c", "\e[0;36m", "&w", "\e[0;37m", "&z", "\e[1;30m", "&d", "\e[39m", # Set default foreground color "&R", "\e[1;31m", # Set bold foreground color "&G", "\e[1;32m", "&Y", "\e[1;33m", "&B", "\e[1;34m", "&P", "\e[1;35m", "&C", "\e[1;36m", "&W", "\e[1;37m", "&D", "\e[1;39m", # Set bold default fore color "\\^x", "\e[40m", # Set background colors "\\^r", "\e[41m", "\\^g", "\e[42m", "\\^O", "\e[43m", "\\^b", "\e[44m", "\\^p", "\e[45m", "\\^c", "\e[46m", "\\^w", "\e[47m", "\\^d", "\e[49m", # Set default background color "\\^z", "\e[5;40m", # Set light background colors "\\^R", "\e[5;41m", "\\^G", "\e[5;42m", "\\^Y", "\e[5;43m", "\\^B", "\e[5;44m", "\\^P", "\e[5;45m", "\\^C", "\e[5;46m", "\\^W", "\e[5;47m", "\\^D", "\e[5;49m", # Set light default back color "&_", "\e[4m", # Underline on "&=", "\e[21m", # Double underline on "\\^_", "\e[24m", # All underline off "&\\|", "\e[9m", # Strikethrough on "\\^\\|", "\e[29m", # Strikethrough off "&/", "\e[3m", # Italics on "\\^/", "\e[23m", # Italics off "&i", "\e[7m", # Reverse video on "\\^i", "\e[27m", # Inverse video off "&h", "\e[8m", # Hidden mode on "\\^h", "\e[28m", # Hidden mode off ); my $str = $_[0]; if (!$str) { return ""; } # Escape $str =~ s#&&#\x{99}\x{100}\x{101}\x{102}\x{105}\x{106}#g; $str =~ s#\^\^#\x{106}\x{105}\x{102}\x{101}\x{100}\x{99}#g; $str =~ s{(&|\^)([0-5])([0-5])([0-5])X} {"\e[" . ($1 eq '&' ? '38' : '48') . ";5;" . (($2*36 + $3*6 + $4) + 16) . "m"}eg; $str =~ s{(&|\^)([0-9]|[01][0-9]|2[0-3])G} {"\e[" . ($1 eq '&' ? '38' : '48') . ';5;' . ($2 + 232) . 'm'}eg; foreach my $i (keys %colorsubst) { $str =~ s/$i/$colorsubst{$i}/g; } # Unescape $str =~ s#\x{99}\x{100}\x{101}\x{102}\x{105}\x{106}#&#g; $str =~ s#\x{106}\x{105}\x{102}\x{101}\x{100}\x{99}#\^#g; return $str; } sub stripcolorize { my $string = shift; if (!$string) { return ''; } $string =~ s/(&|^)[dxrgObpcwzRGYBPCW]//g; return $string; } sub __sethelpfile { $__helpfile = $_[0]; } sub help { if (!defined($_[0])) { $_[0] = 'index'; } open(HFILE, "<$__helpfile") or die(_('Cannot open help file.')); my $outputting = 0; while () { chomp; if (!$outputting) { next if ($_ ne "[$_[0]]"); $outputting = 1; } else { if ($_ =~ /^\[/) { close(HFILE); return; } $::world->echonl($_); } } $::world->echonl(_('Help topic not found.')); } sub _parseserverdata { if (scalar @_ < 1) { $::world->echonl(sprintf(_('%s: This is an internal function, do not call directly.'), '_parseserverdata')); return; } # Clear previous data %::server_data = (); $::server_data{'protocol'} = $_[0]; if ($::server_data{'protocol'} eq "GMCP") { _parsegmcpserverdata(); } elsif ($::server_data{'protocol'} eq "MSDP") { _parsemsdpserverdata(); } else { $::server_data{'error'} = "Unknown protocol"; $::server_data{'data'} = $::_serverdata; } } sub _parsegmcpserverdata { my ($namespace, $data) = split(/\s+/, $::_serverdata, 2); my ($p1, $p2, $p3) = split(/\./, $namespace, 3); if (defined $p3) { $::server_data{'package'} = $p1; $::server_data{'subpackage'} = $p2; $::server_data{'message'} = $p3; } else { $::server_data{'package'} = $p1; $::server_data{'message'} = $p2; } if (defined $data) { eval { my $json = JSON->new->allow_nonref; $::server_data{'data'} = $json->decode($data); 1; } or do { $::server_data{'error'} = $@; $::server_data{'data'} = $::_serverdata; } } } sub _parsemsdpserverdata { eval { my $msdp = MSDP->new(); $::server_data{'data'} = $msdp->decode($::_serverdata); 1; } or do { $::server_data{'error'} = $@; $::server_data{'data'} = $::_serverdata; } } sub _preparegmcpdata { my ($data) = @_; my $converted = $data->{'package'}; if (defined $data->{'subpackage'}) { $converted .= "."; $converted .= $data->{'subpackage'}; } if (defined $data->{'message'}) { $converted .= "."; $converted .= $data->{'message'}; } if (exists $data->{'data'}) { my $json = JSON->new->allow_nonref; $converted .= " "; $converted .= $json->encode($data->{'data'}); } return $converted; } sub _preparemsdpdata { my ($data) = @_; my $msdp = MSDP->new(); return $msdp->encode($data->{'data'}); } ### Deprecated functions sub getwindowsize { $::world->echonl(_('Warning: the getwindowsize() function is deprecated and will be removed.')); $::world->echonl(_('Use $window->getsize() instead.')); $::window->getsize(); } sub minimize { $::world->echonl(_('Warning: the minimize() function is deprecated and will be removed.')); $::world->echonl(_('Use $window->minimize() instead.')); $::window->minimize(); } sub path { $::world->echonl(_('Warning: the path() function is deprecated and will be removed.')); $::world->echonl(_('Use $world->path() instead.')); $::world->path($_[0]); } kildclient-3.0.0/share/kildclient.ico0000744000175000017500000000427611715730227014514 00000000000000 ( @    %'-003BG$CG$U[.dk6el6fm7      ?`?@p<??????????kildclient-3.0.0/share/MSDP.pm0000644000175000017500000001457611715730227013002 00000000000000package MSDP; use strict; use warnings; use Carp; use constant { MSDP_VAR => chr(1), MSDP_VAL => chr(2), MSDP_TABLE_OPEN => chr(3), MSDP_TABLE_CLOSE => chr(4), MSDP_ARRAY_OPEN => chr(5), MSDP_ARRAY_CLOSE => chr(6), EOF => chr(0), }; ####################################################################### # Public functions # ####################################################################### sub new { my $self = shift; my $class = ref($self) || $self; my $data = shift; return bless { }, $class; } sub decode { my $self = shift; my ($data) = (@_); $self->{'data'} = $data; $self->{'current_pos'} = 0; my %variables; my $next_tok = $self->_get_next_token_or_eof(); while ($next_tok ne EOF) { $self->_put_back($next_tok); my ($name, $value) = $self->_get_var(); $variables{$name} = $value; $next_tok = $self->_get_next_token_or_eof(); } return \%variables; } sub encode { my $self = shift; my ($data) = (@_); if (ref($data) ne 'HASH') { Carp::croak("Invalid data type, expecting hash reference"); } my $encoded = ""; while (my ($key, $value) = each(%$data)) { $encoded .= _encode_var($key, $value); } return $encoded; } sub encode_command { my $self = shift; if (scalar @_ < 1) { Carp::croak("Command not specified"); } my $command = shift; my $encoded = MSDP_VAR . $command; foreach my $arg (@_) { $encoded .= MSDP_VAL . _encode_value($arg); } return $encoded; } ####################################################################### # Private functions # ####################################################################### ####################################################################### # Decoding # ####################################################################### sub _get_var { my $self = shift; $self->_expect(MSDP_VAR); my $name = $self->_get_textual_token(); $self->_expect(MSDP_VAL); my $value = $self->_get_value(); # Handle the case of a multi-valued variable (which becomes an array) # eg: MSDP_VAR variable MSDP_VAL value1 MSDP_VAL value2 my $token = $self->_get_next_token_or_eof(); while ($token eq MSDP_VAL) { unless (ref($value)) { $value = [ $value ]; } my $next_value = $self->_get_value(); push(@$value, $next_value); $token = $self->_get_next_token_or_eof(); } $self->_put_back($token); return ($name, $value); } sub _get_value { my $self = shift; my $token = $self->_get_next_token(); if ($token eq MSDP_ARRAY_OPEN) { return $self->_get_array() } elsif ($token eq MSDP_TABLE_OPEN) { return $self->_get_table(); } return $token; } sub _get_array { my $self = shift; my @values; while (1) { my $token = $self->_get_next_token(); if ($token eq MSDP_ARRAY_CLOSE) { return \@values; } elsif ($token eq MSDP_VAL) { push (@values, $self->_get_value()); } else { # FIXME: Better reporting Carp::croak("Got unexpected token, expecting MSDP_VAL or MSDP_ARRAY_CLOSE"); } } } sub _get_table { my $self = shift; my %values; while (1) { my $token = $self->_get_next_token(); if ($token eq MSDP_TABLE_CLOSE) { return \%values; } elsif ($token eq MSDP_VAR) { $self->_put_back($token); my ($name, $value) = $self->_get_var(); $values{$name} = $value; } else { # FIXME: Better reporting Carp::croak("Got unexpected token, expecting MSDP_VAR or MSDP_TABLE_CLOSE"); } } } sub _expect { my $self = shift; my ($expected_token) = @_; if ($self->_get_next_token_or_eof() ne $expected_token) { # FIXME: Describe better the problem: what we got, and what should # have been found Carp::croak("Got unexpected token"); } } sub _get_textual_token { my $self = shift; my $token = $self->_get_next_token(); if (_is_special_char($token)) { # FIXME: Better reporting Carp::croak("Expecting a string, got a control token"); } return $token; } sub _get_next_token { my $self = shift; my $token = $self->_get_next_token_or_eof(); if ($token eq EOF) { Carp::croak("Unexpected end of string"); } return $token; } sub _put_back { my $self = shift; my ($token) = @_; $self->{'next_token'} = $token; } sub _get_next_token_or_eof { my $self = shift; if (defined $self->{'next_token'}) { my $token = $self->{'next_token'}; $self->{'next_token'} = undef; return $token; } my $char = $self->_get_next_char(); if ($char eq EOF) { return EOF; } if (_is_special_char($char)) { return $char; } my $name = $char; while (1) { $char = $self->_get_next_char(); if ($char eq EOF) { return $name; } if (_is_special_char($char)) { --$self->{'current_pos'}; return $name; } $name .= $char; } } sub _get_next_char { my $self = shift; if ($self->{'current_pos'} == length($self->{'data'})) { return EOF; } my $char = substr($self->{'data'}, $self->{'current_pos'}++, 1); return $char; } sub _is_special_char { my ($char) = @_; return (($char ge MSDP_VAR && $char le MSDP_ARRAY_CLOSE) || $char eq EOF); } ####################################################################### # Encoding # ####################################################################### sub _encode_var { my ($key, $value) = @_; return MSDP_VAR . $key . MSDP_VAL . _encode_value($value); } sub _encode_value { my ($value) = @_; my $type = ref($value); if ($type eq '') { return $value; } elsif ($type eq 'SCALAR') { return $$value; } elsif ($type eq 'ARRAY') { return _encode_array($value); } elsif ($type eq 'HASH') { return _encode_table($value); } else { Carp::croak("Unsupported type $type"); } } sub _encode_array { my ($array) = @_; my $encoded = MSDP_ARRAY_OPEN; foreach my $element (@$array) { $encoded .= MSDP_VAL . _encode_value($element); } $encoded .= MSDP_ARRAY_CLOSE; return $encoded; } sub _encode_table { my ($hash) = @_; my $encoded = MSDP_TABLE_OPEN; while (my ($key, $value) = each(%$hash)) { $encoded .= MSDP_VAR . $key . MSDP_VAL . _encode_value($value); } $encoded .= MSDP_TABLE_CLOSE; return $encoded; } 1; kildclient-3.0.0/share/kildclient.xpm0000644000175000017500000000311611715730227014535 00000000000000/* XPM */ static char * kildclient_xpm[] = { "32 32 27 1", " c None", ". c #000000", "+ c #376D66", "@ c #2C5852", "# c #10201E", "$ c #366B64", "% c #030605", "& c #30605A", "* c #1D3935", "= c #356A64", "- c #18312E", "; c #356A63", "> c #33655F", ", c #040908", "' c #32635C", ") c #010202", "! c #31625B", "~ c #346861", "{ c #000101", "] c #050A09", "^ c #091312", "/ c #2D5A54", "( c #142825", "_ c #203F3B", ": c #132623", "< c #274E49", "[ c #08100F", " ", " ", " ... .. ", " .... .... ", " .... ..... ", " .... ...... ", " .... ...... ", " .... ....... ", " .... ....... ", " ... ....... ", " ... ........ ", " ........... ", " ......... ", " .......... ", " .......... +++ ", " .... .... ++++++++++ ", " ... ....@+++ +++ ", " ... ..#$++ ++ ", " .... .%&+++ ++ ", " .... *++=- + ", " ... ;++>, ", " ... +++'). ", " ... +++!... ", " .... +++~{... ", " .... ++++].... ", " ... ++++ ..... ", " ... ++++ ..... ", " .... ++++ ..... + ", " ... ++++ ...^/+ ", " ... ++++ (_/: ", " . +++++<[ ", " "}; kildclient-3.0.0/install-sh0000755000175000017500000003325512302342414012564 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: kildclient-3.0.0/config.guess0000755000175000017500000012355012333512665013111 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-03-23' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: kildclient-3.0.0/Makefile.in0000644000175000017500000007041112376345636012644 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in mkinstalldirs AUTHORS COPYING NEWS \ README compile config.guess config.sub depcomp install-sh \ missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(appsdir)" "$(DESTDIR)$(pkgdocdir)" DATA = $(apps_DATA) $(pkgdoc_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = po src share doc DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @BUILD_DOCS_FALSE@SUBDIRS = po \ @BUILD_DOCS_FALSE@ src \ @BUILD_DOCS_FALSE@ share @BUILD_DOCS_TRUE@SUBDIRS = po \ @BUILD_DOCS_TRUE@ src \ @BUILD_DOCS_TRUE@ share \ @BUILD_DOCS_TRUE@ doc pkgdocdir = $(datadir)/doc/kildclient pkgdoc_DATA = README AUTHORS NEWS COPYING appsdir = $(datadir)/applications apps_DATA = kildclient.desktop EXTRA_DIST = kildclient.spec \ kildclient.desktop \ win32/kildclient.iss win32/gettext.pm win32/README.windows win32/README.old all: kcconfig.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): kcconfig.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status kcconfig.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f kcconfig.h stamp-h1 install-appsDATA: $(apps_DATA) @$(NORMAL_INSTALL) @list='$(apps_DATA)'; test -n "$(appsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(appsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(appsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(appsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(appsdir)" || exit $$?; \ done uninstall-appsDATA: @$(NORMAL_UNINSTALL) @list='$(apps_DATA)'; test -n "$(appsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(appsdir)'; $(am__uninstall_files_from_dir) install-pkgdocDATA: $(pkgdoc_DATA) @$(NORMAL_INSTALL) @list='$(pkgdoc_DATA)'; test -n "$(pkgdocdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdocdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdocdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdocdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdocdir)" || exit $$?; \ done uninstall-pkgdocDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdoc_DATA)'; test -n "$(pkgdocdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdocdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) kcconfig.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(appsdir)" "$(DESTDIR)$(pkgdocdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-appsDATA install-pkgdocDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-appsDATA uninstall-pkgdocDATA .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-appsDATA install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgdocDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-appsDATA uninstall-pkgdocDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: kildclient-3.0.0/src/0000755000175000017500000000000012376346020011427 500000000000000kildclient-3.0.0/src/ansitextview.c0000644000175000017500000005366512374460043014264 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "libintl-wrapper.h" #include #include #include "kcircularqueue.h" #include "ansi.h" #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static void ansitextview_append_string_internal(WorldGUI *gui, const gchar *str, gboolean add_nl); static void ansitextview_append_formatted(WorldGUI *gui, GtkTextIter *iter, const gchar *text, TAState *ta_state, GtkTextTag *extra_tag); void queue_ansiparse_operation(World *world, AnsiParseOperation *operation) { g_async_queue_push(world->ansiparse_operations, operation); } void ansitextview_append_string(WorldGUI *gui, const gchar *str) { /* * Append str (a null-terminated string) to the Buffer, in the default * color. */ ansitextview_append_string_internal(gui, str, FALSE); } void ansitextview_append_string_nl(WorldGUI *gui, const gchar *str) { /* * Append str (a null-terminated string) to the Buffer, in the default * color, and a newline. */ ansitextview_append_string_internal(gui, str, TRUE); } void ansitextview_append_stringf(WorldGUI *gui, const gchar *format, ...) { /* * Formats a string using printf syntax and outputs it. */ va_list ap; gchar *str; va_start(ap, format); str = g_strdup_vprintf(format, ap); ansitextview_append_string_internal(gui, str, FALSE); g_free(str); } void ansitextview_append_string_with_fgcolor(WorldGUI *gui, const gchar *str, gint fg_color) { /* * Append str (a null-terminated string) to the Buffer, using the * specified foreground color. */ MainThreadOperation *operation; operation = g_new(MainThreadOperation, 1); operation->action = INSERT_AT_END; operation->text_insert.use_ta = FALSE; operation->text_insert.extra_tag = gui->ta.ansi_fore_tags[fg_color]; operation->text_insert.text = g_strdup(str); queue_mainthread_operation(gui->world, operation); operation = g_new(MainThreadOperation, 1); operation->action = MOVE_LINESTART_MARK; queue_mainthread_operation(gui->world, operation); operation = g_new(MainThreadOperation, 1); operation->action = TEXT_ADDED; queue_mainthread_operation(gui->world, operation); } void ansitextview_append_ansi_string_immediately(WorldGUI *gui, gchar *str, gsize len) { /* For KCWin: Appends the string without queueing the operations, * but rather executing them immediately. */ insert_ansi_string(gui, str, len, INSERT_AT_END, process_mainthread_operation); } void ansitextview_get_char_size(WorldGUI *gui, gint *char_height, gint *char_width) { PangoLayout *layout; PangoRectangle logical_rect; layout = gtk_widget_create_pango_layout(GTK_WIDGET(gui->txtView), "W"); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); *char_height = logical_rect.height; *char_width = logical_rect.width; g_object_unref(layout); } void ansitextview_get_size(WorldGUI *gui, guint *lines, guint *cols) { GdkRectangle rect; gint char_height; gint char_width; /* Get the size of the text view */ gtk_text_view_get_visible_rect(gui->txtView, &rect); ansitextview_get_char_size(gui, &char_height, &char_width); *lines = rect.height / char_height; *cols = rect.width / char_width; } void ansitextview_update_color_tags(WorldGUI *gui, World *world) { int i; if (!world) { fprintf(stderr, "BUG: update_color_tag without world.\n"); return; } /* First time called, the tags have not been created yet. */ if (!gui->ta.ansi_fore_tags) { /* Allocate space for colors */ gui->ta.ansi_fore_tags = g_new0(GtkTextTag *, ANSI_TABLE_SIZE); gui->ta.ansi_back_tags = g_new0(GtkTextTag *, ANSI_TABLE_SIZE); for (i = 0; i < ANSI_TABLE_SIZE; ++i) { gui->ta.ansi_fore_tags[i] = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, NULL); gui->ta.ansi_back_tags[i] = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, NULL); } } /* Update normal foreground/background colors */ for (i = 0; i < ANSI_N_COLORS; ++i) { g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[i]), "foreground-rgba", &world->ansicolors[i], NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[i]), "background-rgba", &world->ansicolors[i], NULL); } for (i = ANSI_BOLD_BASE_IDX; i < (ANSI_BOLD_BASE_IDX + ANSI_N_COLORS); ++i) { g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[i]), "foreground-rgba", &world->ansicolors[i - ANSI_TABLE_OFFSET], NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[i]), "background-rgba", &world->ansicolors[i - ANSI_TABLE_OFFSET], NULL); } /* Update default colors */ g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[ANSI_DEFAULT_COLOR_IDX]), "foreground-rgba", world->deffore, NULL); g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[ANSI_BOLD_BASE_IDX + ANSI_DEFAULT_COLOR_IDX]), "foreground-rgba", world->defbold, NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[ANSI_DEFAULT_COLOR_IDX]), "background-rgba", world->defback, NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[ANSI_BOLD_BASE_IDX + ANSI_DEFAULT_COLOR_IDX]), "background-rgba", world->defboldback, NULL); /* Update default colors for reverse video */ g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[ANSI_REVERSE_DEFAULT_IDX]), "foreground-rgba", world->defback, NULL); g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[ANSI_REVERSE_BOLD_DEFAULT_IDX]), "foreground-rgba", world->defboldback, NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[ANSI_REVERSE_DEFAULT_IDX]), "background-rgba", world->deffore, NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[ANSI_REVERSE_BOLD_DEFAULT_IDX]), "background-rgba", world->defbold, NULL); /* Update use bold state */ for (i = ANSI_BOLD_BASE_IDX; i < (ANSI_BOLD_BASE_IDX + ANSI_N_COLORS + 1); ++i) { g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[i]), "weight", (world->usebold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL), NULL); } g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[ANSI_REVERSE_BOLD_DEFAULT_IDX]), "weight", (world->usebold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL), NULL); /* Update default colors in the TextView */ gtk_widget_override_background_color(GTK_WIDGET(gui->txtView), GTK_STATE_FLAG_NORMAL, world->defback); gtk_widget_override_background_color(GTK_WIDGET(gui->txtViewScroll), GTK_STATE_FLAG_NORMAL, world->defback); gtk_widget_override_color(GTK_WIDGET(gui->txtViewScroll), GTK_STATE_FLAG_NORMAL, world->deffore); gtk_widget_override_color(GTK_WIDGET(gui->txtView), GTK_STATE_FLAG_NORMAL, world->deffore); } gboolean ansitextview_prune_extra_lines(gpointer data) { WorldGUI *gui = (WorldGUI *) data; gint lines; if (!gui->world) { return TRUE; } lines = gtk_text_buffer_get_line_count(gui->txtBuffer); if (lines > gui->world->buffer_lines) { GtkTextIter start; GtkTextIter end; int to_del; to_del = lines - gui->world->buffer_lines; gtk_text_buffer_get_start_iter(gui->txtBuffer, &start); gtk_text_buffer_get_iter_at_line(gui->txtBuffer, &end, to_del); gtk_text_buffer_delete(gui->txtBuffer, &start, &end); /* Remove times of the deleted lines */ if (gui->line_times) { k_circular_queue_pop(gui->line_times, to_del); gui->world->deleted_lines += to_del; } } return TRUE; } gchar * strip_ansi(const gchar *original, gsize len) { /* This is to be called on complete strings, so parsing always starts in DATA mode */ ANSIFSMState state = ANSIFSM_DATA; gchar *stripped; int original_pos; int stripped_pos; /* In the worst case, the result after processing will have the same size + a null string terminator. */ stripped = g_malloc(len + 1); original_pos = 0; stripped_pos = 0; while (original_pos < len) { switch (state) { case ANSIFSM_DATA: if (original[original_pos] == ANSI_ESC) { state = ANSIFSM_ESC; } else { stripped[stripped_pos++] = original[original_pos]; } break; case ANSIFSM_ESC: if (original[original_pos] == '[') { state = ANSIFSM_ANSISEQ; } else { stripped[stripped_pos++] = ANSI_ESC; /* Add ESC again */ stripped[stripped_pos++] = original[original_pos]; state = ANSIFSM_DATA; } break; case ANSIFSM_ANSISEQ: if (isalpha(original[original_pos])) { state = ANSIFSM_DATA; } break; default: break; } ++original_pos; } stripped[stripped_pos] = '\0'; return stripped; } void ansitextview_op_insert_at_end(WorldGUI *gui, MainThreadOperation *operation) { GtkTextIter end_iter; TAState *ta = NULL; if (operation->text_insert.use_ta) { ta = &operation->text_insert.ta_state; } gtk_text_buffer_get_iter_at_offset(gui->txtBuffer, &end_iter, -1); ansitextview_append_formatted(gui, &end_iter, operation->text_insert.text, ta, operation->text_insert.extra_tag); } void ansitextview_op_insert_at_mark(WorldGUI *gui, MainThreadOperation *operation) { GtkTextIter iter; TAState *ta = NULL; if (operation->text_insert.use_ta) { ta = &operation->text_insert.ta_state; } gtk_text_buffer_get_iter_at_mark(gui->txtBuffer, &iter, gui->txtmark_linestart); ansitextview_append_formatted(gui, &iter, operation->text_insert.text, ta, operation->text_insert.extra_tag); gtk_text_buffer_move_mark(gui->txtBuffer, gui->txtmark_linestart, &iter); } void ansitextview_op_text_added(WorldGUI *gui, MainThreadOperation *operation) { GtkAdjustment *adjustment; gint lines; static gchar msg[MAX_BUFFER]; int n; /* Update count of lines */ lines = gtk_text_buffer_get_line_count(gui->txtBuffer); if (gui->lblLines) { gint totallines = gui->world->deleted_lines + lines; if (totallines == 1) { gtk_label_set_text(gui->lblLines, _("1 line")); } else { sprintf(msg, _("%d lines"), totallines); gtk_label_set_text(gui->lblLines, msg); } } /* Add time that these lines were processed */ if (gui->line_times) { int existing; time_t now; existing = k_circular_queue_size(gui->line_times); now = time(NULL); if (existing) { /* This last line that existed probably had something added. Update its time, unless this is the first line ever. */ k_circular_queue_nth(gui->line_times, time_t, existing - 1) = now; } /* Add new times */ n = lines - existing; if (n > 0) { k_circular_queue_push_copies(gui->line_times, &now, n); } } /* Adjust unread markers */ if (!gui->world->has_focus && !gui->world->has_unread_text) { gui->world->has_unread_text = TRUE; gtk_label_set_markup(gui->lblNotebook, gui->world->new_text_name); if (worlds_with_new_text != -1) { ++worlds_with_new_text; if (!window_has_focus) { adjust_window_title(); } } } /* Scroll to end if option is marked or we are at the bottom */ adjustment = gtk_scrolled_window_get_vadjustment(gui->scrolled_win); if ((gui->world && gui->world->scrollOutput) || gtk_adjustment_get_value(adjustment) == gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment)) { gtk_text_view_scroll_to_mark(gui->txtView, gui->txtmark_end, 0, TRUE, 0.5, 1); } } void ansitextview_op_clear_pending_line(WorldGUI *gui, MainThreadOperation *operation) { GtkTextIter line_start; GtkTextIter line_end; gtk_text_buffer_get_iter_at_mark(gui->txtBuffer, &line_start, gui->txtmark_linestart); gtk_text_buffer_get_iter_at_mark(gui->txtBuffer, &line_end, gui->txtmark_end); gtk_text_buffer_delete(gui->txtBuffer, &line_start, &line_end); } void ansitextview_op_move_linestart_mark(WorldGUI *gui, MainThreadOperation *operation) { GtkTextIter end; gtk_text_buffer_get_iter_at_offset(gui->txtBuffer, &end, -1); gtk_text_buffer_move_mark(gui->txtBuffer, gui->txtmark_linestart, &end); } void ansitextview_op_apply_highlight(WorldGUI *gui, MainThreadOperation *operation) { Trigger *trigger; GtkTextIter start; GtkTextIter end; int i; trigger = operation->highlight->trigger; gtk_text_buffer_get_iter_at_offset(gui->txtBuffer, &end, -1); gtk_text_iter_backward_line(&end); start = end; if (trigger->high_target != -1) { gtk_text_iter_set_line_offset(&start, operation->highlight->match_start); gtk_text_iter_set_line_offset(&end, operation->highlight->match_end); } else { /* The whole line */ gtk_text_iter_forward_to_line_end(&end); } if (trigger->high_fg_color != -1) { /* Remove previous tags */ for (i = 0; i < ANSI_TABLE_SIZE; ++i) { gtk_text_buffer_remove_tag(gui->txtBuffer, gui->ta.ansi_fore_tags[i], &start, &end); } gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.ansi_fore_tags[trigger->high_fg_color], &start, &end); } if (trigger->high_bg_color != -1) { /* Remove previous tags */ for (i = 0; i < ANSI_TABLE_SIZE; ++i) { gtk_text_buffer_remove_tag(gui->txtBuffer, gui->ta.ansi_back_tags[i], &start, &end); } gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.ansi_back_tags[trigger->high_bg_color], &start, &end); } if (trigger->high_italic != -1) { gtk_text_buffer_remove_tag(gui->txtBuffer, gui->ta.italics_tag, &start, &end); if (trigger->high_italic) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.italics_tag, &start, &end); } } if (trigger->high_strike != -1) { gtk_text_buffer_remove_tag(gui->txtBuffer, gui->ta.strike_tag, &start, &end); if (trigger->high_strike) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.strike_tag, &start, &end); } } if (trigger->high_underline != -1) { gtk_text_buffer_remove_tag(gui->txtBuffer, gui->ta.underline_tag, &start, &end); gtk_text_buffer_remove_tag(gui->txtBuffer, gui->ta.dblunderline_tag, &start, &end); if (trigger->high_underline == 1) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.underline_tag, &start, &end); } if (trigger->high_underline == 2) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.dblunderline_tag, &start, &end); } } } static void ansitextview_append_string_internal(WorldGUI *gui, const gchar *str, gboolean add_nl) { /* * Does the bulk work of ansitextview_append_string() and * ansitextview_append_string_nl(): Those functions just call this one * specifying whether a newline is to be added or not. */ int str_length; MainThreadOperation *operation; operation = g_new(MainThreadOperation, 1); operation->action = INSERT_AT_MARK; operation->text_insert.use_ta = FALSE; operation->text_insert.extra_tag = NULL; str_length = strlen(str); operation->text_insert.text = g_strndup(str, str_length + 1); if (add_nl) { operation->text_insert.text[str_length] = '\n'; } queue_mainthread_operation(gui->world, operation); operation = g_new(MainThreadOperation, 1); operation->action = TEXT_ADDED; queue_mainthread_operation(gui->world, operation); } static void ansitextview_append_formatted(WorldGUI *gui, GtkTextIter *iter, const gchar *text, TAState *ta_state, GtkTextTag *extra_tag) { gint start_offset; GtkTextIter start_iter; gint fg_color_idx; gint bg_color_idx; start_offset = gtk_text_iter_get_offset(iter); gtk_text_buffer_insert(gui->txtBuffer, iter, text, -1); gtk_text_buffer_get_iter_at_offset(gui->txtBuffer, &start_iter, start_offset); /* Any extra tag passed. */ if (extra_tag) { gtk_text_buffer_apply_tag(gui->txtBuffer, extra_tag, &start_iter, iter); } if (ta_state == NULL) { return; } /* Foreground & background */ fg_color_idx = ta_state->fg_base_idx + ta_state->fg_color; bg_color_idx = ta_state->bg_base_idx + ta_state->bg_color; if (ta_state->foreground_color_tag) { gtk_text_buffer_apply_tag(gui->txtBuffer, ta_state->foreground_color_tag, &start_iter, iter); } else { gint idx_to_use; if (ta_state->reverse ^ ta_state->hidden) { if (bg_color_idx == ANSI_DEFAULT_COLOR_IDX) { idx_to_use = ANSI_REVERSE_DEFAULT_IDX; } else if (bg_color_idx == ANSI_DEFAULT_BOLD_COLOR_IDX) { idx_to_use = ANSI_REVERSE_BOLD_DEFAULT_IDX; } else { idx_to_use = bg_color_idx; } } else { idx_to_use = fg_color_idx; } gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.ansi_fore_tags[idx_to_use], &start_iter, iter); } if (ta_state->background_color_tag) { gtk_text_buffer_apply_tag(gui->txtBuffer, ta_state->background_color_tag, &start_iter, iter); } else { gint idx_to_use; if (!ta_state->reverse) { idx_to_use = bg_color_idx; } else { if (fg_color_idx == ANSI_DEFAULT_COLOR_IDX) { idx_to_use = ANSI_REVERSE_DEFAULT_IDX; } else if (fg_color_idx == ANSI_DEFAULT_BOLD_COLOR_IDX) { idx_to_use = ANSI_REVERSE_BOLD_DEFAULT_IDX; } else { idx_to_use = fg_color_idx; } } gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.ansi_back_tags[idx_to_use], &start_iter, iter); } /* Special attributes */ if (ta_state->underline == PANGO_UNDERLINE_SINGLE) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.underline_tag, &start_iter, iter); } else if (ta_state->underline == PANGO_UNDERLINE_DOUBLE) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.dblunderline_tag, &start_iter, iter); } if (ta_state->strike) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.strike_tag, &start_iter, iter); } if (ta_state->italics) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.italics_tag, &start_iter, iter); } } kildclient-3.0.0/src/sound.c0000644000175000017500000000276112374460043012651 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include "libintl-wrapper.h" #include #include #include #include #ifdef __WIN32__ # include #endif #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ #ifndef __WIN32__ void play_sound(const gchar *file) { char *to_run; to_run = g_strdup_printf(globalPrefs.audio_player_command, file); system(to_run); g_free(to_run); } #else /* defined __WIN32__ */ void play_sound(const gchar *file) { PlaySound(file, NULL, SND_FILENAME | SND_ASYNC); } #endif /* defined __WIN32__ */ kildclient-3.0.0/src/proxy.c0000644000175000017500000005701412374460043012703 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include "libintl-wrapper.h" #include #include #include #include #ifndef __MINGW32__ # include # include # include # include # include #else /* defined __MINGW32__ */ # include # include #endif #include "kildclient.h" #include "perlscript.h" #include "net.h" /************************* * File global variables * *************************/ static const char* proxy_socks5_rejection_reasons[] = { NULL, /* success */ N_("general failure"), N_("connection not allowed by ruleset"), N_("network unreachable"), N_("host unreachable"), N_("connection refused by destination host"), N_("TTL expired"), N_("command not supported / protocol error"), N_("address type not supported"), }; /************** * Data types * **************/ /*********************** * SOCKS proxy defines * ***********************/ #define SOCKS_CONNECT 0x01 #define SOCKS4_VER 0x04 #define SOCKS4_REP_OK 0x5a #define SOCKS4_REP_FAIL 0x5b #define SOCKS4_REP_FAIL_NO_IDENTD 0x5c #define SOCKS4_REP_FAIL_UNCONF 0x5d /* SOCKS4 request: 1 byte ver, 1 byte command, 2 bytes port, 4 bytes IP, user name (variable), 1 byte terminating NULL */ #define SOCKS4_REQUEST_SIZE (1+1+2+4+1) /* SOCKS4 reply: 1 byte null, 1 byte status, 2 bytes arbitrary, 4 bytes arbitrary */ #define SOCKS4_REPLY_SIZE (1+1+2+4) #define SOCKS5_VER 0x05 #define SOCKS5_AUTH_NONE 0x00 #define SOCKS5_AUTH_USERNAME 0x02 #define SOCKS5_AUTH_REJECTED 0xFF #define SOCKS5_AUTH_REP_SUCCESS 0x00 #define SOCKS5_AUTH_USERNAME_VER 0x01 #define SOCKS5_ADDR_IP4 0x01 #define SOCKS5_ADDR_NAME 0x03 #define SOCKS5_ADDR_IP6 0x04 #define SOCKS5_CONN_REP_SUCCESS 0x00 #define SOCKS5_CONN_MAX_FAILED_REASON 0x08 /* SOCKS5 initial request: 1 byte version, 1 byte number of auth methods, 1 byte for each method. Since we support at most two methods, that's two bytes. */ #define SOCKS5_AUTH_METHOD_REQUEST_SIZE (1+1+2) /* SOCKS5 initial reply: 1 byte version, 1 byte method */ #define SOCKS5_AUTH_METHOD_REPLY_SIZE (1+1) /* SOCKS5 auth reply: 1 byte version, 1 byte status */ #define SOCKS5_AUTH_REPLY_SIZE (1+1) /* SOCKS5 connection request: 1 byte version, 1 byte command, 1 byte null, 1 byte address type, 1 byte domain length, domain (variable), 2 bytes port */ #define SOCKS5_CONNECTION_REQUEST_SIZE (1+1+1+1+1+2) /* Start of SOCKS5 connection request: 1 byte version, 1 byte status, 1 byte null, 1 byte address type, and the first byte of the address */ #define SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE (1+1+1+1+1) /*********************** * Function prototypes * ***********************/ static gboolean proxy_socks4_data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gboolean proxy_socks5_data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gboolean proxy_socks5_data_ready_initial(World *world); static gboolean proxy_socks5_data_ready_auth(World *world); static gboolean proxy_socks5_data_ready_connection(World *world); static void proxy_socks5_send_auth(World *world); static void proxy_socks5_send_connection_request(World *world); static gboolean proxy_http_data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gchar *proxy_http_get_connection_string(World *world); #define HAS_PROXY_HTTP_RESPONSE(w) ((w)->pbuf_size >= 4 && memcmp((w)->inbuffer + (w)->pbuf_size - 4, "\r\n\r\n", 4) == 0) /*************************** * General proxy functions * ***************************/ void proxy_info_free(proxy_settings *s) { /* Frees the contents of the structure, but not the structure itself. */ if (s == NULL) { return; } g_free(s->server); g_free(s->port); g_free(s->user); g_free(s->password); } void proxy_info_copy(proxy_settings *source, proxy_settings *dest) { dest->type = source->type; dest->server = g_strdup(source->server ? source->server : ""); dest->port = g_strdup(source->port ? source->port : ""); dest->user = g_strdup(source->user ? source->user : ""); dest->password = g_strdup(source->password ? source->password : ""); } /********** * SOCKS4 * **********/ gboolean proxy_socks4_resolved_real_host_cb(gpointer data) { struct resolve_data_s *resolve_data = (struct resolve_data_s *) data; World *world = resolve_data->world; gchar *msg; GThread *resolver_thread; g_free(resolve_data->host); g_free(resolve_data->port); if (resolve_data->ret != 0) { /* It could happen that the world has been closed */ if (g_list_index(open_worlds, world) != -1) { gchar *msg; gsize len; msg = g_locale_to_utf8(gai_strerror(resolve_data->ret), -1, NULL, &len, NULL); world->errmsg = g_strdup_printf(_("Could not resolve host %s: %s"), world->host, msg); g_free(msg); disconnect_world(world, FALSE); } g_free(resolve_data); /* Only run once */ return FALSE; } /* FIXME: There must be a better way to get the IP address as a number. */ memcpy(&(world->real_ip_for_socks4), resolve_data->addrinfo->ai_addr->sa_data+2, 4); g_free(resolve_data); msg = g_strdup_printf(_("Resolving proxy host %s..."), world->proxy_used.server); ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, msg); g_free(msg); resolve_data = g_new(struct resolve_data_s, 1); resolve_data->world = world; resolve_data->host = g_strdup(world->proxy_used.server); resolve_data->port = g_strdup(world->proxy_used.port); resolve_data->ai_family = AF_UNSPEC; resolve_data->callback = continue_connecting_cb; resolver_thread = g_thread_new("resolver", resolve_name_thread, resolve_data); g_thread_unref(resolver_thread); return FALSE; } gboolean proxy_socks4_connected_to(World *world) { gchar *msg; guchar *request; size_t request_size; uint16_t port; msg = g_strdup_printf(_("Connected to proxy server %s port %s, sending request..."), world->proxy_used.server, world->proxy_used.port); ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, msg); g_free(msg); /* Create SOCKS4 request */ request_size = SOCKS4_REQUEST_SIZE + strlen(world->proxy_used.user); request = g_malloc(request_size); request[0] = SOCKS4_VER; request[1] = SOCKS_CONNECT; port = htons((uint16_t) atoi(world->port)); memcpy(request + 2, &port, 2); memcpy(request + 4, &world->real_ip_for_socks4, 4); strcpy((gchar *) request + 8, world->proxy_used.user); /* We do not use kc_send because TLS is never used at this point */ send(world->sock, request, request_size, 0); g_free(request); /* Set a callback to read the response */ world->pbuf_size = 0; /* This counter will hold the number of bytes read. So far, nothing has been read yet. */ g_source_remove(world->io_watch_id); world->io_watch_id = g_io_add_watch_full(world->iochan, G_PRIORITY_HIGH, G_IO_IN | G_IO_HUP | G_IO_ERR, proxy_socks4_data_ready_cb, world, NULL); return TRUE; } static gboolean proxy_socks4_data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world; ssize_t nread; gchar *msg = NULL; world = (World *) data; /* We borrow world->inbuffer to hold the bytes, and world->pbuf_size to store to number of bytes that have been read. */ nread = recv(world->sock, world->inbuffer + world->pbuf_size, SOCKS4_REPLY_SIZE - world->pbuf_size, 0); if (nread == -1) { world->errmsg = g_strdup(_("Error while reading from proxy host.")); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; } world->pbuf_size += nread; if (world->pbuf_size < SOCKS4_REPLY_SIZE) { /* Continue reading... */ return TRUE; } /* OK, so we have the whole 8-byte reply */ world->pbuf_size = 0; switch (world->inbuffer[1]) { case SOCKS4_REP_OK: world->pbuf_size = 0; perform_tls_handshake(world); return FALSE; /* Not to be called again. */ case SOCKS4_REP_FAIL: msg = _("request rejected or failed"); break; case SOCKS4_REP_FAIL_NO_IDENTD: msg = _("request failed because identd could not be reached"); break; case SOCKS4_REP_FAIL_UNCONF: msg = _("request failed because client's identd could not confirm the user ID string in the request"); break; } world->errmsg = g_strdup_printf(_("Proxy request failed: %s."), msg); disconnect_world(world, FALSE); return FALSE; } /********** * SOCKS5 * **********/ gboolean proxy_socks5_connected_to(World *world) { gchar *msg; gboolean can_use_auth; size_t request_size; guchar request[SOCKS5_AUTH_METHOD_REQUEST_SIZE]; msg = g_strdup_printf(_("Connected to proxy server %s port %s, negotiating authentication..."), world->proxy_used.server, world->proxy_used.port); ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, msg); g_free(msg); /* Send supported authentication methods */ can_use_auth = (strcmp(world->proxy_used.user, "") != 0); request[0] = SOCKS5_VER; if (can_use_auth) { request[1] = 2; request_size = SOCKS5_AUTH_METHOD_REQUEST_SIZE; } else { request[1] = 1; request_size = SOCKS5_AUTH_METHOD_REQUEST_SIZE - 1; } request[2] = SOCKS5_AUTH_NONE; if (can_use_auth) { request[3] = SOCKS5_AUTH_USERNAME; } /* We do not use kc_send because TLS is never used at this point */ send(world->sock, request, request_size, 0); /* Set a callback to read the response */ world->pbuf_size = 0; /* This counter will hold the number of bytes read. So far, nothing has been read yet. */ world->proxy_used.state = SOCKS5_STATE_INITIAL; g_source_remove(world->io_watch_id); world->io_watch_id = g_io_add_watch_full(world->iochan, G_PRIORITY_HIGH, G_IO_IN | G_IO_HUP | G_IO_ERR, proxy_socks5_data_ready_cb, world, NULL); return TRUE; } static gboolean proxy_socks5_data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world; world = (World *) data; switch (world->proxy_used.state) { case SOCKS5_STATE_INITIAL: return proxy_socks5_data_ready_initial(world); case SOCKS5_STATE_AUTH: return proxy_socks5_data_ready_auth(world); case SOCKS5_STATE_CONNECTION: return proxy_socks5_data_ready_connection(world); } return FALSE; } static gboolean proxy_socks5_data_ready_initial(World *world) { ssize_t nread; /* We borrow world->inbuffer to hold the bytes, and world->pbuf_size to store to number of bytes that have been read. */ nread = recv(world->sock, world->inbuffer + world->pbuf_size, SOCKS5_AUTH_METHOD_REPLY_SIZE - world->pbuf_size, 0); if (nread == -1) { world->errmsg = g_strdup(_("Error while reading from proxy host.")); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; } world->pbuf_size += nread; if (world->pbuf_size < SOCKS5_AUTH_METHOD_REPLY_SIZE) { /* Continue reading... */ return TRUE; } /* See what was selected. */ switch (world->inbuffer[1]) { case SOCKS5_AUTH_REJECTED: world->errmsg = _("No acceptable proxy authentication methods."); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; case SOCKS5_AUTH_NONE: proxy_socks5_send_connection_request(world); return TRUE; case SOCKS5_AUTH_USERNAME: proxy_socks5_send_auth(world); return TRUE; } return FALSE; } static gboolean proxy_socks5_data_ready_auth(World *world) { ssize_t nread; /* We borrow world->inbuffer to hold the bytes, and world->pbuf_size to store to number of bytes that have been read. */ nread = recv(world->sock, world->inbuffer + world->pbuf_size, SOCKS5_AUTH_REPLY_SIZE - world->pbuf_size, 0); if (nread == -1) { world->errmsg = g_strdup(_("Error while reading from proxy host.")); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; } world->pbuf_size += nread; if (world->pbuf_size < SOCKS5_AUTH_REPLY_SIZE) { /* Continue reading... */ return TRUE; } /* See what was selected. */ if (world->inbuffer[1] == SOCKS5_AUTH_REP_SUCCESS) { proxy_socks5_send_connection_request(world); return TRUE; } world->errmsg = g_strdup(_("Proxy authentication failed.")); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; } static gboolean proxy_socks5_data_ready_connection(World *world) { ssize_t size_to_read; ssize_t nread; gchar *msg; /* Things are more complicated here because the reply is variable in length, depending on the address type and its length. First, we read the address type and the first byte of the address, which will be the length of the domain name, or the first byte of an IP address. Then we calculate how many more bytes need to be read. */ /* size_to_read will hold the total number of bytes that must be read */ if (world->pbuf_size < SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE) { size_to_read = SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE; } else { int addr_type = world->inbuffer[3]; switch (addr_type) { case SOCKS5_ADDR_IP4: size_to_read = SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE - 1 + 4 + 2; break; case SOCKS5_ADDR_IP6: size_to_read = SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE - 1 + 16 + 2; break; case SOCKS5_ADDR_NAME: size_to_read = SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE + world->inbuffer[4] + 2; break; default: /* Should never happen */ world->errmsg = g_strdup(_("Unrecognized response from proxy host.")); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; } } /* We borrow world->inbuffer to hold the bytes, and world->pbuf_size to store to number of bytes that have been read. */ nread = recv(world->sock, world->inbuffer + world->pbuf_size, size_to_read - world->pbuf_size, 0); if (nread == -1) { world->errmsg = g_strdup(_("Error while reading from proxy host.")); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; } world->pbuf_size += nread; if (world->pbuf_size < size_to_read || size_to_read <= SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE) { /* Continue reading... */ return TRUE; } /* Determine the reply. */ world->pbuf_size = 0; if (world->inbuffer[1] == SOCKS5_CONN_REP_SUCCESS) { perform_tls_handshake(world); return FALSE; /* Not to be called again. */ } if (world->inbuffer[1] > SOCKS5_CONN_MAX_FAILED_REASON) { msg = _("unknown reason code"); } else { msg = _(proxy_socks5_rejection_reasons[world->inbuffer[1]]); } world->errmsg = g_strdup_printf(_("Proxy request failed: %s."), msg); disconnect_world(world, FALSE); return FALSE; } static void proxy_socks5_send_auth(World *world) { gchar *msg; guchar *request; size_t request_size; size_t user_len; size_t pass_len; msg = g_strdup_printf(_("Sending proxy authentication credentials...")); ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, msg); g_free(msg); /* We could warn the user if the values are too big, but this is so unlikely to happen that we ignore it, just clamp the value to avoid a buffer overflow. */ user_len = MIN(strlen(world->proxy_used.user), 255); pass_len = MIN(strlen(world->proxy_used.password), 255); request_size = 3 + user_len + pass_len; request = g_malloc(request_size); request[0] = SOCKS5_AUTH_USERNAME_VER; request[1] = (guint8) user_len; memcpy(request + 2, world->proxy_used.user, user_len); request[2 + user_len] = (guint8) pass_len; memcpy(request + 2 + user_len + 1, world->proxy_used.password, pass_len); /* We do not use kc_send because TLS is never used at this point */ send(world->sock, request, request_size, 0); g_free(request); world->proxy_used.state = SOCKS5_STATE_AUTH; world->pbuf_size = 0; } static void proxy_socks5_send_connection_request(World *world) { gchar *msg; guchar *request; size_t request_size; size_t host_name_len; uint16_t port; msg = g_strdup_printf(_("Sending connection request...")); ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, msg); g_free(msg); /* Create SOCKS5 connection request */ host_name_len = MIN(strlen(world->host), 255); request_size = SOCKS5_CONNECTION_REQUEST_SIZE + host_name_len; request = g_malloc(request_size); request[0] = SOCKS5_VER; request[1] = SOCKS_CONNECT; request[2] = 0; request[3] = SOCKS5_ADDR_NAME; request[4] = (guint8) host_name_len; memcpy(request + 5, world->host, host_name_len); port = htons((uint16_t) atoi(world->port)); memcpy(request + 5 + host_name_len, &port, 2); /* We do not use kc_send because TLS is never used at this point */ send(world->sock, request, request_size, 0); g_free(request); world->proxy_used.state = SOCKS5_STATE_CONNECTION; world->pbuf_size = 0; } /******** * HTTP * ********/ gboolean proxy_http_connected_to(World *world) { gchar *msg; gchar *request; msg = g_strdup_printf(_("Connected to proxy server %s port %s, sending request..."), world->proxy_used.server, world->proxy_used.port); ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, msg); g_free(msg); request = proxy_http_get_connection_string(world); /* We do not use kc_send because TLS is never used at this point */ send(world->sock, request, strlen(request), 0); g_free(request); /* Set a callback to read the response */ world->pbuf_size = 0; /* This counter will hold the number of bytes read. So far, nothing has been read yet. */ g_source_remove(world->io_watch_id); world->io_watch_id = g_io_add_watch_full(world->iochan, G_PRIORITY_HIGH, G_IO_IN | G_IO_HUP | G_IO_ERR, proxy_http_data_ready_cb, world, NULL); return TRUE; } static gboolean proxy_http_data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world; ssize_t nread; world = (World *) data; /* Since there is no way to know how long the proxy response will be, we must read 1 byte at a time and check if it is complete in order not to read the contents of the actual connection. */ nread = recv(world->sock, world->inbuffer + world->pbuf_size, 1, 0); if (nread == -1) { world->errmsg = g_strdup(_("Error while reading from proxy host.")); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; } ++world->pbuf_size; if (!HAS_PROXY_HTTP_RESPONSE(world)) { /* Continue reading... */ return TRUE; } gchar *code_start = memchr(world->inbuffer, ' ', world->pbuf_size); if (code_start == NULL || memcmp(code_start, " 200", 4) != 0) { gchar *line_end = memchr(world->inbuffer, '\r', world->pbuf_size); *line_end = '\0'; world->errmsg = g_strdup_printf(_("Proxy request failed: %s."), code_start + 1); world->pbuf_size = 0; disconnect_world(world, FALSE); return FALSE; } world->pbuf_size = 0; perform_tls_handshake(world); /* Not to be called again. */ return FALSE; } static gchar * proxy_http_get_connection_string(World *world) { if (strcmp(world->proxy_used.user, "") == 0) { return g_strdup_printf("CONNECT %s:%s HTTP/1.0\r\n\r\n", world->host, world->port); } else { gchar *auth_string = g_strdup_printf("%s:%s", world->proxy_used.user, world->proxy_used.password); gchar *basic_auth_data = g_base64_encode((guchar *) auth_string, strlen(auth_string)); g_free(auth_string); gchar *result = g_strdup_printf("CONNECT %s:%s HTTP/1.0\r\n" "Proxy-Authorization: Basic %s\r\n" "\r\n", world->host, world->port, basic_auth_data); g_free(basic_auth_data); return result; } } kildclient-3.0.0/src/we_misc.c0000644000175000017500000001216512374460043013146 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "simocombobox.h" #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ G_MODULE_EXPORT void scroll_output_changed_cb(GtkToggleButton *widget, gpointer data); GObject * get_we_misc_tab(GtkBuilder *ui_builder) { GObject *panel; panel = gtk_builder_get_object(ui_builder, "we_panel_misc"); return panel; } void fill_we_misc_tab(World *world, GtkBuilder *ui_builder) { GtkToggleButton *chkScrollOutput; GtkSpinButton *txtBufferLines; GtkToggleButton *radNameDisplayWorld; GtkToggleButton *radNameDisplayWorldChar; GtkToggleButton *radNameDisplayCharWorld; GtkToggleButton *radNameDisplayCustom; GtkEntry *txtNameDisplayCustom; if (!world) { return; } /* Get widgets */ chkScrollOutput = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkScrollOutput")); txtBufferLines = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "txtBufferLines")); radNameDisplayWorld = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayWorld")); radNameDisplayWorldChar = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayWorldChar")); radNameDisplayCharWorld = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayCharWorld")); radNameDisplayCustom = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayCustom")); txtNameDisplayCustom = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtNameDisplayCustom")); gtk_toggle_button_set_active(chkScrollOutput, world->scrollOutput); gtk_spin_button_set_value(txtBufferLines, world->buffer_lines); switch (world->name_display_style) { case NAME_DISPLAY_WORLD: gtk_toggle_button_set_active(radNameDisplayWorld, TRUE); break; case NAME_DISPLAY_WORLD_CHAR: gtk_toggle_button_set_active(radNameDisplayWorldChar, TRUE); break; case NAME_DISPLAY_CHAR_WORLD: gtk_toggle_button_set_active(radNameDisplayCharWorld, TRUE); break; case NAME_DISPLAY_CUSTOM: gtk_toggle_button_set_active(radNameDisplayCustom, TRUE); break; } gtk_entry_set_text(txtNameDisplayCustom, world->name_display_pattern); } void update_we_misc_parameters(World *world, GtkBuilder *ui_builder) { GtkSpinButton *txtBufferLines; GtkToggleButton *radNameDisplayWorld; GtkToggleButton *radNameDisplayWorldChar; GtkToggleButton *radNameDisplayCharWorld; GtkToggleButton *radNameDisplayCustom; GtkEntry *txtNameDisplayCustom; const gchar *newval; /* Get widgets */ txtBufferLines = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "txtBufferLines")); radNameDisplayWorld = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayWorld")); radNameDisplayWorldChar = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayWorldChar")); radNameDisplayCharWorld = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayCharWorld")); radNameDisplayCustom = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayCustom")); txtNameDisplayCustom = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtNameDisplayCustom")); world->buffer_lines = gtk_spin_button_get_value_as_int(txtBufferLines); if (gtk_toggle_button_get_active(radNameDisplayWorld)) { world->name_display_style = NAME_DISPLAY_WORLD; } else if (gtk_toggle_button_get_active(radNameDisplayWorldChar)) { world->name_display_style = NAME_DISPLAY_WORLD_CHAR; } else if (gtk_toggle_button_get_active(radNameDisplayCharWorld)) { world->name_display_style = NAME_DISPLAY_CHAR_WORLD; } else if (gtk_toggle_button_get_active(radNameDisplayCustom)) { world->name_display_style = NAME_DISPLAY_CUSTOM; } newval = gtk_entry_get_text(txtNameDisplayCustom); if (!world->name_display_pattern || strcmp(world->name_display_pattern, newval) != 0) { g_free(world->name_display_pattern); world->name_display_pattern = g_strdup(newval); } } void scroll_output_changed_cb(GtkToggleButton *widget, gpointer data) { World *world = (World *) data; world->scrollOutput = gtk_toggle_button_get_active(widget); } kildclient-3.0.0/src/we_generic_guied.c0000644000175000017500000007613512374460043015013 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" /********************7 * Type definitions * ********************/ typedef void (*UpdateFunc)(); /*********************** * Function prototypes * ***********************/ static void we_guied_do_export(World *world, const gchar *file, GtkBuilder *ui_builder); static void we_guied_export_selected_hooks(GString *str, GSList *list, const gchar *name, GtkTreeModel *model, GtkBuilder *ui_builder); static void we_guied_do_import(World *world, const gchar *filename); static void we_guied_try_import(GSList **oldlist, GSList *newlist, gint *pos, UpdateFunc update_func, World *world, const gchar *evt_name); static void we_guied_try_import_vars(World *world, World *newworld); static gboolean *we_guied_get_pointer_to_bool_value(gpointer object, gint column); /* XML UI signals */ G_MODULE_EXPORT void we_guied_import_cb(GtkButton *button, gpointer data); void we_guied_export_cb(GtkButton *button, gpointer data) { World *world = (World *) data; GtkBuilder *ui_builder; gchar *objects[] = { "ExtraFilechooser", NULL }; GError *error = NULL; GtkWidget *ExtraFilechooser; GtkToggleButton *preselect; GtkWidget * filechooser; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return; } ExtraFilechooser = GTK_WIDGET(gtk_builder_get_object(ui_builder, "ExtraFilechooser")); preselect = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, g_object_get_data(G_OBJECT(button), "preselect"))); gtk_toggle_button_set_active(preselect, TRUE); filechooser = gtk_file_chooser_dialog_new(_("Export"), GTK_WINDOW(world->dlgEditWorld), GTK_FILE_CHOOSER_ACTION_SAVE, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Save"), GTK_RESPONSE_YES, NULL); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(filechooser), ExtraFilechooser); if (gtk_dialog_run(GTK_DIALOG(filechooser)) == GTK_RESPONSE_YES) { gchar *filename; gtk_widget_hide(filechooser); filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser)); we_guied_do_export(world, filename, ui_builder); g_free(filename); } gtk_widget_destroy(filechooser); g_object_unref(ui_builder); } static void we_guied_do_export(World *world, const gchar *file, GtkBuilder *ui_builder) { GtkTreeSelection *selection; GtkTreeModel *model; GList *selected; GList *listiter; GtkTreeIter iter; GString *file_contents; GError *error = NULL; file_contents = g_string_sized_new(1024); /* Header */ g_string_append(file_contents, "\n" "\n\n" "\n"); /* Triggers */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "Trigger")))) { selection = gtk_tree_view_get_selection(world->viewTrigger); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { g_string_append(file_contents, " \n"); listiter = selected; while (listiter) { Trigger *trigger; gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &trigger, -1); save_trigger(file_contents, trigger); listiter = listiter->next; } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); g_string_append(file_contents, " \n"); } } /* Aliases */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "Alias")))) { selection = gtk_tree_view_get_selection(world->viewAlias); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { g_string_append(file_contents, " \n"); listiter = selected; while (listiter) { Alias *alias; gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &alias, -1); save_alias(file_contents, alias); listiter = listiter->next; } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); g_string_append(file_contents, " \n"); } } /* Macros */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "Macro")))) { selection = gtk_tree_view_get_selection(world->viewMacro); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { g_string_append(file_contents, " \n"); listiter = selected; while (listiter) { Macro *macro; gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, ¯o, -1); save_macro(file_contents, macro); listiter = listiter->next; } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); g_string_append(file_contents, " \n"); } } /* Timers */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "Timer")))) { selection = gtk_tree_view_get_selection(world->viewTimer); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { g_string_append(file_contents, " \n"); listiter = selected; while (listiter) { Timer *timer; gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &timer, -1); save_timer(file_contents, timer); listiter = listiter->next; } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); g_string_append(file_contents, " \n"); } } /* Permanent Variables */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "Var")))) { selection = gtk_tree_view_get_selection(world->viewVar); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { g_string_append(file_contents, " \n"); listiter = selected; while (listiter) { gchar *name; gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &name, -1); g_string_append_printf(file_contents, " %s\n", name); listiter = listiter->next; } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); g_string_append(file_contents, " \n"); } } /* Hooks */ g_string_append(file_contents, " \n"); we_guied_export_selected_hooks(file_contents, world->selected_OnConnect_hooks, "OnConnect", GTK_TREE_MODEL(world->hooks.OnConnect_model_filter), ui_builder); we_guied_export_selected_hooks(file_contents, world->selected_OnDisconnect_hooks, "OnDisconnect", GTK_TREE_MODEL(world->hooks.OnDisconnect_model_filter), ui_builder); we_guied_export_selected_hooks(file_contents, world->selected_OnReceivedText_hooks, "OnReceivedText", GTK_TREE_MODEL(world->hooks.OnReceivedText_model_filter), ui_builder); we_guied_export_selected_hooks(file_contents, world->selected_OnSentCommand_hooks, "OnSentCommand", GTK_TREE_MODEL(world->hooks.OnSentCommand_model_filter), ui_builder); we_guied_export_selected_hooks(file_contents, world->selected_OnGetFocus_hooks, "OnGetFocus", GTK_TREE_MODEL(world->hooks.OnGetFocus_model_filter), ui_builder); we_guied_export_selected_hooks(file_contents, world->selected_OnLoseFocus_hooks, "OnLoseFocus", GTK_TREE_MODEL(world->hooks.OnLoseFocus_model_filter), ui_builder); we_guied_export_selected_hooks(file_contents, world->selected_OnCloseConnected_hooks, "OnCloseConnected", GTK_TREE_MODEL(world->hooks.OnCloseConnected_model_filter), ui_builder); we_guied_export_selected_hooks(file_contents, world->selected_OnServerData_hooks, "OnServerData", GTK_TREE_MODEL(world->hooks.OnServerData_model_filter), ui_builder); g_string_append(file_contents, " \n"); g_string_append(file_contents, "\n"); if (!g_file_set_contents(file, file_contents->str, file_contents->len, &error)) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not open file '%s': %s"), file, error->message); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } g_string_free(file_contents, TRUE); } static void we_guied_export_selected_hooks(GString *str, GSList *list, const gchar *name, GtkTreeModel *model, GtkBuilder *ui_builder) { GSList *listiter; GtkTreeIter iter; Hook *hook; if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, name)))) { return; } if (list) { GtkTreePath *path; g_string_append_printf(str, " \n", name); listiter = list; while (listiter) { if (gtk_tree_row_reference_valid(listiter->data)) { path = gtk_tree_row_reference_get_path(listiter->data); gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); save_hook(str, hook); } listiter = listiter->next; } g_string_append(str, " \n"); } } void we_guied_import_cb(GtkButton *button, gpointer data) { World *world = (World *) data; GtkWidget *filechooser; filechooser = gtk_file_chooser_dialog_new(_("Import"), GTK_WINDOW(world->dlgEditWorld), GTK_FILE_CHOOSER_ACTION_OPEN, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Open"), GTK_RESPONSE_YES, NULL); if (gtk_dialog_run(GTK_DIALOG(filechooser)) == GTK_RESPONSE_YES) { gchar *filename; gtk_widget_hide(filechooser); filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser)); we_guied_do_import(world, filename); g_free(filename); } gtk_widget_destroy(filechooser); } static void we_guied_do_import(World *world, const gchar *filename) { World *newworld; gboolean success; GError *error = NULL; newworld = create_new_world(FALSE); success = load_world_from_file(filename, newworld, FALSE, &error); if (!success) { GtkWidget *msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not import file '%s': %s"), filename, error->message); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); free_world(newworld); return; } we_guied_try_import(&world->triggers, newworld->triggers, &world->trigger_pos, we_trigger_insert_trigger, world, NULL); we_guied_try_import(&world->aliases, newworld->aliases, &world->alias_pos, (UpdateFunc) we_alias_insert_alias, world, NULL); we_guied_try_import(&world->macros, newworld->macros, &world->macro_pos, (UpdateFunc) we_macro_insert_macro, world, NULL); we_guied_try_import(&world->timers, newworld->timers, &world->timer_pos, (UpdateFunc) we_timer_insert_timer, world, NULL); we_guied_try_import_vars(world, newworld); we_guied_try_import(&world->hooks.OnConnect, newworld->hooks.OnConnect, &world->hooks.OnConnect_pos, (UpdateFunc) we_hook_insert_hook, world, "OnConnect"); we_guied_try_import(&world->hooks.OnDisconnect, newworld->hooks.OnDisconnect, &world->hooks.OnDisconnect_pos, (UpdateFunc) we_hook_insert_hook, world, "OnDisconnect"); we_guied_try_import(&world->hooks.OnReceivedText, newworld->hooks.OnReceivedText, &world->hooks.OnReceivedText_pos, (UpdateFunc) we_hook_insert_hook, world, "OnReceivedText"); we_guied_try_import(&world->hooks.OnSentCommand, newworld->hooks.OnSentCommand, &world->hooks.OnSentCommand_pos, (UpdateFunc) we_hook_insert_hook, world, "OnSentCommand"); we_guied_try_import(&world->hooks.OnGetFocus, newworld->hooks.OnGetFocus, &world->hooks.OnGetFocus_pos, (UpdateFunc) we_hook_insert_hook, world, "OnGetFocus"); we_guied_try_import(&world->hooks.OnLoseFocus, newworld->hooks.OnLoseFocus, &world->hooks.OnLoseFocus_pos, (UpdateFunc) we_hook_insert_hook, world, "OnLoseFocus"); we_guied_try_import(&world->hooks.OnCloseConnected, newworld->hooks.OnCloseConnected, &world->hooks.OnCloseConnected_pos, (UpdateFunc) we_hook_insert_hook, world, "OnCloseConnected"); we_guied_try_import(&world->hooks.OnServerData, newworld->hooks.OnServerData, &world->hooks.OnServerData_pos, (UpdateFunc) we_hook_insert_hook, world, "OnServerData"); /* This can only be done after the importing because it uses a Perl interpreter. The ones that have already the precomputed RE's are not changed. */ if (world->connected_at_least_once) { trigger_precompute_res(world); alias_precompute_res(world); } /* Since we used the lists directly, we set them to NULL to avoid freeing them. */ newworld->triggers = NULL; newworld->aliases = NULL; newworld->macros = NULL; newworld->timers = NULL; newworld->permanent_variables = NULL; newworld->hooks.OnConnect = NULL; newworld->hooks.OnDisconnect = NULL; newworld->hooks.OnReceivedText = NULL; newworld->hooks.OnSentCommand = NULL; newworld->hooks.OnGetFocus = NULL; newworld->hooks.OnLoseFocus = NULL; newworld->hooks.OnCloseConnected = NULL; newworld->hooks.OnServerData = NULL; free_world(newworld); } static void we_guied_try_import(GSList **oldlist, GSList *newlist, gint *pos, UpdateFunc update_func, World *world, const gchar *evt_name) { if (newlist) { GSList *last; GSList *listiter; gint first_pos; gint i; if (!*oldlist) { /* No items */ *oldlist = newlist; *pos = g_slist_length(*oldlist); last = NULL; first_pos = 0; } else { if (!*pos) { /* Only plugin items */ last = *oldlist; first_pos = 0; *pos = g_slist_length(newlist); *oldlist = g_slist_concat(newlist, *oldlist); } else { /* Has normal items (and perhaps plugin ones) */ GSList *last_normal; GSList *new_last; /* We insert the new list in the middle */ last_normal = g_slist_nth(*oldlist, *pos - 1); first_pos = *pos; *pos += g_slist_length(newlist); last = last_normal->next; last_normal->next = newlist; new_last = g_slist_last(newlist); new_last->next = last; } } /* Show new items in GUI editor */ for (listiter = newlist, i = first_pos; listiter != last; listiter = listiter->next, ++i) { if (evt_name) { update_func(world, evt_name, listiter->data, i); } else { update_func(world, listiter->data, i); } } } } static void we_guied_try_import_vars(World *world, World *newworld) { GSList *listiter; listiter = newworld->permanent_variables; while (listiter) { if (!g_slist_find_custom(world->permanent_variables, listiter->data, (GCompareFunc) strcmp)) { world->permanent_variables = g_slist_append(world->permanent_variables, listiter->data); we_var_insert_var(world, listiter->data, -1); } listiter = listiter->next; } } void we_guied_bool_func(GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { gpointer object; gint op; gboolean *value; gtk_tree_model_get(model, iter, WE_GUIED_POINTER, &object, -1); op = GPOINTER_TO_INT(data); value = we_guied_get_pointer_to_bool_value(object, op); g_object_set(renderer, "active", *value, NULL); } void we_guied_text_func(GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { gpointer object; gint op; gchar *value = NULL; static gchar printed_value[100]; gchar *keycodestr; gtk_tree_model_get(model, iter, WE_GUIED_POINTER, &object, -1); op = GPOINTER_TO_INT(data); switch (op) { case PLUGIN_NAME: value = ((Plugin *) object)->name; break; case PLUGIN_VERSION: value = ((Plugin *) object)->version; break; case PLUGIN_AUTHOR: value = ((Plugin *) object)->author; break; case PLUGIN_DESCRIPTION: value = ((Plugin *) object)->description; break; case TRIGGER_PATTERN: value = ((Trigger *) object)->pattern; break; case TRIGGER_ACTION: if (((Trigger *) object)->action) { value = ((Trigger *) object)->action; } else { value = ""; } break; case TRIGGER_NAME: if (((Trigger *) object)->name) { value = ((Alias *) object)->name; } else { value = ""; } break; case ALIAS_PATTERN: value = ((Alias *) object)->pattern; break; case ALIAS_SUBSTITUTION: value = ((Alias *) object)->substitution; break; case ALIAS_NAME: if (((Alias *) object)->name) { value = ((Alias *) object)->name; } else { value = ""; } break; case TIMER_NAME: if (((Timer *) object)->name) { value = ((Timer *) object)->name; } else { value = ""; } break; case TIMER_ACTION: value = ((Timer *) object)->action; break; case TIMER_INTERVAL: g_snprintf(printed_value, 100, "%.3f", ((Timer *) object)->interval); value = printed_value; break; case TIMER_COUNT: g_snprintf(printed_value, 100, "%d", ((Timer *) object)->count); value = printed_value; break; case MACRO_NAME: if (((Macro *) object)->name) { value = ((Macro *) object)->name; } else { value = ""; } break; case MACRO_ACTION: value = ((Macro *) object)->action; break; case MACRO_KEY: keycodestr = gtk_accelerator_name(((Macro *) object)->keyval, ((Macro *) object)->modifiers); g_strlcpy(printed_value, keycodestr, 100); g_free(keycodestr); value = printed_value; break; case HOOK_NAME: if (((Hook *) object)->name) { value = ((Hook *) object)->name; } else { value = ""; } break; case HOOK_ACTION: value = ((Hook *) object)->action; break; case PERMVAR_NAME: value = (gchar *) object; break; case OBJECT_PLUGIN: if (((GeneralObject *) object)->owner_plugin) { value = ((GeneralObject *) object)->owner_plugin->name; } else { value = ""; } break; } g_object_set(renderer, "text", value, NULL); } gboolean we_guied_plugin_filter_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { World *world = (World *) data; gpointer object; if (world->show_plugin_items) { /* Display all objects */ return TRUE; } gtk_tree_model_get(model, iter, WE_GUIED_POINTER, &object, -1); if (!object) { return FALSE; } if (((GeneralObject *) object)->owner_plugin) { return FALSE; } return TRUE; } void we_guied_bool_col_toggled_cb(GtkCellRendererToggle *renderer, gchar *pathstr, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; GtkTreePath *path; gint column; gpointer object; gboolean *value; view = (GtkTreeView *) data; model = gtk_tree_view_get_model(view); selection = gtk_tree_view_get_selection(view); gtk_tree_model_get_iter_from_string(model, &iter, pathstr); /* Only toggle if we click in the active row, otherwise just select that row. */ if (gtk_tree_selection_iter_is_selected(selection, &iter)) { gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &object, -1); column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(renderer), "column")); value = we_guied_get_pointer_to_bool_value(object, column); /* Update */ *value = !*value; path = gtk_tree_path_new_from_string(pathstr); gtk_tree_model_row_changed(model, path, &iter); gtk_tree_path_free(path); /* Recompute REs if Ignore Case is toggled */ if (column == TRIGGER_ICASE) { World *world = g_object_get_data(G_OBJECT(view), "forworld"); Trigger *trigger = (Trigger *) object; if (world->perl_interpreter) { GRAB_PERL(world); if (trigger->pattern_re) { SvREFCNT_dec(trigger->pattern_re); } trigger->pattern_re = precompute_re(trigger->pattern, trigger->ignore_case); RELEASE_PERL(world); } } if (column == ALIAS_ICASE) { World *world = g_object_get_data(G_OBJECT(view), "forworld"); Alias *alias = (Alias *) object; if (world->perl_interpreter) { GRAB_PERL(world); if (alias->pattern_re) { SvREFCNT_dec(alias->pattern_re); } alias->pattern_re = precompute_re(alias->pattern, alias->ignore_case); RELEASE_PERL(world); } } /* Turn timer on or off if necessary */ if (column == TIMER_ENABLED) { Timer *timer = (Timer *) object; if (timer->for_world->connected) { if (*value) { timer->function_id = g_timeout_add(timer->interval * 1000, run_timer, timer); } else { g_source_remove(timer->function_id); } } } } } static gboolean * we_guied_get_pointer_to_bool_value(gpointer object, gint column) { gboolean *value = NULL; switch (column) { case PLUGIN_ENABLED: value = &((Plugin *) object)->enabled; break; case TRIGGER_ENABLED: value = &((Trigger *) object)->enabled; break; case TRIGGER_GAG: value = &((Trigger *) object)->gag_output; break; case TRIGGER_GAGLOG: value = &((Trigger *) object)->gag_log; break; case TRIGGER_KEEPEXEC: value = &((Trigger *) object)->keepexecuting; break; case TRIGGER_REWRITER: value = &((Trigger *) object)->rewriter; break; case TRIGGER_ICASE: value = &((Trigger *) object)->ignore_case; break; case TRIGGER_HIGHLIGHT: value = &((Trigger *) object)->highlight; break; case ALIAS_ENABLED: value = &((Alias *) object)->enabled; break; case ALIAS_PERL_EVAL: value = &((Alias *) object)->perl_eval; break; case ALIAS_ICASE: value = &((Alias *) object)->ignore_case; break; case TIMER_ENABLED: value = &((Timer *) object)->enabled; break; case TIMER_TEMPORARY: value = &((Timer *) object)->temporary; break; case MACRO_ENABLED: value = &((Macro *) object)->enabled; break; case HOOK_ENABLED: value = &((Hook *) object)->enabled; break; } return value; } void we_guied_selection_changed_cb(GtkTreeSelection *selection, gpointer data) { GtkWidget *btnEdit; GtkWidget *btnDelete; GtkWidget *btnUp; GtkWidget *btnDown; GtkWidget *btnExport; int n; btnEdit = g_object_get_data(G_OBJECT(selection), "btnEdit"); btnDelete = g_object_get_data(G_OBJECT(selection), "btnDelete"); btnUp = g_object_get_data(G_OBJECT(selection), "btnUp"); btnDown = g_object_get_data(G_OBJECT(selection), "btnDown"); btnExport = g_object_get_data(G_OBJECT(selection), "btnExport"); n = gtk_tree_selection_count_selected_rows(selection); gtk_widget_set_sensitive(btnEdit, n == 1); gtk_widget_set_sensitive(btnUp, n == 1); gtk_widget_set_sensitive(btnDown, n == 1); gtk_widget_set_sensitive(btnDelete, n >= 1); gtk_widget_set_sensitive(btnExport, n >= 1); } GtkWidget * we_guied_confirm_delete_dialog_new(GtkWindow *parent, int n, const gchar *singular, const gchar *plural) { GtkWidget *msgdlg; if (n == 1) { msgdlg = gtk_message_dialog_new(parent, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Do you really want to delete the %s?"), singular); } else { msgdlg = gtk_message_dialog_new(parent, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Do you really want to delete %d %s?"), n, plural); } gtk_window_set_title(GTK_WINDOW(msgdlg), _("Confirm deletion")); gtk_dialog_add_buttons(GTK_DIALOG(msgdlg), _("Do not delete"), GTK_RESPONSE_NO, _("Delete"), GTK_RESPONSE_YES, NULL); return msgdlg; } kildclient-3.0.0/src/dlgEditWorld.ui0000644000175000017500000122043512374201340014272 00000000000000 5000 1 10 40 1000 40 1 10 1 10000 50 1 10 1 9999 3 1 10 2 10 2 1 3 1000000 1 1 10 100 1 10 100000 4 1 10 No auto-login diku (char, pass) lp (CONNECT char pass) Use global settings No proxy SOCKS4 SOCKS5 HTTP False 8 Edit World dialog True False vertical True False end _Cancel True True True True True False False 0 _OK True True True True True True False False 1 False True end 0 True False True True never in 150 400 True True False False True True 0 True 8 False False 12 vertical 18 False vertical 6 True False 0 0 <b>Connection</b> True False False 0 True False True False False False 0 True False 4 4 True True False 1 _Name: True txtName 0 0 True False 1 _Host: True txtHost 0 1 True False 1 _Port: True txtPort 0 2 True True Enter a descriptive name for the World True 50 1 0 True True Enter the host to connect to True 50 1 1 True True Enter the port used when connecting True 50 1 2 Use _SSL True True False True 0 True 1 3 False True 1 True True 1 False True 0 True False vertical 6 True False 0 0 <b>Proxy</b> True False False 0 True False True False False False 0 True False vertical 12 True False 4 True False Proxy _type: True False False 0 True False modelProxyType 0 False True 1 False True 0 True False 4 4 True True False 1 Server _address: True 0 0 True True 1 0 True False 1 Server _port: True 2 0 True True 3 0 True True 1 1 True False 1 _Username: True 0 1 True False 1 Pass_word: True 2 1 True True False 3 1 False True 1 True True 1 True True 1 False True 1 False vertical 6 True False 0 0 <b>Auto-login</b> True False False 0 True False True False False False 0 True False vertical 6 True False 4 True False 1 Connection _style: True cmbConnStyle False False 0 True False modelAutoLoginStyle 0 True True 1 False True 0 True False 0 Ch_aracters in this mud: True ntbkWEPanel False False 1 True True in True True True True 2 True False _New True True True True True False False 0 _Edit True True True True True False False 1 _Delete True True True True True False False 2 _Up True True True True True False False 3 D_elete True True True True True False False 4 False False 3 True True 1 True True 1 True True 2 True False General False False 12 vertical 18 False vertical 6 True False 0 0 <b>Font</b> True False False 0 True False True False False False 0 True False vertical 6 True True False 0 Select the font used in the _main screen: True terminalfont_btn False False 0 True True True True Select the font used in the main output screen Sans 12 False False 1 Use _bold font for highlighted colors (instead of just highlighting) True True False True Check if you want the highlighted ANSI colors to be displayed in bold also True 0.5 True False False 2 True True 1 True True 1 False False 0 False vertical 6 True False 0 0 <b>Word Wrap</b> True False False 0 True False True False False False 0 True False vertical 6 _Wrap lines at word boundaries True True False True Check if you want lines to be wrapped at word boundaries True 0.5 True False False 0 True False 4 True False 0 _Indent wrapped lines by True 0 False False 0 True True adjustment1 True False False 1 True False 0 pixels 0 False False 2 False False 1 Wrap lines at full _screen width True True False True 0.5 True True True True 2 True False 4 Maximum line width in _characters: True True False True 0.5 True radWrapFullWidth False False 0 True True adjustment2 True False False 1 False False 3 True True 1 True True 1 False True 1 False vertical 6 True False 0 0 <b>Tooltips</b> True False False 0 True False True False False False 0 True False vertical 6 True Display _tooltips with the time when the line was received True True False True Check if you want tooltips to be displayed showing the time when a line was received if you leave the mouse over the line for a short while True 0.5 True False False 0 True True 1 True True 1 False False 2 1 True False Output Window 1 False False 12 vertical 18 False vertical 6 True False 0 0 <b>Ansi Colors</b> True False False 0 True False True False False False 0 True False 6 6 True True True True 0 0 True True True 0 1 True True True 0 2 True True True 0 3 True True True 0 4 True True True 0 5 True True True 0 6 True True True 0 7 True False 0 _Black True colorBtnAnsi[0] 1 0 True False 0 R_ed True colorBtnAnsi[1] 1 1 True False 0 _Green True colorBtnAnsi[2] 1 2 True False 0 _Yellow True colorBtnAnsi[3] 1 3 True False 0 B_lue True colorBtnAnsi[4] 1 4 True False 0 _Magenta True colorBtnAnsi[5] 1 5 True False 0 _Cyan True colorBtnAnsi[6] 1 6 True False 0 _White True colorBtnAnsi[7] 1 7 True False 0 Bl_ack (bold) True 4 0 True False 0 Re_d (bold) True 4 1 True False 0 G_reen (bold) True 4 2 True False 0 Yell_ow (bold) True 4 3 True False 0 Bl_ue (bold) True 4 4 True False 0 Magen_ta (bold) True 4 5 True False 0 Cya_n (bold) True 4 6 True False 0 W_hite (bold) True 4 7 True True True 3 0 True True True 3 1 True True True 3 2 True True True 3 3 True True True 3 4 True True True 3 5 True True True 3 6 True True True 3 7 True False 32 32 2 0 False True 1 True True 1 False False 0 False vertical 6 True False 0 0 <b>Default Colors</b> True False False 0 True False True False False False 0 True False 6 6 True True True True 0 0 True True True 0 1 True False 0 _Foreground True 1 0 True False 0 Bold foreground True 1 1 True True True 3 0 True False 0 Bac_kground True 4 0 True True True 3 1 True False 0 Bold background 4 1 True False 32 32 2 0 False True 1 True True 1 False False 1 False vertical 5 True False 0 0 <b>Revert to default colors</b> True False False 0 True False True False False False 0 True False vertical 6 True Re_vert to default colors True True True True Click to revert all colors to their built-in defaults True False False 0 True True 1 True True 1 False False 2 2 True False Colors 2 False False 12 vertical 18 False vertical 6 True False 0 0 <b>Font</b> True False False 0 True False True False False False 0 True False vertical 6 True True False 0 Select the font used in the _status bar: True ntbkWEPanel False False 0 True True True True Select the font used in the status bar Sans 12 False False 1 True True 1 True True 1 False False 0 False vertical 6 True False 0 0 <b>Time Display</b> True False False 0 True False True False False False 0 True False vertical 2 True False 0 C_onnected time: True radCTime_no False False 4 0 True False True False False False 0 True False vertical Do not display True True False True Select if you do not want the connection time to be displayed True 0.5 True True False False 0 Display as hours, minutes and seconds True True False True Select if you want the connection time to be displayed in hours, minutes and seconds True 0.5 True radCTime_no False False 1 Display as seconds True True False True Select if you want the connection time to be displayed in seconds True 0.5 True radCTime_no False False 2 True True 1 False True 1 True False 0 _Idle time: True radITime_no False False 2 True False True False False False 0 True False vertical Do not display True True False True Select if you do not want the idle time to be displayed True 0.5 True True False False 0 Display as hours, minutes and seconds True True False True Select if you want the idle time to be displayed in hours, minutes and seconds True 0.5 True radITime_no False False 1 Display as seconds True True False True Select if you want the idle time to be displayed in seconds True 0.5 True radITime_no False False 2 Only _reset idle time counter when a command is entered directly True True False True Check to make the idle time counter reset only when a command is entered directly by typing it in the command entry box. If not checked, if a command is sent because of a timer, of a hook, etc, the idle timer is also reset. True 0.5 True False False 3 True True 1 True True 3 True True 1 False True 1 False False 1 3 True False Status Bar 3 False False 12 vertical 18 False vertical 5 True False 0 0 <b>Command Entry</b> True False False 0 True False True False False False 0 True False vertical 6 _Keep last typed command in command entry box True True False True Check to have the last command kept in the command entry box, so that you can repeat commands only by pressing ENTER True 0.5 True False False 0 _Echo sent commands in main window True True False True Check to have the sent commands echoed in the main output window True 0.5 True False False 1 _Store commands between sessions True True False True Check to have the command history saved in a file between sessions True 0.5 True False False 2 Never _hide the typed text True True False True Check this if the text you type is displayed as black dots in the input box. True 0.5 True True True 3 True False 4 True False 0 _Number of commands to save in history: True spnCommandsToSave False False 0 True True Specify the number of commands that are saved and can be later recalled adjustment3 1 False False 1 True True 4 True False 4 True False C_ommand separator: True txtCommandSeparator False False 0 True True Specify the separator for commands typed in the command entry box 9 True 8 False True 1 True True 5 Use single-_line input bar True True False True 0.5 True True False False 6 True False True False False False 0 True False vertical 2 Enable _auto-completion True True False True Check to enable command auto-completion (based on previous commands) True 0.5 True False False 0 True False 4 True False 0 Acti_vate auto-completion only after True spnMinPrefix False False 0 True True Specify the number of characters that must be typed for command completion to start adjustment4 1 False False 1 True False characters have been entered False False 2 True True 1 True True 1 True True 7 Use _multi-line input bar True True False True 0.5 True radSingleLine False False 8 True False True False False False 0 True False vertical 4 True False 4 True False N_umber of lines: True spnNLines False False 0 True True adjustment5 1 False False 1 True True 0 True False S_pell check typed text True True False True 0.5 True False False 1 True False 4 True False False False 0 True False Language code: False False 1 True True True 7 False True 2 True False (Leave blank for default based on locale) False False 3 True True 2 True True 1 True True 9 True True 1 True True 1 False False 0 False vertical 6 True False 0 0 <b>Font</b> True False False 0 True False True False False False 0 True False vertical 6 True True False 0 Select the font used in the command _entry box: True entryfont_btn False False 0 True True True True Select the font used in the command entry box Sans 12 False False 1 True True 1 True True 1 False True 1 False vertical 6 True False 0 0 <b>Flood prevention</b> True False False 0 True False True False False False 0 True False vertical 6 True True False 4 Do not allow the _same command to be sent True True False True Check to prevent more than a given number of equal commands to be sent in a row (which can disconnect your character in some muds) True 0.5 True False False 0 True True Specify the maximum number of equal commands that can be sent in a row adjustment6 1 False False 1 True False _times in a row True spnMaxCommands False False 2 False False 0 True False 4 True False Se_nd this command: True txtPreventionCommand False False 0 True True Enter a command to be sent whenever the specified maximum number of equal commands would be sent True False False 1 True True 1 True True 1 True True 1 False False 2 4 True False Input 4 False False 12 vertical 18 False vertical 6 True False 0 0 <b>Logging Status</b> True False False 0 True False True False False False 0 True False vertical 5 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <Filled by the program> False False 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 8 St_art True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 _Stop True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False True 1 True True 1 True False 4 _Include the last True True False True Select to include lines from the main window in the log file. True 0.5 True False False 0 True True Inform number of lines to include in the log. 6 adjustment7 True False False 1 True False lines of the scrollback buffer in the log False False 2 True True 2 True True 1 True True 1 False False 0 False vertical 6 True False 0 0 <b>File</b> True False False 0 True False True False False False 0 True False vertical 6 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 4 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Name: True False True 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True 1 ... True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False True 2 True True 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Note: You can use strftime() escapes to create different files based on the date and time that logging starts. Also, %Kw represents the World name and %Kc the character name used in auto-logon. True 30 True True 1 True True 1 True True 1 False False 1 False vertical 6 True False 0 0 <b>Options</b> True False False 0 True False True False False False 0 True False vertical 6 A_utomatically start logging when connected True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True If this is selected, logging will be automatically started whenever you connect to the world. True 0.5 True True True 0 Prefix lines with _date and/or time True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True Select this if you want to prefix each line in the log file with the date and/or time it was received. True 0.5 True True True 1 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True False False False 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Format: True False True 1 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK The default is to prefix lines with the date and time, but you can configure the format with strftime() escape sequences. See the manual for a description of those. True True 2 Revert to _default True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True True 3 True True 2 False False 1 True True 1 False True 2 5 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Logging 10 False False 12 vertical 18 False vertical 6 True False 0 0 <b>Scripting</b> True False False 0 True False True False False False 0 True False vertical 6 True True False 4 True False _Perl file to load: True txtScriptFile False False 2 0 True False False True True 2 1 _Clear True True True True False False 2 False False 0 True True 1 True True 1 False False 0 6 True False Scripting 5 False False 12 vertical 18 False vertical 16 True False 0 0 <b>Plugins Currently Loaded</b> True False False 0 False True False False False 0 True False vertical 4 True True in True True True True True 0 True False _Load True True True True True False False 0 _Help True True True True True False False 1 False True 24 1 True True 1 True True 1 True True 0 False vertical 16 True False 0 0 <b>Plugins Loaded on Startup</b> True False False 0 False True False False False 0 True False vertical 4 True True in True True True True True 0 True False 4 True expand _Add True True True True True True True 0 _Remove True True True True True True True 1 _Up True True True True True True True 2 _Down True True True True True True True 3 False True 24 1 True True 1 True True 1 True True 1 7 True False Plugins 6 False False 12 vertical 18 False vertical 6 True False 0 0 <b>MCCP (for compression)</b> True False False 0 True False True False False False 0 True False vertical 4 _Enable if server proposes after connecting True True False True 0.5 True True False False 0 Enable if server proposes at _any time True True False True 0.5 True radMCCPAfterConnect False False 1 _Disable True True False True 0.5 True radMCCPAfterConnect False False 2 True True 1 True True 1 False False 0 8 True False Protocols 7 False False 12 vertical 18 False vertical 6 True False 0 0 <b>Scrolling</b> True False False 0 True False True False False False 0 True False vertical 6 True Scroll on _output True True False True Check to have the main window scroll to the end whenever new output comes True 0.5 True True True 0 True False 8 True False _Lines to save in scrollback buffer: True txtBufferLines False False 0 True True Specify the number of lines of output that can be seen with by scrolling the window adjustment8 1 False False 1 True True 1 True True 1 True True 1 False False 0 False vertical 6 True False 0 0 <b>Name display</b> True False False 0 True False True False False False 0 True False vertical 6 Identify as 'World name' True True False 0.5 True True True True 0 Identify as 'World name - Character' True True False 0.5 True radNameDisplayWorld True True 1 Identify as 'Character - World name' True True False 0.5 True radNameDisplayWorld True True 2 True False 4 Custom: True True False 0.5 True radNameDisplayWorld False False 0 True True False False 1 True True 3 True False 0 Use %Kw to represent the World's name, and %Kc to represent the auto-logon character name True start 30 True True 4 True True 1 True True 1 False False 1 9 True False Miscellaneous 8 False False 12 vertical 18 False vertical 6 True False 0 0 <b>File</b> True False False 0 True False True False False False 0 True False vertical 4 True False True False _File: True False False 2 0 True True True 50 True True 2 1 True True 0 True False 0 You can leave this field blank, and a file name will be automatically generated. Only edit this field if you know what you are doing. True 30 True True 1 True True 1 True True 1 False False 0 False vertical 6 True False 0 0 <b>Character Set</b> True False False 0 True False True False False False 0 True False True False Character _set: True cmbCharset False False 2 0 True False True True 1 True True 1 True True 1 False False 1 False vertical 6 True False 0 0 <b>Graphical Editors</b> True False False 0 True False True False False False 0 True False vertical 6 _Ask for confirmation before deleting triggers, aliases, etc. True True False True If not checked, objects such as triggers, aliases, etc. will be deleted directly without asking for confirmation when you press the Delete button. True 0.5 True False False 0 _Show items defined by plugins True True False True If checked, triggers, aliases, macros and timers defined in plugins will appear in the corresponding World Editor sections. True 0.5 True False False 1 False False 1 True True 1 False True 2 False vertical 6 True False 0 0 <b>TCP Keep Alive</b> True False False 0 True False True False False False 0 True False vertical 6 Enable TCP _Keep Alive packets True True False True If not checked, objects such as triggers, aliases, etc. will be deleted directly without asking for confirmation when you press the Delete button. True 0.5 True False False 0 True False 0 (You must reconnect for changes in this setting to take effect) True True 1 False False 1 True True 1 False True 3 False vertical 6 True False 0 0 <b>Input</b> True False False 0 True False True False False False 0 True False vertical 6 _Disable up and down arrow keys for history navigation True True False True If checked, the up and down arrow keys are not used for navigating between saved commands. (You'll have to use Alt+up and Alt+down.) True 0.5 True False False 0 False False 1 True True 1 False True 4 10 True False Advanced 9 False True True 1 False True 1 cancelbutton1 okbutton2 kildclient-3.0.0/src/wndmain.ui0000644000175000017500000007147612374201340013353 00000000000000 False KildClient True False vertical True False True False _World True True False True False _Open... True True False _Reconnect True True False _Disconnect True True False Connect to _Another... True True False _Close True True False True False _Edit... True True False _Save True True False S_tatistics... True True False True False _Previous True True False _Next True True False True False _Quit True True False _Edit True True False True False Cu_t True True False _Copy True True False _Paste True True False _Delete True True False True False _Find True True False Find N_ext True True False _Input True True False True False _Clear True True False _Previous True True False _Next True True False Find P_revious True True False Find N_ext True True False Command _History... True True False True False _Multi-line Send... True True False True False _Test Triggers... True True False _Preferences True True False True False Disable _Triggers True True False Disable _Aliases True True False Disable _Macros True True False Disable T_imers True True False True False _Debug Matches True True False True False _Preferences... True True False Edit Default _World... True True False _Display True True False True False _Split Window True True False _Help True True False True False _Manual True True False _About True False True 0 True True True True 2 kildclient-3.0.0/src/kildclient.ui0000644000175000017500000034175112374201340014034 00000000000000 1 1000000 1 0.10000000000000001 1 -1 1000000 1 1 10 False Edit Timer True dialog True False 8 8 8 8 vertical True False end _Cancel True True True False True False False 0 _OK True True True False True False False 1 False True end 0 True False 8 2 True True False 0 _Name: True 0 0 True True Enter optionally a descriptive name for the timer True 50 1 0 True False 0 _Interval: True spnTimerInterval 0 1 True False 6 True True Specify the interval, in seconds, between timer activations 1.000 adjustment1 1 3 1 False True 0 True False 0 seconds True True 1 1 1 True False 0 _Repeat count: True spnTimerCount 0 2 True False 6 True True Specify how many times this timer should run before being disabled or deleted 1 adjustment2 1 1 False True 0 True False 0 (-1 to repeat indefinitely) True True 1 1 2 True False 0 _Action: True 0 3 True True Enter the action to be executed whenever the timer fires True 1 3 _Temporary (will be deleted automatically when its repeat count reaches 0) True True False Check to have the timer deleted after its repeat count has reached 0 True 0.5 True 0 4 2 _Enabled True True False Check to make the timer enabled; only enabled timers are run True 0.5 True 0 5 2 True False 0 <b>Note:</b> True 0 6 True False 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 6 False True 1 button3 button4 1 100 1 1 10 False Edit Alias True dialog True False 8 8 8 8 vertical True False 8 4 True True False 0 _Name: True 0 0 True True Enter optionally a descriptive name for the alias True 50 1 0 True False 0 _Pattern: True 0 1 True True Enter the pattern to match against typed commands True 1 1 _Ignore case when matching True True False True 0.5 True 1 2 True False 0 _Substitution: True txtAliasSubstitution 0 3 True True Enter the substitution to be executed True 1 3 E_val substitution as Perl statement True True False Check to have the substitution be executed in a s///e construction True 0.5 True 0 4 2 _Enabled True True False Check to make the alias enabled; only enabled aliases are tried True 0.5 True 0 5 2 True False 0 <b>Note:</b> True 0 6 True False 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 6 False True 0 True False end _Cancel True True True False True False False 0 _OK True True True False True False False 1 False True end 1 cancelbutton2 okbutton3 False Edit Character Information True dialog True False 8 8 8 8 vertical True False end _Cancel True True True False True False False 0 _OK True True True False True False False 1 False True end 0 True False 8 4 True True False 1 _Name: True 0 0 True True Enter the character's name for automatic login True 35 1 0 True False 0 _Password: True txtCharPassword 0 1 True True Enter the character's password for automatic login False True 1 1 False True 1 button11 button12 False Edit Hook True dialog True False 8 8 8 8 vertical True False end _Cancel True True True False True False False 0 _OK True True True False True False False 1 False True end 0 True False 8 4 True True False 0 Event: 0 0 True False 0 <Set by the program> 1 0 True False 0 _Name: True 0 1 True True Enter optionally a descriptive name for the hook True 50 1 1 True False 0 _Action: True 0 2 True True Enter the action to be run when the event happens True 1 2 _Enabled True True False Check to make the hook enabled; only enabled hooks are run True 0.5 True 0 3 2 True False 0 <b>Note:</b> True 0 4 True False 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 4 False True 1 button7 button8 False Edit Macro True dialog True False 8 8 8 8 vertical True False end _Cancel True True True False True False False 0 _OK True True True False True False False 1 False True end 0 True False 8 4 True True False 0 _Name: True 0 0 True True Enter optionally a descriptive name for the macro True 50 1 0 True False 0 _Key: True 0 1 True True Press the key that will be used to run the macro True 1 1 True False 0 Press the key that will be used to activate the macro while the cursor is in the text box. True 1 2 True False 0 _Action: True 0 3 True True Enter the action to be run when the key is pressed True 1 3 _Enabled True True False Check to make the macro enabled; only enabled macros are run True 0.5 True 0 4 2 True False 0 <b>Note:</b> True 0 5 True False 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 5 False True 1 button5 button6 False Enter optionally a descriptive name for the trigger Edit Trigger True dialog 8 True False 8 8 8 8 vertical True False end _Cancel True True True False True False False 0 _OK True True True False True False False 1 False True end 0 True False 8 4 True True False 0 _Name: True 0 0 True True True 50 1 0 True False 0 _Pattern: True 0 1 True True Enter the pattern to match against received lines True 1 1 _Ignore case when matching True True False True 0.5 True 1 2 True False 0 _Action: True 0 3 True True Enter the action that will be run when a match happens True 1 3 Omit (_gag) from output True True False Check to make the matched line not be printed in the main output window True 0.5 True 0 4 2 Omit (gag) from _log file True True False Check to make the matched line not be printed in the log file True 0.5 True 0 5 2 _Keep executing other triggers after this this one matches True True False Check to make this trigger not prevent further triggers from being tried, if it matches True 0.5 True 0 6 2 _Rewriter trigger True True False Check to make this trigger a rewriter trigger True 0.5 True 0 7 2 True False 8 C_hange style True True False True 0.5 True False False 0 C_onfigure... True False True False True False False 1 0 8 2 _Enabled True True False Check to make the trigger enabled; only enabled triggers are tried True 0.5 True 0 9 2 True False 0 <b>Note:</b> True 0 10 True False 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 10 False True 1 button1 button2 False Permenent variable True dialog True False vertical True False end _Cancel True True True False True False False 0 _OK True True True False True False False 1 False True end 0 True False 8 vertical 8 True False 0 _Name of variable to make permanent: True txtVarName False False 0 True True Enter the name of a scalar ($), array (@) or hash (%) variable whose contents are to be saved between sessions of the World True 50 False False 1 False True 2 button9 button10 True False window2 True True True False 8 8 8 8 8 True True Triggers True True False True 0.5 True 0 0 Aliases True True False True 0.5 True 0 1 Macros True True False True 0.5 True 0 2 Timers True True False True 0.5 True 0 3 Permanent Variables True True False True 0.5 True 0 4 OnConnect Hooks True True False True 0.5 True 1 0 OnDisconnect Hooks True True False True 0.5 True 1 1 OnReceivedText Hooks True True False True 0.5 True 1 2 OnSentCommand Hooks True True False True 0.5 True 1 3 OnGetFocus Hooks True True False True 0.5 True 1 4 OnLoseFocus Hooks True True False True 0.5 True 1 5 OnCloseConnected Hooks True True False True 0.5 True 1 6 True False _Items to export True True False window3 False 12 vertical 18 False vertical 16 True False 0 0 <Set by the program> False False 0 False True False False False 0 True False vertical 33 True True in True True True True True 0 True False True True _New True True True False True 0 0 _Edit True False True True False True 0 1 _Delete True False True True False True 1 1 _Import True True False True 2 0 E_xport True False True False True 2 1 _Up True False True True False True 3 0 _Down True False True True False True 3 1 False True 1 True True 1 True True 1 True True 0 Do not change No Yes Do not change None Single Double Do not change No Yes Do not change Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) Do not change Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) False Enter optionally a descriptive name for the trigger Change Style True dialog True False vertical True False end _Cancel True True True False True False False 0 _OK True True True False True False False 1 False True end 0 True False 8 8 8 8 8 4 True False 0 _Apply to: True 0 0 True False 0 _Foreground: True 0 1 True False model4 0 1 1 True False 0 _Background: True 0 2 True False model5 0 1 2 True False 0 _Italic: True 0 3 True False model1 0 1 3 True False 0 _Striked-thru: True 0 4 True False model3 0 1 4 True False 0 _Underline: True 0 5 True False model2 0 1 5 True False vertical The whole line True True False True 0.5 True False True 0 The whole matched text True True False True 0.5 True radTargetLine False True 1 True False 4 The matched substring number True True False True 0 True True radTargetLine False False 0 True True 1 adjustment3 1 1 True True 1 False True 2 1 0 False True 1 button13 button14 kildclient-3.0.0/src/dlgTestTriggers.ui0000644000175000017500000003011512374201340015014 00000000000000 True False Test Triggers dialog True False vertical True False end _Close True True True True True False False 0 False True end 0 True False 8 vertical 6 True False 0 Enter _line to be matched against the triggers: True False False 0 True False 4 True True The text entered here will be matched against triggers as if it were a line coming from the MUD 70 True True 0 _Send True True True True Click the run the triggers against the line. True False False 1 False False 1 True False False True 4 2 True False 4 True False Number of triggers that matched: False False 0 True False False False 1 False False 3 True False 0 Commands that would be sent: False False 4 True True in True True False False True True 5 True False 0 This is what would be printed in the main screen: False False 6 True True This is what would be printed in the main screen. If empty, the line has been gaged. It can be different from the original line because of rewriter triggers. False False False 7 True False 4 True False Would this line be included in the log file? False False 0 True False False False 1 False True 8 False True 2 btnTTClose kildclient-3.0.0/src/prefs.c0000644000175000017500000004462312374460043012643 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include "libintl-wrapper.h" #include #include #include #include #include "kildclient.h" #include "perlscript.h" /****************** * Initialization * ******************/ Prefs globalPrefs; /************************* * File Global variables * *************************/ #define MAX_OLDSAVE_COLOR 8 /*********************** * Function prototypes * ***********************/ static GString *get_preferences_string(void); static void read_global_preferences_from(FILE *fp, int *x, int *y, int *width, int *height); static void combo_changed_cb(GtkComboBox *combo, gpointer data); static gboolean txt_cmd_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data); /* XML UI signals */ G_MODULE_EXPORT void cmd_group_size_changed_cb(GtkSpinButton *spin, gpointer data); G_MODULE_EXPORT void cmd_delay_changed_cb(GtkSpinButton *spin, gpointer data); G_MODULE_EXPORT void tab_position_changed_cb(GtkComboBox *combo, gpointer data); G_MODULE_EXPORT void chk_hide_single_tab_toggled_cb(GtkToggleButton *button, gpointer data); G_MODULE_EXPORT void chk_urgency_toggled_cb(GtkToggleButton *button, gpointer data); G_MODULE_EXPORT void cmbProxyType_changed_cb(GtkComboBox *combo, gpointer data); void show_preferences_dialog_cb(GtkMenuItem *widget, gpointer data) { static GtkWidget *dialog = NULL; GtkNotebook *notebook; GObject *cmbInfo; GObject *cmbCmdEcho; GtkComboBox *cmbTabPos; GtkToggleButton *chkHideSingleTab; GtkToggleButton *chkUrgency; GtkSpinButton *spnGroupSize; GtkSpinButton *spnDelay; GtkComboBox *cmbProxyType; GObject *txtProxyServer; GObject *txtProxyPort; GObject *txtProxyUser; GObject *txtProxyPassword; #ifndef __WIN32__ GObject *txtBrowserCommand; GObject *txtAudioPlayerCommand; #else GtkWidget *tabPrograms; #endif if (!dialog) { GError *error = NULL; if (!gtk_builder_add_from_file(main_builder, get_kildclient_installed_file("dlgPreferences.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return; } dialog = GTK_WIDGET(gtk_builder_get_object(main_builder, "dlgPreferences")); notebook = GTK_NOTEBOOK(gtk_builder_get_object(main_builder, "ntbkPrefs")); /* Combos with colors */ cmbInfo = gtk_builder_get_object(main_builder, "cmbInfoColor"); gtk_combo_box_set_active(GTK_COMBO_BOX(cmbInfo), globalPrefs.idxInfoMsgColor); g_signal_connect(cmbInfo, "changed", G_CALLBACK(combo_changed_cb), &globalPrefs.idxInfoMsgColor); cmbCmdEcho = gtk_builder_get_object(main_builder, "cmbCmdEchoColor"); gtk_combo_box_set_active(GTK_COMBO_BOX(cmbCmdEcho), globalPrefs.idxCmdEchoColor); g_signal_connect(cmbCmdEcho, "changed", G_CALLBACK(combo_changed_cb), &globalPrefs.idxCmdEchoColor); /* Load current tab position */ cmbTabPos = GTK_COMBO_BOX(gtk_builder_get_object(main_builder, "cmbTabPos")); gtk_combo_box_set_active(cmbTabPos, globalPrefs.tab_position); chkHideSingleTab = GTK_TOGGLE_BUTTON(gtk_builder_get_object(main_builder, "chkHideSingleTab")); gtk_toggle_button_set_active(chkHideSingleTab, globalPrefs.hide_single_tab); /* Load use of urgency hint */ chkUrgency = GTK_TOGGLE_BUTTON(gtk_builder_get_object(main_builder, "chkUrgency")); gtk_toggle_button_set_active(chkUrgency, globalPrefs.urgency_hint); /* Load delays */ spnGroupSize = GTK_SPIN_BUTTON(gtk_builder_get_object(main_builder, "spnGroupSize")); gtk_spin_button_set_value(spnGroupSize, globalPrefs.multi_cmd_group_size); spnDelay = GTK_SPIN_BUTTON(gtk_builder_get_object(main_builder, "spnPrefsDelay")); gtk_spin_button_set_value(spnDelay, globalPrefs.multi_cmd_delay); /* Load proxy settings */ txtProxyServer = gtk_builder_get_object(main_builder, "txtGProxyServer"); gtk_entry_set_text(GTK_ENTRY(txtProxyServer), globalPrefs.proxy.server); g_signal_connect(txtProxyServer, "focus_out_event", G_CALLBACK(txt_cmd_focus_out_cb), &globalPrefs.proxy.server); txtProxyPort = gtk_builder_get_object(main_builder, "txtGProxyPort"); gtk_entry_set_text(GTK_ENTRY(txtProxyPort), globalPrefs.proxy.port); g_signal_connect(txtProxyPort, "focus_out_event", G_CALLBACK(txt_cmd_focus_out_cb), &globalPrefs.proxy.port); txtProxyUser = gtk_builder_get_object(main_builder, "txtGProxyUser"); gtk_entry_set_text(GTK_ENTRY(txtProxyUser), globalPrefs.proxy.user); g_signal_connect(txtProxyUser, "focus_out_event", G_CALLBACK(txt_cmd_focus_out_cb), &globalPrefs.proxy.user); txtProxyPassword = gtk_builder_get_object(main_builder, "txtGProxyPassword"); gtk_entry_set_text(GTK_ENTRY(txtProxyPassword), globalPrefs.proxy.password); g_signal_connect(txtProxyPassword, "focus_out_event", G_CALLBACK(txt_cmd_focus_out_cb), &globalPrefs.proxy.password); /* Remove "Use Global Settings" - these are the global settings */ cmbProxyType = GTK_COMBO_BOX(gtk_builder_get_object(main_builder, "cmbGProxyType")); gtk_combo_box_set_active(cmbProxyType, globalPrefs.proxy.type); #ifndef __WIN32__ /* Load commands */ txtBrowserCommand = gtk_builder_get_object(main_builder, "txtBrowserCommand"); gtk_entry_set_text(GTK_ENTRY(txtBrowserCommand), globalPrefs.browser_command); g_signal_connect(txtBrowserCommand, "focus_out_event", G_CALLBACK(txt_cmd_focus_out_cb), &globalPrefs.browser_command); txtAudioPlayerCommand = gtk_builder_get_object(main_builder, "txtAudioPlayerCommand"); gtk_entry_set_text(GTK_ENTRY(txtAudioPlayerCommand), globalPrefs.audio_player_command); g_signal_connect(txtAudioPlayerCommand, "focus_out_event", G_CALLBACK(txt_cmd_focus_out_cb), &globalPrefs.audio_player_command); #else /* defined __WIN32__ */ tabPrograms = GTK_WIDGET(gtk_builder_get_object(main_builder, "prefs_panel_progs")); gtk_notebook_remove_page(notebook, gtk_notebook_page_num(notebook, tabPrograms)); #endif gtk_builder_connect_signals(main_builder, NULL); /* For some reason the proxy page insists on being the default selected. */ gtk_widget_show_all(dialog); gtk_notebook_set_current_page(notebook, 0); } gtk_window_present(GTK_WINDOW(dialog)); } static void combo_changed_cb(GtkComboBox *combo, gpointer data) { int *idx = (int *) data; *idx = gtk_combo_box_get_active(combo); } void cmd_group_size_changed_cb(GtkSpinButton *spin, gpointer data) { globalPrefs.multi_cmd_group_size = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin)); } void cmd_delay_changed_cb(GtkSpinButton *spin, gpointer data) { globalPrefs.multi_cmd_delay = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)); } void tab_position_changed_cb(GtkComboBox *combo, gpointer data) { globalPrefs.tab_position = gtk_combo_box_get_active(combo); set_notebook_tab_position(globalPrefs.tab_position); } void chk_hide_single_tab_toggled_cb(GtkToggleButton *button, gpointer data) { globalPrefs.hide_single_tab = gtk_toggle_button_get_active(button); if (globalPrefs.hide_single_tab) { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(ntbkWorlds), gtk_notebook_get_n_pages(GTK_NOTEBOOK(ntbkWorlds)) != 1); } else { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(ntbkWorlds), TRUE); } } void chk_urgency_toggled_cb(GtkToggleButton *button, gpointer data) { globalPrefs.urgency_hint = gtk_toggle_button_get_active(button); } static gboolean txt_cmd_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data) { char **command = (char **) data; const char *new_command; new_command = gtk_entry_get_text(GTK_ENTRY(widget)); if (strcmp(new_command, *command) != 0) { g_free(*command); *command = g_strdup(new_command); } return FALSE; } void cmbProxyType_changed_cb(GtkComboBox *combo, gpointer data) { globalPrefs.proxy.type = gtk_combo_box_get_active(combo); } void read_global_preferences(int *x, int *y, int *width, int *height) { const char *kilddir; char *filepath; FILE *fp; /* First, fill in defaults (for the case the file cannot be read, or some options are missing) */ globalPrefs.idxInfoMsgColor = 12; globalPrefs.idxCmdEchoColor = 2; globalPrefs.multi_cmd_group_size = 1; globalPrefs.multi_cmd_delay = 0; globalPrefs.tab_position = GTK_POS_TOP; globalPrefs.hide_single_tab = FALSE; globalPrefs.urgency_hint = TRUE; globalPrefs.proxy.type = PROXY_NONE; /* And now try to load from file the actual values */ kilddir = get_kildclient_directory_path(); filepath = g_strdup_printf("%s/kildclient.cfg", kilddir); fp = fopen(filepath, "r"); if (fp) { read_global_preferences_from(fp, x, y, width, height); fclose(fp); } /* Has the commands been set? */ if (!globalPrefs.browser_command) { globalPrefs.browser_command = g_strdup("${BROWSER} \"%s\" &"); } if (!globalPrefs.audio_player_command) { globalPrefs.audio_player_command = g_strdup("play \"%s\" &"); } /* Have the proxy settings been set? */ if (!globalPrefs.proxy.server) { globalPrefs.proxy.server = g_strdup(""); } if (!globalPrefs.proxy.port) { globalPrefs.proxy.port = g_strdup("1080"); } if (!globalPrefs.proxy.user) { globalPrefs.proxy.user = g_strdup(""); } if (!globalPrefs.proxy.password) { globalPrefs.proxy.password = g_strdup(""); } g_free(filepath); } static void read_global_preferences_from(FILE *fp, int *x, int *y, int *width, int *height) { char line[MAX_BUFFER]; char first_word[MAX_BUFFER]; int pos; fgets(line, MAX_BUFFER, fp); while (!feof(fp)) { line[strlen(line) - 1] = '\0'; /* Remove newline at end */ pos = strcspn(line, " "); memcpy(first_word, line, pos); first_word[pos] = '\0'; if (strcmp(first_word, "newinfomsgcolor") == 0) { globalPrefs.idxInfoMsgColor = atoi(line + pos + 1); } else if (strcmp(first_word, "newcmdechocolor") == 0) { globalPrefs.idxCmdEchoColor = atoi(line + pos + 1); } else if (strcmp(first_word, "infomsgcolor") == 0) { globalPrefs.idxInfoMsgColor = atoi(line + pos + 1); if (globalPrefs.idxInfoMsgColor >= MAX_OLDSAVE_COLOR) { ++globalPrefs.idxInfoMsgColor; } } else if (strcmp(first_word, "cmdechocolor") == 0) { globalPrefs.idxCmdEchoColor = atoi(line + pos + 1); if (globalPrefs.idxCmdEchoColor >= MAX_OLDSAVE_COLOR) { ++globalPrefs.idxCmdEchoColor; } } else if (strcmp(first_word, "tabposition") == 0) { globalPrefs.tab_position = atoi(line + pos + 1); } else if (strcmp(first_word, "hidesingletab") == 0) { globalPrefs.hide_single_tab = atoi(line + pos + 1); } else if (strcmp(first_word, "urgencyhint") == 0) { globalPrefs.urgency_hint = atoi(line + pos + 1); } else if (strcmp(first_word, "browsercommand") == 0) { globalPrefs.browser_command = g_strdup(line + pos + 1); } else if (strcmp(first_word, "audioplayercommand") == 0) { globalPrefs.audio_player_command = g_strdup(line + pos + 1); } else if (strcmp(first_word, "lastopenworld") == 0) { globalPrefs.last_open_world = g_strdup(line + pos + 1); } else if (strcmp(first_word, "multicmdgroupsize") == 0) { globalPrefs.multi_cmd_group_size = atoi(line + pos + 1); } else if (strcmp(first_word, "multicmddelay") == 0) { globalPrefs.multi_cmd_delay = strtod(line + pos + 1, NULL); } else if (strcmp(first_word, "window") == 0) { if (sscanf(line + pos + 1, "%d %d %d %d", x, y, width, height) != 4) { fprintf(stderr, _("Invalid window size specification in config file.\n")); *x = -1; /* It might have been changed */ } } else if (strcmp(first_word, "nopluginhelpmsg") == 0) { globalPrefs.no_plugin_help_msg = atoi(line + pos + 1); } else if (strcmp(first_word, "proxytype") == 0) { globalPrefs.proxy.type = atoi(line + pos + 1); } else if (strcmp(first_word, "proxyserver") == 0) { globalPrefs.proxy.server = g_strdup(line + pos + 1); } else if (strcmp(first_word, "proxyport") == 0) { globalPrefs.proxy.port = g_strdup(line + pos + 1); } else if (strcmp(first_word, "proxyuser") == 0) { globalPrefs.proxy.user = g_strdup(line + pos + 1); } else if (strcmp(first_word, "proxypassword") == 0) { globalPrefs.proxy.password = g_strdup(line + pos + 1); } else { fprintf(stderr, _("Unknown directive '%s' in config file.\n"), first_word); } fgets(line, MAX_BUFFER, fp); } } void save_global_preferences(void) { const char *dirpath; char *filepath; GString *file_contents; GError *error = NULL; file_contents = get_preferences_string(); dirpath = create_kildclient_directory(); filepath = g_strdup_printf("%s/kildclient.cfg", dirpath); if (!g_file_set_contents(filepath, file_contents->str, file_contents->len, &error)) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not open file '%s': %s"), filepath, error->message); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } g_free(filepath); g_string_free(file_contents, TRUE); } static GString * get_preferences_string(void) { GString *str; int x, y, width, height; str = g_string_sized_new(512); g_string_append_printf(str, "newinfomsgcolor %d\n", globalPrefs.idxInfoMsgColor); g_string_append_printf(str, "newcmdechocolor %d\n", globalPrefs.idxCmdEchoColor); g_string_append_printf(str, "tabposition %d\n", globalPrefs.tab_position); g_string_append_printf(str, "hidesingletab %d\n", globalPrefs.hide_single_tab); g_string_append_printf(str, "urgencyhint %d\n", globalPrefs.urgency_hint); g_string_append_printf(str, "browsercommand %s\n", globalPrefs.browser_command); g_string_append_printf(str, "audioplayercommand %s\n", globalPrefs.audio_player_command); g_string_append_printf(str, "lastopenworld %s\n", globalPrefs.last_open_world); g_string_append_printf(str, "multicmdgroupsize %d\n", globalPrefs.multi_cmd_group_size); g_string_append_printf(str, "multicmddelay %f\n", globalPrefs.multi_cmd_delay); g_string_append_printf(str, "nopluginhelpmsg %d\n", globalPrefs.no_plugin_help_msg); gtk_window_get_position(GTK_WINDOW(wndMain), &x, &y); gtk_window_get_size(GTK_WINDOW(wndMain), &width, &height); g_string_append_printf(str, "window %d %d %d %d\n", x, y, width, height); g_string_append_printf(str, "proxytype %d\n", globalPrefs.proxy.type); g_string_append_printf(str, "proxyserver %s\n", globalPrefs.proxy.server); g_string_append_printf(str, "proxyport %s\n", globalPrefs.proxy.port); g_string_append_printf(str, "proxyuser %s\n", globalPrefs.proxy.user); g_string_append_printf(str, "proxypassword %s\n", globalPrefs.proxy.password); return str; } const char * create_kildclient_directory(void) { const char *kilddir; struct stat stinfo; kilddir = get_kildclient_directory_path(); if (stat(kilddir, &stinfo) == -1) { if (g_mkdir(kilddir, S_IRUSR | S_IWUSR | S_IXUSR) == -1) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not create directory '%s': %s"), kilddir, g_strerror(errno)); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); return NULL; } } return kilddir; } kildclient-3.0.0/src/we_advanced.c0000644000175000017500000002617312374460043013764 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "libintl-wrapper.h" #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkTreeModel *get_charsets_model(void); static char *get_file_name_for_world(const char *name); /* XML UI signals */ G_MODULE_EXPORT void confirm_delete_changed_cb(GtkToggleButton *chkbox, gpointer data); G_MODULE_EXPORT void show_plugin_toggled_cb(GtkToggleButton *button, gpointer data); /************************* * File global variables * *************************/ static const gchar *charsets[] = { "ISO-8859-1", "UTF-8", "ANSI_X3.110-1983", "ANSI_X3.4-1968", "ASMO_449", "BIG5", "BIG5HKSCS", "BS_4730", "CP1250", "CP1251", "CP1252", "CP1253", "CP1254", "CP1255", "CP1256", "CP1257", "CP1258", "CP737", "CP775", "CP949", "CSA_Z243.4-1985-1", "CSA_Z243.4-1985-2", "CSN_369103", "CWI", "DEC-MCS", "DIN_66003", "DS_2089", "EBCDIC-AT-DE", "EBCDIC-AT-DE-A", "EBCDIC-CA-FR", "EBCDIC-DK-NO", "EBCDIC-DK-NO-A", "EBCDIC-ES", "EBCDIC-ES-A", "EBCDIC-ES-S", "EBCDIC-FI-SE", "EBCDIC-FI-SE-A", "EBCDIC-FR", "EBCDIC-IS-FRISS", "EBCDIC-IT", "EBCDIC-PT", "EBCDIC-UK", "EBCDIC-US", "ECMA-CYRILLIC", "ES", "ES2", "EUC-JP", "EUC-KR", "EUC-TW", "GB18030", "GB2312", "GBK", "GB_1988-80", "GOST_19768-74", "GREEK-CCITT", "GREEK7", "GREEK7-OLD", "HP-ROMAN8", "IBM037", "IBM038", "IBM1004", "IBM1026", "IBM1047", "IBM256", "IBM273", "IBM274", "IBM275", "IBM277", "IBM278", "IBM280", "IBM281", "IBM284", "IBM285", "IBM290", "IBM297", "IBM420", "IBM423", "IBM424", "IBM437", "IBM500", "IBM850", "IBM851", "IBM852", "IBM855", "IBM857", "IBM860", "IBM861", "IBM862", "IBM863", "IBM864", "IBM865", "IBM866", "IBM868", "IBM869", "IBM870", "IBM871", "IBM874", "IBM875", "IBM880", "IBM891", "IBM903", "IBM904", "IBM905", "IBM918", "IEC_P27-1", "INIS", "INIS-8", "INIS-CYRILLIC", "ISIRI-3342", "ISO-8859-10", "ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "ISO-8859-16", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7", "ISO-8859-8", "ISO-8859-9", "ISO-IR-197", "ISO-IR-90", "ISO_10367-BOX", "ISO_2033-1983", "ISO_5427", "ISO_5427-EXT", "ISO_5428", "ISO_6937", "IT", "JIS_C6220-1969-RO", "JIS_C6229-1984-B", "JOHAB", "JUS_I.B1.002", "KOI-8", "KOI8-R", "KOI8-U", "KSC5636", "LATIN-GREEK", "LATIN-GREEK-1", "MAC-IS", "MAC-UK", "MACINTOSH", "MSZ_7795.3", "NATS-DANO", "NATS-SEFI", "NC_NC00-10", "NF_Z_62-010", "NF_Z_62-010_(1973)", "NF_Z_62-010_1973", "NS_4551-1", "NS_4551-2", "PT", "PT2", "SEN_850200_B", "SEN_850200_C", "SJIS", "T.61-8BIT", "TIS-620", "VISCII", "WIN-SAMI-2", NULL, }; GObject * get_we_advanced_tab(World *world, GtkBuilder *ui_builder) { GObject *panel; GtkCellRenderer *renderer; GtkComboBox *cmbCharset; GtkWidget *vbox_file; panel = gtk_builder_get_object(ui_builder, "we_panel_advanced"); if (world == default_world) { vbox_file = GTK_WIDGET(gtk_builder_get_object(ui_builder, "vbox_file")); gtk_widget_destroy(vbox_file); } cmbCharset = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbCharset")); gtk_combo_box_set_model(cmbCharset, get_charsets_model()); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(cmbCharset), renderer, TRUE); gtk_combo_box_set_active(cmbCharset, 0); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(cmbCharset), renderer, "text", 0, NULL); return panel; } void fill_we_advanced_tab(World *world, GtkBuilder *ui_builder) { GtkEntry *txtWorldFile; GtkComboBox *cmbCharset; GtkToggleButton *chkConfirmDelete; GtkToggleButton *chkShowPlugin; GtkToggleButton *chkKeepAlive; GtkToggleButton *chkIgnoreUpDown; if (!world) { return; } cmbCharset = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbCharset")); chkConfirmDelete = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkConfirmDelete")); chkShowPlugin = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkShowPlugin")); chkKeepAlive = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkKeepAlive")); chkIgnoreUpDown = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkIgnoreUpDown")); if (world != default_world) { txtWorldFile = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtWorldFile")); if (world->file) gtk_entry_set_text(txtWorldFile, world->file); } if (world->charset_index != -1) { gtk_combo_box_set_active(cmbCharset, world->charset_index); } else { GtkTreeIter iter; GtkTreeModel *model; gchar *charset; model = get_charsets_model(); gtk_tree_model_get_iter_first(model, &iter); do { gtk_tree_model_get(model, &iter, 0, &charset, -1); if (strcmp(charset, world->charset) == 0) { gtk_combo_box_set_active_iter(cmbCharset, &iter); world->charset_index = gtk_combo_box_get_active(cmbCharset); break; } } while (gtk_tree_model_iter_next(model, &iter)); } gtk_toggle_button_set_active(chkConfirmDelete, world->confirm_delete); gtk_toggle_button_set_active(chkShowPlugin, world->show_plugin_items); gtk_toggle_button_set_active(chkKeepAlive, world->keep_alive); gtk_toggle_button_set_active(chkIgnoreUpDown, world->ignore_up_down_keys); } void update_we_advanced_parameters(World *world, gboolean *newworld, GtkBuilder *ui_builder) { GtkEntry *txtWorldFile; GtkComboBox *cmbCharset; GtkToggleButton *chkKeepAlive; const gchar *newval; gchar *newfile; gchar *newcharset; GtkTreeIter iter; GtkToggleButton *chkIgnoreUpDown; cmbCharset = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbCharset")); chkKeepAlive = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkKeepAlive")); chkIgnoreUpDown = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkIgnoreUpDown")); if (world != default_world) { txtWorldFile = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtWorldFile")); newval = gtk_entry_get_text(txtWorldFile); if (strcmp(newval, "") == 0) { newfile = get_file_name_for_world(world->name); } else { newfile = g_strdup(newval); } if (!world->file || strcmp(world->file, newval) != 0) { g_free(world->file); world->file = newfile; *newworld = TRUE; } else { g_free(newfile); } } gtk_combo_box_get_active_iter(cmbCharset, &iter); gtk_tree_model_get(get_charsets_model(), &iter, 0, &newcharset, -1); if (!world->charset || strcmp(world->charset, newcharset) != 0) { g_free(world->charset); world->charset = newcharset; } else { g_free(newcharset); } world->charset_index = gtk_combo_box_get_active(cmbCharset); world->keep_alive = gtk_toggle_button_get_active(chkKeepAlive); world->ignore_up_down_keys = gtk_toggle_button_get_active(chkIgnoreUpDown); } void confirm_delete_changed_cb(GtkToggleButton *chkbox, gpointer data) { World *world = (World *) data; world->confirm_delete = gtk_toggle_button_get_active(chkbox); } void show_plugin_toggled_cb(GtkToggleButton *button, gpointer data) { World *world = (World *) data; world->show_plugin_items = gtk_toggle_button_get_active(button); gtk_tree_model_filter_refilter(world->trigger_model_filter); gtk_tree_model_filter_refilter(world->alias_model_filter); gtk_tree_model_filter_refilter(world->macro_model_filter); gtk_tree_model_filter_refilter(world->timer_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnConnect_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnDisconnect_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnReceivedText_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnSentCommand_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnGetFocus_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnLoseFocus_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnCloseConnected_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnServerData_model_filter); } static GtkTreeModel * get_charsets_model(void) { static GtkListStore *model = NULL; if (!model) { GtkTreeIter iter; int i; model = gtk_list_store_new(1, G_TYPE_STRING); i = 0; while (charsets[i]) { gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, charsets[i], -1); ++i; } } return GTK_TREE_MODEL(model); } static char * get_file_name_for_world(const char *name) { const char *kilddir; char file[PATH_MAX]; int i; int pos; int startpos; struct stat stinfo; kilddir = get_kildclient_directory_path(); /* +1 to start after the / that will be added later */ startpos = strlen(kilddir) + 1; i = 0; while (1) { sprintf(file, "%s/%s_%d.wrl", kilddir, name, i); /* Convert the name into something allowed in file names */ pos = startpos; while (file[pos]) { if (!isalnum(file[pos]) && file[pos] != '.' && file[pos] != '_') file[pos] = '_'; ++pos; } if (stat(file, &stinfo) == -1) break; ++i; } return (g_strdup(file)); } kildclient-3.0.0/src/we_general.c0000644000175000017500000004107712374460043013634 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static gboolean edit_char(World *world, GtkTreeModel *model, GtkTreeIter *iter); /* XML UI signals */ G_MODULE_EXPORT void we_general_add_edit_char_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void we_general_delete_char_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void we_general_move_char_cb(gpointer data, GtkWidget *widget); G_MODULE_EXPORT void we_general_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); G_MODULE_EXPORT gboolean we_general_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); GObject * get_we_general_tab(World *world, GtkBuilder *ui_builder) { GObject *panel; GtkTreeView *viewCharacters; GtkCellRenderer *renderer; GtkTreeViewColumn *column; panel = gtk_builder_get_object(ui_builder, "we_panel_general"); /* Configure view */ viewCharacters = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "viewCharacters")); gtk_tree_view_set_model(viewCharacters, world->logon_characters); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes(viewCharacters, 0, _("Character"), renderer, "text", LOGON_CHAR, NULL); renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "text", "******", NULL); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("Password")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_append_column(viewCharacters, column); return panel; } void fill_we_general_tab(World *world, GtkBuilder *ui_builder) { GtkEntry *txtName; GtkEntry *txtHost; GtkEntry *txtPort; GtkWidget *chkTLS; GtkComboBox *cmbProxyType; GtkEntry *txtProxyServer; GtkEntry *txtProxyPort; GtkEntry *txtProxyUser; GtkEntry *txtProxyPassword; GtkComboBox *cmbConnStyle; GObject *btnAdd; GObject *btnEdit; GObject *btnUp; GObject *btnDown; if (!world) { return; } txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtName")); txtHost = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtHost")); txtPort = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtPort")); chkTLS = GTK_WIDGET(gtk_builder_get_object(ui_builder, "chkTLS")); cmbProxyType = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbProxyType")); txtProxyServer = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyServer")); txtProxyPort = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyPort")); txtProxyUser = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyUser")); txtProxyPassword = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyPassword")); cmbConnStyle = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbConnStyle")); btnAdd = gtk_builder_get_object(ui_builder, "btnCharAdd"); btnEdit = gtk_builder_get_object(ui_builder, "btnCharEdit"); btnUp = gtk_builder_get_object(ui_builder, "btnCharUp"); btnDown = gtk_builder_get_object(ui_builder, "btnCharDown"); /* General connection settings */ if (world->name) { gtk_entry_set_text(txtName, world->name); } if (world->host) { gtk_entry_set_text(txtHost, world->host); } if (world->port) { gtk_entry_set_text(txtPort, world->port); } #ifdef HAVE_LIBGNUTLS gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chkTLS), world->use_tls); #else gtk_widget_destroy(chkTLS); #endif /* Proxy */ /* -1 is "global settings in enumeration */ gtk_combo_box_set_active(cmbProxyType, world->proxy.type + 1); if (world->proxy.server) { gtk_entry_set_text(txtProxyServer, world->proxy.server); } else { gtk_entry_set_text(txtProxyServer, ""); } if (world->proxy.port) { gtk_entry_set_text(txtProxyPort, world->proxy.port); } else { gtk_entry_set_text(txtProxyPort, ""); } if (world->proxy.user) { gtk_entry_set_text(txtProxyUser, world->proxy.user); } else { gtk_entry_set_text(txtProxyUser, ""); } if (world->proxy.password) { gtk_entry_set_text(txtProxyPassword, world->proxy.password); } else { gtk_entry_set_text(txtProxyPassword, ""); } /* Auto-login*/ gtk_combo_box_set_active(cmbConnStyle, world->connection_style); /* Information used in the callbacks */ g_object_set_data(btnAdd, "isnew", GINT_TO_POINTER(TRUE)); g_object_set_data(btnEdit, "isnew", GINT_TO_POINTER(FALSE)); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); } void update_we_general_parameters(World *world, GtkBuilder *ui_builder) { const gchar *newval; GtkEntry *txtName; GtkEntry *txtHost; GtkEntry *txtPort; GtkComboBox *cmbProxyType; GtkEntry *txtProxyServer; GtkEntry *txtProxyPort; GtkEntry *txtProxyUser; GtkEntry *txtProxyPassword; GtkComboBox *cmbConnStyle; #ifdef HAVE_LIBGNUTLS GtkToggleButton *chkTLS; #endif txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtName")); txtHost = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtHost")); txtPort = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtPort")); cmbProxyType = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbProxyType")); txtProxyServer = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyServer")); txtProxyPort = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyPort")); txtProxyUser = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyUser")); txtProxyPassword = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyPassword")); cmbConnStyle = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbConnStyle")); /* General settings */ newval = gtk_entry_get_text(txtName); if (!world->name || strcmp(world->name, newval) != 0) { g_free(world->name); world->name = g_strdup(newval); } newval = gtk_entry_get_text(txtHost); if (!world->host || strcmp(world->host, newval) != 0) { g_free(world->host); world->host = g_strdup(newval); } newval = gtk_entry_get_text(txtPort); if (!world->port || strcmp(world->port, newval) != 0) { g_free(world->port); world->port = g_strdup(newval); } /* Proxy */ /* -1 is "global settings" in enumeration */ world->proxy.type = gtk_combo_box_get_active(cmbProxyType) - 1; newval = gtk_entry_get_text(txtProxyServer); if (!world->proxy.server || strcmp(world->proxy.server, newval) != 0) { g_free(world->proxy.server); world->proxy.server = g_strdup(newval); } newval = gtk_entry_get_text(txtProxyPort); if (!world->proxy.port || strcmp(world->proxy.port, newval) != 0) { g_free(world->proxy.port); world->proxy.port = g_strdup(newval); } newval = gtk_entry_get_text(txtProxyUser); if (!world->proxy.user || strcmp(world->proxy.user, newval) != 0) { g_free(world->proxy.user); world->proxy.user = g_strdup(newval); } newval = gtk_entry_get_text(txtProxyPassword); if (!world->proxy.password || strcmp(world->proxy.password, newval) != 0) { g_free(world->proxy.password); world->proxy.password = g_strdup(newval); } /* Auto-logon */ world->connection_style = gtk_combo_box_get_active(cmbConnStyle); #ifdef HAVE_LIBGNUTLS chkTLS = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTLS")); world->use_tls = gtk_toggle_button_get_active(chkTLS); #endif } void we_general_add_edit_char_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; gboolean is_new; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; view = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "viewCharacters")); model = gtk_tree_view_get_model(view); is_new = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "isnew")); if (is_new) { gtk_list_store_append(GTK_LIST_STORE(model), &iter); } else { selection = gtk_tree_view_get_selection(view); if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) { return; } } if (!edit_char(world, model, &iter) && is_new) { gtk_list_store_remove(GTK_LIST_STORE(model), &iter); } } void we_general_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { edit_char(world, model, &iter); } } static gboolean edit_char(World *world, GtkTreeModel *model, GtkTreeIter *iter) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditChar", NULL }; GError *error = NULL; GtkWidget *dlgEditChar; GtkEntry *txtName; GtkEntry *txtPassword; gchar *name = NULL; gchar *password = NULL; const gchar *newname; const gchar *newpassword; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return FALSE; } dlgEditChar = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditChar")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditChar), GTK_RESPONSE_OK); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtCharName")); txtPassword = GTK_ENTRY( gtk_builder_get_object(ui_builder, "txtCharPassword")); /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ gtk_tree_model_get(model, iter, LOGON_CHAR, &name, LOGON_PASS, &password, -1); if (name) { gtk_entry_set_text(txtName, name); g_free(name); } if (password) { gtk_entry_set_text(txtPassword, password); g_free(password); } /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditChar); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditChar)) == GTK_RESPONSE_OK) { /* Validate */ newname = gtk_entry_get_text(txtName); if (strcmp(newname, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditChar), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the name.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } newpassword = gtk_entry_get_text(txtPassword); if (strcmp(newpassword, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditChar), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the password.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* Update values */ gtk_list_store_set(GTK_LIST_STORE(model), iter, LOGON_CHAR, newname, LOGON_PASS, newpassword, -1); /* We've finished successfully */ gtk_widget_destroy(dlgEditChar); return TRUE; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditChar); return FALSE; } } } void we_general_delete_char_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; view = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "viewCharacters")); selection = gtk_tree_view_get_selection(view); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { GtkWidget *msgdlg; msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(world->dlgEditWorld), 1, _("character"), ""); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { gtk_list_store_remove(GTK_LIST_STORE(model), &iter); } gtk_widget_destroy(msgdlg); } } gboolean we_general_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_KEY_Delete || evt->keyval == GDK_KEY_KP_Delete) { we_general_delete_char_cb(widget, data); return TRUE; } return FALSE; } void we_general_move_char_cb(gpointer data, GtkWidget *widget) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; GtkTreeIter other_iter; gboolean is_up; view = (GtkTreeView *) data; selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "isup")); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { if (is_up) { GtkTreePath *path; path = gtk_tree_model_get_path(model, &iter); if (gtk_tree_path_prev(path)) { gtk_tree_model_get_iter(model, &other_iter, path); gtk_list_store_swap(GTK_LIST_STORE(model), &iter, &other_iter); } gtk_tree_path_free(path); } else { other_iter = iter; if (gtk_tree_model_iter_next(model, &other_iter)) { gtk_list_store_swap(GTK_LIST_STORE(model), &iter, &other_iter); } } } } kildclient-3.0.0/src/Makefile.am0000644000175000017500000000452712374460043013413 00000000000000bin_PROGRAMS = kildclient kildclient_SOURCES = main.c \ net.c \ telnet.c \ proxy.c \ mainwindow.c \ worldgui.c \ mainthread_operations.c \ process_line_thread.c \ ansiparse_thread.c \ ansitextview.c \ worldselector.c \ worlds.c \ worldeditor.c \ we_general.c \ we_mainwindow.c \ we_colors.c \ we_statusbar.c \ we_input.c \ we_logging.c \ we_scripting.c \ we_plugins.c \ we_generic_guied.c \ we_triggers.c \ we_aliases.c \ we_macros.c \ we_timers.c \ we_hooks.c \ we_vars.c \ we_protocols.c \ we_misc.c \ we_advanced.c \ prefs.c \ parser.c \ triggers.c \ aliases.c \ macros.c \ timers.c \ permanentvariables.c \ hooks.c \ log.c \ plugins.c \ multilinesend.c \ cmdhistory.c \ sound.c \ perlscript.c \ kcwin.c \ simocombobox.c \ kcircularqueue.c \ wresources.rc noinst_HEADERS = kildclient.h \ net.h \ ansi.h \ perlscript.h \ libintl-wrapper.h \ simocombobox.h \ kcircularqueue.h pkgdata_DATA = kildclient.ui \ wndmain.ui \ dlgSelectWorld.ui \ dlgPreferences.ui \ dlgStatistics.ui \ dlgAbout.ui \ dlgEditWorld.ui \ dlgTestTriggers.ui \ dlgMLSend.ui \ dlgCmdHistory.ui \ mnuPopupURL.ui uifiles = kildclient.ui \ wndmain.ui \ dlgSelectWorld.ui \ dlgPreferences.ui \ dlgStatistics.ui \ dlgAbout.ui \ dlgEditWorld.ui \ dlgTestTriggers.ui \ dlgMLSend.ui \ dlgCmdHistory.ui \ mnuPopupURL.ui EXTRA_DIST = $(pkgdata_DATA) $(uifiles) pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html localedir = $(datadir)/locale kildclient_LDADD = $(GTK_LIBS) $(KILDCLIENT_PERL_LIBS) $(GTKSPELL_LIBS) $(LIBGNUTLS_LIBS) $(INTLLIBS) -lz kildclient_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" \ -DPKGDATADIR=\"$(pkgdatadir)\" \ -DSYSDATADIR=\"$(datadir)\" \ -DMANUALDIR=\"$(manualdir)\" \ -DG_LOG_DOMAIN=\"kildclient\" \ $(GTK_CFLAGS) $(KILDCLIENT_PERL_CFLAGS) $(GTKSPELL_CFLAGS) $(LIBGNUTLS_CFLAGS) .rc.o: @RES_COMPILE@ kildclient-3.0.0/src/worldeditor.c0000644000175000017500000003740112374460043014056 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "libintl-wrapper.h" #include #include "kildclient.h" #include "perlscript.h" /******************** * Type definitions * ********************/ enum { COLUMN_NAME, COLUMN_WIDGET, N_COLUMNS, }; /*********************** * Function prototypes * ***********************/ static GtkWidget *create_edit_world_dialog(World *world, GtkWindow *parent); static GtkTreeStore *create_model(GtkNotebook *notebook, World *world, GtkBuilder *ui_builder); static void list_selection_changed_cb(GtkTreeSelection *selection, gpointer data); static GtkWidget *new_descriptive_panel(const char *title, const char *message); /* XML UI signals */ G_MODULE_EXPORT void world_editor_response_cb(GtkWidget *dialog, gint response, gpointer data); /************************* * File global variables * *************************/ gboolean edit_world(World **world, GtkWindow *parent, gboolean *newworld, gboolean modal) { int response; *newworld = FALSE; if (!*world) { *world = create_new_world(TRUE); } if (!((*world)->dlgEditWorld)) { (*world)->dlgEditWorld = create_edit_world_dialog(*world, parent); gtk_widget_show_all((*world)->dlgEditWorld); } g_object_set_data(G_OBJECT((*world)->dlgEditWorld), "newworldptr", newworld); gtk_window_present(GTK_WINDOW((*world)->dlgEditWorld)); if (modal) { response = gtk_dialog_run(GTK_DIALOG((*world)->dlgEditWorld)); gtk_widget_destroy((*world)->dlgEditWorld); (*world)->dlgEditWorld = NULL; g_object_unref((*world)->ui_builder); (*world)->ui_builder = NULL; return (response == GTK_RESPONSE_OK); } return TRUE; } void world_editor_response_cb(GtkWidget *dialog, gint response, gpointer data) { World *world = (World *) data; GtkBuilder *ui_builder; gboolean *newworld; ui_builder = world->ui_builder; if (response == GTK_RESPONSE_OK) { if (world != default_world) { update_we_general_parameters(world, ui_builder); } update_we_input_parameters(world, ui_builder); update_we_logging_parameters(world, ui_builder); if (world != default_world) { update_we_scripting_parameters(world, ui_builder); } update_we_protocols_parameters(world, ui_builder); update_we_misc_parameters(world, ui_builder); newworld = g_object_get_data(G_OBJECT(dialog), "newworldptr"); update_we_advanced_parameters(world, newworld, ui_builder); /* In case the name or display name was changed, we must update the tab */ if (world->gui) { prepare_display_name(world); if (world->has_unread_text) { gtk_label_set_text(world->gui->lblNotebook, world->new_text_name); } else { gtk_label_set_text(world->gui->lblNotebook, world->display_name); } /* The window title gets update automatically because when the world editor is closed, the main window gets focus. */ } } else { /* Revert parameters that might have been changed */ if (world != default_world) { fill_we_general_tab(world, ui_builder); } fill_we_input_tab(world, ui_builder); fill_we_logging_tab(world, ui_builder); if (world != default_world) { fill_we_scripting_tab(world, ui_builder); } fill_we_protocols_tab(world, ui_builder); fill_we_misc_tab(world, ui_builder); fill_we_advanced_tab(world, ui_builder); } gtk_widget_hide(dialog); } static GtkWidget * create_edit_world_dialog(World *world, GtkWindow *parent) { GError *error = NULL; GtkWidget *dlgEditWorld; GtkTreeView *treeView; GtkNotebook *notebook; GtkTreeStore *model; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeSelection *selection; GtkTreeIter iter; /* Create the dialog */ if (!world->ui_builder) { world->ui_builder = gtk_builder_new(); } if (!gtk_builder_add_from_file(world->ui_builder, get_kildclient_installed_file("dlgEditWorld.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } dlgEditWorld = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "dlgEditWorld")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditWorld), GTK_RESPONSE_OK); notebook = GTK_NOTEBOOK(gtk_builder_get_object(world->ui_builder, "ntbkWEPanel")); gtk_notebook_set_show_tabs(notebook, FALSE); model = create_model(notebook, world, world->ui_builder); g_object_set_data(G_OBJECT(model), "notebookptr", notebook); treeView = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "treeViewWE")); gtk_tree_view_set_model(treeView, GTK_TREE_MODEL(model)); g_object_unref(G_OBJECT(model)); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(NULL, renderer, "text", COLUMN_NAME, NULL); gtk_tree_view_append_column(treeView, column); gtk_tree_view_set_headers_visible(treeView, FALSE); selection = gtk_tree_view_get_selection(treeView); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(list_selection_changed_cb), treeView); gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter); gtk_tree_selection_select_iter(selection, &iter); gtk_builder_connect_signals(world->ui_builder, world); return dlgEditWorld; } static GtkTreeStore * create_model(GtkNotebook *notebook, World *world, GtkBuilder *ui_builder) { GtkTreeStore *model; GObject *panel; GtkWidget *display_panel; GtkTreeIter iter; GtkTreeIter iterDisplay; GtkTreeIter iterAutomation; model = gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_POINTER); panel = get_we_general_tab(world, ui_builder); if (world != default_world) { gtk_tree_store_append(model, &iter, NULL); fill_we_general_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("General"), COLUMN_WIDGET, panel, -1); } else { gtk_widget_destroy(GTK_WIDGET(panel)); } gtk_tree_store_append(model, &iterDisplay, NULL); display_panel = new_descriptive_panel(_("Display"), _("Here you can set options to configure the appearance of KildClient.")); gtk_notebook_append_page(notebook, display_panel, NULL); gtk_tree_store_set(model, &iterDisplay, COLUMN_NAME, _("Display"), COLUMN_WIDGET, display_panel, -1); gtk_tree_store_append(model, &iter, &iterDisplay); panel = get_we_mainwindow_tab(ui_builder); fill_we_mainwindow_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Main Window"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterDisplay); panel = get_we_colors_tab(world, ui_builder); /* Colors is filled in automatically */ gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Colors"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterDisplay); panel = get_we_statusbar_tab(ui_builder); fill_we_statusbar_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Status Bar"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, NULL); panel = get_we_input_tab(ui_builder); fill_we_input_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Input"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, NULL); panel = get_we_logging_tab(ui_builder, world); fill_we_logging_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Logging"), COLUMN_WIDGET, panel, -1); if (world != default_world) { gtk_tree_store_append(model, &iterAutomation, NULL); display_panel = new_descriptive_panel(_("Automation"), _("Here you can set options to configure the automation features of KildClient, such as triggers, aliases, plugins, etc.")); gtk_notebook_append_page(notebook, display_panel, NULL); gtk_tree_store_set(model, &iterAutomation, COLUMN_NAME, _("Automation"), COLUMN_WIDGET, display_panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_scripting_tab(ui_builder); fill_we_scripting_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Scripting"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_plugins_tab(ui_builder, world); fill_we_scripting_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Plugins"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_triggers_tab(world); gtk_notebook_append_page(notebook, GTK_WIDGET(panel), NULL); /* Let the notebook own the panel, removing the ref added when it was created. */ g_object_unref(panel); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Triggers"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_aliases_tab(world); gtk_notebook_append_page(notebook, GTK_WIDGET(panel), NULL); /* Let the notebook own the panel, removing the ref added when it was created. */ g_object_unref(panel); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Aliases"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_macros_tab(world); gtk_notebook_append_page(notebook, GTK_WIDGET(panel), NULL); /* Let the notebook own the panel, removing the ref added when it was created. */ g_object_unref(panel); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Macros"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_timers_tab(world); gtk_notebook_append_page(notebook, GTK_WIDGET(panel), NULL); /* Let the notebook own the panel, removing the ref added when it was created. */ g_object_unref(panel); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Timers"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_hooks_tab(world); gtk_notebook_append_page(notebook, GTK_WIDGET(panel), NULL); /* Let the notebook own the panel, removing the ref added when it was created. */ g_object_unref(panel); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Hooks"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_vars_tab(world); gtk_notebook_append_page(notebook, GTK_WIDGET(panel), NULL); /* Let the notebook own the panel, removing the ref added when it was created. */ g_object_unref(panel); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Variables"), COLUMN_WIDGET, panel, -1); } gtk_tree_store_append(model, &iter, NULL); panel = get_we_protocols_tab(ui_builder); fill_we_protocols_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Protocols"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, NULL); panel = get_we_misc_tab(ui_builder); fill_we_misc_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Miscellaneous"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, NULL); panel = get_we_advanced_tab(world, ui_builder); fill_we_advanced_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Advanced"), COLUMN_WIDGET, panel, -1); return model; } static void list_selection_changed_cb(GtkTreeSelection *selection, gpointer data) { GtkTreeModel *model; GtkTreeIter iter; GtkWidget *notebook; if (gtk_tree_selection_get_selected(selection, &model, &iter)) { GtkTreePath *path; GtkWidget *panel; int pageNum; notebook = g_object_get_data(G_OBJECT(model), "notebookptr"); path = gtk_tree_model_get_path(model, &iter); gtk_tree_view_expand_row(GTK_TREE_VIEW(data), path, FALSE); gtk_tree_path_free(path); gtk_tree_model_get(model, &iter, COLUMN_WIDGET, &panel, -1); pageNum = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), panel); gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), pageNum); } } static GtkWidget * new_descriptive_panel(const char *title, const char *message) { GtkWidget *vbox; GtkWidget *label; gchar *temp; vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); temp = g_strdup_printf("%s", title); label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), temp); g_free(temp); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 8); label = gtk_label_new(message); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); return vbox; } kildclient-3.0.0/src/we_scripting.c0000644000175000017500000000435712374460043014221 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ /************************* * File global variables * *************************/ GObject * get_we_scripting_tab(GtkBuilder *ui_builder) { GObject *panel; panel = gtk_builder_get_object(ui_builder, "we_panel_scripting"); return panel; } void fill_we_scripting_tab(World *world, GtkBuilder *ui_builder) { GtkFileChooser *txtScriptFile; if (!world) { return; } txtScriptFile = GTK_FILE_CHOOSER(gtk_builder_get_object(ui_builder, "txtScriptFile")); if (world->scriptfile) { gtk_file_chooser_set_filename(txtScriptFile, world->scriptfile); } } void update_we_scripting_parameters(World *world, GtkBuilder *ui_builder) { GtkFileChooser *txtScriptFile; gchar *newval; txtScriptFile = GTK_FILE_CHOOSER(gtk_builder_get_object(ui_builder, "txtScriptFile")); newval = gtk_file_chooser_get_filename(txtScriptFile); if (!newval) { g_free(world->scriptfile); world->scriptfile = NULL; } else if (!world->scriptfile || strcmp(world->scriptfile, newval) != 0) { g_free(world->scriptfile); world->scriptfile = g_strdup(newval); } g_free(newval); } kildclient-3.0.0/src/worldselector.c0000644000175000017500000006140612374460043014412 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #ifndef __WIN32__ # include #else # include #endif #include "libintl-wrapper.h" #include #include "kildclient.h" #include "perlscript.h" /******************** * Type definitions * ********************/ enum { COLUMN_NAME, COLUMN_FILE, COLUMN_INDEX, N_COLUMNS, }; /************************* * File global variables * *************************/ GtkWidget *dlgSelectWorld; GtkToggleButton *radManually; GtkEntry *txtHost; GtkEntry *txtPort; GtkTreeView *lstWorlds; /*********************** * Function prototypes * ***********************/ static GtkWidget *create_world_selector_dlg(GtkWindow* parent); static GtkTreeStore *create_saved_worlds_model(GtkTreeIter **last_open_iter); static void fill_saved_worlds_model(GtkTreeStore *model, GtkTreeIter **last_open_iter); static void add_saved_worlds_model_entry_from_file(GtkTreeStore *model, const gchar *file, GtkTreeIter **last_open_iter); static void add_saved_worlds_model_entries(GtkTreeStore *model, World *world, GtkTreeIter *worlditer); static gint sort_by_name(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data); static char *try_find_world_from_name(const gchar *name); static char *compare_world_from_name(const gchar *file, const gchar *name); static void list_selection_changed_cb(GtkTreeSelection *selection, gpointer data); static void add_edit_buttons_cb(GtkButton *btn, gpointer data); /* XML UI signals */ G_MODULE_EXPORT void set_manually_cb(GtkEditable *widget, gpointer user); G_MODULE_EXPORT void list_row_activated_cb(gpointer data, GtkTreeView *treeview, GtkTreePath *treepath, GtkTreeViewColumn *column); G_MODULE_EXPORT void delete_button_cb(GtkButton *btn, gpointer data); World * get_world_to_connect() { GtkWidget *dlgWorldSelector; World *world = NULL; gboolean success; dlgWorldSelector = create_world_selector_dlg(GTK_WINDOW(wndMain)); gtk_widget_show_all(dlgWorldSelector); success = FALSE; while (!success) { if (gtk_dialog_run(GTK_DIALOG(dlgWorldSelector)) == GTK_RESPONSE_OK) { world = create_new_world(TRUE); world->connected = FALSE; if (gtk_toggle_button_get_active(radManually)) { create_world_from_parameters(world, g_strdup(gtk_entry_get_text(txtHost)), g_strdup(gtk_entry_get_text(txtPort)), NULL, NULL); success = TRUE; } else { GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; selection = gtk_tree_view_get_selection(lstWorlds); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { char *file; gint charidx; GError *error = NULL; gtk_tree_model_get(model, &iter, COLUMN_FILE, &file, COLUMN_INDEX, &charidx, -1); success = load_world_from_file(file, world, FALSE, &error); if (!success) { GtkWidget *msgdlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not load world from file '%s': %s"), file, error->message); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); free_world(world); world = NULL; } else { if (charidx == -1) { world->character_used = NULL; } else { GtkTreePath *path; GtkTreeRowReference *ref; path = gtk_tree_path_new_from_indices(charidx, -1); ref = gtk_tree_row_reference_new(world->logon_characters, path); world->character_used = ref; gtk_tree_path_free(path); } } } } } else { /* Response was not OK */ /* Considered successful, returns NULL and the application quits */ success = TRUE; } } gtk_widget_destroy(dlgWorldSelector); return world; } static GtkWidget* create_world_selector_dlg(GtkWindow* parent) { GtkBuilder *ui_builder; GError *error = NULL; GObject *radFromList; GObject *btnNew; GObject *btnEdit; GtkTreeStore *model; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeSelection *selection; GtkTreeIter *last_open_iter = NULL; ui_builder = gtk_builder_new(); if (!gtk_builder_add_from_file(ui_builder, get_kildclient_installed_file("dlgSelectWorld.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); exit(1); /* No point in continuing */ } dlgSelectWorld = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgSelectWorld")); gtk_window_set_transient_for(GTK_WINDOW(dlgSelectWorld), parent); gtk_dialog_set_default_response(GTK_DIALOG(dlgSelectWorld), GTK_RESPONSE_OK); /* Set global variables pointing to widgets */ radFromList = gtk_builder_get_object(ui_builder, "radFromList"); radManually = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radManually")); txtHost = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtHost")); txtPort = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtPort")); /* Prepare TreeView with the Worlds */ model = create_saved_worlds_model(&last_open_iter); lstWorlds = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "lstWorlds")); gtk_tree_view_set_model(lstWorlds, GTK_TREE_MODEL(model)); g_object_unref(G_OBJECT(model)); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(NULL, renderer, "text", COLUMN_NAME, NULL); gtk_tree_view_append_column(lstWorlds, column); /* Pre select last used world */ selection = gtk_tree_view_get_selection(lstWorlds); if (last_open_iter) { GtkTreePath *path; gtk_tree_selection_select_iter(selection, last_open_iter); path = gtk_tree_model_get_path(GTK_TREE_MODEL(model), last_open_iter); gtk_tree_view_scroll_to_cell(lstWorlds, path, NULL, FALSE, 0, 0); gtk_tree_path_free(path); } /* Connect signals that can't be specified in the XML UI file */ g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(list_selection_changed_cb), radFromList); btnNew = gtk_builder_get_object(ui_builder, "btnNew"); g_signal_connect(btnNew, "clicked", G_CALLBACK(add_edit_buttons_cb), GINT_TO_POINTER(0)); btnEdit = gtk_builder_get_object(ui_builder, "btnEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(add_edit_buttons_cb), GINT_TO_POINTER(1)); gtk_builder_connect_signals(ui_builder, NULL); g_object_unref(ui_builder); return dlgSelectWorld; } static GtkTreeStore * create_saved_worlds_model(GtkTreeIter **last_open_iter) { GtkTreeStore *model; GtkTreeSortable *sortable; model = gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT); fill_saved_worlds_model(model, last_open_iter); /* Sort the list */ sortable = GTK_TREE_SORTABLE(model); gtk_tree_sortable_set_sort_func(sortable, COLUMN_NAME, sort_by_name, NULL, NULL); gtk_tree_sortable_set_sort_column_id(sortable, COLUMN_NAME, GTK_SORT_ASCENDING); return model; } #ifndef __WIN32__ static void fill_saved_worlds_model(GtkTreeStore *model, GtkTreeIter **last_open_iter) { const char *kilddir; char *globstr; glob_t globbuf; kilddir = get_kildclient_directory_path();; globstr = g_strdup_printf("%s/*.wrl", kilddir); if (glob(globstr, GLOB_ERR | GLOB_NOSORT, 0, &globbuf) == 0 && globbuf.gl_pathc) { char *file; while ((file = *globbuf.gl_pathv++)) { add_saved_worlds_model_entry_from_file(model, file, last_open_iter); } } g_free(globstr); /* globfree(&globbuf); */ } #else static void fill_saved_worlds_model(GtkTreeStore *model, GtkTreeIter **last_open_iter) { const char *kilddir; char *globstr; char *file; WIN32_FIND_DATA FindFileData; HANDLE hFind = INVALID_HANDLE_VALUE; /* Mental note: Find{First,Next}File only return the file name, without path. Windows sucks. */ kilddir = get_kildclient_directory_path(); globstr = g_strdup_printf("%s\\*.wrl", kilddir); hFind = FindFirstFile(globstr, &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { file = g_strdup_printf("%s\\%s", kilddir, FindFileData.cFileName); add_saved_worlds_model_entry_from_file(model, file, last_open_iter); g_free(file); while (FindNextFile(hFind, &FindFileData)) { file = g_strdup_printf("%s\\%s", kilddir, FindFileData.cFileName); add_saved_worlds_model_entry_from_file(model, file, last_open_iter); g_free(file); } FindClose(hFind); } g_free(globstr); } #endif static void add_saved_worlds_model_entry_from_file(GtkTreeStore *model, const gchar *file, GtkTreeIter **last_open_iter) { GtkTreeIter worlditer; World *world; GError *error = NULL; /* We do not call create_new_world because we don't care about the default parameters, we only want the name and file */ world = g_new0(World, 1); world->logon_characters = GTK_TREE_MODEL(gtk_list_store_new(N_LOGON_COLUMNS, G_TYPE_STRING, G_TYPE_STRING)); if (!load_world_from_file(file, world, TRUE, &error)) { fprintf(stderr, "Error loading %s: %s\n", file, error->message); return; } add_saved_worlds_model_entries(model, world, &worlditer); /* See if this was the last opened world */ if (!(*last_open_iter) && globalPrefs.last_open_world && strcmp(world->name, globalPrefs.last_open_world) == 0) { *last_open_iter = g_new(GtkTreeIter, 1); **last_open_iter = worlditer; } g_free(world->name); g_free(world->file); g_object_unref(world->logon_characters); g_free(world); } static void add_saved_worlds_model_entries(GtkTreeStore *model, World *world, GtkTreeIter *worlditer) { /* Fills worlditer with the iter pointing to the world. */ gint n_chars; n_chars = gtk_tree_model_iter_n_children(world->logon_characters, NULL); /* Add world main entry */ gtk_tree_store_append(model, worlditer, NULL); gtk_tree_store_set(model, worlditer, COLUMN_NAME, world->name, COLUMN_FILE, world->file, COLUMN_INDEX, n_chars ? 0 : -1, -1); /* Add sub-entries for each of the characters */ if (n_chars > 0) { GtkTreeIter chariter; GtkTreeIter subworlditer; gint idx; gtk_tree_model_get_iter_first(world->logon_characters, &chariter); idx = 0; do { gchar *character; gtk_tree_model_get(world->logon_characters, &chariter, LOGON_CHAR, &character, -1); gtk_tree_store_append(model, &subworlditer, worlditer); gtk_tree_store_set(model, &subworlditer, COLUMN_NAME, character, COLUMN_FILE, world->file, COLUMN_INDEX, idx, -1); g_free(character); ++idx; } while (gtk_tree_model_iter_next(world->logon_characters, &chariter)); /* Add an entry for logging without Auto-logon */ gtk_tree_store_append(model, &subworlditer, worlditer); gtk_tree_store_set(model, &subworlditer, COLUMN_NAME, "No auto-login", COLUMN_FILE, world->file, COLUMN_INDEX, -1, -1); } } static gint sort_by_name(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data) { GtkTreePath *path_a; GtkTreePath *path_b; gchar *name_a; gchar *name_b; gint ret; path_a = gtk_tree_model_get_path(model, a); path_b = gtk_tree_model_get_path(model, b); /* The check to see if path_a and path_b are not NULL is done to avoid a Gtk Warning that appears when we add something to a model already sorted. This might be a Gtk bug. */ /* Only top-level entries are sorted */ if (path_a && path_b && gtk_tree_path_get_depth(path_a) > 1) { ret = gtk_tree_path_compare(path_a, path_b); } else { gtk_tree_model_get(model, a, COLUMN_NAME, &name_a, -1); gtk_tree_model_get(model, b, COLUMN_NAME, &name_b, -1); ret = g_utf8_collate(name_a, name_b); g_free(name_a); g_free(name_b); } gtk_tree_path_free(path_a); gtk_tree_path_free(path_b); return ret; } World * get_world_from_cmdline(const gchar *cmdline) { gchar *world_file; World *world = NULL; static GRegex *parameters_regex = NULL; world_file = try_find_world_from_name(cmdline); if (world_file) { GError *error = NULL; world = create_new_world(TRUE); if (load_world_from_file(world_file, world, FALSE, &error)) { g_free(world_file); } else { g_free(world_file); fprintf(stderr, _("Could not open world '%s': %s\n"), cmdline, error->message); free_world(world); } } else { GMatchInfo *matchinfo; gchar *host; gchar *port; gchar *user; gchar *password; GError *error; if (parameters_regex == NULL) { parameters_regex = g_regex_new( "^(telnet://)?" "((?[a-zA-Z0-9_.+$!*'()\"-]+)" ":(?[a-zA-Z0-9_.+$!*'()\"-]+)" "@)?" "(?[a-zA-Z0-9.-]+)" "(:(?\\d+))?" "/?$", G_REGEX_NO_AUTO_CAPTURE, 0, &error); if (error) { fputs(error->message, stderr); } } if (g_regex_match(parameters_regex, cmdline, 0, &matchinfo)) { host = g_match_info_fetch_named(matchinfo, "host"); port = g_match_info_fetch_named(matchinfo, "port"); user = g_match_info_fetch_named(matchinfo, "user"); password = g_match_info_fetch_named(matchinfo, "password"); g_match_info_free(matchinfo); world = create_new_world(TRUE); create_world_from_parameters(world, host, port, user, password); } else { g_match_info_free(matchinfo); fprintf(stderr, _("Invalid argument '%s'\n"), cmdline); } } return world; } #ifndef __WIN32__ static char * try_find_world_from_name(const gchar *name) { const gchar *kilddir; gchar *globstr; glob_t globbuf; char *result = NULL; kilddir = get_kildclient_directory_path(); globstr = g_strdup_printf("%s/*.wrl", kilddir); if (glob(globstr, GLOB_ERR | GLOB_NOSORT, 0, &globbuf) == 0 && globbuf.gl_pathc) { char *file; while (!result && (file = *globbuf.gl_pathv++)) { result = compare_world_from_name(file, name); } } g_free(globstr); /* globfree(&globbuf); */ return result; } #else static char * try_find_world_from_name(const gchar *name) { const gchar *kilddir; gchar *globstr; gchar *file; WIN32_FIND_DATA FindFileData; HANDLE hFind = INVALID_HANDLE_VALUE; char *result = NULL; kilddir = get_kildclient_directory_path(); globstr = g_strdup_printf("%s\\*.wrl", kilddir); hFind = FindFirstFile(globstr, &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { file = g_strdup_printf("%s\\%s", kilddir, FindFileData.cFileName); result = compare_world_from_name(file, name); g_free(file); while (!result && FindNextFile(hFind, &FindFileData)) { file = g_strdup_printf("%s\\%s", kilddir, FindFileData.cFileName); result = compare_world_from_name(file, name); g_free(file); } FindClose(hFind); } g_free(globstr); return result; } #endif static char * compare_world_from_name(const gchar *file, const gchar *name) { /* We do not call create_new_world because we don't care about the default parameters, we only want the name and file */ World *world = g_new0(World, 1); char *result = NULL; if (load_world_from_file(file, world, TRUE, NULL)) { if (strcmp(world->name, name) == 0) { result = world->file; } else { g_free(world->file); } g_free(world->name); g_free(world); } return result; } void set_manually_cb(GtkEditable *widget, gpointer user) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radManually), TRUE); } static void list_selection_changed_cb(GtkTreeSelection *selection, gpointer data) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data), TRUE); } void list_row_activated_cb(gpointer data, GtkTreeView *treeview, GtkTreePath *treepath, GtkTreeViewColumn *column) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data), TRUE); gtk_dialog_response(GTK_DIALOG(dlgSelectWorld), GTK_RESPONSE_OK); } static void add_edit_buttons_cb(GtkButton *btn, gpointer data) { World *world = NULL; GtkTreeIter iter; GtkTreeModel *model; gboolean newworld; if (GPOINTER_TO_INT(data)) { GtkTreeSelection *selection; char *file; GError *error = NULL; selection = gtk_tree_view_get_selection(lstWorlds); if (!gtk_tree_selection_get_selected(selection, &model, &iter)) return; gtk_tree_model_get(model, &iter, COLUMN_FILE, &file, -1); world = create_new_world(FALSE); if (!load_world_from_file(file, world, FALSE, &error)) { GtkWidget *msgdlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not load world from file '%s': %s"), file, error->message); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); g_free(world); return; } make_startup_plugin_list_for_editing(world); } else { model = gtk_tree_view_get_model(lstWorlds); } if (edit_world(&world, GTK_WINDOW(dlgSelectWorld), &newworld, TRUE)) { GtkTreeIter worlditer; save_world_to_file(world); /* Remove entry, because it will be added again. */ if (!newworld) { GtkTreeIter parent; GtkTreeIter child; if (!gtk_tree_model_iter_parent(model, &parent, &iter)) { parent = iter; } /* Remove the children */ if (gtk_tree_model_iter_children(model, &child, &parent)) { while (gtk_tree_store_remove(GTK_TREE_STORE(model), &child)) ; } gtk_tree_store_remove(GTK_TREE_STORE(model), &parent); } add_saved_worlds_model_entries(GTK_TREE_STORE(model), world, &worlditer); } free_world(world); } void delete_button_cb(GtkButton *btn, gpointer data) { GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; GtkTreeIter parent; char *name; char *file; GtkWidget *msgdlg; gchar *msg; selection = gtk_tree_view_get_selection(lstWorlds); if (!gtk_tree_selection_get_selected(selection, &model, &iter)) return; /* Make sure we point to the parent */ if (!gtk_tree_model_iter_parent(model, &parent, &iter)) { parent = iter; } gtk_tree_model_get(model, &parent, COLUMN_NAME, &name, COLUMN_FILE, &file, -1); msg = g_strdup_printf("world '%s'", name); msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(wndMain), 1, msg, ""); g_free(msg); if (gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GtkTreeIter child; char *otherfile; unlink(file); /* four characters for the dot and extension, 1 for null terminator */ otherfile = malloc(strlen(file) + 5); strcpy(otherfile, file); strcat(otherfile, ".hst"); unlink(otherfile); strcpy(otherfile, file); strcat(otherfile, ".var"); unlink(otherfile); g_free(otherfile); /* Remove the children */ if (gtk_tree_model_iter_children(model, &child, &parent)) { while (gtk_tree_store_remove(GTK_TREE_STORE(model), &child)) ; } gtk_tree_store_remove(GTK_TREE_STORE(model), &parent); } gtk_widget_destroy(msgdlg); g_free(file); } gint disconnected_msgbox(gchar *msg, gboolean can_offline) { gint resp; GtkWidget *dlg; dlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, "%s", msg); gtk_window_set_title(GTK_WINDOW(dlg), _("Disconnected")); if (can_offline) { gtk_dialog_add_buttons(GTK_DIALOG(dlg), _("Reconnect"), RESP_RECONNECT, _("Connect to another world"), RESP_OTHER, _("Offline"), RESP_OFFLINE, _("_Close"),GTK_RESPONSE_CLOSE, NULL); } else { gtk_dialog_add_buttons(GTK_DIALOG(dlg), _("Reconnect"), RESP_RECONNECT, _("Connect to another world"), RESP_OTHER, _("_Close"), GTK_RESPONSE_CLOSE, NULL); } gtk_widget_show_all(dlg); resp = gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); return resp; } kildclient-3.0.0/src/multilinesend.c0000644000175000017500000003447712374460043014406 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkWidget *create_multi_line_send_dialog(GtkWindow *parent, World *world); static gboolean multi_line_send_timer_cb(gpointer data); static gchar *get_text_buffer_line(GtkTextBuffer *buffer, int line, int nlines, gboolean *last); static gchar *get_file_line(FILE *fp, gboolean *last); static void send_line(gchar *line, MLSendData *context); static void string_free(gpointer string, gpointer user_data); /* XML UI signals */ G_MODULE_EXPORT void multi_line_send_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void start_multi_line_send_cb(GtkButton *btn, gpointer data); G_MODULE_EXPORT void clear_multi_line_send_dialog_cb(GtkWidget *widget, gpointer data); void multi_line_send_cb(GtkMenuItem *widget, gpointer data) { if (!currentWorld->dlgMLSend) { currentWorld->dlgMLSend = create_multi_line_send_dialog(GTK_WINDOW(wndMain), currentWorld); } gtk_widget_show_all(currentWorld->dlgMLSend); gtk_window_present(GTK_WINDOW(currentWorld->dlgMLSend)); } static GtkWidget * create_multi_line_send_dialog(GtkWindow *parent, World *world) { GError *error = NULL; GtkWidget *dlg; GtkWidget *text; GtkWidget *txtInitial; GtkSpinButton *spnDelay; GtkSpinButton *spnLinesATime; PangoFontDescription *fontDesc; PangoLayout *layout; gint char_width; PangoRectangle logical_rect; GtkRequisition requisition; /* Create the dialog */ if (!world->ui_builder) { world->ui_builder = gtk_builder_new(); } if (!gtk_builder_add_from_file(world->ui_builder, get_kildclient_installed_file("dlgMLSend.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } dlg = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "dlgMLSend")); /* Set the fonts */ fontDesc = pango_font_description_from_string(world->entryfont); txtInitial = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtInitial")); gtk_widget_override_font(txtInitial, fontDesc); text = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtFinal")); gtk_widget_override_font(text, fontDesc); text = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtStart")); gtk_widget_override_font(text, fontDesc); text = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtEnd")); gtk_widget_override_font(text, fontDesc); pango_font_description_free(fontDesc); /* Default values */ spnDelay = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnMLSDelay")); gtk_spin_button_set_value(spnDelay, globalPrefs.multi_cmd_delay); spnLinesATime = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnLinesATime")); gtk_spin_button_set_value(spnLinesATime, globalPrefs.multi_cmd_group_size); /* Connect signals */ gtk_builder_connect_signals(world->ui_builder, world); /* Set width of entries to be slightly larger than 80 columns. */ layout = gtk_widget_create_pango_layout(txtInitial, "W"); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); char_width = logical_rect.width; /* This hack allows the initial size to be set, but without preventing the window from getting smaller. */ gtk_widget_set_size_request(txtInitial, 81 * char_width, -1); gtk_widget_get_preferred_size(dlg, NULL, &requisition); gtk_widget_set_size_request(txtInitial, -1, -1); gtk_window_resize(GTK_WINDOW(dlg), requisition.width, requisition.height); g_object_unref(layout); return dlg; } void start_multi_line_send_cb(GtkButton *btn, gpointer data) { World *world = (World *) data; GtkBuilder *ui_builder; GtkTextView *txtInitial; GtkTextView *txtFinal; GtkFileChooser *txtFile; GtkEntry *txtStart; GtkEntry *txtEnd; GtkSpinButton *spnDelay; GtkSpinButton *spnLinesATime; GtkToggleButton *chkDontClose; gdouble delay; MLSendData *mlcontext; ui_builder = world->ui_builder; txtInitial = GTK_TEXT_VIEW(gtk_builder_get_object(ui_builder, "txtInitial")); txtFinal = GTK_TEXT_VIEW(gtk_builder_get_object(ui_builder, "txtFinal")); txtFile = GTK_FILE_CHOOSER(gtk_builder_get_object(ui_builder, "txtFile")); txtStart = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtStart")); txtEnd = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtEnd")); spnDelay = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnMLSDelay")); spnLinesATime = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnLinesATime")); chkDontClose = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkDontClose")); delay = gtk_spin_button_get_value(spnDelay); mlcontext = g_new0(MLSendData, 1); mlcontext->state = ML_TRY_INITIALBUFFER; mlcontext->world = world; mlcontext->textInitial = gtk_text_view_get_buffer(txtInitial); mlcontext->textFinal = gtk_text_view_get_buffer(txtFinal); mlcontext->file = gtk_file_chooser_get_filename(txtFile); mlcontext->textStart = g_strdup(gtk_entry_get_text(txtStart)); mlcontext->textEnd = g_strdup(gtk_entry_get_text(txtEnd)); mlcontext->linesatime = gtk_spin_button_get_value_as_int(spnLinesATime); mlcontext->dont_close = gtk_toggle_button_get_active(chkDontClose); if (!mlcontext->dont_close) { gtk_widget_hide(world->dlgMLSend); } do_multi_line_send(mlcontext, delay); } void do_multi_line_send(MLSendData *mlcontext, gdouble delay) { /* Send the first line immediately */ if (multi_line_send_timer_cb(mlcontext)) { if (delay) { g_timeout_add_full(G_PRIORITY_HIGH, delay * 1000, multi_line_send_timer_cb, mlcontext, NULL); } else { /* If delay is zero, send as fast as possible */ while (multi_line_send_timer_cb(mlcontext)) ; } } } static gboolean multi_line_send_timer_cb(gpointer data) { MLSendData *context = (MLSendData *) data; int last = FALSE; FILE *fp; gchar *line; int sent_lines; sent_lines = 0; while (sent_lines < context->linesatime) { switch (context->state) { case ML_TRY_INITIALBUFFER: if (context->textInitial && gtk_text_buffer_get_char_count(context->textInitial)) { context->state = ML_INITIALBUFFER; context->nlines = gtk_text_buffer_get_line_count(context->textInitial); context->currline = 0; } else { context->state = ML_TRY_INITIALLINES; } break; case ML_TRY_INITIALLINES: if (context->linesInitial) { context->state = ML_INITIALLINES; context->list_iterator = context->linesInitial; } else { context->state = ML_TRY_FILE; } break; case ML_TRY_FILE: if (context->file) { fp = fopen(context->file, "r"); if (fp) { context->state = ML_FILECONTENTS; context->fp = fp; break; } } context->state = ML_TRY_FINALBUFFER; break; case ML_TRY_FINALBUFFER: if (context->textFinal && gtk_text_buffer_get_char_count(context->textFinal)) { context->state = ML_FINALBUFFER; context->nlines = gtk_text_buffer_get_line_count(context->textFinal); context->currline = 0; } else { context->state = ML_TRY_FINALLINES; } break; case ML_TRY_FINALLINES: if (context->linesFinal) { context->state = ML_FINALLINES; context->list_iterator = context->linesFinal; } else { context->state = ML_FINISH; } break; case ML_INITIALBUFFER: line = get_text_buffer_line(context->textInitial, context->currline, context->nlines, &last); send_line(line, context); g_free(line); ++sent_lines; if (last) { context->state = ML_TRY_FILE; } else { ++context->currline; } break; case ML_FINALBUFFER: line = get_text_buffer_line(context->textFinal, context->currline, context->nlines, &last); send_line(line, context); g_free(line); ++sent_lines; if (last) { context->state = ML_FINISH; } else { ++context->currline; } break; case ML_INITIALLINES: line = (gchar *) context->list_iterator->data; send_line(line, context); ++sent_lines; context->list_iterator = context->list_iterator->next; if (!context->list_iterator) { context->state = ML_TRY_FILE; } break; case ML_FINALLINES: line = (gchar *) context->list_iterator->data; send_line(line, context); ++sent_lines; context->list_iterator = context->list_iterator->next; if (!context->list_iterator) { context->state = ML_FINISH; } break; case ML_FILECONTENTS: line = get_file_line(context->fp, &last); send_line(line, context); ++sent_lines; if (last) { context->state = ML_TRY_FINALBUFFER; fclose(context->fp); } break; case ML_FINISH: if (context->textInitial && !context->dont_close) { clear_multi_line_send_dialog_cb(GTK_WIDGET(context->world->dlgMLSend), context->world); } g_free(context->textStart); g_free(context->textEnd); g_free(context->file); if (context->linesInitial) { g_slist_foreach(context->linesInitial, string_free, NULL); g_slist_free(context->linesInitial); } if (context->linesFinal) { g_slist_foreach(context->linesFinal, string_free, NULL); g_slist_free(context->linesFinal); } g_free(context); return FALSE; } } return TRUE; } void clear_multi_line_send_dialog_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkBuilder *ui_builder; GtkWidget *dlgMLSend; GtkTextView *txtInitial; GtkFileChooser *txtFile; GtkTextView *txtFinal; GtkEntry *txtStart; GtkEntry *txtEnd; GtkTextBuffer *buffer; ui_builder = world->ui_builder; dlgMLSend = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgMLSend")); txtInitial = GTK_TEXT_VIEW(gtk_builder_get_object(ui_builder, "txtInitial")); txtFile = GTK_FILE_CHOOSER(gtk_builder_get_object(ui_builder, "txtFile")); txtFinal = GTK_TEXT_VIEW(gtk_builder_get_object(ui_builder, "txtFinal")); txtStart = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtStart")); txtEnd = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtEnd")); buffer = gtk_text_view_get_buffer(txtInitial); gtk_text_buffer_set_text(buffer, "", 0); gtk_file_chooser_unselect_all(txtFile); buffer = gtk_text_view_get_buffer(txtFinal); gtk_text_buffer_set_text(buffer, "", 0); gtk_entry_set_text(txtStart, ""); gtk_entry_set_text(txtEnd, ""); gtk_widget_hide(dlgMLSend); } static gchar * get_text_buffer_line(GtkTextBuffer *buffer, int line, int nlines, gboolean *last) { GtkTextIter start; GtkTextIter end; gchar *to_send; gtk_text_buffer_get_iter_at_line(buffer, &start, line); if (line == nlines - 1) { gtk_text_buffer_get_end_iter(buffer, &end); *last = TRUE; } else { gtk_text_buffer_get_iter_at_line(buffer, &end, line+1); *last = FALSE; } to_send = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); return to_send; } static gchar * get_file_line(FILE *fp, gboolean *last) { static char line[MAX_BUFFER]; int c; fgets(line, MAX_BUFFER, fp); c = fgetc(fp); if (c != -1) { ungetc(c, fp); *last = FALSE; } else { *last = TRUE; } return line; } static void send_line(gchar *line, MLSendData *context) { int len; /* Remove final newline */ len = strlen(line); if (line[len-1] == '\n') { line[len - 1] = '\0'; --len; if (line[len-1] == '\r') { line[len - 1] = '\0'; --len; } } send_to_world_no_check(context->world, context->textStart, strlen(context->textStart), NULL, 0, FALSE, FALSE); send_to_world_no_check(context->world, line, len, NULL, 0, FALSE, FALSE); send_to_world_no_check(context->world, context->textEnd, strlen(context->textEnd), NULL, 0, TRUE, FALSE); } static void string_free(gpointer string, gpointer user_data) { g_free(string); } kildclient-3.0.0/src/kcwin.c0000644000175000017500000000602112374460043012625 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "libintl-wrapper.h" #include #include /* Perl includes */ #include #include #include #include "kildclient.h" #include "perlscript.h" /***************** * Useful macros * *****************/ #define FETCHGUIVARS SV *self_ref; \ HV *self; \ SV **guiptrsv; \ WorldGUI *gui #define FETCHGUI self_ref = ST(0); \ self = (HV*) SvRV(self_ref); \ guiptrsv = hv_fetch(self, "_GUIPTR", 7, FALSE); \ gui = INT2PTR(WorldGUI *, SvIV(*guiptrsv)) /*********************** * Function prototypes * ***********************/ void XS_KCWin__new(pTHX_ CV *perlcv) { /* For internal use only. Returns C pointers to a window and some widgets, later these are converted to Gtk-Perl objects. */ GtkWidget *window; WorldGUI *gui; dMARK; dAX; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(window), 450, 170); gui = world_gui_new(FALSE); configure_gui(gui, world_for_perl); ansitextview_update_color_tags(gui, world_for_perl); gtk_container_add(GTK_CONTAINER(window), gui->vbox); XST_mIV(0, PTR2IV(window)); XST_mIV(1, PTR2IV(gui->vbox)); XST_mIV(2, PTR2IV(gui->scrolled_win)); XST_mIV(3, PTR2IV(gui->txtView)); XST_mIV(4, PTR2IV(gui->txtBuffer)); XST_mIV(5, PTR2IV(gui->commandArea)); XST_mIV(6, PTR2IV(gui->btnClear)); XST_mIV(7, PTR2IV(gui->txtEntry)); XST_mIV(8, PTR2IV(gui)); XSRETURN(9); } void XS_KCWin_feed(pTHX_ CV *perlcv) { STRLEN len; gchar *str; FETCHGUIVARS; dXSARGS; if (items < 2) { warn(_("%s: Too few arguments"), "KCWin::feed"); XSRETURN_EMPTY; } FETCHGUI; str = SvPV(ST(1), len); /* TODO - KCWin is not working - this requires an operation Queue, which it does not have. Add string directly. */ ansitextview_append_ansi_string_immediately(gui, str, len); XSRETURN_EMPTY; } void XS_KCWin__destroy(pTHX_ CV *perlcv) { FETCHGUIVARS; dMARK; dAX; FETCHGUI; free_world_gui(gui); XSRETURN_EMPTY; } kildclient-3.0.0/src/dlgCmdHistory.ui0000644000175000017500000006020012374201340014451 00000000000000 100 0.10000000149 1 1 100000 1 1 10 True False Command History dialog True False 8 8 8 8 vertical 8 True False 8 650 200 True True in True True False True True 0 True False vertical _Find True True True True True Find a command containing a given search term True False False 0 Find _next True True True True True Find the next command with the same match text True False False 1 False True 1 True True 0 True False end _Recall True True True True True Put the selected command in the command entry box half True False False 0 Rec_all & Close True True True True True Put the selected command in the command entry box and close this dialog True False False 1 _Send True True True True True Send the selected command(s) to the mud True False False 2 S_end & Close True True True True True Send the selected command(s) to the mud and close the dialog True False False 3 _Close True True True True True False False 4 False True end 0 True False 0 Newest commands are on the top False True 2 True False False True 4 True False 4 True False Dela_y True False False 0 True True Specify the delay between sending the group of commands 0.0 adjustment1 0.10000000149 1 False False 1 True False sec_onds each True spnNCommands False False 2 True True Specify how many commands are sent at once 1 adjustment2 1 1 False False 3 True False commands(s) False False 4 False True 5 btnCHClose True False True Find Command dialog True False vertical True False end _Cancel True True True True True False False 0 _OK True True True True True False False 1 False True end 0 True False 8 vertical 8 True False 0 _Text to find: True False False 0 True True Enter the text to search for True False False 1 True False 4 True False 0 0 Search direction: False False 0 True False vertical _Downwards True True False True 0.5 True True False False 0 _Upwards True True False True 0.5 True radDownwards False False 1 True True 1 True True 2 False True 2 cancelbutton3 okbutton4 kildclient-3.0.0/src/simocombobox.h0000644000175000017500000002223712367156733014240 00000000000000/* * SimoComboBox is meant to be an alternative combobox to the * standard GtkComboBox. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: * Todd A. Fisher (toddf@simosoftware.com) * */ #ifndef SIMO_COMBO_BOX_H #define SIMO_COMBO_BOX_H #include G_BEGIN_DECLS #define SIMO_TYPE_COMBO_BOX (simo_combo_box_get_type ()) #define SIMO_COMBO_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),\ SIMO_TYPE_COMBO_BOX, SimoComboBox)) #define SIMO_COMBO_BOX_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), \ SIMO_TYPE_COMBO_BOX,\ SimoComboBoxClass)) #define SIMO_IS_COMBO_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),\ SIMO_TYPE_COMBO_BOX)) #define SIMO_IS_COMBO_BOX_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable),\ SIMO_TYPE_COMBO_BOX)) #define SIMO_COMBO_BOX_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst),\ SIMO_TYPE_COMBO_BOX,\ SimoComboBoxClass)) typedef struct _SimoComboBox SimoComboBox; typedef struct _SimoComboBoxClass SimoComboBoxClass; typedef struct _SimoComboBoxPrivate SimoComboBoxPrivate; struct _SimoComboBox { GtkBox parent_instance; /* basic interfaces are here */ GtkTreeModel *model; GtkTreeView *treeview; /* you should avoid setting headers and other such strangness here but if you'd like to feel free */ GtkTreeViewColumn *column; GtkWidget *button; GtkWidget *entry; GtkWidget *txtview; GtkTextBuffer *txtbuffer; GtkWidget *label; /* this label is placed in the button and visible if the combobox is not editable */ gboolean editable; guint max_popup_height;/* this is an absolute value of the max the popup window can grow to before a scroll bar appears */ guint max_popup_width; /* this value represents how much larger then the combo box width can the popup window appear */ gint visible_column; /*< private >*/ SimoComboBoxPrivate *priv; }; struct _SimoComboBoxClass { GtkBoxClass parent_class; /* signals */ void (* clicked) (SimoComboBox *combo_box); void (* popup_displayed) (SimoComboBox *combo_box); void (* popup_closed) (SimoComboBox *combo_box); void (* changed) (SimoComboBox *combo_box); void (* activate) (SimoComboBox *combo_box); void (* size_changed) (SimoComboBox *combo_box); /* Padding for future expansion */ void (*_simo_reserved0) (void); void (*_simo_reserved1) (void); void (*_simo_reserved2) (void); void (*_simo_reserved3) (void); }; /* construction */ GType simo_combo_box_get_type(void); GtkWidget *simo_combo_box_new(void); /* NOTE: if you construct your own model you can only use insert_seperator if column index 0 is GDK_TYPE_PIXBUF and index 1 is of G_TYPE_INT when index 1 is 1 the seperator is displayed and the text is hidden when index 1 is 0 the seperator is hidden and the text is displayed */ GtkWidget *simo_combo_box_new_with_model(GtkTreeModel *model); /* * exported function for creating simocombobox from libglade as a custom widget */ GtkWidget *create_simo_combo_box(gchar *widget_name, gchar *button_name, gchar *entry_name, gint editable, gint entry_alloc_width); /* getters and setters */ void simo_combo_box_set_model(SimoComboBox *combo_box, GtkTreeModel *model); void simo_combo_box_set_combo_column(SimoComboBox *combo_box, GtkTreeViewColumn *column); GtkEntryCompletion *simo_combo_box_get_completion(SimoComboBox *combo_box); /* text access */ const gchar *simo_combo_box_get_text(SimoComboBox *combo_box); void simo_combo_box_set_text(SimoComboBox *combo_box, const gchar *text); void simo_combo_box_set_visibility(SimoComboBox *combo_box, gboolean visible); void simo_combo_box_clear_text(SimoComboBox *combo_box); void simo_combo_box_set_position(SimoComboBox *combo_box, gint position); gboolean simo_combo_box_get_selection_bounds(SimoComboBox *combo_box, gint *start, gint *end); void simo_combo_box_select_region(SimoComboBox *combo_box, gint start, gint end); void simo_combo_box_delete_selection(SimoComboBox *combo_box); void simo_combo_box_cut_clipboard(SimoComboBox *combo_box); void simo_combo_box_copy_clipboard(SimoComboBox *combo_box); void simo_combo_box_paste_clipboard(SimoComboBox *combo_box); void simo_combo_box_set_entry_font(SimoComboBox *combo_box, PangoFontDescription *fontDesc); /* Spell checking */ gboolean simo_combo_box_set_spell(SimoComboBox *combo_box, gboolean use_spell, gchar *language, GError **error); /* For completion: Either set_visible_column to get an automatic renderer, or set_completion_renderer to create your own. */ void simo_combo_box_set_visible_column(SimoComboBox *combo_box, int col_id); void simo_combo_box_set_completion_renderer(SimoComboBox *combo_box, GtkCellRenderer *renderer); void simo_combo_box_set_completion_cell_func(SimoComboBox *combo_box, GtkCellRenderer *renderer, GtkCellLayoutDataFunc func, gpointer user_data, GDestroyNotify destroy); /* FIXME: Add wrapper for function to set attribute. */ GtkTreeModel *simo_combo_box_get_model(SimoComboBox *combo_box); void simo_combo_box_set_active_iter(SimoComboBox *combo_box, GtkTreeIter *iter); gboolean simo_combo_box_get_active_iter(SimoComboBox *combo_box, GtkTreeIter *iter); void simo_combo_box_insert_seperator(SimoComboBox *combo_box, GtkTreeIter *iter); void simo_combo_box_set_editable(SimoComboBox *combo_box, gboolean editable_state); gboolean simo_combo_box_get_editable(SimoComboBox *combo_box); /* programmatic control */ void simo_combo_box_popup(SimoComboBox *combo_box); /* when implementing a costum model for the combobox you should connect the visible column to this method with gtk_tree_view_column_set_cell_data_func(column, cell, simo_combo_box_pixbuf_column_render, NULL, NULL ) */ void simo_combo_box_pixbuf_column_render(GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer null); void simo_combo_box_visible_column_render(GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer null); gboolean simo_combo_box_get_n_lines(SimoComboBox *combo_box); void simo_combo_box_set_n_lines(SimoComboBox *combo_box, gint n_lines); G_END_DECLS #endif /* __simo_COMBO_BOX_H__ */ kildclient-3.0.0/src/simocombobox.c0000644000175000017500000021663012374460043014223 00000000000000/* * SimoComboBox is meant to be an alternative combobox to the * standard GtkComboBox. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: * Todd A. Fisher (toddf@simosoftware.com) * */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #ifdef HAVE_GTKSPELL # include #endif #include "simocombobox.h" #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) #include "dropshadow.h" #endif #ifdef GDK_WINDOWING_WIN32 #include #include "gdk/gdkwin32.h" #endif //#define WITHOUT_BUTTON #define CHILD_SPACING 1 #define COMBO_MIN_WIDTH 50 #define COMBO_MIN_HEIGHT 10 enum { CLICKED, POPUP_DISPLAYED, POPUP_CLOSED, CHANGED, ACTIVATE, SIZE_CHANGED, LAST_SIGNAL }; enum { PROP_0, PROP_MODEL, PROP_MAX_HEIGHT, PROP_MAX_WIDTH, PROP_EDIT, PROP_MAX_LINES }; static const char *combo_box_seperator = "------------"; struct _SimoComboBoxPrivate{ GtkWidget *parent; GtkWidget *popup_window; /* the window that is dropped down when the button is clicked */ GtkWidget *popup_scroll; /* the scrolled window for the treeview */ GtkTreePath *current_path; /* path to the active cell, can be NULL if no items are currently selected */ gint button_press_x, button_press_y; #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) DropShadow *ds; #endif GdkCursor *hand; GtkEntryCompletion *completion; #ifdef HAVE_GTKSPELL GtkSpellChecker *gtkspell; #endif gboolean scrolls_visible; gint n_lines; gint max_lines; guint editable_signal; guint drag_signal; guint arrow_sig; /* arrow button sig */ guint bl_sig; /* button label sig */ GtkAllocation entry_alloc; gint fixed_entry_size; GtkWidget *label_button; GtkWidget *scrolled_window; GtkWidget *vbox_arrows; /* Return value of get_text for multi-line widget - so that the user does not need to free it. */ gchar *ml_text; /* IDs of signal handlers */ gulong single_changed_id; gulong multi_changed_id; /* Line height for size calculation */ gint cached_line_height; }; static GtkBinClass *parent_class = NULL; static guint combo_box_signals[LAST_SIGNAL] = {0,}; static void simo_combo_box_class_init(SimoComboBoxClass *klass); static void simo_combo_box_init(SimoComboBox *combo_box); static void simo_combo_box_get_preferred_height(GtkWidget *widget, gint *minimum_height, gint *natural_height); static void simo_combo_box_get_preferred_width(GtkWidget *widget, gint *minimum_width, gint *natural_width); static void simo_combo_box_size_request(GtkWidget *widget, GtkRequisition *requisition); static void simo_combo_box_finalize(GObject *object); static void simo_combo_box_get_property(GObject *object, guint param_id, GValue *value, GParamSpec *pspec); static void simo_combo_box_set_property(GObject *object, guint param_id, const GValue *value, GParamSpec *pspec); static void simo_combo_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation ); static gint simo_combo_box_get_line_height(SimoComboBox *combo_box); static gboolean simo_combo_box_update_pressed(GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box); static void simo_combo_box_row_activated(GtkTreeView *treeview, GtkTreePath *arg1, GtkTreeViewColumn *arg2, SimoComboBox *combo); static gboolean simo_combo_box_treeview_press_event(GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box); static gboolean simo_combo_box_treeview_release_event(GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box); static gboolean simo_combo_box_key_release_event(GtkWidget *widget, GdkEventKey *event, SimoComboBox *combo_box); static gboolean simo_combo_box_treeview_motion_event(GtkWidget *widget, GdkEventMotion *event, SimoComboBox *combo_box); static gboolean simo_combo_box_is_seperator_row(SimoComboBox *combo_box, GtkTreeIter *iter); static void simo_combo_box_row_deleted(GtkTreeModel *model, GtkTreePath *path, SimoComboBox *combo); /*static void simo_combo_box_row_inserted(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, SimoComboBox *combo);*/ static void simo_combo_box_popup_close(SimoComboBox *combo_box); static void simo_combo_box_grab_focus_signal(GtkWidget *widget); static void simo_combo_box_text_changed_cb(GtkEditable *editable, gpointer data); static void simo_combo_box_entry_activate_cb(GtkEditable *editable, gpointer data); static gboolean simo_combo_box_txtview_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static gboolean simo_combo_box_arrow_up_cb(GtkWidget *widget, GdkEventButton *event, gpointer data); static gboolean simo_combo_box_arrow_down_cb(GtkWidget *widget, GdkEventButton *event, gpointer data); GType simo_combo_box_get_type(void) { static GType combo_box_type = 0; if (!combo_box_type) { static const GTypeInfo combo_box_info = { sizeof (SimoComboBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) simo_combo_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (SimoComboBox), 0, (GInstanceInitFunc) simo_combo_box_init }; combo_box_type = g_type_register_static(GTK_TYPE_BOX, "SimoComboBox", &combo_box_info, (GTypeFlags) 0); } return combo_box_type; } /*static void simo_combo_box_show(SimoComboBox *combo_box) { gtk_widget_show(combo_box->button); gtk_widget_show(combo_box->entry); gtk_widget_show(combo_box); } static void simo_combo_box_hide(SimoComboBox *combo_box) { gtk_widget_hide(combo_box->button); gtk_widget_hide(combo_box->entry); //gtk_widget_hide(combo_box); } */ static void simo_combo_box_class_init(SimoComboBoxClass *klass) { GObjectClass *g_object_class; GtkWidgetClass *widget_class; g_object_class = G_OBJECT_CLASS (klass); widget_class = (GtkWidgetClass*) klass; //widget_class->show = simo_combo_box_show; //widget_class->hide = simo_combo_box_hide; parent_class = g_type_class_peek_parent((GObjectClass*) klass); g_object_class->finalize = simo_combo_box_finalize; //gtk_object_class->destroy = simo_combo_box_destroy; //widget_class->realize = simo_combo_box_realize; g_object_class->set_property = simo_combo_box_set_property; g_object_class->get_property = simo_combo_box_get_property; widget_class->size_allocate = simo_combo_box_size_allocate; widget_class->get_preferred_height = simo_combo_box_get_preferred_height; widget_class->get_preferred_width = simo_combo_box_get_preferred_width; widget_class->grab_focus = simo_combo_box_grab_focus_signal; klass->clicked = NULL; klass->popup_displayed = NULL; /* signals */ combo_box_signals[CLICKED] = g_signal_new("clicked", G_OBJECT_CLASS_TYPE(widget_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(SimoComboBoxClass, clicked), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); combo_box_signals[POPUP_DISPLAYED] = g_signal_new("popup-displayed", G_OBJECT_CLASS_TYPE(widget_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(SimoComboBoxClass, popup_displayed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); combo_box_signals[POPUP_CLOSED] = g_signal_new("popup-closed", G_OBJECT_CLASS_TYPE(widget_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(SimoComboBoxClass, popup_closed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); combo_box_signals[CHANGED] = g_signal_new("changed", G_OBJECT_CLASS_TYPE(widget_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(SimoComboBoxClass, changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); combo_box_signals[ACTIVATE] = g_signal_new("activate", G_OBJECT_CLASS_TYPE(widget_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(SimoComboBoxClass, activate), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); combo_box_signals[SIZE_CHANGED] = g_signal_new("size_changed", G_OBJECT_CLASS_TYPE(widget_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(SimoComboBoxClass, size_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /* properties */ g_object_class_install_property( g_object_class, PROP_MODEL, g_param_spec_object( "model", "ComboBox model", "The model for the combo box", GTK_TYPE_TREE_MODEL, G_PARAM_READWRITE)); g_object_class_install_property( g_object_class, PROP_MAX_WIDTH, g_param_spec_int( "max_width", "Max width", "Max width the popup window is allowed to grow to before displaying a scroll bar", 0, G_MAXINT, 150, G_PARAM_READWRITE)); g_object_class_install_property( g_object_class, PROP_MAX_HEIGHT, g_param_spec_int( "max_height", "Max height", "Max height the popup window is allowed to grow to before displaying a scroll bar", 0, G_MAXINT, 150, G_PARAM_READWRITE)); g_object_class_install_property( g_object_class, PROP_EDIT, g_param_spec_boolean( "edit", "Editable", "Controls whether or not the combobox entry is editable", TRUE, G_PARAM_READWRITE)); g_object_class_install_property( g_object_class, PROP_MAX_LINES, g_param_spec_int( "max_lines", "Maximum lines", "Max number of lines allowed in the multi-line text editing widget", 1, G_MAXINT, 10, G_PARAM_READWRITE)); } static gboolean simo_combo_box_is_seperator_row( SimoComboBox *combo_box, GtkTreeIter *iter ) { gchar *text = 0; gtk_tree_model_get( combo_box->model, iter, combo_box->visible_column, &text, -1 ); if( text != 0 && !strcmp( text, combo_box_seperator ) ){ g_free( text ); return TRUE; } g_free( text ); return FALSE; } static gboolean allow_row_selection( GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, SimoComboBox *combo_box ) { GtkTreeIter iter; if( gtk_tree_model_get_iter( model, &iter, path ) ){ if( simo_combo_box_is_seperator_row( combo_box, &iter ) ) return FALSE; } return TRUE; } static void simo_combo_box_init(SimoComboBox *combo_box) { int mask; GtkWidget *arrow; GtkWidget *arrow_evtbox; GtkWidget *button_align; GtkWidget *frame; SimoComboBoxPrivate *mthis = combo_box->priv = g_new0(SimoComboBoxPrivate, 1); GtkCellRenderer *cell; GtkTreeSelection *selection; GtkWidget *align; combo_box->priv = mthis; combo_box->max_popup_height = 350; combo_box->max_popup_width = 450; combo_box->visible_column = 0; mthis->n_lines = 1; mthis->max_lines = 10; mthis->hand = gdk_cursor_new( GDK_HAND2 ); // build the popup window mthis->popup_window = gtk_window_new( GTK_WINDOW_POPUP ); align = gtk_alignment_new( 0, 0, 1, 1 ); mthis->popup_scroll = gtk_scrolled_window_new( NULL, NULL ); frame = gtk_frame_new( NULL ); combo_box->model = (GtkTreeModel*)gtk_tree_store_new( 1, G_TYPE_STRING ); combo_box->treeview = (GtkTreeView*) gtk_tree_view_new_with_model(combo_box->model); gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( mthis->popup_scroll ), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC ); g_object_set( G_OBJECT( combo_box->treeview ), "fixed-height-mode", FALSE, "headers-visible", FALSE, "rules-hint", FALSE, "reorderable", FALSE, NULL ); combo_box->column = gtk_tree_view_column_new(); g_object_set( combo_box->column, "expand", TRUE, NULL ); cell = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start( combo_box->column, cell, TRUE ); gtk_tree_view_column_add_attribute( combo_box->column, cell, "text", 0 ); // gtk_tree_view_column_set_cell_data_func( combo_box->column, cell, simo_combo_box_visible_column_render, NULL, NULL ); gtk_tree_view_column_set_resizable( combo_box->column, TRUE ); gtk_tree_view_column_set_sizing( combo_box->column, GTK_TREE_VIEW_COLUMN_AUTOSIZE ); gtk_tree_view_append_column( combo_box->treeview, combo_box->column ); //#ifdef NDEBUG // only enable for release until warnnigs are fixed #ifdef GDK_WINDOWING_WIN32 /* once Linux version becomes 2.6 we'll remove the macro */ g_object_set( cell, "ellipsize", PANGO_ELLIPSIZE_END, NULL ); #endif //#endif selection = gtk_tree_view_get_selection( combo_box->treeview ); gtk_tree_selection_set_select_function(selection, (GtkTreeSelectionFunc) allow_row_selection, combo_box, NULL); gtk_tree_selection_set_mode( selection, GTK_SELECTION_SINGLE ); //gtk_tree_selection_unselect_all( selection ); // set up the popup window with the appropriate attributes so that it works correctly as a popup window //gtk_window_set_type_hint( GTK_WINDOW( mthis->popup_window ), GDK_WINDOW_TYPE_HINT_MENU ); gtk_window_set_keep_above( GTK_WINDOW( mthis->popup_window ), TRUE ); gtk_window_set_decorated( GTK_WINDOW( mthis->popup_window ), FALSE ); gtk_window_set_resizable( GTK_WINDOW( mthis->popup_window ), TRUE ); gtk_widget_realize( mthis->popup_window ); gdk_window_set_cursor(gtk_widget_get_window(mthis->popup_window), mthis->hand ); mask = gdk_window_get_events(gtk_widget_get_window(mthis->popup_window)); gdk_window_set_events(gtk_widget_get_window(mthis->popup_window), mask | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); // gtk_container_add( GTK_CONTAINER( mthis->popup_window ), frame ); gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_OUT ); gtk_container_set_border_width( GTK_CONTAINER( mthis->popup_scroll ), 0 ); gtk_container_add( GTK_CONTAINER( mthis->popup_window ), align ); gtk_container_add( GTK_CONTAINER( align ), frame ); gtk_container_add( GTK_CONTAINER( frame ), mthis->popup_scroll ); gtk_container_set_border_width( GTK_CONTAINER( mthis->popup_window ), 0 ); gtk_widget_set_name( mthis->popup_window, "white" ); #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) /* only needed for unix dropshadows */ gtk_alignment_set_padding( GTK_ALIGNMENT( align ), 0, 0, 0, 5 ); #endif //gtk_widget_set_name( mthis->popup_scroll, "white" ); gtk_container_add(GTK_CONTAINER( mthis->popup_scroll ), (GtkWidget*)combo_box->treeview); // g_object_get( G_OBJECT( frame ), "border-width", &(mthis->frame_border ), NULL ); // build the widget face arrow = gtk_arrow_new( GTK_ARROW_DOWN, GTK_SHADOW_IN ); combo_box->button = gtk_toggle_button_new();//gtk_button_new(); combo_box->entry = gtk_entry_new(); mthis->scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(mthis->scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(mthis->scrolled_window), GTK_SHADOW_IN); combo_box->txtview = gtk_text_view_new(); gtk_text_view_set_pixels_above_lines(GTK_TEXT_VIEW(combo_box->txtview), 2); gtk_text_view_set_left_margin(GTK_TEXT_VIEW(combo_box->txtview), 2); gtk_text_view_set_right_margin(GTK_TEXT_VIEW(combo_box->txtview), 2); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(combo_box->txtview), GTK_WRAP_WORD_CHAR); combo_box->txtbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(combo_box->txtview)); gtk_container_add(GTK_CONTAINER(mthis->scrolled_window), combo_box->txtview); mthis->label_button = gtk_toggle_button_new();//gtk_button_new(); button_align = gtk_alignment_new( 0, (gfloat)0.5, 1, 1 ); combo_box->label = gtk_label_new(""); #ifdef GDK_WINDOWING_WIN32 // FIXME: should check gtk+ version number for 2.5+ gtk_label_set_ellipsize( GTK_LABEL( combo_box->label ), PANGO_ELLIPSIZE_END ); #endif // give an initial allocation size to the entry box // Removed by Eduardo Kalinowski. Seems not to be necessary, and // does not compile when GSEAL_ENABLE is defined. //combo_box->priv->entry_alloc.width = COMBO_MIN_WIDTH - 25; //combo_box->entry->allocation.width = COMBO_MIN_WIDTH - 25; //combo_box->entry->allocation.height = COMBO_MIN_HEIGHT; // g_print( "setting fixed entry size to default\n" ); //combo_box->priv->fixed_entry_size = -1; //mthis->label_button->allocation.width = COMBO_MIN_HEIGHT; //mthis->label_button->allocation.height = COMBO_MIN_HEIGHT; //gtk_container_remove( GTK_CONTAINER( combo_box->button ), // gtk_bin_get_child( GTK_BIN( combo_box->button ) ) ); // gtk_box_pack_start( GTK_BOX( hbox ), combo_box->label, 1, 1, 0 ); // gtk_box_pack_start( GTK_BOX( hbox ) , arrow, 0, 1, 0 ); // gtk_widget_show( hbox ); gtk_widget_show( arrow ); gtk_container_add( GTK_CONTAINER( combo_box->button ), arrow ); gtk_container_add( GTK_CONTAINER( mthis->label_button ), button_align ); gtk_container_add( GTK_CONTAINER( button_align ), combo_box->label ); gtk_widget_set_name( mthis->label_button, "combo_label" ); gtk_widget_set_name( combo_box->label, "combo_label" ); gtk_widget_set_name( arrow, "combo_arrow" ); gtk_widget_set_name( combo_box->button, "combo_button" ); gtk_widget_set_name( combo_box->entry, "combo_entry" ); /* Create the completion object */ mthis->completion = gtk_entry_completion_new(); /* Assign the completion to the entry */ gtk_entry_set_completion( GTK_ENTRY( combo_box->entry ), mthis->completion ); g_object_unref( mthis->completion ); gtk_entry_completion_set_model( mthis->completion, combo_box->model ); /* Use model column 0 as the text column */ /*gtk_entry_completion_set_text_column( mthis->completion, 0 );*/ #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) /* windows xp does not need this */ // create the drop shadow object mthis->ds = drop_shadow_new(); #endif gtk_button_set_focus_on_click( GTK_BUTTON( combo_box->button ), FALSE ); gtk_widget_show( arrow ); gtk_widget_show( combo_box->button ); gtk_widget_show( combo_box->entry ); gtk_widget_show( combo_box->label ); gtk_widget_show( button_align ); gtk_widget_show( mthis->label_button ); gtk_widget_hide( mthis->label_button ); // gtk_widget_show( frame ); gtk_widget_show( mthis->popup_scroll ); gtk_widget_show( GTK_WIDGET( combo_box->treeview ) ); // gtk_box_pack_start( GTK_BOX( combo_box ), mthis->label_button, TRUE, TRUE, 0 ); gtk_box_pack_start( GTK_BOX( combo_box ), combo_box->entry, TRUE, TRUE, 0 ); g_object_set(G_OBJECT(mthis->scrolled_window), "no-show-all", TRUE, NULL); gtk_box_pack_start(GTK_BOX(combo_box), mthis->scrolled_window, TRUE, TRUE, 0); mthis->vbox_arrows = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_box_set_homogeneous(GTK_BOX(mthis->vbox_arrows), TRUE); arrow = gtk_arrow_new(GTK_ARROW_UP, GTK_SHADOW_OUT); gtk_misc_set_alignment(GTK_MISC(arrow), .5, 0); arrow_evtbox = gtk_event_box_new(); g_signal_connect(G_OBJECT(arrow_evtbox), "button-press-event", G_CALLBACK(simo_combo_box_arrow_up_cb), combo_box); gtk_container_add(GTK_CONTAINER(arrow_evtbox), arrow); gtk_box_pack_start(GTK_BOX(mthis->vbox_arrows), arrow_evtbox, TRUE, TRUE, 0); arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_OUT); gtk_misc_set_alignment(GTK_MISC(arrow), .5, 1); arrow_evtbox = gtk_event_box_new(); g_signal_connect(G_OBJECT(arrow_evtbox), "button-press-event", G_CALLBACK(simo_combo_box_arrow_down_cb), combo_box); gtk_container_add(GTK_CONTAINER(arrow_evtbox), arrow); gtk_box_pack_start(GTK_BOX(mthis->vbox_arrows), arrow_evtbox, TRUE, TRUE, 0); gtk_box_pack_end(GTK_BOX(combo_box), mthis->vbox_arrows, FALSE, FALSE, 0); gtk_alignment_set(GTK_ALIGNMENT(button_align), (gfloat) 0.01, (gfloat) 0.5, (gfloat) 1.0, (gfloat) 0.5); gtk_misc_set_alignment(GTK_MISC(combo_box->label), (gfloat) 0.01, (gfloat) 0.5); // gtk_button_set_alignment( GTK_BUTTON( combo_box->label ), (gfloat)0.01, (gfloat)0.5 ); // gtk_box_pack_start( GTK_BOX( combo_box ), button, TRUE, TRUE, 0 ); gtk_box_pack_end( GTK_BOX( combo_box ), combo_box->button, FALSE, FALSE, 0 ); g_object_ref( G_OBJECT( combo_box->entry ) ); g_object_ref( G_OBJECT( mthis->label_button ) ); mthis->arrow_sig = g_signal_connect_swapped( G_OBJECT( combo_box->button ), "toggled", G_CALLBACK( simo_combo_box_popup ), combo_box ); mthis->bl_sig = g_signal_connect_swapped( G_OBJECT( mthis->label_button ), "toggled", G_CALLBACK( simo_combo_box_popup ), combo_box ); g_signal_connect( G_OBJECT( combo_box->treeview ), "row-activated", G_CALLBACK( simo_combo_box_row_activated ), combo_box ); g_signal_connect( G_OBJECT( combo_box->treeview ), "button-press-event", G_CALLBACK( simo_combo_box_treeview_press_event ), combo_box ); g_signal_connect( G_OBJECT( combo_box->treeview ), "button-release-event", G_CALLBACK( simo_combo_box_treeview_release_event ), combo_box ); g_signal_connect( G_OBJECT( combo_box->treeview ), "key-release-event", G_CALLBACK( simo_combo_box_key_release_event ), combo_box ); g_signal_connect( G_OBJECT( combo_box->treeview ), "motion-notify-event", G_CALLBACK( simo_combo_box_treeview_motion_event ), combo_box ); mthis->single_changed_id = g_signal_connect(G_OBJECT(combo_box->entry), "changed", G_CALLBACK(simo_combo_box_text_changed_cb), combo_box); g_signal_connect(G_OBJECT(combo_box->entry), "activate", G_CALLBACK(simo_combo_box_entry_activate_cb), combo_box); mthis->multi_changed_id = g_signal_connect(G_OBJECT(combo_box->txtbuffer), "changed", G_CALLBACK(simo_combo_box_text_changed_cb), combo_box); g_signal_connect(G_OBJECT(combo_box->txtview), "key-press-event", G_CALLBACK(simo_combo_box_txtview_keypress_cb), combo_box); } static gboolean simo_combo_box_key_release_event(GtkWidget *widget, GdkEventKey *event, SimoComboBox *combo_box) { if( event->keyval == GDK_KEY_Escape ) simo_combo_box_popup_close( combo_box ); return FALSE; } static void simo_combo_box_finalize(GObject *object) { SimoComboBoxPrivate *mthis; // g_print( "ENTER: simo_combo_box_finalize\n" ); mthis = SIMO_COMBO_BOX( object )->priv; // g_object_unref( G_OBJECT( SIMO_COMBO_BOX( object )->entry ) ); // g_object_unref( G_OBJECT( SIMO_COMBO_BOX( object )->label ) ); // run parent finalize G_OBJECT_CLASS(parent_class)->finalize(object); if( mthis->current_path ) gtk_tree_path_free( mthis->current_path ); #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) drop_shadow_destroy( mthis->ds ); #endif g_object_unref( mthis->hand ); g_free(mthis->ml_text); g_free( mthis ); // g_print( "LEAVE: simo_combo_box_finalize\n" ); // g_free( GTK_WIDGET( object )->name ); } static void simo_combo_box_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { SimoComboBox *combo_box = SIMO_COMBO_BOX( object ); switch( prop_id ){ case PROP_MODEL: g_value_set_object( value, combo_box->model ); break; case PROP_MAX_WIDTH: g_value_set_int( value, combo_box->max_popup_width ); break; case PROP_MAX_HEIGHT: g_value_set_int( value, combo_box->max_popup_height ); break; case PROP_EDIT: g_value_set_boolean( value, gtk_editable_get_editable( GTK_EDITABLE( combo_box->entry ) ) ); break; case PROP_MAX_LINES: g_value_set_int(value, combo_box->priv->max_lines); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID( object, prop_id, pspec ); break; } } static void simo_combo_box_set_property( GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec ) { SimoComboBox *combo_box = SIMO_COMBO_BOX( object ); switch( prop_id ){ case PROP_MODEL:{ GtkTreeModel *model = g_value_get_object( value ); simo_combo_box_set_model( combo_box, model ); if( model ) gtk_entry_completion_set_model( combo_box->priv->completion, model ); // else // gtk_entry_completion_set_model( combo_box->priv->completion, 0 ); }break; case PROP_MAX_WIDTH: combo_box->max_popup_width = g_value_get_int( value ); break; case PROP_MAX_HEIGHT: combo_box->max_popup_height = g_value_get_int( value ); break; case PROP_EDIT: gtk_editable_set_editable( GTK_EDITABLE( combo_box->entry ), g_value_get_boolean( value ) ); break; case PROP_MAX_LINES: combo_box->priv->max_lines = g_value_get_int(value); break; default: break; } } static void simo_combo_box_get_preferred_height(GtkWidget *widget, gint *minimum_height, gint *natural_height) { GtkRequisition req; simo_combo_box_size_request(widget, &req); *minimum_height = req.height; *natural_height = req.height; } static void simo_combo_box_get_preferred_width(GtkWidget *widget, gint *minimum_width, gint *natural_width) { GtkRequisition req; simo_combo_box_size_request(widget, &req); *minimum_width = req.width; *natural_width = req.width; } static void simo_combo_box_size_request( GtkWidget *widget, GtkRequisition *req ) { SimoComboBox *combo_box = SIMO_COMBO_BOX(widget); //gint width = req->width; //gint height = req->height; GtkRequisition breq, ereq, lreq, areq; // g_print( "ENTER: simo_combo_box_size_request\n" ); // g_print( "before entry width: %d, button width: %d. total width: %d height: %d\n", // combo_box->priv->entry_alloc.width, combo_box->button->allocation.width, width, height ); if (combo_box->priv->n_lines > 1) { gtk_widget_get_preferred_size(combo_box->priv->scrolled_window, NULL, &ereq); } else { gtk_widget_get_preferred_size(combo_box->entry, NULL, &ereq); } gtk_widget_get_preferred_size(combo_box->button, NULL, &breq); gtk_widget_get_preferred_size(combo_box->priv->label_button, NULL, &lreq); gtk_widget_get_preferred_size(combo_box->priv->vbox_arrows, NULL, &areq); if (lreq.width < ereq.width) { ereq.width = lreq.width; } else { lreq.width = ereq.width; } lreq.height = breq.height; ereq.height = breq.height; if (combo_box->priv->n_lines > 1) { req->height = simo_combo_box_get_line_height(combo_box) * combo_box->priv->n_lines + 8; } else { req->height = breq.height; } req->width = ereq.width + breq.width + areq.width; if (req->width < (combo_box->priv->fixed_entry_size + breq.width + areq.width)) { req->width = combo_box->priv->fixed_entry_size + breq.width + areq.width; ereq.width = combo_box->priv->fixed_entry_size; lreq.width = combo_box->priv->fixed_entry_size; } gtk_widget_set_size_request(combo_box->priv->label_button, lreq.width, lreq.height); // gtk_widget_size_request( combo_box->priv->label_button, &lreq ); //gtk_widget_size_request( combo_box->entry, &ereq ); gtk_widget_set_size_request(combo_box->entry, ereq.width, ereq.height); gtk_widget_set_size_request(combo_box->priv->scrolled_window, ereq.width, ereq.height); //width = req->width; //height = req->height; // g_print( "after entry width: %d, button width: %d. total width: %d height: %d\n", // combo_box->priv->entry_alloc.width, combo_box->button->allocation.width, width, height ); // g_print( "LEAVE: simo_combo_box_size_request\n" ); } static void simo_combo_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { GtkAllocation ealloc; SimoComboBox *combo = SIMO_COMBO_BOX( widget ); GtkAllocation combobtnAlloc; GtkAllocation vboxarrowsAlloc; // g_print( "ENTER: simo_combo_box_size_allocate\n" ); g_return_if_fail( SIMO_IS_COMBO_BOX( widget ) ); g_return_if_fail( allocation != NULL ); GTK_WIDGET_CLASS( parent_class )->size_allocate( widget, allocation ); // g_print( "combo box allocate: %d:%d:%d:%d:%d\n", allocation->x, allocation->y, allocation->width, allocation->height, combo->priv->fixed_entry_size ); gtk_widget_get_allocation(combo->button, &combobtnAlloc); gtk_widget_get_allocation(combo->priv->vbox_arrows, &vboxarrowsAlloc); ealloc.x = allocation->x; ealloc.y = allocation->y; ealloc.width = allocation->width - combobtnAlloc.width - vboxarrowsAlloc.width; ealloc.height = allocation->height; if (combo->priv->n_lines > 1) { gtk_widget_size_allocate( combo->priv->scrolled_window, &ealloc ); } else { gtk_widget_size_allocate( combo->entry, &ealloc ); } // gtk_widget_size_allocate( combo->button, &combo->button->allocation.width ); gtk_widget_size_allocate( combo->priv->label_button, &ealloc ); // g_print( "LEAVE: simo_combo_box_size_allocate\n" ); // } } static gint simo_combo_box_get_line_height(SimoComboBox *combo_box) { if (combo_box->priv->cached_line_height == 0) { PangoLayout *layout; PangoRectangle logical_rect; layout = gtk_widget_create_pango_layout(GTK_WIDGET(combo_box->txtview), "W"); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); combo_box->priv->cached_line_height = logical_rect.height; g_object_unref(layout); } return combo_box->priv->cached_line_height; } GtkWidget * simo_combo_box_new() { return g_object_new( simo_combo_box_get_type(), NULL ); } GtkWidget * simo_combo_box_new_with_model( GtkTreeModel *model ) { SimoComboBox *cb = (SimoComboBox*)g_object_new( simo_combo_box_get_type(), NULL ); simo_combo_box_set_model( cb, model ); gtk_entry_completion_set_model( cb->priv->completion, model ); return (GtkWidget*)cb; } void simo_combo_box_set_model( SimoComboBox *combo_box, GtkTreeModel *model) { if( combo_box->model ) g_object_unref( combo_box->model ); combo_box->model = model; gtk_tree_view_set_model( combo_box->treeview, combo_box->model ); if( combo_box->model ){ g_object_ref( combo_box->model ); g_signal_connect( combo_box->model, "row-deleted", G_CALLBACK( simo_combo_box_row_deleted ), combo_box ); gtk_entry_set_completion( GTK_ENTRY( combo_box->entry ), NULL ); // g_object_unref( combo_box->priv->completion ); combo_box->priv->completion = gtk_entry_completion_new(); gtk_entry_set_completion( GTK_ENTRY( combo_box->entry ), combo_box->priv->completion ); g_object_unref( combo_box->priv->completion ); gtk_entry_completion_set_model( combo_box->priv->completion, combo_box->model ); /*gtk_entry_completion_set_text_column( combo_box->priv->completion, combo_box->visible_column );*/ } // g_signal_connect( combo_box->model, "row-inserted", G_CALLBACK( simo_combo_box_row_inserted ), combo_box ); } void simo_combo_box_set_visible_column( SimoComboBox *combo_box, int col_id ) { combo_box->visible_column = col_id; gtk_entry_completion_set_text_column( combo_box->priv->completion, col_id ); } void simo_combo_box_set_combo_column(SimoComboBox *combo_box, GtkTreeViewColumn *column) { gtk_tree_view_remove_column(combo_box->treeview, combo_box->column); gtk_tree_view_append_column(combo_box->treeview, column); combo_box->column = column; } GtkEntryCompletion * simo_combo_box_get_completion(SimoComboBox *combo_box) { return combo_box->priv->completion; } void simo_combo_box_set_completion_renderer(SimoComboBox *combo_box, GtkCellRenderer *renderer) { gtk_cell_layout_clear(GTK_CELL_LAYOUT(combo_box->priv->completion)); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo_box->priv->completion), renderer, TRUE); } void simo_combo_box_set_completion_cell_func(SimoComboBox *combo_box, GtkCellRenderer *renderer, GtkCellLayoutDataFunc func, gpointer user_data, GDestroyNotify destroy) { gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(combo_box->priv->completion), renderer, func, user_data, destroy); } GtkTreeModel *simo_combo_box_get_model( SimoComboBox *combo_box) { return combo_box->model; } static void simo_combo_box_row_deleted( GtkTreeModel *model, GtkTreePath *path, SimoComboBox *combo ) { if( combo->priv->current_path ){ if( !gtk_tree_path_compare( path, combo->priv->current_path ) ){ gtk_tree_path_free( combo->priv->current_path ); combo->priv->current_path = NULL; } } } static gboolean simo_combo_box_update_pressed( GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box ) { gdouble x, y; gint x1, x2, y1, y2; gint xoffset, yoffset; GtkAllocation alloc; // GtkWidget *event_widget; if( event->button != 1 ){ return FALSE; } x = event->x_root; y = event->y_root; gdk_window_get_root_origin( gtk_widget_get_window(widget), &xoffset, &yoffset ); gtk_widget_get_allocation(widget, &alloc); xoffset += alloc.x; yoffset += alloc.y; x1 = alloc.x + xoffset; y1 = alloc.y + yoffset; x2 = x1 + alloc.width; y2 = y1 + alloc.height; if( x > x1 && x < x2 && y > y1 && y < y2 ){ return TRUE; } simo_combo_box_popup_close( combo_box ); return TRUE; } static void simo_combo_box_popup_close( SimoComboBox *combo_box ) { g_signal_emit( combo_box, combo_box_signals[POPUP_CLOSED], 0 ); gtk_grab_remove( combo_box->priv->popup_window ); //gdk_keyboard_ungrab( GDK_CURRENT_TIME ); //gdk_pointer_ungrab( GDK_CURRENT_TIME ); g_signal_handlers_disconnect_by_func( G_OBJECT( combo_box->priv->popup_window ), G_CALLBACK( simo_combo_box_update_pressed ), combo_box ); #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) drop_shadow_detach( combo_box->priv->ds ); #endif #ifdef GDK_WINDOWING_WIN32 { RECT rcFrom, rcTo; HWND from_hwnd = GDK_WINDOW_HWND(gtk_widget_get_window(combo_box->priv->popup_window)); HWND to_hwnd = GDK_WINDOW_HWND(gtk_widget_get_window(GTK_WIDGET(combo_box))); GetWindowRect(from_hwnd,&rcFrom); GetWindowRect(to_hwnd,&rcTo); DrawAnimatedRects(from_hwnd,1,&rcFrom,&rcTo); ShowWindow(from_hwnd,SW_HIDE); } #endif // set toggle state on buttons gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( combo_box->priv->label_button ), FALSE ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( combo_box->button ), FALSE ); g_signal_handler_unblock( G_OBJECT( combo_box->button ), combo_box->priv->arrow_sig ); g_signal_handler_unblock( G_OBJECT( combo_box->priv->label_button ), combo_box->priv->bl_sig ); gtk_widget_hide(GTK_WIDGET(combo_box->priv->popup_window)); // the label should have focus after the combobox is clicked // make sure our widget has focus after being clicked on if (gtk_widget_get_can_focus(GTK_WIDGET(combo_box))) { // gtk_widget_grab_focus( GTK_WIDGET( combo_box ) ); if (gtk_widget_get_can_focus(combo_box->entry)) { gtk_widget_grab_focus(GTK_WIDGET(combo_box->entry)); } else if (gtk_widget_get_can_focus(combo_box->priv->label_button)) { gtk_widget_grab_focus(GTK_WIDGET( combo_box->priv->label_button)); } } } typedef struct _DimWin { gint count; gint max_width; SimoComboBox *combo; PangoFontDescription *desc; } DimWin; static gboolean compute_max_width( GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, DimWin *dim ) { GValue value = {0}; PangoLayout *layout; PangoRectangle pango_rect; gtk_tree_model_get_value( model, iter, dim->combo->visible_column, &value ); if( G_VALUE_TYPE( &value ) == G_TYPE_STRING ){ const gchar *text = g_value_get_string( &value ); if( text && strlen( text ) > 0 ){ if( dim->desc ){ layout = gtk_widget_create_pango_layout( GTK_WIDGET( dim->combo->treeview ), text ); pango_layout_set_font_description( layout, dim->desc ); pango_layout_get_pixel_extents( layout, NULL, &pango_rect ); g_object_unref( layout ); if( pango_rect.width > dim->max_width ) dim->max_width = pango_rect.width; } } g_value_unset( &value ); } dim->count++; return FALSE; } static void simo_combo_box_compute_tree_size( SimoComboBox *combo, gint *max_cell_width, gint *max_cell_height, gint *number_rows ) { GList *i, *j; gint max_height = 0; gint height; gint spacing = 0; DimWin dim = { 0, 0, combo, 0 }; PangoFontDescription *desc = 0; // get the max height i.e. the tallest cell renderer // loop over each column for( i = gtk_tree_view_get_columns( combo->treeview ); i; i = g_list_next( i ) ){ spacing += gtk_tree_view_column_get_spacing( GTK_TREE_VIEW_COLUMN( i->data ) ); // loop over each cell renderer for (j = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(i->data)); j; j = g_list_next(j)) { GtkRequisition size_req; gtk_cell_renderer_get_preferred_size(GTK_CELL_RENDERER(j->data), GTK_WIDGET(combo->treeview), NULL, &size_req); if (gtk_cell_renderer_text_get_type() == G_OBJECT_TYPE(j->data)) { if (desc) { pango_font_description_free(desc); desc = 0; } g_object_get(G_OBJECT(j->data), "font-desc", &desc, NULL); } height = size_req.height + gtk_tree_view_column_get_spacing(GTK_TREE_VIEW_COLUMN(i->data)); if (height > max_height) { max_height = height; } } } dim.desc = desc; // calculate the max width required based on the text in each cell this is expansive and hence we should consider // an alternative. Esspecially since it assumes text!! gtk_tree_model_foreach( combo->model, (GtkTreeModelForeachFunc)compute_max_width, &dim ); #ifdef GDK_WINDOWING_WIN32 // NOTE: this should be conditional if gtk+2.5 > then don't add 80 and use ellipsize *max_cell_width = dim.max_width + spacing + 30; // for padding we add 80 this can't be right there must be a value we can get from somewhere else #else *max_cell_width = dim.max_width + spacing + 80; // for padding we add 80 this can't be right there must be a value we can get from somewhere else #endif *max_cell_height = max_height; *number_rows = dim.count; if( desc ){ pango_font_description_free( desc ); desc = 0; } } void simo_combo_box_popup( SimoComboBox *combo_box ) { gint bx,by; gint width, height; gint screen_height, screen_width; GtkWidget *widget; GtkAllocation alloc; SimoComboBoxPrivate *mthis; // GtkTreeViewColumn *column; gint tree_req_height, cell_width, cell_height, count; g_return_if_fail( SIMO_IS_COMBO_BOX( combo_box ) ); /* if( combo_box->priv->editable_signal > 0 && g_signal_handler_is_connected( combo_box->entry, combo_box->priv->editable_signal ) ){ g_signal_handler_block( combo_box->entry, combo_box->priv->editable_signal ); g_print( "signal blocked\n" ); } */ widget = GTK_WIDGET( combo_box ); mthis = combo_box->priv; if (mthis->parent == NULL) { mthis->parent = gtk_widget_get_toplevel(widget); if (!gtk_widget_is_toplevel(mthis->parent)) { return; } } g_signal_emit( combo_box, combo_box_signals[POPUP_DISPLAYED], 0 ); g_signal_connect( G_OBJECT( mthis->popup_window ), "button-release-event", G_CALLBACK( simo_combo_box_update_pressed ), combo_box ); // g_signal_connect( G_OBJECT( mthis->popup_window ), "event_after", // G_CALLBACK( simo_combo_box_button_after ), combo_box ); gtk_widget_get_allocation(widget, &alloc); // begin determining the window position gdk_window_get_origin( gtk_widget_get_window(widget), &bx, &by ); bx += alloc.x; by += alloc.y + alloc.height; screen_height = gdk_screen_height() - by; screen_width = gdk_screen_width(); gtk_widget_get_allocation(mthis->popup_window, &alloc); height = alloc.height; width = alloc.width; gtk_widget_get_allocation(widget, &alloc); gtk_window_move( GTK_WINDOW( mthis->popup_window ), -500, -500 ); gtk_widget_set_size_request( mthis->popup_window, alloc.width, 20 ); gtk_window_resize( GTK_WINDOW( mthis->popup_window ), 500, 500 ); gtk_widget_show( mthis->popup_window ); // begin determining the window dimensions // column = gtk_tree_view_get_column( combo_box->treeview, 0 ); simo_combo_box_compute_tree_size( combo_box, &cell_width, &cell_height, &count ); gtk_widget_hide( mthis->popup_window ); // g_print( "max width: %d max height: %d\n", cell_width, cell_height ); // we pad by 1/2 a cell height to avoid showing scrollbars when they're not needed tree_req_height = (count * cell_height) + (cell_height / 2); if( count > 0 && tree_req_height > 0 && tree_req_height < (gint)combo_box->max_popup_height ){ // gtk_widget_set_size_request( mthis->popup_window, cell_width, tree_req_height ); // gtk_window_resize( GTK_WINDOW( mthis->popup_window ), cell_width, tree_req_height ); // check if the scroll bars are visible tree_req_height += 15;//bar_height; cell_width += 15;//bar_width; /* if( GTK_SCROLLED_WINDOW( mthis->popup_scroll )->hscrollbar_visible || mthis->scrolls_visible ){ tree_req_height += 15;//bar_height; mthis->scrolls_visible = TRUE; } else{ mthis->scrolls_visible = FALSE; } if( GTK_SCROLLED_WINDOW( mthis->popup_scroll )->vscrollbar_visible || mthis->scrolls_visible ){ cell_width += 15;//bar_width; mthis->scrolls_visible = TRUE; } else{ mthis->scrolls_visible = FALSE; }*/ height = tree_req_height; } else if( count > 0 && tree_req_height > 0 ){ height = combo_box->max_popup_height; } else{ height = 20; } // TODO: we need to have a horizontal scroll bar apppear when the width exceeds our max width /* if( cell_width > widget->allocation.width + combo_box->max_popup_width ){ width = widget->allocation.width + combo_box->max_popup_width; } else*/ width = alloc.width; /* Never wider than the widget */ /* Always show popup below widget */ if( height > screen_height ){ height = screen_height - 15; } // g_print( "width: %d, height: %d\n", width, height ); gtk_widget_set_size_request( mthis->popup_window, width, height ); gtk_window_resize( GTK_WINDOW( mthis->popup_window ), width, height ); // end determining the window dimensions // do edge detection to ensure window is not clipped by the edge of the screen // ensure things are not hanging over the left edge if( bx < 0 ){ bx = 0; } // ensure things are not hanging over the right edge if( ( bx + width ) > screen_width ){ bx -= bx+width - screen_width; } gtk_window_move( GTK_WINDOW( mthis->popup_window ), bx, by ); gtk_widget_show_all( mthis->popup_window ); // gtk_widget_set_sensitive( combo_box->button, 0 ); // gtk_widget_set_sensitive( mthis->label_button, 0 ); g_signal_handler_block( G_OBJECT( combo_box->button ), combo_box->priv->arrow_sig ); g_signal_handler_block( G_OBJECT( combo_box->priv->label_button ), combo_box->priv->bl_sig ); //gtk_widget_grab_default( GTK_WIDGET( combo_box ) ); //grab_on_window( mthis->popup_window->window, gtk_get_current_event_time() ); // grab_on_window( GTK_WIDGET(combo_box->treeview)->window, gtk_get_current_event_time() ); if (!gtk_widget_has_focus(GTK_WIDGET(combo_box->treeview))) { gtk_widget_set_can_default(GTK_WIDGET(combo_box->treeview), TRUE); //gdk_keyboard_grab(gtk_widget_get_window(mthis->popup_window), // FALSE, GDK_CURRENT_TIME); gtk_widget_grab_focus(GTK_WIDGET(combo_box->treeview)); } gtk_grab_add( mthis->popup_window ); //gdk_pointer_grab( gtk_widget_get_window(mthis->popup_window), TRUE, // GDK_BUTTON_PRESS_MASK | // GDK_BUTTON_RELEASE_MASK | // GDK_POINTER_MOTION_MASK, // NULL, NULL, GDK_CURRENT_TIME ); // gtk_grab_add( combo_box->treeview ); // gtk_widget_grab_focus( mthis->parent ); // GTK_WIDGET_SET_FLAGS (combo_box->treeview, GTK_CAN_DEFAULT); // gtk_widget_grab_default( GTK_WIDGET( combo_box->treeview ) ); //gtk_button_released( GTK_BUTTON( combo_box->button ) ); //gtk_button_leave( GTK_BUTTON( combo_box->button ) ); #ifdef G_OS_WIN32 // workaround for bug: 152566 & 144269 //gtk_window_present( GTK_WINDOW( mthis->popup_window ) ); /*{// special case code to get focus on the combobox window HWND hwnd = (HWND)GDK_WINDOW_HWND( GTK_WIDGET( combo_box->treeview )->window ); SetFocus( hwnd ); SendMessage( tophwnd, WM_PARENTNOTIFY, (WPARAM)WM_LBUTTONDOWN, MAKELPARAM( pt.x, pt.y ) ); SendMessage( tophwnd, WM_MOUSEACTIVATE, (WPARAM)focus_handler->moz_hwnd, 1 ) }*/ //BringWindowToTop( (HWND)GDK_WINDOW_HWND( mthis->popup_window->window ) ); #endif #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) drop_shadow_attach( mthis->ds, mthis->popup_window, bx, by ); #endif // set toggle state on buttons gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( mthis->label_button ), TRUE ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( combo_box->button ), TRUE ); // } static gchar *get_gvalue_as_string( GValue *value ) { GType type = G_VALUE_TYPE( value ); switch( type ){ case G_TYPE_BOOLEAN: return g_strdup_printf( "%d", (int)g_value_get_boolean( value ) ); break; case G_TYPE_INT: return g_strdup_printf( "%d", g_value_get_int( value ) ); break; case G_TYPE_FLOAT: return g_strdup_printf( "%f", g_value_get_float( value ) ); break; case G_TYPE_DOUBLE: return g_strdup_printf( "%f", g_value_get_double( value ) ); break; case G_TYPE_STRING: return g_value_dup_string( value ); break; default: break; } return NULL; } static gboolean simo_combo_box_treeview_press_event( GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box ) { //SIMO_COMBO_BOX( widget )->priv->button_press_x = event->x; //SIMO_COMBO_BOX( widget )->priv->button_press_y = event->y; return FALSE; } static gboolean simo_combo_box_treeview_release_event( GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box ) { GtkTreePath *path; GtkTreeViewColumn *col; GtkAllocation alloc; gtk_widget_get_allocation(widget, &alloc); if( (event->x > alloc.x) && (event->x < (alloc.x + alloc.width)) && (event->y > alloc.y) && (event->y < (alloc.y + alloc.height)) ){ if( gtk_tree_view_get_path_at_pos( combo_box->treeview, (gint)event->x, (gint)event->y, &path, &col, NULL, NULL ) ){ GtkTreeIter iter; if( gtk_tree_model_get_iter( combo_box->model, &iter, path ) ){ if( simo_combo_box_is_seperator_row( combo_box, &iter ) ) return FALSE; gtk_tree_view_row_activated( combo_box->treeview, path, col ); g_signal_emit( combo_box, combo_box_signals[CLICKED], 0 ); } } } return FALSE; } static gboolean simo_combo_box_treeview_motion_event( GtkWidget *widget, GdkEventMotion *event, SimoComboBox *combo ) { GtkTreePath *path; if( gtk_tree_view_get_path_at_pos( combo->treeview, (gint)event->x, (gint)event->y, &path, NULL, NULL, NULL ) ){ GtkTreeIter iter; if( gtk_tree_model_get_iter( combo->model, &iter, path ) ){ GtkTreeSelection *selection; selection = gtk_tree_view_get_selection( combo->treeview ); gtk_tree_selection_select_iter( selection, &iter ); } gtk_tree_path_free( path ); } return FALSE; } static void simo_combo_box_row_activated( GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, SimoComboBox *combo ) { GtkTreeIter iter; // g_print( "row activated\n" ); if( gtk_tree_model_get_iter( combo->model, &iter, path ) ){ if( simo_combo_box_is_seperator_row( combo, &iter ) ) return; simo_combo_box_set_active_iter( combo, &iter ); simo_combo_box_popup_close( combo ); } } gboolean simo_combo_box_get_active_iter( SimoComboBox *combo_box, GtkTreeIter *iter ) { if( combo_box->priv->current_path ) return gtk_tree_model_get_iter( combo_box->model, iter, combo_box->priv->current_path ); else return FALSE; } void simo_combo_box_set_active_iter( SimoComboBox *combo_box, GtkTreeIter *iter ) { SimoComboBoxPrivate *mthis = combo_box->priv; GValue value = {0}; gchar *text = 0; if( mthis->current_path ) gtk_tree_path_free( mthis->current_path ); mthis->current_path = gtk_tree_model_get_path( combo_box->model, iter ); if( mthis->current_path ) gtk_tree_model_get_value( combo_box->model, iter, combo_box->visible_column, &value ); if( G_IS_VALUE( &value ) ) text = get_gvalue_as_string( &value ); if( text ){ gtk_entry_set_text( GTK_ENTRY( combo_box->entry ), text ); gtk_label_set_text( GTK_LABEL( combo_box->label ), text ); // TODO: elipsize text here when it does not fit in the button //gtk_button_set_label( GTK_BUTTON( combo_box->label ), text ); g_free( text ); } else{ gtk_entry_set_text( GTK_ENTRY( combo_box->entry ), "" ); gtk_label_set_text( GTK_LABEL( combo_box->label ), "" ); //gtk_button_set_label( GTK_BUTTON( combo_box->label ), "" ); } g_value_unset( &value ); } void simo_combo_box_insert_seperator( SimoComboBox *combo_box, GtkTreeIter *iter ) { gtk_tree_store_set( GTK_TREE_STORE( combo_box->model ), iter, combo_box->visible_column, combo_box_seperator, -1 ); } //EXPORT GtkWidget * create_simo_combo_box( gchar *widget_name, gchar *button_name, gchar *entry_name, gint editable, gint entry_alloc_width ) { GtkWidget *widget = simo_combo_box_new(); // g_print( "input: s1(%s), s2(%s), i1(%d), i2(%d)\n", string1, string2, int1, int2 ); // construct_simple_combo( SIMO_COMBO_BOX( widget ) ); gtk_widget_set_name( widget, widget_name ); simo_combo_box_set_editable( SIMO_COMBO_BOX( widget ), editable ); if( button_name ) gtk_widget_set_name( SIMO_COMBO_BOX( widget )->button, button_name ); // else // gtk_widget_set_name( SIMO_COMBO_BOX( widget )->button, "combo_button" ); if( entry_name ) gtk_widget_set_name( SIMO_COMBO_BOX( widget )->entry, entry_name ); // else // gtk_widget_set_name( SIMO_COMBO_BOX( widget )->button, "combo_entry" ); if( entry_alloc_width > 25 ){ // g_print( "setting fixed entry size: %d\n", entry_alloc_width ); SIMO_COMBO_BOX( widget )->priv->entry_alloc.width = entry_alloc_width; SIMO_COMBO_BOX( widget )->priv->fixed_entry_size = entry_alloc_width; } /* if( string1 && string2 ){ if( !strcmp( string1, "editable" ) ){ simo_combo_box_set_editable( SIMO_COMBO_BOX( widget ), !strcmp( string2, "TRUE" ) ); } } */ gtk_widget_show( widget ); return widget; } void simo_combo_box_set_editable( SimoComboBox *combo_box, gboolean editable_state ) { GtkWidget *widget = GTK_WIDGET( combo_box ); GtkWidget *button = combo_box->priv->label_button; // g_print( "ENTER: simo_combo_box_set_editable\n" ); combo_box->editable = editable_state; // gtk_editable_set_editable( GTK_EDITABLE( combo_box->entry ), editable_state ); // gtk_widget_set_sensitive( combo_box->entry, editable_state ); // g_object_set( G_OBJECT( combo_box->entry ), "can-focus", editable_state, NULL ); if( editable_state ){ if( widget == gtk_widget_get_parent(button) ){ const gchar *text = gtk_label_get_text( GTK_LABEL( combo_box->label ) ); g_object_ref( G_OBJECT( button ) ); gtk_container_remove( GTK_CONTAINER( combo_box ), button ); gtk_box_pack_start( GTK_BOX( combo_box ), combo_box->entry, TRUE, TRUE, 0 ); g_object_unref( G_OBJECT( combo_box->entry ) ); gtk_widget_hide( button ); gtk_widget_show( combo_box->entry ); if( text ){ gtk_entry_set_text( GTK_ENTRY( combo_box->entry ), text ); } //gtk_widget_set_size_request( GTK_WIDGET( combo_box->button ), 22, 22 ); } } else if( widget == gtk_widget_get_parent(combo_box->entry) ){ const gchar *text = gtk_entry_get_text( GTK_ENTRY( combo_box->entry ) ); // save the entry allocation //memcpy( &(combo_box->priv->entry_alloc), &(combo_box->entry->allocation), sizeof( GtkAllocation ) ); g_object_ref( G_OBJECT( combo_box->entry ) ); gtk_container_remove( GTK_CONTAINER( combo_box ), combo_box->entry ); // gtk_box_pack_start( GTK_BOX( combo_box ), button, TRUE, TRUE, 0 ); g_object_unref( G_OBJECT( button ) ); //gtk_widget_size_allocate( button, &combo_box->entry->allocation ); gtk_widget_hide( combo_box->entry ); gtk_widget_show( button ); if( text ){ gtk_label_set_text( GTK_LABEL( combo_box->label ), text ); } } // g_print( "LEAVE: simo_combo_box_set_editable\n" ); } gboolean simo_combo_box_get_editable( SimoComboBox *combo_box ) { return combo_box->editable;//gtk_editable_get_editable( GTK_EDITABLE( combo_box->entry ) ); } /* Text access functions */ const gchar * simo_combo_box_get_text(SimoComboBox *combo_box) { if (combo_box->priv->n_lines > 1) { GtkTextIter start; GtkTextIter end; g_free(combo_box->priv->ml_text); gtk_text_buffer_get_bounds(combo_box->txtbuffer, &start, &end); combo_box->priv->ml_text = gtk_text_buffer_get_text(combo_box->txtbuffer, &start, &end, FALSE); return combo_box->priv->ml_text; } else { return gtk_entry_get_text(GTK_ENTRY(combo_box->entry)); } } void simo_combo_box_set_text(SimoComboBox *combo_box, const gchar *text) { if (combo_box->priv->n_lines > 1) { gtk_text_buffer_set_text(combo_box->txtbuffer, text, -1); } else { gtk_entry_set_text(GTK_ENTRY(combo_box->entry), text); } } void simo_combo_box_set_visibility(SimoComboBox *combo_box, gboolean visible) { gtk_entry_set_visibility(GTK_ENTRY(combo_box->entry), visible); } void simo_combo_box_clear_text(SimoComboBox *combo_box) { simo_combo_box_set_text(combo_box, ""); } void simo_combo_box_set_position(SimoComboBox *combo_box, gint position) { if (combo_box->priv->n_lines > 1) { GtkTextIter iter; gtk_text_buffer_get_iter_at_offset(combo_box->txtbuffer, &iter, position); gtk_text_buffer_place_cursor(combo_box->txtbuffer, &iter); } else { gtk_editable_set_position(GTK_EDITABLE(combo_box->entry), position); } } gboolean simo_combo_box_get_selection_bounds(SimoComboBox *combo_box, gint *start, gint *end) { if (combo_box->priv->n_lines > 1) { GtkTextIter start_iter; GtkTextIter end_iter; gboolean retval; retval = gtk_text_buffer_get_selection_bounds(combo_box->txtbuffer, &start_iter, &end_iter); if (start) { *start = gtk_text_iter_get_offset(&start_iter); } if (end) { *end = gtk_text_iter_get_offset(&end_iter); } return retval; } else { return gtk_editable_get_selection_bounds(GTK_EDITABLE(combo_box->entry), start, end); } } void simo_combo_box_select_region(SimoComboBox *combo_box, gint start, gint end) { if (combo_box->priv->n_lines > 1) { GtkTextIter start_iter; GtkTextIter end_iter; gtk_text_buffer_get_iter_at_offset(combo_box->txtbuffer, &start_iter, start); gtk_text_buffer_get_iter_at_offset(combo_box->txtbuffer, &end_iter, end); gtk_text_buffer_select_range(combo_box->txtbuffer, &start_iter, &end_iter); } else { gtk_editable_select_region(GTK_EDITABLE(combo_box->entry), start, end); } } void simo_combo_box_delete_selection(SimoComboBox *combo_box) { if (combo_box->priv->n_lines > 1) { gtk_text_buffer_delete_selection(combo_box->txtbuffer, FALSE, TRUE); } else { gtk_editable_delete_selection(GTK_EDITABLE(combo_box->entry)); } } void simo_combo_box_cut_clipboard(SimoComboBox *combo_box) { if (combo_box->priv->n_lines > 1) { GdkDisplay *display; GtkClipboard *clipboard; display = gtk_widget_get_display(GTK_WIDGET(combo_box)); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD); gtk_text_buffer_cut_clipboard(combo_box->txtbuffer, clipboard, TRUE); } else { gtk_editable_cut_clipboard(GTK_EDITABLE(combo_box->entry)); } } void simo_combo_box_copy_clipboard(SimoComboBox *combo_box) { if (combo_box->priv->n_lines > 1) { GdkDisplay *display; GtkClipboard *clipboard; display = gtk_widget_get_display(GTK_WIDGET(combo_box)); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD); gtk_text_buffer_copy_clipboard(combo_box->txtbuffer, clipboard); } else { gtk_editable_copy_clipboard(GTK_EDITABLE(combo_box->entry)); } } void simo_combo_box_paste_clipboard(SimoComboBox *combo_box) { if (combo_box->priv->n_lines > 1) { GdkDisplay *display; GtkClipboard *clipboard; display = gtk_widget_get_display(GTK_WIDGET(combo_box)); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD); gtk_text_buffer_paste_clipboard(combo_box->txtbuffer, clipboard, NULL, TRUE); } else { gtk_editable_paste_clipboard(GTK_EDITABLE(combo_box->entry)); } } void simo_combo_box_set_entry_font(SimoComboBox *combo_box, PangoFontDescription *fontDesc) { gtk_widget_override_font(combo_box->entry, fontDesc); gtk_widget_override_font(combo_box->txtview, fontDesc); combo_box->priv->cached_line_height = 0; } static void simo_combo_box_grab_focus_signal(GtkWidget *widget) { SimoComboBox *combo_box = SIMO_COMBO_BOX(widget); if (combo_box->priv->n_lines > 1) { gtk_widget_grab_focus(combo_box->txtview); } else { gtk_widget_grab_focus(combo_box->entry); } } static void simo_combo_box_text_changed_cb(GtkEditable *editable, gpointer data) { g_signal_emit(SIMO_COMBO_BOX(data), combo_box_signals[CHANGED], 0); } static void simo_combo_box_entry_activate_cb(GtkEditable *editable, gpointer data) { g_signal_emit(SIMO_COMBO_BOX(data), combo_box_signals[ACTIVATE], 0); } static gboolean simo_combo_box_txtview_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if ((evt->keyval == GDK_KEY_Return || evt->keyval == GDK_KEY_KP_Enter) && !(evt->state & GDK_MOD1_MASK) && !(evt->state & GDK_SHIFT_MASK) && !(evt->state & GDK_CONTROL_MASK)) { g_signal_emit(SIMO_COMBO_BOX(data), combo_box_signals[ACTIVATE], 0); return TRUE; } return FALSE; } static gboolean simo_combo_box_arrow_up_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) { SimoComboBox *combo_box = (SimoComboBox *) data; if (event->button != 1) { return FALSE; } if (combo_box->priv->n_lines == combo_box->priv->max_lines) { return TRUE; } simo_combo_box_set_n_lines(combo_box, combo_box->priv->n_lines + 1); if (combo_box->priv->n_lines == 2) { gtk_widget_grab_focus(combo_box->txtview); } return TRUE; } static gboolean simo_combo_box_arrow_down_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) { SimoComboBox *combo_box = (SimoComboBox *) data; if (event->button != 1) { return FALSE; } if (combo_box->priv->n_lines == 1) { return TRUE; } simo_combo_box_set_n_lines(combo_box, combo_box->priv->n_lines - 1); if (combo_box->priv->n_lines == 1) { gtk_widget_grab_focus(combo_box->entry); } return TRUE; } /* Multi-line support */ gint simo_combo_box_get_n_lines(SimoComboBox *combo_box) { return combo_box->priv->n_lines; } void simo_combo_box_set_n_lines(SimoComboBox *combo_box, gint n_lines) { gint start; gint end; GtkTextIter start_iter; GtkTextIter end_iter; if (n_lines == combo_box->priv->n_lines || n_lines <= 0) { return; } if (combo_box->priv->n_lines == 1 || (combo_box->priv->n_lines == 2 && n_lines == 1)) { if (n_lines > 1) { g_object_set(G_OBJECT(combo_box->entry), "no-show-all", TRUE, NULL); g_object_set(G_OBJECT(combo_box->priv->scrolled_window), "no-show-all", FALSE, NULL); gtk_widget_hide(combo_box->entry); gtk_widget_show_all(combo_box->priv->scrolled_window); /* Copy text and selected part */ g_signal_handler_block(G_OBJECT(combo_box->entry), combo_box->priv->single_changed_id); gtk_text_buffer_set_text(combo_box->txtbuffer, gtk_entry_get_text(GTK_ENTRY(combo_box->entry)), -1); gtk_editable_get_selection_bounds(GTK_EDITABLE(combo_box->entry), &start, &end); gtk_text_buffer_get_iter_at_offset(combo_box->txtbuffer, &start_iter, start); gtk_text_buffer_get_iter_at_offset(combo_box->txtbuffer, &end_iter, end); gtk_text_buffer_select_range(combo_box->txtbuffer, &start_iter, &end_iter); g_signal_handler_unblock(G_OBJECT(combo_box->entry), combo_box->priv->single_changed_id); } else { gchar *text; g_object_set(G_OBJECT(combo_box->entry), "no-show-all", FALSE, NULL); g_object_set(G_OBJECT(combo_box->priv->scrolled_window), "no-show-all", TRUE, NULL); gtk_widget_hide(combo_box->priv->scrolled_window); gtk_widget_show(combo_box->entry); /* Copy text and selected part */ g_signal_handler_block(G_OBJECT(combo_box->txtbuffer), combo_box->priv->multi_changed_id); gtk_text_buffer_get_bounds(combo_box->txtbuffer, &start_iter, &end_iter); text = gtk_text_buffer_get_text(combo_box->txtbuffer, &start_iter, &end_iter, FALSE); gtk_entry_set_text(GTK_ENTRY(combo_box->entry), text); g_free(text); gtk_text_buffer_get_selection_bounds(combo_box->txtbuffer, &start_iter, &end_iter); start = gtk_text_iter_get_offset(&start_iter); end = gtk_text_iter_get_offset(&end_iter); gtk_editable_select_region(GTK_EDITABLE(combo_box->entry), start, end); g_signal_handler_unblock(G_OBJECT(combo_box->txtbuffer), combo_box->priv->multi_changed_id); } } combo_box->priv->n_lines = n_lines; gtk_widget_queue_resize(GTK_WIDGET(combo_box)); g_signal_emit(combo_box, combo_box_signals[SIZE_CHANGED], 0); } /* Spell checking */ gboolean simo_combo_box_set_spell(SimoComboBox *combo, gboolean use_spell, gchar *language, GError **error) { #ifdef HAVE_GTKSPELL if (combo->priv->gtkspell) { /* We already have one */ if (!use_spell) { gtk_spell_checker_detach(combo->priv->gtkspell); combo->priv->gtkspell = NULL; return TRUE; } else { return gtk_spell_checker_set_language(combo->priv->gtkspell, language, error); } } else { /* We don't have one */ if (use_spell) { gboolean success; combo->priv->gtkspell = gtk_spell_checker_new(); gtk_spell_checker_attach(combo->priv->gtkspell, GTK_TEXT_VIEW(combo->txtview)); success = gtk_spell_checker_set_language(combo->priv->gtkspell, language, error); if (!success) { return FALSE; } return TRUE; } else { return TRUE; } } #else /* ! defined HAVE_GTKSPELL */ return FALSE; #endif } kildclient-3.0.0/src/plugins.c0000644000175000017500000001167212374460043013203 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" #include "ansi.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ static int plugin_name_comparer(const Plugin *plugin, const char *name); Plugin * get_plugin(World *world, const char *name) { GSList *pluginlst; pluginlst = g_slist_find_custom(world->plugins, name, (GCompareFunc) plugin_name_comparer); if (pluginlst) { return pluginlst->data; } else { return NULL; } } static int plugin_name_comparer(const Plugin *plugin, const char *name) { return strcmp(plugin->name, name); } void free_plugin(Plugin *plugin, World *world) { gchar *unload_command; unload_command = g_strdup_printf("%s::UNLOAD", plugin->name); eval_pv(unload_command, FALSE); g_free(unload_command); g_free(plugin->name); g_free(plugin->version); g_free(plugin->description); g_free(plugin); } gboolean load_plugin(World *world, gchar *filename, GError **error) { SV *command; SV *ret; GRAB_PERL(world); command = newSVpvf("($_error, $_pname) = $::world->_loadplugin('%s');", filename); eval_sv(command, G_ARRAY); SvREFCNT_dec(command); ret = get_sv("_error", FALSE); if (SvOK(ret)) { g_set_error(error, G_FILE_ERROR, G_FILE_ERROR_NOENT, _("Failed loading file %s: %s"), filename, SvPV_nolen(ret)); RELEASE_PERL(world); return FALSE; } RELEASE_PERL(world); return TRUE; } /* Startup plugins support */ void load_startup_plugins(World *world) { GSList *pluginitem; pluginitem = world->startup_plugin_files; while (pluginitem) { GError *error = NULL; add_startup_plugin(world, pluginitem->data, &error); if (error) { fputs(error->message, stderr); fputc('\n', stderr); g_error_free(error); } else { gchar *cmd = g_strdup_printf("$::world->loadplugin('%s');", (gchar *) pluginitem->data); eval_pv(cmd, TRUE); g_free(cmd); } g_free(pluginitem->data); pluginitem = pluginitem->next; } g_slist_free(world->startup_plugin_files); } gboolean add_startup_plugin(World *world, gchar *filename, GError **error) { SV *command; SV *ret; gchar *name; gchar *description; gchar *author; GtkTreeIter iter; GRAB_PERL(world); command = newSVpvf("($_error, $_name, $_vers, $_desc, $_author) = $::world->_getplugininfo('%s');", filename); eval_sv(command, G_ARRAY); SvREFCNT_dec(command); ret = get_sv("_error", FALSE); if (SvOK(ret)) { g_set_error(error, G_FILE_ERROR, G_FILE_ERROR_NOENT, _("Failed loading file %s: %s"), filename, SvPV_nolen(ret)); RELEASE_PERL(world); return FALSE; } ret = get_sv("_name", FALSE); name = SvPV_nolen(ret); ret = get_sv("_desc", FALSE); description = SvPV_nolen(ret); ret = get_sv("_author", FALSE); author = SvPV_nolen(ret); RELEASE_PERL(world); gtk_list_store_append(GTK_LIST_STORE(world->startup_plugins), &iter); gtk_list_store_set(GTK_LIST_STORE(world->startup_plugins), &iter, SPLUGIN_FILE, filename, SPLUGIN_NAME, name, SPLUGIN_DESCRIPTION, description, SPLUGIN_AUTHOR, author, -1); return TRUE; } void make_startup_plugin_list_for_editing(World *world) { GSList *pluginitem; GtkTreeIter iter; pluginitem = world->startup_plugin_files; while (pluginitem) { gtk_list_store_append(GTK_LIST_STORE(world->startup_plugins), &iter); gtk_list_store_set(GTK_LIST_STORE(world->startup_plugins), &iter, SPLUGIN_FILE, pluginitem->data, -1); g_free(pluginitem->data); pluginitem = pluginitem->next; } g_slist_free(world->startup_plugin_files); } kildclient-3.0.0/src/we_logging.c0000644000175000017500000002212412374460043013635 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "simocombobox.h" #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ /* XML UI signals */ G_MODULE_EXPORT void we_log_start_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void we_log_stop_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void select_logfile_cb(gpointer data, GtkWidget *widget); G_MODULE_EXPORT void revert_logformat_cb(gpointer data, GtkWidget *widget); GObject * get_we_logging_tab(GtkBuilder *ui_builder, World *world) { GObject *panel; panel = gtk_builder_get_object(ui_builder, "we_panel_logging"); if (world == default_world) { /* These parts make no sense for the default world, so let's hide them */ GObject *vbox_log_status; GObject *vbox_log_file; vbox_log_status = gtk_builder_get_object(ui_builder, "vbox_log_status"); vbox_log_file = gtk_builder_get_object(ui_builder, "vbox_log_file"); g_object_set(vbox_log_status, "no-show-all", TRUE, NULL); g_object_set(vbox_log_file, "no-show-all", TRUE, NULL); } return panel; } void fill_we_logging_tab(World *world, GtkBuilder *ui_builder) { GtkLabel *lblLogStatus; GtkWidget *btnLogStart; GtkWidget *btnLogStop; GObject *txtLogFile; GtkToggleButton *chkLogAuto; GtkToggleButton *chkLogAddTime; GtkEntry *txtLogTimeFormat; if (!world) { return; } if (!ui_builder) { /* Called from Perl's XS_logfile. In this case there is no ui_builder, and the World Editor might not have been created yet. */ if (!world->dlgEditWorld) { return; } ui_builder = world->ui_builder; } lblLogStatus = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblLogStatus")); btnLogStart = GTK_WIDGET(gtk_builder_get_object(ui_builder, "btnLogStart")); btnLogStop = GTK_WIDGET(gtk_builder_get_object(ui_builder, "btnLogStop")); txtLogFile = gtk_builder_get_object(ui_builder, "txtLogFile"); chkLogAuto = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkLogAuto")); chkLogAddTime = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkLogAddTime")); txtLogTimeFormat = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtLogTimeFormat")); if (world->connected) { if (world->log_file) { gchar *msg; msg = g_strdup_printf(_("Logging to file %s."), world->log_actual_file); gtk_label_set_text(lblLogStatus, msg); g_free(msg); gtk_widget_set_sensitive(btnLogStart, FALSE); gtk_widget_set_sensitive(btnLogStop, TRUE); } else { gtk_label_set_text(lblLogStatus, _("Logging is disabled.")); gtk_widget_set_sensitive(btnLogStart, TRUE); gtk_widget_set_sensitive(btnLogStop, FALSE); } } else { gtk_label_set_text(lblLogStatus, _("Not connected.")); gtk_widget_set_sensitive(btnLogStart, FALSE); gtk_widget_set_sensitive(btnLogStop, FALSE); } if (world->log_file_name) { gtk_entry_set_text(GTK_ENTRY(txtLogFile), world->log_file_name); } else { gtk_entry_set_text(GTK_ENTRY(txtLogFile), ""); } gtk_toggle_button_set_active(chkLogAuto, world->log_autostart); gtk_toggle_button_set_active(chkLogAddTime, world->log_add_time); if (world->log_timeformat) { gtk_entry_set_text(txtLogTimeFormat, world->log_timeformat); } else { gtk_entry_set_text(txtLogTimeFormat, ""); } /* Store pointer to dlgEditWorld so it can be used as a parent in the select_logfile_cb callback */ g_object_set_data(txtLogFile, "dlgEditWorld", world->dlgEditWorld); } void update_we_logging_parameters(World *world, GtkBuilder *ui_builder) { GtkEntry *txtLogFile; GtkToggleButton *chkLogAuto; GtkToggleButton *chkLogAddTime; GtkEntry *txtLogTimeFormat; const gchar *filename; const gchar *format; txtLogFile = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtLogFile")); chkLogAuto = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkLogAuto")); chkLogAddTime = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkLogAddTime")); txtLogTimeFormat = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtLogTimeFormat")); g_free(world->log_file_name); filename = gtk_entry_get_text(txtLogFile); if (filename && *filename) { world->log_file_name = g_strdup(filename); } else { world->log_file_name = NULL; } world->log_autostart = gtk_toggle_button_get_active(chkLogAuto); world->log_add_time = gtk_toggle_button_get_active(chkLogAddTime); format = gtk_entry_get_text(txtLogTimeFormat); if (!world->log_timeformat || strcmp(world->log_timeformat, format) != 0) { g_free(world->log_timeformat); world->log_timeformat = g_strdup(format); } } void we_log_start_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; gint lines = 0; gchar *errmsg = NULL; GtkToggleButton *chkLogIncludePrevious; GtkSpinButton *spnLogPreviousLines; /* Copy parameters in the World structure */ update_we_logging_parameters(world, world->ui_builder); /* Has the user asked for inclusion of lines in the window buffer? */ chkLogIncludePrevious = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "chkLogIncludePrevious")); spnLogPreviousLines = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnLogPreviousLines")); if (gtk_toggle_button_get_active(chkLogIncludePrevious)) { lines = (int) gtk_spin_button_get_value(spnLogPreviousLines); } if (start_log(world, lines, &errmsg)) { fill_we_logging_tab(world, world->ui_builder); } else { GtkWidget *msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", errmsg); gtk_window_set_title(GTK_WINDOW(msgdlg), _("Logging not started")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); g_free(errmsg); } } void we_log_stop_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; update_we_logging_parameters(world, world->ui_builder); stop_log(world); fill_we_logging_tab(world, NULL); } void select_logfile_cb(gpointer data, GtkWidget *widget) { GtkEntry *txtLogFile = GTK_ENTRY(data); GtkWindow *dlgEditWorld; GtkWidget *filedlg; const gchar *filename; dlgEditWorld = GTK_WINDOW(g_object_get_data(G_OBJECT(txtLogFile), "dlgEditWorld")); filedlg = gtk_file_chooser_dialog_new(_("Select log file"), dlgEditWorld, GTK_FILE_CHOOSER_ACTION_SAVE, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_OK"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response(GTK_DIALOG(filedlg), GTK_RESPONSE_OK); filename = gtk_entry_get_text(txtLogFile); if (filename && *filename) { gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(filedlg), filename); } if (gtk_dialog_run(GTK_DIALOG(filedlg)) == GTK_RESPONSE_OK) { gchar *new_file; new_file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filedlg)); gtk_entry_set_text(txtLogFile, new_file); g_free(new_file); } gtk_widget_destroy(filedlg); } void revert_logformat_cb(gpointer data, GtkWidget *widget) { GtkEntry *txtLogTimeFormat = GTK_ENTRY(data); gtk_entry_set_text(txtLogTimeFormat, DEFAULT_LOGTIME_FORMAT); } kildclient-3.0.0/src/we_vars.c0000644000175000017500000004535212374460043013172 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkTreeModel *create_we_vars_model(World *world); static void we_var_configure_view(GtkTreeView *view, GtkTreeModel *model); static void we_var_add_cb(GtkButton *button, gpointer data); static void we_var_edit_cb(GtkButton *button, gpointer data); static void we_var_delete_cb(GtkButton *button, gpointer data); static void we_var_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); static gchar *edit_var(World *world, const gchar *var); static gboolean we_var_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void we_var_move_cb(GtkButton *button, gpointer data); GObject * get_we_vars_tab(World *world) { GtkBuilder *ui_builder; gchar *objects[] = { "we_panel_generic_graphical_editor", NULL }; GError *error = NULL; GObject *panel; GtkLabel *lblType; GObject *btnAdd; GObject *btnEdit; GObject *btnDelete; GObject *btnUp; GObject *btnDown; GObject *btnExport; GtkTreeSelection *selection; /* Create the dialog */ ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } panel = gtk_builder_get_object(ui_builder, "we_panel_generic_graphical_editor"); /* So it's not destroyed when the builder is destroyed */ g_object_ref(panel); world->viewVar = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "viewObjects")); g_object_set_data(G_OBJECT(world->viewVar), "forworld", world); g_signal_connect(G_OBJECT(world->viewVar), "row-activated", G_CALLBACK(we_var_view_row_dblclick_cb), world); g_signal_connect(G_OBJECT(world->viewVar), "key-press-event", G_CALLBACK(we_var_view_keypress_cb), world); lblType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblGEType")); gtk_label_set_markup(lblType, "Permanent Variables"); btnAdd = gtk_builder_get_object(ui_builder, "btnGEAdd"); g_signal_connect(btnAdd, "clicked", G_CALLBACK(we_var_add_cb), world->viewVar); btnEdit = gtk_builder_get_object(ui_builder, "btnGEEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(we_var_edit_cb), world->viewVar); btnDelete = gtk_builder_get_object(ui_builder, "btnGEDelete"); g_signal_connect(btnDelete, "clicked", G_CALLBACK(we_var_delete_cb), world->viewVar); btnUp = gtk_builder_get_object(ui_builder, "btnGEUp"); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_signal_connect(btnUp, "clicked", G_CALLBACK(we_var_move_cb), world->viewVar); btnDown = gtk_builder_get_object(ui_builder, "btnGEDown"); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); g_signal_connect(btnDown, "clicked", G_CALLBACK(we_var_move_cb), world->viewVar); btnExport = gtk_builder_get_object(ui_builder, "btnGEExport"); g_object_set_data(btnExport, "preselect", "Var"); world->permvars_model = create_we_vars_model(world); we_var_configure_view(world->viewVar, world->permvars_model); selection = gtk_tree_view_get_selection(world->viewVar); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_object_set_data(G_OBJECT(selection), "btnEdit", btnEdit); g_object_set_data(G_OBJECT(selection), "btnDelete", btnDelete); g_object_set_data(G_OBJECT(selection), "btnUp", btnUp); g_object_set_data(G_OBJECT(selection), "btnDown", btnDown); g_object_set_data(G_OBJECT(selection), "btnExport", btnExport); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(we_guied_selection_changed_cb), NULL); gtk_builder_connect_signals(ui_builder, world); g_object_unref(ui_builder); return panel; } static GtkTreeModel * create_we_vars_model(World *world) { GtkListStore *store; GtkTreeIter iter; GSList *varptr; gchar *var; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); varptr = world->permanent_variables; while (varptr) { var = (gchar *) varptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, var, -1); varptr = varptr->next; } return GTK_TREE_MODEL(store); } static void we_var_configure_view(GtkTreeView *view, GtkTreeModel *model) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, model); gtk_tree_view_set_headers_visible(view, FALSE); g_object_unref(model); /* Column 1 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(PERMVAR_NAME), NULL); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } static void we_var_add_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; gchar *var; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); var = edit_var(world, NULL); if (var) { world->permanent_variables = g_slist_append(world->permanent_variables, var); we_var_insert_var(world, var, -1); } } static void we_var_edit_cb(GtkButton *button, gpointer data) { /* Note that the Edit button is only active when exactly one row is selected. */ World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { gchar *var; gchar *newvar; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &var, -1); newvar = edit_var(world, var); if (newvar) { GSList *item; we_var_update_var(world, var, newvar); item = g_slist_find(world->permanent_variables, var); g_free(var); item->data = newvar; } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_var_delete_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { gchar *var; GtkWidget *msgdlg; gint n; n = gtk_tree_selection_count_selected_rows(selection); if (n == 1) { msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Do you really want to make the variable temporary?")); } else { msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Do you really want to make %d variables temporary?"), n); } gtk_window_set_title(GTK_WINDOW(msgdlg), _("Confirm deletion")); gtk_dialog_add_buttons(GTK_DIALOG(msgdlg), _("Keep permanent"), GTK_RESPONSE_NO, _("Make temporary"), GTK_RESPONSE_YES, NULL); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GList *listiter = g_list_last(selected); while (listiter) { gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &var, -1); we_var_delete_var(world, var); world->permanent_variables = g_slist_remove(world->permanent_variables, var); g_free(var); listiter = listiter->prev; } } gtk_widget_destroy(msgdlg); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_var_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { gchar *var; gchar *newvar; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &var, -1); newvar = edit_var(world, var); if (newvar) { GSList *item; we_var_update_var(world, var, newvar); item = g_slist_find(world->permanent_variables, var); g_free(var); item->data = newvar; } } } static gchar * edit_var(World *world, const gchar *var) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditVar", NULL }; GError *error = NULL; GtkWidget *dlgEditVar; GtkEntry *txtName; const gchar *givenname; gchar *newname; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; } dlgEditVar = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditVar")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditVar), GTK_RESPONSE_OK); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtVarName")); /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ if (var) { gtk_entry_set_text(txtName, var); } /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditVar); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditVar)) == GTK_RESPONSE_OK) { /* Validate */ givenname = gtk_entry_get_text(txtName); if (strcmp(givenname, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditVar), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify a variable name.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } if (givenname[0] != '$' && givenname[0] != '@' && givenname[0] != '%') { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditVar), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Only scalar ($), array (@) and hash (%%) variables can be made permanent.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* If we are adding (var == NULL) a new variable, or when editing but a different name is typed, verify if there's already a variable with that name. If we are editing and just press OK, ignore this check for the user convenience. */ if ((!var || strcmp(var, givenname) != 0) && g_slist_find_custom(world->permanent_variables, givenname, (GCompareFunc) strcmp)) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditVar), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("%s is already permanent."), givenname); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* We must make the copy before gtk_widget_destroy is called */ newname = g_strdup(givenname); gtk_widget_destroy(dlgEditVar); return newname; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditVar); return NULL; } } } static gboolean we_var_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_KEY_Delete || evt->keyval == GDK_KEY_KP_Delete) { we_var_delete_cb(NULL, widget); return TRUE; } return FALSE; } static void we_var_move_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; World *world; gboolean is_up; gint new_pos; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { gchar *var; gint pos; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &var, -1); pos = g_slist_index(world->permanent_variables, var); new_pos = pos; if (is_up) { if (pos != 0) { new_pos = pos - 1; move_var(world, pos, new_pos); } } else { if (pos != g_slist_length(world->permanent_variables) - 1) { new_pos = pos + 1; move_var(world, pos, new_pos); } } /* Reselect the moved item */ gtk_tree_model_iter_nth_child(model, &iter, NULL, new_pos); gtk_tree_selection_select_iter(selection, &iter); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } void we_var_update_var(World *world, const gchar *old_var, const gchar *new_var) { /* Called by the Perl functions when an var is changed, so that the display is updated. */ GtkTreeIter iter; gchar *var; gboolean success; if (!world->permvars_model) { return; } success = gtk_tree_model_get_iter_first(world->permvars_model, &iter); while (success) { gtk_tree_model_get(world->permvars_model, &iter, WE_GUIED_POINTER, &var, -1); if (var == old_var) { gtk_list_store_set(GTK_LIST_STORE(world->permvars_model), &iter, WE_GUIED_POINTER, new_var, -1); return; } success = gtk_tree_model_iter_next(world->permvars_model, &iter); } } void we_var_insert_var(World *world, const gchar *var, gint pos) { /* Called by the Perl functions when an var is inserted, so that the display is updated. */ GtkTreeIter iter; if (!world->permvars_model) { return; } if (pos < 0) { gtk_list_store_append(GTK_LIST_STORE(world->permvars_model), &iter); } else { gtk_list_store_insert(GTK_LIST_STORE(world->permvars_model), &iter, pos); } gtk_list_store_set(GTK_LIST_STORE(world->permvars_model), &iter, WE_GUIED_POINTER, var, -1); } void we_var_delete_var(World *world, const gchar *var_arg) { /* Called by the Perl functions when an var is deleted, so that the display is updated. */ GtkTreeIter iter; gchar *var; gboolean success; if (!world->permvars_model) { return; } success = gtk_tree_model_get_iter_first(world->permvars_model, &iter); while (success) { gtk_tree_model_get(world->permvars_model, &iter, WE_GUIED_POINTER, &var, -1); if (var == var_arg) { gtk_list_store_remove(GTK_LIST_STORE(world->permvars_model), &iter); return; } success = gtk_tree_model_iter_next(world->permvars_model, &iter); } } kildclient-3.0.0/src/mainwindow.c0000644000175000017500000012256412374471404013704 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "libintl-wrapper.h" #include #include #include #ifndef __MINGW32__ # include # include #else # include #endif #ifdef HAVE_LIBGNUTLS # include # include # include #endif #include "kildclient.h" #include "perlscript.h" #include "ansi.h" /****************** * Initialization * ******************/ World *currentWorld = NULL; GtkBuilder *main_builder = NULL; GtkWidget *wndMain = NULL; GtkWidget *ntbkWorlds = NULL; GList *open_worlds = NULL; gboolean window_has_focus = TRUE; gint worlds_with_new_text = 0; gboolean debug_matches = 0; /*********************** * Function prototypes * ***********************/ static void restore_main_window_size(int x, int y, int width, int height, WorldGUI *gui); static void set_initial_window_size(WorldGUI *gui); static gboolean update_world_with_focus(gpointer data); static gint attach_world_gui(WorldGUI *gui); static void detach_world_gui(WorldGUI *gui); static gchar *format_time_string(World *world, int ctime, int itime); static void format_hms_time(GString *str, int seconds); /* XMl UI callbacks */ G_MODULE_EXPORT gboolean exit_cb(GtkWidget *widget, GdkEvent *event, gpointer data); G_MODULE_EXPORT gboolean window_focus_in_cb(GtkWidget *widget, GdkEventFocus *evt, gpointer data); G_MODULE_EXPORT gboolean window_focus_out_cb(GtkWidget *widget, GdkEventFocus *evt, gpointer data); G_MODULE_EXPORT void notebook_page_changed_cb(GtkNotebook *notebook, gpointer *page, guint page_num, gpointer data); G_MODULE_EXPORT void notebook_page_reordered_cb(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer data); G_MODULE_EXPORT gboolean about_dlg_url_hook(GtkAboutDialog *about, gchar *link, gpointer data); /* Menus */ G_MODULE_EXPORT void menu_world_open_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void open_new_world_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void edit_this_world_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_statistics_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_edit_open_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_cut_activate_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_copy_activate_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_paste_activate_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_delete_activate_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_find_activate_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_input_clear_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_input_prev_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_input_next_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_input_find_prev_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_input_find_next_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_preferences_open_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_disable_triggers_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_disable_aliases_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_disable_macros_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_disable_timers_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_debug_matches_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_edit_default_world_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_display_open_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_split_screen_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_manual_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_about_cb(GtkMenuItem *widget, gpointer data); GtkWidget* create_main_window(WorldGUI *gui) { GError *error = NULL; GtkWidget *window; GObject *mnuReconnect; GObject *mnuDisconnect; GObject *mnuConnectAnother; GObject *mnuSave; GObject *mnuClose; GObject *mnuPrevious; GObject *mnuNext; GObject *mnuQuit; main_builder = gtk_builder_new(); if (!gtk_builder_add_from_file(main_builder, get_kildclient_installed_file("wndmain.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); exit(1); /* No point in continuing */ } gtk_builder_connect_signals(main_builder, NULL); window = GTK_WIDGET(gtk_builder_get_object(main_builder, "wndMain")); #ifndef __WIN32__ gtk_window_set_icon_from_file(GTK_WINDOW(window), SYSDATADIR "/pixmaps/kildclient.png", NULL); gtk_window_set_default_icon_from_file(SYSDATADIR "/pixmaps/kildclient.png", NULL); #endif /* User interface */ ntbkWorlds = GTK_WIDGET(gtk_builder_get_object(main_builder, "ntbkWorlds")); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(ntbkWorlds), globalPrefs.tab_position); attach_world_gui(gui); gtk_widget_grab_focus(GTK_WIDGET(gui->cmbEntry)); /* These signals apparently don't work from the XML file */ mnuReconnect = gtk_builder_get_object(main_builder, "mnuReconnect"); g_signal_connect(mnuReconnect, "activate", G_CALLBACK(menu_perl_run_cb), "$world->reconnect()"); mnuDisconnect = gtk_builder_get_object(main_builder, "mnuDisconnect"); g_signal_connect(mnuDisconnect, "activate", G_CALLBACK(menu_perl_run_cb), "$world->dc()"); mnuConnectAnother = gtk_builder_get_object(main_builder, "mnuConnectAnother"); g_signal_connect(mnuConnectAnother, "activate", G_CALLBACK(menu_perl_run_cb), "$world->connectother()"); mnuSave = gtk_builder_get_object(main_builder, "mnuSave"); g_signal_connect(mnuSave, "activate", G_CALLBACK(menu_perl_run_cb), "$world->save()"); mnuClose = gtk_builder_get_object(main_builder, "mnuClose"); g_signal_connect(mnuClose, "activate", G_CALLBACK(menu_perl_run_cb), "$world->close()"); mnuPrevious = gtk_builder_get_object(main_builder, "mnuPrevious"); g_signal_connect(mnuPrevious, "activate", G_CALLBACK(menu_perl_run_cb), "$world->prev()"); mnuNext = gtk_builder_get_object(main_builder, "mnuNext"); g_signal_connect(mnuNext, "activate", G_CALLBACK(menu_perl_run_cb), "$world->next()"); mnuQuit = gtk_builder_get_object(main_builder, "mnuQuit"); g_signal_connect(mnuQuit, "activate", G_CALLBACK(menu_perl_run_cb), "quit"); return window; } void set_main_window_size(int x, int y, int width, int height, WorldGUI *gui) { if (x != -1) { restore_main_window_size(x, y, width, height, gui); } else { set_initial_window_size(gui); } } void restore_main_window_size(int x, int y, int width, int height, WorldGUI *gui) { gtk_window_move(GTK_WINDOW(wndMain), x, y); gtk_window_resize(GTK_WINDOW(wndMain), width, height); } void set_initial_window_size(WorldGUI *gui) { /* Since world_gui_size_textview() sets the minimum size, and we only want to set the initial size, which is only possible for windows, we use a little trick. */ GtkRequisition requisition; world_gui_size_textview(gui); gtk_widget_get_preferred_size(GTK_WIDGET(gui->txtView), &requisition, NULL); gtk_widget_set_size_request(GTK_WIDGET(gui->txtView), 100, 100); gtk_window_resize(GTK_WINDOW(wndMain), requisition.width, requisition.height * 1.5); } gboolean exit_cb(GtkWidget *widget, GdkEvent *event, gpointer data) { if (confirm_quit()) { gtk_main_quit(); } /* Never let it propagate the event, since gtk_main_quit() deals with exiting. */ return TRUE; } gboolean window_focus_in_cb(GtkWidget *widget, GdkEventFocus *evt, gpointer data) { if (!currentWorld) return FALSE; currentWorld->has_focus = TRUE; if (currentWorld->has_unread_text) { /* If in offline mode, then the tab is greyed. Let's not change it. */ if (currentWorld->connected) { gtk_label_set_text(currentWorld->gui->lblNotebook, currentWorld->display_name); } currentWorld->has_unread_text = FALSE; --worlds_with_new_text; } if (currentWorld->selection_start || currentWorld->selection_end) { simo_combo_box_select_region(currentWorld->gui->cmbEntry, currentWorld->selection_start, currentWorld->selection_end); } window_has_focus = TRUE; adjust_window_title(); if (globalPrefs.urgency_hint) { gtk_window_set_urgency_hint(GTK_WINDOW(wndMain), FALSE); } if (currentWorld->connected) { execute_hook(currentWorld, "OnGetFocus", NULL); } return FALSE; } gboolean window_focus_out_cb(GtkWidget *widget, GdkEventFocus *evt, gpointer data) { if (!currentWorld) return FALSE; currentWorld->has_focus = FALSE; simo_combo_box_get_selection_bounds(currentWorld->gui->cmbEntry, ¤tWorld->selection_start, ¤tWorld->selection_end); window_has_focus = FALSE; adjust_window_title(); if (currentWorld->connected) { execute_hook(currentWorld, "OnLoseFocus", NULL); } return FALSE; } void adjust_window_title(void) { gchar *worldname; gchar *title; if (currentWorld) { if (currentWorld->connected) { worldname = g_strdup_printf(" - %s", currentWorld->display_name); } else { worldname = g_strdup_printf(" - [%s]", currentWorld->display_name); } } else { worldname = g_strdup(""); } if (window_has_focus || worlds_with_new_text == 0) { title = g_strdup_printf("KildClient%s", worldname); } else if (worlds_with_new_text == 1) { title = g_strdup_printf("(*) KildClient%s", worldname); } else { title = g_strdup_printf("(*)[%d] KildClient%s", worlds_with_new_text, worldname); } gtk_window_set_title(GTK_WINDOW(wndMain), title); g_free(worldname); g_free(title); if (!window_has_focus) { if (globalPrefs.urgency_hint) { gtk_window_set_urgency_hint(GTK_WINDOW(wndMain), worlds_with_new_text); } } } void notebook_page_changed_cb(GtkNotebook *notebook, gpointer *page, guint page_num, gpointer data) { World *old_world = NULL; gint old_page; old_page = gtk_notebook_get_current_page(notebook); if (old_page != - 1) { old_world = g_list_nth_data(open_worlds, old_page); } if (old_world) { old_world->has_focus = FALSE; old_world->is_current_tab = FALSE; if(old_world->connected) { execute_hook(old_world, "OnLoseFocus", NULL); } } /* Updates currentWorld, handles focus, etc. Called as idle because the change may result from a call to a Perl function, and this changes the current Perl interpreter. */ g_idle_add(update_world_with_focus, GINT_TO_POINTER(page_num)); } void notebook_page_reordered_cb(GtkNotebook *notebook, GtkWidget *widget, guint new_pos, gpointer data) { World *world; WorldGUI *gui; gint old_pos; GList *sucessor; gui = (WorldGUI *) g_object_get_data(G_OBJECT(widget), "gui"); world = gui->world; old_pos = g_list_index(open_worlds, world); sucessor = g_list_nth(open_worlds, new_pos); if (old_pos < new_pos) { sucessor = g_list_next(sucessor); } open_worlds = g_list_remove(open_worlds, world); open_worlds = g_list_insert_before(open_worlds, sucessor, world); } static gboolean update_world_with_focus(gpointer data) { gint n = GPOINTER_TO_INT(data); /* Now we make it point to the new world */ currentWorld = (World *) g_list_nth_data(open_worlds, n); world_for_perl = currentWorld; if (currentWorld) { currentWorld->has_focus = window_has_focus; currentWorld->is_current_tab = TRUE; if (currentWorld->has_unread_text) { gtk_label_set_text(currentWorld->gui->lblNotebook, currentWorld->display_name); currentWorld->has_unread_text = FALSE; --worlds_with_new_text; } adjust_window_title(); if (currentWorld->connected) { execute_hook(currentWorld, "OnGetFocus", NULL); } } /* Do not run again */ return FALSE; } void open_new_world_cb(GtkMenuItem *widget, gpointer data) { open_new_world(NULL, NULL, FALSE, NULL); } gboolean open_new_world(WorldGUI *gui, const gchar *cmdline_arg, gboolean can_offline, gboolean *offline_selected) { World *world = NULL; gint page = 0; gint action; gchar *errmsg = NULL; World *prev_world = NULL; gboolean our_gui = FALSE; if (!gui) { gui = world_gui_new(TRUE); page = attach_world_gui(gui); our_gui = TRUE; } else { prev_world = gui->world; } if (cmdline_arg) { world = get_world_from_cmdline(cmdline_arg); } else { world = get_world_to_connect(); } if (world) { world->gui = gui; gui->world = world; ansitextview_update_color_tags(gui, gui->world); while (1) { if (connect_to(world, &errmsg)) { set_focused_world(page); world->has_focus = TRUE; world->is_current_tab = TRUE; gtk_widget_grab_focus(GTK_WIDGET(world->gui->cmbEntry)); return TRUE; } else { action = disconnected_msgbox(errmsg, can_offline); g_free(errmsg); if (action == GTK_RESPONSE_CLOSE) { break; } if (action == RESP_OFFLINE) { *offline_selected = TRUE; free_world(world); gui->world = prev_world; ansitextview_update_color_tags(gui, gui->world); return TRUE; } if (action == RESP_OTHER) { free_world(world); world = get_world_to_connect(); if (!world) { break; } world->gui = gui; gui->world = world; ansitextview_update_color_tags(gui, gui->world); } } } } if (our_gui) { detach_world_gui(gui); free_world_gui(gui); } return FALSE; } void edit_this_world_cb(GtkMenuItem *widget, gpointer data) { gboolean dummy; edit_world(¤tWorld, GTK_WINDOW(wndMain), &dummy, FALSE); gtk_label_set_text(currentWorld->gui->lblNotebook, currentWorld->display_name); } void menu_statistics_cb(GtkMenuItem *widget, gpointer data) { GtkBuilder *ui_builder; GError *error = NULL; GtkWidget *dlgStatistics; GtkLabel *lblName; GtkLabel *lblHost; GtkLabel *lblPort; GtkLabel *lblProxyType; GtkLabel *lblProxyHost; GtkLabel *lblProxyPort; GtkLabel *lblConnTime; GtkLabel *lblIdleTime; GtkLabel *lblCompression; GtkLabel *lblRawBytes; GtkLabel *lblBytes; GtkLabel *lblCRatio; GtkLabel *lblLines; gchar *str; time_t now; GString *timestr; ui_builder = gtk_builder_new(); if (!gtk_builder_add_from_file(ui_builder, get_kildclient_installed_file("dlgStatistics.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return; } dlgStatistics = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgStatistics")); lblName = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblName")); lblHost = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblHost")); lblPort = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblPort")); lblConnTime = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblConnTime")); lblIdleTime = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblIdleTime")); lblCompression = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblCompression")); lblRawBytes = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblRawBytes")); lblBytes = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblBytes")); lblCRatio = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblCRatio")); lblLines = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblLines")); /* Basic information */ gtk_label_set_text(lblName, currentWorld->name); if (currentWorld->proxy_used.type == PROXY_NONE && currentWorld->host_ip) { str = g_strdup_printf("%s (%s)", currentWorld->host, currentWorld->host_ip); } else { str = g_strdup(currentWorld->host); } gtk_label_set_text(lblHost, str); g_free(str); gtk_label_set_text(lblPort, currentWorld->port); /* Proxy information */ if (currentWorld->proxy_used.type != PROXY_NONE) { lblProxyType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblProxyType")); lblProxyHost = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblProxyHost")); lblProxyPort = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblProxyPort")); if (currentWorld->proxy_used.type == PROXY_SOCKS4) { gtk_label_set_text(lblProxyType, "SOCKS4"); } else if (currentWorld->proxy_used.type == PROXY_SOCKS5) { gtk_label_set_text(lblProxyType, "SOCKS5"); } gtk_label_set_text(lblProxyHost, currentWorld->proxy_used.server); gtk_label_set_text(lblProxyPort, currentWorld->proxy_used.port); } if (currentWorld->connected) { now = time(NULL); timestr = g_string_new(NULL); format_hms_time(timestr, difftime(now, currentWorld->connected_time)); gtk_label_set_text(lblConnTime, timestr->str); g_string_truncate(timestr, 0); format_hms_time(timestr, difftime(now, currentWorld->last_command_time)); gtk_label_set_text(lblIdleTime, timestr->str); g_string_free(timestr, TRUE); } else { gtk_label_set_text(lblConnTime, _("Not connected")); gtk_label_set_text(lblIdleTime, _("Not connected")); } /* Compression Information */ if (currentWorld->zstream) { str = g_strdup_printf("MCCP version %d", currentWorld->mccp_ver); gtk_label_set_text(lblCompression, str); g_free(str); str = g_strdup_printf("%ld", currentWorld->rawbytes); gtk_label_set_text(lblRawBytes, str); g_free(str); str = g_strdup_printf("%ld", currentWorld->bytes); gtk_label_set_text(lblBytes, str); g_free(str); str = g_strdup_printf("%.2f:1", (double) currentWorld->bytes/(double) currentWorld->rawbytes); gtk_label_set_text(lblCRatio, str); g_free(str); } else { str = g_strdup_printf("%ld", currentWorld->rawbytes); gtk_label_set_text(lblBytes, str); g_free(str); } str = g_strdup_printf("%ld", currentWorld->deleted_lines + gtk_text_buffer_get_line_count(currentWorld->gui->txtBuffer)); gtk_label_set_text(lblLines, str); g_free(str); /* TLS information */ #ifdef HAVE_LIBGNUTLS if (currentWorld->use_tls) { GtkLabel *lblTLS; GtkLabel *lblTLSCipher; GtkLabel *lblTLSMAC; GtkLabel *lblTLSKX; GtkLabel *lblTLSComp; GtkLabel *lblTLSCertType; GtkLabel *lblTLSCertHostname; GtkLabel *lblTLSCertActivation; GtkLabel *lblTLSCertExpiration; GtkLabel *lblTLSCertFingerprint; gnutls_certificate_type_t cert_type; const gnutls_datum_t *cert_list; guint cert_list_size; gboolean hostname_matches = FALSE; time_t act_time; time_t exp_time; gchar digest[20]; size_t digest_size; const gchar *val; gchar *mval; gchar buf[MAX_BUFFER]; guint i; lblTLS = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLS")); val = gnutls_protocol_get_name(gnutls_protocol_get_version(currentWorld->tls_session)); gtk_label_set_text(lblTLS, val); lblTLSCipher = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCipher")); val = gnutls_cipher_get_name(gnutls_cipher_get(currentWorld->tls_session)); gtk_label_set_text(lblTLSCipher, val); lblTLSMAC = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSMAC")); val = gnutls_mac_get_name(gnutls_mac_get(currentWorld->tls_session)); gtk_label_set_text(lblTLSMAC, val); lblTLSKX = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSKX")); val = gnutls_kx_get_name(gnutls_kx_get(currentWorld->tls_session)); gtk_label_set_text(lblTLSKX, val); lblTLSComp = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSComp")); val = gnutls_compression_get_name(gnutls_compression_get(currentWorld->tls_session)); gtk_label_set_text(lblTLSComp, val); lblTLSCertType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertType")); cert_type = gnutls_certificate_type_get(currentWorld->tls_session); val = gnutls_certificate_type_get_name(cert_type); gtk_label_set_text(lblTLSCertType, val); /* Certificate/key information */ lblTLSCertHostname = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertHostname")); lblTLSCertActivation = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertActivation")); lblTLSCertExpiration = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertExpiration")); lblTLSCertFingerprint = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertFingerprint")); cert_list = gnutls_certificate_get_peers(currentWorld->tls_session, &cert_list_size); if (cert_type == GNUTLS_CRT_X509) { GtkLabel *lblTLSCertSubDN; GtkLabel *lblTLSCertIssDN; gnutls_x509_crt_t crt; size_t size; if (cert_list_size > 0) { /* Note that we consider only the first */ gnutls_x509_crt_init(&crt); gnutls_x509_crt_import(crt, &cert_list[0], GNUTLS_X509_FMT_DER); hostname_matches = gnutls_x509_crt_check_hostname(crt, currentWorld->host); act_time = gnutls_x509_crt_get_activation_time(crt); exp_time = gnutls_x509_crt_get_expiration_time(crt); digest_size = sizeof(digest); gnutls_x509_crt_get_fingerprint(crt, GNUTLS_DIG_MD5, digest, &digest_size); size = sizeof(buf); gnutls_x509_crt_get_dn(crt, buf, &size); lblTLSCertSubDN = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertSubDN")); gtk_label_set_text(lblTLSCertSubDN, buf); size = sizeof(buf); gnutls_x509_crt_get_issuer_dn(crt, buf, &size); lblTLSCertIssDN = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertIssDN")); gtk_label_set_text(lblTLSCertIssDN, buf); } } else { gtk_label_set_text(lblTLSCertHostname, "Unknown certificate type"); return; } if (hostname_matches) { mval = g_strdup_printf("Matches '%s'", currentWorld->host); } else { mval = g_strdup_printf("Does not match '%s'", currentWorld->host); } gtk_label_set_text(lblTLSCertHostname, mval); g_free(mval); now = time(NULL); strftime(buf, MAX_BUFFER, "%c", localtime(&act_time)); if (act_time > now) { strcat(buf, _(": Not yet active")); } gtk_label_set_text(lblTLSCertActivation, buf); strftime(buf, MAX_BUFFER, "%c", localtime(&exp_time)); if (exp_time < now) { strcat(buf, _(": Expired")); } gtk_label_set_text(lblTLSCertExpiration, buf); mval = buf; for (i = 0; i < digest_size; i++) { sprintf(mval, "%.2X:", (unsigned char) digest[i]); mval += 3; } mval[strlen(mval) - 1] = 0; /* Remove last : */ gtk_label_set_text(lblTLSCertFingerprint, buf); } else { GtkLabel *lblTLS; lblTLS = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLS")); gtk_label_set_text(lblTLS, _("None")); } #endif /* Run the dialog */ gtk_dialog_run(GTK_DIALOG(dlgStatistics)); gtk_widget_destroy(dlgStatistics); g_object_unref(ui_builder); } void menu_edit_default_world_cb(GtkMenuItem *widget, gpointer data) { gboolean dummy; edit_world(&default_world, GTK_WINDOW(wndMain), &dummy, FALSE); } void menu_manual_cb(GtkMenuItem *widget, gpointer data) { gchar *manualurl; #ifndef __WIN32__ manualurl = g_strdup_printf("file://%s", MANUALDIR "/index.html"); #else manualurl = g_strdup_printf(get_kildclient_installed_file("manual\\html\\index.html")); #endif menu_url_open(NULL, manualurl); } void menu_about_cb(GtkMenuItem *widget, gpointer data) { GError *error = NULL; static GtkAboutDialog *dlgAbout = NULL; if (!dlgAbout) { if (!gtk_builder_add_from_file(main_builder, get_kildclient_installed_file("dlgAbout.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return; } dlgAbout = GTK_ABOUT_DIALOG(gtk_builder_get_object(main_builder, "dlgAbout")); gtk_about_dialog_set_version(dlgAbout, VERSION); /* TODO: Will not be necessary if future glade versions do not insist on setting this property. */ gtk_about_dialog_set_logo(dlgAbout, NULL); gtk_builder_connect_signals(main_builder, NULL); } gtk_widget_show_all(GTK_WIDGET(dlgAbout)); gtk_window_present(GTK_WINDOW(dlgAbout)); } gboolean about_dlg_url_hook(GtkAboutDialog *about, gchar *link, gpointer data) { gchar *url = g_strdup(link); menu_url_open(NULL, url); return TRUE; } static gint attach_world_gui(WorldGUI *gui) { gint page; page = gtk_notebook_append_page(GTK_NOTEBOOK(ntbkWorlds), gui->vbox, GTK_WIDGET(gui->hboxTab)); gtk_widget_show_all(GTK_WIDGET(gui->hboxTab)); gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(ntbkWorlds), gui->vbox, TRUE); if (globalPrefs.hide_single_tab) { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(ntbkWorlds), gtk_notebook_get_n_pages(GTK_NOTEBOOK(ntbkWorlds)) != 1); } gtk_widget_show_all(ntbkWorlds); return page; } static void detach_world_gui(WorldGUI *gui) { gint old_page; gint new_page; old_page = gtk_notebook_page_num(GTK_NOTEBOOK(ntbkWorlds), gui->vbox); gtk_notebook_remove_page(GTK_NOTEBOOK(ntbkWorlds), old_page); if (globalPrefs.hide_single_tab) { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(ntbkWorlds), gtk_notebook_get_n_pages(GTK_NOTEBOOK(ntbkWorlds)) != 1); } new_page = gtk_notebook_get_current_page(GTK_NOTEBOOK(ntbkWorlds)); update_world_with_focus(GINT_TO_POINTER(new_page)); } void set_focused_world(gint page) { gtk_notebook_set_current_page(GTK_NOTEBOOK(ntbkWorlds), page); } gint get_focused_world(void) { return gtk_notebook_get_current_page(GTK_NOTEBOOK(ntbkWorlds)); } void remove_world(World *world, gboolean remove_gui) { open_worlds = g_list_remove(open_worlds, world); if (world->connected || world->connecting) { g_free(close_connection(world, TRUE)); } if (world->file) { save_world_to_file(world); save_command_history(world); save_permanent_variables(world); } if (remove_gui) { detach_world_gui(world->gui); free_world_gui(world->gui); } free_world(world); if (open_worlds == NULL) { gtk_main_quit(); } } gboolean remove_world_timer(World *world) { remove_world(world, TRUE); /* Because it is called as an idle function */ return FALSE; } void set_notebook_tab_position(GtkPositionType pos) { gtk_notebook_set_tab_pos(GTK_NOTEBOOK(ntbkWorlds), pos); } void menu_world_open_cb(GtkMenuItem *widget, gpointer data) { GtkWidget *mnuDisconnect = GTK_WIDGET(data); if (currentWorld && (currentWorld->connected || currentWorld->connecting)) { gtk_widget_set_sensitive(mnuDisconnect, TRUE); } else { gtk_widget_set_sensitive(mnuDisconnect, FALSE); } } void menu_edit_open_cb(GtkMenuItem *widget, gpointer data) { GtkWidget *mnuCut; GtkWidget *mnuCopy; GtkWidget *mnuPaste; GtkWidget *mnuDelete; GdkDisplay *display; GtkClipboard *clipboard; gboolean input_selected; gboolean output_selected; /* Safety check */ if (!currentWorld || !currentWorld->gui->cmbEntry || !currentWorld->gui->txtBuffer) { return; } mnuCut = GTK_WIDGET(gtk_builder_get_object(main_builder, "mnuCut")); mnuCopy = GTK_WIDGET(gtk_builder_get_object(main_builder, "mnuCopy")); mnuPaste = GTK_WIDGET(gtk_builder_get_object(main_builder, "mnuPaste")); mnuDelete = GTK_WIDGET(gtk_builder_get_object(main_builder, "mnuDelete")); /* We can paste when there is text in the clipboard */ display = gtk_widget_get_display(wndMain); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD); gtk_widget_set_sensitive(mnuPaste, gtk_clipboard_wait_is_text_available(clipboard)); /* We can cut and delete if there is text selected in the input box */ input_selected = simo_combo_box_get_selection_bounds(currentWorld->gui->cmbEntry, NULL, NULL); gtk_widget_set_sensitive(mnuCut, input_selected); gtk_widget_set_sensitive(mnuDelete, input_selected); /* We can copy if there is a selection in the input box or the output window */ output_selected = gtk_text_buffer_get_selection_bounds(currentWorld->gui->txtBuffer, NULL, NULL); gtk_widget_set_sensitive(mnuCopy, input_selected || output_selected); } void menu_cut_activate_cb(GtkMenuItem *widget, gpointer data) { simo_combo_box_cut_clipboard(currentWorld->gui->cmbEntry); } void menu_copy_activate_cb(GtkMenuItem *widget, gpointer data) { GtkTextIter start; GtkTextIter end; if (gtk_text_buffer_get_selection_bounds(currentWorld->gui->txtBuffer, &start, &end)) { GdkDisplay *display; GtkClipboard *clipboard; display = gtk_widget_get_display(GTK_WIDGET(currentWorld->gui->txtView)); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD); gtk_text_buffer_copy_clipboard(currentWorld->gui->txtBuffer, clipboard); /* The selection is unmarked after the previous step (possibly a issue with the non-focusability of the text buffer). So we set it again. */ gtk_text_buffer_select_range(currentWorld->gui->txtBuffer, &start, &end); } else { simo_combo_box_copy_clipboard(currentWorld->gui->cmbEntry); } } void menu_paste_activate_cb(GtkMenuItem *widget, gpointer data) { simo_combo_box_paste_clipboard(currentWorld->gui->cmbEntry); } void menu_delete_activate_cb(GtkMenuItem *widget, gpointer data) { simo_combo_box_delete_selection(currentWorld->gui->cmbEntry); } void menu_find_activate_cb(GtkMenuItem *widget, gpointer data) { GtkTextIter search_start; if (!currentWorld || !currentWorld->gui || !currentWorld->gui->search_box) { return; } g_object_set(G_OBJECT(currentWorld->gui->search_box), "no-show-all", FALSE, NULL); gtk_widget_show_all(currentWorld->gui->search_box); gtk_text_buffer_get_start_iter(currentWorld->gui->txtBuffer, &search_start); if (!currentWorld->gui->txtmark_search_start) { currentWorld->gui->txtmark_search_start = gtk_text_buffer_create_mark(currentWorld->gui->txtBuffer, NULL, &search_start, FALSE); currentWorld->gui->txtmark_next_search_start = gtk_text_buffer_create_mark(currentWorld->gui->txtBuffer, NULL, &search_start, FALSE); } gtk_entry_set_text(GTK_ENTRY(currentWorld->gui->txtSearchTerm), ""); gtk_widget_grab_focus(currentWorld->gui->txtSearchTerm); } void menu_findnext_activate_cb(GtkMenuItem *widget, gpointer data) { if (!currentWorld || !currentWorld->gui || !currentWorld->gui->search_box) { return; } if (!currentWorld->gui->txtmark_search_start) { /* No search started yet. */ menu_find_activate_cb(NULL, NULL); } else { find_next_cb(NULL, currentWorld->gui); } } void menu_input_clear_cb(GtkMenuItem *widget, gpointer data) { if (currentWorld) { clear_button_cb(NULL, currentWorld->gui); } } void menu_input_prev_cb(GtkMenuItem *widget, gpointer data) { if (currentWorld) { prev_or_next_command(currentWorld, FALSE); } } void menu_input_next_cb(GtkMenuItem *widget, gpointer data) { if (currentWorld) { prev_or_next_command(currentWorld, TRUE); } } void menu_input_find_prev_cb(GtkMenuItem *widget, gpointer data) { if (currentWorld) { find_prev_or_next_command(currentWorld, FALSE); } } void menu_input_find_next_cb(GtkMenuItem *widget, gpointer data) { if (currentWorld) { find_prev_or_next_command(currentWorld, TRUE); } } void menu_preferences_open_cb(GtkMenuItem *widget, gpointer data) { GtkCheckMenuItem *mnuDisableTriggers; GtkCheckMenuItem *mnuDisableAliases; GtkCheckMenuItem *mnuDisableMacros; GtkCheckMenuItem *mnuDisableTimers; if (!currentWorld) { return; } mnuDisableTriggers = GTK_CHECK_MENU_ITEM(gtk_builder_get_object(main_builder, "mnuDisTriggers")); mnuDisableAliases = GTK_CHECK_MENU_ITEM(gtk_builder_get_object(main_builder, "mnuDisAliases")); mnuDisableMacros = GTK_CHECK_MENU_ITEM(gtk_builder_get_object(main_builder, "mnuDisMacros")); mnuDisableTimers = GTK_CHECK_MENU_ITEM(gtk_builder_get_object(main_builder, "mnuDisTimers")); gtk_check_menu_item_set_active(mnuDisableTriggers, currentWorld->disable_triggers); gtk_check_menu_item_set_active(mnuDisableAliases, currentWorld->disable_aliases); gtk_check_menu_item_set_active(mnuDisableMacros, currentWorld->disable_macros); gtk_check_menu_item_set_active(mnuDisableTimers, currentWorld->disable_timers); } void menu_disable_triggers_cb(GtkMenuItem *widget, gpointer data) { currentWorld->disable_triggers = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); } void menu_disable_aliases_cb(GtkMenuItem *widget, gpointer data) { currentWorld->disable_aliases = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); } void menu_disable_macros_cb(GtkMenuItem *widget, gpointer data) { currentWorld->disable_macros = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); } void menu_disable_timers_cb(GtkMenuItem *widget, gpointer data) { currentWorld->disable_timers = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); } void menu_debug_matches_cb(GtkMenuItem *widget, gpointer data) { debug_matches = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); } void menu_display_open_cb(GtkMenuItem *widget, gpointer data) { GtkCheckMenuItem *mnuSplitWindow; if (!currentWorld) { return; } mnuSplitWindow = GTK_CHECK_MENU_ITEM(gtk_builder_get_object(main_builder, "mnuSplitWindow")); g_signal_handlers_block_by_func(G_OBJECT(mnuSplitWindow), menu_split_screen_cb, NULL); gtk_check_menu_item_set_active(mnuSplitWindow, gtk_paned_get_position(currentWorld->gui->split_pane) > 0); g_signal_handlers_unblock_by_func(G_OBJECT(mnuSplitWindow), menu_split_screen_cb, NULL); } void menu_split_screen_cb(GtkMenuItem *widget, gpointer data) { if (gtk_paned_get_position(currentWorld->gui->split_pane) == 0) { if (currentWorld->gui->last_split_position == 0) { GtkAllocation allocation; gtk_widget_get_allocation(GTK_WIDGET(currentWorld->gui->split_pane), &allocation); currentWorld->gui->last_split_position = allocation.height * .65; } gtk_paned_set_position(currentWorld->gui->split_pane, currentWorld->gui->last_split_position); } else { currentWorld->gui->last_split_position = gtk_paned_get_position(currentWorld->gui->split_pane); gtk_paned_set_position(currentWorld->gui->split_pane, 0); } } gboolean update_times_cb(gpointer data) { /* Updates the connection and idle timers in the status bar of the worlds */ GList *worldptr; World *world; time_t now; gchar *timestr; now = time(NULL); worldptr = open_worlds; while (worldptr) { world = (World *) worldptr->data; if (world->connected && world->gui && world->gui->lblTime) { timestr = format_time_string(world, (int) difftime(now, world->connected_time), (int) difftime(now, world->last_command_time)); gtk_label_set_text(world->gui->lblTime, timestr); g_free(timestr); } worldptr = worldptr->next; } return TRUE; } static gchar * format_time_string(World *world, int ctime, int itime) { GString *str; str = g_string_new(NULL); if (world->ctime_type != NO) { g_string_append(str, "Conn: "); if (world->ctime_type == SEC) { g_string_append_printf(str, "%ds", ctime); } else { format_hms_time(str, ctime); } if (world->itime_type != NO) { g_string_append(str, ", ");; } } if (world->itime_type != NO) { g_string_append(str, "Idle: "); if (world->itime_type == SEC) { g_string_append_printf(str, "%ds", itime); } else { format_hms_time(str, itime); } } return g_string_free(str, FALSE); } static void format_hms_time(GString *str, int seconds) { int hours; int minutes; hours = (int) (seconds/3600); seconds %= 3600; minutes = (int) (seconds/60); seconds %= 60; if (hours) { g_string_append_printf(str, "%dh", hours); } if (minutes) { if (hours) { g_string_append_printf(str, "%02dm", minutes); } else { g_string_append_printf(str, "%dm", minutes); } } g_string_append_printf(str, "%02ds", seconds); } kildclient-3.0.0/src/we_statusbar.c0000644000175000017500000001317312374460043014223 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "libintl-wrapper.h" #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ /* XML UI signals */ G_MODULE_EXPORT void statusfont_set_cb(GtkFontButton *font_btn, gpointer data); G_MODULE_EXPORT void time_type_changed_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void reset_activate_toggled_cb(GtkWidget *widget, gpointer data); /************************* * File global variables * *************************/ GObject * get_we_statusbar_tab(GtkBuilder *ui_builder) { GObject *panel; panel = gtk_builder_get_object(ui_builder, "we_panel_statusbar"); return panel; } void fill_we_statusbar_tab(World *world, GtkBuilder *ui_builder) { GtkFontButton *statusfont_btn; GtkToggleButton *radCTime_no; GtkToggleButton *radCTime_hms; GtkToggleButton *radCTime_sec; GtkToggleButton *radITime_no; GtkToggleButton *radITime_hms; GtkToggleButton *radITime_sec; GtkToggleButton *chkResetActivate; statusfont_btn = GTK_FONT_BUTTON(gtk_builder_get_object(ui_builder, "statusfont_btn")); gtk_font_button_set_font_name(statusfont_btn, world->statusfont); radCTime_no = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radCTime_no")); radCTime_hms = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radCTime_hms")); radCTime_sec = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radCTime_sec")); if (world->ctime_type == NO) { gtk_toggle_button_set_active(radCTime_no, TRUE); } else if (world->ctime_type == HMS) { gtk_toggle_button_set_active(radCTime_hms, TRUE); } else { gtk_toggle_button_set_active(radCTime_sec, TRUE); } radITime_no = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radITime_no")); radITime_hms = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radITime_hms")); radITime_sec = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radITime_sec")); if (world->itime_type == NO) { gtk_toggle_button_set_active(radITime_no, TRUE); } else if (world->itime_type == HMS) { gtk_toggle_button_set_active(radITime_hms, TRUE); } else { gtk_toggle_button_set_active(radITime_sec, TRUE); } chkResetActivate = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkResetActivate")); gtk_toggle_button_set_active(chkResetActivate, world->itime_reset_activate); } void statusfont_set_cb(GtkFontButton *font_btn, gpointer data) { PangoFontDescription *fontDesc; World *world = (World *) data; WorldGUI *gui = world->gui; free(world->statusfont); world->statusfont = g_strdup(gtk_font_button_get_font_name(font_btn)); if (gui) { GtkWidget *widget = GTK_WIDGET(world->gui->lblStatus); fontDesc = pango_font_description_from_string(world->statusfont); gtk_widget_override_font(widget, fontDesc); pango_font_description_free(fontDesc); } } void time_type_changed_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkToggleButton *radCTime_no; GtkToggleButton *radCTime_hms; GtkToggleButton *radITime_no; GtkToggleButton *radITime_hms; radCTime_no = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radCTime_no")); radCTime_hms = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radCTime_hms")); radITime_no = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radITime_no")); radITime_hms = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radITime_hms")); if (gtk_toggle_button_get_active(radCTime_no)) { world->ctime_type = NO; } else if (gtk_toggle_button_get_active(radCTime_hms)) { world->ctime_type = HMS; } else { world->ctime_type = SEC; } if (gtk_toggle_button_get_active(radITime_no)) { world->itime_type = NO; } else if (gtk_toggle_button_get_active(radITime_hms)) { world->itime_type = HMS; } else { world->itime_type = SEC; } } void reset_activate_toggled_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; world->itime_reset_activate = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); } kildclient-3.0.0/src/we_input.c0000644000175000017500000003243712374460043013356 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "simocombobox.h" #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ /* XML UI signals */ G_MODULE_EXPORT void multi_line_toggled_cb(GtkToggleButton *button, gpointer data); G_MODULE_EXPORT void input_size_changed_cb(GtkSpinButton *button, gpointer data); G_MODULE_EXPORT void entryfont_set_cb(GtkFontButton *font_btn, gpointer data); G_MODULE_EXPORT void flood_prevention_toggled_cb(GtkToggleButton *chkbox, gpointer data); GObject * get_we_input_tab(GtkBuilder *ui_builder) { GObject *panel; panel = gtk_builder_get_object(ui_builder, "we_panel_input"); return panel; } void fill_we_input_tab(World *world, GtkBuilder *ui_builder) { GtkToggleButton *chkRepeatCommands; GtkToggleButton *chkCmdEcho; GtkToggleButton *chkNeverHideInput; GtkToggleButton *chkStoreCommands; GtkSpinButton *spnCommandsToSave; GtkEntry *txtCommandSeparator; GObject *radSingleLine; GObject *radMultiLine; GtkSpinButton *spnNLines; GtkToggleButton *chkAutoCompletion; GtkSpinButton *spnMinPrefix; GtkToggleButton *chkSpell; GtkEntry *txtSpellLanguage; GtkFontButton *entryfont_btn; GObject *chkFloodPrevention; GtkWidget *spnMaxCommands; GtkEntry *txtPreventionCommand; if (!world) { return; } /* Get widgets */ chkRepeatCommands = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkRepeatCommands")); chkCmdEcho = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkCmdEcho")); chkNeverHideInput = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkNeverHideInput")); chkStoreCommands = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkStoreCommands")); spnCommandsToSave = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnCommandsToSave")); radSingleLine = gtk_builder_get_object(ui_builder, "radSingleLine"); radMultiLine = gtk_builder_get_object(ui_builder, "radMultiLine"); chkAutoCompletion = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkAutoCompletion")); spnMinPrefix = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnMinPrefix")); spnNLines = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnNLines")); chkSpell = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkSpell")); txtSpellLanguage = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtSpellLanguage")); txtCommandSeparator = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtCommandSeparator")); entryfont_btn = GTK_FONT_BUTTON(gtk_builder_get_object(ui_builder, "entryfont_btn")); chkFloodPrevention = gtk_builder_get_object(ui_builder, "chkFloodPrevention"); spnMaxCommands = GTK_WIDGET(gtk_builder_get_object(ui_builder, "spnMaxCommands")); txtPreventionCommand = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtPreventionCommand")); gtk_toggle_button_set_active(chkRepeatCommands, world->repeat_commands); gtk_toggle_button_set_active(chkCmdEcho, world->cmd_echo); gtk_toggle_button_set_active(chkNeverHideInput, world->never_hide_input); gtk_toggle_button_set_active(chkStoreCommands, world->store_commands); gtk_spin_button_set_value(spnCommandsToSave, world->commands_to_save); gtk_entry_set_text(txtCommandSeparator, world->command_separator); gtk_spin_button_set_value(spnNLines, world->input_n_lines_saved); set_input_line_controls(world, radSingleLine, radMultiLine, spnNLines); gtk_toggle_button_set_active(chkAutoCompletion, world->autocompletion); gtk_spin_button_set_value(spnMinPrefix, world->autocompl_minprefix); gtk_toggle_button_set_active(chkSpell, world->spell); if (world->spell_language) { gtk_entry_set_text(txtSpellLanguage, world->spell_language); } else { gtk_entry_set_text(txtSpellLanguage, ""); } gtk_font_button_set_font_name(entryfont_btn, world->entryfont); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chkFloodPrevention), world->flood_prevention); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spnMaxCommands), world->max_equal_commands); gtk_widget_set_sensitive(spnMaxCommands, world->flood_prevention); gtk_widget_set_sensitive(GTK_WIDGET(txtPreventionCommand), world->flood_prevention); if (world->flood_prevention_command) { gtk_entry_set_text(txtPreventionCommand, world->flood_prevention_command); } else { gtk_entry_set_text(txtPreventionCommand, ""); } } void update_we_input_parameters(World *world, GtkBuilder *ui_builder) { GtkToggleButton *chkRepeatCommands; GtkToggleButton *chkCmdEcho; GtkToggleButton *chkNeverHideInput; GtkToggleButton *chkFloodPrevention; GtkSpinButton *spnMaxCommands; GtkEntry *txtPreventionCommand; GtkToggleButton *chkStoreCommands; GtkSpinButton *spnCommandsToSave; GtkToggleButton *chkAutoCompletion; GtkSpinButton *spnMinPrefix; GtkToggleButton *chkSpell; GtkEntry *txtSpellLanguage; GtkEntry *txtCommandSeparator; GtkEntryCompletion *completion; const gchar *newval; /* Get widgets */ chkRepeatCommands = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkRepeatCommands")); chkCmdEcho = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkCmdEcho")); chkNeverHideInput = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkNeverHideInput")); chkStoreCommands = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkStoreCommands")); spnCommandsToSave = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnCommandsToSave")); chkAutoCompletion = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkAutoCompletion")); spnMinPrefix = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnMinPrefix")); chkSpell = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkSpell")); txtSpellLanguage = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtSpellLanguage")); txtCommandSeparator = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtCommandSeparator")); chkFloodPrevention = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkFloodPrevention")); spnMaxCommands = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnMaxCommands")); txtPreventionCommand = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtPreventionCommand")); world->repeat_commands = gtk_toggle_button_get_active(chkRepeatCommands); world->cmd_echo = gtk_toggle_button_get_active(chkCmdEcho); world->never_hide_input = gtk_toggle_button_get_active(chkNeverHideInput); if (world->gui) { simo_combo_box_set_visibility(world->gui->cmbEntry, TRUE); } world->store_commands = gtk_toggle_button_get_active(chkStoreCommands); world->commands_to_save = gtk_spin_button_get_value_as_int(spnCommandsToSave); world->autocompletion = gtk_toggle_button_get_active(chkAutoCompletion); world->autocompl_minprefix = gtk_spin_button_get_value_as_int(spnMinPrefix); if (world->gui) { completion = simo_combo_box_get_completion(world->gui->cmbEntry); if (world->autocompletion) { gtk_entry_completion_set_minimum_key_length(completion, world->autocompl_minprefix); } else { gtk_entry_completion_set_minimum_key_length(completion, 9999); } } world->spell = gtk_toggle_button_get_active(chkSpell); g_free(world->spell_language); newval = gtk_entry_get_text(txtSpellLanguage); if (strcmp(newval, "") != 0) { world->spell_language = g_strdup(newval); } else { world->spell_language = NULL; } if (world->gui) { worldgui_configure_spell(world->gui); } g_strlcpy(world->command_separator, gtk_entry_get_text(txtCommandSeparator), sizeof(world->command_separator)); world->flood_prevention = gtk_toggle_button_get_active(chkFloodPrevention); world->max_equal_commands = gtk_spin_button_get_value_as_int(spnMaxCommands); newval = gtk_entry_get_text(txtPreventionCommand); if (!world->flood_prevention_command || strcmp(world->flood_prevention_command, newval) != 0) { g_free(world->flood_prevention_command); world->flood_prevention_command = g_strdup(newval); } } void multi_line_toggled_cb(GtkToggleButton *button, gpointer data) { World *world = (World *) data; GtkToggleButton *radSingleLine; /* Avoid infinite loop */ if (world->updating_controls) { return; } radSingleLine = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radSingleLine")); /* If there is a gui, setting the size generates a signal that is caught, and world->input_n_lines is updated in that handler. */ if (gtk_toggle_button_get_active(radSingleLine)) { if (world->gui) { simo_combo_box_set_n_lines(world->gui->cmbEntry, 1); } else { world->input_n_lines = 1; } } else { if (world->gui) { simo_combo_box_set_n_lines(world->gui->cmbEntry, world->input_n_lines_saved); } else { world->input_n_lines = world->input_n_lines_saved; } } } void input_size_changed_cb(GtkSpinButton *button, gpointer data) { World *world = (World *) data; GtkToggleButton *radMultiLine; /* Avoid infinite loop */ if (world->updating_controls) { return; } radMultiLine = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radMultiLine")); world->input_n_lines_saved = gtk_spin_button_get_value_as_int(button); if (world->input_n_lines_saved > 10) { world->input_n_lines_saved = 10; } if (world->input_n_lines_saved < 2) { world->input_n_lines_saved = 2; } if (world->gui) { simo_combo_box_set_n_lines(world->gui->cmbEntry, world->input_n_lines_saved); } else { world->input_n_lines = world->input_n_lines_saved; } gtk_toggle_button_set_active(radMultiLine, TRUE); } void entryfont_set_cb(GtkFontButton *font_btn, gpointer data) { PangoFontDescription *fontDesc; World *world = (World *) data; WorldGUI *gui = world->gui; free(world->entryfont); world->entryfont = g_strdup(gtk_font_button_get_font_name(font_btn)); if (gui) { fontDesc = pango_font_description_from_string(world->entryfont); simo_combo_box_set_entry_font(gui->cmbEntry, fontDesc); pango_font_description_free(fontDesc); } } void flood_prevention_toggled_cb(GtkToggleButton *chkbox, gpointer data) { World *world = (World *) data; GtkWidget *spnMaxCommands; GtkWidget *txtPreventionCommand; gboolean enabled; /* Get widgets */ spnMaxCommands = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "spnMaxCommands")); txtPreventionCommand = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtPreventionCommand")); enabled = gtk_toggle_button_get_active(chkbox); gtk_widget_set_sensitive(spnMaxCommands, enabled); gtk_widget_set_sensitive(txtPreventionCommand, enabled); } void set_input_line_controls(World *world, GObject *radSingleLine, GObject *radMultiLine, GtkSpinButton *spnNLines) { /* If the controls have not been passed as argument. */ if (!radSingleLine) { if (!world->dlgEditWorld) { return; } radSingleLine = gtk_builder_get_object(world->ui_builder, "radSingleLine"); radMultiLine = gtk_builder_get_object(world->ui_builder, "radMultiLine"); spnNLines = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnNLines")); } world->updating_controls = TRUE; if (world->input_n_lines == 1) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radSingleLine), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radMultiLine), TRUE); gtk_spin_button_set_value(spnNLines, world->input_n_lines); } world->updating_controls = FALSE; } kildclient-3.0.0/src/mnuPopupURL.ui0000644000175000017500000000207612374201340014112 00000000000000 True False True False _Open link True True False _Copy link address True kildclient-3.0.0/src/parser.c0000644000175000017500000001421512374460043013012 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "libintl-wrapper.h" #include /* Perl includes */ #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static int find_next_command_separator(World *world, const char *cmdline); static void process_aliases(World *world, const char *cmdline, int start, int end); static void process_command(World *world, const char *cmd, int len); void parse_commands(World *world, const char *cmdline) { parse_commands_full(world, cmdline, NULL, NULL, FALSE); } void parse_commands_with_matches_and_notify(World *world, const char *cmdline, AV *matches) { parse_commands_full(world, cmdline, matches, NULL, TRUE); } void parse_commands_full(World *world, const gchar *cmdline, AV *matches, const gchar *colorline, gboolean notify) { MainThreadOperation *operation = g_new0(MainThreadOperation, 1); operation->action = PARSE_COMMANDS; operation->commands.commands = g_strdup(cmdline); operation->commands.matches = matches; operation->commands.colorline = g_strdup(colorline); operation->commands.notify = notify; queue_mainthread_operation(world, operation); } void mainthread_op_parse_commands(World *world, MainThreadOperation *operation) { gboolean needs_perl = operation->commands.colorline || operation->commands.matches; if (needs_perl) { GRAB_PERL(world); } if (operation->commands.colorline) { SV *Pcolorline; Pcolorline = get_sv("colorline", TRUE); sv_setpv(Pcolorline, operation->commands.colorline); } if (operation->commands.matches) { perl_set_arg_array(operation->commands.matches); } parse_command_line_immediately(world, operation->commands.commands); if (needs_perl) { RELEASE_PERL(world); } /* Notify waiting match trigger thread */ if (operation->commands.notify) { g_mutex_lock(&world->wait_command_mutex); world->command_executed = TRUE; g_cond_signal(&world->wait_command_cond); g_mutex_unlock(&world->wait_command_mutex); } } void parse_command_line_immediately(World *world, const char *cmdline) { int totallen; int seppos; int start; int end; gboolean quit; int cmdseplen; totallen = strlen(cmdline); cmdseplen = strlen(world->command_separator); start = 0; quit = FALSE; do { seppos = find_next_command_separator(world, cmdline + start); if (seppos == -1) { end = totallen; quit = TRUE; } else { seppos += start; end = seppos; while (isspace(cmdline[end-1])) --end; } process_aliases(world, cmdline, start, end); start = seppos + cmdseplen; while (isspace(cmdline[start])) ++start; } while (!quit); } static int find_next_command_separator(World *world, const char *cmdline) { int pos = 0; int len = strlen(cmdline); char quote = 0; int cmdseplen = strlen(world->command_separator); gboolean use_quotes = FALSE; if (cmdline[0] == '/' && len > 1 && cmdline[1] != '/') { use_quotes = TRUE; } while (pos < len) { if (use_quotes && (cmdline[pos] == '\"' || cmdline[pos] == '\'')) { if (quote) { if (cmdline[pos] == quote && cmdline[pos-1] != '\\') { quote = 0; } } else { if (pos == 0 || cmdline[pos-1] != '\\') { quote = cmdline[pos]; } } } else if (cmdline[pos] == world->command_separator[0]) { if (!quote && pos != (len - (cmdseplen-1)) && strncmp(cmdline + pos, world->command_separator, cmdseplen) == 0) { return pos; } } ++pos; } return -1; } static void process_aliases(World *world, const char *cmdline, int start, int end) { char cmd[MAX_BUFFER + 1]; int len = end - start; char *result; if (len >= MAX_BUFFER) { ansitextview_append_string_nl(world->gui, _("Warning: Trying to send a very long command line. Perhaps a recursive alias definition?")); process_command(world, cmdline + start, len); return; } memcpy(cmd, cmdline + start, len); cmd[len] = '\0'; result = substitute_aliases(world, cmd); if (result) { parse_command_line_immediately(world, result); g_free(result); } else { process_command(world, cmd, len); } } static void process_command(World *world, const char *cmd, int len) { if (*cmd != '/') { send_to_world(world, cmd, len); } else { if (*(cmd + 1) == '/') { send_to_world(world, cmd + 1, len - 1); } else { SV *commands; SV *error; GRAB_PERL(world); commands = newSVpv(cmd + 1, len - 1); eval_sv(commands, TRUE | G_EVAL); error = get_sv("@", TRUE); if (SvTRUE(error)) { ansitextview_append_stringf(world->gui, "Perl Error: %s", SvPV_nolen(error)); } RELEASE_PERL(world); } } } kildclient-3.0.0/src/net.h0000644000175000017500000000644112354321114012304 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __NET_H #define __NET_H /*************************** * Telnet protocol defines * ***************************/ #define TELNET_IAC 255 /* 0xFF, 0377 */ #define TELNET_WILL 251 /* 0xFB, 0373 */ #define TELNET_WONT 252 /* 0xFC, 0374 */ #define TELNET_DO 253 /* 0xFD, 0375 */ #define TELNET_DONT 254 /* 0xFE, 0376 */ #define TELNET_SB 250 /* 0xFA, 0372 */ #define TELNET_SE 240 /* 0xF0, 0360 */ #define TELNET_GA 249 /* 0xF9, 0371 */ #define TELNET_OPT_ECHO 1 /* D'oh */ #define TELNET_OPT_NAWS 31 /* 0x1f, 0037 */ #define TELNET_OPT_TERMINAL_TYPE 24 /* 0x18, 0030 */ #define TELNET_TERMTYPE_IS 0 #define TELNET_TERMTYPE_SEND 1 #define TELNET_OPT_COMPRESS 85 /* 0x55, 0125, "U" */ #define TELNET_OPT_COMPRESS2 86 /* 0x56, 0126, "V" */ #define TELNET_OPT_GMCP 201 /* 0xC9, 0311 */ #define TELNET_OPT_MSDP 69 /* 0x45, 0105, "E" */ /************** * Data types * **************/ struct resolve_data_s { World *world; gchar *host; gchar *port; int ai_family; struct addrinfo *addrinfo; gboolean (*callback)(gpointer); int ret; }; /********************************* * Function prototypes - general * *********************************/ gpointer resolve_name_thread(gpointer data); gboolean continue_connecting_cb(gpointer data); gboolean perform_tls_handshake(World *world); gboolean connected_to(World *world); void process_telnet_iac(World *world, int pos, int end); void start_mccp(World *world, int pos, int end); void end_mccp(World *world); /* Send and receive data */ #ifdef HAVE_LIBGNUTLS ssize_t kc_recv(World *world, void *buf, size_t s); ssize_t kc_send(World *world, const void *buf, size_t s); #else #define kc_recv(w, b, s) (recv((w)->sock, (b), (s), 0)) #define kc_send(w, b, s) (send((w)->sock, (b), (s), 0)) #endif /******************************* * Function prototypes - proxy * *******************************/ void proxy_info_free(proxy_settings *s); void proxy_info_copy(proxy_settings *source, proxy_settings *dest); gboolean proxy_socks4_resolved_real_host_cb(gpointer data); gboolean proxy_socks4_connected_to(World *world); gboolean proxy_socks5_connected_to(World *world); gboolean proxy_http_connected_to(World *world); #endif kildclient-3.0.0/src/kcircularqueue.c0000644000175000017500000000662012354367754014560 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include #include #include "kcircularqueue.h" KCircularQueue * k_circular_queue_new(size_t el_size, unsigned int how_many) { KCircularQueue *q; q = (KCircularQueue *) calloc(sizeof(KCircularQueue), 1); q->data = malloc(el_size * how_many); q->el_size = el_size; q->allocated_size = how_many; q->free_until_end = how_many; return q; } void k_circular_queue_free(KCircularQueue *q) { free(q->data); free(q); } void k_circular_queue_push_copies(KCircularQueue *q, const void *val, unsigned int n) { /* Make sure there is enough space. */ if ((q->allocated_size - q->size) < n) { _k_circular_queue_realloc(q, q->size + n); } /* Elements that are added after the last one until the end of the array. */ while (q->free_until_end && n) { memcpy(q->data + q->first_free*q->el_size, val, q->el_size); ++q->size; if (--q->free_until_end == 0) { q->first_free = 0; } else { ++q->first_free; } --n; } /* Elements added starting at the first position of the array. */ while (n) { memcpy(q->data + q->first_free*q->el_size, val, q->el_size); ++q->size; ++q->first_free; --n; } } void k_circular_queue_pop(KCircularQueue *q, unsigned int n) { q->size -= n; if (q->first + n >= q->allocated_size) { unsigned int in_end = q->allocated_size - q->first; q->first = n - in_end; q->free_until_end = q->allocated_size - q->size - q->first; } else { q->first += n; } } /************************************************************* * Private functions * *************************************************************/ void _k_circular_queue_realloc(KCircularQueue *q, unsigned int new_size) { char *newdata; unsigned int till_end; newdata = malloc(q->el_size * new_size); till_end = q->allocated_size - q->first; memcpy(newdata, q->data + q->first*q->el_size, till_end*q->el_size); if (till_end < q->size) { memcpy(newdata + till_end*q->el_size, q->data, (q->size - till_end)*q->el_size); } q->allocated_size = new_size; q->first = 0; q->first_free = q->size; q->free_until_end = q->allocated_size - q->size; free(q->data); q->data = newdata; } const void * _k_circular_queue_nth(KCircularQueue *q, unsigned int i) { unsigned int pos; pos = q->first + i; if (pos >= q->allocated_size) { unsigned int in_end = q->allocated_size - q->first; pos = i - in_end; } return q->data + pos*q->el_size; } kildclient-3.0.0/src/we_timers.c0000644000175000017500000006175112374460043013523 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkTreeModel *create_we_timers_model(World *world); static void we_timer_configure_view(GtkTreeView *view, GtkTreeModel *model); static void we_timer_add_cb(GtkButton *button, gpointer data); static void we_timer_edit_cb(GtkButton *button, gpointer data); static void we_timer_delete_cb(GtkButton *button, gpointer data); static void we_timer_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); static gboolean edit_timer(World *world, Timer *timer, gboolean editing); static void we_timer_move_cb(GtkButton *button, gpointer data); static gboolean we_timer_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); GObject * get_we_timers_tab(World *world) { GtkBuilder *ui_builder; gchar *objects[] = { "we_panel_generic_graphical_editor", NULL }; GError *error = NULL; GObject *panel; GtkLabel *lblType; GObject *btnAdd; GObject *btnEdit; GObject *btnDelete; GObject *btnUp; GObject *btnDown; GObject *btnExport; GtkTreeSelection *selection; /* Create the dialog */ ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } panel = gtk_builder_get_object(ui_builder, "we_panel_generic_graphical_editor"); /* So it's not destroyed when the builder is destroyed */ g_object_ref(panel); world->viewTimer = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "viewObjects")); g_object_set_data(G_OBJECT(world->viewTimer), "forworld", world); g_signal_connect(G_OBJECT(world->viewTimer), "row-activated", G_CALLBACK(we_timer_view_row_dblclick_cb), world); g_signal_connect(G_OBJECT(world->viewTimer), "key-press-event", G_CALLBACK(we_timer_view_keypress_cb), world); lblType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblGEType")); gtk_label_set_markup(lblType, "Timers"); btnAdd = gtk_builder_get_object(ui_builder, "btnGEAdd"); g_signal_connect(btnAdd, "clicked", G_CALLBACK(we_timer_add_cb), world->viewTimer); btnEdit = gtk_builder_get_object(ui_builder, "btnGEEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(we_timer_edit_cb), world->viewTimer); btnDelete = gtk_builder_get_object(ui_builder, "btnGEDelete"); g_signal_connect(btnDelete, "clicked", G_CALLBACK(we_timer_delete_cb), world->viewTimer); btnUp = gtk_builder_get_object(ui_builder, "btnGEUp"); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_signal_connect(btnUp, "clicked", G_CALLBACK(we_timer_move_cb), world->viewTimer); btnDown = gtk_builder_get_object(ui_builder, "btnGEDown"); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); g_signal_connect(btnDown, "clicked", G_CALLBACK(we_timer_move_cb), world->viewTimer); btnExport = gtk_builder_get_object(ui_builder, "btnGEExport"); g_object_set_data(btnExport, "preselect", "Timer"); world->timer_model = create_we_timers_model(world); world->timer_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->timer_model, NULL)); g_object_unref(G_OBJECT(world->timer_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->timer_model_filter), we_guied_plugin_filter_func, world, NULL); we_timer_configure_view(world->viewTimer, GTK_TREE_MODEL(world->timer_model_filter)); selection = gtk_tree_view_get_selection(world->viewTimer); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_object_set_data(G_OBJECT(selection), "btnEdit", btnEdit); g_object_set_data(G_OBJECT(selection), "btnDelete", btnDelete); g_object_set_data(G_OBJECT(selection), "btnUp", btnUp); g_object_set_data(G_OBJECT(selection), "btnDown", btnDown); g_object_set_data(G_OBJECT(selection), "btnExport", btnExport); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(we_guied_selection_changed_cb), NULL); gtk_builder_connect_signals(ui_builder, world); g_object_unref(ui_builder); return panel; } static GtkTreeModel * create_we_timers_model(World *world) { GtkListStore *store; GtkTreeIter iter; GSList *timerptr; Timer *timer; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); timerptr = world->timers; while (timerptr) { timer = (Timer *) timerptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, timer, -1); timerptr = timerptr->next; } return GTK_TREE_MODEL(store); } static void we_timer_configure_view(GtkTreeView *view, GtkTreeModel *model) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, model); g_object_unref(model); /* Column 1 - Enabled? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TIMER_ENABLED)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Enabled")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TIMER_ENABLED), NULL); gtk_tree_view_append_column(view, column); /* Column 2 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TIMER_NAME), NULL); gtk_tree_view_append_column(view, column); /* Column 3 - Interval */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Interval")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TIMER_INTERVAL), NULL); gtk_tree_view_append_column(view, column); /* Column 4 - Count */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Count")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TIMER_COUNT), NULL); gtk_tree_view_append_column(view, column); /* Column 5 - Action */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Action")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TIMER_ACTION), NULL); gtk_tree_view_append_column(view, column); /* Column 6 - Temporary? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TIMER_TEMPORARY)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Temp")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TIMER_TEMPORARY), NULL); gtk_tree_view_append_column(view, column); /* Column 7 - Plugin */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Plugin")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(OBJECT_PLUGIN), NULL); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } static void we_timer_add_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; Timer *timer; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); timer = g_new0(Timer, 1); timer->enabled = 1; timer->count = -1; timer->for_world = world; if (edit_timer(world, timer, FALSE)) { world->timers = g_slist_insert(world->timers, timer, world->timer_pos); we_timer_insert_timer(world, timer, world->timer_pos++); if (world->connected && timer->enabled) { timer->function_id = g_timeout_add(timer->interval * 1000, run_timer, timer); } } else { g_free(timer); } } static void we_timer_edit_cb(GtkButton *button, gpointer data) { /* Note that the Edit button is only active when exactly one row is selected. */ World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Timer *timer; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &timer, -1); if (edit_timer(world, timer, TRUE)) { we_timer_update_timer(world, timer); } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_timer_delete_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Timer *timer; GSList *timeritem; GtkWidget *msgdlg; gint n; n = gtk_tree_selection_count_selected_rows(selection); msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(world->dlgEditWorld), n, _("timer"), _("timers")); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GList *listiter = g_list_last(selected); while (listiter) { gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &timer, -1); timeritem = g_slist_find(world->timers, timer); remove_timer(world, timeritem); listiter = listiter->prev; } } gtk_widget_destroy(msgdlg); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_timer_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { Timer *timer; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &timer, -1); if (edit_timer(world, timer, TRUE)) { we_timer_update_timer(world, timer); } } } static gboolean edit_timer(World *world, Timer *timer, gboolean editing) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditTimer", "adjustment1", "adjustment2", NULL }; GError *error = NULL; GtkWidget *dlgEditTimer; GtkEntry *txtName; GtkSpinButton *spnInterval; GtkSpinButton *spnCount; GtkEntry *txtAction; GtkToggleButton *chkTemporary; GtkToggleButton *chkEnabled; const gchar *newname; const gchar *newaction; gboolean newenabled; gdouble newinterval; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return FALSE; } dlgEditTimer = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditTimer")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditTimer), GTK_RESPONSE_OK); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtTimerName")); txtAction = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtTimerAction")); spnInterval = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnTimerInterval")); spnCount = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnTimerCount")); chkTemporary = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTimerTemporary")); chkEnabled = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTimerEnabled")); /* Only display note when editing a plugin's timer */ if (!timer->owner_plugin) { GObject *label; label = gtk_builder_get_object(ui_builder, "lblNoteTimer"); gtk_widget_destroy(GTK_WIDGET(label)); label = gtk_builder_get_object(ui_builder, "lblNoteTextTimer"); gtk_widget_destroy(GTK_WIDGET(label)); } /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ if (timer->name) { gtk_entry_set_text(txtName, timer->name); } if (timer->action) { gtk_entry_set_text(txtAction, timer->action); } gtk_spin_button_set_value(spnInterval, timer->interval); gtk_spin_button_set_value(spnCount, timer->count); gtk_toggle_button_set_active(chkTemporary, timer->temporary); gtk_toggle_button_set_active(chkEnabled, timer->enabled); /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditTimer); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditTimer)) == GTK_RESPONSE_OK) { /* Validate */ newenabled = gtk_toggle_button_get_active(chkEnabled); newinterval = gtk_spin_button_get_value(spnInterval); if (newinterval <= 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditTimer), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("The interval must be positive.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } newaction = gtk_entry_get_text(txtAction); if (strcmp(newaction, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditTimer), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the action.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* Update values */ newname = gtk_entry_get_text(txtName); if (!timer->name || strcmp(newname, timer->name) != 0) { g_free(timer->name); if (strcmp(newname, "") != 0) { timer->name = g_strdup(newname); } else { timer->name = NULL; } } if (!timer->action || strcmp(newaction, timer->action) != 0) { g_free(timer->action); timer->action = g_strdup(newaction); } timer->count = gtk_spin_button_get_value_as_int(spnCount); timer->temporary = gtk_toggle_button_get_active(chkTemporary); if (world->connected && editing) { /* Recreate timeout if interval is changed */ if (timer->interval != newinterval && timer->enabled && newenabled) { g_source_remove(timer->function_id); timer->function_id = g_timeout_add(newinterval * 1000, run_timer, timer); } /* Turn on or off if necessary. Never called if the above condition was executed, because the above happens when enabled was not changed, and the below happens when it changed. */ if (timer->enabled && !newenabled) { g_source_remove(timer->function_id); } else if (!timer->enabled && newenabled) { timer->function_id = g_timeout_add(timer->interval * 1000, run_timer, timer); } } timer->interval = newinterval; timer->enabled = newenabled; /* We've finished successfully */ gtk_widget_destroy(dlgEditTimer); return TRUE; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditTimer); return FALSE; } } } static gboolean we_timer_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_KEY_Delete || evt->keyval == GDK_KEY_KP_Delete) { we_timer_delete_cb(NULL, widget); return TRUE; } return FALSE; } static void we_timer_move_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; World *world; gboolean is_up; gint new_pos; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Timer *timer; gint pos; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &timer, -1); pos = g_slist_index(world->timers, timer); new_pos = pos; if (is_up) { if (pos != 0) { new_pos = pos - 1; move_timer(world, pos, new_pos); } } else { if (pos != world->timer_pos - 1) { new_pos = pos + 1; move_timer(world, pos, new_pos); } } /* Reselect the moved item */ gtk_tree_model_iter_nth_child(model, &iter, NULL, new_pos); gtk_tree_selection_select_iter(selection, &iter); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } void we_timer_update_timer(World *world, Timer *timer_arg) { /* Called by the Perl functions when an timer is changed, so that the display is updated. */ GtkTreeIter iter; GtkTreePath *path; Timer *timer; gboolean success; if (!world->timer_model) { return; } success = gtk_tree_model_get_iter_first(world->timer_model, &iter); while (success) { gtk_tree_model_get(world->timer_model, &iter, WE_GUIED_POINTER, &timer, -1); if (timer == timer_arg) { path = gtk_tree_model_get_path(world->timer_model, &iter); gtk_tree_model_row_changed(world->timer_model, path, &iter); gtk_tree_path_free(path); return; } success = gtk_tree_model_iter_next(world->timer_model, &iter); } } void we_timer_insert_timer(World *world, Timer *timer, gint pos) { /* Called by the Perl functions when an timer is inserted, so that the display is updated. */ GtkTreeIter iter; if (!world->timer_model) { return; } gtk_list_store_insert(GTK_LIST_STORE(world->timer_model), &iter, pos); gtk_list_store_set(GTK_LIST_STORE(world->timer_model), &iter, WE_GUIED_POINTER, timer, -1); } void we_timer_delete_timer(World *world, Timer *timer_arg) { /* Called by the Perl functions when an timer is deleted, so that the display is updated. */ GtkTreeIter iter; Timer *timer; gboolean success; if (!world->timer_model) { return; } success = gtk_tree_model_get_iter_first(world->timer_model, &iter); while (success) { gtk_tree_model_get(world->timer_model, &iter, WE_GUIED_POINTER, &timer, -1); if (timer == timer_arg) { gtk_list_store_remove(GTK_LIST_STORE(world->timer_model), &iter); return; } success = gtk_tree_model_iter_next(world->timer_model, &iter); } } kildclient-3.0.0/src/process_line_thread.c0000644000175000017500000003361512354321114015530 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "kildclient.h" #include "perlscript.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ static void do_process_line_operation(World *world, ProcessLineOperation *operation); static void process_recv_complete_line(World *world, ProcessLineOperation *operation); static void process_recv_incomplete_line(World *world, ProcessLineOperation *operation); static void match_rewriter_trigger(World *world, Trigger *trigger, gchar **line, gchar **colorline, gsize *output_len, SV *Pcolorline, gint *n_matches, gint trigger_number); static gboolean verify_gag_trigger(Trigger *trigger, const gchar *line, gboolean *gag_output, gboolean *gag_log, GSList **highlights); static gboolean match_normal_trigger(World *world, Trigger *trigger, const gchar *colorline, const gchar *line, gint *n_matches, gint trigger_number, GSList **trigger_response); static void output_line(World *world, gboolean gag_output, gboolean gag_log, const gchar *colorline, const gchar *line, gsize len, GSList *highlights); gpointer process_line_thread(gpointer data) { World *world = (World *) data; g_async_queue_ref(world->process_line_operations); g_async_queue_ref(world->ansiparse_operations); g_async_queue_ref(world->mainthread_operations); while (1) { ProcessLineOperation *operation = (ProcessLineOperation *) g_async_queue_pop(world->process_line_operations); if (world->to_be_destructed) { g_async_queue_unref(world->process_line_operations); g_async_queue_unref(world->ansiparse_operations); g_async_queue_unref(world->mainthread_operations); free_process_line_operation(operation); return NULL; } do_process_line_operation(world, operation); free_process_line_operation(operation); } } void queue_process_line_operation(World *world, ProcessLineOperation *operation) { g_async_queue_push(world->process_line_operations, operation); } void free_process_line_operation(gpointer data) { ProcessLineOperation *operation = (ProcessLineOperation *) data; if (operation->action != DUMMY_PROCESS_LINE) { g_free(operation->line); } g_free(operation); } static void do_process_line_operation(World *world, ProcessLineOperation *operation) { switch (operation->action) { case PROCESS_COMPLETE_LINE: process_recv_complete_line(world, operation); break; case PROCESS_INCOMPLETE_LINE: process_recv_incomplete_line(world, operation); break; case DUMMY_PROCESS_LINE: /* Do nothing */ break; } } static void process_recv_complete_line(World *world, ProcessLineOperation *operation) { gchar *stripped; gint dummy; gboolean gag_output = FALSE; gboolean gag_log = FALSE; AnsiParseOperation *ansi_operation; stripped = strip_ansi(operation->line, operation->len); match_triggers(world, &stripped, &operation->line, &operation->len, &gag_output, &gag_log, &dummy, NULL); g_free(stripped); /* The line is printed and written to the log file in match_triggers. */ if (!gag_output) { MainThreadOperation *mainthread_op = g_new(MainThreadOperation, 1); mainthread_op->action = EXECUTE_ON_RECEIVED_TEXT; mainthread_op->hook_execution = g_new(HookExecution, 1); mainthread_op->hook_execution->world = world; mainthread_op->hook_execution->data = g_strdup(operation->line); queue_mainthread_operation(world, mainthread_op); } /* Final actions after line is parsed. */ ansi_operation = g_new(AnsiParseOperation, 1); ansi_operation->action = FINALIZE_LINE; queue_ansiparse_operation(world, ansi_operation); } static void process_recv_incomplete_line(World *world, ProcessLineOperation *operation) { AnsiParseOperation *ansi_operation = g_new(AnsiParseOperation, 1); ansi_operation->action = APPEND_LINE; ansi_operation->line.line = g_strdup(operation->line); ansi_operation->line.line_len = operation->len; queue_ansiparse_operation(world, ansi_operation); /* Final actions after line is parsed. */ ansi_operation = g_new(AnsiParseOperation, 1); ansi_operation->action = FINALIZE_LINE; queue_ansiparse_operation(world, ansi_operation); } void match_triggers(World *world, gchar **line, gchar **colorline, gsize *output_len, gboolean *gag_output, gboolean *gag_log, gint *n_matches, GSList **trigger_response) { /* This function matches triggers against the line. If trigger_response is NULL, then it executes triggers, and also writes the line to the screen and/or log file if appropriate. If trigger_response points to a GSList, then this function does not do anything really, but stores the commands that would be executed in the list, for use in the Test Triggers function. */ GSList *trigptr; Trigger *trigger; SV *Pcolorline; int i; GSList *highlights = NULL; *n_matches = 0; if (world->disable_triggers) { if (!trigger_response) { AnsiParseOperation *operation = g_new(AnsiParseOperation, 1); operation->action = APPEND_LINE; operation->line.line = g_strdup(*colorline); operation->line.line_len = *output_len; queue_ansiparse_operation(world, operation); write_log_line(world, *line, NULL); } return; } GRAB_PERL(world); /* * First pass: rewriter triggers */ Pcolorline = get_sv("colorline", TRUE); trigptr = world->triggers; i = 0; while (trigptr) { trigger = (Trigger *) trigptr->data; if (trigger->rewriter) { match_rewriter_trigger(world, trigger, line, colorline, output_len, Pcolorline, n_matches, i); } trigptr = trigptr->next; ++i; } /* * Second pass: see if one of the triggers is a gag */ trigptr = world->triggers; while (trigptr) { trigger = (Trigger *) trigptr->data; if (!trigger->rewriter) { if (verify_gag_trigger(trigger, *line, gag_output, gag_log, &highlights) && !trigger->keepexecuting) { break; } } trigptr = trigptr->next; } if (!trigger_response) { output_line(world, *gag_output, *gag_log, *colorline, *line, *output_len, highlights); } /* * Third pass: run normal triggers */ world_for_perl = world; trigptr = world->triggers; i = 0; while (trigptr) { trigger = (Trigger *) trigptr->data; if (!trigger->rewriter) { if (match_normal_trigger(world, trigger, *colorline, *line, n_matches, i, trigger_response) && !trigger->keepexecuting) { break; } } trigptr = trigptr->next; ++i; } world_for_perl = currentWorld; RELEASE_PERL(world); } static void match_rewriter_trigger(World *world, Trigger *trigger, gchar **line, gchar **colorline, gsize *output_len, SV *Pcolorline, gint *n_matches, gint trigger_number) { AV *matches; gchar *tmp; if (!trigger->enabled || !perl_match(*line, trigger->pattern_re, NULL, NULL, 0, &matches)) { return; } ++(*n_matches); if (debug_matches) { fprintf(stderr, "**Trigger %d '%s' (rewriter) matched for world %s\n" " Line: %s" " Pattern: %s\n" " Action: %s\n", trigger_number, trigger->name ? trigger->name : "", world->name, *line, trigger->pattern, trigger->action); } if (trigger->action) { parse_commands_full(world, trigger->action, matches, *colorline, TRUE); } /* We need to wait for the command to finish so we can get the new line. */ RELEASE_PERL(world); g_mutex_lock(&world->wait_command_mutex); while (!world->command_executed) { g_cond_wait(&world->wait_command_cond, &world->wait_command_mutex); } g_free(*colorline); tmp = SvPV(Pcolorline, *output_len); *colorline = g_strdup(tmp); g_free(*line); *line = strip_ansi(*colorline, *output_len); world->command_executed = FALSE; g_mutex_unlock(&world->wait_command_mutex); GRAB_PERL(world); } static gboolean verify_gag_trigger(Trigger *trigger, const gchar *line, gboolean *gag_output, gboolean *gag_log, GSList **highlights) { gint match_start; gint match_end; if (!trigger->enabled || !perl_match(line, trigger->pattern_re, &match_start, &match_end, trigger->high_target, NULL)) { return FALSE; } *gag_output |= trigger->gag_output; *gag_log |= trigger->gag_log; if (*gag_output && *gag_log) { return TRUE; } if (trigger->highlight) { HighlightApplication *highlight = g_new(HighlightApplication, 1); highlight->trigger = trigger; highlight->match_start = match_start; highlight->match_end = match_end; *highlights = g_slist_append(*highlights, highlight); } return TRUE; } static gboolean match_normal_trigger(World *world, Trigger *trigger, const gchar *colorline, const gchar *line, gint *n_matches, gint trigger_number, GSList **trigger_response) { AV *matches; if (!trigger->enabled || !perl_match(line, trigger->pattern_re, NULL, NULL, 0, &matches)) { return FALSE; } ++(*n_matches); if (debug_matches) { fprintf(stderr, "**Trigger %d '%s' matched for world %s\n" " Line: %s" " Pattern: %s\n" " Action: %s\n", trigger_number, trigger->name ? trigger->name : "", world->name, line, trigger->pattern, trigger->action ? trigger->action : ""); } if (trigger->action) { /* Substitute $1, $2, etc. for matched parts. */ gchar *action = perl_substitute(trigger->action, world->trigger_action_re, "$__M[$1]", FALSE, TRUE); if (!trigger_response) { if (action) { parse_commands_full(world, action, matches, colorline, FALSE); g_free(action); } else { parse_commands_full(world, trigger->action, matches, colorline, FALSE); } } else { if (action) { *trigger_response = g_slist_append(*trigger_response, action); } else { *trigger_response = g_slist_append(*trigger_response, g_strdup(trigger->action)); } } } return TRUE; } static void output_line(World *world, gboolean gag_output, gboolean gag_log, const gchar *colorline, const gchar *line, gsize len, GSList *highlights) { if (!gag_output) { AnsiParseOperation *operation = g_new(AnsiParseOperation, 1); operation->action = APPEND_LINE; operation->line.line = g_strdup(colorline); operation->line.line_len = len; queue_ansiparse_operation(world, operation); operation = g_new(AnsiParseOperation, 1); operation->action = APPLY_HIGHLIGHTS_AND_MOVE_MARK; operation->highlights = highlights; queue_ansiparse_operation(world, operation); } if (!gag_log) { write_log_line(world, line, NULL); } } kildclient-3.0.0/src/worlds.c0000644000175000017500000024214512374460043013035 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "libintl-wrapper.h" #include #include "kildclient.h" #include "perlscript.h" #include "net.h" /******************** * Type definitions * ********************/ typedef enum { KC_START, KC_KCWORLD, KC_NAME, KC_HOST, KC_PORT, KC_CHARSET, KC_PROXY, KC_AUTO_LOGON, KC_CHARACTER, KC_PASSWORD, KC_DISPLAY, KC_TERMINALFONT, KC_ENTRYFONT, KC_USEBOLD, KC_WRAP, KC_WRAP_COLUMN, KC_TOOLTIPS, KC_STATUSFONT, KC_STATUSBAR, KC_DEFFORECOLOR, KC_DEFBACKCOLOR, KC_DEFBOLDCOLOR, KC_DEFBOLDBACKCOLOR, KC_ANSICOLOR, KC_BACKGROUND, KC_SCROLL, KC_NAMEDISPLAY, KC_LOG, KC_LOGFILE, KC_LOGTIMEFORMAT, KC_FLOOD_PREVENTION, KC_REPEAT_COMMANDS, KC_COMMAND_ECHO, KC_NEVER_HIDE_INPUT, KC_STORE_COMMANDS, KC_COMMAND_HISTORY, KC_AUTO_COMPLETION, KC_COMMAND_SEPARATOR, KC_INPUT_LINES, KC_INPUT_SPELL, KC_CONFIRM_DELETE, KC_PLUGIN_ITEMS, KC_SCRIPTFILE, KC_PLUGINS, KC_PLUGIN, KC_TRIGGERS, KC_TRIGGER, KC_PATTERN, KC_ACTION, KC_HIGHLIGHT, KC_ALIASES, KC_ALIAS, KC_SUBSTITUTION, KC_MACROS, KC_MACRO, KC_KEY, KC_TIMERS, KC_TIMER, KC_VARIABLES, KC_VARIABLE, KC_HOOKSV1, KC_HOOKV1, KC_HOOKSV2, KC_HOOKLISTV2, KC_HOOKV2, KC_PROTOCOLS, KC_MCCP, KC_KEEP_ALIVE, } ParserState; struct WorldParser_s { ParserState state; ParserState previous_state; World *world; gboolean forWorldSelector; char *currHookTrigger; char *currHookName; gboolean currHookEnabled; union { Trigger *currTrigger; Alias *currAlias; Macro *currMacro; Timer *currTimer; char *currVar; char *currPluginFile; char *currHookAction; }; union { gchar **currText; GdkRGBA *currColor; GtkTreeIter curr_logon_iter; }; }; typedef struct WorldParser_s WorldParser; /*********************** * Function prototypes * ***********************/ static void create_default_world(void); static void world_allocate_space_for_colors(World *world); static void xml_start_element(GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error); static void xml_end_element(GMarkupParseContext *context, const gchar *element_name, gpointer user_data, GError **error); static void xml_text(GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error); static void xml_error_invalid_inside(GError **error, GMarkupParseContext *context); static void xml_error_unknown_attribute(GError **error, const gchar *attribute_name, GMarkupParseContext *context); static void copy_text(char **dest, const char *orig, gsize len); static void read_color(GdkRGBA *color, const char *text, gsize text_len, GError **error); static void write_color(GString *str, char *name, int idx, GdkRGBA *color); /******************** * Global variables * ********************/ World *default_world = NULL; GdkRGBA deffore = { 0.74509804, 0.74509804, 0.74509804, 1 }; GdkRGBA defbold = { 1, 1, 1, 1 }; GdkRGBA defback = { 0, 0, 0 , 1 }; GdkRGBA defboldback = { 0.37254902, 0.37254902, 0.37254902, 1 }; GdkRGBA defansi[] = { { 0, 0, 0, 1 }, /* Black */ { 0.54509804, 0, 0, 1 }, /* Red */ { 0, 0.45098039, 0, 1 }, /* Green */ { 0.54509804, 0.41176471, 0.07843137, 1 }, /* Yellow */ { 0, 0, 0.54509804, 1 }, /* Blue */ { 0.54509804, 0, 0.54509804, 1 }, /* Magenta */ { 0, 0.54509804, 0.54509804, 1 }, /* Cyan */ { 0.74509804, 0.74509804, 0.74509804, 1 }, /* White */ { 0.37254902, 0.37254902, 0.37254902, 1 }, /* Bold Black */ { 1, 0, 0, 1 }, /* Bold Red */ { 0, 1, 0, 1 }, /* Bold Green */ { 1, 1, 0, 1 }, /* Bold Yellow */ { 0, 0, 1, 1 }, /* Bold Blue */ { 1, 0, 1, 1 }, /* Bold Magenta */ { 0, 1, 1, 1 }, /* Bold Cyan */ { 1, 1, 1, 1 }, /* Bold White */ }; /************************* * File global variables * *************************/ static const GMarkupParser xmlWorldParser = { xml_start_element, xml_end_element, xml_text, NULL, /* passthrough */ NULL /* error */ }; World * create_new_world(gboolean load_defaults) { World *world; world = g_new0(World, 1); world_allocate_space_for_colors(world); world->startup_plugins = GTK_TREE_MODEL(gtk_list_store_new(N_SPLUGIN_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING)); world->logon_characters = GTK_TREE_MODEL(gtk_list_store_new(N_LOGON_COLUMNS, G_TYPE_STRING, G_TYPE_STRING)); world->proxy.type = PROXY_USE_GLOBAL; g_rec_mutex_init(&world->perl_mutex); if (!load_defaults) { return world; } if (!default_world) { create_default_world(); } /* Create pbuffer */ world->pbuffer = (guchar *) g_malloc(MAX_BUFFER); world->pbuf_alloc_size = MAX_BUFFER; /* Copy defaults */ world->charset = g_strdup(default_world->charset); world->charset_index = default_world->charset_index; world->terminalfont = g_strdup(default_world->terminalfont); world->entryfont = g_strdup(default_world->entryfont); world->statusfont = g_strdup(default_world->statusfont); world->usebold = default_world->usebold; world->wrap = default_world->wrap; world->wrap_indent = default_world->wrap_indent; world->use_wrap_column = default_world->use_wrap_column; world->wrap_column = default_world->wrap_column; world->use_tooltips = default_world->use_tooltips; memcpy(world->deffore, default_world->deffore, sizeof(GdkRGBA)); memcpy(world->defbold, default_world->defbold, sizeof(GdkRGBA)); memcpy(world->defback, default_world->defback, sizeof(GdkRGBA)); memcpy(world->defboldback, default_world->defboldback, sizeof(GdkRGBA)); memcpy(world->ansicolors, default_world->ansicolors, 16*sizeof(GdkRGBA)); world->name_display_style = default_world->name_display_style; world->name_display_pattern = g_strdup(default_world->name_display_pattern); world->scrollOutput = default_world->scrollOutput; world->buffer_lines = default_world->buffer_lines; world->repeat_commands = default_world->repeat_commands; world->cmd_echo = default_world->cmd_echo; world->never_hide_input = default_world->never_hide_input; world->store_commands = default_world->store_commands; world->commands_to_save = default_world->commands_to_save; world->input_n_lines = default_world->input_n_lines; world->input_n_lines_saved = default_world->input_n_lines_saved; world->spell = default_world->spell; if (default_world->spell_language) world->spell_language = g_strdup(default_world->spell_language); world->autocompletion = default_world->autocompletion; world->autocompl_minprefix = default_world->autocompl_minprefix; strcpy(world->command_separator, default_world->command_separator); world->confirm_delete = default_world->confirm_delete; world->flood_prevention = default_world->flood_prevention; world->max_equal_commands = default_world->max_equal_commands; world->flood_prevention_command = g_strdup(default_world->flood_prevention_command); world->repeat_count = 1; world->log_timeformat = g_strdup(default_world->log_timeformat); world->log_add_time = default_world->log_add_time; world->log_autostart = default_world->log_autostart; world->keep_alive = default_world->keep_alive; /* Initialize command history list. */ world->cmd_list = GTK_TREE_MODEL(gtk_list_store_new(N_CMDLIST_COLUMNS, G_TYPE_STRING, G_TYPE_STRING)); gtk_list_store_append(GTK_LIST_STORE(world->cmd_list), &world->current_cmd); gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &world->current_cmd, CMDLIST_COL_COMMAND, NULL, CMDLIST_COL_TENTATIVE, "", -1); world->cmd_has_been_edited = 1; /* Create timer to hold the time since last writing of data */ world->last_data_written = g_timer_new(); return world; } static void create_default_world(void) { const gchar *kilddir; gchar *default_world_file; default_world = g_new0(World, 1); world_allocate_space_for_colors(default_world); /* Built-in defaults */ default_world->charset = g_strdup("ISO-8859-1"); default_world->charset_index = -1; default_world->terminalfont = g_strdup(DEFAULT_TERMINAL_FONT); default_world->entryfont = g_strdup(DEFAULT_TERMINAL_FONT); default_world->statusfont = g_strdup("Sans 8"); default_world->usebold = TRUE; default_world->wrap = TRUE; default_world->wrap_indent = 0; default_world->wrap_column = 40; default_world->use_wrap_column = FALSE; default_world->use_tooltips = TRUE; memcpy(default_world->deffore, &deffore, sizeof(GdkRGBA)); memcpy(default_world->defbold, &defbold, sizeof(GdkRGBA)); memcpy(default_world->defback, &defback, sizeof(GdkRGBA)); memcpy(default_world->defboldback, &defboldback, sizeof(GdkRGBA)); memcpy(default_world->ansicolors, &defansi, 16*sizeof(GdkRGBA)); default_world->name_display_style = NAME_DISPLAY_WORLD; default_world->name_display_pattern = g_strdup("%Kw [%Kc]"); default_world->scrollOutput = FALSE; default_world->buffer_lines = 2000; default_world->repeat_commands = FALSE; default_world->cmd_echo = TRUE; default_world->never_hide_input = FALSE; default_world->store_commands = TRUE; default_world->commands_to_save = 50; default_world->input_n_lines = 1; default_world->input_n_lines_saved = 2; default_world->spell = 1; default_world->autocompletion = TRUE; default_world->autocompl_minprefix = 3; strcpy(default_world->command_separator, "%;"); default_world->confirm_delete = TRUE; default_world->flood_prevention = 1; default_world->max_equal_commands = 20; default_world->flood_prevention_command = g_strdup("look"); default_world->log_timeformat = g_strdup(DEFAULT_LOGTIME_FORMAT); default_world->log_add_time = TRUE; default_world->log_autostart = FALSE; default_world->keep_alive = FALSE; /* Now load everything from the file */ kilddir = get_kildclient_directory_path(); default_world_file = g_build_filename(kilddir, "defworld.cfg", NULL); if (!load_world_from_file(default_world_file, default_world, FALSE, NULL)) { default_world->file = default_world_file; } else { g_free(default_world_file); } } static void world_allocate_space_for_colors(World *world) { world->deffore = g_new0(GdkRGBA, 1); world->defbold = g_new0(GdkRGBA, 1); world->defback = g_new0(GdkRGBA, 1); world->defboldback = g_new0(GdkRGBA, 1); world->ansicolors = g_new0(GdkRGBA, 16); } void init_threads(World *world) { g_mutex_init(&world->write_log_line_mutex); g_mutex_init(&world->wait_command_mutex); g_cond_init(&world->wait_command_cond); world->process_line_operations = g_async_queue_new_full(free_process_line_operation); world->process_line_thread = g_thread_new("process_line", process_line_thread, world); world->ansiparse_operations = g_async_queue_new_full(free_ansiparse_operation); world->ansiparse_thread = g_thread_new("ansiparse", ansiparse_thread, world); world->mainthread_operations = g_async_queue_new_full(free_mainthread_operation); world->mainthread_operations_idle_id = g_timeout_add(100, mainthread_operations_idle_cb, world); } void free_world(World *world) { if (world->has_unread_text) { --worlds_with_new_text; adjust_window_title(); } if (world->ansiparse_thread) { AnsiParseOperation *ansi_op; ProcessLineOperation *process_line_op; g_source_remove(world->mainthread_operations_idle_id); g_async_queue_unref(world->mainthread_operations); g_async_queue_unref(world->ansiparse_operations); g_async_queue_unref(world->process_line_operations); world->to_be_destructed = TRUE; /* We add an operation so that the threads wakes up (if the queue is empty, it might never notice that it should be destroyed). */ ansi_op = g_new(AnsiParseOperation, 1); ansi_op->action = DUMMY_ANSIPARSE; g_async_queue_push(world->ansiparse_operations, ansi_op); /* Wait for the thread to exit. */ g_thread_join(world->ansiparse_thread); /* The same, for process_line_thread */ process_line_op = g_new(ProcessLineOperation, 1); process_line_op->action = DUMMY_PROCESS_LINE; g_async_queue_push(world->process_line_operations, process_line_op); /* Notify a possibly waiting match trigger thread */ g_mutex_lock(&world->wait_command_mutex); world->command_executed = TRUE; g_cond_signal(&world->wait_command_cond); g_mutex_unlock(&world->wait_command_mutex); /* Wait for the thread to exit */ g_thread_join(world->process_line_thread); g_mutex_clear(&world->write_log_line_mutex); g_cond_clear(&world->wait_command_cond); g_mutex_clear(&world->wait_command_mutex); } g_free(world->name); g_free(world->display_name); g_free(world->new_text_name); g_free(world->file); g_free(world->charset); g_free(world->host); g_free(world->port); g_free(world->host_ip); g_free(world->pbuffer); g_free(world->server_data_buffer); if (world->character_used) { gtk_tree_row_reference_free(world->character_used); } g_object_unref(world->logon_characters); g_free(world->terminalfont); g_free(world->entryfont); g_free(world->statusfont); g_free(world->deffore); g_free(world->defbold); g_free(world->defback); g_free(world->defboldback); g_free(world->ansicolors); g_free(world->name_display_pattern); proxy_info_free(&world->proxy); proxy_info_free(&world->proxy_used); g_free(world->scriptfile); if (world->perl_interpreter) { GRAB_PERL(world); } g_slist_foreach(world->plugins, (GFunc) free_plugin, world); g_slist_free(world->plugins); g_slist_foreach(world->triggers, (GFunc) free_trigger, NULL); g_slist_free(world->triggers); if (world->trigger_action_re) { SvREFCNT_dec(world->trigger_action_re); } g_slist_foreach(world->aliases, (GFunc) free_alias, NULL); g_slist_free(world->aliases); g_slist_foreach(world->macros, (GFunc) free_macro, NULL); g_slist_free(world->macros); g_slist_foreach(world->timers, (GFunc) free_timer, NULL); g_slist_free(world->timers); g_slist_foreach(world->hooks.OnConnect, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnConnect); g_slist_foreach(world->hooks.OnDisconnect, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnDisconnect); g_slist_foreach(world->hooks.OnReceivedText, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnReceivedText); g_slist_foreach(world->hooks.OnSentCommand, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnSentCommand); g_slist_foreach(world->hooks.OnGetFocus, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnGetFocus); g_slist_foreach(world->hooks.OnLoseFocus, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnLoseFocus); g_slist_foreach(world->hooks.OnCloseConnected, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnCloseConnected); g_slist_foreach(world->hooks.OnServerData, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnServerData); g_slist_foreach(world->permanent_variables, (GFunc) free_permanent_variable, NULL); g_slist_free(world->permanent_variables); if (world->perl_interpreter) { RELEASE_PERL(world); } g_free(world->flood_prevention_command); g_free(world->last_command); if (world->cmd_list) { g_object_unref(world->cmd_list); } stop_log(world); g_free(world->log_file_name); g_free(world->log_timeformat); g_free(world->log_actual_file); if (world->connected_at_least_once) { destruct_perl_script(world->perl_interpreter); } if (world->dlgEditWorld) { gtk_widget_destroy(world->dlgEditWorld); g_object_unref(world->hooks.OnConnect_model_filter); g_object_unref(world->hooks.OnDisconnect_model_filter); g_object_unref(world->hooks.OnReceivedText_model_filter); g_object_unref(world->hooks.OnSentCommand_model_filter); g_object_unref(world->hooks.OnGetFocus_model_filter); g_object_unref(world->hooks.OnLoseFocus_model_filter); g_object_unref(world->hooks.OnCloseConnected_model_filter); g_object_unref(world->hooks.OnServerData_model_filter); g_slist_foreach(world->selected_OnConnect_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnConnect_hooks); g_slist_foreach(world->selected_OnDisconnect_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnDisconnect_hooks); g_slist_foreach(world->selected_OnReceivedText_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnReceivedText_hooks); g_slist_foreach(world->selected_OnSentCommand_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnSentCommand_hooks); g_slist_foreach(world->selected_OnGetFocus_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnGetFocus_hooks); g_slist_foreach(world->selected_OnLoseFocus_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnLoseFocus_hooks); g_slist_foreach(world->selected_OnCloseConnected_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnCloseConnected_hooks); g_slist_foreach(world->selected_OnServerData_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnServerData_hooks); } if (world->dlgMLSend) { gtk_widget_destroy(world->dlgMLSend); } if (world->dlgCmdHistoryFind) { gtk_widget_destroy(world->dlgCmdHistoryFind); } if (world->dlgCmdHistory) { gtk_widget_destroy(world->dlgCmdHistory); } g_free(world->cmdfind_string); if (world->cmdfind_row) { gtk_tree_row_reference_free(world->cmdfind_row); } if (world->dlgTestTriggers) { gtk_widget_destroy(world->dlgTestTriggers); } if (world->ui_builder) { g_object_unref(world->ui_builder); } g_object_unref(world->startup_plugins); if (world->last_data_written) { g_timer_destroy(world->last_data_written); } g_rec_mutex_clear(&world->perl_mutex); g_free(world); } void remove_plugin_objects(World *world, Plugin *plugin) { GSList *iter; GSList *next; for (iter = world->triggers; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Trigger *trigger = (Trigger *) iter->data; if (trigger->owner_plugin == plugin) { remove_trigger(world, iter); } } for (iter = world->aliases; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Alias *alias = (Alias *) iter->data; if (alias->owner_plugin == plugin) { remove_alias(world, iter); } } for (iter = world->macros; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Macro *macro = (Macro *) iter->data; if (macro->owner_plugin == plugin) { remove_macro(world, iter); } } for (iter = world->timers; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Timer *timer = (Timer *) iter->data; if (timer->owner_plugin == plugin) { remove_timer(world, iter); } } for (iter = world->hooks.OnConnect; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnConnect", 0, iter); } } for (iter = world->hooks.OnDisconnect; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnDisconnect", 0, iter); } } for (iter = world->hooks.OnReceivedText; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnReceivedText", 0, iter); } } for (iter = world->hooks.OnSentCommand; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnSentCommand", 0, iter); } } for (iter = world->hooks.OnGetFocus; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnGetFocus", 0, iter); } } for (iter = world->hooks.OnLoseFocus; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnLoseFocus", 0, iter); } } for (iter = world->hooks.OnCloseConnected; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnCloseConnected", 0, iter); } } for (iter = world->hooks.OnServerData; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnServerData", 0, iter); } } } void create_world_from_parameters(World *world, gchar *host, gchar *port, gchar *user, gchar *password) { world->name = g_strdup(_("Unnamed world")); world->host = host; if (port && strcmp(port, "") != 0) { world->port = port; } else { world->port = g_strdup("4000"); g_free(port); } if (user && strcmp(user, "") != 0) { GtkTreePath *treepath; GtkTreeIter iter; /* Currently there is no way of selecting another connection style */ world->connection_style = DIKU; gtk_list_store_append(GTK_LIST_STORE(world->logon_characters), &iter); gtk_list_store_set(GTK_LIST_STORE(world->logon_characters), &iter, LOGON_CHAR, user, LOGON_PASS, password, -1); treepath = gtk_tree_model_get_path(world->logon_characters, &iter); world->character_used = gtk_tree_row_reference_new(world->logon_characters, treepath); gtk_tree_path_free(treepath); prepare_display_name(world); } else { world->character_used = NULL; /* No auto-logon */ /* Since there is never a character in this case, it makes no sense to use the default world settings for display name. */ world->display_name = g_strdup(world->name); world->new_text_name = g_strdup_printf("%s", world->display_name); } g_free(user); g_free(password); } gboolean load_world_from_file(const char *file, World *world, gboolean forWorldSelector, GError **error) { FILE *fp; char buffer[MAX_BUFFER]; gboolean success; WorldParser *parser; GMarkupParseContext *parseContext; fp = fopen(file, "r"); if (!fp) { g_set_error(error, G_FILE_ERROR, G_FILE_ERROR_NOENT, _("Could not open file: %s"), g_strerror(errno)); return FALSE; } world->file = strdup(file); world->charset_index = -1; parser = g_new0(WorldParser, 1); parser->state = KC_START; parser->world = world; parser->forWorldSelector = forWorldSelector; parseContext = g_markup_parse_context_new(&xmlWorldParser, 0, parser, NULL); success = FALSE; while (1) { if (fgets(buffer, MAX_BUFFER, fp)) { success = g_markup_parse_context_parse(parseContext, buffer, strlen(buffer), error); } if (feof(fp)) { success &= g_markup_parse_context_end_parse(parseContext, error); break; } if (!success) break; } fclose(fp); g_markup_parse_context_free(parseContext); g_free(parser); return success; } static void xml_start_element(GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error) { WorldParser *parser = (WorldParser *)user_data; switch (parser->state) { case KC_START: if (strcmp(element_name, "kcworld") == 0 || strcmp(element_name, "kcworld-export") == 0) { parser->state = KC_KCWORLD; } else { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, _("Invalid top-level element '%s'"), element_name); } break; case KC_KCWORLD: if (strcmp(element_name, "name") == 0) { parser->currText = &parser->world->name; parser->state = KC_NAME; } else if (strcmp(element_name, "host") == 0) { parser->currText = &parser->world->host; parser->state = KC_HOST; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "tls") == 0) { parser->world->use_tls = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "port") == 0) { parser->currText = &parser->world->port; parser->state = KC_PORT; } else if (strcmp(element_name, "charset") == 0) { parser->currText = &parser->world->charset; parser->state = KC_CHARSET; g_free(parser->world->charset); } else if (strcmp(element_name, "proxy") == 0) { parser->state = KC_PROXY; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "type") == 0) { parser->world->proxy.type = atoi(*attribute_values); } else if (strcmp(*attribute_names, "server") == 0) { parser->world->proxy.server = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "port") == 0) { parser->world->proxy.port = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "user") == 0) { parser->world->proxy.user = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "password") == 0) { parser->world->proxy.password = g_strdup(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "display") == 0) { parser->state = KC_DISPLAY; } else if (strcmp(element_name, "scroll") == 0) { parser->state = KC_SCROLL; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "on-output") == 0) { parser->world->scrollOutput = atoi(*attribute_values); } else if (strcmp(*attribute_names, "lines") == 0) { parser->world->buffer_lines = atol(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "name-display") == 0) { parser->state = KC_NAMEDISPLAY; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "style") == 0) { parser->world->name_display_style = atoi(*attribute_values); } else if (strcmp(*attribute_names, "pattern") == 0) { parser->world->name_display_pattern = g_strdup(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "log") == 0) { parser->state = KC_LOG; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "autostart") == 0) { parser->world->log_autostart = atoi(*attribute_values); } else if (strcmp(*attribute_names, "addtime") == 0) { parser->world->log_add_time = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "auto-logon") == 0) { parser->state = KC_AUTO_LOGON; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "style") == 0) { parser->world->connection_style = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "flood-prevention") == 0) { parser->currText = &parser->world->flood_prevention_command; parser->state = KC_FLOOD_PREVENTION; if (parser->forWorldSelector) { break; } g_free(parser->world->flood_prevention_command); while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->flood_prevention = atoi(*attribute_values); } else if (strcmp(*attribute_names, "max-repeat") == 0) { parser->world->max_equal_commands = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "repeat-commands") == 0) { parser->state = KC_REPEAT_COMMANDS; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->repeat_commands = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "command-echo") == 0) { parser->state = KC_COMMAND_ECHO; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->cmd_echo = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "never-hide-input") == 0) { parser->state = KC_NEVER_HIDE_INPUT; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->never_hide_input = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "store-commands") == 0) { parser->state = KC_STORE_COMMANDS; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->store_commands = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "command-history") == 0) { parser->state = KC_COMMAND_HISTORY; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "size") == 0) { parser->world->commands_to_save = atoi(*attribute_values); } else if (strcmp(*attribute_names, "ignore-up-down-keys") == 0) { parser->world->ignore_up_down_keys = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "auto-completion") == 0) { parser->state = KC_AUTO_COMPLETION; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->autocompletion = atoi(*attribute_values); } else if (strcmp(*attribute_names, "minprefix") == 0) { parser->world->autocompl_minprefix = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "command-separator") == 0) { parser->state = KC_COMMAND_SEPARATOR; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "separator") == 0) { strcpy(parser->world->command_separator, *attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "input-lines") == 0) { parser->state = KC_INPUT_LINES; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "size") == 0) { parser->world->input_n_lines = atoi(*attribute_values); } else if (strcmp(*attribute_names, "save") == 0) { parser->world->input_n_lines_saved = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "input-spell") == 0) { parser->state = KC_INPUT_SPELL; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "active") == 0) { parser->world->spell = atoi(*attribute_values); } else if (strcmp(*attribute_names, "language") == 0) { if (strcmp(*attribute_values, "") != 0) { parser->world->spell_language = g_strdup(*attribute_values); } } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "confirm-delete") == 0) { parser->state = KC_CONFIRM_DELETE; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "confirm") == 0) { parser->world->confirm_delete = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "plugin-items") == 0) { parser->state = KC_PLUGIN_ITEMS; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "show") == 0) { parser->world->show_plugin_items = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "keep-alive") == 0) { parser->state = KC_KEEP_ALIVE; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->keep_alive = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "scriptfile") == 0) { parser->currText = &parser->world->scriptfile; parser->state = KC_SCRIPTFILE; } else if (strcmp(element_name, "plugins") == 0) { parser->state = KC_PLUGINS; } else if (strcmp(element_name, "triggers") == 0) { parser->state = KC_TRIGGERS; } else if (strcmp(element_name, "aliases") == 0) { parser->state = KC_ALIASES; } else if (strcmp(element_name, "macros") == 0) { parser->state = KC_MACROS; } else if (strcmp(element_name, "timers") == 0) { parser->state = KC_TIMERS; } else if (strcmp(element_name, "variables") == 0) { parser->state = KC_VARIABLES; } else if (strcmp(element_name, "hooks") == 0) { parser->state = KC_HOOKSV1; } else if (strcmp(element_name, "hooksv2") == 0) { parser->state = KC_HOOKSV2; } else if (strcmp(element_name, "protocols") == 0) { parser->state = KC_PROTOCOLS; } else { xml_error_invalid_inside(error, context); } break; case KC_DISPLAY: if (strcmp(element_name, "terminalfont") == 0) { parser->currText = &parser->world->terminalfont; parser->state = KC_TERMINALFONT; g_free(parser->world->terminalfont); } else if (strcmp(element_name, "entryfont") == 0) { parser->currText = &parser->world->entryfont; parser->state = KC_ENTRYFONT; g_free(parser->world->entryfont); } else if (strcmp(element_name, "usebold") == 0) { parser->state = KC_USEBOLD; } else if (strcmp(element_name, "wrap") == 0) { parser->state = KC_WRAP; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->wrap = atoi(*attribute_values); } else if (strcmp(*attribute_names, "indent") == 0) { parser->world->wrap_indent = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "tooltips") == 0) { parser->state = KC_TOOLTIPS; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->use_tooltips = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "statusfont") == 0) { parser->currText = &parser->world->statusfont; parser->state = KC_STATUSFONT; g_free(parser->world->statusfont); } else if (strcmp(element_name, "statusbar") == 0) { parser->state = KC_STATUSBAR; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "ctime") == 0) { parser->world->ctime_type = atoi(*attribute_values); } else if (strcmp(*attribute_names, "itime") == 0) { parser->world->itime_type = atoi(*attribute_values); } else if (strcmp(*attribute_names, "itime-behavior") == 0) { parser->world->itime_reset_activate = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "defforecolor") == 0) { parser->currColor = parser->world->deffore; parser->state = KC_DEFFORECOLOR; } else if (strcmp(element_name, "defbackcolor") == 0) { parser->currColor = parser->world->defback; parser->state = KC_DEFBACKCOLOR; } else if (strcmp(element_name, "defboldcolor") == 0) { parser->currColor = parser->world->defbold; parser->state = KC_DEFBOLDCOLOR; } else if (strcmp(element_name, "defboldbackcolor") == 0) { parser->currColor = parser->world->defboldback; parser->state = KC_DEFBOLDBACKCOLOR; } else if (strcmp(element_name, "ansicolor") == 0) { parser->currColor = parser->world->ansicolors; parser->state = KC_ANSICOLOR; } else if (strcmp(element_name, "background") == 0) { parser->state = KC_BACKGROUND; /* Ignored, but kept for backwards compatibility. */ } else { xml_error_invalid_inside(error, context); } break; case KC_WRAP: if (strcmp(element_name, "wrap-column") == 0) { parser->state = KC_WRAP_COLUMN; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->use_wrap_column = atoi(*attribute_values); } else if (strcmp(*attribute_names, "column") == 0) { parser->world->wrap_column = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_AUTO_LOGON: if (strcmp(element_name, "character") == 0) { parser->state = KC_CHARACTER; } else if (strcmp(element_name, "password") == 0) { parser->state = KC_PASSWORD; } else { xml_error_invalid_inside(error, context); } break; case KC_LOG: if (strcmp(element_name, "logfile") == 0) { parser->currText = &parser->world->log_file_name; parser->state = KC_LOGFILE; } else if (strcmp(element_name, "logtimeformat") == 0) { g_free(parser->world->log_timeformat); parser->currText = &parser->world->log_timeformat; parser->state = KC_LOGTIMEFORMAT; } else { xml_error_invalid_inside(error, context); } break; case KC_PLUGINS: if (strcmp(element_name, "plugin") == 0) { parser->currText = &parser->currPluginFile; parser->state = KC_PLUGIN; } else { xml_error_invalid_inside(error, context); } break; case KC_TRIGGERS: if (strcmp(element_name, "trigger") == 0) { parser->state = KC_TRIGGER; if (parser->forWorldSelector) { break; } parser->currTrigger = new_trigger(); while (*attribute_names) { if (strcmp(*attribute_names, "name") == 0) { parser->currTrigger->name = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "gag") == 0) { parser->currTrigger->gag_output = atoi(*attribute_values); } else if (strcmp(*attribute_names, "gaglog") == 0) { parser->currTrigger->gag_log = atoi(*attribute_values); } else if (strcmp(*attribute_names, "enabled") == 0) { parser->currTrigger->enabled = atoi(*attribute_values); } else if (strcmp(*attribute_names, "keepexecuting") == 0) { parser->currTrigger->keepexecuting = atoi(*attribute_values); } else if (strcmp(*attribute_names, "rewriter") == 0) { parser->currTrigger->rewriter = atoi(*attribute_values); } else if (strcmp(*attribute_names, "ignorecase") == 0) { parser->currTrigger->ignore_case = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_ALIASES: if (strcmp(element_name, "alias") == 0) { parser->state = KC_ALIAS; if (parser->forWorldSelector) { break; } parser->currAlias = g_new0(Alias, 1); while (*attribute_names) { if (strcmp(*attribute_names, "name") == 0) { parser->currAlias->name = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "perleval") == 0) { parser->currAlias->perl_eval = atoi(*attribute_values); } else if (strcmp(*attribute_names, "enabled") == 0) { parser->currAlias->enabled = atoi(*attribute_values); } else if (strcmp(*attribute_names, "ignorecase") == 0) { parser->currAlias->ignore_case = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_TIMERS: if (strcmp(element_name, "timer") == 0) { parser->state = KC_TIMER; if (parser->forWorldSelector) { break; } parser->currTimer = g_new0(Timer, 1); parser->currTimer->for_world = parser->world; parser->currText = &parser->currTimer->action; while (*attribute_names) { if (strcmp(*attribute_names, "name") == 0) { parser->currTimer->name = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "interval") == 0) { parser->currTimer->interval = strtod(*attribute_values, NULL); } else if (strcmp(*attribute_names, "count") == 0) { parser->currTimer->count = atoi(*attribute_values); } else if (strcmp(*attribute_names, "enabled") == 0) { parser->currTimer->enabled = atoi(*attribute_values); } else if (strcmp(*attribute_names, "temporary") == 0) { parser->currTimer->temporary = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_MACROS: if (strcmp(element_name, "macro") == 0) { parser->state = KC_MACRO; if (parser->forWorldSelector) { break; } parser->currMacro = g_new0(Macro, 1); while (*attribute_names) { if (strcmp(*attribute_names, "name") == 0) { parser->currMacro->name = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "enabled") == 0) { parser->currMacro->enabled = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_VARIABLES: if (strcmp(element_name, "variable") == 0) { parser->state = KC_VARIABLE; parser->currText = &parser->currVar; } else { xml_error_invalid_inside(error, context); } break; case KC_HOOKSV1: // Kept for backward compatibility if (strcmp(element_name, "hook") == 0) { parser->state = KC_HOOKV1; parser->previous_state = KC_HOOKSV1; if (parser->forWorldSelector) { break; } parser->currText = &parser->currHookAction; while (*attribute_names) { if (strcmp(*attribute_names, "for") == 0) { parser->currHookTrigger = g_strdup(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_HOOKSV2: if (strcmp(element_name, "hooklistv2") == 0) { parser->state = KC_HOOKLISTV2; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "for") == 0) { parser->currHookTrigger = g_strdup(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_HOOKLISTV2: if (strcmp(element_name, "hookv2") == 0) { parser->state = KC_HOOKV2; parser->previous_state = KC_HOOKLISTV2; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "name") == 0) { parser->currHookName = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "enabled") == 0) { parser->currHookEnabled = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } parser->currText = &parser->currHookAction; } else { xml_error_invalid_inside(error, context); } break; case KC_TRIGGER: if (strcmp(element_name, "pattern") == 0) { parser->currText = &parser->currTrigger->pattern; parser->state = KC_PATTERN; parser->previous_state = KC_TRIGGER; } else if (strcmp(element_name, "action") == 0) { parser->currText = &parser->currTrigger->action; parser->state = KC_ACTION; } else if (strcmp(element_name, "highlight") == 0) { parser->state = KC_HIGHLIGHT; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->currTrigger->highlight = atoi(*attribute_values); } else if (strcmp(*attribute_names, "target") == 0) { parser->currTrigger->high_target = atoi(*attribute_values); } else if (strcmp(*attribute_names, "fg") == 0) { parser->currTrigger->high_fg_color = atoi(*attribute_values); } else if (strcmp(*attribute_names, "bg") == 0) { parser->currTrigger->high_bg_color = atoi(*attribute_values); } else if (strcmp(*attribute_names, "italics") == 0) { parser->currTrigger->high_italic = atoi(*attribute_values); } else if (strcmp(*attribute_names, "strike") == 0) { parser->currTrigger->high_strike = atoi(*attribute_values); } else if (strcmp(*attribute_names, "underline") == 0) { parser->currTrigger->high_underline = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_ALIAS: if (strcmp(element_name, "pattern") == 0) { parser->currText = &parser->currAlias->pattern; parser->state = KC_PATTERN; parser->previous_state = KC_ALIAS; } else if (strcmp(element_name, "substitution") == 0) { parser->currText = &parser->currAlias->substitution; parser->state = KC_SUBSTITUTION; } else { xml_error_invalid_inside(error, context); } break; case KC_MACRO: if (strcmp(element_name, "key") == 0) { parser->state = KC_KEY; } else if (strcmp(element_name, "action") == 0) { parser->currText = &parser->currMacro->action; parser->state = KC_ACTION; parser->previous_state = KC_MACRO; } else { xml_error_invalid_inside(error, context); } break; case KC_PROTOCOLS: if (strcmp(element_name, "mccp") == 0) { parser->state = KC_MCCP; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "behavior") == 0) { parser->world->mccp_behavior = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; default: xml_error_invalid_inside(error, context); break; } } static void xml_end_element(GMarkupParseContext *context, const gchar *element_name, gpointer user_data, GError **error) { WorldParser *parser = (WorldParser *)user_data; switch (parser->state) { case KC_START: g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("Internal error: element '%s' ends when in START mode"), element_name); break; case KC_NAME: case KC_HOST: case KC_PORT: case KC_CHARSET: case KC_PROXY: case KC_AUTO_LOGON: case KC_DISPLAY: case KC_SCROLL: case KC_FLOOD_PREVENTION: case KC_REPEAT_COMMANDS: case KC_COMMAND_ECHO: case KC_NEVER_HIDE_INPUT: case KC_STORE_COMMANDS: case KC_COMMAND_HISTORY: case KC_AUTO_COMPLETION: case KC_COMMAND_SEPARATOR: case KC_INPUT_LINES: case KC_INPUT_SPELL: case KC_CONFIRM_DELETE: case KC_NAMEDISPLAY: case KC_LOG: case KC_PLUGIN_ITEMS: case KC_SCRIPTFILE: case KC_PLUGINS: case KC_TRIGGERS: case KC_ALIASES: case KC_MACROS: case KC_TIMERS: case KC_VARIABLES: case KC_HOOKSV1: case KC_HOOKSV2: case KC_PROTOCOLS: case KC_KEEP_ALIVE: parser->state = KC_KCWORLD; break; case KC_CHARACTER: case KC_PASSWORD: parser->state = KC_AUTO_LOGON; break; case KC_TERMINALFONT: case KC_ENTRYFONT: case KC_USEBOLD: case KC_WRAP: case KC_TOOLTIPS: case KC_STATUSFONT: case KC_STATUSBAR: case KC_DEFFORECOLOR: case KC_DEFBACKCOLOR: case KC_DEFBOLDCOLOR: case KC_DEFBOLDBACKCOLOR: case KC_ANSICOLOR: case KC_BACKGROUND: parser->state = KC_DISPLAY; break; case KC_WRAP_COLUMN: parser->state = KC_WRAP; break; case KC_LOGFILE: case KC_LOGTIMEFORMAT: parser->state = KC_LOG; break; case KC_PLUGIN: if (!parser->forWorldSelector) { parser->world->startup_plugin_files = g_slist_append(parser->world->startup_plugin_files, parser->currPluginFile); parser->currPluginFile = NULL; } parser->state = KC_PLUGINS; break; case KC_TRIGGER: if (!parser->forWorldSelector) { parser->world->triggers = g_slist_append(parser->world->triggers, parser->currTrigger); parser->currTrigger = NULL; ++parser->world->trigger_pos; } parser->state = KC_TRIGGERS; break; case KC_ALIAS: if (!parser->forWorldSelector) { parser->world->aliases = g_slist_append(parser->world->aliases, parser->currAlias); parser->currAlias = NULL; ++parser->world->alias_pos; } parser->state = KC_ALIASES; break; case KC_MACRO: if (!parser->forWorldSelector) { parser->world->macros = g_slist_append(parser->world->macros, parser->currMacro); parser->currMacro = NULL; ++parser->world->macro_pos; } parser->state = KC_MACROS; break; case KC_TIMER: if (!parser->forWorldSelector) { parser->world->timers = g_slist_append(parser->world->timers, parser->currTimer); parser->currTimer = NULL; ++parser->world->timer_pos; } parser->state = KC_TIMERS; break; case KC_VARIABLE: if (!parser->forWorldSelector) { parser->world->permanent_variables = g_slist_append(parser->world->permanent_variables, parser->currVar); parser->currVar = NULL; } parser->state = KC_VARIABLES; break; case KC_HOOKV1: case KC_HOOKV2: if (!parser->forWorldSelector) { connect_hook(parser->world, parser->currHookTrigger, -1, parser->currHookAction, parser->currHookName, parser->currHookEnabled); if (parser->state == KC_HOOKV1) { g_free(parser->currHookTrigger); } parser->currHookName = NULL; } parser->state = parser->previous_state; break; case KC_HOOKLISTV2: if (!parser->forWorldSelector) { g_free(parser->currHookTrigger); } parser->state = KC_HOOKSV2; break; case KC_PATTERN: case KC_ACTION: parser->state = parser->previous_state; break; case KC_HIGHLIGHT: parser->state = KC_TRIGGER; break; case KC_SUBSTITUTION: parser->state = KC_ALIAS; break; case KC_KEY: parser->state = KC_MACRO; break; case KC_MCCP: parser->state = KC_PROTOCOLS; break; case KC_KCWORLD: parser->state = KC_START; break; } } static void xml_text(GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { WorldParser *parser = (WorldParser *)user_data; gchar *tmp; if (parser->forWorldSelector && parser->state != KC_NAME && parser->state != KC_CHARACTER && parser->state != KC_PASSWORD) { return; } switch (parser->state) { case KC_NAME: case KC_HOST: case KC_PORT: case KC_CHARSET: case KC_TERMINALFONT: case KC_ENTRYFONT: case KC_STATUSFONT: case KC_FLOOD_PREVENTION: case KC_LOGFILE: case KC_LOGTIMEFORMAT: case KC_SCRIPTFILE: case KC_PLUGIN: case KC_PATTERN: case KC_ACTION: case KC_SUBSTITUTION: case KC_TIMER: case KC_VARIABLE: case KC_HOOKV1: case KC_HOOKV2: copy_text(parser->currText, text, text_len); break; case KC_CHARACTER: /* When loading to get the names to compare against passed command-line options, characters need not be loaded. */ if (parser->world->logon_characters) { copy_text(&tmp, text, text_len); gtk_list_store_append(GTK_LIST_STORE(parser->world->logon_characters), &parser->curr_logon_iter); gtk_list_store_set(GTK_LIST_STORE(parser->world->logon_characters), &parser->curr_logon_iter, LOGON_CHAR, tmp, -1); g_free(tmp); } break; case KC_PASSWORD: if (parser->world->logon_characters) { copy_text(&tmp, text, text_len); gtk_list_store_set(GTK_LIST_STORE(parser->world->logon_characters), &parser->curr_logon_iter, LOGON_PASS, tmp, -1); g_free(tmp); } break; case KC_USEBOLD: parser->world->usebold = text[0] - '0'; break; case KC_DEFFORECOLOR: case KC_DEFBACKCOLOR: case KC_DEFBOLDCOLOR: case KC_DEFBOLDBACKCOLOR: case KC_ANSICOLOR: read_color(parser->currColor, text, text_len, error); break; case KC_KEY: { guint keyval; GdkModifierType modifiers; gchar *key; copy_text(&key, text, text_len); gtk_accelerator_parse(key, &keyval, &modifiers); if (keyval) { parser->currMacro->keyval = keyval; parser->currMacro->modifiers = modifiers; } else { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Invalid key code '%s'"), key); } g_free(key); break; } default: /* Lets ignore text here */ break; } } static void xml_error_invalid_inside(GError **error, GMarkupParseContext *context) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Element '%s' not allowed inside element '%s'"), (const gchar *) g_markup_parse_context_get_element_stack(context)->data, (const gchar *) g_markup_parse_context_get_element_stack(context)->next->data); } static void xml_error_unknown_attribute(GError **error, const gchar *attribute_name, GMarkupParseContext *context) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, _("Invalid attribute '%s' for element '%s'"), attribute_name, g_markup_parse_context_get_element(context)); } static void copy_text(char **dest, const char *orig, gsize len) { *dest = g_malloc(len + 1); memcpy(*dest, orig, len); (*dest)[len] = '\0'; } void save_world_to_file(World *world) { int i; GtkTreeIter iter; GString *file_contents; GError *error = NULL; if (!world->file) { fprintf(stderr, "Error: null filename\n"); return; } file_contents = g_string_sized_new(4096); /* Header */ g_string_append(file_contents, "\n" "\n\n" "\n"); /* General data */ if (world != default_world) { kc_g_string_append_escaped(file_contents, " %s\n" " %s\n" " %s\n", world->name, world->use_tls, world->host, world->port); } kc_g_string_append_escaped(file_contents, " %s\n", world->charset); /* Proxy */ g_string_append_printf(file_contents, " proxy.type); if (world->proxy.server && strcmp(world->proxy.server, "") != 0) { kc_g_string_append_escaped(file_contents, "server=\"%s\" ", world->proxy.server); } if (world->proxy.port && strcmp(world->proxy.port, "") != 0) { kc_g_string_append_escaped(file_contents, "port=\"%s\" ", world->proxy.port); } if (world->proxy.user && strcmp(world->proxy.user, "") != 0) { kc_g_string_append_escaped(file_contents, "user=\"%s\" ", world->proxy.user); } if (world->proxy.password && strcmp(world->proxy.password, "") != 0) { kc_g_string_append_escaped(file_contents, "password=\"%s\" ", world->proxy.password); } g_string_append(file_contents, "/>\n"); /* Auto-logon */ if (world != default_world) { g_string_append_printf(file_contents, " \n", world->connection_style); if (gtk_tree_model_get_iter_first(world->logon_characters, &iter)) { do { gchar *character; gchar *password; gtk_tree_model_get(world->logon_characters, &iter, LOGON_CHAR, &character, LOGON_PASS, &password, -1); kc_g_string_append_escaped(file_contents, " %s\n", character); kc_g_string_append_escaped(file_contents, " %s\n", password); g_free(character); g_free(password); } while (gtk_tree_model_iter_next(world->logon_characters, &iter)); } g_string_append(file_contents, " \n"); } /* Fonts, Colors, Status Bar and background */ g_string_append(file_contents, " \n"); kc_g_string_append_escaped(file_contents, " %s\n" " %s\n" " %d\n" " \n" " \n" " \n" " \n" " %s\n" " \n", world->terminalfont, world->entryfont, world->usebold, world->wrap, world->wrap_indent, world->use_wrap_column, world->wrap_column, world->use_tooltips, world->statusfont, world->ctime_type, world->itime_type, world->itime_reset_activate); write_color(file_contents, "defforecolor", 0, world->deffore); write_color(file_contents, "defbackcolor", 0, world->defback); write_color(file_contents, "defboldcolor", 0, world->defbold); write_color(file_contents, "defboldbackcolor", 0, world->defboldback); for (i = 0; i < 16; ++i) { write_color(file_contents, "ansicolor", i, world->ansicolors); } g_string_append(file_contents, " \n"); /* Command entry */ kc_g_string_append_escaped(file_contents, " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n", world->repeat_commands, world->cmd_echo, world->never_hide_input, world->store_commands, world->commands_to_save, world->ignore_up_down_keys, world->autocompletion, world->autocompl_minprefix, world->command_separator, world->input_n_lines, world->input_n_lines_saved); g_string_append_printf(file_contents, " spell); if (world->spell_language) { kc_g_string_append_escaped(file_contents, " language=\"%s\"", world->spell_language); } g_string_append(file_contents, " />\n"); /* Anti flood */ g_string_append_printf(file_contents, " ", world->flood_prevention, world->max_equal_commands); kc_g_string_append_escaped(file_contents, "%s\n", world->flood_prevention_command); /* Scrolling */ g_string_append_printf(file_contents, " \n", world->scrollOutput, world->buffer_lines); /* Name display */ g_string_append_printf(file_contents, " \n", world->name_display_style, world->name_display_pattern); /* Logging */ g_string_append_printf(file_contents, " \n", world->log_autostart, world->log_add_time); if (world->log_file_name) { kc_g_string_append_escaped(file_contents, " %s\n", world->log_file_name); } if (world->log_timeformat) { kc_g_string_append_escaped(file_contents, " %s\n", world->log_timeformat); } g_string_append(file_contents, " \n"); /* Delete confirmation in GUI Editors */ g_string_append_printf(file_contents, " \n", world->confirm_delete); /* Plugin items in GUI Editors */ g_string_append_printf(file_contents, " \n", world->show_plugin_items); /* Script file */ if (world->scriptfile && strcmp(world->scriptfile, "") != 0) { kc_g_string_append_escaped(file_contents, " %s\n", world->scriptfile); } /* Startup plugins */ if (world != default_world && gtk_tree_model_iter_n_children(world->startup_plugins, NULL)) { GtkTreeIter iter; gchar *file; g_string_append(file_contents, " \n"); gtk_tree_model_get_iter_first(world->startup_plugins, &iter); do { gtk_tree_model_get(world->startup_plugins, &iter, SPLUGIN_FILE, &file, -1); kc_g_string_append_escaped(file_contents, " %s\n", file); g_free(file); } while (gtk_tree_model_iter_next(world->startup_plugins, &iter)); g_string_append(file_contents, " \n"); } /* Triggers */ if (world->triggers) { GSList *trigptr = world->triggers; Trigger *trigger; g_string_append(file_contents, " \n"); while (trigptr) { trigger = (Trigger *) trigptr->data; trigptr = trigptr->next; if (trigger->owner_plugin) { continue; } save_trigger(file_contents, trigger); } g_string_append(file_contents, " \n"); } /* Aliases */ if (world->aliases) { GSList *aliasptr = world->aliases; Alias *alias; g_string_append(file_contents, " \n"); while (aliasptr) { alias = (Alias *) aliasptr->data; aliasptr = aliasptr->next; if (alias->owner_plugin) { continue; } save_alias(file_contents, alias); } g_string_append(file_contents, " \n"); } /* Macros */ if (world->macros) { GSList *macroptr = world->macros; Macro *macro; g_string_append(file_contents, " \n"); while (macroptr) { macro = (Macro *) macroptr->data; macroptr = macroptr->next; if (macro->owner_plugin) { continue; } save_macro(file_contents, macro); } g_string_append(file_contents, " \n"); } /* Timers */ if (world->timers) { GSList *timerptr = world->timers; Timer *timer; g_string_append(file_contents, " \n"); while (timerptr) { timer = (Timer *) timerptr->data; timerptr = timerptr->next; if (timer->owner_plugin) { continue; } save_timer(file_contents, timer); } g_string_append(file_contents, " \n"); } /* Permanent variables */ if (world->permanent_variables) { GSList *varptr = world->permanent_variables; g_string_append(file_contents, " \n"); while (varptr) { g_string_append_printf(file_contents, " %s\n", (char *) varptr->data); varptr = varptr->next; } g_string_append(file_contents, " \n"); } /* Hooks */ save_hooks(file_contents, world); /* Protocols */ g_string_append(file_contents, " \n"); g_string_append_printf(file_contents, " \n", world->mccp_behavior); g_string_append(file_contents, " \n"); /* Keepalive */ g_string_append_printf(file_contents, " \n", world->keep_alive); g_string_append(file_contents, "\n"); create_kildclient_directory(); if (!g_file_set_contents(world->file, file_contents->str, file_contents->len, &error)) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not open file '%s': %s"), world->file, error->message); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } g_string_free(file_contents, TRUE); } void load_command_history(World *world) { FILE *fp; gchar *path; gchar command[MAX_BUFFER]; GtkListStore *liststore; GtkTreeIter iter; if (!world->store_commands) return; if (!world->file) { return; } path = g_strdup_printf("%s.hst", world->file); fp = fopen(path, "r"); g_free(path); if (!fp) { return; } liststore = GTK_LIST_STORE(world->cmd_list); fgets(command, MAX_BUFFER, fp); while (!feof(fp)) { command[strlen(command) - 1] = '\0'; /* Strip final newline */ gtk_list_store_append(liststore, &iter); gtk_list_store_set(liststore, &iter, CMDLIST_COL_COMMAND, command, CMDLIST_COL_TENTATIVE, NULL, -1); ++world->cmd_list_size; fgets(command, MAX_BUFFER, fp); } fclose(fp); } void save_command_history(World *world) { gchar *path; GtkTreeIter iter; gchar *command; int start_pos; GString *file_contents; if (!world->store_commands) return; if (!world->file) { fprintf(stderr, "Error: null filename\n"); return; } file_contents = g_string_sized_new(1024); /* Define start position. Most of the times saving starts at the second (pos 1) command because the first represents the command currently being entered, unless under some circunstances when using the Repeat Commands feature, in this case there is not this "being typed" command. */ if (!world->repeat_commands || world->cmd_has_been_edited) { start_pos = 1; } else { start_pos = 0; } if (gtk_tree_model_iter_nth_child(world->cmd_list, &iter, NULL, start_pos)) { do { command = cmdhistory_get_command(world->cmd_list, &iter); g_string_append(file_contents, command); g_string_append_c(file_contents, '\n'); g_free(command); } while (gtk_tree_model_iter_next(world->cmd_list, &iter)); } path = g_strdup_printf("%s.hst", world->file); g_file_set_contents(path, file_contents->str, file_contents->len, NULL); g_free(path); g_string_free(file_contents, TRUE); } void kc_g_string_append_escaped(GString *gstr, const char *template, ...) { va_list ap; char *str; va_start(ap, template); str = g_markup_vprintf_escaped(template, ap); g_string_append(gstr, str); g_free(str); } static void read_color(GdkRGBA *color, const char *text, gsize text_len, GError **error) { gchar *colordesc; int idx; guint16 red, green, blue; copy_text(&colordesc, text, text_len); if (sscanf(colordesc, "%d %hu %hu %hu", &idx, &red, &green, &blue) != 4) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, "Invalid color specification in config file."); } color[idx].alpha = 1.0; color[idx].red = red / 65535.0; color[idx].green = green / 65535.0; color[idx].blue = blue / 65535.0; g_free(colordesc); } static void write_color(GString *str, char *name, int idx, GdkRGBA *color) { g_string_append_printf(str, " <%s>%d %d %d %d\n", name, idx, (int) (color[idx].red * 65535), (int) (color[idx].green * 65535), (int) (color[idx].blue * 65535), name); } void mark_as_offline(World *world) { gchar *str; str = g_strdup_printf("%s", world->display_name); gtk_label_set_markup(world->gui->lblNotebook, str); g_free(str); str = g_strdup_printf(_("Disconnected from world %s"), world->name); gtk_label_set_text(world->gui->lblStatus, str); g_free(str); currentWorld = world; } void prepare_display_name(World *world) { gchar *character; g_free(world->display_name); g_free(world->new_text_name); if (world->character_used == NULL || world->connection_style == NONE) { character = g_strdup(""); } else { GtkTreePath *path; GtkTreeIter iter; path = gtk_tree_row_reference_get_path(world->character_used); if (!path) { gtk_tree_row_reference_free(world->character_used); world->character_used = NULL; character = g_strdup(""); } gtk_tree_model_get_iter(world->logon_characters, &iter, path); gtk_tree_model_get(world->logon_characters, &iter, LOGON_CHAR, &character, -1); } switch (world->name_display_style) { case NAME_DISPLAY_WORLD: world->display_name = g_strdup(world->name); break; case NAME_DISPLAY_WORLD_CHAR: world->display_name = g_strdup_printf("%s - %s", world->name, character); break; case NAME_DISPLAY_CHAR_WORLD: world->display_name = g_strdup_printf("%s - %s", character, world->name); break; case NAME_DISPLAY_CUSTOM: world->display_name = replace_kc_escapes(world->name_display_pattern, world->name, character); break; } world->new_text_name = g_strdup_printf("%s", world->display_name); g_free(character); } gchar * replace_kc_escapes(const gchar *pattern, const gchar *name, const gchar *character) { static GRegex *reKw = NULL; static GRegex *reKc = NULL; gchar *tmp1; gchar *tmp2; /* If this is the first run, create the GRegex structure */ if (!reKw) { reKw = g_regex_new("%Kw", 0, 0, NULL); } if (!reKc) { reKc = g_regex_new("%Kc", 0, 0, NULL); } /* Substitute KC specific strings: %Kw - World name %Kc - Character name */ tmp1 = g_regex_replace_literal(reKw, pattern, -1, 0, name, 0, NULL); tmp2 = g_regex_replace_literal(reKc, tmp1, -1, 0, character, 0, NULL); g_free(tmp1); return tmp2; } kildclient-3.0.0/src/we_colors.c0000644000175000017500000001217312374460043013513 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ /* XML UI signals */ G_MODULE_EXPORT void color_changed_cb(GtkColorButton *btn, gpointer data); G_MODULE_EXPORT void set_default_colors_cb(GtkButton *btn, gpointer data); GObject * get_we_colors_tab(World *world, GtkBuilder *ui_builder) { GObject *panel; GObject *colorBtnAnsi; GObject *colorBtnDeffore; GObject *colorBtnDefbold; GObject *colorBtnDefback; GObject *colorBtnDefboldback; gchar btnname[18]; /* 18 is enough to hold the button names */ int i; panel = gtk_builder_get_object(ui_builder, "we_panel_colors"); /* Ansi colors category */ for (i = 0; i < 16; ++i) { sprintf(btnname, "colorBtnAnsi[%d]", i); colorBtnAnsi = gtk_builder_get_object(ui_builder, btnname); gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(colorBtnAnsi), &world->ansicolors[i]); g_object_set_data(colorBtnAnsi, "colorptr", &world->ansicolors[i]); } /* Default colors category */ colorBtnDeffore = gtk_builder_get_object(ui_builder, "colorBtnDeffore"); gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(colorBtnDeffore), world->deffore); g_object_set_data(colorBtnDeffore, "colorptr", world->deffore); colorBtnDefbold = gtk_builder_get_object(ui_builder, "colorBtnDefbold"); gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(colorBtnDefbold), world->defbold); g_object_set_data(colorBtnDefbold, "colorptr", world->defbold); colorBtnDefback = gtk_builder_get_object(ui_builder, "colorBtnDefback"); gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(colorBtnDefback), world->defback); g_object_set_data(colorBtnDefback, "colorptr", world->defback); colorBtnDefboldback = gtk_builder_get_object(ui_builder, "colorBtnDefboldback"); gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(colorBtnDefboldback), world->defboldback); g_object_set_data(colorBtnDefboldback, "colorptr", world->defboldback); return panel; } void color_changed_cb(GtkColorButton *btn, gpointer data) { World *world = (World *) data; WorldGUI *gui = world->gui; GdkRGBA *color = (GdkRGBA *) g_object_get_data(G_OBJECT(btn), "colorptr"); gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(btn), color); if (gui) { ansitextview_update_color_tags(gui, gui->world); } } void set_default_colors_cb(GtkButton *btn, gpointer data) { World *world = (World *) data; WorldGUI *gui = world->gui; GtkBuilder *ui_builder; GtkColorChooser *colorBtnAnsi; GtkColorChooser *colorBtnDeffore; GtkColorChooser *colorBtnDefbold; GtkColorChooser *colorBtnDefback; GtkColorChooser *colorBtnDefboldback; gchar btnname[18]; /* 18 is enough to hold the button names */ int i; ui_builder = world->ui_builder; colorBtnDeffore = GTK_COLOR_CHOOSER(gtk_builder_get_object(ui_builder, "colorBtnDeffore")); colorBtnDefbold = GTK_COLOR_CHOOSER(gtk_builder_get_object(ui_builder, "colorBtnDefbold")); colorBtnDefback = GTK_COLOR_CHOOSER(gtk_builder_get_object(ui_builder, "colorBtnDefback")); colorBtnDefboldback = GTK_COLOR_CHOOSER(gtk_builder_get_object(ui_builder, "colorBtnDefboldback")); memcpy(world->deffore, &deffore, sizeof(GdkRGBA)); gtk_color_chooser_set_rgba(colorBtnDeffore, world->deffore); memcpy(world->defbold, &defbold, sizeof(GdkRGBA)); gtk_color_chooser_set_rgba(colorBtnDefbold, world->defbold); memcpy(world->defback, &defback, sizeof(GdkRGBA)); gtk_color_chooser_set_rgba(colorBtnDefback, world->defback); memcpy(world->defboldback, &defboldback, sizeof(GdkRGBA)); gtk_color_chooser_set_rgba(colorBtnDefboldback, world->defboldback); memcpy(world->ansicolors, &defansi, 16*sizeof(GdkRGBA)); for (i = 0; i < 16; ++i) { sprintf(btnname, "colorBtnAnsi[%d]", i); colorBtnAnsi = GTK_COLOR_CHOOSER(gtk_builder_get_object(ui_builder, btnname)); gtk_color_chooser_set_rgba(colorBtnAnsi, &world->ansicolors[i]); } if (gui) { ansitextview_update_color_tags(gui, gui->world); } } kildclient-3.0.0/src/we_macros.c0000644000175000017500000005611712374460043013504 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkTreeModel *create_we_macros_model(World *world); static void we_macro_configure_view(GtkTreeView *view, GtkTreeModel *model); static void we_macro_add_cb(GtkButton *button, gpointer data); static void we_macro_edit_cb(GtkButton *button, gpointer data); static void we_macro_delete_cb(GtkButton *button, gpointer data); static void we_macro_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); static gboolean edit_macro(World *world, Macro *macro); static gboolean we_macro_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void we_macro_move_cb(GtkButton *button, gpointer data); /* XML UI signals */ G_MODULE_EXPORT gboolean we_macro_txtname_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); GObject * get_we_macros_tab(World *world) { GtkBuilder *ui_builder; gchar *objects[] = { "we_panel_generic_graphical_editor", NULL }; GError *error = NULL; GObject *panel; GtkLabel *lblType; GObject *btnAdd; GObject *btnEdit; GObject *btnDelete; GObject *btnUp; GObject *btnDown; GObject *btnExport; GtkTreeSelection *selection; /* Create the dialog */ ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } panel = gtk_builder_get_object(ui_builder, "we_panel_generic_graphical_editor"); /* So it's not destroyed when the builder is destroyed */ g_object_ref(panel); world->viewMacro = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "viewObjects")); g_object_set_data(G_OBJECT(world->viewMacro), "forworld", world); g_signal_connect(G_OBJECT(world->viewMacro), "row-activated", G_CALLBACK(we_macro_view_row_dblclick_cb), world); g_signal_connect(G_OBJECT(world->viewMacro), "key-press-event", G_CALLBACK(we_macro_view_keypress_cb), world); lblType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblGEType")); gtk_label_set_markup(lblType, "Macros"); btnAdd = gtk_builder_get_object(ui_builder, "btnGEAdd"); g_signal_connect(btnAdd, "clicked", G_CALLBACK(we_macro_add_cb), world->viewMacro); btnEdit = gtk_builder_get_object(ui_builder, "btnGEEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(we_macro_edit_cb), world->viewMacro); btnDelete = gtk_builder_get_object(ui_builder, "btnGEDelete"); g_signal_connect(btnDelete, "clicked", G_CALLBACK(we_macro_delete_cb), world->viewMacro); btnUp = gtk_builder_get_object(ui_builder, "btnGEUp"); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_signal_connect(btnUp, "clicked", G_CALLBACK(we_macro_move_cb), world->viewMacro); btnDown = gtk_builder_get_object(ui_builder, "btnGEDown"); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); g_signal_connect(btnDown, "clicked", G_CALLBACK(we_macro_move_cb), world->viewMacro); btnExport = gtk_builder_get_object(ui_builder, "btnGEExport"); g_object_set_data(btnExport, "preselect", "Macro"); world->macro_model = create_we_macros_model(world); world->macro_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->macro_model, NULL)); g_object_unref(G_OBJECT(world->macro_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->macro_model_filter), we_guied_plugin_filter_func, world, NULL); we_macro_configure_view(world->viewMacro, GTK_TREE_MODEL(world->macro_model_filter)); selection = gtk_tree_view_get_selection(world->viewMacro); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_object_set_data(G_OBJECT(selection), "btnEdit", btnEdit); g_object_set_data(G_OBJECT(selection), "btnDelete", btnDelete); g_object_set_data(G_OBJECT(selection), "btnUp", btnUp); g_object_set_data(G_OBJECT(selection), "btnDown", btnDown); g_object_set_data(G_OBJECT(selection), "btnExport", btnExport); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(we_guied_selection_changed_cb), NULL); gtk_builder_connect_signals(ui_builder, world); g_object_unref(ui_builder); return panel; } static GtkTreeModel * create_we_macros_model(World *world) { GtkListStore *store; GtkTreeIter iter; GSList *macroptr; Macro *macro; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); macroptr = world->macros; while (macroptr) { macro = (Macro *) macroptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, macro, -1); macroptr = macroptr->next; } return GTK_TREE_MODEL(store); } static void we_macro_configure_view(GtkTreeView *view, GtkTreeModel *model) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, model); g_object_unref(model); /* Column 1 - Enabled? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(MACRO_ENABLED)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Enabled")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(MACRO_ENABLED), NULL); gtk_tree_view_append_column(view, column); /* Column 2 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(MACRO_NAME), NULL); gtk_tree_view_append_column(view, column); /* Column 3 - Key */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Key")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(MACRO_KEY), NULL); gtk_tree_view_append_column(view, column); /* Column 4 - Action */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Action")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(MACRO_ACTION), NULL); gtk_tree_view_append_column(view, column); /* Column 5 - Plugin */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Plugin")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(OBJECT_PLUGIN), NULL); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } static void we_macro_add_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; Macro *macro; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); macro = g_new0(Macro, 1); macro->enabled = 1; if (edit_macro(world, macro)) { world->macros = g_slist_insert(world->macros, macro, world->macro_pos); we_macro_insert_macro(world, macro, world->macro_pos++); } else { g_free(macro); } } static void we_macro_edit_cb(GtkButton *button, gpointer data) { /* Note that the Edit button is only active when exactly one row is selected. */ World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Macro *macro; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, ¯o, -1); if (edit_macro(world, macro)) { we_macro_update_macro(world, macro); } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_macro_delete_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Macro *macro; GSList *macroitem; GtkWidget *msgdlg; gint n; n = gtk_tree_selection_count_selected_rows(selection); msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(world->dlgEditWorld), n, _("macro"), _("macros")); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GList *listiter = g_list_last(selected); while (listiter) { gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, ¯o, -1); macroitem = g_slist_find(world->macros, macro); remove_macro(world, macroitem); listiter = listiter->prev; } } gtk_widget_destroy(msgdlg); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_macro_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { Macro *macro; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, ¯o, -1); if (edit_macro(world, macro)) { we_macro_update_macro(world, macro); } } } static gboolean edit_macro(World *world, Macro *macro) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditMacro", NULL }; GError *error = NULL; GtkWidget *dlgEditMacro; GtkEntry *txtName; GtkEntry *txtKey; GtkEntry *txtAction; GtkToggleButton *chkEnabled; const gchar *newname; const gchar *newkey; guint newkeyval; GdkModifierType newmodifiers; const gchar *newaction; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return FALSE; } gtk_builder_connect_signals(ui_builder, NULL); dlgEditMacro = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditMacro")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditMacro), GTK_RESPONSE_OK); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtMacroName")); txtKey = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtMacroKey")); txtAction = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtMacroAction")); chkEnabled = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkMacroEnabled")); /* Only display note when editing a plugin's macro */ if (!macro->owner_plugin) { GObject *label; label = gtk_builder_get_object(ui_builder, "lblNoteMacro"); gtk_widget_destroy(GTK_WIDGET(label)); label = gtk_builder_get_object(ui_builder, "lblNoteTextMacro"); gtk_widget_destroy(GTK_WIDGET(label)); } /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ if (macro->name) { gtk_entry_set_text(txtName, macro->name); } if (macro->keyval) { gchar *keycodestr = gtk_accelerator_name(macro->keyval, macro->modifiers); gtk_entry_set_text(txtKey, keycodestr); g_free(keycodestr); } if (macro->action) { gtk_entry_set_text(txtAction, macro->action); } gtk_toggle_button_set_active(chkEnabled, macro->enabled); /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditMacro); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditMacro)) == GTK_RESPONSE_OK) { /* Validate */ newkey = gtk_entry_get_text(txtKey); if (strcmp(newkey, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditMacro), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the key.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } gtk_accelerator_parse(newkey, &newkeyval, &newmodifiers); /* Shouldn't really happen if key codes are gotten from key press evt. */ if (!newkeyval) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditMacro), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Invalid key code.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } newaction = gtk_entry_get_text(txtAction); if (strcmp(newaction, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditMacro), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the action.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* Update values */ newname = gtk_entry_get_text(txtName); if (!macro->name || strcmp(newname, macro->name) != 0) { g_free(macro->name); if (strcmp(newname, "") != 0) { macro->name = g_strdup(newname); } else { macro->name = NULL; } } if (!macro->action || strcmp(newaction, macro->action) != 0) { g_free(macro->action); macro->action = g_strdup(newaction); } macro->keyval = newkeyval; macro->modifiers = newmodifiers; macro->enabled = gtk_toggle_button_get_active(chkEnabled); /* We've finished successfully */ gtk_widget_destroy(dlgEditMacro); return TRUE; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditMacro); return FALSE; } } } static gboolean we_macro_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_KEY_Delete || evt->keyval == GDK_KEY_KP_Delete) { we_macro_delete_cb(NULL, widget); return TRUE; } return FALSE; } static void we_macro_move_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; World *world; gboolean is_up; gint new_pos; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Macro *macro; gint pos; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, ¯o, -1); pos = g_slist_index(world->macros, macro); new_pos = pos; if (is_up) { if (pos != 0) { new_pos = pos - 1; move_macro(world, pos, new_pos); } } else { if (pos != world->macro_pos - 1) { new_pos = pos + 1; move_macro(world, pos, new_pos); } } /* Reselect the moved item */ gtk_tree_model_iter_nth_child(model, &iter, NULL, new_pos); gtk_tree_selection_select_iter(selection, &iter); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } void we_macro_update_macro(World *world, Macro *macro_arg) { /* Called by the Perl functions when an macro is changed, so that the display is updated. */ GtkTreeIter iter; GtkTreePath *path; Macro *macro; gboolean success; if (!world->macro_model) { return; } success = gtk_tree_model_get_iter_first(world->macro_model, &iter); while (success) { gtk_tree_model_get(world->macro_model, &iter, WE_GUIED_POINTER, ¯o, -1); if (macro == macro_arg) { path = gtk_tree_model_get_path(world->macro_model, &iter); gtk_tree_model_row_changed(world->macro_model, path, &iter); gtk_tree_path_free(path); return; } success = gtk_tree_model_iter_next(world->macro_model, &iter); } } void we_macro_insert_macro(World *world, Macro *macro, gint pos) { /* Called by the Perl functions when an macro is inserted, so that the display is updated. */ GtkTreeIter iter; if (!world->macro_model) { return; } gtk_list_store_insert(GTK_LIST_STORE(world->macro_model), &iter, pos); gtk_list_store_set(GTK_LIST_STORE(world->macro_model), &iter, WE_GUIED_POINTER, macro, -1); } void we_macro_delete_macro(World *world, Macro *macro_arg) { /* Called by the Perl functions when an macro is deleted, so that the display is updated. */ GtkTreeIter iter; Macro *macro; gboolean success; if (!world->macro_model) { return; } success = gtk_tree_model_get_iter_first(world->macro_model, &iter); while (success) { gtk_tree_model_get(world->macro_model, &iter, WE_GUIED_POINTER, ¯o, -1); if (macro == macro_arg) { gtk_list_store_remove(GTK_LIST_STORE(world->macro_model), &iter); return; } success = gtk_tree_model_iter_next(world->macro_model, &iter); } } gboolean we_macro_txtname_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { gchar *keycode; if (gtk_accelerator_valid(evt->keyval, evt->state)) { keycode = gtk_accelerator_name(evt->keyval, evt->state); gtk_entry_set_text(GTK_ENTRY(widget), keycode); g_free(keycode); } return TRUE; } kildclient-3.0.0/src/timers.c0000644000175000017500000001444112374460043013022 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" #include "ansi.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ gboolean run_timer(gpointer data) { Timer *timer = (Timer *) data; World *world = timer->for_world; if (world->disable_timers) { return TRUE; } world_for_perl = world; parse_commands(world, timer->action); we_timer_update_timer(world, timer); world_for_perl = currentWorld; if (timer->count != -1 && --timer->count <= 0) { if (timer->temporary) { we_timer_delete_timer(world, timer); world->timers = g_slist_remove(world->timers, timer); if (!timer->owner_plugin) { --world->timer_pos; } free_timer(timer, NULL); } else { timer->enabled = FALSE; } return FALSE; } return TRUE; } void start_timers(World *world) { GSList *timerptr = world->timers; Timer *timer; while (timerptr) { timer = (Timer *) timerptr->data; /* Timers of plugins loaded from the script file have already been started. */ if (timer->enabled && !timer->function_id) { timer->function_id = g_timeout_add(timer->interval * 1000, run_timer, timer); } timerptr = timerptr->next; } } void remove_timer(World *world, GSList *timeritem) { Timer *timer = (Timer *) timeritem->data; we_timer_delete_timer(world, timer); world->timers = g_slist_remove_link(world->timers, timeritem); if (!timer->owner_plugin) { --world->timer_pos; } free_timer(timer, NULL); g_slist_free(timeritem); } gboolean move_timer(World *world, gint old_pos, gint new_pos) { GSList *timeritem; gpointer timer; timeritem = g_slist_nth(world->timers, old_pos); if (!timeritem) { return FALSE; } timer = timeritem->data; world->timers = g_slist_delete_link(world->timers, timeritem); world->timers = g_slist_insert(world->timers, timer, new_pos); we_timer_delete_timer(world, timer); we_timer_insert_timer(world, timer, new_pos); return TRUE; } void free_timer(Timer *timer, gpointer data) { if (timer->enabled) { g_source_remove(timer->function_id); } g_free(timer->action); g_free(timer); } void list_timers(World *world, Plugin *plugin) { guint i; guint interval_width; guint repeat_width; guint total_width; guint field_width; GSList *timerptr; Timer *timer; /* The rows argument is not used. */ ansitextview_get_size(world->gui, &field_width, &total_width); /* If the screen is really narrow, we can do nothing. */ if (total_width < 29) { total_width = 29; } /* Calculate maximum size necessary for the interval and repeat count fields */ interval_width = 5; repeat_width = 5; timerptr = world->timers; while (timerptr) { guint this_int_width; guint this_rep_width; timer = (Timer *) timerptr->data; this_int_width = (guint) log10(timer->interval) + 5; if (this_int_width > interval_width) { interval_width = this_int_width; } this_rep_width = (guint) log10(timer->count) + 1; if (this_rep_width > repeat_width) { repeat_width = this_rep_width; } timerptr = timerptr->next; } field_width = total_width - 13 - interval_width - 1 - repeat_width - 1; ansitextview_append_string(world->gui, _("Num Ena Temp Int ")); for (i = 0; i < interval_width - 3; ++i) { ansitextview_append_string(world->gui, " "); } ansitextview_append_string(world->gui, _("Count ")); for (i = 0; i < repeat_width - 5; ++i) { ansitextview_append_string(world->gui, " "); } ansitextview_append_string_nl(world->gui, _("Action")); ansitextview_append_string(world->gui, "--- --- ---- "); for (i = 0; i < interval_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, " "); for (i = 0; i < repeat_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, " "); for (i = 0; i < field_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, "\n"); i = 0; timerptr = world->timers; while (timerptr) { timer = (Timer *) timerptr->data; if (timer->owner_plugin == plugin) { ansitextview_append_stringf(world->gui,"%3d %3.3s %4.4s %*.3f %*d %-*.*s\n", i, timer->enabled ? _("y") : _("n"), timer->temporary ? _("y") : _("n"), interval_width, timer->interval, repeat_width, timer->count, field_width, field_width, timer->action); } ++i; timerptr = timerptr->next; } } void save_timer(GString *str, Timer *timer) { g_string_append(str, " name) { g_string_append_printf(str, "name=\"%s\" ", timer->name); } g_string_append_printf(str, "interval=\"%f\" count=\"%d\" enabled=\"%d\" temporary=\"%d\">", timer->interval, timer->count, timer->enabled, timer->temporary); kc_g_string_append_escaped(str, "%s\n", timer->action); } kildclient-3.0.0/src/wresources.rc0000644000175000017500000000005411715730227014077 00000000000000kildclient ICON "../share/kildclient.ico" kildclient-3.0.0/src/dlgSelectWorld.ui0000644000175000017500000002753312374201340014627 00000000000000 False 8 Connect to True True normal True False vertical 2 True False end _Cancel True True True True False False 0 C_onnect True True True True True False False 1 False True end 0 _Select a saved world: True True False True 0.5 True True False False 4 1 230 175 True True never in True True True False False True 4 2 True False 8 True _New True True True True True True 0 _Edit True True True True True True 1 _Delete True True True True True True 2 False True 3 True False False True 8 4 Or connect d_irectly: True True False True 0.5 True True radFromList False False 4 5 True False 4 4 True False 1 _Host: True txtHost 0 0 True False 1 _Port: True txtPort 0 1 True True True 1 0 True True True 1 1 False True 4 6 btnCancel btnConnect kildclient-3.0.0/src/we_mainwindow.c0000644000175000017500000001604512374460043014370 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "libintl-wrapper.h" #include #include "kildclient.h" #include "ansi.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ /* XML UI signals */ G_MODULE_EXPORT void terminalfont_set_cb(GtkFontButton *font_btn, gpointer data); G_MODULE_EXPORT void use_bold_changed_cb(GtkToggleButton *chkbox, gpointer data); G_MODULE_EXPORT void wrap_changed_cb(GtkToggleButton *widget, gpointer data); G_MODULE_EXPORT void wrap_indent_changed_cb(GtkSpinButton *widget, gpointer data); G_MODULE_EXPORT void wrap_column_changed_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void use_tooltips_changed_cb(GtkToggleButton *widget, gpointer data); /************************* * File global variables * *************************/ GObject * get_we_mainwindow_tab(GtkBuilder *ui_builder) { GObject *panel; panel = gtk_builder_get_object(ui_builder, "we_panel_mainwindow"); return panel; } void fill_we_mainwindow_tab(World *world, GtkBuilder *ui_builder) { GtkFontButton *terminalfont_btn; GtkToggleButton *chkUseBold; GtkToggleButton *chkUseWrap; GtkSpinButton *spnWrapIndent; GtkToggleButton *radWrapFullWidth; GtkToggleButton *radWrapColumn; GtkSpinButton *spnWrapColumn; GtkToggleButton *chkUseTooltips; terminalfont_btn = GTK_FONT_BUTTON(gtk_builder_get_object(ui_builder, "terminalfont_btn")); chkUseBold = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkUseBold")); chkUseWrap = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkUseWrap")); spnWrapIndent = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnWrapIndent")); radWrapFullWidth = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radWrapFullWidth")); radWrapColumn = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radWrapColumn")); spnWrapColumn = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnWrapColumn")); chkUseTooltips = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkUseTooltips")); gtk_font_button_set_font_name(terminalfont_btn, world->terminalfont); gtk_toggle_button_set_active(chkUseBold, world->usebold); gtk_toggle_button_set_active(chkUseWrap, world->wrap); gtk_spin_button_set_value(spnWrapIndent, world->wrap_indent); if (world->use_wrap_column) { gtk_toggle_button_set_active(radWrapColumn, TRUE); } else { gtk_toggle_button_set_active(radWrapFullWidth, TRUE); } gtk_spin_button_set_value(spnWrapColumn, world->wrap_column); gtk_toggle_button_set_active(chkUseTooltips, world->use_tooltips); } void terminalfont_set_cb(GtkFontButton *font_btn, gpointer data) { PangoFontDescription *fontDesc; World *world = (World *) data; WorldGUI *gui = world->gui; free(world->terminalfont); world->terminalfont = g_strdup(gtk_font_button_get_font_name(font_btn)); if (gui) { fontDesc = pango_font_description_from_string(world->terminalfont); gtk_widget_override_font(GTK_WIDGET(world->gui->txtView), fontDesc); gtk_widget_override_font(GTK_WIDGET(world->gui->txtViewScroll), fontDesc); pango_font_description_free(fontDesc); /* If the font has changed, we don't know what the new font supports. */ gui->ta.sup_geom_shapes = -1; gui->ta.sup_block = -1; gui->ta.sup_control = -1; gui->ta.sup_l1_supplement = -1; gui->ta.sup_box_drawing = -1; gui->ta.sup_misc_tech = -1; gui->ta.sup_math = -1; gui->ta.sup_greek = -1; } } void use_bold_changed_cb(GtkToggleButton *chkbox, gpointer data) { World *world = (World *) data; WorldGUI *gui = world->gui; world->usebold = gtk_toggle_button_get_active(chkbox); if (gui) { ansitextview_update_color_tags(gui, gui->world); } } void wrap_changed_cb(GtkToggleButton *button, gpointer data) { World *world = (World *) data; WorldGUI *gui = world->gui; world->wrap = gtk_toggle_button_get_active(button); if (gui) { gtk_text_view_set_wrap_mode(gui->txtView, world->wrap ? GTK_WRAP_WORD_CHAR : GTK_WRAP_CHAR); gtk_text_view_set_wrap_mode(gui->txtViewScroll, world->wrap ? GTK_WRAP_WORD_CHAR : GTK_WRAP_CHAR); } } void wrap_indent_changed_cb(GtkSpinButton *widget, gpointer data) { World *world = (World *) data; WorldGUI *gui = world->gui; world->wrap_indent = gtk_spin_button_get_value_as_int(widget); if (gui) { gtk_text_view_set_indent(gui->txtView, -world->wrap_indent); gtk_text_view_set_indent(gui->txtViewScroll, -world->wrap_indent); } } void wrap_column_changed_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkToggleButton *radWrapFullWidth; GtkSpinButton *spnWrapColumn; radWrapFullWidth = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radWrapFullWidth")); spnWrapColumn = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnWrapColumn")); if (gtk_toggle_button_get_active(radWrapFullWidth)) { world->use_wrap_column = FALSE; } else { world->use_wrap_column = TRUE; } world->wrap_column = gtk_spin_button_get_value(spnWrapColumn); if (world->gui) { gtk_widget_queue_resize(GTK_WIDGET(world->gui->txtView)); } } void use_tooltips_changed_cb(GtkToggleButton *button, gpointer data) { World *world = (World *) data; world->use_tooltips = gtk_toggle_button_get_active(button); if (world->gui) { gtk_widget_set_has_tooltip(GTK_WIDGET(world->gui->txtView), world->use_tooltips); gtk_widget_set_has_tooltip(GTK_WIDGET(world->gui->txtViewScroll), world->use_tooltips); } } kildclient-3.0.0/src/we_protocols.c0000644000175000017500000000500412374460043014231 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "simocombobox.h" #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ GObject * get_we_protocols_tab(GtkBuilder *ui_builder) { GObject *panel; panel = gtk_builder_get_object(ui_builder, "we_panel_protocols"); return panel; } void fill_we_protocols_tab(World *world, GtkBuilder *ui_builder) { GObject *rad; if (!world) { return; } if (world->mccp_behavior == MCCP_DISABLE) { rad = gtk_builder_get_object(ui_builder, "radMCCPDisable"); } else if (world->mccp_behavior == MCCP_ALWAYS) { rad = gtk_builder_get_object(ui_builder, "radMCCPAlways"); } else { rad = gtk_builder_get_object(ui_builder, "radMCCPAfterConnect"); } gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad), TRUE); } void update_we_protocols_parameters(World *world, GtkBuilder *ui_builder) { GtkToggleButton *radMCCPAfterConnect; GtkToggleButton *radMCCPAlways; GtkToggleButton *radMCCPDisable; radMCCPAfterConnect = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radMCCPAfterConnect")); radMCCPAlways = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radMCCPAlways")); radMCCPDisable = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radMCCPDisable")); if (gtk_toggle_button_get_active(radMCCPAfterConnect)) { world->mccp_behavior = MCCP_AFTER_CONNECT; } else if (gtk_toggle_button_get_active(radMCCPAlways)) { world->mccp_behavior = MCCP_ALWAYS; } else if (gtk_toggle_button_get_active(radMCCPDisable)) { world->mccp_behavior = MCCP_DISABLE; } } kildclient-3.0.0/src/perlscript.h0000644000175000017500000000735612354321114013713 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __PERLSCRIPT_H #define __PERLSCRIPT_H #include #include /* Conflicts with C library function */ #undef gethostbyname #undef ctime /* Conflits with gettext */ #undef _ #define _(string) gettext(string) #define N_(string) (string) #ifdef __MINGW32__ /* Why the hell does Perl (under Mingw32) does all that? */ #undef FILE #undef clearerr #undef fclose #undef fdopen #undef feof #undef ferror #undef fflush #undef fgetc #undef fgetpos #undef fgets #undef fileno #undef flockfile #undef fopen #undef fprintf #undef fputc #undef fputs #undef fread #undef freopen #undef fscanf #undef fseek #undef fsetpos #undef ftell #undef ftrylockfile #undef funlockfile #undef fwrite #undef getc #undef getc_unlocked #undef getw #undef pclose #undef popen #undef putc #undef putc_unlocked #undef putw #undef rewind #undef setbuf #undef setvbuf #undef tmpfile #undef ungetc #undef vfprintf #undef printf #undef mkdir #undef stat #undef unlink #undef stdin #define stdin (&_iob[0]) #undef stdout #define stdout (&_iob[1]) #undef stderr #define stderr (&_iob[2]) #undef htons #undef gethostbyname #undef socket #undef connect #undef write #undef read #undef send #undef recv #undef close #undef getsockopt #undef setsockopt #undef gettimeofday #undef malloc #undef free #undef calloc #undef realloc #undef exit #undef __attribute__ #endif /* __MINGW32 */ /*********************** * Forward declaration * ***********************/ struct world_s; /********** * Macros * **********/ #define GRAB_PERL(w) g_rec_mutex_lock(&w->perl_mutex); \ PERL_SET_CONTEXT(w->perl_interpreter) #define RELEASE_PERL(w) g_rec_mutex_unlock(&w->perl_mutex) /*********************** * Function prototypes * ***********************/ void init_perl_system(void); void init_perl_script(struct world_s *world); void destruct_perl_script(PerlInterpreter *perl_interpreter); void perl_script_import_file(const char *file); int perl_match(const char *line, SV *pattern_re, int *match_start, int *match_end, int substring, AV **matches); char *perl_substitute(const char *line, SV *pattern_re, const char *substitution, int perl_eval, int global); SV *precompute_re(const char *re_string, int ignore_case); void perl_set_arg_array(AV *array); void parse_server_data(char *protocol, char *data); void menu_perl_run_cb(GtkWidget *widget, gpointer data); void run_perl_command(char *cmd); /*********************************** * KCWin XS subroutines prototypes * ***********************************/ void XS_KCWin__new(pTHX_ CV *perlcv); void XS_KCWin_feed(pTHX_ CV *perlcv); void XS_KCWin__destroy(pTHX_ CV *perlcv); #endif kildclient-3.0.0/src/Makefile.in0000644000175000017500000035254412376345610013435 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = kildclient$(EXEEXT) subdir = src DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)" PROGRAMS = $(bin_PROGRAMS) am_kildclient_OBJECTS = kildclient-main.$(OBJEXT) \ kildclient-net.$(OBJEXT) kildclient-telnet.$(OBJEXT) \ kildclient-proxy.$(OBJEXT) kildclient-mainwindow.$(OBJEXT) \ kildclient-worldgui.$(OBJEXT) \ kildclient-mainthread_operations.$(OBJEXT) \ kildclient-process_line_thread.$(OBJEXT) \ kildclient-ansiparse_thread.$(OBJEXT) \ kildclient-ansitextview.$(OBJEXT) \ kildclient-worldselector.$(OBJEXT) kildclient-worlds.$(OBJEXT) \ kildclient-worldeditor.$(OBJEXT) \ kildclient-we_general.$(OBJEXT) \ kildclient-we_mainwindow.$(OBJEXT) \ kildclient-we_colors.$(OBJEXT) \ kildclient-we_statusbar.$(OBJEXT) \ kildclient-we_input.$(OBJEXT) kildclient-we_logging.$(OBJEXT) \ kildclient-we_scripting.$(OBJEXT) \ kildclient-we_plugins.$(OBJEXT) \ kildclient-we_generic_guied.$(OBJEXT) \ kildclient-we_triggers.$(OBJEXT) \ kildclient-we_aliases.$(OBJEXT) kildclient-we_macros.$(OBJEXT) \ kildclient-we_timers.$(OBJEXT) kildclient-we_hooks.$(OBJEXT) \ kildclient-we_vars.$(OBJEXT) kildclient-we_protocols.$(OBJEXT) \ kildclient-we_misc.$(OBJEXT) kildclient-we_advanced.$(OBJEXT) \ kildclient-prefs.$(OBJEXT) kildclient-parser.$(OBJEXT) \ kildclient-triggers.$(OBJEXT) kildclient-aliases.$(OBJEXT) \ kildclient-macros.$(OBJEXT) kildclient-timers.$(OBJEXT) \ kildclient-permanentvariables.$(OBJEXT) \ kildclient-hooks.$(OBJEXT) kildclient-log.$(OBJEXT) \ kildclient-plugins.$(OBJEXT) \ kildclient-multilinesend.$(OBJEXT) \ kildclient-cmdhistory.$(OBJEXT) kildclient-sound.$(OBJEXT) \ kildclient-perlscript.$(OBJEXT) kildclient-kcwin.$(OBJEXT) \ kildclient-simocombobox.$(OBJEXT) \ kildclient-kcircularqueue.$(OBJEXT) wresources.$(OBJEXT) kildclient_OBJECTS = $(am_kildclient_OBJECTS) am__DEPENDENCIES_1 = kildclient_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(kildclient_SOURCES) DIST_SOURCES = $(kildclient_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(pkgdata_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = $(datadir)/locale localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ kildclient_SOURCES = main.c \ net.c \ telnet.c \ proxy.c \ mainwindow.c \ worldgui.c \ mainthread_operations.c \ process_line_thread.c \ ansiparse_thread.c \ ansitextview.c \ worldselector.c \ worlds.c \ worldeditor.c \ we_general.c \ we_mainwindow.c \ we_colors.c \ we_statusbar.c \ we_input.c \ we_logging.c \ we_scripting.c \ we_plugins.c \ we_generic_guied.c \ we_triggers.c \ we_aliases.c \ we_macros.c \ we_timers.c \ we_hooks.c \ we_vars.c \ we_protocols.c \ we_misc.c \ we_advanced.c \ prefs.c \ parser.c \ triggers.c \ aliases.c \ macros.c \ timers.c \ permanentvariables.c \ hooks.c \ log.c \ plugins.c \ multilinesend.c \ cmdhistory.c \ sound.c \ perlscript.c \ kcwin.c \ simocombobox.c \ kcircularqueue.c \ wresources.rc noinst_HEADERS = kildclient.h \ net.h \ ansi.h \ perlscript.h \ libintl-wrapper.h \ simocombobox.h \ kcircularqueue.h pkgdata_DATA = kildclient.ui \ wndmain.ui \ dlgSelectWorld.ui \ dlgPreferences.ui \ dlgStatistics.ui \ dlgAbout.ui \ dlgEditWorld.ui \ dlgTestTriggers.ui \ dlgMLSend.ui \ dlgCmdHistory.ui \ mnuPopupURL.ui uifiles = kildclient.ui \ wndmain.ui \ dlgSelectWorld.ui \ dlgPreferences.ui \ dlgStatistics.ui \ dlgAbout.ui \ dlgEditWorld.ui \ dlgTestTriggers.ui \ dlgMLSend.ui \ dlgCmdHistory.ui \ mnuPopupURL.ui EXTRA_DIST = $(pkgdata_DATA) $(uifiles) pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html kildclient_LDADD = $(GTK_LIBS) $(KILDCLIENT_PERL_LIBS) $(GTKSPELL_LIBS) $(LIBGNUTLS_LIBS) $(INTLLIBS) -lz kildclient_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" \ -DPKGDATADIR=\"$(pkgdatadir)\" \ -DSYSDATADIR=\"$(datadir)\" \ -DMANUALDIR=\"$(manualdir)\" \ -DG_LOG_DOMAIN=\"kildclient\" \ $(GTK_CFLAGS) $(KILDCLIENT_PERL_CFLAGS) $(GTKSPELL_CFLAGS) $(LIBGNUTLS_CFLAGS) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj .rc $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) kildclient$(EXEEXT): $(kildclient_OBJECTS) $(kildclient_DEPENDENCIES) $(EXTRA_kildclient_DEPENDENCIES) @rm -f kildclient$(EXEEXT) $(AM_V_CCLD)$(LINK) $(kildclient_OBJECTS) $(kildclient_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-aliases.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-ansiparse_thread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-ansitextview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-cmdhistory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-hooks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-kcircularqueue.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-kcwin.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-macros.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-mainthread_operations.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-mainwindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-multilinesend.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-net.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-parser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-perlscript.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-permanentvariables.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-plugins.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-prefs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-process_line_thread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-proxy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-simocombobox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-sound.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-telnet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-timers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-triggers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_advanced.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_aliases.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_colors.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_general.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_generic_guied.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_hooks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_input.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_logging.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_macros.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_mainwindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_misc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_plugins.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_protocols.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_scripting.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_statusbar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_timers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_triggers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_vars.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-worldeditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-worldgui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-worlds.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-worldselector.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` kildclient-main.o: main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-main.o -MD -MP -MF $(DEPDIR)/kildclient-main.Tpo -c -o kildclient-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-main.Tpo $(DEPDIR)/kildclient-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='kildclient-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c kildclient-main.obj: main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-main.obj -MD -MP -MF $(DEPDIR)/kildclient-main.Tpo -c -o kildclient-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-main.Tpo $(DEPDIR)/kildclient-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='kildclient-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` kildclient-net.o: net.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-net.o -MD -MP -MF $(DEPDIR)/kildclient-net.Tpo -c -o kildclient-net.o `test -f 'net.c' || echo '$(srcdir)/'`net.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-net.Tpo $(DEPDIR)/kildclient-net.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='net.c' object='kildclient-net.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-net.o `test -f 'net.c' || echo '$(srcdir)/'`net.c kildclient-net.obj: net.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-net.obj -MD -MP -MF $(DEPDIR)/kildclient-net.Tpo -c -o kildclient-net.obj `if test -f 'net.c'; then $(CYGPATH_W) 'net.c'; else $(CYGPATH_W) '$(srcdir)/net.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-net.Tpo $(DEPDIR)/kildclient-net.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='net.c' object='kildclient-net.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-net.obj `if test -f 'net.c'; then $(CYGPATH_W) 'net.c'; else $(CYGPATH_W) '$(srcdir)/net.c'; fi` kildclient-telnet.o: telnet.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-telnet.o -MD -MP -MF $(DEPDIR)/kildclient-telnet.Tpo -c -o kildclient-telnet.o `test -f 'telnet.c' || echo '$(srcdir)/'`telnet.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-telnet.Tpo $(DEPDIR)/kildclient-telnet.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='telnet.c' object='kildclient-telnet.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-telnet.o `test -f 'telnet.c' || echo '$(srcdir)/'`telnet.c kildclient-telnet.obj: telnet.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-telnet.obj -MD -MP -MF $(DEPDIR)/kildclient-telnet.Tpo -c -o kildclient-telnet.obj `if test -f 'telnet.c'; then $(CYGPATH_W) 'telnet.c'; else $(CYGPATH_W) '$(srcdir)/telnet.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-telnet.Tpo $(DEPDIR)/kildclient-telnet.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='telnet.c' object='kildclient-telnet.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-telnet.obj `if test -f 'telnet.c'; then $(CYGPATH_W) 'telnet.c'; else $(CYGPATH_W) '$(srcdir)/telnet.c'; fi` kildclient-proxy.o: proxy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-proxy.o -MD -MP -MF $(DEPDIR)/kildclient-proxy.Tpo -c -o kildclient-proxy.o `test -f 'proxy.c' || echo '$(srcdir)/'`proxy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-proxy.Tpo $(DEPDIR)/kildclient-proxy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='proxy.c' object='kildclient-proxy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-proxy.o `test -f 'proxy.c' || echo '$(srcdir)/'`proxy.c kildclient-proxy.obj: proxy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-proxy.obj -MD -MP -MF $(DEPDIR)/kildclient-proxy.Tpo -c -o kildclient-proxy.obj `if test -f 'proxy.c'; then $(CYGPATH_W) 'proxy.c'; else $(CYGPATH_W) '$(srcdir)/proxy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-proxy.Tpo $(DEPDIR)/kildclient-proxy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='proxy.c' object='kildclient-proxy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-proxy.obj `if test -f 'proxy.c'; then $(CYGPATH_W) 'proxy.c'; else $(CYGPATH_W) '$(srcdir)/proxy.c'; fi` kildclient-mainwindow.o: mainwindow.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-mainwindow.o -MD -MP -MF $(DEPDIR)/kildclient-mainwindow.Tpo -c -o kildclient-mainwindow.o `test -f 'mainwindow.c' || echo '$(srcdir)/'`mainwindow.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-mainwindow.Tpo $(DEPDIR)/kildclient-mainwindow.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mainwindow.c' object='kildclient-mainwindow.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-mainwindow.o `test -f 'mainwindow.c' || echo '$(srcdir)/'`mainwindow.c kildclient-mainwindow.obj: mainwindow.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-mainwindow.obj -MD -MP -MF $(DEPDIR)/kildclient-mainwindow.Tpo -c -o kildclient-mainwindow.obj `if test -f 'mainwindow.c'; then $(CYGPATH_W) 'mainwindow.c'; else $(CYGPATH_W) '$(srcdir)/mainwindow.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-mainwindow.Tpo $(DEPDIR)/kildclient-mainwindow.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mainwindow.c' object='kildclient-mainwindow.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-mainwindow.obj `if test -f 'mainwindow.c'; then $(CYGPATH_W) 'mainwindow.c'; else $(CYGPATH_W) '$(srcdir)/mainwindow.c'; fi` kildclient-worldgui.o: worldgui.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worldgui.o -MD -MP -MF $(DEPDIR)/kildclient-worldgui.Tpo -c -o kildclient-worldgui.o `test -f 'worldgui.c' || echo '$(srcdir)/'`worldgui.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worldgui.Tpo $(DEPDIR)/kildclient-worldgui.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worldgui.c' object='kildclient-worldgui.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worldgui.o `test -f 'worldgui.c' || echo '$(srcdir)/'`worldgui.c kildclient-worldgui.obj: worldgui.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worldgui.obj -MD -MP -MF $(DEPDIR)/kildclient-worldgui.Tpo -c -o kildclient-worldgui.obj `if test -f 'worldgui.c'; then $(CYGPATH_W) 'worldgui.c'; else $(CYGPATH_W) '$(srcdir)/worldgui.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worldgui.Tpo $(DEPDIR)/kildclient-worldgui.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worldgui.c' object='kildclient-worldgui.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worldgui.obj `if test -f 'worldgui.c'; then $(CYGPATH_W) 'worldgui.c'; else $(CYGPATH_W) '$(srcdir)/worldgui.c'; fi` kildclient-mainthread_operations.o: mainthread_operations.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-mainthread_operations.o -MD -MP -MF $(DEPDIR)/kildclient-mainthread_operations.Tpo -c -o kildclient-mainthread_operations.o `test -f 'mainthread_operations.c' || echo '$(srcdir)/'`mainthread_operations.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-mainthread_operations.Tpo $(DEPDIR)/kildclient-mainthread_operations.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mainthread_operations.c' object='kildclient-mainthread_operations.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-mainthread_operations.o `test -f 'mainthread_operations.c' || echo '$(srcdir)/'`mainthread_operations.c kildclient-mainthread_operations.obj: mainthread_operations.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-mainthread_operations.obj -MD -MP -MF $(DEPDIR)/kildclient-mainthread_operations.Tpo -c -o kildclient-mainthread_operations.obj `if test -f 'mainthread_operations.c'; then $(CYGPATH_W) 'mainthread_operations.c'; else $(CYGPATH_W) '$(srcdir)/mainthread_operations.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-mainthread_operations.Tpo $(DEPDIR)/kildclient-mainthread_operations.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mainthread_operations.c' object='kildclient-mainthread_operations.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-mainthread_operations.obj `if test -f 'mainthread_operations.c'; then $(CYGPATH_W) 'mainthread_operations.c'; else $(CYGPATH_W) '$(srcdir)/mainthread_operations.c'; fi` kildclient-process_line_thread.o: process_line_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-process_line_thread.o -MD -MP -MF $(DEPDIR)/kildclient-process_line_thread.Tpo -c -o kildclient-process_line_thread.o `test -f 'process_line_thread.c' || echo '$(srcdir)/'`process_line_thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-process_line_thread.Tpo $(DEPDIR)/kildclient-process_line_thread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='process_line_thread.c' object='kildclient-process_line_thread.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-process_line_thread.o `test -f 'process_line_thread.c' || echo '$(srcdir)/'`process_line_thread.c kildclient-process_line_thread.obj: process_line_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-process_line_thread.obj -MD -MP -MF $(DEPDIR)/kildclient-process_line_thread.Tpo -c -o kildclient-process_line_thread.obj `if test -f 'process_line_thread.c'; then $(CYGPATH_W) 'process_line_thread.c'; else $(CYGPATH_W) '$(srcdir)/process_line_thread.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-process_line_thread.Tpo $(DEPDIR)/kildclient-process_line_thread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='process_line_thread.c' object='kildclient-process_line_thread.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-process_line_thread.obj `if test -f 'process_line_thread.c'; then $(CYGPATH_W) 'process_line_thread.c'; else $(CYGPATH_W) '$(srcdir)/process_line_thread.c'; fi` kildclient-ansiparse_thread.o: ansiparse_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-ansiparse_thread.o -MD -MP -MF $(DEPDIR)/kildclient-ansiparse_thread.Tpo -c -o kildclient-ansiparse_thread.o `test -f 'ansiparse_thread.c' || echo '$(srcdir)/'`ansiparse_thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-ansiparse_thread.Tpo $(DEPDIR)/kildclient-ansiparse_thread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ansiparse_thread.c' object='kildclient-ansiparse_thread.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-ansiparse_thread.o `test -f 'ansiparse_thread.c' || echo '$(srcdir)/'`ansiparse_thread.c kildclient-ansiparse_thread.obj: ansiparse_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-ansiparse_thread.obj -MD -MP -MF $(DEPDIR)/kildclient-ansiparse_thread.Tpo -c -o kildclient-ansiparse_thread.obj `if test -f 'ansiparse_thread.c'; then $(CYGPATH_W) 'ansiparse_thread.c'; else $(CYGPATH_W) '$(srcdir)/ansiparse_thread.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-ansiparse_thread.Tpo $(DEPDIR)/kildclient-ansiparse_thread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ansiparse_thread.c' object='kildclient-ansiparse_thread.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-ansiparse_thread.obj `if test -f 'ansiparse_thread.c'; then $(CYGPATH_W) 'ansiparse_thread.c'; else $(CYGPATH_W) '$(srcdir)/ansiparse_thread.c'; fi` kildclient-ansitextview.o: ansitextview.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-ansitextview.o -MD -MP -MF $(DEPDIR)/kildclient-ansitextview.Tpo -c -o kildclient-ansitextview.o `test -f 'ansitextview.c' || echo '$(srcdir)/'`ansitextview.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-ansitextview.Tpo $(DEPDIR)/kildclient-ansitextview.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ansitextview.c' object='kildclient-ansitextview.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-ansitextview.o `test -f 'ansitextview.c' || echo '$(srcdir)/'`ansitextview.c kildclient-ansitextview.obj: ansitextview.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-ansitextview.obj -MD -MP -MF $(DEPDIR)/kildclient-ansitextview.Tpo -c -o kildclient-ansitextview.obj `if test -f 'ansitextview.c'; then $(CYGPATH_W) 'ansitextview.c'; else $(CYGPATH_W) '$(srcdir)/ansitextview.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-ansitextview.Tpo $(DEPDIR)/kildclient-ansitextview.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ansitextview.c' object='kildclient-ansitextview.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-ansitextview.obj `if test -f 'ansitextview.c'; then $(CYGPATH_W) 'ansitextview.c'; else $(CYGPATH_W) '$(srcdir)/ansitextview.c'; fi` kildclient-worldselector.o: worldselector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worldselector.o -MD -MP -MF $(DEPDIR)/kildclient-worldselector.Tpo -c -o kildclient-worldselector.o `test -f 'worldselector.c' || echo '$(srcdir)/'`worldselector.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worldselector.Tpo $(DEPDIR)/kildclient-worldselector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worldselector.c' object='kildclient-worldselector.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worldselector.o `test -f 'worldselector.c' || echo '$(srcdir)/'`worldselector.c kildclient-worldselector.obj: worldselector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worldselector.obj -MD -MP -MF $(DEPDIR)/kildclient-worldselector.Tpo -c -o kildclient-worldselector.obj `if test -f 'worldselector.c'; then $(CYGPATH_W) 'worldselector.c'; else $(CYGPATH_W) '$(srcdir)/worldselector.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worldselector.Tpo $(DEPDIR)/kildclient-worldselector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worldselector.c' object='kildclient-worldselector.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worldselector.obj `if test -f 'worldselector.c'; then $(CYGPATH_W) 'worldselector.c'; else $(CYGPATH_W) '$(srcdir)/worldselector.c'; fi` kildclient-worlds.o: worlds.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worlds.o -MD -MP -MF $(DEPDIR)/kildclient-worlds.Tpo -c -o kildclient-worlds.o `test -f 'worlds.c' || echo '$(srcdir)/'`worlds.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worlds.Tpo $(DEPDIR)/kildclient-worlds.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worlds.c' object='kildclient-worlds.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worlds.o `test -f 'worlds.c' || echo '$(srcdir)/'`worlds.c kildclient-worlds.obj: worlds.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worlds.obj -MD -MP -MF $(DEPDIR)/kildclient-worlds.Tpo -c -o kildclient-worlds.obj `if test -f 'worlds.c'; then $(CYGPATH_W) 'worlds.c'; else $(CYGPATH_W) '$(srcdir)/worlds.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worlds.Tpo $(DEPDIR)/kildclient-worlds.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worlds.c' object='kildclient-worlds.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worlds.obj `if test -f 'worlds.c'; then $(CYGPATH_W) 'worlds.c'; else $(CYGPATH_W) '$(srcdir)/worlds.c'; fi` kildclient-worldeditor.o: worldeditor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worldeditor.o -MD -MP -MF $(DEPDIR)/kildclient-worldeditor.Tpo -c -o kildclient-worldeditor.o `test -f 'worldeditor.c' || echo '$(srcdir)/'`worldeditor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worldeditor.Tpo $(DEPDIR)/kildclient-worldeditor.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worldeditor.c' object='kildclient-worldeditor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worldeditor.o `test -f 'worldeditor.c' || echo '$(srcdir)/'`worldeditor.c kildclient-worldeditor.obj: worldeditor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worldeditor.obj -MD -MP -MF $(DEPDIR)/kildclient-worldeditor.Tpo -c -o kildclient-worldeditor.obj `if test -f 'worldeditor.c'; then $(CYGPATH_W) 'worldeditor.c'; else $(CYGPATH_W) '$(srcdir)/worldeditor.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worldeditor.Tpo $(DEPDIR)/kildclient-worldeditor.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worldeditor.c' object='kildclient-worldeditor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worldeditor.obj `if test -f 'worldeditor.c'; then $(CYGPATH_W) 'worldeditor.c'; else $(CYGPATH_W) '$(srcdir)/worldeditor.c'; fi` kildclient-we_general.o: we_general.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_general.o -MD -MP -MF $(DEPDIR)/kildclient-we_general.Tpo -c -o kildclient-we_general.o `test -f 'we_general.c' || echo '$(srcdir)/'`we_general.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_general.Tpo $(DEPDIR)/kildclient-we_general.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_general.c' object='kildclient-we_general.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_general.o `test -f 'we_general.c' || echo '$(srcdir)/'`we_general.c kildclient-we_general.obj: we_general.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_general.obj -MD -MP -MF $(DEPDIR)/kildclient-we_general.Tpo -c -o kildclient-we_general.obj `if test -f 'we_general.c'; then $(CYGPATH_W) 'we_general.c'; else $(CYGPATH_W) '$(srcdir)/we_general.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_general.Tpo $(DEPDIR)/kildclient-we_general.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_general.c' object='kildclient-we_general.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_general.obj `if test -f 'we_general.c'; then $(CYGPATH_W) 'we_general.c'; else $(CYGPATH_W) '$(srcdir)/we_general.c'; fi` kildclient-we_mainwindow.o: we_mainwindow.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_mainwindow.o -MD -MP -MF $(DEPDIR)/kildclient-we_mainwindow.Tpo -c -o kildclient-we_mainwindow.o `test -f 'we_mainwindow.c' || echo '$(srcdir)/'`we_mainwindow.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_mainwindow.Tpo $(DEPDIR)/kildclient-we_mainwindow.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_mainwindow.c' object='kildclient-we_mainwindow.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_mainwindow.o `test -f 'we_mainwindow.c' || echo '$(srcdir)/'`we_mainwindow.c kildclient-we_mainwindow.obj: we_mainwindow.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_mainwindow.obj -MD -MP -MF $(DEPDIR)/kildclient-we_mainwindow.Tpo -c -o kildclient-we_mainwindow.obj `if test -f 'we_mainwindow.c'; then $(CYGPATH_W) 'we_mainwindow.c'; else $(CYGPATH_W) '$(srcdir)/we_mainwindow.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_mainwindow.Tpo $(DEPDIR)/kildclient-we_mainwindow.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_mainwindow.c' object='kildclient-we_mainwindow.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_mainwindow.obj `if test -f 'we_mainwindow.c'; then $(CYGPATH_W) 'we_mainwindow.c'; else $(CYGPATH_W) '$(srcdir)/we_mainwindow.c'; fi` kildclient-we_colors.o: we_colors.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_colors.o -MD -MP -MF $(DEPDIR)/kildclient-we_colors.Tpo -c -o kildclient-we_colors.o `test -f 'we_colors.c' || echo '$(srcdir)/'`we_colors.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_colors.Tpo $(DEPDIR)/kildclient-we_colors.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_colors.c' object='kildclient-we_colors.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_colors.o `test -f 'we_colors.c' || echo '$(srcdir)/'`we_colors.c kildclient-we_colors.obj: we_colors.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_colors.obj -MD -MP -MF $(DEPDIR)/kildclient-we_colors.Tpo -c -o kildclient-we_colors.obj `if test -f 'we_colors.c'; then $(CYGPATH_W) 'we_colors.c'; else $(CYGPATH_W) '$(srcdir)/we_colors.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_colors.Tpo $(DEPDIR)/kildclient-we_colors.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_colors.c' object='kildclient-we_colors.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_colors.obj `if test -f 'we_colors.c'; then $(CYGPATH_W) 'we_colors.c'; else $(CYGPATH_W) '$(srcdir)/we_colors.c'; fi` kildclient-we_statusbar.o: we_statusbar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_statusbar.o -MD -MP -MF $(DEPDIR)/kildclient-we_statusbar.Tpo -c -o kildclient-we_statusbar.o `test -f 'we_statusbar.c' || echo '$(srcdir)/'`we_statusbar.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_statusbar.Tpo $(DEPDIR)/kildclient-we_statusbar.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_statusbar.c' object='kildclient-we_statusbar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_statusbar.o `test -f 'we_statusbar.c' || echo '$(srcdir)/'`we_statusbar.c kildclient-we_statusbar.obj: we_statusbar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_statusbar.obj -MD -MP -MF $(DEPDIR)/kildclient-we_statusbar.Tpo -c -o kildclient-we_statusbar.obj `if test -f 'we_statusbar.c'; then $(CYGPATH_W) 'we_statusbar.c'; else $(CYGPATH_W) '$(srcdir)/we_statusbar.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_statusbar.Tpo $(DEPDIR)/kildclient-we_statusbar.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_statusbar.c' object='kildclient-we_statusbar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_statusbar.obj `if test -f 'we_statusbar.c'; then $(CYGPATH_W) 'we_statusbar.c'; else $(CYGPATH_W) '$(srcdir)/we_statusbar.c'; fi` kildclient-we_input.o: we_input.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_input.o -MD -MP -MF $(DEPDIR)/kildclient-we_input.Tpo -c -o kildclient-we_input.o `test -f 'we_input.c' || echo '$(srcdir)/'`we_input.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_input.Tpo $(DEPDIR)/kildclient-we_input.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_input.c' object='kildclient-we_input.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_input.o `test -f 'we_input.c' || echo '$(srcdir)/'`we_input.c kildclient-we_input.obj: we_input.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_input.obj -MD -MP -MF $(DEPDIR)/kildclient-we_input.Tpo -c -o kildclient-we_input.obj `if test -f 'we_input.c'; then $(CYGPATH_W) 'we_input.c'; else $(CYGPATH_W) '$(srcdir)/we_input.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_input.Tpo $(DEPDIR)/kildclient-we_input.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_input.c' object='kildclient-we_input.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_input.obj `if test -f 'we_input.c'; then $(CYGPATH_W) 'we_input.c'; else $(CYGPATH_W) '$(srcdir)/we_input.c'; fi` kildclient-we_logging.o: we_logging.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_logging.o -MD -MP -MF $(DEPDIR)/kildclient-we_logging.Tpo -c -o kildclient-we_logging.o `test -f 'we_logging.c' || echo '$(srcdir)/'`we_logging.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_logging.Tpo $(DEPDIR)/kildclient-we_logging.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_logging.c' object='kildclient-we_logging.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_logging.o `test -f 'we_logging.c' || echo '$(srcdir)/'`we_logging.c kildclient-we_logging.obj: we_logging.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_logging.obj -MD -MP -MF $(DEPDIR)/kildclient-we_logging.Tpo -c -o kildclient-we_logging.obj `if test -f 'we_logging.c'; then $(CYGPATH_W) 'we_logging.c'; else $(CYGPATH_W) '$(srcdir)/we_logging.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_logging.Tpo $(DEPDIR)/kildclient-we_logging.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_logging.c' object='kildclient-we_logging.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_logging.obj `if test -f 'we_logging.c'; then $(CYGPATH_W) 'we_logging.c'; else $(CYGPATH_W) '$(srcdir)/we_logging.c'; fi` kildclient-we_scripting.o: we_scripting.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_scripting.o -MD -MP -MF $(DEPDIR)/kildclient-we_scripting.Tpo -c -o kildclient-we_scripting.o `test -f 'we_scripting.c' || echo '$(srcdir)/'`we_scripting.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_scripting.Tpo $(DEPDIR)/kildclient-we_scripting.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_scripting.c' object='kildclient-we_scripting.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_scripting.o `test -f 'we_scripting.c' || echo '$(srcdir)/'`we_scripting.c kildclient-we_scripting.obj: we_scripting.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_scripting.obj -MD -MP -MF $(DEPDIR)/kildclient-we_scripting.Tpo -c -o kildclient-we_scripting.obj `if test -f 'we_scripting.c'; then $(CYGPATH_W) 'we_scripting.c'; else $(CYGPATH_W) '$(srcdir)/we_scripting.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_scripting.Tpo $(DEPDIR)/kildclient-we_scripting.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_scripting.c' object='kildclient-we_scripting.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_scripting.obj `if test -f 'we_scripting.c'; then $(CYGPATH_W) 'we_scripting.c'; else $(CYGPATH_W) '$(srcdir)/we_scripting.c'; fi` kildclient-we_plugins.o: we_plugins.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_plugins.o -MD -MP -MF $(DEPDIR)/kildclient-we_plugins.Tpo -c -o kildclient-we_plugins.o `test -f 'we_plugins.c' || echo '$(srcdir)/'`we_plugins.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_plugins.Tpo $(DEPDIR)/kildclient-we_plugins.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_plugins.c' object='kildclient-we_plugins.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_plugins.o `test -f 'we_plugins.c' || echo '$(srcdir)/'`we_plugins.c kildclient-we_plugins.obj: we_plugins.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_plugins.obj -MD -MP -MF $(DEPDIR)/kildclient-we_plugins.Tpo -c -o kildclient-we_plugins.obj `if test -f 'we_plugins.c'; then $(CYGPATH_W) 'we_plugins.c'; else $(CYGPATH_W) '$(srcdir)/we_plugins.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_plugins.Tpo $(DEPDIR)/kildclient-we_plugins.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_plugins.c' object='kildclient-we_plugins.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_plugins.obj `if test -f 'we_plugins.c'; then $(CYGPATH_W) 'we_plugins.c'; else $(CYGPATH_W) '$(srcdir)/we_plugins.c'; fi` kildclient-we_generic_guied.o: we_generic_guied.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_generic_guied.o -MD -MP -MF $(DEPDIR)/kildclient-we_generic_guied.Tpo -c -o kildclient-we_generic_guied.o `test -f 'we_generic_guied.c' || echo '$(srcdir)/'`we_generic_guied.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_generic_guied.Tpo $(DEPDIR)/kildclient-we_generic_guied.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_generic_guied.c' object='kildclient-we_generic_guied.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_generic_guied.o `test -f 'we_generic_guied.c' || echo '$(srcdir)/'`we_generic_guied.c kildclient-we_generic_guied.obj: we_generic_guied.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_generic_guied.obj -MD -MP -MF $(DEPDIR)/kildclient-we_generic_guied.Tpo -c -o kildclient-we_generic_guied.obj `if test -f 'we_generic_guied.c'; then $(CYGPATH_W) 'we_generic_guied.c'; else $(CYGPATH_W) '$(srcdir)/we_generic_guied.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_generic_guied.Tpo $(DEPDIR)/kildclient-we_generic_guied.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_generic_guied.c' object='kildclient-we_generic_guied.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_generic_guied.obj `if test -f 'we_generic_guied.c'; then $(CYGPATH_W) 'we_generic_guied.c'; else $(CYGPATH_W) '$(srcdir)/we_generic_guied.c'; fi` kildclient-we_triggers.o: we_triggers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_triggers.o -MD -MP -MF $(DEPDIR)/kildclient-we_triggers.Tpo -c -o kildclient-we_triggers.o `test -f 'we_triggers.c' || echo '$(srcdir)/'`we_triggers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_triggers.Tpo $(DEPDIR)/kildclient-we_triggers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_triggers.c' object='kildclient-we_triggers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_triggers.o `test -f 'we_triggers.c' || echo '$(srcdir)/'`we_triggers.c kildclient-we_triggers.obj: we_triggers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_triggers.obj -MD -MP -MF $(DEPDIR)/kildclient-we_triggers.Tpo -c -o kildclient-we_triggers.obj `if test -f 'we_triggers.c'; then $(CYGPATH_W) 'we_triggers.c'; else $(CYGPATH_W) '$(srcdir)/we_triggers.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_triggers.Tpo $(DEPDIR)/kildclient-we_triggers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_triggers.c' object='kildclient-we_triggers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_triggers.obj `if test -f 'we_triggers.c'; then $(CYGPATH_W) 'we_triggers.c'; else $(CYGPATH_W) '$(srcdir)/we_triggers.c'; fi` kildclient-we_aliases.o: we_aliases.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_aliases.o -MD -MP -MF $(DEPDIR)/kildclient-we_aliases.Tpo -c -o kildclient-we_aliases.o `test -f 'we_aliases.c' || echo '$(srcdir)/'`we_aliases.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_aliases.Tpo $(DEPDIR)/kildclient-we_aliases.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_aliases.c' object='kildclient-we_aliases.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_aliases.o `test -f 'we_aliases.c' || echo '$(srcdir)/'`we_aliases.c kildclient-we_aliases.obj: we_aliases.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_aliases.obj -MD -MP -MF $(DEPDIR)/kildclient-we_aliases.Tpo -c -o kildclient-we_aliases.obj `if test -f 'we_aliases.c'; then $(CYGPATH_W) 'we_aliases.c'; else $(CYGPATH_W) '$(srcdir)/we_aliases.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_aliases.Tpo $(DEPDIR)/kildclient-we_aliases.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_aliases.c' object='kildclient-we_aliases.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_aliases.obj `if test -f 'we_aliases.c'; then $(CYGPATH_W) 'we_aliases.c'; else $(CYGPATH_W) '$(srcdir)/we_aliases.c'; fi` kildclient-we_macros.o: we_macros.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_macros.o -MD -MP -MF $(DEPDIR)/kildclient-we_macros.Tpo -c -o kildclient-we_macros.o `test -f 'we_macros.c' || echo '$(srcdir)/'`we_macros.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_macros.Tpo $(DEPDIR)/kildclient-we_macros.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_macros.c' object='kildclient-we_macros.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_macros.o `test -f 'we_macros.c' || echo '$(srcdir)/'`we_macros.c kildclient-we_macros.obj: we_macros.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_macros.obj -MD -MP -MF $(DEPDIR)/kildclient-we_macros.Tpo -c -o kildclient-we_macros.obj `if test -f 'we_macros.c'; then $(CYGPATH_W) 'we_macros.c'; else $(CYGPATH_W) '$(srcdir)/we_macros.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_macros.Tpo $(DEPDIR)/kildclient-we_macros.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_macros.c' object='kildclient-we_macros.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_macros.obj `if test -f 'we_macros.c'; then $(CYGPATH_W) 'we_macros.c'; else $(CYGPATH_W) '$(srcdir)/we_macros.c'; fi` kildclient-we_timers.o: we_timers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_timers.o -MD -MP -MF $(DEPDIR)/kildclient-we_timers.Tpo -c -o kildclient-we_timers.o `test -f 'we_timers.c' || echo '$(srcdir)/'`we_timers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_timers.Tpo $(DEPDIR)/kildclient-we_timers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_timers.c' object='kildclient-we_timers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_timers.o `test -f 'we_timers.c' || echo '$(srcdir)/'`we_timers.c kildclient-we_timers.obj: we_timers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_timers.obj -MD -MP -MF $(DEPDIR)/kildclient-we_timers.Tpo -c -o kildclient-we_timers.obj `if test -f 'we_timers.c'; then $(CYGPATH_W) 'we_timers.c'; else $(CYGPATH_W) '$(srcdir)/we_timers.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_timers.Tpo $(DEPDIR)/kildclient-we_timers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_timers.c' object='kildclient-we_timers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_timers.obj `if test -f 'we_timers.c'; then $(CYGPATH_W) 'we_timers.c'; else $(CYGPATH_W) '$(srcdir)/we_timers.c'; fi` kildclient-we_hooks.o: we_hooks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_hooks.o -MD -MP -MF $(DEPDIR)/kildclient-we_hooks.Tpo -c -o kildclient-we_hooks.o `test -f 'we_hooks.c' || echo '$(srcdir)/'`we_hooks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_hooks.Tpo $(DEPDIR)/kildclient-we_hooks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_hooks.c' object='kildclient-we_hooks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_hooks.o `test -f 'we_hooks.c' || echo '$(srcdir)/'`we_hooks.c kildclient-we_hooks.obj: we_hooks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_hooks.obj -MD -MP -MF $(DEPDIR)/kildclient-we_hooks.Tpo -c -o kildclient-we_hooks.obj `if test -f 'we_hooks.c'; then $(CYGPATH_W) 'we_hooks.c'; else $(CYGPATH_W) '$(srcdir)/we_hooks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_hooks.Tpo $(DEPDIR)/kildclient-we_hooks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_hooks.c' object='kildclient-we_hooks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_hooks.obj `if test -f 'we_hooks.c'; then $(CYGPATH_W) 'we_hooks.c'; else $(CYGPATH_W) '$(srcdir)/we_hooks.c'; fi` kildclient-we_vars.o: we_vars.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_vars.o -MD -MP -MF $(DEPDIR)/kildclient-we_vars.Tpo -c -o kildclient-we_vars.o `test -f 'we_vars.c' || echo '$(srcdir)/'`we_vars.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_vars.Tpo $(DEPDIR)/kildclient-we_vars.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_vars.c' object='kildclient-we_vars.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_vars.o `test -f 'we_vars.c' || echo '$(srcdir)/'`we_vars.c kildclient-we_vars.obj: we_vars.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_vars.obj -MD -MP -MF $(DEPDIR)/kildclient-we_vars.Tpo -c -o kildclient-we_vars.obj `if test -f 'we_vars.c'; then $(CYGPATH_W) 'we_vars.c'; else $(CYGPATH_W) '$(srcdir)/we_vars.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_vars.Tpo $(DEPDIR)/kildclient-we_vars.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_vars.c' object='kildclient-we_vars.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_vars.obj `if test -f 'we_vars.c'; then $(CYGPATH_W) 'we_vars.c'; else $(CYGPATH_W) '$(srcdir)/we_vars.c'; fi` kildclient-we_protocols.o: we_protocols.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_protocols.o -MD -MP -MF $(DEPDIR)/kildclient-we_protocols.Tpo -c -o kildclient-we_protocols.o `test -f 'we_protocols.c' || echo '$(srcdir)/'`we_protocols.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_protocols.Tpo $(DEPDIR)/kildclient-we_protocols.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_protocols.c' object='kildclient-we_protocols.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_protocols.o `test -f 'we_protocols.c' || echo '$(srcdir)/'`we_protocols.c kildclient-we_protocols.obj: we_protocols.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_protocols.obj -MD -MP -MF $(DEPDIR)/kildclient-we_protocols.Tpo -c -o kildclient-we_protocols.obj `if test -f 'we_protocols.c'; then $(CYGPATH_W) 'we_protocols.c'; else $(CYGPATH_W) '$(srcdir)/we_protocols.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_protocols.Tpo $(DEPDIR)/kildclient-we_protocols.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_protocols.c' object='kildclient-we_protocols.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_protocols.obj `if test -f 'we_protocols.c'; then $(CYGPATH_W) 'we_protocols.c'; else $(CYGPATH_W) '$(srcdir)/we_protocols.c'; fi` kildclient-we_misc.o: we_misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_misc.o -MD -MP -MF $(DEPDIR)/kildclient-we_misc.Tpo -c -o kildclient-we_misc.o `test -f 'we_misc.c' || echo '$(srcdir)/'`we_misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_misc.Tpo $(DEPDIR)/kildclient-we_misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_misc.c' object='kildclient-we_misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_misc.o `test -f 'we_misc.c' || echo '$(srcdir)/'`we_misc.c kildclient-we_misc.obj: we_misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_misc.obj -MD -MP -MF $(DEPDIR)/kildclient-we_misc.Tpo -c -o kildclient-we_misc.obj `if test -f 'we_misc.c'; then $(CYGPATH_W) 'we_misc.c'; else $(CYGPATH_W) '$(srcdir)/we_misc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_misc.Tpo $(DEPDIR)/kildclient-we_misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_misc.c' object='kildclient-we_misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_misc.obj `if test -f 'we_misc.c'; then $(CYGPATH_W) 'we_misc.c'; else $(CYGPATH_W) '$(srcdir)/we_misc.c'; fi` kildclient-we_advanced.o: we_advanced.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_advanced.o -MD -MP -MF $(DEPDIR)/kildclient-we_advanced.Tpo -c -o kildclient-we_advanced.o `test -f 'we_advanced.c' || echo '$(srcdir)/'`we_advanced.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_advanced.Tpo $(DEPDIR)/kildclient-we_advanced.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_advanced.c' object='kildclient-we_advanced.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_advanced.o `test -f 'we_advanced.c' || echo '$(srcdir)/'`we_advanced.c kildclient-we_advanced.obj: we_advanced.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_advanced.obj -MD -MP -MF $(DEPDIR)/kildclient-we_advanced.Tpo -c -o kildclient-we_advanced.obj `if test -f 'we_advanced.c'; then $(CYGPATH_W) 'we_advanced.c'; else $(CYGPATH_W) '$(srcdir)/we_advanced.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_advanced.Tpo $(DEPDIR)/kildclient-we_advanced.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_advanced.c' object='kildclient-we_advanced.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_advanced.obj `if test -f 'we_advanced.c'; then $(CYGPATH_W) 'we_advanced.c'; else $(CYGPATH_W) '$(srcdir)/we_advanced.c'; fi` kildclient-prefs.o: prefs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-prefs.o -MD -MP -MF $(DEPDIR)/kildclient-prefs.Tpo -c -o kildclient-prefs.o `test -f 'prefs.c' || echo '$(srcdir)/'`prefs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-prefs.Tpo $(DEPDIR)/kildclient-prefs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='prefs.c' object='kildclient-prefs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-prefs.o `test -f 'prefs.c' || echo '$(srcdir)/'`prefs.c kildclient-prefs.obj: prefs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-prefs.obj -MD -MP -MF $(DEPDIR)/kildclient-prefs.Tpo -c -o kildclient-prefs.obj `if test -f 'prefs.c'; then $(CYGPATH_W) 'prefs.c'; else $(CYGPATH_W) '$(srcdir)/prefs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-prefs.Tpo $(DEPDIR)/kildclient-prefs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='prefs.c' object='kildclient-prefs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-prefs.obj `if test -f 'prefs.c'; then $(CYGPATH_W) 'prefs.c'; else $(CYGPATH_W) '$(srcdir)/prefs.c'; fi` kildclient-parser.o: parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-parser.o -MD -MP -MF $(DEPDIR)/kildclient-parser.Tpo -c -o kildclient-parser.o `test -f 'parser.c' || echo '$(srcdir)/'`parser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-parser.Tpo $(DEPDIR)/kildclient-parser.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parser.c' object='kildclient-parser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-parser.o `test -f 'parser.c' || echo '$(srcdir)/'`parser.c kildclient-parser.obj: parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-parser.obj -MD -MP -MF $(DEPDIR)/kildclient-parser.Tpo -c -o kildclient-parser.obj `if test -f 'parser.c'; then $(CYGPATH_W) 'parser.c'; else $(CYGPATH_W) '$(srcdir)/parser.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-parser.Tpo $(DEPDIR)/kildclient-parser.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parser.c' object='kildclient-parser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-parser.obj `if test -f 'parser.c'; then $(CYGPATH_W) 'parser.c'; else $(CYGPATH_W) '$(srcdir)/parser.c'; fi` kildclient-triggers.o: triggers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-triggers.o -MD -MP -MF $(DEPDIR)/kildclient-triggers.Tpo -c -o kildclient-triggers.o `test -f 'triggers.c' || echo '$(srcdir)/'`triggers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-triggers.Tpo $(DEPDIR)/kildclient-triggers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='triggers.c' object='kildclient-triggers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-triggers.o `test -f 'triggers.c' || echo '$(srcdir)/'`triggers.c kildclient-triggers.obj: triggers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-triggers.obj -MD -MP -MF $(DEPDIR)/kildclient-triggers.Tpo -c -o kildclient-triggers.obj `if test -f 'triggers.c'; then $(CYGPATH_W) 'triggers.c'; else $(CYGPATH_W) '$(srcdir)/triggers.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-triggers.Tpo $(DEPDIR)/kildclient-triggers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='triggers.c' object='kildclient-triggers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-triggers.obj `if test -f 'triggers.c'; then $(CYGPATH_W) 'triggers.c'; else $(CYGPATH_W) '$(srcdir)/triggers.c'; fi` kildclient-aliases.o: aliases.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-aliases.o -MD -MP -MF $(DEPDIR)/kildclient-aliases.Tpo -c -o kildclient-aliases.o `test -f 'aliases.c' || echo '$(srcdir)/'`aliases.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-aliases.Tpo $(DEPDIR)/kildclient-aliases.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='aliases.c' object='kildclient-aliases.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-aliases.o `test -f 'aliases.c' || echo '$(srcdir)/'`aliases.c kildclient-aliases.obj: aliases.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-aliases.obj -MD -MP -MF $(DEPDIR)/kildclient-aliases.Tpo -c -o kildclient-aliases.obj `if test -f 'aliases.c'; then $(CYGPATH_W) 'aliases.c'; else $(CYGPATH_W) '$(srcdir)/aliases.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-aliases.Tpo $(DEPDIR)/kildclient-aliases.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='aliases.c' object='kildclient-aliases.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-aliases.obj `if test -f 'aliases.c'; then $(CYGPATH_W) 'aliases.c'; else $(CYGPATH_W) '$(srcdir)/aliases.c'; fi` kildclient-macros.o: macros.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-macros.o -MD -MP -MF $(DEPDIR)/kildclient-macros.Tpo -c -o kildclient-macros.o `test -f 'macros.c' || echo '$(srcdir)/'`macros.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-macros.Tpo $(DEPDIR)/kildclient-macros.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='macros.c' object='kildclient-macros.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-macros.o `test -f 'macros.c' || echo '$(srcdir)/'`macros.c kildclient-macros.obj: macros.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-macros.obj -MD -MP -MF $(DEPDIR)/kildclient-macros.Tpo -c -o kildclient-macros.obj `if test -f 'macros.c'; then $(CYGPATH_W) 'macros.c'; else $(CYGPATH_W) '$(srcdir)/macros.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-macros.Tpo $(DEPDIR)/kildclient-macros.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='macros.c' object='kildclient-macros.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-macros.obj `if test -f 'macros.c'; then $(CYGPATH_W) 'macros.c'; else $(CYGPATH_W) '$(srcdir)/macros.c'; fi` kildclient-timers.o: timers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-timers.o -MD -MP -MF $(DEPDIR)/kildclient-timers.Tpo -c -o kildclient-timers.o `test -f 'timers.c' || echo '$(srcdir)/'`timers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-timers.Tpo $(DEPDIR)/kildclient-timers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='timers.c' object='kildclient-timers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-timers.o `test -f 'timers.c' || echo '$(srcdir)/'`timers.c kildclient-timers.obj: timers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-timers.obj -MD -MP -MF $(DEPDIR)/kildclient-timers.Tpo -c -o kildclient-timers.obj `if test -f 'timers.c'; then $(CYGPATH_W) 'timers.c'; else $(CYGPATH_W) '$(srcdir)/timers.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-timers.Tpo $(DEPDIR)/kildclient-timers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='timers.c' object='kildclient-timers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-timers.obj `if test -f 'timers.c'; then $(CYGPATH_W) 'timers.c'; else $(CYGPATH_W) '$(srcdir)/timers.c'; fi` kildclient-permanentvariables.o: permanentvariables.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-permanentvariables.o -MD -MP -MF $(DEPDIR)/kildclient-permanentvariables.Tpo -c -o kildclient-permanentvariables.o `test -f 'permanentvariables.c' || echo '$(srcdir)/'`permanentvariables.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-permanentvariables.Tpo $(DEPDIR)/kildclient-permanentvariables.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='permanentvariables.c' object='kildclient-permanentvariables.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-permanentvariables.o `test -f 'permanentvariables.c' || echo '$(srcdir)/'`permanentvariables.c kildclient-permanentvariables.obj: permanentvariables.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-permanentvariables.obj -MD -MP -MF $(DEPDIR)/kildclient-permanentvariables.Tpo -c -o kildclient-permanentvariables.obj `if test -f 'permanentvariables.c'; then $(CYGPATH_W) 'permanentvariables.c'; else $(CYGPATH_W) '$(srcdir)/permanentvariables.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-permanentvariables.Tpo $(DEPDIR)/kildclient-permanentvariables.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='permanentvariables.c' object='kildclient-permanentvariables.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-permanentvariables.obj `if test -f 'permanentvariables.c'; then $(CYGPATH_W) 'permanentvariables.c'; else $(CYGPATH_W) '$(srcdir)/permanentvariables.c'; fi` kildclient-hooks.o: hooks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-hooks.o -MD -MP -MF $(DEPDIR)/kildclient-hooks.Tpo -c -o kildclient-hooks.o `test -f 'hooks.c' || echo '$(srcdir)/'`hooks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-hooks.Tpo $(DEPDIR)/kildclient-hooks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hooks.c' object='kildclient-hooks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-hooks.o `test -f 'hooks.c' || echo '$(srcdir)/'`hooks.c kildclient-hooks.obj: hooks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-hooks.obj -MD -MP -MF $(DEPDIR)/kildclient-hooks.Tpo -c -o kildclient-hooks.obj `if test -f 'hooks.c'; then $(CYGPATH_W) 'hooks.c'; else $(CYGPATH_W) '$(srcdir)/hooks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-hooks.Tpo $(DEPDIR)/kildclient-hooks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hooks.c' object='kildclient-hooks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-hooks.obj `if test -f 'hooks.c'; then $(CYGPATH_W) 'hooks.c'; else $(CYGPATH_W) '$(srcdir)/hooks.c'; fi` kildclient-log.o: log.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-log.o -MD -MP -MF $(DEPDIR)/kildclient-log.Tpo -c -o kildclient-log.o `test -f 'log.c' || echo '$(srcdir)/'`log.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-log.Tpo $(DEPDIR)/kildclient-log.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log.c' object='kildclient-log.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-log.o `test -f 'log.c' || echo '$(srcdir)/'`log.c kildclient-log.obj: log.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-log.obj -MD -MP -MF $(DEPDIR)/kildclient-log.Tpo -c -o kildclient-log.obj `if test -f 'log.c'; then $(CYGPATH_W) 'log.c'; else $(CYGPATH_W) '$(srcdir)/log.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-log.Tpo $(DEPDIR)/kildclient-log.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log.c' object='kildclient-log.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-log.obj `if test -f 'log.c'; then $(CYGPATH_W) 'log.c'; else $(CYGPATH_W) '$(srcdir)/log.c'; fi` kildclient-plugins.o: plugins.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-plugins.o -MD -MP -MF $(DEPDIR)/kildclient-plugins.Tpo -c -o kildclient-plugins.o `test -f 'plugins.c' || echo '$(srcdir)/'`plugins.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-plugins.Tpo $(DEPDIR)/kildclient-plugins.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugins.c' object='kildclient-plugins.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-plugins.o `test -f 'plugins.c' || echo '$(srcdir)/'`plugins.c kildclient-plugins.obj: plugins.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-plugins.obj -MD -MP -MF $(DEPDIR)/kildclient-plugins.Tpo -c -o kildclient-plugins.obj `if test -f 'plugins.c'; then $(CYGPATH_W) 'plugins.c'; else $(CYGPATH_W) '$(srcdir)/plugins.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-plugins.Tpo $(DEPDIR)/kildclient-plugins.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugins.c' object='kildclient-plugins.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-plugins.obj `if test -f 'plugins.c'; then $(CYGPATH_W) 'plugins.c'; else $(CYGPATH_W) '$(srcdir)/plugins.c'; fi` kildclient-multilinesend.o: multilinesend.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-multilinesend.o -MD -MP -MF $(DEPDIR)/kildclient-multilinesend.Tpo -c -o kildclient-multilinesend.o `test -f 'multilinesend.c' || echo '$(srcdir)/'`multilinesend.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-multilinesend.Tpo $(DEPDIR)/kildclient-multilinesend.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='multilinesend.c' object='kildclient-multilinesend.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-multilinesend.o `test -f 'multilinesend.c' || echo '$(srcdir)/'`multilinesend.c kildclient-multilinesend.obj: multilinesend.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-multilinesend.obj -MD -MP -MF $(DEPDIR)/kildclient-multilinesend.Tpo -c -o kildclient-multilinesend.obj `if test -f 'multilinesend.c'; then $(CYGPATH_W) 'multilinesend.c'; else $(CYGPATH_W) '$(srcdir)/multilinesend.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-multilinesend.Tpo $(DEPDIR)/kildclient-multilinesend.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='multilinesend.c' object='kildclient-multilinesend.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-multilinesend.obj `if test -f 'multilinesend.c'; then $(CYGPATH_W) 'multilinesend.c'; else $(CYGPATH_W) '$(srcdir)/multilinesend.c'; fi` kildclient-cmdhistory.o: cmdhistory.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-cmdhistory.o -MD -MP -MF $(DEPDIR)/kildclient-cmdhistory.Tpo -c -o kildclient-cmdhistory.o `test -f 'cmdhistory.c' || echo '$(srcdir)/'`cmdhistory.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-cmdhistory.Tpo $(DEPDIR)/kildclient-cmdhistory.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmdhistory.c' object='kildclient-cmdhistory.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-cmdhistory.o `test -f 'cmdhistory.c' || echo '$(srcdir)/'`cmdhistory.c kildclient-cmdhistory.obj: cmdhistory.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-cmdhistory.obj -MD -MP -MF $(DEPDIR)/kildclient-cmdhistory.Tpo -c -o kildclient-cmdhistory.obj `if test -f 'cmdhistory.c'; then $(CYGPATH_W) 'cmdhistory.c'; else $(CYGPATH_W) '$(srcdir)/cmdhistory.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-cmdhistory.Tpo $(DEPDIR)/kildclient-cmdhistory.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmdhistory.c' object='kildclient-cmdhistory.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-cmdhistory.obj `if test -f 'cmdhistory.c'; then $(CYGPATH_W) 'cmdhistory.c'; else $(CYGPATH_W) '$(srcdir)/cmdhistory.c'; fi` kildclient-sound.o: sound.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-sound.o -MD -MP -MF $(DEPDIR)/kildclient-sound.Tpo -c -o kildclient-sound.o `test -f 'sound.c' || echo '$(srcdir)/'`sound.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-sound.Tpo $(DEPDIR)/kildclient-sound.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sound.c' object='kildclient-sound.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-sound.o `test -f 'sound.c' || echo '$(srcdir)/'`sound.c kildclient-sound.obj: sound.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-sound.obj -MD -MP -MF $(DEPDIR)/kildclient-sound.Tpo -c -o kildclient-sound.obj `if test -f 'sound.c'; then $(CYGPATH_W) 'sound.c'; else $(CYGPATH_W) '$(srcdir)/sound.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-sound.Tpo $(DEPDIR)/kildclient-sound.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sound.c' object='kildclient-sound.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-sound.obj `if test -f 'sound.c'; then $(CYGPATH_W) 'sound.c'; else $(CYGPATH_W) '$(srcdir)/sound.c'; fi` kildclient-perlscript.o: perlscript.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-perlscript.o -MD -MP -MF $(DEPDIR)/kildclient-perlscript.Tpo -c -o kildclient-perlscript.o `test -f 'perlscript.c' || echo '$(srcdir)/'`perlscript.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-perlscript.Tpo $(DEPDIR)/kildclient-perlscript.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perlscript.c' object='kildclient-perlscript.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-perlscript.o `test -f 'perlscript.c' || echo '$(srcdir)/'`perlscript.c kildclient-perlscript.obj: perlscript.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-perlscript.obj -MD -MP -MF $(DEPDIR)/kildclient-perlscript.Tpo -c -o kildclient-perlscript.obj `if test -f 'perlscript.c'; then $(CYGPATH_W) 'perlscript.c'; else $(CYGPATH_W) '$(srcdir)/perlscript.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-perlscript.Tpo $(DEPDIR)/kildclient-perlscript.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perlscript.c' object='kildclient-perlscript.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-perlscript.obj `if test -f 'perlscript.c'; then $(CYGPATH_W) 'perlscript.c'; else $(CYGPATH_W) '$(srcdir)/perlscript.c'; fi` kildclient-kcwin.o: kcwin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-kcwin.o -MD -MP -MF $(DEPDIR)/kildclient-kcwin.Tpo -c -o kildclient-kcwin.o `test -f 'kcwin.c' || echo '$(srcdir)/'`kcwin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-kcwin.Tpo $(DEPDIR)/kildclient-kcwin.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='kcwin.c' object='kildclient-kcwin.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-kcwin.o `test -f 'kcwin.c' || echo '$(srcdir)/'`kcwin.c kildclient-kcwin.obj: kcwin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-kcwin.obj -MD -MP -MF $(DEPDIR)/kildclient-kcwin.Tpo -c -o kildclient-kcwin.obj `if test -f 'kcwin.c'; then $(CYGPATH_W) 'kcwin.c'; else $(CYGPATH_W) '$(srcdir)/kcwin.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-kcwin.Tpo $(DEPDIR)/kildclient-kcwin.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='kcwin.c' object='kildclient-kcwin.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-kcwin.obj `if test -f 'kcwin.c'; then $(CYGPATH_W) 'kcwin.c'; else $(CYGPATH_W) '$(srcdir)/kcwin.c'; fi` kildclient-simocombobox.o: simocombobox.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-simocombobox.o -MD -MP -MF $(DEPDIR)/kildclient-simocombobox.Tpo -c -o kildclient-simocombobox.o `test -f 'simocombobox.c' || echo '$(srcdir)/'`simocombobox.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-simocombobox.Tpo $(DEPDIR)/kildclient-simocombobox.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simocombobox.c' object='kildclient-simocombobox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-simocombobox.o `test -f 'simocombobox.c' || echo '$(srcdir)/'`simocombobox.c kildclient-simocombobox.obj: simocombobox.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-simocombobox.obj -MD -MP -MF $(DEPDIR)/kildclient-simocombobox.Tpo -c -o kildclient-simocombobox.obj `if test -f 'simocombobox.c'; then $(CYGPATH_W) 'simocombobox.c'; else $(CYGPATH_W) '$(srcdir)/simocombobox.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-simocombobox.Tpo $(DEPDIR)/kildclient-simocombobox.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simocombobox.c' object='kildclient-simocombobox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-simocombobox.obj `if test -f 'simocombobox.c'; then $(CYGPATH_W) 'simocombobox.c'; else $(CYGPATH_W) '$(srcdir)/simocombobox.c'; fi` kildclient-kcircularqueue.o: kcircularqueue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-kcircularqueue.o -MD -MP -MF $(DEPDIR)/kildclient-kcircularqueue.Tpo -c -o kildclient-kcircularqueue.o `test -f 'kcircularqueue.c' || echo '$(srcdir)/'`kcircularqueue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-kcircularqueue.Tpo $(DEPDIR)/kildclient-kcircularqueue.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='kcircularqueue.c' object='kildclient-kcircularqueue.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-kcircularqueue.o `test -f 'kcircularqueue.c' || echo '$(srcdir)/'`kcircularqueue.c kildclient-kcircularqueue.obj: kcircularqueue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-kcircularqueue.obj -MD -MP -MF $(DEPDIR)/kildclient-kcircularqueue.Tpo -c -o kildclient-kcircularqueue.obj `if test -f 'kcircularqueue.c'; then $(CYGPATH_W) 'kcircularqueue.c'; else $(CYGPATH_W) '$(srcdir)/kcircularqueue.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-kcircularqueue.Tpo $(DEPDIR)/kildclient-kcircularqueue.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='kcircularqueue.c' object='kildclient-kcircularqueue.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-kcircularqueue.obj `if test -f 'kcircularqueue.c'; then $(CYGPATH_W) 'kcircularqueue.c'; else $(CYGPATH_W) '$(srcdir)/kcircularqueue.c'; fi` install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgdataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-pkgdataDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-pkgdataDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-pkgdataDATA .rc.o: @RES_COMPILE@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: kildclient-3.0.0/src/ansiparse_thread.c0000644000175000017500000006736612374460043015051 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include "kildclient.h" #include "ansi.h" /************************* * File global variables * *************************/ /* Values used to get the 6x6x6 color cube of xterm 256 color mode */ static guint8 xterm256color[] = { 0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff }; /* Values used for greyscales in xterm 256 color mode */ static guint8 xterm256gray[] = { 0x08, 0x12, 0x1c, 0x26, 0x30, 0x3a, 0x44, 0x4e, 0x58, 0x62, 0x6c, 0x76, 0x80, 0x8a, 0x94, 0x9e, 0xa8, 0xb2, 0xbc, 0xc6, 0xd0, 0xda, 0xe4, 0xee }; /* UTF-8 codes for the characters used in line-drawing mode */ static gchar *linedrawingchars[] = { "\342\227\206", /* ` */ "\342\226\222", /* a */ "\342\220\211", /* b */ "\342\220\214", /* c */ "\342\220\215", /* d */ "\342\220\212", /* e */ "\302\260", /* f */ "\302\261", /* g */ "\342\220\244", /* h */ "\342\220\213", /* i */ "\342\224\230", /* j */ "\342\224\220", /* k */ "\342\224\214", /* l */ "\342\224\224", /* m */ "\342\224\274", /* n */ "\342\216\272", /* o */ "\342\216\273", /* p */ "\342\224\200", /* q */ "\342\216\274", /* r */ "\342\216\275", /* s */ "\342\224\234", /* t */ "\342\224\244", /* u */ "\342\224\264", /* v */ "\342\224\254", /* w */ "\342\224\202", /* x */ "\342\211\244", /* y */ "\342\211\245", /* z */ "\317\200", /* { */ "\342\211\240", /* | */ "\302\243", /* } */ "\302\267", /* ~ */ }; /* ASCII characters replacing those of line-drawing mode when they are not available. */ static gchar *replacingchars[] = { "?", /* ` */ "#", /* a */ "?", /* b */ "?", /* c */ "?", /* d */ "?", /* e */ "o", /* f */ "?", /* g */ "?", /* h */ "?", /* i */ "+", /* j */ "+", /* k */ "+", /* l */ "+", /* m */ "+", /* n */ "-", /* o */ "-", /* p */ "-", /* q */ "_", /* r */ "_", /* s */ "|", /* t */ "|", /* u */ "-", /* v */ "-", /* w */ "|", /* x */ "<", /* y */ ">", /* z */ "p", /* { */ "?", /* | */ "L", /* } */ ".", /* ~ */ }; /*********************** * Function prototypes * ***********************/ static void process_ansiparse_operation(AnsiParseOperation *operation, World *world); static void queue_operation_from_gui(WorldGUI *gui, MainThreadOperation *operation); static void clear_pending_line(World *world); static void parse_and_append_ansi_string(WorldGUI *gui, const gchar *string, gsize len); static void apply_highlights_and_move_mark(World *world, GSList *highlights); static void parse_and_append_echoed_string(WorldGUI *gui, const gchar *str, gsize len); static void apply_highlights(World *world, GSList *highlights); static void finalize_line(World *world); static void insert_text(WorldGUI *gui, const guchar *text, gsize len, MainThreadOperationType where, MainThreadOperationFunction operation_func); static void parse_ansi_sequence(WorldGUI *gui); static void insert_with_possible_urls(WorldGUI *gui, const guchar *text, gsize len, MainThreadOperationType where, MainThreadOperationFunction operation_func); static void reset_ansi_state(TAState *state); static gchar *convert_vt100linedraw_string(WorldGUI *gui, const guchar *text, gsize len); static GtkTextTag *get_tag_for_xterm256_color(WorldGUI *gui, gint x256idx, gint code_used); static GtkTextTag *get_tag_for_color(WorldGUI *gui, guint8 r, guint8 g, guint8 b, gboolean is_back); gpointer ansiparse_thread(gpointer data) { World *world = (World *) data; g_async_queue_ref(world->ansiparse_operations); g_async_queue_ref(world->mainthread_operations); while (1) { AnsiParseOperation *operation = (AnsiParseOperation *) g_async_queue_pop(world->ansiparse_operations); if (world->to_be_destructed) { g_async_queue_unref(world->ansiparse_operations); g_async_queue_unref(world->mainthread_operations); free_ansiparse_operation(operation); return NULL; } process_ansiparse_operation(operation, world); free_ansiparse_operation(operation); } } void free_ansiparse_operation(gpointer data) { AnsiParseOperation *operation = (AnsiParseOperation *) data; switch (operation->action) { case APPEND_LINE: case APPEND_ECHOED_LINE: g_free(operation->line.line); break; case APPLY_HIGHLIGHTS_AND_MOVE_MARK: g_slist_free(operation->highlights); break; default: /* Nothing special to free */ break; } g_free(operation); } static void process_ansiparse_operation(AnsiParseOperation *operation, World *world) { switch (operation->action) { case CLEAR_PENDING_LINE_ANSI: clear_pending_line(world); break; case APPEND_LINE: parse_and_append_ansi_string(world->gui, operation->line.line, operation->line.line_len); break; case APPEND_ECHOED_LINE: parse_and_append_echoed_string(world->gui, operation->line.line, operation->line.line_len); break; case APPLY_HIGHLIGHTS_AND_MOVE_MARK: apply_highlights_and_move_mark(world, operation->highlights); break; case FINALIZE_LINE: finalize_line(world); break; case DUMMY_ANSIPARSE: break; } } static void queue_operation_from_gui(WorldGUI *gui, MainThreadOperation *operation) { queue_mainthread_operation(gui->world, operation); } static void clear_pending_line(World *world) { MainThreadOperation *operation = g_new(MainThreadOperation, 1); operation->action = CLEAR_PENDING_LINE; queue_mainthread_operation(world, operation); /* Since an ANSI sequence cannot be incomplete at the end of one line and continue at another (because \n is not valid inside ANSI strings), ANSI parsing at a line always starts in DATA mode. */ world->gui->ansi_parse.ansifsm_state = ANSIFSM_DATA; world->gui->ansi_parse.ansiseq_pos = 0; /* Furthermore, colors are restored to what they were in the end of the last complete line. */ world->gui->ta_state = world->gui->saved_ta_state; } static void parse_and_append_ansi_string(WorldGUI *gui, const gchar *string, gsize len) { insert_ansi_string(gui, string, len, INSERT_AT_END, queue_operation_from_gui); } static void parse_and_append_echoed_string(WorldGUI *gui, const gchar *str, gsize len) { /* * Append str (a null-terminated string) possibly with ANSI color * codes to the Buffer, which does not come from the MUD, but was * echoed. The state of the ANSI parser is saved in case an * incomplete ANSI sequence was pending. The line is printed above * any incomplete line (prompt). */ AnsiParseState saved_ansi_parse; TAState saved_state; guint printed; guint to_print; saved_ansi_parse = gui->ansi_parse; saved_state = gui->ta_state; gui->ansi_parse.ansifsm_state = ANSIFSM_DATA; gui->ansi_parse.ansiseq_pos = 0; /* Due to static buffers, only MAX_BUFFER chars can be printed at a time. */ printed = 0; while (printed < len) { to_print = (len - printed) > MAX_BUFFER ? MAX_BUFFER : (len - printed); insert_ansi_string(gui, str + printed, to_print, INSERT_AT_MARK, queue_operation_from_gui); printed += to_print; } gui->ansi_parse = saved_ansi_parse; gui->ta_state = saved_state; } static void apply_highlights_and_move_mark(World *world, GSList *highlights) { apply_highlights(world, highlights); /* Move mark */ MainThreadOperation *operation = g_new(MainThreadOperation, 1); operation->action = MOVE_LINESTART_MARK; queue_mainthread_operation(world, operation); /* Save color at end of line */ world->gui->saved_ta_state = world->gui->ta_state; } static void apply_highlights(World *world, GSList *highlights) { GSList *cur_highlight; for (cur_highlight = highlights; cur_highlight; cur_highlight = cur_highlight->next) { MainThreadOperation *operation = g_new(MainThreadOperation, 1); operation->action = APPLY_HIGHLIGHT; operation->highlight = cur_highlight->data; queue_mainthread_operation(world, operation); } } static void finalize_line(World *world) { g_timer_start(world->last_data_written); } void insert_ansi_string(WorldGUI *gui, const gchar *str, gsize len, MainThreadOperationType where, MainThreadOperationFunction operation_func) { /* * Interprets str, possibly with ANSI color codes, and queues * operations that will insert it in the buffer, using where as the * operation (INSERT_AT_END or INSERT_AT_MARK). */ guchar text_buffer[MAX_BUFFER]; gint text_buffer_pos; guint original_pos; MainThreadOperation *operation; text_buffer_pos = 0; original_pos = 0; while (str[original_pos] && original_pos < len) { switch (gui->ansi_parse.ansifsm_state) { case ANSIFSM_DATA: if (str[original_pos] == ANSI_ESC) { gui->ansi_parse.ansifsm_state = ANSIFSM_ESC; } else { text_buffer[text_buffer_pos++] = str[original_pos]; } break; case ANSIFSM_ESC: if (str[original_pos] == '[') { gui->ansi_parse.ansifsm_state = ANSIFSM_ANSISEQ; if (text_buffer_pos) { insert_text(gui, text_buffer, text_buffer_pos, where, operation_func); text_buffer_pos = 0; } } else if (str[original_pos] == '(') { gui->ansi_parse.ansifsm_state = ANSIFSM_ESCLEFTPAR; } else { /* Put the ESC back */ text_buffer[text_buffer_pos++] = ANSI_ESC; text_buffer[text_buffer_pos++] = str[original_pos]; gui->ansi_parse.ansifsm_state = ANSIFSM_DATA; } break; case ANSIFSM_ANSISEQ: /* Since there is no reason for a valid ANSI sequence that is longer than MAX_BUFFER, we simply cut it if it is too long. */ if ((isdigit(str[original_pos]) || str[original_pos] == ';') && gui->ansi_parse.ansiseq_pos < MAX_BUFFER) { gui->ansi_parse.ansiseq_buffer[gui->ansi_parse.ansiseq_pos++] = str[original_pos]; } else { gui->ansi_parse.ansifsm_state = ANSIFSM_DATA; if (str[original_pos] == 'm') { parse_ansi_sequence(gui); } else { /* Not recognized, ignored and cleared. */ /* FIXME: Copy it back, being careful with buffer size. */ gui->ansi_parse.ansiseq_pos = 0; } } break; case ANSIFSM_ESCLEFTPAR: if (str[original_pos] == '0' || str[original_pos] == 'B') { gui->ansi_parse.ansifsm_state = ANSIFSM_DATA; if (text_buffer_pos) { insert_text(gui, text_buffer, text_buffer_pos, where, operation_func); text_buffer_pos = 0; } gui->ansi_parse.linedraw = (str[original_pos] == '0'); } else { /* Put unrecognized sequence back */ text_buffer[text_buffer_pos++] = ANSI_ESC; text_buffer[text_buffer_pos++] = '('; text_buffer[text_buffer_pos++] = str[original_pos]; gui->ansi_parse.ansifsm_state = ANSIFSM_DATA; } break; } ++original_pos; } /* Add any remaining text */ if (text_buffer_pos) { insert_text(gui, text_buffer, text_buffer_pos, where, operation_func); text_buffer_pos = 0; } /* Notify that text has been added. */ if (gui->world) { operation = g_new(MainThreadOperation, 1); operation->action = TEXT_ADDED; operation_func(gui, operation); } } static void insert_text(WorldGUI *gui, const guchar *text, gsize len, MainThreadOperationType where, MainThreadOperationFunction operation_func) { if (gui->ansi_parse.linedraw) { MainThreadOperation *operation = g_new(MainThreadOperation, 1); operation->action = where; operation->text_insert.text = convert_vt100linedraw_string(gui, text, len); operation->text_insert.use_ta = TRUE; operation->text_insert.ta_state = gui->ta_state; operation->text_insert.extra_tag = NULL; operation_func(gui, operation); } else { insert_with_possible_urls(gui, text, len, where, operation_func); } } static void insert_with_possible_urls(WorldGUI *gui, const guchar *text, gsize len, MainThreadOperationType where, MainThreadOperationFunction operation_func) { static regex_t regex; static gsize re_compiled = 0; guchar ctext[MAX_BUFFER + 1]; regmatch_t match; guint search_start; if (g_once_init_enter(&re_compiled)) { regcomp(®ex, "(((https?|ftp)://)|www\\.)[-A-Za-z0-9\\./?=&+%:#_~@,]*[-A-Za-z0-9\\/?=&+%:#_~]", REG_EXTENDED | REG_ICASE); g_once_init_leave(&re_compiled, 1); } /* We need a NULL-terminated string */ memcpy(ctext, text, len); ctext[len] = '\0'; search_start = 0; while (search_start < len) { if (regexec(®ex, (char *) (ctext + search_start), 1, &match, 0) == 0) { MainThreadOperation *operation = g_new(MainThreadOperation, 1); /* Text before the URL */ operation->action = where; operation->text_insert.text = g_strndup((gchar *) (text + search_start), match.rm_so); operation->text_insert.use_ta = TRUE; operation->text_insert.ta_state = gui->ta_state; operation->text_insert.extra_tag = NULL; operation_func(gui, operation); /* The URL */ operation = g_new(MainThreadOperation, 1); operation->action = where; operation->text_insert.text = g_strndup((gchar *) (text + search_start + match.rm_so), match.rm_eo - match.rm_so); operation->text_insert.use_ta = TRUE; operation->text_insert.ta_state = gui->ta_state; operation->text_insert.extra_tag = gui->txttag_url; operation_func(gui, operation); /* Continue looking */ search_start += match.rm_eo; } else { MainThreadOperation *operation = g_new(MainThreadOperation, 1); /* Text after the URL */ operation->action = where; operation->text_insert.text = g_strndup((gchar *) (text + search_start), len - search_start); operation->text_insert.use_ta = TRUE; operation->text_insert.ta_state = gui->ta_state; operation->text_insert.extra_tag = NULL; operation_func(gui, operation); break; } } } static void parse_ansi_sequence(WorldGUI *gui) { gchar **sequences; gchar **curr_seq; int val; /* xterm256 state: used to parse xterm's 256 color cube. xterm sequences: ESC[38;5;Xm and ESC[48;5;Xm, fore and back resp. When this variable is 0, no xterm sequence parsing is being done. When 38 or 48 is seen, the variable is set to -38 or -48, respectively. When it is negative, and -5 is seen, its sign is changed. When it is positive, the color value is read and parsed. */ gint xterm256_state = 0; /* ESC[m, this means reset to default. */ if (gui->ansi_parse.ansiseq_pos == 0) { reset_ansi_state(&gui->ta_state); return; } /* Add NULL terminator. */ gui->ansi_parse.ansiseq_buffer[gui->ansi_parse.ansiseq_pos] = 0; sequences = g_strsplit_set((gchar *) gui->ansi_parse.ansiseq_buffer, ";", -1); curr_seq = sequences; while (*curr_seq) { val = atoi(*curr_seq); if (xterm256_state < 0) { if (val == XTERM256_SECOND_CODE) { xterm256_state = -xterm256_state; } else { /* Ignore the strange sequence. */ xterm256_state = 0; } ++curr_seq; continue; } else if (xterm256_state > 0) { if (xterm256_state == XTERM256_SET_FORE) { gui->ta_state.foreground_color_tag = get_tag_for_xterm256_color(gui, val, xterm256_state); } else if (xterm256_state == XTERM256_SET_BACK) { gui->ta_state.background_color_tag = get_tag_for_xterm256_color(gui, val, xterm256_state); } xterm256_state = 0; ++curr_seq; continue; } if (val == 0) { reset_ansi_state(&gui->ta_state); } else if (val >= ANSI_FIRST_FG_COLOR && val <= ANSI_LAST_FG_COLOR) { gui->ta_state.fg_color = val - ANSI_FIRST_FG_COLOR; gui->ta_state.foreground_color_tag = NULL; } else if (val == ANSI_FG_DEFAULT) { gui->ta_state.fg_color = ANSI_DEFAULT_COLOR_IDX; gui->ta_state.foreground_color_tag = NULL; } else if (val == ANSI_SET_FG_BOLD) { gui->ta_state.fg_base_idx = ANSI_BOLD_BASE_IDX; } else if (val == ANSI_BOLD_OFF) { gui->ta_state.fg_base_idx = ANSI_NORMAL_BASE_IDX; } else if (val >= ANSI_FIRST_BG_COLOR && val <= ANSI_LAST_BG_COLOR) { gui->ta_state.bg_color = val - ANSI_FIRST_BG_COLOR; gui->ta_state.background_color_tag = NULL; } else if (val == ANSI_BG_DEFAULT) { gui->ta_state.bg_color = ANSI_DEFAULT_COLOR_IDX; gui->ta_state.background_color_tag = NULL; } else if (val == ANSI_SET_BG_LIGHT) { gui->ta_state.bg_base_idx = ANSI_BOLD_BASE_IDX; } else if (val == ANSI_BOLD_BG_OFF) { gui->ta_state.bg_base_idx = ANSI_NORMAL_BASE_IDX; } else if (val == ANSI_SET_UNDERLINE) { gui->ta_state.underline = PANGO_UNDERLINE_SINGLE; } else if (val == ANSI_SET_DBLUNDERLINE) { gui->ta_state.underline = PANGO_UNDERLINE_DOUBLE; } else if (val == ANSI_UNDERLINE_OFF) { gui->ta_state.underline = PANGO_UNDERLINE_NONE; } else if (val == ANSI_SET_STRIKE) { gui->ta_state.strike = TRUE; } else if (val == ANSI_STRIKE_OFF) { gui->ta_state.strike = FALSE; } else if (val == ANSI_SET_ITALICS) { gui->ta_state.italics = TRUE; } else if (val == ANSI_ITALICS_OFF) { gui->ta_state.italics = FALSE; } else if (val == ANSI_SET_REVERSE) { gui->ta_state.reverse = TRUE; } else if (val == ANSI_REVERSE_OFF) { gui->ta_state.reverse = FALSE; } else if (val == ANSI_SET_HIDDEN) { gui->ta_state.hidden = TRUE; } else if (val == ANSI_HIDDEN_OFF) { gui->ta_state.hidden = FALSE; } else if (val == XTERM256_SET_FORE || val == XTERM256_SET_BACK) { xterm256_state = -val; } /* else ignored */ ++curr_seq; } g_strfreev(sequences); gui->ansi_parse.ansiseq_pos = 0; } static void reset_ansi_state(TAState *state) { /* Resets state to defaults, when ESC[0m or ESC[m is seen. */ state->fg_color = state->bg_color = ANSI_DEFAULT_COLOR_IDX; state->fg_base_idx = state->bg_base_idx = ANSI_NORMAL_BASE_IDX; state->foreground_color_tag = state->background_color_tag = NULL; state->underline = PANGO_UNDERLINE_NONE; state->strike = FALSE; state->italics = FALSE; state->reverse = FALSE; state->hidden = FALSE; } static gchar * convert_vt100linedraw_string(WorldGUI *gui, const guchar *text, gsize len) { GString *result; guint i; // The longest sequences are three bytes; result = g_string_sized_new(len * 3 + 1); worldgui_determine_supported_chars(gui); for (i = 0; i < len; ++i) { if (text[i] < '_' || text[i] > '~') { g_string_append_c(result, text[i]); } else { switch (text[i]) { case '_': /* A blank */ g_string_append_c(result, ' '); break; /* Geometric Shapes */ case '`': g_string_append(result, gui->ta.sup_geom_shapes ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; /* Block elements */ case 'a': g_string_append(result, gui->ta.sup_block ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; /* Control Pictures */ case 'b': case 'c': case 'd': case 'e': case 'h': case 'i': g_string_append(result, gui->ta.sup_control ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; /* Latin-1 Supplement */ case 'f': case 'g': case '}': case '~': g_string_append(result, gui->ta.sup_l1_supplement ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; /* Box drawing */ case 'j': case 'k': case 'l': case 'm': case 'n': case 'q': case 't': case 'u': case 'v': case 'w': case 'x': g_string_append(result, gui->ta.sup_box_drawing ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; /* Miscellaneous Technical */ case 'o': case 'p': case 'r': case 's': g_string_append(result, gui->ta.sup_misc_tech ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; /* Mathematical Operators */ case 'y': case 'z': case '|': g_string_append(result, gui->ta.sup_math ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; /* Greek and Coptic */ case '{': g_string_append(result, gui->ta.sup_greek ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; } } } gchar *converted_string = result->str; g_string_free(result, FALSE); return converted_string; } static GtkTextTag * get_tag_for_xterm256_color(WorldGUI *gui, gint x256idx, gint code_used) { guint8 r, g, b; if (x256idx <= 7) { /* Normal ANSI colors */ if (code_used == XTERM256_SET_FORE) { return gui->ta.ansi_fore_tags[x256idx]; } else if (code_used == XTERM256_SET_BACK) { return gui->ta.ansi_back_tags[x256idx]; } } if (x256idx <= 15) { /* Highlighted ANSI colors */ if (code_used == XTERM256_SET_FORE) { return gui->ta.ansi_fore_tags[x256idx - ANSI_N_COLORS + ANSI_BOLD_BASE_IDX]; } else if (code_used == XTERM256_SET_BACK) { return gui->ta.ansi_back_tags[x256idx - ANSI_N_COLORS + ANSI_BOLD_BASE_IDX]; } } if (x256idx <= 231) { /* 6x6x6 rgb color cube */ guint8 ri, gi, bi; x256idx -= 16; ri = x256idx / 36; x256idx %= 36; gi = x256idx / 6; x256idx %= 6; bi = x256idx; r = xterm256color[ri]; g = xterm256color[gi]; b = xterm256color[bi]; } else { x256idx -= 232; r = xterm256gray[x256idx]; g = b = r; } return get_tag_for_color(gui, r, g, b, code_used == XTERM256_SET_BACK); } static GtkTextTag * get_tag_for_color(WorldGUI *gui, guint8 r, guint8 g, guint8 b, gboolean is_back) { gint rgb; GtkTextTag *tag; GHashTable *hash; GdkRGBA color; hash = is_back ? gui->ta.rgb_back_tags : gui->ta.rgb_fore_tags; rgb = (r << 16) | (g << 8) | b; tag = g_hash_table_lookup(hash, GINT_TO_POINTER(rgb)); if (tag) { return tag; } /* Create if it does not exist */ color.alpha = 1.0; color.red = r / 255.0; color.green = g / 255.0; color.blue = b / 255.0; if (!is_back) { tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "foreground-rgba", &color, NULL); } else { tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "background-rgba", &color, NULL); } gtk_text_tag_set_priority(tag, 0); g_hash_table_insert(hash, GINT_TO_POINTER(rgb), tag); return tag; } kildclient-3.0.0/src/aliases.c0000644000175000017500000001470412374460043013142 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" #include "ansi.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ char * substitute_aliases(World *world, const char *cmd) { GSList *aliasptr; Alias *alias; char *result; int i; if (world->disable_aliases) { return NULL; } GRAB_PERL(world); aliasptr = world->aliases; i = 0; while (aliasptr) { alias = (Alias *) aliasptr->data; if (alias->enabled && (result = perl_substitute(cmd, alias->pattern_re, alias->substitution, alias->perl_eval, FALSE))) { if (debug_matches) { fprintf(stderr, "**Alias %d '%s' matched for world %s\n" " Command: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Eval as Perl: %d\n" " Result: %s\n", i, alias->name ? alias->name : "", world->name, cmd, alias->pattern, alias->substitution, alias->perl_eval, result); } RELEASE_PERL(world); return result; } aliasptr = aliasptr->next; ++i; } RELEASE_PERL(world); return NULL; } void remove_alias(World *world, GSList *aliasitem) { Alias *alias = (Alias *) aliasitem->data; /* Necessary when free_alias dereferences alias->pattern_re */ if (world->perl_interpreter) { GRAB_PERL(world); } we_alias_delete_alias(world, alias); world->aliases = g_slist_remove_link(world->aliases, aliasitem); if (!alias->owner_plugin) { --world->alias_pos; } free_alias(alias, NULL); g_slist_free(aliasitem); if (world->perl_interpreter) { RELEASE_PERL(world); } } gboolean move_alias(World *world, gint old_pos, gint new_pos) { GSList *aliasitem; gpointer alias; aliasitem = g_slist_nth(world->aliases, old_pos); if (!aliasitem) { return FALSE; } alias = aliasitem->data; world->aliases = g_slist_delete_link(world->aliases, aliasitem); world->aliases = g_slist_insert(world->aliases, alias, new_pos); we_alias_delete_alias(world, alias); we_alias_insert_alias(world, alias, new_pos); return TRUE; } void free_alias(Alias *alias, gpointer data) { g_free(alias->name); g_free(alias->pattern); g_free(alias->substitution); SvREFCNT_dec(alias->pattern_re); g_free(alias); } void list_aliases(World *world, Plugin *plugin) { guint i; guint total_width; guint field_width; GSList *aliasptr; Alias *alias; /* The rows argument is not used. */ ansitextview_get_size(world->gui, &field_width, &total_width); /* If the screen is really narrow, we can do nothing. */ if (total_width < 30) { total_width = 30; } field_width = (total_width - 18)/2; ansitextview_append_stringf(world->gui, _("Num Eval Ena IgC %-*.*s %-*.*s\n"), field_width, field_width, _("Pattern"), field_width, field_width, _("Substitution")); ansitextview_append_string(world->gui, "--- ---- --- --- "); for (i = 0; i < field_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, " "); for (i = 0; i < field_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, "\n"); i = 0; aliasptr = world->aliases; while (aliasptr) { alias = (Alias *) aliasptr->data; if (alias->owner_plugin == plugin) { ansitextview_append_stringf(world->gui, "%3d %-4.4s %-3.3s %-3.3s %-*.*s %-*.*s\n", i, alias->perl_eval ? _("y") : _("n"), alias->enabled ? _("y") : _("n"), alias->ignore_case ? _("y") : _("n"), field_width, field_width, alias->pattern, field_width, field_width, alias->substitution); } ++i; aliasptr = aliasptr->next; } } void alias_precompute_res(World *world) { GSList *aliasptr = world->aliases; Alias *alias; GRAB_PERL(world); while (aliasptr) { alias = (Alias *) aliasptr->data; /* Aliases loaded from a script file already have the precomputed RE */ if (!alias->pattern_re) { alias->pattern_re = precompute_re(alias->pattern, alias->ignore_case); } aliasptr = aliasptr->next; } RELEASE_PERL(world); } void save_alias(GString *str, Alias *alias) { g_string_append(str, " name) { kc_g_string_append_escaped(str, "name=\"%s\" ", alias->name); } g_string_append_printf(str, "perleval=\"%d\" enabled=\"%d\" ignorecase=\"%d\">\n", alias->perl_eval, alias->enabled, alias->ignore_case); kc_g_string_append_escaped(str, " %s\n" " %s\n", alias->pattern, alias->substitution); g_string_append(str, " \n"); } kildclient-3.0.0/src/macros.c0000644000175000017500000001160212374460043012777 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" #ifdef HAVE_CONFIG_H # include #endif /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ gboolean check_macros(World *world, guint keyval, GdkModifierType modifiers) { GSList *macroptr; Macro *macro; if (world->disable_macros) { return FALSE; } macroptr = world->macros; while (macroptr) { macro = (Macro *) macroptr->data; if (macro->enabled && macro->keyval == keyval && macro->modifiers == (modifiers & GDK_MODIFIER_MASK)) { parse_commands(world, macro->action); return TRUE; } macroptr = macroptr->next; } return FALSE; } void remove_macro(World *world, GSList *macroitem) { Macro *macro = (Macro *) macroitem->data; we_macro_delete_macro(world, macro); world->macros = g_slist_remove_link(world->macros, macroitem); if (!macro->owner_plugin) { --world->macro_pos; } free_macro(macro, NULL); g_slist_free(macroitem); } gboolean move_macro(World *world, gint old_pos, gint new_pos) { GSList *macroitem; gpointer macro; macroitem = g_slist_nth(world->macros, old_pos); if (!macroitem) { return FALSE; } macro = macroitem->data; world->macros = g_slist_delete_link(world->macros, macroitem); world->macros = g_slist_insert(world->macros, macro, new_pos); we_macro_delete_macro(world, macro); we_macro_insert_macro(world, macro, new_pos); return TRUE; } void free_macro(Macro *macro, gpointer data) { g_free(macro->name); g_free(macro->action); g_free(macro); } void list_macros(World *world, Plugin *plugin) { guint i; guint total_width; guint field1_width; guint field2_width; GSList *macroptr; Macro *macro; char *keycodestr; /* The rows argument is not used. */ ansitextview_get_size(world->gui, &field1_width, &total_width); /* If the screen is really narrow, we can do nothing. */ if (total_width < 15) { total_width = 15; } field1_width = (total_width - 9) * .3; field2_width = (total_width - 9) * .7; ansitextview_append_stringf(world->gui, _("Num Ena %-*.*s %-*.*s\n"), field1_width, field1_width, _("Key"), field2_width, field2_width, _("Action")); ansitextview_append_string(world->gui, "--- --- "); for (i = 0; i < field1_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, " "); for (i = 0; i < field2_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, "\n"); i = 0; macroptr = world->macros; while (macroptr) { macro = (Macro *) macroptr->data; if (macro->owner_plugin == plugin) { keycodestr = gtk_accelerator_name(macro->keyval, macro->modifiers); ansitextview_append_stringf(world->gui, "%3d %-3.3s %-*.*s %-*.*s\n", i, macro->enabled ? _("y") : _("n"), field1_width, field1_width, keycodestr, field2_width, field2_width, macro->action); g_free(keycodestr); } ++i; macroptr = macroptr->next; } } void save_macro(GString *str, Macro *macro) { char *keycodestr; keycodestr = gtk_accelerator_name(macro->keyval, macro->modifiers); g_string_append(str, " name) { kc_g_string_append_escaped(str, "name=\"%s\" ", macro->name); } g_string_append_printf(str, "enabled=\"%d\">\n", macro->enabled); kc_g_string_append_escaped(str, " %s\n" " %s\n" " \n", keycodestr, macro->action); g_free(keycodestr); } kildclient-3.0.0/src/permanentvariables.c0000644000175000017500000001077212374460043015404 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include /* Perl includes */ #include #include #include #include "kildclient.h" #include "perlscript.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ void load_permanent_variables(World *world) { gchar *variables_file; if (world->file) { variables_file = g_strdup_printf("%s.var", world->file); perl_script_import_file(variables_file); g_free(variables_file); } } void save_permanent_variables(World *world) { gchar *variables_file; GSList *iter; gchar *varname; gchar *command; SV *retval; GString *file_contents; GError *error = NULL; if (!world->file) { return; } variables_file = g_strdup_printf("%s.var", world->file); if (!world->permanent_variables) { /* We don't care if it doesn't exist */ unlink(variables_file); g_free(variables_file); return; } file_contents = g_string_sized_new(512); GRAB_PERL(world); iter = world->permanent_variables; while (iter) { varname = (char *) iter->data; /* Not really sure why, but turning off the utf8 flag actually makes the dumping output UTF-8 strings, which later are read correctly. */ if (varname[0] == '$') { command = g_strdup_printf("Encode::_utf8_off(%s);" "$__serialized = Data::Dumper->Dump([%s], ['%s']);" "Encode::_utf8_on(%s)", varname, varname, varname+1, varname); } else { command = g_strdup_printf("map { Encode::_utf8_off($_) } %s;" "$__serialized = Data::Dumper->Dump([\\%s], ['*%s']);" "map { Encode::_utf8_on($_) } %s;", varname, varname, varname+1, varname); } eval_pv(command, TRUE); retval = get_sv("__serialized", FALSE); g_string_append(file_contents, SvPV_nolen(retval)); g_free(command); iter = iter->next; } RELEASE_PERL(world); if (!g_file_set_contents(variables_file, file_contents->str, file_contents->len, &error)) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not open file '%s': %s\n" "Variables were not saved."), variables_file, error->message); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } g_free(variables_file); g_string_free(file_contents, TRUE); } gboolean move_var(World *world, gint old_pos, gint new_pos) { GSList *varitem; gpointer var; varitem = g_slist_nth(world->permanent_variables, old_pos); if (!varitem) { return FALSE; } var = varitem->data; world->permanent_variables = g_slist_delete_link(world->permanent_variables, varitem); world->permanent_variables = g_slist_insert(world->permanent_variables, var, new_pos); we_var_delete_var(world, var); we_var_insert_var(world, var, new_pos); return TRUE; } void free_permanent_variable(gchar *variable, gpointer data) { g_free(variable); } kildclient-3.0.0/src/triggers.c0000644000175000017500000002541412374460043013347 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "ansi.h" #include "perlscript.h" /*********************************************** * Function prototypes - Test trigger function * ***********************************************/ static GtkWidget *create_test_triggers_dialog(GtkWindow *parent, World *world); /* XML UI signals */ G_MODULE_EXPORT void test_triggers_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void test_trigger_send_cb(GtkWidget *widget, gpointer data); Trigger * new_trigger(void) { Trigger *trigger; trigger = g_new0(Trigger, 1); trigger->high_fg_color = -1; trigger->high_bg_color = -1; trigger->high_italic = -1; trigger->high_strike = -1; trigger->high_underline = -1; return trigger; } void remove_trigger(World *world, GSList *triggeritem) { Trigger *trigger = (Trigger *) triggeritem->data; /* Necessary when free_trigger dereferences trigger->pattern_re */ if (world->perl_interpreter) { GRAB_PERL(world); } we_trigger_delete_trigger(world, trigger); world->triggers = g_slist_remove_link(world->triggers, triggeritem); if (!trigger->owner_plugin) { --world->trigger_pos; } free_trigger(trigger, NULL); g_slist_free(triggeritem); if (world->perl_interpreter) { RELEASE_PERL(world); } } gboolean move_trigger(World *world, gint old_pos, gint new_pos) { GSList *triggeritem; gpointer trigger; triggeritem = g_slist_nth(world->triggers, old_pos); if (!triggeritem) { return FALSE; } trigger = triggeritem->data; world->triggers = g_slist_delete_link(world->triggers, triggeritem); world->triggers = g_slist_insert(world->triggers, trigger, new_pos); we_trigger_delete_trigger(world, trigger); we_trigger_insert_trigger(world, trigger, new_pos); return TRUE; } void free_trigger(Trigger *trigger, gpointer data) { g_free(trigger->name); g_free(trigger->pattern); g_free(trigger->action); SvREFCNT_dec(trigger->pattern_re); g_free(trigger); } void list_triggers(World *world, Plugin *plugin) { guint i; guint total_width; guint field_width; GSList *trigptr; Trigger *trigger; /* The rows argument is not used. */ ansitextview_get_size(world->gui, &field_width, &total_width); /* If the screen is really narrow, we can do nothing. */ if (total_width < 49) { total_width = 49; } field_width = (total_width - 34)/2; ansitextview_append_stringf(world->gui, _("Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n"), field_width, field_width, _("Pattern"), field_width, field_width, _("Action")); ansitextview_append_string(world->gui, "--- --- --- --- --- --- --- --- "); for (i = 0; i < field_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, " "); for (i = 0; i < field_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, "\n"); i = 0; trigptr = world->triggers; while (trigptr) { trigger = (Trigger *) trigptr->data; if (trigger->owner_plugin == plugin) { ansitextview_append_stringf(world->gui, "%3d %-3.3s %-3.3s %-3.3s %-3.3s %-3.3s %-3.3s %-3.3s %-*.*s %-*.*s\n", i, trigger->gag_output ? _("y") : _("n"), trigger->gag_log ? _("y") : _("n"), trigger->enabled ? _("y") : _("n"), trigger->keepexecuting ? _("y") : _("n"), trigger->rewriter ? _("y") : _("n"), trigger->ignore_case ? _("y") : _("n"), trigger->highlight ? _("y") : _("n"), field_width, field_width, trigger->pattern, field_width, field_width, trigger->action ? trigger->action : ""); } ++i; trigptr = trigptr->next; } } void trigger_precompute_res(World *world) { GSList *triggerptr = world->triggers; Trigger *trigger; GRAB_PERL(world); while (triggerptr) { trigger = (Trigger *) triggerptr->data; /* Plugins loaded from a script file already have the precomputed RE */ if (!trigger->pattern_re) { trigger->pattern_re = precompute_re(trigger->pattern, trigger->ignore_case); } triggerptr = triggerptr->next; } /* Precompute a special pattern to substitute $1, $2, etc in trigger actions. */ if (!world->trigger_action_re) { world->trigger_action_re = precompute_re("\\$([0-9]+)", FALSE); } RELEASE_PERL(world); } void save_trigger(GString *str, Trigger *trigger) { g_string_append(str, " name) { kc_g_string_append_escaped(str, "name=\"%s\" ", trigger->name); } g_string_append_printf(str, "enabled=\"%d\" keepexecuting=\"%d\" rewriter=\"%d\" ignorecase=\"%d\"%s%s>\n", trigger->enabled, trigger->keepexecuting, trigger->rewriter, trigger->ignore_case, trigger->gag_output ? " gag=\"1\"" : "", trigger->gag_log ? " gaglog=\"1\"": ""); kc_g_string_append_escaped(str, " %s\n", trigger->pattern); if (trigger->action) { kc_g_string_append_escaped(str, " %s\n", trigger->action); } g_string_append_printf(str, " \n", trigger->highlight, trigger->high_target, trigger->high_fg_color, trigger->high_bg_color, trigger->high_italic, trigger->high_strike, trigger->high_underline); g_string_append(str, " \n"); } /* * Test trigger function. */ void test_triggers_cb(GtkMenuItem *widget, gpointer data) { if (currentWorld) { open_test_triggers_dialog(currentWorld); } } void open_test_triggers_dialog(World *world) { if (!world->dlgTestTriggers) { world->dlgTestTriggers = create_test_triggers_dialog(GTK_WINDOW(wndMain), world); } gtk_widget_show_all(world->dlgTestTriggers); gtk_window_present(GTK_WINDOW(world->dlgTestTriggers)); } static GtkWidget * create_test_triggers_dialog(GtkWindow *parent, World *world) { GError *error = NULL; GObject *dlg; /* Create the dialog */ if (!world->ui_builder) { world->ui_builder = gtk_builder_new(); } if (!gtk_builder_add_from_file(world->ui_builder, get_kildclient_installed_file("dlgTestTriggers.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } dlg = gtk_builder_get_object(world->ui_builder, "dlgTestTriggers"); /* Signals */ gtk_builder_connect_signals(world->ui_builder, world); return GTK_WIDGET(dlg); } void test_trigger_send_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkEntry *txtLine; GtkLabel *lblMatches; GtkTextView *txtCommands; GtkEntry *txtOutput; GtkLabel *lblGagLog; GtkTextBuffer *bufCommands; gboolean disable_triggers; gchar *line; gchar *stripped; gint n_matches; GSList *trigger_response = NULL; gsize output_len; gboolean gag_output = FALSE; gboolean gag_log = FALSE; gchar *n_matches_str; GSList *cmdptr; GtkTextIter iter; txtLine = GTK_ENTRY(gtk_builder_get_object(world->ui_builder, "txtLine")); lblMatches = GTK_LABEL(gtk_builder_get_object(world->ui_builder, "lblMatches")); txtOutput = GTK_ENTRY(gtk_builder_get_object(world->ui_builder, "txtOutput")); txtCommands = GTK_TEXT_VIEW(gtk_builder_get_object(world->ui_builder, "txtCommands")); lblGagLog = GTK_LABEL(gtk_builder_get_object(world->ui_builder, "lblGagLog")); bufCommands = gtk_text_view_get_buffer(txtCommands); line = g_strdup(gtk_entry_get_text(txtLine)); stripped = strip_ansi(line, strlen(line)); /* We need the triggers to be tried. */ disable_triggers = world->disable_triggers; world->disable_triggers = FALSE; match_triggers(world, &stripped, &line, &output_len, &gag_output, &gag_log, &n_matches, &trigger_response); world->disable_triggers = disable_triggers; /* Show output */ n_matches_str = g_strdup_printf("%d", n_matches); gtk_label_set_text(lblMatches, n_matches_str); g_free(n_matches_str); gtk_text_buffer_set_text(bufCommands, "", 0); gtk_text_buffer_get_end_iter(bufCommands, &iter); cmdptr = trigger_response; while (cmdptr) { gtk_text_buffer_insert(bufCommands, &iter, (gchar *) cmdptr->data, -1); gtk_text_buffer_insert(bufCommands, &iter, "\n", 1); cmdptr = cmdptr->next; } g_slist_foreach(trigger_response, (GFunc) g_free, NULL); g_slist_free(trigger_response); if (!gag_output) { gtk_entry_set_text(txtOutput, (gchar *) line); } else { gtk_entry_set_text(txtOutput, ""); } gtk_label_set_text(lblGagLog, gag_log ? _("No") : _("Yes")); g_free(line); g_free(stripped); } kildclient-3.0.0/src/cmdhistory.c0000644000175000017500000005646312374460043013716 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include #include "kildclient.h" #include "perlscript.h" /************** * Data types * **************/ struct CmdHistorySendData_s { World *world; gint lines_at_a_time; GSList *list; GSList *list_iter; }; typedef struct CmdHistorySendData_s CmdHistorySendData; /*********************** * Function prototypes * ***********************/ static GtkWidget *create_cmd_history_dialog(GtkWindow *parent, World *world); static gboolean cmdhistory_send_timer_cb(gpointer data); static void save_tentative_command(World *world); /* XML UI signals */ G_MODULE_EXPORT void menu_command_history_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void cmdhistory_recall_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void cmdhistory_start_send_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void cmdhistory_find_cb(GtkWidget *widget, gpointer data); void prev_or_next_command(World *world, gboolean next) { gchar *command; SimoComboBox *cmb = world->gui->cmbEntry; save_tentative_command(world); /* Update position */ if (world->cmd_list_size) { if (!next) { if (!gtk_tree_model_iter_next(world->cmd_list, &world->current_cmd)) { gtk_tree_model_get_iter_first(world->cmd_list, &world->current_cmd); } } else { GtkTreePath *path; path = gtk_tree_model_get_path(world->cmd_list, &world->current_cmd); if (gtk_tree_path_prev(path)) { gtk_tree_model_get_iter(world->cmd_list, &world->current_cmd, path); } else { gtk_tree_model_iter_nth_child(world->cmd_list, &world->current_cmd, NULL, world->cmd_list_size); } gtk_tree_path_free(path); } /* Fetch new command */ command = cmdhistory_get_command(world->cmd_list, &world->current_cmd); simo_combo_box_set_text(cmb, command); g_free(command); } simo_combo_box_select_region(cmb, 0, -1); world->cmd_position_changed = FALSE; } void find_prev_or_next_command(World *world, gboolean next) { SimoComboBox *cmb = world->gui->cmbEntry; gchar *command; GtkTreeIter start_iter; gboolean found = FALSE; if (!world->cmd_list_size) { return; } if (!world->saved_command_find_search) { world->saved_command_find_search = g_strdup(simo_combo_box_get_text(cmb)); } save_tentative_command(world); start_iter = world->current_cmd; while (1) { if (!next) { if (!gtk_tree_model_iter_next(world->cmd_list, &world->current_cmd)) { world->current_cmd = start_iter; break; } } else { GtkTreePath *path; path = gtk_tree_model_get_path(world->cmd_list, &world->current_cmd); if (gtk_tree_path_prev(path)) { gtk_tree_model_get_iter(world->cmd_list, &world->current_cmd, path); } else { gtk_tree_path_free(path); break; } gtk_tree_path_free(path); } command = cmdhistory_get_command(world->cmd_list, &world->current_cmd); if (g_str_has_prefix(command, world->saved_command_find_search)) { found = TRUE; break; } g_free(command); } if (found) { simo_combo_box_set_text(cmb, command); g_free(command); simo_combo_box_select_region(cmb, 0, -1); world->cmd_position_changed = FALSE; } else { world->current_cmd = start_iter; } } void menu_command_history_cb(GtkMenuItem *widget, gpointer data) { if (!currentWorld) { return; } if (!currentWorld->dlgCmdHistory) { currentWorld->dlgCmdHistory = create_cmd_history_dialog(GTK_WINDOW(wndMain), currentWorld); } gtk_widget_show_all(currentWorld->dlgCmdHistory); gtk_window_present(GTK_WINDOW(currentWorld->dlgCmdHistory)); } static GtkWidget * create_cmd_history_dialog(GtkWindow *parent, World *world) { gchar *objects[] = { "dlgCmdHistory", "adjustment1", "adjustment2", NULL }; GError *error = NULL; GObject *dlg; GtkTreeView *viewCommands; GtkTreeSelection *selection; GtkCellRenderer *renderer; GObject *btnSendClose; GObject *btnRecallClose; GObject *btnFind; GtkSpinButton *spnDelay; GtkSpinButton *spnNCommands; /* Create the dialog */ if (!world->ui_builder) { world->ui_builder = gtk_builder_new(); } if (!gtk_builder_add_objects_from_file(world->ui_builder, get_kildclient_installed_file("dlgCmdHistory.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } dlg = gtk_builder_get_object(world->ui_builder, "dlgCmdHistory"); /* Configure tree view */ viewCommands = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "viewCommands")); gtk_tree_view_set_model(viewCommands, world->cmd_list); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_data_func(viewCommands, 0, NULL, renderer, (GtkTreeCellDataFunc) completion_cell_data_function, NULL, NULL); selection = gtk_tree_view_get_selection(viewCommands); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); /* This information is used in the callbacks */ btnSendClose = gtk_builder_get_object(world->ui_builder, "btnSendClose"); g_object_set_data(btnSendClose, "close", GINT_TO_POINTER(1)); btnRecallClose = gtk_builder_get_object(world->ui_builder, "btnRecallClose"); g_object_set_data(btnRecallClose, "close", GINT_TO_POINTER(1)); btnFind = gtk_builder_get_object(world->ui_builder, "btnFind"); g_object_set_data(btnFind, "startsearch", GINT_TO_POINTER(1)); /* Default values */ spnDelay = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnCHDelay")); gtk_spin_button_set_value(spnDelay, globalPrefs.multi_cmd_delay); spnNCommands = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnNCommands")); gtk_spin_button_set_value(spnNCommands, globalPrefs.multi_cmd_group_size); /* Signals */ gtk_builder_connect_signals(world->ui_builder, world); return GTK_WIDGET(dlg); } void cmdhistory_recall_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkTreeView *viewCommands; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected_rows; gint n_selected; gchar *command; viewCommands = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "viewCommands")); selection = gtk_tree_view_get_selection(viewCommands); n_selected = gtk_tree_selection_count_selected_rows(selection); if (n_selected == 0) { GtkWidget *msgdlg; msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgCmdHistory), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("No command selected.")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); return; } else if (n_selected > 1) { GtkWidget *msgdlg; msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgCmdHistory), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("More than one command selected.")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); return; } if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "close"))) { gtk_widget_hide(world->dlgCmdHistory); } save_tentative_command(world); selected_rows = gtk_tree_selection_get_selected_rows(selection, &model); gtk_tree_model_get_iter(model, &world->current_cmd, (GtkTreePath *) selected_rows->data); command = cmdhistory_get_command(world->cmd_list, &world->current_cmd); simo_combo_box_set_text(world->gui->cmbEntry, command); g_free(command); g_list_foreach(selected_rows, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected_rows); } void cmdhistory_start_send_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkTreeView *viewCommands; GtkTreeModel *model; GtkTreeSelection *selection; GtkSpinButton *spnDelay; GtkSpinButton *spnNCommands; GList *selected_rows; GList *list_iter; gdouble delay; if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "close"))) { gtk_widget_hide(world->dlgCmdHistory); } viewCommands = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "viewCommands")); selection = gtk_tree_view_get_selection(viewCommands); selected_rows = gtk_tree_selection_get_selected_rows(selection, &model); list_iter = selected_rows; if (!list_iter) { return; } spnDelay = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnCHDelay")); delay = gtk_spin_button_get_value(spnDelay); spnNCommands = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnNCommands")); if (delay) { gchar *command; GtkTreeIter iter; GSList *cmd_list = NULL; CmdHistorySendData *data; /* Create list of commands */ while (list_iter) { gtk_tree_model_get_iter(model, &iter, (GtkTreePath *) list_iter->data); command = cmdhistory_get_command(model, &iter); cmd_list = g_slist_append(cmd_list, command); list_iter = list_iter->next; } data = g_new(CmdHistorySendData, 1); data->world = world; data->list = cmd_list; data->list_iter = cmd_list; data->lines_at_a_time = gtk_spin_button_get_value_as_int(spnNCommands); /* Send first command immediately */ if (cmdhistory_send_timer_cb(data)) { /* Start timeout function to send the rest (if necessary) */ if (cmd_list) { g_timeout_add_full(G_PRIORITY_HIGH, delay * 1000, cmdhistory_send_timer_cb, data, NULL); } } } else { /* Send everything as fast as possible */ while (list_iter) { GtkTreeIter iter; gchar *command; gtk_tree_model_get_iter(model, &iter, (GtkTreePath *) list_iter->data); command = cmdhistory_get_command(model, &iter); parse_commands(world, command); g_free(command); list_iter = list_iter->next; } } g_list_foreach(selected_rows, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected_rows); } static gboolean cmdhistory_send_timer_cb(gpointer data) { CmdHistorySendData *cmd_data = (CmdHistorySendData *) data; gint n; n = cmd_data->lines_at_a_time; while (n-- && cmd_data->list_iter) { gchar *command = (gchar *) cmd_data->list_iter->data; parse_commands(cmd_data->world, command); cmd_data->list_iter = cmd_data->list_iter->next; } /* No more commands to send */ if (!cmd_data->list_iter) { g_slist_foreach(cmd_data->list, (GFunc) g_free, NULL); g_slist_free(cmd_data->list); g_free(cmd_data); return FALSE; } return TRUE; } void cmdhistory_find_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkTreeView *viewCommands; GtkTreeModel *model; GtkTreeSelection *selection; gboolean found; gboolean error; GtkTreePath *search_path = NULL; viewCommands = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "viewCommands")); model = gtk_tree_view_get_model(viewCommands); selection = gtk_tree_view_get_selection(viewCommands); /* Start search if asked */ if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "startsearch"))) { GtkEntry *txtSearchText; GtkToggleButton *radUpwards; if (!world->dlgCmdHistoryFind) { gchar *objects[] = { "dlgFind", NULL }; GError *gerror = NULL; if (!gtk_builder_add_objects_from_file(world->ui_builder, get_kildclient_installed_file("dlgCmdHistory.ui"), objects, &gerror)) { g_warning(_("Error loading UI from XML file: %s"), gerror->message); g_error_free(gerror); return; } world->dlgCmdHistoryFind = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "dlgFind")); } txtSearchText = GTK_ENTRY(gtk_builder_get_object(world->ui_builder, "txtSearchText")); radUpwards = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radUpwards")); gtk_dialog_set_default_response(GTK_DIALOG(world->dlgCmdHistoryFind), GTK_RESPONSE_OK); while (1) { if (gtk_dialog_run(GTK_DIALOG(world->dlgCmdHistoryFind)) == GTK_RESPONSE_OK) { const gchar *search_text; search_text = gtk_entry_get_text(txtSearchText); if (strcmp(search_text, "") == 0) { GtkWidget *msgdlg; msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgCmdHistory), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Enter some text to search for.")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); continue; } world->cmdfind_upwards = gtk_toggle_button_get_active(radUpwards); g_free(world->cmdfind_string); world->cmdfind_string = g_strdup(search_text); break; } else { /* Clear dialog */ gtk_entry_set_text(txtSearchText, ""); gtk_widget_hide(world->dlgCmdHistoryFind); return; } } /* Clear dialog */ gtk_entry_set_text(txtSearchText, ""); gtk_widget_hide(world->dlgCmdHistoryFind); if (world->cmdfind_row) { gtk_tree_row_reference_free(world->cmdfind_row); } } else { /* Verify if there was a search */ if (!world->cmdfind_string) { GtkWidget *msgdlg; msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgCmdHistory), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Use the Find button to find the first result.")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); return; } search_path = gtk_tree_row_reference_get_path(world->cmdfind_row); } if (!search_path) { if (world->cmdfind_upwards) { search_path = gtk_tree_path_new_from_indices(world->cmd_list_size, -1); } else { search_path = gtk_tree_path_new_first(); } world->cmdfind_row = gtk_tree_row_reference_new(model, search_path); } error = FALSE; found = FALSE; while (!found) { GtkTreeIter iter; gchar *command; gtk_tree_model_get_iter(model, &iter, search_path); command = cmdhistory_get_command(model, &iter); if (strstr(command, world->cmdfind_string)) { /* Found */ gtk_tree_selection_unselect_all(selection); gtk_tree_selection_select_iter(selection, &iter); gtk_tree_view_scroll_to_cell(viewCommands, search_path, NULL, FALSE, 0, 0); found = TRUE; } g_free(command); /* Move to next/previous row */ if (world->cmdfind_upwards) { if (!gtk_tree_path_prev(search_path)) { error = TRUE; } } else { if (!gtk_tree_model_iter_next(model, &iter)) { error = TRUE; } else { gtk_tree_path_next(search_path); } } if (error && !found) { GtkWidget *msgdlg; msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgCmdHistory), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, _("Command not found.")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); break; } } gtk_tree_row_reference_free(world->cmdfind_row); world->cmdfind_row = gtk_tree_row_reference_new(model, search_path); } gchar * cmdhistory_get_command(GtkTreeModel *model, GtkTreeIter *iter) { gchar *command; gtk_tree_model_get(model, iter, CMDLIST_COL_TENTATIVE, &command, -1); if (!command) { gtk_tree_model_get(model, iter, CMDLIST_COL_COMMAND, &command, -1); } return command; } void add_recent_command(World *world, const gchar *command) { GtkTreeIter previous; GtkTreeIter most_recent; gboolean go_on; gboolean is_repeated = FALSE; gchar *previous_command = NULL; if (!world->repeat_commands || world->cmd_has_been_edited || world->cmd_just_selected_from_combo) { gtk_tree_model_get_iter_first(world->cmd_list, &most_recent); gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &world->current_cmd, CMDLIST_COL_TENTATIVE, NULL, -1); /* Try to locate the same command in the history */ go_on = gtk_tree_model_iter_nth_child(world->cmd_list, &previous, NULL, 1); while (go_on) { previous_command = cmdhistory_get_command(world->cmd_list, &previous); if (previous_command && strcmp(command, previous_command) == 0) { is_repeated = TRUE; g_free(previous_command); break; } go_on = gtk_tree_model_iter_next(world->cmd_list, &previous); } if (is_repeated) { /* A duplicate command */ /* It is not added again, but the old command moved into position */ gtk_list_store_move_after(GTK_LIST_STORE(world->cmd_list), &previous, &most_recent); /* most_recent might have become invalid */ gtk_tree_model_get_iter_first(world->cmd_list, &most_recent); if (world->repeat_commands) { /* In this case, a duplicate entry has already been added, so let's remove it. */ gtk_list_store_remove(GTK_LIST_STORE(world->cmd_list), &most_recent); --world->cmd_list_size; world->cmd_has_been_edited = FALSE; world->gui->execute_changed_signal = TRUE; world->cmd_just_selected_from_combo = FALSE; } else { gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &most_recent, CMDLIST_COL_TENTATIVE, "", -1); } } else { /* A new command */ gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &most_recent, CMDLIST_COL_COMMAND, command, CMDLIST_COL_TENTATIVE, NULL, -1); if (!world->repeat_commands) { insert_recent_command(world, ""); } else { world->cmd_has_been_edited = FALSE; world->cmd_just_selected_from_combo = FALSE; world->gui->execute_changed_signal = TRUE; } } } /* Set the pointer to point to the new command */ gtk_tree_model_get_iter_first(world->cmd_list, &world->current_cmd); } void insert_recent_command(World *world, const gchar *command) { GtkTreeIter new; gtk_list_store_prepend(GTK_LIST_STORE(world->cmd_list), &new); gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &new, CMDLIST_COL_COMMAND, NULL, CMDLIST_COL_TENTATIVE, command, -1); ++world->cmd_list_size; /* See if the maximum list size has been reached */ if (world->cmd_list_size >= world->commands_to_save) { GtkTreeIter last_iter; if (gtk_tree_model_iter_nth_child(world->cmd_list, &last_iter, NULL, world->commands_to_save + 1)) { while (gtk_list_store_remove(GTK_LIST_STORE(world->cmd_list), &last_iter)) { --world->cmd_list_size; } /* This is for the last removed one --- when the command returns false, and the body of the loop is not called. */ --world->cmd_list_size; } } } static void save_tentative_command(World *world) { if (world->repeat_commands && !world->cmd_has_been_edited) { insert_recent_command(world, ""); world->gui->execute_changed_signal = FALSE; world->cmd_has_been_edited = TRUE; world->cmd_just_selected_from_combo = FALSE; } else { /* Save possibly modified text as tentative command */ gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &world->current_cmd, CMDLIST_COL_TENTATIVE, simo_combo_box_get_text(world->gui->cmbEntry), -1); } } kildclient-3.0.0/src/telnet.c0000644000175000017500000003301012354344664013013 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include "kildclient.h" #include "perlscript.h" #include "net.h" /************************* * File global variables * *************************/ #define MAX_US 250000 /*********************** * Function prototypes * ***********************/ static void append_to_server_data_buffer(World *world, guchar chr); static void process_server_data(World *world); void process_telnet_iac(World *world, int pos, int end) { /* This function processes Telnet IAC sequences and converts the newlines to the canonical \n. */ unsigned char iac_response[4]; time_t now; while (pos < end) { switch (world->telnet_state) { case TELNETFSM_DATA: switch (world->dbuffer[pos]) { case TELNET_IAC: world->telnet_state = TELNETFSM_IAC; break; case '\n': world->pbuffer[world->pbuf_size++] = world->dbuffer[pos]; world->telnet_state = TELNETFSM_DATA_NL; break; case '\r': world->telnet_state_ncrs = 1; world->telnet_state = TELNETFSM_DATA_CR; break; case '\b': /* Backspace */ if (world->pbuf_size > 0 && world->pbuffer[world->pbuf_size - 1] != '\n') { --world->pbuf_size; } break; default: world->pbuffer[world->pbuf_size++] = world->dbuffer[pos]; } break; case TELNETFSM_DATA_NL: if (world->dbuffer[pos] != '\r' && world->dbuffer[pos] != '\b') { --pos; /* Reprocess this character as data */ } world->telnet_state = TELNETFSM_DATA; break; case TELNETFSM_DATA_CR: if (world->dbuffer[pos] == '\n') { world->pbuffer[world->pbuf_size++] = world->dbuffer[pos]; world->telnet_state = TELNETFSM_DATA; } else if (world->dbuffer[pos] == '\r') { ++world->telnet_state_ncrs; } else { int i; /* Add the newlines. But check if there is space before. */ if (world->pbuf_size + world->telnet_state_ncrs >= world->pbuf_alloc_size) { world->pbuf_alloc_size += world->telnet_state_ncrs; world->pbuffer = g_realloc(world->pbuffer, world->pbuf_alloc_size); } for (i = 0; i < world->telnet_state_ncrs; ++i) { world->pbuffer[world->pbuf_size++] = '\n'; } world->pbuffer[world->pbuf_size++] = world->dbuffer[pos]; world->telnet_state = TELNETFSM_DATA; } break; case TELNETFSM_IAC: switch (world->dbuffer[pos]) { case TELNET_IAC: world->pbuffer[world->pbuf_size++] = TELNET_IAC; world->telnet_state = TELNETFSM_DATA; break; case TELNET_DO: world->telnet_state = TELNETFSM_DO; break; case TELNET_DONT: world->telnet_state = TELNETFSM_DONT; break; case TELNET_WILL: world->telnet_state = TELNETFSM_WILL; break; case TELNET_WONT: world->telnet_state = TELNETFSM_WONT; break; case TELNET_SB: world->telnet_state = TELNETFSM_SB; break; default: world->telnet_state = TELNETFSM_DATA; break; } break; case TELNETFSM_DO: switch (world->dbuffer[pos]) { case TELNET_OPT_TERMINAL_TYPE: iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_WILL; iac_response[2] = TELNET_OPT_TERMINAL_TYPE; kc_send(world, iac_response, 3); break; case TELNET_OPT_NAWS: iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_WILL; iac_response[2] = TELNET_OPT_NAWS; kc_send(world, iac_response, 3); world->use_naws = TRUE; send_naws_size(world); } world->telnet_state = TELNETFSM_DATA; break; case TELNETFSM_DONT: switch (world->dbuffer[pos]) { case TELNET_OPT_NAWS: world->use_naws = FALSE; break; } world->telnet_state = TELNETFSM_DATA; break; case TELNETFSM_WILL: switch (world->dbuffer[pos]) { case TELNET_OPT_ECHO: world->noecho = TRUE; if (!world->never_hide_input) { simo_combo_box_set_visibility(world->gui->cmbEntry, FALSE); } iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DO; iac_response[2] = TELNET_OPT_ECHO; kc_send(world, iac_response, 3); break; case TELNET_OPT_COMPRESS2: now = time(NULL); if (world->mccp_behavior == MCCP_ALWAYS || (world->mccp_behavior == MCCP_AFTER_CONNECT && difftime(now, world->connected_time) <= 60)) { world->mccp_ver = 2; iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DO; iac_response[2] = TELNET_OPT_COMPRESS2; kc_send(world, iac_response, 3); } break; case TELNET_OPT_COMPRESS: /* Do nothing if version 2 is supported */ now = time(NULL); if (world->mccp_ver <= 1 && (world->mccp_behavior == MCCP_ALWAYS || (world->mccp_behavior == MCCP_AFTER_CONNECT && difftime(now, world->connected_time) <= 60))) { world->mccp_ver = 1; iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DO; iac_response[2] = TELNET_OPT_COMPRESS; kc_send(world, iac_response, 3); } break; case TELNET_OPT_GMCP: world->gmcp_enabled = TRUE; iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DO; iac_response[2] = TELNET_OPT_GMCP; kc_send(world, iac_response, 3); break; case TELNET_OPT_MSDP: world->msdp_enabled = TRUE; iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DO; iac_response[2] = TELNET_OPT_MSDP; kc_send(world, iac_response, 3); break; } world->telnet_state = TELNETFSM_DATA; break; case TELNETFSM_WONT: switch (world->dbuffer[pos]) { case TELNET_OPT_ECHO: world->noecho = FALSE; simo_combo_box_set_visibility(world->gui->cmbEntry, TRUE); iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DONT; iac_response[2] = TELNET_OPT_ECHO; kc_send(world, iac_response, 3); break; case TELNET_OPT_GMCP: world->gmcp_enabled = FALSE; iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DONT; iac_response[2] = TELNET_OPT_GMCP; kc_send(world, iac_response, 3); break; case TELNET_OPT_MSDP: world->msdp_enabled = FALSE; iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DONT; iac_response[2] = TELNET_OPT_MSDP; kc_send(world, iac_response, 3); break; } world->telnet_state = TELNETFSM_DATA; break; case TELNETFSM_SB: if (world->dbuffer[pos] == TELNET_IAC) { world->telnet_state = TELNETFSM_SB_IAC; } else if (world->dbuffer[pos] == TELNET_OPT_TERMINAL_TYPE) { world->telnet_state = TELNETFSM_SB_IAC_TERMTYPE; } else if (world->dbuffer[pos] == TELNET_OPT_COMPRESS) { world->telnet_state = TELNETFSM_SB_IAC_COMPRESS; } else if (world->dbuffer[pos] == TELNET_OPT_COMPRESS2) { world->telnet_state = TELNETFSM_SB_IAC_COMPRESS2; } else if (world->dbuffer[pos] == TELNET_OPT_GMCP || world->dbuffer[pos] == TELNET_OPT_MSDP) { world->server_data_protocol = world->dbuffer[pos]; world->telnet_state = TELNETFSM_SERVER_DATA; } break; case TELNETFSM_SB_IAC: if (world->dbuffer[pos] == TELNET_SE) { world->telnet_state = TELNETFSM_DATA; } else { world->telnet_state = TELNETFSM_SB; } break; case TELNETFSM_SB_IAC_TERMTYPE: if (world->dbuffer[pos] == TELNET_TERMTYPE_SEND) { char *tmp; tmp = g_strdup_printf("%c%c%c%c%s%c%c", TELNET_IAC, TELNET_SB, TELNET_OPT_TERMINAL_TYPE, TELNET_TERMTYPE_IS, CLIENT_NAME, TELNET_IAC, TELNET_SE); kc_send(world, tmp, CLIENT_NAME_LEN + 7); g_free(tmp); } world->telnet_state = TELNETFSM_SB; break; case TELNETFSM_SB_IAC_COMPRESS: if (world->dbuffer[pos] == TELNET_WILL) { world->telnet_state = TELNETFSM_SB_IAC_COMPRESS_WILL; } else { /* This shouldn't happen, and if it does, it will probably mess up everything. But let's hope for the best and wait for an SE */ world->telnet_state = TELNETFSM_SB_IAC; } break; case TELNETFSM_SB_IAC_COMPRESS2: if (world->dbuffer[pos] == TELNET_IAC) { world->telnet_state = TELNETFSM_SB_IAC_COMPRESS_WILL; } else { /* This shouldn't happen, and if it does, it will probably mess up everything. But let's hope for the best and wait for an SE */ world->telnet_state = TELNETFSM_SB_IAC; } break; case TELNETFSM_SB_IAC_COMPRESS_WILL: if (world->dbuffer[pos] == TELNET_SE) { start_mccp(world, pos, end); world->telnet_state = TELNETFSM_DATA; return; } else { /* This shouldn't happen, and if it does, it will probably mess up everything. But let's hope for the best and wait for an SE */ world->telnet_state = TELNETFSM_SB_IAC; } break; case TELNETFSM_SERVER_DATA: if (world->dbuffer[pos] == TELNET_IAC) { world->telnet_state = TELNETFSM_SERVER_DATA_IAC; } else { append_to_server_data_buffer(world, world->dbuffer[pos]); } break; case TELNETFSM_SERVER_DATA_IAC: if (world->dbuffer[pos] == TELNET_IAC) { append_to_server_data_buffer(world, TELNET_IAC); world->telnet_state = TELNETFSM_SERVER_DATA; } else if (world->dbuffer[pos] == TELNET_SE) { process_server_data(world); world->telnet_state = TELNETFSM_DATA; } break; } ++pos; } } void send_naws_size(World *world) { /* 3 for start, 2 for end. Each value is 2 bytes, but may be 4 if it happens to be 0xFFFF and must be IAC escaped. Thus 8 for both values. */ guchar buffer[3 + 8 + 2]; int bsize; guint16 size; guint cols; guint rows; ansitextview_get_size(world->gui, &rows, &cols); buffer[0] = TELNET_IAC; buffer[1] = TELNET_SB; buffer[2] = TELNET_OPT_NAWS; bsize = 3; size = htons((guint16) cols); memcpy(buffer + bsize, &size, sizeof(size)); /* Escape IAC */ if (buffer[bsize] == TELNET_IAC) { buffer[bsize+2] = buffer[bsize+1]; buffer[bsize+1] = TELNET_IAC; ++bsize; } ++bsize; if (buffer[bsize] == TELNET_IAC) { buffer[bsize+2] = buffer[bsize+1]; buffer[bsize+1] = TELNET_IAC; ++bsize; } ++bsize; size = htons((guint16) rows); memcpy(buffer + bsize, &size, sizeof(size)); /* Escape IAC */ if (buffer[bsize] == TELNET_IAC) { buffer[bsize+2] = buffer[bsize+1]; buffer[bsize+1] = TELNET_IAC; ++bsize; } ++bsize; if (buffer[bsize] == TELNET_IAC) { buffer[bsize+2] = buffer[bsize+1]; buffer[bsize+1] = TELNET_IAC; ++bsize; } ++bsize; buffer[bsize++] = TELNET_IAC; buffer[bsize++] = TELNET_SE; kc_send(world, buffer, bsize); } static void append_to_server_data_buffer(World *world, guchar chr) { /* If there are no hooks, don't save the data. If there are hooks but they're disable, we save the data, because if probably is cheaper to save than to search the array to see if the hooks are enabled. */ if (world->hooks.OnServerData == NULL) { return; } /* Resize buffer if necessary. */ /* TODO: Put a maximum limit? */ if (world->server_data_size >= world->server_data_alloc_size) { world->server_data_alloc_size += MAX_BUFFER; world->server_data_buffer = realloc(world->server_data_buffer, world->server_data_alloc_size); } world->server_data_buffer[world->server_data_size++] = chr; } static void process_server_data(World *world) { /* If no hooks would be run, don't bother parsing the data */ if (!are_there_enabled_server_data_hooks(world)) { return; } char *protocol = NULL; if (world->server_data_protocol == TELNET_OPT_GMCP) { protocol = "GMCP"; } else if (world->server_data_protocol == TELNET_OPT_MSDP) { protocol = "MSDP"; } /* Shouldn't happen, but it's better to be safe */ if (!protocol) { return; } append_to_server_data_buffer(world, '\0'); GRAB_PERL(world); parse_server_data(protocol, (char *) world->server_data_buffer); RELEASE_PERL(world); execute_hook_immediately(world, "OnServerData", NULL); world->server_data_size = 0; } kildclient-3.0.0/src/we_triggers.c0000644000175000017500000010627612374460043014050 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkTreeModel *create_we_triggers_model(World *world); static void we_trigger_configure_view(GtkTreeView *view, GtkTreeModel *model); static void we_trigger_add_cb(GtkButton *button, gpointer data); static void we_trigger_edit_cb(GtkButton *button, gpointer data); static void we_trigger_delete_cb(GtkButton *button, gpointer data); static void we_trigger_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); static gboolean edit_trigger(World *world, Trigger *trigger); static gboolean we_trigger_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void we_trigger_move_cb(GtkButton *button, gpointer data); /* XML UI signals */ G_MODULE_EXPORT void we_trigger_chkhighlight_toggled_cb(gpointer data, GtkWidget *widget); G_MODULE_EXPORT void we_trigger_btnconfigh_cb(GtkWidget *widget, gpointer data); GObject * get_we_triggers_tab(World *world) { GtkBuilder *ui_builder; gchar *objects[] = { "we_panel_generic_graphical_editor", NULL }; GError *error = NULL; GObject *panel; GtkLabel *lblType; GObject *btnAdd; GObject *btnEdit; GObject *btnDelete; GObject *btnUp; GObject *btnDown; GObject *btnExport; GtkBox *vbox; GtkWidget *btnTest; GtkTreeSelection *selection; /* Create the dialog */ ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } panel = gtk_builder_get_object(ui_builder, "we_panel_generic_graphical_editor"); /* So it's not destroyed when the builder is destroyed */ g_object_ref(panel); world->viewTrigger = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "viewObjects")); g_object_set_data(G_OBJECT(world->viewTrigger), "forworld", world); g_signal_connect(G_OBJECT(world->viewTrigger), "row-activated", G_CALLBACK(we_trigger_view_row_dblclick_cb), world); g_signal_connect(G_OBJECT(world->viewTrigger), "key-press-event", G_CALLBACK(we_trigger_view_keypress_cb), world); lblType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblGEType")); gtk_label_set_markup(lblType, "Triggers"); btnAdd = gtk_builder_get_object(ui_builder, "btnGEAdd"); g_signal_connect(btnAdd, "clicked", G_CALLBACK(we_trigger_add_cb), world->viewTrigger); btnEdit = gtk_builder_get_object(ui_builder, "btnGEEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(we_trigger_edit_cb), world->viewTrigger); btnDelete = gtk_builder_get_object(ui_builder, "btnGEDelete"); g_signal_connect(btnDelete, "clicked", G_CALLBACK(we_trigger_delete_cb), world->viewTrigger); btnUp = gtk_builder_get_object(ui_builder, "btnGEUp"); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_signal_connect(btnUp, "clicked", G_CALLBACK(we_trigger_move_cb), world->viewTrigger); btnDown = gtk_builder_get_object(ui_builder, "btnGEDown"); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); g_signal_connect(btnDown, "clicked", G_CALLBACK(we_trigger_move_cb), world->viewTrigger); btnExport = gtk_builder_get_object(ui_builder, "btnGEExport"); g_object_set_data(btnExport, "preselect", "Trigger"); /* Add an extra button for "Test Triggers" */ vbox = GTK_BOX(gtk_builder_get_object(ui_builder, "vbox_int_generic_graphical_editor")); btnTest = gtk_button_new_with_label(_("Test Triggers")); g_signal_connect_swapped(G_OBJECT(btnTest), "clicked", G_CALLBACK(open_test_triggers_dialog), world); /* Only enable it if connected */ if (!world->connected) { gtk_widget_set_sensitive(btnTest, FALSE); } gtk_box_pack_start(vbox, btnTest, FALSE, FALSE, 0); world->trigger_model = create_we_triggers_model(world); world->trigger_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->trigger_model, NULL)); g_object_unref(G_OBJECT(world->trigger_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->trigger_model_filter), we_guied_plugin_filter_func, world, NULL); we_trigger_configure_view(world->viewTrigger, GTK_TREE_MODEL(world->trigger_model_filter)); selection = gtk_tree_view_get_selection(world->viewTrigger); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_object_set_data(G_OBJECT(selection), "btnEdit", btnEdit); g_object_set_data(G_OBJECT(selection), "btnDelete", btnDelete); g_object_set_data(G_OBJECT(selection), "btnUp", btnUp); g_object_set_data(G_OBJECT(selection), "btnDown", btnDown); g_object_set_data(G_OBJECT(selection), "btnExport", btnExport); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(we_guied_selection_changed_cb), NULL); gtk_builder_connect_signals(ui_builder, world); g_object_unref(ui_builder); return panel; } static GtkTreeModel * create_we_triggers_model(World *world) { GtkListStore *store; GtkTreeIter iter; GSList *triggerptr; Trigger *trigger; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); triggerptr = world->triggers; while (triggerptr) { trigger = (Trigger *) triggerptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, trigger, -1); triggerptr = triggerptr->next; } return GTK_TREE_MODEL(store); } static void we_trigger_configure_view(GtkTreeView *view, GtkTreeModel *model) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, model); g_object_unref(model); /* Column 1 - Enabled? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_ENABLED)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Enabled")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_ENABLED), NULL); gtk_tree_view_append_column(view, column); /* Column 2 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TRIGGER_NAME), NULL); gtk_tree_view_append_column(view, column); /* Column 3 - Pattern */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Pattern")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TRIGGER_PATTERN), NULL); gtk_tree_view_append_column(view, column); /* Column 4 - Ignore Case? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_ICASE)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("I. Case")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_ICASE), NULL); gtk_tree_view_append_column(view, column); /* Column 5 - Action */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Action")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TRIGGER_ACTION), NULL); gtk_tree_view_append_column(view, column); /* Column 6 - Gag? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_GAG)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Gag")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_GAG), NULL); gtk_tree_view_append_column(view, column); /* Column 7 - Gag Log? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_GAGLOG)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Gag Log")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_GAGLOG), NULL); gtk_tree_view_append_column(view, column); /* Column 8 - Keep Exec? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_KEEPEXEC)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Keep Exec")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_KEEPEXEC), NULL); gtk_tree_view_append_column(view, column); /* Column 9 - Rewriter? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_REWRITER)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Rewriter")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_REWRITER), NULL); gtk_tree_view_append_column(view, column); /* Column 10 - Change Style? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_HIGHLIGHT)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Style")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_HIGHLIGHT), NULL); gtk_tree_view_append_column(view, column); /* Column 11 - Plugin */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Plugin")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(OBJECT_PLUGIN), NULL); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } static void we_trigger_add_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; Trigger *trigger; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); trigger = new_trigger(); trigger->enabled = 1; if (edit_trigger(world, trigger)) { world->triggers = g_slist_insert(world->triggers, trigger, world->trigger_pos); we_trigger_insert_trigger(world, trigger, world->trigger_pos++); } else { g_free(trigger); } } static void we_trigger_edit_cb(GtkButton *button, gpointer data) { /* Note that the Edit button is only active when exactly one row is selected. */ World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Trigger *trigger; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &trigger, -1); if (edit_trigger(world, trigger)) { we_trigger_update_trigger(world, trigger); } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_trigger_delete_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Trigger *trigger; GSList *triggeritem; GtkWidget *msgdlg; gint n; n = gtk_tree_selection_count_selected_rows(selection); msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(world->dlgEditWorld), n, _("trigger"), _("triggers")); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GList *listiter = g_list_last(selected); while (listiter) { gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &trigger, -1); triggeritem = g_slist_find(world->triggers, trigger); remove_trigger(world, triggeritem); listiter = listiter->prev; } } gtk_widget_destroy(msgdlg); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_trigger_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { Trigger *trigger; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &trigger, -1); if (edit_trigger(world, trigger)) { we_trigger_update_trigger(world, trigger); } } } static gboolean edit_trigger(World *world, Trigger *trigger) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditTrigger", NULL }; GError *error = NULL; GtkWidget *dlgEditTrigger; GtkEntry *txtName; GtkEntry *txtPattern; GtkEntry *txtAction; GtkToggleButton *chkICase; GtkToggleButton *chkGag; GtkToggleButton *chkGagLog; GtkToggleButton *chkKeepExec; GtkToggleButton *chkRewriter; GtkToggleButton *chkHighlight; GObject *btnConfigH; GtkToggleButton *chkEnabled; const gchar *newname; const gchar *newpattern; const gchar *newaction; gboolean newgag; gboolean newgaglog; gboolean newhighlight; gboolean newicase; gboolean need_recompute = FALSE; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return FALSE; } gtk_builder_connect_signals(ui_builder, NULL); dlgEditTrigger = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditTrigger")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditTrigger), GTK_RESPONSE_OK); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtTriggerName")); txtPattern = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtTriggerPattern")); txtAction = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtTriggerAction")); chkICase = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerICase")); chkGag = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerGag")); chkGagLog = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerGagLog")); chkKeepExec = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerKeepExec")); chkRewriter = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerRewriter")); chkHighlight = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerHighlight")); btnConfigH = gtk_builder_get_object(ui_builder, "btnTriggerConfigHighlight"); chkEnabled = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerEnabled")); g_object_set_data(btnConfigH, "trigger", trigger); /* Only display note when editing a plugin's trigger */ if (!trigger->owner_plugin) { GObject *label; label = gtk_builder_get_object(ui_builder, "lblNotePlugin"); gtk_widget_destroy(GTK_WIDGET(label)); label = gtk_builder_get_object(ui_builder, "lblNoteTextPlugin"); gtk_widget_destroy(GTK_WIDGET(label)); } /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ if (trigger->name) { gtk_entry_set_text(txtName, trigger->name); } if (trigger->pattern) { gtk_entry_set_text(txtPattern, trigger->pattern); } if (trigger->action) { gtk_entry_set_text(txtAction, trigger->action); } gtk_toggle_button_set_active(chkICase, trigger->ignore_case); gtk_toggle_button_set_active(chkGag, trigger->gag_output); gtk_toggle_button_set_active(chkGagLog, trigger->gag_log); gtk_toggle_button_set_active(chkKeepExec, trigger->keepexecuting); gtk_toggle_button_set_active(chkRewriter, trigger->rewriter); gtk_toggle_button_set_active(chkHighlight, trigger->highlight); gtk_toggle_button_set_active(chkEnabled, trigger->enabled); /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditTrigger); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditTrigger)) == GTK_RESPONSE_OK) { /* Validate */ newicase = gtk_toggle_button_get_active(chkICase); newgag = gtk_toggle_button_get_active(chkGag); newgaglog = gtk_toggle_button_get_active(chkGagLog); newhighlight = gtk_toggle_button_get_active(chkHighlight); newpattern = gtk_entry_get_text(txtPattern); if (strcmp(newpattern, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditTrigger), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the pattern.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } newaction = gtk_entry_get_text(txtAction); if (strcmp(newaction, "") == 0 && !newgag && !newgaglog && !newhighlight) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditTrigger), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the action, unless the trigger is a gag or changes the style.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* Update values */ newname = gtk_entry_get_text(txtName); if (!trigger->name || strcmp(newname, trigger->name) != 0) { g_free(trigger->name); if (strcmp(newname, "") != 0) { trigger->name = g_strdup(newname); } else { trigger->name = NULL; } } if (!trigger->pattern || strcmp(newpattern, trigger->pattern) != 0) { g_free(trigger->pattern); trigger->pattern = g_strdup(newpattern); need_recompute = TRUE; } if (!trigger->action || strcmp(newaction, trigger->action) != 0) { g_free(trigger->action); if (strcmp(newaction, "") != 0) { trigger->action = g_strdup(newaction); } else { trigger->action = NULL; } } if (trigger->ignore_case != newicase) { need_recompute = TRUE; } trigger->ignore_case = newicase; trigger->gag_output = newgag; trigger->gag_log = newgaglog; trigger->keepexecuting = gtk_toggle_button_get_active(chkKeepExec); trigger->rewriter = gtk_toggle_button_get_active(chkRewriter); trigger->highlight = newhighlight; trigger->enabled = gtk_toggle_button_get_active(chkEnabled); if (need_recompute && world->perl_interpreter) { GRAB_PERL(world); if (trigger->pattern_re) { SvREFCNT_dec(trigger->pattern_re); } trigger->pattern_re = precompute_re(trigger->pattern, trigger->ignore_case); RELEASE_PERL(world); } /* We've finished successfully */ gtk_widget_destroy(dlgEditTrigger); return TRUE; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditTrigger); return FALSE; } } } void we_trigger_chkhighlight_toggled_cb(gpointer data, GtkWidget *widget) { GtkWidget *btnConfigH = GTK_WIDGET(data); gtk_widget_set_sensitive(btnConfigH, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); } void we_trigger_btnconfigh_cb(GtkWidget *widget, gpointer data) { Trigger *trigger; GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditTriggerHighlight", "model1", "model2", "model3", "model4", "model5", "adjustment3", NULL }; GError *error = NULL; GtkWidget *dlgEditHighlight; GtkToggleButton *radTargetLine; GtkToggleButton *radTargetMatch; GtkToggleButton *radTargetSubstring; GtkSpinButton *spnTarget; GtkComboBox *cmbFgColor; GtkComboBox *cmbBgColor; GtkComboBox *cmbItalic; GtkComboBox *cmbStrike; GtkComboBox *cmbUnderline; trigger = g_object_get_data(G_OBJECT(widget), "trigger"); ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return; } dlgEditHighlight = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditTriggerHighlight")); cmbFgColor = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbFgColor")); cmbBgColor = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbBgColor")); radTargetLine = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radTargetLine")); radTargetMatch = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radTargetMatch")); radTargetSubstring = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radTargetSubstring")); spnTarget = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnTarget")); cmbItalic = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbHighlightItalic")); cmbStrike = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbHighlightStrike")); cmbUnderline = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbHighlightUnderline")); /* Fill in values. */ if (trigger->high_target == -1) { gtk_toggle_button_set_active(radTargetLine, TRUE); } else if (trigger->high_target == 0) { gtk_toggle_button_set_active(radTargetMatch, TRUE); } else { gtk_toggle_button_set_active(radTargetSubstring, TRUE); gtk_spin_button_set_value(spnTarget, trigger->high_target); } /* +1 is because -1 corresponds to "No change" */ gtk_combo_box_set_active(cmbFgColor, trigger->high_fg_color + 1); gtk_combo_box_set_active(cmbBgColor, trigger->high_bg_color + 1); gtk_combo_box_set_active(cmbItalic, trigger->high_italic + 1); gtk_combo_box_set_active(cmbStrike, trigger->high_strike + 1); gtk_combo_box_set_active(cmbUnderline, trigger->high_underline + 1); /* Run the dialog */ gtk_widget_show_all(dlgEditHighlight); if (gtk_dialog_run(GTK_DIALOG(dlgEditHighlight)) == GTK_RESPONSE_OK) { /* Update values */ if (gtk_toggle_button_get_active(radTargetLine)) { trigger->high_target = -1; } else if (gtk_toggle_button_get_active(radTargetMatch)) { trigger->high_target = 0; } else { trigger->high_target = gtk_spin_button_get_value_as_int(spnTarget); } trigger->high_fg_color = gtk_combo_box_get_active(cmbFgColor) - 1; trigger->high_bg_color = gtk_combo_box_get_active(cmbBgColor) - 1; trigger->high_italic = gtk_combo_box_get_active(cmbItalic) - 1; trigger->high_strike = gtk_combo_box_get_active(cmbStrike) - 1; trigger->high_underline = gtk_combo_box_get_active(cmbUnderline) - 1; } gtk_widget_destroy(dlgEditHighlight); g_object_unref(ui_builder); } static gboolean we_trigger_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_KEY_Delete || evt->keyval == GDK_KEY_KP_Delete) { we_trigger_delete_cb(NULL, widget); return TRUE; } return FALSE; } static void we_trigger_move_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; World *world; gboolean is_up; gint new_pos; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Trigger *trigger; gint pos; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &trigger, -1); pos = g_slist_index(world->triggers, trigger); new_pos = pos; if (is_up) { if (pos != 0) { new_pos = pos - 1; move_trigger(world, pos, new_pos); } } else { if (pos != world->trigger_pos - 1) { new_pos = pos + 1; move_trigger(world, pos, new_pos); } } /* Reselect the moved item */ gtk_tree_model_iter_nth_child(model, &iter, NULL, new_pos); gtk_tree_selection_select_iter(selection, &iter); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } void we_trigger_update_trigger(World *world, Trigger *trigger_arg) { /* Called by the Perl functions when an trigger is changed, so that the display is updated. */ GtkTreeIter iter; GtkTreePath *path; Trigger *trigger; gboolean success; if (!world->trigger_model) { return; } success = gtk_tree_model_get_iter_first(world->trigger_model, &iter); while (success) { gtk_tree_model_get(world->trigger_model, &iter, WE_GUIED_POINTER, &trigger, -1); if (trigger == trigger_arg) { path = gtk_tree_model_get_path(world->trigger_model, &iter); gtk_tree_model_row_changed(world->trigger_model, path, &iter); gtk_tree_path_free(path); return; } success = gtk_tree_model_iter_next(world->trigger_model, &iter); } } void we_trigger_insert_trigger(World *world, Trigger *trigger, gint pos) { /* Called by the Perl functions when an trigger is inserted, so that the display is updated. */ GtkTreeIter iter; if (!world->trigger_model) { return; } gtk_list_store_insert(GTK_LIST_STORE(world->trigger_model), &iter, pos); gtk_list_store_set(GTK_LIST_STORE(world->trigger_model), &iter, WE_GUIED_POINTER, trigger, -1); } void we_trigger_delete_trigger(World *world, Trigger *trigger_arg) { /* Called by the Perl functions when an trigger is deleted, so that the display is updated. */ GtkTreeIter iter; Trigger *trigger; gboolean success; if (!world->trigger_model) { return; } success = gtk_tree_model_get_iter_first(world->trigger_model, &iter); while (success) { gtk_tree_model_get(world->trigger_model, &iter, WE_GUIED_POINTER, &trigger, -1); if (trigger == trigger_arg) { gtk_list_store_remove(GTK_LIST_STORE(world->trigger_model), &iter); return; } success = gtk_tree_model_iter_next(world->trigger_model, &iter); } } kildclient-3.0.0/src/mainthread_operations.c0000644000175000017500000000574112354321114016072 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "kildclient.h" void queue_mainthread_operation(World *world, MainThreadOperation *operation) { g_async_queue_push(world->mainthread_operations, operation); } gboolean mainthread_operations_idle_cb(gpointer data) { World *world = (World *) data; gpointer operation = g_async_queue_try_pop(world->mainthread_operations); while (operation != NULL) { process_mainthread_operation(world->gui, (MainThreadOperation *) operation); operation = g_async_queue_try_pop(world->mainthread_operations); } return TRUE; } void free_mainthread_operation(gpointer data) { MainThreadOperation *operation = (MainThreadOperation *) data; switch (operation->action) { case INSERT_AT_END: case INSERT_AT_MARK: g_free(operation->text_insert.text); break; case APPLY_HIGHLIGHT: g_free(operation->highlight); break; case PARSE_COMMANDS: if (operation->commands.matches) { SvREFCNT_dec(operation->commands.matches); } g_free(operation->commands.commands); break; case EXECUTE_ON_RECEIVED_TEXT: g_free(operation->hook_execution->data); g_free(operation->hook_execution); break; default: /* No additional free'ing necessary. */ break; } g_free(operation); } void process_mainthread_operation(WorldGUI *gui, MainThreadOperation *operation) { switch (operation->action) { case INSERT_AT_END: ansitextview_op_insert_at_end(gui, operation); break; case INSERT_AT_MARK: ansitextview_op_insert_at_mark(gui, operation); break; case TEXT_ADDED: ansitextview_op_text_added(gui, operation); break; case CLEAR_PENDING_LINE: ansitextview_op_clear_pending_line(gui, operation); break; case MOVE_LINESTART_MARK: ansitextview_op_move_linestart_mark(gui, operation); break; case APPLY_HIGHLIGHT: ansitextview_op_apply_highlight(gui, operation); break; case PARSE_COMMANDS: mainthread_op_parse_commands(gui->world, operation); break; case EXECUTE_ON_RECEIVED_TEXT: mainthread_op_execute_on_received_text_hook(operation->hook_execution); break; } free_mainthread_operation(operation); } kildclient-3.0.0/src/libintl-wrapper.h0000644000175000017500000000174712374460043014644 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __LIBINTL_WRAPPER_H #define __LIBINTL_WRAPPER_H #include #ifdef __MINGW32__ # undef printf # undef vprintf # undef vfprintf #endif /* defined __MINGW32__ */ #endif kildclient-3.0.0/src/dlgStatistics.ui0000644000175000017500000007221112374201340014523 00000000000000 True False Statistics dialog True False vertical True False end _OK True True True True True top False False 0 False True end 0 True False 8 4 4 True False 0 N/A 1 7 True False 0 N/A 1 6 True False 1 Proxy port: 0 7 True False 1 Proxy host: 0 6 True False 0 None 1 5 True False 1 Proxy type: 0 5 True False 1 World name: 0 0 True False 1 Host: 0 1 True False 1 Port: 0 2 True False 1 Connection time: 0 3 True False 1 Idle time: 0 4 True False 0 8 2 True False 1 Compression used: 0 9 True False 1 Bytes received (compressed): 0 10 True False 0 N/A 1 10 True False 1 Bytes received (decompressed): 0 11 True False 1 Compression ratio: 0 12 True False 1 Lines received: 0 13 True False 0 1 11 True False 0 1 0 True False 0 1 1 True False 0 1 2 True False 0 1 3 True False 0 1 4 True False 0 None 1 9 True False 0 N/A 1 12 True False 0 1 13 True False 0 14 2 True False 1 Key exchange: 0 18 True False 1 SSL protocol used: 0 15 True False 1 Compression algorithm: 0 19 True False 1 Certificate type: 0 20 True False 1 Cipher: 0 16 True False 1 MAC: 0 17 True False 0 SSL not supported in this version 1 15 True False 0 N/A 1 16 True False 0 N/A 1 17 True False 0 N/A 1 18 True False 0 N/A 1 19 True False 0 N/A 1 20 True False 1 Hostname: 0 21 True False 0 N/A 1 21 True False 1 Valid since: 0 22 True False 1 Expiration: 0 23 True False 0 N/A 1 22 True False 0 N/A 1 23 True False 1 Fingerprint: 0 24 True False 0 N/A 1 24 True False 1 Subject's DN: 0 25 True False 1 Issuer's DN: 0 26 True False 0 N/A 1 25 True False 0 N/A 1 26 False True 2 okbutton5 kildclient-3.0.0/src/we_plugins.c0000644000175000017500000005041712374460043013676 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" /***************************************** * Function prototypes - Startup Plugins * *****************************************/ static void configure_startup_view(GtkTreeView *view, World *world); /* XML UI signals */ G_MODULE_EXPORT void we_splugin_add_cb(gpointer data, GtkButton *button); G_MODULE_EXPORT void we_splugin_remove_cb(gpointer data, GtkButton *button); G_MODULE_EXPORT void we_splugin_move_cb(gpointer data, GtkButton *button); G_MODULE_EXPORT gboolean we_splugin_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); /************************************************** * Function prototypes - Currently Loaded Plugins * **************************************************/ static GtkTreeModel *create_we_lplugins_model(World *world); static void configure_loaded_view(GtkTreeView *view, GtkTreeModel *model); static void we_lplugin_ena_toggled_cb(GtkCellRendererToggle *renderer, gchar *pathstr, gpointer data); /* XML UI signals */ G_MODULE_EXPORT void we_lplugin_load_cb(gpointer data, GtkButton *button); G_MODULE_EXPORT void we_lplugin_help_cb(gpointer data, GtkButton *button); /********************************* * Function prototypes - Generic * *********************************/ static GtkWidget *we_plugin_get_load_filechooser(GtkWindow *parent); GObject * get_we_plugins_tab(GtkBuilder *ui_builder, World *world) { GObject *panel; GObject *lstLoadedPlugins; GObject *btnLPluginLoad; GObject *lstStartupPlugins; GObject *btnSPluginUp; GObject *btnSPluginDown; panel = gtk_builder_get_object(ui_builder, "we_panel_plugins"); /* Currently loaded plugins part */ lstLoadedPlugins = gtk_builder_get_object(ui_builder, "lstLoadedPlugins"); g_object_set_data(lstLoadedPlugins, "forworld", world); btnLPluginLoad = gtk_builder_get_object(ui_builder, "btnLPluginLoad"); if (!world->connected) { gtk_widget_set_sensitive(GTK_WIDGET(btnLPluginLoad), FALSE); } world->plugin_model = create_we_lplugins_model(world); configure_loaded_view(GTK_TREE_VIEW(lstLoadedPlugins), world->plugin_model); /* Startup plugins part */ lstStartupPlugins = gtk_builder_get_object(ui_builder, "lstStartupPlugins"); g_object_set_data(lstStartupPlugins, "forworld", world); btnSPluginUp = gtk_builder_get_object(ui_builder, "btnSPluginUp"); g_object_set_data(btnSPluginUp, "isup", GINT_TO_POINTER(TRUE)); btnSPluginDown = gtk_builder_get_object(ui_builder, "btnSPluginDown"); g_object_set_data(btnSPluginDown, "isup", GINT_TO_POINTER(FALSE)); configure_startup_view(GTK_TREE_VIEW(lstStartupPlugins), world); return panel; } /* Startup plugins */ static void configure_startup_view(GtkTreeView *view, World *world) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, world->startup_plugins); if (world->connected) { /* Column 1 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", SPLUGIN_NAME); gtk_tree_view_append_column(view, column); /* Column 2 - Description */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Description")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", SPLUGIN_DESCRIPTION); gtk_tree_view_append_column(view, column); /* Column 3 - Author */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Author")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", SPLUGIN_AUTHOR); gtk_tree_view_append_column(view, column); } /* Column 4 - File */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("File")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", SPLUGIN_FILE); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } void we_splugin_add_cb(gpointer data, GtkButton *button) { World *world; GtkTreeView *view; GtkWidget *filechooser; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); filechooser = we_plugin_get_load_filechooser(GTK_WINDOW(world->dlgEditWorld)); if (gtk_dialog_run(GTK_DIALOG(filechooser)) == GTK_RESPONSE_YES) { gchar *filename; GError *error = NULL; gtk_widget_hide(filechooser); filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser)); if (world->connected) { add_startup_plugin(world, filename, &error); } else { GtkTreeIter iter; gtk_list_store_append(GTK_LIST_STORE(world->startup_plugins), &iter); gtk_list_store_set(GTK_LIST_STORE(world->startup_plugins), &iter, SPLUGIN_FILE, filename, -1); } g_free(filename); if (error) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", error->message); gtk_window_set_title(GTK_WINDOW(dlg), _("Error Loading Plugin")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); g_error_free(error); } } gtk_widget_destroy(filechooser); } void we_splugin_remove_cb(gpointer data, GtkButton *button) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; view = (GtkTreeView *) data; selection = gtk_tree_view_get_selection(view); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { gtk_list_store_remove(GTK_LIST_STORE(model), &iter); } } void we_splugin_move_cb(gpointer data, GtkButton *button) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; GtkTreeIter other_iter; gboolean is_up; view = (GtkTreeView *) data; selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { if (is_up) { GtkTreePath *path; path = gtk_tree_model_get_path(model, &iter); if (gtk_tree_path_prev(path)) { gtk_tree_model_get_iter(model, &other_iter, path); gtk_list_store_swap(GTK_LIST_STORE(model), &iter, &other_iter); } gtk_tree_path_free(path); } else { other_iter = iter; if (gtk_tree_model_iter_next(model, &other_iter)) { gtk_list_store_swap(GTK_LIST_STORE(model), &iter, &other_iter); } } } } gboolean we_splugin_view_keypress_cb(GtkWidget *widget, /* The treeview */ GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_KEY_Delete || evt->keyval == GDK_KEY_KP_Delete) { we_splugin_remove_cb(widget, NULL); return TRUE; } return FALSE; } /* Currently loaded plugins */ static GtkTreeModel * create_we_lplugins_model(World *world) { GtkListStore *store; GtkTreeIter iter; GSList *pluginptr; Plugin *plugin; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); pluginptr = world->plugins; while (pluginptr) { plugin = (Plugin *) pluginptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, plugin, -1); pluginptr = pluginptr->next; } return GTK_TREE_MODEL(store); } static void configure_loaded_view(GtkTreeView *view, GtkTreeModel *model) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, model); g_object_unref(model); /* Column 1 - Enabled? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_lplugin_ena_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Enabled")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(PLUGIN_ENABLED), NULL); gtk_tree_view_append_column(view, column); /* Column 2 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(PLUGIN_NAME), NULL); gtk_tree_view_append_column(view, column); /* Column 3 - Version */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Version")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(PLUGIN_VERSION), NULL); gtk_tree_view_append_column(view, column); /* Column 4 - Author */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Author")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(PLUGIN_AUTHOR), NULL); gtk_tree_view_append_column(view, column); /* Column 5 - Description */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Description")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(PLUGIN_DESCRIPTION), NULL); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } static void we_lplugin_ena_toggled_cb(GtkCellRendererToggle *renderer, gchar *pathstr, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; World *world; Plugin *plugin; view = (GtkTreeView *) data; model = gtk_tree_view_get_model(view); selection = gtk_tree_view_get_selection(view); world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); gtk_tree_model_get_iter_from_string(model, &iter, pathstr); if (gtk_tree_selection_iter_is_selected(selection, &iter)) { gchar *cmd; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &plugin, -1); if (plugin->enabled) { cmd = g_strdup_printf("$::world->displugin('%s');", plugin->name); } else { cmd = g_strdup_printf("$::world->enaplugin('%s');", plugin->name); } GRAB_PERL(world); eval_pv(cmd, TRUE); RELEASE_PERL(world); g_free(cmd); } } void we_lplugin_load_cb(gpointer data, GtkButton *button) { World *world; GtkTreeView *view; GtkWidget *filechooser; GtkWidget *chkAtStartup; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); filechooser = we_plugin_get_load_filechooser(GTK_WINDOW(world->dlgEditWorld)); chkAtStartup = gtk_check_button_new_with_mnemonic(_("Always load this plugin at _startup")); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(filechooser), chkAtStartup); if (gtk_dialog_run(GTK_DIALOG(filechooser)) == GTK_RESPONSE_YES) { gchar *filename; GError *error = NULL; gtk_widget_hide(filechooser); filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser)); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chkAtStartup))) { add_startup_plugin(world, filename, &error); } if (error == NULL) { load_plugin(world, filename, &error); } if (error) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", error->message); gtk_window_set_title(GTK_WINDOW(dlg), _("Error Loading Plugin")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); g_error_free(error); } } gtk_widget_destroy(filechooser); } void we_lplugin_help_cb(gpointer data, GtkButton *button) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { Plugin *plugin; gchar *cmd; GtkWidget *msgdlg; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &plugin, -1); cmd = g_strdup_printf("%s::help();", plugin->name); GRAB_PERL(world); eval_pv(cmd, FALSE); RELEASE_PERL(world); g_free(cmd); /* Show message telling where the help appears. */ if (!globalPrefs.no_plugin_help_msg) { GtkWidget *chk; msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, _("The help is displayed in main window.")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Information")); chk = gtk_check_button_new_with_mnemonic(_("_Do not display this message again")); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(msgdlg))), chk, FALSE, FALSE, 4); gtk_widget_show_all(msgdlg); gtk_dialog_run(GTK_DIALOG(msgdlg)); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk))) { globalPrefs.no_plugin_help_msg = TRUE; } gtk_widget_destroy(msgdlg); } } } void we_lplugin_insert_plugin(World *world, Plugin *plugin) { /* Called by the Perl functions when an plugin is inserted, so that the display is updated. */ GtkTreeIter iter; if (!world->plugin_model) { return; } gtk_list_store_append(GTK_LIST_STORE(world->plugin_model), &iter); gtk_list_store_set(GTK_LIST_STORE(world->plugin_model), &iter, WE_GUIED_POINTER, plugin, -1); } void we_lplugin_update_plugin(World *world, Plugin *plugin_arg) { /* Called by the Perl functions when an plugin is changed, so that the display is updated. */ GtkTreeIter iter; GtkTreePath *path; Plugin *plugin; gboolean success; if (!world->plugin_model) { return; } success = gtk_tree_model_get_iter_first(world->plugin_model, &iter); while (success) { gtk_tree_model_get(world->plugin_model, &iter, WE_GUIED_POINTER, &plugin, -1); if (plugin == plugin_arg) { path = gtk_tree_model_get_path(world->plugin_model, &iter); gtk_tree_model_row_changed(world->plugin_model, path, &iter); gtk_tree_path_free(path); return; } success = gtk_tree_model_iter_next(world->plugin_model, &iter); } } static GtkWidget * we_plugin_get_load_filechooser(GtkWindow *parent) { const gchar *plugindir; GtkWidget *filechooser; filechooser = gtk_file_chooser_dialog_new(_("Load plugin"), parent, GTK_FILE_CHOOSER_ACTION_OPEN, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Open"), GTK_RESPONSE_YES, NULL); plugindir = get_kildclient_installed_file("plugins"); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filechooser), plugindir); gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(filechooser), plugindir, NULL); #ifndef __WIN32__ plugindir = g_strdup_printf("%s/plugins", get_kildclient_directory_path()); #else plugindir = g_strdup_printf("%s\\plugins", get_kildclient_directory_path()); #endif gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(filechooser), plugindir, NULL); return filechooser; } kildclient-3.0.0/src/dlgMLSend.ui0000644000175000017500000004171112374201340013514 00000000000000 100 0.10000000149 1 1 100000 1 1 10 False 8 Multi-line send dialog True False vertical 4 True False end _Cancel True True True True True False False 0 _Send True True True True True True False False 1 False True 2 end 0 True False 0 1 Send this text _initially: True txtInitial False False 2 True True in True True True Enter some text to be sent to the World False True 3 True False 0 1 Then send the _contents of this file: True txtFile False False 4 True False 6 True False False True True 0 _Clear True True True True False False 1 False False 5 True False 0 1 _Finally, send this text: True txtFinal False False 6 True True in True True True Enter some text to be sent to the World False True 7 True False False False 8 True False 0 1 Add this to the _beginning of each line: True txtStart False False 2 9 True True Specify some text to be prepended to each sent line False False 10 True False 0 1 Add this to the _end of each line: True txtEnd False False 2 11 True True Specify some text to be appended to each sent line False False 12 True False 4 True False _Delay True spnMLSDelay False False 0 True True Specify the delay between sending the group of lines adjustment1 0.10000000149 1 False False 1 True False seconds e_ach True spnLinesATime False False 2 True True Specify how many lines are sent at once adjustment2 1 False False 3 True False line(s) False False 4 False False 4 13 _Keep dialog open after sending True True False True 0.5 True False False 14 btnMLCancel btnMLSend kildclient-3.0.0/src/we_hooks.c0000644000175000017500000007671412374460043013350 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static void create_we_hooks_models(World *world); static GtkTreeModel *create_we_hooks_model(GSList *hookptr); static void we_hook_configure_view(GtkTreeView *view); static void we_hook_combo_changed_cb(GtkComboBoxText *combo, gpointer data); static void we_hook_save_currently_selected(GtkTreeModel *model, GtkTreeSelection *selection); static void we_hook_add_cb(GtkButton *button, gpointer data); static void we_hook_edit_cb(GtkButton *button, gpointer data); static void we_hook_delete_cb(GtkButton *button, gpointer data); static void we_hook_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); static gboolean edit_hook(World *world, const gchar *event, Hook *hook); static gboolean we_hook_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void we_hook_move_cb(GtkButton *button, gpointer data); static void we_hook_export_cb(GtkButton *button, gpointer data); GObject * get_we_hooks_tab(World *world) { GtkBuilder *ui_builder; gchar *objects[] = { "we_panel_generic_graphical_editor", NULL }; GError *error = NULL; GObject *panel; GObject *viewObjects; GtkLabel *lblType; GObject *btnAdd; GObject *btnEdit; GObject *btnDelete; GObject *btnUp; GObject *btnDown; GObject *btnExport; GtkTreeSelection *selection; GtkWidget *label; GtkComboBoxText *cmbWhichHook; GtkWidget *hboxWhich; GtkBox *vbox_int; /* Create the dialog */ ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } panel = gtk_builder_get_object(ui_builder, "we_panel_generic_graphical_editor"); /* So it's not destroyed when the builder is destroyed */ g_object_ref(panel); viewObjects = gtk_builder_get_object(ui_builder, "viewObjects"); g_object_set_data(viewObjects, "forworld", world); g_signal_connect(viewObjects, "row-activated", G_CALLBACK(we_hook_view_row_dblclick_cb), world); g_signal_connect(viewObjects, "key-press-event", G_CALLBACK(we_hook_view_keypress_cb), world); lblType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblGEType")); gtk_label_set_markup(lblType, "Hooks"); btnAdd = gtk_builder_get_object(ui_builder, "btnGEAdd"); g_signal_connect(btnAdd, "clicked", G_CALLBACK(we_hook_add_cb), viewObjects); btnEdit = gtk_builder_get_object(ui_builder, "btnGEEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(we_hook_edit_cb), viewObjects); btnDelete = gtk_builder_get_object(ui_builder, "btnGEDelete"); g_signal_connect(btnDelete, "clicked", G_CALLBACK(we_hook_delete_cb), viewObjects); btnUp = gtk_builder_get_object(ui_builder, "btnGEUp"); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_signal_connect(btnUp, "clicked", G_CALLBACK(we_hook_move_cb), viewObjects); btnDown = gtk_builder_get_object(ui_builder, "btnGEDown"); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); g_signal_connect(btnDown, "clicked", G_CALLBACK(we_hook_move_cb), viewObjects); btnExport = gtk_builder_get_object(ui_builder, "btnGEExport"); /* The manually added combo for selecting which hook */ label = gtk_label_new_with_mnemonic(_("_Event:")); cmbWhichHook = GTK_COMBO_BOX_TEXT(gtk_combo_box_text_new()); g_signal_connect(G_OBJECT(cmbWhichHook), "changed", G_CALLBACK(we_hook_combo_changed_cb), viewObjects); gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(cmbWhichHook)); hboxWhich = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); gtk_box_pack_start(GTK_BOX(hboxWhich), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hboxWhich), GTK_WIDGET(cmbWhichHook), FALSE, FALSE, 0); gtk_combo_box_text_append_text(cmbWhichHook, "OnConnect"); gtk_combo_box_text_append_text(cmbWhichHook, "OnDisconnect"); gtk_combo_box_text_append_text(cmbWhichHook, "OnReceivedText"); gtk_combo_box_text_append_text(cmbWhichHook, "OnSentCommand"); gtk_combo_box_text_append_text(cmbWhichHook, "OnGetFocus"); gtk_combo_box_text_append_text(cmbWhichHook, "OnLoseFocus"); gtk_combo_box_text_append_text(cmbWhichHook, "OnCloseConnected"); gtk_combo_box_text_append_text(cmbWhichHook, "OnServerData"); vbox_int = GTK_BOX(gtk_builder_get_object(ui_builder, "vbox_int_generic_graphical_editor")); gtk_box_pack_start(vbox_int, hboxWhich, FALSE, FALSE, 0); gtk_box_reorder_child(vbox_int, hboxWhich, 0); create_we_hooks_models(world); we_hook_configure_view(GTK_TREE_VIEW(viewObjects)); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(viewObjects)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_object_set_data(G_OBJECT(selection), "btnEdit", btnEdit); g_object_set_data(G_OBJECT(selection), "btnDelete", btnDelete); g_object_set_data(G_OBJECT(selection), "btnUp", btnUp); g_object_set_data(G_OBJECT(selection), "btnDown", btnDown); g_object_set_data(G_OBJECT(selection), "btnExport", btnExport); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(we_guied_selection_changed_cb), NULL); /* Select first, will cause a model to be associated with the view */ gtk_combo_box_set_active(GTK_COMBO_BOX(cmbWhichHook), 0); gtk_builder_connect_signals(ui_builder, world); /* The callback for the Export buttons in the Hooks tab is a different one - so we disconnect the handler from the XML UI file and connect the correct one. */ g_signal_handlers_disconnect_by_func(btnExport, we_guied_export_cb, world); g_signal_connect(btnExport, "clicked", G_CALLBACK(we_hook_export_cb), viewObjects); g_object_unref(ui_builder); return panel; } static void create_we_hooks_models(World *world) { world->hooks.OnConnect_model = create_we_hooks_model(world->hooks.OnConnect); g_object_set_data(G_OBJECT(world->hooks.OnConnect_model), "forevent", "OnConnect"); g_object_set_data(G_OBJECT(world->hooks.OnConnect_model), "selected_list", &world->selected_OnConnect_hooks); world->hooks.OnConnect_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnConnect_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnConnect_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnConnect_model_filter), we_guied_plugin_filter_func, world, NULL); world->hooks.OnDisconnect_model = create_we_hooks_model(world->hooks.OnDisconnect); g_object_set_data(G_OBJECT(world->hooks.OnDisconnect_model), "forevent", "OnDisconnect"); g_object_set_data(G_OBJECT(world->hooks.OnDisconnect_model), "selected_list", &world->selected_OnDisconnect_hooks); world->hooks.OnDisconnect_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnDisconnect_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnDisconnect_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnDisconnect_model_filter), we_guied_plugin_filter_func, world, NULL); world->hooks.OnReceivedText_model = create_we_hooks_model(world->hooks.OnReceivedText); g_object_set_data(G_OBJECT(world->hooks.OnReceivedText_model), "forevent", "OnReceivedText"); g_object_set_data(G_OBJECT(world->hooks.OnReceivedText_model), "selected_list", &world->selected_OnReceivedText_hooks); world->hooks.OnReceivedText_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnReceivedText_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnReceivedText_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnReceivedText_model_filter), we_guied_plugin_filter_func, world, NULL); world->hooks.OnSentCommand_model = create_we_hooks_model(world->hooks.OnSentCommand); g_object_set_data(G_OBJECT(world->hooks.OnSentCommand_model), "forevent", "OnSentCommand"); g_object_set_data(G_OBJECT(world->hooks.OnSentCommand_model), "selected_list", &world->selected_OnSentCommand_hooks); world->hooks.OnSentCommand_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnSentCommand_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnSentCommand_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnSentCommand_model_filter), we_guied_plugin_filter_func, world, NULL); world->hooks.OnGetFocus_model = create_we_hooks_model(world->hooks.OnGetFocus); g_object_set_data(G_OBJECT(world->hooks.OnGetFocus_model), "forevent", "OnGetFocus"); g_object_set_data(G_OBJECT(world->hooks.OnGetFocus_model), "selected_list", &world->selected_OnGetFocus_hooks); world->hooks.OnGetFocus_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnGetFocus_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnGetFocus_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnGetFocus_model_filter), we_guied_plugin_filter_func, world, NULL); world->hooks.OnLoseFocus_model = create_we_hooks_model(world->hooks.OnLoseFocus); g_object_set_data(G_OBJECT(world->hooks.OnLoseFocus_model), "forevent", "OnLoseFocus"); g_object_set_data(G_OBJECT(world->hooks.OnLoseFocus_model), "selected_list", &world->selected_OnLoseFocus_hooks); world->hooks.OnLoseFocus_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnLoseFocus_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnLoseFocus_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnLoseFocus_model_filter), we_guied_plugin_filter_func, world, NULL); world->hooks.OnCloseConnected_model = create_we_hooks_model(world->hooks.OnCloseConnected); g_object_set_data(G_OBJECT(world->hooks.OnCloseConnected_model), "forevent", "OnCloseConnected"); g_object_set_data(G_OBJECT(world->hooks.OnCloseConnected_model), "selected_list", &world->selected_OnCloseConnected_hooks); world->hooks.OnCloseConnected_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnCloseConnected_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnCloseConnected_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnCloseConnected_model_filter), we_guied_plugin_filter_func, world, NULL); world->hooks.OnServerData_model = create_we_hooks_model(world->hooks.OnServerData); g_object_set_data(G_OBJECT(world->hooks.OnServerData_model), "forevent", "OnServerData"); g_object_set_data(G_OBJECT(world->hooks.OnServerData_model), "selected_list", &world->selected_OnServerData_hooks); world->hooks.OnServerData_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnServerData_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnServerData_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnServerData_model_filter), we_guied_plugin_filter_func, world, NULL); } static GtkTreeModel * create_we_hooks_model(GSList *hookptr) { GtkListStore *store; GtkTreeIter iter; Hook *hook; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); while (hookptr) { hook = (Hook *) hookptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, hook, -1); hookptr = hookptr->next; } return GTK_TREE_MODEL(store); } static void we_hook_configure_view(GtkTreeView *view) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; /* Column 1 - Enabled? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(HOOK_ENABLED)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Enabled")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(HOOK_ENABLED), NULL); gtk_tree_view_append_column(view, column); /* Column 2 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(HOOK_NAME), NULL); gtk_tree_view_append_column(view, column); /* Column 3 - Action */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Action")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(HOOK_ACTION), NULL); gtk_tree_view_append_column(view, column); /* Column 4 - Plugin */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Plugin")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(OBJECT_PLUGIN), NULL); gtk_tree_view_append_column(view, column); } static void we_hook_combo_changed_cb(GtkComboBoxText *combo, gpointer data) { GtkTreeView *view; World *world; gchar *newevent; GtkTreeModel *oldmodel; GtkTreeModel *newmodel; GSList **selected_list; GtkTreeSelection *selection; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); oldmodel = gtk_tree_view_get_model(view); if (oldmodel) { /* Save selected rows */ we_hook_save_currently_selected(oldmodel, gtk_tree_view_get_selection(view)); } newevent = gtk_combo_box_text_get_active_text(combo); newmodel = get_hook_model(world, newevent); gtk_tree_view_set_model(view, newmodel); selected_list = g_object_get_data(G_OBJECT(newmodel), "selected_list"); if (*selected_list) { /* Restore selected rows */ GSList *listiter; selection = gtk_tree_view_get_selection(view); listiter = *selected_list; while (listiter) { GtkTreePath *path = gtk_tree_row_reference_get_path(listiter->data); gtk_tree_selection_select_path(selection, path); listiter = listiter->next; } } gtk_tree_view_columns_autosize(view); g_free(newevent); } static void we_hook_save_currently_selected(GtkTreeModel *model, GtkTreeSelection *selection) { GSList **selected_list; GList *curr_selected; selected_list = g_object_get_data(G_OBJECT(model), "selected_list"); g_slist_foreach(*selected_list, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(*selected_list); *selected_list = NULL; curr_selected = gtk_tree_selection_get_selected_rows(selection, NULL); if (curr_selected) { GList *listiter; listiter = curr_selected; while (listiter) { *selected_list = g_slist_append(*selected_list, gtk_tree_row_reference_new(model, listiter->data)); listiter = listiter->next; } g_list_foreach(curr_selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(curr_selected); } } static void we_hook_add_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; gchar *event; GSList **hook_list; gint *hookpos; Hook *hook; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); model = gtk_tree_view_get_model(view); event = g_object_get_data(G_OBJECT(model), "forevent"); hook = g_new0(Hook, 1); hook->enabled = 1; if (edit_hook(world, event, hook)) { hook_list = get_hook_list_for_writing(world, event, &hookpos); *hook_list = g_slist_insert(*hook_list, hook, *hookpos); we_hook_insert_hook(world, event, hook, (*hookpos)++); } else { g_free(hook); } } static void we_hook_edit_cb(GtkButton *button, gpointer data) { /* Note that the Edit button is only active when exactly one row is selected. */ World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Hook *hook; gchar *event; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); event = g_object_get_data(G_OBJECT(model), "forevent"); if (edit_hook(world, event, hook)) { we_hook_update_hook(world, event, hook); } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_hook_delete_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Hook *hook; GSList *hooklist; gint pos; gchar *event; GtkWidget *msgdlg; gint n; n = gtk_tree_selection_count_selected_rows(selection); msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(world->dlgEditWorld), n, _("hook"), _("hooks")); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GList *listiter = g_list_last(selected); event = g_object_get_data(G_OBJECT(model), "forevent"); hooklist = get_hook_list_for_reading(world, event, NULL); while (listiter) { gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); pos = g_slist_index(hooklist, hook); delete_hook(world, event, pos, NULL); listiter = listiter->prev; } } gtk_widget_destroy(msgdlg); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_hook_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { Hook *hook; gchar *event; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); event = g_object_get_data(G_OBJECT(model), "forevent"); if (edit_hook(world, event, hook)) { we_hook_update_hook(world, event, hook); } } } static gboolean edit_hook(World *world, const gchar *event, Hook *hook) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditHook", NULL }; GError *error = NULL; GtkWidget *dlgEditHook; GtkLabel *lblEvent; GtkEntry *txtName; GtkEntry *txtAction; GtkToggleButton *chkEnabled; const gchar *newname; const gchar *newaction; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return FALSE; } dlgEditHook = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditHook")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditHook), GTK_RESPONSE_OK); lblEvent = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblHookEvent")); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtHookName")); txtAction = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtHookAction")); chkEnabled = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkHookEnabled")); /* Only display note when editing a plugin's trigger */ if (!hook->owner_plugin) { GObject *label; label = gtk_builder_get_object(ui_builder, "lblNoteHook"); gtk_widget_destroy(GTK_WIDGET(label)); label = gtk_builder_get_object(ui_builder, "lblNoteTextHook"); gtk_widget_destroy(GTK_WIDGET(label)); } /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ gtk_label_set_text(lblEvent, event); if (hook->name) { gtk_entry_set_text(txtName, hook->name); } if (hook->action) { gtk_entry_set_text(txtAction, hook->action); } gtk_toggle_button_set_active(chkEnabled, hook->enabled); /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditHook); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditHook)) == GTK_RESPONSE_OK) { /* Validate */ newaction = gtk_entry_get_text(txtAction); if (strcmp(newaction, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditHook), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the action.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* Update values */ newname = gtk_entry_get_text(txtName); if (!hook->name || strcmp(newname, hook->name) != 0) { g_free(hook->name); if (strcmp(newname, "") != 0) { hook->name = g_strdup(newname); } else { hook->name = NULL; } } if (!hook->action || strcmp(newaction, hook->action) != 0) { g_free(hook->action); hook->action = g_strdup(newaction); } hook->enabled = gtk_toggle_button_get_active(chkEnabled); /* We've finished successfully */ gtk_widget_destroy(dlgEditHook); return TRUE; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditHook); return FALSE; } } } static gboolean we_hook_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_KEY_Delete || evt->keyval == GDK_KEY_KP_Delete) { we_hook_delete_cb(NULL, widget); return TRUE; } return FALSE; } static void we_hook_move_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; World *world; gboolean is_up; gint new_pos; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { GSList *hooklist; gint hook_pos; Hook *hook; gchar *event; gint pos; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); event = g_object_get_data(G_OBJECT(model), "forevent"); hooklist = get_hook_list_for_reading(world, event, &hook_pos); pos = g_slist_index(hooklist, hook); new_pos = pos; if (is_up) { if (pos != 0) { new_pos = pos - 1; move_hook(world, event, pos, new_pos); } } else { if (pos != hook_pos - 1) { new_pos = pos + 1; move_hook(world, event, pos, new_pos); } } /* Reselect the moved item */ gtk_tree_model_iter_nth_child(model, &iter, NULL, new_pos); gtk_tree_selection_select_iter(selection, &iter); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_hook_export_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; World *world; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); model = gtk_tree_view_get_model(view); we_hook_save_currently_selected(model, gtk_tree_view_get_selection(view)); g_object_set_data(G_OBJECT(button), "preselect", g_object_get_data(G_OBJECT(model), "forevent")); we_guied_export_cb(button, world); } void we_hook_update_hook(World *world, const gchar *event, Hook *hook_arg) { /* Called by the Perl functions when an hook is changed, so that the display is updated. */ GtkTreeIter iter; GtkTreePath *path; GtkTreeModel *model; Hook *hook; gboolean success; model = get_hook_model(world, event); if (!model) { return; } success = gtk_tree_model_get_iter_first(model, &iter); while (success) { gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); if (hook == hook_arg) { path = gtk_tree_model_get_path(model, &iter); gtk_tree_model_row_changed(model, path, &iter); gtk_tree_path_free(path); return; } success = gtk_tree_model_iter_next(model, &iter); } } void we_hook_insert_hook(World *world, const gchar *event, Hook *hook, gint pos) { /* Called by the Perl functions when an hook is inserted, so that the display is updated. */ GtkTreeModel *model; GtkTreeIter iter; model = get_hook_model(world, event); if (!model) { return; } gtk_list_store_insert(GTK_LIST_STORE(model), &iter, pos); gtk_list_store_set(GTK_LIST_STORE(model), &iter, WE_GUIED_POINTER, hook, -1); } void we_hook_delete_hook(World *world, const gchar *event, Hook *hook_arg) { /* Called by the Perl functions when an hook is deleted, so that the display is updated. */ GtkTreeIter iter; GtkTreeModel *model; Hook *hook; gboolean success; model = get_hook_model(world, event); if (!model) { return; } success = gtk_tree_model_get_iter_first(model, &iter); while (success) { gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); if (hook == hook_arg) { gtk_list_store_remove(GTK_LIST_STORE(model), &iter); return; } success = gtk_tree_model_iter_next(model, &iter); } } kildclient-3.0.0/src/we_aliases.c0000644000175000017500000006056712374460043013645 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkTreeModel *create_we_aliases_model(World *world); static void we_alias_configure_view(GtkTreeView *view, GtkTreeModel *model); static void we_alias_add_cb(GtkButton *button, gpointer data); static void we_alias_edit_cb(GtkButton *button, gpointer data); static void we_alias_delete_cb(GtkButton *button, gpointer data); static void we_alias_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); static gboolean edit_alias(World *world, Alias *alias); static gboolean we_alias_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void we_alias_move_cb(GtkButton *button, gpointer data); GObject * get_we_aliases_tab(World *world) { GtkBuilder *ui_builder; gchar *objects[] = { "we_panel_generic_graphical_editor", NULL }; GError *error = NULL; GObject *panel; GtkLabel *lblType; GObject *btnAdd; GObject *btnEdit; GObject *btnDelete; GObject *btnUp; GObject *btnDown; GObject *btnExport; GtkTreeSelection *selection; /* Create the dialog */ ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } panel = gtk_builder_get_object(ui_builder, "we_panel_generic_graphical_editor"); /* So it's not destroyed when the builder is destroyed */ g_object_ref(panel); world->viewAlias = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "viewObjects")); g_object_set_data(G_OBJECT(world->viewAlias), "forworld", world); g_signal_connect(G_OBJECT(world->viewAlias), "row-activated", G_CALLBACK(we_alias_view_row_dblclick_cb), world); g_signal_connect(G_OBJECT(world->viewAlias), "key-press-event", G_CALLBACK(we_alias_view_keypress_cb), world); lblType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblGEType")); gtk_label_set_markup(lblType, "Aliases"); btnAdd = gtk_builder_get_object(ui_builder, "btnGEAdd"); g_signal_connect(btnAdd, "clicked", G_CALLBACK(we_alias_add_cb), world->viewAlias); btnEdit = gtk_builder_get_object(ui_builder, "btnGEEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(we_alias_edit_cb), world->viewAlias); btnDelete = gtk_builder_get_object(ui_builder, "btnGEDelete"); g_signal_connect(btnDelete, "clicked", G_CALLBACK(we_alias_delete_cb), world->viewAlias); btnUp = gtk_builder_get_object(ui_builder, "btnGEUp"); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_signal_connect(btnUp, "clicked", G_CALLBACK(we_alias_move_cb), world->viewAlias); btnDown = gtk_builder_get_object(ui_builder, "btnGEDown"); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); g_signal_connect(btnDown, "clicked", G_CALLBACK(we_alias_move_cb), world->viewAlias); btnExport = gtk_builder_get_object(ui_builder, "btnGEExport"); g_object_set_data(btnExport, "preselect", "Alias"); world->alias_model = create_we_aliases_model(world); world->alias_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->alias_model, NULL)); g_object_unref(G_OBJECT(world->alias_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->alias_model_filter), we_guied_plugin_filter_func, world, NULL); we_alias_configure_view(world->viewAlias, GTK_TREE_MODEL(world->alias_model_filter)); selection = gtk_tree_view_get_selection(world->viewAlias); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_object_set_data(G_OBJECT(selection), "btnEdit", btnEdit); g_object_set_data(G_OBJECT(selection), "btnDelete", btnDelete); g_object_set_data(G_OBJECT(selection), "btnUp", btnUp); g_object_set_data(G_OBJECT(selection), "btnDown", btnDown); g_object_set_data(G_OBJECT(selection), "btnExport", btnExport); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(we_guied_selection_changed_cb), NULL); gtk_builder_connect_signals(ui_builder, world); g_object_unref(ui_builder); return panel; } static GtkTreeModel * create_we_aliases_model(World *world) { GtkListStore *store; GtkTreeIter iter; GSList *aliasptr; Alias *alias; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); aliasptr = world->aliases; while (aliasptr) { alias = (Alias *) aliasptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, alias, -1); aliasptr = aliasptr->next; } return GTK_TREE_MODEL(store); } static void we_alias_configure_view(GtkTreeView *view, GtkTreeModel *model) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, model); g_object_unref(model); /* Column 1 - Enabled? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(ALIAS_ENABLED)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Enabled")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(ALIAS_ENABLED), NULL); gtk_tree_view_append_column(view, column); /* Column 2 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(ALIAS_NAME), NULL); gtk_tree_view_append_column(view, column); /* Column 3 - Pattern */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Pattern")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(ALIAS_PATTERN), NULL); gtk_tree_view_append_column(view, column); /* Column 4 - Ignore Case? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(ALIAS_ICASE)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("I. Case")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(ALIAS_ICASE), NULL); gtk_tree_view_append_column(view, column); /* Column 5 - Substitution */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Substitution")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(ALIAS_SUBSTITUTION), NULL); gtk_tree_view_append_column(view, column); /* Column 6 - Perl Eval? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(ALIAS_PERL_EVAL)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Eval as Perl")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(ALIAS_PERL_EVAL), NULL); gtk_tree_view_append_column(view, column); /* Column 7 - Plugin */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Plugin")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(OBJECT_PLUGIN), NULL); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } static void we_alias_add_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; Alias *alias; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); alias = g_new0(Alias, 1); alias->enabled = 1; if (edit_alias(world, alias)) { world->aliases = g_slist_insert(world->aliases, alias, world->alias_pos); we_alias_insert_alias(world, alias, world->alias_pos++); } else { g_free(alias); } } static void we_alias_edit_cb(GtkButton *button, gpointer data) { /* Note that the Edit button is only active when exactly one row is selected. */ World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Alias *alias; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &alias, -1); if (edit_alias(world, alias)) { we_alias_update_alias(world, alias); } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_alias_delete_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Alias *alias; GSList *aliasitem; GtkWidget *msgdlg; gint n; n = gtk_tree_selection_count_selected_rows(selection); msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(world->dlgEditWorld), n, _("alias"), _("aliases")); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GList *listiter = g_list_last(selected); while (listiter) { gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &alias, -1); aliasitem = g_slist_find(world->aliases, alias); remove_alias(world, aliasitem); listiter = listiter->prev; } } gtk_widget_destroy(msgdlg); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_alias_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { Alias *alias; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &alias, -1); if (edit_alias(world, alias)) { we_alias_update_alias(world, alias); } } } static gboolean edit_alias(World *world, Alias *alias) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditAlias", NULL }; GError *error = NULL; GtkWidget *dlgEditAlias; GtkEntry *txtName; GtkEntry *txtPattern; GtkEntry *txtSubstitution; GtkToggleButton *chkICase; GtkToggleButton *chkPerlEval; GtkToggleButton *chkEnabled; const gchar *newname; const gchar *newpattern; const gchar *newsubstitution; gboolean newicase; gboolean need_recompute = FALSE; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return FALSE; } dlgEditAlias = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditAlias")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditAlias), GTK_RESPONSE_OK); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtAliasName")); txtPattern = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtAliasPattern")); txtSubstitution = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtAliasSubstitution")); chkICase = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkAliasICase")); chkPerlEval = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkAliasPerlEval")); chkEnabled = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkAliasEnabled")); /* Only display note when editing a plugin's alias */ if (!alias->owner_plugin) { GObject *label; label = gtk_builder_get_object(ui_builder, "lblNoteAlias"); gtk_widget_destroy(GTK_WIDGET(label)); label = gtk_builder_get_object(ui_builder, "lblNoteTextAlias"); gtk_widget_destroy(GTK_WIDGET(label)); } /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ if (alias->name) { gtk_entry_set_text(txtName, alias->name); } if (alias->pattern) { gtk_entry_set_text(txtPattern, alias->pattern); } if (alias->substitution) { gtk_entry_set_text(txtSubstitution, alias->substitution); } gtk_toggle_button_set_active(chkICase, alias->ignore_case); gtk_toggle_button_set_active(chkPerlEval, alias->perl_eval); gtk_toggle_button_set_active(chkEnabled, alias->enabled); /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditAlias); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditAlias)) == GTK_RESPONSE_OK) { /* Validate */ newicase = gtk_toggle_button_get_active(chkICase); newpattern = gtk_entry_get_text(txtPattern); if (strcmp(newpattern, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditAlias), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the pattern.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } newsubstitution = gtk_entry_get_text(txtSubstitution); if (strcmp(newsubstitution, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditAlias), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the substitution.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* Update values */ newname = gtk_entry_get_text(txtName); if (!alias->name || strcmp(newname, alias->name) != 0) { g_free(alias->name); if (strcmp(newname, "") != 0) { alias->name = g_strdup(newname); } else { alias->name = NULL; } } if (!alias->pattern || strcmp(newpattern, alias->pattern) != 0) { g_free(alias->pattern); alias->pattern = g_strdup(newpattern); need_recompute = TRUE; } if (!alias->substitution || strcmp(newsubstitution, alias->substitution) != 0) { g_free(alias->substitution); alias->substitution = g_strdup(newsubstitution); } if (alias->ignore_case != newicase) { need_recompute = TRUE; } alias->ignore_case = newicase; alias->perl_eval = gtk_toggle_button_get_active(chkPerlEval); alias->enabled = gtk_toggle_button_get_active(chkEnabled); if (need_recompute && world->perl_interpreter) { GRAB_PERL(world); if (alias->pattern_re) { SvREFCNT_dec(alias->pattern_re); } alias->pattern_re = precompute_re(alias->pattern, FALSE); RELEASE_PERL(world); } /* We've finished successfully */ gtk_widget_destroy(dlgEditAlias); return TRUE; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditAlias); return FALSE; } } } static gboolean we_alias_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_KEY_Delete || evt->keyval == GDK_KEY_KP_Delete) { we_alias_delete_cb(NULL, widget); return TRUE; } return FALSE; } static void we_alias_move_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; World *world; gboolean is_up; gint new_pos; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Alias *alias; gint pos; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &alias, -1); pos = g_slist_index(world->aliases, alias); new_pos = pos; if (is_up) { if (pos != 0) { new_pos = pos - 1; move_alias(world, pos, new_pos); } } else { if (pos != world->alias_pos - 1) { new_pos = pos + 1; move_alias(world, pos, new_pos); } } /* Reselect the moved item */ gtk_tree_model_iter_nth_child(model, &iter, NULL, new_pos); gtk_tree_selection_select_iter(selection, &iter); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } void we_alias_update_alias(World *world, Alias *alias_arg) { /* Called by the Perl functions when an alias is changed, so that the display is updated. */ GtkTreeIter iter; GtkTreePath *path; Alias *alias; gboolean success; if (!world->alias_model) { return; } success = gtk_tree_model_get_iter_first(world->alias_model, &iter); while (success) { gtk_tree_model_get(world->alias_model, &iter, WE_GUIED_POINTER, &alias, -1); if (alias == alias_arg) { path = gtk_tree_model_get_path(world->alias_model, &iter); gtk_tree_model_row_changed(world->alias_model, path, &iter); gtk_tree_path_free(path); return; } success = gtk_tree_model_iter_next(world->alias_model, &iter); } } void we_alias_insert_alias(World *world, Alias *alias, gint pos) { /* Called by the Perl functions when an alias is inserted, so that the display is updated. */ GtkTreeIter iter; if (!world->alias_model) { return; } gtk_list_store_insert(GTK_LIST_STORE(world->alias_model), &iter, pos); gtk_list_store_set(GTK_LIST_STORE(world->alias_model), &iter, WE_GUIED_POINTER, alias, -1); } void we_alias_delete_alias(World *world, Alias *alias_arg) { /* Called by the Perl functions when an alias is deleted, so that the display is updated. */ GtkTreeIter iter; Alias *alias; gboolean success; if (!world->alias_model) { return; } success = gtk_tree_model_get_iter_first(world->alias_model, &iter); while (success) { gtk_tree_model_get(world->alias_model, &iter, WE_GUIED_POINTER, &alias, -1); if (alias == alias_arg) { gtk_list_store_remove(GTK_LIST_STORE(world->alias_model), &iter); return; } success = gtk_tree_model_iter_next(world->alias_model, &iter); } } kildclient-3.0.0/src/perlscript.c0000644000175000017500000024242012375455544013721 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "libintl-wrapper.h" #include #include #include /* Perl includes */ #include #include #include #include "kildclient.h" #include "ansi.h" #include "perlscript.h" #include "net.h" /***************** * Useful macros * *****************/ #define FETCHWORLDVARS World *world #define FETCHWORLDVARSFULL HV *self; \ World *world #define FETCHWORLD if (!(world = fetch_world(items, ST(0), NULL))) { \ XSRETURN_EMPTY; \ } #define FETCHWORLDFULL if (!(world = fetch_world(items, ST(0), &self))) { \ XSRETURN_EMPTY; \ } /*********************** * Function prototypes * ***********************/ static GSList *AVtoGSList(AV *array); static SV *create_world_var(World *world); static AV *perl_clone_array(AV *orig); static void perl_copy_array(AV *source, AV *dest); static SV *create_window_var(void); static World *fetch_world(int items, SV *self_ref, HV **self_to_store); static void xs_init(); static int world_name_comparer(const World *world, const char *name); static GSList *get_object_numbers(GSList *list, const char *name, int searchtype); static void fill_highlight(Trigger *trigger, HV *style); /* For dynamic loading of modules */ EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); /****************** * Initialization * ******************/ World *world_for_perl = NULL; /************************* * File global variables * *************************/ static int my_argc_static = 3; static char *my_argv_static[] = { "kildperl", "-MData::Dumper", "-w" }; void init_perl_system(void) { PERL_SYS_INIT(&my_argc_static, &my_argv_static); } void init_perl_script(World *world) { int my_argc; char **my_argv; char *perl_cmds; char *system_plugin_dir; char *user_plugin_dir; SV *world_ref; SV *world_var; SV *window_ref; SV *window_var; my_argv = g_malloc(sizeof(char *) * (my_argc_static + 2)); for (my_argc = 0; my_argc < my_argc_static; ++my_argc) { my_argv[my_argc] = my_argv_static[my_argc]; } my_argv[my_argc++] = g_strdup_printf("-I%s", get_kildclient_installed_file("")); #ifdef __WIN32__ my_argv[my_argc++] = g_strdup_printf("-I%s", get_kildclient_installed_file("perl")); #endif my_argv[my_argc] = g_strdup(get_kildclient_installed_file("kildclient.pl")); #ifndef __WIN32__ user_plugin_dir = g_strdup_printf("%s/plugins", get_kildclient_directory_path()); #else user_plugin_dir = g_strdup_printf("%s\\plugins", get_kildclient_directory_path()); #endif system_plugin_dir = g_strdup(get_kildclient_installed_file("plugins")); perl_cmds = g_strdup_printf("$SIG{__WARN__} = sub {" "$world->echo(\"Perl Warning: $_[0]\");" "};" "__sethelpfile('%s');" "push(@PLUGINDIRS, '%s', '%s')", get_kildclient_installed_file("kildclient.hlp"), system_plugin_dir, user_plugin_dir); g_free(user_plugin_dir); g_free(system_plugin_dir); world->perl_interpreter = perl_alloc(); PERL_SET_CONTEXT(world->perl_interpreter); perl_construct(world->perl_interpreter); perl_parse(world->perl_interpreter, xs_init, my_argc, my_argv, NULL); /* PL_exit_flags |= PERL_EXIT_DESTRUCT_END; */ eval_pv(perl_cmds, TRUE); /* Create $world variable */ world_ref = create_world_var(world); world_var = get_sv("world", TRUE); sv_setsv(world_var, world_ref); /* Create $window variable */ window_ref = create_window_var(); window_var = get_sv("window", TRUE); sv_setsv(window_var, window_ref); g_free(my_argv[my_argc]); g_free(my_argv[my_argc - 1]); #ifdef __WIN32__ g_free(my_argv[my_argc - 2]); #endif g_free(my_argv); g_free(perl_cmds); } static SV * create_world_var(World *world) { /* Currently the hash holds nothing. It's just used to indicate that the function refers to the window. */ HV *world_hash; IV worldptriv; SV *worldptrsv; SV *silentsv; SV *world_ref; HV *world_pkg_stash; world_hash = newHV(); worldptriv = PTR2IV(world); worldptrsv = newSViv(worldptriv); (void) hv_store(world_hash, "WORLDPTR", 8, worldptrsv, 0); silentsv = newSViv(0); (void) hv_store(world_hash, "SILENT", 6, silentsv, 0); world_ref = newRV_noinc((SV *) world_hash); world_pkg_stash = gv_stashpv("World", TRUE); world_ref = sv_bless(world_ref, world_pkg_stash); return world_ref; } static SV * create_window_var(void) { HV *window_hash; SV *window_ref; HV *window_pkg_stash; window_hash = newHV(); window_ref = newRV_noinc((SV *) window_hash); window_pkg_stash = gv_stashpv("Window", TRUE); window_ref = sv_bless(window_ref, window_pkg_stash); return window_ref; } void destruct_perl_script(PerlInterpreter *perl_interpreter) { #ifndef __MINGW32__ /* For some reason, this function crashes under Windows when a World is closed and there is another one open. I don't know how important it is to call this function, but at least the one that frees the resources is called. */ perl_destruct(perl_interpreter); #endif perl_free(perl_interpreter); } void perl_script_import_file(const char *file) { char *cmd = g_strdup_printf("do '%s';", file); eval_pv(cmd, TRUE); g_free(cmd); } int perl_match(const char *line, SV *pattern_re, int *match_start, int *match_end, int substring, AV **matches) { SV *string; SV *re; SV *command; int retval; int start; int end; dSP; /* Set the string in a variable */ string = get_sv("triggerline", TRUE); sv_setpv(string, line); SvUTF8_on(string); /* Set the regexp in a variable */ re = get_sv("_re", TRUE); sv_setsv(re, pattern_re); /* Create the command to run */ command = newSVpvf("$triggerline =~ tr/\\n\\r//d;" "my $target = %d;" "@__M = ($triggerline =~ m\x05$_re\x05);" "my $match = scalar @__M;" "if ($match) {" " unshift(@__M, $triggerline);" "}" "(defined($-[$target]) ? $-[$target] : 0," " defined($+[$target]) ? $+[$target] : 0," " $match);", (substring != -1 ? substring : 0)); /* Run the command */ ENTER; SAVETMPS; PUSHMARK(SP); eval_sv(command, G_ARRAY); SPAGAIN; retval = POPi; end = POPi; start = POPi; if (matches) { if (retval) { AV *M = get_av("__M", 0); *matches = perl_clone_array(M); } else { *matches = NULL; } } PUTBACK; FREETMPS; LEAVE; SvREFCNT_dec(command); if (match_start) { *match_start = start; } if (match_end) { *match_end = end; } return retval; } char * perl_substitute(const char *line, SV *pattern_re, const char *substitution, int perl_eval, int global) { SV *string; SV *re; SV *command; int retval; SV *result; dSP; /* Set the string in a variable */ string = get_sv("aliascmd", TRUE); sv_setpv(string, line); SvUTF8_on(string); /* Set the regexp in a variable */ re = get_sv("_re", TRUE); sv_setsv(re, pattern_re); /* Create the command to run */ command = newSVpvf("$__aliasmatched = ($aliascmd =~ s\x05$_re\x05%s\x05%s%s);", substitution, global ? "g" : "", perl_eval ? "e" : ""); /* Run the command */ ENTER; SAVETMPS; PUSHMARK(SP); eval_sv(command, G_SCALAR); SPAGAIN; retval = POPi; PUTBACK; FREETMPS; LEAVE; SvREFCNT_dec(command); if (retval) { result = get_sv("aliascmd", FALSE); return g_strdup(SvPV_nolen(result)); } else { return NULL; } } SV * precompute_re(const char *re_string, int ignore_case) { SV *re_int; SV *re_new; SV *command; dSP; command = newSVpvf("$_re = qr\x05%s\x05%s;", re_string, ignore_case ? "i" : ""); ENTER; SAVETMPS; PUSHMARK(SP); eval_sv(command, G_SCALAR); SPAGAIN; re_int = POPs; re_new = newSVsv(re_int); PUTBACK; FREETMPS; LEAVE; SvREFCNT_dec(command); return re_new; } void perl_set_arg_array(AV *matches) { AV *args = get_av("_", 0); av_clear(args); perl_copy_array(matches, args); } static AV * perl_clone_array(AV *orig) { AV *clone; int high_elem; high_elem = av_len(orig); clone = newAV(); av_extend(clone, high_elem); perl_copy_array(orig, clone); return clone; } static void perl_copy_array(AV *source, AV *dest) { int i; int highest_elem; highest_elem = av_len(source); for (i = 0; i <= highest_elem; ++i) { SV **val = av_fetch(source, i, 0); if (val) { SvREFCNT_inc(*val); if (!av_store(dest, i, *val)) { SvREFCNT_dec(*val); } } } } void parse_server_data(char *protocol, char *data) { SV *serverdataSV; SV *command; dSP; /* Set the string in a variable */ serverdataSV = get_sv("_serverdata", TRUE); sv_setpv(serverdataSV, data); SvUTF8_on(serverdataSV); command = newSVpvf("_parseserverdata(%s)", protocol); /* Run the command */ ENTER; SAVETMPS; PUSHMARK(SP); eval_sv(command, G_VOID); SPAGAIN; PUTBACK; FREETMPS; LEAVE; SvREFCNT_dec(command); } static GSList * AVtoGSList(AV *array) { GSList *list = NULL; int i; int max; SV **element; /* max is the highest index number of the array */ max = av_len(array); for (i = 0; i <= max; ++i) { element = av_fetch(array, i, FALSE); if (element) { list = g_slist_append(list, g_strdup(SvPV_nolen(*element))); } } return list; } void menu_perl_run_cb(GtkWidget *widget, gpointer data) { char *cmd = (char *) data; int page_num; page_num = get_focused_world(); currentWorld = (World *) g_list_nth_data(open_worlds, page_num); world_for_perl = currentWorld; GRAB_PERL(world_for_perl); eval_pv(cmd, TRUE); RELEASE_PERL(world_for_perl); } static World *fetch_world(int items, SV *self_ref, HV **self_to_store) { SV *self_def; HV *self; SV **worldptrsv; World *world; if (!items || !SvROK(self_ref) || !sv_isa(self_ref, "World")) { warn(_("Invalid function call: syntax is $world->FUNCTION")); return NULL; } self_def = SvRV(self_ref); if (SvTYPE(self_def) != SVt_PVHV) { warn(_("Invalid function call: syntax is $world->FUNCTION")); return NULL; } self = (HV*) self_def; worldptrsv = hv_fetch(self, "WORLDPTR", 8, FALSE); if (!worldptrsv) { warn(_("Invalid function call: syntax is $world->FUNCTION")); return NULL; } world = INT2PTR(World *, SvIV(*worldptrsv)); if (self_to_store) { *self_to_store = self; } return world; } static void XS_getclientname(pTHX_ CV *perlcv) { dMARK; dAX; XST_mPV(0, CLIENT_NAME); XSRETURN(1); } static void XS_getversion(pTHX_ CV *perlcv) { dMARK; dAX; XST_mPV(0, PACKAGE_VERSION); XSRETURN(1); } static void XS_quit(pTHX_ CV *perlcv) { dMARK; dAX; if (confirm_quit()) { gtk_main_quit(); } XSRETURN_EMPTY; } static void XS_dc(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* We don't call the function directly because disconnect_world can destroy the Perl interpreter if another world is loaded, and this would cause a segfault in the function that evaluates Perl commands. */ g_idle_add(disconnect_world_idle, world); XSRETURN_EMPTY; } static void XS_reconnect(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (world->connected) { g_free(close_connection(world, TRUE)); } /* We don't call the function directly because disconnect_world can destroy the Perl interpreter if another world is loaded, and this would cause a segfault in the function that evaluates Perl commands. */ g_idle_add(reconnect_world, world); XSRETURN_EMPTY; } static void XS_connectother(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (world->connected) { g_free(close_connection(world, TRUE)); } /* We don't call the function directly because disconnect_world can destroy the Perl interpreter if another world is loaded, and this would cause a segfault in the function that evaluates Perl commands. */ g_idle_add(connect_another, world); XSRETURN_EMPTY; } static void XS_window_minimize(pTHX_ CV *perlcv) { dMARK; dAX; gtk_window_iconify(GTK_WINDOW(wndMain)); XSRETURN_EMPTY; } static void XS_window_getsize(pTHX_ CV *perlcv) { guint cols = 0; guint lines = 0; dMARK; dAX; ansitextview_get_size(world_for_perl->gui, &lines, &cols); XST_mIV(1, cols); XST_mIV(0, lines); XSRETURN(2); } static void XS_window_settitle(pTHX_ CV *perlcv) { dXSARGS; if (items == 1) { warn(_("%s: Too few arguments"), "settitle"); XSRETURN_EMPTY; } gtk_window_set_title(GTK_WINDOW(wndMain), SvPV_nolen(ST(1))); XSRETURN_EMPTY; } static void XS_window_seturgencyhint(pTHX_ CV *perlcv) { dXSARGS; if (items == 1) { warn(_("%s: Too few arguments"), "seturgencyhint"); XSRETURN_EMPTY; } if (globalPrefs.urgency_hint) { gtk_window_set_urgency_hint(GTK_WINDOW(wndMain), SvIV(ST(1))); } XSRETURN_EMPTY; } static void XS_next(pTHX_ CV *perlcv) { int num; int howmany; int n_worlds; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items < 2) { howmany = 1; } else { if (!SvIOK(ST(1))) { warn(_("%s: Argument must be numeric"), "next"); XSRETURN_EMPTY; } else { howmany = SvIV(ST(1)); } } num = g_list_index(open_worlds, world); num += howmany; n_worlds = g_list_length(open_worlds); if (num >= 0) { num %= n_worlds; } else { while (num < 0) { num += n_worlds; } } set_focused_world(num); XSRETURN_EMPTY; } static void XS_gotow(pTHX_ CV *perlcv) { int num; GList *worldpos; dXSARGS; if (items < 1) { warn(_("%s: Too few arguments"), "gotow"); XSRETURN_EMPTY; } else { if (SvIOK(ST(0))) { num = SvIV(ST(0)); } else { worldpos = g_list_find_custom(open_worlds, SvPV_nolen(ST(0)), (GCompareFunc) world_name_comparer); num = g_list_position(open_worlds, worldpos); } } if (num < 0 || num >= g_list_length(open_worlds)) { warn(_("%s: No such world"), "gotow"); XSRETURN_EMPTY; } set_focused_world(num); XSRETURN_EMPTY; } static void XS_getworld(pTHX_ CV *perlcv) { GList *worldpos; SV *world_ref; dXSARGS; if (items < 1) { warn(_("%s: Too few arguments"), "getworld"); XSRETURN_UNDEF; } else { if (SvIOK(ST(0))) { worldpos = g_list_nth(open_worlds, SvIV(ST(0))); } else { worldpos = g_list_find_custom(open_worlds, SvPV_nolen(ST(0)), (GCompareFunc) world_name_comparer); } } if (!worldpos) { warn(_("%s: No such world"), "getworld"); XSRETURN_UNDEF; } world_ref = create_world_var((World *) worldpos->data); ST(0) = world_ref; XSRETURN(1); } static int world_name_comparer(const World *world, const char *name) { return strcmp(world->name, name); } static void XS_save(pTHX_ CV *perlcv) { gboolean dummy; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (!world->file) { if (!edit_world(&world, GTK_WINDOW(wndMain), &dummy, TRUE)) XSRETURN_EMPTY; } save_world_to_file(world); save_permanent_variables(world); ansitextview_append_string_nl(world->gui, _("World saved.")); XSRETURN_EMPTY; } static void XS_close(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* We don't call the function directly because remove_world can destroy the Perl interpreter if another world is loaded, and this would cause a segfault in the function that evaluates Perl commands. */ g_idle_add((GSourceFunc) remove_world_timer, world); XSRETURN_EMPTY; } static void XS_getname(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* And now return the current value */ XST_mPV(0, world->name); XSRETURN(1); } static void XS_getcharacter(pTHX_ CV *perlcv) { GtkTreePath *path; GtkTreeIter iter; gchar *character = NULL; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (world->character_used == NULL || world->connection_style == NONE) { XSRETURN_UNDEF; } path = gtk_tree_row_reference_get_path(world->character_used); if (!path) { gtk_tree_row_reference_free(world->character_used); world->character_used = NULL; XSRETURN_UNDEF; } gtk_tree_model_get_iter(world->logon_characters, &iter, path); gtk_tree_model_get(world->logon_characters, &iter, LOGON_CHAR, &character, -1); XST_mPV(0, character); g_free(character); gtk_tree_path_free(path); XSRETURN(1); } static void XS_getmainfont(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* And now return the current value */ XST_mPV(0, world->terminalfont); XSRETURN(1); } static void XS_getentryfont(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* And now return the current value */ XST_mPV(0, world->entryfont); XSRETURN(1); } static void XS_commandecho(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* If there is an argument, set the option */ if (items == 2) { world->cmd_echo = SvIV(ST(1)); } /* And now return the current value */ XST_mIV(0, world->cmd_echo); XSRETURN(1); } static void XS_cmdseparator(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* If there is an argument, set the option */ if (items == 2) { g_strlcpy(world->command_separator, SvPV_nolen(ST(1)), sizeof(world->command_separator)); } /* And now return the current value */ XST_mPV(0, world->command_separator); XSRETURN(1); } static void XS_getconntime(pTHX_ CV *perlcv) { time_t now; FETCHWORLDVARS; dXSARGS; FETCHWORLD; now = time(NULL); XST_mNV(0, difftime(now, world->connected_time)); XSRETURN(1); } static void XS_getidletime(pTHX_ CV *perlcv) { time_t now; FETCHWORLDVARS; dXSARGS; FETCHWORLD; now = time(NULL); XST_mNV(0, difftime(now, world->last_command_time)); XSRETURN(1); } static void XS_echo(pTHX_ CV *perlcv) { int i; char *word; STRLEN len; FETCHWORLDVARS; dXSARGS; FETCHWORLD; for (i = 1; i < items; ++i) { word = SvPV(ST(i), len); if (world && world->gui->txtView) { AnsiParseOperation *operation = g_new(AnsiParseOperation, 1); operation->action = APPEND_ECHOED_LINE; operation->line.line = g_strdup(word); operation->line.line_len = len; queue_ansiparse_operation(world, operation); } else { puts(word); } } XSRETURN_EMPTY; } static void XS_send(pTHX_ CV *perlcv) { int i; char *word; STRLEN len; FETCHWORLDVARS; dXSARGS; FETCHWORLD; for (i = 1; i < items; ++i) { word = SvPV(ST(i), len); send_to_world(world, word, len); } XSRETURN_EMPTY; } static void XS__mlsend(pTHX_ CV *perlcv) { HV *attributes; SV **value; AV *AVinitialtext = NULL; AV *AVfinaltext = NULL; char *file = NULL; gdouble delay; MLSendData *mlcontext; FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* Check argument */ if (items < 2) { warn(_("%s: This is an internal function, do not call directly."), "_mlsend"); XSRETURN_UNDEF; } if (!SvROK(ST(1)) || SvTYPE(SvRV(ST(1))) != SVt_PVHV) { warn(_("%s: Wrong argument type"), "_mlsend"); XSRETURN_EMPTY; } /* Fetch attributes */ attributes = (HV *) SvRV(ST(1)); /* See if everthing is alright before starting to allocate memory */ value = hv_fetch(attributes, "initialtext", 11, FALSE); if (value) { if (!SvROK(*value) || SvTYPE(SvRV(*value)) != SVt_PVAV) { warn(_("%s: This is an internal function, do not call directly."), "_mlsend"); XSRETURN_EMPTY; } else { AVinitialtext = (AV *) SvRV(*value); } } value = hv_fetch(attributes, "finaltext", 9, FALSE); if (value) { if (!SvROK(*value) || SvTYPE(SvRV(*value)) != SVt_PVAV) { warn(_("%s: This is an internal function, do not call directly."), "_mlsend"); XSRETURN_EMPTY; } else { AVfinaltext = (AV *) SvRV(*value); } } value = hv_fetch(attributes, "file", 4, FALSE); if (value) { FILE *fp; file = SvPV_nolen(*value); /* See if file can be read */ if ((fp = fopen(file, "r")) == NULL) { XSRETURN_NO; } fclose(fp); } /* No problems - let's prepare the structure for ML Send. */ mlcontext = calloc(1, sizeof(MLSendData)); mlcontext->state = ML_TRY_INITIALLINES; mlcontext->world = world; if (AVinitialtext) { mlcontext->linesInitial = AVtoGSList(AVinitialtext); } if (AVfinaltext) { mlcontext->linesFinal = AVtoGSList(AVfinaltext); } if (file) { mlcontext->file = g_strdup(file); } /* Fetch other attributes */ value = hv_fetch(attributes, "linestart", 9, FALSE); if (value) { mlcontext->textStart = g_strdup(SvPV_nolen(*value)); } else { mlcontext->textStart = g_strdup(""); } value = hv_fetch(attributes, "lineend", 7, FALSE); if (value) { mlcontext->textEnd = g_strdup(SvPV_nolen(*value)); } else { mlcontext->textEnd = g_strdup(""); } value = hv_fetch(attributes, "delay", 5, FALSE); if (value) { delay = SvNV(*value); } else { delay = globalPrefs.multi_cmd_delay; } value = hv_fetch(attributes, "linesatime", 10, FALSE); if (value) { mlcontext->linesatime = SvIV(*value); } else { mlcontext->linesatime = globalPrefs.multi_cmd_group_size; } do_multi_line_send(mlcontext, delay); XSRETURN_YES; } static void XS_interpret(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { warn(_("%s: Too few arguments"), "interpret"); XSRETURN_EMPTY; } parse_commands(world, SvPV_nolen(ST(1))); XSRETURN_EMPTY; } static void XS_getline(pTHX_ CV *perlcv) { int line; int last_line; GtkTextIter start_iter; GtkTextIter end_iter; gchar *text; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { warn(_("%s: Too few arguments"), "getline"); XSRETURN_EMPTY; } line = SvIV(ST(1)); last_line = gtk_text_buffer_get_line_count(world->gui->txtBuffer); if (line < 0) { /* Negative: nth line from the bottom */ line = last_line - (-line) - 1; } else { /* Positive: line number */ line = line - world->deleted_lines - 1; if (line > last_line) { XSRETURN_EMPTY; } } if (line < 0) { XSRETURN_EMPTY; } gtk_text_buffer_get_iter_at_line(world->gui->txtBuffer, &start_iter, line); end_iter = start_iter; gtk_text_iter_forward_to_line_end(&end_iter); text = gtk_text_buffer_get_text(world->gui->txtBuffer, &start_iter, &end_iter, FALSE); XST_mPV(0, text); g_free(text); if (GIMME_V == G_ARRAY) { XST_mIV(1, k_circular_queue_nth(world->gui->line_times, time_t, line)); XSRETURN(2); } else { XSRETURN(1); } } static void XS__sendserverdata(pTHX_ CV *perlcv) { char *protocol; char *data; STRLEN len; unsigned char telnet_code[3]; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items < 3) { warn(_("%s: This is an internal function, do not call directly."), "_sendserverdata"); XSRETURN_EMPTY; } protocol = SvPV_nolen(ST(1)); data = SvPV(ST(2), len); if (strcmp(protocol, "GMCP") == 0) { if (!world->gmcp_enabled) { warn(_("Protocol %s not enabled."), protocol); XSRETURN_EMPTY; } telnet_code[2] = TELNET_OPT_GMCP; } else if (strcmp(protocol, "MSDP") == 0) { if (!world->msdp_enabled) { warn(_("Protocol %s not enabled."), protocol); XSRETURN_EMPTY; } telnet_code[2] = TELNET_OPT_MSDP; } else { warn(_("Unknown protocol")); XSRETURN_EMPTY; } telnet_code[0] = TELNET_IAC; telnet_code[1] = TELNET_SB; kc_send(world, telnet_code, 3); kc_send(world, data, len); /* telnet_code[0] = TELNET_IAC; - Already set */ telnet_code[1] = TELNET_SE; kc_send(world, telnet_code, 2); XSRETURN_EMPTY; } static void XS_play(pTHX_ CV *perlcv) { dXSARGS; if (items == 0) { warn(_("%s: Too few arguments"), "play"); XSRETURN_EMPTY; } play_sound(SvPV_nolen(ST(0))); XSRETURN_EMPTY; } static void XS_stripansi(pTHX_ CV *perlcv) { char *original; STRLEN len; char *stripped; dXSARGS; if (items == 0) { warn(_("%s: Too few arguments"), "stripansi"); XSRETURN_EMPTY; } original = SvPV(ST(0), len); stripped = strip_ansi(original, len); XST_mPV(0, stripped); g_free(stripped); XSRETURN(1); } static void XS_setstatus(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { warn(_("%s: Too few arguments"), "setstatus"); XSRETURN_EMPTY; } gtk_label_set_text(world->gui->lblStatus, SvPV_nolen(ST(1))); XSRETURN_EMPTY; } static void XS_trigger(pTHX_ CV *perlcv) { int i = -1; int argpos = 1; int have_pattern = 0; int have_action = 0; int need_recompute = 0; HV *attributes; Trigger *trigger; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 2) { warn(_("%s: Too few arguments"), "trigger"); XSRETURN_EMPTY; } /* See if first argument is an integer */ if (SvIOK(ST(1))) { i = SvIV(ST(1)); argpos = 2; if (items < 3) { warn(_("%s: Too few arguments"), "trigger"); XSRETURN_EMPTY; } } if (i == -1) { trigger = new_trigger(); trigger->enabled = 1; /* Starts enabled by default */ if (world->plugins_being_defined) { trigger->owner_plugin = world->plugins_being_defined->data; } } else { trigger = (Trigger *) g_slist_nth_data(world->triggers, i); if (!trigger) { ansitextview_append_string_nl(world->gui, _("No such trigger")); XSRETURN_EMPTY; } } while (argpos < items) { switch (SvTYPE(ST(argpos))) { case SVt_PV: if (!have_pattern) { g_free(trigger->pattern); trigger->pattern = g_strdup(SvPV_nolen(ST(argpos))); need_recompute = TRUE; have_pattern = 1; } else if (!have_action) { g_free(trigger->action); trigger->action = g_strdup(SvPV_nolen(ST(argpos))); have_action = 1; } else { warn(_("%s: Too many string arguments"), "trigger"); if (i == -1) { g_free(trigger); } XSRETURN_EMPTY; } break; case SVt_RV: if (SvTYPE(SvRV(ST(argpos))) == SVt_PVHV) { SV **value; attributes = (HV *) SvRV(ST(argpos)); value = hv_fetch(attributes, "name", 4, FALSE); if (value) { g_free(trigger->name); trigger->name = g_strdup(SvPV_nolen(*value)); } value = hv_fetch(attributes, "pattern", 7, FALSE); if (value) { if (have_pattern) { warn(_("%s: pattern given twice, using the named attribute one"), "trigger"); } g_free(trigger->pattern); trigger->pattern = g_strdup(SvPV_nolen(*value)); need_recompute = TRUE; have_pattern = 1; } value = hv_fetch(attributes, "action", 6, FALSE); if (value) { if (have_action) { warn(_("%s: action given twice, using the named attribute one"), "trigger"); } g_free(trigger->action); trigger->action = g_strdup(SvPV_nolen(*value)); have_action = 1; } value = hv_fetch(attributes, "ignorecase", 10, FALSE); if (value) { int newval = SvIV(*value); need_recompute |= (newval != trigger->ignore_case); trigger->ignore_case = newval; } value = hv_fetch(attributes, "gag", 3, FALSE); if (value) { trigger->gag_output = SvIV(*value); } value = hv_fetch(attributes, "gaglog", 6, FALSE); if (value) { trigger->gag_log = SvIV(*value); } value = hv_fetch(attributes, "enabled", 7, FALSE); if (value) { trigger->enabled = SvIV(*value); } value = hv_fetch(attributes, "keepexecuting", 13, FALSE); if (value) { trigger->keepexecuting = SvIV(*value); } value = hv_fetch(attributes, "rewriter", 8, FALSE); if (value) { trigger->rewriter = SvIV(*value); } value = hv_fetch(attributes, "style", 5, FALSE); if (value) { fill_highlight(trigger, (HV *) SvRV(*value)); } } else { warn(_("%s: Wrong type of reference"), "trigger"); if (i == -1) { g_free(trigger); } XSRETURN_EMPTY; } break; default: warn(_("%s: Wrong argument type"), "trigger"); if (i == -1) { g_free(trigger); } XSRETURN_EMPTY; } ++argpos; } if (i == -1) { if (!have_pattern) { warn(_("%s: pattern not specified, not creating"), "trigger"); if (i == -1) { g_free(trigger); } XSRETURN_EMPTY; } if (!have_action && !trigger->gag_output && !trigger->gag_log) { warn(_("%s: action not specified, and isn't gag, not creating"), "trigger"); if (i == -1) { g_free(trigger); } XSRETURN_EMPTY; } } if (need_recompute) { if (trigger->pattern_re) { SvREFCNT_dec(trigger->pattern_re); } trigger->pattern_re = precompute_re(trigger->pattern, trigger->ignore_case); } is_silent = hv_fetch(self, "SILENT", 6, FALSE); if (i == -1) { if (trigger->owner_plugin) { world->triggers = g_slist_append(world->triggers, trigger); we_trigger_insert_trigger(world, trigger, g_slist_length(world->triggers) - 1); } else { world->triggers = g_slist_insert(world->triggers, trigger, world->trigger_pos); we_trigger_insert_trigger(world, trigger, world->trigger_pos++); if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Trigger added.")); } } } else { if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Trigger modified.")); } we_trigger_update_trigger(world, trigger); } XSRETURN_EMPTY; } static void fill_highlight(Trigger *trigger, HV *style) { SV **value; int ival; value = hv_fetch(style, "enabled", 7, FALSE); if (value) { trigger->highlight = SvIV(*value); } value = hv_fetch(style, "target", 6, FALSE); if (value) { ival = SvIV(*value); if (ival < -1) { warn(_("%s: invalid target"), "trigger"); } else { trigger->high_target = ival; } } value = hv_fetch(style, "fg", 2, FALSE); if (value) { ival = SvIV(*value); if (ival < -1 || ival > ANSI_N_COLORS_HIGHLIGHT) { warn(_("%s: invalid fg color"), "trigger"); } else { trigger->high_fg_color = ival; } } value = hv_fetch(style, "bg", 2, FALSE); if (value) { ival = SvIV(*value); if (ival < -1 || ival > ANSI_N_COLORS_HIGHLIGHT) { warn(_("%s: invalid bg color"), "trigger"); } else { trigger->high_bg_color = ival; } } value = hv_fetch(style, "underline", 9, FALSE); if (value) { ival = SvIV(*value); if (ival < -1 || ival > 2) { warn(_("%s: invalid underline style"), "trigger"); } else { trigger->high_underline = ival; } } value = hv_fetch(style, "italics", 7, FALSE); if (value) { ival = SvIV(*value); if (ival < 0) { trigger->high_italic = -1; } else { /* So that it becomes 0 or 1 */ trigger->high_italic = !!ival; } } value = hv_fetch(style, "strike", 6, FALSE); if (value) { ival = SvIV(*value); if (ival < 0) { trigger->high_strike = -1; } else { /* So that it becomes 0 or 1 */ trigger->high_strike = !!ival; } } } static void XS__listtrigger(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; Trigger *trigger; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { ansitextview_append_string(world->gui, "\n"); list_triggers(world, NULL); XSRETURN_EMPTY; } i = SvIV(ST(1)); trigger = (Trigger *) g_slist_nth_data(world->triggers, i); if (!trigger) { ansitextview_append_string_nl(world->gui, _("No such trigger")); XSRETURN_NO; } ansitextview_append_stringf(world->gui, _("Trigger number %d\n" " Name: %s\n" " Pattern: %s\n" " Action: %s\n" " Enabled: %s\n" " Ignore case: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Keep executing: %s\n" " Rewriter: %s\n" " Change style: %s\n"), i, trigger->name ? trigger->name : _("Not set"), trigger->pattern, trigger->action ? trigger->action : "", trigger->ignore_case ? _("yes") : _("no"), trigger->gag_output ? _("yes") : _("no"), trigger->gag_log ? _("yes") : _("no"), trigger->enabled ? _("yes") : _("no"), trigger->keepexecuting ? _("yes") : _("no"), trigger->rewriter ? _("yes") : _("no"), trigger->highlight ? _("yes") : _("no")); if (trigger->highlight) { ansitextview_append_stringf(world->gui, _(" Target: %d\n" " Foreground: %d\n" " Background: %d\n" " Italics: %d\n" " Striked-thru: %d\n" " Underline: %d\n"), trigger->high_target, trigger->high_fg_color, trigger->high_bg_color, trigger->high_italic, trigger->high_strike, trigger->high_underline); } XSRETURN_YES; } static void XS__deltrigger(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; GSList *triggeritem; FETCHWORLDVARS; dXSARGS; FETCHWORLD; i = SvIV(ST(1)); triggeritem = g_slist_nth(world->triggers, i); if (!triggeritem) { XSRETURN_NO; } remove_trigger(world, triggeritem); XSRETURN_YES; } static void XS__movetrigger(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int old_pos; int new_pos; FETCHWORLDVARS; dXSARGS; FETCHWORLD; old_pos = SvIV(ST(1)); new_pos = SvIV(ST(2)); if (new_pos < 0 || new_pos >= world->trigger_pos) { new_pos = world->trigger_pos - 1; } if (move_trigger(world, old_pos, new_pos)) { XSRETURN_YES; } else { XSRETURN_NO; } } static void XS__getobjectnumber(pTHX_ CV *perlcv) { /* Not to be called by user. Arguments: name to match object type (0: trigger, 1: alias, 2: macro, 3: timer, 4:hook) search type (0: by name, 1: by owner plugin) [optional] hook event name, if we are dealing with a hook */ GSList *tofind = NULL; GSList *found; GSList *iter; int i; int searchtype; FETCHWORLDVARS; dXSARGS; searchtype = SvIV(ST(3)); FETCHWORLD; switch (SvIV(ST(2))) { case 0: tofind = world->triggers; break; case 1: tofind = world->aliases; break; case 2: tofind = world->macros; break; case 3: tofind = world->timers; break; case 4: tofind = get_hook_list_for_reading(world, SvPV_nolen(ST(4)), NULL); if (!tofind) { XSRETURN(0); } break; } found = get_object_numbers(tofind, SvPV_nolen(ST(1)), searchtype); i = 0; iter = found; while (iter) { XST_mIV(i++, GPOINTER_TO_INT(iter->data)); iter = iter->next; } g_slist_free(found); XSRETURN(i); } static void XS__objectenabled(pTHX_ CV *perlcv) { /* Not to be called by user. Arguments: name to match object type (0: trigger, 1: alias, 2: macro, 3: timer, 4:hook) name of object [optional] hook event name, if we are dealing with a hook Returns: TRUE/FALSE if object is enabled. If there are several with the same name, returns a list. */ GSList *tofind = NULL; GeneralObject *obj; int i; int j; int num_to_find; char *name_to_find = NULL; FETCHWORLDVARS; dXSARGS; FETCHWORLD; switch (SvIV(ST(2))) { case 0: tofind = world->triggers; break; case 1: tofind = world->aliases; break; case 2: tofind = world->macros; break; case 3: tofind = world->timers; break; case 4: tofind = get_hook_list_for_reading(world, SvPV_nolen(ST(4)), NULL); if (!tofind) { XSRETURN(0); } break; } if (SvIOK(ST(1))) { num_to_find = SvIV(ST(1)); if (num_to_find < 0) { XSRETURN_EMPTY; } } else { num_to_find = -1; name_to_find = SvPV_nolen(ST(1)); } i = 0; j = 0; while (tofind) { obj = (GeneralObject *) tofind->data; if (num_to_find != -1 && num_to_find == i) { XST_mIV(0, obj->enabled); XSRETURN(1); } if (num_to_find == -1 && obj->name && strcmp(name_to_find, obj->name) == 0) { XST_mIV(j, obj->enabled); ++j; } ++i; tofind = tofind->next; } XSRETURN(j); } static void XS_alias(pTHX_ CV *perlcv) { int i = -1; int argpos = 1; int have_pattern = 0; int have_substitution = 0; int need_recompute = 0; HV *attributes; Alias *alias; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 2) { warn(_("%s: Too few arguments"), "alias"); XSRETURN_EMPTY; } /* See if first argument is an integer */ if (SvIOK(ST(1))) { i = SvIV(ST(1)); argpos = 2; if (items < 3) { warn(_("%s: Too few arguments"), "alias"); XSRETURN_EMPTY; } } if (i == -1) { alias = g_new0(Alias, 1); alias->enabled = 1; /* Starts enabled by default */ if (world->plugins_being_defined) { alias->owner_plugin = world->plugins_being_defined->data; } } else { alias = (Alias *) g_slist_nth_data(world->aliases, i); if (!alias) { ansitextview_append_string_nl(world->gui, _("No such alias")); XSRETURN_EMPTY; } } while (argpos < items) { switch (SvTYPE(ST(argpos))) { case SVt_PV: if (!have_pattern) { g_free(alias->pattern); alias->pattern = g_strdup(SvPV_nolen(ST(argpos))); need_recompute = 1; have_pattern = 1; } else if (!have_substitution) { g_free(alias->substitution); alias->substitution = g_strdup(SvPV_nolen(ST(argpos))); have_substitution = 1; } else { warn(_("%s: Too many string arguments"), "alias"); if (i == -1) { g_free(alias); } XSRETURN_EMPTY; } break; case SVt_RV: if (SvTYPE(SvRV(ST(argpos))) == SVt_PVHV) { SV** value; attributes = (HV *) SvRV(ST(argpos)); value = hv_fetch(attributes, "name", 4, FALSE); if (value) { g_free(alias->name); alias->name = g_strdup(SvPV_nolen(*value)); } value = hv_fetch(attributes, "pattern", 7, FALSE); if (value) { if (have_pattern) { warn(_("%s: pattern given twice, using the named attribute one"), "alias"); } g_free(alias->pattern); alias->pattern = g_strdup(SvPV_nolen(*value)); need_recompute = 1; have_pattern = 1; } value = hv_fetch(attributes, "substitution", 12, FALSE); if (value) { if (have_substitution) { warn(_("%s: substitution given twice, using the named attribute one"), "alias"); } g_free(alias->substitution); alias->substitution = g_strdup(SvPV_nolen(*value)); have_substitution = 1; } value = hv_fetch(attributes, "ignorecase", 10, FALSE); if (value) { int newval = SvIV(*value); need_recompute |= (newval != alias->ignore_case); alias->ignore_case = newval; } value = hv_fetch(attributes, "perleval", 8, FALSE); if (value) { alias->perl_eval = SvIV(*value); } value = hv_fetch(attributes, "enabled", 7, FALSE); if (value) { alias->enabled = SvIV(*value); } } else { warn(_("%s: Wrong type of reference"), "alias"); if (i == -1) { g_free(alias); } XSRETURN_EMPTY; } break; default: warn(_("%s: Wrong argument type"), "alias"); if (i == -1) { g_free(alias); } XSRETURN_EMPTY; } ++argpos; } if (i == -1) { if (!have_pattern) { warn(_("alias: not creating alias without pattern")); if (i == -1) { g_free(alias); } XSRETURN_EMPTY; } if (!have_substitution) { warn(_("alias: not creating alias without substitution")); if (i == -1) { g_free(alias); } XSRETURN_EMPTY; } } if (need_recompute) { if (alias->pattern_re) { SvREFCNT_dec(alias->pattern_re); } alias->pattern_re = precompute_re(alias->pattern, alias->ignore_case); } is_silent = hv_fetch(self, "SILENT", 6, FALSE); if (i == -1) { if (alias->owner_plugin) { world->aliases = g_slist_append(world->aliases, alias); we_alias_insert_alias(world, alias, g_slist_length(world->aliases) - 1); } else { world->aliases = g_slist_insert(world->aliases, alias, world->alias_pos); we_alias_insert_alias(world, alias, world->alias_pos++); if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Alias added.")); } } } else { if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Alias modified.")); } we_alias_update_alias(world, alias); } XSRETURN_EMPTY; } static void XS_expandalias(pTHX_ CV *perlcv) { GSList *aliasptr; Alias *alias; char *line; char *resultline; SV *re; SV *tmp; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { warn(_("%s: Too few arguments"), "expandalias"); XSRETURN_EMPTY; } line = SvPV_nolen(ST(1)); tmp = get_sv("_tmpexpalias", TRUE); sv_setpv(tmp, line); aliasptr = world->aliases; while (aliasptr) { gchar *subcmd; alias = (Alias *) aliasptr->data; if (!alias->enabled) { break; } /* Set the regexp in a variable */ re = get_sv("_re", TRUE); sv_setsv(re, alias->pattern_re); subcmd = g_strdup_printf("$_tmpexpalias =~ s\x05$_re\x05%s\x05%s;", alias->substitution, alias->perl_eval ? "e" : ""); eval_pv(subcmd, TRUE); g_free(subcmd); aliasptr = aliasptr->next; } resultline = SvPV_nolen(tmp); XST_mPV(0, resultline); XSRETURN(1); } static void XS__listalias(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; Alias *alias; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { ansitextview_append_string(world->gui, "\n"); list_aliases(world, NULL); XSRETURN_EMPTY; } i = SvIV(ST(1)); alias = (Alias *) g_slist_nth_data(world->aliases, i); if (!alias) { ansitextview_append_string_nl(world->gui, _("No such alias")); XSRETURN_NO; } ansitextview_append_stringf(world->gui, _("Alias number %d\n" " Name: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Ignore case: %s\n" " Eval as Perl: %s\n" " Enabled: %s\n"), i, alias->name ? alias->name : _("Not set"), alias->pattern, alias->substitution, alias->ignore_case ? _("yes") : _("no"), alias->perl_eval ? _("yes") : _("no"), alias->enabled ? _("yes") : _("no")); XSRETURN_YES; } static void XS__delalias(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; GSList *aliasitem; FETCHWORLDVARS; dXSARGS; FETCHWORLD; i = SvIV(ST(1)); aliasitem = g_slist_nth(world->aliases, i); if (!aliasitem) { XSRETURN_NO; } remove_alias(world, aliasitem); XSRETURN_YES; } static void XS__movealias(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int old_pos; int new_pos; FETCHWORLDVARS; dXSARGS; FETCHWORLD; old_pos = SvIV(ST(1)); new_pos = SvIV(ST(2)); if (new_pos < 0 || new_pos >= world->alias_pos) { new_pos = world->alias_pos - 1; } if (move_alias(world, old_pos, new_pos)) { XSRETURN_YES; } else { XSRETURN_NO; } } static void XS_getkeycode(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; ansitextview_append_string_nl(world->gui, _("Press a key to get its keycode.")); world->print_next_keycode = TRUE; gtk_main(); /* After gtk_main_quit() is called in the event handler... */ XST_mPV(0, world->keycode_to_print); g_free(world->keycode_to_print); XSRETURN(1); } static void XS_macro(pTHX_ CV *perlcv) { int i = -1; int have_key = 0; int have_action = 0; int argpos = 1; HV *attributes; Macro *macro; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 1) { warn(_("%s: Too few arguments"), "macro"); XSRETURN_EMPTY; } /* See if first argument is an integer */ if (SvIOK(ST(1))) { i = SvIV(ST(1)); argpos = 2; if (items < 3) { warn(_("%s: Too few arguments"), "macro"); XSRETURN_EMPTY; } } if (i == -1) { macro = g_new0(Macro, 1); macro->enabled = 1; if (world->plugins_being_defined) { macro->owner_plugin = world->plugins_being_defined->data; } } else { macro = (Macro *) g_slist_nth_data(world->macros, i); if (!macro) { ansitextview_append_string_nl(world->gui, _("macro: No such macro")); XSRETURN_EMPTY; } } while (argpos < items) { switch (SvTYPE(ST(argpos))) { case SVt_PV: if (!have_key) { guint keyval; GdkModifierType modifiers; gtk_accelerator_parse(SvPV_nolen(ST(argpos)), &keyval, &modifiers); if (keyval) { macro->keyval = keyval; macro->modifiers = modifiers; have_key = 1; } else { warn(_("%s: Invalid key code"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } } else if (!have_action) { g_free(macro->action); macro->action = g_strdup(SvPV_nolen(ST(argpos))); have_action = 1; } else { warn(_("%s: Too many string arguments"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } break; case SVt_RV: if (SvTYPE(SvRV(ST(argpos))) == SVt_PVHV) { SV** value; attributes = (HV *) SvRV(ST(argpos)); value = hv_fetch(attributes, "name", 4, FALSE); if (value) { g_free(macro->name); macro->name = g_strdup(SvPV_nolen(*value)); } value = hv_fetch(attributes, "key", 3, FALSE); if (value) { guint keyval; GdkModifierType modifiers; if (have_key) { warn(_("%s: keycode given twice, using the named attribute one"), "macro"); } gtk_accelerator_parse(SvPV_nolen(*value), &keyval, &modifiers); if (keyval) { macro->keyval = keyval; macro->modifiers = modifiers; have_key = 1; } else { warn(_("%s: Invalid key code"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } have_key = 1; } value = hv_fetch(attributes, "action", 6, FALSE); if (value) { if (have_action) { warn(_("%s: action given twice, using the named attribute one"), "macro"); } g_free(macro->action); macro->action = g_strdup(SvPV_nolen(*value)); have_action = 1; } value = hv_fetch(attributes, "enabled", 7, FALSE); if (value) { macro->enabled = SvIV(*value); } } else { warn(_("%s: Wrong type of reference"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } break; default: warn(_("%s: Wrong argument type"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } ++argpos; } /* Verification of required arguments */ if (i == -1 && !have_key) { warn(_("%s: keycode not specified, not creating"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } if (i == -1 && !have_action) { warn(_("%s: action not specified, not creating"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } is_silent = hv_fetch(self, "SILENT", 6, FALSE); if (i == -1) { if (macro->owner_plugin) { world->macros = g_slist_append(world->macros, macro); we_macro_insert_macro(world, macro, g_slist_length(world->macros) - 1); } else { world->macros = g_slist_insert(world->macros, macro, world->macro_pos); we_macro_insert_macro(world, macro, world->macro_pos++); if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Macro added.")); } } } else { if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Macro modified.")); } we_macro_update_macro(world, macro); } XSRETURN_EMPTY; } static void XS__listmacro(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; Macro *macro; char *keycodestr; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { ansitextview_append_string(world->gui, "\n"); list_macros(world, NULL); XSRETURN_EMPTY; } i = SvIV(ST(1)); macro = (Macro *) g_slist_nth_data(world->macros, i); if (!macro) { ansitextview_append_string_nl(world->gui, _("No such macro")); XSRETURN_NO; } keycodestr = gtk_accelerator_name(macro->keyval, macro->modifiers); ansitextview_append_stringf(world->gui, _("Macro number %d\n" " Name: %s\n" " Key Code: %s\n" " Action: %s\n" " Enabled: %s\n"), i, macro->name ? macro->name : _("Not set"), keycodestr, macro->action, macro->enabled ? _("yes") : _("no")); g_free(keycodestr); XSRETURN_YES; } static void XS__delmacro(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; GSList *macroitem; FETCHWORLDVARS; dXSARGS; FETCHWORLD; i = SvIV(ST(1)); macroitem = g_slist_nth(world->macros, i); if (!macroitem) { XSRETURN_NO; } remove_macro(world, macroitem); XSRETURN_YES; } static void XS__movemacro(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int old_pos; int new_pos; FETCHWORLDVARS; dXSARGS; FETCHWORLD; old_pos = SvIV(ST(1)); new_pos = SvIV(ST(2)); if (new_pos < 0 || new_pos >= world->macro_pos) { new_pos = world->macro_pos - 1; } if (move_macro(world, old_pos, new_pos)) { XSRETURN_YES; } else { XSRETURN_NO; } } static void XS_timer(pTHX_ CV *perlcv) { int i = -1; int argpos = 1; gdouble new_interval = 0; int new_enabled = -999; HV *attributes; SV **value; Timer *timer; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 2) { warn(_("%s: Too few arguments"), "timer"); XSRETURN_EMPTY; } /* See if first argument is an integer */ if (SvIOK(ST(1))) { i = SvIV(ST(1)); argpos = 2; if (items < 3) { warn(_("%s: Too few arguments"), "timer"); XSRETURN_EMPTY; } } if (i == -1) { timer = g_new0(Timer, 1); timer->for_world = world; timer->count = -1; if (world->plugins_being_defined) { timer->owner_plugin = world->plugins_being_defined->data; } } else { timer = (Timer *) g_slist_nth_data(world->timers, i); if (!timer) { ansitextview_append_string_nl(world->gui, _("timer: No such timer")); XSRETURN_EMPTY; } } if (!SvROK(ST(argpos)) || SvTYPE(SvRV(ST(argpos))) != SVt_PVHV) { warn(_("%s: Wrong argument type"), "timer"); if (i == -1) { g_free(timer); } XSRETURN_EMPTY; } /* Fetch attributes */ attributes = (HV *) SvRV(ST(argpos)); value = hv_fetch(attributes, "name", 4, FALSE); if (value) { g_free(timer->name); timer->name = g_strdup(SvPV_nolen(*value)); } value = hv_fetch(attributes, "interval", 8, FALSE); if (value) { if (!SvNIOK(*value)) { warn(_("%s: interval must be numeric"), "timer"); if (i == -1) { g_free(timer); } XSRETURN_EMPTY; } new_interval = SvNV(*value); } value = hv_fetch(attributes, "count", 5, FALSE); if (value) { if (!SvIOK(*value)) { warn(_("%s: count must be numeric"), "timer"); if (i == -1) { g_free(timer); } XSRETURN_EMPTY; } timer->count = SvIV(*value); if (timer->count < 0) { timer->count = -1; } } value = hv_fetch(attributes, "action", 6, FALSE); if (value) { g_free(timer->action); timer->action = g_strdup(SvPV_nolen(*value)); } value = hv_fetch(attributes, "temporary", 9, FALSE); if (value) { timer->temporary = SvIV(*value); } value = hv_fetch(attributes, "enabled", 7, FALSE); if (value) { new_enabled = SvIV(*value); } /* Verification of required arguments */ if (new_interval == 0 && i == -1) { warn(_("%s: interval not specified, not creating"), "timer"); if (i == -1) { g_free(timer); } XSRETURN_EMPTY; } if (new_interval < 0) { warn(_("%s: cannot create timer with negative interval"), "timer"); if (i == -1) { g_free(timer); } XSRETURN_EMPTY; } /* Recreate timer function if interval is changed */ if (i != -1 && new_enabled == -999 && new_interval && new_interval != timer->interval) { g_source_remove(timer->function_id); timer->function_id = g_timeout_add(new_interval * 1000, run_timer, timer); } if (new_interval) { timer->interval = new_interval; } if (!timer->action) { warn(_("%s: action not specified, not creating"), "timer"); if (i == -1) { g_free(timer); } XSRETURN_EMPTY; } /* See if we are enabling or disabling */ if (i == -1 && new_enabled == -999) { /* New timers enabled */ new_enabled = 1; /* by default */ } if (new_enabled != -999) { if (timer->enabled && !new_enabled) { g_source_remove(timer->function_id); } else if (!timer->enabled && new_enabled) { timer->function_id = g_timeout_add(timer->interval * 1000, run_timer, timer); } } timer->enabled = new_enabled; /* A little bonus :-) */ if (timer->enabled && timer->count == 0) { timer->count = 1; } is_silent = hv_fetch(self, "SILENT", 6, FALSE); if (i == -1) { if (timer->owner_plugin) { world->timers = g_slist_append(world->timers, timer); we_timer_insert_timer(world, timer, g_slist_length(world->timers) - 1); } else { world->timers = g_slist_insert(world->timers, timer, world->timer_pos); we_timer_insert_timer(world, timer, world->timer_pos++); if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Timer added.")); } } } else { if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Timer modified.")); } we_timer_update_timer(world, timer); } XSRETURN_EMPTY; } static void XS__listtimer(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; Timer *timer; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { ansitextview_append_string(world->gui, "\n"); list_timers(world, NULL); XSRETURN_EMPTY; } i = SvIV(ST(1)); timer = (Timer *) g_slist_nth_data(world->timers, i); if (!timer) { ansitextview_append_string_nl(world->gui, _("No such timer")); XSRETURN_NO; } ansitextview_append_stringf(world->gui, _("Timer number %d\n" " Name: %s\n" " Interval: %.3f\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n"), i, timer->name ? timer->name : _("Not set"), timer->interval, timer->count, timer->action, timer->enabled ? _("yes") : _("no"), timer->temporary ? _("yes") : _("no")); XSRETURN_YES; } static void XS__deltimer(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; GSList *timeritem; FETCHWORLDVARS; dXSARGS; FETCHWORLD; i = SvIV(ST(1)); timeritem = g_slist_nth(world->timers, i); if (!timeritem) { XSRETURN_NO; } remove_timer(world, timeritem); XSRETURN_YES; } static void XS__movetimer(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int old_pos; int new_pos; FETCHWORLDVARS; dXSARGS; FETCHWORLD; old_pos = SvIV(ST(1)); new_pos = SvIV(ST(2)); if (new_pos < 0 || new_pos >= world->timer_pos) { new_pos = world->timer_pos - 1; } if (move_timer(world, old_pos, new_pos)) { XSRETURN_YES; } else { XSRETURN_NO; } } static void XS_makepermanent(pTHX_ CV *perlcv) { char *var; int i; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 2) { warn(_("%s: Too few arguments"), "makepermanent"); XSRETURN_EMPTY; } is_silent = hv_fetch(self, "SILENT", 6, FALSE); for (i = 1; i < items; ++i) { var = SvPV_nolen(ST(i)); if (var[0] != '$' && var[0] != '@' && var[0] != '%') { warn(_("%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent"), "makepermanent"); continue; } if (g_slist_find_custom(world->permanent_variables, var, (GCompareFunc) strcmp)) { if (!world->plugins_being_defined) { warn(_("%s: %s is already permanent"), "makepermanent", var); } continue; } var = g_strdup(var); world->permanent_variables = g_slist_append(world->permanent_variables, var); we_var_insert_var(world, var, -1); if (!world->plugins_being_defined && (!is_silent || !SvIV(*is_silent))) { ansitextview_append_stringf(world->gui, _("%s: Variable '%s' made permanent.\n"), "makepermanent", var); } } XSRETURN_EMPTY; } static void XS_maketemporary(pTHX_ CV *perlcv) { char *var; int i; GSList *list; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 2) { warn(_("%s: Too few arguments"), "maketemporary"); XSRETURN_EMPTY; } is_silent = hv_fetch(self, "SILENT", 6, FALSE); for (i = 1; i < items; ++i) { var = SvPV_nolen(ST(i)); list = g_slist_find_custom(world->permanent_variables, var, (GCompareFunc) strcmp); if (list) { we_var_delete_var(world, (const gchar *) list->data); g_free(list->data); world->permanent_variables = g_slist_delete_link(world->permanent_variables, list); if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_stringf(world->gui, _("%s: Variable '%s' made temporary.\n"), "maketemporary", var); } } else { warn(_("%s: %s is not permanent"), "maketemporary", var); continue; } } XSRETURN_EMPTY; } static void XS_ispermanent(pTHX_ CV *perlcv) { char *var; GSList *list; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 2) { warn(_("%s: Too few arguments"), "ispermanent"); XSRETURN_EMPTY; } var = SvPV_nolen(ST(1)); list = g_slist_find_custom(world->permanent_variables, var, (GCompareFunc) strcmp); if (list) { XST_mIV(0, TRUE); } else { XST_mIV(0, FALSE); } XSRETURN(1); } static void XS_listpermanent(pTHX_ CV *perlcv) { GSList *var; FETCHWORLDVARS; dXSARGS; FETCHWORLD; ansitextview_append_string(world->gui, "\n"); ansitextview_append_string_nl(world->gui, _("Permanent variables")); ansitextview_append_string_nl(world->gui, "-------------------"); var = world->permanent_variables; while (var) { ansitextview_append_string(world->gui, " "); ansitextview_append_string_nl(world->gui, (char *) var->data); var = var->next; } XSRETURN_EMPTY; } static void XS_hook(pTHX_ CV *perlcv) { int i = -1; char *hook = NULL; int argpos = 2; int have_action = 0; char *action = NULL; char *name = NULL; int enabled = 1; HV *attributes; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 3) { warn(_("%s: Too few arguments"), "hook"); XSRETURN_EMPTY; } hook = SvPV_nolen(ST(1)); /* See if first argument is an integer */ if (SvIOK(ST(2))) { i = SvIV(ST(2)); argpos = 3; if (items < 4) { warn(_("%s: Too few arguments"), "hook"); XSRETURN_EMPTY; } } while (argpos < items) { switch (SvTYPE(ST(argpos))) { case SVt_PV: if (!have_action) { action = g_strdup(SvPV_nolen(ST(argpos))); have_action = 1; } else { warn(_("%s: Too many string arguments"), "hook"); g_free(action); XSRETURN_EMPTY; } break; case SVt_RV: if (SvTYPE(SvRV(ST(argpos))) == SVt_PVHV) { SV** value; attributes = (HV *) SvRV(ST(argpos)); value = hv_fetch(attributes, "name", 4, FALSE); if (value) { name = g_strdup(SvPV_nolen(*value)); } value = hv_fetch(attributes, "action", 6, FALSE); if (value) { if (have_action) { warn(_("%s: action given twice, using the named attribute one"), "hook"); g_free(action); } action = g_strdup(SvPV_nolen(*value)); have_action = 1; } value = hv_fetch(attributes, "enabled", 7, FALSE); if (value) { enabled = SvIV(*value); } } else { warn(_("%s: Wrong type of reference"), "hook"); g_free(action); g_free(name); XSRETURN_EMPTY; } break; default: warn(_("%s: Wrong argument type"), "hook"); g_free(action); g_free(name); XSRETURN_EMPTY; } ++argpos; } is_silent = hv_fetch(self, "SILENT", 6, FALSE); if (connect_hook(world, hook, i, action, name, enabled)) { if (i == -1) { if (!world->plugins_being_defined && (!is_silent || !SvIV(*is_silent))) { ansitextview_append_string_nl(world->gui, _("Hook defined.")); } } else { if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Hook modified.")); } } } XSRETURN_EMPTY; } static void XS__listhook(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items < 2) { warn(_("%s: Too few arguments"), "listhook"); XSRETURN_EMPTY; } if (items == 2) { ansitextview_append_string(world->gui, "\n"); list_hooks(world, SvPV_nolen(ST(1)), NULL); XSRETURN_EMPTY; } i = SvIV(ST(2)); list_hook(world, SvPV_nolen(ST(1)), i); XSRETURN_EMPTY; } static void XS__delhook(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; char *hookname; FETCHWORLDVARS; dXSARGS; FETCHWORLD; hookname = SvPV_nolen(ST(1)); i = SvIV(ST(2)); if (delete_hook(world, hookname, i, NULL)) { XSRETURN_YES; } else { XSRETURN_NO; } } static void XS__movehook(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ char *hookname; int old_pos; int new_pos; FETCHWORLDVARS; dXSARGS; FETCHWORLD; hookname = SvPV_nolen(ST(1)); old_pos = SvIV(ST(2)); new_pos = SvIV(ST(3)); if (move_hook(world, hookname, old_pos, new_pos)) { XSRETURN_YES; } else { XSRETURN_NO; } } static void XS_logfile(pTHX_ CV *perlcv) { char *tmp; char *errmsg = NULL; FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* This will be overwritten if there are two arguments. */ world->log_add_time = FALSE; /* If logging is started, it must be finished to start again in the new file and/or with the new format. */ if (world->log_file) { stop_log(world); } switch (items) { case 1: ansitextview_append_string_nl(world->gui, _("Logging stopped.")); break; case 3: world->log_add_time = TRUE; tmp = SvPV_nolen(ST(2)); g_free(world->log_timeformat); world->log_timeformat = g_strdup(tmp); /* FALL THROUGH */ case 2: tmp = SvPV_nolen(ST(1)); g_free(world->log_file_name); world->log_file_name = g_strdup(tmp); if (start_log(world, 0, &errmsg)) { ansitextview_append_stringf(world->gui, _("Logging to file %s.\n"), world->log_actual_file); } else { ansitextview_append_string_nl(world->gui, errmsg); g_free(errmsg); } break; } fill_we_logging_tab(world, NULL); XSRETURN_EMPTY; } static void XS_getlogfile(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (world->log_file) { XST_mPV(0, world->log_actual_file); XSRETURN(1); } else { XSRETURN_UNDEF; } } static void XS__writetolog(pTHX_ CV *perlcv) { /* This function simply writes the line, with color codes and ANSI codes, if present. It is not meant to be called by the user. */ char *line; int i; FETCHWORLDVARS; dXSARGS; FETCHWORLD; for (i = 1; i < items; ++i) { line = SvPV_nolen(ST(i)); write_log_line(world, line, NULL); } XSRETURN_EMPTY; } static GSList * get_object_numbers(GSList *list, const char *name, int searchtype) { /* To avoid the need of four virtually equal functions, for triggers, aliases, macros and timers, this function is a hack that works for all of them. It exploits the fact that the four structures have the name as the first member and owner plugin as second, and uses some casting to retrieve it. */ GSList *found = NULL; GeneralObject *obj; char *tried_name = NULL; int i = 0; while (list) { obj = (GeneralObject *) list->data; if (searchtype == 0) { tried_name = obj->name; } else if (searchtype == 1) { if (obj->owner_plugin) { tried_name = obj->owner_plugin->name; } else { tried_name = NULL; } } if (tried_name && strcmp(name, tried_name) == 0) { found = g_slist_append(found, GINT_TO_POINTER(i)); } ++i; list = list->next; } return found; } static void XS_listplugin(pTHX_ CV *perlcv) { guint i; guint total_width; guint field1_width; guint field2_width; GSList *pluginptr; Plugin *plugin; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { /* The rows argument is not used. */ ansitextview_get_size(world->gui, &field1_width, &total_width); /* If the screen is really narrow, we can do nothing. */ if (total_width < 35) { total_width = 35; } field1_width = (total_width - 17)*.3; field2_width = (total_width - 17)*.7; ansitextview_append_stringf(world->gui, _("Num Ena %-*.*s Version %-*.*s\n"), field1_width, field1_width, _("Name"), field2_width, field2_width, _("Description")); ansitextview_append_string(world->gui, "--- --- "); for (i = 0; i < field1_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, " ------- "); for (i = 0; i < field2_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, "\n"); i = 0; pluginptr = world->plugins; while (pluginptr) { plugin = (Plugin *) pluginptr->data; ansitextview_append_stringf(world->gui, "%3d %-3.3s %-*.*s %-7.7s %-*.*s\n", i, plugin->enabled ? _("y") : _("n"), field1_width, field1_width, plugin->name, plugin->version, field2_width, field2_width, plugin->description); ++i; pluginptr = pluginptr->next; } XSRETURN_EMPTY; } if (SvIOK(ST(1))) { i = SvIV(ST(1)); plugin = (Plugin *) g_slist_nth_data(world->plugins, i); } else { plugin = get_plugin(world, SvPV_nolen(ST(1))); i = g_slist_index(world->plugins, plugin); } if (!plugin) { ansitextview_append_string_nl(world->gui, _("No such plugin")); XSRETURN_NO; } ansitextview_append_stringf(world->gui, _("Plugin number %d\n" " Name: %s\n" " Version: %s\n" " Description: %s\n" " Author: %s\n" " Enabled: %s\n"), i, plugin->name, plugin->version, plugin->description, plugin->author, plugin->enabled ? _("yes") : _("no")); ansitextview_append_string_nl(world->gui, "\nPlugin triggers:"); list_triggers(world, plugin); ansitextview_append_string_nl(world->gui, "\nPlugin aliases:"); list_aliases(world, plugin); ansitextview_append_string_nl(world->gui, "\nPlugin macros:"); list_macros(world, plugin); ansitextview_append_string_nl(world->gui, "\nPlugin timers:"); list_timers(world, plugin); ansitextview_append_string_nl(world->gui, "\nPlugin hooks:"); list_hooks(world, "OnConnect", plugin); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnDisconnect", plugin); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnReceivedText", plugin); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnSentCommand", plugin); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnGetFocus", plugin); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnLoseFocus", plugin); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnCloseConnected", plugin); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnServerData", plugin); XSRETURN_YES; } static void XS_getpluginversion(pTHX_ CV *perlcv) { /* Argument: Plugin name. Returns: Plugin version, or empty string. */ Plugin *plugin; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items != 2) { warn(_("%s: Too few arguments"), "getpluginversion"); } plugin = get_plugin(world, SvPV_nolen(ST(1))); if (!plugin) { XST_mPV(0, ""); } else { XST_mPV(0, plugin->version); } XSRETURN(1); } static void XS__startplugin(pTHX_ CV *perlcv) { /* Not meant to be called by user. Arguments: name, version, description, author. */ Plugin *plugin; FETCHWORLDVARS; dXSARGS; FETCHWORLD; plugin = g_new(Plugin, 1); plugin->name = g_strdup(SvPV_nolen(ST(1))); plugin->version = g_strdup(SvPV_nolen(ST(2))); plugin->description = g_strdup(SvPV_nolen(ST(3))); plugin->author = g_strdup(SvPV_nolen(ST(4))); plugin->enabled = TRUE; world->plugins_being_defined = g_slist_prepend(world->plugins_being_defined, plugin); XSRETURN_EMPTY; } static void XS__stopplugin(pTHX_ CV *perlcv) { /* Not meant to be called by user. Argument: 0 to cancel, the plugin was not loaded 1 to add it to list, the plugin was loaded */ Plugin *plugin; FETCHWORLDVARS; dXSARGS; FETCHWORLD; plugin = (Plugin *) world->plugins_being_defined->data; world->plugins_being_defined = g_slist_remove(world->plugins_being_defined, plugin); if (SvTRUE(ST(1))) { world->plugins = g_slist_append(world->plugins, plugin); we_lplugin_insert_plugin(world, plugin); } else { remove_plugin_objects(world, plugin); g_free(plugin); } XSRETURN_EMPTY; } static void XS__markpluginenadis(pTHX_ CV *perlcv) { /* Not meant to be called by user. Arguments: plugin name, new value. */ Plugin *plugin; FETCHWORLDVARS; dXSARGS; FETCHWORLD; plugin = get_plugin(world, SvPV_nolen(ST(1))); plugin->enabled = SvIV(ST(2)); we_lplugin_update_plugin(world, plugin); XSRETURN_EMPTY; } static void xs_init() { /* This is for dynamic loading of modules */ char *file = __FILE__; dXSUB_SYS; /* DynaLoader is a special case */ newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); /* Our subroutines */ newXS("getclientname", XS_getclientname, ""); newXS("getversion", XS_getversion, ""); newXS("quit", XS_quit, ""); newXS("gotow", XS_gotow, ""); newXS("getworld", XS_getworld, ""); newXS("play", XS_play, ""); newXS("stripansi", XS_stripansi, ""); newXS("Window::minimize", XS_window_minimize, "Window"); newXS("Window::getsize", XS_window_getsize, "Window"); newXS("Window::settitle", XS_window_settitle, "Window"); newXS("Window::seturgencyhint", XS_window_seturgencyhint, "Window"); newXS("World::dc", XS_dc, "World"); newXS("World::reconnect", XS_reconnect, "World"); newXS("World::connectother", XS_connectother, "World"); newXS("World::save", XS_save, "World"); newXS("World::close", XS_close, "World"); newXS("World::next", XS_next, "World"); newXS("World::getname", XS_getname, "World"); newXS("World::getcharacter", XS_getcharacter, "World"); newXS("World::getmainfont", XS_getmainfont, "World"); newXS("World::getentryfont", XS_getentryfont, "World"); newXS("World::commandecho", XS_commandecho, "World"); newXS("World::cmdseparator", XS_cmdseparator, "World"); newXS("World::getconntime", XS_getconntime, "World"); newXS("World::getidletime", XS_getidletime, "World"); newXS("World::echo", XS_echo, "World"); newXS("World::send", XS_send, "World"); newXS("World::_mlsend", XS__mlsend, "World"); newXS("World::interpret", XS_interpret, "World"); newXS("World::getline", XS_getline, "World"); newXS("World::_sendserverdata", XS__sendserverdata, "World"); newXS("World::setstatus", XS_setstatus, "World"); newXS("World::trigger", XS_trigger, "World"); newXS("World::_listtrigger", XS__listtrigger, "World"); newXS("World::_deltrigger", XS__deltrigger, "World"); newXS("World::_movetrigger", XS__movetrigger, "World"); newXS("World::_getobjectnumber", XS__getobjectnumber, "World"); newXS("World::_objectenabled", XS__objectenabled, "World"); newXS("World::alias", XS_alias, "World"); newXS("World::expandalias", XS_expandalias, "World"); newXS("World::_listalias", XS__listalias, "World"); newXS("World::_delalias", XS__delalias, "World"); newXS("World::_movealias", XS__movealias, "World"); newXS("World::getkeycode", XS_getkeycode, "World"); newXS("World::macro", XS_macro, "World"); newXS("World::_listmacro", XS__listmacro, "World"); newXS("World::_delmacro", XS__delmacro, "World"); newXS("World::_movemacro", XS__movemacro, "World"); newXS("World::timer", XS_timer, "World"); newXS("World::_listtimer", XS__listtimer, "World"); newXS("World::_deltimer", XS__deltimer, "World"); newXS("World::_movetimer", XS__movetimer, "World"); newXS("World::makepermanent", XS_makepermanent, "World"); newXS("World::maketemporary", XS_maketemporary, "World"); newXS("World::ispermanent", XS_ispermanent, "World"); newXS("World::listpermanent", XS_listpermanent, "World"); newXS("World::hook", XS_hook, "World"); newXS("World::_listhook", XS__listhook, "World"); newXS("World::_delhook", XS__delhook, "World"); newXS("World::_movehook", XS__movehook, "World"); newXS("World::logfile", XS_logfile, "World"); newXS("World::getlogfile", XS_getlogfile, "World"); newXS("World::_writetolog", XS__writetolog, "World"); newXS("World::listplugin", XS_listplugin, "World"); newXS("World::getpluginversion", XS_getpluginversion, "World"); newXS("World::_startplugin", XS__startplugin, "World"); newXS("World::_stopplugin", XS__stopplugin, "World"); newXS("World::_markpluginenadis", XS__markpluginenadis, "World"); /* KCWin subroutines */ newXS("KCWin::_new", XS_KCWin__new, "KCWin"); newXS("KCWin::feed", XS_KCWin_feed, "KCWin"); newXS("KCWin::_destroy", XS_KCWin__destroy, "KCWin"); } kildclient-3.0.0/src/ansi.h0000644000175000017500000001420012354321114012440 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __ANSI_H #define __ANSI_H /************************************ * ANSI Escape Sequences - Integers * ************************************/ #define ANSI_FIRST_FG_COLOR 30 #define ANSI_LAST_FG_COLOR 37 #define ANSI_FIRST_BG_COLOR 40 #define ANSI_LAST_BG_COLOR 47 #define ANSI_FG_DEFAULT 39 #define ANSI_BG_DEFAULT 49 #define ANSI_RESET 0 #define ANSI_SET_FG_BOLD 1 #define ANSI_BOLD_OFF 22 #define ANSI_SET_BG_LIGHT 5 #define ANSI_BOLD_BG_OFF 25 #define ANSI_SET_UNDERLINE 4 #define ANSI_SET_DBLUNDERLINE 21 #define ANSI_UNDERLINE_OFF 24 #define ANSI_SET_STRIKE 9 #define ANSI_STRIKE_OFF 29 #define ANSI_SET_ITALICS 3 #define ANSI_ITALICS_OFF 23 #define ANSI_SET_REVERSE 7 #define ANSI_REVERSE_OFF 27 #define ANSI_SET_HIDDEN 8 #define ANSI_HIDDEN_OFF 28 /* Support for xterm's 256 color cube */ #define XTERM256_SET_FORE 38 #define XTERM256_SET_BACK 48 #define XTERM256_SECOND_CODE 5 /******************** * For ANSI parsing * ********************/ #define ANSI_ESC 0x1b /* 033, 27 dec */ #define ANSI_TABLE_SIZE 20 #define ANSI_N_COLORS_HIGHLIGHT 17 #define ANSI_N_COLORS 8 #define ANSI_NORMAL_BASE_IDX 0 #define ANSI_BOLD_BASE_IDX 9 #define ANSI_DEFAULT_COLOR_IDX 8 #define ANSI_DEFAULT_BOLD_COLOR_IDX 17 #define ANSI_BLACK_IDX 0 #define ANSI_REVERSE_DEFAULT_IDX 18 #define ANSI_REVERSE_BOLD_DEFAULT_IDX 19 /* This offset represents the difference in the way the tags and the ansi colors are stored. For the tags, 0-7 hold the basic colors, 8 the default color, 9-16 the bold colors and 17 the default bold; for colors ansicolors have the basic and bold colors in sequence in 0-15, and defaults are stored separatedly. */ #define ANSI_TABLE_OFFSET 1 /*********************************** * ANSI Escape Sequences - Strings * ***********************************/ /* Basic building blocks for colors */ #define ANSI_START "\033[" #define ANSI_COLOR_END "m" #define ANSI_SEP ";" #define ANSI_ATTRIBS_OFF "0" #define ANSI_BOLD_ON "1" #define ANSI_BLINK_ON "5" /* Actually causes light background */ #define ANSI_FG_BLACK "30" #define ANSI_FG_RED "31" #define ANSI_FG_GREEN "32" #define ANSI_FG_YELLOW "33" #define ANSI_FG_BLUE "34" #define ANSI_FG_MAGENTA "35" #define ANSI_FG_CYAN "36" #define ANSI_FG_WHITE "37" #define ANSI_BG_BLACK "40" #define ANSI_BG_RED "41" #define ANSI_BG_GREEN "42" #define ANSI_BG_YELLOW "43" #define ANSI_BG_BLUE "44" #define ANSI_BG_MAGENTA "45" #define ANSI_BG_CYAN "46" #define ANSI_BG_WHITE "47" /* Codes to set colors */ #define ANSI_RESET_DEFAULT ANSI_START ANSI_ATTRIBS_OFF ANSI_COLOR_END #define ANSI_SET_FG_BLACK ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_BLACK ANSI_COLOR_END #define ANSI_SET_FG_RED ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_RED ANSI_COLOR_END #define ANSI_SET_FG_GREEN ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_GREEN ANSI_COLOR_END #define ANSI_SET_FG_BLUE ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_BLUE ANSI_COLOR_END #define ANSI_SET_FG_YELLOW ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_YELLOW ANSI_COLOR_END #define ANSI_SET_FG_MAGENTA ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_MAGENTA ANSI_COLOR_END #define ANSI_SET_FG_CYAN ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_CYAN ANSI_COLOR_END #define ANSI_SET_FG_WHITE ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_WHITE ANSI_COLOR_END #define ANSI_SET_BG_BLACK ANSI_START ANSI_BG_BLACK ANSI_COLOR_END #define ANSI_SET_BG_RED ANSI_START ANSI_BG_RED ANSI_COLOR_END #define ANSI_SET_BG_GREEN ANSI_START ANSI_BG_GREEN ANSI_COLOR_END #define ANSI_SET_BG_BLUE ANSI_START ANSI_BG_BLUE ANSI_COLOR_END #define ANSI_SET_BG_YELLOW ANSI_START ANSI_BG_YELLOW ANSI_COLOR_END #define ANSI_SET_BG_MAGENTA ANSI_START ANSI_BG_MAGENTA ANSI_COLOR_END #define ANSI_SET_BG_CYAN ANSI_START ANSI_BG_CYAN ANSI_COLOR_END #define ANSI_SET_BG_WHITE ANSI_START ANSI_BG_WHITE ANSI_COLOR_END #define ANSI_SET_FG_BLACK_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_BLACK ANSI_COLOR_END #define ANSI_SET_FG_RED_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_RED ANSI_COLOR_END #define ANSI_SET_FG_GREEN_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_GREEN ANSI_COLOR_END #define ANSI_SET_FG_BLUE_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_BLUE ANSI_COLOR_END #define ANSI_SET_FG_YELLOW_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_YELLOW ANSI_COLOR_END #define ANSI_SET_FG_MAGENTA_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_MAGENTA ANSI_COLOR_END #define ANSI_SET_FG_CYAN_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_CYAN ANSI_COLOR_END #define ANSI_SET_FG_WHITE_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_BOLD ANSI_COLOR_END #endif kildclient-3.0.0/src/kildclient.h0000644000175000017500000013301412374467303013652 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __KILDCLIENT_H #define __KILDCLIENT_H #include "kcircularqueue.h" #include "simocombobox.h" #include #include #include #include #include #ifdef HAVE_LIBGNUTLS # include #endif /********************** * Limits and defines * **********************/ #define MAX_BUFFER 4096 #define MAX_TIME_STR 150 #define VTE_ENC "UTF-8" #define DEFAULT_TERMINAL_FONT "Monospace 10" #define DEFAULT_LOGTIME_FORMAT "%c> " #define CLIENT_NAME "KildClient" #define CLIENT_NAME_LEN 10 /************** * Data types * **************/ enum ConnStyle_s { NONE, DIKU, LPMUD, }; typedef enum ConnStyle_s ConnStyle; enum TimeType_s { HMS, SEC, NO, }; typedef enum TimeType_s TimeType; /* States for the Telnet IAC processing State Machine */ enum TelnetState_e { TELNETFSM_DATA, TELNETFSM_DATA_NL, TELNETFSM_DATA_CR, TELNETFSM_IAC, TELNETFSM_DO, TELNETFSM_DONT, TELNETFSM_WILL, TELNETFSM_WONT, TELNETFSM_SB, TELNETFSM_SB_IAC, TELNETFSM_SB_IAC_TERMTYPE, TELNETFSM_SB_IAC_COMPRESS, TELNETFSM_SB_IAC_COMPRESS2, TELNETFSM_SB_IAC_COMPRESS_WILL, /* Also serves for SB_IAC_COMPRESS2_IAC */ TELNETFSM_SERVER_DATA, TELNETFSM_SERVER_DATA_IAC, }; typedef enum TelnetState_e TelnetState; enum proxy_type_e { PROXY_USE_GLOBAL = -1, PROXY_NONE, PROXY_SOCKS4, PROXY_SOCKS5, PROXY_HTTP, }; typedef enum proxy_type_e proxy_type; enum proxy_socks5_state_e { SOCKS5_STATE_INITIAL, SOCKS5_STATE_AUTH, SOCKS5_STATE_CONNECTION, }; typedef enum proxy_socks5_state_e proxy_socks5_state; struct proxy_settings_s { proxy_type type; char *server; char *port; char *user; char *password; proxy_socks5_state state; }; typedef struct proxy_settings_s proxy_settings; enum NameDisplayStyle_e { NAME_DISPLAY_WORLD, NAME_DISPLAY_WORLD_CHAR, NAME_DISPLAY_CHAR_WORLD, NAME_DISPLAY_CUSTOM, }; typedef enum NameDisplayStyle_e NameDisplayStyle; struct plugin_s { char *name; char *version; char *description; char *author; gboolean enabled; }; typedef struct plugin_s Plugin; struct HookList_s { GSList *OnConnect; gint OnConnect_pos; GtkTreeModel *OnConnect_model; GtkTreeModelFilter *OnConnect_model_filter; GSList *OnDisconnect; gint OnDisconnect_pos; GtkTreeModel *OnDisconnect_model; GtkTreeModelFilter *OnDisconnect_model_filter; GSList *OnReceivedText; gint OnReceivedText_pos; GtkTreeModel *OnReceivedText_model; GtkTreeModelFilter *OnReceivedText_model_filter; GSList *OnSentCommand; gint OnSentCommand_pos; GtkTreeModel *OnSentCommand_model; GtkTreeModelFilter *OnSentCommand_model_filter; GSList *OnGetFocus; gint OnGetFocus_pos; GtkTreeModel *OnGetFocus_model; GtkTreeModelFilter *OnGetFocus_model_filter; GSList *OnLoseFocus; gint OnLoseFocus_pos; GtkTreeModel *OnLoseFocus_model; GtkTreeModelFilter *OnLoseFocus_model_filter; GSList *OnCloseConnected; gint OnCloseConnected_pos; GtkTreeModel *OnCloseConnected_model; GtkTreeModelFilter *OnCloseConnected_model_filter; GSList *OnServerData; gint OnServerData_pos; GtkTreeModel *OnServerData_model; GtkTreeModelFilter *OnServerData_model_filter; }; typedef struct HookList_s HookList; struct Hook_s { char *name; Plugin *owner_plugin; gboolean enabled; gchar *action; }; typedef struct Hook_s Hook; /* For ANSI parsing - FSM */ enum ANSIFSMState_e { ANSIFSM_DATA, ANSIFSM_ESC, ANSIFSM_ANSISEQ, ANSIFSM_ESCLEFTPAR, }; typedef enum ANSIFSMState_e ANSIFSMState; struct TAState_s { guint fg_color; guint fg_base_idx; guint bg_color; guint bg_base_idx; PangoUnderline underline; gboolean strike; gboolean italics; gboolean reverse; gboolean hidden; /* Pointers to the tags used for foreground and background colors. It they are set, the tag is used, otherwise the color is determined from the ANSI state. */ GtkTextTag *foreground_color_tag; GtkTextTag *background_color_tag; }; typedef struct TAState_s TAState; enum MCCPBehavior_s { MCCP_AFTER_CONNECT, MCCP_ALWAYS, MCCP_DISABLE, }; typedef enum MCCPBehavior_s MCCPBehavior; struct TextAppearance_s { /* The tags for ansi colors are stored here. Each array contains 20 elements: 0-7 Basic colors, from black to white 8 Default color 9-16 Bold basic colors 17 Default bold color 18 Default color for reverse video 19 Bold default color for reverse video The last two entries are used for reverse video. For the foreground array, they contain tags that set the foreground to the default background and bold background colors, respectively. For the background array, they contain tags that set the background to the default foreground and bold foreground colors, respectively. */ GtkTextTag **ansi_fore_tags; GtkTextTag **ansi_back_tags; /* Tags for other foreground/background colors, specified as RGB values. The hash is indexed by ints (converted to pointers with Glib macros). Each color component is one byte (256 values, thus), and the index it is formed with ((R << 16) | (G << 8) || B). Colors are allocated as needed. */ GHashTable *rgb_fore_tags; GHashTable *rgb_back_tags; /* Tags for text attributes */ GtkTextTag *underline_tag; GtkTextTag *dblunderline_tag; GtkTextTag *strike_tag; GtkTextTag *italics_tag; /* Character groups supported. -1: unknown. 0: not supported. 1: supported If a group is not supported, replacement ASCII characters (not necessarily good) are used when in vt100 line drawing mode. */ gint sup_geom_shapes; gint sup_block; gint sup_control; gint sup_l1_supplement; gint sup_box_drawing; gint sup_misc_tech; gint sup_math; gint sup_greek; }; typedef struct TextAppearance_s TextAppearance; struct AnsiParseState_s { /* For ANSI parsing */ ANSIFSMState ansifsm_state; gboolean linedraw; guchar ansiseq_buffer[MAX_BUFFER]; /* Holds incomplete ansi seqs. */ gint ansiseq_pos; }; typedef struct AnsiParseState_s AnsiParseState; struct WorldGUI_s { struct world_s *world; GtkWidget *vbox; GtkPaned *split_pane; gint last_split_position; GtkScrolledWindow *scrolled_win; GtkTextView *txtView; GtkScrolledWindow *scrwinScroll; GtkTextView *txtViewScroll; GtkTextBuffer *txtBuffer; gdouble last_scroll_info; /* For scrolled_win_size_allocate_cb() */ GtkBox *hboxTab; GtkLabel *lblNotebook; GtkWidget *search_box; GtkWidget *txtSearchTerm; GtkWidget *btnFindNext; GtkLabel *lblSearchInfo; GtkTextMark *txtmark_search_start; GtkTextMark *txtmark_next_search_start; GtkWidget *commandArea; GtkWidget *btnClear; union { SimoComboBox *cmbEntry; /* For MUD windows */ GtkEntry *txtEntry; /* For KCWin's */ }; GtkBox *statusbar_box; GtkLabel *lblStatus; GtkLabel *lblLines; GtkLabel *lblTime; GtkTextMark *txtmark_end; GtkTextMark *txtmark_linestart; GtkTextTag *txttag_url; gboolean execute_changed_signal; guint prune_timeout_id; /* Line times for tooltips */ KCircularQueue *line_times; /* Determines the appearance of the text */ TextAppearance ta; AnsiParseState ansi_parse; /* The current color and attributes is determined from these variables */ TAState ta_state; /* A place to store the state at the end of the last complete line, so that it can be restored when an incomplete line is erased. */ TAState saved_ta_state; }; typedef struct WorldGUI_s WorldGUI; struct world_s { /* Basic information */ gchar *name; /* World name */ gchar *display_name; /* Name displayed in tab & window title */ gchar *new_text_name; /* Red version of the above */ gchar *file; gchar *charset; gint charset_index; gchar *host; gchar *host_ip; gchar *port; proxy_settings proxy; proxy_settings proxy_used; gboolean keep_alive; /* Auto-login data */ ConnStyle connection_style; GtkTreeModel *logon_characters; GtkTreeRowReference *character_used; /* Display settings */ char *terminalfont; char *entryfont; char *statusfont; gboolean usebold; gboolean wrap; gint wrap_indent; gboolean use_wrap_column; gint wrap_column; GdkRGBA *deffore; GdkRGBA *defbold; GdkRGBA *defback; GdkRGBA *defboldback; GdkRGBA *ansicolors; NameDisplayStyle name_display_style; char *name_display_pattern; gboolean use_tooltips; /* Scripting support */ gchar *scriptfile; GSList *triggers; gint trigger_pos; gboolean disable_triggers; SV *trigger_action_re; /* Pattern to replace $n in action */ GSList *aliases; gint alias_pos; gboolean disable_aliases; GSList *macros; gint macro_pos; gboolean disable_macros; GSList *timers; gint timer_pos; gboolean disable_timers; GSList *permanent_variables; GSList *plugins; GSList *plugins_being_defined; GSList *startup_plugin_files; GtkTreeModel *startup_plugins; /* Plugins loaded at startup */ HookList hooks; /* Scrolling settings */ gboolean scrollOutput; glong buffer_lines; /* Input settings */ gboolean repeat_commands; gboolean cmd_echo; gboolean never_hide_input; gboolean store_commands; gint commands_to_save; gint input_n_lines; gint input_n_lines_saved; gboolean spell; gchar *spell_language; gboolean autocompletion; gint autocompl_minprefix; gchar command_separator[10]; gboolean updating_controls; /* To prevent infinite loop */ gboolean ignore_up_down_keys; /* Command history support */ GtkTreeModel *cmd_list; GtkTreeIter current_cmd; gint cmd_list_size; gboolean cmd_has_been_edited; gboolean cmd_position_changed; gboolean combo_is_poped; gboolean cmd_just_selected_from_combo; gchar *saved_command_find_search; /* Flood prevention */ gboolean flood_prevention; gint max_equal_commands; gchar *flood_prevention_command; gchar *last_command; int repeat_count; /* Protocols configuration */ MCCPBehavior mccp_behavior; /* Logging */ gchar *log_file_name; gchar *log_actual_file; FILE *log_file; gchar *log_timeformat; gboolean log_add_time; gboolean log_autostart; /* Basic connection information */ gboolean connected; gboolean connecting; gboolean connected_at_least_once; gchar *errmsg; /* Error message to display */ GIOChannel *iochan; #ifndef __MINGW32__ int sock; #else SOCKET sock; #endif guint io_watch_id; guint timeout_id; glong deleted_lines; glong rawbytes; /* Bytes received from network */ glong bytes; /* Bytes seen after decompression */ struct addrinfo *addrinfo; /* addrinfo for real connection */ guint32 real_ip_for_socks4; /* IP of actual host, for SOCKS4 */ /* Buffers and state */ TelnetState telnet_state; /* State of Telnet IAC FSM */ gint telnet_state_ncrs; /* Last # of \r seen in a row */ guchar inbuffer[MAX_BUFFER]; /* Input buffer from network */ guchar dbuffer[MAX_BUFFER]; /* Buffer for decompressed data */ guchar *pbuffer; /* Buffer to process */ guint pbuf_alloc_size; /* Current size of pbuffer */ guint pbuf_size; /* Buffer size */ /* For MCCP handling */ z_stream *zstream; /* Used for decompression */ gint mccp_ver; /* Version of MCCP supported */ /* Server data */ guchar server_data_protocol; /* Protocol */ guchar *server_data_buffer; /* Buffer */ guint server_data_alloc_size; /* Allocated size */ guint server_data_size; /* Current size */ gboolean gmcp_enabled; /* Is GMCP enabled? */ gboolean msdp_enabled; /* Is MSDP enabled? */ /* Time counts */ guint printed_until; GTimer *last_data_written; /* For connection and idle time display */ TimeType ctime_type; TimeType itime_type; gboolean itime_reset_activate; /* When to reset idle timer */ time_t connected_time; /* Time of connection */ time_t last_command_time; /* Time of last sent command */ /* For the getkeycode() function */ gboolean print_next_keycode; gchar *keycode_to_print; /* Miscellaneous data */ gboolean noecho; gboolean use_naws; GdkRectangle last_naws_size; gboolean has_focus; gboolean is_current_tab; gboolean has_unread_text; gint selection_start; gint selection_end; /* GUI structure */ WorldGUI *gui; /* UI Builder for the dialogs */ GtkBuilder *ui_builder; /* World Editor dialog and related objects */ GtkWidget *dlgEditWorld; GtkTreeModel *plugin_model; GtkTreeView *viewTrigger; GtkTreeModel *trigger_model; GtkTreeModelFilter *trigger_model_filter; GtkTreeView *viewAlias; GtkTreeModel *alias_model; GtkTreeModelFilter *alias_model_filter; GtkTreeView *viewMacro; GtkTreeModel *macro_model; GtkTreeModelFilter *macro_model_filter; GtkTreeView *viewTimer; GtkTreeModel *timer_model; GtkTreeModelFilter *timer_model_filter; GtkTreeView *viewVar; GtkTreeModel *permvars_model; GSList *selected_OnConnect_hooks; GSList *selected_OnDisconnect_hooks; GSList *selected_OnReceivedText_hooks; GSList *selected_OnSentCommand_hooks; GSList *selected_OnGetFocus_hooks; GSList *selected_OnLoseFocus_hooks; GSList *selected_OnCloseConnected_hooks; GSList *selected_OnServerData_hooks; gboolean confirm_delete; gboolean show_plugin_items; /* Multi-line send dialog */ GtkWidget *dlgMLSend; /* Command history dialog */ GtkWidget *dlgCmdHistory; gboolean cmdfind_upwards; gchar *cmdfind_string; GtkTreeRowReference *cmdfind_row; GtkWidget *dlgCmdHistoryFind; /* Test Triggers dialog */ GtkWidget *dlgTestTriggers; /* Perl interpreter */ PerlInterpreter *perl_interpreter; /* TLS/SSL support */ gboolean use_tls; #ifdef HAVE_LIBGNUTLS gnutls_session_t tls_session; int tls_handshake_dir; #endif /* Inter-thread communication */ GRecMutex perl_mutex; GThread *process_line_thread; GAsyncQueue *process_line_operations; GThread *ansiparse_thread; GAsyncQueue *ansiparse_operations; GMutex write_log_line_mutex; GAsyncQueue *mainthread_operations; guint mainthread_operations_idle_id; GMutex wait_command_mutex; GCond wait_command_cond; gboolean command_executed; gboolean to_be_destructed; }; typedef struct world_s World; enum { RESP_RECONNECT = 10, RESP_OTHER, RESP_OFFLINE, }; /* For recent command list */ enum { CMDLIST_COL_COMMAND, CMDLIST_COL_TENTATIVE, N_CMDLIST_COLUMNS, }; /* Columns of model for auto-logon characters */ enum { LOGON_CHAR, LOGON_PASS, N_LOGON_COLUMNS, }; /* Columns of model for plugins loaded on startup */ enum { SPLUGIN_FILE, SPLUGIN_NAME, SPLUGIN_AUTHOR, SPLUGIN_DESCRIPTION, N_SPLUGIN_COLUMNS, }; struct prefs_s { int idxInfoMsgColor; int idxCmdEchoColor; gdouble multi_cmd_delay; gint multi_cmd_group_size; GtkPositionType tab_position; gboolean hide_single_tab; gboolean urgency_hint; char *browser_command; char *audio_player_command; char *last_open_world; gboolean no_plugin_help_msg; proxy_settings proxy; }; typedef struct prefs_s Prefs; struct general_object_s { char *name; Plugin *owner_plugin; gboolean enabled; }; typedef struct general_object_s GeneralObject; struct trigger_s { char *name; Plugin *owner_plugin; gboolean enabled; char *pattern; SV *pattern_re; char *action; gboolean ignore_case; gboolean gag_output; gboolean gag_log; gboolean keepexecuting; gboolean rewriter; gboolean highlight; /* Style to apply / -1 means no change*/ gint high_target; gint high_fg_color; gint high_bg_color; gint high_italic; gint high_strike; gint high_underline; }; typedef struct trigger_s Trigger; struct alias_s { char *name; Plugin *owner_plugin; gboolean enabled; char *pattern; SV *pattern_re; char *substitution; gboolean ignore_case; gboolean perl_eval; }; typedef struct alias_s Alias; struct macro_s { char *name; Plugin *owner_plugin; gboolean enabled; guint keyval; GdkModifierType modifiers; char *action; }; typedef struct macro_s Macro; struct timer_s { char *name; Plugin *owner_plugin; gboolean enabled; World *for_world; gdouble interval; gint count; char *action; gboolean temporary; guint function_id; }; typedef struct timer_s Timer; /* For multi-line send */ enum MLSendState_e { ML_TRY_INITIALBUFFER, ML_INITIALBUFFER, ML_TRY_INITIALLINES, ML_INITIALLINES, ML_TRY_FILE, ML_FILECONTENTS, ML_TRY_FINALBUFFER, ML_FINALBUFFER, ML_TRY_FINALLINES, ML_FINALLINES, ML_FINISH, }; typedef enum MLSendState_e MLSendState; struct MLSendData_s { World *world; MLSendState state; GtkTextBuffer *textInitial; GtkTextBuffer *textFinal; GSList *linesInitial; GSList *linesFinal; gchar *file; FILE *fp; gchar *textStart; gchar *textEnd; int nlines; int linesatime; int currline; GSList *list_iterator; gboolean dont_close; }; typedef struct MLSendData_s MLSendData; struct HighlightApplication_s { Trigger *trigger; gint match_start; gint match_end; }; typedef struct HighlightApplication_s HighlightApplication; struct HookExecution_s { World *world; gchar *data; }; typedef struct HookExecution_s HookExecution; /* Line processing operations */ enum ProcessLineOperationType_s { PROCESS_COMPLETE_LINE, PROCESS_INCOMPLETE_LINE, DUMMY_PROCESS_LINE, }; typedef enum ProcessLineOperationType_s ProcessLineOperationType; struct ProcessLineOperation_s { ProcessLineOperationType action; gchar *line; gsize len; }; typedef struct ProcessLineOperation_s ProcessLineOperation; /* Ansi parsing operation */ enum AnsiParseOperationType_s { CLEAR_PENDING_LINE_ANSI, APPEND_LINE, APPEND_ECHOED_LINE, APPLY_HIGHLIGHTS_AND_MOVE_MARK, FINALIZE_LINE, DUMMY_ANSIPARSE, }; typedef enum AnsiParseOperationType_s AnsiParseOperationType; struct AnsiParseOperation_s { AnsiParseOperationType action; union { struct { gchar *line; gsize line_len; } line; GSList *highlights; }; }; typedef struct AnsiParseOperation_s AnsiParseOperation; /* Main thread operations */ enum MainThreadOperationType_s { INSERT_AT_END, INSERT_AT_MARK, TEXT_ADDED, CLEAR_PENDING_LINE, MOVE_LINESTART_MARK, APPLY_HIGHLIGHT, PARSE_COMMANDS, EXECUTE_ON_RECEIVED_TEXT, }; typedef enum MainThreadOperationType_s MainThreadOperationType; struct MainThreadOperation_s { MainThreadOperationType action; union { /* For INSERT_AT_END and INSERT_AT_MARK */ struct { gchar *text; gboolean use_ta; TAState ta_state; GtkTextTag *extra_tag; } text_insert; /* For APPLY_HIGHLIGHT */ HighlightApplication *highlight; /* For PARSE_COMMANDS */ struct { gchar *commands; gchar *colorline; AV *matches; gboolean notify; } commands; /* For EXECUTE_ON_RECEIVED_TEXT */ HookExecution *hook_execution; }; }; typedef struct MainThreadOperation_s MainThreadOperation; /* Function that enqueues or executes a text view operation. */ typedef void (*MainThreadOperationFunction)(WorldGUI *gui, MainThreadOperation *operation); /************************************************** * Model Columns in GUI Editors for Triggers, etc * **************************************************/ enum { WE_GUIED_POINTER, WE_GUIED_N_COLS, }; /************************************************************** * Values used by the cell data functions for the GUI Editors * **************************************************************/ enum { PLUGIN_ENABLED, PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR, PLUGIN_DESCRIPTION, TRIGGER_ENABLED, TRIGGER_NAME, TRIGGER_PATTERN, TRIGGER_ACTION, TRIGGER_GAG, TRIGGER_GAGLOG, TRIGGER_KEEPEXEC, TRIGGER_REWRITER, TRIGGER_ICASE, TRIGGER_HIGHLIGHT, ALIAS_ENABLED, ALIAS_PERL_EVAL, ALIAS_NAME, ALIAS_PATTERN, ALIAS_SUBSTITUTION, ALIAS_ICASE, MACRO_ENABLED, MACRO_NAME, MACRO_KEY, MACRO_ACTION, TIMER_ENABLED, TIMER_NAME, TIMER_INTERVAL, TIMER_COUNT, TIMER_ACTION, TIMER_TEMPORARY, HOOK_ENABLED, HOOK_NAME, HOOK_ACTION, PERMVAR_NAME, OBJECT_PLUGIN, }; /******************** * Global variables * ********************/ extern GtkWidget *wndMain; /* The main window widget */ extern GtkBuilder *main_builder; /* Created main window & others */ extern GtkWidget *ntbkWorlds; /* Notebook with the worlds */ extern GList *open_worlds; /* List of open worlds */ extern World *currentWorld; /* The current world */ extern World *world_for_perl; /* The world for Perl to use */ extern World *default_world; /* World with default settings */ extern gboolean window_has_focus; /* Whether the main window has focus */ extern gint worlds_with_new_text; /* # of worlds with unread text */ extern gboolean debug_matches; /* Show when a trigger/alias matches */ extern Prefs globalPrefs; /* Holds the global preferences */ extern FILE *dumpFile; /* File to dump decompr. data*/ extern FILE *rdumpFile; /* File to dump raw received data */ extern GdkRGBA deffore; /* Default foreground color */ extern GdkRGBA defbold; /* Default bold foreground color */ extern GdkRGBA defback; /* Default background color */ extern GdkRGBA defboldback; /* Default bold background color */ extern GdkRGBA defansi[]; /* Default ansi colors */ #ifdef HAVE_LIBGNUTLS /* gnutls certificate credentials */ extern gnutls_certificate_credentials_t tls_certif_cred; #endif /********************************* * Function prototypes - Main UI * *********************************/ GtkWidget* create_main_window(WorldGUI *gui); void set_main_window_size(int x, int y, int width, int height, WorldGUI *gui); World* get_world_to_connect(); void remove_world(World *world, gboolean remove_gui); gboolean remove_world_timer(World *world); void set_focused_world(gint page); gint get_focused_world(void); void set_notebook_tab_position(GtkPositionType pos); void adjust_window_title(void); gboolean open_new_world(WorldGUI *gui, const gchar *cmdline, gboolean can_offline, gboolean *offline_selected); gboolean update_times_cb(gpointer data); gboolean confirm_quit(void); void worldgui_destroy_tooltip_window(WorldGUI *gui); G_MODULE_EXPORT void menu_findnext_activate_cb(GtkMenuItem *widget, gpointer data); /********************* * Handling of paths * *********************/ const char *get_kildclient_directory_path(void); const char *get_kildclient_installed_file(const char *file); /********************************** * Function prototypes - World UI * **********************************/ WorldGUI *world_gui_new(gboolean is_for_mud); void world_gui_size_textview(WorldGUI *gui); void worldgui_determine_supported_chars(WorldGUI *gui); void free_world_gui(WorldGUI *gui); void configure_gui(WorldGUI *gui, World *world); void worldgui_configure_spell(WorldGUI *gui); void clear_button_cb(GtkButton *button, gpointer data); void send_naws_size(World *world); void completion_cell_data_function(GtkCellLayout *cell_layout, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data); void find_next_cb(GtkButton *button, gpointer data); G_MODULE_EXPORT void menu_url_open(GtkMenuItem *menu, gchar *url); /************************************************ * Function prototypes - Line processing thread * ************************************************/ gpointer process_line_thread(gpointer data); void queue_process_line_operation(World *world, ProcessLineOperation *operation); void free_process_line_operation(gpointer data); void match_triggers(World *world, gchar **line, gchar **color_line, gsize *output_len, gboolean *gag_output, gboolean *gag_log, gint *n_matches, GSList **trigger_response); /************************************** * Function prototypes - ANSI parsing * **************************************/ gpointer ansiparse_thread(gpointer data); void queue_ansiparse_operation(World *gui, AnsiParseOperation *operation); void free_ansiparse_operation(gpointer data); void insert_ansi_string(WorldGUI *gui, const gchar *str, gsize len, MainThreadOperationType where, MainThreadOperationFunction operation_func); /********************************************************************* * Function prototypes - Operations that must run in the main thread * *********************************************************************/ void queue_mainthread_operation(World *world, MainThreadOperation *operation); void free_mainthread_operation(gpointer data); gboolean mainthread_operations_idle_cb(gpointer data); void process_mainthread_operation(WorldGUI *world, MainThreadOperation *operation); /*************************************************** * Function prototypes - ANSI support for TextView * ***************************************************/ void ansitextview_append_string(WorldGUI *gui, const gchar *str); void ansitextview_append_string_nl(WorldGUI *gui, const gchar *str); void ansitextview_append_stringf(WorldGUI *gui, const gchar *format, ...); void ansitextview_append_string_with_fgcolor(WorldGUI *gui, const gchar *str, gint fg_color); void ansitextview_append_ansi_string_immediately(WorldGUI *gui, gchar *str, gsize len); void ansitextview_get_char_size(WorldGUI *gui, gint *char_height, gint *char_width); void ansitextview_get_size(WorldGUI *gui, guint *lines, guint *cols); void ansitextview_update_color_tags(WorldGUI *gui, World *world); gboolean ansitextview_prune_extra_lines(gpointer data); gchar *strip_ansi(const gchar *original, gsize len); /* Main thread operations */ void ansitextview_op_insert_at_end(WorldGUI *gui, MainThreadOperation *operation); void ansitextview_op_insert_at_mark(WorldGUI *gui, MainThreadOperation *operation); void ansitextview_op_text_added(WorldGUI *gui, MainThreadOperation *operation); void ansitextview_op_clear_pending_line(WorldGUI *gui, MainThreadOperation *operation); void ansitextview_op_move_linestart_mark(WorldGUI *gui, MainThreadOperation *operation); void ansitextview_op_apply_highlight(WorldGUI *gui, MainThreadOperation *operation); /******************************** * Function prototypes - Worlds * ********************************/ void set_default_colors(World *world); World *create_new_world(gboolean load_defaults); void init_threads(World *world); void free_world(World *world); void remove_plugin_objects(World *world, Plugin *plugin); gboolean load_world_from_file(const char *file, World *world, gboolean forWorldSelector, GError **error); void create_world_from_parameters(World *world, gchar *host, gchar *port, gchar *user, gchar *password); void load_command_history(World *world); World *get_world_from_cmdline(const gchar *cmdline); void save_world_to_file(World *world); void save_command_history(World *world); gboolean edit_world(World **world, GtkWindow *parent, gboolean *newworld, gboolean modal); void kc_g_string_append_escaped(GString *str, const char *template, ...); gint disconnected_msgbox(gchar *msg, gboolean can_offline); void mark_as_offline(World *world); void prepare_display_name(World *world); gchar *replace_kc_escapes(const gchar *pattern, const gchar *name, const gchar *character); /********************************************* * Function prototypes - World Editor Dialog * *********************************************/ GObject *get_we_general_tab(World *world, GtkBuilder *ui_builder); void fill_we_general_tab(World *world, GtkBuilder *ui_builder); void update_we_general_parameters(World *world, GtkBuilder *ui_builder); GObject *get_we_mainwindow_tab(GtkBuilder *ui_builder); void fill_we_mainwindow_tab(World *world, GtkBuilder *ui_builder); GObject *get_we_colors_tab(World *world, GtkBuilder *ui_builder); GObject *get_we_statusbar_tab(GtkBuilder *ui_builder); void fill_we_statusbar_tab(World *world, GtkBuilder *ui_builder); GObject *get_we_input_tab(GtkBuilder *ui_builder); void fill_we_input_tab(World *world, GtkBuilder *ui_builder); void update_we_input_parameters(World *world, GtkBuilder *ui_builder); GObject *get_we_logging_tab(GtkBuilder *ui_builder, World *world); void fill_we_logging_tab(World *world, GtkBuilder *ui_builder); void update_we_logging_parameters(World *world, GtkBuilder *ui_builder); void set_input_line_controls(World *world, GObject *radSingleLine, GObject *radMultiLine, GtkSpinButton *spnNLines); GObject *get_we_scripting_tab(GtkBuilder *ui_builder); void fill_we_scripting_tab(World *world, GtkBuilder *ui_builder); void update_we_scripting_parameters(World *world, GtkBuilder *ui_builder); GObject *get_we_plugins_tab(GtkBuilder *ui_builder, World *world); GObject *get_we_triggers_tab(World *world); GObject *get_we_aliases_tab(World *world); GObject *get_we_macros_tab(World *world); GObject *get_we_timers_tab(World *world); GObject *get_we_hooks_tab(World *world); GObject *get_we_vars_tab(World *world); GObject *get_we_protocols_tab(GtkBuilder *ui_builder); void fill_we_protocols_tab(World *world, GtkBuilder *ui_builder); void update_we_protocols_parameters(World *world, GtkBuilder *ui_builder); GObject *get_we_misc_tab(GtkBuilder *ui_builder); void fill_we_misc_tab(World *world, GtkBuilder *ui_builder); void update_we_misc_parameters(World *world, GtkBuilder *ui_builder); GObject *get_we_advanced_tab(World *world, GtkBuilder *ui_builder); void fill_we_advanced_tab(World *world, GtkBuilder *ui_builder); void update_we_advanced_parameters(World *world, gboolean *newworld, GtkBuilder *ui_builder); G_MODULE_EXPORT void we_guied_export_cb(GtkButton *button, gpointer data); void we_guied_bool_func(GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data); void we_guied_text_func(GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data); gboolean we_guied_plugin_filter_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer data); void we_guied_bool_col_toggled_cb(GtkCellRendererToggle *renderer, gchar *pathstr, gpointer data); void we_guied_selection_changed_cb(GtkTreeSelection *selection, gpointer data); GtkWidget *we_guied_confirm_delete_dialog_new(GtkWindow *parent, int n, const gchar *singular, const gchar *plural); void we_lplugin_insert_plugin(World *world, Plugin *plugin); void we_lplugin_update_plugin(World *world, Plugin *plugin); void we_trigger_update_trigger(World *world, Trigger *trigger); void we_trigger_insert_trigger(World *world, Trigger *trigger, gint pos); void we_trigger_delete_trigger(World *world, Trigger *trigger); void we_alias_update_alias(World *world, Alias *alias); void we_alias_insert_alias(World *world, Alias *alias, gint pos); void we_alias_delete_alias(World *world, Alias *alias); void we_macro_update_macro(World *world, Macro *macro); void we_macro_insert_macro(World *world, Macro *macro, gint pos); void we_macro_delete_macro(World *world, Macro *macro); void we_timer_update_timer(World *world, Timer *timer); void we_timer_insert_timer(World *world, Timer *timer, gint pos); void we_timer_delete_timer(World *world, Timer *timer); void we_hook_update_hook(World *world, const gchar *event, Hook *hook); void we_hook_insert_hook(World *world, const gchar *event, Hook *hook, gint pos); void we_hook_delete_hook(World *world, const gchar *event, Hook *hook); void we_var_update_var(World *world, const gchar *old_var, const gchar *new_var); void we_var_insert_var(World *world, const gchar *var, gint pos); void we_var_delete_var(World *world, const gchar *var); /***************************************** * Function prototypes - Command History * *****************************************/ void prev_or_next_command(World *world, gboolean next); void find_prev_or_next_command(World *world, gboolean next); gchar *cmdhistory_get_command(GtkTreeModel *model, GtkTreeIter *iter); void add_recent_command(World *world, const gchar *command); void insert_recent_command(World *world, const gchar *command); /***************************************** * Function prototypes - Multi-line send * *****************************************/ void do_multi_line_send(MLSendData *mlcontext, gdouble delay); /********************************* * Function prototypes - Network * *********************************/ gboolean connect_to(World *world, gchar **errmsg); gboolean disconnect_world_idle(gpointer data); void disconnect_world(gpointer data, gboolean run_hook); gboolean reconnect_world(gpointer data); gboolean connect_another(gpointer data); gchar *close_connection(World *world, gboolean run_hook); gboolean flush_buffer_timeout_cb(gpointer data); void perform_auto_logon(World *world); /************************************* * Function prototypes - Preferences * *************************************/ void read_global_preferences(int *x, int *y, int *width, int *height); void save_global_preferences(void); const char *create_kildclient_directory(void); G_MODULE_EXPORT void show_preferences_dialog_cb(GtkMenuItem *widget, gpointer data); /******************************** * Function Prototypes - Parser * ********************************/ void parse_commands(World *world, const char *cmdline); void parse_commands_full(World *world, const char *cmdline, AV *matches, const gchar *colorline, gboolean notify); void mainthread_op_parse_commands(World *world, MainThreadOperation *operation); void parse_command_line_immediately(World *world, const char *cmdline); void send_to_world(World *world, const char *cmd, gint len); void send_to_world_no_check(World *world, const char *utf8_command, int utf8_len, char *locale_command, gsize locale_len, gboolean add_newline, gboolean has_incomplete_line); /********************************** * Function Prototypes - Triggers * **********************************/ Trigger *new_trigger(void); void remove_trigger(World *world, GSList *triggeritem); gboolean move_trigger(World *world, gint old_pos, gint new_pos); void free_trigger(Trigger *trigger, gpointer data); void list_triggers(World *world, Plugin *plugin); void trigger_precompute_res(World *world); void save_trigger(GString *str, Trigger *trigger); void open_test_triggers_dialog(World *world); /********************************* * Function Prototypes - Aliases * *********************************/ char *substitute_aliases(World *world, const char *cmd); void remove_alias(World *world, GSList *aliasitem); gboolean move_alias(World *world, gint old_pos, gint new_pos); void free_alias(Alias *alias, gpointer data); void list_aliases(World *world, Plugin *plugin); void alias_precompute_res(World *world); void save_alias(GString *str, Alias *alias); /******************************** * Function Prototypes - Macros * ********************************/ gboolean check_macros(World *world, guint keyval, GdkModifierType modifiers); void remove_macro(World *world, GSList *macroitem); gboolean move_macro(World *world, gint old_pos, gint new_pos); void free_macro(Macro *macro, gpointer data); void list_macros(World *world, Plugin *plugin); void save_macro(GString *str, Macro *macro); /******************************** * Function Prototypes - Timers * ********************************/ gboolean run_timer(gpointer data); void start_timers(World *world); void remove_timer(World *world, GSList *timeritem); gboolean move_timer(World *world, gint old_pos, gint new_pos); void free_timer(Timer *timer, gpointer data); void list_timers(World *world, Plugin *plugin); void save_timer(GString *str, Timer *timer); /********************************************* * Function Prototypes - Permanent Variables * *********************************************/ void load_permanent_variables(World *world); void save_permanent_variables(World *world); gboolean move_var(World *world, gint old_pos, gint new_pos); void free_permanent_variable(gchar *variable, gpointer data); /******************************* * Function Prototypes - Hooks * *******************************/ gboolean connect_hook(World *world, const gchar *hookname, int pos, gchar *action, gchar *name, gboolean enabled); void execute_hook(World *world, const gchar *hook, const gchar *hookdata); void execute_hook_immediately(World *world, const gchar *hook, const gchar *hookdata); void list_hooks(World *world, const gchar *hookname, Plugin *plugin); void list_hook(World *world, const gchar *hookname, int pos); gboolean delete_hook(World *world, const gchar *hookname, int pos, GSList *hook); gboolean move_hook(World *world, const gchar *hookname, gint old_pos, gint new_pos); void free_hook(Hook *hook, gpointer data); void save_hooks(GString *str, World *world); void save_hook(GString *str, Hook *hook); GSList **get_hook_list_for_writing(World *world, const gchar *hookname, gint **poscounter); GSList *get_hook_list_for_reading(World *world, const gchar *hookname, gint *pos); GtkTreeModel *get_hook_model(World *world, const gchar *hookname); gboolean are_there_enabled_server_data_hooks(World *world); void mainthread_op_execute_on_received_text_hook(HookExecution *hook_execution); /********************************* * Function Prototypes - Logging * *********************************/ void write_log_line(World *world, const gchar *line, time_t *line_time); gboolean start_log(World *world, gint lines, gchar **errormsg); void stop_log(World *world); /********************************* * Function prototypes - Plugins * *********************************/ Plugin *get_plugin(World *world, const char *name); void free_plugin(Plugin *plugin, World *world); gboolean load_plugin(World *world, gchar *filename, GError **error); void load_startup_plugins(World *world); gboolean add_startup_plugin(World *world, gchar *filename, GError **error); void make_startup_plugin_list_for_editing(World *world); /******************************* * Function prototypes - Sound * *******************************/ void play_sound(const gchar *file); #endif kildclient-3.0.0/src/main.c0000644000175000017500000002264512375455517012463 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #ifdef HAVE_LIBGNUTLS # include #endif #ifdef __MINGW32__ # include #endif #if defined __CYGWIN32__ # include # include # include #elif defined __WIN32__ # include # include #endif #include "kildclient.h" #include "perlscript.h" /******************** * Global variables * ********************/ FILE *dumpFile = NULL; FILE *rdumpFile = NULL; /************************* * File global variables * *************************/ #ifdef HAVE_LIBGNUTLS gnutls_certificate_credentials_t tls_certif_cred; #endif /************************ * Command-line options * ************************/ static gboolean wants_version = FALSE; static gchar *dumpfile = NULL; static gchar *rdumpfile = NULL; static gchar *kc_user_dir = NULL; static GOptionEntry options[] = { { "version", 0, 0, G_OPTION_ARG_NONE, &wants_version, N_("Outputs version information and exits"), NULL }, { "config", 'c', 0, G_OPTION_ARG_FILENAME, &kc_user_dir, N_("Directory to store settings and saved worlds"), N_("DIR") }, { "dump", 0, 0, G_OPTION_ARG_FILENAME, &dumpfile, N_("Dumps all data received from (after decompression, if " "appropriate) to the file"), N_("FILE") }, { "rawdump", 0, 0, G_OPTION_ARG_FILENAME, &rdumpfile, N_("Dumps all data received (possibly compressed) to the file"), N_("FILE") }, { NULL }, }; int main(int argc, char *argv[], char *env[]) { int x = -1, y, width, height; WorldGUI *gui; GOptionContext *opt_context; GError *error = NULL; int argpos = 1; gboolean opened_one = FALSE; #ifdef __MINGW32__ WORD wWSAVersion; WSADATA wsaData; #endif /* Internationalization initialization */ #if defined __CYGWIN32__ /* cygwin bindtextdomain requires a POSIX path */ char posixpath[MAX_PATH]; cygwin_conv_to_posix_path(get_kildclient_installed_file("locale"), posixpath); bindtextdomain(GETTEXT_PACKAGE, posixpath); #elif defined __WIN32__ /* Other windows, specifically MINGW32 */ bindtextdomain(GETTEXT_PACKAGE, get_kildclient_installed_file("locale")); #else bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR); #endif bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); /* Parse command-line options */ opt_context = g_option_context_new(N_("[WORLD...]")); g_option_context_add_main_entries(opt_context, options, GETTEXT_PACKAGE); g_option_context_add_group(opt_context, gtk_get_option_group(TRUE)); g_option_context_parse(opt_context, &argc, &argv, &error); g_option_context_free(opt_context); if (wants_version) { printf(PACKAGE_NAME " " PACKAGE_VERSION "\n"); printf(_("Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n")); exit(0); } if (dumpfile) { if (!(dumpFile = fopen(dumpfile, "w"))) { fprintf(stderr, _("Could not open dump file %s: %s\n"), dumpfile, g_strerror(errno)); } g_free(dumpfile); } if (rdumpfile) { if (!(rdumpFile = fopen(rdumpfile, "w"))) { fprintf(stderr, _("Could not open raw dump file %s: %s\n"), rdumpfile, g_strerror(errno)); } g_free(rdumpfile); } #ifdef __MINGW32__ /* Initialise WinSock library (mingw32) */ wWSAVersion = MAKEWORD(2, 2); if (WSAStartup(wWSAVersion, &wsaData) != 0) { /* FIXME: Inform why */ printf("Could not initialize windows sockets.\n"); exit(1); } #endif gtk_init(&argc, &argv); gtk_settings_set_long_property(gtk_settings_get_default(), "gtk-entry-select-on-focus", 0, "KildClient"); read_global_preferences(&x, &y, &width, &height); gui = world_gui_new(TRUE); wndMain = create_main_window(gui); set_main_window_size(x, y, width, height, gui); init_perl_system(); #ifdef HAVE_LIBGNUTLS gnutls_global_init(); gnutls_certificate_allocate_credentials(&tls_certif_cred); /* We don't really verify certificates */ /*gnutls_certificate_set_x509_trust_file(tls_certif_cred, CAFILE, GNUTLS_X509_FMT_PEM);*/ #endif gtk_widget_show_all(wndMain); #ifndef __MINGW32__ /* We don't want SIGPIPEs killing us */ signal(SIGPIPE, SIG_IGN); #endif /* Open worlds given in command line */ while (argpos < argc) { if (!opened_one) { /* First one uses the first GUI */ opened_one |= open_new_world(gui, argv[argpos], FALSE, NULL); } else { opened_one |= open_new_world(NULL, argv[argpos], FALSE, NULL); } ++argpos; } if (!opened_one) { if (!open_new_world(gui, NULL, FALSE, NULL)) return 0; } g_timeout_add(500, update_times_cb, NULL); gtk_main(); /* Save and free all words that happen to be open yet. */ while (open_worlds) { World *world = (World *) open_worlds->data; if (world->connected || world->connecting) { /* This leaks the return value, but we are exiting the program. */ close_connection(world, TRUE); } save_world_to_file(world); save_command_history(world); save_permanent_variables(world); free_world(world); open_worlds = open_worlds->next; } save_global_preferences(); save_world_to_file(default_world); PERL_SYS_TERM(); #ifdef HAVE_LIBGNUTLS gnutls_certificate_free_credentials(tls_certif_cred); gnutls_global_deinit(); #endif if (dumpFile) { fclose(dumpFile); } if (rdumpFile) { fclose(rdumpFile); } return 0; } gboolean confirm_quit(void) { GList *worldptr; int n_open; gboolean retval = FALSE; GtkWidget *msgdlg; n_open = 0; worldptr = open_worlds; while (worldptr) { World *world = (World *) worldptr->data; if ((world->connected || world->connecting) && !world->hooks.OnCloseConnected) { ++n_open; } worldptr = worldptr->next; } if (n_open == 0) { return TRUE; } if (n_open == 1) { msgdlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("There is one open world. Do you really want to quit?")); } else { msgdlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("There are %d open worlds. Do you really want to quit?"), n_open); } gtk_window_set_title(GTK_WINDOW(msgdlg), _("Really Quit KildClient?")); gtk_dialog_add_buttons(GTK_DIALOG(msgdlg), _("_Don't quit"), GTK_RESPONSE_NO, _("_Quit"), GTK_RESPONSE_YES, NULL); if (gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { retval = TRUE; } gtk_widget_destroy(msgdlg); return retval; } /* * Functions to get the user path (e.g. ~/.kildclient) and the * directory where the data files are installed. */ #ifndef __WIN32__ #include const char * get_kildclient_directory_path(void) { char *homedir; if (!kc_user_dir) { homedir = getenv("HOME"); kc_user_dir = g_strdup_printf("%s/.kildclient", homedir); } return kc_user_dir; } const char * get_kildclient_installed_file(const char *file) { /* Gets the path to a file in the data directory (typically * /usr/share/kildclient) */ static char path[PATH_MAX]; strcpy(path, PKGDATADIR "/"); strcat(path, file); return path; } #else /* __WIN32__ */ const char * get_kildclient_directory_path(void) { char appdatadir[MAX_PATH]; if (!kc_user_dir) { if (SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, appdatadir) >= 0) { kc_user_dir = g_strdup_printf("%s\\kildclient", appdatadir); } else { /* Shouldn't fail, but... */ kc_user_dir = g_strdup("c:\\kildclient"); } } return kc_user_dir; } const char * get_kildclient_installed_file(const char *file) { /* Under windows, paths start at the same directory that kildclient.exe is in. file is the name of a file that should be in the same directory as kildclient.exe. This function finds the installation directory and returns the full path to that file. */ static char path[PATH_MAX]; char *pos; GetModuleFileName(NULL, path, PATH_MAX - 1); pos = strrchr(path, '\\'); strcpy(pos + 1, file); return path; } #endif kildclient-3.0.0/src/dlgAbout.ui0000644000175000017500000000441712367156733013467 00000000000000 True False 5 normal KildClient Copyright © 2004-2014 Eduardo M Kalinowski A mud client with powerful features and support for Perl Scripting http://www.kildclient.org Visit http://www.kildclient.org Eduardo M Kalinowski <eduardo@kalinowski.com.br> Brazilian Portuguese: Eduardo M Kalinowski <eduardo@kalinowski.com.br> Esperanto: Eduardo M Kalinowski <eduardo@kalinowski.com.br> German: René Küttner <rkulpz@users.sourceforge.net> Swedish: Niklas Grahn <terra.unknown@yahoo.com> image-missing gpl-2-0 False vertical False False True end 0 kildclient-3.0.0/src/kcircularqueue.h0000644000175000017500000000733412331157500014545 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __KCIRCULARARRAY_H #define __KCIRCULARARRAY_H #include /** A queue in which you can push elements in one end and pop them off the other end. Elements can be of any size, but must be all of the same type (and size). It grows as necessary when new elements are added. Internally, it is represented as a circular array for efficiency. */ typedef struct _KCircularQueue { char *data; size_t el_size; unsigned int allocated_size; unsigned int size; unsigned int first; unsigned int first_free; unsigned int free_until_end; } KCircularQueue; /** Creates a new KCircularQueue. @param el_size The size of the elements of the queue. @param how_many Number of elements to allocate. @return The newly created KCircularQueue. */ KCircularQueue *k_circular_queue_new (size_t el_size, unsigned int how_many); /** Frees memory used by a KCircularQueue. @param q The KCircularQueue. The pointer will be invalid after the call to this function. */ void k_circular_queue_free (KCircularQueue *q); /** Pushes several copies of an element in the end of a KCircularQueue. @param q The KCircularQueue to push elements into. @param val A pointer to the element to push. @param n The number of copies of the element to push. */ void k_circular_queue_push_copies(KCircularQueue *q, const void *val, unsigned int n); /** Removes elements from the front of the KCircularQueue.. @param q The KCircularQueue to remove elements from. @param n The number of elements to remove. */ void k_circular_queue_pop (KCircularQueue *q, unsigned int n); /** Returns the number of elements in a KCircularQueue. @param q The KCircularQueue. @return The number of elements.. */ #define k_circular_queue_size(q) (q->size) /** Pushes an element in the end of a KCircularQueue. @param q The KCircularQueue to push elements into. @param val The element to push. */ #define k_circular_queue_push(q, v) k_circular_queue_push_copies(q, &(v), 1) /** Retrieves a given element from a KCircularQueue. @param q The KCircularQueue. @param t The type of the element (int, double, etc.) @param i The index of the element to retrieve. @return The element, cast to the given type. */ #define k_circular_queue_nth(q, t, i) *((t *) _k_circular_queue_nth(q, i)) /************************************************************* * Private functions * *************************************************************/ void _k_circular_queue_realloc(KCircularQueue *q, unsigned int new_size); const void *_k_circular_queue_nth (KCircularQueue *q, unsigned int i); #endif /* __KCIRCULARARRAY_H */ kildclient-3.0.0/src/worldgui.c0000644000175000017500000014723412376077356013377 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "libintl-wrapper.h" #include #include #ifdef __WIN32__ # include # include #endif #include "kcircularqueue.h" #include "simocombobox.h" #include "kildclient.h" #include "ansi.h" #include "perlscript.h" /****************** * File variables * ******************/ static gboolean hovering_over_link = FALSE; static GdkCursor *hand_cursor = NULL; static GdkCursor *regular_cursor = NULL; /*********************** * Function prototypes * ***********************/ static void combo_changed_cb(SimoComboBox *combo, gpointer data); static void combo_poped_cb(SimoComboBox *combo, gpointer data); static void combo_closed_cb(SimoComboBox *combo, gpointer data); static void n_lines_changed_cb(SimoComboBox *combo, gpointer data); static void activate_cb(SimoComboBox *cmb, gpointer data); static gboolean keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void text_changed_cb(SimoComboBox *cmb, gpointer data); static void cursor_moved_cb(GtkTextBuffer *buffer, GtkTextIter *iter, GtkTextMark *mark, gpointer data); static gboolean completion_function(GtkEntryCompletion *completion, const gchar *key, GtkTreeIter *iter, gpointer user_data); static gboolean completion_match_selected_cb(GtkEntryCompletion *widget, GtkTreeModel *model, GtkTreeIter *iter, gpointer data); static void tab_close_cb(GtkWidget *widget, gpointer data); static gboolean textview_button_press_cb(GtkWidget *text_view, GdkEventButton *event, gpointer data); static gboolean act_if_link(WorldGUI *gui, GtkTextIter *iter, GtkWidget *widget, GdkEventButton *event); static gboolean textview_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data); static void set_cursor_if_appropriate(GtkTextView *text_view, WorldGUI *gui, gint x, gint y); static gboolean worldgui_query_tooltip_cb(GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer data); static gchar *worldgui_get_tooltip_text(WorldGUI *gui, GtkTextView *text_view, gint win_x, gint win_y); static void textview_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data); static void find_incremental_cb(GtkEditable *widget, gpointer data); static void do_find(WorldGUI *gui); static void close_search_box_cb(GtkButton *widget, gpointer data); static gboolean search_box_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void scrolled_win_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data); static void scrolled_win_value_changed_cb(GtkAdjustment *adjustment, gpointer data); static gboolean set_split_to_zero(gpointer data); /* XML UI Signals */ G_MODULE_EXPORT void menu_popup_url_copy(GtkMenuItem *menu, gchar *url); WorldGUI * world_gui_new(gboolean is_for_mud) { /* is_for_mud determines the kind of GUI we're creating. If TRUE, it is used for really displaying MUD output, and it will be included in the notebook. If FALSE, it is a KCWin gui, and it has less features. */ WorldGUI *gui; GtkWidget *frame; GtkAdjustment *verticalAdjust; GtkTreeViewColumn *column; GtkCellRenderer *renderer; PangoFontDescription *fontDesc; GtkTextIter end_iter; GdkRGBA black = { 0, 0, 0, 1 }; GdkRGBA blue = { 0.58, 0.79, 0.93, 1 }; /* First, create the cursors if this is the first run */ if (!hand_cursor) { hand_cursor = gdk_cursor_new(GDK_HAND2); regular_cursor = gdk_cursor_new(GDK_XTERM); } gui = g_new0(WorldGUI, 1); gui->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); g_object_set_data(G_OBJECT(gui->vbox), "gui", gui); gui->scrolled_win = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); gtk_scrolled_window_set_policy(gui->scrolled_win, GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gui->txtView = GTK_TEXT_VIEW(gtk_text_view_new()); gtk_text_view_set_editable(gui->txtView, FALSE); gui->txtBuffer = gtk_text_view_get_buffer(gui->txtView); /* Store a mark at the end, to allow scrolling to it */ gtk_text_buffer_get_iter_at_offset(gui->txtBuffer, &end_iter, -1); gui->txtmark_end = gtk_text_buffer_create_mark(gui->txtBuffer, "end", &end_iter, FALSE); gtk_container_add(GTK_CONTAINER(gui->scrolled_win), GTK_WIDGET(gui->txtView)); if (is_for_mud) { g_signal_connect(G_OBJECT(gui->scrolled_win), "size-allocate", G_CALLBACK(scrolled_win_size_allocate_cb), gui); verticalAdjust = gtk_scrolled_window_get_vadjustment(gui->scrolled_win); g_signal_connect(G_OBJECT(verticalAdjust), "value-changed", G_CALLBACK(scrolled_win_value_changed_cb), gui); /* Second TextView for split screen */ gui->scrwinScroll = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); gtk_scrolled_window_set_policy(gui->scrwinScroll, GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gui->txtViewScroll = GTK_TEXT_VIEW(gtk_text_view_new_with_buffer(gui->txtBuffer)); gtk_text_view_set_editable(gui->txtViewScroll, FALSE); gtk_container_add(GTK_CONTAINER(gui->scrwinScroll), GTK_WIDGET(gui->txtViewScroll)); /* Create split pane */ gui->split_pane = GTK_PANED(gtk_paned_new(GTK_ORIENTATION_VERTICAL)); gtk_paned_pack1(gui->split_pane, GTK_WIDGET(gui->scrwinScroll), FALSE, TRUE); gtk_paned_pack2(gui->split_pane, GTK_WIDGET(gui->scrolled_win), TRUE, TRUE); /* For some reason, we cannot set to 0 directly. */ g_idle_add(set_split_to_zero, gui); gtk_box_pack_start(GTK_BOX(gui->vbox), GTK_WIDGET(gui->split_pane), TRUE, TRUE, 0); } else { /* No split screen. However, we create the text view so that the functions that configure it do not fail. */ gui->txtViewScroll = GTK_TEXT_VIEW(gtk_text_view_new_with_buffer(gui->txtBuffer)); gtk_box_pack_start(GTK_BOX(gui->vbox), GTK_WIDGET(gui->scrolled_win), TRUE, TRUE, 0); } if (is_for_mud) { /* Search box */ GtkWidget *btnClose; GtkWidget *label; gui->search_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); gtk_container_set_border_width(GTK_CONTAINER(gui->search_box), 2); g_object_set(G_OBJECT(gui->search_box), "no-show-all", TRUE, NULL); btnClose = gtk_button_new_from_icon_name("window-close", GTK_ICON_SIZE_BUTTON); gtk_button_set_relief(GTK_BUTTON(btnClose), GTK_RELIEF_NONE); g_signal_connect(G_OBJECT(btnClose), "clicked", G_CALLBACK(close_search_box_cb), gui); gtk_box_pack_start(GTK_BOX(gui->search_box), btnClose, FALSE, FALSE, 0); label = gtk_label_new_with_mnemonic(_("_Find:")); gtk_box_pack_start(GTK_BOX(gui->search_box), label, FALSE, FALSE, 0); gui->txtSearchTerm = gtk_entry_new(); gtk_label_set_mnemonic_widget(GTK_LABEL(label), gui->txtSearchTerm); g_signal_connect(G_OBJECT(gui->txtSearchTerm), "changed", G_CALLBACK(find_incremental_cb), gui); g_signal_connect(G_OBJECT(gui->txtSearchTerm), "activate", G_CALLBACK(menu_findnext_activate_cb), NULL); g_signal_connect(G_OBJECT(gui->txtSearchTerm), "key-press-event", G_CALLBACK(search_box_keypress_cb), gui); gtk_box_pack_start(GTK_BOX(gui->search_box), gui->txtSearchTerm, FALSE, FALSE, 0); gui->btnFindNext = gtk_button_new_with_label(_("Find Next")); gtk_button_set_relief(GTK_BUTTON(gui->btnFindNext), GTK_RELIEF_NONE); g_signal_connect(G_OBJECT(gui->btnFindNext), "clicked", G_CALLBACK(find_next_cb), gui); gtk_box_pack_start(GTK_BOX(gui->search_box), gui->btnFindNext, FALSE, FALSE, 0); gui->lblSearchInfo = GTK_LABEL(gtk_label_new(NULL)); gtk_box_pack_start(GTK_BOX(gui->search_box), GTK_WIDGET(gui->lblSearchInfo), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(gui->vbox), gui->search_box, FALSE, FALSE, 0); } /* Command area */ gui->commandArea = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); gtk_container_set_border_width(GTK_CONTAINER(gui->commandArea), 2); gui->btnClear = gtk_button_new_from_icon_name("edit-clear", GTK_ICON_SIZE_MENU); g_signal_connect(G_OBJECT(gui->btnClear), "clicked", G_CALLBACK(clear_button_cb), gui); gtk_box_pack_start(GTK_BOX(gui->commandArea), gui->btnClear, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(gui->btnClear, _("Click to clear the command input area.")); if (is_for_mud) { /* The full-featured SimoComboBox */ gui->cmbEntry = SIMO_COMBO_BOX(simo_combo_box_new()); g_signal_connect(G_OBJECT(gui->cmbEntry), "size-changed", G_CALLBACK(n_lines_changed_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry), "clicked", G_CALLBACK(combo_changed_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry), "popup-displayed", G_CALLBACK(combo_poped_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry), "popup-closed", G_CALLBACK(combo_closed_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry), "activate", G_CALLBACK(activate_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry->txtview), "key-press-event", G_CALLBACK(keypress_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry->entry), "key-press-event", G_CALLBACK(keypress_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry), "changed", G_CALLBACK(text_changed_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry->txtbuffer), "mark-set", G_CALLBACK(cursor_moved_cb), gui); gtk_box_pack_start(GTK_BOX(gui->commandArea), GTK_WIDGET(gui->cmbEntry), TRUE, TRUE, 0); /* Configure renderer for combo column */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, (GtkTreeCellDataFunc) completion_cell_data_function, NULL, NULL); simo_combo_box_set_combo_column(gui->cmbEntry, column); } else { /* Just a GtkEntry */ gui->txtEntry = GTK_ENTRY(gtk_entry_new()); gtk_box_pack_start(GTK_BOX(gui->commandArea), GTK_WIDGET(gui->txtEntry), TRUE, TRUE, 0); } gtk_box_pack_start(GTK_BOX(gui->vbox), gui->commandArea, FALSE, FALSE, 0); /* Keep the focus always in the entry box */ g_signal_connect_swapped(G_OBJECT(gui->txtView), "focus-in-event", G_CALLBACK(gtk_widget_grab_focus), gui->cmbEntry); if (is_for_mud) { g_signal_connect_swapped(G_OBJECT(gui->txtViewScroll), "focus-in-event", G_CALLBACK(gtk_widget_grab_focus), gui->cmbEntry); } /* Set initial colors and state */ gui->ta_state.fg_color = gui->saved_ta_state.fg_color = ANSI_DEFAULT_COLOR_IDX; gui->ta_state.bg_color = gui->saved_ta_state.bg_color = ANSI_DEFAULT_COLOR_IDX; gui->ta_state.underline = PANGO_UNDERLINE_NONE; /* Create tag for text with attributes */ gui->ta.underline_tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "underline", PANGO_UNDERLINE_SINGLE, NULL); gui->ta.dblunderline_tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "underline", PANGO_UNDERLINE_DOUBLE, NULL); gui->ta.strike_tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "strikethrough", TRUE, NULL); gui->ta.italics_tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "style", PANGO_STYLE_ITALIC, NULL); /* Initialize structures in TextAppearance */ gui->ta.rgb_fore_tags = g_hash_table_new(NULL, NULL); gui->ta.rgb_back_tags = g_hash_table_new(NULL, NULL); /* We don't know yet which characters are supported. */ gui->ta.sup_geom_shapes = -1; gui->ta.sup_block = -1; gui->ta.sup_control = -1; gui->ta.sup_l1_supplement = -1; gui->ta.sup_box_drawing = -1; gui->ta.sup_misc_tech = -1; gui->ta.sup_math = -1; gui->ta.sup_greek = -1; if (is_for_mud) { /* Special features */ GtkWidget *btnClose; /* Notebook tab */ gui->hboxTab = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4)); gui->lblNotebook = GTK_LABEL(gtk_label_new(_("No world"))); gtk_box_pack_start(gui->hboxTab, GTK_WIDGET(gui->lblNotebook), FALSE, FALSE, 0); btnClose = gtk_button_new_from_icon_name("window-close", GTK_ICON_SIZE_BUTTON); /* Make the button smaller. (Taken from gedit code) */ gtk_button_set_focus_on_click(GTK_BUTTON(btnClose), FALSE); gtk_button_set_relief(GTK_BUTTON(btnClose), GTK_RELIEF_NONE); g_signal_connect(G_OBJECT(btnClose), "clicked", G_CALLBACK(tab_close_cb), gui); gtk_box_pack_start(GTK_BOX(gui->hboxTab), btnClose, FALSE, FALSE, 0); /* The color and font will be changed later to the colors and font of the opened world, but we set the background to black so that is appears black while the world is being selected, and the font to a default font so that the size can be calculated correctly. */ fontDesc = pango_font_description_from_string(DEFAULT_TERMINAL_FONT); gtk_widget_override_font(GTK_WIDGET(gui->txtView), fontDesc); gtk_widget_override_font(GTK_WIDGET(gui->txtViewScroll), fontDesc); pango_font_description_free(fontDesc); gtk_widget_override_background_color(GTK_WIDGET(gui->txtView), GTK_STATE_FLAG_NORMAL, &black); gtk_widget_override_background_color(GTK_WIDGET(gui->txtView), GTK_STATE_FLAG_SELECTED, &blue); gtk_widget_override_color(GTK_WIDGET(gui->txtView), GTK_STATE_FLAG_SELECTED, &black); gtk_widget_override_background_color(GTK_WIDGET(gui->txtViewScroll), GTK_STATE_FLAG_NORMAL, &black); gtk_widget_override_background_color(GTK_WIDGET(gui->txtViewScroll), GTK_STATE_FLAG_SELECTED, &blue); gtk_widget_override_color(GTK_WIDGET(gui->txtViewScroll), GTK_STATE_FLAG_SELECTED, &black); /* Detect resizes */ g_signal_connect(G_OBJECT(gui->txtView), "size-allocate", G_CALLBACK(textview_size_allocate_cb), gui); /* Create a mark to hold the start of the current line */ gui->txtmark_linestart = gtk_text_buffer_create_mark(gui->txtBuffer, "linestart", &end_iter, TRUE); /* Create tag for URLs */ gui->txttag_url = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "underline", PANGO_UNDERLINE_SINGLE, NULL); /* URLs support */ g_signal_connect(gui->txtView, "button-press-event", G_CALLBACK(textview_button_press_cb), gui); g_signal_connect(gui->txtViewScroll, "button-press-event", G_CALLBACK(textview_button_press_cb), gui); g_signal_connect(gui->txtView, "motion-notify-event", G_CALLBACK(textview_motion_notify_event), gui); g_signal_connect(gui->txtViewScroll, "motion-notify-event", G_CALLBACK(textview_motion_notify_event), gui); /* Tooltips */ g_signal_connect(G_OBJECT(gui->txtView), "query-tooltip", G_CALLBACK(worldgui_query_tooltip_cb), gui); g_signal_connect(G_OBJECT(gui->txtViewScroll), "query-tooltip", G_CALLBACK(worldgui_query_tooltip_cb), gui); /* Status bar */ gui->statusbar_box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4)); gui->lblStatus = GTK_LABEL(gtk_label_new(_("KildClient ready"))); gtk_misc_set_alignment(GTK_MISC(gui->lblStatus), 0, 0.5); gtk_label_set_single_line_mode(gui->lblStatus, TRUE); gtk_label_set_ellipsize(gui->lblStatus, PANGO_ELLIPSIZE_END); gtk_box_pack_start(gui->statusbar_box, GTK_WIDGET(gui->lblStatus), TRUE, TRUE, 0); gui->lblLines = GTK_LABEL(gtk_label_new(_("0 lines"))); gtk_misc_set_alignment(GTK_MISC(gui->lblLines), 0, 0.5); gtk_label_set_single_line_mode(gui->lblLines, TRUE); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(frame), GTK_WIDGET(gui->lblLines)); gtk_box_pack_start(gui->statusbar_box, frame, FALSE, FALSE, 0); gui->lblTime = GTK_LABEL(gtk_label_new(NULL)); gtk_misc_set_alignment(GTK_MISC(gui->lblTime), 0, 0.5); gtk_label_set_single_line_mode(gui->lblTime, TRUE); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(frame), GTK_WIDGET(gui->lblTime)); gtk_box_pack_start(gui->statusbar_box, frame, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(gui->vbox), GTK_WIDGET(gui->statusbar_box), FALSE, FALSE, 0); /* Clear lines at the beginning of the buffer to keep it to a reasonable size. */ gui->prune_timeout_id = g_timeout_add(1000, ansitextview_prune_extra_lines, gui); } return gui; } void world_gui_size_textview(WorldGUI *gui) { gint char_height; gint char_width; ansitextview_get_char_size(gui, &char_height, &char_width); gtk_widget_set_size_request(GTK_WIDGET(gui->txtView), 80 * char_width, 24 * char_height); } void worldgui_determine_supported_chars(WorldGUI *gui) { PangoContext *context; PangoFontDescription *fontdesc; PangoFont *font; PangoCoverage *coverage; if (gui->ta.sup_geom_shapes != -1) { return; /* There are cached values */ } context = gtk_widget_get_pango_context(GTK_WIDGET(gui->txtView)); fontdesc = pango_font_description_from_string(gui->world->terminalfont); font = pango_context_load_font(context, fontdesc); coverage = pango_font_get_coverage(font, pango_context_get_language(context)); /* U+25C6 BLACK DIAMOND */ gui->ta.sup_geom_shapes = pango_coverage_get(coverage, 0x25C6); /* U+2592 MEDIUM SHADE */ gui->ta.sup_block = pango_coverage_get(coverage, 0x2592); /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */ gui->ta.sup_control = pango_coverage_get(coverage, 0x2409); /* U+00B0 DEGREE SIGN */ gui->ta.sup_l1_supplement = pango_coverage_get(coverage, 0x00B0); /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */ gui->ta.sup_box_drawing = pango_coverage_get(coverage, 0x2518); /* U+23BA HORIZONTAL SCAN LINE-1 */ gui->ta.sup_misc_tech = pango_coverage_get(coverage, 0x23BA); /* U+2264 LESS-THAN OR EQUAL TO */ gui->ta.sup_math = pango_coverage_get(coverage, 0x2264); /* U+03C0 GREEK SMALL LETTER PI */ gui->ta.sup_greek = pango_coverage_get(coverage, 0x03C0); pango_font_description_free(fontdesc); pango_coverage_unref(coverage); } void free_world_gui(WorldGUI *gui) { if (gui->prune_timeout_id) { g_source_remove(gui->prune_timeout_id); } /* The tags themselves are supposed to be destroyed when the TextBuffer is destroyed, which happens when the widget is destroyed. */ g_free(gui->ta.ansi_fore_tags); g_free(gui->ta.ansi_back_tags); g_hash_table_destroy(gui->ta.rgb_fore_tags); g_hash_table_destroy(gui->ta.rgb_back_tags); if (gui->line_times) { k_circular_queue_free(gui->line_times); } g_free(gui); } static void combo_changed_cb(SimoComboBox *combo, gpointer data) { GtkTreeIter current; World *world; gchar *command; world = ((WorldGUI *) data)->world; if (simo_combo_box_get_active_iter(combo, ¤t)) { world->current_cmd = current; command = cmdhistory_get_command(world->cmd_list, ¤t); simo_combo_box_set_text(combo, command); world->cmd_just_selected_from_combo = TRUE; g_free(command); } } static void combo_poped_cb(SimoComboBox *combo, gpointer data) { World *world = ((WorldGUI *) data)->world; gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &world->current_cmd, CMDLIST_COL_TENTATIVE, simo_combo_box_get_text(combo), -1); world->combo_is_poped = TRUE; } static void combo_closed_cb(SimoComboBox *combo, gpointer data) { World *world = ((WorldGUI *) data)->world; world->combo_is_poped = FALSE; } static void n_lines_changed_cb(SimoComboBox *combo, gpointer data) { World *world = ((WorldGUI *) data)->world; world->input_n_lines = simo_combo_box_get_n_lines(combo); set_input_line_controls(world, NULL, NULL, NULL); } static void activate_cb(SimoComboBox *cmb, gpointer data) { World *world = ((WorldGUI *) data)->world; if (world) { const gchar *str; str = simo_combo_box_get_text(cmb); parse_commands(world, str); /* Ignore empty commands and passwords */ if (strcmp(str, "") != 0 && !world->noecho) { add_recent_command(world, str); } } if (world->noecho || !world->repeat_commands) simo_combo_box_set_text(cmb, ""); else simo_combo_box_select_region(cmb, 0, -1); if (world->itime_reset_activate) { world->last_command_time = time(NULL); } world->cmd_position_changed = FALSE; } static gboolean keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { WorldGUI *gui = (WorldGUI *) data; World *world = gui->world; GtkAdjustment *adjustment; int direction = 1; gdouble newval; if (world->print_next_keycode) { if (gtk_accelerator_valid(evt->keyval, evt->state)) { world->keycode_to_print = gtk_accelerator_name(evt->keyval, evt->state); ansitextview_append_stringf(world->gui, "Key code: %s\n", world->keycode_to_print); world->print_next_keycode = FALSE; gtk_main_quit(); } return TRUE; } switch (evt->keyval) { case GDK_KEY_Left: case GDK_KEY_KP_Left: if (evt->state & GDK_MOD1_MASK) { /* Alt+left */ menu_perl_run_cb(NULL, "$world->prev"); return TRUE; } break; case GDK_KEY_Right: case GDK_KEY_KP_Right: if (evt->state & GDK_MOD1_MASK) { /* Alt+right */ menu_perl_run_cb(NULL, "$world->next"); return TRUE; } break; case GDK_KEY_Tab: case GDK_KEY_ISO_Left_Tab: if (evt->state & GDK_CONTROL_MASK) { if (evt->state & GDK_SHIFT_MASK) { /* Ctrl+Shift+Tab */ menu_perl_run_cb(NULL, "$world->prev"); } else { /* Ctrl+Tab */ menu_perl_run_cb(NULL, "$world->next"); } return TRUE; } break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (evt->state & GDK_MOD1_MASK) { /* Alt+digit */ guint newpage = evt->keyval - '1'; if (newpage < g_list_length(open_worlds)) { set_focused_world(newpage); } return TRUE; } break; case GDK_KEY_Up: case GDK_KEY_KP_Up: direction = 0; /* Fall through */ case GDK_KEY_Down: case GDK_KEY_KP_Down: /* Do nothing if option to ignore these keys is active. */ if (world->ignore_up_down_keys) { return FALSE; } /* Do nothing if arrows have been used to move around the multi-line input bar */ if (world->input_n_lines > 1 && world->cmd_position_changed) { return FALSE; } prev_or_next_command(world, direction); return TRUE; case GDK_KEY_Page_Up: case GDK_KEY_KP_Page_Up: direction = -1; /* Fall through */ case GDK_KEY_Page_Down: case GDK_KEY_KP_Page_Down: /* If the scrollback window is visible, move that */ if (gtk_paned_get_position(gui->split_pane) > 0) { adjustment = gtk_scrolled_window_get_vadjustment(gui->scrwinScroll); } else { adjustment = gtk_scrolled_window_get_vadjustment(gui->scrolled_win); } newval = gtk_adjustment_get_value(adjustment) + direction*gtk_adjustment_get_page_increment(adjustment)/2; if (newval > (gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment))) { newval = gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment); } gtk_adjustment_set_value(adjustment, newval); gtk_adjustment_changed(adjustment); return TRUE; case GDK_KEY_End: case GDK_KEY_KP_End: if (evt->state & GDK_CONTROL_MASK) { adjustment = gtk_scrolled_window_get_vadjustment(gui->scrolled_win); gtk_adjustment_set_value(adjustment, gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment)); gtk_adjustment_changed(adjustment); return TRUE; } break; } return check_macros(world, evt->keyval, evt->state); } static void text_changed_cb(SimoComboBox *cmb, gpointer data) { World *world = ((WorldGUI *) data)->world; const gchar *command; if (world->gui->execute_changed_signal && !world->combo_is_poped) { if (!world->cmd_just_selected_from_combo) { command = simo_combo_box_get_text(cmb); insert_recent_command(world, command); /* Set the pointer to point to the new command */ gtk_tree_model_get_iter_first(world->cmd_list, &world->current_cmd); } else { insert_recent_command(world, ""); } world->gui->execute_changed_signal = FALSE; world->cmd_has_been_edited = TRUE; world->cmd_just_selected_from_combo = FALSE; if (world->saved_command_find_search) { g_free(world->saved_command_find_search); world->saved_command_find_search = NULL; } } } static void cursor_moved_cb(GtkTextBuffer *buffer, GtkTextIter *iter, GtkTextMark *mark, gpointer data) { WorldGUI *gui = (WorldGUI *) data; const gchar *name; name = gtk_text_mark_get_name(mark); if (!name || strcmp(name, "insert") != 0) { return; } if (gui->world) { gui->world->cmd_position_changed = TRUE; } } void completion_cell_data_function(GtkCellLayout *cell_layout, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { /* Used in the combo box and completion display. If there is a tentative command, displays it, otherwise displays the normal text. */ gchar *command; command = cmdhistory_get_command(model, iter); g_object_set(renderer, "text", command, NULL); g_free(command); } static gboolean completion_function(GtkEntryCompletion *completion, const gchar *key, GtkTreeIter *iter, gpointer user_data) { GtkTreeModel *model; gchar *command; gchar *normalized_command; gchar *case_normalized_command; gboolean ret = FALSE; model = (GtkTreeModel *) user_data; command = cmdhistory_get_command(model, iter); if (!command) { return FALSE; } normalized_command = g_utf8_normalize(command, -1, G_NORMALIZE_ALL); case_normalized_command = g_utf8_casefold(normalized_command, -1); if (strncmp(key, case_normalized_command, strlen(key)) == 0) { ret = TRUE; } g_free(case_normalized_command); g_free(normalized_command); g_free(command); return ret; } static gboolean completion_match_selected_cb(GtkEntryCompletion *widget, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { World *world = (World *) user_data; gchar *command; command = cmdhistory_get_command(model, iter); simo_combo_box_set_text(world->gui->cmbEntry, command); simo_combo_box_set_position(world->gui->cmbEntry, -1); g_free(command); return TRUE; } static void tab_close_cb(GtkWidget *widget, gpointer data) { WorldGUI *gui = (WorldGUI *) data; World *world = gui->world; if (world->connected) { GtkWidget *msgdlg; gint response; msgdlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Are you sure you want to close this world?")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("Really close?")); gtk_dialog_add_buttons(GTK_DIALOG(msgdlg), _("Keep _open"), GTK_RESPONSE_NO, _("_Close"), GTK_RESPONSE_YES, NULL); gtk_widget_show_all(msgdlg); response = gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); if (response != GTK_RESPONSE_YES) { return; } } remove_world(world, TRUE); } void clear_button_cb(GtkButton *button, gpointer data) { gchar *last_path; WorldGUI *gui = (WorldGUI *) data; World *world = gui->world; if (world) { simo_combo_box_clear_text(gui->cmbEntry); /* So that up key recalls the previous command */ last_path = g_strdup_printf("%d", world->cmd_list_size - 1); gtk_tree_model_get_iter_from_string(world->cmd_list, &world->current_cmd, last_path); } else { gtk_entry_set_text(gui->txtEntry, ""); } gtk_widget_grab_focus(GTK_WIDGET(gui->cmbEntry)); } void configure_gui(WorldGUI *gui, World *world) { PangoFontDescription *fontDesc; GtkEntryCompletion *completion; GtkCellRenderer *renderer; fontDesc = pango_font_description_from_string(world->terminalfont); gtk_widget_override_font(GTK_WIDGET(gui->txtView), fontDesc); gtk_widget_override_font(GTK_WIDGET(gui->txtViewScroll), fontDesc); pango_font_description_free(fontDesc); fontDesc = pango_font_description_from_string(world->entryfont); if (gui->world) { simo_combo_box_set_entry_font(gui->cmbEntry, fontDesc); } else { gtk_widget_override_font(GTK_WIDGET(gui->txtEntry), fontDesc); } pango_font_description_free(fontDesc); if (gui->lblStatus) { fontDesc = pango_font_description_from_string(world->statusfont); gtk_widget_override_font(GTK_WIDGET(gui->lblStatus), fontDesc); pango_font_description_free(fontDesc); } gtk_text_view_set_wrap_mode(gui->txtView, world->wrap ? GTK_WRAP_WORD_CHAR : GTK_WRAP_CHAR); gtk_text_view_set_indent(gui->txtView, -world->wrap_indent); gtk_text_view_set_wrap_mode(gui->txtViewScroll, world->wrap ? GTK_WRAP_WORD_CHAR : GTK_WRAP_CHAR); gtk_text_view_set_indent(gui->txtViewScroll, -world->wrap_indent); /* If this GUI is for a MUD, and not for a KCWin */ if (gui->world) { simo_combo_box_set_model(gui->cmbEntry, world->cmd_list); completion = simo_combo_box_get_completion(gui->cmbEntry); if (world->autocompletion) { gtk_entry_completion_set_minimum_key_length(completion, world->autocompl_minprefix); } else { gtk_entry_completion_set_minimum_key_length(completion, 9999); } /* Configure rendererer for completion */ renderer = gtk_cell_renderer_text_new(); simo_combo_box_set_completion_renderer(gui->cmbEntry, renderer); simo_combo_box_set_completion_cell_func(gui->cmbEntry, renderer, completion_cell_data_function, NULL, NULL); gtk_entry_completion_set_match_func(completion, completion_function, world->cmd_list, NULL); /* Correct behaviour when a completion is selected */ g_signal_connect(G_OBJECT(completion), "match-selected", G_CALLBACK(completion_match_selected_cb), world); /* Set up structure to hold time of each line's arrival */ gui->line_times = k_circular_queue_new(sizeof(time_t), world->buffer_lines); /* Size of input box */ simo_combo_box_set_n_lines(gui->cmbEntry, world->input_n_lines); /* Spell checking. */ worldgui_configure_spell(gui); /* Tooltips */ gtk_widget_set_has_tooltip(GTK_WIDGET(gui->txtView), gui->world->use_tooltips); gtk_widget_set_has_tooltip(GTK_WIDGET(gui->txtViewScroll), gui->world->use_tooltips); } } void worldgui_configure_spell(WorldGUI *gui) { #ifdef HAVE_GTKSPELL GError *error = NULL; simo_combo_box_set_spell(gui->cmbEntry, gui->world->spell, gui->world->spell_language, &error); if (error) { ansitextview_append_stringf(gui,_("Error setting spell checker: %s\n"), error->message); g_error_free(error); } #else ansitextview_append_string_nl(gui, _("Spell checking support not included in this build.")); #endif } static gboolean textview_button_press_cb(GtkWidget *text_view, GdkEventButton *event, gpointer data) { WorldGUI *gui; GtkTextIter iter; gint x, y; gui = (WorldGUI *) data; if (event->button != GDK_BUTTON_PRIMARY && event->button != GDK_BUTTON_SECONDARY) { return FALSE; } gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(text_view), GTK_TEXT_WINDOW_WIDGET, event->x, event->y, &x, &y); gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(text_view), &iter, x, y); return act_if_link(gui, &iter, text_view, event); } static gboolean act_if_link(WorldGUI *gui, GtkTextIter *iter, GtkWidget *widget, GdkEventButton *event) { GtkTextIter start; GtkTextIter end; gchar *matched_url; if (!gtk_text_iter_has_tag(iter, gui->txttag_url)) { return FALSE; } start = end = *iter; if (!gtk_text_iter_backward_to_tag_toggle(&start, gui->txttag_url)) { /* Not found must mean we are at the tag boundary */ start = *iter; } if (!gtk_text_iter_forward_to_tag_toggle(&end, gui->txttag_url)) { /* Not found must mean we are at the tag boundary */ end = *iter; } matched_url = gtk_text_buffer_get_text(gui->txtBuffer, &start, &end, FALSE); if (event->button == GDK_BUTTON_PRIMARY) { menu_url_open(NULL, matched_url); } else { GtkBuilder *ui_builder; GError *error = NULL; GtkMenu *mnuPopupURL; ui_builder = gtk_builder_new(); if (!gtk_builder_add_from_file(ui_builder, get_kildclient_installed_file("mnuPopupURL.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return TRUE; } mnuPopupURL = GTK_MENU(gtk_builder_get_object(ui_builder, "mnuPopupURL")); gtk_widget_show_all(GTK_WIDGET(mnuPopupURL)); gtk_builder_connect_signals(ui_builder, matched_url); gtk_menu_attach_to_widget(mnuPopupURL, widget, NULL); gtk_menu_popup(mnuPopupURL, NULL, NULL, NULL, NULL, event->button, event->time); g_object_unref(ui_builder); } return TRUE; } #ifndef __WIN32__ void menu_url_open(GtkMenuItem *menu, char *url) { char *to_run; to_run = g_strdup_printf(globalPrefs.browser_command, url); system(to_run); g_free(to_run); g_free(url); } #else /* defined __WIN32__ */ void menu_url_open(GtkMenuItem *menu, char *url) { ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL); g_free(url); } #endif void menu_popup_url_copy(GtkMenuItem *menu, char *url) { GdkDisplay *display; GtkClipboard *clipboard; display = gtk_widget_get_display(GTK_WIDGET(menu)); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_PRIMARY); gtk_clipboard_set_text(clipboard, url, -1); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD); gtk_clipboard_set_text(clipboard, url, -1); g_free(url); } static gboolean textview_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data) { WorldGUI *gui = (WorldGUI *) data; GtkTextView *text_view = GTK_TEXT_VIEW(widget); gint x, y; /* * Update the cursor image if the pointer moved. */ gtk_text_view_window_to_buffer_coords(text_view, GTK_TEXT_WINDOW_WIDGET, event->x, event->y, &x, &y); set_cursor_if_appropriate(text_view, gui, x, y); return FALSE; } static void set_cursor_if_appropriate(GtkTextView *text_view, WorldGUI *gui, gint x, gint y) { GtkTextIter iter; gboolean hovering = FALSE; gtk_text_view_get_iter_at_location(text_view, &iter, x, y); hovering = gtk_text_iter_has_tag(&iter, gui->txttag_url); if (hovering != hovering_over_link) { hovering_over_link = hovering; if (hovering_over_link) { gdk_window_set_cursor(gtk_text_view_get_window(text_view, GTK_TEXT_WINDOW_TEXT), hand_cursor); } else { gdk_window_set_cursor(gtk_text_view_get_window(text_view, GTK_TEXT_WINDOW_TEXT), regular_cursor); } } } static gboolean worldgui_query_tooltip_cb(GtkWidget *widget, gint win_x, gint win_y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer data) { WorldGUI *gui = (WorldGUI *) data; GtkTextView *text_view = GTK_TEXT_VIEW(widget); GtkTextIter iter; gint tooltip_line_top_y; gint x, y; GtkAllocation alloc; GdkRectangle rect; gchar *text; /* No world yet? */ if (!gui->world) { return FALSE; } if (keyboard_mode) { return FALSE; } /* Determine are for which the tooltip is valid - this corresponds to the area of the buffer line. */ gtk_text_view_window_to_buffer_coords(text_view, GTK_TEXT_WINDOW_WIDGET, win_x, win_y, &x, &y); gtk_text_view_get_line_at_y(text_view, &iter, y, NULL); gtk_text_view_get_line_yrange(text_view, &iter, &tooltip_line_top_y, &rect.height); gtk_text_view_buffer_to_window_coords(text_view, GTK_TEXT_WINDOW_WIDGET, 0, tooltip_line_top_y, &rect.x, &rect.y); gtk_widget_get_allocation(widget, &alloc); rect.width = alloc.width; gtk_tooltip_set_tip_area(tooltip, &rect); /* Get the tooltip text */ text = worldgui_get_tooltip_text(gui, text_view, x, y); if (text == NULL) { return FALSE; } gtk_tooltip_set_text(tooltip, text); g_free(text); return TRUE; } static gchar * worldgui_get_tooltip_text(WorldGUI *gui, GtkTextView *text_view, gint x, gint y) { GtkTextIter iter; gchar *tip; gtk_text_view_get_iter_at_location(text_view, &iter, x, y); if (gtk_text_iter_has_tag(&iter, gui->txttag_url)) { tip = g_strdup(_("Click to open link; right-click for more options.")); } else { gint tooltip_line_number; size_t len; #ifdef HAVE_LOCALTIME_R struct tm time_tm; #endif struct tm *time_tmp; if (k_circular_queue_size(gui->line_times) == 0) { return NULL; } tip = g_malloc(MAX_BUFFER * sizeof(gchar)); tooltip_line_number = gtk_text_iter_get_line(&iter); g_snprintf(tip, MAX_BUFFER, "Line %ld, ", tooltip_line_number + gui->world->deleted_lines + 1); len = strlen(tip); #ifdef HAVE_LOCALTIME_R localtime_r(&k_circular_queue_nth(gui->line_times, time_t, tooltip_line_number), &time_tm); time_tmp = &time_tm; #else time_tmp = localtime(&k_circular_queue_nth(gui->line_times, time_t, tooltip_line_number)); #endif strftime(tip + len, MAX_BUFFER - len, "%c", time_tmp); } return tip; } static void textview_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data) { WorldGUI *gui = (WorldGUI *) data; World *world = gui->world; GdkRectangle rect; gtk_text_view_get_visible_rect(gui->txtView, &rect); /* Some checks to prevent send_naws_size() from being called when world is invalid. */ if (world && world->gui && world->gui == gui && world->connected && world->use_naws == TRUE) { /* See if the size has changed. */ if (rect.height != world->last_naws_size.height || rect.width != world->last_naws_size.width) { send_naws_size(world); world->last_naws_size = rect; } } /* Dealing with the wrap column: If the user shrinks the window so that the view is too narrow to show wrap_column columns, then we wrap normally. If it's wider, we want to keep the wrap at wrap_column, and show blank white space for the rest. To do thath, we pad the view's right-margin with whatever space is left over. */ if (world) { if (!world->use_wrap_column || world->wrap_column < 40) { /* No wrap column set */ gtk_text_view_set_right_margin(gui->txtView, 0); gtk_text_view_set_right_margin(gui->txtViewScroll, 0); } else { gint char_width, char_height; gint wrap_width; gint margin; ansitextview_get_char_size(gui, &char_height, &char_width); wrap_width = char_width * (world->wrap_column + 1); margin = rect.width > wrap_width ? (rect.width - wrap_width) : 0; gtk_text_view_set_right_margin(gui->txtView, margin); gtk_text_view_set_right_margin(gui->txtViewScroll, margin); } } } static void find_incremental_cb(GtkEditable *widget, gpointer data) { WorldGUI *gui = (WorldGUI *) data; do_find(gui); } void find_next_cb(GtkButton *button, gpointer data) { WorldGUI *gui = (WorldGUI *) data; GtkTextIter search_start; gtk_text_buffer_get_iter_at_mark(gui->txtBuffer, &search_start, gui->txtmark_next_search_start); gtk_text_buffer_move_mark(gui->txtBuffer, gui->txtmark_search_start, &search_start); do_find(gui); } static void do_find(WorldGUI *gui) { const gchar *text; GtkTextIter search_start; GtkTextIter match_start; GtkTextIter match_end; gtk_label_set_text(gui->lblSearchInfo, NULL); text = gtk_entry_get_text(GTK_ENTRY(gui->txtSearchTerm)); if (strcmp(text, "") == 0) { /* Reset search when the text is blanked. Either if the user clears everything, or when the Find menu is used. */ gtk_text_buffer_get_start_iter(gui->txtBuffer, &search_start); gtk_text_buffer_move_mark(gui->txtBuffer, gui->txtmark_search_start, &search_start); gtk_text_buffer_select_range(gui->txtBuffer, &search_start, &search_start); return; } gtk_text_buffer_get_iter_at_mark(gui->txtBuffer, &search_start, gui->txtmark_search_start); if (gtk_text_iter_forward_search(&search_start, text, 0, &match_start, &match_end, NULL)) { gtk_text_buffer_select_range(gui->txtBuffer, &match_start, &match_end); /* If split pane is active, scroll that plane */ if (gtk_paned_get_position(gui->split_pane) > 0) { gtk_text_view_scroll_to_iter(gui->txtViewScroll, &match_start, 0, FALSE, 0, 0); } else { gtk_text_view_scroll_to_iter(gui->txtView, &match_start, 0, FALSE, 0, 0); } /* Mark point at which Find Next will start */ gtk_text_iter_forward_char(&match_start); gtk_text_buffer_move_mark(gui->txtBuffer, gui->txtmark_next_search_start, &match_start); } else { gtk_label_set_text(gui->lblSearchInfo, _("Not found")); } } static void close_search_box_cb(GtkButton *widget, gpointer data) { WorldGUI *gui = (WorldGUI *) data; g_object_set(G_OBJECT(gui->search_box), "no-show-all", TRUE, NULL); gtk_widget_hide(GTK_WIDGET(gui->search_box)); gtk_widget_grab_focus(GTK_WIDGET(gui->cmbEntry)); } static gboolean search_box_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_KEY_Escape) { close_search_box_cb(NULL, data); return TRUE; } return FALSE; } static void scrolled_win_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data) { /* When the bottom TextView (the main one) is resized, we want its top part to shrink/grow and the bottom part to remain displaying what it was displaying before. To do that, the value of (upper - (value + page_size)) of the ScrolledWindow's Adjustment must remain the same. This value corresponds to the size of the part of the TextView that is not displayed and is below the displayed part. upper never changes while scrolling, so we only need to make sure that (value + page_size) remains constant. To do that, so we store this value at the end of the function so that in the next call the previous value is know so that the new position of value is calculated. Whenever value changes, this stored value is also updated. */ WorldGUI *gui = (WorldGUI *) data; GtkAdjustment *verticalAdjust; double page_size, upper; double newValue; verticalAdjust = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(widget)); upper = gtk_adjustment_get_upper(verticalAdjust); page_size = gtk_adjustment_get_page_size(verticalAdjust); /* First call */ //if (gui->last_scroll_info == -1) { // gui->last_scroll_info = page_size; // return; //} newValue = gui->last_scroll_info - page_size; if (newValue < 0) { newValue = 0; } if (newValue > (upper - page_size)) { newValue = upper - page_size; } gtk_adjustment_set_value(verticalAdjust, newValue); gui->last_scroll_info = newValue + page_size; } static void scrolled_win_value_changed_cb(GtkAdjustment *adjustment, gpointer data) { WorldGUI *gui = (WorldGUI *) data; gui->last_scroll_info = gtk_adjustment_get_value(adjustment) + gtk_adjustment_get_page_size(adjustment); } static gboolean set_split_to_zero(gpointer data) { WorldGUI *gui = (WorldGUI *) data; gtk_paned_set_position(gui->split_pane, 0); return FALSE; } kildclient-3.0.0/src/hooks.c0000644000175000017500000003204512374460043012642 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ static void execute_hook_full(World *world, const gchar *hookname, const char *hookdata, gboolean immediately); static void save_hook_list(GString *str, GSList *hookptr); gboolean connect_hook(World *world, const gchar *hookname, int pos, gchar *action, gchar *name, gboolean enabled) { GSList **hook_list; Hook *hook; gint *hook_pos; hook_list = get_hook_list_for_writing(world, hookname, &hook_pos); if (!hook_list) { ansitextview_append_stringf(world->gui, _("hook: hook '%s' not found\n"), hookname); return FALSE; } if (pos == -1) { hook = g_new0(Hook, 1); if (world->plugins_being_defined) { hook->owner_plugin = world->plugins_being_defined->data; *hook_list = g_slist_append(*hook_list, hook); } else { *hook_list = g_slist_insert(*hook_list, hook, *hook_pos); } } else { hook = (Hook *) g_slist_nth_data(*hook_list, pos); if (!hook) { ansitextview_append_string_nl(world->gui, _("No such hook")); return FALSE; } } if (action) { g_free(hook->action); hook->action = action; } if (name) { g_free(hook->name); hook->name = name; } hook->enabled = enabled; if (pos == -1) { if (!world->plugins_being_defined) { we_hook_insert_hook(world, hookname, hook, (*hook_pos)++); } else { we_hook_insert_hook(world, hookname, hook, g_slist_length(*hook_list)); } } else { we_hook_update_hook(world, hookname, hook); } return TRUE; } void execute_hook(World *world, const gchar *hookname, const char *hookdata) { execute_hook_full(world, hookname, hookdata, FALSE); } void execute_hook_immediately(World *world, const gchar *hookname, const char *hookdata) { execute_hook_full(world, hookname, hookdata, TRUE); } static void execute_hook_full(World *world, const gchar *hookname, const char *hookdata, gboolean immediately) { /* If immediately is true, then instead of queuing commands, they are executed immediately. This is necessary when data is passed to the hooks via variables ($hookdata and $serverdata), because if the command is not executed immediately the variable may be overwritten if more data from the server triggers another execution. However, care must be taken so that immediate execution is only requested from the main thread. */ GSList *hookptr = NULL; Hook *hook; SV *Phookdata; hookptr = get_hook_list_for_reading(world, hookname, NULL); if (hookptr) { world_for_perl = world; if (hookdata) { GRAB_PERL(world); Phookdata = get_sv("hookdata", TRUE); SvUTF8_on(Phookdata); sv_setpv(Phookdata, hookdata); RELEASE_PERL(world); } while (hookptr) { hook = (Hook *) hookptr->data; if (hook->enabled) { if (immediately) { parse_command_line_immediately(world, hook->action); } else { parse_commands(world, hook->action); } } hookptr = hookptr->next; } world_for_perl = currentWorld; } } void list_hooks(World *world, const gchar *hookname, Plugin *plugin) { GSList *hooklist; Hook *hook; guint total_width; guint field_width; guint i; hooklist = get_hook_list_for_reading(world, hookname, NULL); if (!hooklist) { ansitextview_append_string_nl(world->gui, _("Hook not found")); return; } /* The rows argument is not used. */ ansitextview_get_size(world->gui, &field_width, &total_width); /* If the screen is really narrow, we can do nothing. */ if (total_width < 14) { total_width = 14; } field_width = total_width - 9; ansitextview_append_stringf(world->gui, _("Hooks for '%s':\n"), hookname); ansitextview_append_string_nl(world->gui, _("Num Ena Action")); ansitextview_append_string(world->gui, "--- --- "); for (i = 0; i < field_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, "\n"); i = 0; while (hooklist) { hook = (Hook *) hooklist->data; if (hook->owner_plugin == plugin) { ansitextview_append_stringf(world->gui, "%3d %-3.3s %-*.*s\n", i, hook->enabled ? _("y") : _("n"), field_width, field_width, hook->action); } hooklist = hooklist->next; ++i; } } void list_hook(World *world, const gchar *hookname, int pos) { GSList *hooklist; Hook *hook; hooklist = get_hook_list_for_reading(world, hookname, NULL); if (!hooklist) { ansitextview_append_string_nl(world->gui, _("Hook not found")); return; } hook = (Hook *) g_slist_nth_data(hooklist, pos); if (!hook) { ansitextview_append_string_nl(world->gui, _("No such hook")); return; } ansitextview_append_stringf(world->gui, _("Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n"), pos, hookname, hook->name ? hook->name : _("Not set"), hook->action, hook->enabled ? _("yes") : _("no")); } gboolean delete_hook(World *world, const gchar *hookname, int pos, GSList *hook) { /* Can receive either the list item poiting to the hook itself * (in this case, pos is ignored), * or, if hook is NULL, the position of the hook to delete. */ GSList **hooklist; gint *hook_pos; hooklist = get_hook_list_for_writing(world, hookname, &hook_pos); if (!hooklist) { return FALSE; } if (hook == NULL) { hook = g_slist_nth(*hooklist, pos); } if (!hook) { return FALSE; } we_hook_delete_hook(world, hookname, (Hook *) hook->data); *hooklist = g_slist_remove_link(*hooklist, hook); if (!((Hook *) hook->data)->owner_plugin) { --(*hook_pos); } free_hook((Hook *) hook->data, NULL); g_slist_free(hook); return TRUE; } gboolean move_hook(World *world, const gchar *hookname, gint old_pos, gint new_pos) { GSList **hooklist; gint *hook_pos; GSList *hookitem; gpointer hook; hooklist = get_hook_list_for_writing(world, hookname, &hook_pos); if (!hooklist) { return FALSE; } if (new_pos < 0 || new_pos >= *hook_pos) { new_pos = *hook_pos - 1; } hookitem = g_slist_nth(*hooklist, old_pos); if (!hookitem) { return FALSE; } hook = hookitem->data; *hooklist = g_slist_delete_link(*hooklist, hookitem); *hooklist = g_slist_insert(*hooklist, hook, new_pos); we_hook_delete_hook(world, hookname, hook); we_hook_insert_hook(world, hookname, hook, new_pos); return TRUE; } void free_hook(Hook *hook, gpointer data) { g_free(hook->name); g_free(hook->action); g_free(hook); } void save_hooks(GString *str, World *world) { g_string_append_printf(str, " \n"); if (world->hooks.OnConnect) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnConnect); } if (world->hooks.OnDisconnect) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnDisconnect); } if (world->hooks.OnReceivedText) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnReceivedText); } if (world->hooks.OnSentCommand) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnSentCommand); } if (world->hooks.OnGetFocus) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnGetFocus); } if (world->hooks.OnLoseFocus) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnLoseFocus); } if (world->hooks.OnCloseConnected) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnCloseConnected); } if (world->hooks.OnServerData) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnServerData); } g_string_append_printf(str, " \n"); } GSList ** get_hook_list_for_writing(World *world, const gchar *hookname, gint **poscounter) { if (strcmp(hookname, "OnConnect") == 0) { *poscounter = &world->hooks.OnConnect_pos; return &world->hooks.OnConnect; } if (strcmp(hookname, "OnDisconnect") == 0) { *poscounter = &world->hooks.OnDisconnect_pos; return &world->hooks.OnDisconnect; } if (strcmp(hookname, "OnReceivedText") == 0) { *poscounter = &world->hooks.OnReceivedText_pos; return &world->hooks.OnReceivedText; } if (strcmp(hookname, "OnSentCommand") == 0) { *poscounter = &world->hooks.OnSentCommand_pos; return &world->hooks.OnSentCommand; } if (strcmp(hookname, "OnGetFocus") == 0) { *poscounter = &world->hooks.OnGetFocus_pos; return &world->hooks.OnGetFocus; } if (strcmp(hookname, "OnLoseFocus") == 0) { *poscounter = &world->hooks.OnGetFocus_pos; return &world->hooks.OnLoseFocus; } if (strcmp(hookname, "OnCloseConnected") == 0) { *poscounter = &world->hooks.OnCloseConnected_pos; return &world->hooks.OnCloseConnected; } if (strcmp(hookname, "OnServerData") == 0) { *poscounter = &world->hooks.OnServerData_pos; return &world->hooks.OnServerData; } return NULL; } GSList * get_hook_list_for_reading(World *world, const gchar *hookname, gint *pos) { gint *dummy; GSList **hooklist = get_hook_list_for_writing(world, hookname, &dummy); if (hooklist) { if (pos) { *pos = *dummy; } return *hooklist; } return NULL; } GtkTreeModel * get_hook_model(World *world, const gchar *hookname) { if (strcmp(hookname, "OnConnect") == 0) { return world->hooks.OnConnect_model; } if (strcmp(hookname, "OnDisconnect") == 0) { return world->hooks.OnDisconnect_model; } if (strcmp(hookname, "OnReceivedText") == 0) { return world->hooks.OnReceivedText_model; } if (strcmp(hookname, "OnSentCommand") == 0) { return world->hooks.OnSentCommand_model; } if (strcmp(hookname, "OnGetFocus") == 0) { return world->hooks.OnGetFocus_model; } if (strcmp(hookname, "OnLoseFocus") == 0) { return world->hooks.OnLoseFocus_model; } if (strcmp(hookname, "OnCloseConnected") == 0) { return world->hooks.OnCloseConnected_model; } if (strcmp(hookname, "OnServerData") == 0) { return world->hooks.OnServerData_model; } return NULL; } static void save_hook_list(GString *str, GSList *hookptr) { Hook *hook; while (hookptr) { hook = (Hook *) hookptr->data; if (!hook->owner_plugin) { save_hook(str, hook); } hookptr = hookptr->next; } g_string_append(str, " \n"); } void save_hook(GString *str, Hook *hook) { g_string_append(str, " name) { kc_g_string_append_escaped(str, "name=\"%s\" ", hook->name); } kc_g_string_append_escaped(str, "enabled=\"%d\">%s\n", hook->enabled, hook->action); } gboolean are_there_enabled_server_data_hooks(World *world) { GSList *iter = world->hooks.OnServerData; while (iter != NULL) { Hook *hook = (Hook *) iter->data; if (hook->enabled) { return TRUE; } iter = iter->next; } return FALSE; } void mainthread_op_execute_on_received_text_hook(HookExecution *hook_execution) { execute_hook_immediately(hook_execution->world, "OnReceivedText", hook_execution->data); } kildclient-3.0.0/src/log.c0000644000175000017500000001420712374460043012300 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ static void get_log_filename(World *world, gchar *actualfile, time_t *curr_time); static void make_directories(const gchar* path); void write_log_line(World *world, const char *line, time_t *line_time) { int len; static char timestr[MAX_TIME_STR]; if (!world->log_file) { return; } g_mutex_lock(&world->write_log_line_mutex); if (world->log_add_time) { time_t currtime; struct tm *brokentime; if (line_time) { brokentime = localtime(line_time); } else { currtime = time(NULL); brokentime = localtime(&currtime); } strftime(timestr, MAX_TIME_STR, world->log_timeformat, brokentime); fprintf(world->log_file, "%s", timestr); } len = strlen(line); if (!len) { g_mutex_unlock(&world->write_log_line_mutex); return; } fputs(line, world->log_file); /* Finish always with a NL character */ if (line[len - 1] != '\n') { fputc('\n', world->log_file); } g_mutex_unlock(&world->write_log_line_mutex); } gboolean start_log(World *world, gint lines, gchar **errmsg) { time_t curr_time; static char actualfile[PATH_MAX+1]; static char timestr[MAX_TIME_STR]; if (!world->log_file_name) { *errmsg = g_strdup(_("File name not specified.")); return FALSE; } /* Get file name after substitutions */ time(&curr_time); get_log_filename(world, actualfile, &curr_time); make_directories(actualfile); if ((world->log_file = fopen(actualfile, "a")) != NULL) { world->log_actual_file = g_strdup(actualfile); /* Use unbuffered output */ setbuf(world->log_file, NULL); strcpy(timestr, ctime(&curr_time)); /* Remove final nl */ timestr[strlen(timestr) - 1] = '\0'; fprintf(world->log_file, "*** LOG STARTED AT %s ***\n", timestr); /* Copy lines from the buffer, in case it was asked */ if (lines) { gint first_line; gint last_line; gint line; GtkTextIter start_iter; GtkTextIter end_iter; gchar *text; gboolean stop; last_line = gtk_text_buffer_get_line_count(world->gui->txtBuffer); first_line = last_line - lines - 1; if (first_line < 0) { first_line = 0; } line = first_line; stop = FALSE; gtk_text_buffer_get_iter_at_line(world->gui->txtBuffer, &start_iter, first_line); while (1) { end_iter = start_iter; if (!gtk_text_iter_forward_line(&end_iter)) { stop = TRUE; } text = gtk_text_buffer_get_text(world->gui->txtBuffer, &start_iter, &end_iter, FALSE); write_log_line(world, text, &k_circular_queue_nth(world->gui->line_times, time_t, line)); g_free(text); if (stop) { break; } else { start_iter = end_iter; ++line; } } } return TRUE; } else { *errmsg = g_strdup_printf(_("Could not open log file: %s."), g_strerror(errno)); return FALSE; } } void stop_log(World *world) { time_t curr_time; static char timestr[MAX_TIME_STR]; if (world->log_file) { time(&curr_time); strcpy(timestr, ctime(&curr_time)); /* Remove final nl */ timestr[strlen(timestr) - 1] = '\0'; fprintf(world->log_file, "*** LOG ENDED AT %s ***\n\n", timestr); fclose(world->log_file); world->log_file = NULL; g_free(world->log_actual_file); world->log_actual_file = NULL; } } static void get_log_filename(World *world, gchar *actualfile, time_t *curr_time) { gchar *character; gchar *tmp; struct tm *brokentime; /* Get character name used */ if (world->character_used == NULL || world->connection_style == NONE) { character = g_strdup("undefined"); } else { GtkTreePath *path; GtkTreeIter iter; path = gtk_tree_row_reference_get_path(world->character_used); if (!path) { gtk_tree_row_reference_free(world->character_used); world->character_used = NULL; character = g_strdup("undefined"); } gtk_tree_model_get_iter(world->logon_characters, &iter, path); gtk_tree_model_get(world->logon_characters, &iter, LOGON_CHAR, &character, -1); } /* Substitute KC-specific escapes */ tmp = replace_kc_escapes(world->log_file_name, world->name, character); g_free(character); /* Substitute date/time values. */ brokentime = localtime(curr_time); strftime(actualfile, PATH_MAX, tmp, brokentime); g_free(tmp); } static void make_directories(const gchar* path) { gchar *dir = g_path_get_dirname(path); g_mkdir_with_parents(dir, 0755); g_free(dir); } kildclient-3.0.0/src/net.c0000644000175000017500000011655712374460043012320 00000000000000/* * Copyright (C) 2004-2014 Eduardo M Kalinowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include "libintl-wrapper.h" #include #include #include #ifndef __MINGW32__ # include # include # include # include # include #else /* defined __MINGW32__ */ # include # include #endif #include "kildclient.h" #include "perlscript.h" #include "net.h" #include "ansi.h" /************************* * File global variables * *************************/ #define MAX_US 250000 /************** * Data types * **************/ /*********************** * Function prototypes * ***********************/ static gboolean connect_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gboolean connected_to_dispatcher(World *world); #ifdef HAVE_LIBGNUTLS static gboolean tls_handshake_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gboolean tls_handshake_timeout_cb(gpointer data); #endif static void disconnected_decide_action(World *world, gint action); static gboolean data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gboolean flush_buffer(World *world, int action); static void convert_recv_line(World *world, int start, int end, gboolean incomplete); static ssize_t write_escaped(World *world, const void *buf, size_t count); #ifndef __MINGW32__ # define socket_valid(a) ((a) != -1) #else # define socket_valid(a) ((a) != INVALID_SOCKET) #endif gboolean connect_to(World *world, gchar **errmsg) { gchar *msg; struct resolve_data_s *resolve_data; GThread *resolver_thread; #ifndef HAVE_LIBGNUTLS /* Oops, we cannot do that */ if (world->use_tls) { GtkDialog *msgdlg = msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("You're attempting to connect to a world that uses SSL, but this version of KildClient has been built without SSL support. Try to connect without SSL?")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Question")); gtk_dialog_add_buttons(msgdlg, _("Connect without SSL"), GTK_RESPONSE_YES, _("Do not connect"), GTK_RESPONSE_NO, NULL); gtk_dialog_set_default_response(msgdlg, GTK_RESPONSE_NO); if (gtk_dialog_run(msgdlg) == GTK_RESPONSE_YES) { world->use_tls = FALSE; gtk_widget_destroy(GTK_WIDGET(msgdlg)); } else { *errmsg = g_strdup(_("This version of KildClient does not have SSL support.")); gtk_widget_destroy(msgdlg); return FALSE; } } #else /* defined HAVE_LIBGNUTLS */ if (world->use_tls) { gnutls_init(&world->tls_session, GNUTLS_CLIENT); gnutls_priority_set_direct(world->tls_session, "NORMAL", NULL); gnutls_credentials_set(world->tls_session, GNUTLS_CRD_CERTIFICATE, tls_certif_cred); } #endif /* Set up gui */ if (!world->connected_at_least_once) { configure_gui(world->gui, world); prepare_display_name(world); } gtk_label_set_text(world->gui->lblNotebook, world->display_name); if (g_list_index(open_worlds, world) == -1) { open_worlds = g_list_append(open_worlds, world); } world->rawbytes = world->bytes = 0; /* Set it as the last opened one */ g_free(globalPrefs.last_open_world); globalPrefs.last_open_world = g_strdup(world->name); currentWorld = world; world_for_perl = world; if (!world->connected_at_least_once) { init_perl_script(world); init_threads(world); GRAB_PERL(world); load_permanent_variables(world); load_startup_plugins(world); if (world->scriptfile) { perl_script_import_file(world->scriptfile); } RELEASE_PERL(world); load_command_history(world); } else { if (world->has_unread_text) { world->has_unread_text = 0; --worlds_with_new_text; adjust_window_title(); } } if (!world->connected_at_least_once) { trigger_precompute_res(world); alias_precompute_res(world); } if (!world->connected_at_least_once) { start_timers(world); } world->connected_at_least_once = TRUE; proxy_info_free(&world->proxy_used); if (world->proxy.type == PROXY_USE_GLOBAL) { proxy_info_copy(&globalPrefs.proxy, &world->proxy_used); } else if (world->proxy.type == PROXY_NONE) { world->proxy_used.type = PROXY_NONE; } else { proxy_info_copy(&world->proxy, &world->proxy_used); } if (world->proxy_used.type == PROXY_SOCKS5) { msg = g_strdup_printf(_("Resolving proxy host %s..."), world->proxy_used.server); } else { msg = g_strdup_printf(_("Resolving host %s..."), world->host); } gtk_label_set_text(world->gui->lblStatus, msg); ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); g_free(msg); world->connecting = TRUE; /* Spawn a thread to resolve the host name */ resolve_data = g_new(struct resolve_data_s, 1); resolve_data->world = world; if (world->proxy_used.type == PROXY_SOCKS4) { resolve_data->host = g_strdup(world->host); resolve_data->port = g_strdup(world->port); resolve_data->callback = proxy_socks4_resolved_real_host_cb; resolve_data->ai_family = AF_INET; } else if (world->proxy_used.type == PROXY_SOCKS5) { resolve_data->host = g_strdup(world->proxy_used.server); resolve_data->port = g_strdup(world->proxy_used.port); resolve_data->callback = continue_connecting_cb; resolve_data->ai_family = AF_UNSPEC; } else if (world->proxy_used.type == PROXY_HTTP) { resolve_data->host = g_strdup(world->proxy_used.server); resolve_data->port = g_strdup(world->proxy_used.port); resolve_data->callback = continue_connecting_cb; resolve_data->ai_family = AF_UNSPEC; } else { resolve_data->host = g_strdup(world->host); resolve_data->port = g_strdup(world->port); resolve_data->callback = continue_connecting_cb; resolve_data->ai_family = AF_UNSPEC; } resolver_thread = g_thread_new("resolver", resolve_name_thread, resolve_data); g_thread_unref(resolver_thread); return TRUE; } gpointer resolve_name_thread(gpointer data) { struct resolve_data_s *resolve_data = (struct resolve_data_s *) data; struct addrinfo hints; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = resolve_data->ai_family; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = 0; hints.ai_flags = 0; resolve_data->ret = getaddrinfo(resolve_data->host, resolve_data->port, &hints, &resolve_data->addrinfo); g_idle_add(resolve_data->callback, resolve_data); return NULL; } gboolean continue_connecting_cb(gpointer data) { struct resolve_data_s *resolve_data = (struct resolve_data_s *) data; World *world = resolve_data->world; gchar *msg; int ret; #ifndef __MINGW32__ int flags; #else /* defined __MINGW32__ */ u_long flags; #endif g_free(resolve_data->port); if (g_list_index(open_worlds, world) == -1) { /* It could happen that the world has been closed */ g_free(resolve_data->host); g_free(resolve_data); return FALSE; } if (resolve_data->ret != 0) { gchar *msg; gsize len; msg = g_locale_to_utf8(gai_strerror(resolve_data->ret), -1, NULL, &len, NULL); world->errmsg = g_strdup_printf(_("Could not resolve host %s: %s"), resolve_data->host, msg); g_free(msg); disconnect_world(world, FALSE); g_free(resolve_data->host); g_free(resolve_data); /* Only run once */ return FALSE; } world->addrinfo = resolve_data->addrinfo; g_free(resolve_data->host); g_free(resolve_data); /* Create IP address representation */ if (!world->host_ip) { world->host_ip = g_malloc(INET6_ADDRSTRLEN); /* Just in case it fails... */ strcpy(world->host_ip, "?"); getnameinfo(world->addrinfo->ai_addr, world->addrinfo->ai_addrlen, world->host_ip, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST); } if (world->proxy_used.type == PROXY_NONE) { msg = g_strdup_printf(_("Attempting to connect to host %s (%s) port %s..."), world->host, world->host_ip, world->port); } else { msg = g_strdup_printf(_("Attempting to connect to proxy host %s (%s) port %s..."), world->proxy_used.server, world->host_ip, world->proxy_used.port); } ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, msg); g_free(msg); world->sock = socket(world->addrinfo->ai_family, world->addrinfo->ai_socktype, world->addrinfo->ai_protocol); if (!socket_valid(world->sock)) { #ifndef __MINGW32__ world->errmsg = g_strdup_printf(_("Could not create socket: %s"), g_strerror(errno)); #else /* defined __MINGW32__ */ world->errmsg = g_strdup_printf(_("Could not create socket: error #%d"), WSAGetLastError()); #endif disconnect_world(world, FALSE); return FALSE; } #ifndef __MINGW32__ flags = fcntl(world->sock, F_GETFL); flags |= O_NONBLOCK; fcntl(world->sock, F_SETFL, flags); #else /* defined __MINGW32__ */ flags = 1; ioctlsocket(world->sock, FIONBIO, &flags); #endif ret = connect(world->sock, world->addrinfo->ai_addr, world->addrinfo->ai_addrlen); if (ret < 0) { #ifndef __MINGW32__ if (errno != EINPROGRESS && errno != EALREADY) { world->errmsg = g_strdup_printf(_("Could not connect to host %s port %s: %s"), world->host, world->port, g_strerror(errno)); return FALSE; } #else /* defined __MINGW32__ */ int error; error = WSAGetLastError(); if (error != WSAEWOULDBLOCK) { world->errmsg = g_strdup_printf(_("Could not connect to host %s port %s: Error #%d"), world->host, world->port, error); return FALSE; } #endif } /* Enable TCP Keep Alive if selected */ if (world->keep_alive) { int optval = 1; setsockopt(world->sock, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)); } world->noecho = FALSE; #ifndef __MINGW32__ world->iochan = g_io_channel_unix_new(world->sock); #else /* defined __MINGW32__ */ world->iochan = g_io_channel_win32_new_socket(world->sock); #endif world->io_watch_id = g_io_add_watch(world->iochan, G_IO_OUT | G_IO_ERR, connect_ready_cb, world); /* We'll do character code handling later */ g_io_channel_set_encoding(world->iochan, NULL, NULL); if (!world->connecting) { connected_to_dispatcher(world); } /* This is only called once. */ return FALSE; } #ifndef __MINGW32__ static gboolean connect_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world; int ret; world = (World *) data; ret = connect(world->sock, world->addrinfo->ai_addr, world->addrinfo->ai_addrlen); if (ret < 0 && errno != EISCONN) { if (errno == EALREADY || errno == EINPROGRESS) { return TRUE; /* Still connecting. */ } if (world->proxy_used.type == PROXY_NONE) { world->errmsg = g_strdup_printf(_("Unable to connect to host %s: %s."), world->host, g_strerror(errno)); } else { world->errmsg = g_strdup_printf(_("Unable to connect to proxy host %s: %s."), world->proxy_used.server, g_strerror(errno)); } disconnect_world(world, FALSE); return FALSE; } else { connected_to_dispatcher(world); return FALSE; } } #else /* defined __MINGW32__ */ gboolean connect_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world; int ret; int error; int sockerror = 0; int optlen = sizeof(sockerror); world = (World *) data; /* Apparently, under Windows it always fails */ ret = connect(world->sock, world->addrinfo->ai_addr, world->addrinfo->ai_addrlen); error = WSAGetLastError(); if (error == WSAEISCONN) { /* Connection succeeded */ connected_to_dispatcher(world); return FALSE; } ret = getsockopt(world->sock, SOL_SOCKET, SO_ERROR, (char *) &sockerror, &optlen); if (ret != 0) { sockerror = WSAGetLastError(); } if (sockerror) { if (world->proxy_used.type == PROXY_NONE) { world->errmsg = g_strdup_printf(_("Unable to connect to host %s: Error #%d."), world->host, sockerror); } else { world->errmsg = g_strdup_printf(_("Unable to connect to proxy host %s: Error #%d."), world->proxy_used.server, sockerror); } disconnect_world(world, FALSE); return FALSE; } if (error == WSAEALREADY || error == WSAEINVAL || error == WSAEWOULDBLOCK) { return TRUE; /* Still connecting. */ } /* This should never be reached. But under Windows, it is better to be safe. */ g_warning("Unreachable code in connect_read_cb."); if (world->proxy_used.type == PROXY_NONE) { world->errmsg = g_strdup_printf(_("Unable to connect to host %s: Error #%d."), world->host, sockerror); } else { world->errmsg = g_strdup_printf(_("Unable to connect to proxy host %s: Error #%d."), world->proxy_used.server, sockerror); } disconnect_world(world, FALSE); return FALSE; } #endif static gboolean connected_to_dispatcher(World *world) { /* When this function is called, a connection to the proxy host or the real host (if no proxy is being used) has been established. This function then calls the appropriate action if a proxy is being used. */ if (world->proxy_used.type == PROXY_SOCKS4) { return proxy_socks4_connected_to(world); } else if (world->proxy_used.type == PROXY_SOCKS5) { return proxy_socks5_connected_to(world); } else if (world->proxy_used.type == PROXY_HTTP) { return proxy_http_connected_to(world); } else { return perform_tls_handshake(world); } } #ifdef HAVE_LIBGNUTLS gboolean perform_tls_handshake(World *world) { gchar *status_text; if (world->use_tls) { status_text = g_strdup_printf(_("Performing SSL handshake...")); ansitextview_append_string_with_fgcolor(world->gui, status_text, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, status_text); g_free(status_text); #ifndef __x86_64 /* This is to remove a warning about pointer sizes */ gnutls_transport_set_ptr(world->tls_session, (gnutls_transport_ptr_t) world->sock); #else gnutls_transport_set_ptr(world->tls_session, (gnutls_transport_ptr_t) (long) world->sock); #endif /* Register callback to perform the TLS handshake * The first action is we sending data (ClientHello) */ world->tls_handshake_dir = 1; world->io_watch_id = g_io_add_watch(world->iochan, G_IO_OUT | G_IO_HUP | G_IO_ERR, tls_handshake_cb, world); g_timeout_add_seconds(60, tls_handshake_timeout_cb, world); return TRUE; } else { return connected_to(world); } } static gboolean tls_handshake_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world = (World *) data; int ret; ret = gnutls_handshake(world->tls_session); if (ret == GNUTLS_E_SUCCESS) { /* Sucess */ connected_to(world); /* Do not call the function again */ return FALSE; } if (gnutls_error_is_fatal(ret) != 0) { /* Fatal error */ gnutls_deinit(world->tls_session); world->errmsg = g_strdup_printf(_("SSL Handshake failed: %s"), gnutls_strerror(ret)); disconnect_world(world, FALSE); /* Do not call the function again */ return FALSE; } /* Continue when more data is available, watching the direction. */ int dir = gnutls_record_get_direction(world->tls_session); if (dir != world->tls_handshake_dir) { GIOCondition cond = G_IO_HUP | G_IO_ERR; if (dir == 0) { cond |= G_IO_IN; } else { cond |= G_IO_OUT; } world->io_watch_id = g_io_add_watch(world->iochan, cond, tls_handshake_cb, world); world->tls_handshake_dir = dir; /* A new callback has been set up for the new direction, remove this one */ return FALSE; } else { /* Continue */ return TRUE; } } static gboolean tls_handshake_timeout_cb(gpointer data) { /* Called 60 seconds after a TLS handshake has started. If the connection * has not completed, aborts it. */ World *world = (World *) data; // The world might have been closed if (g_list_index(open_worlds, world) != -1 && world->connecting) { gnutls_deinit(world->tls_session); world->errmsg = g_strdup_printf(_("SSL Handshake took too long.")); disconnect_world(world, FALSE); } /* Never called again */ return FALSE; } #else gboolean perform_tls_handshake(World *world) { return connected_to(world); } #endif gboolean connected_to(World *world) { /* A connection has been established to the real mud host, via proxy or indirectly. */ gchar *status_text; world->connected = TRUE; world->connecting = FALSE; world->connected_time = time(NULL); world->last_command_time = time(NULL); if (world->proxy_used.type == PROXY_NONE) { status_text = g_strdup_printf(_("Connected to host %s (%s) port %s."), world->host, world->host_ip, world->port); } else { status_text = g_strdup_printf(_("Connected to host %s port %s, via proxy %s (%s) port %s."), world->host, world->port, world->proxy_used.server, world->host_ip, world->proxy_used.port); } if (world->use_tls) { gchar *tmp = status_text; status_text = g_strconcat(tmp, _(" SSL enabled."), NULL); g_free(tmp); } ansitextview_append_string_with_fgcolor(world->gui, status_text, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, status_text); g_free(status_text); adjust_window_title(); perform_auto_logon(world); execute_hook(world, "OnConnect", NULL); if (world->log_autostart) { gchar *errmsg = NULL; stop_log(world); if (start_log(world, 0, &errmsg)) { ansitextview_append_stringf(world->gui, _("Logging to file %s.\n"), world->log_actual_file); } else { ansitextview_append_string_nl(world->gui, errmsg); g_free(errmsg); } } /* We now read the socket */ g_source_remove(world->io_watch_id); world->io_watch_id = g_io_add_watch_full(world->iochan, G_PRIORITY_HIGH, G_IO_IN | G_IO_HUP | G_IO_ERR, data_ready_cb, world, NULL); /* No longer needed */ freeaddrinfo(world->addrinfo); world->addrinfo = NULL; return TRUE; } gboolean disconnect_world_idle(gpointer data) { disconnect_world(data, TRUE); return FALSE; } void disconnect_world(gpointer data, gboolean run_hook) { /* This function is called as an idle function, so it must return FALSE. */ World *world; char *msg; gint action; world = (World *) data; if (!world->connected && !world->connecting) { return; } /* In case we are still connecting and it has not been free'd */ if (world->addrinfo) { freeaddrinfo(world->addrinfo); world->addrinfo = NULL; } msg = close_connection(world, run_hook); execute_hook(world, "OnDisconnect", NULL); currentWorld = NULL; /* Here we decide what to do */ action = disconnected_msgbox(msg, TRUE); g_free(msg); disconnected_decide_action(world, action); } gboolean reconnect_world(gpointer data) { World *world = (World *) data; if (world->connected || world->connecting) g_free(close_connection(world, TRUE)); /* This function is called as an idle function, so it must return FALSE. */ disconnected_decide_action((World *) data, RESP_RECONNECT); return FALSE; } gboolean connect_another(gpointer data) { /* This function is called as an idle function, so it must return FALSE. */ disconnected_decide_action((World *) data, RESP_OTHER); return FALSE; } static void disconnected_decide_action(World *world, gint action) { gchar *errmsg; while (action != GTK_RESPONSE_CLOSE) { if (action == RESP_OTHER) { gboolean offline_selected = FALSE; save_world_to_file(world); save_command_history(world); save_permanent_variables(world); open_new_world(world->gui, NULL, TRUE, &offline_selected); if (offline_selected) { mark_as_offline(world); return; } break; } if (action == RESP_OFFLINE) { mark_as_offline(world); return; } /* Else, which means reconnect */ if (connect_to(world, &errmsg)) { return; } action = disconnected_msgbox(errmsg, TRUE); g_free(errmsg); } /* If we have gotten here, it means the current world must be closed, because either we selected close or connected to another one. */ remove_world(world, action == GTK_RESPONSE_CLOSE); } gchar * close_connection(World *world, gboolean run_hook) { /* Note: this function should only be called if the world is connected or connecting. */ gchar *msg; if (run_hook) { execute_hook(world, "OnCloseConnected", NULL); } flush_buffer(world, 2); if (world->errmsg) { msg = world->errmsg; world->errmsg = NULL; } else { msg = g_strdup_printf(_("Disconnected from host %s."), world->host); } ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); #ifdef USE_LIBGNUTLS if (world->use_tls) { gnutls_bye(world->tls_session); } #endif #ifndef __MINGW32__ close(world->sock); #else /* defined __MINGW32__ */ closesocket(world->sock); #endif world->connected = FALSE; world->connecting = FALSE; #ifdef USE_LIBGNUTLS if (world->use_tls) { gnutls_deinit(world->tls_session); } #endif if (world->iochan) { g_io_channel_unref(world->iochan); g_source_remove(world->io_watch_id); } if (world->timeout_id) { g_source_remove(world->timeout_id); world->timeout_id = 0; } if (world->zstream) { end_mccp(world); } return msg; } static gboolean data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world; ssize_t nread; unsigned char *nlptr; int start; int nlpos; world = (World *) data; /* What if we have read a very long line and the buffer is full? It does happen in some muds. */ if (world->pbuf_size == MAX_BUFFER) { flush_buffer(world, 1); } nread = kc_recv(world, world->inbuffer, MAX_BUFFER - world->pbuf_size); if (nread <= 0) { /* Connection closed */ if (nread != 0) { /* Error */ #ifdef HAVE_LIBGNUTLS if (world->use_tls) { if (gnutls_error_is_fatal(nread) == 0) { return TRUE; } world->errmsg = g_strdup_printf(_("Disconnected from host %s: %s."), world->host, gnutls_strerror(nread)); } else { #endif #ifndef __MINGW32__ if (errno == EAGAIN || errno == EWOULDBLOCK) { return TRUE; } world->errmsg = g_strdup_printf(_("Disconnected from host %s: %s."), world->host, g_strerror(errno)); #else /* defined __MINGW32__ */ int errcode = WSAGetLastError(); if (errcode == WSAEINTR || errcode == WSAEINPROGRESS || errcode == WSAEWOULDBLOCK) { return TRUE; } world->errmsg = g_strdup_printf(_("Disconnected from host %s: error #%d."), world->host, errcode); #endif #ifdef HAVE_LIBGNUTLS } #endif } disconnect_world(world, FALSE); return FALSE; } world->rawbytes += nread; if (rdumpFile) { fwrite(world->inbuffer, nread, 1, rdumpFile); } /* Prepare data to be uncompressed */ if (world->zstream) { world->zstream->next_in = world->inbuffer; world->zstream->avail_in = nread; } do { if (world->zstream) { if (world->zstream->avail_in) { gint status; /* What if we have read a very long line and buffer is full? It does happen in some muds. */ if (world->pbuf_size == MAX_BUFFER) { flush_buffer(world, 1); } world->zstream->next_out = world->dbuffer; world->zstream->avail_out = MAX_BUFFER - world->pbuf_size; status = inflate(world->zstream, Z_SYNC_FLUSH); if (status == Z_OK || status == Z_STREAM_END) { nread = MAX_BUFFER - world->pbuf_size - world->zstream->avail_out; if (status == Z_STREAM_END) { end_mccp(world); } /* If there was an error, we're in trouble. Let's simply ignore it. */ } } else { break; } } else { memcpy(world->dbuffer, world->inbuffer, nread); } world->bytes += nread; if (dumpFile) { fwrite(world->dbuffer, nread, 1, dumpFile); } process_telnet_iac(world, 0, nread); start = 0; nlpos = -1; nlptr = (unsigned char *) memchr(world->pbuffer, '\n', world->pbuf_size); while (nlptr) { nlpos = nlptr - world->pbuffer; convert_recv_line(world, start, nlpos + 1, FALSE); /* We set printed_until to zero to indicate that a full line has been printed and there is no more pending text. */ world->printed_until = 0; start = nlpos + 1; nlptr = (unsigned char *) memchr(world->pbuffer + start, '\n', world->pbuf_size - start); } memmove(world->pbuffer, world->pbuffer + nlpos + 1, world->pbuf_size - nlpos - 1); world->pbuf_size = world->pbuf_size - nlpos - 1; } while (world->zstream); /* When data is not compressed, the end condition will be always false and the loop will execute only once. When data is compressed, the end condition will be always true, and the loop will run forever, until stopped by the break condition above. */ /* Set up a timeout to print incomplete lines if no more data arrives. */ if (world->pbuf_size && !world->timeout_id) { world->timeout_id = g_timeout_add_full(G_PRIORITY_LOW, 150, flush_buffer_timeout_cb, world, NULL); } return TRUE; } gboolean flush_buffer_timeout_cb(gpointer data) { gboolean return_value; return_value = flush_buffer((World *) data, 0); if (!return_value) { ((World *) data)->timeout_id = 0; } return return_value; } static gboolean flush_buffer(World *world, int action) { /* * If action != 0, flush it anyway. * If action = 0, only flush if last data written was more than * 200ms ago. * If action = 2, stop this callback aditionally. */ gulong us_diff; /* Called when a command is sent, the line must be marked as new, even if there is nothing new. */ if (action && world->pbuf_size) { convert_recv_line(world, 0, world->pbuf_size, FALSE); world->printed_until = 0; world->pbuf_size = 0; } /* If action is != 0, this will always be true */ if (world->pbuf_size == world->printed_until) { return (action != 2); } /* This part below only executes if action == 0 */ g_timer_elapsed(world->last_data_written, &us_diff); if (us_diff < MAX_US) { return TRUE; } /* action = 1 is when flushing because a command is sent. We should consider lines as finished in this case. */ convert_recv_line(world, world->printed_until, world->pbuf_size, TRUE); world->printed_until = world->pbuf_size; return FALSE; } static void convert_recv_line(World *world, int start, int end, gboolean incomplete) { gchar *converted; gsize output_len; GError *error = NULL; /* Clear pending line if it gets completed */ if (!incomplete && world->printed_until) { AnsiParseOperation *operation = g_new(AnsiParseOperation, 1); operation->action = CLEAR_PENDING_LINE_ANSI; queue_ansiparse_operation(world, operation); } converted = g_convert((gchar *) (world->pbuffer + start), end - start, VTE_ENC, world->charset, NULL, &output_len, &error); if (converted) { ProcessLineOperation *operation = g_new(ProcessLineOperation, 1); operation->line = converted; operation->len = output_len; operation->action = incomplete ? PROCESS_INCOMPLETE_LINE : PROCESS_COMPLETE_LINE; queue_process_line_operation(world, operation); } else { fprintf(stderr, "Error in charset conversion: %s\n", error->message); } } void start_mccp(World *world, int pos, int end) { if (world->mccp_ver > 0 && !world->zstream) { world->zstream = g_new0(z_stream, 1); if (inflateInit(world->zstream) == Z_OK) { gchar *status_text; memcpy(world->inbuffer, world->dbuffer + pos + 1, end - pos - 1); world->zstream->next_in = world->inbuffer; world->zstream->avail_in = end - pos - 1; world->zstream->next_out = world->dbuffer; world->zstream->avail_out = MAX_BUFFER; if (world->proxy_used.type == PROXY_NONE) { status_text = g_strdup_printf(_("Connected to host %s (%s) port %s, MCCP version %d enabled."), world->host, world->host_ip, world->port, world->mccp_ver); } else { status_text = g_strdup_printf(_("Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d enabled."), world->host, world->port, world->proxy_used.server, world->host_ip, world->proxy_used.port, world->mccp_ver); } if (world->use_tls) { gchar *tmp = status_text; status_text = g_strconcat(tmp, _(" SSL enabled."), NULL); g_free(tmp); } gtk_label_set_text(world->gui->lblStatus, status_text); g_free(status_text); } else { /* We're in trouble, but this shouldn't happen */ g_free(world->zstream); world->zstream = NULL; } } } void end_mccp(World *world) { gchar *status_text; inflateEnd(world->zstream); g_free(world->zstream); world->zstream = NULL; if (world->proxy_used.type == PROXY_NONE) { status_text = g_strdup_printf(_("Connected to host %s (%s) port %s."), world->host, world->host_ip, world->port); } else { status_text = g_strdup_printf(_("Connected to host %s port %s, via proxy %s (%s) port %s."), world->host, world->port, world->proxy_used.server, world->host_ip, world->proxy_used.port); } if (world->use_tls) { gchar *tmp = status_text; status_text = g_strconcat(tmp, _(" SSL enabled."), NULL); g_free(tmp); } gtk_label_set_text(world->gui->lblStatus, status_text); g_free(status_text); } void send_to_world(World *world, const char *cmd, gint len) { /* cmd should be in UTF-8 */ gchar *locale_cmd; gsize locale_len; GError *error = NULL; gboolean has_incomplete_line; has_incomplete_line = world->printed_until; flush_buffer(world, 1); locale_cmd = g_convert(cmd, len, world->charset, VTE_ENC, NULL, &locale_len, &error); if (error) { fprintf(stderr, "%s\n", error->message); return; } /* Flooding prevention */ if (!world->last_command) { world->last_command = locale_cmd; } else { if (world->flood_prevention) { if (strcmp(world->last_command, locale_cmd) == 0) { if (++world->repeat_count == world->max_equal_commands) { send_to_world_no_check(world, world->flood_prevention_command, strlen(world->flood_prevention_command), NULL, 0, TRUE, has_incomplete_line); world->repeat_count = 1; } } else { world->repeat_count = 1; } } g_free(world->last_command); world->last_command = locale_cmd; } send_to_world_no_check(world, cmd, len, locale_cmd, locale_len, TRUE, has_incomplete_line); } void send_to_world_no_check(World *world, const char *utf8_command, int utf8_len, char *locale_command, gsize locale_len, gboolean add_newline, gboolean has_incomplete_line) { GError *error = NULL; gboolean needs_freeing = FALSE; if (!world->connected) { ansitextview_append_string_nl(world->gui, _("Not connected.")); return; } if (!locale_command) { locale_command = g_convert(utf8_command, utf8_len, world->charset, VTE_ENC, NULL, &locale_len, &error); if (error) { fprintf(stderr, "%s\n", error->message); return; } needs_freeing = TRUE; } write_escaped(world, locale_command, locale_len); if (add_newline) { kc_send(world, "\r\n", 2); } if (!world->itime_reset_activate) { world->last_command_time = time(NULL); } if (!world->noecho && world->cmd_echo) { ansitextview_append_string_with_fgcolor(world->gui, utf8_command, globalPrefs.idxCmdEchoColor); if (add_newline) { ansitextview_append_string(world->gui, "\n"); } } else { /* When commands are not echoed, add a newline if there is an incomplete line --- most likely a prompt --- so that the output of the command appears in the next line. */ if (has_incomplete_line) { ansitextview_append_string(world->gui, "\n"); } } execute_hook_immediately(world, "OnSentCommand", utf8_command); if (needs_freeing) { g_free(locale_command); } } void perform_auto_logon(World *world) { gchar *character = NULL; gchar *password; gchar *command = NULL; GtkTreePath *path; GtkTreeIter iter; if (world->character_used == NULL || world->connection_style == NONE) { return; } path = gtk_tree_row_reference_get_path(world->character_used); if (!path) { gtk_tree_row_reference_free(world->character_used); world->character_used = NULL; return; } gtk_tree_model_get_iter(world->logon_characters, &iter, path); gtk_tree_model_get(world->logon_characters, &iter, LOGON_CHAR, &character, LOGON_PASS, &password, -1); switch (world->connection_style) { case DIKU: command = g_strdup_printf("%s\r\n%s\r\n", character, password); break; case LPMUD: command = g_strdup_printf("connect %s %s\r\n", character, password); break; case NONE: /* Should never reach here. */ break; } write_escaped(world, command, strlen(command)); g_free(command); g_free(character); g_free(password); gtk_tree_path_free(path); } static ssize_t write_escaped(World *world, const void *buf, size_t count) { /* * Similar to write(), but escapes any IAC character sending * IAC IAC instead, as the specification tells us to do. */ ssize_t written = 0; size_t size; void *iac_pos; guchar iac = TELNET_IAC; iac_pos = memchr(buf, TELNET_IAC, count); while (iac_pos) { size = iac_pos - buf; written += kc_send(world, buf, size + 1); kc_send(world, &iac, 1); count = count - size - 1; if (count == 0) { /* Force exiting of loop */ iac_pos = NULL; break; } else { buf = iac_pos + 1; iac_pos = memchr(buf, TELNET_IAC, count); } } if (count != 0) { written += kc_send(world, buf, count); } return written; } #ifdef HAVE_LIBGNUTLS ssize_t kc_recv(World *world, void *buf, size_t s) { if (world->use_tls) { return gnutls_record_recv(world->tls_session, buf, s); } else { return recv(world->sock, buf, s, 0); } } ssize_t kc_send(World *world, const void *buf, size_t s) { if (world->use_tls) { return gnutls_record_send(world->tls_session, buf, s); } else { return send(world->sock, buf, s, 0); } } #endif kildclient-3.0.0/src/dlgPreferences.ui0000644000175000017500000016223712374201340014642 00000000000000 100000 1 1 10 100 0.10000000000000001 1 Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) No proxy SOCKS4 SOCKS5 HTTP Left Right Top Bottom False Preferences dialog True False vertical True False end _Close True True True True True True False False 0 False True end 0 True 12 False 12 vertical 18 True False vertical 6 True False 0 0 <b>Colors used by KildClient</b> True False False 0 True False True False False False 0 True False vertical 6 True False 0 _Informative messages: True False False 0 True False modelCores 0 True True 1 True False 0 _Command echo: True False False 2 True False modelCores 0 True True 3 True True 1 True True 1 False False 0 True False vertical 6 True False 0 0 <b>Window configuration</b> True False False 0 True False True False False False 0 True False vertical 6 True False 0 _Tab position: True False False 0 True False modelTabPosition 0 False False 1 _Hide tabs if only one world is open True True False True If this is checked, when there is only one open world no tabs will be shown True 0.5 True True True 2 _Flash window when new text is received True True False True 0.5 True False False 3 True True 1 False False 1 False False 1 True False Appearance False False 12 vertical 18 True False vertical 6 True False 0 0 <b>Sending Delays</b> True False False 0 True False True False False False 0 False 8 vertical 8 True False 0 Enter the default parameters for sending multiple lines or commands: False False 0 True False 4 True False _Number of lines/commands to send at once: True spnGroupSize False False 0 True True adjustment1 1 False False 1 False False 1 True False 4 True False _Delay between each group of lines/commands: True spnPrefsDelay False False 0 True True adjustment2 0.10000000149 1 False False 1 False False 2 True True 1 True True 1 False False 0 1 True False Sending 1 False False 12 vertical 18 True False vertical 6 True False 0 0 <b>Web Browser</b> True False False 0 True False True False False False 0 True False vertical 6 True True True Specify the command used to launch a web browser True False False 0 True False 0 Enter the command to run a web browser. %s will be substituted by the web page address. True False False 1 True True 1 True True 1 False False 0 True False vertical 6 True False 0 0 <b>Audio Player</b> True False False 0 True False True False False False 0 True False vertical 6 True True True Specify the command used to play sound files. True False False 0 True False 0 Enter the command to run an audio player program. %s will be substituted by the file path. True False False 1 True True 1 True True 1 False True 1 2 True False External Programs 2 False True False 12 vertical 18 True False vertical 6 True False 0 0 <b>Proxy</b> True False False 0 True False True False False False 0 True False vertical 12 True False 4 True False Proxy _type: True False False 0 True False modelProxyType 0 False True 1 False True 0 True False 4 4 True False 1 Server _address: True 0 0 True False 1 _Username: True 0 1 True True 1 0 True True 1 1 True False 1 Server _port: True 2 0 True False 1 Pass_word: True 2 1 True True 3 0 True True False 3 1 False False 2 True True 1 True True 1 True True 0 3 True False Proxy 3 False False True 2 closebutton1 kildclient-3.0.0/configure.ac0000644000175000017500000000661012376345572013064 00000000000000AC_INIT([kildclient], [3.0.0]) AC_CONFIG_SRCDIR([src/main.c]) AC_CANONICAL_HOST AM_INIT_AUTOMAKE([foreign]) AC_CONFIG_HEADER([kcconfig.h:config.h.in]) AM_MAINTAINER_MODE AC_PROG_CC AC_CHECK_FUNCS([localtime_r]) dnl dnl Internationalization macros dnl GETTEXT_PACKAGE=kildclient AC_SUBST(GETTEXT_PACKAGE) ALL_LINGUAS="de eo es pt_BR sv" AM_GLIB_GNU_GETTEXT AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", "definition of GETTEXT_PACKAGE") dnl dnl Gtk 2.0 checks dnl PKG_CHECK_MODULES(GTK, glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.10.0) AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) dnl dnl Check for perl - Does not work when cross-compiling dnl case $host in *-*-mingw32*) ;; *) AC_CHECK_PROG(PERL, perl, perl) AC_PROG_PERL_MODULES([ExtUtils::Embed], [dnl KILDCLIENT_PERL_CFLAGS=`$PERL -MExtUtils::Embed -e ccopts` KILDCLIENT_PERL_LIBS=`$PERL -MExtUtils::Embed -e ldopts` AC_SUBST(KILDCLIENT_PERL_CFLAGS) AC_SUBST(KILDCLIENT_PERL_LIBS)], AC_MSG_ERROR(The perl ExtUtils::Embed module could not be found)) ;; esac dnl dnl See if gtkspell is available dnl AC_ARG_WITH([gtkspell], AS_HELP_STRING([--with-gtkspell], [use gtkspell for spell cheking (default is YES)]), [use_gtkspell=$withval], [use_gtkspell="yes"]) if test "$use_gtkspell" != "no"; then PKG_CHECK_MODULES(GTKSPELL, gtkspell3-3.0, [], [dnl GTKSPELL_CFLAGS="" GTKSPELL_LIBS="" AC_MSG_RESULT([not found, disabled])]) else GTKSPELL_CFLAGS="" GTKSPELL_LIBS="" fi AC_SUBST(GTKSPELL_CFLAGS) AC_SUBST(GTKSPELL_LIBS) if test "$GTKSPELL_CFLAGS" != "" ; then AC_DEFINE(HAVE_GTKSPELL, [1], [Do we have the gtkspell library?]) fi dnl dnl See if gnutls is available dnl AC_ARG_WITH([libgnutls], AS_HELP_STRING([--with-libgnutls], [use libgnutls to allow connecting via TLS/SSL (default is YES)]), [use_libgnutls=$withval], [use_libgnutls="yes"]) if test "$use_libgnutls" != "no"; then PKG_CHECK_MODULES(LIBGNUTLS, gnutls, [], [dnl LIBGNUTLS_CFLAGS="" LIBGNUTLS_LIBS="" AC_MSG_RESULT([not found, disabled])]) else LIBGNUTLS_CFLAGS="" LIBGNUTLS_LIBS="" fi AC_SUBST(LIBGNUTLS_CFLAGS) AC_SUBST(LIBGNUTLS_LIBS) if test "$LIBGNUTLS_CFLAGS" != "" ; then AC_DEFINE(HAVE_LIBGNUTLS, [1], [Do we have the gnutls library?]) fi dnl dnl See if documentation is to be generated dnl build_docs=yes AC_ARG_WITH([docs], AS_HELP_STRING([--with-docs], [generate the docbook documentation (default is YES)]), [build_docs=$withval]) AM_CONDITIONAL(BUILD_DOCS, test x$build_docs = xyes) dnl dnl Resources file handling dnl case $host in *-*-mingw32*) dnl Find the windres tool and use it to compile AC_CHECK_TOOL(WINDRES, windres) RES_COMPILE='$(WINDRES) -i $< -o $@ $(RESFLAGS)' ;; *) dnl If not compiling for windows, create a dummy file RES_COMPILE='$(CC) -c -o $@ -x c /dev/null' ;; esac AC_SUBST(RES_COMPILE) dnl dnl Extra flags necessary for windows dnl case $host in *-*-mingw32*) LIBS="$LIBS -mwindows -lregex -lws2_32 -lwinmm" ;; esac dnl dnl Finalization dnl AC_CONFIG_FILES([Makefile po/Makefile.in src/Makefile share/Makefile share/plugins/Makefile doc/Makefile doc/C/Makefile doc/C/images/Makefile]) AC_OUTPUT kildclient-3.0.0/po/0000755000175000017500000000000012376346024011262 500000000000000kildclient-3.0.0/po/es.po0000644000175000017500000024641312376346024012163 00000000000000# KildClient messages in Spanish # Copyright (C) 2013 Eduardo M KALINOWSKI # This file is distributed under the same license as the KildClient package. # msgid "" msgstr "" "Project-Id-Version: KildClient 3.0.0\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=glib&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2014-08-17 14:59-0300\n" "PO-Revision-Date: 2014-08-17 14:59-0300\n" "Last-Translator: Fernando Bobbio \n" "Language-Team: Eduardo M Kalinowski \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.4\n" #: ../src/main.c:74 msgid "Outputs version information and exits" msgstr "Muestra información de la versión y cierra" #: ../src/main.c:76 msgid "Directory to store settings and saved worlds" msgstr "Directorio donde se guardan configuraciones y mundos guardados" #: ../src/main.c:76 msgid "DIR" msgstr "DIR" #: ../src/main.c:78 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "" "Ingresa toda la información recibida de (luego de descompresión, si es " "necesario) al archivo" #: ../src/main.c:79 ../src/main.c:82 msgid "FILE" msgstr "ARCHIVO" #: ../src/main.c:81 msgid "Dumps all data received (possibly compressed) to the file" msgstr "" "Ingresa toda la información recibida (posiblemente compresa) al archivo" #. Parse command-line options #: ../src/main.c:120 msgid "[WORLD...]" msgstr "[MUNDO...]" #: ../src/main.c:127 #, c-format msgid "Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" msgstr "Escrito por Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" #: ../src/main.c:132 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "No se puede abrir el archivo %s: %s\n" #: ../src/main.c:139 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "No se puede abrir el archivo original %s: %s\n" #: ../src/main.c:282 msgid "There is one open world. Do you really want to quit?" msgstr "Hay un mundo abierto. ¿Realmente quiere desconectar?" #: ../src/main.c:288 #, c-format msgid "There are %d open worlds. Do you really want to quit?" msgstr "Hay %d mundos abiertos. ¿Realmente quiere desconectar?" #: ../src/main.c:291 msgid "Really Quit KildClient?" msgstr "¿Realmente salir de KildClient?" #: ../src/main.c:293 msgid "_Don't quit" msgstr "_No salir" #: ../src/main.c:294 ../src/wndmain.ui:145 msgid "_Quit" msgstr "_Salir" #: ../src/net.c:110 msgid "" "You're attempting to connect to a world that uses SSL, but this version of " "KildClient has been built without SSL support. Try to connect without SSL?" msgstr "" "Está intentando conectar a un mundo que usa SSL, pero esta versión de " "KildCliente ha sido compilada sin soporte para SSL. ¿Intentar conectar sin " "SSL?" #: ../src/net.c:111 msgid "KildClient Question" msgstr "Pregunta de KildClient" #: ../src/net.c:113 msgid "Connect without SSL" msgstr "Conectar sin SSL" #: ../src/net.c:114 msgid "Do not connect" msgstr "No conectar" #: ../src/net.c:122 msgid "This version of KildClient does not have SSL support." msgstr "Esta versión de KildClient no tiene soporte para SSL." #: ../src/net.c:198 ../src/proxy.c:212 #, c-format msgid "Resolving proxy host %s..." msgstr "Resolviendo proxy %s..." #: ../src/net.c:201 #, c-format msgid "Resolving host %s..." msgstr "Resolviendo %s..." #: ../src/net.c:294 ../src/proxy.c:196 #, c-format msgid "Could not resolve host %s: %s" msgstr "No se pudo resolver %s: %s" #: ../src/net.c:322 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "Intentando conectar a %s (%s) puerto %s..." #: ../src/net.c:325 #, c-format msgid "Attempting to connect to proxy host %s (%s) port %s..." msgstr "Intentando conectar a proxy %s (%s) puerto %s..." #: ../src/net.c:341 #, c-format msgid "Could not create socket: %s" msgstr "No se pudo crear conexión: %s" #: ../src/net.c:344 #, c-format msgid "Could not create socket: error #%d" msgstr "No se pudo crear conexión: error #%d" #: ../src/net.c:364 #, c-format msgid "Could not connect to host %s port %s: %s" msgstr "No se pudo conectar a %s puerto %s: %s" #: ../src/net.c:374 #, c-format msgid "Could not connect to host %s port %s: Error #%d" msgstr "No se pudo conectar a %s puerto %s: Error #%d" #: ../src/net.c:430 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Problemas de conexión a %s: %s." #: ../src/net.c:433 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Problemas de conexión a proxy %s: %s." #: ../src/net.c:475 ../src/net.c:493 #, c-format msgid "Unable to connect to host %s: Error #%d." msgstr "Problemas de conexión a %s: Error #%d." #: ../src/net.c:478 ../src/net.c:496 #, c-format msgid "Unable to connect to proxy host %s: Error #%d." msgstr "Problemas de conexión a proxy %s: Error #%d." #: ../src/net.c:532 #, c-format msgid "Performing SSL handshake..." msgstr "Iniciando conexión SSL..." #: ../src/net.c:582 #, c-format msgid "SSL Handshake failed: %s" msgstr "Problema de conexión SSL: %s" #: ../src/net.c:624 #, c-format msgid "SSL Handshake took too long." msgstr "La conexión SSL demoró demasiado." #: ../src/net.c:653 ../src/net.c:1156 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Conectado a %s (%s) puerto %s." #: ../src/net.c:656 ../src/net.c:1159 #, c-format msgid "Connected to host %s port %s, via proxy %s (%s) port %s." msgstr "Conectado a %s puerto %s, mediante proxy %s (%s) puerto %s." #: ../src/net.c:663 ../src/net.c:1132 ../src/net.c:1166 msgid " SSL enabled." msgstr "SSL habilitado." #: ../src/net.c:681 ../src/perlscript.c:3234 #, c-format msgid "Logging to file %s.\n" msgstr "Guardando información a archivo %s.\n" #: ../src/net.c:827 #, c-format msgid "Disconnected from host %s." msgstr "Desconectado de %s." #: ../src/net.c:900 ../src/net.c:909 #, c-format msgid "Disconnected from host %s: %s." msgstr "Desconectado de %s: %s." #: ../src/net.c:920 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "Desconectado de %s: error #%d." #: ../src/net.c:1120 #, c-format msgid "Connected to host %s (%s) port %s, MCCP version %d enabled." msgstr "Desconectado de %s (%s) puerto %s, versión de MCCP %d habilitada." #: ../src/net.c:1124 #, c-format msgid "" "Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d " "enabled." msgstr "" "Conectado a %s puerto %s, mediante proxy %s (%s) puerto %s, versión de MCCP " "%d " #: ../src/net.c:1242 ../src/we_logging.c:123 msgid "Not connected." msgstr "No conectado." #. success #: ../src/proxy.c:60 msgid "general failure" msgstr "Falla general" #: ../src/proxy.c:61 msgid "connection not allowed by ruleset" msgstr "Conexión no permitida por reglas habilitadas" #: ../src/proxy.c:62 msgid "network unreachable" msgstr "Red no existente" #: ../src/proxy.c:63 msgid "host unreachable" msgstr "No se puede encontrar el servidor " #: ../src/proxy.c:64 msgid "connection refused by destination host" msgstr "Conexión rechazada por destino" #: ../src/proxy.c:65 msgid "TTL expired" msgstr "TTL expirado" #: ../src/proxy.c:66 msgid "command not supported / protocol error" msgstr "Comando no soportado / error de protocolo" #: ../src/proxy.c:67 msgid "address type not supported" msgstr "Tipo de dirección no soportado" #: ../src/proxy.c:242 ../src/proxy.c:664 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "Conectado al servidor proxy %s en el puerto %s, enviando pedido..." #: ../src/proxy.c:297 ../src/proxy.c:426 ../src/proxy.c:471 ../src/proxy.c:545 #: ../src/proxy.c:711 msgid "Error while reading from proxy host." msgstr "Error al leer del servidor proxy. " #: ../src/proxy.c:318 msgid "request rejected or failed" msgstr "Pedido rechazado o fallido" #: ../src/proxy.c:322 msgid "request failed because identd could not be reached" msgstr "Pedido fallido debido a que identd no pudo ser encontrado" #: ../src/proxy.c:326 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" "Pedido fallido debido a que el identd del cliente no pudo confirmar el ID de " "usuario en el pedido" #: ../src/proxy.c:330 ../src/proxy.c:571 ../src/proxy.c:727 #, c-format msgid "Proxy request failed: %s." msgstr "Pedido de proxy fallido: %s." #: ../src/proxy.c:347 #, c-format msgid "Connected to proxy server %s port %s, negotiating authentication..." msgstr "" "Conectado al puerto %s del servidor proxy %s, negociando autenticación..." #: ../src/proxy.c:441 msgid "No acceptable proxy authentication methods." msgstr "No existen métidos de autenticación de proxy aceptables." #: ../src/proxy.c:489 msgid "Proxy authentication failed." msgstr "" #. Should never happen #: ../src/proxy.c:532 msgid "Unrecognized response from proxy host." msgstr "" #: ../src/proxy.c:566 msgid "unknown reason code" msgstr "Código de razón desconocida" #: ../src/proxy.c:587 #, c-format msgid "Sending proxy authentication credentials..." msgstr "" #: ../src/proxy.c:626 #, c-format msgid "Sending connection request..." msgstr "Enviando pedido de conexión..." #: ../src/mainwindow.c:163 ../src/mainwindow.c:537 ../src/mainwindow.c:803 #: ../src/worldgui.c:1096 ../src/worldselector.c:193 ../src/worldeditor.c:180 #: ../src/we_general.c:342 ../src/we_generic_guied.c:81 #: ../src/we_triggers.c:83 ../src/we_triggers.c:553 ../src/we_triggers.c:751 #: ../src/we_aliases.c:76 ../src/we_aliases.c:455 ../src/we_macros.c:79 #: ../src/we_macros.c:420 ../src/we_timers.c:76 ../src/we_timers.c:457 #: ../src/we_hooks.c:87 ../src/we_hooks.c:620 ../src/we_vars.c:76 #: ../src/we_vars.c:368 ../src/prefs.c:107 ../src/triggers.c:278 #: ../src/multilinesend.c:93 ../src/cmdhistory.c:209 ../src/cmdhistory.c:454 #, c-format msgid "Error loading UI from XML file: %s" msgstr "" #: ../src/mainwindow.c:596 ../src/mainwindow.c:597 msgid "Not connected" msgstr "No conectado(a)" #: ../src/mainwindow.c:739 msgid ": Not yet active" msgstr ": Todavía inactivo" #: ../src/mainwindow.c:744 msgid ": Expired" msgstr ": Expirado" #: ../src/mainwindow.c:758 ../src/kildclient.ui:1995 #: ../src/dlgStatistics.ui:104 ../src/dlgStatistics.ui:337 msgid "None" msgstr "Ninguno(a)" #: ../src/worldgui.c:220 msgid "_Find:" msgstr "_Encontrar:" #: ../src/worldgui.c:234 msgid "Find Next" msgstr "Encontrar Siguiente" #: ../src/worldgui.c:261 msgid "Click to clear the command input area." msgstr "" #: ../src/worldgui.c:360 msgid "No world" msgstr "No hay mundo" #: ../src/worldgui.c:430 msgid "KildClient ready" msgstr "KildClient listo" #: ../src/worldgui.c:437 msgid "0 lines" msgstr "0 líneas" #: ../src/worldgui.c:890 msgid "Are you sure you want to close this world?" msgstr "¿Está seguro que quiere cerrar este mundo?" #: ../src/worldgui.c:891 msgid "Really close?" msgstr "¿Realmente cerrar?" #: ../src/worldgui.c:893 msgid "Keep _open" msgstr "Mantener _abierto" #: ../src/worldgui.c:894 ../src/worldselector.c:816 ../src/worldselector.c:822 #: ../src/wndmain.ui:72 ../src/dlgPreferences.ui:136 #: ../src/dlgTestTriggers.ui:23 ../src/dlgCmdHistory.ui:197 msgid "_Close" msgstr "_Cerrar" #: ../src/worldgui.c:1025 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Error configurando corrector ortográfico: %s\n" #: ../src/worldgui.c:1029 msgid "Spell checking support not included in this build." msgstr "Soporte para corrección ortográfica no incluída en esta revisión." #: ../src/worldgui.c:1275 msgid "Click to open link; right-click for more options." msgstr "Dar clic para abrir vínculo; clic de la derecha para más opciones." #: ../src/worldgui.c:1437 msgid "Not found" msgstr "No encontrado(a)" #: ../src/ansitextview.c:423 msgid "1 line" msgstr "1 línea" #: ../src/ansitextview.c:425 #, c-format msgid "%d lines" msgstr "%d líneas" #: ../src/worldselector.c:138 ../src/worldselector.c:689 #, c-format msgid "Could not load world from file '%s': %s" msgstr "No se pudo cargar mundo de archivo '%s': %s" #: ../src/worldselector.c:141 ../src/worldselector.c:692 ../src/worlds.c:2370 #: ../src/we_generic_guied.c:315 ../src/we_generic_guied.c:404 #: ../src/prefs.c:448 ../src/prefs.c:527 msgid "KildClient Error" msgstr "Error de KildClient" #: ../src/worldselector.c:494 #, c-format msgid "Could not open world '%s': %s\n" msgstr "No se pudo abrir mundo '%s': %s\n" #: ../src/worldselector.c:537 #, c-format msgid "Invalid argument '%s'\n" msgstr "Argumento inválido '%s'\n" #: ../src/worldselector.c:810 msgid "Disconnected" msgstr "Desconectado(a)" #: ../src/worldselector.c:813 ../src/worldselector.c:820 msgid "Reconnect" msgstr "Reconectar" #: ../src/worldselector.c:814 ../src/worldselector.c:821 msgid "Connect to another world" msgstr "Conectar a otro mundo" #: ../src/worldselector.c:815 msgid "Offline" msgstr "Desconectado(a)" #: ../src/worlds.c:776 msgid "Unnamed world" msgstr "Mundo sin nombre" #: ../src/worlds.c:833 #, c-format msgid "Could not open file: %s" msgstr "No se pudo abrir archivo: %s" #: ../src/worlds.c:896 #, c-format msgid "Invalid top-level element '%s'" msgstr "" #: ../src/worlds.c:1710 #, c-format msgid "Internal error: element '%s' ends when in START mode" msgstr "" #: ../src/worlds.c:1984 #, c-format msgid "Invalid key code '%s'" msgstr "" #: ../src/worlds.c:2003 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "" #: ../src/worlds.c:2016 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "" #: ../src/worlds.c:2367 ../src/we_generic_guied.c:312 ../src/prefs.c:445 #, c-format msgid "Could not open file '%s': %s" msgstr "" #: ../src/worlds.c:2528 #, c-format msgid "Disconnected from world %s" msgstr "" #: ../src/worldeditor.c:245 msgid "General" msgstr "General" #: ../src/worldeditor.c:253 ../src/worldeditor.c:257 msgid "Display" msgstr "" #: ../src/worldeditor.c:254 msgid "Here you can set options to configure the appearance of KildClient." msgstr "" #: ../src/worldeditor.c:265 msgid "Main Window" msgstr "Ventana Principal" #: ../src/worldeditor.c:273 msgid "Colors" msgstr "Colores" #: ../src/worldeditor.c:281 msgid "Status Bar" msgstr "Barra de Estado" #: ../src/worldeditor.c:289 msgid "Input" msgstr "Ingreso" #: ../src/worldeditor.c:297 msgid "Logging" msgstr "" #: ../src/worldeditor.c:303 ../src/worldeditor.c:307 msgid "Automation" msgstr "Automatización" #: ../src/worldeditor.c:304 msgid "" "Here you can set options to configure the automation features of KildClient, " "such as triggers, aliases, plugins, etc." msgstr "" #: ../src/worldeditor.c:315 msgid "Scripting" msgstr "Scripting" #: ../src/worldeditor.c:323 msgid "Plugins" msgstr "" #: ../src/worldeditor.c:334 ../src/kildclient.ui:1556 msgid "Triggers" msgstr "Triggers" #: ../src/worldeditor.c:345 ../src/kildclient.ui:1571 msgid "Aliases" msgstr "Aliases" #: ../src/worldeditor.c:356 ../src/kildclient.ui:1586 msgid "Macros" msgstr "Macros" #: ../src/worldeditor.c:367 ../src/kildclient.ui:1601 msgid "Timers" msgstr "Temporizadores" #: ../src/worldeditor.c:378 msgid "Hooks" msgstr "Hooks" #: ../src/worldeditor.c:389 msgid "Variables" msgstr "Variables" #: ../src/worldeditor.c:398 msgid "Protocols" msgstr "Protocolos" #: ../src/worldeditor.c:406 msgid "Miscellaneous" msgstr "Misceláneo" #: ../src/worldeditor.c:414 msgid "Advanced" msgstr "Avanzado" #: ../src/we_general.c:73 msgid "Character" msgstr "Caracter" #: ../src/we_general.c:81 msgid "Password" msgstr "Contraseña" #: ../src/we_general.c:381 msgid "You must specify the name." msgstr "Se tiene que especificar el nombre." #: ../src/we_general.c:382 ../src/we_general.c:395 ../src/we_triggers.c:636 #: ../src/we_triggers.c:650 ../src/we_aliases.c:517 ../src/we_aliases.c:530 #: ../src/we_macros.c:477 ../src/we_macros.c:490 ../src/we_macros.c:503 #: ../src/we_timers.c:516 ../src/we_timers.c:529 ../src/we_hooks.c:672 #: ../src/we_vars.c:396 ../src/we_vars.c:408 ../src/we_vars.c:428 #: ../src/permanentvariables.c:129 ../src/cmdhistory.c:278 #: ../src/cmdhistory.c:290 ../src/cmdhistory.c:484 ../src/cmdhistory.c:517 #: ../src/cmdhistory.c:574 msgid "KildClient Warning" msgstr "Advertencia de KildClient" #: ../src/we_general.c:394 msgid "You must specify the password." msgstr "Se tiene que especificar la contraseña." #: ../src/we_general.c:436 msgid "character" msgstr "caracter" #: ../src/we_logging.c:112 #, c-format msgid "Logging to file %s." msgstr "" #: ../src/we_logging.c:118 msgid "Logging is disabled." msgstr "" #: ../src/we_logging.c:215 msgid "Logging not started" msgstr "" #: ../src/we_logging.c:245 msgid "Select log file" msgstr "" #: ../src/we_logging.c:248 ../src/we_plugins.c:584 #: ../src/we_generic_guied.c:97 ../src/we_generic_guied.c:369 #: ../src/kildclient.ui:40 ../src/kildclient.ui:516 ../src/kildclient.ui:580 #: ../src/kildclient.ui:711 ../src/kildclient.ui:908 ../src/kildclient.ui:1125 #: ../src/kildclient.ui:1449 ../src/kildclient.ui:2170 #: ../src/dlgSelectWorld.ui:25 ../src/dlgEditWorld.ui:114 #: ../src/dlgMLSend.ui:36 ../src/dlgCmdHistory.ui:352 msgid "_Cancel" msgstr "_Cancelar" #: ../src/we_logging.c:250 ../src/kildclient.ui:55 ../src/kildclient.ui:531 #: ../src/kildclient.ui:595 ../src/kildclient.ui:726 ../src/kildclient.ui:923 #: ../src/kildclient.ui:1140 ../src/kildclient.ui:1464 #: ../src/kildclient.ui:2185 ../src/dlgStatistics.ui:22 #: ../src/dlgEditWorld.ui:129 ../src/dlgCmdHistory.ui:367 msgid "_OK" msgstr "_OK" #: ../src/we_plugins.c:124 ../src/we_plugins.c:341 ../src/we_triggers.c:225 #: ../src/we_aliases.c:206 ../src/we_macros.c:209 ../src/we_timers.c:206 #: ../src/we_hooks.c:341 ../src/perlscript.c:3356 msgid "Name" msgstr "Nombre" #: ../src/we_plugins.c:136 ../src/we_plugins.c:383 ../src/perlscript.c:3357 msgid "Description" msgstr "Descripción" #: ../src/we_plugins.c:148 ../src/we_plugins.c:369 msgid "Author" msgstr "Autor" #: ../src/we_plugins.c:161 msgid "File" msgstr "Archivo" #: ../src/we_plugins.c:209 ../src/we_plugins.c:466 msgid "Error Loading Plugin" msgstr "" #: ../src/we_plugins.c:327 ../src/we_triggers.c:211 ../src/we_aliases.c:192 #: ../src/we_macros.c:195 ../src/we_timers.c:192 ../src/we_hooks.c:327 msgid "Enabled" msgstr "Habilitado(a)" #: ../src/we_plugins.c:355 msgid "Version" msgstr "Versión" #: ../src/we_plugins.c:444 msgid "Always load this plugin at _startup" msgstr "" #: ../src/we_plugins.c:507 msgid "The help is displayed in main window." msgstr "" #: ../src/we_plugins.c:508 msgid "KildClient Information" msgstr "Información de KildClient" #: ../src/we_plugins.c:509 msgid "_Do not display this message again" msgstr "_No mostrar este mensaje nuevamente" #: ../src/we_plugins.c:581 msgid "Load plugin" msgstr "" #: ../src/we_plugins.c:586 ../src/we_generic_guied.c:371 msgid "_Open" msgstr "_Abrir" #: ../src/we_generic_guied.c:94 msgid "Export" msgstr "Exportar" #: ../src/we_generic_guied.c:99 ../src/wndmain.ui:97 msgid "_Save" msgstr "_Guardar" #: ../src/we_generic_guied.c:366 msgid "Import" msgstr "Importar" #: ../src/we_generic_guied.c:401 #, c-format msgid "Could not import file '%s': %s" msgstr "" #: ../src/we_generic_guied.c:960 #, c-format msgid "Do you really want to delete the %s?" msgstr "" #: ../src/we_generic_guied.c:967 #, c-format msgid "Do you really want to delete %d %s?" msgstr "" #: ../src/we_generic_guied.c:971 ../src/we_vars.c:288 msgid "Confirm deletion" msgstr "Confirmar borrado" #: ../src/we_generic_guied.c:973 msgid "Do not delete" msgstr "No borrar" #: ../src/we_generic_guied.c:974 msgid "Delete" msgstr "Borrar" #: ../src/we_triggers.c:130 ../src/dlgTestTriggers.ui:8 msgid "Test Triggers" msgstr "" #: ../src/we_triggers.c:239 ../src/we_aliases.c:220 ../src/triggers.c:141 #: ../src/aliases.c:177 msgid "Pattern" msgstr "Patrón" #: ../src/we_triggers.c:257 ../src/we_aliases.c:238 msgid "I. Case" msgstr "I. Caso" #: ../src/we_triggers.c:271 ../src/we_macros.c:237 ../src/we_timers.c:246 #: ../src/we_hooks.c:355 ../src/triggers.c:142 ../src/macros.c:145 #: ../src/timers.c:203 msgid "Action" msgstr "Acción" #: ../src/we_triggers.c:289 msgid "Gag" msgstr "" #: ../src/we_triggers.c:307 msgid "Gag Log" msgstr "" #: ../src/we_triggers.c:325 msgid "Keep Exec" msgstr "" #: ../src/we_triggers.c:343 msgid "Rewriter" msgstr "" #: ../src/we_triggers.c:361 msgid "Style" msgstr "Estilo" #: ../src/we_triggers.c:375 ../src/we_aliases.c:284 ../src/we_macros.c:251 #: ../src/we_timers.c:278 ../src/we_hooks.c:369 msgid "Plugin" msgstr "" #: ../src/we_triggers.c:471 ../share/kildclient.pl:233 #: ../share/kildclient.pl:236 ../share/kildclient.pl:443 #: ../share/kildclient.pl:518 ../share/kildclient.pl:821 msgid "trigger" msgstr "" #: ../src/we_triggers.c:471 ../share/kildclient.pl:443 msgid "triggers" msgstr "" #: ../src/we_triggers.c:635 ../src/we_aliases.c:516 msgid "You must specify the pattern." msgstr "Se tiene que especificar el patrón." #: ../src/we_triggers.c:649 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" #: ../src/we_aliases.c:252 ../src/aliases.c:178 msgid "Substitution" msgstr "Substitución" #: ../src/we_aliases.c:270 msgid "Eval as Perl" msgstr "Evaluar como Perl" #: ../src/we_aliases.c:380 ../share/kildclient.pl:246 #: ../share/kildclient.pl:249 ../share/kildclient.pl:449 #: ../share/kildclient.pl:524 ../share/kildclient.pl:833 msgid "alias" msgstr "alias" #: ../src/we_aliases.c:380 ../share/kildclient.pl:449 msgid "aliases" msgstr "aliases" #: ../src/we_aliases.c:529 msgid "You must specify the substitution." msgstr "Se tiene que especificar la substitución." #: ../src/we_macros.c:223 ../src/macros.c:144 msgid "Key" msgstr "Clave" #: ../src/we_macros.c:347 ../share/kildclient.pl:259 #: ../share/kildclient.pl:262 ../share/kildclient.pl:455 #: ../share/kildclient.pl:530 ../share/kildclient.pl:845 msgid "macro" msgstr "Macro" #: ../src/we_macros.c:347 ../share/kildclient.pl:455 msgid "macros" msgstr "Macros" #: ../src/we_macros.c:476 msgid "You must specify the key." msgstr "Se tiene que especificar la clave." #: ../src/we_macros.c:489 msgid "Invalid key code." msgstr "Código de clave inválido." #: ../src/we_macros.c:502 ../src/we_timers.c:528 ../src/we_hooks.c:671 msgid "You must specify the action." msgstr "Se tiene que especificar la acción." #: ../src/we_timers.c:219 msgid "Interval" msgstr "Intervalo" #: ../src/we_timers.c:232 msgid "Count" msgstr "Cuenta" #: ../src/we_timers.c:264 msgid "Temp" msgstr "Temp" #: ../src/we_timers.c:381 ../share/kildclient.pl:272 #: ../share/kildclient.pl:275 ../share/kildclient.pl:461 #: ../share/kildclient.pl:536 ../share/kildclient.pl:857 msgid "timer" msgstr "Temporizador" #: ../src/we_timers.c:381 ../share/kildclient.pl:461 msgid "timers" msgstr "Temporizadores" #: ../src/we_timers.c:515 msgid "The interval must be positive." msgstr "" #. The manually added combo for selecting which hook #: ../src/we_hooks.c:130 msgid "_Event:" msgstr "_Evento:" #: ../src/we_hooks.c:547 ../share/kildclient.pl:286 ../share/kildclient.pl:289 #: ../share/kildclient.pl:467 ../share/kildclient.pl:543 #: ../share/kildclient.pl:870 msgid "hook" msgstr "" #: ../src/we_hooks.c:547 ../share/kildclient.pl:467 msgid "hooks" msgstr "" #: ../src/we_vars.c:279 msgid "Do you really want to make the variable temporary?" msgstr "¿Realmente quiere crear la variable momentáneamente?" #: ../src/we_vars.c:285 #, c-format msgid "Do you really want to make %d variables temporary?" msgstr "" #: ../src/we_vars.c:290 msgid "Keep permanent" msgstr "Mantener como permanente" #: ../src/we_vars.c:291 msgid "Make temporary" msgstr "Crear momentáneamente" #: ../src/we_vars.c:395 msgid "You must specify a variable name." msgstr "Se tiene que especificar un nombre de variable." #: ../src/we_vars.c:407 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "" #: ../src/we_vars.c:426 #, c-format msgid "%s is already permanent." msgstr "%s ya es permanente." #: ../src/prefs.c:398 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "" #: ../src/prefs.c:418 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "" #: ../src/prefs.c:524 #, c-format msgid "Could not create directory '%s': %s" msgstr "No se puede crear el directorio '%s': %s" #: ../src/parser.c:210 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "" #: ../src/triggers.c:140 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "" #: ../src/triggers.c:162 ../src/triggers.c:163 ../src/triggers.c:164 #: ../src/triggers.c:165 ../src/triggers.c:166 ../src/triggers.c:167 #: ../src/triggers.c:168 ../src/aliases.c:198 ../src/aliases.c:199 #: ../src/aliases.c:200 ../src/macros.c:167 ../src/timers.c:226 #: ../src/timers.c:227 ../src/hooks.c:206 ../src/perlscript.c:3376 msgid "y" msgstr "Sí (y)" #: ../src/triggers.c:162 ../src/triggers.c:163 ../src/triggers.c:164 #: ../src/triggers.c:165 ../src/triggers.c:166 ../src/triggers.c:167 #: ../src/triggers.c:168 ../src/aliases.c:198 ../src/aliases.c:199 #: ../src/aliases.c:200 ../src/macros.c:167 ../src/timers.c:226 #: ../src/timers.c:227 ../src/hooks.c:206 ../src/perlscript.c:3376 msgid "n" msgstr "No (n)" #: ../src/triggers.c:361 ../src/kildclient.ui:1978 ../src/kildclient.ui:2015 msgid "No" msgstr "No" #: ../src/triggers.c:361 ../src/kildclient.ui:1981 ../src/kildclient.ui:2018 msgid "Yes" msgstr "Sí" #: ../src/aliases.c:176 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "" #: ../src/macros.c:143 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "" #: ../src/timers.c:195 msgid "Num Ena Temp Int " msgstr "" #: ../src/timers.c:199 msgid "Count " msgstr "Contar" #: ../src/permanentvariables.c:125 #, c-format msgid "" "Could not open file '%s': %s\n" "Variables were not saved." msgstr "" #: ../src/hooks.c:60 #, c-format msgid "hook: hook '%s' not found\n" msgstr "" #: ../src/hooks.c:76 ../src/hooks.c:229 msgid "No such hook" msgstr "" #: ../src/hooks.c:178 ../src/hooks.c:224 msgid "Hook not found" msgstr "" #: ../src/hooks.c:191 #, c-format msgid "Hooks for '%s':\n" msgstr "" #: ../src/hooks.c:192 msgid "Num Ena Action" msgstr "" #: ../src/hooks.c:234 #, c-format msgid "" "Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" #: ../src/hooks.c:240 ../src/perlscript.c:1691 ../src/perlscript.c:2191 #: ../src/perlscript.c:2501 ../src/perlscript.c:2790 msgid "Not set" msgstr "" #: ../src/hooks.c:242 ../src/perlscript.c:1694 ../src/perlscript.c:1695 #: ../src/perlscript.c:1696 ../src/perlscript.c:1697 ../src/perlscript.c:1698 #: ../src/perlscript.c:1699 ../src/perlscript.c:1700 ../src/perlscript.c:2194 #: ../src/perlscript.c:2195 ../src/perlscript.c:2196 ../src/perlscript.c:2504 #: ../src/perlscript.c:2794 ../src/perlscript.c:2795 ../src/perlscript.c:3414 msgid "yes" msgstr "sí" #: ../src/hooks.c:242 ../src/perlscript.c:1694 ../src/perlscript.c:1695 #: ../src/perlscript.c:1696 ../src/perlscript.c:1697 ../src/perlscript.c:1698 #: ../src/perlscript.c:1699 ../src/perlscript.c:1700 ../src/perlscript.c:2194 #: ../src/perlscript.c:2195 ../src/perlscript.c:2196 ../src/perlscript.c:2504 #: ../src/perlscript.c:2794 ../src/perlscript.c:2795 ../src/perlscript.c:3414 msgid "no" msgstr "no" #: ../src/log.c:105 msgid "File name not specified." msgstr "Nombre de archivo no especificado." #: ../src/log.c:171 #, c-format msgid "Could not open log file: %s." msgstr "No se pudo abrir el archivo de texto: %s." #: ../src/plugins.c:102 ../src/plugins.c:161 #, c-format msgid "Failed loading file %s: %s" msgstr "No se pudo cargar el archivo %s: %s" #: ../src/cmdhistory.c:277 msgid "No command selected." msgstr "No se seleccionó ningún comando." #: ../src/cmdhistory.c:289 msgid "More than one command selected." msgstr "Hay más de un comando seleccionado." #: ../src/cmdhistory.c:483 msgid "Enter some text to search for." msgstr "Ingresar parte del texto a buscar." #: ../src/cmdhistory.c:516 msgid "Use the Find button to find the first result." msgstr "Usar el botón Encontrar (\"Find\") para encontrar el primer resultado." #: ../src/cmdhistory.c:573 msgid "Command not found." msgstr "Comando no encontrado." #: ../src/perlscript.c:506 ../src/perlscript.c:512 ../src/perlscript.c:519 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "" #: ../src/perlscript.c:673 ../src/perlscript.c:690 ../src/perlscript.c:752 #: ../src/perlscript.c:785 ../src/perlscript.c:1186 ../src/perlscript.c:1211 #: ../src/perlscript.c:1312 ../src/perlscript.c:1332 ../src/perlscript.c:1355 #: ../src/perlscript.c:1383 ../src/perlscript.c:1392 ../src/perlscript.c:1932 #: ../src/perlscript.c:1941 ../src/perlscript.c:2120 ../src/perlscript.c:2291 #: ../src/perlscript.c:2300 ../src/perlscript.c:2580 ../src/perlscript.c:2589 #: ../src/perlscript.c:2865 ../src/perlscript.c:2919 ../src/perlscript.c:2964 #: ../src/perlscript.c:3029 ../src/perlscript.c:3040 ../src/perlscript.c:3132 #: ../src/perlscript.c:3463 ../src/kcwin.c:96 #, c-format msgid "%s: Too few arguments" msgstr "%s: Demasiados argumentos." #: ../src/perlscript.c:718 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: El argumento tiene que ser numérico" #: ../src/perlscript.c:766 ../src/perlscript.c:798 #, c-format msgid "%s: No such world" msgstr "%s: No existe tal mundo" #: ../src/perlscript.c:833 msgid "World saved." msgstr "Mundo guardado." #: ../src/perlscript.c:1082 ../src/perlscript.c:1097 ../src/perlscript.c:1107 #: ../src/perlscript.c:1268 ../share/kildclient.pl:1303 #, c-format, perl-format msgid "%s: This is an internal function, do not call directly." msgstr "%s: Esta es una función interna, no llamarla directamente." #: ../src/perlscript.c:1086 ../src/perlscript.c:1514 ../src/perlscript.c:2043 #: ../src/perlscript.c:2416 ../src/perlscript.c:2611 ../src/perlscript.c:3093 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Tipo de argumento incorrecto" #: ../src/perlscript.c:1278 ../src/perlscript.c:1284 #, c-format msgid "Protocol %s not enabled." msgstr "Protocolo %s no habilitado." #: ../src/perlscript.c:1289 ../share/kildclient.pl:1151 msgid "Unknown protocol" msgstr "Protocolo desconocido" #: ../src/perlscript.c:1406 ../src/perlscript.c:1674 msgid "No such trigger" msgstr "" #: ../src/perlscript.c:1424 ../src/perlscript.c:1973 ../src/perlscript.c:2345 #: ../src/perlscript.c:3052 #, c-format msgid "%s: Too many string arguments" msgstr "" #: ../src/perlscript.c:1447 ../src/perlscript.c:1996 #, c-format msgid "%s: pattern given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:1459 ../src/perlscript.c:2394 ../src/perlscript.c:3072 #, c-format msgid "%s: action given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:1505 ../src/perlscript.c:2034 ../src/perlscript.c:2407 #: ../src/perlscript.c:3085 #, c-format msgid "%s: Wrong type of reference" msgstr "" #: ../src/perlscript.c:1525 #, c-format msgid "%s: pattern not specified, not creating" msgstr "" #: ../src/perlscript.c:1534 #, c-format msgid "%s: action not specified, and isn't gag, not creating" msgstr "" #: ../src/perlscript.c:1563 msgid "Trigger added." msgstr "" #: ../src/perlscript.c:1568 msgid "Trigger modified." msgstr "" #: ../src/perlscript.c:1593 #, c-format msgid "%s: invalid target" msgstr "" #: ../src/perlscript.c:1603 #, c-format msgid "%s: invalid fg color" msgstr "" #: ../src/perlscript.c:1613 #, c-format msgid "%s: invalid bg color" msgstr "" #: ../src/perlscript.c:1623 #, c-format msgid "%s: invalid underline style" msgstr "" #: ../src/perlscript.c:1679 #, c-format msgid "" "Trigger number %d\n" " Name: %s\n" " Pattern: %s\n" " Action: %s\n" " Enabled: %s\n" " Ignore case: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Keep executing: %s\n" " Rewriter: %s\n" " Change style: %s\n" msgstr "" #: ../src/perlscript.c:1703 #, c-format msgid "" " Target: %d\n" " Foreground: %d\n" " Background: %d\n" " Italics: %d\n" " Striked-thru: %d\n" " Underline: %d\n" msgstr "" #: ../src/perlscript.c:1955 ../src/perlscript.c:2178 msgid "No such alias" msgstr "Alias no existente" #: ../src/perlscript.c:2008 #, c-format msgid "%s: substitution given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:2054 msgid "alias: not creating alias without pattern" msgstr "" #: ../src/perlscript.c:2062 msgid "alias: not creating alias without substitution" msgstr "" #: ../src/perlscript.c:2090 msgid "Alias added." msgstr "Alias agregado." #: ../src/perlscript.c:2095 msgid "Alias modified." msgstr "Alias modificado." #: ../src/perlscript.c:2183 #, c-format msgid "" "Alias number %d\n" " Name: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Ignore case: %s\n" " Eval as Perl: %s\n" " Enabled: %s\n" msgstr "" #: ../src/perlscript.c:2263 msgid "Press a key to get its keycode." msgstr "Presione una tecla para ver su código de clave." #: ../src/perlscript.c:2315 msgid "macro: No such macro" msgstr "Macro: No existe tal macro" #: ../src/perlscript.c:2334 ../src/perlscript.c:2382 #, c-format msgid "%s: Invalid key code" msgstr "%s: Código de clave inválido" #: ../src/perlscript.c:2371 #, c-format msgid "%s: keycode given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:2427 #, c-format msgid "%s: keycode not specified, not creating" msgstr "" #: ../src/perlscript.c:2434 ../src/perlscript.c:2702 #, c-format msgid "%s: action not specified, not creating" msgstr "" #: ../src/perlscript.c:2453 msgid "Macro added." msgstr "Macro agregado." #: ../src/perlscript.c:2458 msgid "Macro modified." msgstr "Macro modificado." #: ../src/perlscript.c:2489 msgid "No such macro" msgstr "Macro no existente" #: ../src/perlscript.c:2495 #, c-format msgid "" "Macro number %d\n" " Name: %s\n" " Key Code: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" #: ../src/perlscript.c:2605 msgid "timer: No such timer" msgstr "Temporizador: Temporizador no existente" #: ../src/perlscript.c:2630 #, c-format msgid "%s: interval must be numeric" msgstr "%s: Intervalo tiene que ser numérico" #: ../src/perlscript.c:2643 #, c-format msgid "%s: count must be numeric" msgstr "%s: Contador tiene que ser numérico" #: ../src/perlscript.c:2674 #, c-format msgid "%s: interval not specified, not creating" msgstr "%s: Intervalo no especificado, no creado" #: ../src/perlscript.c:2681 #, c-format msgid "%s: cannot create timer with negative interval" msgstr "%s: No se puede crear temporizador con intervalo negativo" #: ../src/perlscript.c:2742 msgid "Timer added." msgstr "Temporizador agregado." #: ../src/perlscript.c:2747 msgid "Timer modified." msgstr "Temporizador modificado." #: ../src/perlscript.c:2777 msgid "No such timer" msgstr "Temporizador no existente" #: ../src/perlscript.c:2782 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %.3f\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" #: ../src/perlscript.c:2873 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" #: ../src/perlscript.c:2882 #, c-format msgid "%s: %s is already permanent" msgstr "" #: ../src/perlscript.c:2896 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "" #: ../src/perlscript.c:2938 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "" #: ../src/perlscript.c:2942 #, c-format msgid "%s: %s is not permanent" msgstr "" #: ../src/perlscript.c:2995 msgid "Permanent variables" msgstr "Variables permanentes" #: ../src/perlscript.c:3107 msgid "Hook defined." msgstr "Gancho definido." #: ../src/perlscript.c:3111 msgid "Hook modified." msgstr "Gancho modificado." #: ../src/perlscript.c:3217 msgid "Logging stopped." msgstr "" #: ../src/perlscript.c:3355 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "" #: ../src/perlscript.c:3398 msgid "No such plugin" msgstr "" #: ../src/perlscript.c:3403 #, c-format msgid "" "Plugin number %d\n" " Name: %s\n" " Version: %s\n" " Description: %s\n" " Author: %s\n" " Enabled: %s\n" msgstr "" #: ../src/kildclient.ui:21 msgid "Edit Timer" msgstr "Editar Temporizador" #: ../src/kildclient.ui:88 ../src/kildclient.ui:351 ../src/kildclient.ui:628 #: ../src/kildclient.ui:783 ../src/kildclient.ui:956 ../src/kildclient.ui:1173 #: ../src/dlgEditWorld.ui:240 ../src/dlgEditWorld.ui:3498 msgid "_Name:" msgstr "_Nombre:" #: ../src/kildclient.ui:100 msgid "Enter optionally a descriptive name for the timer" msgstr "" #: ../src/kildclient.ui:114 msgid "_Interval:" msgstr "_Intervalo:" #: ../src/kildclient.ui:132 msgid "Specify the interval, in seconds, between timer activations" msgstr "" #: ../src/kildclient.ui:150 msgid "seconds" msgstr "segundos" #: ../src/kildclient.ui:169 msgid "_Repeat count:" msgstr "" #: ../src/kildclient.ui:187 msgid "" "Specify how many times this timer should run before being disabled or deleted" msgstr "" #: ../src/kildclient.ui:204 msgid "(-1 to repeat indefinitely)" msgstr "" #: ../src/kildclient.ui:223 ../src/kildclient.ui:809 ../src/kildclient.ui:1021 #: ../src/kildclient.ui:1238 msgid "_Action:" msgstr "_Acción:" #: ../src/kildclient.ui:235 msgid "Enter the action to be executed whenever the timer fires" msgstr "" #: ../src/kildclient.ui:245 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "" #: ../src/kildclient.ui:249 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" #: ../src/kildclient.ui:262 ../src/kildclient.ui:457 ../src/kildclient.ui:831 #: ../src/kildclient.ui:1043 ../src/kildclient.ui:1373 msgid "_Enabled" msgstr "_Habilitado" #: ../src/kildclient.ui:266 msgid "Check to make the timer enabled; only enabled timers are run" msgstr "" #: ../src/kildclient.ui:282 ../src/kildclient.ui:477 ../src/kildclient.ui:851 #: ../src/kildclient.ui:1063 ../src/kildclient.ui:1393 msgid "Note:" msgstr "Nota:" #: ../src/kildclient.ui:295 ../src/kildclient.ui:490 ../src/kildclient.ui:864 #: ../src/kildclient.ui:1076 ../src/kildclient.ui:1406 msgid "" "This object belongs to a plugin. Changes made here will not be saved " "in the plugin." msgstr "" #: ../src/kildclient.ui:327 msgid "Edit Alias" msgstr "Editar Alias" #: ../src/kildclient.ui:363 msgid "Enter optionally a descriptive name for the alias" msgstr "" #: ../src/kildclient.ui:377 ../src/kildclient.ui:1198 msgid "_Pattern:" msgstr "_Patrón:" #: ../src/kildclient.ui:389 msgid "Enter the pattern to match against typed commands" msgstr "" #: ../src/kildclient.ui:399 ../src/kildclient.ui:1220 msgid "_Ignore case when matching" msgstr "" #: ../src/kildclient.ui:417 msgid "_Substitution:" msgstr "_Substitución:" #: ../src/kildclient.ui:430 msgid "Enter the substitution to be executed" msgstr "" #: ../src/kildclient.ui:440 msgid "E_val substitution as Perl statement" msgstr "" #: ../src/kildclient.ui:444 msgid "Check to have the substitution be executed in a s///e construction" msgstr "" #: ../src/kildclient.ui:461 msgid "Check to make the alias enabled; only enabled aliases are tried" msgstr "" #: ../src/kildclient.ui:561 msgid "Edit Character Information" msgstr "Editar Información de Caracter" #: ../src/kildclient.ui:640 msgid "Enter the character's name for automatic login" msgstr "" #: ../src/kildclient.ui:654 msgid "_Password:" msgstr "_Contraseña:" #: ../src/kildclient.ui:667 msgid "Enter the character's password for automatic login" msgstr "" #: ../src/kildclient.ui:692 msgid "Edit Hook" msgstr "Editar Gancho" #: ../src/kildclient.ui:759 msgid "Event:" msgstr "Evento:" #: ../src/kildclient.ui:795 msgid "Enter optionally a descriptive name for the hook" msgstr "" #: ../src/kildclient.ui:821 msgid "Enter the action to be run when the event happens" msgstr "" #: ../src/kildclient.ui:835 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "" #: ../src/kildclient.ui:889 msgid "Edit Macro" msgstr "Editar Macro" #: ../src/kildclient.ui:968 msgid "Enter optionally a descriptive name for the macro" msgstr "" #: ../src/kildclient.ui:982 msgid "_Key:" msgstr "_Clave:" #: ../src/kildclient.ui:994 msgid "Press the key that will be used to run the macro" msgstr "" #: ../src/kildclient.ui:1008 msgid "" "Press the key that will be used to activate the macro while the cursor is in " "the text box." msgstr "" #: ../src/kildclient.ui:1033 msgid "Enter the action to be run when the key is pressed" msgstr "" #: ../src/kildclient.ui:1047 msgid "Check to make the macro enabled; only enabled macros are run" msgstr "" #: ../src/kildclient.ui:1104 ../src/kildclient.ui:2154 msgid "Enter optionally a descriptive name for the trigger" msgstr "" #: ../src/kildclient.ui:1105 msgid "Edit Trigger" msgstr "" #: ../src/kildclient.ui:1210 msgid "Enter the pattern to match against received lines" msgstr "" #: ../src/kildclient.ui:1250 msgid "Enter the action that will be run when a match happens" msgstr "" #: ../src/kildclient.ui:1260 msgid "Omit (_gag) from output" msgstr "" #: ../src/kildclient.ui:1264 msgid "Check to make the matched line not be printed in the main output window" msgstr "" #: ../src/kildclient.ui:1277 msgid "Omit (gag) from _log file" msgstr "" #: ../src/kildclient.ui:1281 msgid "Check to make the matched line not be printed in the log file" msgstr "" #: ../src/kildclient.ui:1294 msgid "_Keep executing other triggers after this this one matches" msgstr "" #: ../src/kildclient.ui:1298 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" #: ../src/kildclient.ui:1311 msgid "_Rewriter trigger" msgstr "" #: ../src/kildclient.ui:1315 msgid "Check to make this trigger a rewriter trigger" msgstr "" #: ../src/kildclient.ui:1333 msgid "C_hange style" msgstr "C_ambiar estilo" #: ../src/kildclient.ui:1350 msgid "C_onfigure..." msgstr "C_onfigurar..." #: ../src/kildclient.ui:1377 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" #: ../src/kildclient.ui:1434 msgid "Permenent variable" msgstr "Variable Permanente" #: ../src/kildclient.ui:1497 msgid "_Name of variable to make permanent:" msgstr "" #: ../src/kildclient.ui:1511 msgid "" "Enter the name of a scalar ($), array (@) or hash (%) variable whose " "contents are to be saved between sessions of the World" msgstr "" #: ../src/kildclient.ui:1616 msgid "Permanent Variables" msgstr "" #: ../src/kildclient.ui:1631 msgid "OnConnect Hooks" msgstr "Ganchos AlConectar" #: ../src/kildclient.ui:1646 msgid "OnDisconnect Hooks" msgstr "Ganchos AlDesconectar" #: ../src/kildclient.ui:1661 msgid "OnReceivedText Hooks" msgstr "Ganchos AlRecibirTexto" #: ../src/kildclient.ui:1676 msgid "OnSentCommand Hooks" msgstr "Ganchos AlEnviarComandos" #: ../src/kildclient.ui:1691 msgid "OnGetFocus Hooks" msgstr "" #: ../src/kildclient.ui:1706 msgid "OnLoseFocus Hooks" msgstr "" #: ../src/kildclient.ui:1721 msgid "OnCloseConnected Hooks" msgstr "" #: ../src/kildclient.ui:1746 msgid "_Items to export" msgstr "_Artículos a exportar" #: ../src/kildclient.ui:1833 ../src/dlgSelectWorld.ui:114 #: ../src/dlgEditWorld.ui:707 msgid "_New" msgstr "_Nuevo" #: ../src/kildclient.ui:1847 ../src/wndmain.ui:158 #: ../src/dlgSelectWorld.ui:128 ../src/dlgEditWorld.ui:723 msgid "_Edit" msgstr "_Editar" #: ../src/kildclient.ui:1862 ../src/wndmain.ui:199 #: ../src/dlgSelectWorld.ui:142 ../src/dlgEditWorld.ui:739 msgid "_Delete" msgstr "_Borrar" #: ../src/kildclient.ui:1877 msgid "_Import" msgstr "_Importar" #: ../src/kildclient.ui:1891 msgid "E_xport" msgstr "E_xportar" #: ../src/kildclient.ui:1906 ../src/dlgEditWorld.ui:755 #: ../src/dlgEditWorld.ui:4146 msgid "_Up" msgstr "Hacia _arriba" #: ../src/kildclient.ui:1921 ../src/dlgEditWorld.ui:4162 msgid "_Down" msgstr "Hacia a_bajo" #: ../src/kildclient.ui:1975 ../src/kildclient.ui:1992 #: ../src/kildclient.ui:2012 ../src/kildclient.ui:2029 #: ../src/kildclient.ui:2094 msgid "Do not change" msgstr "No cambiar" #: ../src/kildclient.ui:1998 msgid "Single" msgstr "Simple" #: ../src/kildclient.ui:2001 msgid "Double" msgstr "Doble" #: ../src/kildclient.ui:2032 ../src/kildclient.ui:2097 #: ../src/dlgPreferences.ui:23 msgid "Black" msgstr "Negro" #: ../src/kildclient.ui:2035 ../src/kildclient.ui:2100 #: ../src/dlgPreferences.ui:26 msgid "Red" msgstr "Rojo" #: ../src/kildclient.ui:2038 ../src/kildclient.ui:2103 #: ../src/dlgPreferences.ui:29 msgid "Green" msgstr "Verde" #: ../src/kildclient.ui:2041 ../src/kildclient.ui:2106 #: ../src/dlgPreferences.ui:32 msgid "Yellow" msgstr "Amarillo" #: ../src/kildclient.ui:2044 ../src/kildclient.ui:2109 #: ../src/dlgPreferences.ui:35 msgid "Blue" msgstr "Azul" #: ../src/kildclient.ui:2047 ../src/kildclient.ui:2112 #: ../src/dlgPreferences.ui:38 msgid "Magenta" msgstr "Magenta" #: ../src/kildclient.ui:2050 ../src/kildclient.ui:2115 #: ../src/dlgPreferences.ui:41 msgid "Cyan" msgstr "Cyan" #: ../src/kildclient.ui:2053 ../src/kildclient.ui:2118 #: ../src/dlgPreferences.ui:44 msgid "White" msgstr "Blanco" #: ../src/kildclient.ui:2056 ../src/kildclient.ui:2121 #: ../src/dlgPreferences.ui:47 msgid "Default" msgstr "" #: ../src/kildclient.ui:2059 ../src/kildclient.ui:2124 #: ../src/dlgPreferences.ui:50 msgid "Black (bold)" msgstr "Negro (negrita)" #: ../src/kildclient.ui:2062 ../src/kildclient.ui:2127 #: ../src/dlgPreferences.ui:53 msgid "Red (bold)" msgstr "Rojo (negrita)" #: ../src/kildclient.ui:2065 ../src/kildclient.ui:2130 #: ../src/dlgPreferences.ui:56 msgid "Green (bold)" msgstr "Verde (negrita)" #: ../src/kildclient.ui:2068 ../src/kildclient.ui:2133 #: ../src/dlgPreferences.ui:59 msgid "Yellow (bold)" msgstr "Amarillo (negrita)" #: ../src/kildclient.ui:2071 ../src/kildclient.ui:2136 #: ../src/dlgPreferences.ui:62 msgid "Blue (bold)" msgstr "Azul (negrita)" #: ../src/kildclient.ui:2074 ../src/kildclient.ui:2139 #: ../src/dlgPreferences.ui:65 msgid "Magenta (bold)" msgstr "Magenta (negrita)" #: ../src/kildclient.ui:2077 ../src/kildclient.ui:2142 #: ../src/dlgPreferences.ui:68 msgid "Cyan (bold)" msgstr "Cyan (negrita)" #: ../src/kildclient.ui:2080 ../src/kildclient.ui:2145 #: ../src/dlgPreferences.ui:71 msgid "White (bold)" msgstr "Blanco (negrita)" #: ../src/kildclient.ui:2083 ../src/kildclient.ui:2148 #: ../src/dlgPreferences.ui:74 msgid "Default (bold)" msgstr "" #: ../src/kildclient.ui:2155 msgid "Change Style" msgstr "Cambiar Estilo" #: ../src/kildclient.ui:2221 msgid "_Apply to:" msgstr "_Aplicar a:" #: ../src/kildclient.ui:2234 msgid "_Foreground:" msgstr "_Adelante:" #: ../src/kildclient.ui:2264 msgid "_Background:" msgstr "_Fondo:" #: ../src/kildclient.ui:2294 msgid "_Italic:" msgstr "_Itálica:" #: ../src/kildclient.ui:2324 msgid "_Striked-thru:" msgstr "" #: ../src/kildclient.ui:2354 msgid "_Underline:" msgstr "_Subrayar:" #: ../src/kildclient.ui:2386 msgid "The whole line" msgstr "Toda la línea" #: ../src/kildclient.ui:2402 msgid "The whole matched text" msgstr "" #: ../src/kildclient.ui:2424 msgid "The matched substring number" msgstr "" #: ../src/wndmain.ui:24 msgid "_World" msgstr "_Mundo" #: ../src/wndmain.ui:35 msgid "_Open..." msgstr "_Abrir..." #: ../src/wndmain.ui:45 msgid "_Reconnect" msgstr "_Reconectar" #: ../src/wndmain.ui:54 msgid "_Disconnect" msgstr "_Desconectar" #: ../src/wndmain.ui:63 msgid "Connect to _Another..." msgstr "Conectar a _otro..." #: ../src/wndmain.ui:87 msgid "_Edit..." msgstr "_Editar..." #: ../src/wndmain.ui:106 msgid "S_tatistics..." msgstr "_Estadísticas..." #: ../src/wndmain.ui:121 ../src/wndmain.ui:257 msgid "_Previous" msgstr "_Anterior" #: ../src/wndmain.ui:130 ../src/wndmain.ui:267 msgid "_Next" msgstr "_Siguiente" #: ../src/wndmain.ui:169 msgid "Cu_t" msgstr "Cor_tar" #: ../src/wndmain.ui:179 msgid "_Copy" msgstr "_Copiar" #: ../src/wndmain.ui:189 msgid "_Paste" msgstr "_Pegar" #: ../src/wndmain.ui:214 ../src/dlgCmdHistory.ui:69 msgid "_Find" msgstr "_Encontrar" #: ../src/wndmain.ui:224 ../src/wndmain.ui:287 msgid "Find N_ext" msgstr "Encontrar si_guiente" #: ../src/wndmain.ui:238 msgid "_Input" msgstr "_Ingreso" #: ../src/wndmain.ui:248 ../src/dlgEditWorld.ui:3850 ../src/dlgMLSend.ui:147 msgid "_Clear" msgstr "_Limpiar" #: ../src/wndmain.ui:277 msgid "Find P_revious" msgstr "Encontrar _anterior" #: ../src/wndmain.ui:297 msgid "Command _History..." msgstr "_Historial de comandos..." #: ../src/wndmain.ui:313 msgid "_Multi-line Send..." msgstr "_Enviar varias líneas..." #: ../src/wndmain.ui:329 msgid "_Test Triggers..." msgstr "" #: ../src/wndmain.ui:342 msgid "_Preferences" msgstr "_Preferencias" #: ../src/wndmain.ui:353 msgid "Disable _Triggers" msgstr "Deshabilitar _triggers" #: ../src/wndmain.ui:363 msgid "Disable _Aliases" msgstr "Deshabilitar _aliases" #: ../src/wndmain.ui:373 msgid "Disable _Macros" msgstr "Deshabilitar _macros" #: ../src/wndmain.ui:383 msgid "Disable T_imers" msgstr "Deshabilitar t_emporizadores" #: ../src/wndmain.ui:399 msgid "_Debug Matches" msgstr "" #: ../src/wndmain.ui:414 msgid "_Preferences..." msgstr "_Preferencias..." #: ../src/wndmain.ui:423 msgid "Edit Default _World..." msgstr "" #: ../src/wndmain.ui:436 msgid "_Display" msgstr "" #: ../src/wndmain.ui:447 msgid "_Split Window" msgstr "" #: ../src/wndmain.ui:461 ../src/dlgEditWorld.ui:3998 msgid "_Help" msgstr "_Ayuda" #: ../src/wndmain.ui:471 msgid "_Manual" msgstr "_Manual" #: ../src/wndmain.ui:481 msgid "_About" msgstr "_Acerca de" #: ../src/dlgSelectWorld.ui:8 msgid "Connect to" msgstr "Conectar a" #: ../src/dlgSelectWorld.ui:39 msgid "C_onnect" msgstr "C_onectar" #: ../src/dlgSelectWorld.ui:62 msgid "_Select a saved world:" msgstr "_Seleccionar un mundo guardado:" #: ../src/dlgSelectWorld.ui:176 msgid "Or connect d_irectly:" msgstr "O conectar d_irectamente:" #: ../src/dlgSelectWorld.ui:204 ../src/dlgEditWorld.ui:254 msgid "_Host:" msgstr "" #: ../src/dlgSelectWorld.ui:218 ../src/dlgEditWorld.ui:268 msgid "_Port:" msgstr "_Puerto:" #: ../src/dlgPreferences.ui:85 ../src/dlgEditWorld.ui:82 msgid "No proxy" msgstr "Sin proxy" #: ../src/dlgPreferences.ui:88 ../src/dlgEditWorld.ui:85 msgid "SOCKS4" msgstr "SOCKS4" #: ../src/dlgPreferences.ui:91 ../src/dlgEditWorld.ui:88 msgid "SOCKS5" msgstr "SOCKS5" #: ../src/dlgPreferences.ui:94 ../src/dlgEditWorld.ui:91 msgid "HTTP" msgstr "HTTP" #: ../src/dlgPreferences.ui:105 msgid "Left" msgstr "Izquierda" #: ../src/dlgPreferences.ui:108 msgid "Right" msgstr "Derecha" #: ../src/dlgPreferences.ui:111 msgid "Top" msgstr "" #: ../src/dlgPreferences.ui:114 msgid "Bottom" msgstr "" #: ../src/dlgPreferences.ui:120 msgid "Preferences" msgstr "Preferencias" #: ../src/dlgPreferences.ui:180 msgid "Colors used by KildClient" msgstr "Colores usados por KildClient" #: ../src/dlgPreferences.ui:216 msgid "_Informative messages:" msgstr "Mensajes _informativos:" #: ../src/dlgPreferences.ui:248 msgid "_Command echo:" msgstr "" #: ../src/dlgPreferences.ui:308 msgid "Window configuration" msgstr "Configuración de Ventana" #: ../src/dlgPreferences.ui:344 msgid "_Tab position:" msgstr "" #: ../src/dlgPreferences.ui:374 msgid "_Hide tabs if only one world is open" msgstr "" #: ../src/dlgPreferences.ui:379 msgid "" "If this is checked, when there is only one open world no tabs will be shown" msgstr "" #: ../src/dlgPreferences.ui:393 msgid "_Flash window when new text is received" msgstr "" #: ../src/dlgPreferences.ui:435 msgid "Appearance" msgstr "Apariencia" #: ../src/dlgPreferences.ui:459 msgid "Sending Delays" msgstr "Enviando Demoras" #: ../src/dlgPreferences.ui:495 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "" #: ../src/dlgPreferences.ui:512 msgid "_Number of lines/commands to send at once:" msgstr "" #: ../src/dlgPreferences.ui:553 msgid "_Delay between each group of lines/commands:" msgstr "" #: ../src/dlgPreferences.ui:616 msgid "Sending" msgstr "Enviando" #: ../src/dlgPreferences.ui:641 msgid "Web Browser" msgstr "Navegador" #: ../src/dlgPreferences.ui:677 msgid "Specify the command used to launch a web browser" msgstr "" #: ../src/dlgPreferences.ui:692 msgid "" "Enter the command to run a web browser. %s will be substituted by the web " "page address." msgstr "" #: ../src/dlgPreferences.ui:734 msgid "Audio Player" msgstr "" #: ../src/dlgPreferences.ui:770 msgid "Specify the command used to play sound files." msgstr "" #: ../src/dlgPreferences.ui:785 msgid "" "Enter the command to run an audio player program. %s will be substituted by " "the file path." msgstr "" #: ../src/dlgPreferences.ui:824 msgid "External Programs" msgstr "Programas Externos" #: ../src/dlgPreferences.ui:850 ../src/dlgEditWorld.ui:370 msgid "Proxy" msgstr "Proxy" #: ../src/dlgPreferences.ui:890 ../src/dlgEditWorld.ui:410 msgid "Proxy _type:" msgstr "_Tipo de proxy:" #: ../src/dlgPreferences.ui:936 ../src/dlgEditWorld.ui:456 msgid "Server _address:" msgstr "_Dirección de servidor:" #: ../src/dlgPreferences.ui:949 ../src/dlgEditWorld.ui:515 msgid "_Username:" msgstr "_Nombre de usuario:" #: ../src/dlgPreferences.ui:984 ../src/dlgEditWorld.ui:480 msgid "Server _port:" msgstr "_Puerto de servidor:" #: ../src/dlgPreferences.ui:997 ../src/dlgEditWorld.ui:528 msgid "Pass_word:" msgstr "Contra_seña:" #: ../src/dlgPreferences.ui:1065 msgid "Proxy" msgstr "Proxy" #: ../src/dlgStatistics.ui:8 msgid "Statistics" msgstr "Estadísticas" #: ../src/dlgStatistics.ui:56 ../src/dlgStatistics.ui:68 #: ../src/dlgStatistics.ui:223 ../src/dlgStatistics.ui:349 #: ../src/dlgStatistics.ui:467 ../src/dlgStatistics.ui:479 #: ../src/dlgStatistics.ui:491 ../src/dlgStatistics.ui:503 #: ../src/dlgStatistics.ui:515 ../src/dlgStatistics.ui:539 #: ../src/dlgStatistics.ui:575 ../src/dlgStatistics.ui:587 #: ../src/dlgStatistics.ui:611 ../src/dlgStatistics.ui:647 #: ../src/dlgStatistics.ui:659 msgid "N/A" msgstr "N/A" #: ../src/dlgStatistics.ui:80 msgid "Proxy port:" msgstr "Puerto de proxy:" #: ../src/dlgStatistics.ui:92 msgid "Proxy host:" msgstr "" #: ../src/dlgStatistics.ui:116 msgid "Proxy type:" msgstr "Tipo de proxy:" #: ../src/dlgStatistics.ui:128 msgid "World name:" msgstr "Nombre del mundo:" #: ../src/dlgStatistics.ui:140 msgid "Host:" msgstr "" #: ../src/dlgStatistics.ui:152 msgid "Port:" msgstr "Puerto:" #: ../src/dlgStatistics.ui:164 msgid "Connection time:" msgstr "Tiempo de conexión:" #: ../src/dlgStatistics.ui:176 msgid "Idle time:" msgstr "Tiempo inactivo(a):" #: ../src/dlgStatistics.ui:199 msgid "Compression used:" msgstr "Compresión usada:" #: ../src/dlgStatistics.ui:211 msgid "Bytes received (compressed):" msgstr "" #: ../src/dlgStatistics.ui:235 msgid "Bytes received (decompressed):" msgstr "" #: ../src/dlgStatistics.ui:247 msgid "Compression ratio:" msgstr "Rata de compresión:" #: ../src/dlgStatistics.ui:259 msgid "Lines received:" msgstr "Líneas recibidas:" #: ../src/dlgStatistics.ui:383 msgid "Key exchange:" msgstr "Clave intercambiada:" #: ../src/dlgStatistics.ui:395 msgid "SSL protocol used:" msgstr "Protocolo SSL usado:" #: ../src/dlgStatistics.ui:407 msgid "Compression algorithm:" msgstr "Algoritmo de compresión:" #: ../src/dlgStatistics.ui:419 msgid "Certificate type:" msgstr "Tipo de certificado:" #: ../src/dlgStatistics.ui:431 msgid "Cipher:" msgstr "Cifrado:" #: ../src/dlgStatistics.ui:443 msgid "MAC:" msgstr "MAC:" #: ../src/dlgStatistics.ui:455 msgid "SSL not supported in this version" msgstr "" #: ../src/dlgStatistics.ui:527 msgid "Hostname:" msgstr "" #: ../src/dlgStatistics.ui:551 msgid "Valid since:" msgstr "Válido(a) desde:" #: ../src/dlgStatistics.ui:563 msgid "Expiration:" msgstr "Expiración:" #: ../src/dlgStatistics.ui:599 msgid "Fingerprint:" msgstr "" #: ../src/dlgStatistics.ui:623 msgid "Subject's DN:" msgstr "" #: ../src/dlgStatistics.ui:635 msgid "Issuer's DN:" msgstr "" #: ../src/dlgAbout.ui:12 msgid "A mud client with powerful features and support for Perl Scripting" msgstr "" "Un cliente de MUD con poderosas cualidades y soporte para Scripting de Perl" #: ../src/dlgAbout.ui:14 msgid "Visit http://www.kildclient.org" msgstr "Visítenos: http://www.kildclient.org" #: ../src/dlgEditWorld.ui:62 msgid "No auto-login" msgstr "" #: ../src/dlgEditWorld.ui:79 msgid "Use global settings" msgstr "" #: ../src/dlgEditWorld.ui:98 msgid "Edit World" msgstr "Editar Mundo" #: ../src/dlgEditWorld.ui:203 msgid "Connection" msgstr "Conexión" #: ../src/dlgEditWorld.ui:281 msgid "Enter a descriptive name for the World" msgstr "Ingresar un nombre descriptivo para el Mundo" #: ../src/dlgEditWorld.ui:295 msgid "Enter the host to connect to" msgstr "" #: ../src/dlgEditWorld.ui:309 msgid "Enter the port used when connecting" msgstr "Ingresar el puerto usado al conectar" #: ../src/dlgEditWorld.ui:321 msgid "Use _SSL" msgstr "Usar _SSL" #: ../src/dlgEditWorld.ui:587 msgid "Auto-login" msgstr "" #: ../src/dlgEditWorld.ui:628 msgid "Connection _style:" msgstr "_Estilo de conexión:" #: ../src/dlgEditWorld.ui:668 msgid "Ch_aracters in this mud:" msgstr "C_aracteres en este MUD:" #: ../src/dlgEditWorld.ui:771 msgid "D_elete" msgstr "_Borrar" #: ../src/dlgEditWorld.ui:842 ../src/dlgEditWorld.ui:2048 #: ../src/dlgEditWorld.ui:2992 msgid "Font" msgstr "Fuente" #: ../src/dlgEditWorld.ui:879 msgid "Select the font used in the _main screen:" msgstr "" #: ../src/dlgEditWorld.ui:895 msgid "Select the font used in the main output screen" msgstr "" #: ../src/dlgEditWorld.ui:907 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "" #: ../src/dlgEditWorld.ui:912 msgid "" "Check if you want the highlighted ANSI colors to be displayed in bold also" msgstr "" #: ../src/dlgEditWorld.ui:956 msgid "Word Wrap" msgstr "" #: ../src/dlgEditWorld.ui:989 msgid "_Wrap lines at word boundaries" msgstr "" #: ../src/dlgEditWorld.ui:994 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "" #: ../src/dlgEditWorld.ui:1016 msgid "_Indent wrapped lines by" msgstr "" #: ../src/dlgEditWorld.ui:1046 msgid "pixels" msgstr "pixeles" #: ../src/dlgEditWorld.ui:1064 msgid "Wrap lines at full _screen width" msgstr "" #: ../src/dlgEditWorld.ui:1087 msgid "Maximum line width in _characters:" msgstr "" #: ../src/dlgEditWorld.ui:1157 msgid "Tooltips" msgstr "" #: ../src/dlgEditWorld.ui:1191 msgid "Display _tooltips with the time when the line was received" msgstr "" #: ../src/dlgEditWorld.ui:1196 msgid "" "Check if you want tooltips to be displayed showing the time when a line was " "received if you leave the mouse over the line for a short while" msgstr "" #: ../src/dlgEditWorld.ui:1262 msgid "Ansi Colors" msgstr "Colores Ansi" #: ../src/dlgEditWorld.ui:1395 msgid "_Black" msgstr "_Negro" #: ../src/dlgEditWorld.ui:1409 msgid "R_ed" msgstr "R_ojo" #: ../src/dlgEditWorld.ui:1423 msgid "_Green" msgstr "_Verde" #: ../src/dlgEditWorld.ui:1437 msgid "_Yellow" msgstr "_Amarillo" #: ../src/dlgEditWorld.ui:1451 msgid "B_lue" msgstr "A_zul" #: ../src/dlgEditWorld.ui:1465 msgid "_Magenta" msgstr "_Magenta" #: ../src/dlgEditWorld.ui:1479 msgid "_Cyan" msgstr "Cyan" #: ../src/dlgEditWorld.ui:1493 msgid "_White" msgstr "_Blanco" #: ../src/dlgEditWorld.ui:1507 msgid "Bl_ack (bold)" msgstr "Negro (negrita)" #: ../src/dlgEditWorld.ui:1520 msgid "Re_d (bold)" msgstr "Rojo (negrita)" #: ../src/dlgEditWorld.ui:1533 msgid "G_reen (bold)" msgstr "Verde (negrita)" #: ../src/dlgEditWorld.ui:1546 msgid "Yell_ow (bold)" msgstr "Amarillo (negrita)" #: ../src/dlgEditWorld.ui:1559 msgid "Bl_ue (bold)" msgstr "Azul (negrita)" #: ../src/dlgEditWorld.ui:1572 msgid "Magen_ta (bold)" msgstr "Magenta (negrita)" #: ../src/dlgEditWorld.ui:1585 msgid "Cya_n (bold)" msgstr "Cyan (negrita)" #: ../src/dlgEditWorld.ui:1598 msgid "W_hite (bold)" msgstr "Blanco (negrita)" #: ../src/dlgEditWorld.ui:1767 msgid "Default Colors" msgstr "Colores por Defecto" #: ../src/dlgEditWorld.ui:1828 msgid "_Foreground" msgstr "Adelante" #: ../src/dlgEditWorld.ui:1841 msgid "Bold foreground" msgstr "Adelante negrita" #: ../src/dlgEditWorld.ui:1866 msgid "Bac_kground" msgstr "Fondo" #: ../src/dlgEditWorld.ui:1891 msgid "Bold background" msgstr "Fondo negrita" #: ../src/dlgEditWorld.ui:1945 msgid "Revert to default colors" msgstr "" #: ../src/dlgEditWorld.ui:1979 msgid "Re_vert to default colors" msgstr "Re_vertir a colores por defecto" #: ../src/dlgEditWorld.ui:1984 msgid "Click to revert all colors to their built-in defaults" msgstr "" #: ../src/dlgEditWorld.ui:2085 msgid "Select the font used in the _status bar:" msgstr "" #: ../src/dlgEditWorld.ui:2101 msgid "Select the font used in the status bar" msgstr "" #: ../src/dlgEditWorld.ui:2143 msgid "Time Display" msgstr "" #: ../src/dlgEditWorld.ui:2179 msgid "C_onnected time:" msgstr "T_iempo conectado(a):" #: ../src/dlgEditWorld.ui:2213 ../src/dlgEditWorld.ui:2323 msgid "Do not display" msgstr "" #: ../src/dlgEditWorld.ui:2218 msgid "Select if you do not want the connection time to be displayed" msgstr "" #: ../src/dlgEditWorld.ui:2233 ../src/dlgEditWorld.ui:2343 msgid "Display as hours, minutes and seconds" msgstr "" #: ../src/dlgEditWorld.ui:2238 msgid "" "Select if you want the connection time to be displayed in hours, minutes and " "seconds" msgstr "" #: ../src/dlgEditWorld.ui:2253 ../src/dlgEditWorld.ui:2363 msgid "Display as seconds" msgstr "Mostrar como segundos" #: ../src/dlgEditWorld.ui:2258 msgid "Select if you want the connection time to be displayed in seconds" msgstr "" #: ../src/dlgEditWorld.ui:2290 msgid "_Idle time:" msgstr "_Tiempo inactivo(a):" #: ../src/dlgEditWorld.ui:2328 msgid "Select if you do not want the idle time to be displayed" msgstr "" #: ../src/dlgEditWorld.ui:2348 msgid "" "Select if you want the idle time to be displayed in hours, minutes and " "seconds" msgstr "" #: ../src/dlgEditWorld.ui:2368 msgid "Select if you want the idle time to be displayed in seconds" msgstr "" #: ../src/dlgEditWorld.ui:2383 msgid "Only _reset idle time counter when a command is entered directly" msgstr "" #: ../src/dlgEditWorld.ui:2388 msgid "" "Check to make the idle time counter reset only when a command is entered " "directly by typing it in the command entry box. If not checked, if a command " "is sent because of a timer, of a hook, etc, the idle timer is also reset." msgstr "" #: ../src/dlgEditWorld.ui:2468 msgid "Command Entry" msgstr "" #: ../src/dlgEditWorld.ui:2501 msgid "_Keep last typed command in command entry box" msgstr "_Mantener último comando tipeado en la caja de entrada de comandos" #: ../src/dlgEditWorld.ui:2506 msgid "" "Check to have the last command kept in the command entry box, so that you " "can repeat commands only by pressing ENTER" msgstr "" "Seleccionar para mantener el último comando usado en la caja de ingreso de " "comandos, para que pueda repetirse comandos presionando la tecla Intro " "únicamente" #: ../src/dlgEditWorld.ui:2519 msgid "_Echo sent commands in main window" msgstr "Enviar _eco de comandos enviados en la pantalla principal" #: ../src/dlgEditWorld.ui:2524 msgid "Check to have the sent commands echoed in the main output window" msgstr "" #: ../src/dlgEditWorld.ui:2537 msgid "_Store commands between sessions" msgstr "_Guardar comandos entre sesiones" #: ../src/dlgEditWorld.ui:2542 msgid "Check to have the command history saved in a file between sessions" msgstr "" #: ../src/dlgEditWorld.ui:2555 msgid "Never _hide the typed text" msgstr "Nunca _ocultar texto tipeado" #: ../src/dlgEditWorld.ui:2560 msgid "" "Check this if the text you type is displayed as black dots in the input box." msgstr "" #: ../src/dlgEditWorld.ui:2581 msgid "_Number of commands to save in history:" msgstr "_Número de comandos a guardar en historial:" #: ../src/dlgEditWorld.ui:2595 msgid "Specify the number of commands that are saved and can be later recalled" msgstr "" "Especificar el número de comandos a ser guardados para ser usados " "posteriormente" #: ../src/dlgEditWorld.ui:2622 msgid "C_ommand separator:" msgstr "S_eparador de comandos:" #: ../src/dlgEditWorld.ui:2636 msgid "Specify the separator for commands typed in the command entry box" msgstr "" "Especificar el separador de comandos tipeados en la caja de entrada de " "comandos" #: ../src/dlgEditWorld.ui:2657 msgid "Use single-_line input bar" msgstr "Usar barra de ingreso _simple" #: ../src/dlgEditWorld.ui:2697 msgid "Enable _auto-completion" msgstr "Habilitar auto-completado" #: ../src/dlgEditWorld.ui:2702 msgid "Check to enable command auto-completion (based on previous commands)" msgstr "" "Seleccionar para habilitar auto-completado de comandos (basado en comandos " "previos)" #: ../src/dlgEditWorld.ui:2723 msgid "Acti_vate auto-completion only after" msgstr "Acti_var completado automático sólo luego de" #: ../src/dlgEditWorld.ui:2737 msgid "" "Specify the number of characters that must be typed for command completion " "to start" msgstr "" "Especificar el número de caracteres que deben ser tipeados para iniciar " "completado de comando" #: ../src/dlgEditWorld.ui:2752 msgid "characters have been entered" msgstr "caracteres han sido ingresados" #: ../src/dlgEditWorld.ui:2783 msgid "Use _multi-line input bar" msgstr "Usar barra de ingreso _múltiple" #: ../src/dlgEditWorld.ui:2830 msgid "N_umber of lines:" msgstr "Nú_mero de líneas:" #: ../src/dlgEditWorld.ui:2868 msgid "S_pell check typed text" msgstr "Re_visar ortografía del texto tipeado" #: ../src/dlgEditWorld.ui:2905 msgid "Language code:" msgstr "Código de idioma:" #: ../src/dlgEditWorld.ui:2931 msgid "(Leave blank for default based on locale)" msgstr "(Dejar en blanco para locales basados por defecto)" #: ../src/dlgEditWorld.ui:3029 msgid "Select the font used in the command _entry box:" msgstr "Seleccionar la fuente usada en la _caja de entrada de comandos" #: ../src/dlgEditWorld.ui:3045 msgid "Select the font used in the command entry box" msgstr "Seleccionar la fuente usada en la caja de entrada de comandos" #: ../src/dlgEditWorld.ui:3087 msgid "Flood prevention" msgstr "Prevención de inundación" #: ../src/dlgEditWorld.ui:3126 msgid "Do not allow the _same command to be sent" msgstr "No permitir el envío del _mismo comando" #: ../src/dlgEditWorld.ui:3131 msgid "" "Check to prevent more than a given number of equal commands to be sent in a " "row (which can disconnect your character in some muds)" msgstr "" #: ../src/dlgEditWorld.ui:3147 msgid "Specify the maximum number of equal commands that can be sent in a row" msgstr "" "Especificar el número máximo de comandos iguales que pueden ser enviados en " "una fila" #: ../src/dlgEditWorld.ui:3162 msgid "_times in a row" msgstr "_veces seguidas" #: ../src/dlgEditWorld.ui:3188 msgid "Se_nd this command:" msgstr "En_viar este comando:" #: ../src/dlgEditWorld.ui:3202 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" #: ../src/dlgEditWorld.ui:3273 msgid "Logging Status" msgstr "" #: ../src/dlgEditWorld.ui:3326 msgid "St_art" msgstr "In_icio" #: ../src/dlgEditWorld.ui:3342 msgid "_Stop" msgstr "" #: ../src/dlgEditWorld.ui:3373 msgid "_Include the last" msgstr "_Incluir el último" #: ../src/dlgEditWorld.ui:3378 msgid "Select to include lines from the main window in the log file." msgstr "" "Seleccionar para incluir líneas de la pantalla principal en el archivo de " "log." #: ../src/dlgEditWorld.ui:3393 msgid "Inform number of lines to include in the log." msgstr "Informar número de líneas a incluir en el log." #: ../src/dlgEditWorld.ui:3409 msgid "lines of the scrollback buffer in the log" msgstr "" #: ../src/dlgEditWorld.ui:3456 ../src/dlgEditWorld.ui:4687 msgid "File" msgstr "Archivo" #: ../src/dlgEditWorld.ui:3548 msgid "" "Note: You can use strftime() escapes to create different files based on the " "date and time that logging starts. Also, %Kw represents the World name and " "%Kc the character name used in auto-logon." msgstr "" #: ../src/dlgEditWorld.ui:3590 msgid "Options" msgstr "Opciones" #: ../src/dlgEditWorld.ui:3623 msgid "A_utomatically start logging when connected" msgstr "Iniciar guardado de log a_utomáticamente al conectarse" #: ../src/dlgEditWorld.ui:3629 msgid "" "If this is selected, logging will be automatically started whenever you " "connect to the world." msgstr "" "Si está seleccionado, se creará un log automáticamente al conectarse al " "mundo." #: ../src/dlgEditWorld.ui:3642 msgid "Prefix lines with _date and/or time" msgstr "" #: ../src/dlgEditWorld.ui:3648 msgid "" "Select this if you want to prefix each line in the log file with the date " "and/or time it was received." msgstr "" #: ../src/dlgEditWorld.ui:3682 msgid "_Format:" msgstr "_Formato:" #: ../src/dlgEditWorld.ui:3696 msgid "" "The default is to prefix lines with the date and time, but you can configure " "the format with strftime() escape sequences. See the manual for a " "description of those." msgstr "" #: ../src/dlgEditWorld.ui:3707 msgid "Revert to _default" msgstr "Revertir a por _defecto" #: ../src/dlgEditWorld.ui:3783 msgid "Scripting" msgstr "" #: ../src/dlgEditWorld.ui:3824 msgid "_Perl file to load:" msgstr "Archivo _Perl a cargar:" #: ../src/dlgEditWorld.ui:3924 msgid "Plugins Currently Loaded" msgstr "Complementos Cargados Actualmente" #: ../src/dlgEditWorld.ui:3982 msgid "_Load" msgstr "_Cargar" #: ../src/dlgEditWorld.ui:4052 msgid "Plugins Loaded on Startup" msgstr "Complementos Cargados al Inicio" #: ../src/dlgEditWorld.ui:4114 msgid "_Add" msgstr "" #: ../src/dlgEditWorld.ui:4130 msgid "_Remove" msgstr "" #: ../src/dlgEditWorld.ui:4238 msgid "MCCP (for compression)" msgstr "MCCP (para compresión)" #: ../src/dlgEditWorld.ui:4271 msgid "_Enable if server proposes after connecting" msgstr "_Habilitar si el servidor propone luego de conectarse" #: ../src/dlgEditWorld.ui:4288 msgid "Enable if server proposes at _any time" msgstr "Habilitar si el servidor propone en _cualquier momento" #: ../src/dlgEditWorld.ui:4305 msgid "_Disable" msgstr "_Deshabilitar" #: ../src/dlgEditWorld.ui:4374 msgid "Scrolling" msgstr "" #: ../src/dlgEditWorld.ui:4408 msgid "Scroll on _output" msgstr "" #: ../src/dlgEditWorld.ui:4413 msgid "" "Check to have the main window scroll to the end whenever new output comes" msgstr "" #: ../src/dlgEditWorld.ui:4434 msgid "_Lines to save in scrollback buffer:" msgstr "" #: ../src/dlgEditWorld.ui:4448 msgid "" "Specify the number of lines of output that can be seen with by scrolling the " "window" msgstr "" #: ../src/dlgEditWorld.ui:4498 msgid "Name display" msgstr "" #: ../src/dlgEditWorld.ui:4531 msgid "Identify as 'World name'" msgstr "" #: ../src/dlgEditWorld.ui:4547 msgid "Identify as 'World name - Character'" msgstr "" #: ../src/dlgEditWorld.ui:4563 msgid "Identify as 'Character - World name'" msgstr "" #: ../src/dlgEditWorld.ui:4584 msgid "Custom: " msgstr "" #: ../src/dlgEditWorld.ui:4622 msgid "" "Use %Kw to represent the World's name, and %Kc to represent the auto-logon " "character name" msgstr "" "Usar %Kw para representar el nombre dle Mundo, y %Kc para representar el " "nombre del caracter a ser conectado automáticamente" #: ../src/dlgEditWorld.ui:4726 msgid "_File:" msgstr "_Archivo:" #: ../src/dlgEditWorld.ui:4763 msgid "" "You can leave this field blank, and a file name will be automatically " "generated. Only edit this field if you know what you are doing." msgstr "" "Puede dejar este campo en blanco y se generará un nombre de archivo " "automáticamente. Sólo editar este campo si sabe lo que está haciendo." #: ../src/dlgEditWorld.ui:4805 msgid "Character Set" msgstr "Juego de Caracteres" #: ../src/dlgEditWorld.ui:4838 msgid "Character _set:" msgstr "_Juego de caracteres:" #: ../src/dlgEditWorld.ui:4892 msgid "Graphical Editors" msgstr "Editores Gráficos" #: ../src/dlgEditWorld.ui:4925 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "_Confirmar antes de eliminar gatillos, aliases, etc." #: ../src/dlgEditWorld.ui:4930 ../src/dlgEditWorld.ui:5031 msgid "" "If not checked, objects such as triggers, aliases, etc. will be deleted " "directly without asking for confirmation when you press the Delete button." msgstr "" "Si no está seleccionado, los objetos como los gatillos, aliases, etc. serán " "eliminados directamente sin pedir confirmación al presionar el botón " "Eliminar (Delete)." #: ../src/dlgEditWorld.ui:4944 msgid "_Show items defined by plugins" msgstr "_Mostrar objetos definidos en los complementos" #: ../src/dlgEditWorld.ui:4949 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" "Si está seleccionado, los gatillos, aliases, macros y temporizadores " "definidos en los complementos aparecerán en las secciones de Editor de " "Mundos." #: ../src/dlgEditWorld.ui:4993 msgid "TCP Keep Alive" msgstr "TCP Para Mantener Vivo" #: ../src/dlgEditWorld.ui:5026 msgid "Enable TCP _Keep Alive packets" msgstr "Habilitar paquetes de TCP para _Mantener Vivo" #: ../src/dlgEditWorld.ui:5047 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "" "(Deberá volver a conectarse para que los cambios en esta configuración " "surtan efecto)" #: ../src/dlgEditWorld.ui:5087 msgid "Input" msgstr "Ingreso" #: ../src/dlgEditWorld.ui:5120 msgid "_Disable up and down arrow keys for history navigation" msgstr "" "_Deshabilitar las teclas de arriba y abajo para navegación del historial" #: ../src/dlgEditWorld.ui:5125 msgid "" "If checked, the up and down arrow keys are not used for navigating between " "saved commands. (You'll have to use Alt+up and Alt+down.)" msgstr "" "Si está seleccionada, las teclas de cursor para arriba y para abajo no son " "usadas para navegar entre los comandos guardados. (Deberá usar Alt+Arriba y " "Alt+Abajo.)" #: ../src/dlgTestTriggers.ui:57 msgid "Enter _line to be matched against the triggers:" msgstr "Ingresar _línea a ser comparada con los gatillos:" #: ../src/dlgTestTriggers.ui:75 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" "El texto ingresado aquí será comparado con los gatillos como si fuese una " "línea de comando del MUD" #: ../src/dlgTestTriggers.ui:86 ../src/dlgMLSend.ui:52 #: ../src/dlgCmdHistory.ui:161 msgid "_Send" msgstr "_Enviar" #: ../src/dlgTestTriggers.ui:91 msgid "Click the run the triggers against the line." msgstr "Dar clic para ejecutar los gatillos en la línea." #: ../src/dlgTestTriggers.ui:129 msgid "Number of triggers that matched:" msgstr "Número de gatillos encontrados:" #: ../src/dlgTestTriggers.ui:160 msgid "Commands that would be sent:" msgstr "Comandos que sería enviados:" #: ../src/dlgTestTriggers.ui:193 msgid "This is what would be printed in the main screen:" msgstr "Esto es lo que aparecería en la pantalla principal:" #: ../src/dlgTestTriggers.ui:205 msgid "" "This is what would be printed in the main screen. If empty, the line has " "been gaged. It can be different from the original line because of rewriter " "triggers." msgstr "" "Esto es lo que aparecería en la pantalla principal. Si está vacío, la línea " "ha sido cortada. Puede ser diferente de la línea original debido a gatillos " "de re-escritura." #: ../src/dlgTestTriggers.ui:223 msgid "Would this line be included in the log file?" msgstr "¿Esta línea será incluída en el archivo de log?" #: ../src/dlgMLSend.ui:20 msgid "Multi-line send" msgstr "Envío de líneas múltiples" #: ../src/dlgMLSend.ui:82 msgid "Send this text _initially:" msgstr "Enviar este texto _inicialmente:" #: ../src/dlgMLSend.ui:102 ../src/dlgMLSend.ui:193 msgid "Enter some text to be sent to the World" msgstr "Ingresar texto a ser enviado al Mundo" #: ../src/dlgMLSend.ui:118 msgid "Then send the _contents of this file:" msgstr "Luego enviar el _contenido de este archivo:" #: ../src/dlgMLSend.ui:173 msgid "_Finally, send this text:" msgstr "_Finalmente, enviar este texto:" #: ../src/dlgMLSend.ui:220 msgid "Add this to the _beginning of each line:" msgstr "Agregar esto al _inicio de cada línea:" #: ../src/dlgMLSend.ui:235 msgid "Specify some text to be prepended to each sent line" msgstr "Especificar algún texto a ser agregado al inicio de cada línea enviada" #: ../src/dlgMLSend.ui:250 msgid "Add this to the _end of each line:" msgstr "Agregar esto al _final de cada línea:" #: ../src/dlgMLSend.ui:265 msgid "Specify some text to be appended to each sent line" msgstr "Especificar texto a ser agregado al final de cada línea enviada" #: ../src/dlgMLSend.ui:283 msgid "_Delay" msgstr "_Demora" #: ../src/dlgMLSend.ui:297 msgid "Specify the delay between sending the group of lines" msgstr "Especificar la demora entre los grupos de líneas enviadas" #: ../src/dlgMLSend.ui:313 msgid "seconds e_ach" msgstr "segundos ca_da uno(a)" #: ../src/dlgMLSend.ui:327 msgid "Specify how many lines are sent at once" msgstr "Especificar cuántas líneas serán enviadas a la vez" #: ../src/dlgMLSend.ui:342 msgid "line(s)" msgstr "línea(s)" #: ../src/dlgMLSend.ui:360 msgid "_Keep dialog open after sending" msgstr "_Mantener diálogo abierto luego de enviar" #: ../src/dlgCmdHistory.ui:20 msgid "Command History" msgstr "Historial de Comandos" #: ../src/dlgCmdHistory.ui:75 msgid "Find a command containing a given search term" msgstr "Encontrar un comando conteniendo un término de búsqueda determinado" #: ../src/dlgCmdHistory.ui:87 msgid "Find _next" msgstr "Encontrar _siguiente" #: ../src/dlgCmdHistory.ui:93 msgid "Find the next command with the same match text" msgstr "Encontrar el siguiente comando con el mismo texto" #: ../src/dlgCmdHistory.ui:124 msgid "_Recall" msgstr "_Recordar" #: ../src/dlgCmdHistory.ui:130 msgid "Put the selected command in the command entry box" msgstr "Colocar el comando seleccionado en la caja de entrada de comandos" #: ../src/dlgCmdHistory.ui:143 msgid "Rec_all & Close" msgstr "Record_ar & Cerrar" #: ../src/dlgCmdHistory.ui:149 msgid "Put the selected command in the command entry box and close this dialog" msgstr "" "Colocar el comando seleccionado en la caja de entrada de comandos y cerrar " "este diálogo" #: ../src/dlgCmdHistory.ui:167 msgid "Send the selected command(s) to the mud" msgstr "Enviar el/los comando(s) al programa" #: ../src/dlgCmdHistory.ui:179 msgid "S_end & Close" msgstr "E_nviar & Cerrar" #: ../src/dlgCmdHistory.ui:185 msgid "Send the selected command(s) to the mud and close the dialog" msgstr "" "Enviar el/los comando(s) seleccionado(s) al programa y cerrar el diálogo" #: ../src/dlgCmdHistory.ui:224 msgid "Newest commands are on the top" msgstr "Los comandos más recientes están al inicio" #: ../src/dlgCmdHistory.ui:252 msgid "Dela_y" msgstr "Demo_ra" #: ../src/dlgCmdHistory.ui:265 msgid "Specify the delay between sending the group of commands" msgstr "Especificar la demora entre envío de grupo de comandos" #: ../src/dlgCmdHistory.ui:282 msgid "sec_onds each" msgstr "seg_undos cada uno(a)" #: ../src/dlgCmdHistory.ui:296 msgid "Specify how many commands are sent at once" msgstr "Especificar cuántos comandos serán enviados a la misma vez" #: ../src/dlgCmdHistory.ui:313 msgid "commands(s)" msgstr "comando(s)" #: ../src/dlgCmdHistory.ui:338 msgid "Find Command" msgstr "Encontrar Comando" #: ../src/dlgCmdHistory.ui:400 msgid "_Text to find:" msgstr "_Texto a encontrar:" #: ../src/dlgCmdHistory.ui:413 msgid "Enter the text to search for" msgstr "Ingresar texto a ser buscado" #: ../src/dlgCmdHistory.ui:434 msgid "Search direction:" msgstr "Dirección de búsqueda:" #: ../src/dlgCmdHistory.ui:449 msgid "_Downwards" msgstr "Hacia A_bajo" #: ../src/dlgCmdHistory.ui:466 msgid "_Upwards" msgstr "Hacia _Arriba" #: ../src/mnuPopupURL.ui:12 msgid "_Open link" msgstr "_Abrir vínculo" #: ../src/mnuPopupURL.ui:21 msgid "_Copy link address" msgstr "_Copiar dirección de vínculo" #: ../share/kildclient.pl:76 ../share/kildclient.pl:97 #: ../share/kildclient.pl:117 ../share/kildclient.pl:182 #: ../share/kildclient.pl:433 ../share/kildclient.pl:511 #: ../share/kildclient.pl:589 ../share/kildclient.pl:602 #: ../share/kildclient.pl:615 ../share/kildclient.pl:628 #: ../share/kildclient.pl:641 ../share/kildclient.pl:654 #: ../share/kildclient.pl:667 ../share/kildclient.pl:680 #: ../share/kildclient.pl:694 ../share/kildclient.pl:708 #: ../share/kildclient.pl:818 ../share/kildclient.pl:830 #: ../share/kildclient.pl:842 ../share/kildclient.pl:854 #: ../share/kildclient.pl:867 ../share/kildclient.pl:1083 #: ../share/kildclient.pl:1116 #, perl-format msgid "%s: Too few arguments." msgstr "%s: Muy pocos argumentos." #: ../share/kildclient.pl:207 ../share/kildclient.pl:567 #, perl-format msgid "No such %s" msgstr "No existe %s" #: ../share/kildclient.pl:298 ../share/kildclient.pl:316 #: ../share/kildclient.pl:334 ../share/kildclient.pl:352 #: ../share/kildclient.pl:370 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: Número de argumentos incorrecto." #: ../share/kildclient.pl:403 ../share/kildclient.pl:411 #: ../share/kildclient.pl:489 ../share/kildclient.pl:497 #, perl-format msgid "No such %s." msgstr "No existe %s." #: ../share/kildclient.pl:425 #, perl-format msgid "No %s deleted." msgstr "No %s borrado(a)." #: ../share/kildclient.pl:427 #, perl-format msgid "One %s deleted." msgstr "Un(a) %s borrado(a)." #: ../share/kildclient.pl:429 #, perl-format msgid "%d %s deleted." msgstr "Se borró %d %s." #: ../share/kildclient.pl:506 #, perl-format msgid "Successfully moved %s." msgstr "Se movió %s exitosamente." #: ../share/kildclient.pl:898 msgid "Could not open file." msgstr "No se pudo abrir el archivo." #: ../share/kildclient.pl:928 msgid "Unknown" msgstr "Desconocido(a)" #: ../share/kildclient.pl:935 msgid "Invalid plugin file." msgstr "Archivo de complemento inválido." #: ../share/kildclient.pl:966 msgid "Plugin already loaded. Try enabling it." msgstr "Complemento ya está cargado. Intente habilitarlo." #: ../share/kildclient.pl:968 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "La versión %s de este complemento ya está cargada." #: ../share/kildclient.pl:978 #, perl-format msgid "Error in plugin file: %s" msgstr "Error en archivo de complemento: %s" #: ../share/kildclient.pl:990 msgid "Cannot load a plugin in another world." msgstr "No se puede cargar un complemento en otro mundo." #: ../share/kildclient.pl:995 ../share/kildclient.pl:1015 msgid "Plugin not specified" msgstr "Complemento no especificado" #: ../share/kildclient.pl:1002 ../share/kildclient.pl:1033 msgid "Plugin not loaded." msgstr "Complemento no cargado." #: ../share/kildclient.pl:1005 #, perl-format msgid "Plugin '%s' loaded." msgstr "Complemento '%s' cargado." #: ../share/kildclient.pl:1021 #, perl-format msgid "Could not load plugin %s" msgstr "No se pudo cargar el complemento %s" #: ../share/kildclient.pl:1097 msgid "Plugin enabled." msgstr "Complemento habilitado." #: ../share/kildclient.pl:1130 msgid "Plugin disabled." msgstr "Complemento deshabilitado." #: ../share/kildclient.pl:1279 msgid "Cannot open help file." msgstr "No se puede abrir el archivo de ayuda." #: ../share/kildclient.pl:1297 msgid "Help topic not found." msgstr "Tema de ayuda no encontrado." #: ../share/kildclient.pl:1394 msgid "" "Warning: the getwindowsize() function is deprecated and will be removed." msgstr "" "Advertencia: La función getwindowsize() está deprecada y será removida." #: ../share/kildclient.pl:1395 msgid "Use $window->getsize() instead." msgstr "Usar $window->getsize() como reemplazo." #: ../share/kildclient.pl:1400 msgid "Warning: the minimize() function is deprecated and will be removed." msgstr "Advertencia: La función minimize() está deprecada y será removida." #: ../share/kildclient.pl:1401 msgid "Use $window->minimize() instead." msgstr "Usar $window->minimize() como reemplazo." #: ../share/kildclient.pl:1406 msgid "Warning: the path() function is deprecated and will be removed." msgstr "Advertencia: la función path() está deprecada y será removida." #: ../share/kildclient.pl:1407 msgid "Use $world->path() instead." msgstr "Usar $world->path() como reemplazo." kildclient-3.0.0/po/LINGUAS0000644000175000017500000000005612376346024012230 00000000000000#Set of available languages de eo es pt_BR sv kildclient-3.0.0/po/pt_BR.gmo0000644000175000017500000017275512376346024012735 000000000000004L.=~= H>V>e>n>>>>>>L>7L????"?"?@-@L@5h@5@&@.@*ADA(aAAAAA6A'B6BB'yB;BB)B?#CcCkC rC|CCCCC CCD#D 9DED ]DiD DDDD DDD E 4EAEaErEEEEEEEFBF+VF$FF(F"FF GG GG#G G*G0H66HmH tHH H H HH HH HHHHHI 3IAI UIcIlI&}IIII I II8 JJFJJLKDjKBKtKIgL@LBLD5M?zM:MM<N=OGPO<OBO-PWFPP!Q,)Q&VQ1}Q5QQQQR#R@RWRjR|R RRRR;R"SQ;S8SCS8 TCTVT(gT/T#TT"U#UBU'[U UU6UU V%V$BVgVVVVVV VV VVVVVWW W,WGWWWhWxW WWW%WWX:X%UX{X)X XX XX#X$Y2;Y2nYY9YNY$1ZVZ ^ZiZZ Z Z Z Z Z,Z[[&7[^[/f[`[&[1\0P\1\1\3\']A]6`]8]1]2^.5^2d^W^Z^DJ__{_1(`1Z`#`%```a"!a Da$ea aa aaaaaaa b b b#b 2b-=b.kb b bbbbb bbbCbu;c cccFc$d*d;d AdKd$Sd$xdd dd{FeeKUf]ff-g4g4:gogxg'g1gggh&h2Eh xh hhh hhhhhhii"i 2i>iFi[ioiiii iiLijj/j7j FjRj"aj jjjjjjjjkk+)k Ukckxk k k k k kk kkkk k l l#l+llm#m2mDm.dm mmmmmnn(n9nKn`ntn@nIno%%o KoVo_ogoooooo'opp"p5pkJppp p#ppZq0oqq qq qq q q r %r11rGcrr rrr rr ss s%s:sUshsqsws~sss!ss sst %t/tAtUt=gt7tTtA2uNtu;uu)v(9v/bv-v.v&vfw=}w'w<w x;xCx+axx xx*x'xMy2Ty3y0y-y7z4Rz;zFzS {G^{S{A{2<|o| v| || || || ||%z}}}_}<~K~%b~5~4~~1Z5 Taq"!(2'[.' &( HiY߃D-G[-v ,Ä WHvC?C I V b,o < "!Nʇ6Pk"ˈ als| = ʉ׉މ ",)V^6g " ֊ "+%QZbi' ċыڋ$ :BTm :Ќ- 9$?djs{$'ƍ* #. 7B ISg n{  Ŏ׎ݎ ' -N]lJ{Ə؏   8@Pk)q.ʐ Ґܐ& !,&Nu)đ &)Z02 ْ '0DFJ Ǖݕ!2QZk<Ɩ<%Y&!×!=?E/; 62i|"Gə9>K3E!0&;W ӛ#&Jeu œܜ 9FV,p !̝۝8H]}J.&6(=%f _'g )0Ġ6, 2>CIYhn~!ۡ % 4>4P,Ǣߢ CVVQC\.{!LEG0KxHĦG UId;2IKg4eNߪ+2%BX>ګ+Icx ɬ?#1VU:E;-i~,2%%+=%i.)ݯ"@*#k./ܰ! *.Y_fn~ ˱ձ ݱ7!5J^ t"ڲ <&<c/y ij ѳ$ݳ#9&6`GS,9 f p"} ŵ ҵߵ 4!0R4n 2d%F3l23ӷ35;/q$HƸ68F=16d&WK/sJ:=!7 Yz-̼0+J\dlu Խ 43/h Ǿ;ݾ!LQҿV^dv|-- >dg@08 #-,G:tM nx*3EUYqlcj|( #';@"^, )@Uk   ( 9/Z*;MbvRW0&Ipx~)"7Jaj{ 4`P4 +% Q]m/D )Ecu   4 Rs'D$Gi\K_ZN -",P9}7+*uFC)=* h;64UTEI%9o?<:&@aVmPgOM5V  (^ jw)311a2WJQYm#))/ E9R0%& !0iR H'7&T9{ , %X6;625<M \+i*=*./Y Jk!(  < &.6HPj p,z 0 % - 8 D,P} 2    ,DK S]c,j"  & / ;F![C}?) 3=EM,j /3  )3; BLiq   $9IP pzQ  ) 4 ?JQXw%47. 6A*a /#  #@"IlrU= Jds|  K"D M[+&>Lgu"Ou4<5c4+v~0RmbT yxX"kM%h9%-yo?LsVLG*F5dSMw#=eQ<,qB6fS^ctI`3hz_xWb Qf#*{ 'g>i!Irl/$JN<QsY :$VAC:z.&;nUq@ 8`Dw-l7vC1h }xv-oY*9wuXPa0J|)2tK@]Tq?sU]8%(ZW' N G=a7OC|')Fik#I?{reZcj2U(AW }_BGp[ ndRg3o/y7Pef^R [E  2+K\l|i>Fz=:Hr@!bE64NAk3,H0j81m~t)D6/ap..&H9OP{ ]T;JZ`\XYV;B~}d(n!_E ^j5Spm$\1 , Target: %d Foreground: %d Background: %d Italics: %d Striked-thru: %d Underline: %d SSL enabled.%d %s deleted.%d lines%s is already permanent.%s: %s is already permanent%s: %s is not permanent%s: Argument must be numeric%s: Invalid key code%s: No such world%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent%s: This is an internal function, do not call directly.%s: Too few arguments%s: Too few arguments.%s: Too many string arguments%s: Variable '%s' made permanent. %s: Variable '%s' made temporary. %s: Wrong argument type%s: Wrong number of arguments.%s: Wrong type of reference%s: action given twice, using the named attribute one%s: action not specified, and isn't gag, not creating%s: action not specified, not creating%s: cannot create timer with negative interval%s: count must be numeric%s: interval must be numeric%s: interval not specified, not creating%s: invalid bg color%s: invalid fg color%s: invalid target%s: invalid underline style%s: keycode given twice, using the named attribute one%s: keycode not specified, not creating%s: pattern given twice, using the named attribute one%s: pattern not specified, not creating%s: substitution given twice, using the named attribute one(-1 to repeat indefinitely)(Leave blank for default based on locale)(You must reconnect for changes in this setting to take effect)0 lines1 line: Expired: Not yet activeAnsi ColorsAudio PlayerAuto-loginCharacter SetColors used by KildClientCommand EntryConnectionDefault ColorsFileFlood preventionFontGraphical EditorsInputLogging StatusMCCP (for compression)Name displayNote:OptionsPlugins Currently LoadedPlugins Loaded on StartupProxyRevert to default colorsScriptingScrollingSending DelaysTCP Keep AliveTime DisplayTooltipsWeb BrowserWindow configurationWord WrapA mud client with powerful features and support for Perl ScriptingA_utomatically start logging when connectedActi_vate auto-completion only afterActionAdd this to the _beginning of each line:Add this to the _end of each line:AdvancedAlias added.Alias modified.Alias number %d Name: %s Pattern: %s Substitution: %s Ignore case: %s Eval as Perl: %s Enabled: %s AliasesAlways load this plugin at _startupAppearanceAre you sure you want to close this world?Attempting to connect to host %s (%s) port %s...Attempting to connect to proxy host %s (%s) port %s...AuthorAutomationB_lueBac_kgroundBl_ack (bold)Bl_ue (bold)BlackBlack (bold)BlueBlue (bold)Bold backgroundBold foregroundBottomBytes received (compressed):Bytes received (decompressed):C_hange styleC_ommand separator:C_onfigure...C_onnectC_onnected time:Cannot load a plugin in another world.Cannot open help file.Certificate type:Ch_aracters in this mud:Change StyleCharacterCharacter _set:Check if you want lines to be wrapped at word boundariesCheck if you want the highlighted ANSI colors to be displayed in bold alsoCheck if you want tooltips to be displayed showing the time when a line was received if you leave the mouse over the line for a short whileCheck this if the text you type is displayed as black dots in the input box.Check to enable command auto-completion (based on previous commands)Check to have the command history saved in a file between sessionsCheck to have the last command kept in the command entry box, so that you can repeat commands only by pressing ENTERCheck to have the main window scroll to the end whenever new output comesCheck to have the sent commands echoed in the main output windowCheck to have the substitution be executed in a s///e constructionCheck to have the timer deleted after its repeat count has reached 0Check to make the alias enabled; only enabled aliases are triedCheck to make the hook enabled; only enabled hooks are runCheck to make the idle time counter reset only when a command is entered directly by typing it in the command entry box. If not checked, if a command is sent because of a timer, of a hook, etc, the idle timer is also reset.Check to make the macro enabled; only enabled macros are runCheck to make the matched line not be printed in the log fileCheck to make the matched line not be printed in the main output windowCheck to make the timer enabled; only enabled timers are runCheck to make the trigger enabled; only enabled triggers are triedCheck to make this trigger a rewriter triggerCheck to make this trigger not prevent further triggers from being tried, if it matchesCheck to prevent more than a given number of equal commands to be sent in a row (which can disconnect your character in some muds)Cipher:Click the run the triggers against the line.Click to clear the command input area.Click to open link; right-click for more options.Click to revert all colors to their built-in defaultsColorsCommand HistoryCommand _History...Command not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _Another...Connect to another worldConnect without SSLConnected to host %s (%s) port %s, MCCP version %d enabled.Connected to host %s (%s) port %s.Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d enabled.Connected to host %s port %s, via proxy %s (%s) port %s.Connected to proxy server %s port %s, negotiating authentication...Connected to proxy server %s port %s, sending request...Connection _style:Connection time:Could not connect to host %s port %s: %sCould not connect to host %s port %s: Error #%dCould not create directory '%s': %sCould not create socket: %sCould not create socket: error #%dCould not import file '%s': %sCould not load plugin %sCould not load world from file '%s': %sCould not open dump file %s: %s Could not open file '%s': %sCould not open file '%s': %s Variables were not saved.Could not open file.Could not open file: %sCould not open log file: %s.Could not open raw dump file %s: %s Could not open world '%s': %s Could not resolve host %s: %sCountCount Cu_tCustom: Cya_n (bold)CyanCyan (bold)DIRD_eleteDefaultDefault (bold)Dela_yDeleteDescriptionDirectory to store settings and saved worldsDisable T_imersDisable _AliasesDisable _MacrosDisable _TriggersDisconnectedDisconnected from host %s.Disconnected from host %s: %s.Disconnected from host %s: error #%d.Disconnected from world %sDisplayDisplay _tooltips with the time when the line was receivedDisplay as hours, minutes and secondsDisplay as secondsDo not allow the _same command to be sentDo not changeDo not connectDo not deleteDo not displayDo you really want to delete %d %s?Do you really want to delete the %s?Do you really want to make %d variables temporary?Do you really want to make the variable temporary?DoubleDumps all data received (possibly compressed) to the fileDumps all data received from (after decompression, if appropriate) to the fileE_val substitution as Perl statementE_xportEdit AliasEdit Character InformationEdit Default _World...Edit HookEdit MacroEdit TimerEdit TriggerEdit WorldElement '%s' not allowed inside element '%s'Enable TCP _Keep Alive packetsEnable _auto-completionEnable if server proposes at _any timeEnabledEnter _line to be matched against the triggers:Enter a command to be sent whenever the specified maximum number of equal commands would be sentEnter a descriptive name for the WorldEnter optionally a descriptive name for the aliasEnter optionally a descriptive name for the hookEnter optionally a descriptive name for the macroEnter optionally a descriptive name for the timerEnter optionally a descriptive name for the triggerEnter some text to be sent to the WorldEnter some text to search for.Enter the action that will be run when a match happensEnter the action to be executed whenever the timer firesEnter the action to be run when the event happensEnter the action to be run when the key is pressedEnter the character's name for automatic loginEnter the character's password for automatic loginEnter the command to run a web browser. %s will be substituted by the web page address.Enter the command to run an audio player program. %s will be substituted by the file path.Enter the default parameters for sending multiple lines or commands:Enter the host to connect toEnter the name of a scalar ($), array (@) or hash (%) variable whose contents are to be saved between sessions of the WorldEnter the pattern to match against received linesEnter the pattern to match against typed commandsEnter the port used when connectingEnter the substitution to be executedEnter the text to search forError Loading PluginError in plugin file: %sError loading UI from XML file: %sError setting spell checker: %s Error while reading from proxy host.Eval as PerlEvent:Expiration:ExportExternal ProgramsFILEFailed loading file %s: %sFileFile name not specified.Find CommandFind N_extFind NextFind P_reviousFind _nextFind a command containing a given search termFind the next command with the same match textFingerprint:G_reen (bold)GagGag LogGeneralGreenGreen (bold)HTTPHelp topic not found.Here you can set options to configure the appearance of KildClient.Here you can set options to configure the automation features of KildClient, such as triggers, aliases, plugins, etc.Hook defined.Hook modified.Hook not foundHook number %d for event %s Name: %s Action: %s Enabled: %s HooksHooks for '%s': Host:Hostname:I. CaseIdentify as 'Character - World name'Identify as 'World name - Character'Identify as 'World name'Idle time:If checked, the up and down arrow keys are not used for navigating between saved commands. (You'll have to use Alt+up and Alt+down.)If checked, triggers, aliases, macros and timers defined in plugins will appear in the corresponding World Editor sections.If not checked, objects such as triggers, aliases, etc. will be deleted directly without asking for confirmation when you press the Delete button.If this is checked, when there is only one open world no tabs will be shownIf this is selected, logging will be automatically started whenever you connect to the world.ImportInform number of lines to include in the log.InputInternal error: element '%s' ends when in START modeIntervalInvalid argument '%s' Invalid attribute '%s' for element '%s'Invalid function call: syntax is $world->FUNCTIONInvalid key code '%s'Invalid key code.Invalid plugin file.Invalid top-level element '%s'Invalid window size specification in config file. Keep ExecKeep _openKeep permanentKeyKey exchange:KildClient ErrorKildClient InformationKildClient QuestionKildClient WarningKildClient readyLanguage code:LeftLines received:Load pluginLoggingLogging is disabled.Logging not startedLogging stopped.Logging to file %s.Logging to file %s. MAC:Macro added.Macro modified.Macro number %d Name: %s Key Code: %s Action: %s Enabled: %s MacrosMagen_ta (bold)MagentaMagenta (bold)Main WindowMake temporaryMaximum line width in _characters:MiscellaneousMore than one command selected.Multi-line sendN/AN_umber of lines:NameNever _hide the typed textNewest commands are on the topNoNo %s deleted.No acceptable proxy authentication methods.No auto-loginNo command selected.No proxyNo such %sNo such %s.No such aliasNo such hookNo such macroNo such pluginNo such timerNo such triggerNo worldNoneNot connectedNot connected.Not foundNot setNote: You can use strftime() escapes to create different files based on the date and time that logging starts. Also, %Kw represents the World name and %Kc the character name used in auto-logon.Num Ena %-*.*s %-*.*s Num Ena %-*.*s Version %-*.*s Num Ena ActionNum Ena Temp Int Num Eval Ena IgC %-*.*s %-*.*s Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s Number of triggers that matched:OfflineOmit (_gag) from outputOmit (gag) from _log fileOnCloseConnected HooksOnConnect HooksOnDisconnect HooksOnGetFocus HooksOnLoseFocus HooksOnReceivedText HooksOnSentCommand HooksOne %s deleted.Only _reset idle time counter when a command is entered directlyOnly scalar ($), array (@) and hash (%%) variables can be made permanent.Or connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPerforming SSL handshake...Permanent VariablesPermanent variablesPermenent variablePluginPlugin '%s' loaded.Plugin already loaded. Try enabling it.Plugin disabled.Plugin enabled.Plugin not loaded.Plugin not specifiedPlugin number %d Name: %s Version: %s Description: %s Author: %s Enabled: %s PluginsPort:PreferencesPrefix lines with _date and/or timePress a key to get its keycode.Press the key that will be used to activate the macro while the cursor is in the text box.Press the key that will be used to run the macroProtocol %s not enabled.ProtocolsProxyProxy _type:Proxy authentication failed.Proxy host:Proxy port:Proxy request failed: %s.Proxy type:Put the selected command in the command entry boxPut the selected command in the command entry box and close this dialogR_edRe_d (bold)Re_vert to default colorsReally Quit KildClient?Really close?Rec_all & CloseReconnectRedRed (bold)Resolving host %s...Resolving proxy host %s...Revert to _defaultRewriterRightSOCKS4SOCKS5SSL Handshake failed: %sSSL Handshake took too long.SSL not supported in this versionSSL protocol used:S_end & CloseS_pell check typed textS_tatistics...ScriptingScroll on _outputSe_nd this command:Search direction:Select if you do not want the connection time to be displayedSelect if you do not want the idle time to be displayedSelect if you want the connection time to be displayed in hours, minutes and secondsSelect if you want the connection time to be displayed in secondsSelect if you want the idle time to be displayed in hours, minutes and secondsSelect if you want the idle time to be displayed in secondsSelect log fileSelect the font used in the _main screen:Select the font used in the _status bar:Select the font used in the command _entry box:Select the font used in the command entry boxSelect the font used in the main output screenSelect the font used in the status barSelect this if you want to prefix each line in the log file with the date and/or time it was received.Select to include lines from the main window in the log file.Send the selected command(s) to the mudSend the selected command(s) to the mud and close the dialogSend this text _initially:SendingSending connection request...Sending proxy authentication credentials...Server _address:Server _port:SingleSpecify how many commands are sent at onceSpecify how many lines are sent at onceSpecify how many times this timer should run before being disabled or deletedSpecify some text to be appended to each sent lineSpecify some text to be prepended to each sent lineSpecify the command used to launch a web browserSpecify the command used to play sound files.Specify the delay between sending the group of commandsSpecify the delay between sending the group of linesSpecify the interval, in seconds, between timer activationsSpecify the maximum number of equal commands that can be sent in a rowSpecify the number of characters that must be typed for command completion to startSpecify the number of commands that are saved and can be later recalledSpecify the number of lines of output that can be seen with by scrolling the windowSpecify the separator for commands typed in the command entry boxSpell checking support not included in this build.St_artStatisticsStatus BarStyleSubstitutionSuccessfully moved %s.TTL expiredTempTest TriggersThe default is to prefix lines with the date and time, but you can configure the format with strftime() escape sequences. See the manual for a description of those.The help is displayed in main window.The interval must be positive.The matched substring numberThe text entered here will be matched against triggers as if it were a line coming from the MUDThe whole lineThe whole matched textThen send the _contents of this file:There are %d open worlds. Do you really want to quit?There is one open world. Do you really want to quit?This is what would be printed in the main screen. If empty, the line has been gaged. It can be different from the original line because of rewriter triggers.This is what would be printed in the main screen:This object belongs to a plugin. Changes made here will not be saved in the plugin.This version of KildClient does not have SSL support.Timer added.Timer modified.Timer number %d Name: %s Interval: %.3f Repeat count: %d Action: %s Enabled: %s Temporary: %s TimersTopTrigger added.Trigger modified.Trigger number %d Name: %s Pattern: %s Action: %s Enabled: %s Ignore case: %s Gag output: %s Gag in log: %s Keep executing: %s Rewriter: %s Change style: %s TriggersUnable to connect to host %s: %s.Unable to connect to host %s: Error #%d.Unable to connect to proxy host %s: %s.Unable to connect to proxy host %s: Error #%d.UnknownUnknown directive '%s' in config file. Unknown protocolUnnamed worldUnrecognized response from proxy host.Use $window->getsize() instead.Use $window->minimize() instead.Use $world->path() instead.Use %Kw to represent the World's name, and %Kc to represent the auto-logon character nameUse _SSLUse _bold font for highlighted colors (instead of just highlighting)Use _multi-line input barUse global settingsUse single-_line input barUse the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit http://www.kildclient.orgW_hite (bold)Warning: Trying to send a very long command line. Perhaps a recursive alias definition?Warning: the getwindowsize() function is deprecated and will be removed.Warning: the minimize() function is deprecated and will be removed.Warning: the path() function is deprecated and will be removed.WhiteWhite (bold)World name:World saved.Would this line be included in the log file?Wrap lines at full _screen widthWritten by Eduardo M Kalinowski (eduardo@kalinowski.com.br) Yell_ow (bold)YellowYellow (bold)YesYou can leave this field blank, and a file name will be automatically generated. Only edit this field if you know what you are doing.You must specify a variable name.You must specify the action, unless the trigger is a gag or changes the style.You must specify the action.You must specify the key.You must specify the name.You must specify the password.You must specify the pattern.You must specify the substitution.You're attempting to connect to a world that uses SSL, but this version of KildClient has been built without SSL support. Try to connect without SSL?[WORLD...]_About_Action:_Add_Apply to:_Ask for confirmation before deleting triggers, aliases, etc._Background:_Black_Cancel_Clear_Close_Command echo:_Copy_Copy link address_Cyan_Delay_Delay between each group of lines/commands:_Delete_Disable_Disable up and down arrow keys for history navigation_Disconnect_Display_Do not display this message again_Don't quit_Down_Downwards_Echo sent commands in main window_Edit_Edit..._Enable if server proposes after connecting_Enabled_Event:_File:_Finally, send this text:_Find_Find:_Flash window when new text is received_Foreground_Foreground:_Format:_Green_Help_Hide tabs if only one world is open_Host:_Idle time:_Ignore case when matching_Import_Include the last_Indent wrapped lines by_Informative messages:_Input_Interval:_Italic:_Items to export_Keep dialog open after sending_Keep executing other triggers after this this one matches_Keep last typed command in command entry box_Key:_Lines to save in scrollback buffer:_Load_Magenta_Manual_Multi-line Send..._Name of variable to make permanent:_Name:_New_Next_Number of commands to save in history:_Number of lines/commands to send at once:_OK_Open_Open link_Open..._Password:_Paste_Pattern:_Perl file to load:_Port:_Preferences_Preferences..._Previous_Quit_Recall_Reconnect_Remove_Repeat count:_Rewriter trigger_Save_Select a saved world:_Send_Show items defined by plugins_Split Window_Stop_Store commands between sessions_Striked-thru:_Substitution:_Tab position:_Temporary (will be deleted automatically when its repeat count reaches 0)_Test Triggers..._Text to find:_Underline:_Up_Upwards_Username:_White_World_Wrap lines at word boundaries_Yellow_times in a rowaddress type not supportedaliasalias: not creating alias without patternalias: not creating alias without substitutionaliasescharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection not allowed by rulesetconnection refused by destination hostgeneral failurehookhook: hook '%s' not found hookshost unreachableline(s)lines of the scrollback buffer in the logmacromacro: No such macromacrosnnetwork unreachablenopixelsrequest failed because client's identd could not confirm the user ID string in the requestrequest failed because identd could not be reachedrequest rejected or failedsec_onds eachsecondsseconds e_achtimertimer: No such timertimerstriggertriggersunknown reason codeyyesProject-Id-Version: KildClient 3.0.0 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general POT-Creation-Date: 2014-08-17 14:59-0300 PO-Revision-Date: 2014-08-17 17:09-0300 Last-Translator: Eduardo M Kalinowski Language-Team: Eduardo M Kalinowski Language: pt_BR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Alvo: %d Texto: %d Fundo: %d Itálico: %d Tachado: %d Sublinhado: %d SSL habilitado.%d %s apagados.%d linhas%s já é permanente.%s: %s já é permanente%s: %s não é permanente%s: Argumento deve ser numérico.%s: Código de tecla inválido%s: Não existe tal mundo%s: Apenas variáveis escalares ($), arrays (@) e hashes (%%) podem ser feitas permanentes%s: Esta é uma função internal, não a chame diretamente.%s: Muito poucos argumentos%s: Muito poucos argumentos.%s: Argumentos string demais%s: Variável '%s' feita permanente. %s: Variável '%s' feita temporária. %s: Tipo de argumento errado%s: Número errado de argumentos.%s: Tipo de referência inválido%s: ação informada duas vezes, usando a de atributo nomeado%s: ação não especificada e não e gag, cancelando criação%s: ação não informada, cancelando criação%s: não é possível criar um timer com intervalo negativo%s: contagem deve ser numérica%s: intervalo deve ser numérico%s: intervalo não foi informado, cancelando criação%s: 'bg' inválido%s: 'fg' inválido%s: 'target' inválido%s: estilo de sublinhado inválido%s: código de tecla informado duas vezes, usando o de atributo nomeado%s: código de tecla não informado, cancelando criação%s: pattern informado duas vezes, usando a de atributo nomeado%s: pattern não especificado, cancelando criação%s: substituição informada duas vezes, usando a de atributo nomeado(-1 para repetir indefinidamente)(Deixe em branco para padrão baseado no locale)(Você precisa reconectar para alterações fazerem efeito)0 linhas1 linha: Expirou: Não ativo aindaCores AnsiReprodutor de ÁudioLogin automáticoConjunto de caracteresCores usadas pelo KildClientEntrada de ComandosConexãoCores PadrãoArquivoPrevenção de FloodFonteEditores GráficosEntradaEstado do LogMCCP (para compressão)Exibição do nomeNota:OpçõesPlugins carregadosPlugins carregados na inicializaçãoProxyReverter às cores padrãoScriptsRolagemEspera Entre EnviosKeep Alive TCPExibição dos TemposTooltipsNavegador WebConfiguração da JanelaQuebra de linhasUm cliente de MUD com recursos poderosos e suporte para scripting com PerlInicilar log a_utomaticamente quando conectadoAti_var auto-compleção somente apósAçãoAdicionar isso ao c_omeço de cada linhaAdicionar isso ao f_im de cada linha:AvançadoAlias adicionado.Alias modificado.Alias número %d Nome: %s Padrão: %s Substituição: %s Ignorar caixa: %s Avaliar como Perl: %s Habilitado: %s Aliases_Sempre carregar esse plugin ao iniciarAparênciaVocê realmente deseja fechar este mundo?Tentando se conectar ao host %s (%s) porta %s...Tentando se conectar ao host proxy %s (%s) porta %s...AutorAutomaçãoAzulFundoPreto (negrito)Azul (negrito)PretoPreto (negrito)AzulAzul (negrito)Fundo em egritoTexto em negritoEm baixoBytes recebidos (comprimidos):Bytes recebidos (descomprimidos):_Alterar estiloSeparador de c_omandos:C_onfigurar...C_onectarTempo c_onectado:Não é possível carregar um plugin em outro mundo.Não foi possível abrir o arquivo de ajuda.Tipo de certificado:_Personagens neste mud:Alterar EstiloPersonagemCo_njunto de caracteres:Marque se você quiser que as linhas sejam quebradas entre palavrasMarque se você quiser que as cores ANSI destacadas sejam mostradas em negrito tambémMarque se você quiser que uma tooltip seja mostrada com o horário em que a linha foi recebida ao deixar o mouse sobre uma linha por alguns segundosMarque se tudo o que você digita aparece como pontos pretos na caixa de entrada.Marque para completar automaticamente os comandos digitados (baseado em comandos anteriores)Marque para salvar os comandos entre sessões.Marque para que o último comando seja mantido na caixa de entrada de comandos, para repeti-lo apertando ENTER simplesmenteMarque para que a janela seja movida para o fim sempre que novo texto chegarMarque para ecoar os comandos enviados na janela principal de saída.Marque para que a substituição seja executada numa construção s///eMarque para que o timer seja apagado quando seu número de vezes chegar a 0Marque para habilitar o alias; somente aliases habilitados são tentadosMarque para habilitar o hook; somente hooks habilitados são executadosMarque para fazer com que o contador de tempo inativo só seja resetado quando um comando for digitado diretamente na caixa de entrada de comandos. Se não estiver marcado, e um comando for enviado por um timer, hook, etc, o contador de tempo ocioso também é resetado.Marque para habilitar o macro; somente macros habilitados são executadosMarque para que a linha não seja escrita no arquivo de logMarque para que a linha não seja mostrada na telaMarque para habilitar o timer; somente timers habilitados são executadosMarque para habilitar o trigger; somente triggers habilitados são tentadosMarque para que o trigger seja um trigger reescritorMarque para que esse trigger não impeça outros triggers de serem tentados, caso este seja executadoMarque para evitar que mais que um determinado número de comandos iguais seja enviado em seqüência (o que pode desconectá-lo em alguns muds)Algoritmo criptográfico:Clique para testar os triggers com a linha.Clique para limpar a área de entrada de comandos.Clique para abrir; clique com o botão direito para mais opções.Clique para reverter todas as cores para o padrão do programaCoresHistórico de comandos_Histórico de comandos...Comando não encontrado.Comandos que seriam enviados:Algoritmo de compressão:Taxa de compressão:Compressão utilizada:Confirmar deleçãoConectar aConectar a _outro mundo...Conectar a outro mundoConectar sem SSLConectado ao host %s (%s) porta %s, MCCP versão %d habilitado.Conectado ao host %s (%s) porta %s.Conectado ao host %s porta %s, via proxy %s (%s) porta %s, MCCP versão %d habilitado.Conectado ao host %s porta %s, via proxy %s (%s) porta %s.Conectado ao servidor proxy %s porta %s, negociando autenticação...Conectado ao servidor proxy %s porta %s, enviando pedido..._Estilo de conexão:Tempo de conexão:Impossível conectar ao host %s porta %s: %sImpossível conectar ao host %s porta %s: Erro #%dImpossível criar diretório '%s': %sNão foi possível criar o socket: %sNão foi possível criar o socket: erro #%dImpossível importar arquivo '%s': %sImpossível carregar plugin %sImpossível carregar mundo do arquivo '%s': %sImpossível abrir arquivo de dump %s: %s Impossível abrir arquivo '%s': %sImpossível abrir arquivo '%s': %s Variáveis não foram salvas.Não foi possível abrir o arquivo.Impossível abrir arquivo: %sNão foi possível abrir o arquivo de log: %s.Impossível abrir arquivo de dump bruto %s: %s Impossível abrir mundo '%s': %s Não foi possível encontrar o host %s: %sVezesVezes Cor_tarPersonalizado: Ciano (negrito)CianoCiano (negrito)DIR_ExcluirPadrãoPadrão (negrito)A_guardarExcluirDescriçãoDiretório para salvar a configuração e mundos salvosDesabilitar t_imersDesabilitar _aliasesDesabilitar _macrosDesabilitar _triggersDesconectadoDesconectado do host %s.Desconectado do host %s: %s.Desconectado do host %s: erro #%d.Desconectado do mundo %s.AparênciaMostrar _tooltips com o horário em que a linha foi recebidaMostrar como horas, minutos e segundosMostrar como segundosNão _permitir que o mesmo comando seja enviadoNão alterarNão conectarNão excluirNão exibirVocê realmente deseja apagar %d %s?Você realmente deseja apagar o %s?Você realmente deseja tornar %d variáveis temporárias?Você realmente deseja tornar a variável temporária?DuploEscreve todos os dados recebidos (possivelmente comprimidos) ao arquivoEscreve todos os dados recebidos (depois de descomprimir, se apropriado) ao arquivoA_valiar Substituição como um comando PerlE_xportarEditar AliasEditar Informações do PersonagemEditar _mundo padrão...Editar HookEditar MacroEditar TimerEditar TriggerEditar MundoElemento '%s' não permitido dentro do elemento '%s'Habilitar pacotes TCP _Keep AliveHabilitar _auto-compleçãoH_abilitar se o servidor propuser a qualquer momentoHabilitadoEntre a _linha para ser comparada com os triggers:Entre o comando para ser enviado toda vez que o número máximo de comandos iguais fosse ser enviadoEntre um nome descritivo para o MundoEntre opcionalmente um nome descritivo para o aliasEntre opcionalmente um nome descritivo para o hookEntre opcionalmente um nome descritivo para o macroEntre opcionalmente um nome descritivo para o timerEntre opcionalmente um nome descritivo para o triggerEntre com algum texto para ser enviado ao MundoEntre com algum texto para procurar.Entre a ação que vai ser executado quando uma linha disparar o triggerEntre a ação a ser executado quando o timer dispararEntre a ação a ser executado quando o evento acontecerEntre a ação a ser executada quando a tecla for pressionadaEntre o nome do personagem para login automáticoEntre a senha do seu personagem para login automáticoEntre o comando para rodar um navegador web. %s será substituído pelo endereço da página da web.Entre o comando para rodar um reprodutor de áudio. %s será substituído pelo arquivo.Entre os parâmetros padrão para o envio de múltiplas linhas ou comandos:Entre o host a se conectarEntre o nome de uma variável escalar ($), array (@) ou hash (%) cujo conteúdo será salvo entre sessões do MundoEntre o padrão para ser comparado com as linhas recebidasEntre o padrão para ser comparado com os commandos digitadosEntre a porta usada para conexãoEntre a substuição a ser feitaEntre o texto para procurarErro ao Carregar PluginErro no arquivo de plugin: %sErro ao carregar interface do arquivo XML: %sErro ao configurar verificador ortográfico: %s Erro ao ler do servidor proxy.Avaliar como PerlEvento:Expira:ExportarProgramas ExternosARQUIVOImpossível abrir arquivo %s: %sArquivoArquivo não especificado.Encontrar ComandoProcurar p_róximoEncontrar próximoProcurar a_nteriorEncontrar _próximoProcura por um comando contendo um determinado textoProcura pelo próximo comando com o mesmo textoFingerprint:Verde (negrito)GagGag LogGeralVerdeVerde (negrito)HTTPTópico de ajuda não encontrado.Aqui você pode definir opções para configurar a aparência do KildClient.Aqui você pode definir opções para configurar os recursos de automação do KildClient, como triggers, aliases, plugins, etc.Hook definido.Hook modificado.Hook não encontradoHook número %d para o evento %s Nome: %s Ação: %s Habilitado: %s HooksHooks para '%s': Host:Host:I. CaixaIdentificar como 'Personagem - Nome do mundo'Identificar como 'Nome do mundo - Personagem'Identificar como 'Nome do mundo'Tempo inativo:Se marcado, as setas para cima e para baixo não serão usadas para navegar entre os comandos salvos no histórico. (Será necessário usar Alt+Acima e Alt+abaixo.)Se marcado, triggers, aliases, macros e timers definidos por plugins aparecerão nas seções correspondentes do Editor de MundosSe não estiver marcado, objetos tais como triggers, aliases, etc. serão apagados diretamente sem pedir confirmação quando você aperta o botão Deletar.Se esta opção estiver habilitada, quando houver apenas um mundo aberto, nenhuma aba será exibida.Se estiver selecionada, o log será automaticamente iniciado sempre que você se conectar a este mundo.ImportarInforme o número de linhas para incluir no log.EntradaErro interno: elemento '%s' termina quando no modo STARTIntervaloArgumento '%s' inválido Atributo '%s' inválido para o elemento '%s'Chamada de função inválida: sintaxe é $world->FUNÇÃOCódigo de tecla '%s' inválidoCódigo de tecla inválido.Arquivo de plugin inválido.Elemento '%s' inválidoEspecificação de tamanho de janela inválida no arquivo de configuração. Cont ExecManter _abertoManter permanenteTeclaTroca de chave:Erro - KildClientInformação - KildClientQuestão - KildClientAviso - KildClientKildClient prontoCódigo da língua:EsquerdaLinhas recebidas:Carregar pluginLogLog está desabilitado.Log não iniciado.Log desabilitado.Logando para o arquivo %s.Logando para o arquivo %s. MAC:Macro adicionado.Macro modificado.Macro número %d Nome: %s Código de tecla: %s Ação: %s Habilitado: %s MacrosMagenta (negrito)MagentaMagenta (negrito)Janela PrincipalManter temporáriaLargura máxima da linha em _caracteres:OutrosMais de um comando selecionado.Enviar múltiplas linhasN/ANúm_ero de linhas:NomeNunca _ocultar texto digitadoComandos mais novos estão no topoNãoNenhum %s apagado.Nenhum método de autenticação aceitável.Sem login automáticoNenhum comando selecionado.Sem proxyNão existe tal %sNão existe tal %s.Não existe tal alias.Não existe tal hookNão existe tal macroNão existe tal plugin.Não existe tal timerNão existe tal triggerNenhum mundoNenhumaNão conectadoNão conectado.Não encontradoNão definidoNota: É possível usar seqüências da função strftime() para que o nome do arquivo inclua a data e/ou hora em que o log é iniciado. Além disso, %Kw representa o nome do mundo e %Kc o personagem usado no auto-logon.Núm Hab %-*.*s %-*.*s Núm Hab %-*.*s Versão %-*.*s Num Hab AçãoNum Hab Temp IntNúm Aval Hab IgC %-*.*s %-*.*s Núm Gag GLo Hab KeE ReE IgC Est %-*.*s %-*.*s Número de triggers disparados:OfflineOmitir (_gag) da tela de saídaOmitir (gag) do arquivo de _logHooks OnCloseConnectHooks OnConnectHooks OnDisconnectHooks OnGetFocusHooks OnLoseFocusHooks OnReceivedTextHooks OnSentCommandUm %s apagado.Só _resetar o contador de tempo inativo quando um comando é digitado diretamenteApenas variáveis escalares ($), arrays (@) e hashes (%%) podem ser feitas permanentes.Ou conecte d_iretamente:Mostra a informação da versão e sai_Senha:SenhaPadrãoIniciando SSL...Variáveis PermanentesVariáveis permanentesVariável permanentePluginPlugin '%s' carregado.Plugin já carregado. Tente habilitá-lo.Plugin desabilitado.Plugin habilitado.Plugin não carregado.Plugin não especificado.Plugin número %d Nome: %s Versão: %s Descrição: %s Autor: %s Habilitado: %s PluginsPorta:PreferênciasIncluir _data e/ou horaPressione uma tecla para obter seu código de tecla.Aperte a tecla que será usada para executar o macro enquanto o cursor estiver na caixa de textoAperte a tecla que será usada para executar o macroProtocolo %s não habilitado.ProtocolosProxy_Tipo do proxy:Autenticação com o servidor proxy falhou.Host proxy:Porta do proxy:Pedido ao proxy falhou: %s.Tipo do proxy:Colocar comando na caixa de entrada de comandosColocar comando na caixa de entrada de comandos e fechar essa janelaVermelhoVermelho (negrito)Reverter às core_s padrãoRealmente sair do KildClient?Realmente fechar?Recuper_ar & FecharReconectarVermelhoVermelho (negrito)Procurando host %s...Procurando host proxy %s...Reverter ao _padrãoReescritorDireitaSOCKS4SOCKS5Negociação SSL falhou: %sHandshake SSL demorou demais.SSL não suportado nessa versãoProtocolo SSL usado:E_nviar & Fechar_Verificar ortografia do texto digitadoEs_tatísticas...ScriptsRolar quando chega texto _novoE_nviar este comando:Direção da busca:Selecione se você não deseja que o tempo de conexão seja mostradoSelecione se você não deseja que o tempo de inatividade seja mostradoSelecione se você deseja que o tempo de conexão seja mostrado em horas, minutos e segundosSelecione se você deseja que o tempo de conexão seja mostrado em segundosSelecione se você deseja que o tempo de inatividade seja mostrado em horas, minutos e segundosSelecione se você deseja que o tempo de inatividade seja mostrado em segundosSelecione arquivo de logSelecione a fonte usada na janela _principal:Selecione a fonte usada na barra de _status:Selecione a fonte usada na caixa de _entrada de comandos:Selecione a fonte usada na caixa de entrada de comandosSelecione a fonte usada na janela principalSelecione a fonte usada na barra de statusSelecione esta opção se você deseja colocar no início de cada linha a data e/ou hora em que a linha foi recebida.Selecione para incluir linhas da janela principal no arquivo de logEnvia o(s) comando(s) selecionados ao mudEnvia o(s) comando(s) selecionados ao mud e fecha esta janelaEnviar esse texto _inicialmente:EnvioEnviando pedido de conexão...Enviando credenciais de autenticação ao servidor proxy..._Endereço do servidor:_Porta do servidor:SimplesEspecifique quantos comandos são mandadas de cada vezEspecifique quantas linhas são mandadas de cada vezEspecifique quantas deves esse timer deve rodar antes de ser desabilitado ou apagadoEspecifique algum texto para ser anexado ao fim de cada linha enviadaEspecifique algum texto para ser anexado ao começo de cada linha enviadaEspecifique o comando usado para iniciar um navegador webEspecifique o comando usado para reproduzir arquivos de áudio.Especifique a espera entre o envio de cada grupo de comandosEspecifique a espera entre o envio de cada grupo de linhasEspecifique o intervalo, em segundos, entre ativações do timerEspecifique o número máximo de comandos iguais que podem ser enviados em seqüênciaEspecifique o número de caracteres que devem ser digitados para iniciar a completar comandos automaticamenteEspecifique o número de comandos que são salvos e podem ser recuperados depoisEspecifique o número de linhas da saída que podem ser vistas rolando a janelaEspecifique o separador de comandos digitados na caixa de entrada de comandosCorreção ortográfica não incluída nessa versão.Começ_arEstatísticasBarra de StatusEstiloSubstituiçãoSucesso ao mover %s.TTL expirouTempTestar TriggersPor padrão, é a adicionada a data e hora, mas é possível configurar o formato com seqüências da função strftime(). Consulte o manual para uma explicação mais detalhada.A ajuda foi exibida na janela principal.O intervalo deve ser positivo.A parte númeroOs triggers serão testados com o texto digitado aqui, como se fosse uma linha recebida do MUDToda a linhaTodo o texto encontradoEntão enviar o conteúdo desse _arquivo:Há %d mundos abertos. Você deseja realmente sair?Há um mundo aberto. Você deseja realmente sair?Isso é o que seria impresso na janela principal. Se estiver vazio, a linha foi omitida. A linha pode ser diferente da original por causa de triggers reescritores.Isso é o que seria mostrado na janela principal:Este objeto pertence a um plugin. Modificações feitas nele não serão salvas no plugin.Esta versão do KildClient não tem suporte a SSL.Timer adicionado.Timer modificado.Timer número %d Nome: %s Intervalo: %.3f Número de vezes: %d Ação: %s Habilitado: %s Temporário: %s TimersEm cimaTrigger adicionado.Trigger modificado.Trigger número %d Nome: %s Padrão: %s Ação: %s Ignorar caixa: %s Omitir na tela: %s Omitir no log: %s Habilitado: %s Continuar execução: %s Reescritor: %s Mudar estilo: %s TriggersImpossível conectar ao host %s: %sImpossível conectar ao host %s: Erro #%dImpossível conectar ao host proxy %s: %sImpossível conectar ao host proxy %s: Erro #%dDesconhecidoDiretiva '%s' desconhecida no arquivo de configuração. Protocolo desconhecidoMundo sem nomeResposta do servidor proxy não foi reconhecida.Use $window->getsize() no lugar dela.Use $window->minimize() no lugar dela.Use $world->path() no lugar dela.Use %Kw para representar o nome do mundo, e %Kc para representar o nome do personagem usado no auto-logonUsar _SSLUsar fonte _negrito para cores destacadas (ao invés de apenas destacar)Barra de entrada com _múltiplas linhasUsar configurações globaisBarra de entrada com _uma única linhaUse o botão Procurar para procurar o primeiro resultado.Válido desde:VariáveisVersãoVersão %s desse plugin já está carregada.Visite http://www.kildclient.orgBranco (negrito)Aviso: Tentando enviar uma linha muito longa. Talvez uma definição recursiva de alias?Aviso: a função getwindowsize() será removida no futuro.Aviso: a função minimize() será removida no futuro.Aviso: a função path() será removida no futuro.BrancoBranco (negrito)Nome do mundo:Mundo salvo.Essa linha seria escrita no arquivo de log?Quebrar linhas na largura _máxima da telaEscrito por Eduardo M Kalinowski (eduardo@kalinowski.com.br) Amarelo (negrito)AmareloAmarelo (negrito)SimVocê pode deixar esse campo em branco, e um nome de arquivo será gerado automaticamente. Edite esse campo apenas se souber o que está fazendo.Você deve especificar o nome de uma variável.Você deve especificar a ação, a não ser que o trigger seja um gag ou altere o estilo.Você deve especificar a ação.Você deve especificar a tecla.Você deve especificar o nome.Você deve especificar a senha.Você deve especificar o padrão.Você deve especificar a substituição.Você está tentando se conectar a um host que usa SSL, mas esta versão do KildClient foi compilada sem suporte a SSL. Conectar sem SSL?[MUNDO...]_Sobre_Ação:_Adicionar_Aplicar a:Pedir confirmação _antes de apagar triggers, aliases, etc.F_undo:Preto_Cancelar_Limpar_FecharEco de _comandos:_Copiar_Copiar endereço do linkCianoA_guardar_Espera entre cada grupo de linhas/comandos:_Excluir_Desabilitar_Desabilitar as setas para navegar no histórico_Desconectar_Aparência_Não mostrar esta mensagem novamente_Não sairPara _baixoPara _baixo_Ecoar comandos enviados na janela principal_Editar_Editar..._Habilitar se o servidor propuser após a conexão_Habilitado_Evento:_Arquivo:_Finalmente, enviar esse texto:Proc_urar_Procurar:_Piscar janela quando novo texto é recebidoTe_xtoTe_xto:_Formato:Verde_Ajuda_Esconder abas se houver só um mundo aberto_Host:Tempo _Inativo:_Ignorar maiúsculas e minúsculas_Importar_Incluir as últimas_Indentar linhas quebras porMensagens _informativas:E_ntrada_Intervalo:_Itálico:_Itens para exportar_Manter janela aberta após envioC_ontinuar executando outros triggers depois de esser ser executado_Manter último comando enviado na caixa de entrada de comandos_Tecla:_Linhas para salvar no buffer de rolagem:_CarregarMagenta_ManualEnviar _múltiplas linhas..._Nome da variável a ser tornada permanente:_Nome:_Novo_Próximo_Número de comandos para salvar no histórico:_Número de linhas/comandos para enviar de uma vez:_OK_Abrir_Abrir link_Abrir..._Senha:C_olar_Padrão:Arquivo _Perl para carregar:Po_rta:_Preferências_Preferências..._Anterior_Sair_Recuperar_Reconectar_Remover_Número de vezes:Trigger _reescritor_Salvar_Selecione um mundo salvo:_Enviar_Mostrar itens definidos por plugins_Dividir janela_Parar_Salvar comandos entre sessões_Tachado:_Substituição:_Posição das abas:_Temporário (será deletado automaticamente quando o número de vezes atingir 0)_Testar triggers..._Texto para procurar:S_ublinhado:Para _cimaPara _cima_Usuário:Branco_MundoQuebrar linhas entre _palavrasAmarelo_vezes em seqüênciatipo de endereçamento não suportadoaliasalias: cancelando criação de um aliás sem patternalias: cancelando criação de alias sem substituiçãoaliasespersonagemcaracteres terem sido digitadoscomando não suportado / erro de protocolocomando(s)conexão não permitida pelo conjunto de regrasconexão recusada pelo host destinofalha geralhookhook: hook '%s' não encontrado hookshost de destino inatingívellinha(s)linhas do buffer de rolagem no logmacromacro: Não existe tal macromacrosnrede inatingívelnãopixelspedido falhou pois o identd do cliente não pode confirmar o ID de usuário no pedidopedido falhou pois o servidor identd não pode ser alcançadopedido recusado ou falhousegundos ca_dasegundossegundos ca_datimertimer: Não existe tal timertimerstriggertriggerscódigo de resposta desconhecidossimkildclient-3.0.0/po/sv.po0000644000175000017500000025445312376346024012207 00000000000000# KildClient messages in Swedish # Copyright (C) 2004-2014 Eduardo M Kalinowski, Niklas Grahn # This file is distributed under the same license as the KildClient package. # msgid "" msgstr "" "Project-Id-Version: KildClient 3.0.0\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=glib&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2014-08-17 14:59-0300\n" "PO-Revision-Date: 2014-08-17 16:22-0300\n" "Last-Translator: Niklas Grahn \n" "Language-Team: Niklas Grahn \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Swedish\n" "X-Poedit-Country: SWEDEN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/main.c:74 msgid "Outputs version information and exits" msgstr "Matar ut versionsinformation och avslutar" #: ../src/main.c:76 msgid "Directory to store settings and saved worlds" msgstr "Katalog för att lagra inställningar och sparade världar i" #: ../src/main.c:76 msgid "DIR" msgstr "KAT" #: ../src/main.c:78 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "" #: ../src/main.c:79 ../src/main.c:82 msgid "FILE" msgstr "FIL" #: ../src/main.c:81 msgid "Dumps all data received (possibly compressed) to the file" msgstr "Dumpar alla mottagna data (möjligen komprimerade) till filen" #. Parse command-line options #: ../src/main.c:120 msgid "[WORLD...]" msgstr "[VÄRLD...]" #: ../src/main.c:127 #, c-format msgid "Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" msgstr "Skrivet av Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" #: ../src/main.c:132 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "Kunde inte öppna dumpfil %s: %s\n" #: ../src/main.c:139 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "Kunde inte öppna rå dumpfil %s: %s\n" #: ../src/main.c:282 msgid "There is one open world. Do you really want to quit?" msgstr "Det finns en öppen värld. Vill du verkligen avsluta?" #: ../src/main.c:288 #, c-format msgid "There are %d open worlds. Do you really want to quit?" msgstr "Det finns %d öppna världar. Vill du verkligen avsluta?" #: ../src/main.c:291 msgid "Really Quit KildClient?" msgstr "Vill du verkligen avsluta KildClient?" #: ../src/main.c:293 msgid "_Don't quit" msgstr "Avsluta _inte" #: ../src/main.c:294 ../src/wndmain.ui:145 msgid "_Quit" msgstr "_Avsluta" #: ../src/net.c:110 msgid "" "You're attempting to connect to a world that uses SSL, but this version of " "KildClient has been built without SSL support. Try to connect without SSL?" msgstr "" "Du försöker ansluta till en värld som använder SSL, men denna version av " "KildClient har kompilerats utan SSL-stöd. Försök ansluta utan SSL?" #: ../src/net.c:111 msgid "KildClient Question" msgstr "KildClient-fråga" #: ../src/net.c:113 msgid "Connect without SSL" msgstr "Anslut utan SSL" #: ../src/net.c:114 msgid "Do not connect" msgstr "Anslut inte" #: ../src/net.c:122 msgid "This version of KildClient does not have SSL support." msgstr "Denna version av KildClient har inte SSL-stöd." #: ../src/net.c:198 ../src/proxy.c:212 #, c-format msgid "Resolving proxy host %s..." msgstr "Slår upp proxyvärd %s..." #: ../src/net.c:201 #, c-format msgid "Resolving host %s..." msgstr "Slår upp värd %s..." #: ../src/net.c:294 ../src/proxy.c:196 #, c-format msgid "Could not resolve host %s: %s" msgstr "Kunde inte slå upp värd %s: %s" #: ../src/net.c:322 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "Försöker ansluta till värd %s (%s) port %s..." #: ../src/net.c:325 #, c-format msgid "Attempting to connect to proxy host %s (%s) port %s..." msgstr "Försöker ansluta till proxyvärd %s (%s) port %s..." #: ../src/net.c:341 #, c-format msgid "Could not create socket: %s" msgstr "Kunde inte skapa sockel: %s" #: ../src/net.c:344 #, c-format msgid "Could not create socket: error #%d" msgstr "Kunde inte skapa sockel: fel #%d" #: ../src/net.c:364 #, c-format msgid "Could not connect to host %s port %s: %s" msgstr "Kunde inte ansluta till värd %s port %s: %s" #: ../src/net.c:374 #, c-format msgid "Could not connect to host %s port %s: Error #%d" msgstr "Kunde inte ansluta till värd %s port %s: Fel #%d" #: ../src/net.c:430 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Kunde inte ansluta till värd %s: %s." #: ../src/net.c:433 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Kunde inte ansluta till proxyvärd %s: %s." #: ../src/net.c:475 ../src/net.c:493 #, c-format msgid "Unable to connect to host %s: Error #%d." msgstr "Kunde inte ansluta till värd %s: Fel #%d." #: ../src/net.c:478 ../src/net.c:496 #, c-format msgid "Unable to connect to proxy host %s: Error #%d." msgstr "Kunde inte ansluta till proxyvärd %s: Fel #%d." #: ../src/net.c:532 #, c-format msgid "Performing SSL handshake..." msgstr "" #: ../src/net.c:582 #, c-format msgid "SSL Handshake failed: %s" msgstr "" #: ../src/net.c:624 #, c-format msgid "SSL Handshake took too long." msgstr "" #: ../src/net.c:653 ../src/net.c:1156 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Ansluten till värd %s (%s) port %s." #: ../src/net.c:656 ../src/net.c:1159 #, c-format msgid "Connected to host %s port %s, via proxy %s (%s) port %s." msgstr "Ansluten till värd %s port %s, via proxy %s (%s) port %s." #: ../src/net.c:663 ../src/net.c:1132 ../src/net.c:1166 msgid " SSL enabled." msgstr " SSL avktiverat." #: ../src/net.c:681 ../src/perlscript.c:3234 #, c-format msgid "Logging to file %s.\n" msgstr "Loggar till fil %s.\n" #: ../src/net.c:827 #, c-format msgid "Disconnected from host %s." msgstr "Frånkopplad från värd %s." #: ../src/net.c:900 ../src/net.c:909 #, c-format msgid "Disconnected from host %s: %s." msgstr "Frånkopplad från värd %s: %s." #: ../src/net.c:920 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "Frånkopplad från värd %s: fel #%d." #: ../src/net.c:1120 #, c-format msgid "Connected to host %s (%s) port %s, MCCP version %d enabled." msgstr "Ansluten till värd %s (%s) port %s, MCCP-version %d aktiverad." #: ../src/net.c:1124 #, c-format msgid "" "Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d " "enabled." msgstr "" "Ansluten till värd %s port %s, via proxy %s (%s) port %s, MCCP-version %d " "aktiverad." #: ../src/net.c:1242 ../src/we_logging.c:123 msgid "Not connected." msgstr "Inte ansluten." #. success #: ../src/proxy.c:60 msgid "general failure" msgstr "" #: ../src/proxy.c:61 msgid "connection not allowed by ruleset" msgstr "" #: ../src/proxy.c:62 msgid "network unreachable" msgstr "nätverk oåtkomligt" #: ../src/proxy.c:63 msgid "host unreachable" msgstr "värd oåtkomlig" #: ../src/proxy.c:64 msgid "connection refused by destination host" msgstr "anslutning vägrades av målvärd" #: ../src/proxy.c:65 msgid "TTL expired" msgstr "TTL har utgått" #: ../src/proxy.c:66 msgid "command not supported / protocol error" msgstr "kommando stöds inte / protokollfel" #: ../src/proxy.c:67 msgid "address type not supported" msgstr "adresstyp stöds inte" #: ../src/proxy.c:242 ../src/proxy.c:664 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "Ansluten till proxyserver %s port %s, skickar begäran..." #: ../src/proxy.c:297 ../src/proxy.c:426 ../src/proxy.c:471 ../src/proxy.c:545 #: ../src/proxy.c:711 msgid "Error while reading from proxy host." msgstr "" #: ../src/proxy.c:318 msgid "request rejected or failed" msgstr "begäran nekades eller misslyckades" #: ../src/proxy.c:322 msgid "request failed because identd could not be reached" msgstr "" #: ../src/proxy.c:326 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" #: ../src/proxy.c:330 ../src/proxy.c:571 ../src/proxy.c:727 #, c-format msgid "Proxy request failed: %s." msgstr "Proxybegäran misslyckades: %s." #: ../src/proxy.c:347 #, c-format msgid "Connected to proxy server %s port %s, negotiating authentication..." msgstr "Ansluten till proxyserver %s port %s, förhandlar om autentisering..." #: ../src/proxy.c:441 msgid "No acceptable proxy authentication methods." msgstr "Inga acceptabla metoder för proxyautentisering." #: ../src/proxy.c:489 msgid "Proxy authentication failed." msgstr "Proxyautentisering misslyckades." #. Should never happen #: ../src/proxy.c:532 msgid "Unrecognized response from proxy host." msgstr "Okänt svar från proxyvärd." #: ../src/proxy.c:566 msgid "unknown reason code" msgstr "" #: ../src/proxy.c:587 #, c-format msgid "Sending proxy authentication credentials..." msgstr "Skickar referenser för proxyautentisering..." #: ../src/proxy.c:626 #, c-format msgid "Sending connection request..." msgstr "Skickar anslutningsbegäran..." #: ../src/mainwindow.c:163 ../src/mainwindow.c:537 ../src/mainwindow.c:803 #: ../src/worldgui.c:1096 ../src/worldselector.c:193 ../src/worldeditor.c:180 #: ../src/we_general.c:342 ../src/we_generic_guied.c:81 #: ../src/we_triggers.c:83 ../src/we_triggers.c:553 ../src/we_triggers.c:751 #: ../src/we_aliases.c:76 ../src/we_aliases.c:455 ../src/we_macros.c:79 #: ../src/we_macros.c:420 ../src/we_timers.c:76 ../src/we_timers.c:457 #: ../src/we_hooks.c:87 ../src/we_hooks.c:620 ../src/we_vars.c:76 #: ../src/we_vars.c:368 ../src/prefs.c:107 ../src/triggers.c:278 #: ../src/multilinesend.c:93 ../src/cmdhistory.c:209 ../src/cmdhistory.c:454 #, fuzzy, c-format msgid "Error loading UI from XML file: %s" msgstr "Fel i filen för insticksmodul: %s" #: ../src/mainwindow.c:596 ../src/mainwindow.c:597 msgid "Not connected" msgstr "Inte ansluten" #: ../src/mainwindow.c:739 msgid ": Not yet active" msgstr ": Inte ännu aktiv" #: ../src/mainwindow.c:744 msgid ": Expired" msgstr ": Utgått" #: ../src/mainwindow.c:758 ../src/kildclient.ui:1995 #: ../src/dlgStatistics.ui:104 ../src/dlgStatistics.ui:337 msgid "None" msgstr "Ingen" #: ../src/worldgui.c:220 msgid "_Find:" msgstr "_Sök:" #: ../src/worldgui.c:234 msgid "Find Next" msgstr "Sök nästa" #: ../src/worldgui.c:261 msgid "Click to clear the command input area." msgstr "Klicka för att tömma kommandoinmatningsrutan." #: ../src/worldgui.c:360 msgid "No world" msgstr "Ingen värld" #: ../src/worldgui.c:430 msgid "KildClient ready" msgstr "KildClient redo" #: ../src/worldgui.c:437 msgid "0 lines" msgstr "0 rader" #: ../src/worldgui.c:890 msgid "Are you sure you want to close this world?" msgstr "Är du säker på att du vill stänga denna värld?" #: ../src/worldgui.c:891 msgid "Really close?" msgstr "Vill du verkligen stänga?" #: ../src/worldgui.c:893 msgid "Keep _open" msgstr "Behåll _öppen" #: ../src/worldgui.c:894 ../src/worldselector.c:816 ../src/worldselector.c:822 #: ../src/wndmain.ui:72 ../src/dlgPreferences.ui:136 #: ../src/dlgTestTriggers.ui:23 ../src/dlgCmdHistory.ui:197 msgid "_Close" msgstr "S_täng" #: ../src/worldgui.c:1025 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Fel uppstod vid inställning av stavningskontrollerare: %s\n" #: ../src/worldgui.c:1029 msgid "Spell checking support not included in this build." msgstr "Stöd för stavningskontroll är inte inkluderat i denna version." #: ../src/worldgui.c:1275 msgid "Click to open link; right-click for more options." msgstr "Klicka för att öppna länk; högerklicka för fler alternativ." #: ../src/worldgui.c:1437 msgid "Not found" msgstr "Hittades inte" #: ../src/ansitextview.c:423 msgid "1 line" msgstr "1 rad" #: ../src/ansitextview.c:425 #, c-format msgid "%d lines" msgstr "%d rader" #: ../src/worldselector.c:138 ../src/worldselector.c:689 #, c-format msgid "Could not load world from file '%s': %s" msgstr "Kunde inte läsa in värld från fil '%s': %s" #: ../src/worldselector.c:141 ../src/worldselector.c:692 ../src/worlds.c:2370 #: ../src/we_generic_guied.c:315 ../src/we_generic_guied.c:404 #: ../src/prefs.c:448 ../src/prefs.c:527 msgid "KildClient Error" msgstr "KildClient-fel" #: ../src/worldselector.c:494 #, c-format msgid "Could not open world '%s': %s\n" msgstr "Kunde inte öppna värld '%s': %s\n" #: ../src/worldselector.c:537 #, fuzzy, c-format msgid "Invalid argument '%s'\n" msgstr "Ogiltigt attribut '%s' för element '%s'" #: ../src/worldselector.c:810 msgid "Disconnected" msgstr "Frånkopplad" #: ../src/worldselector.c:813 ../src/worldselector.c:820 msgid "Reconnect" msgstr "Återanslut" #: ../src/worldselector.c:814 ../src/worldselector.c:821 msgid "Connect to another world" msgstr "Anslut till en annan värld" #: ../src/worldselector.c:815 msgid "Offline" msgstr "Frånkopplad" #: ../src/worlds.c:776 msgid "Unnamed world" msgstr "Namnlös värld" #: ../src/worlds.c:833 #, c-format msgid "Could not open file: %s" msgstr "Kunde inte öppna fil: %s" #: ../src/worlds.c:896 #, fuzzy, c-format msgid "Invalid top-level element '%s'" msgstr "Ogiltigt attribut '%s' för element '%s'" #: ../src/worlds.c:1710 #, c-format msgid "Internal error: element '%s' ends when in START mode" msgstr "Internt fel: element '%s' slutar i START-läge" #: ../src/worlds.c:1984 #, c-format msgid "Invalid key code '%s'" msgstr "" #: ../src/worlds.c:2003 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "Element '%s' är inte tillåtet inuti element '%s'" #: ../src/worlds.c:2016 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "Ogiltigt attribut '%s' för element '%s'" #: ../src/worlds.c:2367 ../src/we_generic_guied.c:312 ../src/prefs.c:445 #, c-format msgid "Could not open file '%s': %s" msgstr "Kunde inte öppna fil '%s: %s" #: ../src/worlds.c:2528 #, c-format msgid "Disconnected from world %s" msgstr "Frånkopplad från värld %s" #: ../src/worldeditor.c:245 msgid "General" msgstr "Allmänt" #: ../src/worldeditor.c:253 ../src/worldeditor.c:257 msgid "Display" msgstr "Skärm" #: ../src/worldeditor.c:254 msgid "Here you can set options to configure the appearance of KildClient." msgstr "" "Här kan du justera inställningar för att konfigurera KildClients utseende." #: ../src/worldeditor.c:265 msgid "Main Window" msgstr "Huvudfönster" #: ../src/worldeditor.c:273 msgid "Colors" msgstr "Färger" #: ../src/worldeditor.c:281 msgid "Status Bar" msgstr "Statusmätare" #: ../src/worldeditor.c:289 msgid "Input" msgstr "Inmatning" #: ../src/worldeditor.c:297 msgid "Logging" msgstr "Loggning" #: ../src/worldeditor.c:303 ../src/worldeditor.c:307 msgid "Automation" msgstr "Automatisering" #: ../src/worldeditor.c:304 msgid "" "Here you can set options to configure the automation features of KildClient, " "such as triggers, aliases, plugins, etc." msgstr "" "Här kan du justera inställningar för att konfigurera KildClients " "automatiserande funktioner så som triggers, alias, insticksmoduler etcetera." #: ../src/worldeditor.c:315 msgid "Scripting" msgstr "Skriptning" #: ../src/worldeditor.c:323 msgid "Plugins" msgstr "Insticksmoduler" #: ../src/worldeditor.c:334 ../src/kildclient.ui:1556 msgid "Triggers" msgstr "" #: ../src/worldeditor.c:345 ../src/kildclient.ui:1571 msgid "Aliases" msgstr "Alias" #: ../src/worldeditor.c:356 ../src/kildclient.ui:1586 msgid "Macros" msgstr "Makrotar" #: ../src/worldeditor.c:367 ../src/kildclient.ui:1601 msgid "Timers" msgstr "Tidur" #: ../src/worldeditor.c:378 msgid "Hooks" msgstr "" #: ../src/worldeditor.c:389 msgid "Variables" msgstr "Variabler" #: ../src/worldeditor.c:398 msgid "Protocols" msgstr "Protokoll" #: ../src/worldeditor.c:406 msgid "Miscellaneous" msgstr "Diverse" #: ../src/worldeditor.c:414 msgid "Advanced" msgstr "Avancerat" #: ../src/we_general.c:73 msgid "Character" msgstr "Karaktär" #: ../src/we_general.c:81 msgid "Password" msgstr "Lösenord" #: ../src/we_general.c:381 msgid "You must specify the name." msgstr "Du måste ange namnet." #: ../src/we_general.c:382 ../src/we_general.c:395 ../src/we_triggers.c:636 #: ../src/we_triggers.c:650 ../src/we_aliases.c:517 ../src/we_aliases.c:530 #: ../src/we_macros.c:477 ../src/we_macros.c:490 ../src/we_macros.c:503 #: ../src/we_timers.c:516 ../src/we_timers.c:529 ../src/we_hooks.c:672 #: ../src/we_vars.c:396 ../src/we_vars.c:408 ../src/we_vars.c:428 #: ../src/permanentvariables.c:129 ../src/cmdhistory.c:278 #: ../src/cmdhistory.c:290 ../src/cmdhistory.c:484 ../src/cmdhistory.c:517 #: ../src/cmdhistory.c:574 msgid "KildClient Warning" msgstr "KildClient-varning" #: ../src/we_general.c:394 msgid "You must specify the password." msgstr "Du måste ange lösenordet." #: ../src/we_general.c:436 msgid "character" msgstr "karaktär" #: ../src/we_logging.c:112 #, c-format msgid "Logging to file %s." msgstr "Loggar till filen %s." #: ../src/we_logging.c:118 msgid "Logging is disabled." msgstr "Loggning är inaktiverad." #: ../src/we_logging.c:215 msgid "Logging not started" msgstr "Loggning har inte startat" #: ../src/we_logging.c:245 msgid "Select log file" msgstr "Markera loggfil" #: ../src/we_logging.c:248 ../src/we_plugins.c:584 #: ../src/we_generic_guied.c:97 ../src/we_generic_guied.c:369 #: ../src/kildclient.ui:40 ../src/kildclient.ui:516 ../src/kildclient.ui:580 #: ../src/kildclient.ui:711 ../src/kildclient.ui:908 ../src/kildclient.ui:1125 #: ../src/kildclient.ui:1449 ../src/kildclient.ui:2170 #: ../src/dlgSelectWorld.ui:25 ../src/dlgEditWorld.ui:114 #: ../src/dlgMLSend.ui:36 ../src/dlgCmdHistory.ui:352 msgid "_Cancel" msgstr "_Avbryt" #: ../src/we_logging.c:250 ../src/kildclient.ui:55 ../src/kildclient.ui:531 #: ../src/kildclient.ui:595 ../src/kildclient.ui:726 ../src/kildclient.ui:923 #: ../src/kildclient.ui:1140 ../src/kildclient.ui:1464 #: ../src/kildclient.ui:2185 ../src/dlgStatistics.ui:22 #: ../src/dlgEditWorld.ui:129 ../src/dlgCmdHistory.ui:367 msgid "_OK" msgstr "_OK" #: ../src/we_plugins.c:124 ../src/we_plugins.c:341 ../src/we_triggers.c:225 #: ../src/we_aliases.c:206 ../src/we_macros.c:209 ../src/we_timers.c:206 #: ../src/we_hooks.c:341 ../src/perlscript.c:3356 msgid "Name" msgstr "Namn" #: ../src/we_plugins.c:136 ../src/we_plugins.c:383 ../src/perlscript.c:3357 msgid "Description" msgstr "Beskrivning" #: ../src/we_plugins.c:148 ../src/we_plugins.c:369 msgid "Author" msgstr "Upphovsman" #: ../src/we_plugins.c:161 msgid "File" msgstr "Fil" #: ../src/we_plugins.c:209 ../src/we_plugins.c:466 msgid "Error Loading Plugin" msgstr "Fel vid inläsning av insticksmodul" #: ../src/we_plugins.c:327 ../src/we_triggers.c:211 ../src/we_aliases.c:192 #: ../src/we_macros.c:195 ../src/we_timers.c:192 ../src/we_hooks.c:327 msgid "Enabled" msgstr "Aktiverat(d)" #: ../src/we_plugins.c:355 msgid "Version" msgstr "Version" #: ../src/we_plugins.c:444 msgid "Always load this plugin at _startup" msgstr "Läs alltid in denna insticksmodul vid _uppstart" #: ../src/we_plugins.c:507 msgid "The help is displayed in main window." msgstr "Hjälpen visas i huvudfönstret." #: ../src/we_plugins.c:508 msgid "KildClient Information" msgstr "KildClient-information" #: ../src/we_plugins.c:509 msgid "_Do not display this message again" msgstr "_Visa inte detta meddelande igen" #: ../src/we_plugins.c:581 msgid "Load plugin" msgstr "Läs in insticksmodul" #: ../src/we_plugins.c:586 ../src/we_generic_guied.c:371 msgid "_Open" msgstr "_Öppna" #: ../src/we_generic_guied.c:94 msgid "Export" msgstr "Exportera" #: ../src/we_generic_guied.c:99 ../src/wndmain.ui:97 msgid "_Save" msgstr "_Spara" #: ../src/we_generic_guied.c:366 msgid "Import" msgstr "Importera" #: ../src/we_generic_guied.c:401 #, c-format msgid "Could not import file '%s': %s" msgstr "Kunde inte importera fil '%s': %s" #: ../src/we_generic_guied.c:960 #, c-format msgid "Do you really want to delete the %s?" msgstr "Vill du verkligen ta bort filen %s?" #: ../src/we_generic_guied.c:967 #, c-format msgid "Do you really want to delete %d %s?" msgstr "Vill du verkligen ta bort %d %s?" #: ../src/we_generic_guied.c:971 ../src/we_vars.c:288 msgid "Confirm deletion" msgstr "Bekräfta borttagelse" #: ../src/we_generic_guied.c:973 msgid "Do not delete" msgstr "Ta inte bort" #: ../src/we_generic_guied.c:974 msgid "Delete" msgstr "Ta bort" #: ../src/we_triggers.c:130 ../src/dlgTestTriggers.ui:8 msgid "Test Triggers" msgstr "" #: ../src/we_triggers.c:239 ../src/we_aliases.c:220 ../src/triggers.c:141 #: ../src/aliases.c:177 msgid "Pattern" msgstr "Mönster" #: ../src/we_triggers.c:257 ../src/we_aliases.c:238 msgid "I. Case" msgstr "" #: ../src/we_triggers.c:271 ../src/we_macros.c:237 ../src/we_timers.c:246 #: ../src/we_hooks.c:355 ../src/triggers.c:142 ../src/macros.c:145 #: ../src/timers.c:203 msgid "Action" msgstr "Åtgärd" #: ../src/we_triggers.c:289 msgid "Gag" msgstr "" #: ../src/we_triggers.c:307 msgid "Gag Log" msgstr "" #: ../src/we_triggers.c:325 msgid "Keep Exec" msgstr "" #: ../src/we_triggers.c:343 msgid "Rewriter" msgstr "" #: ../src/we_triggers.c:361 msgid "Style" msgstr "Stil" #: ../src/we_triggers.c:375 ../src/we_aliases.c:284 ../src/we_macros.c:251 #: ../src/we_timers.c:278 ../src/we_hooks.c:369 msgid "Plugin" msgstr "Insticksmodul" #: ../src/we_triggers.c:471 ../share/kildclient.pl:233 #: ../share/kildclient.pl:236 ../share/kildclient.pl:443 #: ../share/kildclient.pl:518 ../share/kildclient.pl:821 msgid "trigger" msgstr "" #: ../src/we_triggers.c:471 ../share/kildclient.pl:443 msgid "triggers" msgstr "" #: ../src/we_triggers.c:635 ../src/we_aliases.c:516 msgid "You must specify the pattern." msgstr "Du måste ange mönstret." #: ../src/we_triggers.c:649 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" #: ../src/we_aliases.c:252 ../src/aliases.c:178 msgid "Substitution" msgstr "" #: ../src/we_aliases.c:270 msgid "Eval as Perl" msgstr "Eval som Perl" #: ../src/we_aliases.c:380 ../share/kildclient.pl:246 #: ../share/kildclient.pl:249 ../share/kildclient.pl:449 #: ../share/kildclient.pl:524 ../share/kildclient.pl:833 msgid "alias" msgstr "alias" #: ../src/we_aliases.c:380 ../share/kildclient.pl:449 msgid "aliases" msgstr "alias" #: ../src/we_aliases.c:529 msgid "You must specify the substitution." msgstr "" #: ../src/we_macros.c:223 ../src/macros.c:144 msgid "Key" msgstr "Tangent" #: ../src/we_macros.c:347 ../share/kildclient.pl:259 #: ../share/kildclient.pl:262 ../share/kildclient.pl:455 #: ../share/kildclient.pl:530 ../share/kildclient.pl:845 msgid "macro" msgstr "makro" #: ../src/we_macros.c:347 ../share/kildclient.pl:455 msgid "macros" msgstr "makrotar" #: ../src/we_macros.c:476 msgid "You must specify the key." msgstr "Du måste ange tangenten." #: ../src/we_macros.c:489 msgid "Invalid key code." msgstr "" #: ../src/we_macros.c:502 ../src/we_timers.c:528 ../src/we_hooks.c:671 msgid "You must specify the action." msgstr "Du måste ange åtgärden." #: ../src/we_timers.c:219 msgid "Interval" msgstr "Intervall" #: ../src/we_timers.c:232 msgid "Count" msgstr "Antal" #: ../src/we_timers.c:264 msgid "Temp" msgstr "" #: ../src/we_timers.c:381 ../share/kildclient.pl:272 #: ../share/kildclient.pl:275 ../share/kildclient.pl:461 #: ../share/kildclient.pl:536 ../share/kildclient.pl:857 msgid "timer" msgstr "tidur" #: ../src/we_timers.c:381 ../share/kildclient.pl:461 msgid "timers" msgstr "tidur" #: ../src/we_timers.c:515 msgid "The interval must be positive." msgstr "Intervallet måste vara positivt." #. The manually added combo for selecting which hook #: ../src/we_hooks.c:130 msgid "_Event:" msgstr "_Händelse:" #: ../src/we_hooks.c:547 ../share/kildclient.pl:286 ../share/kildclient.pl:289 #: ../share/kildclient.pl:467 ../share/kildclient.pl:543 #: ../share/kildclient.pl:870 msgid "hook" msgstr "" #: ../src/we_hooks.c:547 ../share/kildclient.pl:467 msgid "hooks" msgstr "" #: ../src/we_vars.c:279 msgid "Do you really want to make the variable temporary?" msgstr "Vill du verkligen göra variabeln temporär?" #: ../src/we_vars.c:285 #, c-format msgid "Do you really want to make %d variables temporary?" msgstr "Vill du verkligen göra %d variabler temporära?" #: ../src/we_vars.c:290 msgid "Keep permanent" msgstr "Behåll permanent" #: ../src/we_vars.c:291 msgid "Make temporary" msgstr "Gör temporär" #: ../src/we_vars.c:395 msgid "You must specify a variable name." msgstr "Du måste ange ett namn på variabeln." #: ../src/we_vars.c:407 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "" #: ../src/we_vars.c:426 #, c-format msgid "%s is already permanent." msgstr "%s är redan permanent." #: ../src/prefs.c:398 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "Ogiltig angivelse för fönsterstorlek i konfigurationsfil.\n" #: ../src/prefs.c:418 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "Okänd katalog '%s' i konfigurationsfil.\n" #: ../src/prefs.c:524 #, c-format msgid "Could not create directory '%s': %s" msgstr "Kunde inte skapa katalog '%s': %s" #: ../src/parser.c:210 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "" #: ../src/triggers.c:140 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" #: ../src/triggers.c:162 ../src/triggers.c:163 ../src/triggers.c:164 #: ../src/triggers.c:165 ../src/triggers.c:166 ../src/triggers.c:167 #: ../src/triggers.c:168 ../src/aliases.c:198 ../src/aliases.c:199 #: ../src/aliases.c:200 ../src/macros.c:167 ../src/timers.c:226 #: ../src/timers.c:227 ../src/hooks.c:206 ../src/perlscript.c:3376 msgid "y" msgstr "j" #: ../src/triggers.c:162 ../src/triggers.c:163 ../src/triggers.c:164 #: ../src/triggers.c:165 ../src/triggers.c:166 ../src/triggers.c:167 #: ../src/triggers.c:168 ../src/aliases.c:198 ../src/aliases.c:199 #: ../src/aliases.c:200 ../src/macros.c:167 ../src/timers.c:226 #: ../src/timers.c:227 ../src/hooks.c:206 ../src/perlscript.c:3376 msgid "n" msgstr "n" #: ../src/triggers.c:361 ../src/kildclient.ui:1978 ../src/kildclient.ui:2015 msgid "No" msgstr "Nej" #: ../src/triggers.c:361 ../src/kildclient.ui:1981 ../src/kildclient.ui:2018 msgid "Yes" msgstr "Ja" #: ../src/aliases.c:176 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "Num Eval Ena IgC %-*.*s %-*.*s\n" #: ../src/macros.c:143 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "Num Ena %-*.*s %-*.*s\n" #: ../src/timers.c:195 msgid "Num Ena Temp Int " msgstr "" #: ../src/timers.c:199 msgid "Count " msgstr "Antal" #: ../src/permanentvariables.c:125 #, c-format msgid "" "Could not open file '%s': %s\n" "Variables were not saved." msgstr "" "Kunde inte öppna fil '%s': %s\n" "Variabler sparades inte." #: ../src/hooks.c:60 #, c-format msgid "hook: hook '%s' not found\n" msgstr "hook: hook '%s' hittades inte\n" #: ../src/hooks.c:76 ../src/hooks.c:229 msgid "No such hook" msgstr "" #: ../src/hooks.c:178 ../src/hooks.c:224 msgid "Hook not found" msgstr "" #: ../src/hooks.c:191 #, c-format msgid "Hooks for '%s':\n" msgstr "Hooks for '%s':\n" #: ../src/hooks.c:192 msgid "Num Ena Action" msgstr "" #: ../src/hooks.c:234 #, c-format msgid "" "Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Hook number %d for event %s\n" " Namn: %s\n" " Åtgärd: %s\n" " Aktiverat: %s\n" #: ../src/hooks.c:240 ../src/perlscript.c:1691 ../src/perlscript.c:2191 #: ../src/perlscript.c:2501 ../src/perlscript.c:2790 msgid "Not set" msgstr "Inte inställt" #: ../src/hooks.c:242 ../src/perlscript.c:1694 ../src/perlscript.c:1695 #: ../src/perlscript.c:1696 ../src/perlscript.c:1697 ../src/perlscript.c:1698 #: ../src/perlscript.c:1699 ../src/perlscript.c:1700 ../src/perlscript.c:2194 #: ../src/perlscript.c:2195 ../src/perlscript.c:2196 ../src/perlscript.c:2504 #: ../src/perlscript.c:2794 ../src/perlscript.c:2795 ../src/perlscript.c:3414 msgid "yes" msgstr "ja" #: ../src/hooks.c:242 ../src/perlscript.c:1694 ../src/perlscript.c:1695 #: ../src/perlscript.c:1696 ../src/perlscript.c:1697 ../src/perlscript.c:1698 #: ../src/perlscript.c:1699 ../src/perlscript.c:1700 ../src/perlscript.c:2194 #: ../src/perlscript.c:2195 ../src/perlscript.c:2196 ../src/perlscript.c:2504 #: ../src/perlscript.c:2794 ../src/perlscript.c:2795 ../src/perlscript.c:3414 msgid "no" msgstr "nej" #: ../src/log.c:105 msgid "File name not specified." msgstr "Filnamnet är inte angivet." #: ../src/log.c:171 #, c-format msgid "Could not open log file: %s." msgstr "Kunde inte öppna loggfil: %s." #: ../src/plugins.c:102 ../src/plugins.c:161 #, c-format msgid "Failed loading file %s: %s" msgstr "Misslyckades med att läsa in fil %s: %s" #: ../src/cmdhistory.c:277 msgid "No command selected." msgstr "Inget kommando markerat." #: ../src/cmdhistory.c:289 msgid "More than one command selected." msgstr "Fler än ett kommando markerat." #: ../src/cmdhistory.c:483 msgid "Enter some text to search for." msgstr "Skriv in lite text att söka efter." #: ../src/cmdhistory.c:516 msgid "Use the Find button to find the first result." msgstr "Använd sök-knappen för att hitta det första resultatet." #: ../src/cmdhistory.c:573 msgid "Command not found." msgstr "Kommando hittades inte." #: ../src/perlscript.c:506 ../src/perlscript.c:512 ../src/perlscript.c:519 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "" #: ../src/perlscript.c:673 ../src/perlscript.c:690 ../src/perlscript.c:752 #: ../src/perlscript.c:785 ../src/perlscript.c:1186 ../src/perlscript.c:1211 #: ../src/perlscript.c:1312 ../src/perlscript.c:1332 ../src/perlscript.c:1355 #: ../src/perlscript.c:1383 ../src/perlscript.c:1392 ../src/perlscript.c:1932 #: ../src/perlscript.c:1941 ../src/perlscript.c:2120 ../src/perlscript.c:2291 #: ../src/perlscript.c:2300 ../src/perlscript.c:2580 ../src/perlscript.c:2589 #: ../src/perlscript.c:2865 ../src/perlscript.c:2919 ../src/perlscript.c:2964 #: ../src/perlscript.c:3029 ../src/perlscript.c:3040 ../src/perlscript.c:3132 #: ../src/perlscript.c:3463 ../src/kcwin.c:96 #, c-format msgid "%s: Too few arguments" msgstr "%s: För få argument" #: ../src/perlscript.c:718 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: Argumentet måste vara numeriskt" #: ../src/perlscript.c:766 ../src/perlscript.c:798 #, c-format msgid "%s: No such world" msgstr "%s: Ingen sådan värld" #: ../src/perlscript.c:833 msgid "World saved." msgstr "Värld sparad." #: ../src/perlscript.c:1082 ../src/perlscript.c:1097 ../src/perlscript.c:1107 #: ../src/perlscript.c:1268 ../share/kildclient.pl:1303 #, c-format, perl-format msgid "%s: This is an internal function, do not call directly." msgstr "" #: ../src/perlscript.c:1086 ../src/perlscript.c:1514 ../src/perlscript.c:2043 #: ../src/perlscript.c:2416 ../src/perlscript.c:2611 ../src/perlscript.c:3093 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Fel argumentstyp" #: ../src/perlscript.c:1278 ../src/perlscript.c:1284 #, fuzzy, c-format msgid "Protocol %s not enabled." msgstr "Insticksmodul aktiverad." #: ../src/perlscript.c:1289 ../share/kildclient.pl:1151 #, fuzzy msgid "Unknown protocol" msgstr "Okänd" #: ../src/perlscript.c:1406 ../src/perlscript.c:1674 msgid "No such trigger" msgstr "" #: ../src/perlscript.c:1424 ../src/perlscript.c:1973 ../src/perlscript.c:2345 #: ../src/perlscript.c:3052 #, c-format msgid "%s: Too many string arguments" msgstr "" #: ../src/perlscript.c:1447 ../src/perlscript.c:1996 #, c-format msgid "%s: pattern given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:1459 ../src/perlscript.c:2394 ../src/perlscript.c:3072 #, c-format msgid "%s: action given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:1505 ../src/perlscript.c:2034 ../src/perlscript.c:2407 #: ../src/perlscript.c:3085 #, c-format msgid "%s: Wrong type of reference" msgstr "%s: Fel referenstyp" #: ../src/perlscript.c:1525 #, c-format msgid "%s: pattern not specified, not creating" msgstr "%s: mönstret är inte angivet, skapar inte" #: ../src/perlscript.c:1534 #, c-format msgid "%s: action not specified, and isn't gag, not creating" msgstr "" #: ../src/perlscript.c:1563 msgid "Trigger added." msgstr "" #: ../src/perlscript.c:1568 msgid "Trigger modified." msgstr "" #: ../src/perlscript.c:1593 #, c-format msgid "%s: invalid target" msgstr "%s: ogiltigt mål" #: ../src/perlscript.c:1603 #, c-format msgid "%s: invalid fg color" msgstr "%s: ogiltig förgrundsfärg" #: ../src/perlscript.c:1613 #, c-format msgid "%s: invalid bg color" msgstr "%s: ogiltig bakgrundsfärg" #: ../src/perlscript.c:1623 #, c-format msgid "%s: invalid underline style" msgstr "%s: ogiltig understreckstil" #: ../src/perlscript.c:1679 #, c-format msgid "" "Trigger number %d\n" " Name: %s\n" " Pattern: %s\n" " Action: %s\n" " Enabled: %s\n" " Ignore case: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Keep executing: %s\n" " Rewriter: %s\n" " Change style: %s\n" msgstr "" "Trigger number %d\n" " Namn: %s\n" " Mönster: %s\n" " Åtgärd: %s\n" " Aktiverat: %s\n" " Ignorera skiftläge: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Fortsätt verkställa: %s\n" " Rewriter: %s\n" " Byt stil: %s\n" #: ../src/perlscript.c:1703 #, c-format msgid "" " Target: %d\n" " Foreground: %d\n" " Background: %d\n" " Italics: %d\n" " Striked-thru: %d\n" " Underline: %d\n" msgstr "" " Mål: %d\n" " Förgrund: %d\n" " Bakgrund: %d\n" " Kursiv: %d\n" " Genomstrykning: %d\n" " Understreck: %d\n" #: ../src/perlscript.c:1955 ../src/perlscript.c:2178 msgid "No such alias" msgstr "Inget sådant alias" #: ../src/perlscript.c:2008 #, c-format msgid "%s: substitution given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:2054 msgid "alias: not creating alias without pattern" msgstr "alias: skapar inte alias utan mönster" #: ../src/perlscript.c:2062 msgid "alias: not creating alias without substitution" msgstr "" #: ../src/perlscript.c:2090 msgid "Alias added." msgstr "Alias tillagt." #: ../src/perlscript.c:2095 msgid "Alias modified." msgstr "Alias modifierat." #: ../src/perlscript.c:2183 #, c-format msgid "" "Alias number %d\n" " Name: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Ignore case: %s\n" " Eval as Perl: %s\n" " Enabled: %s\n" msgstr "" "Aliasnummer %d\n" " Namn: %s\n" " Mönster: %s\n" " Substitution: %s\n" " Ignorera skiftläge: %s\n" " Eval som Perl: %s\n" " Aktiverat: %s\n" #: ../src/perlscript.c:2263 msgid "Press a key to get its keycode." msgstr "" #: ../src/perlscript.c:2315 msgid "macro: No such macro" msgstr "makro: Inget sådant makro" #: ../src/perlscript.c:2334 ../src/perlscript.c:2382 #, c-format msgid "%s: Invalid key code" msgstr "" #: ../src/perlscript.c:2371 #, c-format msgid "%s: keycode given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:2427 #, c-format msgid "%s: keycode not specified, not creating" msgstr "" #: ../src/perlscript.c:2434 ../src/perlscript.c:2702 #, c-format msgid "%s: action not specified, not creating" msgstr "%s: åtgärden är inte angiven, skapar inte" #: ../src/perlscript.c:2453 msgid "Macro added." msgstr "Makro tillagt." #: ../src/perlscript.c:2458 msgid "Macro modified." msgstr "Makro modifierat." #: ../src/perlscript.c:2489 msgid "No such macro" msgstr "Inget sådant makro" #: ../src/perlscript.c:2495 #, c-format msgid "" "Macro number %d\n" " Name: %s\n" " Key Code: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Makronummer %d\n" " Namn: %s\n" " Key Code: %s\n" " Åtgärd: %s\n" " Aktiverat: %s\n" #: ../src/perlscript.c:2605 msgid "timer: No such timer" msgstr "tidur: Inget sådant tidur" #: ../src/perlscript.c:2630 #, c-format msgid "%s: interval must be numeric" msgstr "%s: intervall måste vara numeriskt" #: ../src/perlscript.c:2643 #, c-format msgid "%s: count must be numeric" msgstr "%s: antal måste vara numeriskt" #: ../src/perlscript.c:2674 #, c-format msgid "%s: interval not specified, not creating" msgstr "%s: intervallet är inte angivet, skapar inte" #: ../src/perlscript.c:2681 #, c-format msgid "%s: cannot create timer with negative interval" msgstr "" #: ../src/perlscript.c:2742 msgid "Timer added." msgstr "Tidur tillaggt." #: ../src/perlscript.c:2747 msgid "Timer modified." msgstr "Tidur modifierat." #: ../src/perlscript.c:2777 msgid "No such timer" msgstr "Inget sådant tidur" #: ../src/perlscript.c:2782 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %.3f\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" "Tidursnummer %d\n" " Namn: %s\n" " Intervall: %.3f\n" " Antal upprepningar: %d\n" " Åtgärd: %s\n" " Aktiverat: %s\n" " Temporärt: %s\n" #: ../src/perlscript.c:2873 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" #: ../src/perlscript.c:2882 #, c-format msgid "%s: %s is already permanent" msgstr "%s: %s är redan permanent" #: ../src/perlscript.c:2896 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "%s: Variabel '%s' gjord permanent.\n" #: ../src/perlscript.c:2938 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "%s: Variabel '%s' gjord temporär.\n" #: ../src/perlscript.c:2942 #, c-format msgid "%s: %s is not permanent" msgstr "%s: %s är inte permanent" #: ../src/perlscript.c:2995 msgid "Permanent variables" msgstr "Permanenta variabler" #: ../src/perlscript.c:3107 msgid "Hook defined." msgstr "" #: ../src/perlscript.c:3111 msgid "Hook modified." msgstr "" #: ../src/perlscript.c:3217 msgid "Logging stopped." msgstr "Loggning stoppad." #: ../src/perlscript.c:3355 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "Num Ena %-*.*s Version %-*.*s\n" #: ../src/perlscript.c:3398 msgid "No such plugin" msgstr "Ingen sådan insticksmodul" #: ../src/perlscript.c:3403 #, c-format msgid "" "Plugin number %d\n" " Name: %s\n" " Version: %s\n" " Description: %s\n" " Author: %s\n" " Enabled: %s\n" msgstr "" "Insticksmodulsnummer %d\n" " Namn: %s\n" " Version: %s\n" " Beskrivning: %s\n" " Upphovsman: %s\n" " Aktiverad: %s\n" #: ../src/kildclient.ui:21 msgid "Edit Timer" msgstr "Redigera tidur" #: ../src/kildclient.ui:88 ../src/kildclient.ui:351 ../src/kildclient.ui:628 #: ../src/kildclient.ui:783 ../src/kildclient.ui:956 ../src/kildclient.ui:1173 #: ../src/dlgEditWorld.ui:240 ../src/dlgEditWorld.ui:3498 msgid "_Name:" msgstr "_Namn:" #: ../src/kildclient.ui:100 msgid "Enter optionally a descriptive name for the timer" msgstr "Skriv in, om du vill, ett beskrivande namn för tiduret" #: ../src/kildclient.ui:114 msgid "_Interval:" msgstr "_Intervall:" #: ../src/kildclient.ui:132 msgid "Specify the interval, in seconds, between timer activations" msgstr "Ange intervallet, i sekunder, mellan tidursaktiveringar" #: ../src/kildclient.ui:150 msgid "seconds" msgstr "sekund(er)" #: ../src/kildclient.ui:169 msgid "_Repeat count:" msgstr "_Antal upprepningar:" #: ../src/kildclient.ui:187 msgid "" "Specify how many times this timer should run before being disabled or deleted" msgstr "" "Ange hur många gånger detta tidur bör köras innan det inaktiveras eller tas " "bort" #: ../src/kildclient.ui:204 msgid "(-1 to repeat indefinitely)" msgstr "" #: ../src/kildclient.ui:223 ../src/kildclient.ui:809 ../src/kildclient.ui:1021 #: ../src/kildclient.ui:1238 msgid "_Action:" msgstr "_Åtgärd:" #: ../src/kildclient.ui:235 msgid "Enter the action to be executed whenever the timer fires" msgstr "" #: ../src/kildclient.ui:245 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "" "_Temporärt (kommer att tas bort automatiskt när dess antal upprepningar når " "noll)" #: ../src/kildclient.ui:249 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" "Markera för att ta bort tiduret efter att dess antal upprepningar nått noll" #: ../src/kildclient.ui:262 ../src/kildclient.ui:457 ../src/kildclient.ui:831 #: ../src/kildclient.ui:1043 ../src/kildclient.ui:1373 msgid "_Enabled" msgstr "_Aktiverat(d)" #: ../src/kildclient.ui:266 msgid "Check to make the timer enabled; only enabled timers are run" msgstr "Markera för att aktivera tiduret; bara aktiverade tidur körs" #: ../src/kildclient.ui:282 ../src/kildclient.ui:477 ../src/kildclient.ui:851 #: ../src/kildclient.ui:1063 ../src/kildclient.ui:1393 msgid "Note:" msgstr "Observera:" #: ../src/kildclient.ui:295 ../src/kildclient.ui:490 ../src/kildclient.ui:864 #: ../src/kildclient.ui:1076 ../src/kildclient.ui:1406 msgid "" "This object belongs to a plugin. Changes made here will not be saved " "in the plugin." msgstr "" "Detta objekt tillhör en insticksmodul. Ändringar gjorda här kommer inte att sparas i insticksmodulen." #: ../src/kildclient.ui:327 msgid "Edit Alias" msgstr "Redigera alias" #: ../src/kildclient.ui:363 msgid "Enter optionally a descriptive name for the alias" msgstr "Skriv in, om du vill, ett beskrivande namn för alias" #: ../src/kildclient.ui:377 ../src/kildclient.ui:1198 msgid "_Pattern:" msgstr "_Mönster:" #: ../src/kildclient.ui:389 msgid "Enter the pattern to match against typed commands" msgstr "" #: ../src/kildclient.ui:399 ../src/kildclient.ui:1220 msgid "_Ignore case when matching" msgstr "" #: ../src/kildclient.ui:417 msgid "_Substitution:" msgstr "" #: ../src/kildclient.ui:430 msgid "Enter the substitution to be executed" msgstr "" #: ../src/kildclient.ui:440 msgid "E_val substitution as Perl statement" msgstr "" #: ../src/kildclient.ui:444 msgid "Check to have the substitution be executed in a s///e construction" msgstr "" #: ../src/kildclient.ui:461 msgid "Check to make the alias enabled; only enabled aliases are tried" msgstr "Markera för att aktivera alias; bara aktiverade alias försökes med" #: ../src/kildclient.ui:561 msgid "Edit Character Information" msgstr "Redigera karaktärsinformation" #: ../src/kildclient.ui:640 msgid "Enter the character's name for automatic login" msgstr "Skriv in karaktärens namn för automatisk inloggning" #: ../src/kildclient.ui:654 msgid "_Password:" msgstr "_Lösenord:" #: ../src/kildclient.ui:667 msgid "Enter the character's password for automatic login" msgstr "Skriv in karaktärens lösenord för automatisk inloggning" #: ../src/kildclient.ui:692 msgid "Edit Hook" msgstr "" #: ../src/kildclient.ui:759 msgid "Event:" msgstr "Händelse:" #: ../src/kildclient.ui:795 msgid "Enter optionally a descriptive name for the hook" msgstr "" #: ../src/kildclient.ui:821 msgid "Enter the action to be run when the event happens" msgstr "Skriv in åtgärden som ska vidtas då händelsen inträffar" #: ../src/kildclient.ui:835 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "" #: ../src/kildclient.ui:889 msgid "Edit Macro" msgstr "Redigera makro" #: ../src/kildclient.ui:968 msgid "Enter optionally a descriptive name for the macro" msgstr "Skriv in, om du vill, ett beskrivande namn för makrot" #: ../src/kildclient.ui:982 msgid "_Key:" msgstr "_Tangent:" #: ../src/kildclient.ui:994 msgid "Press the key that will be used to run the macro" msgstr "Tryck tangenten som kommer att användas för att köra makrot" #: ../src/kildclient.ui:1008 msgid "" "Press the key that will be used to activate the macro while the cursor is in " "the text box." msgstr "" "Tryck tangenten som ska användas för att aktivera makrot då markören " "befinner sig i textrutan." #: ../src/kildclient.ui:1033 msgid "Enter the action to be run when the key is pressed" msgstr "Skriv in åtgärden som ska vidtas då tangenten trycks ned" #: ../src/kildclient.ui:1047 msgid "Check to make the macro enabled; only enabled macros are run" msgstr "Markera för att aktivera makrot; bara aktiverade makrotar körs" #: ../src/kildclient.ui:1104 ../src/kildclient.ui:2154 msgid "Enter optionally a descriptive name for the trigger" msgstr "" #: ../src/kildclient.ui:1105 msgid "Edit Trigger" msgstr "" #: ../src/kildclient.ui:1210 msgid "Enter the pattern to match against received lines" msgstr "" #: ../src/kildclient.ui:1250 msgid "Enter the action that will be run when a match happens" msgstr "" #: ../src/kildclient.ui:1260 msgid "Omit (_gag) from output" msgstr "" #: ../src/kildclient.ui:1264 msgid "Check to make the matched line not be printed in the main output window" msgstr "" "Markera för att göra så att den matchade raden inte skrivs ut i " "huvudfönstret för utmatning" #: ../src/kildclient.ui:1277 msgid "Omit (gag) from _log file" msgstr "" #: ../src/kildclient.ui:1281 msgid "Check to make the matched line not be printed in the log file" msgstr "" #: ../src/kildclient.ui:1294 msgid "_Keep executing other triggers after this this one matches" msgstr "" #: ../src/kildclient.ui:1298 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" #: ../src/kildclient.ui:1311 msgid "_Rewriter trigger" msgstr "" #: ../src/kildclient.ui:1315 msgid "Check to make this trigger a rewriter trigger" msgstr "" #: ../src/kildclient.ui:1333 msgid "C_hange style" msgstr "B_yt stil" #: ../src/kildclient.ui:1350 msgid "C_onfigure..." msgstr "K_onfigurera..." #: ../src/kildclient.ui:1377 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" #: ../src/kildclient.ui:1434 msgid "Permenent variable" msgstr "Permanent variabel" #: ../src/kildclient.ui:1497 msgid "_Name of variable to make permanent:" msgstr "_Variabelns namn som ska göras permanent:" #: ../src/kildclient.ui:1511 msgid "" "Enter the name of a scalar ($), array (@) or hash (%) variable whose " "contents are to be saved between sessions of the World" msgstr "" #: ../src/kildclient.ui:1616 msgid "Permanent Variables" msgstr "Permanenta variabler" #: ../src/kildclient.ui:1631 msgid "OnConnect Hooks" msgstr "" #: ../src/kildclient.ui:1646 msgid "OnDisconnect Hooks" msgstr "" #: ../src/kildclient.ui:1661 msgid "OnReceivedText Hooks" msgstr "" #: ../src/kildclient.ui:1676 msgid "OnSentCommand Hooks" msgstr "" #: ../src/kildclient.ui:1691 msgid "OnGetFocus Hooks" msgstr "" #: ../src/kildclient.ui:1706 msgid "OnLoseFocus Hooks" msgstr "" #: ../src/kildclient.ui:1721 msgid "OnCloseConnected Hooks" msgstr "" #: ../src/kildclient.ui:1746 msgid "_Items to export" msgstr "_Objekt att exportera" #: ../src/kildclient.ui:1833 ../src/dlgSelectWorld.ui:114 #: ../src/dlgEditWorld.ui:707 msgid "_New" msgstr "_Ny" #: ../src/kildclient.ui:1847 ../src/wndmain.ui:158 #: ../src/dlgSelectWorld.ui:128 ../src/dlgEditWorld.ui:723 msgid "_Edit" msgstr "_Redigera" #: ../src/kildclient.ui:1862 ../src/wndmain.ui:199 #: ../src/dlgSelectWorld.ui:142 ../src/dlgEditWorld.ui:739 msgid "_Delete" msgstr "_Ta bort" #: ../src/kildclient.ui:1877 msgid "_Import" msgstr "_Importera" #: ../src/kildclient.ui:1891 msgid "E_xport" msgstr "E_xportera" #: ../src/kildclient.ui:1906 ../src/dlgEditWorld.ui:755 #: ../src/dlgEditWorld.ui:4146 msgid "_Up" msgstr "" #: ../src/kildclient.ui:1921 ../src/dlgEditWorld.ui:4162 #, fuzzy msgid "_Down" msgstr "_Nedåt" #: ../src/kildclient.ui:1975 ../src/kildclient.ui:1992 #: ../src/kildclient.ui:2012 ../src/kildclient.ui:2029 #: ../src/kildclient.ui:2094 msgid "Do not change" msgstr "Ändra inte" #: ../src/kildclient.ui:1998 msgid "Single" msgstr "Enskild" #: ../src/kildclient.ui:2001 msgid "Double" msgstr "Båda" #: ../src/kildclient.ui:2032 ../src/kildclient.ui:2097 #: ../src/dlgPreferences.ui:23 msgid "Black" msgstr "_Svart" #: ../src/kildclient.ui:2035 ../src/kildclient.ui:2100 #: ../src/dlgPreferences.ui:26 msgid "Red" msgstr "R_öd" #: ../src/kildclient.ui:2038 ../src/kildclient.ui:2103 #: ../src/dlgPreferences.ui:29 msgid "Green" msgstr "_Grön" #: ../src/kildclient.ui:2041 ../src/kildclient.ui:2106 #: ../src/dlgPreferences.ui:32 msgid "Yellow" msgstr "_Gul" #: ../src/kildclient.ui:2044 ../src/kildclient.ui:2109 #: ../src/dlgPreferences.ui:35 msgid "Blue" msgstr "Blå" #: ../src/kildclient.ui:2047 ../src/kildclient.ui:2112 #: ../src/dlgPreferences.ui:38 msgid "Magenta" msgstr "_Magenta" #: ../src/kildclient.ui:2050 ../src/kildclient.ui:2115 #: ../src/dlgPreferences.ui:41 msgid "Cyan" msgstr "Cyan" #: ../src/kildclient.ui:2053 ../src/kildclient.ui:2118 #: ../src/dlgPreferences.ui:44 msgid "White" msgstr "_Vit" #: ../src/kildclient.ui:2056 ../src/kildclient.ui:2121 #: ../src/dlgPreferences.ui:47 msgid "Default" msgstr "Standard" #: ../src/kildclient.ui:2059 ../src/kildclient.ui:2124 #: ../src/dlgPreferences.ui:50 msgid "Black (bold)" msgstr "Sv_art (fet)" #: ../src/kildclient.ui:2062 ../src/kildclient.ui:2127 #: ../src/dlgPreferences.ui:53 msgid "Red (bold)" msgstr "R_öd (fet)" #: ../src/kildclient.ui:2065 ../src/kildclient.ui:2130 #: ../src/dlgPreferences.ui:56 msgid "Green (bold)" msgstr "G_rön (fet)" #: ../src/kildclient.ui:2068 ../src/kildclient.ui:2133 #: ../src/dlgPreferences.ui:59 msgid "Yellow (bold)" msgstr "Gu_l (fet)" #: ../src/kildclient.ui:2071 ../src/kildclient.ui:2136 #: ../src/dlgPreferences.ui:62 msgid "Blue (bold)" msgstr "Bl_å (fet)" #: ../src/kildclient.ui:2074 ../src/kildclient.ui:2139 #: ../src/dlgPreferences.ui:65 msgid "Magenta (bold)" msgstr "Magen_ta (fet)" #: ../src/kildclient.ui:2077 ../src/kildclient.ui:2142 #: ../src/dlgPreferences.ui:68 msgid "Cyan (bold)" msgstr "Cya_n (fet)" #: ../src/kildclient.ui:2080 ../src/kildclient.ui:2145 #: ../src/dlgPreferences.ui:71 msgid "White (bold)" msgstr "V_it (fet)" #: ../src/kildclient.ui:2083 ../src/kildclient.ui:2148 #: ../src/dlgPreferences.ui:74 msgid "Default (bold)" msgstr "Standard (fet)" #: ../src/kildclient.ui:2155 msgid "Change Style" msgstr "Byt stil" #: ../src/kildclient.ui:2221 msgid "_Apply to:" msgstr "_Tillämpa på:" #: ../src/kildclient.ui:2234 msgid "_Foreground:" msgstr "_Förgrund:" #: ../src/kildclient.ui:2264 msgid "_Background:" msgstr "_Bakgrund:" #: ../src/kildclient.ui:2294 msgid "_Italic:" msgstr "_Kursiv:" #: ../src/kildclient.ui:2324 msgid "_Striked-thru:" msgstr "_Genomstrykt:" #: ../src/kildclient.ui:2354 msgid "_Underline:" msgstr "_Understreck:" #: ../src/kildclient.ui:2386 msgid "The whole line" msgstr "Hela raden" #: ../src/kildclient.ui:2402 msgid "The whole matched text" msgstr "" #: ../src/kildclient.ui:2424 msgid "The matched substring number" msgstr "" #: ../src/wndmain.ui:24 msgid "_World" msgstr "_Värld" #: ../src/wndmain.ui:35 msgid "_Open..." msgstr "_Öppna..." #: ../src/wndmain.ui:45 msgid "_Reconnect" msgstr "_Återanslut" #: ../src/wndmain.ui:54 msgid "_Disconnect" msgstr "_Frånkoppla" #: ../src/wndmain.ui:63 msgid "Connect to _Another..." msgstr "Anslut till _en annan..." #: ../src/wndmain.ui:87 msgid "_Edit..." msgstr "_Redigera..." #: ../src/wndmain.ui:106 msgid "S_tatistics..." msgstr "S_tatistik..." #: ../src/wndmain.ui:121 ../src/wndmain.ui:257 msgid "_Previous" msgstr "_Föregående" #: ../src/wndmain.ui:130 ../src/wndmain.ui:267 msgid "_Next" msgstr "_Nästa" #: ../src/wndmain.ui:169 msgid "Cu_t" msgstr "Klipp _ut" #: ../src/wndmain.ui:179 msgid "_Copy" msgstr "_Kopiera" #: ../src/wndmain.ui:189 msgid "_Paste" msgstr "Klistra _in" #: ../src/wndmain.ui:214 ../src/dlgCmdHistory.ui:69 msgid "_Find" msgstr "_Sök" #: ../src/wndmain.ui:224 ../src/wndmain.ui:287 msgid "Find N_ext" msgstr "Sök n_ästa" #: ../src/wndmain.ui:238 msgid "_Input" msgstr "_Inmatning" #: ../src/wndmain.ui:248 ../src/dlgEditWorld.ui:3850 ../src/dlgMLSend.ui:147 msgid "_Clear" msgstr "_Töm" #: ../src/wndmain.ui:277 msgid "Find P_revious" msgstr "Sök _föregående" #: ../src/wndmain.ui:297 msgid "Command _History..." msgstr "Kommando_historia" #: ../src/wndmain.ui:313 msgid "_Multi-line Send..." msgstr "" #: ../src/wndmain.ui:329 msgid "_Test Triggers..." msgstr "" #: ../src/wndmain.ui:342 msgid "_Preferences" msgstr "_Inställningar" #: ../src/wndmain.ui:353 msgid "Disable _Triggers" msgstr "" #: ../src/wndmain.ui:363 msgid "Disable _Aliases" msgstr "Inaktivera _alias" #: ../src/wndmain.ui:373 msgid "Disable _Macros" msgstr "Inaktivera _makrotar" #: ../src/wndmain.ui:383 msgid "Disable T_imers" msgstr "Inaktivera t_idur" #: ../src/wndmain.ui:399 msgid "_Debug Matches" msgstr "" #: ../src/wndmain.ui:414 msgid "_Preferences..." msgstr "_Inställningar..." #: ../src/wndmain.ui:423 msgid "Edit Default _World..." msgstr "Redigera standard_värld..." #: ../src/wndmain.ui:436 msgid "_Display" msgstr "_Skärm" #: ../src/wndmain.ui:447 msgid "_Split Window" msgstr "" #: ../src/wndmain.ui:461 ../src/dlgEditWorld.ui:3998 msgid "_Help" msgstr "_Hjälp" #: ../src/wndmain.ui:471 msgid "_Manual" msgstr "_Handbok" #: ../src/wndmain.ui:481 msgid "_About" msgstr "_Om" #: ../src/dlgSelectWorld.ui:8 msgid "Connect to" msgstr "Anslut till" #: ../src/dlgSelectWorld.ui:39 #, fuzzy msgid "C_onnect" msgstr "_Återanslut" #: ../src/dlgSelectWorld.ui:62 msgid "_Select a saved world:" msgstr "_Markera en sparad värld:" #: ../src/dlgSelectWorld.ui:176 msgid "Or connect d_irectly:" msgstr "Eller anslut d_irekt:" #: ../src/dlgSelectWorld.ui:204 ../src/dlgEditWorld.ui:254 msgid "_Host:" msgstr "_Värd:" #: ../src/dlgSelectWorld.ui:218 ../src/dlgEditWorld.ui:268 msgid "_Port:" msgstr "_Port:" #: ../src/dlgPreferences.ui:85 ../src/dlgEditWorld.ui:82 msgid "No proxy" msgstr "Ingen proxy" #: ../src/dlgPreferences.ui:88 ../src/dlgEditWorld.ui:85 msgid "SOCKS4" msgstr "" #: ../src/dlgPreferences.ui:91 ../src/dlgEditWorld.ui:88 msgid "SOCKS5" msgstr "" #: ../src/dlgPreferences.ui:94 ../src/dlgEditWorld.ui:91 msgid "HTTP" msgstr "" #: ../src/dlgPreferences.ui:105 msgid "Left" msgstr "Vänster" #: ../src/dlgPreferences.ui:108 msgid "Right" msgstr "Höger" #: ../src/dlgPreferences.ui:111 msgid "Top" msgstr "Överkant" #: ../src/dlgPreferences.ui:114 msgid "Bottom" msgstr "Nederkant" #: ../src/dlgPreferences.ui:120 msgid "Preferences" msgstr "Inställningar" #: ../src/dlgPreferences.ui:180 msgid "Colors used by KildClient" msgstr "Färger som används av KildClient" #: ../src/dlgPreferences.ui:216 msgid "_Informative messages:" msgstr "_Informativa meddelanden:" #: ../src/dlgPreferences.ui:248 msgid "_Command echo:" msgstr "" #: ../src/dlgPreferences.ui:308 msgid "Window configuration" msgstr "Fönsterkonfiguration" #: ../src/dlgPreferences.ui:344 msgid "_Tab position:" msgstr "_Flikposition" #: ../src/dlgPreferences.ui:374 msgid "_Hide tabs if only one world is open" msgstr "_Dölj flikar om bara en värld är öppen" #: ../src/dlgPreferences.ui:379 msgid "" "If this is checked, when there is only one open world no tabs will be shown" msgstr "" "Om detta markeras kommer inga flikar att visas om det bara finns en öppen " "värld" #: ../src/dlgPreferences.ui:393 msgid "_Flash window when new text is received" msgstr "_Låt fönstret blinka när ny text mottages" #: ../src/dlgPreferences.ui:435 msgid "Appearance" msgstr "Utseende" #: ../src/dlgPreferences.ui:459 msgid "Sending Delays" msgstr "Sändningsfördröjningar" #: ../src/dlgPreferences.ui:495 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "" "Skriv in standardparametrarna för sändning av flera rader eller kommandon:" #: ../src/dlgPreferences.ui:512 msgid "_Number of lines/commands to send at once:" msgstr "_Antal rader/kommandon som ska skickas på en gång:" #: ../src/dlgPreferences.ui:553 msgid "_Delay between each group of lines/commands:" msgstr "_Fördröjning mellan varje grupp av rader/kommandon:" #: ../src/dlgPreferences.ui:616 msgid "Sending" msgstr "Skickar" #: ../src/dlgPreferences.ui:641 msgid "Web Browser" msgstr "Webbläsare" #: ../src/dlgPreferences.ui:677 msgid "Specify the command used to launch a web browser" msgstr "Ange kommandot som ska användas för att starta en webbläsare" #: ../src/dlgPreferences.ui:692 msgid "" "Enter the command to run a web browser. %s will be substituted by the web " "page address." msgstr "" "Skriv in kommandot som ska användas för att köra en webbläsare. %s kommer " "att ersättas av webbsideadressen." #: ../src/dlgPreferences.ui:734 msgid "Audio Player" msgstr "Ljuduppspelare" #: ../src/dlgPreferences.ui:770 msgid "Specify the command used to play sound files." msgstr "Ange kommandot som ska användas för att spela upp ljudfiler." #: ../src/dlgPreferences.ui:785 msgid "" "Enter the command to run an audio player program. %s will be substituted by " "the file path." msgstr "" "Skriv in kommandot som ska användas för att köra ett ljuduppspelarprogram. " "%s kommer att ersättas av sökvägen för fil." #: ../src/dlgPreferences.ui:824 msgid "External Programs" msgstr "Externa program" #: ../src/dlgPreferences.ui:850 ../src/dlgEditWorld.ui:370 msgid "Proxy" msgstr "Proxy" #: ../src/dlgPreferences.ui:890 ../src/dlgEditWorld.ui:410 msgid "Proxy _type:" msgstr "Proxy_typ:" #: ../src/dlgPreferences.ui:936 ../src/dlgEditWorld.ui:456 msgid "Server _address:" msgstr "Server_adress:" #: ../src/dlgPreferences.ui:949 ../src/dlgEditWorld.ui:515 msgid "_Username:" msgstr "_Användarnamn:" #: ../src/dlgPreferences.ui:984 ../src/dlgEditWorld.ui:480 msgid "Server _port:" msgstr "Server_port:" #: ../src/dlgPreferences.ui:997 ../src/dlgEditWorld.ui:528 msgid "Pass_word:" msgstr "Lösen_ord:" #: ../src/dlgPreferences.ui:1065 msgid "Proxy" msgstr "Proxy" #: ../src/dlgStatistics.ui:8 msgid "Statistics" msgstr "Statistik" #: ../src/dlgStatistics.ui:56 ../src/dlgStatistics.ui:68 #: ../src/dlgStatistics.ui:223 ../src/dlgStatistics.ui:349 #: ../src/dlgStatistics.ui:467 ../src/dlgStatistics.ui:479 #: ../src/dlgStatistics.ui:491 ../src/dlgStatistics.ui:503 #: ../src/dlgStatistics.ui:515 ../src/dlgStatistics.ui:539 #: ../src/dlgStatistics.ui:575 ../src/dlgStatistics.ui:587 #: ../src/dlgStatistics.ui:611 ../src/dlgStatistics.ui:647 #: ../src/dlgStatistics.ui:659 msgid "N/A" msgstr "Inte tillgängligt" #: ../src/dlgStatistics.ui:80 msgid "Proxy port:" msgstr "Proxyport:" #: ../src/dlgStatistics.ui:92 msgid "Proxy host:" msgstr "Proxyvärd:" #: ../src/dlgStatistics.ui:116 msgid "Proxy type:" msgstr "Proxytyp:" #: ../src/dlgStatistics.ui:128 msgid "World name:" msgstr "Namn på värld:" #: ../src/dlgStatistics.ui:140 msgid "Host:" msgstr "Värd:" #: ../src/dlgStatistics.ui:152 msgid "Port:" msgstr "Port:" #: ../src/dlgStatistics.ui:164 msgid "Connection time:" msgstr "Anslutningstid:" #: ../src/dlgStatistics.ui:176 msgid "Idle time:" msgstr "Passiv tid:" #: ../src/dlgStatistics.ui:199 msgid "Compression used:" msgstr "Använd komprimering:" #: ../src/dlgStatistics.ui:211 msgid "Bytes received (compressed):" msgstr "Antal mottagna byte (komprimerade):" #: ../src/dlgStatistics.ui:235 msgid "Bytes received (decompressed):" msgstr "Antal mottagna byte (okomprimerade):" #: ../src/dlgStatistics.ui:247 msgid "Compression ratio:" msgstr "Komprimeringsförhållande:" #: ../src/dlgStatistics.ui:259 msgid "Lines received:" msgstr "Antal mottagna rader:" #: ../src/dlgStatistics.ui:383 msgid "Key exchange:" msgstr "" #: ../src/dlgStatistics.ui:395 msgid "SSL protocol used:" msgstr "SSL-protokoll använt:" #: ../src/dlgStatistics.ui:407 msgid "Compression algorithm:" msgstr "Komprimeringsalgoritm:" #: ../src/dlgStatistics.ui:419 msgid "Certificate type:" msgstr "" #: ../src/dlgStatistics.ui:431 msgid "Cipher:" msgstr "" #: ../src/dlgStatistics.ui:443 msgid "MAC:" msgstr "MAC:" #: ../src/dlgStatistics.ui:455 msgid "SSL not supported in this version" msgstr "SSL stöds inte i denna version" #: ../src/dlgStatistics.ui:527 msgid "Hostname:" msgstr "Värdnamn:" #: ../src/dlgStatistics.ui:551 msgid "Valid since:" msgstr "Giltigt sedan:" #: ../src/dlgStatistics.ui:563 msgid "Expiration:" msgstr "Utlöper:" #: ../src/dlgStatistics.ui:599 msgid "Fingerprint:" msgstr "Fingeravtryck:" #: ../src/dlgStatistics.ui:623 msgid "Subject's DN:" msgstr "" #: ../src/dlgStatistics.ui:635 msgid "Issuer's DN:" msgstr "" #: ../src/dlgAbout.ui:12 msgid "A mud client with powerful features and support for Perl Scripting" msgstr "En mudklient med kraftfulla funktioner och stöd för Perlskriptning" #: ../src/dlgAbout.ui:14 msgid "Visit http://www.kildclient.org" msgstr "Besök http://www.kildclient.org" #: ../src/dlgEditWorld.ui:62 msgid "No auto-login" msgstr "Ingen automatisk inloggning" #: ../src/dlgEditWorld.ui:79 msgid "Use global settings" msgstr "Använd allmänna inställningar" #: ../src/dlgEditWorld.ui:98 msgid "Edit World" msgstr "Redigera värld" #: ../src/dlgEditWorld.ui:203 msgid "Connection" msgstr "Anslutning" #: ../src/dlgEditWorld.ui:281 msgid "Enter a descriptive name for the World" msgstr "Skriv in ett beskrivande namn för Världen" #: ../src/dlgEditWorld.ui:295 msgid "Enter the host to connect to" msgstr "Skriv in värden att ansluta till" #: ../src/dlgEditWorld.ui:309 msgid "Enter the port used when connecting" msgstr "Skriv in porten som ska användas vid anslutning" #: ../src/dlgEditWorld.ui:321 msgid "Use _SSL" msgstr "Använd _SSL" #: ../src/dlgEditWorld.ui:587 msgid "Auto-login" msgstr "Automatisk inloggning" #: ../src/dlgEditWorld.ui:628 msgid "Connection _style:" msgstr "Anslutnings_stil:" #: ../src/dlgEditWorld.ui:668 msgid "Ch_aracters in this mud:" msgstr "Ka_raktärer i denna mud:" #: ../src/dlgEditWorld.ui:771 msgid "D_elete" msgstr "_Ta bort" #: ../src/dlgEditWorld.ui:842 ../src/dlgEditWorld.ui:2048 #: ../src/dlgEditWorld.ui:2992 msgid "Font" msgstr "Typsnitt" #: ../src/dlgEditWorld.ui:879 msgid "Select the font used in the _main screen:" msgstr "Markera typsnittet som ska användas i huvud_fönstret:" #: ../src/dlgEditWorld.ui:895 msgid "Select the font used in the main output screen" msgstr "Markera typsnittet som ska användas i huvudskärmen för utmatning" #: ../src/dlgEditWorld.ui:907 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "" "Använd _fet typsnitt för markerade färger (istället för bara färgmarkering)" #: ../src/dlgEditWorld.ui:912 msgid "" "Check if you want the highlighted ANSI colors to be displayed in bold also" msgstr "" "Markera om du vill att de färgmarkerade ANSI-färgerna även ska visas i " "fetstil" #: ../src/dlgEditWorld.ui:956 msgid "Word Wrap" msgstr "Radbrytning" #: ../src/dlgEditWorld.ui:989 msgid "_Wrap lines at word boundaries" msgstr "" #: ../src/dlgEditWorld.ui:994 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "" #: ../src/dlgEditWorld.ui:1016 msgid "_Indent wrapped lines by" msgstr "" #: ../src/dlgEditWorld.ui:1046 msgid "pixels" msgstr "" #: ../src/dlgEditWorld.ui:1064 msgid "Wrap lines at full _screen width" msgstr "" #: ../src/dlgEditWorld.ui:1087 msgid "Maximum line width in _characters:" msgstr "" #: ../src/dlgEditWorld.ui:1157 msgid "Tooltips" msgstr "" #: ../src/dlgEditWorld.ui:1191 msgid "Display _tooltips with the time when the line was received" msgstr "" #: ../src/dlgEditWorld.ui:1196 msgid "" "Check if you want tooltips to be displayed showing the time when a line was " "received if you leave the mouse over the line for a short while" msgstr "" #: ../src/dlgEditWorld.ui:1262 msgid "Ansi Colors" msgstr "Ansifärger" #: ../src/dlgEditWorld.ui:1395 msgid "_Black" msgstr "_Svart" #: ../src/dlgEditWorld.ui:1409 msgid "R_ed" msgstr "R_öd" #: ../src/dlgEditWorld.ui:1423 msgid "_Green" msgstr "_Grön" #: ../src/dlgEditWorld.ui:1437 msgid "_Yellow" msgstr "_Gul" #: ../src/dlgEditWorld.ui:1451 msgid "B_lue" msgstr "B_lå" #: ../src/dlgEditWorld.ui:1465 msgid "_Magenta" msgstr "_Magenta" #: ../src/dlgEditWorld.ui:1479 msgid "_Cyan" msgstr "Cyan" #: ../src/dlgEditWorld.ui:1493 msgid "_White" msgstr "_Vit" #: ../src/dlgEditWorld.ui:1507 msgid "Bl_ack (bold)" msgstr "Sv_art (fet)" #: ../src/dlgEditWorld.ui:1520 msgid "Re_d (bold)" msgstr "R_öd (fet)" #: ../src/dlgEditWorld.ui:1533 msgid "G_reen (bold)" msgstr "G_rön (fet)" #: ../src/dlgEditWorld.ui:1546 msgid "Yell_ow (bold)" msgstr "Gu_l (fet)" #: ../src/dlgEditWorld.ui:1559 msgid "Bl_ue (bold)" msgstr "Bl_å (fet)" #: ../src/dlgEditWorld.ui:1572 msgid "Magen_ta (bold)" msgstr "Magen_ta (fet)" #: ../src/dlgEditWorld.ui:1585 msgid "Cya_n (bold)" msgstr "Cya_n (fet)" #: ../src/dlgEditWorld.ui:1598 msgid "W_hite (bold)" msgstr "V_it (fet)" #: ../src/dlgEditWorld.ui:1767 msgid "Default Colors" msgstr "Standardfärger" #: ../src/dlgEditWorld.ui:1828 msgid "_Foreground" msgstr "_Förgrund" #: ../src/dlgEditWorld.ui:1841 msgid "Bold foreground" msgstr "Fet förgrund" #: ../src/dlgEditWorld.ui:1866 msgid "Bac_kground" msgstr "Ba_kgrund" #: ../src/dlgEditWorld.ui:1891 msgid "Bold background" msgstr "Fet bakgrund" #: ../src/dlgEditWorld.ui:1945 msgid "Revert to default colors" msgstr "Återgå till standardfärger" #: ../src/dlgEditWorld.ui:1979 msgid "Re_vert to default colors" msgstr "Åt_erställ till standardfärger" #: ../src/dlgEditWorld.ui:1984 msgid "Click to revert all colors to their built-in defaults" msgstr "" "Klicka för att låta alla färger återgå till deras inbyggda standardvärden" #: ../src/dlgEditWorld.ui:2085 msgid "Select the font used in the _status bar:" msgstr "Markera typsnittet som ska användas i _statusmätaren:" #: ../src/dlgEditWorld.ui:2101 msgid "Select the font used in the status bar" msgstr "Markera typsnittet som ska användas i statusmätaren" #: ../src/dlgEditWorld.ui:2143 msgid "Time Display" msgstr "Tidsangivelse" #: ../src/dlgEditWorld.ui:2179 msgid "C_onnected time:" msgstr "A_nsluten tid:" #: ../src/dlgEditWorld.ui:2213 ../src/dlgEditWorld.ui:2323 msgid "Do not display" msgstr "Visa inte" #: ../src/dlgEditWorld.ui:2218 msgid "Select if you do not want the connection time to be displayed" msgstr "Välj om du vill att anslutningstiden inte ska visas" #: ../src/dlgEditWorld.ui:2233 ../src/dlgEditWorld.ui:2343 msgid "Display as hours, minutes and seconds" msgstr "Visa som timmar, minuter och sekunder" #: ../src/dlgEditWorld.ui:2238 msgid "" "Select if you want the connection time to be displayed in hours, minutes and " "seconds" msgstr "" "Välj om du vill att anslutningstiden ska visas i timmar, minuter och sekunder" #: ../src/dlgEditWorld.ui:2253 ../src/dlgEditWorld.ui:2363 msgid "Display as seconds" msgstr "Visa som sekunder" #: ../src/dlgEditWorld.ui:2258 msgid "Select if you want the connection time to be displayed in seconds" msgstr "Välj om du vill att anslutningstiden ska visas i sekunder" #: ../src/dlgEditWorld.ui:2290 msgid "_Idle time:" msgstr "_Tid passiv:" #: ../src/dlgEditWorld.ui:2328 msgid "Select if you do not want the idle time to be displayed" msgstr "Välj om du vill att den passiva tiden inte ska visas" #: ../src/dlgEditWorld.ui:2348 msgid "" "Select if you want the idle time to be displayed in hours, minutes and " "seconds" msgstr "" "Välj om du vill att den passiva tiden ska visas i timmar, minuter och " "sekunder" #: ../src/dlgEditWorld.ui:2368 msgid "Select if you want the idle time to be displayed in seconds" msgstr "Välj om du vill att den passiva tiden ska visas i sekunder" #: ../src/dlgEditWorld.ui:2383 msgid "Only _reset idle time counter when a command is entered directly" msgstr "" "_Återställ räknaren för passiv tid bara när ett kommando skrivs in direkt" #: ../src/dlgEditWorld.ui:2388 msgid "" "Check to make the idle time counter reset only when a command is entered " "directly by typing it in the command entry box. If not checked, if a command " "is sent because of a timer, of a hook, etc, the idle timer is also reset." msgstr "" #: ../src/dlgEditWorld.ui:2468 msgid "Command Entry" msgstr "Kommandoinmatning" #: ../src/dlgEditWorld.ui:2501 msgid "_Keep last typed command in command entry box" msgstr "_Behåll senast skrivna kommando i kommandoinmatningsrutan" #: ../src/dlgEditWorld.ui:2506 msgid "" "Check to have the last command kept in the command entry box, so that you " "can repeat commands only by pressing ENTER" msgstr "" "Markera för att behålla det senaste kommandot i kommandoinmatningsrutan, så " "att du kan upprepa kommandon genom att bara trycka RETUR" #: ../src/dlgEditWorld.ui:2519 msgid "_Echo sent commands in main window" msgstr "" #: ../src/dlgEditWorld.ui:2524 msgid "Check to have the sent commands echoed in the main output window" msgstr "" #: ../src/dlgEditWorld.ui:2537 msgid "_Store commands between sessions" msgstr "_Lagra kommandon mellan sessioner" #: ../src/dlgEditWorld.ui:2542 msgid "Check to have the command history saved in a file between sessions" msgstr "Markera för att spara kommandohistoriken i en fil mellan sessioner" #: ../src/dlgEditWorld.ui:2555 msgid "Never _hide the typed text" msgstr "Dölj _aldrig den skrivna texten" #: ../src/dlgEditWorld.ui:2560 msgid "" "Check this if the text you type is displayed as black dots in the input box." msgstr "" "Markera detta om texten du skriver visas som svarta punkter i " "inmatningsrutan." #: ../src/dlgEditWorld.ui:2581 msgid "_Number of commands to save in history:" msgstr "_Antal kommandon att spara i historiken:" #: ../src/dlgEditWorld.ui:2595 msgid "Specify the number of commands that are saved and can be later recalled" msgstr "Ange antalet kommandon som ska sparas och som senare kan återkallas" #: ../src/dlgEditWorld.ui:2622 msgid "C_ommand separator:" msgstr "K_ommandoseparator:" #: ../src/dlgEditWorld.ui:2636 msgid "Specify the separator for commands typed in the command entry box" msgstr "" #: ../src/dlgEditWorld.ui:2657 msgid "Use single-_line input bar" msgstr "" #: ../src/dlgEditWorld.ui:2697 msgid "Enable _auto-completion" msgstr "Aktivera _automatisk komplettering" #: ../src/dlgEditWorld.ui:2702 msgid "Check to enable command auto-completion (based on previous commands)" msgstr "" "Markera för att aktivera automatisk komplettering (baserad på föregående " "kommandon)" #: ../src/dlgEditWorld.ui:2723 msgid "Acti_vate auto-completion only after" msgstr "A_ktivera bara automatisk komplettering efter att" #: ../src/dlgEditWorld.ui:2737 msgid "" "Specify the number of characters that must be typed for command completion " "to start" msgstr "" "Ange antalet tecken som måste skrivas in för att kommandokomplettering ska " "startas" #: ../src/dlgEditWorld.ui:2752 msgid "characters have been entered" msgstr "tecken har skrivits in" #: ../src/dlgEditWorld.ui:2783 msgid "Use _multi-line input bar" msgstr "" #: ../src/dlgEditWorld.ui:2830 msgid "N_umber of lines:" msgstr "A_ntal rader:" #: ../src/dlgEditWorld.ui:2868 msgid "S_pell check typed text" msgstr "S_tavninskontrollera skriven text" #: ../src/dlgEditWorld.ui:2905 msgid "Language code:" msgstr "Språkkod:" #: ../src/dlgEditWorld.ui:2931 msgid "(Leave blank for default based on locale)" msgstr "(lämna tomt för standard baserad på lokal)" #: ../src/dlgEditWorld.ui:3029 msgid "Select the font used in the command _entry box:" msgstr "Markera typsnittet som ska användas i kommando_inmatningsrutan:" #: ../src/dlgEditWorld.ui:3045 msgid "Select the font used in the command entry box" msgstr "Markera typsnittet som ska användas i kommandoinmatningsrutan" #: ../src/dlgEditWorld.ui:3087 msgid "Flood prevention" msgstr "Förhindra massutskick" #: ../src/dlgEditWorld.ui:3126 msgid "Do not allow the _same command to be sent" msgstr "Tillåt inte att _samma kommando skickas" #: ../src/dlgEditWorld.ui:3131 msgid "" "Check to prevent more than a given number of equal commands to be sent in a " "row (which can disconnect your character in some muds)" msgstr "" #: ../src/dlgEditWorld.ui:3147 msgid "Specify the maximum number of equal commands that can be sent in a row" msgstr "Ange det maximala antalet samma rader som kan skickas i rad" #: ../src/dlgEditWorld.ui:3162 msgid "_times in a row" msgstr "_gånger i rad" #: ../src/dlgEditWorld.ui:3188 msgid "Se_nd this command:" msgstr "Ski_cka detta kommando:" #: ../src/dlgEditWorld.ui:3202 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" #: ../src/dlgEditWorld.ui:3273 msgid "Logging Status" msgstr "Loggningstatus" #: ../src/dlgEditWorld.ui:3326 msgid "St_art" msgstr "Sta_rta" #: ../src/dlgEditWorld.ui:3342 msgid "_Stop" msgstr "" #: ../src/dlgEditWorld.ui:3373 msgid "_Include the last" msgstr "" #: ../src/dlgEditWorld.ui:3378 msgid "Select to include lines from the main window in the log file." msgstr "" #: ../src/dlgEditWorld.ui:3393 #, fuzzy msgid "Inform number of lines to include in the log." msgstr "Skulle denna rad inkluderas i loggfilen?" #: ../src/dlgEditWorld.ui:3409 #, fuzzy msgid "lines of the scrollback buffer in the log" msgstr "_Rader att spara i rullningsbuffert:" #: ../src/dlgEditWorld.ui:3456 ../src/dlgEditWorld.ui:4687 msgid "File" msgstr "Fil" #: ../src/dlgEditWorld.ui:3548 msgid "" "Note: You can use strftime() escapes to create different files based on the " "date and time that logging starts. Also, %Kw represents the World name and " "%Kc the character name used in auto-logon." msgstr "" #: ../src/dlgEditWorld.ui:3590 msgid "Options" msgstr "Alternativ" #: ../src/dlgEditWorld.ui:3623 msgid "A_utomatically start logging when connected" msgstr "S_tarta loggning automatiskt vid anslutning" #: ../src/dlgEditWorld.ui:3629 msgid "" "If this is selected, logging will be automatically started whenever you " "connect to the world." msgstr "" "Om detta markeras kommer loggning att påbörjas automatiskt varje gång du " "ansluter till världen." #: ../src/dlgEditWorld.ui:3642 msgid "Prefix lines with _date and/or time" msgstr "" #: ../src/dlgEditWorld.ui:3648 msgid "" "Select this if you want to prefix each line in the log file with the date " "and/or time it was received." msgstr "" #: ../src/dlgEditWorld.ui:3682 msgid "_Format:" msgstr "_Format:" #: ../src/dlgEditWorld.ui:3696 msgid "" "The default is to prefix lines with the date and time, but you can configure " "the format with strftime() escape sequences. See the manual for a " "description of those." msgstr "" #: ../src/dlgEditWorld.ui:3707 msgid "Revert to _default" msgstr "Återgå till _standard" #: ../src/dlgEditWorld.ui:3783 msgid "Scripting" msgstr "Skriptning" #: ../src/dlgEditWorld.ui:3824 msgid "_Perl file to load:" msgstr "_Perlfil att läsa in:" #: ../src/dlgEditWorld.ui:3924 msgid "Plugins Currently Loaded" msgstr "" #: ../src/dlgEditWorld.ui:3982 msgid "_Load" msgstr "" #: ../src/dlgEditWorld.ui:4052 msgid "Plugins Loaded on Startup" msgstr "" #: ../src/dlgEditWorld.ui:4114 msgid "_Add" msgstr "" #: ../src/dlgEditWorld.ui:4130 msgid "_Remove" msgstr "" #: ../src/dlgEditWorld.ui:4238 msgid "MCCP (for compression)" msgstr "MCCP (för komprimering)" #: ../src/dlgEditWorld.ui:4271 msgid "_Enable if server proposes after connecting" msgstr "" #: ../src/dlgEditWorld.ui:4288 msgid "Enable if server proposes at _any time" msgstr "" #: ../src/dlgEditWorld.ui:4305 msgid "_Disable" msgstr "_Inaktivera" #: ../src/dlgEditWorld.ui:4374 msgid "Scrolling" msgstr "Rullning" #: ../src/dlgEditWorld.ui:4408 msgid "Scroll on _output" msgstr "Rulla vid _utmatning" #: ../src/dlgEditWorld.ui:4413 msgid "" "Check to have the main window scroll to the end whenever new output comes" msgstr "" "Markera för att låta huvudfönstret rulla till slutet varje gång ny utmatning " "mottages" #: ../src/dlgEditWorld.ui:4434 msgid "_Lines to save in scrollback buffer:" msgstr "_Rader att spara i rullningsbuffert:" #: ../src/dlgEditWorld.ui:4448 msgid "" "Specify the number of lines of output that can be seen with by scrolling the " "window" msgstr "Ange antalet utmatningsrader som kan ses genom att rulla fönstret" #: ../src/dlgEditWorld.ui:4498 msgid "Name display" msgstr "Tidsangivelse" #: ../src/dlgEditWorld.ui:4531 msgid "Identify as 'World name'" msgstr "" #: ../src/dlgEditWorld.ui:4547 msgid "Identify as 'World name - Character'" msgstr "" #: ../src/dlgEditWorld.ui:4563 msgid "Identify as 'Character - World name'" msgstr "" #: ../src/dlgEditWorld.ui:4584 msgid "Custom: " msgstr "" #: ../src/dlgEditWorld.ui:4622 msgid "" "Use %Kw to represent the World's name, and %Kc to represent the auto-logon " "character name" msgstr "" #: ../src/dlgEditWorld.ui:4726 msgid "_File:" msgstr "_Fil:" #: ../src/dlgEditWorld.ui:4763 msgid "" "You can leave this field blank, and a file name will be automatically " "generated. Only edit this field if you know what you are doing." msgstr "" "Du kan lämna detta fält tomt, och ett filnamn kommer att genereras " "automatiskt. Redigera bara detta fält om du vet vad du gör." #: ../src/dlgEditWorld.ui:4805 msgid "Character Set" msgstr "Teckenkodning" #: ../src/dlgEditWorld.ui:4838 msgid "Character _set:" msgstr "Tecken_kodning:" #: ../src/dlgEditWorld.ui:4892 msgid "Graphical Editors" msgstr "Grafiska redigerare" #: ../src/dlgEditWorld.ui:4925 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "" #: ../src/dlgEditWorld.ui:4930 ../src/dlgEditWorld.ui:5031 msgid "" "If not checked, objects such as triggers, aliases, etc. will be deleted " "directly without asking for confirmation when you press the Delete button." msgstr "" #: ../src/dlgEditWorld.ui:4944 msgid "_Show items defined by plugins" msgstr "" #: ../src/dlgEditWorld.ui:4949 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" #: ../src/dlgEditWorld.ui:4993 msgid "TCP Keep Alive" msgstr "" #: ../src/dlgEditWorld.ui:5026 msgid "Enable TCP _Keep Alive packets" msgstr "" #: ../src/dlgEditWorld.ui:5047 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "" #: ../src/dlgEditWorld.ui:5087 msgid "Input" msgstr "Inmatning" #: ../src/dlgEditWorld.ui:5120 msgid "_Disable up and down arrow keys for history navigation" msgstr "" #: ../src/dlgEditWorld.ui:5125 msgid "" "If checked, the up and down arrow keys are not used for navigating between " "saved commands. (You'll have to use Alt+up and Alt+down.)" msgstr "" #: ../src/dlgTestTriggers.ui:57 msgid "Enter _line to be matched against the triggers:" msgstr "" #: ../src/dlgTestTriggers.ui:75 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" #: ../src/dlgTestTriggers.ui:86 ../src/dlgMLSend.ui:52 #: ../src/dlgCmdHistory.ui:161 msgid "_Send" msgstr "_Skicka" #: ../src/dlgTestTriggers.ui:91 msgid "Click the run the triggers against the line." msgstr "" #: ../src/dlgTestTriggers.ui:129 msgid "Number of triggers that matched:" msgstr "" #: ../src/dlgTestTriggers.ui:160 msgid "Commands that would be sent:" msgstr "Kommandon som skulle bli skickade:" #: ../src/dlgTestTriggers.ui:193 msgid "This is what would be printed in the main screen:" msgstr "Detta är vad som skulle skrivas ut i huvudfönstret:" #: ../src/dlgTestTriggers.ui:205 msgid "" "This is what would be printed in the main screen. If empty, the line has " "been gaged. It can be different from the original line because of rewriter " "triggers." msgstr "" #: ../src/dlgTestTriggers.ui:223 msgid "Would this line be included in the log file?" msgstr "Skulle denna rad inkluderas i loggfilen?" #: ../src/dlgMLSend.ui:20 msgid "Multi-line send" msgstr "" #: ../src/dlgMLSend.ui:82 msgid "Send this text _initially:" msgstr "Skicka _först denna text:" #: ../src/dlgMLSend.ui:102 ../src/dlgMLSend.ui:193 msgid "Enter some text to be sent to the World" msgstr "Skriv in lite text som ska skickas till Världen" #: ../src/dlgMLSend.ui:118 msgid "Then send the _contents of this file:" msgstr "Skicka sedan _innehållet i denna fil:" #: ../src/dlgMLSend.ui:173 msgid "_Finally, send this text:" msgstr "Skicka _till sist denna text:" #: ../src/dlgMLSend.ui:220 msgid "Add this to the _beginning of each line:" msgstr "Lägg till detta till _början av varje rad:" #: ../src/dlgMLSend.ui:235 msgid "Specify some text to be prepended to each sent line" msgstr "" #: ../src/dlgMLSend.ui:250 msgid "Add this to the _end of each line:" msgstr "Lägg till detta till _slutet av varje rad:" #: ../src/dlgMLSend.ui:265 msgid "Specify some text to be appended to each sent line" msgstr "" #: ../src/dlgMLSend.ui:283 msgid "_Delay" msgstr "_Fördröj" #: ../src/dlgMLSend.ui:297 msgid "Specify the delay between sending the group of lines" msgstr "" #: ../src/dlgMLSend.ui:313 msgid "seconds e_ach" msgstr "sekunder v_ar" #: ../src/dlgMLSend.ui:327 msgid "Specify how many lines are sent at once" msgstr "Ange hur många rader som ska skickas på en gång" #: ../src/dlgMLSend.ui:342 msgid "line(s)" msgstr ":a/e rad" #: ../src/dlgMLSend.ui:360 msgid "_Keep dialog open after sending" msgstr "_Behåll dialogrutan öppen efter sändning" #: ../src/dlgCmdHistory.ui:20 msgid "Command History" msgstr "Kommandohistoria" #: ../src/dlgCmdHistory.ui:75 msgid "Find a command containing a given search term" msgstr "Sök ett kommando innehållandes en given sökterm" #: ../src/dlgCmdHistory.ui:87 msgid "Find _next" msgstr "Sök _nästa" #: ../src/dlgCmdHistory.ui:93 msgid "Find the next command with the same match text" msgstr "" #: ../src/dlgCmdHistory.ui:124 msgid "_Recall" msgstr "_Återkalla" #: ../src/dlgCmdHistory.ui:130 msgid "Put the selected command in the command entry box" msgstr "Placera det valda kommandot i kommandoinmatningsrutan" #: ../src/dlgCmdHistory.ui:143 msgid "Rec_all & Close" msgstr "Åter_kalla & stäng" #: ../src/dlgCmdHistory.ui:149 msgid "Put the selected command in the command entry box and close this dialog" msgstr "" "Placera det valda kommandot i kommandoinmatningsrutan och stäng denna " "dialogruta" #: ../src/dlgCmdHistory.ui:167 msgid "Send the selected command(s) to the mud" msgstr "Skicka det(de) valda kommandot(na) till muden " #: ../src/dlgCmdHistory.ui:179 msgid "S_end & Close" msgstr "S_kicka och stäng" #: ../src/dlgCmdHistory.ui:185 msgid "Send the selected command(s) to the mud and close the dialog" msgstr "Skicka det(de) valda kommandot(na) till muden och stäng fönstret" #: ../src/dlgCmdHistory.ui:224 msgid "Newest commands are on the top" msgstr "" #: ../src/dlgCmdHistory.ui:252 msgid "Dela_y" msgstr "Fördrö_j" #: ../src/dlgCmdHistory.ui:265 msgid "Specify the delay between sending the group of commands" msgstr "" #: ../src/dlgCmdHistory.ui:282 msgid "sec_onds each" msgstr "sek_under var" #: ../src/dlgCmdHistory.ui:296 msgid "Specify how many commands are sent at once" msgstr "Ange hur många kommandon som ska skickas på en gång" #: ../src/dlgCmdHistory.ui:313 msgid "commands(s)" msgstr "kommando(n)" #: ../src/dlgCmdHistory.ui:338 msgid "Find Command" msgstr "Sök kommando" #: ../src/dlgCmdHistory.ui:400 msgid "_Text to find:" msgstr "_Text att söka efter:" #: ../src/dlgCmdHistory.ui:413 msgid "Enter the text to search for" msgstr "Skriv in texten att söka efter" #: ../src/dlgCmdHistory.ui:434 msgid "Search direction:" msgstr "Sökväg:" #: ../src/dlgCmdHistory.ui:449 msgid "_Downwards" msgstr "_Nedåt" #: ../src/dlgCmdHistory.ui:466 msgid "_Upwards" msgstr "_Uppåt" #: ../src/mnuPopupURL.ui:12 msgid "_Open link" msgstr "_Öppna länk" #: ../src/mnuPopupURL.ui:21 msgid "_Copy link address" msgstr "_Kopiera länkadress" #: ../share/kildclient.pl:76 ../share/kildclient.pl:97 #: ../share/kildclient.pl:117 ../share/kildclient.pl:182 #: ../share/kildclient.pl:433 ../share/kildclient.pl:511 #: ../share/kildclient.pl:589 ../share/kildclient.pl:602 #: ../share/kildclient.pl:615 ../share/kildclient.pl:628 #: ../share/kildclient.pl:641 ../share/kildclient.pl:654 #: ../share/kildclient.pl:667 ../share/kildclient.pl:680 #: ../share/kildclient.pl:694 ../share/kildclient.pl:708 #: ../share/kildclient.pl:818 ../share/kildclient.pl:830 #: ../share/kildclient.pl:842 ../share/kildclient.pl:854 #: ../share/kildclient.pl:867 ../share/kildclient.pl:1083 #: ../share/kildclient.pl:1116 #, perl-format msgid "%s: Too few arguments." msgstr "%s: För få argument." #: ../share/kildclient.pl:207 ../share/kildclient.pl:567 #, perl-format msgid "No such %s" msgstr "Inget sådant %s" #: ../share/kildclient.pl:298 ../share/kildclient.pl:316 #: ../share/kildclient.pl:334 ../share/kildclient.pl:352 #: ../share/kildclient.pl:370 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: Fel antal argument." #: ../share/kildclient.pl:403 ../share/kildclient.pl:411 #: ../share/kildclient.pl:489 ../share/kildclient.pl:497 #, perl-format msgid "No such %s." msgstr "Inget sådant %s." #: ../share/kildclient.pl:425 #, perl-format msgid "No %s deleted." msgstr "Ingen %s borttagen." #: ../share/kildclient.pl:427 #, perl-format msgid "One %s deleted." msgstr "En %s borttagen." #: ../share/kildclient.pl:429 #, perl-format msgid "%d %s deleted." msgstr "%d %s borttagen." #: ../share/kildclient.pl:506 #, perl-format msgid "Successfully moved %s." msgstr "Flyttade framgångsrikt %s." #: ../share/kildclient.pl:898 msgid "Could not open file." msgstr "Kunde inte öppna fil." #: ../share/kildclient.pl:928 msgid "Unknown" msgstr "Okänd" #: ../share/kildclient.pl:935 msgid "Invalid plugin file." msgstr "Ogiltig fil för insticksmodul." #: ../share/kildclient.pl:966 msgid "Plugin already loaded. Try enabling it." msgstr "Insticksmodul redan inläst. Försök aktivera den." #: ../share/kildclient.pl:968 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "Version %s av denna insticksmodul är redan inläst." #: ../share/kildclient.pl:978 #, perl-format msgid "Error in plugin file: %s" msgstr "Fel i filen för insticksmodul: %s" #: ../share/kildclient.pl:990 msgid "Cannot load a plugin in another world." msgstr "Kan inte läsa in insticksmodul i en annan värld." #: ../share/kildclient.pl:995 ../share/kildclient.pl:1015 msgid "Plugin not specified" msgstr "Insticksmodulen är inte angiven" #: ../share/kildclient.pl:1002 ../share/kildclient.pl:1033 msgid "Plugin not loaded." msgstr "Insticksmodul inte inläst." #: ../share/kildclient.pl:1005 #, perl-format msgid "Plugin '%s' loaded." msgstr "Insticksmodul '%s' inläst." #: ../share/kildclient.pl:1021 #, perl-format msgid "Could not load plugin %s" msgstr "Kunde inte läsa in insticksmodul %s" #: ../share/kildclient.pl:1097 msgid "Plugin enabled." msgstr "Insticksmodul aktiverad." #: ../share/kildclient.pl:1130 msgid "Plugin disabled." msgstr "Insticksmodul inaktiverad." #: ../share/kildclient.pl:1279 msgid "Cannot open help file." msgstr "Kan inte öppna hjälpfil." #: ../share/kildclient.pl:1297 msgid "Help topic not found." msgstr "Hjälprubrik hittades inte." #: ../share/kildclient.pl:1394 msgid "" "Warning: the getwindowsize() function is deprecated and will be removed." msgstr "Varning: funktionen getwindowsize() avrådes och kommer att tas bort." #: ../share/kildclient.pl:1395 msgid "Use $window->getsize() instead." msgstr "Använd $windows->getsize() istället." #: ../share/kildclient.pl:1400 msgid "Warning: the minimize() function is deprecated and will be removed." msgstr "Varning: funktionen minimize() avrådes och kommer att tas bort." #: ../share/kildclient.pl:1401 msgid "Use $window->minimize() instead." msgstr "Använd $windows->minimize() istället." #: ../share/kildclient.pl:1406 msgid "Warning: the path() function is deprecated and will be removed." msgstr "Varning: funktionen path() avrådes och kommer att tas bort." #: ../share/kildclient.pl:1407 msgid "Use $world->path() instead." msgstr "Använd $world->path() istället." kildclient-3.0.0/po/de.po0000644000175000017500000027416312376346024012147 00000000000000# Copyright (C) 2009-2014 Rene Kuettner , Eduardo M Kalinowski # This file is licensed under the same license as the KildClient package. # msgid "" msgstr "" "Project-Id-Version: KildClient 3.0.0\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=glib&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2014-08-17 14:59-0300\n" "PO-Revision-Date: 2014-08-17 14:59-0300\n" "Last-Translator: Rene Kuettner \n" "Language-Team: German\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/main.c:74 msgid "Outputs version information and exits" msgstr "Zeigt Versionsinformationen an und beendet das Programm" #: ../src/main.c:76 msgid "Directory to store settings and saved worlds" msgstr "Verzeichnis, in dem die Einstellungen und Welten gespeichert werden" #: ../src/main.c:76 msgid "DIR" msgstr "Verzeichnis" #: ../src/main.c:78 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "" "Schreibt alle empfangenen Daten (gegebenenfalls nach der Dekompression) in " "die Datei" #: ../src/main.c:79 ../src/main.c:82 msgid "FILE" msgstr "DATEI" #: ../src/main.c:81 msgid "Dumps all data received (possibly compressed) to the file" msgstr "" "Schreibt alle empfangenen Daten (wenn möglich dekomprimiert) in die Datei" #. Parse command-line options #: ../src/main.c:120 msgid "[WORLD...]" msgstr "[WELT...\\" #: ../src/main.c:127 #, c-format msgid "Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" msgstr "Geschrieben von Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" #: ../src/main.c:132 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "Kann Datendatei %s nicht öffnen: %s\n" #: ../src/main.c:139 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "Kann Rohdatendatei %s nicht öffnen: %s\n" #: ../src/main.c:282 msgid "There is one open world. Do you really want to quit?" msgstr "Eine Welt ist noch verbunden. Soll trotzdem beendet werden?" #: ../src/main.c:288 #, c-format msgid "There are %d open worlds. Do you really want to quit?" msgstr "Es sind noch %d Welten verbunden. Soll trotzdem beendet werden?" #: ../src/main.c:291 msgid "Really Quit KildClient?" msgstr "Soll KildClient wirklich beendet werden?" #: ../src/main.c:293 msgid "_Don't quit" msgstr "_Nicht beenden" #: ../src/main.c:294 ../src/wndmain.ui:145 msgid "_Quit" msgstr "_Beenden" #: ../src/net.c:110 msgid "" "You're attempting to connect to a world that uses SSL, but this version of " "KildClient has been built without SSL support. Try to connect without SSL?" msgstr "" "Es wird versucht mit einer Welt zu verbinden, die SSL verwendet. Diese " "Version von Kildclient wurde aber ohne SSL-Unterstützung erstellt. Soll die " "Verbindung ohne SSL-Verschlüsselung versucht werden?" #: ../src/net.c:111 msgid "KildClient Question" msgstr "Frage - KildClient" #: ../src/net.c:113 msgid "Connect without SSL" msgstr "Ohne SSL-Verschlüsselung verbinden" #: ../src/net.c:114 msgid "Do not connect" msgstr "Nicht verbinden" #: ../src/net.c:122 msgid "This version of KildClient does not have SSL support." msgstr "" "Diese Version von KildClient enthält keine Unterstützung für SSL-" "Verschlüsselung." #: ../src/net.c:198 ../src/proxy.c:212 #, c-format msgid "Resolving proxy host %s..." msgstr "Löse Proxy-Hostnamen %s auf..." #: ../src/net.c:201 #, c-format msgid "Resolving host %s..." msgstr "Löse Hostnamen %s auf..." #: ../src/net.c:294 ../src/proxy.c:196 #, c-format msgid "Could not resolve host %s: %s" msgstr "Kann Hostnamen %s nicht auflösen: %s" #: ../src/net.c:322 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "Versuche eine Verbindung zu %s (%s) an Port %s herzustellen..." #: ../src/net.c:325 #, c-format msgid "Attempting to connect to proxy host %s (%s) port %s..." msgstr "Versuche eine Verbindung zum Proxy %s (%s) an Port %s herzustellen..." #: ../src/net.c:341 #, c-format msgid "Could not create socket: %s" msgstr "Kann Socket nicht erzeugen: %s" #: ../src/net.c:344 #, c-format msgid "Could not create socket: error #%d" msgstr "Kann Socket nicht erzeugen: Fehler #%d" #: ../src/net.c:364 #, c-format msgid "Could not connect to host %s port %s: %s" msgstr "Kann nicht mit %s an Port %s verbinden: %s" #: ../src/net.c:374 #, c-format msgid "Could not connect to host %s port %s: Error #%d" msgstr "Kann nicht mit %s an Port %s verbinden: Fehler #%d" #: ../src/net.c:430 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Kann nicht mit %s verbinden: %s" #: ../src/net.c:433 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Kann nicht mit Proxy %s verbinden: %s" #: ../src/net.c:475 ../src/net.c:493 #, c-format msgid "Unable to connect to host %s: Error #%d." msgstr "Kann nicht mit %s verbinden: Fehler #%d." #: ../src/net.c:478 ../src/net.c:496 #, c-format msgid "Unable to connect to proxy host %s: Error #%d." msgstr "Kann nicht mit Proxy %s verbinden: Fehler #%d." #: ../src/net.c:532 #, c-format msgid "Performing SSL handshake..." msgstr "SSL-Handshake wird ausgeführt..." #: ../src/net.c:582 #, c-format msgid "SSL Handshake failed: %s" msgstr "SSL-Handshake schlug fehl: %s" #: ../src/net.c:624 #, c-format msgid "SSL Handshake took too long." msgstr "" #: ../src/net.c:653 ../src/net.c:1156 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Verbunden mit %s (%s) an Port %s." #: ../src/net.c:656 ../src/net.c:1159 #, c-format msgid "Connected to host %s port %s, via proxy %s (%s) port %s." msgstr "Verbunden mit %s an Port %s über Proxy %s (%s) an Port %s." #: ../src/net.c:663 ../src/net.c:1132 ../src/net.c:1166 msgid " SSL enabled." msgstr "SSL eingeschaltet." #: ../src/net.c:681 ../src/perlscript.c:3234 #, c-format msgid "Logging to file %s.\n" msgstr "Verwende Protokolldatei %s.\n" #: ../src/net.c:827 #, c-format msgid "Disconnected from host %s." msgstr "Verbindung mit %s wurde getrennt." #: ../src/net.c:900 ../src/net.c:909 #, c-format msgid "Disconnected from host %s: %s." msgstr "Verbindung mit %s wurde getrennt: %s." #: ../src/net.c:920 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "Verbindung mit %s wurde getrennt: Fehler #%d." #: ../src/net.c:1120 #, c-format msgid "Connected to host %s (%s) port %s, MCCP version %d enabled." msgstr "Verbunden mit %s (%s) an Port %s. Verwende MCCP Version %d." #: ../src/net.c:1124 #, c-format msgid "" "Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d " "enabled." msgstr "" "Verbunden mit %s an Port %s, über Proxy %s (%s) an Port %s. Verwende MCCP " "version %d." #: ../src/net.c:1242 ../src/we_logging.c:123 msgid "Not connected." msgstr "Nicht verbunden." #. success #: ../src/proxy.c:60 msgid "general failure" msgstr "Allgemeiner Fehler" #: ../src/proxy.c:61 msgid "connection not allowed by ruleset" msgstr "Die Regeln verbieten die Verbindung" #: ../src/proxy.c:62 msgid "network unreachable" msgstr "Netzwerk nicht erreichbar" #: ../src/proxy.c:63 msgid "host unreachable" msgstr "Gegenstelle nicht erreichbar" #: ../src/proxy.c:64 msgid "connection refused by destination host" msgstr "Verbindung wurde von der Gegenstelle abgelehnt" #: ../src/proxy.c:65 msgid "TTL expired" msgstr "TTL abgelaufen" #: ../src/proxy.c:66 msgid "command not supported / protocol error" msgstr "Befehl wird nicht unterstützt / Protokollfehler" #: ../src/proxy.c:67 msgid "address type not supported" msgstr "Addresstyp wird nicht unterstützt" #: ../src/proxy.c:242 ../src/proxy.c:664 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "Verbunden mit Proxyserver %s an Port %s, sende Anfrage...." #: ../src/proxy.c:297 ../src/proxy.c:426 ../src/proxy.c:471 ../src/proxy.c:545 #: ../src/proxy.c:711 msgid "Error while reading from proxy host." msgstr "Fehler beim Lesen vom Proxyserver." #: ../src/proxy.c:318 msgid "request rejected or failed" msgstr "Anfrage wurde abgelehnt oder schlug fehl" #: ../src/proxy.c:322 msgid "request failed because identd could not be reached" msgstr "Anfrage fehlgeschlagen, da der IDENT-Server nicht erreichbar war" #: ../src/proxy.c:326 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" "Anfrage fehlgeschlagen, da der IDENT-Server die Benutzeridentifikation nicht " "bestätigt hat" #: ../src/proxy.c:330 ../src/proxy.c:571 ../src/proxy.c:727 #, c-format msgid "Proxy request failed: %s." msgstr "Proxy-Anfrage fehlgeschlagen: %s." #: ../src/proxy.c:347 #, c-format msgid "Connected to proxy server %s port %s, negotiating authentication..." msgstr "Verbunden mit Proxyserver %s an Port %s, Authentifizierung läuft..." #: ../src/proxy.c:441 msgid "No acceptable proxy authentication methods." msgstr "" "Es sind keine akzeptablen Authentifizierungsmethoden beim Proxy verfügbar." #: ../src/proxy.c:489 msgid "Proxy authentication failed." msgstr "Die Authentifizierung am Proxy ist fehlgeschlagen." #. Should never happen #: ../src/proxy.c:532 msgid "Unrecognized response from proxy host." msgstr "Unverständliche Antwort vom Proxyserver." #: ../src/proxy.c:566 msgid "unknown reason code" msgstr "Unbekannter Grund." #: ../src/proxy.c:587 #, c-format msgid "Sending proxy authentication credentials..." msgstr "Sende Authentifizierungsdaten an den Proxyserver..." #: ../src/proxy.c:626 #, c-format msgid "Sending connection request..." msgstr "Sending Verbindungsanfrage..." #: ../src/mainwindow.c:163 ../src/mainwindow.c:537 ../src/mainwindow.c:803 #: ../src/worldgui.c:1096 ../src/worldselector.c:193 ../src/worldeditor.c:180 #: ../src/we_general.c:342 ../src/we_generic_guied.c:81 #: ../src/we_triggers.c:83 ../src/we_triggers.c:553 ../src/we_triggers.c:751 #: ../src/we_aliases.c:76 ../src/we_aliases.c:455 ../src/we_macros.c:79 #: ../src/we_macros.c:420 ../src/we_timers.c:76 ../src/we_timers.c:457 #: ../src/we_hooks.c:87 ../src/we_hooks.c:620 ../src/we_vars.c:76 #: ../src/we_vars.c:368 ../src/prefs.c:107 ../src/triggers.c:278 #: ../src/multilinesend.c:93 ../src/cmdhistory.c:209 ../src/cmdhistory.c:454 #, c-format msgid "Error loading UI from XML file: %s" msgstr "" #: ../src/mainwindow.c:596 ../src/mainwindow.c:597 msgid "Not connected" msgstr "Nicht verbunden" #: ../src/mainwindow.c:739 msgid ": Not yet active" msgstr ": Noch nicht aktiv" #: ../src/mainwindow.c:744 msgid ": Expired" msgstr ": Abgelaufen" #: ../src/mainwindow.c:758 ../src/kildclient.ui:1995 #: ../src/dlgStatistics.ui:104 ../src/dlgStatistics.ui:337 msgid "None" msgstr "Keine" #: ../src/worldgui.c:220 msgid "_Find:" msgstr "_Suchen:" #: ../src/worldgui.c:234 msgid "Find Next" msgstr "Weitersuchen" #: ../src/worldgui.c:261 msgid "Click to clear the command input area." msgstr "Klicken um die Befehlseingabe zu löschen." #: ../src/worldgui.c:360 msgid "No world" msgstr "Keine Welt" #: ../src/worldgui.c:430 msgid "KildClient ready" msgstr "KildClient bereit" #: ../src/worldgui.c:437 msgid "0 lines" msgstr "0 Zeilen" #: ../src/worldgui.c:890 msgid "Are you sure you want to close this world?" msgstr "Soll diese Welt wirklich geschlossen werden?" #: ../src/worldgui.c:891 msgid "Really close?" msgstr "Wirklich schließen?" #: ../src/worldgui.c:893 msgid "Keep _open" msgstr "_Offen halten" #: ../src/worldgui.c:894 ../src/worldselector.c:816 ../src/worldselector.c:822 #: ../src/wndmain.ui:72 ../src/dlgPreferences.ui:136 #: ../src/dlgTestTriggers.ui:23 ../src/dlgCmdHistory.ui:197 msgid "_Close" msgstr "S_chließen" #: ../src/worldgui.c:1025 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Fehler beim Setzen der Rechtschreibkorrektur: %s\n" #: ../src/worldgui.c:1029 msgid "Spell checking support not included in this build." msgstr "Die Unterstützung für die Rechtschreibprüfung ist nicht verfügbar." #: ../src/worldgui.c:1275 msgid "Click to open link; right-click for more options." msgstr "Klicken um den Link zu öffnen; Rechtsklick für weitere Optionen." #: ../src/worldgui.c:1437 msgid "Not found" msgstr "Nicht gefunden" #: ../src/ansitextview.c:423 msgid "1 line" msgstr "1 Zeile" #: ../src/ansitextview.c:425 #, c-format msgid "%d lines" msgstr "%d Zeilen" #: ../src/worldselector.c:138 ../src/worldselector.c:689 #, c-format msgid "Could not load world from file '%s': %s" msgstr "Kann Weltdatei '%s' nicht laden: %s" #: ../src/worldselector.c:141 ../src/worldselector.c:692 ../src/worlds.c:2370 #: ../src/we_generic_guied.c:315 ../src/we_generic_guied.c:404 #: ../src/prefs.c:448 ../src/prefs.c:527 msgid "KildClient Error" msgstr "Fehler - KildClient" #: ../src/worldselector.c:494 #, c-format msgid "Could not open world '%s': %s\n" msgstr "Kann Welt '%s' nicht öffnen: %s\n" #: ../src/worldselector.c:537 #, c-format msgid "Invalid argument '%s'\n" msgstr "Ungültiges Argument '%s'\n" #: ../src/worldselector.c:810 msgid "Disconnected" msgstr "Verbindung getrennt" #: ../src/worldselector.c:813 ../src/worldselector.c:820 msgid "Reconnect" msgstr "Erneut verbinden" #: ../src/worldselector.c:814 ../src/worldselector.c:821 msgid "Connect to another world" msgstr "Mit einer anderen Welt verbinden" #: ../src/worldselector.c:815 msgid "Offline" msgstr "Offline bleiben" #: ../src/worlds.c:776 msgid "Unnamed world" msgstr "Namenlose Welt" #: ../src/worlds.c:833 #, c-format msgid "Could not open file: %s" msgstr "Kann Datei nicht öffnen: %s" #: ../src/worlds.c:896 #, fuzzy, c-format msgid "Invalid top-level element '%s'" msgstr "Ungültiges Attribut '%s' für das Element '%s'" #: ../src/worlds.c:1710 #, c-format msgid "Internal error: element '%s' ends when in START mode" msgstr "" "Interner Fehler: Element '%s' endet obwohl der Beginn eines neuen Elements " "erwartet wird" #: ../src/worlds.c:1984 #, c-format msgid "Invalid key code '%s'" msgstr "Schlüsselwert '%s' ist ungültig" #: ../src/worlds.c:2003 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "Element '%s' ist innerhalb des Elements '%s' nicht erlaubt" #: ../src/worlds.c:2016 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "Ungültiges Attribut '%s' für das Element '%s'" #: ../src/worlds.c:2367 ../src/we_generic_guied.c:312 ../src/prefs.c:445 #, c-format msgid "Could not open file '%s': %s" msgstr "Kann Datei '%s' nicht öffnen: %s" #: ../src/worlds.c:2528 #, c-format msgid "Disconnected from world %s" msgstr "Verbindung zur Welt %s getrennt" #: ../src/worldeditor.c:245 msgid "General" msgstr "Allgemein" #: ../src/worldeditor.c:253 ../src/worldeditor.c:257 msgid "Display" msgstr "Anzeige" #: ../src/worldeditor.c:254 msgid "Here you can set options to configure the appearance of KildClient." msgstr "Hier kann das Erscheinungsbild von KildClient angepasst werden." #: ../src/worldeditor.c:265 msgid "Main Window" msgstr "Hauptfenster" #: ../src/worldeditor.c:273 msgid "Colors" msgstr "Farben" #: ../src/worldeditor.c:281 msgid "Status Bar" msgstr "Statuszeile" #: ../src/worldeditor.c:289 msgid "Input" msgstr "Eingabe" #: ../src/worldeditor.c:297 msgid "Logging" msgstr "Protokollierung" #: ../src/worldeditor.c:303 ../src/worldeditor.c:307 msgid "Automation" msgstr "Automatisierung" #: ../src/worldeditor.c:304 msgid "" "Here you can set options to configure the automation features of KildClient, " "such as triggers, aliases, plugins, etc." msgstr "" "Hier können Automatisierungsfunktionen von KildClient wie Trigger, Aliase " "oder Plugins eingestellt werden." #: ../src/worldeditor.c:315 msgid "Scripting" msgstr "Skripte" #: ../src/worldeditor.c:323 msgid "Plugins" msgstr "Plugins" #: ../src/worldeditor.c:334 ../src/kildclient.ui:1556 msgid "Triggers" msgstr "Trigger" #: ../src/worldeditor.c:345 ../src/kildclient.ui:1571 msgid "Aliases" msgstr "Aliase" #: ../src/worldeditor.c:356 ../src/kildclient.ui:1586 msgid "Macros" msgstr "Makros" #: ../src/worldeditor.c:367 ../src/kildclient.ui:1601 msgid "Timers" msgstr "Timer" #: ../src/worldeditor.c:378 msgid "Hooks" msgstr "Hooks" #: ../src/worldeditor.c:389 msgid "Variables" msgstr "Variablen" #: ../src/worldeditor.c:398 msgid "Protocols" msgstr "Netzwerk" #: ../src/worldeditor.c:406 msgid "Miscellaneous" msgstr "Verschiedenes" #: ../src/worldeditor.c:414 msgid "Advanced" msgstr "Erweitert" #: ../src/we_general.c:73 msgid "Character" msgstr "Charakter" #: ../src/we_general.c:81 msgid "Password" msgstr "Passwort" #: ../src/we_general.c:381 msgid "You must specify the name." msgstr "Ein Name muss angegeben werden." #: ../src/we_general.c:382 ../src/we_general.c:395 ../src/we_triggers.c:636 #: ../src/we_triggers.c:650 ../src/we_aliases.c:517 ../src/we_aliases.c:530 #: ../src/we_macros.c:477 ../src/we_macros.c:490 ../src/we_macros.c:503 #: ../src/we_timers.c:516 ../src/we_timers.c:529 ../src/we_hooks.c:672 #: ../src/we_vars.c:396 ../src/we_vars.c:408 ../src/we_vars.c:428 #: ../src/permanentvariables.c:129 ../src/cmdhistory.c:278 #: ../src/cmdhistory.c:290 ../src/cmdhistory.c:484 ../src/cmdhistory.c:517 #: ../src/cmdhistory.c:574 msgid "KildClient Warning" msgstr "Warnung - KildClient" #: ../src/we_general.c:394 msgid "You must specify the password." msgstr "Ein Passwort muss angegeben werden.." #: ../src/we_general.c:436 msgid "character" msgstr "Charakter" #: ../src/we_logging.c:112 #, c-format msgid "Logging to file %s." msgstr "Protokolliere in Datei %s." #: ../src/we_logging.c:118 msgid "Logging is disabled." msgstr "Die Protokollierung ist ausgeschaltet." #: ../src/we_logging.c:215 msgid "Logging not started" msgstr "Die Protokollierung ist nicht gestartet." #: ../src/we_logging.c:245 msgid "Select log file" msgstr "Auswahl der Protokolldatei" #: ../src/we_logging.c:248 ../src/we_plugins.c:584 #: ../src/we_generic_guied.c:97 ../src/we_generic_guied.c:369 #: ../src/kildclient.ui:40 ../src/kildclient.ui:516 ../src/kildclient.ui:580 #: ../src/kildclient.ui:711 ../src/kildclient.ui:908 ../src/kildclient.ui:1125 #: ../src/kildclient.ui:1449 ../src/kildclient.ui:2170 #: ../src/dlgSelectWorld.ui:25 ../src/dlgEditWorld.ui:114 #: ../src/dlgMLSend.ui:36 ../src/dlgCmdHistory.ui:352 msgid "_Cancel" msgstr "_Abbrechen" #: ../src/we_logging.c:250 ../src/kildclient.ui:55 ../src/kildclient.ui:531 #: ../src/kildclient.ui:595 ../src/kildclient.ui:726 ../src/kildclient.ui:923 #: ../src/kildclient.ui:1140 ../src/kildclient.ui:1464 #: ../src/kildclient.ui:2185 ../src/dlgStatistics.ui:22 #: ../src/dlgEditWorld.ui:129 ../src/dlgCmdHistory.ui:367 msgid "_OK" msgstr "_OK" #: ../src/we_plugins.c:124 ../src/we_plugins.c:341 ../src/we_triggers.c:225 #: ../src/we_aliases.c:206 ../src/we_macros.c:209 ../src/we_timers.c:206 #: ../src/we_hooks.c:341 ../src/perlscript.c:3356 msgid "Name" msgstr "Name" #: ../src/we_plugins.c:136 ../src/we_plugins.c:383 ../src/perlscript.c:3357 msgid "Description" msgstr "Beschreibung" #: ../src/we_plugins.c:148 ../src/we_plugins.c:369 msgid "Author" msgstr "Autor" #: ../src/we_plugins.c:161 msgid "File" msgstr "Datei" #: ../src/we_plugins.c:209 ../src/we_plugins.c:466 msgid "Error Loading Plugin" msgstr "Fehler beim Laden eines Plugins" #: ../src/we_plugins.c:327 ../src/we_triggers.c:211 ../src/we_aliases.c:192 #: ../src/we_macros.c:195 ../src/we_timers.c:192 ../src/we_hooks.c:327 msgid "Enabled" msgstr "Aktiviert" #: ../src/we_plugins.c:355 msgid "Version" msgstr "Version" #: ../src/we_plugins.c:444 msgid "Always load this plugin at _startup" msgstr "Dieses Plugin beim Programmstart _laden" #: ../src/we_plugins.c:507 msgid "The help is displayed in main window." msgstr "Die Hilfe wird im Hauptfenster angezeigt." #: ../src/we_plugins.c:508 msgid "KildClient Information" msgstr "Information - KildClient" #: ../src/we_plugins.c:509 msgid "_Do not display this message again" msgstr "Diese Meldung _nicht noch einmal anzeigen" #: ../src/we_plugins.c:581 msgid "Load plugin" msgstr "Plugin laden" #: ../src/we_plugins.c:586 ../src/we_generic_guied.c:371 msgid "_Open" msgstr "Ö_ffnen" #: ../src/we_generic_guied.c:94 msgid "Export" msgstr "Exportieren" #: ../src/we_generic_guied.c:99 ../src/wndmain.ui:97 msgid "_Save" msgstr "_Speichern" #: ../src/we_generic_guied.c:366 msgid "Import" msgstr "Importieren" #: ../src/we_generic_guied.c:401 #, c-format msgid "Could not import file '%s': %s" msgstr "Kann Datei '%s' nicht importieren: %s" #: ../src/we_generic_guied.c:960 #, c-format msgid "Do you really want to delete the %s?" msgstr "Soll %s wirklich gelöscht werden?" #: ../src/we_generic_guied.c:967 #, c-format msgid "Do you really want to delete %d %s?" msgstr "Sollen %d %s wirklich gelöscht werden?" #: ../src/we_generic_guied.c:971 ../src/we_vars.c:288 msgid "Confirm deletion" msgstr "Löschvorgang bestätigen" #: ../src/we_generic_guied.c:973 msgid "Do not delete" msgstr "Nicht löschen" #: ../src/we_generic_guied.c:974 msgid "Delete" msgstr "Löschen" #: ../src/we_triggers.c:130 ../src/dlgTestTriggers.ui:8 msgid "Test Triggers" msgstr "Trigger testen" #: ../src/we_triggers.c:239 ../src/we_aliases.c:220 ../src/triggers.c:141 #: ../src/aliases.c:177 msgid "Pattern" msgstr "Muster" #: ../src/we_triggers.c:257 ../src/we_aliases.c:238 msgid "I. Case" msgstr "I. Fall" #: ../src/we_triggers.c:271 ../src/we_macros.c:237 ../src/we_timers.c:246 #: ../src/we_hooks.c:355 ../src/triggers.c:142 ../src/macros.c:145 #: ../src/timers.c:203 msgid "Action" msgstr "Aktion" #: ../src/we_triggers.c:289 msgid "Gag" msgstr "Gag" #: ../src/we_triggers.c:307 msgid "Gag Log" msgstr "Gag Protokoll" #: ../src/we_triggers.c:325 msgid "Keep Exec" msgstr "_Ausführung beibehalten" #: ../src/we_triggers.c:343 msgid "Rewriter" msgstr "Rewriter" #: ../src/we_triggers.c:361 msgid "Style" msgstr "Stil" #: ../src/we_triggers.c:375 ../src/we_aliases.c:284 ../src/we_macros.c:251 #: ../src/we_timers.c:278 ../src/we_hooks.c:369 msgid "Plugin" msgstr "Plugin" #: ../src/we_triggers.c:471 ../share/kildclient.pl:233 #: ../share/kildclient.pl:236 ../share/kildclient.pl:443 #: ../share/kildclient.pl:518 ../share/kildclient.pl:821 msgid "trigger" msgstr "Trigger" #: ../src/we_triggers.c:471 ../share/kildclient.pl:443 msgid "triggers" msgstr "Trigger" #: ../src/we_triggers.c:635 ../src/we_aliases.c:516 msgid "You must specify the pattern." msgstr "Das Muster muss angegeben werden." #: ../src/we_triggers.c:649 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" "So lange der Trigger kein Gag ist oder den einen Stil ändert, muss eine " "Aktion angegeben werden." #: ../src/we_aliases.c:252 ../src/aliases.c:178 msgid "Substitution" msgstr "Ersetzen" #: ../src/we_aliases.c:270 msgid "Eval as Perl" msgstr "Als Perl-Code auführen" #: ../src/we_aliases.c:380 ../share/kildclient.pl:246 #: ../share/kildclient.pl:249 ../share/kildclient.pl:449 #: ../share/kildclient.pl:524 ../share/kildclient.pl:833 msgid "alias" msgstr "Alias" #: ../src/we_aliases.c:380 ../share/kildclient.pl:449 msgid "aliases" msgstr "Aliase" #: ../src/we_aliases.c:529 msgid "You must specify the substitution." msgstr "Die Ersetzung muss angegeben werden." #: ../src/we_macros.c:223 ../src/macros.c:144 msgid "Key" msgstr "Schlüssel" #: ../src/we_macros.c:347 ../share/kildclient.pl:259 #: ../share/kildclient.pl:262 ../share/kildclient.pl:455 #: ../share/kildclient.pl:530 ../share/kildclient.pl:845 msgid "macro" msgstr "Makro" #: ../src/we_macros.c:347 ../share/kildclient.pl:455 msgid "macros" msgstr "Makros" #: ../src/we_macros.c:476 msgid "You must specify the key." msgstr "Der Schlüssel muss angegeben werden." #: ../src/we_macros.c:489 msgid "Invalid key code." msgstr "Ungültiger Schlüsselcode." #: ../src/we_macros.c:502 ../src/we_timers.c:528 ../src/we_hooks.c:671 msgid "You must specify the action." msgstr "Die Aktion muss angegeben werden." #: ../src/we_timers.c:219 msgid "Interval" msgstr "Interval" #: ../src/we_timers.c:232 msgid "Count" msgstr "Anzahl" #: ../src/we_timers.c:264 msgid "Temp" msgstr "Temporär" #: ../src/we_timers.c:381 ../share/kildclient.pl:272 #: ../share/kildclient.pl:275 ../share/kildclient.pl:461 #: ../share/kildclient.pl:536 ../share/kildclient.pl:857 msgid "timer" msgstr "Timer" #: ../src/we_timers.c:381 ../share/kildclient.pl:461 msgid "timers" msgstr "Timer" #: ../src/we_timers.c:515 msgid "The interval must be positive." msgstr "Der Interval muss positiv sein." #. The manually added combo for selecting which hook #: ../src/we_hooks.c:130 msgid "_Event:" msgstr "_Ereignis:" #: ../src/we_hooks.c:547 ../share/kildclient.pl:286 ../share/kildclient.pl:289 #: ../share/kildclient.pl:467 ../share/kildclient.pl:543 #: ../share/kildclient.pl:870 msgid "hook" msgstr "Hook" #: ../src/we_hooks.c:547 ../share/kildclient.pl:467 msgid "hooks" msgstr "Hooks" #: ../src/we_vars.c:279 msgid "Do you really want to make the variable temporary?" msgstr "Soll die Veriable wirklich zu einer temporären umgewandelt werden?" #: ../src/we_vars.c:285 #, c-format msgid "Do you really want to make %d variables temporary?" msgstr "Sollen %d Variablen wirklich in temporäre umgewandelt werden?" #: ../src/we_vars.c:290 msgid "Keep permanent" msgstr "Permanent behalten" #: ../src/we_vars.c:291 msgid "Make temporary" msgstr "In temporäre Variable umwandeln" #: ../src/we_vars.c:395 msgid "You must specify a variable name." msgstr "Ein Variablenname muss angegeben werden." #: ../src/we_vars.c:407 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "" "Nur Skalar ($), Array (@) und Hash (%%) -Variablen können permanent sein." #: ../src/we_vars.c:426 #, c-format msgid "%s is already permanent." msgstr "%s ist bereits permanent." #: ../src/prefs.c:398 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "Ungültige Fenstergröße in der Konfigurationsdatei.\n" #: ../src/prefs.c:418 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "Unbekannte Direktive '%s' in der Konfigurationsdatei.\n" #: ../src/prefs.c:524 #, c-format msgid "Could not create directory '%s': %s" msgstr "Kann Verzeichnis '%s' nicht erstellen: %s" #: ../src/parser.c:210 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "" "Warnung: Es soll eine sehr lange Kommandozeile gesendet werden. Wurde ein " "Alias rekursiv definiert?" #: ../src/triggers.c:140 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "" #: ../src/triggers.c:162 ../src/triggers.c:163 ../src/triggers.c:164 #: ../src/triggers.c:165 ../src/triggers.c:166 ../src/triggers.c:167 #: ../src/triggers.c:168 ../src/aliases.c:198 ../src/aliases.c:199 #: ../src/aliases.c:200 ../src/macros.c:167 ../src/timers.c:226 #: ../src/timers.c:227 ../src/hooks.c:206 ../src/perlscript.c:3376 msgid "y" msgstr "j" #: ../src/triggers.c:162 ../src/triggers.c:163 ../src/triggers.c:164 #: ../src/triggers.c:165 ../src/triggers.c:166 ../src/triggers.c:167 #: ../src/triggers.c:168 ../src/aliases.c:198 ../src/aliases.c:199 #: ../src/aliases.c:200 ../src/macros.c:167 ../src/timers.c:226 #: ../src/timers.c:227 ../src/hooks.c:206 ../src/perlscript.c:3376 msgid "n" msgstr "n" #: ../src/triggers.c:361 ../src/kildclient.ui:1978 ../src/kildclient.ui:2015 msgid "No" msgstr "Nein" #: ../src/triggers.c:361 ../src/kildclient.ui:1981 ../src/kildclient.ui:2018 msgid "Yes" msgstr "Ja" #: ../src/aliases.c:176 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "" #: ../src/macros.c:143 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "" #: ../src/timers.c:195 msgid "Num Ena Temp Int " msgstr "" #: ../src/timers.c:199 msgid "Count " msgstr "Zähler " #: ../src/permanentvariables.c:125 #, c-format msgid "" "Could not open file '%s': %s\n" "Variables were not saved." msgstr "" "Kann Datei '%s' nicht öffnen: %s\n" "Variablen wurden nicht gesichert." #: ../src/hooks.c:60 #, c-format msgid "hook: hook '%s' not found\n" msgstr "Hook: Hook '%s' nicht gefunden\n" #: ../src/hooks.c:76 ../src/hooks.c:229 msgid "No such hook" msgstr "Es existiert kein solcher Hook." #: ../src/hooks.c:178 ../src/hooks.c:224 msgid "Hook not found" msgstr "Hook nicht gefunden" #: ../src/hooks.c:191 #, c-format msgid "Hooks for '%s':\n" msgstr "Hooks für '%s':\n" #: ../src/hooks.c:192 msgid "Num Ena Action" msgstr "" #: ../src/hooks.c:234 #, c-format msgid "" "Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Hook Nummer %d für das Ereignis %s\n" " Name: %s\n" " Aktion: %s\n" " Aktiv: %s\n" #: ../src/hooks.c:240 ../src/perlscript.c:1691 ../src/perlscript.c:2191 #: ../src/perlscript.c:2501 ../src/perlscript.c:2790 msgid "Not set" msgstr "Nicht definiert" #: ../src/hooks.c:242 ../src/perlscript.c:1694 ../src/perlscript.c:1695 #: ../src/perlscript.c:1696 ../src/perlscript.c:1697 ../src/perlscript.c:1698 #: ../src/perlscript.c:1699 ../src/perlscript.c:1700 ../src/perlscript.c:2194 #: ../src/perlscript.c:2195 ../src/perlscript.c:2196 ../src/perlscript.c:2504 #: ../src/perlscript.c:2794 ../src/perlscript.c:2795 ../src/perlscript.c:3414 msgid "yes" msgstr "Ja" #: ../src/hooks.c:242 ../src/perlscript.c:1694 ../src/perlscript.c:1695 #: ../src/perlscript.c:1696 ../src/perlscript.c:1697 ../src/perlscript.c:1698 #: ../src/perlscript.c:1699 ../src/perlscript.c:1700 ../src/perlscript.c:2194 #: ../src/perlscript.c:2195 ../src/perlscript.c:2196 ../src/perlscript.c:2504 #: ../src/perlscript.c:2794 ../src/perlscript.c:2795 ../src/perlscript.c:3414 msgid "no" msgstr "Nein" #: ../src/log.c:105 msgid "File name not specified." msgstr "Dateiname nicht angegeben." #: ../src/log.c:171 #, c-format msgid "Could not open log file: %s." msgstr "Kann Protokolldatei nicht öffnen: %s." #: ../src/plugins.c:102 ../src/plugins.c:161 #, c-format msgid "Failed loading file %s: %s" msgstr "Fehler beim Laden der Datei %s: %s" #: ../src/cmdhistory.c:277 msgid "No command selected." msgstr "Es ist kein Befehl ausgewählt." #: ../src/cmdhistory.c:289 msgid "More than one command selected." msgstr "Es ist mehr als ein Befehl ausgewählt." #: ../src/cmdhistory.c:483 msgid "Enter some text to search for." msgstr "Geben Sie den Text ein, nach dem gesucht werden soll." #: ../src/cmdhistory.c:516 msgid "Use the Find button to find the first result." msgstr "Verwenden Sie den Suchknopf, um das erste Vorkommen zu suchen." #: ../src/cmdhistory.c:573 msgid "Command not found." msgstr "Befehl nicht gefunden." #: ../src/perlscript.c:506 ../src/perlscript.c:512 ../src/perlscript.c:519 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "Ungültiger Funktionsaufruf: Syntax ist $world->FUNKTION" #: ../src/perlscript.c:673 ../src/perlscript.c:690 ../src/perlscript.c:752 #: ../src/perlscript.c:785 ../src/perlscript.c:1186 ../src/perlscript.c:1211 #: ../src/perlscript.c:1312 ../src/perlscript.c:1332 ../src/perlscript.c:1355 #: ../src/perlscript.c:1383 ../src/perlscript.c:1392 ../src/perlscript.c:1932 #: ../src/perlscript.c:1941 ../src/perlscript.c:2120 ../src/perlscript.c:2291 #: ../src/perlscript.c:2300 ../src/perlscript.c:2580 ../src/perlscript.c:2589 #: ../src/perlscript.c:2865 ../src/perlscript.c:2919 ../src/perlscript.c:2964 #: ../src/perlscript.c:3029 ../src/perlscript.c:3040 ../src/perlscript.c:3132 #: ../src/perlscript.c:3463 ../src/kcwin.c:96 #, c-format msgid "%s: Too few arguments" msgstr "%s: Zu wenig Argumente" #: ../src/perlscript.c:718 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: Das Argument muss numerisch sein" #: ../src/perlscript.c:766 ../src/perlscript.c:798 #, c-format msgid "%s: No such world" msgstr "%s: Keine solche Welt gefunden" #: ../src/perlscript.c:833 msgid "World saved." msgstr "Welt gesichert." #: ../src/perlscript.c:1082 ../src/perlscript.c:1097 ../src/perlscript.c:1107 #: ../src/perlscript.c:1268 ../share/kildclient.pl:1303 #, c-format, perl-format msgid "%s: This is an internal function, do not call directly." msgstr "" "%s: Dies ist eine interne Funktion, die nicht direkt aufgerufen werden " "sollte." #: ../src/perlscript.c:1086 ../src/perlscript.c:1514 ../src/perlscript.c:2043 #: ../src/perlscript.c:2416 ../src/perlscript.c:2611 ../src/perlscript.c:3093 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Falscher Argumenttyp" #: ../src/perlscript.c:1278 ../src/perlscript.c:1284 #, c-format msgid "Protocol %s not enabled." msgstr "Protokoll %s nicht eingeschaltet." #: ../src/perlscript.c:1289 ../share/kildclient.pl:1151 msgid "Unknown protocol" msgstr "Unbekannter Protokoll." #: ../src/perlscript.c:1406 ../src/perlscript.c:1674 msgid "No such trigger" msgstr "Kein solcher Trigger" #: ../src/perlscript.c:1424 ../src/perlscript.c:1973 ../src/perlscript.c:2345 #: ../src/perlscript.c:3052 #, c-format msgid "%s: Too many string arguments" msgstr "%s: Zu viele String-Argumente" #: ../src/perlscript.c:1447 ../src/perlscript.c:1996 #, c-format msgid "%s: pattern given twice, using the named attribute one" msgstr "%s: Das Muster wurde zweimal mit Attribut eins angegeben" #: ../src/perlscript.c:1459 ../src/perlscript.c:2394 ../src/perlscript.c:3072 #, c-format msgid "%s: action given twice, using the named attribute one" msgstr "%s: Die Aktion wurde zweimal mit dem Attribut eins angegeben" #: ../src/perlscript.c:1505 ../src/perlscript.c:2034 ../src/perlscript.c:2407 #: ../src/perlscript.c:3085 #, c-format msgid "%s: Wrong type of reference" msgstr "%s: Falscher Referenztyp" #: ../src/perlscript.c:1525 #, c-format msgid "%s: pattern not specified, not creating" msgstr "%s: Muster ist nicht definiert. Erzeuge nichts." #: ../src/perlscript.c:1534 #, c-format msgid "%s: action not specified, and isn't gag, not creating" msgstr "%s: Aktion ist nicht definiert und kein Gag. Erzeuge nichts." #: ../src/perlscript.c:1563 msgid "Trigger added." msgstr "Trigger hinzugefügt." #: ../src/perlscript.c:1568 msgid "Trigger modified." msgstr "Triger wurde verändert." #: ../src/perlscript.c:1593 #, c-format msgid "%s: invalid target" msgstr "%s: ungültiges Ziel" #: ../src/perlscript.c:1603 #, c-format msgid "%s: invalid fg color" msgstr "%s: Ungültige Vordergrundfarbe" #: ../src/perlscript.c:1613 #, c-format msgid "%s: invalid bg color" msgstr "%s: Ungültige Hintergrundfarbe" #: ../src/perlscript.c:1623 #, c-format msgid "%s: invalid underline style" msgstr "%s: Ungültiger Stil für Unterstreichungen" #: ../src/perlscript.c:1679 #, c-format msgid "" "Trigger number %d\n" " Name: %s\n" " Pattern: %s\n" " Action: %s\n" " Enabled: %s\n" " Ignore case: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Keep executing: %s\n" " Rewriter: %s\n" " Change style: %s\n" msgstr "" "Trigger Nummer %d\n" " Name: %s\n" " Muster: %s\n" " Aktion: %s\n" " Aktiv: %s\n" " Ignoriere Groß-/Kleinschreibung: %s\n" " Gag-Ausgabe: %s\n" " Gag ins Protkoll: %s\n" " Ausführung beibehalten: %s\n" " Rewriter: %s\n" " Stiländerung: %s\n" #: ../src/perlscript.c:1703 #, c-format msgid "" " Target: %d\n" " Foreground: %d\n" " Background: %d\n" " Italics: %d\n" " Striked-thru: %d\n" " Underline: %d\n" msgstr "" " Ziel: %d\n" " Vordergrund: %d\n" " Hintergrund: %d\n" " Kursiv: %d\n" " Durchgestrichen: %d\n" " Unterstrichen: %d\n" #: ../src/perlscript.c:1955 ../src/perlscript.c:2178 msgid "No such alias" msgstr "Kein solcher Alias." #: ../src/perlscript.c:2008 #, c-format msgid "%s: substitution given twice, using the named attribute one" msgstr "%s: Ersetzung zweimal mit dem Attribut eins angegeben" #: ../src/perlscript.c:2054 msgid "alias: not creating alias without pattern" msgstr "alias: Alias wird ohne Muster nicht erzeugt" #: ../src/perlscript.c:2062 msgid "alias: not creating alias without substitution" msgstr "alias: Alias wird ohne Ersetzung nicht erzeugt" #: ../src/perlscript.c:2090 msgid "Alias added." msgstr "Alias hinzugefügt" #: ../src/perlscript.c:2095 msgid "Alias modified." msgstr "Alias geändert." #: ../src/perlscript.c:2183 #, c-format msgid "" "Alias number %d\n" " Name: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Ignore case: %s\n" " Eval as Perl: %s\n" " Enabled: %s\n" msgstr "" "Alias Nummer %d\n" " Name: %s\n" " Muster: %s\n" " Ersetzung: %s\n" " Ignoriere Groß-/Kleinschreibung: %s\n" " Als Perl-Code ausführen: %s\n" " Aktiv: %s\n" #: ../src/perlscript.c:2263 msgid "Press a key to get its keycode." msgstr "Drücken Sie eine Taste um deren Tastencode zu erhalten." #: ../src/perlscript.c:2315 msgid "macro: No such macro" msgstr "Makro: Kein solches Makro vorhanden" #: ../src/perlscript.c:2334 ../src/perlscript.c:2382 #, c-format msgid "%s: Invalid key code" msgstr "%s: Ungültiger Tastencode" #: ../src/perlscript.c:2371 #, c-format msgid "%s: keycode given twice, using the named attribute one" msgstr "%s: Tastencode wurde zweimal mit dem Attribut eins angegeben" #: ../src/perlscript.c:2427 #, c-format msgid "%s: keycode not specified, not creating" msgstr "%s: Tastencode nicht angegeben. Wird nicht erzeugt." #: ../src/perlscript.c:2434 ../src/perlscript.c:2702 #, c-format msgid "%s: action not specified, not creating" msgstr "%s: Aktion nicht angegeben. Wird nicht erzeugt." #: ../src/perlscript.c:2453 msgid "Macro added." msgstr "Makro hinzugefügt." #: ../src/perlscript.c:2458 msgid "Macro modified." msgstr "Makro geändert." #: ../src/perlscript.c:2489 msgid "No such macro" msgstr "Kein solches Makro vorhanden." #: ../src/perlscript.c:2495 #, c-format msgid "" "Macro number %d\n" " Name: %s\n" " Key Code: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Makro Nummer %d\n" " Name: %s\n" " Tastencode: %s\n" " Aktion: %s\n" " Aktiv: %s\n" #: ../src/perlscript.c:2605 msgid "timer: No such timer" msgstr "Timer: Kein solcher Timer vorhanden." #: ../src/perlscript.c:2630 #, c-format msgid "%s: interval must be numeric" msgstr "%s: Interval muss numerisch sein" #: ../src/perlscript.c:2643 #, c-format msgid "%s: count must be numeric" msgstr "%s: Anzahl muss numerisch sein" #: ../src/perlscript.c:2674 #, c-format msgid "%s: interval not specified, not creating" msgstr "%s: Interval nicht angegeben. Wird nicht erzeugt." #: ../src/perlscript.c:2681 #, c-format msgid "%s: cannot create timer with negative interval" msgstr "%s: Interval muss positiv sein." #: ../src/perlscript.c:2742 msgid "Timer added." msgstr "Timer hinzugefügt." #: ../src/perlscript.c:2747 msgid "Timer modified." msgstr "Timer geändert." #: ../src/perlscript.c:2777 msgid "No such timer" msgstr "Kein solcher Timer vorhanden." #: ../src/perlscript.c:2782 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %.3f\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" "Timer Nummer %d\n" " Name: %s\n" " Interval: %.3f\n" " Wiederholungen: %d\n" " Aktion: %s\n" " Aktiv: %s\n" " Temporär: %s\n" #: ../src/perlscript.c:2873 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" "%s: Nur Skalar ($), Array (@) und Hash (%%) -Variablen können permanent sein" #: ../src/perlscript.c:2882 #, c-format msgid "%s: %s is already permanent" msgstr "%s: %s ist schon permanent" #: ../src/perlscript.c:2896 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "%s: Variable '%s' in permanente Variable umgewandelt.\n" #: ../src/perlscript.c:2938 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "%s: Variable '%s' in permanente Variable umgewandelt.\n" #: ../src/perlscript.c:2942 #, c-format msgid "%s: %s is not permanent" msgstr "%s: %s ist nicht permanent" #: ../src/perlscript.c:2995 msgid "Permanent variables" msgstr "Permanente Variablen" #: ../src/perlscript.c:3107 msgid "Hook defined." msgstr "Hook definiert." #: ../src/perlscript.c:3111 msgid "Hook modified." msgstr "Hook geändert." #: ../src/perlscript.c:3217 msgid "Logging stopped." msgstr "Protokollierung gestoppt." #: ../src/perlscript.c:3355 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "" #: ../src/perlscript.c:3398 msgid "No such plugin" msgstr "Kein solches Plugin gefunden." #: ../src/perlscript.c:3403 #, c-format msgid "" "Plugin number %d\n" " Name: %s\n" " Version: %s\n" " Description: %s\n" " Author: %s\n" " Enabled: %s\n" msgstr "" "Plugin Nummer %d\n" " Name: %s\n" " Version: %s\n" " Beschreibung: %s\n" " Autor: %s\n" " Aktiv: %s\n" #: ../src/kildclient.ui:21 msgid "Edit Timer" msgstr "Timer bearbeiten" #: ../src/kildclient.ui:88 ../src/kildclient.ui:351 ../src/kildclient.ui:628 #: ../src/kildclient.ui:783 ../src/kildclient.ui:956 ../src/kildclient.ui:1173 #: ../src/dlgEditWorld.ui:240 ../src/dlgEditWorld.ui:3498 msgid "_Name:" msgstr "_Name:" #: ../src/kildclient.ui:100 msgid "Enter optionally a descriptive name for the timer" msgstr "Geben Sie optional einen beschreibenden Namen für den Timer ein" #: ../src/kildclient.ui:114 msgid "_Interval:" msgstr "_Interval:" #: ../src/kildclient.ui:132 msgid "Specify the interval, in seconds, between timer activations" msgstr "" "Geben Sie das Interval in Sekunden ein zwischen dem die Timer ausgelöst " "werden" #: ../src/kildclient.ui:150 msgid "seconds" msgstr "Sekunden" #: ../src/kildclient.ui:169 msgid "_Repeat count:" msgstr "_Wiederholungen:" #: ../src/kildclient.ui:187 msgid "" "Specify how many times this timer should run before being disabled or deleted" msgstr "" "Geben Sie an, wie oft ein Timer ausgeführt werden soll, bevor er gelöscht " "oder deaktiviert wird" #: ../src/kildclient.ui:204 msgid "(-1 to repeat indefinitely)" msgstr "(-1 für unbegrenzt viele Wiederholungen)" #: ../src/kildclient.ui:223 ../src/kildclient.ui:809 ../src/kildclient.ui:1021 #: ../src/kildclient.ui:1238 msgid "_Action:" msgstr "_Aktion:" #: ../src/kildclient.ui:235 msgid "Enter the action to be executed whenever the timer fires" msgstr "" "Geben Sie eine Aktion ein, die immer ausgeführt werden soll, wenn ein Timer " "ausgelöst wurde" #: ../src/kildclient.ui:245 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "_Temporär (wird gelöscht, sobald der Wiederholungszähler 0 erreicht)" #: ../src/kildclient.ui:249 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" "Wählen, wenn der Timer gelöscht werden soll, sobald sein Wiederholungszähler " "0 geworden ist" #: ../src/kildclient.ui:262 ../src/kildclient.ui:457 ../src/kildclient.ui:831 #: ../src/kildclient.ui:1043 ../src/kildclient.ui:1373 msgid "_Enabled" msgstr "_Aktiv" #: ../src/kildclient.ui:266 msgid "Check to make the timer enabled; only enabled timers are run" msgstr "" "Wählen, um den Timer zu aktivieren (nur aktive Timer haben einen Effekt)" #: ../src/kildclient.ui:282 ../src/kildclient.ui:477 ../src/kildclient.ui:851 #: ../src/kildclient.ui:1063 ../src/kildclient.ui:1393 msgid "Note:" msgstr "Hinweis:" #: ../src/kildclient.ui:295 ../src/kildclient.ui:490 ../src/kildclient.ui:864 #: ../src/kildclient.ui:1076 ../src/kildclient.ui:1406 msgid "" "This object belongs to a plugin. Changes made here will not be saved " "in the plugin." msgstr "" "Dieses Objekt gehört zu einem Plugin. Änderungen, die hier gemacht werden, " "werden nicht im Plugin gespeichert." #: ../src/kildclient.ui:327 msgid "Edit Alias" msgstr "Alias bearbeiten" #: ../src/kildclient.ui:363 msgid "Enter optionally a descriptive name for the alias" msgstr "Geben Sie optional einen beschreibenden Namen für das Alias ein" #: ../src/kildclient.ui:377 ../src/kildclient.ui:1198 msgid "_Pattern:" msgstr "_Muster:" #: ../src/kildclient.ui:389 msgid "Enter the pattern to match against typed commands" msgstr "Geben Sie das Muster ein, auf das in eingegebene Befehlen geprüft wird" #: ../src/kildclient.ui:399 ../src/kildclient.ui:1220 msgid "_Ignore case when matching" msgstr "Groß-/Kleinschreibung beim Mustervergleich _ignorieren" #: ../src/kildclient.ui:417 msgid "_Substitution:" msgstr "_Ersetzung:" #: ../src/kildclient.ui:430 msgid "Enter the substitution to be executed" msgstr "Geben Sie die auszuführende Ersetzung ein" #: ../src/kildclient.ui:440 msgid "E_val substitution as Perl statement" msgstr "Ersetzung als Perl-Code e_valuieren" #: ../src/kildclient.ui:444 msgid "Check to have the substitution be executed in a s///e construction" msgstr "" "Wählen, wenn die Ersetzung in einer s///e Konstruktion ausgeführt werden soll" #: ../src/kildclient.ui:461 msgid "Check to make the alias enabled; only enabled aliases are tried" msgstr "" "Wählen, um das Alias zu aktivieren (nur aktivierte Aliase haben einen Effekt)" #: ../src/kildclient.ui:561 msgid "Edit Character Information" msgstr "Charakter-Informationen bearbeiten" #: ../src/kildclient.ui:640 msgid "Enter the character's name for automatic login" msgstr "Geben Sie den Namen des Charakters für das automatische Login an" #: ../src/kildclient.ui:654 msgid "_Password:" msgstr "Pas_swort:" #: ../src/kildclient.ui:667 msgid "Enter the character's password for automatic login" msgstr "Geben Sie das Passwort des Charakters für das automatische Login an" #: ../src/kildclient.ui:692 msgid "Edit Hook" msgstr "Hook bearbeiten" #: ../src/kildclient.ui:759 msgid "Event:" msgstr "Ereignis:" #: ../src/kildclient.ui:795 msgid "Enter optionally a descriptive name for the hook" msgstr "Geben Sie optional einen beschreibenden Namen für den Hook an" #: ../src/kildclient.ui:821 msgid "Enter the action to be run when the event happens" msgstr "" "Geben Sie die Aktion ein, die ausgeführt werden soll, wenn ein Ereignis " "stattfindet" #: ../src/kildclient.ui:835 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "" "Wählen, um den Hook zu aktivieren (nur aktivierte Hooks haben einen Effekt)" #: ../src/kildclient.ui:889 msgid "Edit Macro" msgstr "Makro bearbeiten" #: ../src/kildclient.ui:968 msgid "Enter optionally a descriptive name for the macro" msgstr "Geben Sie optional einen beschreibenden Namen für das Makro an" #: ../src/kildclient.ui:982 msgid "_Key:" msgstr "_Taste:" #: ../src/kildclient.ui:994 msgid "Press the key that will be used to run the macro" msgstr "Drücken Sie die Taste, die diesem Makro zugeordnet werden soll" #: ../src/kildclient.ui:1008 msgid "" "Press the key that will be used to activate the macro while the cursor is in " "the text box." msgstr "" "Drücken Sie die Taste, die das Makro aktiviert, solange sich der Cursor in " "der Textbox befindet." #: ../src/kildclient.ui:1033 msgid "Enter the action to be run when the key is pressed" msgstr "" "Geben Sie die Aktion ein, die ausgeführt werden soll, wenn die Taste " "gedrückt wird" #: ../src/kildclient.ui:1047 msgid "Check to make the macro enabled; only enabled macros are run" msgstr "" "Wählen, um das Makro zu aktivieren (nur aktivierte Makros haben einen Effekt)" #: ../src/kildclient.ui:1104 ../src/kildclient.ui:2154 msgid "Enter optionally a descriptive name for the trigger" msgstr "Geben Sie optional einen beschreibenden Namen für den Trigger ein" #: ../src/kildclient.ui:1105 msgid "Edit Trigger" msgstr "Trigger bearbeiten" #: ../src/kildclient.ui:1210 msgid "Enter the pattern to match against received lines" msgstr "Geben Sie das Muster ein, das gegen empfangene Zeilen geprüft wird" #: ../src/kildclient.ui:1250 msgid "Enter the action that will be run when a match happens" msgstr "" "Geben Sie eine Aktion ein, die ausgeführt wird, wenn ein Muster gefunden wird" #: ../src/kildclient.ui:1260 msgid "Omit (_gag) from output" msgstr "Passende Zeilen nicht ausgeben" #: ../src/kildclient.ui:1264 msgid "Check to make the matched line not be printed in the main output window" msgstr "" "Wählen, wenn Zeilen, auf die das Muster passt, nicht angezeigt werden soll" #: ../src/kildclient.ui:1277 msgid "Omit (gag) from _log file" msgstr "Passende Zeilen nicht ins Protokoll schreiben" #: ../src/kildclient.ui:1281 msgid "Check to make the matched line not be printed in the log file" msgstr "" "Wählen, wenn die Zeile, auf die das Muster passt, nicht im Protokoll " "auftauchen soll" #: ../src/kildclient.ui:1294 msgid "_Keep executing other triggers after this this one matches" msgstr "Auch bei Auslösung _weitere Trigger ausführen" #: ../src/kildclient.ui:1298 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" "Wählen, wenn weitere Trigger ausgeführt werden sollen, auch wenn dieser " "Trigger ausgelöst wurde" #: ../src/kildclient.ui:1311 msgid "_Rewriter trigger" msgstr "_Rewriter Trigger" #: ../src/kildclient.ui:1315 msgid "Check to make this trigger a rewriter trigger" msgstr "Wählen, wenn dieser Trigger ein Rewriter-Trigger sein soll" #: ../src/kildclient.ui:1333 msgid "C_hange style" msgstr "Stil ä_ndern" #: ../src/kildclient.ui:1350 msgid "C_onfigure..." msgstr "_Einstellen..." #: ../src/kildclient.ui:1377 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" "Wählen, um den Trigger zu aktivieren (nur aktive Trigger haben einen Effekt)" #: ../src/kildclient.ui:1434 msgid "Permenent variable" msgstr "Permanente Variable" #: ../src/kildclient.ui:1497 msgid "_Name of variable to make permanent:" msgstr "_Name der permanenten Variable:" #: ../src/kildclient.ui:1511 msgid "" "Enter the name of a scalar ($), array (@) or hash (%) variable whose " "contents are to be saved between sessions of the World" msgstr "" "Geben Sie den Namen einer Skalar ($), Array (@) oder Hash (%) Variable an, " "deren Inhalt beim beenden gespeichert werden soll." #: ../src/kildclient.ui:1616 msgid "Permanent Variables" msgstr "Permanente Variablen" #: ../src/kildclient.ui:1631 msgid "OnConnect Hooks" msgstr "" #: ../src/kildclient.ui:1646 msgid "OnDisconnect Hooks" msgstr "" #: ../src/kildclient.ui:1661 msgid "OnReceivedText Hooks" msgstr "" #: ../src/kildclient.ui:1676 msgid "OnSentCommand Hooks" msgstr "" #: ../src/kildclient.ui:1691 msgid "OnGetFocus Hooks" msgstr "" #: ../src/kildclient.ui:1706 msgid "OnLoseFocus Hooks" msgstr "" #: ../src/kildclient.ui:1721 msgid "OnCloseConnected Hooks" msgstr "" #: ../src/kildclient.ui:1746 msgid "_Items to export" msgstr "Zu exportierende _Elemente" #: ../src/kildclient.ui:1833 ../src/dlgSelectWorld.ui:114 #: ../src/dlgEditWorld.ui:707 msgid "_New" msgstr "_Neu" #: ../src/kildclient.ui:1847 ../src/wndmain.ui:158 #: ../src/dlgSelectWorld.ui:128 ../src/dlgEditWorld.ui:723 msgid "_Edit" msgstr "_Bearbeiten" #: ../src/kildclient.ui:1862 ../src/wndmain.ui:199 #: ../src/dlgSelectWorld.ui:142 ../src/dlgEditWorld.ui:739 msgid "_Delete" msgstr "_Löschen" #: ../src/kildclient.ui:1877 msgid "_Import" msgstr "_Importieren" #: ../src/kildclient.ui:1891 msgid "E_xport" msgstr "_Exportieren" #: ../src/kildclient.ui:1906 ../src/dlgEditWorld.ui:755 #: ../src/dlgEditWorld.ui:4146 msgid "_Up" msgstr "Au_fwärts" #: ../src/kildclient.ui:1921 ../src/dlgEditWorld.ui:4162 msgid "_Down" msgstr "A_bwärts" #: ../src/kildclient.ui:1975 ../src/kildclient.ui:1992 #: ../src/kildclient.ui:2012 ../src/kildclient.ui:2029 #: ../src/kildclient.ui:2094 msgid "Do not change" msgstr "Nicht ändern" #: ../src/kildclient.ui:1998 msgid "Single" msgstr "Einfach" #: ../src/kildclient.ui:2001 msgid "Double" msgstr "Doppelt" #: ../src/kildclient.ui:2032 ../src/kildclient.ui:2097 #: ../src/dlgPreferences.ui:23 msgid "Black" msgstr "Schwarz" #: ../src/kildclient.ui:2035 ../src/kildclient.ui:2100 #: ../src/dlgPreferences.ui:26 msgid "Red" msgstr "Rot" #: ../src/kildclient.ui:2038 ../src/kildclient.ui:2103 #: ../src/dlgPreferences.ui:29 msgid "Green" msgstr "Grün" #: ../src/kildclient.ui:2041 ../src/kildclient.ui:2106 #: ../src/dlgPreferences.ui:32 msgid "Yellow" msgstr "Gelb" #: ../src/kildclient.ui:2044 ../src/kildclient.ui:2109 #: ../src/dlgPreferences.ui:35 msgid "Blue" msgstr "Blau" #: ../src/kildclient.ui:2047 ../src/kildclient.ui:2112 #: ../src/dlgPreferences.ui:38 msgid "Magenta" msgstr "Magenta" #: ../src/kildclient.ui:2050 ../src/kildclient.ui:2115 #: ../src/dlgPreferences.ui:41 msgid "Cyan" msgstr "Zyan" #: ../src/kildclient.ui:2053 ../src/kildclient.ui:2118 #: ../src/dlgPreferences.ui:44 msgid "White" msgstr "Weiß" #: ../src/kildclient.ui:2056 ../src/kildclient.ui:2121 #: ../src/dlgPreferences.ui:47 msgid "Default" msgstr "Standard" #: ../src/kildclient.ui:2059 ../src/kildclient.ui:2124 #: ../src/dlgPreferences.ui:50 msgid "Black (bold)" msgstr "Schwarz (fett)" #: ../src/kildclient.ui:2062 ../src/kildclient.ui:2127 #: ../src/dlgPreferences.ui:53 msgid "Red (bold)" msgstr "Rot (fett)" #: ../src/kildclient.ui:2065 ../src/kildclient.ui:2130 #: ../src/dlgPreferences.ui:56 msgid "Green (bold)" msgstr "Grün (fett)" #: ../src/kildclient.ui:2068 ../src/kildclient.ui:2133 #: ../src/dlgPreferences.ui:59 msgid "Yellow (bold)" msgstr "Gelb (fett)" #: ../src/kildclient.ui:2071 ../src/kildclient.ui:2136 #: ../src/dlgPreferences.ui:62 msgid "Blue (bold)" msgstr "Blau (fett)" #: ../src/kildclient.ui:2074 ../src/kildclient.ui:2139 #: ../src/dlgPreferences.ui:65 msgid "Magenta (bold)" msgstr "Magenta (fett)" #: ../src/kildclient.ui:2077 ../src/kildclient.ui:2142 #: ../src/dlgPreferences.ui:68 msgid "Cyan (bold)" msgstr "Zyan (fett)" #: ../src/kildclient.ui:2080 ../src/kildclient.ui:2145 #: ../src/dlgPreferences.ui:71 msgid "White (bold)" msgstr "Weiß (fett)" #: ../src/kildclient.ui:2083 ../src/kildclient.ui:2148 #: ../src/dlgPreferences.ui:74 msgid "Default (bold)" msgstr "Standard (fett)" #: ../src/kildclient.ui:2155 msgid "Change Style" msgstr "Stil ändern" #: ../src/kildclient.ui:2221 msgid "_Apply to:" msgstr "_Anwenden auf:" #: ../src/kildclient.ui:2234 msgid "_Foreground:" msgstr "V_ordergrund:" #: ../src/kildclient.ui:2264 msgid "_Background:" msgstr "_Hintergrund:" #: ../src/kildclient.ui:2294 msgid "_Italic:" msgstr "_Kursiv:" #: ../src/kildclient.ui:2324 msgid "_Striked-thru:" msgstr "_Durchgestrichen:" #: ../src/kildclient.ui:2354 msgid "_Underline:" msgstr "_Unterstreichen:" #: ../src/kildclient.ui:2386 msgid "The whole line" msgstr "Ganze Zeilen" #: ../src/kildclient.ui:2402 msgid "The whole matched text" msgstr "Ganzer zutreffender Text" #: ../src/kildclient.ui:2424 msgid "The matched substring number" msgstr "Zutreffender Teil Nummer" #: ../src/wndmain.ui:24 msgid "_World" msgstr "_Welt" #: ../src/wndmain.ui:35 msgid "_Open..." msgstr "Ö_ffnen..." #: ../src/wndmain.ui:45 msgid "_Reconnect" msgstr "_Erneut verbinden" #: ../src/wndmain.ui:54 msgid "_Disconnect" msgstr "_Verbindung trennen" #: ../src/wndmain.ui:63 msgid "Connect to _Another..." msgstr "Zu _anderer Welt verbinden..." #: ../src/wndmain.ui:87 msgid "_Edit..." msgstr "_Bearbeiten..." #: ../src/wndmain.ui:106 msgid "S_tatistics..." msgstr "S_tatistiken..." #: ../src/wndmain.ui:121 ../src/wndmain.ui:257 msgid "_Previous" msgstr "_Vorherige" #: ../src/wndmain.ui:130 ../src/wndmain.ui:267 msgid "_Next" msgstr "_Nächste" #: ../src/wndmain.ui:169 msgid "Cu_t" msgstr "_Ausschneiden" #: ../src/wndmain.ui:179 msgid "_Copy" msgstr "_Kopieren" #: ../src/wndmain.ui:189 msgid "_Paste" msgstr "E_infügen" #: ../src/wndmain.ui:214 ../src/dlgCmdHistory.ui:69 msgid "_Find" msgstr "_Suchen" #: ../src/wndmain.ui:224 ../src/wndmain.ui:287 msgid "Find N_ext" msgstr "_Weitersuchen" #: ../src/wndmain.ui:238 msgid "_Input" msgstr "_Eingabe" #: ../src/wndmain.ui:248 ../src/dlgEditWorld.ui:3850 ../src/dlgMLSend.ui:147 msgid "_Clear" msgstr "_Zurücksetzen" #: ../src/wndmain.ui:277 msgid "Find P_revious" msgstr "_Vorherige suchen" #: ../src/wndmain.ui:297 msgid "Command _History..." msgstr "Befehls_historie..." #: ../src/wndmain.ui:313 msgid "_Multi-line Send..." msgstr "_Mehrzeiliges senden..." #: ../src/wndmain.ui:329 msgid "_Test Triggers..." msgstr "Trigger _testen..." #: ../src/wndmain.ui:342 msgid "_Preferences" msgstr "_Einstellungen" #: ../src/wndmain.ui:353 msgid "Disable _Triggers" msgstr "_Trigger deaktivieren" #: ../src/wndmain.ui:363 msgid "Disable _Aliases" msgstr "_Aliase deaktivieren" #: ../src/wndmain.ui:373 msgid "Disable _Macros" msgstr "_Makros deaktivieren" #: ../src/wndmain.ui:383 msgid "Disable T_imers" msgstr "T_imers deaktivieren" #: ../src/wndmain.ui:399 msgid "_Debug Matches" msgstr "" #: ../src/wndmain.ui:414 msgid "_Preferences..." msgstr "_Einstellungen..." #: ../src/wndmain.ui:423 msgid "Edit Default _World..." msgstr "Voreingestellte _Welt bearbeiten..." #: ../src/wndmain.ui:436 msgid "_Display" msgstr "_Anzeige" #: ../src/wndmain.ui:447 msgid "_Split Window" msgstr "" #: ../src/wndmain.ui:461 ../src/dlgEditWorld.ui:3998 msgid "_Help" msgstr "_Hilfe" #: ../src/wndmain.ui:471 msgid "_Manual" msgstr "Hand_buch" #: ../src/wndmain.ui:481 msgid "_About" msgstr "Ü_ber" #: ../src/dlgSelectWorld.ui:8 msgid "Connect to" msgstr "Verbinde zu" #: ../src/dlgSelectWorld.ui:39 msgid "C_onnect" msgstr "_Verbinden" #: ../src/dlgSelectWorld.ui:62 msgid "_Select a saved world:" msgstr "_Eine bekannte Welt wählen:" #: ../src/dlgSelectWorld.ui:176 msgid "Or connect d_irectly:" msgstr "_Direkt verbinden:" #: ../src/dlgSelectWorld.ui:204 ../src/dlgEditWorld.ui:254 msgid "_Host:" msgstr "_Server:" #: ../src/dlgSelectWorld.ui:218 ../src/dlgEditWorld.ui:268 msgid "_Port:" msgstr "_Port:" #: ../src/dlgPreferences.ui:85 ../src/dlgEditWorld.ui:82 msgid "No proxy" msgstr "Keinen Proxyserver verwenden" #: ../src/dlgPreferences.ui:88 ../src/dlgEditWorld.ui:85 msgid "SOCKS4" msgstr "SOCKS4" #: ../src/dlgPreferences.ui:91 ../src/dlgEditWorld.ui:88 msgid "SOCKS5" msgstr "SOCKS5" #: ../src/dlgPreferences.ui:94 ../src/dlgEditWorld.ui:91 msgid "HTTP" msgstr "HTTP" #: ../src/dlgPreferences.ui:105 msgid "Left" msgstr "Links" #: ../src/dlgPreferences.ui:108 msgid "Right" msgstr "Rechts" #: ../src/dlgPreferences.ui:111 msgid "Top" msgstr "Oben" #: ../src/dlgPreferences.ui:114 msgid "Bottom" msgstr "Unten" #: ../src/dlgPreferences.ui:120 msgid "Preferences" msgstr "Einstellungen" #: ../src/dlgPreferences.ui:180 msgid "Colors used by KildClient" msgstr "Farben, die von KildClient verwendet werden" #: ../src/dlgPreferences.ui:216 msgid "_Informative messages:" msgstr "_Informative Meldungen:" #: ../src/dlgPreferences.ui:248 msgid "_Command echo:" msgstr "Befehls-_Echo:" #: ../src/dlgPreferences.ui:308 msgid "Window configuration" msgstr "Fensterkonfiguration" #: ../src/dlgPreferences.ui:344 msgid "_Tab position:" msgstr "_Tab-Position:" #: ../src/dlgPreferences.ui:374 msgid "_Hide tabs if only one world is open" msgstr "_Verstecke Tabs, wenn nur eine Welt geöffnet ist" #: ../src/dlgPreferences.ui:379 msgid "" "If this is checked, when there is only one open world no tabs will be shown" msgstr "" "Wenn diese Einstellung aktiv und nur eine Welt offen ist, werden keine Tabs " "angezeigt" #: ../src/dlgPreferences.ui:393 msgid "_Flash window when new text is received" msgstr "Fenster _Blinken lassen, wenn neuer Text empfangen wurde" #: ../src/dlgPreferences.ui:435 msgid "Appearance" msgstr "Erscheinungsbild" #: ../src/dlgPreferences.ui:459 msgid "Sending Delays" msgstr "Sendeverzögerungen" #: ../src/dlgPreferences.ui:495 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "Standardeinstellungen für das Senden mehrerer Zeilen oder Kommandos:" #: ../src/dlgPreferences.ui:512 msgid "_Number of lines/commands to send at once:" msgstr "_Anzahl an Zeilen/Kommandos, die auf einmal gesendet werden können:" #: ../src/dlgPreferences.ui:553 msgid "_Delay between each group of lines/commands:" msgstr "_Verzögerung in Sekunden zwischen dem Senden:" #: ../src/dlgPreferences.ui:616 msgid "Sending" msgstr "Senden" #: ../src/dlgPreferences.ui:641 msgid "Web Browser" msgstr "Web Browser" #: ../src/dlgPreferences.ui:677 msgid "Specify the command used to launch a web browser" msgstr "" "Geben Sie das Kommando an, mit dem der Webbrowser gestartet werden kann" #: ../src/dlgPreferences.ui:692 msgid "" "Enter the command to run a web browser. %s will be substituted by the web " "page address." msgstr "" "Geben Sie den Befehl an, mit dem der Webbrowser gestartet werden kann. %s " "wird durch die Webseiten-Adresse ersetzt." #: ../src/dlgPreferences.ui:734 msgid "Audio Player" msgstr "" #: ../src/dlgPreferences.ui:770 msgid "Specify the command used to play sound files." msgstr "" "Geben Sie den Befehl an, mit dem Klangdateien abgespielt werden können." #: ../src/dlgPreferences.ui:785 msgid "" "Enter the command to run an audio player program. %s will be substituted by " "the file path." msgstr "" "Befehl, mit dem Klangdateien abgespielt werden können. %s wird durch den " "Dateipfad ersetzt." #: ../src/dlgPreferences.ui:824 msgid "External Programs" msgstr "Externe Programme" #: ../src/dlgPreferences.ui:850 ../src/dlgEditWorld.ui:370 msgid "Proxy" msgstr "Proxy" #: ../src/dlgPreferences.ui:890 ../src/dlgEditWorld.ui:410 msgid "Proxy _type:" msgstr "Proxyserver_typ:" #: ../src/dlgPreferences.ui:936 ../src/dlgEditWorld.ui:456 msgid "Server _address:" msgstr "Serveradresse:" #: ../src/dlgPreferences.ui:949 ../src/dlgEditWorld.ui:515 msgid "_Username:" msgstr "Ben_utzername:" #: ../src/dlgPreferences.ui:984 ../src/dlgEditWorld.ui:480 msgid "Server _port:" msgstr "Serverport:" #: ../src/dlgPreferences.ui:997 ../src/dlgEditWorld.ui:528 msgid "Pass_word:" msgstr "Pass_wort:" #: ../src/dlgPreferences.ui:1065 msgid "Proxy" msgstr "Proxyserver" #: ../src/dlgStatistics.ui:8 msgid "Statistics" msgstr "Statistiken" #: ../src/dlgStatistics.ui:56 ../src/dlgStatistics.ui:68 #: ../src/dlgStatistics.ui:223 ../src/dlgStatistics.ui:349 #: ../src/dlgStatistics.ui:467 ../src/dlgStatistics.ui:479 #: ../src/dlgStatistics.ui:491 ../src/dlgStatistics.ui:503 #: ../src/dlgStatistics.ui:515 ../src/dlgStatistics.ui:539 #: ../src/dlgStatistics.ui:575 ../src/dlgStatistics.ui:587 #: ../src/dlgStatistics.ui:611 ../src/dlgStatistics.ui:647 #: ../src/dlgStatistics.ui:659 msgid "N/A" msgstr "k/A" #: ../src/dlgStatistics.ui:80 msgid "Proxy port:" msgstr "Proxy-Port:" #: ../src/dlgStatistics.ui:92 msgid "Proxy host:" msgstr "Proxyserver:" #: ../src/dlgStatistics.ui:116 msgid "Proxy type:" msgstr "Typ des Proxyservers:" #: ../src/dlgStatistics.ui:128 msgid "World name:" msgstr "Weltname:" #: ../src/dlgStatistics.ui:140 msgid "Host:" msgstr "Server:" #: ../src/dlgStatistics.ui:152 msgid "Port:" msgstr "Port:" #: ../src/dlgStatistics.ui:164 msgid "Connection time:" msgstr "Verbindungszeit:" #: ../src/dlgStatistics.ui:176 msgid "Idle time:" msgstr "Untätigkeitszeit:" #: ../src/dlgStatistics.ui:199 msgid "Compression used:" msgstr "Verwendete Kompression:" #: ../src/dlgStatistics.ui:211 msgid "Bytes received (compressed):" msgstr "Empfangene Bytes (komprimiert):" #: ../src/dlgStatistics.ui:235 msgid "Bytes received (decompressed):" msgstr "Empfangene Bytes (unkomprimiert):" #: ../src/dlgStatistics.ui:247 msgid "Compression ratio:" msgstr "Kompressionsrate:" #: ../src/dlgStatistics.ui:259 msgid "Lines received:" msgstr "Empfangene Zeilen:" #: ../src/dlgStatistics.ui:383 msgid "Key exchange:" msgstr "Schlüsselaustausch:" #: ../src/dlgStatistics.ui:395 msgid "SSL protocol used:" msgstr "Verwendetes SSL Protokoll:" #: ../src/dlgStatistics.ui:407 msgid "Compression algorithm:" msgstr "Kompressionsalgorithmus:" #: ../src/dlgStatistics.ui:419 msgid "Certificate type:" msgstr "Typ des Zertifikats:" #: ../src/dlgStatistics.ui:431 msgid "Cipher:" msgstr "Chiffre:" #: ../src/dlgStatistics.ui:443 msgid "MAC:" msgstr "MAC:" #: ../src/dlgStatistics.ui:455 msgid "SSL not supported in this version" msgstr "SSL wird in dieser Version nicht unterstützt" #: ../src/dlgStatistics.ui:527 msgid "Hostname:" msgstr "Hostname:" #: ../src/dlgStatistics.ui:551 msgid "Valid since:" msgstr "Gültig seit:" #: ../src/dlgStatistics.ui:563 msgid "Expiration:" msgstr "Läuft ab:" #: ../src/dlgStatistics.ui:599 msgid "Fingerprint:" msgstr "Fingerabdruck:" #: ../src/dlgStatistics.ui:623 msgid "Subject's DN:" msgstr "Dienst DN:" #: ../src/dlgStatistics.ui:635 msgid "Issuer's DN:" msgstr "Aussteller DN:" #: ../src/dlgAbout.ui:12 msgid "A mud client with powerful features and support for Perl Scripting" msgstr "Ein mächtiger MUD-Client mit Unterstützung für Perl Skripte" #: ../src/dlgAbout.ui:14 msgid "Visit http://www.kildclient.org" msgstr "Besuchen Sie http://www.kildclient.org" #: ../src/dlgEditWorld.ui:62 msgid "No auto-login" msgstr "Keine automatische Anmeldung" #: ../src/dlgEditWorld.ui:79 msgid "Use global settings" msgstr "Systemeinstellungen verwenden" #: ../src/dlgEditWorld.ui:98 msgid "Edit World" msgstr "Welt bearbeiten" #: ../src/dlgEditWorld.ui:203 msgid "Connection" msgstr "Verbindung" #: ../src/dlgEditWorld.ui:281 msgid "Enter a descriptive name for the World" msgstr "Geben Sie einen beschreibenden Namen der Welt an" #: ../src/dlgEditWorld.ui:295 msgid "Enter the host to connect to" msgstr "Server zu dem die Verbindung hergestellt werden soll" #: ../src/dlgEditWorld.ui:309 msgid "Enter the port used when connecting" msgstr "Port zu dem am Server verbunden werden soll" #: ../src/dlgEditWorld.ui:321 msgid "Use _SSL" msgstr "_SSL-Verschlüsselung verwenden" #: ../src/dlgEditWorld.ui:587 msgid "Auto-login" msgstr "Automatische Anmeldung" #: ../src/dlgEditWorld.ui:628 msgid "Connection _style:" msgstr "_Art der Verbindung:" #: ../src/dlgEditWorld.ui:668 msgid "Ch_aracters in this mud:" msgstr "_Charaktere in diesem MUD:" #: ../src/dlgEditWorld.ui:771 msgid "D_elete" msgstr "_Löschen" #: ../src/dlgEditWorld.ui:842 ../src/dlgEditWorld.ui:2048 #: ../src/dlgEditWorld.ui:2992 msgid "Font" msgstr "Schrift" #: ../src/dlgEditWorld.ui:879 msgid "Select the font used in the _main screen:" msgstr "Wähle eine Schriftart für das Hauptfenster:" #: ../src/dlgEditWorld.ui:895 msgid "Select the font used in the main output screen" msgstr "Wähle eine Schrift für die Hauptausgabe" #: ../src/dlgEditWorld.ui:907 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "" "Fettschrift für leuchtende Farben verwenden (statt einfacher Aufhellung)" #: ../src/dlgEditWorld.ui:912 msgid "" "Check if you want the highlighted ANSI colors to be displayed in bold also" msgstr "" "Aktiviere diese Einstellung, wenn leuchtende ANSI Farben auch in Fettschrift " "dargestellt werden dürfen" #: ../src/dlgEditWorld.ui:956 msgid "Word Wrap" msgstr "Zeilenumbruch" #: ../src/dlgEditWorld.ui:989 msgid "_Wrap lines at word boundaries" msgstr "Zeilen am _Wortende umbrechen" #: ../src/dlgEditWorld.ui:994 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "Zeilen am Wortende umbrechen" #: ../src/dlgEditWorld.ui:1016 msgid "_Indent wrapped lines by" msgstr "" #: ../src/dlgEditWorld.ui:1046 msgid "pixels" msgstr "" #: ../src/dlgEditWorld.ui:1064 msgid "Wrap lines at full _screen width" msgstr "" #: ../src/dlgEditWorld.ui:1087 msgid "Maximum line width in _characters:" msgstr "" #: ../src/dlgEditWorld.ui:1157 msgid "Tooltips" msgstr "" #: ../src/dlgEditWorld.ui:1191 msgid "Display _tooltips with the time when the line was received" msgstr "" #: ../src/dlgEditWorld.ui:1196 msgid "" "Check if you want tooltips to be displayed showing the time when a line was " "received if you leave the mouse over the line for a short while" msgstr "" #: ../src/dlgEditWorld.ui:1262 msgid "Ansi Colors" msgstr "ANSI Farben" #: ../src/dlgEditWorld.ui:1395 msgid "_Black" msgstr "Schwarz" #: ../src/dlgEditWorld.ui:1409 msgid "R_ed" msgstr "Rot" #: ../src/dlgEditWorld.ui:1423 msgid "_Green" msgstr "Grün" #: ../src/dlgEditWorld.ui:1437 msgid "_Yellow" msgstr "Gelb" #: ../src/dlgEditWorld.ui:1451 msgid "B_lue" msgstr "Blau" #: ../src/dlgEditWorld.ui:1465 msgid "_Magenta" msgstr "Magenta" #: ../src/dlgEditWorld.ui:1479 msgid "_Cyan" msgstr "Zyan" #: ../src/dlgEditWorld.ui:1493 msgid "_White" msgstr "Weiß" #: ../src/dlgEditWorld.ui:1507 msgid "Bl_ack (bold)" msgstr "Schwarz (fett)" #: ../src/dlgEditWorld.ui:1520 msgid "Re_d (bold)" msgstr "Rot (fett)" #: ../src/dlgEditWorld.ui:1533 msgid "G_reen (bold)" msgstr "Grün (fett)" #: ../src/dlgEditWorld.ui:1546 msgid "Yell_ow (bold)" msgstr "Gelb (fett)" #: ../src/dlgEditWorld.ui:1559 msgid "Bl_ue (bold)" msgstr "Blau (fett)" #: ../src/dlgEditWorld.ui:1572 msgid "Magen_ta (bold)" msgstr "Magenta (fett)" #: ../src/dlgEditWorld.ui:1585 msgid "Cya_n (bold)" msgstr "Zyan (fett)" #: ../src/dlgEditWorld.ui:1598 msgid "W_hite (bold)" msgstr "Weiß (fett)" #: ../src/dlgEditWorld.ui:1767 msgid "Default Colors" msgstr "Standardfarben" #: ../src/dlgEditWorld.ui:1828 msgid "_Foreground" msgstr "_Vordergrund" #: ../src/dlgEditWorld.ui:1841 msgid "Bold foreground" msgstr "Fetter Vordergrund" #: ../src/dlgEditWorld.ui:1866 msgid "Bac_kground" msgstr "_Hintergrund" #: ../src/dlgEditWorld.ui:1891 msgid "Bold background" msgstr "Fetter Hintergrund" #: ../src/dlgEditWorld.ui:1945 msgid "Revert to default colors" msgstr "Standardfarben zurücksetzen" #: ../src/dlgEditWorld.ui:1979 msgid "Re_vert to default colors" msgstr "Auf Standardfarben _zurücksetzen" #: ../src/dlgEditWorld.ui:1984 msgid "Click to revert all colors to their built-in defaults" msgstr "All Farben auf die eingebauten Standardeinstellungen zurücksetzen" #: ../src/dlgEditWorld.ui:2085 msgid "Select the font used in the _status bar:" msgstr "Wähle eine Schriftart für die Statuszeile:" #: ../src/dlgEditWorld.ui:2101 msgid "Select the font used in the status bar" msgstr "Schriftart, die in der Statuszeile verwendet wird" #: ../src/dlgEditWorld.ui:2143 msgid "Time Display" msgstr "Zeitanzeige" #: ../src/dlgEditWorld.ui:2179 msgid "C_onnected time:" msgstr "Verbindun_gszeit:" #: ../src/dlgEditWorld.ui:2213 ../src/dlgEditWorld.ui:2323 msgid "Do not display" msgstr "Nicht anzeigen" #: ../src/dlgEditWorld.ui:2218 msgid "Select if you do not want the connection time to be displayed" msgstr "Wählen, falls die Anzeige der Verbindungszeit nicht gewünscht ist" #: ../src/dlgEditWorld.ui:2233 ../src/dlgEditWorld.ui:2343 msgid "Display as hours, minutes and seconds" msgstr "Zeige Stunden, Minuten und Sekunden" #: ../src/dlgEditWorld.ui:2238 msgid "" "Select if you want the connection time to be displayed in hours, minutes and " "seconds" msgstr "" "Wählen, wenn die Verbindungszeit in Stunden, Minuten und Sekunden angezeigt " "werden soll" #: ../src/dlgEditWorld.ui:2253 ../src/dlgEditWorld.ui:2363 msgid "Display as seconds" msgstr "In Sekunden anzeigen" #: ../src/dlgEditWorld.ui:2258 msgid "Select if you want the connection time to be displayed in seconds" msgstr "Wählen, wenn die Verbindungszeit in Sekunden angezeigt werden soll" #: ../src/dlgEditWorld.ui:2290 msgid "_Idle time:" msgstr "_Untätigkeitszeit:" #: ../src/dlgEditWorld.ui:2328 msgid "Select if you do not want the idle time to be displayed" msgstr "Wählen, wenn die Untätigkeitszeit nicht angezeigt werden soll" #: ../src/dlgEditWorld.ui:2348 msgid "" "Select if you want the idle time to be displayed in hours, minutes and " "seconds" msgstr "" "Wählen, wenn die Untätigkeitszeit in Stunden, Minuten und Sekunden angezeigt " "werden soll" #: ../src/dlgEditWorld.ui:2368 msgid "Select if you want the idle time to be displayed in seconds" msgstr "Wählen, wenn die Untätigkeitszeit in Sekunden angezeigt werden soll" #: ../src/dlgEditWorld.ui:2383 msgid "Only _reset idle time counter when a command is entered directly" msgstr "Untätigkeitszeit nur bei direkter Eingabe eines Befehls _zurücksetzen" #: ../src/dlgEditWorld.ui:2388 msgid "" "Check to make the idle time counter reset only when a command is entered " "directly by typing it in the command entry box. If not checked, if a command " "is sent because of a timer, of a hook, etc, the idle timer is also reset." msgstr "" "Wählen, um die Untätigkeitszeit nur zurückzusetzen, wenn ein Kommando " "eingegeben wird. Wenn diese Einstellung nicht gewählt ist, kann die " "Untätigkeitszeit auch durch Hooks, Timer etc. zurückgesetzt werden." #: ../src/dlgEditWorld.ui:2468 msgid "Command Entry" msgstr "Befehlseingabe" #: ../src/dlgEditWorld.ui:2501 msgid "_Keep last typed command in command entry box" msgstr "_Letzten Befehl in der Befehlseingabe belassen" #: ../src/dlgEditWorld.ui:2506 msgid "" "Check to have the last command kept in the command entry box, so that you " "can repeat commands only by pressing ENTER" msgstr "" "Wählen, um die den letzten Befehl in der Eingabezeile zu erhalten, so dass " "er durch drücken der ENTER-Taste noch einmal gesendet werden kann" #: ../src/dlgEditWorld.ui:2519 msgid "_Echo sent commands in main window" msgstr "Befehls_echo (gesendete Befehle in der Hauptausgabe wiedergeben)" #: ../src/dlgEditWorld.ui:2524 msgid "Check to have the sent commands echoed in the main output window" msgstr "Wählen, um gesendete Befehle in der Hauptausgabe wiederzugeben (echo)" #: ../src/dlgEditWorld.ui:2537 msgid "_Store commands between sessions" msgstr "_Befehlshistorie beim Beenden in einer Datei ablegen" #: ../src/dlgEditWorld.ui:2542 msgid "Check to have the command history saved in a file between sessions" msgstr "Wählen, um die Befehlshistorie beim Beenden in einer Datei abzulegen" #: ../src/dlgEditWorld.ui:2555 msgid "Never _hide the typed text" msgstr "Eingaben _niemals verstecken (auch nicht bei Passworten)" #: ../src/dlgEditWorld.ui:2560 msgid "" "Check this if the text you type is displayed as black dots in the input box." msgstr "Wählen, wenn der eingegeben Text in schwarzen Punkten erscheint." #: ../src/dlgEditWorld.ui:2581 msgid "_Number of commands to save in history:" msgstr "Anzahl an Befehlen, die in der Historie gespeichert werden sollen:" #: ../src/dlgEditWorld.ui:2595 msgid "Specify the number of commands that are saved and can be later recalled" msgstr "" "Geben Sie die Anzahl an Befehlen an, die in am Ende gesichert und beim " "nächsten Mal wieder aufgerufen werden können" #: ../src/dlgEditWorld.ui:2622 msgid "C_ommand separator:" msgstr "_Trennzeichen für Befehle:" #: ../src/dlgEditWorld.ui:2636 msgid "Specify the separator for commands typed in the command entry box" msgstr "" "Geben Sie das Trennzeichen an, das für Befehle in der Befehlseingabe " "verwendet werden soll" #: ../src/dlgEditWorld.ui:2657 msgid "Use single-_line input bar" msgstr "_Einzeilige Befehlseingabe verwenden" #: ../src/dlgEditWorld.ui:2697 msgid "Enable _auto-completion" msgstr "Befehls-_Autovervollständigung aktivieren" #: ../src/dlgEditWorld.ui:2702 msgid "Check to enable command auto-completion (based on previous commands)" msgstr "" "Wählen, um die automatische Befehlskomplettierung zu aktivieren (basierend " "auf vorherigen Befehlen)" #: ../src/dlgEditWorld.ui:2723 msgid "Acti_vate auto-completion only after" msgstr "Autovervollständigung benötigt mindestens" #: ../src/dlgEditWorld.ui:2737 msgid "" "Specify the number of characters that must be typed for command completion " "to start" msgstr "Minimal Anzahl an Zeichen für die Autovervollständigung" #: ../src/dlgEditWorld.ui:2752 msgid "characters have been entered" msgstr "eingegebene Zeichen" #: ../src/dlgEditWorld.ui:2783 msgid "Use _multi-line input bar" msgstr "Mehrzeilige Befehlseingabe verwenden" #: ../src/dlgEditWorld.ui:2830 msgid "N_umber of lines:" msgstr "_Anzahl an Zeilen:" #: ../src/dlgEditWorld.ui:2868 msgid "S_pell check typed text" msgstr "_Reichtschreibprüfung aktivieren" #: ../src/dlgEditWorld.ui:2905 msgid "Language code:" msgstr "Sprachen-Code:" #: ../src/dlgEditWorld.ui:2931 msgid "(Leave blank for default based on locale)" msgstr "(Leer lassen, um die Systemeinstellung zu verwenden)" #: ../src/dlgEditWorld.ui:3029 msgid "Select the font used in the command _entry box:" msgstr "Schriftart, die in der Befehlseingabe verwendet werden soll:" #: ../src/dlgEditWorld.ui:3045 msgid "Select the font used in the command entry box" msgstr "Schriftart für die Befehlseingabe" #: ../src/dlgEditWorld.ui:3087 msgid "Flood prevention" msgstr "Überlaufschutz" #: ../src/dlgEditWorld.ui:3126 msgid "Do not allow the _same command to be sent" msgstr "Verbiete das _Senden ab" #: ../src/dlgEditWorld.ui:3131 msgid "" "Check to prevent more than a given number of equal commands to be sent in a " "row (which can disconnect your character in some muds)" msgstr "" "Wählen, um zu verhindern, dass mehr als die angegebene Anzahl an gleichen " "Befehlen am Stück gesendet werden (was bei einigen MUDs zum Trennen der " "Verbindung führen kann)" #: ../src/dlgEditWorld.ui:3147 msgid "Specify the maximum number of equal commands that can be sent in a row" msgstr "" "Geben Sie die maximale Anzahl an gleichen Befehlen an, die auf einen Schlag " "gesendet werden dürfen" #: ../src/dlgEditWorld.ui:3162 msgid "_times in a row" msgstr "_gleichen Befehlen pro Zeile" #: ../src/dlgEditWorld.ui:3188 msgid "Se_nd this command:" msgstr "Se_nde diesen Befehl:" #: ../src/dlgEditWorld.ui:3202 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" "Geben Sie einen Befehl an, der immer dann gesendet wird, wenn die maximale " "Anzahl an zu sendenden gleichen Befehlen gesendet würde" #: ../src/dlgEditWorld.ui:3273 msgid "Logging Status" msgstr "Protokollierung" #: ../src/dlgEditWorld.ui:3326 msgid "St_art" msgstr "S_tart" #: ../src/dlgEditWorld.ui:3342 msgid "_Stop" msgstr "_Stoppen" #: ../src/dlgEditWorld.ui:3373 msgid "_Include the last" msgstr "_Protokolliere die letzten" #: ../src/dlgEditWorld.ui:3378 msgid "Select to include lines from the main window in the log file." msgstr "Wählen, um Zeilen aus dem Hauptfenster ins Protokoll zu schreiben." #: ../src/dlgEditWorld.ui:3393 msgid "Inform number of lines to include in the log." msgstr "Anzahl an Zeilen, die das Protokoll umfassen darf." #: ../src/dlgEditWorld.ui:3409 msgid "lines of the scrollback buffer in the log" msgstr "Zeilen des Ausgabepuffers" #: ../src/dlgEditWorld.ui:3456 ../src/dlgEditWorld.ui:4687 msgid "File" msgstr "Datei" #: ../src/dlgEditWorld.ui:3548 msgid "" "Note: You can use strftime() escapes to create different files based on the " "date and time that logging starts. Also, %Kw represents the World name and " "%Kc the character name used in auto-logon." msgstr "" "Hinweis: strftime() Formatinformationen können verwendet werden, um " "verschiedene Dateinamen nach Datum und Zeit des Beginns der Protokollierung " "zu erzeugen. Zusätzlich repräsentiert %Kw den Weltnamen und %Kc den Namen " "des Charakters, der für die automatische Anmeldung eingetragen ist." #: ../src/dlgEditWorld.ui:3590 msgid "Options" msgstr "Optionen" #: ../src/dlgEditWorld.ui:3623 msgid "A_utomatically start logging when connected" msgstr "Protokollierung beim Herstellen einer Verbindung _automatisch starten" #: ../src/dlgEditWorld.ui:3629 msgid "" "If this is selected, logging will be automatically started whenever you " "connect to the world." msgstr "" "Wählen, um die Protokollierung automatisch immer dann zu starten, wenn eine " "Verbindung zu einer Welt hergestellt wird." #: ../src/dlgEditWorld.ui:3642 msgid "Prefix lines with _date and/or time" msgstr "Datum und Zeit Protokolleinträgen _voranstellen" #: ../src/dlgEditWorld.ui:3648 msgid "" "Select this if you want to prefix each line in the log file with the date " "and/or time it was received." msgstr "" "Wählen, wenn jeder Zeile im Protokoll Datum und Zeit vorangestellt werden " "sollen." #: ../src/dlgEditWorld.ui:3682 msgid "_Format:" msgstr "_Format:" #: ../src/dlgEditWorld.ui:3696 msgid "" "The default is to prefix lines with the date and time, but you can configure " "the format with strftime() escape sequences. See the manual for a " "description of those." msgstr "" "Standardmäßig werden alle Zeilen mit Datum und Uhrzeit beginnend angezeigt. " "Es kann aber wie bei strftime() ein benutzerdefiniertes Format eingestellt " "werden (Siehe Handbuch für eine Beschreibung)." #: ../src/dlgEditWorld.ui:3707 msgid "Revert to _default" msgstr "Auf Standard _zurücksetzen" #: ../src/dlgEditWorld.ui:3783 msgid "Scripting" msgstr "Skripte" #: ../src/dlgEditWorld.ui:3824 msgid "_Perl file to load:" msgstr "_Perl Skript, das geladen werden soll:" #: ../src/dlgEditWorld.ui:3924 msgid "Plugins Currently Loaded" msgstr "Geladene Plugins" #: ../src/dlgEditWorld.ui:3982 msgid "_Load" msgstr "_Laden" #: ../src/dlgEditWorld.ui:4052 msgid "Plugins Loaded on Startup" msgstr "Plugins geladen beim Programmstart" #: ../src/dlgEditWorld.ui:4114 msgid "_Add" msgstr "_Hinzufügen" #: ../src/dlgEditWorld.ui:4130 msgid "_Remove" msgstr "" #: ../src/dlgEditWorld.ui:4238 msgid "MCCP (for compression)" msgstr "MCCP (für Kompression)" #: ../src/dlgEditWorld.ui:4271 msgid "_Enable if server proposes after connecting" msgstr "_Aktivieren, wenn der Server es direkt nach dem Verbinden anbietet" #: ../src/dlgEditWorld.ui:4288 msgid "Enable if server proposes at _any time" msgstr "_Zu jeder Zeit aktivieren, wenn der Server es anbietet" #: ../src/dlgEditWorld.ui:4305 msgid "_Disable" msgstr "_Deaktivieren" #: ../src/dlgEditWorld.ui:4374 msgid "Scrolling" msgstr "Bildlauf" #: ../src/dlgEditWorld.ui:4408 msgid "Scroll on _output" msgstr "Beim _Empfang automatisch scrollen" #: ../src/dlgEditWorld.ui:4413 msgid "" "Check to have the main window scroll to the end whenever new output comes" msgstr "" "Wählen, wenn immer zur letzten Zeile gescrollt werden soll, sobald neuer " "Text empfangen wurde" #: ../src/dlgEditWorld.ui:4434 msgid "_Lines to save in scrollback buffer:" msgstr "_Zeilenanzahl, die im Puffer gespeichert werden soll:" #: ../src/dlgEditWorld.ui:4448 msgid "" "Specify the number of lines of output that can be seen with by scrolling the " "window" msgstr "Anzahl der Zeilen, die im Speicher gehalten werden sollen" #: ../src/dlgEditWorld.ui:4498 msgid "Name display" msgstr "Namensanzeige" #: ../src/dlgEditWorld.ui:4531 msgid "Identify as 'World name'" msgstr "Identifizieren als 'Weltname'" #: ../src/dlgEditWorld.ui:4547 msgid "Identify as 'World name - Character'" msgstr "Identifizieren als 'Weltname - Charakter'" #: ../src/dlgEditWorld.ui:4563 msgid "Identify as 'Character - World name'" msgstr "Identifizieren als 'Charakter - Weltname'" #: ../src/dlgEditWorld.ui:4584 msgid "Custom: " msgstr "Benutzerdefiniert: " #: ../src/dlgEditWorld.ui:4622 msgid "" "Use %Kw to represent the World's name, and %Kc to represent the auto-logon " "character name" msgstr "" "Verwenden Sie %Kw um den Weltnamen und %Kc um den Charakternamen zu " "repräsentieren" #: ../src/dlgEditWorld.ui:4726 msgid "_File:" msgstr "_Datei:" #: ../src/dlgEditWorld.ui:4763 msgid "" "You can leave this field blank, and a file name will be automatically " "generated. Only edit this field if you know what you are doing." msgstr "" "Wird dieses Feld leer gelassen, wird automatisch ein Dateiname generiert. " "Nur bearbeiten, wenn man sicher ist, was man tut!" #: ../src/dlgEditWorld.ui:4805 msgid "Character Set" msgstr "Zeichensatz" #: ../src/dlgEditWorld.ui:4838 msgid "Character _set:" msgstr "_Zeichensatz:" #: ../src/dlgEditWorld.ui:4892 msgid "Graphical Editors" msgstr "Editor" #: ../src/dlgEditWorld.ui:4925 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "_Nachfragen, wenn Objekte wie Trigger oder Alias gelöscht werden" #: ../src/dlgEditWorld.ui:4930 ../src/dlgEditWorld.ui:5031 msgid "" "If not checked, objects such as triggers, aliases, etc. will be deleted " "directly without asking for confirmation when you press the Delete button." msgstr "" "Wenn nicht gewählt werden Objekte wie Trigger, Aliase etc. direkt ohne " "Nachfrage gelöscht, wenn der Löschen-Knopf betätigt wird." #: ../src/dlgEditWorld.ui:4944 msgid "_Show items defined by plugins" msgstr "_Zeige in Plugins definierte Objekte" #: ../src/dlgEditWorld.ui:4949 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" "Wenn gewählt werden Trigger, Aliase, Makros und Plugins, die in Plugins " "definiert sind, in den entsprechenden Abschnitten des Welt-Editors angezeigt." #: ../src/dlgEditWorld.ui:4993 msgid "TCP Keep Alive" msgstr "" #: ../src/dlgEditWorld.ui:5026 msgid "Enable TCP _Keep Alive packets" msgstr "" #: ../src/dlgEditWorld.ui:5047 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "" #: ../src/dlgEditWorld.ui:5087 msgid "Input" msgstr "Eingabe" #: ../src/dlgEditWorld.ui:5120 msgid "_Disable up and down arrow keys for history navigation" msgstr "" #: ../src/dlgEditWorld.ui:5125 msgid "" "If checked, the up and down arrow keys are not used for navigating between " "saved commands. (You'll have to use Alt+up and Alt+down.)" msgstr "" #: ../src/dlgTestTriggers.ui:57 msgid "Enter _line to be matched against the triggers:" msgstr "_Zeile auf die die Trigger angewendet werden sollen:" #: ../src/dlgTestTriggers.ui:75 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" "Die Trigger werden auf den Text, der hier eingegeben wird, angewendet als " "wäre er vom MUD empfangen worden" #: ../src/dlgTestTriggers.ui:86 ../src/dlgMLSend.ui:52 #: ../src/dlgCmdHistory.ui:161 msgid "_Send" msgstr "_Senden" #: ../src/dlgTestTriggers.ui:91 msgid "Click the run the triggers against the line." msgstr "Klicken um die Trigger auf die Zeile anzuwenden." #: ../src/dlgTestTriggers.ui:129 msgid "Number of triggers that matched:" msgstr "Anzahl der Trigger, die ausgelöst wurden:" #: ../src/dlgTestTriggers.ui:160 msgid "Commands that would be sent:" msgstr "Befehle die gesendet worden wären:" #: ../src/dlgTestTriggers.ui:193 msgid "This is what would be printed in the main screen:" msgstr "Diese Ausgabe wäre im Hauptfenster erschienen:" #: ../src/dlgTestTriggers.ui:205 msgid "" "This is what would be printed in the main screen. If empty, the line has " "been gaged. It can be different from the original line because of rewriter " "triggers." msgstr "" "Diese Ausgabe wäre im Hauptfenster erschienen. Wenn die Ausgabe leer ist " "wurde die Zeile gaged. Sie kann verschieden von der ursprünglichen Zeile " "sein, wenn Rewriter Trigger angewendet wurden." #: ../src/dlgTestTriggers.ui:223 msgid "Would this line be included in the log file?" msgstr "Wäre diese Zeile im Protokoll erschienen?" #: ../src/dlgMLSend.ui:20 msgid "Multi-line send" msgstr "Mehrzeilig senden" #: ../src/dlgMLSend.ui:82 msgid "Send this text _initially:" msgstr "Sende diesen Text _zuerst:" #: ../src/dlgMLSend.ui:102 ../src/dlgMLSend.ui:193 msgid "Enter some text to be sent to the World" msgstr "Geben Sie den Text ein, der an die Welt gesendet wird" #: ../src/dlgMLSend.ui:118 msgid "Then send the _contents of this file:" msgstr "Dann sende den Inhalt dieser _Datei:" #: ../src/dlgMLSend.ui:173 msgid "_Finally, send this text:" msgstr "Sende _schließlich diesen Text:" #: ../src/dlgMLSend.ui:220 msgid "Add this to the _beginning of each line:" msgstr "_Füge dies am Anfang jeder Zeile an:" #: ../src/dlgMLSend.ui:235 msgid "Specify some text to be prepended to each sent line" msgstr "Text, der an jede gesendete Zeile angehangen wird" #: ../src/dlgMLSend.ui:250 msgid "Add this to the _end of each line:" msgstr "Füge dies am _Ende jeder Zeile an:" #: ../src/dlgMLSend.ui:265 msgid "Specify some text to be appended to each sent line" msgstr "Text, der an jede gesendete Zeile angehangen wird" #: ../src/dlgMLSend.ui:283 msgid "_Delay" msgstr "_Verzögerung" #: ../src/dlgMLSend.ui:297 msgid "Specify the delay between sending the group of lines" msgstr "Verzögerung beim Senden mehrerer Zeilen" #: ../src/dlgMLSend.ui:313 msgid "seconds e_ach" msgstr "_Sekunden alle" #: ../src/dlgMLSend.ui:327 msgid "Specify how many lines are sent at once" msgstr "Anzahl der Zeilen, die auf einmal gesendet werden" #: ../src/dlgMLSend.ui:342 msgid "line(s)" msgstr "Zeile(n)" #: ../src/dlgMLSend.ui:360 msgid "_Keep dialog open after sending" msgstr "Dialog nach dem Senden _geöffnet lassen" #: ../src/dlgCmdHistory.ui:20 msgid "Command History" msgstr "Befehlshistorie" #: ../src/dlgCmdHistory.ui:75 msgid "Find a command containing a given search term" msgstr "Suche einen Befehl mit einem gegebenen Suchbegriff" #: ../src/dlgCmdHistory.ui:87 msgid "Find _next" msgstr "_Weitersuchen" #: ../src/dlgCmdHistory.ui:93 msgid "Find the next command with the same match text" msgstr "Weiteren Befehl mit diesem Suchbegriff suchen" #: ../src/dlgCmdHistory.ui:124 msgid "_Recall" msgstr "Erneut aufrufen" #: ../src/dlgCmdHistory.ui:130 msgid "Put the selected command in the command entry box" msgstr "Ausgewählten Befehl in die Befehlseingabe schreiben" #: ../src/dlgCmdHistory.ui:143 msgid "Rec_all & Close" msgstr "Erneut aufrufen und schließen" #: ../src/dlgCmdHistory.ui:149 msgid "Put the selected command in the command entry box and close this dialog" msgstr "" "Ausgewählten Befehl in die Befehlseingabe schreiben und diesen Dialog " "schließen" #: ../src/dlgCmdHistory.ui:167 msgid "Send the selected command(s) to the mud" msgstr "Sende den/die gewählte(n) Befehl(e) zum MUD" #: ../src/dlgCmdHistory.ui:179 msgid "S_end & Close" msgstr "S_enden & Schließen" #: ../src/dlgCmdHistory.ui:185 msgid "Send the selected command(s) to the mud and close the dialog" msgstr "Sende den/die gewählte(n) Befehl(e) zum MUD und schließe diesen Dialog" #: ../src/dlgCmdHistory.ui:224 msgid "Newest commands are on the top" msgstr "Der neueste Befehl ist oben" #: ../src/dlgCmdHistory.ui:252 msgid "Dela_y" msgstr "_Verzögerung" #: ../src/dlgCmdHistory.ui:265 msgid "Specify the delay between sending the group of commands" msgstr "Geben Sie eine Verzögerung für das Senden einer Gruppe von Befehlen an" #: ../src/dlgCmdHistory.ui:282 msgid "sec_onds each" msgstr "_Sekunden alle" #: ../src/dlgCmdHistory.ui:296 msgid "Specify how many commands are sent at once" msgstr "Geben Sie an, wieviele Befehle auf einen Schlag gesendet werden dürfen" #: ../src/dlgCmdHistory.ui:313 msgid "commands(s)" msgstr "Befehl(e)" #: ../src/dlgCmdHistory.ui:338 msgid "Find Command" msgstr "Suche Befehl" #: ../src/dlgCmdHistory.ui:400 msgid "_Text to find:" msgstr "Zu suchender _Text:" #: ../src/dlgCmdHistory.ui:413 msgid "Enter the text to search for" msgstr "Geben Sie den Text ein, der gesucht werden soll" #: ../src/dlgCmdHistory.ui:434 msgid "Search direction:" msgstr "Suchrichtung:" #: ../src/dlgCmdHistory.ui:449 msgid "_Downwards" msgstr "_Abwärts" #: ../src/dlgCmdHistory.ui:466 msgid "_Upwards" msgstr "_Aufwärts" #: ../src/mnuPopupURL.ui:12 msgid "_Open link" msgstr "Link ö_ffnen" #: ../src/mnuPopupURL.ui:21 msgid "_Copy link address" msgstr "Linkadresse _kopieren" #: ../share/kildclient.pl:76 ../share/kildclient.pl:97 #: ../share/kildclient.pl:117 ../share/kildclient.pl:182 #: ../share/kildclient.pl:433 ../share/kildclient.pl:511 #: ../share/kildclient.pl:589 ../share/kildclient.pl:602 #: ../share/kildclient.pl:615 ../share/kildclient.pl:628 #: ../share/kildclient.pl:641 ../share/kildclient.pl:654 #: ../share/kildclient.pl:667 ../share/kildclient.pl:680 #: ../share/kildclient.pl:694 ../share/kildclient.pl:708 #: ../share/kildclient.pl:818 ../share/kildclient.pl:830 #: ../share/kildclient.pl:842 ../share/kildclient.pl:854 #: ../share/kildclient.pl:867 ../share/kildclient.pl:1083 #: ../share/kildclient.pl:1116 #, perl-format msgid "%s: Too few arguments." msgstr "%s: Zu wenig Argumente." #: ../share/kildclient.pl:207 ../share/kildclient.pl:567 #, perl-format msgid "No such %s" msgstr "Kein %s vorhanden" #: ../share/kildclient.pl:298 ../share/kildclient.pl:316 #: ../share/kildclient.pl:334 ../share/kildclient.pl:352 #: ../share/kildclient.pl:370 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: Falsche Anzahl an Argumenten." #: ../share/kildclient.pl:403 ../share/kildclient.pl:411 #: ../share/kildclient.pl:489 ../share/kildclient.pl:497 #, perl-format msgid "No such %s." msgstr "Kein %s vorhanden." #: ../share/kildclient.pl:425 #, perl-format msgid "No %s deleted." msgstr "Kein %s gelöscht." #: ../share/kildclient.pl:427 #, perl-format msgid "One %s deleted." msgstr "Ein %s gelöscht." #: ../share/kildclient.pl:429 #, perl-format msgid "%d %s deleted." msgstr "%d %s gelöscht." #: ../share/kildclient.pl:506 #, perl-format msgid "Successfully moved %s." msgstr "%s erfolgreich verschoben." #: ../share/kildclient.pl:898 msgid "Could not open file." msgstr "Kann Datei nicht öffnen." #: ../share/kildclient.pl:928 msgid "Unknown" msgstr "Unbekannt" #: ../share/kildclient.pl:935 msgid "Invalid plugin file." msgstr "Ungültige Plugin-Datei." #: ../share/kildclient.pl:966 msgid "Plugin already loaded. Try enabling it." msgstr "Plugin ist bereits geladen. Versuchen Sie es zu aktivieren." #: ../share/kildclient.pl:968 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "Version %s dieses Plugins bereits geladen." #: ../share/kildclient.pl:978 #, perl-format msgid "Error in plugin file: %s" msgstr "Fehler in der Plugin-Datei: %s" #: ../share/kildclient.pl:990 msgid "Cannot load a plugin in another world." msgstr "Kann kein Plugin in einer anderen Welt laden." #: ../share/kildclient.pl:995 ../share/kildclient.pl:1015 msgid "Plugin not specified" msgstr "Kein Plugin angegeben." #: ../share/kildclient.pl:1002 ../share/kildclient.pl:1033 msgid "Plugin not loaded." msgstr "Plugin ist nicht geladen." #: ../share/kildclient.pl:1005 #, perl-format msgid "Plugin '%s' loaded." msgstr "Plugin '%s' geladen." #: ../share/kildclient.pl:1021 #, perl-format msgid "Could not load plugin %s" msgstr "Kann Plugin %s nicht laden" #: ../share/kildclient.pl:1097 msgid "Plugin enabled." msgstr "Plugin aktiviert." #: ../share/kildclient.pl:1130 msgid "Plugin disabled." msgstr "Plugin deaktiviert." #: ../share/kildclient.pl:1279 msgid "Cannot open help file." msgstr "Kann Hilfe-Datei nicht öffnen." #: ../share/kildclient.pl:1297 msgid "Help topic not found." msgstr "Hilfethema nicht gefunden." #: ../share/kildclient.pl:1394 msgid "" "Warning: the getwindowsize() function is deprecated and will be removed." msgstr "Warnung: die Funktion getwindowsize() ist veraltet und wird entfernt!" #: ../share/kildclient.pl:1395 msgid "Use $window->getsize() instead." msgstr "Verwenden Sie stattdessen $window->getsize()." #: ../share/kildclient.pl:1400 msgid "Warning: the minimize() function is deprecated and will be removed." msgstr "Warnung: Die Funktion minimize() ist veraltet und wird bald entfernt." #: ../share/kildclient.pl:1401 msgid "Use $window->minimize() instead." msgstr "Verwenden Sie stattdessen $window->minimize()." #: ../share/kildclient.pl:1406 msgid "Warning: the path() function is deprecated and will be removed." msgstr "Warnung: Die Funktion path() ist veraltet und wird bald entfernt." #: ../share/kildclient.pl:1407 msgid "Use $world->path() instead." msgstr "Verwenden Sie stattdessen $world->path()." kildclient-3.0.0/po/POTFILES.in0000644000175000017500000000213112376346024012754 00000000000000# List of files with marked strings src/main.c src/net.c src/telnet.c src/proxy.c src/mainwindow.c src/worldgui.c src/mainthread_operations.c src/process_line_thread.c src/ansiparse_thread.c src/ansitextview.c src/worldselector.c src/worlds.c src/worldeditor.c src/we_general.c src/we_mainwindow.c src/we_colors.c src/we_statusbar.c src/we_input.c src/we_logging.c src/we_scripting.c src/we_plugins.c src/we_generic_guied.c src/we_triggers.c src/we_aliases.c src/we_macros.c src/we_timers.c src/we_hooks.c src/we_vars.c src/we_protocols.c src/we_misc.c src/we_advanced.c src/prefs.c src/parser.c src/triggers.c src/aliases.c src/macros.c src/timers.c src/permanentvariables.c src/hooks.c src/log.c src/plugins.c src/multilinesend.c src/cmdhistory.c src/sound.c src/perlscript.c src/kcircularqueue.c src/kcwin.c src/simocombobox.c src/kildclient.ui src/wndmain.ui src/dlgSelectWorld.ui src/dlgPreferences.ui src/dlgStatistics.ui src/dlgAbout.ui src/dlgEditWorld.ui src/dlgTestTriggers.ui src/dlgMLSend.ui src/dlgCmdHistory.ui src/mnuPopupURL.ui src/kildclient.h src/ansi.h src/perlscript.h share/kildclient.pl kildclient-3.0.0/po/Makefile.in.in0000644000175000017500000001760412376346024013664 00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # # This file file be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # Please note that the actual code is *not* freely available. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ libdir = @libdir@ localedir = $(libdir)/locale gnulocaledir = $(datadir)/locale gettextsrcdir = $(datadir)/glib-2.0/gettext/po subdir = po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = mkdir -p CC = @CC@ GENCAT = @GENCAT@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ XGETTEXT = @XGETTEXT@ MSGMERGE = msgmerge DEFS = @DEFS@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ INCLUDES = -I.. -I$(top_srcdir)/intl COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) SOURCES = POFILES = @POFILES@ GMOFILES = @GMOFILES@ DISTFILES = LINGUAS ChangeLog Makefile.in.in POTFILES.in $(GETTEXT_PACKAGE).pot \ $(POFILES) $(GMOFILES) $(SOURCES) POTFILES = \ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ INSTOBJEXT = @INSTOBJEXT@ .SUFFIXES: .SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat .c.o: $(COMPILE) $< .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(srcdir)/$(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(MSGFMT) -o $@ $< .po.gmo: $(AM_V_GEN) file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) $(MSGFMT_OPTS) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && $(GENCAT) $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(srcdir)/$(GETTEXT_PACKAGE).pot: $(POTFILES) $(XGETTEXT) --default-domain=$(GETTEXT_PACKAGE) \ --msgid-bugs-address='http://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general' \ --add-comments --keyword=_ --keyword=N_ \ --keyword=C_:1c,2 \ --keyword=NC_:1c,2 \ --keyword=g_dcgettext:2 \ --keyword=g_dngettext:2,3 \ --keyword=g_dpgettext2:2c,3 \ --flag=N_:1:pass-c-format \ --flag=C_:2:pass-c-format \ --flag=NC_:2:pass-c-format \ --flag=g_dngettext:2:pass-c-format \ --flag=g_strdup_printf:1:c-format \ --flag=g_string_printf:2:c-format \ --flag=g_string_append_printf:2:c-format \ --flag=g_error_new:3:c-format \ --flag=g_set_error:4:c-format \ --flag=g_markup_printf_escaped:1:c-format \ --flag=g_log:3:c-format \ --flag=g_print:1:c-format \ --flag=g_printerr:1:c-format \ --flag=g_printf:1:c-format \ --flag=g_fprintf:2:c-format \ --flag=g_sprintf:2:c-format \ --flag=g_snprintf:3:c-format \ --flag=g_scanner_error:2:c-format \ --flag=g_scanner_warn:2:c-format \ $(POTFILES) \ && test ! -f $(GETTEXT_PACKAGE).po \ || ( rm -f $(srcdir)/$(GETTEXT_PACKAGE).pot \ && mv $(GETTEXT_PACKAGE).po $(srcdir)/$(GETTEXT_PACKAGE).pot ) install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all $(MKINSTALLDIRS) $(DESTDIR)$(datadir); \ catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ case "$$cat" in \ *.gmo) destdir=$(gnulocaledir);; \ *) destdir=$(localedir);; \ esac; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ dir=$(DESTDIR)$$destdir/$$lang/LC_MESSAGES; \ $(MKINSTALLDIRS) $$dir; \ if test -r $$cat; then \ $(INSTALL_DATA) $$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ echo "installing $$cat as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \ else \ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ echo "installing $(srcdir)/$$cat as" \ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \ fi; \ if test -r $$cat.m; then \ $(INSTALL_DATA) $$cat.m $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ echo "installing $$cat.m as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \ else \ if test -r $(srcdir)/$$cat.m ; then \ $(INSTALL_DATA) $(srcdir)/$$cat.m \ $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ echo "installing $(srcdir)/$$cat as" \ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \ else \ true; \ fi; \ fi; \ done if test "$(PACKAGE)" = "glib"; then \ $(MKINSTALLDIRS) $(DESTDIR)$(gettextsrcdir); \ $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \ else \ : ; \ fi # Define this as empty until I found a useful application. installcheck: uninstall: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ done if test "$(PACKAGE)" = "glib"; then \ rm -f $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \ fi check: all dvi info tags TAGS ID: mostlyclean: rm -f core core.* *.pox $(GETTEXT_PACKAGE).po *.old.po cat-id-tbl.tmp rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f $(GMOFILES) distdir = ../$(GETTEXT_PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ for file in $$dists; do \ ln $(srcdir)/$$file $(distdir) 2> /dev/null \ || cp -p $(srcdir)/$$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ cd $(srcdir); \ catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ echo "$$lang:"; \ if $(MSGMERGE) $$lang.po $(GETTEXT_PACKAGE).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$cat failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done # POTFILES is created from POTFILES.in by stripping comments, empty lines # and Intltool tags (enclosed in square brackets), and appending a full # relative path to them POTFILES: POTFILES.in ( if test 'x$(srcdir)' != 'x.'; then \ posrcprefix='$(top_srcdir)/'; \ else \ posrcprefix="../"; \ fi; \ rm -f $@-t $@ \ && (sed -e '/^#/d' \ -e "s/^\[.*\] +//" \ -e '/^[ ]*$$/d' \ -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \ | sed -e '$$s/\\$$//') > $@-t \ && chmod a-w $@-t \ && mv $@-t $@ ) Makefile: Makefile.in.in ../config.status POTFILES cd .. \ && $(SHELL) ./config.status $(subdir)/$@.in # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: kildclient-3.0.0/po/eo.po0000644000175000017500000026735212376346024012164 00000000000000# KildClient messages in Esperanto # Copyright (C) 2004-2014 Eduardo M Kalinowski # This file is distributed under the same license as the KildClient package. # msgid "" msgstr "" "Project-Id-Version: KildClient 3.0.0\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=glib&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2014-08-17 14:59-0300\n" "PO-Revision-Date: 2014-08-17 14:59-0300\n" "Last-Translator: Eduardo M Kalinowski \n" "Language-Team: Eduardo M Kalinowski \n" "Language: eo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/main.c:74 msgid "Outputs version information and exits" msgstr "Monstras eldoninformadon kaj eliras" #: ../src/main.c:76 msgid "Directory to store settings and saved worlds" msgstr "Dosierujo por konservi la konfiguron kaj konservitajn mondojn" #: ../src/main.c:76 msgid "DIR" msgstr "DOSIERUJO" #: ../src/main.c:78 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "Ŝuti ĉio riĉevita (post malkompatigo, se necesas) al dosiero" #: ../src/main.c:79 ../src/main.c:82 msgid "FILE" msgstr "DOSIERO" #: ../src/main.c:81 msgid "Dumps all data received (possibly compressed) to the file" msgstr "Ŝuti ĉio riĉevita (antaŭ malkompatigo, se necesas) al dosiero" #. Parse command-line options #: ../src/main.c:120 msgid "[WORLD...]" msgstr "[MONDO...\\" #: ../src/main.c:127 #, c-format msgid "Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" msgstr "Skribita da Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" #: ../src/main.c:132 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "Ne eblas malfermi ŝutdosieron %s: %s\n" #: ../src/main.c:139 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "Ne eblas malfermi kruddataŝutdosieron %s: %s\n" #: ../src/main.c:282 msgid "There is one open world. Do you really want to quit?" msgstr "Estas unu malfermata mondo. Ĉu vi vere volas eliri?" #: ../src/main.c:288 #, c-format msgid "There are %d open worlds. Do you really want to quit?" msgstr "Estas %d malfermataj mondoj. Ĉu vi vere volas eliri?" #: ../src/main.c:291 msgid "Really Quit KildClient?" msgstr "Vere eliri KildClient?" #: ../src/main.c:293 msgid "_Don't quit" msgstr "_Ne eliri" #: ../src/main.c:294 ../src/wndmain.ui:145 msgid "_Quit" msgstr "_Eliri" #: ../src/net.c:110 msgid "" "You're attempting to connect to a world that uses SSL, but this version of " "KildClient has been built without SSL support. Try to connect without SSL?" msgstr "" "Vi provas konekti al mondo kiu uzas SSL, sed ĉi tiu eldono de KildClient ne " "havas SSL subtenon. Konekti sen SSL?" #: ../src/net.c:111 msgid "KildClient Question" msgstr "Demando - KildClient" #: ../src/net.c:113 msgid "Connect without SSL" msgstr "Konekti sen SSL" #: ../src/net.c:114 msgid "Do not connect" msgstr "Ne konekti" #: ../src/net.c:122 msgid "This version of KildClient does not have SSL support." msgstr "Ĉi tiu eldono de KildClient ne havas SSL subtenon." #: ../src/net.c:198 ../src/proxy.c:212 #, c-format msgid "Resolving proxy host %s..." msgstr "Serĉante prokurservilon %s..." #: ../src/net.c:201 #, c-format msgid "Resolving host %s..." msgstr "Serĉante retnodon %s..." #: ../src/net.c:294 ../src/proxy.c:196 #, c-format msgid "Could not resolve host %s: %s" msgstr "Ne eblas trovi retnodon %s: %s" #: ../src/net.c:322 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "Provante koneti al retnodo %s (%s) pordo %s..." #: ../src/net.c:325 #, c-format msgid "Attempting to connect to proxy host %s (%s) port %s..." msgstr "Provante koneti al prokurservilon %s (%s) pordo %s..." #: ../src/net.c:341 #, c-format msgid "Could not create socket: %s" msgstr "Ne eblas krei kontaktoskatolon: %s" #: ../src/net.c:344 #, c-format msgid "Could not create socket: error #%d" msgstr "Ne eblas krei kontaktoskatolon: eraro #%d" #: ../src/net.c:364 #, c-format msgid "Could not connect to host %s port %s: %s" msgstr "Ne eblas konekti al retnodo %s pordo %s: %s" #: ../src/net.c:374 #, c-format msgid "Could not connect to host %s port %s: Error #%d" msgstr "Ne eblas konekti al retnodo %s pordo %s: Eraro #%d" #: ../src/net.c:430 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Ne eblas konekti al retnodo %s: %s" #: ../src/net.c:433 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Ne eblas konekti al prokurservilon %s: %s" #: ../src/net.c:475 ../src/net.c:493 #, c-format msgid "Unable to connect to host %s: Error #%d." msgstr "Ne eblas konekti al retnodo %s: Eraro #%d." #: ../src/net.c:478 ../src/net.c:496 #, c-format msgid "Unable to connect to proxy host %s: Error #%d." msgstr "Ne eblas konekti al prokurservilon %s: Eraro #%d." #: ../src/net.c:532 #, c-format msgid "Performing SSL handshake..." msgstr "Iniciante SSL..." #: ../src/net.c:582 #, c-format msgid "SSL Handshake failed: %s" msgstr "SSL Negociado ne funkciis: %s" #: ../src/net.c:624 #, c-format msgid "SSL Handshake took too long." msgstr "SSL Negociado daŭris tre longe." #: ../src/net.c:653 ../src/net.c:1156 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Konektata al retnodo %s (%s) pordo %s." #: ../src/net.c:656 ../src/net.c:1159 #, c-format msgid "Connected to host %s port %s, via proxy %s (%s) port %s." msgstr "" "Konektata al retnodo %s pordo %s, pere de prokurservilo %s (%s) pordo %s." #: ../src/net.c:663 ../src/net.c:1132 ../src/net.c:1166 msgid " SSL enabled." msgstr "SSL ebligita." #: ../src/net.c:681 ../src/perlscript.c:3234 #, c-format msgid "Logging to file %s.\n" msgstr "Registrado komencita al la dosiero %s.\n" #: ../src/net.c:827 #, c-format msgid "Disconnected from host %s." msgstr "Malkonektita el retnodo %s." #: ../src/net.c:900 ../src/net.c:909 #, c-format msgid "Disconnected from host %s: %s." msgstr "Malkonektita el retnodo %s: %s." #: ../src/net.c:920 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "Malkonektita el retnodo %s: eraro #%d." #: ../src/net.c:1120 #, c-format msgid "Connected to host %s (%s) port %s, MCCP version %d enabled." msgstr "Konektata al retnodo %s (%s) pordo %s, MCCP eldono %d ebligata." #: ../src/net.c:1124 #, c-format msgid "" "Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d " "enabled." msgstr "" "Konektata al retnodo %s pordo %s, pere de prokurservilo %s (%s) pordo %s, " "MCCP eldono %d ebligata." #: ../src/net.c:1242 ../src/we_logging.c:123 msgid "Not connected." msgstr "Ne konektata." #. success #: ../src/proxy.c:60 msgid "general failure" msgstr "ĝenerala malfunkciado" #: ../src/proxy.c:61 msgid "connection not allowed by ruleset" msgstr "konekto ne permesita de la regularo" #: ../src/proxy.c:62 msgid "network unreachable" msgstr "reto ne atingebla" #: ../src/proxy.c:63 msgid "host unreachable" msgstr "retnodo ne atingebla" #: ../src/proxy.c:64 msgid "connection refused by destination host" msgstr "konekto rifuzita de la destina retnodo" #: ../src/proxy.c:65 msgid "TTL expired" msgstr "TTL finiĝita" #: ../src/proxy.c:66 msgid "command not supported / protocol error" msgstr "komando ne subtenata / protokoleraro" #: ../src/proxy.c:67 msgid "address type not supported" msgstr "adrestipo ne subtenata" #: ../src/proxy.c:242 ../src/proxy.c:664 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "Konektata al prokurservilo %s pordo %s, sendante konektpeton...." #: ../src/proxy.c:297 ../src/proxy.c:426 ../src/proxy.c:471 ../src/proxy.c:545 #: ../src/proxy.c:711 msgid "Error while reading from proxy host." msgstr "Eraru dum legado el la prokurservilo." #: ../src/proxy.c:318 msgid "request rejected or failed" msgstr "konektpeto malakceptita aŭ malsukcesita" #: ../src/proxy.c:322 msgid "request failed because identd could not be reached" msgstr "konkektpeto malsukcesis ĉar identd ne povis esti atingita" #: ../src/proxy.c:326 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" "konektpeto malsukcesis ĉar identd de kliento ne povis konfirmi la " "legitimilon en la konektpeto" #: ../src/proxy.c:330 ../src/proxy.c:571 ../src/proxy.c:727 #, c-format msgid "Proxy request failed: %s." msgstr "Prokura konektpeto malsukcesis: %s." #: ../src/proxy.c:347 #, c-format msgid "Connected to proxy server %s port %s, negotiating authentication..." msgstr "" "Konektata al prokurservilon %s pordo %s, negociante aŭtentokontrolon..." #: ../src/proxy.c:441 msgid "No acceptable proxy authentication methods." msgstr "Neniŭ akceptebla aŭtentokontrolmetodo por prokurservilo." #: ../src/proxy.c:489 msgid "Proxy authentication failed." msgstr "Prokurservila aŭtentokontrolo malsukcesis." #. Should never happen #: ../src/proxy.c:532 msgid "Unrecognized response from proxy host." msgstr "Malrekonebla respondo el prokurservilo." #: ../src/proxy.c:566 msgid "unknown reason code" msgstr "malkonata kodo." #: ../src/proxy.c:587 #, c-format msgid "Sending proxy authentication credentials..." msgstr "Sendante aŭtentokontrolajn akreditaĵojn al prokurservilo..." #: ../src/proxy.c:626 #, c-format msgid "Sending connection request..." msgstr "Sendante konketpeton..." #: ../src/mainwindow.c:163 ../src/mainwindow.c:537 ../src/mainwindow.c:803 #: ../src/worldgui.c:1096 ../src/worldselector.c:193 ../src/worldeditor.c:180 #: ../src/we_general.c:342 ../src/we_generic_guied.c:81 #: ../src/we_triggers.c:83 ../src/we_triggers.c:553 ../src/we_triggers.c:751 #: ../src/we_aliases.c:76 ../src/we_aliases.c:455 ../src/we_macros.c:79 #: ../src/we_macros.c:420 ../src/we_timers.c:76 ../src/we_timers.c:457 #: ../src/we_hooks.c:87 ../src/we_hooks.c:620 ../src/we_vars.c:76 #: ../src/we_vars.c:368 ../src/prefs.c:107 ../src/triggers.c:278 #: ../src/multilinesend.c:93 ../src/cmdhistory.c:209 ../src/cmdhistory.c:454 #, c-format msgid "Error loading UI from XML file: %s" msgstr "Eraro dum ŝarĝo de interfaco el XMLdosiero: %s" #: ../src/mainwindow.c:596 ../src/mainwindow.c:597 msgid "Not connected" msgstr "Ne konektata" #: ../src/mainwindow.c:739 msgid ": Not yet active" msgstr ": Ne ankoraŭ aktiva" #: ../src/mainwindow.c:744 msgid ": Expired" msgstr ": Finiĝita" #: ../src/mainwindow.c:758 ../src/kildclient.ui:1995 #: ../src/dlgStatistics.ui:104 ../src/dlgStatistics.ui:337 msgid "None" msgstr "Neniu" #: ../src/worldgui.c:220 msgid "_Find:" msgstr "_Trovi:" #: ../src/worldgui.c:234 msgid "Find Next" msgstr "Trovi Proksiman" #: ../src/worldgui.c:261 msgid "Click to clear the command input area." msgstr "Klaku por forigi la tekston en la komandskatolo." #: ../src/worldgui.c:360 msgid "No world" msgstr "Neniu mondo" #: ../src/worldgui.c:430 msgid "KildClient ready" msgstr "KildClient preta" #: ../src/worldgui.c:437 msgid "0 lines" msgstr "0 linioj" #: ../src/worldgui.c:890 msgid "Are you sure you want to close this world?" msgstr "Ĉu vi vere volas fermi ĉi tiun mondon?" #: ../src/worldgui.c:891 msgid "Really close?" msgstr "Vere fermi?" #: ../src/worldgui.c:893 msgid "Keep _open" msgstr "Teni _malfermata" #: ../src/worldgui.c:894 ../src/worldselector.c:816 ../src/worldselector.c:822 #: ../src/wndmain.ui:72 ../src/dlgPreferences.ui:136 #: ../src/dlgTestTriggers.ui:23 ../src/dlgCmdHistory.ui:197 msgid "_Close" msgstr "_Fermi" #: ../src/worldgui.c:1025 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Eraro en konfigurado de literumilo: %s\n" #: ../src/worldgui.c:1029 msgid "Spell checking support not included in this build." msgstr "Literumado ne estas subtenata en ĉi tiu eldono." #: ../src/worldgui.c:1275 msgid "Click to open link; right-click for more options." msgstr "" "Klaku por malfermi; klaku kun la dekstra butono por pluraj alternativoj" #: ../src/worldgui.c:1437 msgid "Not found" msgstr "Ne trovata" #: ../src/ansitextview.c:423 msgid "1 line" msgstr "1 linio" #: ../src/ansitextview.c:425 #, c-format msgid "%d lines" msgstr "%d linioj" #: ../src/worldselector.c:138 ../src/worldselector.c:689 #, c-format msgid "Could not load world from file '%s': %s" msgstr "Ne eblas ŝarĝi mondon el dosiero '%s': %s" #: ../src/worldselector.c:141 ../src/worldselector.c:692 ../src/worlds.c:2370 #: ../src/we_generic_guied.c:315 ../src/we_generic_guied.c:404 #: ../src/prefs.c:448 ../src/prefs.c:527 msgid "KildClient Error" msgstr "Eraro - KildClient" #: ../src/worldselector.c:494 #, c-format msgid "Could not open world '%s': %s\n" msgstr "Ne eblas malfermi mondon '%s': %s\n" #: ../src/worldselector.c:537 #, c-format msgid "Invalid argument '%s'\n" msgstr "Argumento '%s' ne estas valida\n" #: ../src/worldselector.c:810 msgid "Disconnected" msgstr "Malkonektata" #: ../src/worldselector.c:813 ../src/worldselector.c:820 msgid "Reconnect" msgstr "Rekonekti" #: ../src/worldselector.c:814 ../src/worldselector.c:821 msgid "Connect to another world" msgstr "Konekti al alia mondo" #: ../src/worldselector.c:815 msgid "Offline" msgstr "Senkonekte" #: ../src/worlds.c:776 msgid "Unnamed world" msgstr "Mondo ne nomiĝata" #: ../src/worlds.c:833 #, c-format msgid "Could not open file: %s" msgstr "Ne eblas malfermi dosieron: %s" #: ../src/worlds.c:896 #, c-format msgid "Invalid top-level element '%s'" msgstr "Elemento '%s' invalida" #: ../src/worlds.c:1710 #, c-format msgid "Internal error: element '%s' ends when in START mode" msgstr "Interna eraro: elemento '%s' finiĝas en START reĝimo" #: ../src/worlds.c:1984 #, c-format msgid "Invalid key code '%s'" msgstr "Klavkodo '%s' invalida" #: ../src/worlds.c:2003 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "Elemento '%s' ne permisata ene elemento '%s'" #: ../src/worlds.c:2016 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "Atributo '%s' ne estas valida por elemento '%s'" #: ../src/worlds.c:2367 ../src/we_generic_guied.c:312 ../src/prefs.c:445 #, c-format msgid "Could not open file '%s': %s" msgstr "Ne eblas malfermi dosieron '%s': %s" #: ../src/worlds.c:2528 #, c-format msgid "Disconnected from world %s" msgstr "Malkonektita el mondo %s" #: ../src/worldeditor.c:245 msgid "General" msgstr "Ĝenerala" #: ../src/worldeditor.c:253 ../src/worldeditor.c:257 msgid "Display" msgstr "Apero" #: ../src/worldeditor.c:254 msgid "Here you can set options to configure the appearance of KildClient." msgstr "Ĉi tie vi povas agordi opciojn por konfiguri la aperon de KildClient." #: ../src/worldeditor.c:265 msgid "Main Window" msgstr "Ĉeffenestro" #: ../src/worldeditor.c:273 msgid "Colors" msgstr "Koloroj" #: ../src/worldeditor.c:281 msgid "Status Bar" msgstr "Stata breto" #: ../src/worldeditor.c:289 msgid "Input" msgstr "Enigo" #: ../src/worldeditor.c:297 msgid "Logging" msgstr "Registrado" #: ../src/worldeditor.c:303 ../src/worldeditor.c:307 msgid "Automation" msgstr "Aŭtomatizo" #: ../src/worldeditor.c:304 msgid "" "Here you can set options to configure the automation features of KildClient, " "such as triggers, aliases, plugins, etc." msgstr "" "Ĉi tie vi povas agordi opciojn por konfiguri la aŭtomatizfunkciojn de " "KildClient, kiel triggers, aliases, plugins, ktp." #: ../src/worldeditor.c:315 msgid "Scripting" msgstr "Skriptdosiero" #: ../src/worldeditor.c:323 msgid "Plugins" msgstr "Plugins" #: ../src/worldeditor.c:334 ../src/kildclient.ui:1556 msgid "Triggers" msgstr "Triggers" #: ../src/worldeditor.c:345 ../src/kildclient.ui:1571 msgid "Aliases" msgstr "Aliases" #: ../src/worldeditor.c:356 ../src/kildclient.ui:1586 msgid "Macros" msgstr "Macros" #: ../src/worldeditor.c:367 ../src/kildclient.ui:1601 msgid "Timers" msgstr "Timers" #: ../src/worldeditor.c:378 msgid "Hooks" msgstr "Hokoj" #: ../src/worldeditor.c:389 msgid "Variables" msgstr "Variabloj" #: ../src/worldeditor.c:398 msgid "Protocols" msgstr "Protokoloj" #: ../src/worldeditor.c:406 msgid "Miscellaneous" msgstr "Alispecaj" #: ../src/worldeditor.c:414 msgid "Advanced" msgstr "Avancita" #: ../src/we_general.c:73 msgid "Character" msgstr "Rolulo" #: ../src/we_general.c:81 msgid "Password" msgstr "Pasvorto" #: ../src/we_general.c:381 msgid "You must specify the name." msgstr "Vi devas informi la nomon." #: ../src/we_general.c:382 ../src/we_general.c:395 ../src/we_triggers.c:636 #: ../src/we_triggers.c:650 ../src/we_aliases.c:517 ../src/we_aliases.c:530 #: ../src/we_macros.c:477 ../src/we_macros.c:490 ../src/we_macros.c:503 #: ../src/we_timers.c:516 ../src/we_timers.c:529 ../src/we_hooks.c:672 #: ../src/we_vars.c:396 ../src/we_vars.c:408 ../src/we_vars.c:428 #: ../src/permanentvariables.c:129 ../src/cmdhistory.c:278 #: ../src/cmdhistory.c:290 ../src/cmdhistory.c:484 ../src/cmdhistory.c:517 #: ../src/cmdhistory.c:574 msgid "KildClient Warning" msgstr "Averto - KildClient" #: ../src/we_general.c:394 msgid "You must specify the password." msgstr "Vi devas informi la passvorton.." #: ../src/we_general.c:436 msgid "character" msgstr "rolulo" #: ../src/we_logging.c:112 #, c-format msgid "Logging to file %s." msgstr "Registrado aktiva al dosiero %s." #: ../src/we_logging.c:118 msgid "Logging is disabled." msgstr "Registrabo malaktiva." #: ../src/we_logging.c:215 msgid "Logging not started" msgstr "Registrado ne komencata." #: ../src/we_logging.c:245 msgid "Select log file" msgstr "Elektu Registradodosieron" #: ../src/we_logging.c:248 ../src/we_plugins.c:584 #: ../src/we_generic_guied.c:97 ../src/we_generic_guied.c:369 #: ../src/kildclient.ui:40 ../src/kildclient.ui:516 ../src/kildclient.ui:580 #: ../src/kildclient.ui:711 ../src/kildclient.ui:908 ../src/kildclient.ui:1125 #: ../src/kildclient.ui:1449 ../src/kildclient.ui:2170 #: ../src/dlgSelectWorld.ui:25 ../src/dlgEditWorld.ui:114 #: ../src/dlgMLSend.ui:36 ../src/dlgCmdHistory.ui:352 msgid "_Cancel" msgstr "_Resignu" #: ../src/we_logging.c:250 ../src/kildclient.ui:55 ../src/kildclient.ui:531 #: ../src/kildclient.ui:595 ../src/kildclient.ui:726 ../src/kildclient.ui:923 #: ../src/kildclient.ui:1140 ../src/kildclient.ui:1464 #: ../src/kildclient.ui:2185 ../src/dlgStatistics.ui:22 #: ../src/dlgEditWorld.ui:129 ../src/dlgCmdHistory.ui:367 msgid "_OK" msgstr "_OK" #: ../src/we_plugins.c:124 ../src/we_plugins.c:341 ../src/we_triggers.c:225 #: ../src/we_aliases.c:206 ../src/we_macros.c:209 ../src/we_timers.c:206 #: ../src/we_hooks.c:341 ../src/perlscript.c:3356 msgid "Name" msgstr "Nomo" #: ../src/we_plugins.c:136 ../src/we_plugins.c:383 ../src/perlscript.c:3357 msgid "Description" msgstr "Priskribo" #: ../src/we_plugins.c:148 ../src/we_plugins.c:369 msgid "Author" msgstr "Aŭtoro" #: ../src/we_plugins.c:161 msgid "File" msgstr "Dosiero" #: ../src/we_plugins.c:209 ../src/we_plugins.c:466 msgid "Error Loading Plugin" msgstr "Eraro dum Ŝargado de plugin" #: ../src/we_plugins.c:327 ../src/we_triggers.c:211 ../src/we_aliases.c:192 #: ../src/we_macros.c:195 ../src/we_timers.c:192 ../src/we_hooks.c:327 msgid "Enabled" msgstr "Ebligata" #: ../src/we_plugins.c:355 msgid "Version" msgstr "Eldono" #: ../src/we_plugins.c:444 msgid "Always load this plugin at _startup" msgstr "Ĉiam ŝargi ĉi tiun plugin en _startigo" #: ../src/we_plugins.c:507 msgid "The help is displayed in main window." msgstr "La aiuto estas en la ĉeffenestro." #: ../src/we_plugins.c:508 msgid "KildClient Information" msgstr "Informo - KildClient" #: ../src/we_plugins.c:509 msgid "_Do not display this message again" msgstr "_Ne montri ĉi tiun mesaĝon denove" #: ../src/we_plugins.c:581 msgid "Load plugin" msgstr "Ŝargi plugin" #: ../src/we_plugins.c:586 ../src/we_generic_guied.c:371 msgid "_Open" msgstr "_Malfermi" #: ../src/we_generic_guied.c:94 msgid "Export" msgstr "Eksporti" #: ../src/we_generic_guied.c:99 ../src/wndmain.ui:97 msgid "_Save" msgstr "Kon_servi" #: ../src/we_generic_guied.c:366 msgid "Import" msgstr "Importi" #: ../src/we_generic_guied.c:401 #, c-format msgid "Could not import file '%s': %s" msgstr "Ne eblas importi dosieron '%s': %s" #: ../src/we_generic_guied.c:960 #, c-format msgid "Do you really want to delete the %s?" msgstr "Ĉu vi vere volas eksigi la %s-n?" #: ../src/we_generic_guied.c:967 #, c-format msgid "Do you really want to delete %d %s?" msgstr "Ĉu vi vere volas eksigi %d %s?" #: ../src/we_generic_guied.c:971 ../src/we_vars.c:288 msgid "Confirm deletion" msgstr "Konfirmado de eksigo" #: ../src/we_generic_guied.c:973 msgid "Do not delete" msgstr "Ne eksigi" #: ../src/we_generic_guied.c:974 msgid "Delete" msgstr "Eksigi" #: ../src/we_triggers.c:130 ../src/dlgTestTriggers.ui:8 msgid "Test Triggers" msgstr "Testi Trigger-jn" #: ../src/we_triggers.c:239 ../src/we_aliases.c:220 ../src/triggers.c:141 #: ../src/aliases.c:177 msgid "Pattern" msgstr "Ŝablono" #: ../src/we_triggers.c:257 ../src/we_aliases.c:238 msgid "I. Case" msgstr "I. Usk." #: ../src/we_triggers.c:271 ../src/we_macros.c:237 ../src/we_timers.c:246 #: ../src/we_hooks.c:355 ../src/triggers.c:142 ../src/macros.c:145 #: ../src/timers.c:203 msgid "Action" msgstr "Ago" #: ../src/we_triggers.c:289 msgid "Gag" msgstr "Gag" #: ../src/we_triggers.c:307 msgid "Gag Log" msgstr "Gag Log" #: ../src/we_triggers.c:325 msgid "Keep Exec" msgstr "_Daŭri Ezek" #: ../src/we_triggers.c:343 msgid "Rewriter" msgstr "Reskribisto" #: ../src/we_triggers.c:361 msgid "Style" msgstr "Stilo" #: ../src/we_triggers.c:375 ../src/we_aliases.c:284 ../src/we_macros.c:251 #: ../src/we_timers.c:278 ../src/we_hooks.c:369 msgid "Plugin" msgstr "Plugin" #: ../src/we_triggers.c:471 ../share/kildclient.pl:233 #: ../share/kildclient.pl:236 ../share/kildclient.pl:443 #: ../share/kildclient.pl:518 ../share/kildclient.pl:821 msgid "trigger" msgstr "trigger" #: ../src/we_triggers.c:471 ../share/kildclient.pl:443 msgid "triggers" msgstr "triggers" #: ../src/we_triggers.c:635 ../src/we_aliases.c:516 msgid "You must specify the pattern." msgstr "Vi devas informi la ŝablonon." #: ../src/we_triggers.c:649 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" "Vi devas informi la agon, krom se trigger estas gag aŭ ŝanĝas la stilon." #: ../src/we_aliases.c:252 ../src/aliases.c:178 msgid "Substitution" msgstr "Anstataŭo" #: ../src/we_aliases.c:270 msgid "Eval as Perl" msgstr "Komp Perl" #: ../src/we_aliases.c:380 ../share/kildclient.pl:246 #: ../share/kildclient.pl:249 ../share/kildclient.pl:449 #: ../share/kildclient.pl:524 ../share/kildclient.pl:833 msgid "alias" msgstr "alias" #: ../src/we_aliases.c:380 ../share/kildclient.pl:449 msgid "aliases" msgstr "aliases" #: ../src/we_aliases.c:529 msgid "You must specify the substitution." msgstr "Vi devas informi la anstataŭon." #: ../src/we_macros.c:223 ../src/macros.c:144 msgid "Key" msgstr "Klavo" #: ../src/we_macros.c:347 ../share/kildclient.pl:259 #: ../share/kildclient.pl:262 ../share/kildclient.pl:455 #: ../share/kildclient.pl:530 ../share/kildclient.pl:845 msgid "macro" msgstr "macro" #: ../src/we_macros.c:347 ../share/kildclient.pl:455 msgid "macros" msgstr "macros" #: ../src/we_macros.c:476 msgid "You must specify the key." msgstr "Vi devas informi la klavon." #: ../src/we_macros.c:489 msgid "Invalid key code." msgstr "Invalida klavkodo." #: ../src/we_macros.c:502 ../src/we_timers.c:528 ../src/we_hooks.c:671 msgid "You must specify the action." msgstr "Vi devas informi la agon." #: ../src/we_timers.c:219 msgid "Interval" msgstr "Intervalo" #: ../src/we_timers.c:232 msgid "Count" msgstr "Fojoj" #: ../src/we_timers.c:264 msgid "Temp" msgstr "Nedaŭra" #: ../src/we_timers.c:381 ../share/kildclient.pl:272 #: ../share/kildclient.pl:275 ../share/kildclient.pl:461 #: ../share/kildclient.pl:536 ../share/kildclient.pl:857 msgid "timer" msgstr "timer" #: ../src/we_timers.c:381 ../share/kildclient.pl:461 msgid "timers" msgstr "timers" #: ../src/we_timers.c:515 msgid "The interval must be positive." msgstr "La intervalo devas esti pozitiva." #. The manually added combo for selecting which hook #: ../src/we_hooks.c:130 msgid "_Event:" msgstr "_Evento:" #: ../src/we_hooks.c:547 ../share/kildclient.pl:286 ../share/kildclient.pl:289 #: ../share/kildclient.pl:467 ../share/kildclient.pl:543 #: ../share/kildclient.pl:870 msgid "hook" msgstr "hoko" #: ../src/we_hooks.c:547 ../share/kildclient.pl:467 msgid "hooks" msgstr "hokoj" #: ../src/we_vars.c:279 msgid "Do you really want to make the variable temporary?" msgstr "Ĉu vi vere volas igi ĉi tiun variablon maldaŭra?" #: ../src/we_vars.c:285 #, c-format msgid "Do you really want to make %d variables temporary?" msgstr "Ĉu vi vere volas igi %d variablojn maldaŭraj?" #: ../src/we_vars.c:290 msgid "Keep permanent" msgstr "Teni daŭra" #: ../src/we_vars.c:291 msgid "Make temporary" msgstr "Igi maldaŭra" #: ../src/we_vars.c:395 msgid "You must specify a variable name." msgstr "Vi devas informi variablnomon." #: ../src/we_vars.c:407 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "Nur skalara ($), array (@) kaj hash (%%) variabloj povas iĝi daŭraj." #: ../src/we_vars.c:426 #, c-format msgid "%s is already permanent." msgstr "%s jam estas daŭra." #: ../src/prefs.c:398 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "Invalida specifo de grandeco de la fenestro en konfigurdosiero.\n" #: ../src/prefs.c:418 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "Ne konata direktivo '%s' en konfigurdosiero.\n" #: ../src/prefs.c:524 #, c-format msgid "Could not create directory '%s': %s" msgstr "Ne eblas krei dosierujon '%s': %s" #: ../src/parser.c:210 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "Averto: provante sendi tre grandan linion. Eble rekursia aliasdefino?" #: ../src/triggers.c:140 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "" #: ../src/triggers.c:162 ../src/triggers.c:163 ../src/triggers.c:164 #: ../src/triggers.c:165 ../src/triggers.c:166 ../src/triggers.c:167 #: ../src/triggers.c:168 ../src/aliases.c:198 ../src/aliases.c:199 #: ../src/aliases.c:200 ../src/macros.c:167 ../src/timers.c:226 #: ../src/timers.c:227 ../src/hooks.c:206 ../src/perlscript.c:3376 msgid "y" msgstr "j" #: ../src/triggers.c:162 ../src/triggers.c:163 ../src/triggers.c:164 #: ../src/triggers.c:165 ../src/triggers.c:166 ../src/triggers.c:167 #: ../src/triggers.c:168 ../src/aliases.c:198 ../src/aliases.c:199 #: ../src/aliases.c:200 ../src/macros.c:167 ../src/timers.c:226 #: ../src/timers.c:227 ../src/hooks.c:206 ../src/perlscript.c:3376 msgid "n" msgstr "n" #: ../src/triggers.c:361 ../src/kildclient.ui:1978 ../src/kildclient.ui:2015 msgid "No" msgstr "Ne" #: ../src/triggers.c:361 ../src/kildclient.ui:1981 ../src/kildclient.ui:2018 msgid "Yes" msgstr "Jes" #: ../src/aliases.c:176 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "" #: ../src/macros.c:143 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "" #: ../src/timers.c:195 msgid "Num Ena Temp Int " msgstr "" #: ../src/timers.c:199 msgid "Count " msgstr "Fojoj " #: ../src/permanentvariables.c:125 #, c-format msgid "" "Could not open file '%s': %s\n" "Variables were not saved." msgstr "" "Ne eblas malfermi dosieron '%s': %s\n" "Variabloj ne konserviĝis." #: ../src/hooks.c:60 #, c-format msgid "hook: hook '%s' not found\n" msgstr "hook: hoko '%s' ne trovata\n" #: ../src/hooks.c:76 ../src/hooks.c:229 msgid "No such hook" msgstr "Ne ekzistas tiun hokon." #: ../src/hooks.c:178 ../src/hooks.c:224 msgid "Hook not found" msgstr "Hoko ne trovata" #: ../src/hooks.c:191 #, c-format msgid "Hooks for '%s':\n" msgstr "Hokoj por '%s':\n" #: ../src/hooks.c:192 msgid "Num Ena Action" msgstr "" #: ../src/hooks.c:234 #, c-format msgid "" "Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Hoko numero %d por evento %s\n" " Nomo: %s\n" " Ago: %s\n" " Ebligata: %s\n" #: ../src/hooks.c:240 ../src/perlscript.c:1691 ../src/perlscript.c:2191 #: ../src/perlscript.c:2501 ../src/perlscript.c:2790 msgid "Not set" msgstr "Ne difinita" #: ../src/hooks.c:242 ../src/perlscript.c:1694 ../src/perlscript.c:1695 #: ../src/perlscript.c:1696 ../src/perlscript.c:1697 ../src/perlscript.c:1698 #: ../src/perlscript.c:1699 ../src/perlscript.c:1700 ../src/perlscript.c:2194 #: ../src/perlscript.c:2195 ../src/perlscript.c:2196 ../src/perlscript.c:2504 #: ../src/perlscript.c:2794 ../src/perlscript.c:2795 ../src/perlscript.c:3414 msgid "yes" msgstr "jes" #: ../src/hooks.c:242 ../src/perlscript.c:1694 ../src/perlscript.c:1695 #: ../src/perlscript.c:1696 ../src/perlscript.c:1697 ../src/perlscript.c:1698 #: ../src/perlscript.c:1699 ../src/perlscript.c:1700 ../src/perlscript.c:2194 #: ../src/perlscript.c:2195 ../src/perlscript.c:2196 ../src/perlscript.c:2504 #: ../src/perlscript.c:2794 ../src/perlscript.c:2795 ../src/perlscript.c:3414 msgid "no" msgstr "ne" #: ../src/log.c:105 msgid "File name not specified." msgstr "Plugindosiero ne informata." #: ../src/log.c:171 #, c-format msgid "Could not open log file: %s." msgstr "Ne eblas malfermi registraddosieron: %s." #: ../src/plugins.c:102 ../src/plugins.c:161 #, c-format msgid "Failed loading file %s: %s" msgstr "Ne eblas malfermi dosieron %s: %s" #: ../src/cmdhistory.c:277 msgid "No command selected." msgstr "Neniu komando selektata." #: ../src/cmdhistory.c:289 msgid "More than one command selected." msgstr "Plu ol unu komando selektata." #: ../src/cmdhistory.c:483 msgid "Enter some text to search for." msgstr "Tajpu tekston por trovi." #: ../src/cmdhistory.c:516 msgid "Use the Find button to find the first result." msgstr "Uzu la Trovi butonon por trovi la unuan rezultaton." #: ../src/cmdhistory.c:573 msgid "Command not found." msgstr "Komando ne trovata." #: ../src/perlscript.c:506 ../src/perlscript.c:512 ../src/perlscript.c:519 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "Malvalida funkciovoko: la sintakso estas $world->FUNKCIO" #: ../src/perlscript.c:673 ../src/perlscript.c:690 ../src/perlscript.c:752 #: ../src/perlscript.c:785 ../src/perlscript.c:1186 ../src/perlscript.c:1211 #: ../src/perlscript.c:1312 ../src/perlscript.c:1332 ../src/perlscript.c:1355 #: ../src/perlscript.c:1383 ../src/perlscript.c:1392 ../src/perlscript.c:1932 #: ../src/perlscript.c:1941 ../src/perlscript.c:2120 ../src/perlscript.c:2291 #: ../src/perlscript.c:2300 ../src/perlscript.c:2580 ../src/perlscript.c:2589 #: ../src/perlscript.c:2865 ../src/perlscript.c:2919 ../src/perlscript.c:2964 #: ../src/perlscript.c:3029 ../src/perlscript.c:3040 ../src/perlscript.c:3132 #: ../src/perlscript.c:3463 ../src/kcwin.c:96 #, c-format msgid "%s: Too few arguments" msgstr "%s: Mankas argumentoj" #: ../src/perlscript.c:718 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: Argumento devas esti numera" #: ../src/perlscript.c:766 ../src/perlscript.c:798 #, c-format msgid "%s: No such world" msgstr "%s: Ne ekzistas tiu mondo" #: ../src/perlscript.c:833 msgid "World saved." msgstr "Mondo konservita." #: ../src/perlscript.c:1082 ../src/perlscript.c:1097 ../src/perlscript.c:1107 #: ../src/perlscript.c:1268 ../share/kildclient.pl:1303 #, c-format, perl-format msgid "%s: This is an internal function, do not call directly." msgstr "%s: Ĉi tiu funkcio estas interna, ne ĝin voku rekte." #: ../src/perlscript.c:1086 ../src/perlscript.c:1514 ../src/perlscript.c:2043 #: ../src/perlscript.c:2416 ../src/perlscript.c:2611 ../src/perlscript.c:3093 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Invalida speco de argumento" #: ../src/perlscript.c:1278 ../src/perlscript.c:1284 #, c-format msgid "Protocol %s not enabled." msgstr "Protokolo %s ne estas ebligata." #: ../src/perlscript.c:1289 ../share/kildclient.pl:1151 msgid "Unknown protocol" msgstr "Malkonata protokolo." #: ../src/perlscript.c:1406 ../src/perlscript.c:1674 msgid "No such trigger" msgstr "Ne ekzistas tiun trigger" #: ../src/perlscript.c:1424 ../src/perlscript.c:1973 ../src/perlscript.c:2345 #: ../src/perlscript.c:3052 #, c-format msgid "%s: Too many string arguments" msgstr "%s: Troaj ĉenaj argumentoj" #: ../src/perlscript.c:1447 ../src/perlscript.c:1996 #, c-format msgid "%s: pattern given twice, using the named attribute one" msgstr "%s: ŝablono informita dufoje, uzante la de la nomata atributo" #: ../src/perlscript.c:1459 ../src/perlscript.c:2394 ../src/perlscript.c:3072 #, c-format msgid "%s: action given twice, using the named attribute one" msgstr "%s: agado informita dufoje, uzante la de la nomata atributo" #: ../src/perlscript.c:1505 ../src/perlscript.c:2034 ../src/perlscript.c:2407 #: ../src/perlscript.c:3085 #, c-format msgid "%s: Wrong type of reference" msgstr "%s: Invalida speco de referenco" #: ../src/perlscript.c:1525 #, c-format msgid "%s: pattern not specified, not creating" msgstr "%s: ŝablono ne informtita, ne kreita" #: ../src/perlscript.c:1534 #, c-format msgid "%s: action not specified, and isn't gag, not creating" msgstr "%s: agado ne informita, kaj ne estas gag, ne kreita" #: ../src/perlscript.c:1563 msgid "Trigger added." msgstr "Trigger adiciita." #: ../src/perlscript.c:1568 msgid "Trigger modified." msgstr "Triger ŝanĝita." #: ../src/perlscript.c:1593 #, c-format msgid "%s: invalid target" msgstr "%s: invalida 'target'" #: ../src/perlscript.c:1603 #, c-format msgid "%s: invalid fg color" msgstr "%s: invalida 'fg'" #: ../src/perlscript.c:1613 #, c-format msgid "%s: invalid bg color" msgstr "%s: invalida 'bg'" #: ../src/perlscript.c:1623 #, c-format msgid "%s: invalid underline style" msgstr "%s: invalida substrektstilo" #: ../src/perlscript.c:1679 #, c-format msgid "" "Trigger number %d\n" " Name: %s\n" " Pattern: %s\n" " Action: %s\n" " Enabled: %s\n" " Ignore case: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Keep executing: %s\n" " Rewriter: %s\n" " Change style: %s\n" msgstr "" "Trigger numero %d\n" " Nomo: %s\n" " Ŝablono: %s\n" " Ago: %s\n" " Ignore usklecon: %s\n" " Gag ekrano: %s\n" " Gag registrado: %s\n" " Ebligata: %s\n" " Daŭri ezekutadon: %s\n" " Reskribisto: %s\n" " Ŝanĝas stilon: %s\n" #: ../src/perlscript.c:1703 #, c-format msgid "" " Target: %d\n" " Foreground: %d\n" " Background: %d\n" " Italics: %d\n" " Striked-thru: %d\n" " Underline: %d\n" msgstr "" " Celo: %d\n" " Fono: %d\n" " Malfono: %d\n" " Kursivo: %d\n" " Trastrekto: %d\n" " Substrekto: %d\n" #: ../src/perlscript.c:1955 ../src/perlscript.c:2178 msgid "No such alias" msgstr "Ne ekzistas tiun alias." #: ../src/perlscript.c:2008 #, c-format msgid "%s: substitution given twice, using the named attribute one" msgstr "%s: anstataŭo informita dufoje, uzante la de la nomata atributo" #: ../src/perlscript.c:2054 msgid "alias: not creating alias without pattern" msgstr "alias: ne kreita alias sen ŝablono" #: ../src/perlscript.c:2062 msgid "alias: not creating alias without substitution" msgstr "alias: ne kreita alias sen anstataŭo" #: ../src/perlscript.c:2090 msgid "Alias added." msgstr "Alias adiciita" #: ../src/perlscript.c:2095 msgid "Alias modified." msgstr "Alias ŝanĝita." #: ../src/perlscript.c:2183 #, c-format msgid "" "Alias number %d\n" " Name: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Ignore case: %s\n" " Eval as Perl: %s\n" " Enabled: %s\n" msgstr "" "Alias numero %d\n" " Nomo: %s\n" " Ŝablono: %s\n" " Anstataŭo: %s\n" " Ignori usklecon: %s\n" " Komp. kiel Perl: %s\n" " Ebligata: %s\n" #: ../src/perlscript.c:2263 msgid "Press a key to get its keycode." msgstr "Prenu klavo por scii sian klavkodo." #: ../src/perlscript.c:2315 msgid "macro: No such macro" msgstr "macro: Ne ekzistas tiun macro" #: ../src/perlscript.c:2334 ../src/perlscript.c:2382 #, c-format msgid "%s: Invalid key code" msgstr "%s: Invalida klavkodo" #: ../src/perlscript.c:2371 #, c-format msgid "%s: keycode given twice, using the named attribute one" msgstr "%s: klavkodo informita dufoje, uzante la de la nomata atributo" #: ../src/perlscript.c:2427 #, c-format msgid "%s: keycode not specified, not creating" msgstr "%s: klavkodo ne informita, ne kreita" #: ../src/perlscript.c:2434 ../src/perlscript.c:2702 #, c-format msgid "%s: action not specified, not creating" msgstr "%s: agado ne informita, ne kreita" #: ../src/perlscript.c:2453 msgid "Macro added." msgstr "Macro adiciita." #: ../src/perlscript.c:2458 msgid "Macro modified." msgstr "Macro ŝanĝita." #: ../src/perlscript.c:2489 msgid "No such macro" msgstr "Ne ekzistas tiun macro." #: ../src/perlscript.c:2495 #, c-format msgid "" "Macro number %d\n" " Name: %s\n" " Key Code: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Macro numero %d\n" " Nomo: %s\n" " Klavkodo: %s\n" " Ago: %s\n" " Ebligata: %s\n" #: ../src/perlscript.c:2605 msgid "timer: No such timer" msgstr "timer: Ne ekzistas tiun timer" #: ../src/perlscript.c:2630 #, c-format msgid "%s: interval must be numeric" msgstr "%s: intervalo devas esti numera" #: ../src/perlscript.c:2643 #, c-format msgid "%s: count must be numeric" msgstr "%s: nombro devas esti numera" #: ../src/perlscript.c:2674 #, c-format msgid "%s: interval not specified, not creating" msgstr "%s: intervalo ne informita, ne kreita" #: ../src/perlscript.c:2681 #, c-format msgid "%s: cannot create timer with negative interval" msgstr "%s: invervalo devas esti pozitiva" #: ../src/perlscript.c:2742 msgid "Timer added." msgstr "Timer adiciita." #: ../src/perlscript.c:2747 msgid "Timer modified." msgstr "Timer ŝanĝita." #: ../src/perlscript.c:2777 msgid "No such timer" msgstr "Ne ekzistas tiun timer." #: ../src/perlscript.c:2782 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %.3f\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" "Timer numero %d\n" " Nomo: %s\n" " Intervalo: %.3f\\n\n" " Nombro de fojoj: %d\n" " Ago: %s\n" " Ebligata: %s\n" " Nedaŭra: %s\n" #: ../src/perlscript.c:2873 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" "%s: Nur skalara ($), array (@) kaj hash (%%) variabloj povas iĝi daŭraj" #: ../src/perlscript.c:2882 #, c-format msgid "%s: %s is already permanent" msgstr "%s: %s jam estas daŭra" #: ../src/perlscript.c:2896 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "%s: Variablo '%s' iĝis daŭra.\n" #: ../src/perlscript.c:2938 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "%s: Variablo '%s' iĝis maldaŭra.\n" #: ../src/perlscript.c:2942 #, c-format msgid "%s: %s is not permanent" msgstr "%s: %s ne estas daŭra" #: ../src/perlscript.c:2995 msgid "Permanent variables" msgstr "Daŭraj variabloj" #: ../src/perlscript.c:3107 msgid "Hook defined." msgstr "Hoko difinita." #: ../src/perlscript.c:3111 msgid "Hook modified." msgstr "Hoko ŝanĝita." #: ../src/perlscript.c:3217 msgid "Logging stopped." msgstr "Registrado haltigita." #: ../src/perlscript.c:3355 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "" #: ../src/perlscript.c:3398 msgid "No such plugin" msgstr "Ne ekzistas tiun plugin." #: ../src/perlscript.c:3403 #, c-format msgid "" "Plugin number %d\n" " Name: %s\n" " Version: %s\n" " Description: %s\n" " Author: %s\n" " Enabled: %s\n" msgstr "" "Plugin numero %d\n" " Nomo: %s\n" " Eldono: %s\n" " Priskribo: %s\n" " Aŭtoro: %s\n" " Ebligata: %s\n" #: ../src/kildclient.ui:21 msgid "Edit Timer" msgstr "Redakti Timer" #: ../src/kildclient.ui:88 ../src/kildclient.ui:351 ../src/kildclient.ui:628 #: ../src/kildclient.ui:783 ../src/kildclient.ui:956 ../src/kildclient.ui:1173 #: ../src/dlgEditWorld.ui:240 ../src/dlgEditWorld.ui:3498 msgid "_Name:" msgstr "_Nomo:" #: ../src/kildclient.ui:100 msgid "Enter optionally a descriptive name for the timer" msgstr "Informu, se vi volas, priskriban nomon por la timer" #: ../src/kildclient.ui:114 msgid "_Interval:" msgstr "_Intervalo:" #: ../src/kildclient.ui:132 msgid "Specify the interval, in seconds, between timer activations" msgstr "Informu la intervalon, en sekundoj, inter aktivadoj de ĉi tiu timer" #: ../src/kildclient.ui:150 msgid "seconds" msgstr "sekundoj" #: ../src/kildclient.ui:169 msgid "_Repeat count:" msgstr "_Nombro de fojoj:" #: ../src/kildclient.ui:187 msgid "" "Specify how many times this timer should run before being disabled or deleted" msgstr "" "Informu kiom da fojoj ĉi tiu timer devas ruli antaŭ esti malebligita ou " "eksigita" #: ../src/kildclient.ui:204 msgid "(-1 to repeat indefinitely)" msgstr "(-1 por repeti indefine)" #: ../src/kildclient.ui:223 ../src/kildclient.ui:809 ../src/kildclient.ui:1021 #: ../src/kildclient.ui:1238 msgid "_Action:" msgstr "_Ago:" #: ../src/kildclient.ui:235 msgid "Enter the action to be executed whenever the timer fires" msgstr "Informu agon kiun estos rulata kiam timer aktiviĝas" #: ../src/kildclient.ui:245 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "_Nedaŭra (estos eksigita aŭtomate kiam lia nombro de fojoj atingas 0)" #: ../src/kildclient.ui:249 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" "Marku se vi volas que la timer estu eksigita kiam la lia nombro de fojoj " "antigas 0" #: ../src/kildclient.ui:262 ../src/kildclient.ui:457 ../src/kildclient.ui:831 #: ../src/kildclient.ui:1043 ../src/kildclient.ui:1373 msgid "_Enabled" msgstr "_Ebligata" #: ../src/kildclient.ui:266 msgid "Check to make the timer enabled; only enabled timers are run" msgstr "Marku por enabligi la timer-n; nur enabligataj timer-oj estas rulataj" #: ../src/kildclient.ui:282 ../src/kildclient.ui:477 ../src/kildclient.ui:851 #: ../src/kildclient.ui:1063 ../src/kildclient.ui:1393 msgid "Note:" msgstr "Notu:" #: ../src/kildclient.ui:295 ../src/kildclient.ui:490 ../src/kildclient.ui:864 #: ../src/kildclient.ui:1076 ../src/kildclient.ui:1406 msgid "" "This object belongs to a plugin. Changes made here will not be saved " "in the plugin." msgstr "" "Ĉi tiu objekto apartenas al unu plugin. Ŝanĝoj farataj ĉi tie ne " "estos konservataj en la plugin." #: ../src/kildclient.ui:327 msgid "Edit Alias" msgstr "Redakti Alias" #: ../src/kildclient.ui:363 msgid "Enter optionally a descriptive name for the alias" msgstr "Informu, se vi volas, priskriban nomon por la alias" #: ../src/kildclient.ui:377 ../src/kildclient.ui:1198 msgid "_Pattern:" msgstr "_Ŝablono:" #: ../src/kildclient.ui:389 msgid "Enter the pattern to match against typed commands" msgstr "Informu la ŝablono por provi kongrui kun tajpataj komandoj" #: ../src/kildclient.ui:399 ../src/kildclient.ui:1220 msgid "_Ignore case when matching" msgstr "_Ignori usklecon" #: ../src/kildclient.ui:417 msgid "_Substitution:" msgstr "_Anstataŭo:" #: ../src/kildclient.ui:430 msgid "Enter the substitution to be executed" msgstr "Informu anstataŭon por ruli" #: ../src/kildclient.ui:440 msgid "E_val substitution as Perl statement" msgstr "_Komputi anstataŭon kiel Perl komando" #: ../src/kildclient.ui:444 msgid "Check to have the substitution be executed in a s///e construction" msgstr "Marku por ke la anstataŭo estu komputita en s///e konstruo" #: ../src/kildclient.ui:461 msgid "Check to make the alias enabled; only enabled aliases are tried" msgstr "Marku por enabligi la alias-n; nur enabligataj alias-oj estas provataj" #: ../src/kildclient.ui:561 msgid "Edit Character Information" msgstr "Redakti Informon de Rolulo" #: ../src/kildclient.ui:640 msgid "Enter the character's name for automatic login" msgstr "Informu la nomon de la rolulo por automata saluto" #: ../src/kildclient.ui:654 msgid "_Password:" msgstr "Pas_vorto:" #: ../src/kildclient.ui:667 msgid "Enter the character's password for automatic login" msgstr "Informu la pasvorton de la rolulo por automata saluto" #: ../src/kildclient.ui:692 msgid "Edit Hook" msgstr "Redakti Hoko" #: ../src/kildclient.ui:759 msgid "Event:" msgstr "Evento:" #: ../src/kildclient.ui:795 msgid "Enter optionally a descriptive name for the hook" msgstr "Informu, se vi volas, priskriban nomon por la hoko" #: ../src/kildclient.ui:821 msgid "Enter the action to be run when the event happens" msgstr "Informu agon kiun estos rulata kiam evento okazos" #: ../src/kildclient.ui:835 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "Marku por enabligi la hokon; nur enabligataj hookoj estas rulataj" #: ../src/kildclient.ui:889 msgid "Edit Macro" msgstr "Redakti Macro" #: ../src/kildclient.ui:968 msgid "Enter optionally a descriptive name for the macro" msgstr "Informu, se vi volas, priskriban nomon por la macro" #: ../src/kildclient.ui:982 msgid "_Key:" msgstr "_Klavo:" #: ../src/kildclient.ui:994 msgid "Press the key that will be used to run the macro" msgstr "Tajpu klavon kiu estos usata por ruli la macron" #: ../src/kildclient.ui:1008 msgid "" "Press the key that will be used to activate the macro while the cursor is in " "the text box." msgstr "" "Tajpu klavon kiu estos usata por ruli la macron dum kursoro estas en " "tekstskatolo." #: ../src/kildclient.ui:1033 msgid "Enter the action to be run when the key is pressed" msgstr "Informu agon kiun estos rulata kiam la klavo estas tajpata" #: ../src/kildclient.ui:1047 msgid "Check to make the macro enabled; only enabled macros are run" msgstr "Marku por enabligi la macron; nur enabligataj macroj estas rulataj" #: ../src/kildclient.ui:1104 ../src/kildclient.ui:2154 msgid "Enter optionally a descriptive name for the trigger" msgstr "Informu, se vi volas, priskriban nomon por la trigger" #: ../src/kildclient.ui:1105 msgid "Edit Trigger" msgstr "Redakti Trigger" #: ../src/kildclient.ui:1210 msgid "Enter the pattern to match against received lines" msgstr "Informu ŝablonon por provi kongrui kun ricevataj linioj" #: ../src/kildclient.ui:1250 msgid "Enter the action that will be run when a match happens" msgstr "Informu agon kiun estos rulata kiam linioj kongruas ŝablonon" #: ../src/kildclient.ui:1260 msgid "Omit (_gag) from output" msgstr "Ne montri (_gag) en ĉeffenestro" #: ../src/kildclient.ui:1264 msgid "Check to make the matched line not be printed in the main output window" msgstr "Marku por ke la linio ne estos montrata en la ĉeffekrano" #: ../src/kildclient.ui:1277 msgid "Omit (gag) from _log file" msgstr "Ne skribi (gag) en registraddosiero" #: ../src/kildclient.ui:1281 msgid "Check to make the matched line not be printed in the log file" msgstr "Marku por ke la linio ne estos skribata en la registraddosiero" #: ../src/kildclient.ui:1294 msgid "_Keep executing other triggers after this this one matches" msgstr "_Daŭri la ezekutadon de aliaj trigger-oj eĉ se ĉi tiu rulas" #: ../src/kildclient.ui:1298 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" "Marku por ke ĉi tiu trigger ne malebligu aliajn trigger-ojn de funkci, se ĉi " "tiu rulos" #: ../src/kildclient.ui:1311 msgid "_Rewriter trigger" msgstr "_Reskribista trigger" #: ../src/kildclient.ui:1315 msgid "Check to make this trigger a rewriter trigger" msgstr "Marku por ke la trigger estu reskribista trigger" #: ../src/kildclient.ui:1333 msgid "C_hange style" msgstr "Ŝ_anĝi stilon" #: ../src/kildclient.ui:1350 msgid "C_onfigure..." msgstr "K_onfiguri..." #: ../src/kildclient.ui:1377 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" "Marku por enabligi la trigger-n; nur enabligataj trigger-oj estas provataj" #: ../src/kildclient.ui:1434 msgid "Permenent variable" msgstr "Daŭra variablo" #: ../src/kildclient.ui:1497 msgid "_Name of variable to make permanent:" msgstr "_Nomo de variablo por iĝi daŭra:" #: ../src/kildclient.ui:1511 msgid "" "Enter the name of a scalar ($), array (@) or hash (%) variable whose " "contents are to be saved between sessions of the World" msgstr "" "Informu nomon de skalara ($), array (@) aŭ hash (%) variablo kies enhavo " "saviĝas inter seancoj de la Mondo" #: ../src/kildclient.ui:1616 msgid "Permanent Variables" msgstr "Daŭraj Variabloj" #: ../src/kildclient.ui:1631 msgid "OnConnect Hooks" msgstr "OnConnect Hokoj" #: ../src/kildclient.ui:1646 msgid "OnDisconnect Hooks" msgstr "OnDisconnect Hokoj" #: ../src/kildclient.ui:1661 msgid "OnReceivedText Hooks" msgstr "OnReceivedText Hokoj" #: ../src/kildclient.ui:1676 msgid "OnSentCommand Hooks" msgstr "OnSentCommand Hokoj" #: ../src/kildclient.ui:1691 msgid "OnGetFocus Hooks" msgstr "OnGetFocus Hokoj" #: ../src/kildclient.ui:1706 msgid "OnLoseFocus Hooks" msgstr "OnLoseFocus Hokoj" #: ../src/kildclient.ui:1721 msgid "OnCloseConnected Hooks" msgstr "OnCloseConnected Hokoj" #: ../src/kildclient.ui:1746 msgid "_Items to export" msgstr "_Eroj por eksporti" #: ../src/kildclient.ui:1833 ../src/dlgSelectWorld.ui:114 #: ../src/dlgEditWorld.ui:707 msgid "_New" msgstr "_Nova" #: ../src/kildclient.ui:1847 ../src/wndmain.ui:158 #: ../src/dlgSelectWorld.ui:128 ../src/dlgEditWorld.ui:723 msgid "_Edit" msgstr "_Redakti" #: ../src/kildclient.ui:1862 ../src/wndmain.ui:199 #: ../src/dlgSelectWorld.ui:142 ../src/dlgEditWorld.ui:739 msgid "_Delete" msgstr "_Eksigi" #: ../src/kildclient.ui:1877 msgid "_Import" msgstr "_Importi" #: ../src/kildclient.ui:1891 msgid "E_xport" msgstr "_Eksporti" #: ../src/kildclient.ui:1906 ../src/dlgEditWorld.ui:755 #: ../src/dlgEditWorld.ui:4146 msgid "_Up" msgstr "_Supren" #: ../src/kildclient.ui:1921 ../src/dlgEditWorld.ui:4162 msgid "_Down" msgstr "_Malsupren" #: ../src/kildclient.ui:1975 ../src/kildclient.ui:1992 #: ../src/kildclient.ui:2012 ../src/kildclient.ui:2029 #: ../src/kildclient.ui:2094 msgid "Do not change" msgstr "Ne ŝanĝi" #: ../src/kildclient.ui:1998 msgid "Single" msgstr "Unuobla" #: ../src/kildclient.ui:2001 msgid "Double" msgstr "Duobla" #: ../src/kildclient.ui:2032 ../src/kildclient.ui:2097 #: ../src/dlgPreferences.ui:23 msgid "Black" msgstr "Nigra" #: ../src/kildclient.ui:2035 ../src/kildclient.ui:2100 #: ../src/dlgPreferences.ui:26 msgid "Red" msgstr "Ruĝa" #: ../src/kildclient.ui:2038 ../src/kildclient.ui:2103 #: ../src/dlgPreferences.ui:29 msgid "Green" msgstr "Verda" #: ../src/kildclient.ui:2041 ../src/kildclient.ui:2106 #: ../src/dlgPreferences.ui:32 msgid "Yellow" msgstr "Flava" #: ../src/kildclient.ui:2044 ../src/kildclient.ui:2109 #: ../src/dlgPreferences.ui:35 msgid "Blue" msgstr "Blua" #: ../src/kildclient.ui:2047 ../src/kildclient.ui:2112 #: ../src/dlgPreferences.ui:38 msgid "Magenta" msgstr "Malva" #: ../src/kildclient.ui:2050 ../src/kildclient.ui:2115 #: ../src/dlgPreferences.ui:41 msgid "Cyan" msgstr "Cejana" #: ../src/kildclient.ui:2053 ../src/kildclient.ui:2118 #: ../src/dlgPreferences.ui:44 msgid "White" msgstr "Blanka" #: ../src/kildclient.ui:2056 ../src/kildclient.ui:2121 #: ../src/dlgPreferences.ui:47 msgid "Default" msgstr "Defaŭta" #: ../src/kildclient.ui:2059 ../src/kildclient.ui:2124 #: ../src/dlgPreferences.ui:50 msgid "Black (bold)" msgstr "Nigra (grasa)" #: ../src/kildclient.ui:2062 ../src/kildclient.ui:2127 #: ../src/dlgPreferences.ui:53 msgid "Red (bold)" msgstr "Ruĝa (grasa)" #: ../src/kildclient.ui:2065 ../src/kildclient.ui:2130 #: ../src/dlgPreferences.ui:56 msgid "Green (bold)" msgstr "Verda (grasa)" #: ../src/kildclient.ui:2068 ../src/kildclient.ui:2133 #: ../src/dlgPreferences.ui:59 msgid "Yellow (bold)" msgstr "Flava (grasa)" #: ../src/kildclient.ui:2071 ../src/kildclient.ui:2136 #: ../src/dlgPreferences.ui:62 msgid "Blue (bold)" msgstr "Blua (grasa)" #: ../src/kildclient.ui:2074 ../src/kildclient.ui:2139 #: ../src/dlgPreferences.ui:65 msgid "Magenta (bold)" msgstr "Malva (grasa)" #: ../src/kildclient.ui:2077 ../src/kildclient.ui:2142 #: ../src/dlgPreferences.ui:68 msgid "Cyan (bold)" msgstr "Cejana (grasa)" #: ../src/kildclient.ui:2080 ../src/kildclient.ui:2145 #: ../src/dlgPreferences.ui:71 msgid "White (bold)" msgstr "Blanka (grasa)" #: ../src/kildclient.ui:2083 ../src/kildclient.ui:2148 #: ../src/dlgPreferences.ui:74 msgid "Default (bold)" msgstr "Defaŭlta (grasa)" #: ../src/kildclient.ui:2155 msgid "Change Style" msgstr "Ŝanĝi Stilon" #: ../src/kildclient.ui:2221 msgid "_Apply to:" msgstr "_Apliki al:" #: ../src/kildclient.ui:2234 msgid "_Foreground:" msgstr "Malf_ono:" #: ../src/kildclient.ui:2264 msgid "_Background:" msgstr "_Fono:" #: ../src/kildclient.ui:2294 msgid "_Italic:" msgstr "_Kursivo:" #: ../src/kildclient.ui:2324 msgid "_Striked-thru:" msgstr "Tra_strekto:" #: ../src/kildclient.ui:2354 msgid "_Underline:" msgstr "_Substrekto:" #: ../src/kildclient.ui:2386 msgid "The whole line" msgstr "La tutan linion" #: ../src/kildclient.ui:2402 msgid "The whole matched text" msgstr "La tutan kongruitan tekston" #: ../src/kildclient.ui:2424 msgid "The matched substring number" msgstr "La parton numero" #: ../src/wndmain.ui:24 msgid "_World" msgstr "_Mondo" #: ../src/wndmain.ui:35 msgid "_Open..." msgstr "_Malfermi..." #: ../src/wndmain.ui:45 msgid "_Reconnect" msgstr "_Rekonekti" #: ../src/wndmain.ui:54 msgid "_Disconnect" msgstr "_Malkonekti" #: ../src/wndmain.ui:63 msgid "Connect to _Another..." msgstr "Konekti al _alia mondo..." #: ../src/wndmain.ui:87 msgid "_Edit..." msgstr "_Redakti..." #: ../src/wndmain.ui:106 msgid "S_tatistics..." msgstr "S_tatistikoj..." #: ../src/wndmain.ui:121 ../src/wndmain.ui:257 msgid "_Previous" msgstr "_Antaŭa" #: ../src/wndmain.ui:130 ../src/wndmain.ui:267 msgid "_Next" msgstr "_Proksima" #: ../src/wndmain.ui:169 msgid "Cu_t" msgstr "El_tondi" #: ../src/wndmain.ui:179 msgid "_Copy" msgstr "_Kopii" #: ../src/wndmain.ui:189 msgid "_Paste" msgstr "_Enmeti" #: ../src/wndmain.ui:214 ../src/dlgCmdHistory.ui:69 msgid "_Find" msgstr "_Trovi" #: ../src/wndmain.ui:224 ../src/wndmain.ui:287 msgid "Find N_ext" msgstr "Trovi _proksiman" #: ../src/wndmain.ui:238 msgid "_Input" msgstr "_Enigo" #: ../src/wndmain.ui:248 ../src/dlgEditWorld.ui:3850 ../src/dlgMLSend.ui:147 msgid "_Clear" msgstr "_Purigi" #: ../src/wndmain.ui:277 msgid "Find P_revious" msgstr "Trovi _antaŭa" #: ../src/wndmain.ui:297 msgid "Command _History..." msgstr "Komand_historio..." #: ../src/wndmain.ui:313 msgid "_Multi-line Send..." msgstr "_Sendi plurajn liniojn..." #: ../src/wndmain.ui:329 msgid "_Test Triggers..." msgstr "_Testi trigger-jn..." #: ../src/wndmain.ui:342 msgid "_Preferences" msgstr "_Preferoj" #: ../src/wndmain.ui:353 msgid "Disable _Triggers" msgstr "Malebligi _triggers" #: ../src/wndmain.ui:363 msgid "Disable _Aliases" msgstr "Malebligi _aliases" #: ../src/wndmain.ui:373 msgid "Disable _Macros" msgstr "Malebligi _macros" #: ../src/wndmain.ui:383 msgid "Disable T_imers" msgstr "Malebligi t_imers" #: ../src/wndmain.ui:399 msgid "_Debug Matches" msgstr "" #: ../src/wndmain.ui:414 msgid "_Preferences..." msgstr "_Preferoj..." #: ../src/wndmain.ui:423 msgid "Edit Default _World..." msgstr "Redakti defaŭltan _mondon..." #: ../src/wndmain.ui:436 msgid "_Display" msgstr "_Apero" #: ../src/wndmain.ui:447 msgid "_Split Window" msgstr "Dividi fene_stron" #: ../src/wndmain.ui:461 ../src/dlgEditWorld.ui:3998 msgid "_Help" msgstr "_Helpo" #: ../src/wndmain.ui:471 msgid "_Manual" msgstr "_Manlibro" #: ../src/wndmain.ui:481 msgid "_About" msgstr "_Koncerne" #: ../src/dlgSelectWorld.ui:8 msgid "Connect to" msgstr "Konekti al" #: ../src/dlgSelectWorld.ui:39 msgid "C_onnect" msgstr "K_onekti" #: ../src/dlgSelectWorld.ui:62 msgid "_Select a saved world:" msgstr "_Elektu konservitan mondon:" #: ../src/dlgSelectWorld.ui:176 msgid "Or connect d_irectly:" msgstr "Aŭ konektu _rekte:" #: ../src/dlgSelectWorld.ui:204 ../src/dlgEditWorld.ui:254 msgid "_Host:" msgstr "R_etnodo:" #: ../src/dlgSelectWorld.ui:218 ../src/dlgEditWorld.ui:268 msgid "_Port:" msgstr "_Pordo:" #: ../src/dlgPreferences.ui:85 ../src/dlgEditWorld.ui:82 msgid "No proxy" msgstr "Sen prokurservilo" #: ../src/dlgPreferences.ui:88 ../src/dlgEditWorld.ui:85 msgid "SOCKS4" msgstr "SOCKS4" #: ../src/dlgPreferences.ui:91 ../src/dlgEditWorld.ui:88 msgid "SOCKS5" msgstr "SOCKS5" #: ../src/dlgPreferences.ui:94 ../src/dlgEditWorld.ui:91 msgid "HTTP" msgstr "HTTP" #: ../src/dlgPreferences.ui:105 msgid "Left" msgstr "Maldesktre" #: ../src/dlgPreferences.ui:108 msgid "Right" msgstr "Dekstre" #: ../src/dlgPreferences.ui:111 msgid "Top" msgstr "Supre" #: ../src/dlgPreferences.ui:114 msgid "Bottom" msgstr "Malsupre" #: ../src/dlgPreferences.ui:120 msgid "Preferences" msgstr "Preferoj" #: ../src/dlgPreferences.ui:180 msgid "Colors used by KildClient" msgstr "Koloroj uzataj de KildClient" #: ../src/dlgPreferences.ui:216 msgid "_Informative messages:" msgstr "_Informaj mesaĝoj:" #: ../src/dlgPreferences.ui:248 msgid "_Command echo:" msgstr "Eĥo de _komandoj:" #: ../src/dlgPreferences.ui:308 msgid "Window configuration" msgstr "Konfiguro de la fenestro" #: ../src/dlgPreferences.ui:344 msgid "_Tab position:" msgstr "_Pozicio de la langetoj:" #: ../src/dlgPreferences.ui:374 msgid "_Hide tabs if only one world is open" msgstr "Kaŝi langetojn se nur unu mondo estas malferma" #: ../src/dlgPreferences.ui:379 msgid "" "If this is checked, when there is only one open world no tabs will be shown" msgstr "" "Se ĉi tiu estas markata, neniu langeto estos montrata kiam estas nur unu " "malferma mondo" #: ../src/dlgPreferences.ui:393 msgid "_Flash window when new text is received" msgstr "_Ekbrili fenestron kiam nova teksto alvenas" #: ../src/dlgPreferences.ui:435 msgid "Appearance" msgstr "Apero" #: ../src/dlgPreferences.ui:459 msgid "Sending Delays" msgstr "Malfruigo Inter Sendadoj" #: ../src/dlgPreferences.ui:495 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "" "Informu la defaŭltajn parametrojn por la sendado de pluraj linioj aŭ " "komandoj:" #: ../src/dlgPreferences.ui:512 msgid "_Number of lines/commands to send at once:" msgstr "_Nombro de linioj/komandoj por sendi samtempe:" #: ../src/dlgPreferences.ui:553 msgid "_Delay between each group of lines/commands:" msgstr "_Tempo por atendi inter la sendado de ĉiu grupo de linioj/komandoj:" #: ../src/dlgPreferences.ui:616 msgid "Sending" msgstr "Sendado" #: ../src/dlgPreferences.ui:641 msgid "Web Browser" msgstr "Retumilo" #: ../src/dlgPreferences.ui:677 msgid "Specify the command used to launch a web browser" msgstr "Informu komandon por ŝalti retumilon" #: ../src/dlgPreferences.ui:692 msgid "" "Enter the command to run a web browser. %s will be substituted by the web " "page address." msgstr "" "Informu komandon por ŝalti retumilon. %s anstataŭiĝos por la adreso de la " "retpaĝo." #: ../src/dlgPreferences.ui:734 msgid "Audio Player" msgstr "Audludilo" #: ../src/dlgPreferences.ui:770 msgid "Specify the command used to play sound files." msgstr "Informu komandon por ludi auddosierojn." #: ../src/dlgPreferences.ui:785 msgid "" "Enter the command to run an audio player program. %s will be substituted by " "the file path." msgstr "Informu komandon por ŝalti audlulidon. %s anstataŭiĝos por la dosiero." #: ../src/dlgPreferences.ui:824 msgid "External Programs" msgstr "Eksteraj Programoj" #: ../src/dlgPreferences.ui:850 ../src/dlgEditWorld.ui:370 msgid "Proxy" msgstr "Prokurservilo" #: ../src/dlgPreferences.ui:890 ../src/dlgEditWorld.ui:410 msgid "Proxy _type:" msgstr "_Tipo de prokurservilo:" #: ../src/dlgPreferences.ui:936 ../src/dlgEditWorld.ui:456 msgid "Server _address:" msgstr "Serviladreso:" #: ../src/dlgPreferences.ui:949 ../src/dlgEditWorld.ui:515 msgid "_Username:" msgstr "Sal_utnomo:" #: ../src/dlgPreferences.ui:984 ../src/dlgEditWorld.ui:480 msgid "Server _port:" msgstr "Servil_pordo:" #: ../src/dlgPreferences.ui:997 ../src/dlgEditWorld.ui:528 msgid "Pass_word:" msgstr "Pas_vorto:" #: ../src/dlgPreferences.ui:1065 msgid "Proxy" msgstr "Prokurservilo" #: ../src/dlgStatistics.ui:8 msgid "Statistics" msgstr "Statistikoj" #: ../src/dlgStatistics.ui:56 ../src/dlgStatistics.ui:68 #: ../src/dlgStatistics.ui:223 ../src/dlgStatistics.ui:349 #: ../src/dlgStatistics.ui:467 ../src/dlgStatistics.ui:479 #: ../src/dlgStatistics.ui:491 ../src/dlgStatistics.ui:503 #: ../src/dlgStatistics.ui:515 ../src/dlgStatistics.ui:539 #: ../src/dlgStatistics.ui:575 ../src/dlgStatistics.ui:587 #: ../src/dlgStatistics.ui:611 ../src/dlgStatistics.ui:647 #: ../src/dlgStatistics.ui:659 msgid "N/A" msgstr "N/A" #: ../src/dlgStatistics.ui:80 msgid "Proxy port:" msgstr "Prokurservila pordo:" #: ../src/dlgStatistics.ui:92 msgid "Proxy host:" msgstr "Prokurservilo:" #: ../src/dlgStatistics.ui:116 msgid "Proxy type:" msgstr "Tipo de prokurservilo:" #: ../src/dlgStatistics.ui:128 msgid "World name:" msgstr "Nomo de la mondo:" #: ../src/dlgStatistics.ui:140 msgid "Host:" msgstr "Retnodo:" #: ../src/dlgStatistics.ui:152 msgid "Port:" msgstr "Pordo:" #: ../src/dlgStatistics.ui:164 msgid "Connection time:" msgstr "Konektadtempo:" #: ../src/dlgStatistics.ui:176 msgid "Idle time:" msgstr "Inativa tempo:" #: ../src/dlgStatistics.ui:199 msgid "Compression used:" msgstr "Kompaktigilo uzata:" #: ../src/dlgStatistics.ui:211 msgid "Bytes received (compressed):" msgstr "Riĉevitaj bajtoj (kompaktigitaj):" #: ../src/dlgStatistics.ui:235 msgid "Bytes received (decompressed):" msgstr "Riĉevitaj bajtoj (nekompaktigitaj):" #: ../src/dlgStatistics.ui:247 msgid "Compression ratio:" msgstr "Kompatigkvociento:" #: ../src/dlgStatistics.ui:259 msgid "Lines received:" msgstr "Linioj riĉevitaj:" #: ../src/dlgStatistics.ui:383 msgid "Key exchange:" msgstr "Ŝlosilointerŝanĝo:" #: ../src/dlgStatistics.ui:395 msgid "SSL protocol used:" msgstr "SSL protokolo uzata:" #: ../src/dlgStatistics.ui:407 msgid "Compression algorithm:" msgstr "Kompatigalgoritmo:" #: ../src/dlgStatistics.ui:419 msgid "Certificate type:" msgstr "Tipo de atesto:" #: ../src/dlgStatistics.ui:431 msgid "Cipher:" msgstr "Cifero:" #: ../src/dlgStatistics.ui:443 msgid "MAC:" msgstr "MAC:" #: ../src/dlgStatistics.ui:455 msgid "SSL not supported in this version" msgstr "SSL ne subtenata en ĉi tiu eldono" #: ../src/dlgStatistics.ui:527 msgid "Hostname:" msgstr "Retnodo:" #: ../src/dlgStatistics.ui:551 msgid "Valid since:" msgstr "Valida de:" #: ../src/dlgStatistics.ui:563 msgid "Expiration:" msgstr "Finiĝas:" #: ../src/dlgStatistics.ui:599 msgid "Fingerprint:" msgstr "Fingropremaĵo:" #: ../src/dlgStatistics.ui:623 msgid "Subject's DN:" msgstr "" #: ../src/dlgStatistics.ui:635 msgid "Issuer's DN:" msgstr "" #: ../src/dlgAbout.ui:12 msgid "A mud client with powerful features and support for Perl Scripting" msgstr "MUDkliento kun potencajn eblojn kaj subtenon de Perl skriptoj" #: ../src/dlgAbout.ui:14 msgid "Visit http://www.kildclient.org" msgstr "Vizitu http://www.kildclient.org" #: ../src/dlgEditWorld.ui:62 msgid "No auto-login" msgstr "Sen aŭtomata saluto" #: ../src/dlgEditWorld.ui:79 msgid "Use global settings" msgstr "Uzi defaŭltan konfiguron" #: ../src/dlgEditWorld.ui:98 msgid "Edit World" msgstr "Redakti Mondon" #: ../src/dlgEditWorld.ui:203 msgid "Connection" msgstr "Konekto" #: ../src/dlgEditWorld.ui:281 msgid "Enter a descriptive name for the World" msgstr "Informu priskriban nomon por la Mondo" #: ../src/dlgEditWorld.ui:295 msgid "Enter the host to connect to" msgstr "Informu la retnodon al kiu konekti" #: ../src/dlgEditWorld.ui:309 msgid "Enter the port used when connecting" msgstr "Informu la pordon por konekti" #: ../src/dlgEditWorld.ui:321 msgid "Use _SSL" msgstr "Uzi _SSL" #: ../src/dlgEditWorld.ui:587 msgid "Auto-login" msgstr "Aŭtomata saluto" #: ../src/dlgEditWorld.ui:628 msgid "Connection _style:" msgstr "_Stilo de la konekto:" #: ../src/dlgEditWorld.ui:668 msgid "Ch_aracters in this mud:" msgstr "_Roluloj en ĉi tiu mud:" #: ../src/dlgEditWorld.ui:771 msgid "D_elete" msgstr "_Eksigi" #: ../src/dlgEditWorld.ui:842 ../src/dlgEditWorld.ui:2048 #: ../src/dlgEditWorld.ui:2992 msgid "Font" msgstr "Tiparo" #: ../src/dlgEditWorld.ui:879 msgid "Select the font used in the _main screen:" msgstr "Elektu la tiparon de la ĉ_effenestro:" #: ../src/dlgEditWorld.ui:895 msgid "Select the font used in the main output screen" msgstr "Elektu la tiparon de la ĉeffenestro" #: ../src/dlgEditWorld.ui:907 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "Uzi _grasan tiparon por emfazitaj koloroj (anstataŭ nur emfazi)" #: ../src/dlgEditWorld.ui:912 msgid "" "Check if you want the highlighted ANSI colors to be displayed in bold also" msgstr "" "Marku se vi volas ke la enfazitaj koloroj estu montrataj ankaŭ en grasa " "tiparoj" #: ../src/dlgEditWorld.ui:956 msgid "Word Wrap" msgstr "Linirompado" #: ../src/dlgEditWorld.ui:989 msgid "_Wrap lines at word boundaries" msgstr "_Rompi la liniojn inter vortoj" #: ../src/dlgEditWorld.ui:994 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "Marku por rompi la liniojn inter vortoj" #: ../src/dlgEditWorld.ui:1016 msgid "_Indent wrapped lines by" msgstr "Al_inei rompitajn liniojn je" #: ../src/dlgEditWorld.ui:1046 msgid "pixels" msgstr "rastrumero" #: ../src/dlgEditWorld.ui:1064 msgid "Wrap lines at full _screen width" msgstr "Rompi liniojn je la _tutan larĝeco de la ecrano" #: ../src/dlgEditWorld.ui:1087 msgid "Maximum line width in _characters:" msgstr "Maksimuma larĝeco de linioj en _signoj:" #: ../src/dlgEditWorld.ui:1157 msgid "Tooltips" msgstr "Ŝpruchelpiloj" #: ../src/dlgEditWorld.ui:1191 msgid "Display _tooltips with the time when the line was received" msgstr "Mon_tri ŝpruchelpilojn kun la horo en kiu la linioj estis riĉevitaj" #: ../src/dlgEditWorld.ui:1196 msgid "" "Check if you want tooltips to be displayed showing the time when a line was " "received if you leave the mouse over the line for a short while" msgstr "" "Marku por montri ŝpruchelpilojn montrante la horo en kiu unu linio estis " "riĉevita se vi lasas la muso sur la linio per kurtan periodo" #: ../src/dlgEditWorld.ui:1262 msgid "Ansi Colors" msgstr "Ansi Koloroj" #: ../src/dlgEditWorld.ui:1395 msgid "_Black" msgstr "_Nigra" #: ../src/dlgEditWorld.ui:1409 msgid "R_ed" msgstr "_Ruĝa" #: ../src/dlgEditWorld.ui:1423 msgid "_Green" msgstr "V_erda" #: ../src/dlgEditWorld.ui:1437 msgid "_Yellow" msgstr "F_lava" #: ../src/dlgEditWorld.ui:1451 msgid "B_lue" msgstr "_Blua" #: ../src/dlgEditWorld.ui:1465 msgid "_Magenta" msgstr "_Malva" #: ../src/dlgEditWorld.ui:1479 msgid "_Cyan" msgstr "Cejana" #: ../src/dlgEditWorld.ui:1493 msgid "_White" msgstr "B_lanka" #: ../src/dlgEditWorld.ui:1507 msgid "Bl_ack (bold)" msgstr "Nigra (grasa)" #: ../src/dlgEditWorld.ui:1520 msgid "Re_d (bold)" msgstr "Ruĝa (grasa)" #: ../src/dlgEditWorld.ui:1533 msgid "G_reen (bold)" msgstr "Verda (grasa)" #: ../src/dlgEditWorld.ui:1546 msgid "Yell_ow (bold)" msgstr "Flavva (grasa)" #: ../src/dlgEditWorld.ui:1559 msgid "Bl_ue (bold)" msgstr "Blua (grasa)" #: ../src/dlgEditWorld.ui:1572 msgid "Magen_ta (bold)" msgstr "Malva (grasa)" #: ../src/dlgEditWorld.ui:1585 msgid "Cya_n (bold)" msgstr "Cejana (grasa)" #: ../src/dlgEditWorld.ui:1598 msgid "W_hite (bold)" msgstr "Blanka (grasa)" #: ../src/dlgEditWorld.ui:1767 msgid "Default Colors" msgstr "Defaŭtaj Koloroj" #: ../src/dlgEditWorld.ui:1828 msgid "_Foreground" msgstr "Malf_ono" #: ../src/dlgEditWorld.ui:1841 msgid "Bold foreground" msgstr "Grasa malfono" #: ../src/dlgEditWorld.ui:1866 msgid "Bac_kground" msgstr "_Fono" #: ../src/dlgEditWorld.ui:1891 msgid "Bold background" msgstr "Grasa fono" #: ../src/dlgEditWorld.ui:1945 msgid "Revert to default colors" msgstr "Uzi la defaŭltajn kolorojn" #: ../src/dlgEditWorld.ui:1979 msgid "Re_vert to default colors" msgstr "U_zi la defaŭltajn kolorojn" #: ../src/dlgEditWorld.ui:1984 msgid "Click to revert all colors to their built-in defaults" msgstr "Klaku por uzi la defaŭltajn kolorojn" #: ../src/dlgEditWorld.ui:2085 msgid "Select the font used in the _status bar:" msgstr "Elektu la tiparon de la stata breto:" #: ../src/dlgEditWorld.ui:2101 msgid "Select the font used in the status bar" msgstr "Elektu la tiparon de la stata breto" #: ../src/dlgEditWorld.ui:2143 msgid "Time Display" msgstr "Montrado de Tempo" #: ../src/dlgEditWorld.ui:2179 msgid "C_onnected time:" msgstr "Tempo k_onektata:" #: ../src/dlgEditWorld.ui:2213 ../src/dlgEditWorld.ui:2323 msgid "Do not display" msgstr "Ne montri" #: ../src/dlgEditWorld.ui:2218 msgid "Select if you do not want the connection time to be displayed" msgstr "Elektu se vi ne volas ke la konektatatempo estu montrata" #: ../src/dlgEditWorld.ui:2233 ../src/dlgEditWorld.ui:2343 msgid "Display as hours, minutes and seconds" msgstr "Montri kiel horoj, minutoj kaj sekundoj" #: ../src/dlgEditWorld.ui:2238 msgid "" "Select if you want the connection time to be displayed in hours, minutes and " "seconds" msgstr "" "Elektu se vi volas ke la konektatatempo estu montrata en horoj, minutoj, kaj " "sekundoj" #: ../src/dlgEditWorld.ui:2253 ../src/dlgEditWorld.ui:2363 msgid "Display as seconds" msgstr "Montri kiel sekundoj" #: ../src/dlgEditWorld.ui:2258 msgid "Select if you want the connection time to be displayed in seconds" msgstr "Elektu se vi volas ke la konektatatempo estu montrata en sekundoj" #: ../src/dlgEditWorld.ui:2290 msgid "_Idle time:" msgstr "_Inativa tempo:" #: ../src/dlgEditWorld.ui:2328 msgid "Select if you do not want the idle time to be displayed" msgstr "Elektu se vi ne volas ke la inaktivatempo estu montrata" #: ../src/dlgEditWorld.ui:2348 msgid "" "Select if you want the idle time to be displayed in hours, minutes and " "seconds" msgstr "" "Elektu se vi volas ke la inaktivatempo estu montrata en horoj, minutoj, kaj " "sekundoj" #: ../src/dlgEditWorld.ui:2368 msgid "Select if you want the idle time to be displayed in seconds" msgstr "Elektu se vi volas ke la inaktivatempo estu montrata en sekundoj" #: ../src/dlgEditWorld.ui:2383 msgid "Only _reset idle time counter when a command is entered directly" msgstr "Nur _zerigi inaktivatemponombrilon kiam komando estas rekte tajpata" #: ../src/dlgEditWorld.ui:2388 msgid "" "Check to make the idle time counter reset only when a command is entered " "directly by typing it in the command entry box. If not checked, if a command " "is sent because of a timer, of a hook, etc, the idle timer is also reset." msgstr "" "Marku por ke la inaktivatemponombrilo zeriĝu nur kiam komando estas rekte " "tajpata em komandskatolo. Se ne markata, kiam komando estas sendata pere de " "timer, hoko, ktp, la inaktivatemponombrilo ankaŭ zeriĝas." #: ../src/dlgEditWorld.ui:2468 msgid "Command Entry" msgstr "Eniro de komandoj" #: ../src/dlgEditWorld.ui:2501 msgid "_Keep last typed command in command entry box" msgstr "_Reteni la lastan tajpitan komandon en komandskatolo" #: ../src/dlgEditWorld.ui:2506 msgid "" "Check to have the last command kept in the command entry box, so that you " "can repeat commands only by pressing ENTER" msgstr "" "Marku por ke la lastan komandoj estu konservata en la komandskatolo, por ke " "vi povus ĝin ripeti tajpante ENTER" #: ../src/dlgEditWorld.ui:2519 msgid "_Echo sent commands in main window" msgstr "_Eĥi senditajn komandojn en la ĉeffenestro" #: ../src/dlgEditWorld.ui:2524 msgid "Check to have the sent commands echoed in the main output window" msgstr "Marku por eĥi la senditajn komandojn en la ĉeffenestro" #: ../src/dlgEditWorld.ui:2537 msgid "_Store commands between sessions" msgstr "_Konservi komandojn inter sesioj" #: ../src/dlgEditWorld.ui:2542 msgid "Check to have the command history saved in a file between sessions" msgstr "Marku por konservi la komandhistorion en dosiero inter sekcioj" #: ../src/dlgEditWorld.ui:2555 msgid "Never _hide the typed text" msgstr "Neniam _kaŝi tajpatan tekston" #: ../src/dlgEditWorld.ui:2560 msgid "" "Check this if the text you type is displayed as black dots in the input box." msgstr "" "Marku ĉi tion se ĉio, kion vi tajpas montriĝas kiel nigraj punktoj en la " "komandskatolo." #: ../src/dlgEditWorld.ui:2581 msgid "_Number of commands to save in history:" msgstr "Nombro de komandoj por konservi en _historio:" #: ../src/dlgEditWorld.ui:2595 msgid "Specify the number of commands that are saved and can be later recalled" msgstr "" "Informu la nombron de komandoj kiu saviĝas kaj povas esti reuzataj poste" #: ../src/dlgEditWorld.ui:2622 msgid "C_ommand separator:" msgstr "Eĥo de k_omandoj:" #: ../src/dlgEditWorld.ui:2636 msgid "Specify the separator for commands typed in the command entry box" msgstr "Elektu la disigilon por komandoj tajpataj en la komandskatolo" #: ../src/dlgEditWorld.ui:2657 msgid "Use single-_line input bar" msgstr "_Unulinia komandskatolo" #: ../src/dlgEditWorld.ui:2697 msgid "Enable _auto-completion" msgstr "Ebligi _aŭtomata kompletado" #: ../src/dlgEditWorld.ui:2702 msgid "Check to enable command auto-completion (based on previous commands)" msgstr "" "Marku por abligi aŭtomatan kompletadon de komandoj (bazita en antaŭa " "komandoj)" #: ../src/dlgEditWorld.ui:2723 msgid "Acti_vate auto-completion only after" msgstr "Akti_vigi aŭtomata kompletado nur post" #: ../src/dlgEditWorld.ui:2737 msgid "" "Specify the number of characters that must be typed for command completion " "to start" msgstr "" "Informu la nombron de signoj kiu devas esti tajpataj por komenci la " "aŭtomatan komandkompletadon" #: ../src/dlgEditWorld.ui:2752 msgid "characters have been entered" msgstr "signoj estis tajpitaj" #: ../src/dlgEditWorld.ui:2783 msgid "Use _multi-line input bar" msgstr "_Plurlinia komandskatolo" #: ../src/dlgEditWorld.ui:2830 msgid "N_umber of lines:" msgstr "_Nombro de linioj:" #: ../src/dlgEditWorld.ui:2868 msgid "S_pell check typed text" msgstr "_Literumi tajpatan tekston" #: ../src/dlgEditWorld.ui:2905 msgid "Language code:" msgstr "Lingvokodo:" #: ../src/dlgEditWorld.ui:2931 msgid "(Leave blank for default based on locale)" msgstr "(Lasu blanka por la defaŭto surbazita en la lokaĵo)" #: ../src/dlgEditWorld.ui:3029 msgid "Select the font used in the command _entry box:" msgstr "Elektu la tiparon de la _komandskatolo:" #: ../src/dlgEditWorld.ui:3045 msgid "Select the font used in the command entry box" msgstr "Elektu la tiparon de la komandskatolo" #: ../src/dlgEditWorld.ui:3087 msgid "Flood prevention" msgstr "Evito de inundo" #: ../src/dlgEditWorld.ui:3126 msgid "Do not allow the _same command to be sent" msgstr "Ne permesi la _sama komando esti sendata" #: ../src/dlgEditWorld.ui:3131 msgid "" "Check to prevent more than a given number of equal commands to be sent in a " "row (which can disconnect your character in some muds)" msgstr "" "Marku por malebligi ke pli ol specifan nombron de egalaj komandoj estus " "sendata sinsekve (kiu povas malkonekti vin el kelkaj mud-oj)" #: ../src/dlgEditWorld.ui:3147 msgid "Specify the maximum number of equal commands that can be sent in a row" msgstr "" "Informu la maksiman nombron de egalaj komandoj kiu povas esti sendata " "sinsekve" #: ../src/dlgEditWorld.ui:3162 msgid "_times in a row" msgstr "_fojoj sinsekve" #: ../src/dlgEditWorld.ui:3188 msgid "Se_nd this command:" msgstr "Se_ndi tiun komandon:" #: ../src/dlgEditWorld.ui:3202 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" "Informu komandon por sendi kiam specifita maksima nombro de egalaj komando " "estus sendata" #: ../src/dlgEditWorld.ui:3273 msgid "Logging Status" msgstr "Registrado" #: ../src/dlgEditWorld.ui:3326 msgid "St_art" msgstr "Ŝ_argi" #: ../src/dlgEditWorld.ui:3342 msgid "_Stop" msgstr "_Fermi" #: ../src/dlgEditWorld.ui:3373 msgid "_Include the last" msgstr "Sk_ribi la lastajn" #: ../src/dlgEditWorld.ui:3378 msgid "Select to include lines from the main window in the log file." msgstr "Marku por skribi liniojn el la ĉeffenestro en la registraddosiero." #: ../src/dlgEditWorld.ui:3393 msgid "Inform number of lines to include in the log." msgstr "Informu nombro de linioj por skribi en la en la registraddosiero." #: ../src/dlgEditWorld.ui:3409 msgid "lines of the scrollback buffer in the log" msgstr "linionj el la rolumadbufro en la registraddosiero" #: ../src/dlgEditWorld.ui:3456 ../src/dlgEditWorld.ui:4687 msgid "File" msgstr "Dosiero" #: ../src/dlgEditWorld.ui:3548 msgid "" "Note: You can use strftime() escapes to create different files based on the " "date and time that logging starts. Also, %Kw represents the World name and " "%Kc the character name used in auto-logon." msgstr "" "Noto: Vi povas uzi strfime() eskapsesekvencojn por krei dosierojn kies nomo " "dependas de la horo kaj dato kiam la registrado komencas. Krome, %Kw " "reprezentas la Mondnomon kaj %Kc la rolulon uzita en la aŭtomata saluto." #: ../src/dlgEditWorld.ui:3590 msgid "Options" msgstr "Opcioj" #: ../src/dlgEditWorld.ui:3623 msgid "A_utomatically start logging when connected" msgstr "Aŭ_tomate komenci registradon post konektado." #: ../src/dlgEditWorld.ui:3629 msgid "" "If this is selected, logging will be automatically started whenever you " "connect to the world." msgstr "" "Se ĉi tiu estas elektata, la registrado komencos aŭtomate kiam vi konektas " "al mono." #: ../src/dlgEditWorld.ui:3642 msgid "Prefix lines with _date and/or time" msgstr "Antaŭinserti en la linioj la _daton kaj/aŭ la horon" #: ../src/dlgEditWorld.ui:3648 msgid "" "Select this if you want to prefix each line in the log file with the date " "and/or time it was received." msgstr "" "Elektu ĉi tiun se vi volas antaŭinserti en ĉiu linio la horo kaj/aŭ dato " "kiam la linio estis recevita." #: ../src/dlgEditWorld.ui:3682 msgid "_Format:" msgstr "_Formo:" #: ../src/dlgEditWorld.ui:3696 msgid "" "The default is to prefix lines with the date and time, but you can configure " "the format with strftime() escape sequences. See the manual for a " "description of those." msgstr "" "La defaŭlto estas antaŭinserti en la linioj la daton kaj horon, se vi povas " "konfiguri la formon kun strftime() espaksekvencoj. Vidu la manlibron por " "priskribo pri ĉi tio." #: ../src/dlgEditWorld.ui:3707 msgid "Revert to _default" msgstr "Uzi la _defaŭlton" #: ../src/dlgEditWorld.ui:3783 msgid "Scripting" msgstr "Skriptdosiero" #: ../src/dlgEditWorld.ui:3824 msgid "_Perl file to load:" msgstr "_Perl dosiero por ŝarĝi:" #: ../src/dlgEditWorld.ui:3924 msgid "Plugins Currently Loaded" msgstr "Ŝarĝataj plugins" #: ../src/dlgEditWorld.ui:3982 msgid "_Load" msgstr "Ŝ_arĝi" #: ../src/dlgEditWorld.ui:4052 msgid "Plugins Loaded on Startup" msgstr "Plugins ŝarĝataj ĉe la startigo" #: ../src/dlgEditWorld.ui:4114 msgid "_Add" msgstr "_Aldoni" #: ../src/dlgEditWorld.ui:4130 msgid "_Remove" msgstr "Fo_rigi" #: ../src/dlgEditWorld.ui:4238 msgid "MCCP (for compression)" msgstr "MCCP (por kompaktigo)" #: ../src/dlgEditWorld.ui:4271 msgid "_Enable if server proposes after connecting" msgstr "_Ebligi se la servilo proponas post konekto" #: ../src/dlgEditWorld.ui:4288 msgid "Enable if server proposes at _any time" msgstr "E_bligi se la servilo proponas ĉiam" #: ../src/dlgEditWorld.ui:4305 msgid "_Disable" msgstr "_Malebligi" #: ../src/dlgEditWorld.ui:4374 msgid "Scrolling" msgstr "Rolumo" #: ../src/dlgEditWorld.ui:4408 msgid "Scroll on _output" msgstr "Rolumi kiam alvenas _novan tekston" #: ../src/dlgEditWorld.ui:4413 msgid "" "Check to have the main window scroll to the end whenever new output comes" msgstr "Marku por ke la ĉeffenestro rolumu kiam novan tekston alvenas" #: ../src/dlgEditWorld.ui:4434 msgid "_Lines to save in scrollback buffer:" msgstr "_Linioj por konservi en rolumadbufro" #: ../src/dlgEditWorld.ui:4448 msgid "" "Specify the number of lines of output that can be seen with by scrolling the " "window" msgstr "" "Informu la nombron de linioj kiu povas esti vidataj rolumante la ĉeffenestro" #: ../src/dlgEditWorld.ui:4498 msgid "Name display" msgstr "Montrado de nomo" #: ../src/dlgEditWorld.ui:4531 msgid "Identify as 'World name'" msgstr "Identigi kiel 'Mondnomo'" #: ../src/dlgEditWorld.ui:4547 msgid "Identify as 'World name - Character'" msgstr "Identigi kiel 'Mondnome - Rolulo'" #: ../src/dlgEditWorld.ui:4563 msgid "Identify as 'Character - World name'" msgstr "Identigi kiel 'Rolulo - Mondnomo'" #: ../src/dlgEditWorld.ui:4584 msgid "Custom: " msgstr "Altra: " #: ../src/dlgEditWorld.ui:4622 msgid "" "Use %Kw to represent the World's name, and %Kc to represent the auto-logon " "character name" msgstr "" "Uzu %Kw por reprezenti la Mondnomon kaj %Kc por reprezenti la rolulon uzita " "en la aŭtomata saluto." #: ../src/dlgEditWorld.ui:4726 msgid "_File:" msgstr "_Dosiero:" #: ../src/dlgEditWorld.ui:4763 msgid "" "You can leave this field blank, and a file name will be automatically " "generated. Only edit this field if you know what you are doing." msgstr "" "Vi povas lasi ĉi tiun kampon blanka, kaj dosiernomo aŭtomate generiĝos. " "Redaktu ĉi tiun kampon nur se vi scias tiun, kiun vi faras." #: ../src/dlgEditWorld.ui:4805 msgid "Character Set" msgstr "Signaro" #: ../src/dlgEditWorld.ui:4838 msgid "Character _set:" msgstr "_Signaro:" #: ../src/dlgEditWorld.ui:4892 msgid "Graphical Editors" msgstr "Grafikaj Redaktiloj" #: ../src/dlgEditWorld.ui:4925 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "_Peti konfirmon antaŭ forigo de triggers, aliases, ktp." #: ../src/dlgEditWorld.ui:4930 ../src/dlgEditWorld.ui:5031 msgid "" "If not checked, objects such as triggers, aliases, etc. will be deleted " "directly without asking for confirmation when you press the Delete button." msgstr "" "Se ĉi tiun ne estas markata, objektoj kiel triggers, aliases, ktp. foriĝos " "rekte sen antaŭa konfirmo kiam vi klakas la Forigi butonon." #: ../src/dlgEditWorld.ui:4944 msgid "_Show items defined by plugins" msgstr "_Montri objektojn difinitaj de plugins" #: ../src/dlgEditWorld.ui:4949 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" "Se markata, triggers, aliases, macros kaj timers definataj de plugins estos " "montrataj en la propaj sekcioj de la Mondredaktilo." #: ../src/dlgEditWorld.ui:4993 msgid "TCP Keep Alive" msgstr "" #: ../src/dlgEditWorld.ui:5026 msgid "Enable TCP _Keep Alive packets" msgstr "" #: ../src/dlgEditWorld.ui:5047 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "(Vi devas rekonekti por aktivigi ŝanĝo en ĉi tiu opicio)" #: ../src/dlgEditWorld.ui:5087 msgid "Input" msgstr "Enigo" #: ../src/dlgEditWorld.ui:5120 msgid "_Disable up and down arrow keys for history navigation" msgstr "_Malkativi savoklavojn por navigi komandhistorion" #: ../src/dlgEditWorld.ui:5125 msgid "" "If checked, the up and down arrow keys are not used for navigating between " "saved commands. (You'll have to use Alt+up and Alt+down.)" msgstr "" "Se markata, la supran kaj suban sagoklavojn ne povos esti usataj por\n" "navigi la komandhistorion. (Neĉesos uzi Alt+supren kaj Alt+suben.)" #: ../src/dlgTestTriggers.ui:57 msgid "Enter _line to be matched against the triggers:" msgstr "Informu _linion por provi kongrui kon la trigger-j:" #: ../src/dlgTestTriggers.ui:75 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" "La teksto informata ĉi tie estos uzata por provi kongrui kun la triggers " "kvazaŭ ĝi estus linioj riĉevita el la MUD" #: ../src/dlgTestTriggers.ui:86 ../src/dlgMLSend.ui:52 #: ../src/dlgCmdHistory.ui:161 msgid "_Send" msgstr "_Sendi" #: ../src/dlgTestTriggers.ui:91 msgid "Click the run the triggers against the line." msgstr "Klaku por provi kongrui triggers kun la linio." #: ../src/dlgTestTriggers.ui:129 msgid "Number of triggers that matched:" msgstr "Nombro de triggers kiu kongrui:" #: ../src/dlgTestTriggers.ui:160 msgid "Commands that would be sent:" msgstr "Komandoj kiu estus sendota:" #: ../src/dlgTestTriggers.ui:193 msgid "This is what would be printed in the main screen:" msgstr "Ĉi tiu estus montrata en la ĉeffenestro:" #: ../src/dlgTestTriggers.ui:205 msgid "" "This is what would be printed in the main screen. If empty, the line has " "been gaged. It can be different from the original line because of rewriter " "triggers." msgstr "" "Ĉi tio estus montrata en la ĉeffenestro. Se ĝi estas blanka, la linio estis " "ellasita. Ĝi povas esti malsama al la originala linio kaŭze de reskribitaj " "trigger-j." #: ../src/dlgTestTriggers.ui:223 msgid "Would this line be included in the log file?" msgstr "Ĉu tiu linio estus skribata en la registraddosiero?" #: ../src/dlgMLSend.ui:20 msgid "Multi-line send" msgstr "Sendi plurajn liniojn" #: ../src/dlgMLSend.ui:82 msgid "Send this text _initially:" msgstr "Sendi tiun tekson _iniciale:" #: ../src/dlgMLSend.ui:102 ../src/dlgMLSend.ui:193 msgid "Enter some text to be sent to the World" msgstr "Tajpu tekston por sendi al la Mondo" #: ../src/dlgMLSend.ui:118 msgid "Then send the _contents of this file:" msgstr "Post tio sendi la _enhavon de tiu dosiero:" #: ../src/dlgMLSend.ui:173 msgid "_Finally, send this text:" msgstr "_Fine, sendi tiun tekston:" #: ../src/dlgMLSend.ui:220 msgid "Add this to the _beginning of each line:" msgstr "Aldoni tion al la _komenco de ĉiu linio:" #: ../src/dlgMLSend.ui:235 msgid "Specify some text to be prepended to each sent line" msgstr "Tajpu tekson por esti aneksata al la komenco de ĉiu sendata linio" #: ../src/dlgMLSend.ui:250 msgid "Add this to the _end of each line:" msgstr "Aldoni tion al la fi_no de ĉiu linio:" #: ../src/dlgMLSend.ui:265 msgid "Specify some text to be appended to each sent line" msgstr "Tajpu tekson por esti aneksata al la fino de ĉiu sendata linio" #: ../src/dlgMLSend.ui:283 msgid "_Delay" msgstr "_Atendi" #: ../src/dlgMLSend.ui:297 msgid "Specify the delay between sending the group of lines" msgstr "Informu tempon por atendi inter la sendado de ĉiu grupo de linioj" #: ../src/dlgMLSend.ui:313 msgid "seconds e_ach" msgstr "_sekundoj ĉiu" #: ../src/dlgMLSend.ui:327 msgid "Specify how many lines are sent at once" msgstr "Informu kiom da linioj estas sendata samtempe" #: ../src/dlgMLSend.ui:342 msgid "line(s)" msgstr "linio(j)" #: ../src/dlgMLSend.ui:360 msgid "_Keep dialog open after sending" msgstr "_Teni fenestro malferma post sendi" #: ../src/dlgCmdHistory.ui:20 msgid "Command History" msgstr "Komandhistorio" #: ../src/dlgCmdHistory.ui:75 msgid "Find a command containing a given search term" msgstr "Trovi komandon enhavantan specifikatan tekson." #: ../src/dlgCmdHistory.ui:87 msgid "Find _next" msgstr "Trovi _proksiman" #: ../src/dlgCmdHistory.ui:93 msgid "Find the next command with the same match text" msgstr "Trovi la proksiman komandon enhavantan la saman tekson." #: ../src/dlgCmdHistory.ui:124 msgid "_Recall" msgstr "" #: ../src/dlgCmdHistory.ui:130 msgid "Put the selected command in the command entry box" msgstr "Meti la selektatan komandon en komandskatolo" #: ../src/dlgCmdHistory.ui:143 msgid "Rec_all & Close" msgstr "" #: ../src/dlgCmdHistory.ui:149 msgid "Put the selected command in the command entry box and close this dialog" msgstr "" "Meti la selektatan komandon en komandskatolo kai fermi ĉi tiun fenestron" #: ../src/dlgCmdHistory.ui:167 msgid "Send the selected command(s) to the mud" msgstr "Sendi la selektata(j)n komando(j)n al al mud" #: ../src/dlgCmdHistory.ui:179 msgid "S_end & Close" msgstr "S_endi & Fermi" #: ../src/dlgCmdHistory.ui:185 msgid "Send the selected command(s) to the mud and close the dialog" msgstr "" "Sendi la selektata(j)n komando(j)n al al mud kaj fermi ĉi tiun fenestron" #: ../src/dlgCmdHistory.ui:224 msgid "Newest commands are on the top" msgstr "Plej novaj komandoj estas supre" #: ../src/dlgCmdHistory.ui:252 msgid "Dela_y" msgstr "_Atendi" #: ../src/dlgCmdHistory.ui:265 msgid "Specify the delay between sending the group of commands" msgstr "Informu tempon por atendi inter la sendado de ĉiu grupo de komandoj" #: ../src/dlgCmdHistory.ui:282 msgid "sec_onds each" msgstr "_sekundoj ĉiu" #: ../src/dlgCmdHistory.ui:296 msgid "Specify how many commands are sent at once" msgstr "Informu kiom da komandoj estas sendata samtempe" #: ../src/dlgCmdHistory.ui:313 msgid "commands(s)" msgstr "komando(j)" #: ../src/dlgCmdHistory.ui:338 msgid "Find Command" msgstr "Trovi komandon" #: ../src/dlgCmdHistory.ui:400 msgid "_Text to find:" msgstr "_Teksto por trovi:" #: ../src/dlgCmdHistory.ui:413 msgid "Enter the text to search for" msgstr "Informu la tekson por trovi" #: ../src/dlgCmdHistory.ui:434 msgid "Search direction:" msgstr "Direkto de serĉado:" #: ../src/dlgCmdHistory.ui:449 msgid "_Downwards" msgstr "_Malsupren" #: ../src/dlgCmdHistory.ui:466 msgid "_Upwards" msgstr "_Supren" #: ../src/mnuPopupURL.ui:12 msgid "_Open link" msgstr "_Malfermi ligilon" #: ../src/mnuPopupURL.ui:21 msgid "_Copy link address" msgstr "_Kopii ligiladreson" #: ../share/kildclient.pl:76 ../share/kildclient.pl:97 #: ../share/kildclient.pl:117 ../share/kildclient.pl:182 #: ../share/kildclient.pl:433 ../share/kildclient.pl:511 #: ../share/kildclient.pl:589 ../share/kildclient.pl:602 #: ../share/kildclient.pl:615 ../share/kildclient.pl:628 #: ../share/kildclient.pl:641 ../share/kildclient.pl:654 #: ../share/kildclient.pl:667 ../share/kildclient.pl:680 #: ../share/kildclient.pl:694 ../share/kildclient.pl:708 #: ../share/kildclient.pl:818 ../share/kildclient.pl:830 #: ../share/kildclient.pl:842 ../share/kildclient.pl:854 #: ../share/kildclient.pl:867 ../share/kildclient.pl:1083 #: ../share/kildclient.pl:1116 #, perl-format msgid "%s: Too few arguments." msgstr "%s: Mankas argumentoj." #: ../share/kildclient.pl:207 ../share/kildclient.pl:567 #, perl-format msgid "No such %s" msgstr "Ne ekzistas tiun %s" #: ../share/kildclient.pl:298 ../share/kildclient.pl:316 #: ../share/kildclient.pl:334 ../share/kildclient.pl:352 #: ../share/kildclient.pl:370 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: Malĝusta nombro de argumentoj." #: ../share/kildclient.pl:403 ../share/kildclient.pl:411 #: ../share/kildclient.pl:489 ../share/kildclient.pl:497 #, perl-format msgid "No such %s." msgstr "Ne ekzistas tiun %s." #: ../share/kildclient.pl:425 #, perl-format msgid "No %s deleted." msgstr "Neniu %s eksigita." #: ../share/kildclient.pl:427 #, perl-format msgid "One %s deleted." msgstr "Unu %s eksigita." #: ../share/kildclient.pl:429 #, perl-format msgid "%d %s deleted." msgstr "%d %s eksigitaj." #: ../share/kildclient.pl:506 #, perl-format msgid "Successfully moved %s." msgstr "Sukcese movis %s." #: ../share/kildclient.pl:898 msgid "Could not open file." msgstr "Ne eblas malfermi dosieron." #: ../share/kildclient.pl:928 msgid "Unknown" msgstr "Ne konata" #: ../share/kildclient.pl:935 msgid "Invalid plugin file." msgstr "Plugindosiero ne valida." #: ../share/kildclient.pl:966 msgid "Plugin already loaded. Try enabling it." msgstr "Plugin jam ŝarĝita. Provu ebligi ĝin." #: ../share/kildclient.pl:968 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "Eldono %s de tiu plugin jam estas ŝarĝita." #: ../share/kildclient.pl:978 #, perl-format msgid "Error in plugin file: %s" msgstr "Eraro en plugindosiero: %s" #: ../share/kildclient.pl:990 msgid "Cannot load a plugin in another world." msgstr "Ne eblas ŝarĝi plugin en alia mondo." #: ../share/kildclient.pl:995 ../share/kildclient.pl:1015 msgid "Plugin not specified" msgstr "Plugin ne informata." #: ../share/kildclient.pl:1002 ../share/kildclient.pl:1033 msgid "Plugin not loaded." msgstr "Plugin ne ŝarĝita." #: ../share/kildclient.pl:1005 #, perl-format msgid "Plugin '%s' loaded." msgstr "Plugin '%s' ŝarĝita." #: ../share/kildclient.pl:1021 #, perl-format msgid "Could not load plugin %s" msgstr "Ne eblas ŝarĝi plugin %s" #: ../share/kildclient.pl:1097 msgid "Plugin enabled." msgstr "Plugin ebligita." #: ../share/kildclient.pl:1130 msgid "Plugin disabled." msgstr "Plugin malebligita." #: ../share/kildclient.pl:1279 msgid "Cannot open help file." msgstr "Ne eblas malfermi helpdosieron." #: ../share/kildclient.pl:1297 msgid "Help topic not found." msgstr "Helptemo ne trovata." #: ../share/kildclient.pl:1394 msgid "" "Warning: the getwindowsize() function is deprecated and will be removed." msgstr "Averto: la funkcio getwindowsize() removiĝos future." #: ../share/kildclient.pl:1395 msgid "Use $window->getsize() instead." msgstr "Uzu $window->getsize() anstataŭ." #: ../share/kildclient.pl:1400 msgid "Warning: the minimize() function is deprecated and will be removed." msgstr "Averto: la funkcio minimize() removiĝos future." #: ../share/kildclient.pl:1401 msgid "Use $window->minimize() instead." msgstr "Uzu $window->minimize() anstataŭ." #: ../share/kildclient.pl:1406 msgid "Warning: the path() function is deprecated and will be removed." msgstr "Averto: la funkcio path() removiĝos future." #: ../share/kildclient.pl:1407 msgid "Use $world->path() instead." msgstr "Uzu $world->path() anstataŭ." kildclient-3.0.0/po/eo.gmo0000644000175000017500000016627312376346024012330 00000000000000-<~< p=~======>>L'>7t>>>>">"?=?U?t?5?5?&?.#@R@l@(@@@@@6 A'BA6jA'A;AB)!B?KBBB BBBBBB C$C9CKC aCmC CC CCCC C DD ;D \DiDDDDDDDDEB%E+hE$EE(E"E F F"F2FF#F F*F0G6HGG GG G G GG GG GGGH H&H EHSH gHuH~H&HHHH H II8IJXIIL/JD|JBJtKIyK@KBLDGL?L:LM<M=$NGbN<NBN-*OWXOO3P,;P&hP1P5PPPQ"Q5QRQiQ|QQ QQQQ;Q"*RQMR8RCR8SUShS(yS/S#SS"T5TTT'mT TT6T UU7U$TUyUUUUUU UU UUUUVVV V,,VYViVzVV VVV%V W$W:,W%gWW)W WW WW#X$(X2MX2XX9XNX$CYhY pY{YY Y Y Y Y Y,YZ&*ZQZ/YZ`Z&Z1[0C[1t[1[3[' \4\6S\8\1\2\.(]2W]W]Z]D=^^{^1_1M_#_%____"` 7`$X` }`` ``````` ` a aa %a-0a.^a a aaaaa aaaCau.b bbbFbcc.c 4c>c$Fc$kcc cc{9ddKHe]ee-e'f4-fbfkf'f1fffgg28g kg uggg gggggghhh %h1h9hNhbhshhh hhLh ii"i*i 9iEi"Ti wiiiiiiii j j+j HjVjkj tj j j j jj jjjj jj kkk kl l!l;lRlblulllll@lIm\m%rm mmmmmmm nn'&nNn_nonnkno o o#oAoZao0oo pp p#p @p LpXp rp1~pGpp p q#q ;q IqSq Wqbqwqqqqqqqq!qr -r;rSr brlr~rr=r7rTsAosNs;tM_D!M(o'.' 0&>e YD%j- ,- MW[HC?@ , ل<7F M[_!NVsdž"  =ɇ #*1@FY_,f6 ۈ"  %"0SY+bƉ'͉ $$I P\w Ȋӊ܊: -Hv$|$̋'*+VZ `k t   ȌҌ ، )/ N\ bJ (, 5@GNmu).Ў &. U!a&ڏ)#)>EG[^Ze2  $28MT\ey{~O Γܓ  $;[qI6Ք "9 U#v#ޕ;3:!n!ϖ%'9O>k$>ϗ%@4u5;Ę 2FWo#~ʙ  2?Qn )" 2@`y=қ.'?g)k&ŜԜ|)(.ݝ5 B JV\ b p}  "Ş$  0>G&Yɟ؟ ߟ'PbZPE>oա>E8;RFLAգB>9*EdJ0X&. 0;Gl%ڧ4GZn ?Ψ&b5IH@+l+2!")5"_+&ɫ#>So(." (.5>FU\ ku} =& :Gc&îEɮ'7(L u !/3EAL?&ΰ  ( F S ao,$ر3X:%323 3T5#=491n:1۴5 VCIP"5lX8Ŷ;:Xu0ɷ'%" HR Zdm!θݸ .7M   ͹ҹFy.ǺJ׺"(9BK!S!uHȼXRUA K6Q /82E^@u ÿ Կ$9M ^ ju  '/4DLU  ( 7MQdi:'9Mbz    ! ,8 3 >#_ CF^#  /?F(]b8@G5P#R/- M Xf+~#, I6    + >JRY` ~" "BX8m7UA4Tv@ &&$M'r%$#j Ct,I/LT=l /-R,?B%'(DPBDN`lIM=e0   %.?"!2vC*54G|*#kN3"*).1X -'!"4Wcu@#<V3n ,  E5a0, 4/0d= K# >_ ~q  &, 48@yD! )14 fr#y , + +5 >Hcj+r / "+>[o v ">46$>cl s}" -.. 2< N [f ny   #&*Qc j G .;C KW_f#% $( M#X&|117U\^p s_~:(BQZioZ?S CcUjGhA{zJ1Z "5Qg5^nKW0.ewxY.=" '- ah&# leUK{EH%&n4zar,x{ C juLf *n)S<>Dd[f"(9i>h9O:bML2uM;U)yvl2#;(.(fGs0qV`Z}I8m|4jbV\P/E7ose4bt[+d\'K`/c3i1P2%Q~*B15@ FNE%X$ B_-op>txTpTFW Sy}u^cy~@IFWg3lNV*=CJ@;:YqMR[ =k PR)R_&J}vk  DN\/Ok]!m7m'$6r #]X |Yp8I?zd0qgO?DAw+<QG^$<_w3!H,`]8rL H9v-TsoB,aA6t~:76!+Xi| Target: %d Foreground: %d Background: %d Italics: %d Striked-thru: %d Underline: %d SSL enabled.%d %s deleted.%d lines%s is already permanent.%s: %s is already permanent%s: %s is not permanent%s: Argument must be numeric%s: Invalid key code%s: No such world%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent%s: This is an internal function, do not call directly.%s: Too few arguments%s: Too few arguments.%s: Too many string arguments%s: Variable '%s' made permanent. %s: Variable '%s' made temporary. %s: Wrong argument type%s: Wrong number of arguments.%s: Wrong type of reference%s: action given twice, using the named attribute one%s: action not specified, and isn't gag, not creating%s: action not specified, not creating%s: cannot create timer with negative interval%s: count must be numeric%s: interval must be numeric%s: interval not specified, not creating%s: invalid bg color%s: invalid fg color%s: invalid target%s: invalid underline style%s: keycode given twice, using the named attribute one%s: keycode not specified, not creating%s: pattern given twice, using the named attribute one%s: pattern not specified, not creating%s: substitution given twice, using the named attribute one(-1 to repeat indefinitely)(Leave blank for default based on locale)(You must reconnect for changes in this setting to take effect)0 lines1 line: Expired: Not yet activeAnsi ColorsAudio PlayerAuto-loginCharacter SetColors used by KildClientCommand EntryConnectionDefault ColorsFileFlood preventionFontGraphical EditorsInputLogging StatusMCCP (for compression)Name displayNote:OptionsPlugins Currently LoadedPlugins Loaded on StartupProxyRevert to default colorsScriptingScrollingSending DelaysTime DisplayTooltipsWeb BrowserWindow configurationWord WrapA mud client with powerful features and support for Perl ScriptingA_utomatically start logging when connectedActi_vate auto-completion only afterActionAdd this to the _beginning of each line:Add this to the _end of each line:AdvancedAlias added.Alias modified.Alias number %d Name: %s Pattern: %s Substitution: %s Ignore case: %s Eval as Perl: %s Enabled: %s AliasesAlways load this plugin at _startupAppearanceAre you sure you want to close this world?Attempting to connect to host %s (%s) port %s...Attempting to connect to proxy host %s (%s) port %s...AuthorAutomationB_lueBac_kgroundBl_ack (bold)Bl_ue (bold)BlackBlack (bold)BlueBlue (bold)Bold backgroundBold foregroundBottomBytes received (compressed):Bytes received (decompressed):C_hange styleC_ommand separator:C_onfigure...C_onnectC_onnected time:Cannot load a plugin in another world.Cannot open help file.Certificate type:Ch_aracters in this mud:Change StyleCharacterCharacter _set:Check if you want lines to be wrapped at word boundariesCheck if you want the highlighted ANSI colors to be displayed in bold alsoCheck if you want tooltips to be displayed showing the time when a line was received if you leave the mouse over the line for a short whileCheck this if the text you type is displayed as black dots in the input box.Check to enable command auto-completion (based on previous commands)Check to have the command history saved in a file between sessionsCheck to have the last command kept in the command entry box, so that you can repeat commands only by pressing ENTERCheck to have the main window scroll to the end whenever new output comesCheck to have the sent commands echoed in the main output windowCheck to have the substitution be executed in a s///e constructionCheck to have the timer deleted after its repeat count has reached 0Check to make the alias enabled; only enabled aliases are triedCheck to make the hook enabled; only enabled hooks are runCheck to make the idle time counter reset only when a command is entered directly by typing it in the command entry box. If not checked, if a command is sent because of a timer, of a hook, etc, the idle timer is also reset.Check to make the macro enabled; only enabled macros are runCheck to make the matched line not be printed in the log fileCheck to make the matched line not be printed in the main output windowCheck to make the timer enabled; only enabled timers are runCheck to make the trigger enabled; only enabled triggers are triedCheck to make this trigger a rewriter triggerCheck to make this trigger not prevent further triggers from being tried, if it matchesCheck to prevent more than a given number of equal commands to be sent in a row (which can disconnect your character in some muds)Cipher:Click the run the triggers against the line.Click to clear the command input area.Click to open link; right-click for more options.Click to revert all colors to their built-in defaultsColorsCommand HistoryCommand _History...Command not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _Another...Connect to another worldConnect without SSLConnected to host %s (%s) port %s, MCCP version %d enabled.Connected to host %s (%s) port %s.Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d enabled.Connected to host %s port %s, via proxy %s (%s) port %s.Connected to proxy server %s port %s, negotiating authentication...Connected to proxy server %s port %s, sending request...Connection _style:Connection time:Could not connect to host %s port %s: %sCould not connect to host %s port %s: Error #%dCould not create directory '%s': %sCould not create socket: %sCould not create socket: error #%dCould not import file '%s': %sCould not load plugin %sCould not load world from file '%s': %sCould not open dump file %s: %s Could not open file '%s': %sCould not open file '%s': %s Variables were not saved.Could not open file.Could not open file: %sCould not open log file: %s.Could not open raw dump file %s: %s Could not open world '%s': %s Could not resolve host %s: %sCountCount Cu_tCustom: Cya_n (bold)CyanCyan (bold)DIRD_eleteDefaultDefault (bold)Dela_yDeleteDescriptionDirectory to store settings and saved worldsDisable T_imersDisable _AliasesDisable _MacrosDisable _TriggersDisconnectedDisconnected from host %s.Disconnected from host %s: %s.Disconnected from host %s: error #%d.Disconnected from world %sDisplayDisplay _tooltips with the time when the line was receivedDisplay as hours, minutes and secondsDisplay as secondsDo not allow the _same command to be sentDo not changeDo not connectDo not deleteDo not displayDo you really want to delete %d %s?Do you really want to delete the %s?Do you really want to make %d variables temporary?Do you really want to make the variable temporary?DoubleDumps all data received (possibly compressed) to the fileDumps all data received from (after decompression, if appropriate) to the fileE_val substitution as Perl statementE_xportEdit AliasEdit Character InformationEdit Default _World...Edit HookEdit MacroEdit TimerEdit TriggerEdit WorldElement '%s' not allowed inside element '%s'Enable _auto-completionEnable if server proposes at _any timeEnabledEnter _line to be matched against the triggers:Enter a command to be sent whenever the specified maximum number of equal commands would be sentEnter a descriptive name for the WorldEnter optionally a descriptive name for the aliasEnter optionally a descriptive name for the hookEnter optionally a descriptive name for the macroEnter optionally a descriptive name for the timerEnter optionally a descriptive name for the triggerEnter some text to be sent to the WorldEnter some text to search for.Enter the action that will be run when a match happensEnter the action to be executed whenever the timer firesEnter the action to be run when the event happensEnter the action to be run when the key is pressedEnter the character's name for automatic loginEnter the character's password for automatic loginEnter the command to run a web browser. %s will be substituted by the web page address.Enter the command to run an audio player program. %s will be substituted by the file path.Enter the default parameters for sending multiple lines or commands:Enter the host to connect toEnter the name of a scalar ($), array (@) or hash (%) variable whose contents are to be saved between sessions of the WorldEnter the pattern to match against received linesEnter the pattern to match against typed commandsEnter the port used when connectingEnter the substitution to be executedEnter the text to search forError Loading PluginError in plugin file: %sError loading UI from XML file: %sError setting spell checker: %s Error while reading from proxy host.Eval as PerlEvent:Expiration:ExportExternal ProgramsFILEFailed loading file %s: %sFileFile name not specified.Find CommandFind N_extFind NextFind P_reviousFind _nextFind a command containing a given search termFind the next command with the same match textFingerprint:G_reen (bold)GagGag LogGeneralGreenGreen (bold)HTTPHelp topic not found.Here you can set options to configure the appearance of KildClient.Here you can set options to configure the automation features of KildClient, such as triggers, aliases, plugins, etc.Hook defined.Hook modified.Hook not foundHook number %d for event %s Name: %s Action: %s Enabled: %s HooksHooks for '%s': Host:Hostname:I. CaseIdentify as 'Character - World name'Identify as 'World name - Character'Identify as 'World name'Idle time:If checked, the up and down arrow keys are not used for navigating between saved commands. (You'll have to use Alt+up and Alt+down.)If checked, triggers, aliases, macros and timers defined in plugins will appear in the corresponding World Editor sections.If not checked, objects such as triggers, aliases, etc. will be deleted directly without asking for confirmation when you press the Delete button.If this is checked, when there is only one open world no tabs will be shownIf this is selected, logging will be automatically started whenever you connect to the world.ImportInform number of lines to include in the log.InputInternal error: element '%s' ends when in START modeIntervalInvalid argument '%s' Invalid attribute '%s' for element '%s'Invalid function call: syntax is $world->FUNCTIONInvalid key code '%s'Invalid key code.Invalid plugin file.Invalid top-level element '%s'Invalid window size specification in config file. Keep ExecKeep _openKeep permanentKeyKey exchange:KildClient ErrorKildClient InformationKildClient QuestionKildClient WarningKildClient readyLanguage code:LeftLines received:Load pluginLoggingLogging is disabled.Logging not startedLogging stopped.Logging to file %s.Logging to file %s. MAC:Macro added.Macro modified.Macro number %d Name: %s Key Code: %s Action: %s Enabled: %s MacrosMagen_ta (bold)MagentaMagenta (bold)Main WindowMake temporaryMaximum line width in _characters:MiscellaneousMore than one command selected.Multi-line sendN/AN_umber of lines:NameNever _hide the typed textNewest commands are on the topNoNo %s deleted.No acceptable proxy authentication methods.No auto-loginNo command selected.No proxyNo such %sNo such %s.No such aliasNo such hookNo such macroNo such pluginNo such timerNo such triggerNo worldNoneNot connectedNot connected.Not foundNot setNote: You can use strftime() escapes to create different files based on the date and time that logging starts. Also, %Kw represents the World name and %Kc the character name used in auto-logon.Number of triggers that matched:OfflineOmit (_gag) from outputOmit (gag) from _log fileOnCloseConnected HooksOnConnect HooksOnDisconnect HooksOnGetFocus HooksOnLoseFocus HooksOnReceivedText HooksOnSentCommand HooksOne %s deleted.Only _reset idle time counter when a command is entered directlyOnly scalar ($), array (@) and hash (%%) variables can be made permanent.Or connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPerforming SSL handshake...Permanent VariablesPermanent variablesPermenent variablePluginPlugin '%s' loaded.Plugin already loaded. Try enabling it.Plugin disabled.Plugin enabled.Plugin not loaded.Plugin not specifiedPlugin number %d Name: %s Version: %s Description: %s Author: %s Enabled: %s PluginsPort:PreferencesPrefix lines with _date and/or timePress a key to get its keycode.Press the key that will be used to activate the macro while the cursor is in the text box.Press the key that will be used to run the macroProtocol %s not enabled.ProtocolsProxyProxy _type:Proxy authentication failed.Proxy host:Proxy port:Proxy request failed: %s.Proxy type:Put the selected command in the command entry boxPut the selected command in the command entry box and close this dialogR_edRe_d (bold)Re_vert to default colorsReally Quit KildClient?Really close?ReconnectRedRed (bold)Resolving host %s...Resolving proxy host %s...Revert to _defaultRewriterRightSOCKS4SOCKS5SSL Handshake failed: %sSSL Handshake took too long.SSL not supported in this versionSSL protocol used:S_end & CloseS_pell check typed textS_tatistics...ScriptingScroll on _outputSe_nd this command:Search direction:Select if you do not want the connection time to be displayedSelect if you do not want the idle time to be displayedSelect if you want the connection time to be displayed in hours, minutes and secondsSelect if you want the connection time to be displayed in secondsSelect if you want the idle time to be displayed in hours, minutes and secondsSelect if you want the idle time to be displayed in secondsSelect log fileSelect the font used in the _main screen:Select the font used in the _status bar:Select the font used in the command _entry box:Select the font used in the command entry boxSelect the font used in the main output screenSelect the font used in the status barSelect this if you want to prefix each line in the log file with the date and/or time it was received.Select to include lines from the main window in the log file.Send the selected command(s) to the mudSend the selected command(s) to the mud and close the dialogSend this text _initially:SendingSending connection request...Sending proxy authentication credentials...Server _address:Server _port:SingleSpecify how many commands are sent at onceSpecify how many lines are sent at onceSpecify how many times this timer should run before being disabled or deletedSpecify some text to be appended to each sent lineSpecify some text to be prepended to each sent lineSpecify the command used to launch a web browserSpecify the command used to play sound files.Specify the delay between sending the group of commandsSpecify the delay between sending the group of linesSpecify the interval, in seconds, between timer activationsSpecify the maximum number of equal commands that can be sent in a rowSpecify the number of characters that must be typed for command completion to startSpecify the number of commands that are saved and can be later recalledSpecify the number of lines of output that can be seen with by scrolling the windowSpecify the separator for commands typed in the command entry boxSpell checking support not included in this build.St_artStatisticsStatus BarStyleSubstitutionSuccessfully moved %s.TTL expiredTempTest TriggersThe default is to prefix lines with the date and time, but you can configure the format with strftime() escape sequences. See the manual for a description of those.The help is displayed in main window.The interval must be positive.The matched substring numberThe text entered here will be matched against triggers as if it were a line coming from the MUDThe whole lineThe whole matched textThen send the _contents of this file:There are %d open worlds. Do you really want to quit?There is one open world. Do you really want to quit?This is what would be printed in the main screen. If empty, the line has been gaged. It can be different from the original line because of rewriter triggers.This is what would be printed in the main screen:This object belongs to a plugin. Changes made here will not be saved in the plugin.This version of KildClient does not have SSL support.Timer added.Timer modified.Timer number %d Name: %s Interval: %.3f Repeat count: %d Action: %s Enabled: %s Temporary: %s TimersTopTrigger added.Trigger modified.Trigger number %d Name: %s Pattern: %s Action: %s Enabled: %s Ignore case: %s Gag output: %s Gag in log: %s Keep executing: %s Rewriter: %s Change style: %s TriggersUnable to connect to host %s: %s.Unable to connect to host %s: Error #%d.Unable to connect to proxy host %s: %s.Unable to connect to proxy host %s: Error #%d.UnknownUnknown directive '%s' in config file. Unknown protocolUnnamed worldUnrecognized response from proxy host.Use $window->getsize() instead.Use $window->minimize() instead.Use $world->path() instead.Use %Kw to represent the World's name, and %Kc to represent the auto-logon character nameUse _SSLUse _bold font for highlighted colors (instead of just highlighting)Use _multi-line input barUse global settingsUse single-_line input barUse the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit http://www.kildclient.orgW_hite (bold)Warning: Trying to send a very long command line. Perhaps a recursive alias definition?Warning: the getwindowsize() function is deprecated and will be removed.Warning: the minimize() function is deprecated and will be removed.Warning: the path() function is deprecated and will be removed.WhiteWhite (bold)World name:World saved.Would this line be included in the log file?Wrap lines at full _screen widthWritten by Eduardo M Kalinowski (eduardo@kalinowski.com.br) Yell_ow (bold)YellowYellow (bold)YesYou can leave this field blank, and a file name will be automatically generated. Only edit this field if you know what you are doing.You must specify a variable name.You must specify the action, unless the trigger is a gag or changes the style.You must specify the action.You must specify the key.You must specify the name.You must specify the password.You must specify the pattern.You must specify the substitution.You're attempting to connect to a world that uses SSL, but this version of KildClient has been built without SSL support. Try to connect without SSL?[WORLD...]_About_Action:_Add_Apply to:_Ask for confirmation before deleting triggers, aliases, etc._Background:_Black_Cancel_Clear_Close_Command echo:_Copy_Copy link address_Cyan_Delay_Delay between each group of lines/commands:_Delete_Disable_Disable up and down arrow keys for history navigation_Disconnect_Display_Do not display this message again_Don't quit_Down_Downwards_Echo sent commands in main window_Edit_Edit..._Enable if server proposes after connecting_Enabled_Event:_File:_Finally, send this text:_Find_Find:_Flash window when new text is received_Foreground_Foreground:_Format:_Green_Help_Hide tabs if only one world is open_Host:_Idle time:_Ignore case when matching_Import_Include the last_Indent wrapped lines by_Informative messages:_Input_Interval:_Italic:_Items to export_Keep dialog open after sending_Keep executing other triggers after this this one matches_Keep last typed command in command entry box_Key:_Lines to save in scrollback buffer:_Load_Magenta_Manual_Multi-line Send..._Name of variable to make permanent:_Name:_New_Next_Number of commands to save in history:_Number of lines/commands to send at once:_OK_Open_Open link_Open..._Password:_Paste_Pattern:_Perl file to load:_Port:_Preferences_Preferences..._Previous_Quit_Reconnect_Remove_Repeat count:_Rewriter trigger_Save_Select a saved world:_Send_Show items defined by plugins_Split Window_Stop_Store commands between sessions_Striked-thru:_Substitution:_Tab position:_Temporary (will be deleted automatically when its repeat count reaches 0)_Test Triggers..._Text to find:_Underline:_Up_Upwards_Username:_White_World_Wrap lines at word boundaries_Yellow_times in a rowaddress type not supportedaliasalias: not creating alias without patternalias: not creating alias without substitutionaliasescharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection not allowed by rulesetconnection refused by destination hostgeneral failurehookhook: hook '%s' not found hookshost unreachableline(s)lines of the scrollback buffer in the logmacromacro: No such macromacrosnnetwork unreachablenopixelsrequest failed because client's identd could not confirm the user ID string in the requestrequest failed because identd could not be reachedrequest rejected or failedsec_onds eachsecondsseconds e_achtimertimer: No such timertimerstriggertriggersunknown reason codeyyesProject-Id-Version: KildClient 3.0.0 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general POT-Creation-Date: 2014-08-17 14:59-0300 PO-Revision-Date: 2014-08-17 14:59-0300 Last-Translator: Eduardo M Kalinowski Language-Team: Eduardo M Kalinowski Language: eo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Celo: %d Fono: %d Malfono: %d Kursivo: %d Trastrekto: %d Substrekto: %d SSL ebligita.%d %s eksigitaj.%d linioj%s jam estas daŭra.%s: %s jam estas daŭra%s: %s ne estas daŭra%s: Argumento devas esti numera%s: Invalida klavkodo%s: Ne ekzistas tiu mondo%s: Nur skalara ($), array (@) kaj hash (%%) variabloj povas iĝi daŭraj%s: Ĉi tiu funkcio estas interna, ne ĝin voku rekte.%s: Mankas argumentoj%s: Mankas argumentoj.%s: Troaj ĉenaj argumentoj%s: Variablo '%s' iĝis daŭra. %s: Variablo '%s' iĝis maldaŭra. %s: Invalida speco de argumento%s: Malĝusta nombro de argumentoj.%s: Invalida speco de referenco%s: agado informita dufoje, uzante la de la nomata atributo%s: agado ne informita, kaj ne estas gag, ne kreita%s: agado ne informita, ne kreita%s: invervalo devas esti pozitiva%s: nombro devas esti numera%s: intervalo devas esti numera%s: intervalo ne informita, ne kreita%s: invalida 'bg'%s: invalida 'fg'%s: invalida 'target'%s: invalida substrektstilo%s: klavkodo informita dufoje, uzante la de la nomata atributo%s: klavkodo ne informita, ne kreita%s: ŝablono informita dufoje, uzante la de la nomata atributo%s: ŝablono ne informtita, ne kreita%s: anstataŭo informita dufoje, uzante la de la nomata atributo(-1 por repeti indefine)(Lasu blanka por la defaŭto surbazita en la lokaĵo)(Vi devas rekonekti por aktivigi ŝanĝo en ĉi tiu opicio)0 linioj1 linio: Finiĝita: Ne ankoraŭ aktivaAnsi KolorojAudludiloAŭtomata salutoSignaroKoloroj uzataj de KildClientEniro de komandojKonektoDefaŭtaj KolorojDosieroEvito de inundoTiparoGrafikaj RedaktilojEnigoRegistradoMCCP (por kompaktigo)Montrado de nomoNotu:OpciojŜarĝataj pluginsPlugins ŝarĝataj ĉe la startigoProkurserviloUzi la defaŭltajn kolorojnSkriptdosieroRolumoMalfruigo Inter SendadojMontrado de TempoŜpruchelpilojRetumiloKonfiguro de la fenestroLinirompadoMUDkliento kun potencajn eblojn kaj subtenon de Perl skriptojAŭ_tomate komenci registradon post konektado.Akti_vigi aŭtomata kompletado nur postAgoAldoni tion al la _komenco de ĉiu linio:Aldoni tion al la fi_no de ĉiu linio:AvancitaAlias adiciitaAlias ŝanĝita.Alias numero %d Nomo: %s Ŝablono: %s Anstataŭo: %s Ignori usklecon: %s Komp. kiel Perl: %s Ebligata: %s AliasesĈiam ŝargi ĉi tiun plugin en _startigoAperoĈu vi vere volas fermi ĉi tiun mondon?Provante koneti al retnodo %s (%s) pordo %s...Provante koneti al prokurservilon %s (%s) pordo %s...AŭtoroAŭtomatizo_Blua_FonoNigra (grasa)Blua (grasa)NigraNigra (grasa)BluaBlua (grasa)Grasa fonoGrasa malfonoMalsupreRiĉevitaj bajtoj (kompaktigitaj):Riĉevitaj bajtoj (nekompaktigitaj):Ŝ_anĝi stilonEĥo de k_omandoj:K_onfiguri...K_onektiTempo k_onektata:Ne eblas ŝarĝi plugin en alia mondo.Ne eblas malfermi helpdosieron.Tipo de atesto:_Roluloj en ĉi tiu mud:Ŝanĝi StilonRolulo_Signaro:Marku por rompi la liniojn inter vortojMarku se vi volas ke la enfazitaj koloroj estu montrataj ankaŭ en grasa tiparojMarku por montri ŝpruchelpilojn montrante la horo en kiu unu linio estis riĉevita se vi lasas la muso sur la linio per kurtan periodoMarku ĉi tion se ĉio, kion vi tajpas montriĝas kiel nigraj punktoj en la komandskatolo.Marku por abligi aŭtomatan kompletadon de komandoj (bazita en antaŭa komandoj)Marku por konservi la komandhistorion en dosiero inter sekciojMarku por ke la lastan komandoj estu konservata en la komandskatolo, por ke vi povus ĝin ripeti tajpante ENTERMarku por ke la ĉeffenestro rolumu kiam novan tekston alvenasMarku por eĥi la senditajn komandojn en la ĉeffenestroMarku por ke la anstataŭo estu komputita en s///e konstruoMarku se vi volas que la timer estu eksigita kiam la lia nombro de fojoj antigas 0Marku por enabligi la alias-n; nur enabligataj alias-oj estas provatajMarku por enabligi la hokon; nur enabligataj hookoj estas rulatajMarku por ke la inaktivatemponombrilo zeriĝu nur kiam komando estas rekte tajpata em komandskatolo. Se ne markata, kiam komando estas sendata pere de timer, hoko, ktp, la inaktivatemponombrilo ankaŭ zeriĝas.Marku por enabligi la macron; nur enabligataj macroj estas rulatajMarku por ke la linio ne estos skribata en la registraddosieroMarku por ke la linio ne estos montrata en la ĉeffekranoMarku por enabligi la timer-n; nur enabligataj timer-oj estas rulatajMarku por enabligi la trigger-n; nur enabligataj trigger-oj estas provatajMarku por ke la trigger estu reskribista triggerMarku por ke ĉi tiu trigger ne malebligu aliajn trigger-ojn de funkci, se ĉi tiu rulosMarku por malebligi ke pli ol specifan nombron de egalaj komandoj estus sendata sinsekve (kiu povas malkonekti vin el kelkaj mud-oj)Cifero:Klaku por provi kongrui triggers kun la linio.Klaku por forigi la tekston en la komandskatolo.Klaku por malfermi; klaku kun la dekstra butono por pluraj alternativojKlaku por uzi la defaŭltajn kolorojnKolorojKomandhistorioKomand_historio...Komando ne trovata.Komandoj kiu estus sendota:Kompatigalgoritmo:Kompatigkvociento:Kompaktigilo uzata:Konfirmado de eksigoKonekti alKonekti al _alia mondo...Konekti al alia mondoKonekti sen SSLKonektata al retnodo %s (%s) pordo %s, MCCP eldono %d ebligata.Konektata al retnodo %s (%s) pordo %s.Konektata al retnodo %s pordo %s, pere de prokurservilo %s (%s) pordo %s, MCCP eldono %d ebligata.Konektata al retnodo %s pordo %s, pere de prokurservilo %s (%s) pordo %s.Konektata al prokurservilon %s pordo %s, negociante aŭtentokontrolon...Konektata al prokurservilo %s pordo %s, sendante konektpeton...._Stilo de la konekto:Konektadtempo:Ne eblas konekti al retnodo %s pordo %s: %sNe eblas konekti al retnodo %s pordo %s: Eraro #%dNe eblas krei dosierujon '%s': %sNe eblas krei kontaktoskatolon: %sNe eblas krei kontaktoskatolon: eraro #%dNe eblas importi dosieron '%s': %sNe eblas ŝarĝi plugin %sNe eblas ŝarĝi mondon el dosiero '%s': %sNe eblas malfermi ŝutdosieron %s: %s Ne eblas malfermi dosieron '%s': %sNe eblas malfermi dosieron '%s': %s Variabloj ne konserviĝis.Ne eblas malfermi dosieron.Ne eblas malfermi dosieron: %sNe eblas malfermi registraddosieron: %s.Ne eblas malfermi kruddataŝutdosieron %s: %s Ne eblas malfermi mondon '%s': %s Ne eblas trovi retnodon %s: %sFojojFojoj El_tondiAltra: Cejana (grasa)CejanaCejana (grasa)DOSIERUJO_EksigiDefaŭtaDefaŭlta (grasa)_AtendiEksigiPriskriboDosierujo por konservi la konfiguron kaj konservitajn mondojnMalebligi t_imersMalebligi _aliasesMalebligi _macrosMalebligi _triggersMalkonektataMalkonektita el retnodo %s.Malkonektita el retnodo %s: %s.Malkonektita el retnodo %s: eraro #%d.Malkonektita el mondo %sAperoMon_tri ŝpruchelpilojn kun la horo en kiu la linioj estis riĉevitajMontri kiel horoj, minutoj kaj sekundojMontri kiel sekundojNe permesi la _sama komando esti sendataNe ŝanĝiNe konektiNe eksigiNe montriĈu vi vere volas eksigi %d %s?Ĉu vi vere volas eksigi la %s-n?Ĉu vi vere volas igi %d variablojn maldaŭraj?Ĉu vi vere volas igi ĉi tiun variablon maldaŭra?DuoblaŜuti ĉio riĉevita (antaŭ malkompatigo, se necesas) al dosieroŜuti ĉio riĉevita (post malkompatigo, se necesas) al dosiero_Komputi anstataŭon kiel Perl komando_EksportiRedakti AliasRedakti Informon de RoluloRedakti defaŭltan _mondon...Redakti HokoRedakti MacroRedakti TimerRedakti TriggerRedakti MondonElemento '%s' ne permisata ene elemento '%s'Ebligi _aŭtomata kompletadoE_bligi se la servilo proponas ĉiamEbligataInformu _linion por provi kongrui kon la trigger-j:Informu komandon por sendi kiam specifita maksima nombro de egalaj komando estus sendataInformu priskriban nomon por la MondoInformu, se vi volas, priskriban nomon por la aliasInformu, se vi volas, priskriban nomon por la hokoInformu, se vi volas, priskriban nomon por la macroInformu, se vi volas, priskriban nomon por la timerInformu, se vi volas, priskriban nomon por la triggerTajpu tekston por sendi al la MondoTajpu tekston por trovi.Informu agon kiun estos rulata kiam linioj kongruas ŝablononInformu agon kiun estos rulata kiam timer aktiviĝasInformu agon kiun estos rulata kiam evento okazosInformu agon kiun estos rulata kiam la klavo estas tajpataInformu la nomon de la rolulo por automata salutoInformu la pasvorton de la rolulo por automata salutoInformu komandon por ŝalti retumilon. %s anstataŭiĝos por la adreso de la retpaĝo.Informu komandon por ŝalti audlulidon. %s anstataŭiĝos por la dosiero.Informu la defaŭltajn parametrojn por la sendado de pluraj linioj aŭ komandoj:Informu la retnodon al kiu konektiInformu nomon de skalara ($), array (@) aŭ hash (%) variablo kies enhavo saviĝas inter seancoj de la MondoInformu ŝablonon por provi kongrui kun ricevataj liniojInformu la ŝablono por provi kongrui kun tajpataj komandojInformu la pordon por konektiInformu anstataŭon por ruliInformu la tekson por troviEraro dum Ŝargado de pluginEraro en plugindosiero: %sEraro dum ŝarĝo de interfaco el XMLdosiero: %sEraro en konfigurado de literumilo: %s Eraru dum legado el la prokurservilo.Komp PerlEvento:Finiĝas:EksportiEksteraj ProgramojDOSIERONe eblas malfermi dosieron %s: %sDosieroPlugindosiero ne informata.Trovi komandonTrovi _proksimanTrovi ProksimanTrovi _antaŭaTrovi _proksimanTrovi komandon enhavantan specifikatan tekson.Trovi la proksiman komandon enhavantan la saman tekson.Fingropremaĵo:Verda (grasa)GagGag LogĜeneralaVerdaVerda (grasa)HTTPHelptemo ne trovata.Ĉi tie vi povas agordi opciojn por konfiguri la aperon de KildClient.Ĉi tie vi povas agordi opciojn por konfiguri la aŭtomatizfunkciojn de KildClient, kiel triggers, aliases, plugins, ktp.Hoko difinita.Hoko ŝanĝita.Hoko ne trovataHoko numero %d por evento %s Nomo: %s Ago: %s Ebligata: %s HokojHokoj por '%s': Retnodo:Retnodo:I. Usk.Identigi kiel 'Rolulo - Mondnomo'Identigi kiel 'Mondnome - Rolulo'Identigi kiel 'Mondnomo'Inativa tempo:Se markata, la supran kaj suban sagoklavojn ne povos esti usataj por navigi la komandhistorion. (Neĉesos uzi Alt+supren kaj Alt+suben.)Se markata, triggers, aliases, macros kaj timers definataj de plugins estos montrataj en la propaj sekcioj de la Mondredaktilo.Se ĉi tiun ne estas markata, objektoj kiel triggers, aliases, ktp. foriĝos rekte sen antaŭa konfirmo kiam vi klakas la Forigi butonon.Se ĉi tiu estas markata, neniu langeto estos montrata kiam estas nur unu malferma mondoSe ĉi tiu estas elektata, la registrado komencos aŭtomate kiam vi konektas al mono.ImportiInformu nombro de linioj por skribi en la en la registraddosiero.EnigoInterna eraro: elemento '%s' finiĝas en START reĝimoIntervaloArgumento '%s' ne estas valida Atributo '%s' ne estas valida por elemento '%s'Malvalida funkciovoko: la sintakso estas $world->FUNKCIOKlavkodo '%s' invalidaInvalida klavkodo.Plugindosiero ne valida.Elemento '%s' invalidaInvalida specifo de grandeco de la fenestro en konfigurdosiero. _Daŭri EzekTeni _malfermataTeni daŭraKlavoŜlosilointerŝanĝo:Eraro - KildClientInformo - KildClientDemando - KildClientAverto - KildClientKildClient pretaLingvokodo:MaldesktreLinioj riĉevitaj:Ŝargi pluginRegistradoRegistrabo malaktiva.Registrado ne komencata.Registrado haltigita.Registrado aktiva al dosiero %s.Registrado komencita al la dosiero %s. MAC:Macro adiciita.Macro ŝanĝita.Macro numero %d Nomo: %s Klavkodo: %s Ago: %s Ebligata: %s MacrosMalva (grasa)MalvaMalva (grasa)ĈeffenestroIgi maldaŭraMaksimuma larĝeco de linioj en _signoj:AlispecajPlu ol unu komando selektata.Sendi plurajn liniojnN/A_Nombro de linioj:NomoNeniam _kaŝi tajpatan tekstonPlej novaj komandoj estas supreNeNeniu %s eksigita.Neniŭ akceptebla aŭtentokontrolmetodo por prokurservilo.Sen aŭtomata salutoNeniu komando selektata.Sen prokurserviloNe ekzistas tiun %sNe ekzistas tiun %s.Ne ekzistas tiun alias.Ne ekzistas tiun hokon.Ne ekzistas tiun macro.Ne ekzistas tiun plugin.Ne ekzistas tiun timer.Ne ekzistas tiun triggerNeniu mondoNeniuNe konektataNe konektata.Ne trovataNe difinitaNoto: Vi povas uzi strfime() eskapsesekvencojn por krei dosierojn kies nomo dependas de la horo kaj dato kiam la registrado komencas. Krome, %Kw reprezentas la Mondnomon kaj %Kc la rolulon uzita en la aŭtomata saluto.Nombro de triggers kiu kongrui:SenkonekteNe montri (_gag) en ĉeffenestroNe skribi (gag) en registraddosieroOnCloseConnected HokojOnConnect HokojOnDisconnect HokojOnGetFocus HokojOnLoseFocus HokojOnReceivedText HokojOnSentCommand HokojUnu %s eksigita.Nur _zerigi inaktivatemponombrilon kiam komando estas rekte tajpataNur skalara ($), array (@) kaj hash (%%) variabloj povas iĝi daŭraj.Aŭ konektu _rekte:Monstras eldoninformadon kaj elirasPas_vorto:PasvortoŜablonoIniciante SSL...Daŭraj VariablojDaŭraj variablojDaŭra variabloPluginPlugin '%s' ŝarĝita.Plugin jam ŝarĝita. Provu ebligi ĝin.Plugin malebligita.Plugin ebligita.Plugin ne ŝarĝita.Plugin ne informata.Plugin numero %d Nomo: %s Eldono: %s Priskribo: %s Aŭtoro: %s Ebligata: %s PluginsPordo:PreferojAntaŭinserti en la linioj la _daton kaj/aŭ la horonPrenu klavo por scii sian klavkodo.Tajpu klavon kiu estos usata por ruli la macron dum kursoro estas en tekstskatolo.Tajpu klavon kiu estos usata por ruli la macronProtokolo %s ne estas ebligata.ProtokolojProkurservilo_Tipo de prokurservilo:Prokurservila aŭtentokontrolo malsukcesis.Prokurservilo:Prokurservila pordo:Prokura konektpeto malsukcesis: %s.Tipo de prokurservilo:Meti la selektatan komandon en komandskatoloMeti la selektatan komandon en komandskatolo kai fermi ĉi tiun fenestron_RuĝaRuĝa (grasa)U_zi la defaŭltajn kolorojnVere eliri KildClient?Vere fermi?RekonektiRuĝaRuĝa (grasa)Serĉante retnodon %s...Serĉante prokurservilon %s...Uzi la _defaŭltonReskribistoDekstreSOCKS4SOCKS5SSL Negociado ne funkciis: %sSSL Negociado daŭris tre longe.SSL ne subtenata en ĉi tiu eldonoSSL protokolo uzata:S_endi & Fermi_Literumi tajpatan tekstonS_tatistikoj...SkriptdosieroRolumi kiam alvenas _novan tekstonSe_ndi tiun komandon:Direkto de serĉado:Elektu se vi ne volas ke la konektatatempo estu montrataElektu se vi ne volas ke la inaktivatempo estu montrataElektu se vi volas ke la konektatatempo estu montrata en horoj, minutoj, kaj sekundojElektu se vi volas ke la konektatatempo estu montrata en sekundojElektu se vi volas ke la inaktivatempo estu montrata en horoj, minutoj, kaj sekundojElektu se vi volas ke la inaktivatempo estu montrata en sekundojElektu RegistradodosieronElektu la tiparon de la ĉ_effenestro:Elektu la tiparon de la stata breto:Elektu la tiparon de la _komandskatolo:Elektu la tiparon de la komandskatoloElektu la tiparon de la ĉeffenestroElektu la tiparon de la stata bretoElektu ĉi tiun se vi volas antaŭinserti en ĉiu linio la horo kaj/aŭ dato kiam la linio estis recevita.Marku por skribi liniojn el la ĉeffenestro en la registraddosiero.Sendi la selektata(j)n komando(j)n al al mudSendi la selektata(j)n komando(j)n al al mud kaj fermi ĉi tiun fenestronSendi tiun tekson _iniciale:SendadoSendante konketpeton...Sendante aŭtentokontrolajn akreditaĵojn al prokurservilo...Serviladreso:Servil_pordo:UnuoblaInformu kiom da komandoj estas sendata samtempeInformu kiom da linioj estas sendata samtempeInformu kiom da fojoj ĉi tiu timer devas ruli antaŭ esti malebligita ou eksigitaTajpu tekson por esti aneksata al la fino de ĉiu sendata linioTajpu tekson por esti aneksata al la komenco de ĉiu sendata linioInformu komandon por ŝalti retumilonInformu komandon por ludi auddosierojn.Informu tempon por atendi inter la sendado de ĉiu grupo de komandojInformu tempon por atendi inter la sendado de ĉiu grupo de liniojInformu la intervalon, en sekundoj, inter aktivadoj de ĉi tiu timerInformu la maksiman nombron de egalaj komandoj kiu povas esti sendata sinsekveInformu la nombron de signoj kiu devas esti tajpataj por komenci la aŭtomatan komandkompletadonInformu la nombron de komandoj kiu saviĝas kaj povas esti reuzataj posteInformu la nombron de linioj kiu povas esti vidataj rolumante la ĉeffenestroElektu la disigilon por komandoj tajpataj en la komandskatoloLiterumado ne estas subtenata en ĉi tiu eldono.Ŝ_argiStatistikojStata bretoStiloAnstataŭoSukcese movis %s.TTL finiĝitaNedaŭraTesti Trigger-jnLa defaŭlto estas antaŭinserti en la linioj la daton kaj horon, se vi povas konfiguri la formon kun strftime() espaksekvencoj. Vidu la manlibron por priskribo pri ĉi tio.La aiuto estas en la ĉeffenestro.La intervalo devas esti pozitiva.La parton numeroLa teksto informata ĉi tie estos uzata por provi kongrui kun la triggers kvazaŭ ĝi estus linioj riĉevita el la MUDLa tutan linionLa tutan kongruitan tekstonPost tio sendi la _enhavon de tiu dosiero:Estas %d malfermataj mondoj. Ĉu vi vere volas eliri?Estas unu malfermata mondo. Ĉu vi vere volas eliri?Ĉi tio estus montrata en la ĉeffenestro. Se ĝi estas blanka, la linio estis ellasita. Ĝi povas esti malsama al la originala linio kaŭze de reskribitaj trigger-j.Ĉi tiu estus montrata en la ĉeffenestro:Ĉi tiu objekto apartenas al unu plugin. Ŝanĝoj farataj ĉi tie ne estos konservataj en la plugin.Ĉi tiu eldono de KildClient ne havas SSL subtenon.Timer adiciita.Timer ŝanĝita.Timer numero %d Nomo: %s Intervalo: %.3f\n Nombro de fojoj: %d Ago: %s Ebligata: %s Nedaŭra: %s TimersSupreTrigger adiciita.Triger ŝanĝita.Trigger numero %d Nomo: %s Ŝablono: %s Ago: %s Ignore usklecon: %s Gag ekrano: %s Gag registrado: %s Ebligata: %s Daŭri ezekutadon: %s Reskribisto: %s Ŝanĝas stilon: %s TriggersNe eblas konekti al retnodo %s: %sNe eblas konekti al retnodo %s: Eraro #%d.Ne eblas konekti al prokurservilon %s: %sNe eblas konekti al prokurservilon %s: Eraro #%d.Ne konataNe konata direktivo '%s' en konfigurdosiero. Malkonata protokolo.Mondo ne nomiĝataMalrekonebla respondo el prokurservilo.Uzu $window->getsize() anstataŭ.Uzu $window->minimize() anstataŭ.Uzu $world->path() anstataŭ.Uzu %Kw por reprezenti la Mondnomon kaj %Kc por reprezenti la rolulon uzita en la aŭtomata saluto.Uzi _SSLUzi _grasan tiparon por emfazitaj koloroj (anstataŭ nur emfazi)_Plurlinia komandskatoloUzi defaŭltan konfiguron_Unulinia komandskatoloUzu la Trovi butonon por trovi la unuan rezultaton.Valida de:VariablojEldonoEldono %s de tiu plugin jam estas ŝarĝita.Vizitu http://www.kildclient.orgBlanka (grasa)Averto: provante sendi tre grandan linion. Eble rekursia aliasdefino?Averto: la funkcio getwindowsize() removiĝos future.Averto: la funkcio minimize() removiĝos future.Averto: la funkcio path() removiĝos future.BlankaBlanka (grasa)Nomo de la mondo:Mondo konservita.Ĉu tiu linio estus skribata en la registraddosiero?Rompi liniojn je la _tutan larĝeco de la ecranoSkribita da Eduardo M Kalinowski (eduardo@kalinowski.com.br) Flavva (grasa)FlavaFlava (grasa)JesVi povas lasi ĉi tiun kampon blanka, kaj dosiernomo aŭtomate generiĝos. Redaktu ĉi tiun kampon nur se vi scias tiun, kiun vi faras.Vi devas informi variablnomon.Vi devas informi la agon, krom se trigger estas gag aŭ ŝanĝas la stilon.Vi devas informi la agon.Vi devas informi la klavon.Vi devas informi la nomon.Vi devas informi la passvorton..Vi devas informi la ŝablonon.Vi devas informi la anstataŭon.Vi provas konekti al mondo kiu uzas SSL, sed ĉi tiu eldono de KildClient ne havas SSL subtenon. Konekti sen SSL?[MONDO...\_Koncerne_Ago:_Aldoni_Apliki al:_Peti konfirmon antaŭ forigo de triggers, aliases, ktp._Fono:_Nigra_Resignu_Purigi_FermiEĥo de _komandoj:_Kopii_Kopii ligiladresonCejana_Atendi_Tempo por atendi inter la sendado de ĉiu grupo de linioj/komandoj:_Eksigi_Malebligi_Malkativi savoklavojn por navigi komandhistorion_Malkonekti_Apero_Ne montri ĉi tiun mesaĝon denove_Ne eliri_Malsupren_Malsupren_Eĥi senditajn komandojn en la ĉeffenestro_Redakti_Redakti..._Ebligi se la servilo proponas post konekto_Ebligata_Evento:_Dosiero:_Fine, sendi tiun tekston:_Trovi_Trovi:_Ekbrili fenestron kiam nova teksto alvenasMalf_onoMalf_ono:_Formo:V_erda_HelpoKaŝi langetojn se nur unu mondo estas malfermaR_etnodo:_Inativa tempo:_Ignori usklecon_ImportiSk_ribi la lastajnAl_inei rompitajn liniojn je_Informaj mesaĝoj:_Enigo_Intervalo:_Kursivo:_Eroj por eksporti_Teni fenestro malferma post sendi_Daŭri la ezekutadon de aliaj trigger-oj eĉ se ĉi tiu rulas_Reteni la lastan tajpitan komandon en komandskatolo_Klavo:_Linioj por konservi en rolumadbufroŜ_arĝi_Malva_Manlibro_Sendi plurajn liniojn..._Nomo de variablo por iĝi daŭra:_Nomo:_Nova_ProksimaNombro de komandoj por konservi en _historio:_Nombro de linioj/komandoj por sendi samtempe:_OK_Malfermi_Malfermi ligilon_Malfermi...Pas_vorto:_Enmeti_Ŝablono:_Perl dosiero por ŝarĝi:_Pordo:_Preferoj_Preferoj..._Antaŭa_Eliri_RekonektiFo_rigi_Nombro de fojoj:_Reskribista triggerKon_servi_Elektu konservitan mondon:_Sendi_Montri objektojn difinitaj de pluginsDividi fene_stron_Fermi_Konservi komandojn inter sesiojTra_strekto:_Anstataŭo:_Pozicio de la langetoj:_Nedaŭra (estos eksigita aŭtomate kiam lia nombro de fojoj atingas 0)_Testi trigger-jn..._Teksto por trovi:_Substrekto:_Supren_SuprenSal_utnomo:B_lanka_Mondo_Rompi la liniojn inter vortojF_lava_fojoj sinsekveadrestipo ne subtenataaliasalias: ne kreita alias sen ŝablonoalias: ne kreita alias sen anstataŭoaliasesrolulosignoj estis tajpitajkomando ne subtenata / protokolerarokomando(j)konekto ne permesita de la regularokonekto rifuzita de la destina retnodoĝenerala malfunkciadohokohook: hoko '%s' ne trovata hokojretnodo ne atingeblalinio(j)linionj el la rolumadbufro en la registraddosieromacromacro: Ne ekzistas tiun macromacrosnreto ne atingeblanerastrumerokonektpeto malsukcesis ĉar identd de kliento ne povis konfirmi la legitimilon en la konektpetokonkektpeto malsukcesis ĉar identd ne povis esti atingitakonektpeto malakceptita aŭ malsukcesita_sekundoj ĉiusekundoj_sekundoj ĉiutimertimer: Ne ekzistas tiun timertimerstriggertriggersmalkonata kodo.jjeskildclient-3.0.0/po/es.gmo0000644000175000017500000011141612376346024012321 00000000000000 * ****+%+:+7L+++++.+,1,(N,)w,?,,, ,, -- 3-T-f- |-- -- -- -- . ,. M.Z.p...B.+.$$/I/(P/"y// /// /*/00610h0 o0z0 0 0 00 00 000 00 11$1&51\1s11 1 11D1t 22,2122223$3A3X3k3}3 3333;3"4Q<484C48 5D5W5(h5/5#55"6$6'=6 e6666$6672787?7 D7Q7 V7b7f7n7u7 |7,77777 78 8%?8e8)x8 88 828999NA99 99 9 9 9 99:& :G:/O:&:'::#:;.; G;$h; ;; ;;;;;;; < < <&< 5<-@<.n< <<< <<< <<<= =={=>]> ?-?>?D?M?d?v? ??? ?????@@&@+@;@P@ U@b@r@y@@@ @@ @@@@@AA/ANAQA+`AAA A A A A AAA AB B BABIBYBlBBBB%B BBBBC-C@C'TC|CCCCC CCC DD D -D9D SD1_DGDD DDE E*E :EDE HESEhEEEEEEEE EFF (F2FFF/XF-F=F'F<GYGtG|GG GG*G'G2H3FH7zH4HFHS.IGIAI2 J?J FJ QJ\J bJoJ JJ_JJ%K5,K4bKK15L5gL LLLL!L(L'M.=MlMtM MM MMYMJNSNmN-N N NN,NO "OH0OCyO?OO P P P,)P<VPPP PPP!AQcQQQQQ"QR RRR R=R SS#S+S2S9S?SRSXS_SgS6pS S"S SS S"STT+%TQTZTbTiTTT T TTTT TTTTT UUU(U-HUvU|UUUUUUU'UUU UU U V VV/V 6VCV SV]VcV kVvV|VVV VVV VWW WW"W)W1WAW\WbW jWtW&W W!W&W XX.X6X(jgjjjjjjjk!k(7k `k kk wk6kkHk^l fl pl}l l ll l-lm6!m Xm2fm,m%m"m$n4n#Qn.un"nnn nnn o#o6o">oaosooooEo1 p=pMpUp[pkpppppppppxqrQrs0sBs JsTsns!sssssst!t8tRtct vtt%tttttttuu%u =|=||O|$ }I/} y}}}}}}<}55~@k~H~7~:-Vh^QOpE , 3A \ienԁ+75G}4+6`ǃփ ߃'&(-O}'(ۄ#}( хE5 GQ4Z%JƆEAWÇ3Ӈ=EXatx/$6"[#~($ˉ* ʊ Ԋ4 $.7?Gfks {I Ӌ#   9(b j5u  ʌ  &- BL`x *Cڍ&.7?Yb i,t ƎԎ ێ  %/ 6 @LUu.} ͏ݏ ,4 ;EUu{) Ր- ."< _ioa9Pk 'Ւ ({,H;Rx|;rV-2YTiQ##.lz>G/F8V yEBs1&nul:}]pmnt.e^J DMT1!7q W9g!L5J* S bf5z kGZ9/%rE@N0ap7sv)%_+XYu)g 3CxZe"\c `6~3FIBoh $D=U'?Ab?<"OWX@\ icwH*Q[,_jSqO0-f(4P}'CA+v`[y2 Pd {]w=Kj>m$Kha8dU:k&6NR^Mot~L|I4< SSL enabled.%d %s deleted.%d lines%s is already permanent.%s: Argument must be numeric%s: Invalid key code%s: No such world%s: This is an internal function, do not call directly.%s: Too few arguments%s: Too few arguments.%s: Wrong argument type%s: Wrong number of arguments.%s: cannot create timer with negative interval%s: count must be numeric%s: interval must be numeric%s: interval not specified, not creating(Leave blank for default based on locale)(You must reconnect for changes in this setting to take effect)0 lines1 line: Expired: Not yet activeAnsi ColorsCharacter SetColors used by KildClientConnectionDefault ColorsFileFlood preventionFontGraphical EditorsInputMCCP (for compression)Note:OptionsPlugins Currently LoadedPlugins Loaded on StartupProxySending DelaysTCP Keep AliveWeb BrowserWindow configurationA mud client with powerful features and support for Perl ScriptingA_utomatically start logging when connectedActi_vate auto-completion only afterActionAdd this to the _beginning of each line:Add this to the _end of each line:AdvancedAlias added.Alias modified.AliasesAppearanceAre you sure you want to close this world?Attempting to connect to host %s (%s) port %s...Attempting to connect to proxy host %s (%s) port %s...AuthorAutomationB_lueBac_kgroundBl_ack (bold)Bl_ue (bold)BlackBlack (bold)BlueBlue (bold)Bold backgroundBold foregroundC_hange styleC_ommand separator:C_onfigure...C_onnectC_onnected time:Cannot load a plugin in another world.Cannot open help file.Certificate type:Ch_aracters in this mud:Change StyleCharacterCharacter _set:Check to enable command auto-completion (based on previous commands)Check to have the last command kept in the command entry box, so that you can repeat commands only by pressing ENTERCipher:Click the run the triggers against the line.Click to open link; right-click for more options.ColorsCommand HistoryCommand _History...Command not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _Another...Connect to another worldConnect without SSLConnected to host %s (%s) port %s, MCCP version %d enabled.Connected to host %s (%s) port %s.Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d enabled.Connected to host %s port %s, via proxy %s (%s) port %s.Connected to proxy server %s port %s, negotiating authentication...Connected to proxy server %s port %s, sending request...Connection _style:Connection time:Could not connect to host %s port %s: %sCould not connect to host %s port %s: Error #%dCould not create directory '%s': %sCould not create socket: %sCould not create socket: error #%dCould not load plugin %sCould not load world from file '%s': %sCould not open dump file %s: %s Could not open file.Could not open file: %sCould not open log file: %s.Could not open raw dump file %s: %s Could not open world '%s': %s Could not resolve host %s: %sCountCount Cu_tCya_n (bold)CyanCyan (bold)DIRD_eleteDela_yDeleteDescriptionDirectory to store settings and saved worldsDisable T_imersDisable _AliasesDisable _MacrosDisable _TriggersDisconnectedDisconnected from host %s.Disconnected from host %s: %s.Disconnected from host %s: error #%d.Display as secondsDo not allow the _same command to be sentDo not changeDo not connectDo not deleteDo you really want to make the variable temporary?DoubleDumps all data received (possibly compressed) to the fileDumps all data received from (after decompression, if appropriate) to the fileE_xportEdit AliasEdit Character InformationEdit HookEdit MacroEdit TimerEdit WorldEnable TCP _Keep Alive packetsEnable _auto-completionEnable if server proposes at _any timeEnabledEnter _line to be matched against the triggers:Enter a descriptive name for the WorldEnter some text to be sent to the WorldEnter some text to search for.Enter the port used when connectingEnter the text to search forError in plugin file: %sError setting spell checker: %s Error while reading from proxy host.Eval as PerlEvent:Expiration:ExportExternal ProgramsFILEFailed loading file %s: %sFileFile name not specified.Find CommandFind N_extFind NextFind P_reviousFind _nextFind a command containing a given search termFind the next command with the same match textG_reen (bold)GeneralGreenGreen (bold)HTTPHelp topic not found.Hook defined.Hook modified.HooksI. CaseIdle time:If checked, the up and down arrow keys are not used for navigating between saved commands. (You'll have to use Alt+up and Alt+down.)If checked, triggers, aliases, macros and timers defined in plugins will appear in the corresponding World Editor sections.If not checked, objects such as triggers, aliases, etc. will be deleted directly without asking for confirmation when you press the Delete button.If this is selected, logging will be automatically started whenever you connect to the world.ImportInform number of lines to include in the log.InputIntervalInvalid argument '%s' Invalid key code.Invalid plugin file.Keep _openKeep permanentKeyKey exchange:KildClient ErrorKildClient InformationKildClient QuestionKildClient WarningKildClient readyLanguage code:LeftLines received:Logging to file %s. MAC:Macro added.Macro modified.MacrosMagen_ta (bold)MagentaMagenta (bold)Main WindowMake temporaryMiscellaneousMore than one command selected.Multi-line sendN/AN_umber of lines:NameNever _hide the typed textNewest commands are on the topNoNo %s deleted.No acceptable proxy authentication methods.No command selected.No proxyNo such %sNo such %s.No such aliasNo such macroNo such timerNo worldNoneNot connectedNot connected.Not foundNumber of triggers that matched:OfflineOnConnect HooksOnDisconnect HooksOnReceivedText HooksOnSentCommand HooksOne %s deleted.Or connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPerforming SSL handshake...Permanent variablesPermenent variablePlugin '%s' loaded.Plugin already loaded. Try enabling it.Plugin disabled.Plugin enabled.Plugin not loaded.Plugin not specifiedPort:PreferencesPress a key to get its keycode.Protocol %s not enabled.ProtocolsProxyProxy _type:Proxy port:Proxy request failed: %s.Proxy type:Put the selected command in the command entry boxPut the selected command in the command entry box and close this dialogR_edRe_d (bold)Re_vert to default colorsReally Quit KildClient?Really close?Rec_all & CloseReconnectRedRed (bold)Resolving host %s...Resolving proxy host %s...Revert to _defaultRightSOCKS4SOCKS5SSL Handshake failed: %sSSL Handshake took too long.SSL protocol used:S_end & CloseS_pell check typed textS_tatistics...ScriptingSe_nd this command:Search direction:Select the font used in the command _entry box:Select the font used in the command entry boxSelect to include lines from the main window in the log file.Send the selected command(s) to the mudSend the selected command(s) to the mud and close the dialogSend this text _initially:SendingSending connection request...Server _address:Server _port:SingleSpecify how many commands are sent at onceSpecify how many lines are sent at onceSpecify some text to be appended to each sent lineSpecify some text to be prepended to each sent lineSpecify the delay between sending the group of commandsSpecify the delay between sending the group of linesSpecify the maximum number of equal commands that can be sent in a rowSpecify the number of characters that must be typed for command completion to startSpecify the number of commands that are saved and can be later recalledSpecify the separator for commands typed in the command entry boxSpell checking support not included in this build.St_artStatisticsStatus BarStyleSubstitutionSuccessfully moved %s.TTL expiredTempThe text entered here will be matched against triggers as if it were a line coming from the MUDThe whole lineThen send the _contents of this file:There are %d open worlds. Do you really want to quit?There is one open world. Do you really want to quit?This is what would be printed in the main screen. If empty, the line has been gaged. It can be different from the original line because of rewriter triggers.This is what would be printed in the main screen:This version of KildClient does not have SSL support.Timer added.Timer modified.TimersTriggersUnable to connect to host %s: %s.Unable to connect to host %s: Error #%d.Unable to connect to proxy host %s: %s.Unable to connect to proxy host %s: Error #%d.UnknownUnknown protocolUnnamed worldUse $window->getsize() instead.Use $window->minimize() instead.Use $world->path() instead.Use %Kw to represent the World's name, and %Kc to represent the auto-logon character nameUse _SSLUse _multi-line input barUse single-_line input barUse the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit http://www.kildclient.orgW_hite (bold)Warning: the getwindowsize() function is deprecated and will be removed.Warning: the minimize() function is deprecated and will be removed.Warning: the path() function is deprecated and will be removed.WhiteWhite (bold)World name:World saved.Would this line be included in the log file?Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br) Yell_ow (bold)YellowYellow (bold)YesYou can leave this field blank, and a file name will be automatically generated. Only edit this field if you know what you are doing.You must specify a variable name.You must specify the action.You must specify the key.You must specify the name.You must specify the password.You must specify the pattern.You must specify the substitution.You're attempting to connect to a world that uses SSL, but this version of KildClient has been built without SSL support. Try to connect without SSL?[WORLD...]_About_Action:_Apply to:_Ask for confirmation before deleting triggers, aliases, etc._Background:_Black_Cancel_Clear_Close_Copy_Copy link address_Cyan_Delay_Delete_Disable_Disable up and down arrow keys for history navigation_Disconnect_Do not display this message again_Don't quit_Down_Downwards_Echo sent commands in main window_Edit_Edit..._Enable if server proposes after connecting_Enabled_Event:_File:_Finally, send this text:_Find_Find:_Foreground_Foreground:_Format:_Green_Help_Idle time:_Import_Include the last_Informative messages:_Input_Interval:_Italic:_Items to export_Keep dialog open after sending_Keep last typed command in command entry box_Key:_Load_Magenta_Manual_Multi-line Send..._Name:_New_Next_Number of commands to save in history:_OK_Open_Open link_Open..._Password:_Paste_Pattern:_Perl file to load:_Port:_Preferences_Preferences..._Previous_Quit_Recall_Reconnect_Save_Select a saved world:_Send_Show items defined by plugins_Store commands between sessions_Substitution:_Text to find:_Underline:_Up_Upwards_Username:_White_World_Yellow_times in a rowaddress type not supportedaliasaliasescharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection not allowed by rulesetconnection refused by destination hostgeneral failurehost unreachableline(s)macromacro: No such macromacrosnnetwork unreachablenopixelsrequest failed because client's identd could not confirm the user ID string in the requestrequest failed because identd could not be reachedrequest rejected or failedsec_onds eachsecondsseconds e_achtimertimer: No such timertimersunknown reason codeyyesProject-Id-Version: KildClient 3.0.0 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general POT-Creation-Date: 2014-08-17 14:59-0300 PO-Revision-Date: 2014-08-17 14:59-0300 Last-Translator: Fernando Bobbio Language-Team: Eduardo M Kalinowski Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Lokalize 1.4 SSL habilitado.Se borró %d %s.%d líneas%s ya es permanente.%s: El argumento tiene que ser numérico%s: Código de clave inválido%s: No existe tal mundo%s: Esta es una función interna, no llamarla directamente.%s: Demasiados argumentos.%s: Muy pocos argumentos.%s: Tipo de argumento incorrecto%s: Número de argumentos incorrecto.%s: No se puede crear temporizador con intervalo negativo%s: Contador tiene que ser numérico%s: Intervalo tiene que ser numérico%s: Intervalo no especificado, no creado(Dejar en blanco para locales basados por defecto)(Deberá volver a conectarse para que los cambios en esta configuración surtan efecto)0 líneas1 línea: Expirado: Todavía inactivoColores AnsiJuego de CaracteresColores usados por KildClientConexiónColores por DefectoArchivoPrevención de inundaciónFuenteEditores GráficosIngresoMCCP (para compresión)Nota:OpcionesComplementos Cargados ActualmenteComplementos Cargados al InicioProxyEnviando DemorasTCP Para Mantener VivoNavegadorConfiguración de VentanaUn cliente de MUD con poderosas cualidades y soporte para Scripting de PerlIniciar guardado de log a_utomáticamente al conectarseActi_var completado automático sólo luego deAcciónAgregar esto al _inicio de cada línea:Agregar esto al _final de cada línea:AvanzadoAlias agregado.Alias modificado.AliasesApariencia¿Está seguro que quiere cerrar este mundo?Intentando conectar a %s (%s) puerto %s...Intentando conectar a proxy %s (%s) puerto %s...AutorAutomatizaciónA_zulFondoNegro (negrita)Azul (negrita)NegroNegro (negrita)AzulAzul (negrita)Fondo negritaAdelante negritaC_ambiar estiloS_eparador de comandos:C_onfigurar...C_onectarT_iempo conectado(a):No se puede cargar un complemento en otro mundo.No se puede abrir el archivo de ayuda.Tipo de certificado:C_aracteres en este MUD:Cambiar EstiloCaracter_Juego de caracteres:Seleccionar para habilitar auto-completado de comandos (basado en comandos previos)Seleccionar para mantener el último comando usado en la caja de ingreso de comandos, para que pueda repetirse comandos presionando la tecla Intro únicamenteCifrado:Dar clic para ejecutar los gatillos en la línea.Dar clic para abrir vínculo; clic de la derecha para más opciones.ColoresHistorial de Comandos_Historial de comandos...Comando no encontrado.Comandos que sería enviados:Algoritmo de compresión:Rata de compresión:Compresión usada:Confirmar borradoConectar aConectar a _otro...Conectar a otro mundoConectar sin SSLDesconectado de %s (%s) puerto %s, versión de MCCP %d habilitada.Conectado a %s (%s) puerto %s.Conectado a %s puerto %s, mediante proxy %s (%s) puerto %s, versión de MCCP %d Conectado a %s puerto %s, mediante proxy %s (%s) puerto %s.Conectado al puerto %s del servidor proxy %s, negociando autenticación...Conectado al servidor proxy %s en el puerto %s, enviando pedido..._Estilo de conexión:Tiempo de conexión:No se pudo conectar a %s puerto %s: %sNo se pudo conectar a %s puerto %s: Error #%dNo se puede crear el directorio '%s': %sNo se pudo crear conexión: %sNo se pudo crear conexión: error #%dNo se pudo cargar el complemento %sNo se pudo cargar mundo de archivo '%s': %sNo se puede abrir el archivo %s: %s No se pudo abrir el archivo.No se pudo abrir archivo: %sNo se pudo abrir el archivo de texto: %s.No se puede abrir el archivo original %s: %s No se pudo abrir mundo '%s': %s No se pudo resolver %s: %sCuentaContarCor_tarCyan (negrita)CyanCyan (negrita)DIR_BorrarDemo_raBorrarDescripciónDirectorio donde se guardan configuraciones y mundos guardadosDeshabilitar t_emporizadoresDeshabilitar _aliasesDeshabilitar _macrosDeshabilitar _triggersDesconectado(a)Desconectado de %s.Desconectado de %s: %s.Desconectado de %s: error #%d.Mostrar como segundosNo permitir el envío del _mismo comandoNo cambiarNo conectarNo borrar¿Realmente quiere crear la variable momentáneamente?DobleIngresa toda la información recibida (posiblemente compresa) al archivoIngresa toda la información recibida de (luego de descompresión, si es necesario) al archivoE_xportarEditar AliasEditar Información de CaracterEditar GanchoEditar MacroEditar TemporizadorEditar MundoHabilitar paquetes de TCP para _Mantener VivoHabilitar auto-completadoHabilitar si el servidor propone en _cualquier momentoHabilitado(a)Ingresar _línea a ser comparada con los gatillos:Ingresar un nombre descriptivo para el MundoIngresar texto a ser enviado al MundoIngresar parte del texto a buscar.Ingresar el puerto usado al conectarIngresar texto a ser buscadoError en archivo de complemento: %sError configurando corrector ortográfico: %s Error al leer del servidor proxy. Evaluar como PerlEvento:Expiración:ExportarProgramas ExternosARCHIVONo se pudo cargar el archivo %s: %sArchivoNombre de archivo no especificado.Encontrar ComandoEncontrar si_guienteEncontrar SiguienteEncontrar _anteriorEncontrar _siguienteEncontrar un comando conteniendo un término de búsqueda determinadoEncontrar el siguiente comando con el mismo textoVerde (negrita)GeneralVerdeVerde (negrita)HTTPTema de ayuda no encontrado.Gancho definido.Gancho modificado.HooksI. CasoTiempo inactivo(a):Si está seleccionada, las teclas de cursor para arriba y para abajo no son usadas para navegar entre los comandos guardados. (Deberá usar Alt+Arriba y Alt+Abajo.)Si está seleccionado, los gatillos, aliases, macros y temporizadores definidos en los complementos aparecerán en las secciones de Editor de Mundos.Si no está seleccionado, los objetos como los gatillos, aliases, etc. serán eliminados directamente sin pedir confirmación al presionar el botón Eliminar (Delete).Si está seleccionado, se creará un log automáticamente al conectarse al mundo.ImportarInformar número de líneas a incluir en el log.IngresoIntervaloArgumento inválido '%s' Código de clave inválido.Archivo de complemento inválido.Mantener _abiertoMantener como permanenteClaveClave intercambiada:Error de KildClientInformación de KildClientPregunta de KildClientAdvertencia de KildClientKildClient listoCódigo de idioma:IzquierdaLíneas recibidas:Guardando información a archivo %s. MAC:Macro agregado.Macro modificado.MacrosMagenta (negrita)MagentaMagenta (negrita)Ventana PrincipalCrear momentáneamenteMisceláneoHay más de un comando seleccionado.Envío de líneas múltiplesN/ANú_mero de líneas:NombreNunca _ocultar texto tipeadoLos comandos más recientes están al inicioNoNo %s borrado(a).No existen métidos de autenticación de proxy aceptables.No se seleccionó ningún comando.Sin proxyNo existe %sNo existe %s.Alias no existenteMacro no existenteTemporizador no existenteNo hay mundoNinguno(a)No conectado(a)No conectado.No encontrado(a)Número de gatillos encontrados:Desconectado(a)Ganchos AlConectarGanchos AlDesconectarGanchos AlRecibirTextoGanchos AlEnviarComandosUn(a) %s borrado(a).O conectar d_irectamente:Muestra información de la versión y cierraContra_seña:ContraseñaPatrónIniciando conexión SSL...Variables permanentesVariable PermanenteComplemento '%s' cargado.Complemento ya está cargado. Intente habilitarlo.Complemento deshabilitado.Complemento habilitado.Complemento no cargado.Complemento no especificadoPuerto:PreferenciasPresione una tecla para ver su código de clave.Protocolo %s no habilitado.ProtocolosProxy_Tipo de proxy:Puerto de proxy:Pedido de proxy fallido: %s.Tipo de proxy:Colocar el comando seleccionado en la caja de entrada de comandosColocar el comando seleccionado en la caja de entrada de comandos y cerrar este diálogoR_ojoRojo (negrita)Re_vertir a colores por defecto¿Realmente salir de KildClient?¿Realmente cerrar?Record_ar & CerrarReconectarRojoRojo (negrita)Resolviendo %s...Resolviendo proxy %s...Revertir a por _defectoDerechaSOCKS4SOCKS5Problema de conexión SSL: %sLa conexión SSL demoró demasiado.Protocolo SSL usado:E_nviar & CerrarRe_visar ortografía del texto tipeado_Estadísticas...ScriptingEn_viar este comando:Dirección de búsqueda:Seleccionar la fuente usada en la _caja de entrada de comandosSeleccionar la fuente usada en la caja de entrada de comandosSeleccionar para incluir líneas de la pantalla principal en el archivo de log.Enviar el/los comando(s) al programaEnviar el/los comando(s) seleccionado(s) al programa y cerrar el diálogoEnviar este texto _inicialmente:EnviandoEnviando pedido de conexión..._Dirección de servidor:_Puerto de servidor:SimpleEspecificar cuántos comandos serán enviados a la misma vezEspecificar cuántas líneas serán enviadas a la vezEspecificar texto a ser agregado al final de cada línea enviadaEspecificar algún texto a ser agregado al inicio de cada línea enviadaEspecificar la demora entre envío de grupo de comandosEspecificar la demora entre los grupos de líneas enviadasEspecificar el número máximo de comandos iguales que pueden ser enviados en una filaEspecificar el número de caracteres que deben ser tipeados para iniciar completado de comandoEspecificar el número de comandos a ser guardados para ser usados posteriormenteEspecificar el separador de comandos tipeados en la caja de entrada de comandosSoporte para corrección ortográfica no incluída en esta revisión.In_icioEstadísticasBarra de EstadoEstiloSubstituciónSe movió %s exitosamente.TTL expiradoTempEl texto ingresado aquí será comparado con los gatillos como si fuese una línea de comando del MUDToda la líneaLuego enviar el _contenido de este archivo:Hay %d mundos abiertos. ¿Realmente quiere desconectar?Hay un mundo abierto. ¿Realmente quiere desconectar?Esto es lo que aparecería en la pantalla principal. Si está vacío, la línea ha sido cortada. Puede ser diferente de la línea original debido a gatillos de re-escritura.Esto es lo que aparecería en la pantalla principal:Esta versión de KildClient no tiene soporte para SSL.Temporizador agregado.Temporizador modificado.TemporizadoresTriggersProblemas de conexión a %s: %s.Problemas de conexión a %s: Error #%d.Problemas de conexión a proxy %s: %s.Problemas de conexión a proxy %s: Error #%d.Desconocido(a)Protocolo desconocidoMundo sin nombreUsar $window->getsize() como reemplazo.Usar $window->minimize() como reemplazo.Usar $world->path() como reemplazo.Usar %Kw para representar el nombre dle Mundo, y %Kc para representar el nombre del caracter a ser conectado automáticamenteUsar _SSLUsar barra de ingreso _múltipleUsar barra de ingreso _simpleUsar el botón Encontrar ("Find") para encontrar el primer resultado.Válido(a) desde:VariablesVersiónLa versión %s de este complemento ya está cargada.Visítenos: http://www.kildclient.orgBlanco (negrita)Advertencia: La función getwindowsize() está deprecada y será removida.Advertencia: La función minimize() está deprecada y será removida.Advertencia: la función path() está deprecada y será removida.BlancoBlanco (negrita)Nombre del mundo:Mundo guardado.¿Esta línea será incluída en el archivo de log?Escrito por Eduardo M Kalinowski (eduardo@kalinowski.com.br) Amarillo (negrita)AmarilloAmarillo (negrita)SíPuede dejar este campo en blanco y se generará un nombre de archivo automáticamente. Sólo editar este campo si sabe lo que está haciendo.Se tiene que especificar un nombre de variable.Se tiene que especificar la acción.Se tiene que especificar la clave.Se tiene que especificar el nombre.Se tiene que especificar la contraseña.Se tiene que especificar el patrón.Se tiene que especificar la substitución.Está intentando conectar a un mundo que usa SSL, pero esta versión de KildCliente ha sido compilada sin soporte para SSL. ¿Intentar conectar sin SSL?[MUNDO...]_Acerca de_Acción:_Aplicar a:_Confirmar antes de eliminar gatillos, aliases, etc._Fondo:_Negro_Cancelar_Limpiar_Cerrar_Copiar_Copiar dirección de vínculoCyan_Demora_Borrar_Deshabilitar_Deshabilitar las teclas de arriba y abajo para navegación del historial_Desconectar_No mostrar este mensaje nuevamente_No salirHacia a_bajoHacia A_bajoEnviar _eco de comandos enviados en la pantalla principal_Editar_Editar..._Habilitar si el servidor propone luego de conectarse_Habilitado_Evento:_Archivo:_Finalmente, enviar este texto:_Encontrar_Encontrar:Adelante_Adelante:_Formato:_Verde_Ayuda_Tiempo inactivo(a):_Importar_Incluir el últimoMensajes _informativos:_Ingreso_Intervalo:_Itálica:_Artículos a exportar_Mantener diálogo abierto luego de enviar_Mantener último comando tipeado en la caja de entrada de comandos_Clave:_Cargar_Magenta_Manual_Enviar varias líneas..._Nombre:_Nuevo_Siguiente_Número de comandos a guardar en historial:_OK_Abrir_Abrir vínculo_Abrir..._Contraseña:_Pegar_Patrón:Archivo _Perl a cargar:_Puerto:_Preferencias_Preferencias..._Anterior_Salir_Recordar_Reconectar_Guardar_Seleccionar un mundo guardado:_Enviar_Mostrar objetos definidos en los complementos_Guardar comandos entre sesiones_Substitución:_Texto a encontrar:_Subrayar:Hacia _arribaHacia _Arriba_Nombre de usuario:_Blanco_Mundo_Amarillo_veces seguidasTipo de dirección no soportadoaliasaliasescaractercaracteres han sido ingresadosComando no soportado / error de protocolocomando(s)Conexión no permitida por reglas habilitadasConexión rechazada por destinoFalla generalNo se puede encontrar el servidor línea(s)MacroMacro: No existe tal macroMacrosNo (n)Red no existentenopixelesPedido fallido debido a que el identd del cliente no pudo confirmar el ID de usuario en el pedidoPedido fallido debido a que identd no pudo ser encontradoPedido rechazado o fallidoseg_undos cada uno(a)segundossegundos ca_da uno(a)TemporizadorTemporizador: Temporizador no existenteTemporizadoresCódigo de razón desconocidaSí (y)síkildclient-3.0.0/po/ChangeLog0000644000175000017500000000006712376346024012757 00000000000000Please see the ChangeLog file in the parent directory. kildclient-3.0.0/po/kildclient.pot0000644000175000017500000021317112376346024014055 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=glib&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2014-08-24 08:20-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/main.c:74 msgid "Outputs version information and exits" msgstr "" #: ../src/main.c:76 msgid "Directory to store settings and saved worlds" msgstr "" #: ../src/main.c:76 msgid "DIR" msgstr "" #: ../src/main.c:78 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "" #: ../src/main.c:79 ../src/main.c:82 msgid "FILE" msgstr "" #: ../src/main.c:81 msgid "Dumps all data received (possibly compressed) to the file" msgstr "" #. Parse command-line options #: ../src/main.c:120 msgid "[WORLD...]" msgstr "" #: ../src/main.c:127 #, c-format msgid "Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" msgstr "" #: ../src/main.c:132 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "" #: ../src/main.c:139 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "" #: ../src/main.c:266 msgid "There is one open world. Do you really want to quit?" msgstr "" #: ../src/main.c:272 #, c-format msgid "There are %d open worlds. Do you really want to quit?" msgstr "" #: ../src/main.c:275 msgid "Really Quit KildClient?" msgstr "" #: ../src/main.c:277 msgid "_Don't quit" msgstr "" #: ../src/main.c:278 ../src/wndmain.ui:145 msgid "_Quit" msgstr "" #: ../src/net.c:107 msgid "" "You're attempting to connect to a world that uses SSL, but this version of " "KildClient has been built without SSL support. Try to connect without SSL?" msgstr "" #: ../src/net.c:108 msgid "KildClient Question" msgstr "" #: ../src/net.c:110 msgid "Connect without SSL" msgstr "" #: ../src/net.c:111 msgid "Do not connect" msgstr "" #: ../src/net.c:119 msgid "This version of KildClient does not have SSL support." msgstr "" #: ../src/net.c:195 ../src/proxy.c:209 #, c-format msgid "Resolving proxy host %s..." msgstr "" #: ../src/net.c:198 #, c-format msgid "Resolving host %s..." msgstr "" #: ../src/net.c:291 ../src/proxy.c:193 #, c-format msgid "Could not resolve host %s: %s" msgstr "" #: ../src/net.c:319 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "" #: ../src/net.c:322 #, c-format msgid "Attempting to connect to proxy host %s (%s) port %s..." msgstr "" #: ../src/net.c:338 #, c-format msgid "Could not create socket: %s" msgstr "" #: ../src/net.c:341 #, c-format msgid "Could not create socket: error #%d" msgstr "" #: ../src/net.c:361 #, c-format msgid "Could not connect to host %s port %s: %s" msgstr "" #: ../src/net.c:371 #, c-format msgid "Could not connect to host %s port %s: Error #%d" msgstr "" #: ../src/net.c:427 #, c-format msgid "Unable to connect to host %s: %s." msgstr "" #: ../src/net.c:430 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "" #: ../src/net.c:472 ../src/net.c:490 #, c-format msgid "Unable to connect to host %s: Error #%d." msgstr "" #: ../src/net.c:475 ../src/net.c:493 #, c-format msgid "Unable to connect to proxy host %s: Error #%d." msgstr "" #: ../src/net.c:529 #, c-format msgid "Performing SSL handshake..." msgstr "" #: ../src/net.c:579 #, c-format msgid "SSL Handshake failed: %s" msgstr "" #: ../src/net.c:621 #, c-format msgid "SSL Handshake took too long." msgstr "" #: ../src/net.c:650 ../src/net.c:1153 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "" #: ../src/net.c:653 ../src/net.c:1156 #, c-format msgid "Connected to host %s port %s, via proxy %s (%s) port %s." msgstr "" #: ../src/net.c:660 ../src/net.c:1129 ../src/net.c:1163 msgid " SSL enabled." msgstr "" #: ../src/net.c:678 ../src/perlscript.c:3240 #, c-format msgid "Logging to file %s.\n" msgstr "" #: ../src/net.c:824 #, c-format msgid "Disconnected from host %s." msgstr "" #: ../src/net.c:897 ../src/net.c:906 #, c-format msgid "Disconnected from host %s: %s." msgstr "" #: ../src/net.c:917 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "" #: ../src/net.c:1117 #, c-format msgid "Connected to host %s (%s) port %s, MCCP version %d enabled." msgstr "" #: ../src/net.c:1121 #, c-format msgid "" "Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d " "enabled." msgstr "" #: ../src/net.c:1239 ../src/we_logging.c:123 msgid "Not connected." msgstr "" #. success #: ../src/proxy.c:57 msgid "general failure" msgstr "" #: ../src/proxy.c:58 msgid "connection not allowed by ruleset" msgstr "" #: ../src/proxy.c:59 msgid "network unreachable" msgstr "" #: ../src/proxy.c:60 msgid "host unreachable" msgstr "" #: ../src/proxy.c:61 msgid "connection refused by destination host" msgstr "" #: ../src/proxy.c:62 msgid "TTL expired" msgstr "" #: ../src/proxy.c:63 msgid "command not supported / protocol error" msgstr "" #: ../src/proxy.c:64 msgid "address type not supported" msgstr "" #: ../src/proxy.c:239 ../src/proxy.c:661 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "" #: ../src/proxy.c:294 ../src/proxy.c:423 ../src/proxy.c:468 ../src/proxy.c:542 #: ../src/proxy.c:708 msgid "Error while reading from proxy host." msgstr "" #: ../src/proxy.c:315 msgid "request rejected or failed" msgstr "" #: ../src/proxy.c:319 msgid "request failed because identd could not be reached" msgstr "" #: ../src/proxy.c:323 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" #: ../src/proxy.c:327 ../src/proxy.c:568 ../src/proxy.c:724 #, c-format msgid "Proxy request failed: %s." msgstr "" #: ../src/proxy.c:344 #, c-format msgid "Connected to proxy server %s port %s, negotiating authentication..." msgstr "" #: ../src/proxy.c:438 msgid "No acceptable proxy authentication methods." msgstr "" #: ../src/proxy.c:486 msgid "Proxy authentication failed." msgstr "" #. Should never happen #: ../src/proxy.c:529 msgid "Unrecognized response from proxy host." msgstr "" #: ../src/proxy.c:563 msgid "unknown reason code" msgstr "" #: ../src/proxy.c:584 #, c-format msgid "Sending proxy authentication credentials..." msgstr "" #: ../src/proxy.c:623 #, c-format msgid "Sending connection request..." msgstr "" #: ../src/mainwindow.c:166 ../src/mainwindow.c:577 ../src/mainwindow.c:843 #: ../src/worldgui.c:1096 ../src/worldselector.c:193 ../src/worldeditor.c:180 #: ../src/we_general.c:342 ../src/we_generic_guied.c:81 #: ../src/we_triggers.c:83 ../src/we_triggers.c:553 ../src/we_triggers.c:751 #: ../src/we_aliases.c:76 ../src/we_aliases.c:455 ../src/we_macros.c:79 #: ../src/we_macros.c:420 ../src/we_timers.c:76 ../src/we_timers.c:457 #: ../src/we_hooks.c:87 ../src/we_hooks.c:620 ../src/we_vars.c:76 #: ../src/we_vars.c:368 ../src/prefs.c:107 ../src/triggers.c:278 #: ../src/multilinesend.c:93 ../src/cmdhistory.c:209 ../src/cmdhistory.c:454 #, c-format msgid "Error loading UI from XML file: %s" msgstr "" #: ../src/mainwindow.c:636 ../src/mainwindow.c:637 msgid "Not connected" msgstr "" #: ../src/mainwindow.c:779 msgid ": Not yet active" msgstr "" #: ../src/mainwindow.c:784 msgid ": Expired" msgstr "" #: ../src/mainwindow.c:798 ../src/kildclient.ui:1995 #: ../src/dlgStatistics.ui:104 ../src/dlgStatistics.ui:337 msgid "None" msgstr "" #: ../src/worldgui.c:220 msgid "_Find:" msgstr "" #: ../src/worldgui.c:234 msgid "Find Next" msgstr "" #: ../src/worldgui.c:261 msgid "Click to clear the command input area." msgstr "" #: ../src/worldgui.c:360 msgid "No world" msgstr "" #: ../src/worldgui.c:430 msgid "KildClient ready" msgstr "" #: ../src/worldgui.c:437 msgid "0 lines" msgstr "" #: ../src/worldgui.c:890 msgid "Are you sure you want to close this world?" msgstr "" #: ../src/worldgui.c:891 msgid "Really close?" msgstr "" #: ../src/worldgui.c:893 msgid "Keep _open" msgstr "" #: ../src/worldgui.c:894 ../src/worldselector.c:816 ../src/worldselector.c:822 #: ../src/wndmain.ui:72 ../src/dlgPreferences.ui:136 #: ../src/dlgTestTriggers.ui:23 ../src/dlgCmdHistory.ui:197 msgid "_Close" msgstr "" #: ../src/worldgui.c:1025 #, c-format msgid "Error setting spell checker: %s\n" msgstr "" #: ../src/worldgui.c:1029 msgid "Spell checking support not included in this build." msgstr "" #: ../src/worldgui.c:1279 msgid "Click to open link; right-click for more options." msgstr "" #: ../src/worldgui.c:1445 msgid "Not found" msgstr "" #: ../src/ansitextview.c:423 msgid "1 line" msgstr "" #: ../src/ansitextview.c:425 #, c-format msgid "%d lines" msgstr "" #: ../src/worldselector.c:138 ../src/worldselector.c:689 #, c-format msgid "Could not load world from file '%s': %s" msgstr "" #: ../src/worldselector.c:141 ../src/worldselector.c:692 ../src/worlds.c:2370 #: ../src/we_generic_guied.c:315 ../src/we_generic_guied.c:404 #: ../src/prefs.c:448 ../src/prefs.c:527 msgid "KildClient Error" msgstr "" #: ../src/worldselector.c:494 #, c-format msgid "Could not open world '%s': %s\n" msgstr "" #: ../src/worldselector.c:537 #, c-format msgid "Invalid argument '%s'\n" msgstr "" #: ../src/worldselector.c:810 msgid "Disconnected" msgstr "" #: ../src/worldselector.c:813 ../src/worldselector.c:820 msgid "Reconnect" msgstr "" #: ../src/worldselector.c:814 ../src/worldselector.c:821 msgid "Connect to another world" msgstr "" #: ../src/worldselector.c:815 msgid "Offline" msgstr "" #: ../src/worlds.c:776 msgid "Unnamed world" msgstr "" #: ../src/worlds.c:833 #, c-format msgid "Could not open file: %s" msgstr "" #: ../src/worlds.c:896 #, c-format msgid "Invalid top-level element '%s'" msgstr "" #: ../src/worlds.c:1710 #, c-format msgid "Internal error: element '%s' ends when in START mode" msgstr "" #: ../src/worlds.c:1984 #, c-format msgid "Invalid key code '%s'" msgstr "" #: ../src/worlds.c:2003 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "" #: ../src/worlds.c:2016 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "" #: ../src/worlds.c:2367 ../src/we_generic_guied.c:312 ../src/prefs.c:445 #, c-format msgid "Could not open file '%s': %s" msgstr "" #: ../src/worlds.c:2528 #, c-format msgid "Disconnected from world %s" msgstr "" #: ../src/worldeditor.c:245 msgid "General" msgstr "" #: ../src/worldeditor.c:253 ../src/worldeditor.c:257 msgid "Display" msgstr "" #: ../src/worldeditor.c:254 msgid "Here you can set options to configure the appearance of KildClient." msgstr "" #: ../src/worldeditor.c:265 msgid "Main Window" msgstr "" #: ../src/worldeditor.c:273 msgid "Colors" msgstr "" #: ../src/worldeditor.c:281 msgid "Status Bar" msgstr "" #: ../src/worldeditor.c:289 msgid "Input" msgstr "" #: ../src/worldeditor.c:297 msgid "Logging" msgstr "" #: ../src/worldeditor.c:303 ../src/worldeditor.c:307 msgid "Automation" msgstr "" #: ../src/worldeditor.c:304 msgid "" "Here you can set options to configure the automation features of KildClient, " "such as triggers, aliases, plugins, etc." msgstr "" #: ../src/worldeditor.c:315 msgid "Scripting" msgstr "" #: ../src/worldeditor.c:323 msgid "Plugins" msgstr "" #: ../src/worldeditor.c:334 ../src/kildclient.ui:1556 msgid "Triggers" msgstr "" #: ../src/worldeditor.c:345 ../src/kildclient.ui:1571 msgid "Aliases" msgstr "" #: ../src/worldeditor.c:356 ../src/kildclient.ui:1586 msgid "Macros" msgstr "" #: ../src/worldeditor.c:367 ../src/kildclient.ui:1601 msgid "Timers" msgstr "" #: ../src/worldeditor.c:378 msgid "Hooks" msgstr "" #: ../src/worldeditor.c:389 msgid "Variables" msgstr "" #: ../src/worldeditor.c:398 msgid "Protocols" msgstr "" #: ../src/worldeditor.c:406 msgid "Miscellaneous" msgstr "" #: ../src/worldeditor.c:414 msgid "Advanced" msgstr "" #: ../src/we_general.c:73 msgid "Character" msgstr "" #: ../src/we_general.c:81 msgid "Password" msgstr "" #: ../src/we_general.c:381 msgid "You must specify the name." msgstr "" #: ../src/we_general.c:382 ../src/we_general.c:395 ../src/we_triggers.c:636 #: ../src/we_triggers.c:650 ../src/we_aliases.c:517 ../src/we_aliases.c:530 #: ../src/we_macros.c:477 ../src/we_macros.c:490 ../src/we_macros.c:503 #: ../src/we_timers.c:516 ../src/we_timers.c:529 ../src/we_hooks.c:672 #: ../src/we_vars.c:396 ../src/we_vars.c:408 ../src/we_vars.c:428 #: ../src/permanentvariables.c:129 ../src/cmdhistory.c:278 #: ../src/cmdhistory.c:290 ../src/cmdhistory.c:484 ../src/cmdhistory.c:517 #: ../src/cmdhistory.c:574 msgid "KildClient Warning" msgstr "" #: ../src/we_general.c:394 msgid "You must specify the password." msgstr "" #: ../src/we_general.c:436 msgid "character" msgstr "" #: ../src/we_logging.c:112 #, c-format msgid "Logging to file %s." msgstr "" #: ../src/we_logging.c:118 msgid "Logging is disabled." msgstr "" #: ../src/we_logging.c:215 msgid "Logging not started" msgstr "" #: ../src/we_logging.c:245 msgid "Select log file" msgstr "" #: ../src/we_logging.c:248 ../src/we_plugins.c:584 #: ../src/we_generic_guied.c:97 ../src/we_generic_guied.c:369 #: ../src/kildclient.ui:40 ../src/kildclient.ui:516 ../src/kildclient.ui:580 #: ../src/kildclient.ui:711 ../src/kildclient.ui:908 ../src/kildclient.ui:1125 #: ../src/kildclient.ui:1449 ../src/kildclient.ui:2170 #: ../src/dlgSelectWorld.ui:25 ../src/dlgEditWorld.ui:114 #: ../src/dlgMLSend.ui:36 ../src/dlgCmdHistory.ui:352 msgid "_Cancel" msgstr "" #: ../src/we_logging.c:250 ../src/kildclient.ui:55 ../src/kildclient.ui:531 #: ../src/kildclient.ui:595 ../src/kildclient.ui:726 ../src/kildclient.ui:923 #: ../src/kildclient.ui:1140 ../src/kildclient.ui:1464 #: ../src/kildclient.ui:2185 ../src/dlgStatistics.ui:22 #: ../src/dlgEditWorld.ui:129 ../src/dlgCmdHistory.ui:367 msgid "_OK" msgstr "" #: ../src/we_plugins.c:124 ../src/we_plugins.c:341 ../src/we_triggers.c:225 #: ../src/we_aliases.c:206 ../src/we_macros.c:209 ../src/we_timers.c:206 #: ../src/we_hooks.c:341 ../src/perlscript.c:3362 msgid "Name" msgstr "" #: ../src/we_plugins.c:136 ../src/we_plugins.c:383 ../src/perlscript.c:3363 msgid "Description" msgstr "" #: ../src/we_plugins.c:148 ../src/we_plugins.c:369 msgid "Author" msgstr "" #: ../src/we_plugins.c:161 msgid "File" msgstr "" #: ../src/we_plugins.c:209 ../src/we_plugins.c:466 msgid "Error Loading Plugin" msgstr "" #: ../src/we_plugins.c:327 ../src/we_triggers.c:211 ../src/we_aliases.c:192 #: ../src/we_macros.c:195 ../src/we_timers.c:192 ../src/we_hooks.c:327 msgid "Enabled" msgstr "" #: ../src/we_plugins.c:355 msgid "Version" msgstr "" #: ../src/we_plugins.c:444 msgid "Always load this plugin at _startup" msgstr "" #: ../src/we_plugins.c:507 msgid "The help is displayed in main window." msgstr "" #: ../src/we_plugins.c:508 msgid "KildClient Information" msgstr "" #: ../src/we_plugins.c:509 msgid "_Do not display this message again" msgstr "" #: ../src/we_plugins.c:581 msgid "Load plugin" msgstr "" #: ../src/we_plugins.c:586 ../src/we_generic_guied.c:371 msgid "_Open" msgstr "" #: ../src/we_generic_guied.c:94 msgid "Export" msgstr "" #: ../src/we_generic_guied.c:99 ../src/wndmain.ui:97 msgid "_Save" msgstr "" #: ../src/we_generic_guied.c:366 msgid "Import" msgstr "" #: ../src/we_generic_guied.c:401 #, c-format msgid "Could not import file '%s': %s" msgstr "" #: ../src/we_generic_guied.c:962 #, c-format msgid "Do you really want to delete the %s?" msgstr "" #: ../src/we_generic_guied.c:969 #, c-format msgid "Do you really want to delete %d %s?" msgstr "" #: ../src/we_generic_guied.c:973 ../src/we_vars.c:288 msgid "Confirm deletion" msgstr "" #: ../src/we_generic_guied.c:975 msgid "Do not delete" msgstr "" #: ../src/we_generic_guied.c:976 msgid "Delete" msgstr "" #: ../src/we_triggers.c:130 ../src/dlgTestTriggers.ui:8 msgid "Test Triggers" msgstr "" #: ../src/we_triggers.c:239 ../src/we_aliases.c:220 ../src/triggers.c:141 #: ../src/aliases.c:177 msgid "Pattern" msgstr "" #: ../src/we_triggers.c:257 ../src/we_aliases.c:238 msgid "I. Case" msgstr "" #: ../src/we_triggers.c:271 ../src/we_macros.c:237 ../src/we_timers.c:246 #: ../src/we_hooks.c:355 ../src/triggers.c:142 ../src/macros.c:145 #: ../src/timers.c:203 msgid "Action" msgstr "" #: ../src/we_triggers.c:289 msgid "Gag" msgstr "" #: ../src/we_triggers.c:307 msgid "Gag Log" msgstr "" #: ../src/we_triggers.c:325 msgid "Keep Exec" msgstr "" #: ../src/we_triggers.c:343 msgid "Rewriter" msgstr "" #: ../src/we_triggers.c:361 msgid "Style" msgstr "" #: ../src/we_triggers.c:375 ../src/we_aliases.c:284 ../src/we_macros.c:251 #: ../src/we_timers.c:278 ../src/we_hooks.c:369 msgid "Plugin" msgstr "" #: ../src/we_triggers.c:471 ../share/kildclient.pl:233 #: ../share/kildclient.pl:236 ../share/kildclient.pl:443 #: ../share/kildclient.pl:518 ../share/kildclient.pl:821 msgid "trigger" msgstr "" #: ../src/we_triggers.c:471 ../share/kildclient.pl:443 msgid "triggers" msgstr "" #: ../src/we_triggers.c:635 ../src/we_aliases.c:516 msgid "You must specify the pattern." msgstr "" #: ../src/we_triggers.c:649 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" #: ../src/we_aliases.c:252 ../src/aliases.c:178 msgid "Substitution" msgstr "" #: ../src/we_aliases.c:270 msgid "Eval as Perl" msgstr "" #: ../src/we_aliases.c:380 ../share/kildclient.pl:246 #: ../share/kildclient.pl:249 ../share/kildclient.pl:449 #: ../share/kildclient.pl:524 ../share/kildclient.pl:833 msgid "alias" msgstr "" #: ../src/we_aliases.c:380 ../share/kildclient.pl:449 msgid "aliases" msgstr "" #: ../src/we_aliases.c:529 msgid "You must specify the substitution." msgstr "" #: ../src/we_macros.c:223 ../src/macros.c:144 msgid "Key" msgstr "" #: ../src/we_macros.c:347 ../share/kildclient.pl:259 #: ../share/kildclient.pl:262 ../share/kildclient.pl:455 #: ../share/kildclient.pl:530 ../share/kildclient.pl:845 msgid "macro" msgstr "" #: ../src/we_macros.c:347 ../share/kildclient.pl:455 msgid "macros" msgstr "" #: ../src/we_macros.c:476 msgid "You must specify the key." msgstr "" #: ../src/we_macros.c:489 msgid "Invalid key code." msgstr "" #: ../src/we_macros.c:502 ../src/we_timers.c:528 ../src/we_hooks.c:671 msgid "You must specify the action." msgstr "" #: ../src/we_timers.c:219 msgid "Interval" msgstr "" #: ../src/we_timers.c:232 msgid "Count" msgstr "" #: ../src/we_timers.c:264 msgid "Temp" msgstr "" #: ../src/we_timers.c:381 ../share/kildclient.pl:272 #: ../share/kildclient.pl:275 ../share/kildclient.pl:461 #: ../share/kildclient.pl:536 ../share/kildclient.pl:857 msgid "timer" msgstr "" #: ../src/we_timers.c:381 ../share/kildclient.pl:461 msgid "timers" msgstr "" #: ../src/we_timers.c:515 msgid "The interval must be positive." msgstr "" #. The manually added combo for selecting which hook #: ../src/we_hooks.c:130 msgid "_Event:" msgstr "" #: ../src/we_hooks.c:547 ../share/kildclient.pl:286 ../share/kildclient.pl:289 #: ../share/kildclient.pl:467 ../share/kildclient.pl:543 #: ../share/kildclient.pl:870 msgid "hook" msgstr "" #: ../src/we_hooks.c:547 ../share/kildclient.pl:467 msgid "hooks" msgstr "" #: ../src/we_vars.c:279 msgid "Do you really want to make the variable temporary?" msgstr "" #: ../src/we_vars.c:285 #, c-format msgid "Do you really want to make %d variables temporary?" msgstr "" #: ../src/we_vars.c:290 msgid "Keep permanent" msgstr "" #: ../src/we_vars.c:291 msgid "Make temporary" msgstr "" #: ../src/we_vars.c:395 msgid "You must specify a variable name." msgstr "" #: ../src/we_vars.c:407 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "" #: ../src/we_vars.c:426 #, c-format msgid "%s is already permanent." msgstr "" #: ../src/prefs.c:398 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "" #: ../src/prefs.c:418 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "" #: ../src/prefs.c:524 #, c-format msgid "Could not create directory '%s': %s" msgstr "" #: ../src/parser.c:210 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "" #: ../src/triggers.c:140 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "" #: ../src/triggers.c:162 ../src/triggers.c:163 ../src/triggers.c:164 #: ../src/triggers.c:165 ../src/triggers.c:166 ../src/triggers.c:167 #: ../src/triggers.c:168 ../src/aliases.c:198 ../src/aliases.c:199 #: ../src/aliases.c:200 ../src/macros.c:167 ../src/timers.c:226 #: ../src/timers.c:227 ../src/hooks.c:206 ../src/perlscript.c:3382 msgid "y" msgstr "" #: ../src/triggers.c:162 ../src/triggers.c:163 ../src/triggers.c:164 #: ../src/triggers.c:165 ../src/triggers.c:166 ../src/triggers.c:167 #: ../src/triggers.c:168 ../src/aliases.c:198 ../src/aliases.c:199 #: ../src/aliases.c:200 ../src/macros.c:167 ../src/timers.c:226 #: ../src/timers.c:227 ../src/hooks.c:206 ../src/perlscript.c:3382 msgid "n" msgstr "" #: ../src/triggers.c:361 ../src/kildclient.ui:1978 ../src/kildclient.ui:2015 msgid "No" msgstr "" #: ../src/triggers.c:361 ../src/kildclient.ui:1981 ../src/kildclient.ui:2018 msgid "Yes" msgstr "" #: ../src/aliases.c:176 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "" #: ../src/macros.c:143 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "" #: ../src/timers.c:195 msgid "Num Ena Temp Int " msgstr "" #: ../src/timers.c:199 msgid "Count " msgstr "" #: ../src/permanentvariables.c:125 #, c-format msgid "" "Could not open file '%s': %s\n" "Variables were not saved." msgstr "" #: ../src/hooks.c:60 #, c-format msgid "hook: hook '%s' not found\n" msgstr "" #: ../src/hooks.c:76 ../src/hooks.c:229 msgid "No such hook" msgstr "" #: ../src/hooks.c:178 ../src/hooks.c:224 msgid "Hook not found" msgstr "" #: ../src/hooks.c:191 #, c-format msgid "Hooks for '%s':\n" msgstr "" #: ../src/hooks.c:192 msgid "Num Ena Action" msgstr "" #: ../src/hooks.c:234 #, c-format msgid "" "Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" #: ../src/hooks.c:240 ../src/perlscript.c:1697 ../src/perlscript.c:2197 #: ../src/perlscript.c:2507 ../src/perlscript.c:2796 msgid "Not set" msgstr "" #: ../src/hooks.c:242 ../src/perlscript.c:1700 ../src/perlscript.c:1701 #: ../src/perlscript.c:1702 ../src/perlscript.c:1703 ../src/perlscript.c:1704 #: ../src/perlscript.c:1705 ../src/perlscript.c:1706 ../src/perlscript.c:2200 #: ../src/perlscript.c:2201 ../src/perlscript.c:2202 ../src/perlscript.c:2510 #: ../src/perlscript.c:2800 ../src/perlscript.c:2801 ../src/perlscript.c:3420 msgid "yes" msgstr "" #: ../src/hooks.c:242 ../src/perlscript.c:1700 ../src/perlscript.c:1701 #: ../src/perlscript.c:1702 ../src/perlscript.c:1703 ../src/perlscript.c:1704 #: ../src/perlscript.c:1705 ../src/perlscript.c:1706 ../src/perlscript.c:2200 #: ../src/perlscript.c:2201 ../src/perlscript.c:2202 ../src/perlscript.c:2510 #: ../src/perlscript.c:2800 ../src/perlscript.c:2801 ../src/perlscript.c:3420 msgid "no" msgstr "" #: ../src/log.c:105 msgid "File name not specified." msgstr "" #: ../src/log.c:171 #, c-format msgid "Could not open log file: %s." msgstr "" #: ../src/plugins.c:102 ../src/plugins.c:161 #, c-format msgid "Failed loading file %s: %s" msgstr "" #: ../src/cmdhistory.c:277 msgid "No command selected." msgstr "" #: ../src/cmdhistory.c:289 msgid "More than one command selected." msgstr "" #: ../src/cmdhistory.c:483 msgid "Enter some text to search for." msgstr "" #: ../src/cmdhistory.c:516 msgid "Use the Find button to find the first result." msgstr "" #: ../src/cmdhistory.c:573 msgid "Command not found." msgstr "" #: ../src/perlscript.c:512 ../src/perlscript.c:518 ../src/perlscript.c:525 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "" #: ../src/perlscript.c:679 ../src/perlscript.c:696 ../src/perlscript.c:758 #: ../src/perlscript.c:791 ../src/perlscript.c:1192 ../src/perlscript.c:1217 #: ../src/perlscript.c:1318 ../src/perlscript.c:1338 ../src/perlscript.c:1361 #: ../src/perlscript.c:1389 ../src/perlscript.c:1398 ../src/perlscript.c:1938 #: ../src/perlscript.c:1947 ../src/perlscript.c:2126 ../src/perlscript.c:2297 #: ../src/perlscript.c:2306 ../src/perlscript.c:2586 ../src/perlscript.c:2595 #: ../src/perlscript.c:2871 ../src/perlscript.c:2925 ../src/perlscript.c:2970 #: ../src/perlscript.c:3035 ../src/perlscript.c:3046 ../src/perlscript.c:3138 #: ../src/perlscript.c:3469 ../src/kcwin.c:96 #, c-format msgid "%s: Too few arguments" msgstr "" #: ../src/perlscript.c:724 #, c-format msgid "%s: Argument must be numeric" msgstr "" #: ../src/perlscript.c:772 ../src/perlscript.c:804 #, c-format msgid "%s: No such world" msgstr "" #: ../src/perlscript.c:839 msgid "World saved." msgstr "" #: ../src/perlscript.c:1088 ../src/perlscript.c:1103 ../src/perlscript.c:1113 #: ../src/perlscript.c:1274 ../share/kildclient.pl:1303 #, c-format, perl-format msgid "%s: This is an internal function, do not call directly." msgstr "" #: ../src/perlscript.c:1092 ../src/perlscript.c:1520 ../src/perlscript.c:2049 #: ../src/perlscript.c:2422 ../src/perlscript.c:2617 ../src/perlscript.c:3099 #, c-format msgid "%s: Wrong argument type" msgstr "" #: ../src/perlscript.c:1284 ../src/perlscript.c:1290 #, c-format msgid "Protocol %s not enabled." msgstr "" #: ../src/perlscript.c:1295 ../share/kildclient.pl:1151 msgid "Unknown protocol" msgstr "" #: ../src/perlscript.c:1412 ../src/perlscript.c:1680 msgid "No such trigger" msgstr "" #: ../src/perlscript.c:1430 ../src/perlscript.c:1979 ../src/perlscript.c:2351 #: ../src/perlscript.c:3058 #, c-format msgid "%s: Too many string arguments" msgstr "" #: ../src/perlscript.c:1453 ../src/perlscript.c:2002 #, c-format msgid "%s: pattern given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:1465 ../src/perlscript.c:2400 ../src/perlscript.c:3078 #, c-format msgid "%s: action given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:1511 ../src/perlscript.c:2040 ../src/perlscript.c:2413 #: ../src/perlscript.c:3091 #, c-format msgid "%s: Wrong type of reference" msgstr "" #: ../src/perlscript.c:1531 #, c-format msgid "%s: pattern not specified, not creating" msgstr "" #: ../src/perlscript.c:1540 #, c-format msgid "%s: action not specified, and isn't gag, not creating" msgstr "" #: ../src/perlscript.c:1569 msgid "Trigger added." msgstr "" #: ../src/perlscript.c:1574 msgid "Trigger modified." msgstr "" #: ../src/perlscript.c:1599 #, c-format msgid "%s: invalid target" msgstr "" #: ../src/perlscript.c:1609 #, c-format msgid "%s: invalid fg color" msgstr "" #: ../src/perlscript.c:1619 #, c-format msgid "%s: invalid bg color" msgstr "" #: ../src/perlscript.c:1629 #, c-format msgid "%s: invalid underline style" msgstr "" #: ../src/perlscript.c:1685 #, c-format msgid "" "Trigger number %d\n" " Name: %s\n" " Pattern: %s\n" " Action: %s\n" " Enabled: %s\n" " Ignore case: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Keep executing: %s\n" " Rewriter: %s\n" " Change style: %s\n" msgstr "" #: ../src/perlscript.c:1709 #, c-format msgid "" " Target: %d\n" " Foreground: %d\n" " Background: %d\n" " Italics: %d\n" " Striked-thru: %d\n" " Underline: %d\n" msgstr "" #: ../src/perlscript.c:1961 ../src/perlscript.c:2184 msgid "No such alias" msgstr "" #: ../src/perlscript.c:2014 #, c-format msgid "%s: substitution given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:2060 msgid "alias: not creating alias without pattern" msgstr "" #: ../src/perlscript.c:2068 msgid "alias: not creating alias without substitution" msgstr "" #: ../src/perlscript.c:2096 msgid "Alias added." msgstr "" #: ../src/perlscript.c:2101 msgid "Alias modified." msgstr "" #: ../src/perlscript.c:2189 #, c-format msgid "" "Alias number %d\n" " Name: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Ignore case: %s\n" " Eval as Perl: %s\n" " Enabled: %s\n" msgstr "" #: ../src/perlscript.c:2269 msgid "Press a key to get its keycode." msgstr "" #: ../src/perlscript.c:2321 msgid "macro: No such macro" msgstr "" #: ../src/perlscript.c:2340 ../src/perlscript.c:2388 #, c-format msgid "%s: Invalid key code" msgstr "" #: ../src/perlscript.c:2377 #, c-format msgid "%s: keycode given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:2433 #, c-format msgid "%s: keycode not specified, not creating" msgstr "" #: ../src/perlscript.c:2440 ../src/perlscript.c:2708 #, c-format msgid "%s: action not specified, not creating" msgstr "" #: ../src/perlscript.c:2459 msgid "Macro added." msgstr "" #: ../src/perlscript.c:2464 msgid "Macro modified." msgstr "" #: ../src/perlscript.c:2495 msgid "No such macro" msgstr "" #: ../src/perlscript.c:2501 #, c-format msgid "" "Macro number %d\n" " Name: %s\n" " Key Code: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" #: ../src/perlscript.c:2611 msgid "timer: No such timer" msgstr "" #: ../src/perlscript.c:2636 #, c-format msgid "%s: interval must be numeric" msgstr "" #: ../src/perlscript.c:2649 #, c-format msgid "%s: count must be numeric" msgstr "" #: ../src/perlscript.c:2680 #, c-format msgid "%s: interval not specified, not creating" msgstr "" #: ../src/perlscript.c:2687 #, c-format msgid "%s: cannot create timer with negative interval" msgstr "" #: ../src/perlscript.c:2748 msgid "Timer added." msgstr "" #: ../src/perlscript.c:2753 msgid "Timer modified." msgstr "" #: ../src/perlscript.c:2783 msgid "No such timer" msgstr "" #: ../src/perlscript.c:2788 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %.3f\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" #: ../src/perlscript.c:2879 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" #: ../src/perlscript.c:2888 #, c-format msgid "%s: %s is already permanent" msgstr "" #: ../src/perlscript.c:2902 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "" #: ../src/perlscript.c:2944 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "" #: ../src/perlscript.c:2948 #, c-format msgid "%s: %s is not permanent" msgstr "" #: ../src/perlscript.c:3001 msgid "Permanent variables" msgstr "" #: ../src/perlscript.c:3113 msgid "Hook defined." msgstr "" #: ../src/perlscript.c:3117 msgid "Hook modified." msgstr "" #: ../src/perlscript.c:3223 msgid "Logging stopped." msgstr "" #: ../src/perlscript.c:3361 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "" #: ../src/perlscript.c:3404 msgid "No such plugin" msgstr "" #: ../src/perlscript.c:3409 #, c-format msgid "" "Plugin number %d\n" " Name: %s\n" " Version: %s\n" " Description: %s\n" " Author: %s\n" " Enabled: %s\n" msgstr "" #: ../src/kildclient.ui:21 msgid "Edit Timer" msgstr "" #: ../src/kildclient.ui:88 ../src/kildclient.ui:351 ../src/kildclient.ui:628 #: ../src/kildclient.ui:783 ../src/kildclient.ui:956 ../src/kildclient.ui:1173 #: ../src/dlgEditWorld.ui:240 ../src/dlgEditWorld.ui:3498 msgid "_Name:" msgstr "" #: ../src/kildclient.ui:100 msgid "Enter optionally a descriptive name for the timer" msgstr "" #: ../src/kildclient.ui:114 msgid "_Interval:" msgstr "" #: ../src/kildclient.ui:132 msgid "Specify the interval, in seconds, between timer activations" msgstr "" #: ../src/kildclient.ui:150 msgid "seconds" msgstr "" #: ../src/kildclient.ui:169 msgid "_Repeat count:" msgstr "" #: ../src/kildclient.ui:187 msgid "" "Specify how many times this timer should run before being disabled or deleted" msgstr "" #: ../src/kildclient.ui:204 msgid "(-1 to repeat indefinitely)" msgstr "" #: ../src/kildclient.ui:223 ../src/kildclient.ui:809 ../src/kildclient.ui:1021 #: ../src/kildclient.ui:1238 msgid "_Action:" msgstr "" #: ../src/kildclient.ui:235 msgid "Enter the action to be executed whenever the timer fires" msgstr "" #: ../src/kildclient.ui:245 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "" #: ../src/kildclient.ui:249 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" #: ../src/kildclient.ui:262 ../src/kildclient.ui:457 ../src/kildclient.ui:831 #: ../src/kildclient.ui:1043 ../src/kildclient.ui:1373 msgid "_Enabled" msgstr "" #: ../src/kildclient.ui:266 msgid "Check to make the timer enabled; only enabled timers are run" msgstr "" #: ../src/kildclient.ui:282 ../src/kildclient.ui:477 ../src/kildclient.ui:851 #: ../src/kildclient.ui:1063 ../src/kildclient.ui:1393 msgid "Note:" msgstr "" #: ../src/kildclient.ui:295 ../src/kildclient.ui:490 ../src/kildclient.ui:864 #: ../src/kildclient.ui:1076 ../src/kildclient.ui:1406 msgid "" "This object belongs to a plugin. Changes made here will not be saved " "in the plugin." msgstr "" #: ../src/kildclient.ui:327 msgid "Edit Alias" msgstr "" #: ../src/kildclient.ui:363 msgid "Enter optionally a descriptive name for the alias" msgstr "" #: ../src/kildclient.ui:377 ../src/kildclient.ui:1198 msgid "_Pattern:" msgstr "" #: ../src/kildclient.ui:389 msgid "Enter the pattern to match against typed commands" msgstr "" #: ../src/kildclient.ui:399 ../src/kildclient.ui:1220 msgid "_Ignore case when matching" msgstr "" #: ../src/kildclient.ui:417 msgid "_Substitution:" msgstr "" #: ../src/kildclient.ui:430 msgid "Enter the substitution to be executed" msgstr "" #: ../src/kildclient.ui:440 msgid "E_val substitution as Perl statement" msgstr "" #: ../src/kildclient.ui:444 msgid "Check to have the substitution be executed in a s///e construction" msgstr "" #: ../src/kildclient.ui:461 msgid "Check to make the alias enabled; only enabled aliases are tried" msgstr "" #: ../src/kildclient.ui:561 msgid "Edit Character Information" msgstr "" #: ../src/kildclient.ui:640 msgid "Enter the character's name for automatic login" msgstr "" #: ../src/kildclient.ui:654 msgid "_Password:" msgstr "" #: ../src/kildclient.ui:667 msgid "Enter the character's password for automatic login" msgstr "" #: ../src/kildclient.ui:692 msgid "Edit Hook" msgstr "" #: ../src/kildclient.ui:759 msgid "Event:" msgstr "" #: ../src/kildclient.ui:795 msgid "Enter optionally a descriptive name for the hook" msgstr "" #: ../src/kildclient.ui:821 msgid "Enter the action to be run when the event happens" msgstr "" #: ../src/kildclient.ui:835 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "" #: ../src/kildclient.ui:889 msgid "Edit Macro" msgstr "" #: ../src/kildclient.ui:968 msgid "Enter optionally a descriptive name for the macro" msgstr "" #: ../src/kildclient.ui:982 msgid "_Key:" msgstr "" #: ../src/kildclient.ui:994 msgid "Press the key that will be used to run the macro" msgstr "" #: ../src/kildclient.ui:1008 msgid "" "Press the key that will be used to activate the macro while the cursor is in " "the text box." msgstr "" #: ../src/kildclient.ui:1033 msgid "Enter the action to be run when the key is pressed" msgstr "" #: ../src/kildclient.ui:1047 msgid "Check to make the macro enabled; only enabled macros are run" msgstr "" #: ../src/kildclient.ui:1104 ../src/kildclient.ui:2154 msgid "Enter optionally a descriptive name for the trigger" msgstr "" #: ../src/kildclient.ui:1105 msgid "Edit Trigger" msgstr "" #: ../src/kildclient.ui:1210 msgid "Enter the pattern to match against received lines" msgstr "" #: ../src/kildclient.ui:1250 msgid "Enter the action that will be run when a match happens" msgstr "" #: ../src/kildclient.ui:1260 msgid "Omit (_gag) from output" msgstr "" #: ../src/kildclient.ui:1264 msgid "Check to make the matched line not be printed in the main output window" msgstr "" #: ../src/kildclient.ui:1277 msgid "Omit (gag) from _log file" msgstr "" #: ../src/kildclient.ui:1281 msgid "Check to make the matched line not be printed in the log file" msgstr "" #: ../src/kildclient.ui:1294 msgid "_Keep executing other triggers after this this one matches" msgstr "" #: ../src/kildclient.ui:1298 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" #: ../src/kildclient.ui:1311 msgid "_Rewriter trigger" msgstr "" #: ../src/kildclient.ui:1315 msgid "Check to make this trigger a rewriter trigger" msgstr "" #: ../src/kildclient.ui:1333 msgid "C_hange style" msgstr "" #: ../src/kildclient.ui:1350 msgid "C_onfigure..." msgstr "" #: ../src/kildclient.ui:1377 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" #: ../src/kildclient.ui:1434 msgid "Permenent variable" msgstr "" #: ../src/kildclient.ui:1497 msgid "_Name of variable to make permanent:" msgstr "" #: ../src/kildclient.ui:1511 msgid "" "Enter the name of a scalar ($), array (@) or hash (%) variable whose " "contents are to be saved between sessions of the World" msgstr "" #: ../src/kildclient.ui:1616 msgid "Permanent Variables" msgstr "" #: ../src/kildclient.ui:1631 msgid "OnConnect Hooks" msgstr "" #: ../src/kildclient.ui:1646 msgid "OnDisconnect Hooks" msgstr "" #: ../src/kildclient.ui:1661 msgid "OnReceivedText Hooks" msgstr "" #: ../src/kildclient.ui:1676 msgid "OnSentCommand Hooks" msgstr "" #: ../src/kildclient.ui:1691 msgid "OnGetFocus Hooks" msgstr "" #: ../src/kildclient.ui:1706 msgid "OnLoseFocus Hooks" msgstr "" #: ../src/kildclient.ui:1721 msgid "OnCloseConnected Hooks" msgstr "" #: ../src/kildclient.ui:1746 msgid "_Items to export" msgstr "" #: ../src/kildclient.ui:1833 ../src/dlgSelectWorld.ui:114 #: ../src/dlgEditWorld.ui:707 msgid "_New" msgstr "" #: ../src/kildclient.ui:1847 ../src/wndmain.ui:158 #: ../src/dlgSelectWorld.ui:128 ../src/dlgEditWorld.ui:723 msgid "_Edit" msgstr "" #: ../src/kildclient.ui:1862 ../src/wndmain.ui:199 #: ../src/dlgSelectWorld.ui:142 ../src/dlgEditWorld.ui:739 msgid "_Delete" msgstr "" #: ../src/kildclient.ui:1877 msgid "_Import" msgstr "" #: ../src/kildclient.ui:1891 msgid "E_xport" msgstr "" #: ../src/kildclient.ui:1906 ../src/dlgEditWorld.ui:755 #: ../src/dlgEditWorld.ui:4146 msgid "_Up" msgstr "" #: ../src/kildclient.ui:1921 ../src/dlgEditWorld.ui:4162 msgid "_Down" msgstr "" #: ../src/kildclient.ui:1975 ../src/kildclient.ui:1992 #: ../src/kildclient.ui:2012 ../src/kildclient.ui:2029 #: ../src/kildclient.ui:2094 msgid "Do not change" msgstr "" #: ../src/kildclient.ui:1998 msgid "Single" msgstr "" #: ../src/kildclient.ui:2001 msgid "Double" msgstr "" #: ../src/kildclient.ui:2032 ../src/kildclient.ui:2097 #: ../src/dlgPreferences.ui:23 msgid "Black" msgstr "" #: ../src/kildclient.ui:2035 ../src/kildclient.ui:2100 #: ../src/dlgPreferences.ui:26 msgid "Red" msgstr "" #: ../src/kildclient.ui:2038 ../src/kildclient.ui:2103 #: ../src/dlgPreferences.ui:29 msgid "Green" msgstr "" #: ../src/kildclient.ui:2041 ../src/kildclient.ui:2106 #: ../src/dlgPreferences.ui:32 msgid "Yellow" msgstr "" #: ../src/kildclient.ui:2044 ../src/kildclient.ui:2109 #: ../src/dlgPreferences.ui:35 msgid "Blue" msgstr "" #: ../src/kildclient.ui:2047 ../src/kildclient.ui:2112 #: ../src/dlgPreferences.ui:38 msgid "Magenta" msgstr "" #: ../src/kildclient.ui:2050 ../src/kildclient.ui:2115 #: ../src/dlgPreferences.ui:41 msgid "Cyan" msgstr "" #: ../src/kildclient.ui:2053 ../src/kildclient.ui:2118 #: ../src/dlgPreferences.ui:44 msgid "White" msgstr "" #: ../src/kildclient.ui:2056 ../src/kildclient.ui:2121 #: ../src/dlgPreferences.ui:47 msgid "Default" msgstr "" #: ../src/kildclient.ui:2059 ../src/kildclient.ui:2124 #: ../src/dlgPreferences.ui:50 msgid "Black (bold)" msgstr "" #: ../src/kildclient.ui:2062 ../src/kildclient.ui:2127 #: ../src/dlgPreferences.ui:53 msgid "Red (bold)" msgstr "" #: ../src/kildclient.ui:2065 ../src/kildclient.ui:2130 #: ../src/dlgPreferences.ui:56 msgid "Green (bold)" msgstr "" #: ../src/kildclient.ui:2068 ../src/kildclient.ui:2133 #: ../src/dlgPreferences.ui:59 msgid "Yellow (bold)" msgstr "" #: ../src/kildclient.ui:2071 ../src/kildclient.ui:2136 #: ../src/dlgPreferences.ui:62 msgid "Blue (bold)" msgstr "" #: ../src/kildclient.ui:2074 ../src/kildclient.ui:2139 #: ../src/dlgPreferences.ui:65 msgid "Magenta (bold)" msgstr "" #: ../src/kildclient.ui:2077 ../src/kildclient.ui:2142 #: ../src/dlgPreferences.ui:68 msgid "Cyan (bold)" msgstr "" #: ../src/kildclient.ui:2080 ../src/kildclient.ui:2145 #: ../src/dlgPreferences.ui:71 msgid "White (bold)" msgstr "" #: ../src/kildclient.ui:2083 ../src/kildclient.ui:2148 #: ../src/dlgPreferences.ui:74 msgid "Default (bold)" msgstr "" #: ../src/kildclient.ui:2155 msgid "Change Style" msgstr "" #: ../src/kildclient.ui:2221 msgid "_Apply to:" msgstr "" #: ../src/kildclient.ui:2234 msgid "_Foreground:" msgstr "" #: ../src/kildclient.ui:2264 msgid "_Background:" msgstr "" #: ../src/kildclient.ui:2294 msgid "_Italic:" msgstr "" #: ../src/kildclient.ui:2324 msgid "_Striked-thru:" msgstr "" #: ../src/kildclient.ui:2354 msgid "_Underline:" msgstr "" #: ../src/kildclient.ui:2386 msgid "The whole line" msgstr "" #: ../src/kildclient.ui:2402 msgid "The whole matched text" msgstr "" #: ../src/kildclient.ui:2424 msgid "The matched substring number" msgstr "" #: ../src/wndmain.ui:24 msgid "_World" msgstr "" #: ../src/wndmain.ui:35 msgid "_Open..." msgstr "" #: ../src/wndmain.ui:45 msgid "_Reconnect" msgstr "" #: ../src/wndmain.ui:54 msgid "_Disconnect" msgstr "" #: ../src/wndmain.ui:63 msgid "Connect to _Another..." msgstr "" #: ../src/wndmain.ui:87 msgid "_Edit..." msgstr "" #: ../src/wndmain.ui:106 msgid "S_tatistics..." msgstr "" #: ../src/wndmain.ui:121 ../src/wndmain.ui:257 msgid "_Previous" msgstr "" #: ../src/wndmain.ui:130 ../src/wndmain.ui:267 msgid "_Next" msgstr "" #: ../src/wndmain.ui:169 msgid "Cu_t" msgstr "" #: ../src/wndmain.ui:179 msgid "_Copy" msgstr "" #: ../src/wndmain.ui:189 msgid "_Paste" msgstr "" #: ../src/wndmain.ui:214 ../src/dlgCmdHistory.ui:69 msgid "_Find" msgstr "" #: ../src/wndmain.ui:224 ../src/wndmain.ui:287 msgid "Find N_ext" msgstr "" #: ../src/wndmain.ui:238 msgid "_Input" msgstr "" #: ../src/wndmain.ui:248 ../src/dlgEditWorld.ui:3850 ../src/dlgMLSend.ui:147 msgid "_Clear" msgstr "" #: ../src/wndmain.ui:277 msgid "Find P_revious" msgstr "" #: ../src/wndmain.ui:297 msgid "Command _History..." msgstr "" #: ../src/wndmain.ui:313 msgid "_Multi-line Send..." msgstr "" #: ../src/wndmain.ui:329 msgid "_Test Triggers..." msgstr "" #: ../src/wndmain.ui:342 msgid "_Preferences" msgstr "" #: ../src/wndmain.ui:353 msgid "Disable _Triggers" msgstr "" #: ../src/wndmain.ui:363 msgid "Disable _Aliases" msgstr "" #: ../src/wndmain.ui:373 msgid "Disable _Macros" msgstr "" #: ../src/wndmain.ui:383 msgid "Disable T_imers" msgstr "" #: ../src/wndmain.ui:399 msgid "_Debug Matches" msgstr "" #: ../src/wndmain.ui:414 msgid "_Preferences..." msgstr "" #: ../src/wndmain.ui:423 msgid "Edit Default _World..." msgstr "" #: ../src/wndmain.ui:436 msgid "_Display" msgstr "" #: ../src/wndmain.ui:447 msgid "_Split Window" msgstr "" #: ../src/wndmain.ui:461 ../src/dlgEditWorld.ui:3998 msgid "_Help" msgstr "" #: ../src/wndmain.ui:471 msgid "_Manual" msgstr "" #: ../src/wndmain.ui:481 msgid "_About" msgstr "" #: ../src/dlgSelectWorld.ui:8 msgid "Connect to" msgstr "" #: ../src/dlgSelectWorld.ui:39 msgid "C_onnect" msgstr "" #: ../src/dlgSelectWorld.ui:62 msgid "_Select a saved world:" msgstr "" #: ../src/dlgSelectWorld.ui:176 msgid "Or connect d_irectly:" msgstr "" #: ../src/dlgSelectWorld.ui:204 ../src/dlgEditWorld.ui:254 msgid "_Host:" msgstr "" #: ../src/dlgSelectWorld.ui:218 ../src/dlgEditWorld.ui:268 msgid "_Port:" msgstr "" #: ../src/dlgPreferences.ui:85 ../src/dlgEditWorld.ui:82 msgid "No proxy" msgstr "" #: ../src/dlgPreferences.ui:88 ../src/dlgEditWorld.ui:85 msgid "SOCKS4" msgstr "" #: ../src/dlgPreferences.ui:91 ../src/dlgEditWorld.ui:88 msgid "SOCKS5" msgstr "" #: ../src/dlgPreferences.ui:94 ../src/dlgEditWorld.ui:91 msgid "HTTP" msgstr "" #: ../src/dlgPreferences.ui:105 msgid "Left" msgstr "" #: ../src/dlgPreferences.ui:108 msgid "Right" msgstr "" #: ../src/dlgPreferences.ui:111 msgid "Top" msgstr "" #: ../src/dlgPreferences.ui:114 msgid "Bottom" msgstr "" #: ../src/dlgPreferences.ui:120 msgid "Preferences" msgstr "" #: ../src/dlgPreferences.ui:180 msgid "Colors used by KildClient" msgstr "" #: ../src/dlgPreferences.ui:216 msgid "_Informative messages:" msgstr "" #: ../src/dlgPreferences.ui:248 msgid "_Command echo:" msgstr "" #: ../src/dlgPreferences.ui:308 msgid "Window configuration" msgstr "" #: ../src/dlgPreferences.ui:344 msgid "_Tab position:" msgstr "" #: ../src/dlgPreferences.ui:374 msgid "_Hide tabs if only one world is open" msgstr "" #: ../src/dlgPreferences.ui:379 msgid "" "If this is checked, when there is only one open world no tabs will be shown" msgstr "" #: ../src/dlgPreferences.ui:393 msgid "_Flash window when new text is received" msgstr "" #: ../src/dlgPreferences.ui:435 msgid "Appearance" msgstr "" #: ../src/dlgPreferences.ui:459 msgid "Sending Delays" msgstr "" #: ../src/dlgPreferences.ui:495 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "" #: ../src/dlgPreferences.ui:512 msgid "_Number of lines/commands to send at once:" msgstr "" #: ../src/dlgPreferences.ui:553 msgid "_Delay between each group of lines/commands:" msgstr "" #: ../src/dlgPreferences.ui:616 msgid "Sending" msgstr "" #: ../src/dlgPreferences.ui:641 msgid "Web Browser" msgstr "" #: ../src/dlgPreferences.ui:677 msgid "Specify the command used to launch a web browser" msgstr "" #: ../src/dlgPreferences.ui:692 msgid "" "Enter the command to run a web browser. %s will be substituted by the web " "page address." msgstr "" #: ../src/dlgPreferences.ui:734 msgid "Audio Player" msgstr "" #: ../src/dlgPreferences.ui:770 msgid "Specify the command used to play sound files." msgstr "" #: ../src/dlgPreferences.ui:785 msgid "" "Enter the command to run an audio player program. %s will be substituted by " "the file path." msgstr "" #: ../src/dlgPreferences.ui:824 msgid "External Programs" msgstr "" #: ../src/dlgPreferences.ui:850 ../src/dlgEditWorld.ui:370 msgid "Proxy" msgstr "" #: ../src/dlgPreferences.ui:890 ../src/dlgEditWorld.ui:410 msgid "Proxy _type:" msgstr "" #: ../src/dlgPreferences.ui:936 ../src/dlgEditWorld.ui:456 msgid "Server _address:" msgstr "" #: ../src/dlgPreferences.ui:949 ../src/dlgEditWorld.ui:515 msgid "_Username:" msgstr "" #: ../src/dlgPreferences.ui:984 ../src/dlgEditWorld.ui:480 msgid "Server _port:" msgstr "" #: ../src/dlgPreferences.ui:997 ../src/dlgEditWorld.ui:528 msgid "Pass_word:" msgstr "" #: ../src/dlgPreferences.ui:1065 msgid "Proxy" msgstr "" #: ../src/dlgStatistics.ui:8 msgid "Statistics" msgstr "" #: ../src/dlgStatistics.ui:56 ../src/dlgStatistics.ui:68 #: ../src/dlgStatistics.ui:223 ../src/dlgStatistics.ui:349 #: ../src/dlgStatistics.ui:467 ../src/dlgStatistics.ui:479 #: ../src/dlgStatistics.ui:491 ../src/dlgStatistics.ui:503 #: ../src/dlgStatistics.ui:515 ../src/dlgStatistics.ui:539 #: ../src/dlgStatistics.ui:575 ../src/dlgStatistics.ui:587 #: ../src/dlgStatistics.ui:611 ../src/dlgStatistics.ui:647 #: ../src/dlgStatistics.ui:659 msgid "N/A" msgstr "" #: ../src/dlgStatistics.ui:80 msgid "Proxy port:" msgstr "" #: ../src/dlgStatistics.ui:92 msgid "Proxy host:" msgstr "" #: ../src/dlgStatistics.ui:116 msgid "Proxy type:" msgstr "" #: ../src/dlgStatistics.ui:128 msgid "World name:" msgstr "" #: ../src/dlgStatistics.ui:140 msgid "Host:" msgstr "" #: ../src/dlgStatistics.ui:152 msgid "Port:" msgstr "" #: ../src/dlgStatistics.ui:164 msgid "Connection time:" msgstr "" #: ../src/dlgStatistics.ui:176 msgid "Idle time:" msgstr "" #: ../src/dlgStatistics.ui:199 msgid "Compression used:" msgstr "" #: ../src/dlgStatistics.ui:211 msgid "Bytes received (compressed):" msgstr "" #: ../src/dlgStatistics.ui:235 msgid "Bytes received (decompressed):" msgstr "" #: ../src/dlgStatistics.ui:247 msgid "Compression ratio:" msgstr "" #: ../src/dlgStatistics.ui:259 msgid "Lines received:" msgstr "" #: ../src/dlgStatistics.ui:383 msgid "Key exchange:" msgstr "" #: ../src/dlgStatistics.ui:395 msgid "SSL protocol used:" msgstr "" #: ../src/dlgStatistics.ui:407 msgid "Compression algorithm:" msgstr "" #: ../src/dlgStatistics.ui:419 msgid "Certificate type:" msgstr "" #: ../src/dlgStatistics.ui:431 msgid "Cipher:" msgstr "" #: ../src/dlgStatistics.ui:443 msgid "MAC:" msgstr "" #: ../src/dlgStatistics.ui:455 msgid "SSL not supported in this version" msgstr "" #: ../src/dlgStatistics.ui:527 msgid "Hostname:" msgstr "" #: ../src/dlgStatistics.ui:551 msgid "Valid since:" msgstr "" #: ../src/dlgStatistics.ui:563 msgid "Expiration:" msgstr "" #: ../src/dlgStatistics.ui:599 msgid "Fingerprint:" msgstr "" #: ../src/dlgStatistics.ui:623 msgid "Subject's DN:" msgstr "" #: ../src/dlgStatistics.ui:635 msgid "Issuer's DN:" msgstr "" #: ../src/dlgAbout.ui:12 msgid "A mud client with powerful features and support for Perl Scripting" msgstr "" #: ../src/dlgAbout.ui:14 msgid "Visit http://www.kildclient.org" msgstr "" #: ../src/dlgEditWorld.ui:62 msgid "No auto-login" msgstr "" #: ../src/dlgEditWorld.ui:79 msgid "Use global settings" msgstr "" #: ../src/dlgEditWorld.ui:98 msgid "Edit World" msgstr "" #: ../src/dlgEditWorld.ui:203 msgid "Connection" msgstr "" #: ../src/dlgEditWorld.ui:281 msgid "Enter a descriptive name for the World" msgstr "" #: ../src/dlgEditWorld.ui:295 msgid "Enter the host to connect to" msgstr "" #: ../src/dlgEditWorld.ui:309 msgid "Enter the port used when connecting" msgstr "" #: ../src/dlgEditWorld.ui:321 msgid "Use _SSL" msgstr "" #: ../src/dlgEditWorld.ui:587 msgid "Auto-login" msgstr "" #: ../src/dlgEditWorld.ui:628 msgid "Connection _style:" msgstr "" #: ../src/dlgEditWorld.ui:668 msgid "Ch_aracters in this mud:" msgstr "" #: ../src/dlgEditWorld.ui:771 msgid "D_elete" msgstr "" #: ../src/dlgEditWorld.ui:842 ../src/dlgEditWorld.ui:2048 #: ../src/dlgEditWorld.ui:2992 msgid "Font" msgstr "" #: ../src/dlgEditWorld.ui:879 msgid "Select the font used in the _main screen:" msgstr "" #: ../src/dlgEditWorld.ui:895 msgid "Select the font used in the main output screen" msgstr "" #: ../src/dlgEditWorld.ui:907 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "" #: ../src/dlgEditWorld.ui:912 msgid "" "Check if you want the highlighted ANSI colors to be displayed in bold also" msgstr "" #: ../src/dlgEditWorld.ui:956 msgid "Word Wrap" msgstr "" #: ../src/dlgEditWorld.ui:989 msgid "_Wrap lines at word boundaries" msgstr "" #: ../src/dlgEditWorld.ui:994 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "" #: ../src/dlgEditWorld.ui:1016 msgid "_Indent wrapped lines by" msgstr "" #: ../src/dlgEditWorld.ui:1046 msgid "pixels" msgstr "" #: ../src/dlgEditWorld.ui:1064 msgid "Wrap lines at full _screen width" msgstr "" #: ../src/dlgEditWorld.ui:1087 msgid "Maximum line width in _characters:" msgstr "" #: ../src/dlgEditWorld.ui:1157 msgid "Tooltips" msgstr "" #: ../src/dlgEditWorld.ui:1191 msgid "Display _tooltips with the time when the line was received" msgstr "" #: ../src/dlgEditWorld.ui:1196 msgid "" "Check if you want tooltips to be displayed showing the time when a line was " "received if you leave the mouse over the line for a short while" msgstr "" #: ../src/dlgEditWorld.ui:1262 msgid "Ansi Colors" msgstr "" #: ../src/dlgEditWorld.ui:1395 msgid "_Black" msgstr "" #: ../src/dlgEditWorld.ui:1409 msgid "R_ed" msgstr "" #: ../src/dlgEditWorld.ui:1423 msgid "_Green" msgstr "" #: ../src/dlgEditWorld.ui:1437 msgid "_Yellow" msgstr "" #: ../src/dlgEditWorld.ui:1451 msgid "B_lue" msgstr "" #: ../src/dlgEditWorld.ui:1465 msgid "_Magenta" msgstr "" #: ../src/dlgEditWorld.ui:1479 msgid "_Cyan" msgstr "" #: ../src/dlgEditWorld.ui:1493 msgid "_White" msgstr "" #: ../src/dlgEditWorld.ui:1507 msgid "Bl_ack (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1520 msgid "Re_d (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1533 msgid "G_reen (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1546 msgid "Yell_ow (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1559 msgid "Bl_ue (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1572 msgid "Magen_ta (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1585 msgid "Cya_n (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1598 msgid "W_hite (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1767 msgid "Default Colors" msgstr "" #: ../src/dlgEditWorld.ui:1828 msgid "_Foreground" msgstr "" #: ../src/dlgEditWorld.ui:1841 msgid "Bold foreground" msgstr "" #: ../src/dlgEditWorld.ui:1866 msgid "Bac_kground" msgstr "" #: ../src/dlgEditWorld.ui:1891 msgid "Bold background" msgstr "" #: ../src/dlgEditWorld.ui:1945 msgid "Revert to default colors" msgstr "" #: ../src/dlgEditWorld.ui:1979 msgid "Re_vert to default colors" msgstr "" #: ../src/dlgEditWorld.ui:1984 msgid "Click to revert all colors to their built-in defaults" msgstr "" #: ../src/dlgEditWorld.ui:2085 msgid "Select the font used in the _status bar:" msgstr "" #: ../src/dlgEditWorld.ui:2101 msgid "Select the font used in the status bar" msgstr "" #: ../src/dlgEditWorld.ui:2143 msgid "Time Display" msgstr "" #: ../src/dlgEditWorld.ui:2179 msgid "C_onnected time:" msgstr "" #: ../src/dlgEditWorld.ui:2213 ../src/dlgEditWorld.ui:2323 msgid "Do not display" msgstr "" #: ../src/dlgEditWorld.ui:2218 msgid "Select if you do not want the connection time to be displayed" msgstr "" #: ../src/dlgEditWorld.ui:2233 ../src/dlgEditWorld.ui:2343 msgid "Display as hours, minutes and seconds" msgstr "" #: ../src/dlgEditWorld.ui:2238 msgid "" "Select if you want the connection time to be displayed in hours, minutes and " "seconds" msgstr "" #: ../src/dlgEditWorld.ui:2253 ../src/dlgEditWorld.ui:2363 msgid "Display as seconds" msgstr "" #: ../src/dlgEditWorld.ui:2258 msgid "Select if you want the connection time to be displayed in seconds" msgstr "" #: ../src/dlgEditWorld.ui:2290 msgid "_Idle time:" msgstr "" #: ../src/dlgEditWorld.ui:2328 msgid "Select if you do not want the idle time to be displayed" msgstr "" #: ../src/dlgEditWorld.ui:2348 msgid "" "Select if you want the idle time to be displayed in hours, minutes and " "seconds" msgstr "" #: ../src/dlgEditWorld.ui:2368 msgid "Select if you want the idle time to be displayed in seconds" msgstr "" #: ../src/dlgEditWorld.ui:2383 msgid "Only _reset idle time counter when a command is entered directly" msgstr "" #: ../src/dlgEditWorld.ui:2388 msgid "" "Check to make the idle time counter reset only when a command is entered " "directly by typing it in the command entry box. If not checked, if a command " "is sent because of a timer, of a hook, etc, the idle timer is also reset." msgstr "" #: ../src/dlgEditWorld.ui:2468 msgid "Command Entry" msgstr "" #: ../src/dlgEditWorld.ui:2501 msgid "_Keep last typed command in command entry box" msgstr "" #: ../src/dlgEditWorld.ui:2506 msgid "" "Check to have the last command kept in the command entry box, so that you " "can repeat commands only by pressing ENTER" msgstr "" #: ../src/dlgEditWorld.ui:2519 msgid "_Echo sent commands in main window" msgstr "" #: ../src/dlgEditWorld.ui:2524 msgid "Check to have the sent commands echoed in the main output window" msgstr "" #: ../src/dlgEditWorld.ui:2537 msgid "_Store commands between sessions" msgstr "" #: ../src/dlgEditWorld.ui:2542 msgid "Check to have the command history saved in a file between sessions" msgstr "" #: ../src/dlgEditWorld.ui:2555 msgid "Never _hide the typed text" msgstr "" #: ../src/dlgEditWorld.ui:2560 msgid "" "Check this if the text you type is displayed as black dots in the input box." msgstr "" #: ../src/dlgEditWorld.ui:2581 msgid "_Number of commands to save in history:" msgstr "" #: ../src/dlgEditWorld.ui:2595 msgid "Specify the number of commands that are saved and can be later recalled" msgstr "" #: ../src/dlgEditWorld.ui:2622 msgid "C_ommand separator:" msgstr "" #: ../src/dlgEditWorld.ui:2636 msgid "Specify the separator for commands typed in the command entry box" msgstr "" #: ../src/dlgEditWorld.ui:2657 msgid "Use single-_line input bar" msgstr "" #: ../src/dlgEditWorld.ui:2697 msgid "Enable _auto-completion" msgstr "" #: ../src/dlgEditWorld.ui:2702 msgid "Check to enable command auto-completion (based on previous commands)" msgstr "" #: ../src/dlgEditWorld.ui:2723 msgid "Acti_vate auto-completion only after" msgstr "" #: ../src/dlgEditWorld.ui:2737 msgid "" "Specify the number of characters that must be typed for command completion " "to start" msgstr "" #: ../src/dlgEditWorld.ui:2752 msgid "characters have been entered" msgstr "" #: ../src/dlgEditWorld.ui:2783 msgid "Use _multi-line input bar" msgstr "" #: ../src/dlgEditWorld.ui:2830 msgid "N_umber of lines:" msgstr "" #: ../src/dlgEditWorld.ui:2868 msgid "S_pell check typed text" msgstr "" #: ../src/dlgEditWorld.ui:2905 msgid "Language code:" msgstr "" #: ../src/dlgEditWorld.ui:2931 msgid "(Leave blank for default based on locale)" msgstr "" #: ../src/dlgEditWorld.ui:3029 msgid "Select the font used in the command _entry box:" msgstr "" #: ../src/dlgEditWorld.ui:3045 msgid "Select the font used in the command entry box" msgstr "" #: ../src/dlgEditWorld.ui:3087 msgid "Flood prevention" msgstr "" #: ../src/dlgEditWorld.ui:3126 msgid "Do not allow the _same command to be sent" msgstr "" #: ../src/dlgEditWorld.ui:3131 msgid "" "Check to prevent more than a given number of equal commands to be sent in a " "row (which can disconnect your character in some muds)" msgstr "" #: ../src/dlgEditWorld.ui:3147 msgid "Specify the maximum number of equal commands that can be sent in a row" msgstr "" #: ../src/dlgEditWorld.ui:3162 msgid "_times in a row" msgstr "" #: ../src/dlgEditWorld.ui:3188 msgid "Se_nd this command:" msgstr "" #: ../src/dlgEditWorld.ui:3202 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" #: ../src/dlgEditWorld.ui:3273 msgid "Logging Status" msgstr "" #: ../src/dlgEditWorld.ui:3326 msgid "St_art" msgstr "" #: ../src/dlgEditWorld.ui:3342 msgid "_Stop" msgstr "" #: ../src/dlgEditWorld.ui:3373 msgid "_Include the last" msgstr "" #: ../src/dlgEditWorld.ui:3378 msgid "Select to include lines from the main window in the log file." msgstr "" #: ../src/dlgEditWorld.ui:3393 msgid "Inform number of lines to include in the log." msgstr "" #: ../src/dlgEditWorld.ui:3409 msgid "lines of the scrollback buffer in the log" msgstr "" #: ../src/dlgEditWorld.ui:3456 ../src/dlgEditWorld.ui:4687 msgid "File" msgstr "" #: ../src/dlgEditWorld.ui:3548 msgid "" "Note: You can use strftime() escapes to create different files based on the " "date and time that logging starts. Also, %Kw represents the World name and " "%Kc the character name used in auto-logon." msgstr "" #: ../src/dlgEditWorld.ui:3590 msgid "Options" msgstr "" #: ../src/dlgEditWorld.ui:3623 msgid "A_utomatically start logging when connected" msgstr "" #: ../src/dlgEditWorld.ui:3629 msgid "" "If this is selected, logging will be automatically started whenever you " "connect to the world." msgstr "" #: ../src/dlgEditWorld.ui:3642 msgid "Prefix lines with _date and/or time" msgstr "" #: ../src/dlgEditWorld.ui:3648 msgid "" "Select this if you want to prefix each line in the log file with the date " "and/or time it was received." msgstr "" #: ../src/dlgEditWorld.ui:3682 msgid "_Format:" msgstr "" #: ../src/dlgEditWorld.ui:3696 msgid "" "The default is to prefix lines with the date and time, but you can configure " "the format with strftime() escape sequences. See the manual for a " "description of those." msgstr "" #: ../src/dlgEditWorld.ui:3707 msgid "Revert to _default" msgstr "" #: ../src/dlgEditWorld.ui:3783 msgid "Scripting" msgstr "" #: ../src/dlgEditWorld.ui:3824 msgid "_Perl file to load:" msgstr "" #: ../src/dlgEditWorld.ui:3924 msgid "Plugins Currently Loaded" msgstr "" #: ../src/dlgEditWorld.ui:3982 msgid "_Load" msgstr "" #: ../src/dlgEditWorld.ui:4052 msgid "Plugins Loaded on Startup" msgstr "" #: ../src/dlgEditWorld.ui:4114 msgid "_Add" msgstr "" #: ../src/dlgEditWorld.ui:4130 msgid "_Remove" msgstr "" #: ../src/dlgEditWorld.ui:4238 msgid "MCCP (for compression)" msgstr "" #: ../src/dlgEditWorld.ui:4271 msgid "_Enable if server proposes after connecting" msgstr "" #: ../src/dlgEditWorld.ui:4288 msgid "Enable if server proposes at _any time" msgstr "" #: ../src/dlgEditWorld.ui:4305 msgid "_Disable" msgstr "" #: ../src/dlgEditWorld.ui:4374 msgid "Scrolling" msgstr "" #: ../src/dlgEditWorld.ui:4408 msgid "Scroll on _output" msgstr "" #: ../src/dlgEditWorld.ui:4413 msgid "" "Check to have the main window scroll to the end whenever new output comes" msgstr "" #: ../src/dlgEditWorld.ui:4434 msgid "_Lines to save in scrollback buffer:" msgstr "" #: ../src/dlgEditWorld.ui:4448 msgid "" "Specify the number of lines of output that can be seen with by scrolling the " "window" msgstr "" #: ../src/dlgEditWorld.ui:4498 msgid "Name display" msgstr "" #: ../src/dlgEditWorld.ui:4531 msgid "Identify as 'World name'" msgstr "" #: ../src/dlgEditWorld.ui:4547 msgid "Identify as 'World name - Character'" msgstr "" #: ../src/dlgEditWorld.ui:4563 msgid "Identify as 'Character - World name'" msgstr "" #: ../src/dlgEditWorld.ui:4584 msgid "Custom: " msgstr "" #: ../src/dlgEditWorld.ui:4622 msgid "" "Use %Kw to represent the World's name, and %Kc to represent the auto-logon " "character name" msgstr "" #: ../src/dlgEditWorld.ui:4726 msgid "_File:" msgstr "" #: ../src/dlgEditWorld.ui:4763 msgid "" "You can leave this field blank, and a file name will be automatically " "generated. Only edit this field if you know what you are doing." msgstr "" #: ../src/dlgEditWorld.ui:4805 msgid "Character Set" msgstr "" #: ../src/dlgEditWorld.ui:4838 msgid "Character _set:" msgstr "" #: ../src/dlgEditWorld.ui:4892 msgid "Graphical Editors" msgstr "" #: ../src/dlgEditWorld.ui:4925 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "" #: ../src/dlgEditWorld.ui:4930 ../src/dlgEditWorld.ui:5031 msgid "" "If not checked, objects such as triggers, aliases, etc. will be deleted " "directly without asking for confirmation when you press the Delete button." msgstr "" #: ../src/dlgEditWorld.ui:4944 msgid "_Show items defined by plugins" msgstr "" #: ../src/dlgEditWorld.ui:4949 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" #: ../src/dlgEditWorld.ui:4993 msgid "TCP Keep Alive" msgstr "" #: ../src/dlgEditWorld.ui:5026 msgid "Enable TCP _Keep Alive packets" msgstr "" #: ../src/dlgEditWorld.ui:5047 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "" #: ../src/dlgEditWorld.ui:5087 msgid "Input" msgstr "" #: ../src/dlgEditWorld.ui:5120 msgid "_Disable up and down arrow keys for history navigation" msgstr "" #: ../src/dlgEditWorld.ui:5125 msgid "" "If checked, the up and down arrow keys are not used for navigating between " "saved commands. (You'll have to use Alt+up and Alt+down.)" msgstr "" #: ../src/dlgTestTriggers.ui:57 msgid "Enter _line to be matched against the triggers:" msgstr "" #: ../src/dlgTestTriggers.ui:75 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" #: ../src/dlgTestTriggers.ui:86 ../src/dlgMLSend.ui:52 #: ../src/dlgCmdHistory.ui:161 msgid "_Send" msgstr "" #: ../src/dlgTestTriggers.ui:91 msgid "Click the run the triggers against the line." msgstr "" #: ../src/dlgTestTriggers.ui:129 msgid "Number of triggers that matched:" msgstr "" #: ../src/dlgTestTriggers.ui:160 msgid "Commands that would be sent:" msgstr "" #: ../src/dlgTestTriggers.ui:193 msgid "This is what would be printed in the main screen:" msgstr "" #: ../src/dlgTestTriggers.ui:205 msgid "" "This is what would be printed in the main screen. If empty, the line has " "been gaged. It can be different from the original line because of rewriter " "triggers." msgstr "" #: ../src/dlgTestTriggers.ui:223 msgid "Would this line be included in the log file?" msgstr "" #: ../src/dlgMLSend.ui:20 msgid "Multi-line send" msgstr "" #: ../src/dlgMLSend.ui:82 msgid "Send this text _initially:" msgstr "" #: ../src/dlgMLSend.ui:102 ../src/dlgMLSend.ui:193 msgid "Enter some text to be sent to the World" msgstr "" #: ../src/dlgMLSend.ui:118 msgid "Then send the _contents of this file:" msgstr "" #: ../src/dlgMLSend.ui:173 msgid "_Finally, send this text:" msgstr "" #: ../src/dlgMLSend.ui:220 msgid "Add this to the _beginning of each line:" msgstr "" #: ../src/dlgMLSend.ui:235 msgid "Specify some text to be prepended to each sent line" msgstr "" #: ../src/dlgMLSend.ui:250 msgid "Add this to the _end of each line:" msgstr "" #: ../src/dlgMLSend.ui:265 msgid "Specify some text to be appended to each sent line" msgstr "" #: ../src/dlgMLSend.ui:283 msgid "_Delay" msgstr "" #: ../src/dlgMLSend.ui:297 msgid "Specify the delay between sending the group of lines" msgstr "" #: ../src/dlgMLSend.ui:313 msgid "seconds e_ach" msgstr "" #: ../src/dlgMLSend.ui:327 msgid "Specify how many lines are sent at once" msgstr "" #: ../src/dlgMLSend.ui:342 msgid "line(s)" msgstr "" #: ../src/dlgMLSend.ui:360 msgid "_Keep dialog open after sending" msgstr "" #: ../src/dlgCmdHistory.ui:20 msgid "Command History" msgstr "" #: ../src/dlgCmdHistory.ui:75 msgid "Find a command containing a given search term" msgstr "" #: ../src/dlgCmdHistory.ui:87 msgid "Find _next" msgstr "" #: ../src/dlgCmdHistory.ui:93 msgid "Find the next command with the same match text" msgstr "" #: ../src/dlgCmdHistory.ui:124 msgid "_Recall" msgstr "" #: ../src/dlgCmdHistory.ui:130 msgid "Put the selected command in the command entry box" msgstr "" #: ../src/dlgCmdHistory.ui:143 msgid "Rec_all & Close" msgstr "" #: ../src/dlgCmdHistory.ui:149 msgid "Put the selected command in the command entry box and close this dialog" msgstr "" #: ../src/dlgCmdHistory.ui:167 msgid "Send the selected command(s) to the mud" msgstr "" #: ../src/dlgCmdHistory.ui:179 msgid "S_end & Close" msgstr "" #: ../src/dlgCmdHistory.ui:185 msgid "Send the selected command(s) to the mud and close the dialog" msgstr "" #: ../src/dlgCmdHistory.ui:224 msgid "Newest commands are on the top" msgstr "" #: ../src/dlgCmdHistory.ui:252 msgid "Dela_y" msgstr "" #: ../src/dlgCmdHistory.ui:265 msgid "Specify the delay between sending the group of commands" msgstr "" #: ../src/dlgCmdHistory.ui:282 msgid "sec_onds each" msgstr "" #: ../src/dlgCmdHistory.ui:296 msgid "Specify how many commands are sent at once" msgstr "" #: ../src/dlgCmdHistory.ui:313 msgid "commands(s)" msgstr "" #: ../src/dlgCmdHistory.ui:338 msgid "Find Command" msgstr "" #: ../src/dlgCmdHistory.ui:400 msgid "_Text to find:" msgstr "" #: ../src/dlgCmdHistory.ui:413 msgid "Enter the text to search for" msgstr "" #: ../src/dlgCmdHistory.ui:434 msgid "Search direction:" msgstr "" #: ../src/dlgCmdHistory.ui:449 msgid "_Downwards" msgstr "" #: ../src/dlgCmdHistory.ui:466 msgid "_Upwards" msgstr "" #: ../src/mnuPopupURL.ui:12 msgid "_Open link" msgstr "" #: ../src/mnuPopupURL.ui:21 msgid "_Copy link address" msgstr "" #: ../share/kildclient.pl:76 ../share/kildclient.pl:97 #: ../share/kildclient.pl:117 ../share/kildclient.pl:182 #: ../share/kildclient.pl:433 ../share/kildclient.pl:511 #: ../share/kildclient.pl:589 ../share/kildclient.pl:602 #: ../share/kildclient.pl:615 ../share/kildclient.pl:628 #: ../share/kildclient.pl:641 ../share/kildclient.pl:654 #: ../share/kildclient.pl:667 ../share/kildclient.pl:680 #: ../share/kildclient.pl:694 ../share/kildclient.pl:708 #: ../share/kildclient.pl:818 ../share/kildclient.pl:830 #: ../share/kildclient.pl:842 ../share/kildclient.pl:854 #: ../share/kildclient.pl:867 ../share/kildclient.pl:1083 #: ../share/kildclient.pl:1116 #, perl-format msgid "%s: Too few arguments." msgstr "" #: ../share/kildclient.pl:207 ../share/kildclient.pl:567 #, perl-format msgid "No such %s" msgstr "" #: ../share/kildclient.pl:298 ../share/kildclient.pl:316 #: ../share/kildclient.pl:334 ../share/kildclient.pl:352 #: ../share/kildclient.pl:370 #, perl-format msgid "%s: Wrong number of arguments." msgstr "" #: ../share/kildclient.pl:403 ../share/kildclient.pl:411 #: ../share/kildclient.pl:489 ../share/kildclient.pl:497 #, perl-format msgid "No such %s." msgstr "" #: ../share/kildclient.pl:425 #, perl-format msgid "No %s deleted." msgstr "" #: ../share/kildclient.pl:427 #, perl-format msgid "One %s deleted." msgstr "" #: ../share/kildclient.pl:429 #, perl-format msgid "%d %s deleted." msgstr "" #: ../share/kildclient.pl:506 #, perl-format msgid "Successfully moved %s." msgstr "" #: ../share/kildclient.pl:898 msgid "Could not open file." msgstr "" #: ../share/kildclient.pl:928 msgid "Unknown" msgstr "" #: ../share/kildclient.pl:935 msgid "Invalid plugin file." msgstr "" #: ../share/kildclient.pl:966 msgid "Plugin already loaded. Try enabling it." msgstr "" #: ../share/kildclient.pl:968 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "" #: ../share/kildclient.pl:978 #, perl-format msgid "Error in plugin file: %s" msgstr "" #: ../share/kildclient.pl:990 msgid "Cannot load a plugin in another world." msgstr "" #: ../share/kildclient.pl:995 ../share/kildclient.pl:1015 msgid "Plugin not specified" msgstr "" #: ../share/kildclient.pl:1002 ../share/kildclient.pl:1033 msgid "Plugin not loaded." msgstr "" #: ../share/kildclient.pl:1005 #, perl-format msgid "Plugin '%s' loaded." msgstr "" #: ../share/kildclient.pl:1021 #, perl-format msgid "Could not load plugin %s" msgstr "" #: ../share/kildclient.pl:1097 msgid "Plugin enabled." msgstr "" #: ../share/kildclient.pl:1130 msgid "Plugin disabled." msgstr "" #: ../share/kildclient.pl:1279 msgid "Cannot open help file." msgstr "" #: ../share/kildclient.pl:1297 msgid "Help topic not found." msgstr "" #: ../share/kildclient.pl:1394 msgid "" "Warning: the getwindowsize() function is deprecated and will be removed." msgstr "" #: ../share/kildclient.pl:1395 msgid "Use $window->getsize() instead." msgstr "" #: ../share/kildclient.pl:1400 msgid "Warning: the minimize() function is deprecated and will be removed." msgstr "" #: ../share/kildclient.pl:1401 msgid "Use $window->minimize() instead." msgstr "" #: ../share/kildclient.pl:1406 msgid "Warning: the path() function is deprecated and will be removed." msgstr "" #: ../share/kildclient.pl:1407 msgid "Use $world->path() instead." msgstr "" kildclient-3.0.0/po/de.gmo0000644000175000017500000017031312376346024012303 00000000000000L|,H;~I; ;;;;<#<;<X<m<L<7<==1="O="r====5=5>&T>.{>>>(> ??4?G?6c?'?6?'?;!@]@)y@@@ @@@@@ A(A=AOA eAqA AA AAAA BBB ?B `BmBBBBBBBCBC+\C$CC(C"CD DD&DD#D D*D0 E6X0pX1X1X3Y'9YaY6Y8Y1Y2"Z.UZ2ZWZZ[Dj[[{[1H\1z\#\%\\](] A]$b] ]] ]]]]]]] ] ^ ^ ^ /^-:^.h^ ^ ^^^^^ ^^^C^u8_ ___F_!`'`8` >`H`$P`$u`` `{`:aKa]bwb-~bb4bbb'c1/cacwcc2c c c ccd dd%dqE+"%)#O s}'Ǚ,ؙ>ED  ͚՚ !!A cq - 7 D N\gyAd#EΝ^]FO^SNLNN"UqKǡIM];bJ0*1B\B #$Has  ϥ#;!PVr;ɦD:J*2֧) 3&R%y#%ި!C&j&(ȩ!%9@ IW kw |  Ū ΪC۪4I^t!%-Ы#&J_ w'"۬>C=JTԭ#) MZ"k#®Ӯ:*B6m 40g@>ٰ?@XB5ܱ5NH]TTJADs&\E4=}rCG4+|*/Ӷ#1B"t ķз"  , 9 GT f2t-ո    %?@k Q rx ))κ)UEw 2RXZ/׽8!@b~6ξݾ  "7Kdw ƿӿ&( 3MhX& 5 B c'q8!K43Qo !*@P-oGJB7U !;$`tp(0 60D8ua?!Pr {2 !4QQ !(1B FQk-,!Acs"{ C?XFCZE>-,<"7)Z1RC ,MHz37 FRGZ1a161hGHH+(tOc9Qu9[;F   1 @JY)"Llk $?<;|/{wU#y06;Qj($%M.s 6) -3.a)SI.$x$>  -7*?&j cEEHA *A( jv {{(a/!%$!$@e /9@ IVAe     .% T ^l) @ #B2u | 8 $1+]f7z  (*/S.5  !AH MBWD  &%LSb t $"4+` r~G #28>\a"~+. 0' X#b.3#9]df[@("KZcr$x0$h4d)`<>ojt@E%x+zlR|v $L?JGa'\0cyfJQP9(K\!R^x\v7[hA gQD"_=NX(,u7#UV;K>*n30Y_%e|BJ5%ql K)sMbtj~PZ]rj A1m.O8S=6g=aIM+e;2:F_rv 4 f'Y8 1GL &Y2mWiPtx"]TC n[$w8 {-k/13 Ub@^W[|Hiu SI7yO-wB}4lZ~X*{rB&!Nesm.RcLpZ<INi5kF(.p+T#@z QV5* 2`>,&g?GFV)9~d3?H SUonA"O^-Tyzb w:{W]!Mo'} /k;f,#d6EqXq9 as6p`hDCc:HE}/uD<C Target: %d Foreground: %d Background: %d Italics: %d Striked-thru: %d Underline: %d SSL enabled.%d %s deleted.%d lines%s is already permanent.%s: %s is already permanent%s: %s is not permanent%s: Argument must be numeric%s: Invalid key code%s: No such world%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent%s: This is an internal function, do not call directly.%s: Too few arguments%s: Too few arguments.%s: Too many string arguments%s: Variable '%s' made permanent. %s: Variable '%s' made temporary. %s: Wrong argument type%s: Wrong number of arguments.%s: Wrong type of reference%s: action given twice, using the named attribute one%s: action not specified, and isn't gag, not creating%s: action not specified, not creating%s: cannot create timer with negative interval%s: count must be numeric%s: interval must be numeric%s: interval not specified, not creating%s: invalid bg color%s: invalid fg color%s: invalid target%s: invalid underline style%s: keycode given twice, using the named attribute one%s: keycode not specified, not creating%s: pattern given twice, using the named attribute one%s: pattern not specified, not creating%s: substitution given twice, using the named attribute one(-1 to repeat indefinitely)(Leave blank for default based on locale)0 lines1 line: Expired: Not yet activeAnsi ColorsAuto-loginCharacter SetColors used by KildClientCommand EntryConnectionDefault ColorsFileFlood preventionFontGraphical EditorsInputLogging StatusMCCP (for compression)Name displayNote:OptionsPlugins Currently LoadedPlugins Loaded on StartupProxyRevert to default colorsScriptingScrollingSending DelaysTime DisplayWeb BrowserWindow configurationWord WrapA mud client with powerful features and support for Perl ScriptingA_utomatically start logging when connectedActi_vate auto-completion only afterActionAdd this to the _beginning of each line:Add this to the _end of each line:AdvancedAlias added.Alias modified.Alias number %d Name: %s Pattern: %s Substitution: %s Ignore case: %s Eval as Perl: %s Enabled: %s AliasesAlways load this plugin at _startupAppearanceAre you sure you want to close this world?Attempting to connect to host %s (%s) port %s...Attempting to connect to proxy host %s (%s) port %s...AuthorAutomationB_lueBac_kgroundBl_ack (bold)Bl_ue (bold)BlackBlack (bold)BlueBlue (bold)Bold backgroundBold foregroundBottomBytes received (compressed):Bytes received (decompressed):C_hange styleC_ommand separator:C_onfigure...C_onnectC_onnected time:Cannot load a plugin in another world.Cannot open help file.Certificate type:Ch_aracters in this mud:Change StyleCharacterCharacter _set:Check if you want lines to be wrapped at word boundariesCheck if you want the highlighted ANSI colors to be displayed in bold alsoCheck this if the text you type is displayed as black dots in the input box.Check to enable command auto-completion (based on previous commands)Check to have the command history saved in a file between sessionsCheck to have the last command kept in the command entry box, so that you can repeat commands only by pressing ENTERCheck to have the main window scroll to the end whenever new output comesCheck to have the sent commands echoed in the main output windowCheck to have the substitution be executed in a s///e constructionCheck to have the timer deleted after its repeat count has reached 0Check to make the alias enabled; only enabled aliases are triedCheck to make the hook enabled; only enabled hooks are runCheck to make the idle time counter reset only when a command is entered directly by typing it in the command entry box. If not checked, if a command is sent because of a timer, of a hook, etc, the idle timer is also reset.Check to make the macro enabled; only enabled macros are runCheck to make the matched line not be printed in the log fileCheck to make the matched line not be printed in the main output windowCheck to make the timer enabled; only enabled timers are runCheck to make the trigger enabled; only enabled triggers are triedCheck to make this trigger a rewriter triggerCheck to make this trigger not prevent further triggers from being tried, if it matchesCheck to prevent more than a given number of equal commands to be sent in a row (which can disconnect your character in some muds)Cipher:Click the run the triggers against the line.Click to clear the command input area.Click to open link; right-click for more options.Click to revert all colors to their built-in defaultsColorsCommand HistoryCommand _History...Command not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _Another...Connect to another worldConnect without SSLConnected to host %s (%s) port %s, MCCP version %d enabled.Connected to host %s (%s) port %s.Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d enabled.Connected to host %s port %s, via proxy %s (%s) port %s.Connected to proxy server %s port %s, negotiating authentication...Connected to proxy server %s port %s, sending request...Connection _style:Connection time:Could not connect to host %s port %s: %sCould not connect to host %s port %s: Error #%dCould not create directory '%s': %sCould not create socket: %sCould not create socket: error #%dCould not import file '%s': %sCould not load plugin %sCould not load world from file '%s': %sCould not open dump file %s: %s Could not open file '%s': %sCould not open file '%s': %s Variables were not saved.Could not open file.Could not open file: %sCould not open log file: %s.Could not open raw dump file %s: %s Could not open world '%s': %s Could not resolve host %s: %sCountCount Cu_tCustom: Cya_n (bold)CyanCyan (bold)DIRD_eleteDefaultDefault (bold)Dela_yDeleteDescriptionDirectory to store settings and saved worldsDisable T_imersDisable _AliasesDisable _MacrosDisable _TriggersDisconnectedDisconnected from host %s.Disconnected from host %s: %s.Disconnected from host %s: error #%d.Disconnected from world %sDisplayDisplay as hours, minutes and secondsDisplay as secondsDo not allow the _same command to be sentDo not changeDo not connectDo not deleteDo not displayDo you really want to delete %d %s?Do you really want to delete the %s?Do you really want to make %d variables temporary?Do you really want to make the variable temporary?DoubleDumps all data received (possibly compressed) to the fileDumps all data received from (after decompression, if appropriate) to the fileE_val substitution as Perl statementE_xportEdit AliasEdit Character InformationEdit Default _World...Edit HookEdit MacroEdit TimerEdit TriggerEdit WorldElement '%s' not allowed inside element '%s'Enable _auto-completionEnable if server proposes at _any timeEnabledEnter _line to be matched against the triggers:Enter a command to be sent whenever the specified maximum number of equal commands would be sentEnter a descriptive name for the WorldEnter optionally a descriptive name for the aliasEnter optionally a descriptive name for the hookEnter optionally a descriptive name for the macroEnter optionally a descriptive name for the timerEnter optionally a descriptive name for the triggerEnter some text to be sent to the WorldEnter some text to search for.Enter the action that will be run when a match happensEnter the action to be executed whenever the timer firesEnter the action to be run when the event happensEnter the action to be run when the key is pressedEnter the character's name for automatic loginEnter the character's password for automatic loginEnter the command to run a web browser. %s will be substituted by the web page address.Enter the command to run an audio player program. %s will be substituted by the file path.Enter the default parameters for sending multiple lines or commands:Enter the host to connect toEnter the name of a scalar ($), array (@) or hash (%) variable whose contents are to be saved between sessions of the WorldEnter the pattern to match against received linesEnter the pattern to match against typed commandsEnter the port used when connectingEnter the substitution to be executedEnter the text to search forError Loading PluginError in plugin file: %sError setting spell checker: %s Error while reading from proxy host.Eval as PerlEvent:Expiration:ExportExternal ProgramsFILEFailed loading file %s: %sFileFile name not specified.Find CommandFind N_extFind NextFind P_reviousFind _nextFind a command containing a given search termFind the next command with the same match textFingerprint:G_reen (bold)GagGag LogGeneralGreenGreen (bold)HTTPHelp topic not found.Here you can set options to configure the appearance of KildClient.Here you can set options to configure the automation features of KildClient, such as triggers, aliases, plugins, etc.Hook defined.Hook modified.Hook not foundHook number %d for event %s Name: %s Action: %s Enabled: %s HooksHooks for '%s': Host:Hostname:I. CaseIdentify as 'Character - World name'Identify as 'World name - Character'Identify as 'World name'Idle time:If checked, triggers, aliases, macros and timers defined in plugins will appear in the corresponding World Editor sections.If not checked, objects such as triggers, aliases, etc. will be deleted directly without asking for confirmation when you press the Delete button.If this is checked, when there is only one open world no tabs will be shownIf this is selected, logging will be automatically started whenever you connect to the world.ImportInform number of lines to include in the log.InputInternal error: element '%s' ends when in START modeIntervalInvalid argument '%s' Invalid attribute '%s' for element '%s'Invalid function call: syntax is $world->FUNCTIONInvalid key code '%s'Invalid key code.Invalid plugin file.Invalid window size specification in config file. Issuer's DN:Keep ExecKeep _openKeep permanentKeyKey exchange:KildClient ErrorKildClient InformationKildClient QuestionKildClient WarningKildClient readyLanguage code:LeftLines received:Load pluginLoggingLogging is disabled.Logging not startedLogging stopped.Logging to file %s.Logging to file %s. MAC:Macro added.Macro modified.Macro number %d Name: %s Key Code: %s Action: %s Enabled: %s MacrosMagen_ta (bold)MagentaMagenta (bold)Main WindowMake temporaryMiscellaneousMore than one command selected.Multi-line sendN/AN_umber of lines:NameNever _hide the typed textNewest commands are on the topNoNo %s deleted.No acceptable proxy authentication methods.No auto-loginNo command selected.No proxyNo such %sNo such %s.No such aliasNo such hookNo such macroNo such pluginNo such timerNo such triggerNo worldNoneNot connectedNot connected.Not foundNot setNote: You can use strftime() escapes to create different files based on the date and time that logging starts. Also, %Kw represents the World name and %Kc the character name used in auto-logon.Number of triggers that matched:OfflineOmit (_gag) from outputOmit (gag) from _log fileOne %s deleted.Only _reset idle time counter when a command is entered directlyOnly scalar ($), array (@) and hash (%%) variables can be made permanent.Or connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPerforming SSL handshake...Permanent VariablesPermanent variablesPermenent variablePluginPlugin '%s' loaded.Plugin already loaded. Try enabling it.Plugin disabled.Plugin enabled.Plugin not loaded.Plugin not specifiedPlugin number %d Name: %s Version: %s Description: %s Author: %s Enabled: %s PluginsPort:PreferencesPrefix lines with _date and/or timePress a key to get its keycode.Press the key that will be used to activate the macro while the cursor is in the text box.Press the key that will be used to run the macroProtocol %s not enabled.ProtocolsProxyProxy _type:Proxy authentication failed.Proxy host:Proxy port:Proxy request failed: %s.Proxy type:Put the selected command in the command entry boxPut the selected command in the command entry box and close this dialogR_edRe_d (bold)Re_vert to default colorsReally Quit KildClient?Really close?Rec_all & CloseReconnectRedRed (bold)Resolving host %s...Resolving proxy host %s...Revert to _defaultRewriterRightSOCKS4SOCKS5SSL Handshake failed: %sSSL not supported in this versionSSL protocol used:S_end & CloseS_pell check typed textS_tatistics...ScriptingScroll on _outputSe_nd this command:Search direction:Select if you do not want the connection time to be displayedSelect if you do not want the idle time to be displayedSelect if you want the connection time to be displayed in hours, minutes and secondsSelect if you want the connection time to be displayed in secondsSelect if you want the idle time to be displayed in hours, minutes and secondsSelect if you want the idle time to be displayed in secondsSelect log fileSelect the font used in the _main screen:Select the font used in the _status bar:Select the font used in the command _entry box:Select the font used in the command entry boxSelect the font used in the main output screenSelect the font used in the status barSelect this if you want to prefix each line in the log file with the date and/or time it was received.Select to include lines from the main window in the log file.Send the selected command(s) to the mudSend the selected command(s) to the mud and close the dialogSend this text _initially:SendingSending connection request...Sending proxy authentication credentials...Server _address:Server _port:SingleSpecify how many commands are sent at onceSpecify how many lines are sent at onceSpecify how many times this timer should run before being disabled or deletedSpecify some text to be appended to each sent lineSpecify some text to be prepended to each sent lineSpecify the command used to launch a web browserSpecify the command used to play sound files.Specify the delay between sending the group of commandsSpecify the delay between sending the group of linesSpecify the interval, in seconds, between timer activationsSpecify the maximum number of equal commands that can be sent in a rowSpecify the number of characters that must be typed for command completion to startSpecify the number of commands that are saved and can be later recalledSpecify the number of lines of output that can be seen with by scrolling the windowSpecify the separator for commands typed in the command entry boxSpell checking support not included in this build.St_artStatisticsStatus BarStyleSubject's DN:SubstitutionSuccessfully moved %s.TTL expiredTempTest TriggersThe default is to prefix lines with the date and time, but you can configure the format with strftime() escape sequences. See the manual for a description of those.The help is displayed in main window.The interval must be positive.The matched substring numberThe text entered here will be matched against triggers as if it were a line coming from the MUDThe whole lineThe whole matched textThen send the _contents of this file:There are %d open worlds. Do you really want to quit?There is one open world. Do you really want to quit?This is what would be printed in the main screen. If empty, the line has been gaged. It can be different from the original line because of rewriter triggers.This is what would be printed in the main screen:This object belongs to a plugin. Changes made here will not be saved in the plugin.This version of KildClient does not have SSL support.Timer added.Timer modified.Timer number %d Name: %s Interval: %.3f Repeat count: %d Action: %s Enabled: %s Temporary: %s TimersTopTrigger added.Trigger modified.Trigger number %d Name: %s Pattern: %s Action: %s Enabled: %s Ignore case: %s Gag output: %s Gag in log: %s Keep executing: %s Rewriter: %s Change style: %s TriggersUnable to connect to host %s: %s.Unable to connect to host %s: Error #%d.Unable to connect to proxy host %s: %s.Unable to connect to proxy host %s: Error #%d.UnknownUnknown directive '%s' in config file. Unknown protocolUnnamed worldUnrecognized response from proxy host.Use $window->getsize() instead.Use $window->minimize() instead.Use $world->path() instead.Use %Kw to represent the World's name, and %Kc to represent the auto-logon character nameUse _SSLUse _bold font for highlighted colors (instead of just highlighting)Use _multi-line input barUse global settingsUse single-_line input barUse the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit http://www.kildclient.orgW_hite (bold)Warning: Trying to send a very long command line. Perhaps a recursive alias definition?Warning: the getwindowsize() function is deprecated and will be removed.Warning: the minimize() function is deprecated and will be removed.Warning: the path() function is deprecated and will be removed.WhiteWhite (bold)World name:World saved.Would this line be included in the log file?Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br) Yell_ow (bold)YellowYellow (bold)YesYou can leave this field blank, and a file name will be automatically generated. Only edit this field if you know what you are doing.You must specify a variable name.You must specify the action, unless the trigger is a gag or changes the style.You must specify the action.You must specify the key.You must specify the name.You must specify the password.You must specify the pattern.You must specify the substitution.You're attempting to connect to a world that uses SSL, but this version of KildClient has been built without SSL support. Try to connect without SSL?[WORLD...]_About_Action:_Add_Apply to:_Ask for confirmation before deleting triggers, aliases, etc._Background:_Black_Cancel_Clear_Close_Command echo:_Copy_Copy link address_Cyan_Delay_Delay between each group of lines/commands:_Delete_Disable_Disconnect_Display_Do not display this message again_Don't quit_Down_Downwards_Echo sent commands in main window_Edit_Edit..._Enable if server proposes after connecting_Enabled_Event:_File:_Finally, send this text:_Find_Find:_Flash window when new text is received_Foreground_Foreground:_Format:_Green_Help_Hide tabs if only one world is open_Host:_Idle time:_Ignore case when matching_Import_Include the last_Informative messages:_Input_Interval:_Italic:_Items to export_Keep dialog open after sending_Keep executing other triggers after this this one matches_Keep last typed command in command entry box_Key:_Lines to save in scrollback buffer:_Load_Magenta_Manual_Multi-line Send..._Name of variable to make permanent:_Name:_New_Next_Number of commands to save in history:_Number of lines/commands to send at once:_OK_Open_Open link_Open..._Password:_Paste_Pattern:_Perl file to load:_Port:_Preferences_Preferences..._Previous_Quit_Recall_Reconnect_Repeat count:_Rewriter trigger_Save_Select a saved world:_Send_Show items defined by plugins_Stop_Store commands between sessions_Striked-thru:_Substitution:_Tab position:_Temporary (will be deleted automatically when its repeat count reaches 0)_Test Triggers..._Text to find:_Underline:_Up_Upwards_Username:_White_World_Wrap lines at word boundaries_Yellow_times in a rowaddress type not supportedaliasalias: not creating alias without patternalias: not creating alias without substitutionaliasescharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection not allowed by rulesetconnection refused by destination hostgeneral failurehookhook: hook '%s' not found hookshost unreachableline(s)lines of the scrollback buffer in the logmacromacro: No such macromacrosnnetwork unreachablenorequest failed because client's identd could not confirm the user ID string in the requestrequest failed because identd could not be reachedrequest rejected or failedsec_onds eachsecondsseconds e_achtimertimer: No such timertimerstriggertriggersunknown reason codeyyesProject-Id-Version: KildClient 3.0.0 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general POT-Creation-Date: 2014-08-17 14:59-0300 PO-Revision-Date: 2014-08-17 14:59-0300 Last-Translator: Rene Kuettner Language-Team: German Language: de MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Ziel: %d Vordergrund: %d Hintergrund: %d Kursiv: %d Durchgestrichen: %d Unterstrichen: %d SSL eingeschaltet.%d %s gelöscht.%d Zeilen%s ist bereits permanent.%s: %s ist schon permanent%s: %s ist nicht permanent%s: Das Argument muss numerisch sein%s: Ungültiger Tastencode%s: Keine solche Welt gefunden%s: Nur Skalar ($), Array (@) und Hash (%%) -Variablen können permanent sein%s: Dies ist eine interne Funktion, die nicht direkt aufgerufen werden sollte.%s: Zu wenig Argumente%s: Zu wenig Argumente.%s: Zu viele String-Argumente%s: Variable '%s' in permanente Variable umgewandelt. %s: Variable '%s' in permanente Variable umgewandelt. %s: Falscher Argumenttyp%s: Falsche Anzahl an Argumenten.%s: Falscher Referenztyp%s: Die Aktion wurde zweimal mit dem Attribut eins angegeben%s: Aktion ist nicht definiert und kein Gag. Erzeuge nichts.%s: Aktion nicht angegeben. Wird nicht erzeugt.%s: Interval muss positiv sein.%s: Anzahl muss numerisch sein%s: Interval muss numerisch sein%s: Interval nicht angegeben. Wird nicht erzeugt.%s: Ungültige Hintergrundfarbe%s: Ungültige Vordergrundfarbe%s: ungültiges Ziel%s: Ungültiger Stil für Unterstreichungen%s: Tastencode wurde zweimal mit dem Attribut eins angegeben%s: Tastencode nicht angegeben. Wird nicht erzeugt.%s: Das Muster wurde zweimal mit Attribut eins angegeben%s: Muster ist nicht definiert. Erzeuge nichts.%s: Ersetzung zweimal mit dem Attribut eins angegeben(-1 für unbegrenzt viele Wiederholungen)(Leer lassen, um die Systemeinstellung zu verwenden)0 Zeilen1 Zeile: Abgelaufen: Noch nicht aktivANSI FarbenAutomatische AnmeldungZeichensatzFarben, die von KildClient verwendet werdenBefehlseingabeVerbindungStandardfarbenDateiÜberlaufschutzSchriftEditorEingabeProtokollierungMCCP (für Kompression)NamensanzeigeHinweis:OptionenGeladene PluginsPlugins geladen beim ProgrammstartProxyStandardfarben zurücksetzenSkripteBildlaufSendeverzögerungenZeitanzeigeWeb BrowserFensterkonfigurationZeilenumbruchEin mächtiger MUD-Client mit Unterstützung für Perl SkripteProtokollierung beim Herstellen einer Verbindung _automatisch startenAutovervollständigung benötigt mindestensAktion_Füge dies am Anfang jeder Zeile an:Füge dies am _Ende jeder Zeile an:ErweitertAlias hinzugefügtAlias geändert.Alias Nummer %d Name: %s Muster: %s Ersetzung: %s Ignoriere Groß-/Kleinschreibung: %s Als Perl-Code ausführen: %s Aktiv: %s AliaseDieses Plugin beim Programmstart _ladenErscheinungsbildSoll diese Welt wirklich geschlossen werden?Versuche eine Verbindung zu %s (%s) an Port %s herzustellen...Versuche eine Verbindung zum Proxy %s (%s) an Port %s herzustellen...AutorAutomatisierungBlau_HintergrundSchwarz (fett)Blau (fett)SchwarzSchwarz (fett)BlauBlau (fett)Fetter HintergrundFetter VordergrundUntenEmpfangene Bytes (komprimiert):Empfangene Bytes (unkomprimiert):Stil ä_ndern_Trennzeichen für Befehle:_Einstellen..._VerbindenVerbindun_gszeit:Kann kein Plugin in einer anderen Welt laden.Kann Hilfe-Datei nicht öffnen.Typ des Zertifikats:_Charaktere in diesem MUD:Stil ändernCharakter_Zeichensatz:Zeilen am Wortende umbrechenAktiviere diese Einstellung, wenn leuchtende ANSI Farben auch in Fettschrift dargestellt werden dürfenWählen, wenn der eingegeben Text in schwarzen Punkten erscheint.Wählen, um die automatische Befehlskomplettierung zu aktivieren (basierend auf vorherigen Befehlen)Wählen, um die Befehlshistorie beim Beenden in einer Datei abzulegenWählen, um die den letzten Befehl in der Eingabezeile zu erhalten, so dass er durch drücken der ENTER-Taste noch einmal gesendet werden kannWählen, wenn immer zur letzten Zeile gescrollt werden soll, sobald neuer Text empfangen wurdeWählen, um gesendete Befehle in der Hauptausgabe wiederzugeben (echo)Wählen, wenn die Ersetzung in einer s///e Konstruktion ausgeführt werden sollWählen, wenn der Timer gelöscht werden soll, sobald sein Wiederholungszähler 0 geworden istWählen, um das Alias zu aktivieren (nur aktivierte Aliase haben einen Effekt)Wählen, um den Hook zu aktivieren (nur aktivierte Hooks haben einen Effekt)Wählen, um die Untätigkeitszeit nur zurückzusetzen, wenn ein Kommando eingegeben wird. Wenn diese Einstellung nicht gewählt ist, kann die Untätigkeitszeit auch durch Hooks, Timer etc. zurückgesetzt werden.Wählen, um das Makro zu aktivieren (nur aktivierte Makros haben einen Effekt)Wählen, wenn die Zeile, auf die das Muster passt, nicht im Protokoll auftauchen sollWählen, wenn Zeilen, auf die das Muster passt, nicht angezeigt werden sollWählen, um den Timer zu aktivieren (nur aktive Timer haben einen Effekt)Wählen, um den Trigger zu aktivieren (nur aktive Trigger haben einen Effekt)Wählen, wenn dieser Trigger ein Rewriter-Trigger sein sollWählen, wenn weitere Trigger ausgeführt werden sollen, auch wenn dieser Trigger ausgelöst wurdeWählen, um zu verhindern, dass mehr als die angegebene Anzahl an gleichen Befehlen am Stück gesendet werden (was bei einigen MUDs zum Trennen der Verbindung führen kann)Chiffre:Klicken um die Trigger auf die Zeile anzuwenden.Klicken um die Befehlseingabe zu löschen.Klicken um den Link zu öffnen; Rechtsklick für weitere Optionen.All Farben auf die eingebauten Standardeinstellungen zurücksetzenFarbenBefehlshistorieBefehls_historie...Befehl nicht gefunden.Befehle die gesendet worden wären:Kompressionsalgorithmus:Kompressionsrate:Verwendete Kompression:Löschvorgang bestätigenVerbinde zuZu _anderer Welt verbinden...Mit einer anderen Welt verbindenOhne SSL-Verschlüsselung verbindenVerbunden mit %s (%s) an Port %s. Verwende MCCP Version %d.Verbunden mit %s (%s) an Port %s.Verbunden mit %s an Port %s, über Proxy %s (%s) an Port %s. Verwende MCCP version %d.Verbunden mit %s an Port %s über Proxy %s (%s) an Port %s.Verbunden mit Proxyserver %s an Port %s, Authentifizierung läuft...Verbunden mit Proxyserver %s an Port %s, sende Anfrage...._Art der Verbindung:Verbindungszeit:Kann nicht mit %s an Port %s verbinden: %sKann nicht mit %s an Port %s verbinden: Fehler #%dKann Verzeichnis '%s' nicht erstellen: %sKann Socket nicht erzeugen: %sKann Socket nicht erzeugen: Fehler #%dKann Datei '%s' nicht importieren: %sKann Plugin %s nicht ladenKann Weltdatei '%s' nicht laden: %sKann Datendatei %s nicht öffnen: %s Kann Datei '%s' nicht öffnen: %sKann Datei '%s' nicht öffnen: %s Variablen wurden nicht gesichert.Kann Datei nicht öffnen.Kann Datei nicht öffnen: %sKann Protokolldatei nicht öffnen: %s.Kann Rohdatendatei %s nicht öffnen: %s Kann Welt '%s' nicht öffnen: %s Kann Hostnamen %s nicht auflösen: %sAnzahlZähler _AusschneidenBenutzerdefiniert: Zyan (fett)ZyanZyan (fett)Verzeichnis_LöschenStandardStandard (fett)_VerzögerungLöschenBeschreibungVerzeichnis, in dem die Einstellungen und Welten gespeichert werdenT_imers deaktivieren_Aliase deaktivieren_Makros deaktivieren_Trigger deaktivierenVerbindung getrenntVerbindung mit %s wurde getrennt.Verbindung mit %s wurde getrennt: %s.Verbindung mit %s wurde getrennt: Fehler #%d.Verbindung zur Welt %s getrenntAnzeigeZeige Stunden, Minuten und SekundenIn Sekunden anzeigenVerbiete das _Senden abNicht ändernNicht verbindenNicht löschenNicht anzeigenSollen %d %s wirklich gelöscht werden?Soll %s wirklich gelöscht werden?Sollen %d Variablen wirklich in temporäre umgewandelt werden?Soll die Veriable wirklich zu einer temporären umgewandelt werden?DoppeltSchreibt alle empfangenen Daten (wenn möglich dekomprimiert) in die DateiSchreibt alle empfangenen Daten (gegebenenfalls nach der Dekompression) in die DateiErsetzung als Perl-Code e_valuieren_ExportierenAlias bearbeitenCharakter-Informationen bearbeitenVoreingestellte _Welt bearbeiten...Hook bearbeitenMakro bearbeitenTimer bearbeitenTrigger bearbeitenWelt bearbeitenElement '%s' ist innerhalb des Elements '%s' nicht erlaubtBefehls-_Autovervollständigung aktivieren_Zu jeder Zeit aktivieren, wenn der Server es anbietetAktiviert_Zeile auf die die Trigger angewendet werden sollen:Geben Sie einen Befehl an, der immer dann gesendet wird, wenn die maximale Anzahl an zu sendenden gleichen Befehlen gesendet würdeGeben Sie einen beschreibenden Namen der Welt anGeben Sie optional einen beschreibenden Namen für das Alias einGeben Sie optional einen beschreibenden Namen für den Hook anGeben Sie optional einen beschreibenden Namen für das Makro anGeben Sie optional einen beschreibenden Namen für den Timer einGeben Sie optional einen beschreibenden Namen für den Trigger einGeben Sie den Text ein, der an die Welt gesendet wirdGeben Sie den Text ein, nach dem gesucht werden soll.Geben Sie eine Aktion ein, die ausgeführt wird, wenn ein Muster gefunden wirdGeben Sie eine Aktion ein, die immer ausgeführt werden soll, wenn ein Timer ausgelöst wurdeGeben Sie die Aktion ein, die ausgeführt werden soll, wenn ein Ereignis stattfindetGeben Sie die Aktion ein, die ausgeführt werden soll, wenn die Taste gedrückt wirdGeben Sie den Namen des Charakters für das automatische Login anGeben Sie das Passwort des Charakters für das automatische Login anGeben Sie den Befehl an, mit dem der Webbrowser gestartet werden kann. %s wird durch die Webseiten-Adresse ersetzt.Befehl, mit dem Klangdateien abgespielt werden können. %s wird durch den Dateipfad ersetzt.Standardeinstellungen für das Senden mehrerer Zeilen oder Kommandos:Server zu dem die Verbindung hergestellt werden sollGeben Sie den Namen einer Skalar ($), Array (@) oder Hash (%) Variable an, deren Inhalt beim beenden gespeichert werden soll.Geben Sie das Muster ein, das gegen empfangene Zeilen geprüft wirdGeben Sie das Muster ein, auf das in eingegebene Befehlen geprüft wirdPort zu dem am Server verbunden werden sollGeben Sie die auszuführende Ersetzung einGeben Sie den Text ein, der gesucht werden sollFehler beim Laden eines PluginsFehler in der Plugin-Datei: %sFehler beim Setzen der Rechtschreibkorrektur: %s Fehler beim Lesen vom Proxyserver.Als Perl-Code auführenEreignis:Läuft ab:ExportierenExterne ProgrammeDATEIFehler beim Laden der Datei %s: %sDateiDateiname nicht angegeben.Suche Befehl_WeitersuchenWeitersuchen_Vorherige suchen_WeitersuchenSuche einen Befehl mit einem gegebenen SuchbegriffWeiteren Befehl mit diesem Suchbegriff suchenFingerabdruck:Grün (fett)GagGag ProtokollAllgemeinGrünGrün (fett)HTTPHilfethema nicht gefunden.Hier kann das Erscheinungsbild von KildClient angepasst werden.Hier können Automatisierungsfunktionen von KildClient wie Trigger, Aliase oder Plugins eingestellt werden.Hook definiert.Hook geändert.Hook nicht gefundenHook Nummer %d für das Ereignis %s Name: %s Aktion: %s Aktiv: %s HooksHooks für '%s': Server:Hostname:I. FallIdentifizieren als 'Charakter - Weltname'Identifizieren als 'Weltname - Charakter'Identifizieren als 'Weltname'Untätigkeitszeit:Wenn gewählt werden Trigger, Aliase, Makros und Plugins, die in Plugins definiert sind, in den entsprechenden Abschnitten des Welt-Editors angezeigt.Wenn nicht gewählt werden Objekte wie Trigger, Aliase etc. direkt ohne Nachfrage gelöscht, wenn der Löschen-Knopf betätigt wird.Wenn diese Einstellung aktiv und nur eine Welt offen ist, werden keine Tabs angezeigtWählen, um die Protokollierung automatisch immer dann zu starten, wenn eine Verbindung zu einer Welt hergestellt wird.ImportierenAnzahl an Zeilen, die das Protokoll umfassen darf.EingabeInterner Fehler: Element '%s' endet obwohl der Beginn eines neuen Elements erwartet wirdIntervalUngültiges Argument '%s' Ungültiges Attribut '%s' für das Element '%s'Ungültiger Funktionsaufruf: Syntax ist $world->FUNKTIONSchlüsselwert '%s' ist ungültigUngültiger Schlüsselcode.Ungültige Plugin-Datei.Ungültige Fenstergröße in der Konfigurationsdatei. Aussteller DN:_Ausführung beibehalten_Offen haltenPermanent behaltenSchlüsselSchlüsselaustausch:Fehler - KildClientInformation - KildClientFrage - KildClientWarnung - KildClientKildClient bereitSprachen-Code:LinksEmpfangene Zeilen:Plugin ladenProtokollierungDie Protokollierung ist ausgeschaltet.Die Protokollierung ist nicht gestartet.Protokollierung gestoppt.Protokolliere in Datei %s.Verwende Protokolldatei %s. MAC:Makro hinzugefügt.Makro geändert.Makro Nummer %d Name: %s Tastencode: %s Aktion: %s Aktiv: %s MakrosMagenta (fett)MagentaMagenta (fett)HauptfensterIn temporäre Variable umwandelnVerschiedenesEs ist mehr als ein Befehl ausgewählt.Mehrzeilig sendenk/A_Anzahl an Zeilen:NameEingaben _niemals verstecken (auch nicht bei Passworten)Der neueste Befehl ist obenNeinKein %s gelöscht.Es sind keine akzeptablen Authentifizierungsmethoden beim Proxy verfügbar.Keine automatische AnmeldungEs ist kein Befehl ausgewählt.Keinen Proxyserver verwendenKein %s vorhandenKein %s vorhanden.Kein solcher Alias.Es existiert kein solcher Hook.Kein solches Makro vorhanden.Kein solches Plugin gefunden.Kein solcher Timer vorhanden.Kein solcher TriggerKeine WeltKeineNicht verbundenNicht verbunden.Nicht gefundenNicht definiertHinweis: strftime() Formatinformationen können verwendet werden, um verschiedene Dateinamen nach Datum und Zeit des Beginns der Protokollierung zu erzeugen. Zusätzlich repräsentiert %Kw den Weltnamen und %Kc den Namen des Charakters, der für die automatische Anmeldung eingetragen ist.Anzahl der Trigger, die ausgelöst wurden:Offline bleibenPassende Zeilen nicht ausgebenPassende Zeilen nicht ins Protokoll schreibenEin %s gelöscht.Untätigkeitszeit nur bei direkter Eingabe eines Befehls _zurücksetzenNur Skalar ($), Array (@) und Hash (%%) -Variablen können permanent sein._Direkt verbinden:Zeigt Versionsinformationen an und beendet das ProgrammPass_wort:PasswortMusterSSL-Handshake wird ausgeführt...Permanente VariablenPermanente VariablenPermanente VariablePluginPlugin '%s' geladen.Plugin ist bereits geladen. Versuchen Sie es zu aktivieren.Plugin deaktiviert.Plugin aktiviert.Plugin ist nicht geladen.Kein Plugin angegeben.Plugin Nummer %d Name: %s Version: %s Beschreibung: %s Autor: %s Aktiv: %s PluginsPort:EinstellungenDatum und Zeit Protokolleinträgen _voranstellenDrücken Sie eine Taste um deren Tastencode zu erhalten.Drücken Sie die Taste, die das Makro aktiviert, solange sich der Cursor in der Textbox befindet.Drücken Sie die Taste, die diesem Makro zugeordnet werden sollProtokoll %s nicht eingeschaltet.NetzwerkProxyserverProxyserver_typ:Die Authentifizierung am Proxy ist fehlgeschlagen.Proxyserver:Proxy-Port:Proxy-Anfrage fehlgeschlagen: %s.Typ des Proxyservers:Ausgewählten Befehl in die Befehlseingabe schreibenAusgewählten Befehl in die Befehlseingabe schreiben und diesen Dialog schließenRotRot (fett)Auf Standardfarben _zurücksetzenSoll KildClient wirklich beendet werden?Wirklich schließen?Erneut aufrufen und schließenErneut verbindenRotRot (fett)Löse Hostnamen %s auf...Löse Proxy-Hostnamen %s auf...Auf Standard _zurücksetzenRewriterRechtsSOCKS4SOCKS5SSL-Handshake schlug fehl: %sSSL wird in dieser Version nicht unterstütztVerwendetes SSL Protokoll:S_enden & Schließen_Reichtschreibprüfung aktivierenS_tatistiken...SkripteBeim _Empfang automatisch scrollenSe_nde diesen Befehl:Suchrichtung:Wählen, falls die Anzeige der Verbindungszeit nicht gewünscht istWählen, wenn die Untätigkeitszeit nicht angezeigt werden sollWählen, wenn die Verbindungszeit in Stunden, Minuten und Sekunden angezeigt werden sollWählen, wenn die Verbindungszeit in Sekunden angezeigt werden sollWählen, wenn die Untätigkeitszeit in Stunden, Minuten und Sekunden angezeigt werden sollWählen, wenn die Untätigkeitszeit in Sekunden angezeigt werden sollAuswahl der ProtokolldateiWähle eine Schriftart für das Hauptfenster:Wähle eine Schriftart für die Statuszeile:Schriftart, die in der Befehlseingabe verwendet werden soll:Schriftart für die BefehlseingabeWähle eine Schrift für die HauptausgabeSchriftart, die in der Statuszeile verwendet wirdWählen, wenn jeder Zeile im Protokoll Datum und Zeit vorangestellt werden sollen.Wählen, um Zeilen aus dem Hauptfenster ins Protokoll zu schreiben.Sende den/die gewählte(n) Befehl(e) zum MUDSende den/die gewählte(n) Befehl(e) zum MUD und schließe diesen DialogSende diesen Text _zuerst:SendenSending Verbindungsanfrage...Sende Authentifizierungsdaten an den Proxyserver...Serveradresse:Serverport:EinfachGeben Sie an, wieviele Befehle auf einen Schlag gesendet werden dürfenAnzahl der Zeilen, die auf einmal gesendet werdenGeben Sie an, wie oft ein Timer ausgeführt werden soll, bevor er gelöscht oder deaktiviert wirdText, der an jede gesendete Zeile angehangen wirdText, der an jede gesendete Zeile angehangen wirdGeben Sie das Kommando an, mit dem der Webbrowser gestartet werden kannGeben Sie den Befehl an, mit dem Klangdateien abgespielt werden können.Geben Sie eine Verzögerung für das Senden einer Gruppe von Befehlen anVerzögerung beim Senden mehrerer ZeilenGeben Sie das Interval in Sekunden ein zwischen dem die Timer ausgelöst werdenGeben Sie die maximale Anzahl an gleichen Befehlen an, die auf einen Schlag gesendet werden dürfenMinimal Anzahl an Zeichen für die AutovervollständigungGeben Sie die Anzahl an Befehlen an, die in am Ende gesichert und beim nächsten Mal wieder aufgerufen werden könnenAnzahl der Zeilen, die im Speicher gehalten werden sollenGeben Sie das Trennzeichen an, das für Befehle in der Befehlseingabe verwendet werden sollDie Unterstützung für die Rechtschreibprüfung ist nicht verfügbar.S_tartStatistikenStatuszeileStilDienst DN:Ersetzen%s erfolgreich verschoben.TTL abgelaufenTemporärTrigger testenStandardmäßig werden alle Zeilen mit Datum und Uhrzeit beginnend angezeigt. Es kann aber wie bei strftime() ein benutzerdefiniertes Format eingestellt werden (Siehe Handbuch für eine Beschreibung).Die Hilfe wird im Hauptfenster angezeigt.Der Interval muss positiv sein.Zutreffender Teil NummerDie Trigger werden auf den Text, der hier eingegeben wird, angewendet als wäre er vom MUD empfangen wordenGanze ZeilenGanzer zutreffender TextDann sende den Inhalt dieser _Datei:Es sind noch %d Welten verbunden. Soll trotzdem beendet werden?Eine Welt ist noch verbunden. Soll trotzdem beendet werden?Diese Ausgabe wäre im Hauptfenster erschienen. Wenn die Ausgabe leer ist wurde die Zeile gaged. Sie kann verschieden von der ursprünglichen Zeile sein, wenn Rewriter Trigger angewendet wurden.Diese Ausgabe wäre im Hauptfenster erschienen:Dieses Objekt gehört zu einem Plugin. Änderungen, die hier gemacht werden, werden nicht im Plugin gespeichert.Diese Version von KildClient enthält keine Unterstützung für SSL-Verschlüsselung.Timer hinzugefügt.Timer geändert.Timer Nummer %d Name: %s Interval: %.3f Wiederholungen: %d Aktion: %s Aktiv: %s Temporär: %s TimerObenTrigger hinzugefügt.Triger wurde verändert.Trigger Nummer %d Name: %s Muster: %s Aktion: %s Aktiv: %s Ignoriere Groß-/Kleinschreibung: %s Gag-Ausgabe: %s Gag ins Protkoll: %s Ausführung beibehalten: %s Rewriter: %s Stiländerung: %s TriggerKann nicht mit %s verbinden: %sKann nicht mit %s verbinden: Fehler #%d.Kann nicht mit Proxy %s verbinden: %sKann nicht mit Proxy %s verbinden: Fehler #%d.UnbekanntUnbekannte Direktive '%s' in der Konfigurationsdatei. Unbekannter Protokoll.Namenlose WeltUnverständliche Antwort vom Proxyserver.Verwenden Sie stattdessen $window->getsize().Verwenden Sie stattdessen $window->minimize().Verwenden Sie stattdessen $world->path().Verwenden Sie %Kw um den Weltnamen und %Kc um den Charakternamen zu repräsentieren_SSL-Verschlüsselung verwendenFettschrift für leuchtende Farben verwenden (statt einfacher Aufhellung)Mehrzeilige Befehlseingabe verwendenSystemeinstellungen verwenden_Einzeilige Befehlseingabe verwendenVerwenden Sie den Suchknopf, um das erste Vorkommen zu suchen.Gültig seit:VariablenVersionVersion %s dieses Plugins bereits geladen.Besuchen Sie http://www.kildclient.orgWeiß (fett)Warnung: Es soll eine sehr lange Kommandozeile gesendet werden. Wurde ein Alias rekursiv definiert?Warnung: die Funktion getwindowsize() ist veraltet und wird entfernt!Warnung: Die Funktion minimize() ist veraltet und wird bald entfernt.Warnung: Die Funktion path() ist veraltet und wird bald entfernt.WeißWeiß (fett)Weltname:Welt gesichert.Wäre diese Zeile im Protokoll erschienen?Geschrieben von Eduardo M Kalinowski (eduardo@kalinowski.com.br) Gelb (fett)GelbGelb (fett)JaWird dieses Feld leer gelassen, wird automatisch ein Dateiname generiert. Nur bearbeiten, wenn man sicher ist, was man tut!Ein Variablenname muss angegeben werden.So lange der Trigger kein Gag ist oder den einen Stil ändert, muss eine Aktion angegeben werden.Die Aktion muss angegeben werden.Der Schlüssel muss angegeben werden.Ein Name muss angegeben werden.Ein Passwort muss angegeben werden..Das Muster muss angegeben werden.Die Ersetzung muss angegeben werden.Es wird versucht mit einer Welt zu verbinden, die SSL verwendet. Diese Version von Kildclient wurde aber ohne SSL-Unterstützung erstellt. Soll die Verbindung ohne SSL-Verschlüsselung versucht werden?[WELT...\Ü_ber_Aktion:_Hinzufügen_Anwenden auf:_Nachfragen, wenn Objekte wie Trigger oder Alias gelöscht werden_Hintergrund:Schwarz_Abbrechen_ZurücksetzenS_chließenBefehls-_Echo:_KopierenLinkadresse _kopierenZyan_Verzögerung_Verzögerung in Sekunden zwischen dem Senden:_Löschen_Deaktivieren_Verbindung trennen_AnzeigeDiese Meldung _nicht noch einmal anzeigen_Nicht beendenA_bwärts_AbwärtsBefehls_echo (gesendete Befehle in der Hauptausgabe wiedergeben)_Bearbeiten_Bearbeiten..._Aktivieren, wenn der Server es direkt nach dem Verbinden anbietet_Aktiv_Ereignis:_Datei:Sende _schließlich diesen Text:_Suchen_Suchen:Fenster _Blinken lassen, wenn neuer Text empfangen wurde_VordergrundV_ordergrund:_Format:Grün_Hilfe_Verstecke Tabs, wenn nur eine Welt geöffnet ist_Server:_Untätigkeitszeit:Groß-/Kleinschreibung beim Mustervergleich _ignorieren_Importieren_Protokolliere die letzten_Informative Meldungen:_Eingabe_Interval:_Kursiv:Zu exportierende _ElementeDialog nach dem Senden _geöffnet lassenAuch bei Auslösung _weitere Trigger ausführen_Letzten Befehl in der Befehlseingabe belassen_Taste:_Zeilenanzahl, die im Puffer gespeichert werden soll:_LadenMagentaHand_buch_Mehrzeiliges senden..._Name der permanenten Variable:_Name:_Neu_NächsteAnzahl an Befehlen, die in der Historie gespeichert werden sollen:_Anzahl an Zeilen/Kommandos, die auf einmal gesendet werden können:_OKÖ_ffnenLink ö_ffnenÖ_ffnen...Pas_swort:E_infügen_Muster:_Perl Skript, das geladen werden soll:_Port:_Einstellungen_Einstellungen..._Vorherige_BeendenErneut aufrufen_Erneut verbinden_Wiederholungen:_Rewriter Trigger_Speichern_Eine bekannte Welt wählen:_Senden_Zeige in Plugins definierte Objekte_Stoppen_Befehlshistorie beim Beenden in einer Datei ablegen_Durchgestrichen:_Ersetzung:_Tab-Position:_Temporär (wird gelöscht, sobald der Wiederholungszähler 0 erreicht)Trigger _testen...Zu suchender _Text:_Unterstreichen:Au_fwärts_AufwärtsBen_utzername:Weiß_WeltZeilen am _Wortende umbrechenGelb_gleichen Befehlen pro ZeileAddresstyp wird nicht unterstütztAliasalias: Alias wird ohne Muster nicht erzeugtalias: Alias wird ohne Ersetzung nicht erzeugtAliaseCharaktereingegebene ZeichenBefehl wird nicht unterstützt / ProtokollfehlerBefehl(e)Die Regeln verbieten die VerbindungVerbindung wurde von der Gegenstelle abgelehntAllgemeiner FehlerHookHook: Hook '%s' nicht gefunden HooksGegenstelle nicht erreichbarZeile(n)Zeilen des AusgabepuffersMakroMakro: Kein solches Makro vorhandenMakrosnNetzwerk nicht erreichbarNeinAnfrage fehlgeschlagen, da der IDENT-Server die Benutzeridentifikation nicht bestätigt hatAnfrage fehlgeschlagen, da der IDENT-Server nicht erreichbar warAnfrage wurde abgelehnt oder schlug fehl_Sekunden alleSekunden_Sekunden alleTimerTimer: Kein solcher Timer vorhanden.TimerTriggerTriggerUnbekannter Grund.jJakildclient-3.0.0/po/sv.gmo0000644000175000017500000012752012376346024012345 00000000000000? $0~0 0000001 121H1"_1"1111&1292(V22222'2)3*323 93C3T3g3{33 3333 4 4 $404 I4V4l44 44 4444 5535F5b5Bs5+5$56(6"76Z6 c6p667# 7 /7*:70e7677 77 7 7 7 8 88 $808@8P8W8t8 88 88&889 +9 89B9JR9L9D9B/:tr:I:D1;?v;<;G;<;<&x<1<5<===2=E=b=y=== ====;=":>Q]>8>C>8,?e?x?(?/?#?@""@E@d@'}@ @@6@A/AGA$dAAAAAA AA AAAB BB B 'B,3B`BpBB BBB%BBC%!CGC)ZC CC CC#C$C2D2:DmD9tDD DDD D D E,EAEYE&aE1E1E1E'FFF1eF2F.F2FW,GZGDG$H#AHeHHH H HH HHH II*I/I HI UI `IjI yI-I I III IICIuBJFJJK K KK+K]wKKK4KL' LHL2]L LLLLLLLLMM"M 2M>MFM[MoMMMM MMLMNN/N7N FNRN aNoNNNNNNN+N OO&O /O :O FO TObO qOOO OO OOOOO.PAPIP@YPP%P PPPPQQ-Q4Q'HQpQQQQkQ%R-R 3RZ?R0R RR RR S SS 7S1CSGuSS SSS TT T(T ,T7TLTgTzT!TT TTT TTUU=,U7jUTUAUN9V;VV)V(V/'W-WW.W&W'W<X@X[XcX+XX XX*X'XM&Y0tY-Y;YFZSVZGZSZ2F[y[ [ [[[ [%[[\%\59\4o\1\Z\51] g]t]] ^^^!^(_'D_.l__'_ _&_` `A`]`Df``-` ` `a, a9a YaHgaCa?a4b :b Gb Sb,`b<bbb bbb!xccccc d)d ddd d dddeeee(e.e,5ebeje see"e e eeeeeeef f'f 8f DfQfZfaf$gff ffff ffff- g8g$>gcglg$tgggg'g*ggh hh h'h .h8hLh Sh`h phzhh hhhhh hhhJiOi ^iji si~iiiiii)ii ij&j Ej&Qjxjjjjjjjjjj kk k&k,kAkHkJkNk|immmnn)nDn$^nnnn#n#no%o=o,Qo~o#o-oo p'p9p+Up-ppp ppppq q)5q_qxqq qqqqqrryMyEy@,z`mz>z/ {@={O~{{{{{"|4|K|g|}| ||||?|$$}UI}:}E}9 ~Z~l~,|~1~!~~ !:$\-!7'>X%w"   !* 9D L<X ΁ہ %?\%c( Ă Ђ ܂ #08,i= ڃ/>M2]" +56"7Y0#…<;#5_:pІ}AL! 0._#";ƈ    %/?(Clp  Ɖ2Ӊ "+ 2?M[J; Qc k u. (<>N`hw Í΍׍ &@Rh}O  #1@Hh { 0Ǐ -9J\p  ƐԐ 6.V N) 2 >HQf{ 3 <x]֓b>^  ٔ  5QP !%֕ ,8 >J`{і!  4 L4V5N:OK;ט77@W>Cי5.QBÚޚ-3 BO6W2T?>V7;͜T D^BA( 0 :HMi y! &Ǟ86'5^o/4DV %*6*a/)â&'B!j Q ; H Wa4i Eʤ@<Q (< $/ 4?B&Ŧ!8Tn   ,7>FLT]r w5 ͨڨ   # 0 >JPnt,{ ȩϩ*ש " < GS\+r: ٪$*ELP(X4 « Ы ۫ , ?M V bo! Ь ެTA Xfn~& # -!9[zծ#ٮ $*EKM@ =mh}v~b{"g\ S,rz^f.L-4"ND;pd,|7& 7>DZ_\T 3j'!9L(K6Y1JHe5!0PQN;v[dUCk~})%ix#b0?qw3:6F`R'&/./9#<)62<g%&1|xjQ$:WpHiElA5Ts:tM$7u,-_{a$c^%>A4oe"  Pf4oz U;qOGXJE05(a?hm*X>Y8'W <BIn(8+]* u=r1R382sk= S CBy2/Kw- 9G[ +I  t`nyV+  ]@).l!MV?O*FZ#c Target: %d Foreground: %d Background: %d Italics: %d Striked-thru: %d Underline: %d SSL enabled.%d %s deleted.%d lines%s is already permanent.%s: %s is already permanent%s: %s is not permanent%s: Argument must be numeric%s: No such world%s: Too few arguments%s: Too few arguments.%s: Variable '%s' made permanent. %s: Variable '%s' made temporary. %s: Wrong argument type%s: Wrong number of arguments.%s: Wrong type of reference%s: action not specified, not creating%s: count must be numeric%s: interval must be numeric%s: interval not specified, not creating%s: invalid bg color%s: invalid fg color%s: invalid target%s: invalid underline style%s: pattern not specified, not creating(Leave blank for default based on locale)0 lines1 line: Expired: Not yet activeAnsi ColorsAudio PlayerAuto-loginCharacter SetColors used by KildClientCommand EntryConnectionDefault ColorsFileFlood preventionFontGraphical EditorsInputLogging StatusMCCP (for compression)Name displayNote:OptionsProxyRevert to default colorsScriptingScrollingSending DelaysTime DisplayWeb BrowserWindow configurationWord WrapA mud client with powerful features and support for Perl ScriptingA_utomatically start logging when connectedActi_vate auto-completion only afterActionAdd this to the _beginning of each line:Add this to the _end of each line:AdvancedAlias added.Alias modified.Alias number %d Name: %s Pattern: %s Substitution: %s Ignore case: %s Eval as Perl: %s Enabled: %s AliasesAlways load this plugin at _startupAppearanceAre you sure you want to close this world?Attempting to connect to host %s (%s) port %s...Attempting to connect to proxy host %s (%s) port %s...AuthorAutomationB_lueBac_kgroundBl_ack (bold)Bl_ue (bold)BlackBlack (bold)BlueBlue (bold)Bold backgroundBold foregroundBottomBytes received (compressed):Bytes received (decompressed):C_hange styleC_ommand separator:C_onfigure...C_onnected time:Cannot load a plugin in another world.Cannot open help file.Ch_aracters in this mud:Change StyleCharacterCharacter _set:Check if you want the highlighted ANSI colors to be displayed in bold alsoCheck this if the text you type is displayed as black dots in the input box.Check to enable command auto-completion (based on previous commands)Check to have the command history saved in a file between sessionsCheck to have the last command kept in the command entry box, so that you can repeat commands only by pressing ENTERCheck to have the main window scroll to the end whenever new output comesCheck to have the timer deleted after its repeat count has reached 0Check to make the alias enabled; only enabled aliases are triedCheck to make the macro enabled; only enabled macros are runCheck to make the matched line not be printed in the main output windowCheck to make the timer enabled; only enabled timers are runClick to clear the command input area.Click to open link; right-click for more options.Click to revert all colors to their built-in defaultsColorsCommand HistoryCommand _History...Command not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _Another...Connect to another worldConnect without SSLConnected to host %s (%s) port %s, MCCP version %d enabled.Connected to host %s (%s) port %s.Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d enabled.Connected to host %s port %s, via proxy %s (%s) port %s.Connected to proxy server %s port %s, negotiating authentication...Connected to proxy server %s port %s, sending request...Connection _style:Connection time:Could not connect to host %s port %s: %sCould not connect to host %s port %s: Error #%dCould not create directory '%s': %sCould not create socket: %sCould not create socket: error #%dCould not import file '%s': %sCould not load plugin %sCould not load world from file '%s': %sCould not open dump file %s: %s Could not open file '%s': %sCould not open file '%s': %s Variables were not saved.Could not open file.Could not open file: %sCould not open log file: %s.Could not open raw dump file %s: %s Could not open world '%s': %s Could not resolve host %s: %sCountCount Cu_tCya_n (bold)CyanCyan (bold)DIRD_eleteDefaultDefault (bold)Dela_yDeleteDescriptionDirectory to store settings and saved worldsDisable T_imersDisable _AliasesDisable _MacrosDisconnectedDisconnected from host %s.Disconnected from host %s: %s.Disconnected from host %s: error #%d.Disconnected from world %sDisplayDisplay as hours, minutes and secondsDisplay as secondsDo not allow the _same command to be sentDo not changeDo not connectDo not deleteDo not displayDo you really want to delete %d %s?Do you really want to delete the %s?Do you really want to make %d variables temporary?Do you really want to make the variable temporary?DoubleDumps all data received (possibly compressed) to the fileE_xportEdit AliasEdit Character InformationEdit Default _World...Edit MacroEdit TimerEdit WorldElement '%s' not allowed inside element '%s'Enable _auto-completionEnabledEnter a descriptive name for the WorldEnter optionally a descriptive name for the aliasEnter optionally a descriptive name for the macroEnter optionally a descriptive name for the timerEnter some text to be sent to the WorldEnter some text to search for.Enter the action to be run when the event happensEnter the action to be run when the key is pressedEnter the character's name for automatic loginEnter the character's password for automatic loginEnter the command to run a web browser. %s will be substituted by the web page address.Enter the command to run an audio player program. %s will be substituted by the file path.Enter the default parameters for sending multiple lines or commands:Enter the host to connect toEnter the port used when connectingEnter the text to search forError Loading PluginError in plugin file: %sError setting spell checker: %s Eval as PerlEvent:Expiration:ExportExternal ProgramsFILEFailed loading file %s: %sFileFile name not specified.Find CommandFind N_extFind NextFind P_reviousFind _nextFind a command containing a given search termFingerprint:G_reen (bold)GeneralGreenGreen (bold)Help topic not found.Here you can set options to configure the appearance of KildClient.Here you can set options to configure the automation features of KildClient, such as triggers, aliases, plugins, etc.Hook number %d for event %s Name: %s Action: %s Enabled: %s Hooks for '%s': Host:Hostname:Idle time:If this is checked, when there is only one open world no tabs will be shownIf this is selected, logging will be automatically started whenever you connect to the world.ImportInputInternal error: element '%s' ends when in START modeIntervalInvalid attribute '%s' for element '%s'Invalid plugin file.Invalid window size specification in config file. Keep _openKeep permanentKeyKildClient ErrorKildClient InformationKildClient QuestionKildClient WarningKildClient readyLanguage code:LeftLines received:Load pluginLoggingLogging is disabled.Logging not startedLogging stopped.Logging to file %s.Logging to file %s. MAC:Macro added.Macro modified.Macro number %d Name: %s Key Code: %s Action: %s Enabled: %s MacrosMagen_ta (bold)MagentaMagenta (bold)Main WindowMake temporaryMiscellaneousMore than one command selected.N/AN_umber of lines:NameNever _hide the typed textNoNo %s deleted.No acceptable proxy authentication methods.No auto-loginNo command selected.No proxyNo such %sNo such %s.No such aliasNo such macroNo such pluginNo such timerNo worldNoneNot connectedNot connected.Not foundNot setNum Ena %-*.*s %-*.*s Num Ena %-*.*s Version %-*.*s Num Eval Ena IgC %-*.*s %-*.*s Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s OfflineOne %s deleted.Only _reset idle time counter when a command is entered directlyOr connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPermanent VariablesPermanent variablesPermenent variablePluginPlugin '%s' loaded.Plugin already loaded. Try enabling it.Plugin disabled.Plugin enabled.Plugin not loaded.Plugin not specifiedPlugin number %d Name: %s Version: %s Description: %s Author: %s Enabled: %s PluginsPort:PreferencesPress the key that will be used to activate the macro while the cursor is in the text box.Press the key that will be used to run the macroProtocolsProxyProxy _type:Proxy authentication failed.Proxy host:Proxy port:Proxy request failed: %s.Proxy type:Put the selected command in the command entry boxPut the selected command in the command entry box and close this dialogR_edRe_d (bold)Re_vert to default colorsReally Quit KildClient?Really close?Rec_all & CloseReconnectRedRed (bold)Resolving host %s...Resolving proxy host %s...Revert to _defaultRightSSL not supported in this versionSSL protocol used:S_end & CloseS_pell check typed textS_tatistics...ScriptingScroll on _outputSe_nd this command:Search direction:Select if you do not want the connection time to be displayedSelect if you do not want the idle time to be displayedSelect if you want the connection time to be displayed in hours, minutes and secondsSelect if you want the connection time to be displayed in secondsSelect if you want the idle time to be displayed in hours, minutes and secondsSelect if you want the idle time to be displayed in secondsSelect log fileSelect the font used in the _main screen:Select the font used in the _status bar:Select the font used in the command _entry box:Select the font used in the command entry boxSelect the font used in the main output screenSelect the font used in the status barSend the selected command(s) to the mudSend the selected command(s) to the mud and close the dialogSend this text _initially:SendingSending connection request...Sending proxy authentication credentials...Server _address:Server _port:SingleSpecify how many commands are sent at onceSpecify how many lines are sent at onceSpecify how many times this timer should run before being disabled or deletedSpecify the command used to launch a web browserSpecify the command used to play sound files.Specify the interval, in seconds, between timer activationsSpecify the maximum number of equal commands that can be sent in a rowSpecify the number of characters that must be typed for command completion to startSpecify the number of commands that are saved and can be later recalledSpecify the number of lines of output that can be seen with by scrolling the windowSpell checking support not included in this build.St_artStatisticsStatus BarStyleSuccessfully moved %s.TTL expiredThe help is displayed in main window.The interval must be positive.The whole lineThen send the _contents of this file:There are %d open worlds. Do you really want to quit?There is one open world. Do you really want to quit?This is what would be printed in the main screen:This object belongs to a plugin. Changes made here will not be saved in the plugin.This version of KildClient does not have SSL support.Timer added.Timer modified.Timer number %d Name: %s Interval: %.3f Repeat count: %d Action: %s Enabled: %s Temporary: %s TimersTopTrigger number %d Name: %s Pattern: %s Action: %s Enabled: %s Ignore case: %s Gag output: %s Gag in log: %s Keep executing: %s Rewriter: %s Change style: %s Unable to connect to host %s: %s.Unable to connect to host %s: Error #%d.Unable to connect to proxy host %s: %s.Unable to connect to proxy host %s: Error #%d.UnknownUnknown directive '%s' in config file. Unnamed worldUnrecognized response from proxy host.Use $window->getsize() instead.Use $window->minimize() instead.Use $world->path() instead.Use _SSLUse _bold font for highlighted colors (instead of just highlighting)Use global settingsUse the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit http://www.kildclient.orgW_hite (bold)Warning: the getwindowsize() function is deprecated and will be removed.Warning: the minimize() function is deprecated and will be removed.Warning: the path() function is deprecated and will be removed.WhiteWhite (bold)World name:World saved.Would this line be included in the log file?Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br) Yell_ow (bold)YellowYellow (bold)YesYou can leave this field blank, and a file name will be automatically generated. Only edit this field if you know what you are doing.You must specify a variable name.You must specify the action.You must specify the key.You must specify the name.You must specify the password.You must specify the pattern.You're attempting to connect to a world that uses SSL, but this version of KildClient has been built without SSL support. Try to connect without SSL?[WORLD...]_About_Action:_Apply to:_Background:_Black_Cancel_Clear_Close_Copy_Copy link address_Cyan_Delay_Delay between each group of lines/commands:_Delete_Disable_Disconnect_Display_Do not display this message again_Don't quit_Downwards_Edit_Edit..._Enabled_Event:_File:_Finally, send this text:_Find_Find:_Flash window when new text is received_Foreground_Foreground:_Format:_Green_Help_Hide tabs if only one world is open_Host:_Idle time:_Import_Informative messages:_Input_Interval:_Italic:_Items to export_Keep dialog open after sending_Keep last typed command in command entry box_Key:_Lines to save in scrollback buffer:_Magenta_Manual_Name of variable to make permanent:_Name:_New_Next_Number of commands to save in history:_Number of lines/commands to send at once:_OK_Open_Open link_Open..._Password:_Paste_Pattern:_Perl file to load:_Port:_Preferences_Preferences..._Previous_Quit_Recall_Reconnect_Repeat count:_Save_Select a saved world:_Send_Store commands between sessions_Striked-thru:_Tab position:_Temporary (will be deleted automatically when its repeat count reaches 0)_Text to find:_Underline:_Upwards_Username:_White_World_Yellow_times in a rowaddress type not supportedaliasalias: not creating alias without patternaliasescharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection refused by destination hosthook: hook '%s' not found host unreachableline(s)macromacro: No such macromacrosnnetwork unreachablenorequest rejected or failedsec_onds eachsecondsseconds e_achtimertimer: No such timertimersyyesProject-Id-Version: KildClient 3.0.0 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general POT-Creation-Date: 2014-08-17 14:59-0300 PO-Revision-Date: 2014-08-17 16:22-0300 Last-Translator: Niklas Grahn Language-Team: Niklas Grahn Language: sv MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Swedish X-Poedit-Country: SWEDEN Plural-Forms: nplurals=2; plural=(n != 1); Mål: %d Förgrund: %d Bakgrund: %d Kursiv: %d Genomstrykning: %d Understreck: %d SSL avktiverat.%d %s borttagen.%d rader%s är redan permanent.%s: %s är redan permanent%s: %s är inte permanent%s: Argumentet måste vara numeriskt%s: Ingen sådan värld%s: För få argument%s: För få argument.%s: Variabel '%s' gjord permanent. %s: Variabel '%s' gjord temporär. %s: Fel argumentstyp%s: Fel antal argument.%s: Fel referenstyp%s: åtgärden är inte angiven, skapar inte%s: antal måste vara numeriskt%s: intervall måste vara numeriskt%s: intervallet är inte angivet, skapar inte%s: ogiltig bakgrundsfärg%s: ogiltig förgrundsfärg%s: ogiltigt mål%s: ogiltig understreckstil%s: mönstret är inte angivet, skapar inte(lämna tomt för standard baserad på lokal)0 rader1 rad: Utgått: Inte ännu aktivAnsifärgerLjuduppspelareAutomatisk inloggningTeckenkodningFärger som används av KildClientKommandoinmatningAnslutningStandardfärgerFilFörhindra massutskickTypsnittGrafiska redigerareInmatningLoggningstatusMCCP (för komprimering)TidsangivelseObservera:AlternativProxyÅtergå till standardfärgerSkriptningRullningSändningsfördröjningarTidsangivelseWebbläsareFönsterkonfigurationRadbrytningEn mudklient med kraftfulla funktioner och stöd för PerlskriptningS_tarta loggning automatiskt vid anslutningA_ktivera bara automatisk komplettering efter attÅtgärdLägg till detta till _början av varje rad:Lägg till detta till _slutet av varje rad:AvanceratAlias tillagt.Alias modifierat.Aliasnummer %d Namn: %s Mönster: %s Substitution: %s Ignorera skiftläge: %s Eval som Perl: %s Aktiverat: %s AliasLäs alltid in denna insticksmodul vid _uppstartUtseendeÄr du säker på att du vill stänga denna värld?Försöker ansluta till värd %s (%s) port %s...Försöker ansluta till proxyvärd %s (%s) port %s...UpphovsmanAutomatiseringB_låBa_kgrundSv_art (fet)Bl_å (fet)_SvartSv_art (fet)BlåBl_å (fet)Fet bakgrundFet förgrundNederkantAntal mottagna byte (komprimerade):Antal mottagna byte (okomprimerade):B_yt stilK_ommandoseparator:K_onfigurera...A_nsluten tid:Kan inte läsa in insticksmodul i en annan värld.Kan inte öppna hjälpfil.Ka_raktärer i denna mud:Byt stilKaraktärTecken_kodning:Markera om du vill att de färgmarkerade ANSI-färgerna även ska visas i fetstilMarkera detta om texten du skriver visas som svarta punkter i inmatningsrutan.Markera för att aktivera automatisk komplettering (baserad på föregående kommandon)Markera för att spara kommandohistoriken i en fil mellan sessionerMarkera för att behålla det senaste kommandot i kommandoinmatningsrutan, så att du kan upprepa kommandon genom att bara trycka RETURMarkera för att låta huvudfönstret rulla till slutet varje gång ny utmatning mottagesMarkera för att ta bort tiduret efter att dess antal upprepningar nått nollMarkera för att aktivera alias; bara aktiverade alias försökes medMarkera för att aktivera makrot; bara aktiverade makrotar körsMarkera för att göra så att den matchade raden inte skrivs ut i huvudfönstret för utmatningMarkera för att aktivera tiduret; bara aktiverade tidur körsKlicka för att tömma kommandoinmatningsrutan.Klicka för att öppna länk; högerklicka för fler alternativ.Klicka för att låta alla färger återgå till deras inbyggda standardvärdenFärgerKommandohistoriaKommando_historiaKommando hittades inte.Kommandon som skulle bli skickade:Komprimeringsalgoritm:Komprimeringsförhållande:Använd komprimering:Bekräfta borttagelseAnslut tillAnslut till _en annan...Anslut till en annan världAnslut utan SSLAnsluten till värd %s (%s) port %s, MCCP-version %d aktiverad.Ansluten till värd %s (%s) port %s.Ansluten till värd %s port %s, via proxy %s (%s) port %s, MCCP-version %d aktiverad.Ansluten till värd %s port %s, via proxy %s (%s) port %s.Ansluten till proxyserver %s port %s, förhandlar om autentisering...Ansluten till proxyserver %s port %s, skickar begäran...Anslutnings_stil:Anslutningstid:Kunde inte ansluta till värd %s port %s: %sKunde inte ansluta till värd %s port %s: Fel #%dKunde inte skapa katalog '%s': %sKunde inte skapa sockel: %sKunde inte skapa sockel: fel #%dKunde inte importera fil '%s': %sKunde inte läsa in insticksmodul %sKunde inte läsa in värld från fil '%s': %sKunde inte öppna dumpfil %s: %s Kunde inte öppna fil '%s: %sKunde inte öppna fil '%s': %s Variabler sparades inte.Kunde inte öppna fil.Kunde inte öppna fil: %sKunde inte öppna loggfil: %s.Kunde inte öppna rå dumpfil %s: %s Kunde inte öppna värld '%s': %s Kunde inte slå upp värd %s: %sAntalAntalKlipp _utCya_n (fet)CyanCya_n (fet)KAT_Ta bortStandardStandard (fet)Fördrö_jTa bortBeskrivningKatalog för att lagra inställningar och sparade världar iInaktivera t_idurInaktivera _aliasInaktivera _makrotarFrånkoppladFrånkopplad från värd %s.Frånkopplad från värd %s: %s.Frånkopplad från värd %s: fel #%d.Frånkopplad från värld %sSkärmVisa som timmar, minuter och sekunderVisa som sekunderTillåt inte att _samma kommando skickasÄndra inteAnslut inteTa inte bortVisa inteVill du verkligen ta bort %d %s?Vill du verkligen ta bort filen %s?Vill du verkligen göra %d variabler temporära?Vill du verkligen göra variabeln temporär?BådaDumpar alla mottagna data (möjligen komprimerade) till filenE_xporteraRedigera aliasRedigera karaktärsinformationRedigera standard_värld...Redigera makroRedigera tidurRedigera världElement '%s' är inte tillåtet inuti element '%s'Aktivera _automatisk kompletteringAktiverat(d)Skriv in ett beskrivande namn för VärldenSkriv in, om du vill, ett beskrivande namn för aliasSkriv in, om du vill, ett beskrivande namn för makrotSkriv in, om du vill, ett beskrivande namn för tiduretSkriv in lite text som ska skickas till VärldenSkriv in lite text att söka efter.Skriv in åtgärden som ska vidtas då händelsen inträffarSkriv in åtgärden som ska vidtas då tangenten trycks nedSkriv in karaktärens namn för automatisk inloggningSkriv in karaktärens lösenord för automatisk inloggningSkriv in kommandot som ska användas för att köra en webbläsare. %s kommer att ersättas av webbsideadressen.Skriv in kommandot som ska användas för att köra ett ljuduppspelarprogram. %s kommer att ersättas av sökvägen för fil.Skriv in standardparametrarna för sändning av flera rader eller kommandon:Skriv in värden att ansluta tillSkriv in porten som ska användas vid anslutningSkriv in texten att söka efterFel vid inläsning av insticksmodulFel i filen för insticksmodul: %sFel uppstod vid inställning av stavningskontrollerare: %s Eval som PerlHändelse:Utlöper:ExporteraExterna programFILMisslyckades med att läsa in fil %s: %sFilFilnamnet är inte angivet.Sök kommandoSök n_ästaSök nästaSök _föregåendeSök _nästaSök ett kommando innehållandes en given söktermFingeravtryck:G_rön (fet)Allmänt_GrönG_rön (fet)Hjälprubrik hittades inte.Här kan du justera inställningar för att konfigurera KildClients utseende.Här kan du justera inställningar för att konfigurera KildClients automatiserande funktioner så som triggers, alias, insticksmoduler etcetera.Hook number %d for event %s Namn: %s Åtgärd: %s Aktiverat: %s Hooks for '%s': Värd:Värdnamn:Passiv tid:Om detta markeras kommer inga flikar att visas om det bara finns en öppen världOm detta markeras kommer loggning att påbörjas automatiskt varje gång du ansluter till världen.ImporteraInmatningInternt fel: element '%s' slutar i START-lägeIntervallOgiltigt attribut '%s' för element '%s'Ogiltig fil för insticksmodul.Ogiltig angivelse för fönsterstorlek i konfigurationsfil. Behåll _öppenBehåll permanentTangentKildClient-felKildClient-informationKildClient-frågaKildClient-varningKildClient redoSpråkkod:VänsterAntal mottagna rader:Läs in insticksmodulLoggningLoggning är inaktiverad.Loggning har inte startatLoggning stoppad.Loggar till filen %s.Loggar till fil %s. MAC:Makro tillagt.Makro modifierat.Makronummer %d Namn: %s Key Code: %s Åtgärd: %s Aktiverat: %s MakrotarMagen_ta (fet)_MagentaMagen_ta (fet)HuvudfönsterGör temporärDiverseFler än ett kommando markerat.Inte tillgängligtA_ntal rader:NamnDölj _aldrig den skrivna textenNejIngen %s borttagen.Inga acceptabla metoder för proxyautentisering.Ingen automatisk inloggningInget kommando markerat.Ingen proxyInget sådant %sInget sådant %s.Inget sådant aliasInget sådant makroIngen sådan insticksmodulInget sådant tidurIngen världIngenInte anslutenInte ansluten.Hittades inteInte inställtNum Ena %-*.*s %-*.*s Num Ena %-*.*s Version %-*.*s Num Eval Ena IgC %-*.*s %-*.*s Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s FrånkoppladEn %s borttagen._Återställ räknaren för passiv tid bara när ett kommando skrivs in direktEller anslut d_irekt:Matar ut versionsinformation och avslutarLösen_ord:LösenordMönsterPermanenta variablerPermanenta variablerPermanent variabelInsticksmodulInsticksmodul '%s' inläst.Insticksmodul redan inläst. Försök aktivera den.Insticksmodul inaktiverad.Insticksmodul aktiverad.Insticksmodul inte inläst.Insticksmodulen är inte angivenInsticksmodulsnummer %d Namn: %s Version: %s Beskrivning: %s Upphovsman: %s Aktiverad: %s InsticksmodulerPort:InställningarTryck tangenten som ska användas för att aktivera makrot då markören befinner sig i textrutan.Tryck tangenten som kommer att användas för att köra makrotProtokollProxyProxy_typ:Proxyautentisering misslyckades.Proxyvärd:Proxyport:Proxybegäran misslyckades: %s.Proxytyp:Placera det valda kommandot i kommandoinmatningsrutanPlacera det valda kommandot i kommandoinmatningsrutan och stäng denna dialogrutaR_ödR_öd (fet)Åt_erställ till standardfärgerVill du verkligen avsluta KildClient?Vill du verkligen stänga?Åter_kalla & stängÅteranslutR_ödR_öd (fet)Slår upp värd %s...Slår upp proxyvärd %s...Återgå till _standardHögerSSL stöds inte i denna versionSSL-protokoll använt:S_kicka och stängS_tavninskontrollera skriven textS_tatistik...SkriptningRulla vid _utmatningSki_cka detta kommando:Sökväg:Välj om du vill att anslutningstiden inte ska visasVälj om du vill att den passiva tiden inte ska visasVälj om du vill att anslutningstiden ska visas i timmar, minuter och sekunderVälj om du vill att anslutningstiden ska visas i sekunderVälj om du vill att den passiva tiden ska visas i timmar, minuter och sekunderVälj om du vill att den passiva tiden ska visas i sekunderMarkera loggfilMarkera typsnittet som ska användas i huvud_fönstret:Markera typsnittet som ska användas i _statusmätaren:Markera typsnittet som ska användas i kommando_inmatningsrutan:Markera typsnittet som ska användas i kommandoinmatningsrutanMarkera typsnittet som ska användas i huvudskärmen för utmatningMarkera typsnittet som ska användas i statusmätarenSkicka det(de) valda kommandot(na) till muden Skicka det(de) valda kommandot(na) till muden och stäng fönstretSkicka _först denna text:SkickarSkickar anslutningsbegäran...Skickar referenser för proxyautentisering...Server_adress:Server_port:EnskildAnge hur många kommandon som ska skickas på en gångAnge hur många rader som ska skickas på en gångAnge hur många gånger detta tidur bör köras innan det inaktiveras eller tas bortAnge kommandot som ska användas för att starta en webbläsareAnge kommandot som ska användas för att spela upp ljudfiler.Ange intervallet, i sekunder, mellan tidursaktiveringarAnge det maximala antalet samma rader som kan skickas i radAnge antalet tecken som måste skrivas in för att kommandokomplettering ska startasAnge antalet kommandon som ska sparas och som senare kan återkallasAnge antalet utmatningsrader som kan ses genom att rulla fönstretStöd för stavningskontroll är inte inkluderat i denna version.Sta_rtaStatistikStatusmätareStilFlyttade framgångsrikt %s.TTL har utgåttHjälpen visas i huvudfönstret.Intervallet måste vara positivt.Hela radenSkicka sedan _innehållet i denna fil:Det finns %d öppna världar. Vill du verkligen avsluta?Det finns en öppen värld. Vill du verkligen avsluta?Detta är vad som skulle skrivas ut i huvudfönstret:Detta objekt tillhör en insticksmodul. Ändringar gjorda här kommer inte att sparas i insticksmodulen.Denna version av KildClient har inte SSL-stöd.Tidur tillaggt.Tidur modifierat.Tidursnummer %d Namn: %s Intervall: %.3f Antal upprepningar: %d Åtgärd: %s Aktiverat: %s Temporärt: %s TidurÖverkantTrigger number %d Namn: %s Mönster: %s Åtgärd: %s Aktiverat: %s Ignorera skiftläge: %s Gag output: %s Gag in log: %s Fortsätt verkställa: %s Rewriter: %s Byt stil: %s Kunde inte ansluta till värd %s: %s.Kunde inte ansluta till värd %s: Fel #%d.Kunde inte ansluta till proxyvärd %s: %s.Kunde inte ansluta till proxyvärd %s: Fel #%d.OkändOkänd katalog '%s' i konfigurationsfil. Namnlös världOkänt svar från proxyvärd.Använd $windows->getsize() istället.Använd $windows->minimize() istället.Använd $world->path() istället.Använd _SSLAnvänd _fet typsnitt för markerade färger (istället för bara färgmarkering)Använd allmänna inställningarAnvänd sök-knappen för att hitta det första resultatet.Giltigt sedan:VariablerVersionVersion %s av denna insticksmodul är redan inläst.Besök http://www.kildclient.orgV_it (fet)Varning: funktionen getwindowsize() avrådes och kommer att tas bort.Varning: funktionen minimize() avrådes och kommer att tas bort.Varning: funktionen path() avrådes och kommer att tas bort._VitV_it (fet)Namn på värld:Värld sparad.Skulle denna rad inkluderas i loggfilen?Skrivet av Eduardo M Kalinowski (eduardo@kalinowski.com.br) Gu_l (fet)_GulGu_l (fet)JaDu kan lämna detta fält tomt, och ett filnamn kommer att genereras automatiskt. Redigera bara detta fält om du vet vad du gör.Du måste ange ett namn på variabeln.Du måste ange åtgärden.Du måste ange tangenten.Du måste ange namnet.Du måste ange lösenordet.Du måste ange mönstret.Du försöker ansluta till en värld som använder SSL, men denna version av KildClient har kompilerats utan SSL-stöd. Försök ansluta utan SSL?[VÄRLD...]_Om_Åtgärd:_Tillämpa på:_Bakgrund:_Svart_Avbryt_TömS_täng_Kopiera_Kopiera länkadressCyan_Fördröj_Fördröjning mellan varje grupp av rader/kommandon:_Ta bort_Inaktivera_Frånkoppla_Skärm_Visa inte detta meddelande igenAvsluta _inte_Nedåt_Redigera_Redigera..._Aktiverat(d)_Händelse:_Fil:Skicka _till sist denna text:_Sök_Sök:_Låt fönstret blinka när ny text mottages_Förgrund_Förgrund:_Format:_Grön_Hjälp_Dölj flikar om bara en värld är öppen_Värd:_Tid passiv:_Importera_Informativa meddelanden:_Inmatning_Intervall:_Kursiv:_Objekt att exportera_Behåll dialogrutan öppen efter sändning_Behåll senast skrivna kommando i kommandoinmatningsrutan_Tangent:_Rader att spara i rullningsbuffert:_Magenta_Handbok_Variabelns namn som ska göras permanent:_Namn:_Ny_Nästa_Antal kommandon att spara i historiken:_Antal rader/kommandon som ska skickas på en gång:_OK_Öppna_Öppna länk_Öppna..._Lösenord:Klistra _in_Mönster:_Perlfil att läsa in:_Port:_Inställningar_Inställningar..._Föregående_Avsluta_Återkalla_Återanslut_Antal upprepningar:_Spara_Markera en sparad värld:_Skicka_Lagra kommandon mellan sessioner_Genomstrykt:_Flikposition_Temporärt (kommer att tas bort automatiskt när dess antal upprepningar når noll)_Text att söka efter:_Understreck:_Uppåt_Användarnamn:_Vit_Värld_Gul_gånger i radadresstyp stöds intealiasalias: skapar inte alias utan mönsteraliaskaraktärtecken har skrivits inkommando stöds inte / protokollfelkommando(n)anslutning vägrades av målvärdhook: hook '%s' hittades inte värd oåtkomlig:a/e radmakromakro: Inget sådant makromakrotarnnätverk oåtkomligtnejbegäran nekades eller misslyckadessek_under varsekund(er)sekunder v_artidurtidur: Inget sådant tidurtidurjjakildclient-3.0.0/po/pt_BR.po0000644000175000017500000027323712376346024012566 00000000000000# KildClient messages in Portuguese (Brazilian) # Copyright (C) 2004-2014 Eduardo M Kalinowski # This file is distributed under the same license as the KildClient package. # msgid "" msgstr "" "Project-Id-Version: KildClient 3.0.0\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=glib&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2014-08-17 14:59-0300\n" "PO-Revision-Date: 2014-08-17 17:09-0300\n" "Last-Translator: Eduardo M Kalinowski \n" "Language-Team: Eduardo M Kalinowski \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/main.c:74 msgid "Outputs version information and exits" msgstr "Mostra a informação da versão e sai" #: ../src/main.c:76 msgid "Directory to store settings and saved worlds" msgstr "Diretório para salvar a configuração e mundos salvos" #: ../src/main.c:76 msgid "DIR" msgstr "DIR" #: ../src/main.c:78 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "" "Escreve todos os dados recebidos (depois de descomprimir, se apropriado) ao " "arquivo" #: ../src/main.c:79 ../src/main.c:82 msgid "FILE" msgstr "ARQUIVO" #: ../src/main.c:81 msgid "Dumps all data received (possibly compressed) to the file" msgstr "" "Escreve todos os dados recebidos (possivelmente comprimidos) ao arquivo" #. Parse command-line options #: ../src/main.c:120 msgid "[WORLD...]" msgstr "[MUNDO...]" #: ../src/main.c:127 #, c-format msgid "Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" msgstr "Escrito por Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" #: ../src/main.c:132 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "Impossível abrir arquivo de dump %s: %s\n" #: ../src/main.c:139 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "Impossível abrir arquivo de dump bruto %s: %s\n" #: ../src/main.c:282 msgid "There is one open world. Do you really want to quit?" msgstr "Há um mundo aberto. Você deseja realmente sair?" #: ../src/main.c:288 #, c-format msgid "There are %d open worlds. Do you really want to quit?" msgstr "Há %d mundos abertos. Você deseja realmente sair?" #: ../src/main.c:291 msgid "Really Quit KildClient?" msgstr "Realmente sair do KildClient?" #: ../src/main.c:293 msgid "_Don't quit" msgstr "_Não sair" #: ../src/main.c:294 ../src/wndmain.ui:145 msgid "_Quit" msgstr "_Sair" #: ../src/net.c:110 msgid "" "You're attempting to connect to a world that uses SSL, but this version of " "KildClient has been built without SSL support. Try to connect without SSL?" msgstr "" "Você está tentando se conectar a um host que usa SSL, mas esta versão do " "KildClient foi compilada sem suporte a SSL. Conectar sem SSL?" #: ../src/net.c:111 msgid "KildClient Question" msgstr "Questão - KildClient" #: ../src/net.c:113 msgid "Connect without SSL" msgstr "Conectar sem SSL" #: ../src/net.c:114 msgid "Do not connect" msgstr "Não conectar" #: ../src/net.c:122 msgid "This version of KildClient does not have SSL support." msgstr "Esta versão do KildClient não tem suporte a SSL." #: ../src/net.c:198 ../src/proxy.c:212 #, c-format msgid "Resolving proxy host %s..." msgstr "Procurando host proxy %s..." #: ../src/net.c:201 #, c-format msgid "Resolving host %s..." msgstr "Procurando host %s..." #: ../src/net.c:294 ../src/proxy.c:196 #, c-format msgid "Could not resolve host %s: %s" msgstr "Não foi possível encontrar o host %s: %s" #: ../src/net.c:322 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "Tentando se conectar ao host %s (%s) porta %s..." #: ../src/net.c:325 #, c-format msgid "Attempting to connect to proxy host %s (%s) port %s..." msgstr "Tentando se conectar ao host proxy %s (%s) porta %s..." #: ../src/net.c:341 #, c-format msgid "Could not create socket: %s" msgstr "Não foi possível criar o socket: %s" #: ../src/net.c:344 #, c-format msgid "Could not create socket: error #%d" msgstr "Não foi possível criar o socket: erro #%d" #: ../src/net.c:364 #, c-format msgid "Could not connect to host %s port %s: %s" msgstr "Impossível conectar ao host %s porta %s: %s" #: ../src/net.c:374 #, c-format msgid "Could not connect to host %s port %s: Error #%d" msgstr "Impossível conectar ao host %s porta %s: Erro #%d" #: ../src/net.c:430 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Impossível conectar ao host %s: %s" #: ../src/net.c:433 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Impossível conectar ao host proxy %s: %s" #: ../src/net.c:475 ../src/net.c:493 #, c-format msgid "Unable to connect to host %s: Error #%d." msgstr "Impossível conectar ao host %s: Erro #%d" #: ../src/net.c:478 ../src/net.c:496 #, c-format msgid "Unable to connect to proxy host %s: Error #%d." msgstr "Impossível conectar ao host proxy %s: Erro #%d" #: ../src/net.c:532 #, c-format msgid "Performing SSL handshake..." msgstr "Iniciando SSL..." #: ../src/net.c:582 #, c-format msgid "SSL Handshake failed: %s" msgstr "Negociação SSL falhou: %s" #: ../src/net.c:624 #, c-format msgid "SSL Handshake took too long." msgstr "Handshake SSL demorou demais." #: ../src/net.c:653 ../src/net.c:1156 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Conectado ao host %s (%s) porta %s." #: ../src/net.c:656 ../src/net.c:1159 #, c-format msgid "Connected to host %s port %s, via proxy %s (%s) port %s." msgstr "Conectado ao host %s porta %s, via proxy %s (%s) porta %s." #: ../src/net.c:663 ../src/net.c:1132 ../src/net.c:1166 msgid " SSL enabled." msgstr "SSL habilitado." #: ../src/net.c:681 ../src/perlscript.c:3234 #, c-format msgid "Logging to file %s.\n" msgstr "Logando para o arquivo %s.\n" #: ../src/net.c:827 #, c-format msgid "Disconnected from host %s." msgstr "Desconectado do host %s." #: ../src/net.c:900 ../src/net.c:909 #, c-format msgid "Disconnected from host %s: %s." msgstr "Desconectado do host %s: %s." #: ../src/net.c:920 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "Desconectado do host %s: erro #%d." #: ../src/net.c:1120 #, c-format msgid "Connected to host %s (%s) port %s, MCCP version %d enabled." msgstr "Conectado ao host %s (%s) porta %s, MCCP versão %d habilitado." #: ../src/net.c:1124 #, c-format msgid "" "Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d " "enabled." msgstr "" "Conectado ao host %s porta %s, via proxy %s (%s) porta %s, MCCP versão %d " "habilitado." #: ../src/net.c:1242 ../src/we_logging.c:123 msgid "Not connected." msgstr "Não conectado." #. success #: ../src/proxy.c:60 msgid "general failure" msgstr "falha geral" #: ../src/proxy.c:61 msgid "connection not allowed by ruleset" msgstr "conexão não permitida pelo conjunto de regras" #: ../src/proxy.c:62 msgid "network unreachable" msgstr "rede inatingível" #: ../src/proxy.c:63 msgid "host unreachable" msgstr "host de destino inatingível" #: ../src/proxy.c:64 msgid "connection refused by destination host" msgstr "conexão recusada pelo host destino" #: ../src/proxy.c:65 msgid "TTL expired" msgstr "TTL expirou" #: ../src/proxy.c:66 msgid "command not supported / protocol error" msgstr "comando não suportado / erro de protocolo" #: ../src/proxy.c:67 msgid "address type not supported" msgstr "tipo de endereçamento não suportado" #: ../src/proxy.c:242 ../src/proxy.c:664 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "Conectado ao servidor proxy %s porta %s, enviando pedido..." #: ../src/proxy.c:297 ../src/proxy.c:426 ../src/proxy.c:471 ../src/proxy.c:545 #: ../src/proxy.c:711 msgid "Error while reading from proxy host." msgstr "Erro ao ler do servidor proxy." #: ../src/proxy.c:318 msgid "request rejected or failed" msgstr "pedido recusado ou falhou" #: ../src/proxy.c:322 msgid "request failed because identd could not be reached" msgstr "pedido falhou pois o servidor identd não pode ser alcançado" #: ../src/proxy.c:326 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" "pedido falhou pois o identd do cliente não pode confirmar o ID de usuário no " "pedido" #: ../src/proxy.c:330 ../src/proxy.c:571 ../src/proxy.c:727 #, c-format msgid "Proxy request failed: %s." msgstr "Pedido ao proxy falhou: %s." #: ../src/proxy.c:347 #, c-format msgid "Connected to proxy server %s port %s, negotiating authentication..." msgstr "Conectado ao servidor proxy %s porta %s, negociando autenticação..." #: ../src/proxy.c:441 msgid "No acceptable proxy authentication methods." msgstr "Nenhum método de autenticação aceitável." #: ../src/proxy.c:489 msgid "Proxy authentication failed." msgstr "Autenticação com o servidor proxy falhou." #. Should never happen #: ../src/proxy.c:532 msgid "Unrecognized response from proxy host." msgstr "Resposta do servidor proxy não foi reconhecida." #: ../src/proxy.c:566 msgid "unknown reason code" msgstr "código de resposta desconhecido" #: ../src/proxy.c:587 #, c-format msgid "Sending proxy authentication credentials..." msgstr "Enviando credenciais de autenticação ao servidor proxy..." #: ../src/proxy.c:626 #, c-format msgid "Sending connection request..." msgstr "Enviando pedido de conexão..." #: ../src/mainwindow.c:163 ../src/mainwindow.c:537 ../src/mainwindow.c:803 #: ../src/worldgui.c:1096 ../src/worldselector.c:193 ../src/worldeditor.c:180 #: ../src/we_general.c:342 ../src/we_generic_guied.c:81 #: ../src/we_triggers.c:83 ../src/we_triggers.c:553 ../src/we_triggers.c:751 #: ../src/we_aliases.c:76 ../src/we_aliases.c:455 ../src/we_macros.c:79 #: ../src/we_macros.c:420 ../src/we_timers.c:76 ../src/we_timers.c:457 #: ../src/we_hooks.c:87 ../src/we_hooks.c:620 ../src/we_vars.c:76 #: ../src/we_vars.c:368 ../src/prefs.c:107 ../src/triggers.c:278 #: ../src/multilinesend.c:93 ../src/cmdhistory.c:209 ../src/cmdhistory.c:454 #, c-format msgid "Error loading UI from XML file: %s" msgstr "Erro ao carregar interface do arquivo XML: %s" #: ../src/mainwindow.c:596 ../src/mainwindow.c:597 msgid "Not connected" msgstr "Não conectado" #: ../src/mainwindow.c:739 msgid ": Not yet active" msgstr ": Não ativo ainda" #: ../src/mainwindow.c:744 msgid ": Expired" msgstr ": Expirou" #: ../src/mainwindow.c:758 ../src/kildclient.ui:1995 #: ../src/dlgStatistics.ui:104 ../src/dlgStatistics.ui:337 msgid "None" msgstr "Nenhuma" #: ../src/worldgui.c:220 msgid "_Find:" msgstr "_Procurar:" #: ../src/worldgui.c:234 msgid "Find Next" msgstr "Encontrar próximo" #: ../src/worldgui.c:261 msgid "Click to clear the command input area." msgstr "Clique para limpar a área de entrada de comandos." #: ../src/worldgui.c:360 msgid "No world" msgstr "Nenhum mundo" #: ../src/worldgui.c:430 msgid "KildClient ready" msgstr "KildClient pronto" #: ../src/worldgui.c:437 msgid "0 lines" msgstr "0 linhas" #: ../src/worldgui.c:890 msgid "Are you sure you want to close this world?" msgstr "Você realmente deseja fechar este mundo?" #: ../src/worldgui.c:891 msgid "Really close?" msgstr "Realmente fechar?" #: ../src/worldgui.c:893 msgid "Keep _open" msgstr "Manter _aberto" #: ../src/worldgui.c:894 ../src/worldselector.c:816 ../src/worldselector.c:822 #: ../src/wndmain.ui:72 ../src/dlgPreferences.ui:136 #: ../src/dlgTestTriggers.ui:23 ../src/dlgCmdHistory.ui:197 msgid "_Close" msgstr "_Fechar" #: ../src/worldgui.c:1025 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Erro ao configurar verificador ortográfico: %s\n" #: ../src/worldgui.c:1029 msgid "Spell checking support not included in this build." msgstr "Correção ortográfica não incluída nessa versão." #: ../src/worldgui.c:1275 msgid "Click to open link; right-click for more options." msgstr "Clique para abrir; clique com o botão direito para mais opções." #: ../src/worldgui.c:1437 msgid "Not found" msgstr "Não encontrado" #: ../src/ansitextview.c:423 msgid "1 line" msgstr "1 linha" #: ../src/ansitextview.c:425 #, c-format msgid "%d lines" msgstr "%d linhas" #: ../src/worldselector.c:138 ../src/worldselector.c:689 #, c-format msgid "Could not load world from file '%s': %s" msgstr "Impossível carregar mundo do arquivo '%s': %s" #: ../src/worldselector.c:141 ../src/worldselector.c:692 ../src/worlds.c:2370 #: ../src/we_generic_guied.c:315 ../src/we_generic_guied.c:404 #: ../src/prefs.c:448 ../src/prefs.c:527 msgid "KildClient Error" msgstr "Erro - KildClient" #: ../src/worldselector.c:494 #, c-format msgid "Could not open world '%s': %s\n" msgstr "Impossível abrir mundo '%s': %s\n" #: ../src/worldselector.c:537 #, c-format msgid "Invalid argument '%s'\n" msgstr "Argumento '%s' inválido\n" #: ../src/worldselector.c:810 msgid "Disconnected" msgstr "Desconectado" #: ../src/worldselector.c:813 ../src/worldselector.c:820 msgid "Reconnect" msgstr "Reconectar" #: ../src/worldselector.c:814 ../src/worldselector.c:821 msgid "Connect to another world" msgstr "Conectar a outro mundo" #: ../src/worldselector.c:815 msgid "Offline" msgstr "Offline" #: ../src/worlds.c:776 msgid "Unnamed world" msgstr "Mundo sem nome" #: ../src/worlds.c:833 #, c-format msgid "Could not open file: %s" msgstr "Impossível abrir arquivo: %s" #: ../src/worlds.c:896 #, c-format msgid "Invalid top-level element '%s'" msgstr "Elemento '%s' inválido" #: ../src/worlds.c:1710 #, c-format msgid "Internal error: element '%s' ends when in START mode" msgstr "Erro interno: elemento '%s' termina quando no modo START" #: ../src/worlds.c:1984 #, c-format msgid "Invalid key code '%s'" msgstr "Código de tecla '%s' inválido" #: ../src/worlds.c:2003 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "Elemento '%s' não permitido dentro do elemento '%s'" #: ../src/worlds.c:2016 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "Atributo '%s' inválido para o elemento '%s'" #: ../src/worlds.c:2367 ../src/we_generic_guied.c:312 ../src/prefs.c:445 #, c-format msgid "Could not open file '%s': %s" msgstr "Impossível abrir arquivo '%s': %s" #: ../src/worlds.c:2528 #, c-format msgid "Disconnected from world %s" msgstr "Desconectado do mundo %s." #: ../src/worldeditor.c:245 msgid "General" msgstr "Geral" #: ../src/worldeditor.c:253 ../src/worldeditor.c:257 msgid "Display" msgstr "Aparência" #: ../src/worldeditor.c:254 msgid "Here you can set options to configure the appearance of KildClient." msgstr "" "Aqui você pode definir opções para configurar a aparência do KildClient." #: ../src/worldeditor.c:265 msgid "Main Window" msgstr "Janela Principal" #: ../src/worldeditor.c:273 msgid "Colors" msgstr "Cores" #: ../src/worldeditor.c:281 msgid "Status Bar" msgstr "Barra de Status" #: ../src/worldeditor.c:289 msgid "Input" msgstr "Entrada" #: ../src/worldeditor.c:297 msgid "Logging" msgstr "Log" #: ../src/worldeditor.c:303 ../src/worldeditor.c:307 msgid "Automation" msgstr "Automação" #: ../src/worldeditor.c:304 msgid "" "Here you can set options to configure the automation features of KildClient, " "such as triggers, aliases, plugins, etc." msgstr "" "Aqui você pode definir opções para configurar os recursos de automação do " "KildClient, como triggers, aliases, plugins, etc." #: ../src/worldeditor.c:315 msgid "Scripting" msgstr "Scripts" #: ../src/worldeditor.c:323 msgid "Plugins" msgstr "Plugins" #: ../src/worldeditor.c:334 ../src/kildclient.ui:1556 msgid "Triggers" msgstr "Triggers" #: ../src/worldeditor.c:345 ../src/kildclient.ui:1571 msgid "Aliases" msgstr "Aliases" #: ../src/worldeditor.c:356 ../src/kildclient.ui:1586 msgid "Macros" msgstr "Macros" #: ../src/worldeditor.c:367 ../src/kildclient.ui:1601 msgid "Timers" msgstr "Timers" #: ../src/worldeditor.c:378 msgid "Hooks" msgstr "Hooks" #: ../src/worldeditor.c:389 msgid "Variables" msgstr "Variáveis" #: ../src/worldeditor.c:398 msgid "Protocols" msgstr "Protocolos" #: ../src/worldeditor.c:406 msgid "Miscellaneous" msgstr "Outros" #: ../src/worldeditor.c:414 msgid "Advanced" msgstr "Avançado" #: ../src/we_general.c:73 msgid "Character" msgstr "Personagem" #: ../src/we_general.c:81 msgid "Password" msgstr "Senha" #: ../src/we_general.c:381 msgid "You must specify the name." msgstr "Você deve especificar o nome." #: ../src/we_general.c:382 ../src/we_general.c:395 ../src/we_triggers.c:636 #: ../src/we_triggers.c:650 ../src/we_aliases.c:517 ../src/we_aliases.c:530 #: ../src/we_macros.c:477 ../src/we_macros.c:490 ../src/we_macros.c:503 #: ../src/we_timers.c:516 ../src/we_timers.c:529 ../src/we_hooks.c:672 #: ../src/we_vars.c:396 ../src/we_vars.c:408 ../src/we_vars.c:428 #: ../src/permanentvariables.c:129 ../src/cmdhistory.c:278 #: ../src/cmdhistory.c:290 ../src/cmdhistory.c:484 ../src/cmdhistory.c:517 #: ../src/cmdhistory.c:574 msgid "KildClient Warning" msgstr "Aviso - KildClient" #: ../src/we_general.c:394 msgid "You must specify the password." msgstr "Você deve especificar a senha." #: ../src/we_general.c:436 msgid "character" msgstr "personagem" #: ../src/we_logging.c:112 #, c-format msgid "Logging to file %s." msgstr "Logando para o arquivo %s." #: ../src/we_logging.c:118 msgid "Logging is disabled." msgstr "Log está desabilitado." #: ../src/we_logging.c:215 msgid "Logging not started" msgstr "Log não iniciado." #: ../src/we_logging.c:245 msgid "Select log file" msgstr "Selecione arquivo de log" #: ../src/we_logging.c:248 ../src/we_plugins.c:584 #: ../src/we_generic_guied.c:97 ../src/we_generic_guied.c:369 #: ../src/kildclient.ui:40 ../src/kildclient.ui:516 ../src/kildclient.ui:580 #: ../src/kildclient.ui:711 ../src/kildclient.ui:908 ../src/kildclient.ui:1125 #: ../src/kildclient.ui:1449 ../src/kildclient.ui:2170 #: ../src/dlgSelectWorld.ui:25 ../src/dlgEditWorld.ui:114 #: ../src/dlgMLSend.ui:36 ../src/dlgCmdHistory.ui:352 msgid "_Cancel" msgstr "_Cancelar" #: ../src/we_logging.c:250 ../src/kildclient.ui:55 ../src/kildclient.ui:531 #: ../src/kildclient.ui:595 ../src/kildclient.ui:726 ../src/kildclient.ui:923 #: ../src/kildclient.ui:1140 ../src/kildclient.ui:1464 #: ../src/kildclient.ui:2185 ../src/dlgStatistics.ui:22 #: ../src/dlgEditWorld.ui:129 ../src/dlgCmdHistory.ui:367 msgid "_OK" msgstr "_OK" #: ../src/we_plugins.c:124 ../src/we_plugins.c:341 ../src/we_triggers.c:225 #: ../src/we_aliases.c:206 ../src/we_macros.c:209 ../src/we_timers.c:206 #: ../src/we_hooks.c:341 ../src/perlscript.c:3356 msgid "Name" msgstr "Nome" #: ../src/we_plugins.c:136 ../src/we_plugins.c:383 ../src/perlscript.c:3357 msgid "Description" msgstr "Descrição" #: ../src/we_plugins.c:148 ../src/we_plugins.c:369 msgid "Author" msgstr "Autor" #: ../src/we_plugins.c:161 msgid "File" msgstr "Arquivo" #: ../src/we_plugins.c:209 ../src/we_plugins.c:466 msgid "Error Loading Plugin" msgstr "Erro ao Carregar Plugin" #: ../src/we_plugins.c:327 ../src/we_triggers.c:211 ../src/we_aliases.c:192 #: ../src/we_macros.c:195 ../src/we_timers.c:192 ../src/we_hooks.c:327 msgid "Enabled" msgstr "Habilitado" #: ../src/we_plugins.c:355 msgid "Version" msgstr "Versão" #: ../src/we_plugins.c:444 msgid "Always load this plugin at _startup" msgstr "_Sempre carregar esse plugin ao iniciar" #: ../src/we_plugins.c:507 msgid "The help is displayed in main window." msgstr "A ajuda foi exibida na janela principal." #: ../src/we_plugins.c:508 msgid "KildClient Information" msgstr "Informação - KildClient" #: ../src/we_plugins.c:509 msgid "_Do not display this message again" msgstr "_Não mostrar esta mensagem novamente" #: ../src/we_plugins.c:581 msgid "Load plugin" msgstr "Carregar plugin" #: ../src/we_plugins.c:586 ../src/we_generic_guied.c:371 msgid "_Open" msgstr "_Abrir" #: ../src/we_generic_guied.c:94 msgid "Export" msgstr "Exportar" #: ../src/we_generic_guied.c:99 ../src/wndmain.ui:97 msgid "_Save" msgstr "_Salvar" #: ../src/we_generic_guied.c:366 msgid "Import" msgstr "Importar" #: ../src/we_generic_guied.c:401 #, c-format msgid "Could not import file '%s': %s" msgstr "Impossível importar arquivo '%s': %s" #: ../src/we_generic_guied.c:960 #, c-format msgid "Do you really want to delete the %s?" msgstr "Você realmente deseja apagar o %s?" #: ../src/we_generic_guied.c:967 #, c-format msgid "Do you really want to delete %d %s?" msgstr "Você realmente deseja apagar %d %s?" #: ../src/we_generic_guied.c:971 ../src/we_vars.c:288 msgid "Confirm deletion" msgstr "Confirmar deleção" #: ../src/we_generic_guied.c:973 msgid "Do not delete" msgstr "Não excluir" #: ../src/we_generic_guied.c:974 msgid "Delete" msgstr "Excluir" #: ../src/we_triggers.c:130 ../src/dlgTestTriggers.ui:8 msgid "Test Triggers" msgstr "Testar Triggers" #: ../src/we_triggers.c:239 ../src/we_aliases.c:220 ../src/triggers.c:141 #: ../src/aliases.c:177 msgid "Pattern" msgstr "Padrão" #: ../src/we_triggers.c:257 ../src/we_aliases.c:238 msgid "I. Case" msgstr "I. Caixa" #: ../src/we_triggers.c:271 ../src/we_macros.c:237 ../src/we_timers.c:246 #: ../src/we_hooks.c:355 ../src/triggers.c:142 ../src/macros.c:145 #: ../src/timers.c:203 msgid "Action" msgstr "Ação" #: ../src/we_triggers.c:289 msgid "Gag" msgstr "Gag" #: ../src/we_triggers.c:307 msgid "Gag Log" msgstr "Gag Log" #: ../src/we_triggers.c:325 msgid "Keep Exec" msgstr "Cont Exec" #: ../src/we_triggers.c:343 msgid "Rewriter" msgstr "Reescritor" #: ../src/we_triggers.c:361 msgid "Style" msgstr "Estilo" #: ../src/we_triggers.c:375 ../src/we_aliases.c:284 ../src/we_macros.c:251 #: ../src/we_timers.c:278 ../src/we_hooks.c:369 msgid "Plugin" msgstr "Plugin" #: ../src/we_triggers.c:471 ../share/kildclient.pl:233 #: ../share/kildclient.pl:236 ../share/kildclient.pl:443 #: ../share/kildclient.pl:518 ../share/kildclient.pl:821 msgid "trigger" msgstr "trigger" #: ../src/we_triggers.c:471 ../share/kildclient.pl:443 msgid "triggers" msgstr "triggers" #: ../src/we_triggers.c:635 ../src/we_aliases.c:516 msgid "You must specify the pattern." msgstr "Você deve especificar o padrão." #: ../src/we_triggers.c:649 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" "Você deve especificar a ação, a não ser que o trigger seja um gag ou altere " "o estilo." #: ../src/we_aliases.c:252 ../src/aliases.c:178 msgid "Substitution" msgstr "Substituição" #: ../src/we_aliases.c:270 msgid "Eval as Perl" msgstr "Avaliar como Perl" #: ../src/we_aliases.c:380 ../share/kildclient.pl:246 #: ../share/kildclient.pl:249 ../share/kildclient.pl:449 #: ../share/kildclient.pl:524 ../share/kildclient.pl:833 msgid "alias" msgstr "alias" #: ../src/we_aliases.c:380 ../share/kildclient.pl:449 msgid "aliases" msgstr "aliases" #: ../src/we_aliases.c:529 msgid "You must specify the substitution." msgstr "Você deve especificar a substituição." #: ../src/we_macros.c:223 ../src/macros.c:144 msgid "Key" msgstr "Tecla" #: ../src/we_macros.c:347 ../share/kildclient.pl:259 #: ../share/kildclient.pl:262 ../share/kildclient.pl:455 #: ../share/kildclient.pl:530 ../share/kildclient.pl:845 msgid "macro" msgstr "macro" #: ../src/we_macros.c:347 ../share/kildclient.pl:455 msgid "macros" msgstr "macros" #: ../src/we_macros.c:476 msgid "You must specify the key." msgstr "Você deve especificar a tecla." #: ../src/we_macros.c:489 msgid "Invalid key code." msgstr "Código de tecla inválido." #: ../src/we_macros.c:502 ../src/we_timers.c:528 ../src/we_hooks.c:671 msgid "You must specify the action." msgstr "Você deve especificar a ação." #: ../src/we_timers.c:219 msgid "Interval" msgstr "Intervalo" #: ../src/we_timers.c:232 msgid "Count" msgstr "Vezes" #: ../src/we_timers.c:264 msgid "Temp" msgstr "Temp" #: ../src/we_timers.c:381 ../share/kildclient.pl:272 #: ../share/kildclient.pl:275 ../share/kildclient.pl:461 #: ../share/kildclient.pl:536 ../share/kildclient.pl:857 msgid "timer" msgstr "timer" #: ../src/we_timers.c:381 ../share/kildclient.pl:461 msgid "timers" msgstr "timers" #: ../src/we_timers.c:515 msgid "The interval must be positive." msgstr "O intervalo deve ser positivo." #. The manually added combo for selecting which hook #: ../src/we_hooks.c:130 msgid "_Event:" msgstr "_Evento:" #: ../src/we_hooks.c:547 ../share/kildclient.pl:286 ../share/kildclient.pl:289 #: ../share/kildclient.pl:467 ../share/kildclient.pl:543 #: ../share/kildclient.pl:870 msgid "hook" msgstr "hook" #: ../src/we_hooks.c:547 ../share/kildclient.pl:467 msgid "hooks" msgstr "hooks" #: ../src/we_vars.c:279 msgid "Do you really want to make the variable temporary?" msgstr "Você realmente deseja tornar a variável temporária?" #: ../src/we_vars.c:285 #, c-format msgid "Do you really want to make %d variables temporary?" msgstr "Você realmente deseja tornar %d variáveis temporárias?" #: ../src/we_vars.c:290 msgid "Keep permanent" msgstr "Manter permanente" #: ../src/we_vars.c:291 msgid "Make temporary" msgstr "Manter temporária" #: ../src/we_vars.c:395 msgid "You must specify a variable name." msgstr "Você deve especificar o nome de uma variável." #: ../src/we_vars.c:407 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "" "Apenas variáveis escalares ($), arrays (@) e hashes (%%) podem ser feitas " "permanentes." #: ../src/we_vars.c:426 #, c-format msgid "%s is already permanent." msgstr "%s já é permanente." #: ../src/prefs.c:398 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "" "Especificação de tamanho de janela inválida no arquivo de configuração.\n" #: ../src/prefs.c:418 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "Diretiva '%s' desconhecida no arquivo de configuração.\n" #: ../src/prefs.c:524 #, c-format msgid "Could not create directory '%s': %s" msgstr "Impossível criar diretório '%s': %s" #: ../src/parser.c:210 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "" "Aviso: Tentando enviar uma linha muito longa. Talvez uma definição recursiva " "de alias?" #: ../src/triggers.c:140 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "Núm Gag GLo Hab KeE ReE IgC Est %-*.*s %-*.*s\n" #: ../src/triggers.c:162 ../src/triggers.c:163 ../src/triggers.c:164 #: ../src/triggers.c:165 ../src/triggers.c:166 ../src/triggers.c:167 #: ../src/triggers.c:168 ../src/aliases.c:198 ../src/aliases.c:199 #: ../src/aliases.c:200 ../src/macros.c:167 ../src/timers.c:226 #: ../src/timers.c:227 ../src/hooks.c:206 ../src/perlscript.c:3376 msgid "y" msgstr "s" #: ../src/triggers.c:162 ../src/triggers.c:163 ../src/triggers.c:164 #: ../src/triggers.c:165 ../src/triggers.c:166 ../src/triggers.c:167 #: ../src/triggers.c:168 ../src/aliases.c:198 ../src/aliases.c:199 #: ../src/aliases.c:200 ../src/macros.c:167 ../src/timers.c:226 #: ../src/timers.c:227 ../src/hooks.c:206 ../src/perlscript.c:3376 msgid "n" msgstr "n" #: ../src/triggers.c:361 ../src/kildclient.ui:1978 ../src/kildclient.ui:2015 msgid "No" msgstr "Não" #: ../src/triggers.c:361 ../src/kildclient.ui:1981 ../src/kildclient.ui:2018 msgid "Yes" msgstr "Sim" #: ../src/aliases.c:176 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "Núm Aval Hab IgC %-*.*s %-*.*s\n" #: ../src/macros.c:143 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "Núm Hab %-*.*s %-*.*s\n" #: ../src/timers.c:195 msgid "Num Ena Temp Int " msgstr "Num Hab Temp Int" #: ../src/timers.c:199 msgid "Count " msgstr "Vezes " #: ../src/permanentvariables.c:125 #, c-format msgid "" "Could not open file '%s': %s\n" "Variables were not saved." msgstr "" "Impossível abrir arquivo '%s': %s\n" "Variáveis não foram salvas." #: ../src/hooks.c:60 #, c-format msgid "hook: hook '%s' not found\n" msgstr "hook: hook '%s' não encontrado\n" #: ../src/hooks.c:76 ../src/hooks.c:229 msgid "No such hook" msgstr "Não existe tal hook" #: ../src/hooks.c:178 ../src/hooks.c:224 msgid "Hook not found" msgstr "Hook não encontrado" #: ../src/hooks.c:191 #, c-format msgid "Hooks for '%s':\n" msgstr "Hooks para '%s':\n" #: ../src/hooks.c:192 msgid "Num Ena Action" msgstr "Num Hab Ação" #: ../src/hooks.c:234 #, c-format msgid "" "Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Hook número %d para o evento %s\n" " Nome: %s\n" " Ação: %s\n" " Habilitado: %s\n" #: ../src/hooks.c:240 ../src/perlscript.c:1691 ../src/perlscript.c:2191 #: ../src/perlscript.c:2501 ../src/perlscript.c:2790 msgid "Not set" msgstr "Não definido" #: ../src/hooks.c:242 ../src/perlscript.c:1694 ../src/perlscript.c:1695 #: ../src/perlscript.c:1696 ../src/perlscript.c:1697 ../src/perlscript.c:1698 #: ../src/perlscript.c:1699 ../src/perlscript.c:1700 ../src/perlscript.c:2194 #: ../src/perlscript.c:2195 ../src/perlscript.c:2196 ../src/perlscript.c:2504 #: ../src/perlscript.c:2794 ../src/perlscript.c:2795 ../src/perlscript.c:3414 msgid "yes" msgstr "sim" #: ../src/hooks.c:242 ../src/perlscript.c:1694 ../src/perlscript.c:1695 #: ../src/perlscript.c:1696 ../src/perlscript.c:1697 ../src/perlscript.c:1698 #: ../src/perlscript.c:1699 ../src/perlscript.c:1700 ../src/perlscript.c:2194 #: ../src/perlscript.c:2195 ../src/perlscript.c:2196 ../src/perlscript.c:2504 #: ../src/perlscript.c:2794 ../src/perlscript.c:2795 ../src/perlscript.c:3414 msgid "no" msgstr "não" #: ../src/log.c:105 msgid "File name not specified." msgstr "Arquivo não especificado." #: ../src/log.c:171 #, c-format msgid "Could not open log file: %s." msgstr "Não foi possível abrir o arquivo de log: %s." #: ../src/plugins.c:102 ../src/plugins.c:161 #, c-format msgid "Failed loading file %s: %s" msgstr "Impossível abrir arquivo %s: %s" #: ../src/cmdhistory.c:277 msgid "No command selected." msgstr "Nenhum comando selecionado." #: ../src/cmdhistory.c:289 msgid "More than one command selected." msgstr "Mais de um comando selecionado." #: ../src/cmdhistory.c:483 msgid "Enter some text to search for." msgstr "Entre com algum texto para procurar." #: ../src/cmdhistory.c:516 msgid "Use the Find button to find the first result." msgstr "Use o botão Procurar para procurar o primeiro resultado." #: ../src/cmdhistory.c:573 msgid "Command not found." msgstr "Comando não encontrado." #: ../src/perlscript.c:506 ../src/perlscript.c:512 ../src/perlscript.c:519 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "Chamada de função inválida: sintaxe é $world->FUNÇÃO" #: ../src/perlscript.c:673 ../src/perlscript.c:690 ../src/perlscript.c:752 #: ../src/perlscript.c:785 ../src/perlscript.c:1186 ../src/perlscript.c:1211 #: ../src/perlscript.c:1312 ../src/perlscript.c:1332 ../src/perlscript.c:1355 #: ../src/perlscript.c:1383 ../src/perlscript.c:1392 ../src/perlscript.c:1932 #: ../src/perlscript.c:1941 ../src/perlscript.c:2120 ../src/perlscript.c:2291 #: ../src/perlscript.c:2300 ../src/perlscript.c:2580 ../src/perlscript.c:2589 #: ../src/perlscript.c:2865 ../src/perlscript.c:2919 ../src/perlscript.c:2964 #: ../src/perlscript.c:3029 ../src/perlscript.c:3040 ../src/perlscript.c:3132 #: ../src/perlscript.c:3463 ../src/kcwin.c:96 #, c-format msgid "%s: Too few arguments" msgstr "%s: Muito poucos argumentos" #: ../src/perlscript.c:718 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: Argumento deve ser numérico." #: ../src/perlscript.c:766 ../src/perlscript.c:798 #, c-format msgid "%s: No such world" msgstr "%s: Não existe tal mundo" #: ../src/perlscript.c:833 msgid "World saved." msgstr "Mundo salvo." #: ../src/perlscript.c:1082 ../src/perlscript.c:1097 ../src/perlscript.c:1107 #: ../src/perlscript.c:1268 ../share/kildclient.pl:1303 #, c-format, perl-format msgid "%s: This is an internal function, do not call directly." msgstr "%s: Esta é uma função internal, não a chame diretamente." #: ../src/perlscript.c:1086 ../src/perlscript.c:1514 ../src/perlscript.c:2043 #: ../src/perlscript.c:2416 ../src/perlscript.c:2611 ../src/perlscript.c:3093 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Tipo de argumento errado" #: ../src/perlscript.c:1278 ../src/perlscript.c:1284 #, c-format msgid "Protocol %s not enabled." msgstr "Protocolo %s não habilitado." #: ../src/perlscript.c:1289 ../share/kildclient.pl:1151 msgid "Unknown protocol" msgstr "Protocolo desconhecido" #: ../src/perlscript.c:1406 ../src/perlscript.c:1674 msgid "No such trigger" msgstr "Não existe tal trigger" #: ../src/perlscript.c:1424 ../src/perlscript.c:1973 ../src/perlscript.c:2345 #: ../src/perlscript.c:3052 #, c-format msgid "%s: Too many string arguments" msgstr "%s: Argumentos string demais" #: ../src/perlscript.c:1447 ../src/perlscript.c:1996 #, c-format msgid "%s: pattern given twice, using the named attribute one" msgstr "%s: pattern informado duas vezes, usando a de atributo nomeado" #: ../src/perlscript.c:1459 ../src/perlscript.c:2394 ../src/perlscript.c:3072 #, c-format msgid "%s: action given twice, using the named attribute one" msgstr "%s: ação informada duas vezes, usando a de atributo nomeado" #: ../src/perlscript.c:1505 ../src/perlscript.c:2034 ../src/perlscript.c:2407 #: ../src/perlscript.c:3085 #, c-format msgid "%s: Wrong type of reference" msgstr "%s: Tipo de referência inválido" #: ../src/perlscript.c:1525 #, c-format msgid "%s: pattern not specified, not creating" msgstr "%s: pattern não especificado, cancelando criação" #: ../src/perlscript.c:1534 #, c-format msgid "%s: action not specified, and isn't gag, not creating" msgstr "%s: ação não especificada e não e gag, cancelando criação" #: ../src/perlscript.c:1563 msgid "Trigger added." msgstr "Trigger adicionado." #: ../src/perlscript.c:1568 msgid "Trigger modified." msgstr "Trigger modificado." #: ../src/perlscript.c:1593 #, c-format msgid "%s: invalid target" msgstr "%s: 'target' inválido" #: ../src/perlscript.c:1603 #, c-format msgid "%s: invalid fg color" msgstr "%s: 'fg' inválido" #: ../src/perlscript.c:1613 #, c-format msgid "%s: invalid bg color" msgstr "%s: 'bg' inválido" #: ../src/perlscript.c:1623 #, c-format msgid "%s: invalid underline style" msgstr "%s: estilo de sublinhado inválido" #: ../src/perlscript.c:1679 #, c-format msgid "" "Trigger number %d\n" " Name: %s\n" " Pattern: %s\n" " Action: %s\n" " Enabled: %s\n" " Ignore case: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Keep executing: %s\n" " Rewriter: %s\n" " Change style: %s\n" msgstr "" "Trigger número %d\n" " Nome: %s\n" " Padrão: %s\n" " Ação: %s\n" " Ignorar caixa: %s\n" " Omitir na tela: %s\n" " Omitir no log: %s\n" " Habilitado: %s\n" " Continuar execução: %s\n" " Reescritor: %s\n" " Mudar estilo: %s\n" #: ../src/perlscript.c:1703 #, c-format msgid "" " Target: %d\n" " Foreground: %d\n" " Background: %d\n" " Italics: %d\n" " Striked-thru: %d\n" " Underline: %d\n" msgstr "" " Alvo: %d\n" " Texto: %d\n" " Fundo: %d\n" " Itálico: %d\n" " Tachado: %d\n" " Sublinhado: %d\n" #: ../src/perlscript.c:1955 ../src/perlscript.c:2178 msgid "No such alias" msgstr "Não existe tal alias." #: ../src/perlscript.c:2008 #, c-format msgid "%s: substitution given twice, using the named attribute one" msgstr "%s: substituição informada duas vezes, usando a de atributo nomeado" #: ../src/perlscript.c:2054 msgid "alias: not creating alias without pattern" msgstr "alias: cancelando criação de um aliás sem pattern" #: ../src/perlscript.c:2062 msgid "alias: not creating alias without substitution" msgstr "alias: cancelando criação de alias sem substituição" #: ../src/perlscript.c:2090 msgid "Alias added." msgstr "Alias adicionado." #: ../src/perlscript.c:2095 msgid "Alias modified." msgstr "Alias modificado." #: ../src/perlscript.c:2183 #, c-format msgid "" "Alias number %d\n" " Name: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Ignore case: %s\n" " Eval as Perl: %s\n" " Enabled: %s\n" msgstr "" "Alias número %d\n" " Nome: %s\n" " Padrão: %s\n" " Substituição: %s\n" " Ignorar caixa: %s\n" " Avaliar como Perl: %s\n" " Habilitado: %s\n" #: ../src/perlscript.c:2263 msgid "Press a key to get its keycode." msgstr "Pressione uma tecla para obter seu código de tecla." #: ../src/perlscript.c:2315 msgid "macro: No such macro" msgstr "macro: Não existe tal macro" #: ../src/perlscript.c:2334 ../src/perlscript.c:2382 #, c-format msgid "%s: Invalid key code" msgstr "%s: Código de tecla inválido" #: ../src/perlscript.c:2371 #, c-format msgid "%s: keycode given twice, using the named attribute one" msgstr "%s: código de tecla informado duas vezes, usando o de atributo nomeado" #: ../src/perlscript.c:2427 #, c-format msgid "%s: keycode not specified, not creating" msgstr "%s: código de tecla não informado, cancelando criação" #: ../src/perlscript.c:2434 ../src/perlscript.c:2702 #, c-format msgid "%s: action not specified, not creating" msgstr "%s: ação não informada, cancelando criação" #: ../src/perlscript.c:2453 msgid "Macro added." msgstr "Macro adicionado." #: ../src/perlscript.c:2458 msgid "Macro modified." msgstr "Macro modificado." #: ../src/perlscript.c:2489 msgid "No such macro" msgstr "Não existe tal macro" #: ../src/perlscript.c:2495 #, c-format msgid "" "Macro number %d\n" " Name: %s\n" " Key Code: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Macro número %d\n" " Nome: %s\n" " Código de tecla: %s\n" " Ação: %s\n" " Habilitado: %s\n" #: ../src/perlscript.c:2605 msgid "timer: No such timer" msgstr "timer: Não existe tal timer" #: ../src/perlscript.c:2630 #, c-format msgid "%s: interval must be numeric" msgstr "%s: intervalo deve ser numérico" #: ../src/perlscript.c:2643 #, c-format msgid "%s: count must be numeric" msgstr "%s: contagem deve ser numérica" #: ../src/perlscript.c:2674 #, c-format msgid "%s: interval not specified, not creating" msgstr "%s: intervalo não foi informado, cancelando criação" #: ../src/perlscript.c:2681 #, c-format msgid "%s: cannot create timer with negative interval" msgstr "%s: não é possível criar um timer com intervalo negativo" #: ../src/perlscript.c:2742 msgid "Timer added." msgstr "Timer adicionado." #: ../src/perlscript.c:2747 msgid "Timer modified." msgstr "Timer modificado." #: ../src/perlscript.c:2777 msgid "No such timer" msgstr "Não existe tal timer" #: ../src/perlscript.c:2782 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %.3f\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" "Timer número %d\n" " Nome: %s\n" " Intervalo: %.3f\n" " Número de vezes: %d\n" " Ação: %s\n" " Habilitado: %s\n" " Temporário: %s\n" #: ../src/perlscript.c:2873 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" "%s: Apenas variáveis escalares ($), arrays (@) e hashes (%%) podem ser " "feitas permanentes" #: ../src/perlscript.c:2882 #, c-format msgid "%s: %s is already permanent" msgstr "%s: %s já é permanente" #: ../src/perlscript.c:2896 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "%s: Variável '%s' feita permanente.\n" #: ../src/perlscript.c:2938 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "%s: Variável '%s' feita temporária.\n" #: ../src/perlscript.c:2942 #, c-format msgid "%s: %s is not permanent" msgstr "%s: %s não é permanente" #: ../src/perlscript.c:2995 msgid "Permanent variables" msgstr "Variáveis permanentes" #: ../src/perlscript.c:3107 msgid "Hook defined." msgstr "Hook definido." #: ../src/perlscript.c:3111 msgid "Hook modified." msgstr "Hook modificado." #: ../src/perlscript.c:3217 msgid "Logging stopped." msgstr "Log desabilitado." #: ../src/perlscript.c:3355 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "Núm Hab %-*.*s Versão %-*.*s\n" #: ../src/perlscript.c:3398 msgid "No such plugin" msgstr "Não existe tal plugin." #: ../src/perlscript.c:3403 #, c-format msgid "" "Plugin number %d\n" " Name: %s\n" " Version: %s\n" " Description: %s\n" " Author: %s\n" " Enabled: %s\n" msgstr "" "Plugin número %d\n" " Nome: %s\n" " Versão: %s\n" " Descrição: %s\n" " Autor: %s\n" " Habilitado: %s\n" #: ../src/kildclient.ui:21 msgid "Edit Timer" msgstr "Editar Timer" #: ../src/kildclient.ui:88 ../src/kildclient.ui:351 ../src/kildclient.ui:628 #: ../src/kildclient.ui:783 ../src/kildclient.ui:956 ../src/kildclient.ui:1173 #: ../src/dlgEditWorld.ui:240 ../src/dlgEditWorld.ui:3498 msgid "_Name:" msgstr "_Nome:" #: ../src/kildclient.ui:100 msgid "Enter optionally a descriptive name for the timer" msgstr "Entre opcionalmente um nome descritivo para o timer" #: ../src/kildclient.ui:114 msgid "_Interval:" msgstr "_Intervalo:" #: ../src/kildclient.ui:132 msgid "Specify the interval, in seconds, between timer activations" msgstr "Especifique o intervalo, em segundos, entre ativações do timer" #: ../src/kildclient.ui:150 msgid "seconds" msgstr "segundos" #: ../src/kildclient.ui:169 msgid "_Repeat count:" msgstr "_Número de vezes:" #: ../src/kildclient.ui:187 msgid "" "Specify how many times this timer should run before being disabled or deleted" msgstr "" "Especifique quantas deves esse timer deve rodar antes de ser desabilitado ou " "apagado" #: ../src/kildclient.ui:204 msgid "(-1 to repeat indefinitely)" msgstr "(-1 para repetir indefinidamente)" #: ../src/kildclient.ui:223 ../src/kildclient.ui:809 ../src/kildclient.ui:1021 #: ../src/kildclient.ui:1238 msgid "_Action:" msgstr "_Ação:" #: ../src/kildclient.ui:235 msgid "Enter the action to be executed whenever the timer fires" msgstr "Entre a ação a ser executado quando o timer disparar" #: ../src/kildclient.ui:245 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "" "_Temporário (será deletado automaticamente quando o número de vezes atingir " "0)" #: ../src/kildclient.ui:249 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" "Marque para que o timer seja apagado quando seu número de vezes chegar a 0" #: ../src/kildclient.ui:262 ../src/kildclient.ui:457 ../src/kildclient.ui:831 #: ../src/kildclient.ui:1043 ../src/kildclient.ui:1373 msgid "_Enabled" msgstr "_Habilitado" #: ../src/kildclient.ui:266 msgid "Check to make the timer enabled; only enabled timers are run" msgstr "" "Marque para habilitar o timer; somente timers habilitados são executados" #: ../src/kildclient.ui:282 ../src/kildclient.ui:477 ../src/kildclient.ui:851 #: ../src/kildclient.ui:1063 ../src/kildclient.ui:1393 msgid "Note:" msgstr "Nota:" #: ../src/kildclient.ui:295 ../src/kildclient.ui:490 ../src/kildclient.ui:864 #: ../src/kildclient.ui:1076 ../src/kildclient.ui:1406 msgid "" "This object belongs to a plugin. Changes made here will not be saved " "in the plugin." msgstr "" "Este objeto pertence a um plugin. Modificações feitas nele não serão " "salvas no plugin." #: ../src/kildclient.ui:327 msgid "Edit Alias" msgstr "Editar Alias" #: ../src/kildclient.ui:363 msgid "Enter optionally a descriptive name for the alias" msgstr "Entre opcionalmente um nome descritivo para o alias" #: ../src/kildclient.ui:377 ../src/kildclient.ui:1198 msgid "_Pattern:" msgstr "_Padrão:" #: ../src/kildclient.ui:389 msgid "Enter the pattern to match against typed commands" msgstr "Entre o padrão para ser comparado com os commandos digitados" #: ../src/kildclient.ui:399 ../src/kildclient.ui:1220 msgid "_Ignore case when matching" msgstr "_Ignorar maiúsculas e minúsculas" #: ../src/kildclient.ui:417 msgid "_Substitution:" msgstr "_Substituição:" #: ../src/kildclient.ui:430 msgid "Enter the substitution to be executed" msgstr "Entre a substuição a ser feita" #: ../src/kildclient.ui:440 msgid "E_val substitution as Perl statement" msgstr "A_valiar Substituição como um comando Perl" #: ../src/kildclient.ui:444 msgid "Check to have the substitution be executed in a s///e construction" msgstr "Marque para que a substituição seja executada numa construção s///e" #: ../src/kildclient.ui:461 msgid "Check to make the alias enabled; only enabled aliases are tried" msgstr "" "Marque para habilitar o alias; somente aliases habilitados são tentados" #: ../src/kildclient.ui:561 msgid "Edit Character Information" msgstr "Editar Informações do Personagem" #: ../src/kildclient.ui:640 msgid "Enter the character's name for automatic login" msgstr "Entre o nome do personagem para login automático" #: ../src/kildclient.ui:654 msgid "_Password:" msgstr "_Senha:" #: ../src/kildclient.ui:667 msgid "Enter the character's password for automatic login" msgstr "Entre a senha do seu personagem para login automático" #: ../src/kildclient.ui:692 msgid "Edit Hook" msgstr "Editar Hook" #: ../src/kildclient.ui:759 msgid "Event:" msgstr "Evento:" #: ../src/kildclient.ui:795 msgid "Enter optionally a descriptive name for the hook" msgstr "Entre opcionalmente um nome descritivo para o hook" #: ../src/kildclient.ui:821 msgid "Enter the action to be run when the event happens" msgstr "Entre a ação a ser executado quando o evento acontecer" #: ../src/kildclient.ui:835 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "Marque para habilitar o hook; somente hooks habilitados são executados" #: ../src/kildclient.ui:889 msgid "Edit Macro" msgstr "Editar Macro" #: ../src/kildclient.ui:968 msgid "Enter optionally a descriptive name for the macro" msgstr "Entre opcionalmente um nome descritivo para o macro" #: ../src/kildclient.ui:982 msgid "_Key:" msgstr "_Tecla:" #: ../src/kildclient.ui:994 msgid "Press the key that will be used to run the macro" msgstr "Aperte a tecla que será usada para executar o macro" #: ../src/kildclient.ui:1008 msgid "" "Press the key that will be used to activate the macro while the cursor is in " "the text box." msgstr "" "Aperte a tecla que será usada para executar o macro enquanto o cursor " "estiver na caixa de texto" #: ../src/kildclient.ui:1033 msgid "Enter the action to be run when the key is pressed" msgstr "Entre a ação a ser executada quando a tecla for pressionada" #: ../src/kildclient.ui:1047 msgid "Check to make the macro enabled; only enabled macros are run" msgstr "" "Marque para habilitar o macro; somente macros habilitados são executados" #: ../src/kildclient.ui:1104 ../src/kildclient.ui:2154 msgid "Enter optionally a descriptive name for the trigger" msgstr "Entre opcionalmente um nome descritivo para o trigger" #: ../src/kildclient.ui:1105 msgid "Edit Trigger" msgstr "Editar Trigger" #: ../src/kildclient.ui:1210 msgid "Enter the pattern to match against received lines" msgstr "Entre o padrão para ser comparado com as linhas recebidas" #: ../src/kildclient.ui:1250 msgid "Enter the action that will be run when a match happens" msgstr "Entre a ação que vai ser executado quando uma linha disparar o trigger" #: ../src/kildclient.ui:1260 msgid "Omit (_gag) from output" msgstr "Omitir (_gag) da tela de saída" #: ../src/kildclient.ui:1264 msgid "Check to make the matched line not be printed in the main output window" msgstr "Marque para que a linha não seja mostrada na tela" #: ../src/kildclient.ui:1277 msgid "Omit (gag) from _log file" msgstr "Omitir (gag) do arquivo de _log" #: ../src/kildclient.ui:1281 msgid "Check to make the matched line not be printed in the log file" msgstr "Marque para que a linha não seja escrita no arquivo de log" #: ../src/kildclient.ui:1294 msgid "_Keep executing other triggers after this this one matches" msgstr "C_ontinuar executando outros triggers depois de esser ser executado" #: ../src/kildclient.ui:1298 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" "Marque para que esse trigger não impeça outros triggers de serem tentados, " "caso este seja executado" #: ../src/kildclient.ui:1311 msgid "_Rewriter trigger" msgstr "Trigger _reescritor" #: ../src/kildclient.ui:1315 msgid "Check to make this trigger a rewriter trigger" msgstr "Marque para que o trigger seja um trigger reescritor" #: ../src/kildclient.ui:1333 msgid "C_hange style" msgstr "_Alterar estilo" #: ../src/kildclient.ui:1350 msgid "C_onfigure..." msgstr "C_onfigurar..." #: ../src/kildclient.ui:1377 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" "Marque para habilitar o trigger; somente triggers habilitados são tentados" #: ../src/kildclient.ui:1434 msgid "Permenent variable" msgstr "Variável permanente" #: ../src/kildclient.ui:1497 msgid "_Name of variable to make permanent:" msgstr "_Nome da variável a ser tornada permanente:" #: ../src/kildclient.ui:1511 msgid "" "Enter the name of a scalar ($), array (@) or hash (%) variable whose " "contents are to be saved between sessions of the World" msgstr "" "Entre o nome de uma variável escalar ($), array (@) ou hash (%) cujo " "conteúdo será salvo entre sessões do Mundo" #: ../src/kildclient.ui:1616 msgid "Permanent Variables" msgstr "Variáveis Permanentes" #: ../src/kildclient.ui:1631 msgid "OnConnect Hooks" msgstr "Hooks OnConnect" #: ../src/kildclient.ui:1646 msgid "OnDisconnect Hooks" msgstr "Hooks OnDisconnect" #: ../src/kildclient.ui:1661 msgid "OnReceivedText Hooks" msgstr "Hooks OnReceivedText" #: ../src/kildclient.ui:1676 msgid "OnSentCommand Hooks" msgstr "Hooks OnSentCommand" #: ../src/kildclient.ui:1691 msgid "OnGetFocus Hooks" msgstr "Hooks OnGetFocus" #: ../src/kildclient.ui:1706 msgid "OnLoseFocus Hooks" msgstr "Hooks OnLoseFocus" #: ../src/kildclient.ui:1721 msgid "OnCloseConnected Hooks" msgstr "Hooks OnCloseConnect" #: ../src/kildclient.ui:1746 msgid "_Items to export" msgstr "_Itens para exportar" #: ../src/kildclient.ui:1833 ../src/dlgSelectWorld.ui:114 #: ../src/dlgEditWorld.ui:707 msgid "_New" msgstr "_Novo" #: ../src/kildclient.ui:1847 ../src/wndmain.ui:158 #: ../src/dlgSelectWorld.ui:128 ../src/dlgEditWorld.ui:723 msgid "_Edit" msgstr "_Editar" #: ../src/kildclient.ui:1862 ../src/wndmain.ui:199 #: ../src/dlgSelectWorld.ui:142 ../src/dlgEditWorld.ui:739 msgid "_Delete" msgstr "_Excluir" #: ../src/kildclient.ui:1877 msgid "_Import" msgstr "_Importar" #: ../src/kildclient.ui:1891 msgid "E_xport" msgstr "E_xportar" #: ../src/kildclient.ui:1906 ../src/dlgEditWorld.ui:755 #: ../src/dlgEditWorld.ui:4146 msgid "_Up" msgstr "Para _cima" #: ../src/kildclient.ui:1921 ../src/dlgEditWorld.ui:4162 msgid "_Down" msgstr "Para _baixo" #: ../src/kildclient.ui:1975 ../src/kildclient.ui:1992 #: ../src/kildclient.ui:2012 ../src/kildclient.ui:2029 #: ../src/kildclient.ui:2094 msgid "Do not change" msgstr "Não alterar" #: ../src/kildclient.ui:1998 msgid "Single" msgstr "Simples" #: ../src/kildclient.ui:2001 msgid "Double" msgstr "Duplo" #: ../src/kildclient.ui:2032 ../src/kildclient.ui:2097 #: ../src/dlgPreferences.ui:23 msgid "Black" msgstr "Preto" #: ../src/kildclient.ui:2035 ../src/kildclient.ui:2100 #: ../src/dlgPreferences.ui:26 msgid "Red" msgstr "Vermelho" #: ../src/kildclient.ui:2038 ../src/kildclient.ui:2103 #: ../src/dlgPreferences.ui:29 msgid "Green" msgstr "Verde" #: ../src/kildclient.ui:2041 ../src/kildclient.ui:2106 #: ../src/dlgPreferences.ui:32 msgid "Yellow" msgstr "Amarelo" #: ../src/kildclient.ui:2044 ../src/kildclient.ui:2109 #: ../src/dlgPreferences.ui:35 msgid "Blue" msgstr "Azul" #: ../src/kildclient.ui:2047 ../src/kildclient.ui:2112 #: ../src/dlgPreferences.ui:38 msgid "Magenta" msgstr "Magenta" #: ../src/kildclient.ui:2050 ../src/kildclient.ui:2115 #: ../src/dlgPreferences.ui:41 msgid "Cyan" msgstr "Ciano" #: ../src/kildclient.ui:2053 ../src/kildclient.ui:2118 #: ../src/dlgPreferences.ui:44 msgid "White" msgstr "Branco" #: ../src/kildclient.ui:2056 ../src/kildclient.ui:2121 #: ../src/dlgPreferences.ui:47 msgid "Default" msgstr "Padrão" #: ../src/kildclient.ui:2059 ../src/kildclient.ui:2124 #: ../src/dlgPreferences.ui:50 msgid "Black (bold)" msgstr "Preto (negrito)" #: ../src/kildclient.ui:2062 ../src/kildclient.ui:2127 #: ../src/dlgPreferences.ui:53 msgid "Red (bold)" msgstr "Vermelho (negrito)" #: ../src/kildclient.ui:2065 ../src/kildclient.ui:2130 #: ../src/dlgPreferences.ui:56 msgid "Green (bold)" msgstr "Verde (negrito)" #: ../src/kildclient.ui:2068 ../src/kildclient.ui:2133 #: ../src/dlgPreferences.ui:59 msgid "Yellow (bold)" msgstr "Amarelo (negrito)" #: ../src/kildclient.ui:2071 ../src/kildclient.ui:2136 #: ../src/dlgPreferences.ui:62 msgid "Blue (bold)" msgstr "Azul (negrito)" #: ../src/kildclient.ui:2074 ../src/kildclient.ui:2139 #: ../src/dlgPreferences.ui:65 msgid "Magenta (bold)" msgstr "Magenta (negrito)" #: ../src/kildclient.ui:2077 ../src/kildclient.ui:2142 #: ../src/dlgPreferences.ui:68 msgid "Cyan (bold)" msgstr "Ciano (negrito)" #: ../src/kildclient.ui:2080 ../src/kildclient.ui:2145 #: ../src/dlgPreferences.ui:71 msgid "White (bold)" msgstr "Branco (negrito)" #: ../src/kildclient.ui:2083 ../src/kildclient.ui:2148 #: ../src/dlgPreferences.ui:74 msgid "Default (bold)" msgstr "Padrão (negrito)" #: ../src/kildclient.ui:2155 msgid "Change Style" msgstr "Alterar Estilo" #: ../src/kildclient.ui:2221 msgid "_Apply to:" msgstr "_Aplicar a:" #: ../src/kildclient.ui:2234 msgid "_Foreground:" msgstr "Te_xto:" #: ../src/kildclient.ui:2264 msgid "_Background:" msgstr "F_undo:" #: ../src/kildclient.ui:2294 msgid "_Italic:" msgstr "_Itálico:" #: ../src/kildclient.ui:2324 msgid "_Striked-thru:" msgstr "_Tachado:" #: ../src/kildclient.ui:2354 msgid "_Underline:" msgstr "S_ublinhado:" #: ../src/kildclient.ui:2386 msgid "The whole line" msgstr "Toda a linha" #: ../src/kildclient.ui:2402 msgid "The whole matched text" msgstr "Todo o texto encontrado" #: ../src/kildclient.ui:2424 msgid "The matched substring number" msgstr "A parte número" #: ../src/wndmain.ui:24 msgid "_World" msgstr "_Mundo" #: ../src/wndmain.ui:35 msgid "_Open..." msgstr "_Abrir..." #: ../src/wndmain.ui:45 msgid "_Reconnect" msgstr "_Reconectar" #: ../src/wndmain.ui:54 msgid "_Disconnect" msgstr "_Desconectar" #: ../src/wndmain.ui:63 msgid "Connect to _Another..." msgstr "Conectar a _outro mundo..." #: ../src/wndmain.ui:87 msgid "_Edit..." msgstr "_Editar..." #: ../src/wndmain.ui:106 msgid "S_tatistics..." msgstr "Es_tatísticas..." #: ../src/wndmain.ui:121 ../src/wndmain.ui:257 msgid "_Previous" msgstr "_Anterior" #: ../src/wndmain.ui:130 ../src/wndmain.ui:267 msgid "_Next" msgstr "_Próximo" #: ../src/wndmain.ui:169 msgid "Cu_t" msgstr "Cor_tar" #: ../src/wndmain.ui:179 msgid "_Copy" msgstr "_Copiar" #: ../src/wndmain.ui:189 msgid "_Paste" msgstr "C_olar" #: ../src/wndmain.ui:214 ../src/dlgCmdHistory.ui:69 msgid "_Find" msgstr "Proc_urar" #: ../src/wndmain.ui:224 ../src/wndmain.ui:287 msgid "Find N_ext" msgstr "Procurar p_róximo" #: ../src/wndmain.ui:238 msgid "_Input" msgstr "E_ntrada" #: ../src/wndmain.ui:248 ../src/dlgEditWorld.ui:3850 ../src/dlgMLSend.ui:147 msgid "_Clear" msgstr "_Limpar" #: ../src/wndmain.ui:277 msgid "Find P_revious" msgstr "Procurar a_nterior" #: ../src/wndmain.ui:297 msgid "Command _History..." msgstr "_Histórico de comandos..." #: ../src/wndmain.ui:313 msgid "_Multi-line Send..." msgstr "Enviar _múltiplas linhas..." #: ../src/wndmain.ui:329 msgid "_Test Triggers..." msgstr "_Testar triggers..." #: ../src/wndmain.ui:342 msgid "_Preferences" msgstr "_Preferências" #: ../src/wndmain.ui:353 msgid "Disable _Triggers" msgstr "Desabilitar _triggers" #: ../src/wndmain.ui:363 msgid "Disable _Aliases" msgstr "Desabilitar _aliases" #: ../src/wndmain.ui:373 msgid "Disable _Macros" msgstr "Desabilitar _macros" #: ../src/wndmain.ui:383 msgid "Disable T_imers" msgstr "Desabilitar t_imers" #: ../src/wndmain.ui:399 msgid "_Debug Matches" msgstr "" #: ../src/wndmain.ui:414 msgid "_Preferences..." msgstr "_Preferências..." #: ../src/wndmain.ui:423 msgid "Edit Default _World..." msgstr "Editar _mundo padrão..." #: ../src/wndmain.ui:436 msgid "_Display" msgstr "_Aparência" #: ../src/wndmain.ui:447 msgid "_Split Window" msgstr "_Dividir janela" #: ../src/wndmain.ui:461 ../src/dlgEditWorld.ui:3998 msgid "_Help" msgstr "_Ajuda" #: ../src/wndmain.ui:471 msgid "_Manual" msgstr "_Manual" #: ../src/wndmain.ui:481 msgid "_About" msgstr "_Sobre" #: ../src/dlgSelectWorld.ui:8 msgid "Connect to" msgstr "Conectar a" #: ../src/dlgSelectWorld.ui:39 msgid "C_onnect" msgstr "C_onectar" #: ../src/dlgSelectWorld.ui:62 msgid "_Select a saved world:" msgstr "_Selecione um mundo salvo:" #: ../src/dlgSelectWorld.ui:176 msgid "Or connect d_irectly:" msgstr "Ou conecte d_iretamente:" #: ../src/dlgSelectWorld.ui:204 ../src/dlgEditWorld.ui:254 msgid "_Host:" msgstr "_Host:" #: ../src/dlgSelectWorld.ui:218 ../src/dlgEditWorld.ui:268 msgid "_Port:" msgstr "Po_rta:" #: ../src/dlgPreferences.ui:85 ../src/dlgEditWorld.ui:82 msgid "No proxy" msgstr "Sem proxy" #: ../src/dlgPreferences.ui:88 ../src/dlgEditWorld.ui:85 msgid "SOCKS4" msgstr "SOCKS4" #: ../src/dlgPreferences.ui:91 ../src/dlgEditWorld.ui:88 msgid "SOCKS5" msgstr "SOCKS5" #: ../src/dlgPreferences.ui:94 ../src/dlgEditWorld.ui:91 msgid "HTTP" msgstr "HTTP" #: ../src/dlgPreferences.ui:105 msgid "Left" msgstr "Esquerda" #: ../src/dlgPreferences.ui:108 msgid "Right" msgstr "Direita" #: ../src/dlgPreferences.ui:111 msgid "Top" msgstr "Em cima" #: ../src/dlgPreferences.ui:114 msgid "Bottom" msgstr "Em baixo" #: ../src/dlgPreferences.ui:120 msgid "Preferences" msgstr "Preferências" #: ../src/dlgPreferences.ui:180 msgid "Colors used by KildClient" msgstr "Cores usadas pelo KildClient" #: ../src/dlgPreferences.ui:216 msgid "_Informative messages:" msgstr "Mensagens _informativas:" #: ../src/dlgPreferences.ui:248 msgid "_Command echo:" msgstr "Eco de _comandos:" #: ../src/dlgPreferences.ui:308 msgid "Window configuration" msgstr "Configuração da Janela" #: ../src/dlgPreferences.ui:344 msgid "_Tab position:" msgstr "_Posição das abas:" #: ../src/dlgPreferences.ui:374 msgid "_Hide tabs if only one world is open" msgstr "_Esconder abas se houver só um mundo aberto" #: ../src/dlgPreferences.ui:379 msgid "" "If this is checked, when there is only one open world no tabs will be shown" msgstr "" "Se esta opção estiver habilitada, quando houver apenas um mundo aberto, " "nenhuma aba será exibida." #: ../src/dlgPreferences.ui:393 msgid "_Flash window when new text is received" msgstr "_Piscar janela quando novo texto é recebido" #: ../src/dlgPreferences.ui:435 msgid "Appearance" msgstr "Aparência" #: ../src/dlgPreferences.ui:459 msgid "Sending Delays" msgstr "Espera Entre Envios" #: ../src/dlgPreferences.ui:495 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "" "Entre os parâmetros padrão para o envio de múltiplas linhas ou comandos:" #: ../src/dlgPreferences.ui:512 msgid "_Number of lines/commands to send at once:" msgstr "_Número de linhas/comandos para enviar de uma vez:" #: ../src/dlgPreferences.ui:553 msgid "_Delay between each group of lines/commands:" msgstr "_Espera entre cada grupo de linhas/comandos:" #: ../src/dlgPreferences.ui:616 msgid "Sending" msgstr "Envio" #: ../src/dlgPreferences.ui:641 msgid "Web Browser" msgstr "Navegador Web" #: ../src/dlgPreferences.ui:677 msgid "Specify the command used to launch a web browser" msgstr "Especifique o comando usado para iniciar um navegador web" #: ../src/dlgPreferences.ui:692 msgid "" "Enter the command to run a web browser. %s will be substituted by the web " "page address." msgstr "" "Entre o comando para rodar um navegador web. %s será substituído pelo " "endereço da página da web." #: ../src/dlgPreferences.ui:734 msgid "Audio Player" msgstr "Reprodutor de Áudio" #: ../src/dlgPreferences.ui:770 msgid "Specify the command used to play sound files." msgstr "Especifique o comando usado para reproduzir arquivos de áudio." #: ../src/dlgPreferences.ui:785 msgid "" "Enter the command to run an audio player program. %s will be substituted by " "the file path." msgstr "" "Entre o comando para rodar um reprodutor de áudio. %s será substituído pelo " "arquivo." #: ../src/dlgPreferences.ui:824 msgid "External Programs" msgstr "Programas Externos" #: ../src/dlgPreferences.ui:850 ../src/dlgEditWorld.ui:370 msgid "Proxy" msgstr "Proxy" #: ../src/dlgPreferences.ui:890 ../src/dlgEditWorld.ui:410 msgid "Proxy _type:" msgstr "_Tipo do proxy:" #: ../src/dlgPreferences.ui:936 ../src/dlgEditWorld.ui:456 msgid "Server _address:" msgstr "_Endereço do servidor:" #: ../src/dlgPreferences.ui:949 ../src/dlgEditWorld.ui:515 msgid "_Username:" msgstr "_Usuário:" #: ../src/dlgPreferences.ui:984 ../src/dlgEditWorld.ui:480 msgid "Server _port:" msgstr "_Porta do servidor:" #: ../src/dlgPreferences.ui:997 ../src/dlgEditWorld.ui:528 msgid "Pass_word:" msgstr "_Senha:" #: ../src/dlgPreferences.ui:1065 msgid "Proxy" msgstr "Proxy" #: ../src/dlgStatistics.ui:8 msgid "Statistics" msgstr "Estatísticas" #: ../src/dlgStatistics.ui:56 ../src/dlgStatistics.ui:68 #: ../src/dlgStatistics.ui:223 ../src/dlgStatistics.ui:349 #: ../src/dlgStatistics.ui:467 ../src/dlgStatistics.ui:479 #: ../src/dlgStatistics.ui:491 ../src/dlgStatistics.ui:503 #: ../src/dlgStatistics.ui:515 ../src/dlgStatistics.ui:539 #: ../src/dlgStatistics.ui:575 ../src/dlgStatistics.ui:587 #: ../src/dlgStatistics.ui:611 ../src/dlgStatistics.ui:647 #: ../src/dlgStatistics.ui:659 msgid "N/A" msgstr "N/A" #: ../src/dlgStatistics.ui:80 msgid "Proxy port:" msgstr "Porta do proxy:" #: ../src/dlgStatistics.ui:92 msgid "Proxy host:" msgstr "Host proxy:" #: ../src/dlgStatistics.ui:116 msgid "Proxy type:" msgstr "Tipo do proxy:" #: ../src/dlgStatistics.ui:128 msgid "World name:" msgstr "Nome do mundo:" #: ../src/dlgStatistics.ui:140 msgid "Host:" msgstr "Host:" #: ../src/dlgStatistics.ui:152 msgid "Port:" msgstr "Porta:" #: ../src/dlgStatistics.ui:164 msgid "Connection time:" msgstr "Tempo de conexão:" #: ../src/dlgStatistics.ui:176 msgid "Idle time:" msgstr "Tempo inativo:" #: ../src/dlgStatistics.ui:199 msgid "Compression used:" msgstr "Compressão utilizada:" #: ../src/dlgStatistics.ui:211 msgid "Bytes received (compressed):" msgstr "Bytes recebidos (comprimidos):" #: ../src/dlgStatistics.ui:235 msgid "Bytes received (decompressed):" msgstr "Bytes recebidos (descomprimidos):" #: ../src/dlgStatistics.ui:247 msgid "Compression ratio:" msgstr "Taxa de compressão:" #: ../src/dlgStatistics.ui:259 msgid "Lines received:" msgstr "Linhas recebidas:" #: ../src/dlgStatistics.ui:383 msgid "Key exchange:" msgstr "Troca de chave:" #: ../src/dlgStatistics.ui:395 msgid "SSL protocol used:" msgstr "Protocolo SSL usado:" #: ../src/dlgStatistics.ui:407 msgid "Compression algorithm:" msgstr "Algoritmo de compressão:" #: ../src/dlgStatistics.ui:419 msgid "Certificate type:" msgstr "Tipo de certificado:" #: ../src/dlgStatistics.ui:431 msgid "Cipher:" msgstr "Algoritmo criptográfico:" #: ../src/dlgStatistics.ui:443 msgid "MAC:" msgstr "MAC:" #: ../src/dlgStatistics.ui:455 msgid "SSL not supported in this version" msgstr "SSL não suportado nessa versão" #: ../src/dlgStatistics.ui:527 msgid "Hostname:" msgstr "Host:" #: ../src/dlgStatistics.ui:551 msgid "Valid since:" msgstr "Válido desde:" #: ../src/dlgStatistics.ui:563 msgid "Expiration:" msgstr "Expira:" #: ../src/dlgStatistics.ui:599 msgid "Fingerprint:" msgstr "Fingerprint:" #: ../src/dlgStatistics.ui:623 msgid "Subject's DN:" msgstr "" #: ../src/dlgStatistics.ui:635 msgid "Issuer's DN:" msgstr "" #: ../src/dlgAbout.ui:12 msgid "A mud client with powerful features and support for Perl Scripting" msgstr "" "Um cliente de MUD com recursos poderosos e suporte para scripting com Perl" #: ../src/dlgAbout.ui:14 msgid "Visit http://www.kildclient.org" msgstr "Visite http://www.kildclient.org" #: ../src/dlgEditWorld.ui:62 msgid "No auto-login" msgstr "Sem login automático" #: ../src/dlgEditWorld.ui:79 msgid "Use global settings" msgstr "Usar configurações globais" #: ../src/dlgEditWorld.ui:98 msgid "Edit World" msgstr "Editar Mundo" #: ../src/dlgEditWorld.ui:203 msgid "Connection" msgstr "Conexão" #: ../src/dlgEditWorld.ui:281 msgid "Enter a descriptive name for the World" msgstr "Entre um nome descritivo para o Mundo" #: ../src/dlgEditWorld.ui:295 msgid "Enter the host to connect to" msgstr "Entre o host a se conectar" #: ../src/dlgEditWorld.ui:309 msgid "Enter the port used when connecting" msgstr "Entre a porta usada para conexão" #: ../src/dlgEditWorld.ui:321 msgid "Use _SSL" msgstr "Usar _SSL" #: ../src/dlgEditWorld.ui:587 msgid "Auto-login" msgstr "Login automático" #: ../src/dlgEditWorld.ui:628 msgid "Connection _style:" msgstr "_Estilo de conexão:" #: ../src/dlgEditWorld.ui:668 msgid "Ch_aracters in this mud:" msgstr "_Personagens neste mud:" #: ../src/dlgEditWorld.ui:771 msgid "D_elete" msgstr "_Excluir" #: ../src/dlgEditWorld.ui:842 ../src/dlgEditWorld.ui:2048 #: ../src/dlgEditWorld.ui:2992 msgid "Font" msgstr "Fonte" #: ../src/dlgEditWorld.ui:879 msgid "Select the font used in the _main screen:" msgstr "Selecione a fonte usada na janela _principal:" #: ../src/dlgEditWorld.ui:895 msgid "Select the font used in the main output screen" msgstr "Selecione a fonte usada na janela principal" #: ../src/dlgEditWorld.ui:907 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "" "Usar fonte _negrito para cores destacadas (ao invés de apenas destacar)" #: ../src/dlgEditWorld.ui:912 msgid "" "Check if you want the highlighted ANSI colors to be displayed in bold also" msgstr "" "Marque se você quiser que as cores ANSI destacadas sejam mostradas em " "negrito também" #: ../src/dlgEditWorld.ui:956 msgid "Word Wrap" msgstr "Quebra de linhas" #: ../src/dlgEditWorld.ui:989 msgid "_Wrap lines at word boundaries" msgstr "Quebrar linhas entre _palavras" #: ../src/dlgEditWorld.ui:994 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "Marque se você quiser que as linhas sejam quebradas entre palavras" #: ../src/dlgEditWorld.ui:1016 msgid "_Indent wrapped lines by" msgstr "_Indentar linhas quebras por" #: ../src/dlgEditWorld.ui:1046 msgid "pixels" msgstr "pixels" #: ../src/dlgEditWorld.ui:1064 msgid "Wrap lines at full _screen width" msgstr "Quebrar linhas na largura _máxima da tela" #: ../src/dlgEditWorld.ui:1087 msgid "Maximum line width in _characters:" msgstr "Largura máxima da linha em _caracteres:" #: ../src/dlgEditWorld.ui:1157 msgid "Tooltips" msgstr "Tooltips" #: ../src/dlgEditWorld.ui:1191 msgid "Display _tooltips with the time when the line was received" msgstr "Mostrar _tooltips com o horário em que a linha foi recebida" #: ../src/dlgEditWorld.ui:1196 msgid "" "Check if you want tooltips to be displayed showing the time when a line was " "received if you leave the mouse over the line for a short while" msgstr "" "Marque se você quiser que uma tooltip seja mostrada com o horário em que a " "linha foi recebida ao deixar o mouse sobre uma linha por alguns segundos" #: ../src/dlgEditWorld.ui:1262 msgid "Ansi Colors" msgstr "Cores Ansi" #: ../src/dlgEditWorld.ui:1395 msgid "_Black" msgstr "Preto" #: ../src/dlgEditWorld.ui:1409 msgid "R_ed" msgstr "Vermelho" #: ../src/dlgEditWorld.ui:1423 msgid "_Green" msgstr "Verde" #: ../src/dlgEditWorld.ui:1437 msgid "_Yellow" msgstr "Amarelo" #: ../src/dlgEditWorld.ui:1451 msgid "B_lue" msgstr "Azul" #: ../src/dlgEditWorld.ui:1465 msgid "_Magenta" msgstr "Magenta" #: ../src/dlgEditWorld.ui:1479 msgid "_Cyan" msgstr "Ciano" #: ../src/dlgEditWorld.ui:1493 msgid "_White" msgstr "Branco" #: ../src/dlgEditWorld.ui:1507 msgid "Bl_ack (bold)" msgstr "Preto (negrito)" #: ../src/dlgEditWorld.ui:1520 msgid "Re_d (bold)" msgstr "Vermelho (negrito)" #: ../src/dlgEditWorld.ui:1533 msgid "G_reen (bold)" msgstr "Verde (negrito)" #: ../src/dlgEditWorld.ui:1546 msgid "Yell_ow (bold)" msgstr "Amarelo (negrito)" #: ../src/dlgEditWorld.ui:1559 msgid "Bl_ue (bold)" msgstr "Azul (negrito)" #: ../src/dlgEditWorld.ui:1572 msgid "Magen_ta (bold)" msgstr "Magenta (negrito)" #: ../src/dlgEditWorld.ui:1585 msgid "Cya_n (bold)" msgstr "Ciano (negrito)" #: ../src/dlgEditWorld.ui:1598 msgid "W_hite (bold)" msgstr "Branco (negrito)" #: ../src/dlgEditWorld.ui:1767 msgid "Default Colors" msgstr "Cores Padrão" #: ../src/dlgEditWorld.ui:1828 msgid "_Foreground" msgstr "Te_xto" #: ../src/dlgEditWorld.ui:1841 msgid "Bold foreground" msgstr "Texto em negrito" #: ../src/dlgEditWorld.ui:1866 msgid "Bac_kground" msgstr "Fundo" #: ../src/dlgEditWorld.ui:1891 msgid "Bold background" msgstr "Fundo em egrito" #: ../src/dlgEditWorld.ui:1945 msgid "Revert to default colors" msgstr "Reverter às cores padrão" #: ../src/dlgEditWorld.ui:1979 msgid "Re_vert to default colors" msgstr "Reverter às core_s padrão" #: ../src/dlgEditWorld.ui:1984 msgid "Click to revert all colors to their built-in defaults" msgstr "Clique para reverter todas as cores para o padrão do programa" #: ../src/dlgEditWorld.ui:2085 msgid "Select the font used in the _status bar:" msgstr "Selecione a fonte usada na barra de _status:" #: ../src/dlgEditWorld.ui:2101 msgid "Select the font used in the status bar" msgstr "Selecione a fonte usada na barra de status" #: ../src/dlgEditWorld.ui:2143 msgid "Time Display" msgstr "Exibição dos Tempos" #: ../src/dlgEditWorld.ui:2179 msgid "C_onnected time:" msgstr "Tempo c_onectado:" #: ../src/dlgEditWorld.ui:2213 ../src/dlgEditWorld.ui:2323 msgid "Do not display" msgstr "Não exibir" #: ../src/dlgEditWorld.ui:2218 msgid "Select if you do not want the connection time to be displayed" msgstr "Selecione se você não deseja que o tempo de conexão seja mostrado" #: ../src/dlgEditWorld.ui:2233 ../src/dlgEditWorld.ui:2343 msgid "Display as hours, minutes and seconds" msgstr "Mostrar como horas, minutos e segundos" #: ../src/dlgEditWorld.ui:2238 msgid "" "Select if you want the connection time to be displayed in hours, minutes and " "seconds" msgstr "" "Selecione se você deseja que o tempo de conexão seja mostrado em horas, " "minutos e segundos" #: ../src/dlgEditWorld.ui:2253 ../src/dlgEditWorld.ui:2363 msgid "Display as seconds" msgstr "Mostrar como segundos" #: ../src/dlgEditWorld.ui:2258 msgid "Select if you want the connection time to be displayed in seconds" msgstr "" "Selecione se você deseja que o tempo de conexão seja mostrado em segundos" #: ../src/dlgEditWorld.ui:2290 msgid "_Idle time:" msgstr "Tempo _Inativo:" #: ../src/dlgEditWorld.ui:2328 msgid "Select if you do not want the idle time to be displayed" msgstr "Selecione se você não deseja que o tempo de inatividade seja mostrado" #: ../src/dlgEditWorld.ui:2348 msgid "" "Select if you want the idle time to be displayed in hours, minutes and " "seconds" msgstr "" "Selecione se você deseja que o tempo de inatividade seja mostrado em horas, " "minutos e segundos" #: ../src/dlgEditWorld.ui:2368 msgid "Select if you want the idle time to be displayed in seconds" msgstr "" "Selecione se você deseja que o tempo de inatividade seja mostrado em segundos" #: ../src/dlgEditWorld.ui:2383 msgid "Only _reset idle time counter when a command is entered directly" msgstr "" "Só _resetar o contador de tempo inativo quando um comando é digitado " "diretamente" #: ../src/dlgEditWorld.ui:2388 msgid "" "Check to make the idle time counter reset only when a command is entered " "directly by typing it in the command entry box. If not checked, if a command " "is sent because of a timer, of a hook, etc, the idle timer is also reset." msgstr "" "Marque para fazer com que o contador de tempo inativo só seja resetado " "quando um comando for digitado diretamente na caixa de entrada de comandos. " "Se não estiver marcado, e um comando for enviado por um timer, hook, etc, o " "contador de tempo ocioso também é resetado." #: ../src/dlgEditWorld.ui:2468 msgid "Command Entry" msgstr "Entrada de Comandos" #: ../src/dlgEditWorld.ui:2501 msgid "_Keep last typed command in command entry box" msgstr "_Manter último comando enviado na caixa de entrada de comandos" #: ../src/dlgEditWorld.ui:2506 msgid "" "Check to have the last command kept in the command entry box, so that you " "can repeat commands only by pressing ENTER" msgstr "" "Marque para que o último comando seja mantido na caixa de entrada de " "comandos, para repeti-lo apertando ENTER simplesmente" #: ../src/dlgEditWorld.ui:2519 msgid "_Echo sent commands in main window" msgstr "_Ecoar comandos enviados na janela principal" #: ../src/dlgEditWorld.ui:2524 msgid "Check to have the sent commands echoed in the main output window" msgstr "Marque para ecoar os comandos enviados na janela principal de saída." #: ../src/dlgEditWorld.ui:2537 msgid "_Store commands between sessions" msgstr "_Salvar comandos entre sessões" #: ../src/dlgEditWorld.ui:2542 msgid "Check to have the command history saved in a file between sessions" msgstr "Marque para salvar os comandos entre sessões." #: ../src/dlgEditWorld.ui:2555 msgid "Never _hide the typed text" msgstr "Nunca _ocultar texto digitado" #: ../src/dlgEditWorld.ui:2560 msgid "" "Check this if the text you type is displayed as black dots in the input box." msgstr "" "Marque se tudo o que você digita aparece como pontos pretos na caixa de " "entrada." #: ../src/dlgEditWorld.ui:2581 msgid "_Number of commands to save in history:" msgstr "_Número de comandos para salvar no histórico:" #: ../src/dlgEditWorld.ui:2595 msgid "Specify the number of commands that are saved and can be later recalled" msgstr "" "Especifique o número de comandos que são salvos e podem ser recuperados " "depois" #: ../src/dlgEditWorld.ui:2622 msgid "C_ommand separator:" msgstr "Separador de c_omandos:" #: ../src/dlgEditWorld.ui:2636 msgid "Specify the separator for commands typed in the command entry box" msgstr "" "Especifique o separador de comandos digitados na caixa de entrada de comandos" #: ../src/dlgEditWorld.ui:2657 msgid "Use single-_line input bar" msgstr "Barra de entrada com _uma única linha" #: ../src/dlgEditWorld.ui:2697 msgid "Enable _auto-completion" msgstr "Habilitar _auto-compleção" #: ../src/dlgEditWorld.ui:2702 msgid "Check to enable command auto-completion (based on previous commands)" msgstr "" "Marque para completar automaticamente os comandos digitados (baseado em " "comandos anteriores)" #: ../src/dlgEditWorld.ui:2723 msgid "Acti_vate auto-completion only after" msgstr "Ati_var auto-compleção somente após" #: ../src/dlgEditWorld.ui:2737 msgid "" "Specify the number of characters that must be typed for command completion " "to start" msgstr "" "Especifique o número de caracteres que devem ser digitados para iniciar a " "completar comandos automaticamente" #: ../src/dlgEditWorld.ui:2752 msgid "characters have been entered" msgstr "caracteres terem sido digitados" #: ../src/dlgEditWorld.ui:2783 msgid "Use _multi-line input bar" msgstr "Barra de entrada com _múltiplas linhas" #: ../src/dlgEditWorld.ui:2830 msgid "N_umber of lines:" msgstr "Núm_ero de linhas:" #: ../src/dlgEditWorld.ui:2868 msgid "S_pell check typed text" msgstr "_Verificar ortografia do texto digitado" #: ../src/dlgEditWorld.ui:2905 msgid "Language code:" msgstr "Código da língua:" #: ../src/dlgEditWorld.ui:2931 msgid "(Leave blank for default based on locale)" msgstr "(Deixe em branco para padrão baseado no locale)" #: ../src/dlgEditWorld.ui:3029 msgid "Select the font used in the command _entry box:" msgstr "Selecione a fonte usada na caixa de _entrada de comandos:" #: ../src/dlgEditWorld.ui:3045 msgid "Select the font used in the command entry box" msgstr "Selecione a fonte usada na caixa de entrada de comandos" #: ../src/dlgEditWorld.ui:3087 msgid "Flood prevention" msgstr "Prevenção de Flood" #: ../src/dlgEditWorld.ui:3126 msgid "Do not allow the _same command to be sent" msgstr "Não _permitir que o mesmo comando seja enviado" #: ../src/dlgEditWorld.ui:3131 msgid "" "Check to prevent more than a given number of equal commands to be sent in a " "row (which can disconnect your character in some muds)" msgstr "" "Marque para evitar que mais que um determinado número de comandos iguais " "seja enviado em seqüência (o que pode desconectá-lo em alguns muds)" #: ../src/dlgEditWorld.ui:3147 msgid "Specify the maximum number of equal commands that can be sent in a row" msgstr "" "Especifique o número máximo de comandos iguais que podem ser enviados em " "seqüência" #: ../src/dlgEditWorld.ui:3162 msgid "_times in a row" msgstr "_vezes em seqüência" #: ../src/dlgEditWorld.ui:3188 msgid "Se_nd this command:" msgstr "E_nviar este comando:" #: ../src/dlgEditWorld.ui:3202 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" "Entre o comando para ser enviado toda vez que o número máximo de comandos " "iguais fosse ser enviado" #: ../src/dlgEditWorld.ui:3273 msgid "Logging Status" msgstr "Estado do Log" #: ../src/dlgEditWorld.ui:3326 msgid "St_art" msgstr "Começ_ar" #: ../src/dlgEditWorld.ui:3342 msgid "_Stop" msgstr "_Parar" #: ../src/dlgEditWorld.ui:3373 msgid "_Include the last" msgstr "_Incluir as últimas" #: ../src/dlgEditWorld.ui:3378 msgid "Select to include lines from the main window in the log file." msgstr "Selecione para incluir linhas da janela principal no arquivo de log" #: ../src/dlgEditWorld.ui:3393 msgid "Inform number of lines to include in the log." msgstr "Informe o número de linhas para incluir no log." #: ../src/dlgEditWorld.ui:3409 msgid "lines of the scrollback buffer in the log" msgstr "linhas do buffer de rolagem no log" #: ../src/dlgEditWorld.ui:3456 ../src/dlgEditWorld.ui:4687 msgid "File" msgstr "Arquivo" #: ../src/dlgEditWorld.ui:3548 msgid "" "Note: You can use strftime() escapes to create different files based on the " "date and time that logging starts. Also, %Kw represents the World name and " "%Kc the character name used in auto-logon." msgstr "" "Nota: É possível usar seqüências da função strftime() para que o nome do " "arquivo inclua a data e/ou hora em que o log é iniciado. Além disso, %Kw " "representa o nome do mundo e %Kc o personagem usado no auto-logon." #: ../src/dlgEditWorld.ui:3590 msgid "Options" msgstr "Opções" #: ../src/dlgEditWorld.ui:3623 msgid "A_utomatically start logging when connected" msgstr "Inicilar log a_utomaticamente quando conectado" #: ../src/dlgEditWorld.ui:3629 msgid "" "If this is selected, logging will be automatically started whenever you " "connect to the world." msgstr "" "Se estiver selecionada, o log será automaticamente iniciado sempre que você " "se conectar a este mundo." #: ../src/dlgEditWorld.ui:3642 msgid "Prefix lines with _date and/or time" msgstr "Incluir _data e/ou hora" #: ../src/dlgEditWorld.ui:3648 msgid "" "Select this if you want to prefix each line in the log file with the date " "and/or time it was received." msgstr "" "Selecione esta opção se você deseja colocar no início de cada linha a data e/" "ou hora em que a linha foi recebida." #: ../src/dlgEditWorld.ui:3682 msgid "_Format:" msgstr "_Formato:" #: ../src/dlgEditWorld.ui:3696 msgid "" "The default is to prefix lines with the date and time, but you can configure " "the format with strftime() escape sequences. See the manual for a " "description of those." msgstr "" "Por padrão, é a adicionada a data e hora, mas é possível configurar o " "formato com seqüências da função strftime(). Consulte o manual para uma " "explicação mais detalhada." #: ../src/dlgEditWorld.ui:3707 msgid "Revert to _default" msgstr "Reverter ao _padrão" #: ../src/dlgEditWorld.ui:3783 msgid "Scripting" msgstr "Scripts" #: ../src/dlgEditWorld.ui:3824 msgid "_Perl file to load:" msgstr "Arquivo _Perl para carregar:" #: ../src/dlgEditWorld.ui:3924 msgid "Plugins Currently Loaded" msgstr "Plugins carregados" #: ../src/dlgEditWorld.ui:3982 msgid "_Load" msgstr "_Carregar" #: ../src/dlgEditWorld.ui:4052 msgid "Plugins Loaded on Startup" msgstr "Plugins carregados na inicialização" #: ../src/dlgEditWorld.ui:4114 msgid "_Add" msgstr "_Adicionar" #: ../src/dlgEditWorld.ui:4130 msgid "_Remove" msgstr "_Remover" #: ../src/dlgEditWorld.ui:4238 msgid "MCCP (for compression)" msgstr "MCCP (para compressão)" #: ../src/dlgEditWorld.ui:4271 msgid "_Enable if server proposes after connecting" msgstr "_Habilitar se o servidor propuser após a conexão" #: ../src/dlgEditWorld.ui:4288 msgid "Enable if server proposes at _any time" msgstr "H_abilitar se o servidor propuser a qualquer momento" #: ../src/dlgEditWorld.ui:4305 msgid "_Disable" msgstr "_Desabilitar" #: ../src/dlgEditWorld.ui:4374 msgid "Scrolling" msgstr "Rolagem" #: ../src/dlgEditWorld.ui:4408 msgid "Scroll on _output" msgstr "Rolar quando chega texto _novo" #: ../src/dlgEditWorld.ui:4413 msgid "" "Check to have the main window scroll to the end whenever new output comes" msgstr "" "Marque para que a janela seja movida para o fim sempre que novo texto chegar" #: ../src/dlgEditWorld.ui:4434 msgid "_Lines to save in scrollback buffer:" msgstr "_Linhas para salvar no buffer de rolagem:" #: ../src/dlgEditWorld.ui:4448 msgid "" "Specify the number of lines of output that can be seen with by scrolling the " "window" msgstr "" "Especifique o número de linhas da saída que podem ser vistas rolando a janela" #: ../src/dlgEditWorld.ui:4498 msgid "Name display" msgstr "Exibição do nome" #: ../src/dlgEditWorld.ui:4531 msgid "Identify as 'World name'" msgstr "Identificar como 'Nome do mundo'" #: ../src/dlgEditWorld.ui:4547 msgid "Identify as 'World name - Character'" msgstr "Identificar como 'Nome do mundo - Personagem'" #: ../src/dlgEditWorld.ui:4563 msgid "Identify as 'Character - World name'" msgstr "Identificar como 'Personagem - Nome do mundo'" #: ../src/dlgEditWorld.ui:4584 msgid "Custom: " msgstr "Personalizado: " #: ../src/dlgEditWorld.ui:4622 msgid "" "Use %Kw to represent the World's name, and %Kc to represent the auto-logon " "character name" msgstr "" "Use %Kw para representar o nome do mundo, e %Kc para representar o nome do " "personagem usado no auto-logon" #: ../src/dlgEditWorld.ui:4726 msgid "_File:" msgstr "_Arquivo:" #: ../src/dlgEditWorld.ui:4763 msgid "" "You can leave this field blank, and a file name will be automatically " "generated. Only edit this field if you know what you are doing." msgstr "" "Você pode deixar esse campo em branco, e um nome de arquivo será gerado " "automaticamente. Edite esse campo apenas se souber o que está fazendo." #: ../src/dlgEditWorld.ui:4805 msgid "Character Set" msgstr "Conjunto de caracteres" #: ../src/dlgEditWorld.ui:4838 msgid "Character _set:" msgstr "Co_njunto de caracteres:" #: ../src/dlgEditWorld.ui:4892 msgid "Graphical Editors" msgstr "Editores Gráficos" #: ../src/dlgEditWorld.ui:4925 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "Pedir confirmação _antes de apagar triggers, aliases, etc." #: ../src/dlgEditWorld.ui:4930 ../src/dlgEditWorld.ui:5031 msgid "" "If not checked, objects such as triggers, aliases, etc. will be deleted " "directly without asking for confirmation when you press the Delete button." msgstr "" "Se não estiver marcado, objetos tais como triggers, aliases, etc. serão " "apagados diretamente sem pedir confirmação quando você aperta o botão " "Deletar." #: ../src/dlgEditWorld.ui:4944 msgid "_Show items defined by plugins" msgstr "_Mostrar itens definidos por plugins" #: ../src/dlgEditWorld.ui:4949 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" "Se marcado, triggers, aliases, macros e timers definidos por plugins " "aparecerão nas seções correspondentes do Editor de Mundos" #: ../src/dlgEditWorld.ui:4993 msgid "TCP Keep Alive" msgstr "Keep Alive TCP" #: ../src/dlgEditWorld.ui:5026 msgid "Enable TCP _Keep Alive packets" msgstr "Habilitar pacotes TCP _Keep Alive" #: ../src/dlgEditWorld.ui:5047 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "(Você precisa reconectar para alterações fazerem efeito)" #: ../src/dlgEditWorld.ui:5087 msgid "Input" msgstr "Entrada" #: ../src/dlgEditWorld.ui:5120 msgid "_Disable up and down arrow keys for history navigation" msgstr "_Desabilitar as setas para navegar no histórico" #: ../src/dlgEditWorld.ui:5125 msgid "" "If checked, the up and down arrow keys are not used for navigating between " "saved commands. (You'll have to use Alt+up and Alt+down.)" msgstr "" "Se marcado, as setas para cima e para baixo não serão usadas para\n" "navegar entre os comandos salvos no histórico. (Será necessário usar\n" "Alt+Acima e Alt+abaixo.)" #: ../src/dlgTestTriggers.ui:57 msgid "Enter _line to be matched against the triggers:" msgstr "Entre a _linha para ser comparada com os triggers:" #: ../src/dlgTestTriggers.ui:75 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" "Os triggers serão testados com o texto digitado aqui, como se fosse uma " "linha recebida do MUD" #: ../src/dlgTestTriggers.ui:86 ../src/dlgMLSend.ui:52 #: ../src/dlgCmdHistory.ui:161 msgid "_Send" msgstr "_Enviar" #: ../src/dlgTestTriggers.ui:91 msgid "Click the run the triggers against the line." msgstr "Clique para testar os triggers com a linha." #: ../src/dlgTestTriggers.ui:129 msgid "Number of triggers that matched:" msgstr "Número de triggers disparados:" #: ../src/dlgTestTriggers.ui:160 msgid "Commands that would be sent:" msgstr "Comandos que seriam enviados:" #: ../src/dlgTestTriggers.ui:193 msgid "This is what would be printed in the main screen:" msgstr "Isso é o que seria mostrado na janela principal:" #: ../src/dlgTestTriggers.ui:205 msgid "" "This is what would be printed in the main screen. If empty, the line has " "been gaged. It can be different from the original line because of rewriter " "triggers." msgstr "" "Isso é o que seria impresso na janela principal. Se estiver vazio, a linha " "foi omitida. A linha pode ser diferente da original por causa de triggers " "reescritores." #: ../src/dlgTestTriggers.ui:223 msgid "Would this line be included in the log file?" msgstr "Essa linha seria escrita no arquivo de log?" #: ../src/dlgMLSend.ui:20 msgid "Multi-line send" msgstr "Enviar múltiplas linhas" #: ../src/dlgMLSend.ui:82 msgid "Send this text _initially:" msgstr "Enviar esse texto _inicialmente:" #: ../src/dlgMLSend.ui:102 ../src/dlgMLSend.ui:193 msgid "Enter some text to be sent to the World" msgstr "Entre com algum texto para ser enviado ao Mundo" #: ../src/dlgMLSend.ui:118 msgid "Then send the _contents of this file:" msgstr "Então enviar o conteúdo desse _arquivo:" #: ../src/dlgMLSend.ui:173 msgid "_Finally, send this text:" msgstr "_Finalmente, enviar esse texto:" #: ../src/dlgMLSend.ui:220 msgid "Add this to the _beginning of each line:" msgstr "Adicionar isso ao c_omeço de cada linha" #: ../src/dlgMLSend.ui:235 msgid "Specify some text to be prepended to each sent line" msgstr "" "Especifique algum texto para ser anexado ao começo de cada linha enviada" #: ../src/dlgMLSend.ui:250 msgid "Add this to the _end of each line:" msgstr "Adicionar isso ao f_im de cada linha:" #: ../src/dlgMLSend.ui:265 msgid "Specify some text to be appended to each sent line" msgstr "Especifique algum texto para ser anexado ao fim de cada linha enviada" #: ../src/dlgMLSend.ui:283 msgid "_Delay" msgstr "A_guardar" #: ../src/dlgMLSend.ui:297 msgid "Specify the delay between sending the group of lines" msgstr "Especifique a espera entre o envio de cada grupo de linhas" #: ../src/dlgMLSend.ui:313 msgid "seconds e_ach" msgstr "segundos ca_da" #: ../src/dlgMLSend.ui:327 msgid "Specify how many lines are sent at once" msgstr "Especifique quantas linhas são mandadas de cada vez" #: ../src/dlgMLSend.ui:342 msgid "line(s)" msgstr "linha(s)" #: ../src/dlgMLSend.ui:360 msgid "_Keep dialog open after sending" msgstr "_Manter janela aberta após envio" #: ../src/dlgCmdHistory.ui:20 msgid "Command History" msgstr "Histórico de comandos" #: ../src/dlgCmdHistory.ui:75 msgid "Find a command containing a given search term" msgstr "Procura por um comando contendo um determinado texto" #: ../src/dlgCmdHistory.ui:87 msgid "Find _next" msgstr "Encontrar _próximo" #: ../src/dlgCmdHistory.ui:93 msgid "Find the next command with the same match text" msgstr "Procura pelo próximo comando com o mesmo texto" #: ../src/dlgCmdHistory.ui:124 msgid "_Recall" msgstr "_Recuperar" #: ../src/dlgCmdHistory.ui:130 msgid "Put the selected command in the command entry box" msgstr "Colocar comando na caixa de entrada de comandos" #: ../src/dlgCmdHistory.ui:143 msgid "Rec_all & Close" msgstr "Recuper_ar & Fechar" #: ../src/dlgCmdHistory.ui:149 msgid "Put the selected command in the command entry box and close this dialog" msgstr "Colocar comando na caixa de entrada de comandos e fechar essa janela" #: ../src/dlgCmdHistory.ui:167 msgid "Send the selected command(s) to the mud" msgstr "Envia o(s) comando(s) selecionados ao mud" #: ../src/dlgCmdHistory.ui:179 msgid "S_end & Close" msgstr "E_nviar & Fechar" #: ../src/dlgCmdHistory.ui:185 msgid "Send the selected command(s) to the mud and close the dialog" msgstr "Envia o(s) comando(s) selecionados ao mud e fecha esta janela" #: ../src/dlgCmdHistory.ui:224 msgid "Newest commands are on the top" msgstr "Comandos mais novos estão no topo" #: ../src/dlgCmdHistory.ui:252 msgid "Dela_y" msgstr "A_guardar" #: ../src/dlgCmdHistory.ui:265 msgid "Specify the delay between sending the group of commands" msgstr "Especifique a espera entre o envio de cada grupo de comandos" #: ../src/dlgCmdHistory.ui:282 msgid "sec_onds each" msgstr "segundos ca_da" #: ../src/dlgCmdHistory.ui:296 msgid "Specify how many commands are sent at once" msgstr "Especifique quantos comandos são mandadas de cada vez" #: ../src/dlgCmdHistory.ui:313 msgid "commands(s)" msgstr "comando(s)" #: ../src/dlgCmdHistory.ui:338 msgid "Find Command" msgstr "Encontrar Comando" #: ../src/dlgCmdHistory.ui:400 msgid "_Text to find:" msgstr "_Texto para procurar:" #: ../src/dlgCmdHistory.ui:413 msgid "Enter the text to search for" msgstr "Entre o texto para procurar" #: ../src/dlgCmdHistory.ui:434 msgid "Search direction:" msgstr "Direção da busca:" #: ../src/dlgCmdHistory.ui:449 msgid "_Downwards" msgstr "Para _baixo" #: ../src/dlgCmdHistory.ui:466 msgid "_Upwards" msgstr "Para _cima" #: ../src/mnuPopupURL.ui:12 msgid "_Open link" msgstr "_Abrir link" #: ../src/mnuPopupURL.ui:21 msgid "_Copy link address" msgstr "_Copiar endereço do link" #: ../share/kildclient.pl:76 ../share/kildclient.pl:97 #: ../share/kildclient.pl:117 ../share/kildclient.pl:182 #: ../share/kildclient.pl:433 ../share/kildclient.pl:511 #: ../share/kildclient.pl:589 ../share/kildclient.pl:602 #: ../share/kildclient.pl:615 ../share/kildclient.pl:628 #: ../share/kildclient.pl:641 ../share/kildclient.pl:654 #: ../share/kildclient.pl:667 ../share/kildclient.pl:680 #: ../share/kildclient.pl:694 ../share/kildclient.pl:708 #: ../share/kildclient.pl:818 ../share/kildclient.pl:830 #: ../share/kildclient.pl:842 ../share/kildclient.pl:854 #: ../share/kildclient.pl:867 ../share/kildclient.pl:1083 #: ../share/kildclient.pl:1116 #, perl-format msgid "%s: Too few arguments." msgstr "%s: Muito poucos argumentos." #: ../share/kildclient.pl:207 ../share/kildclient.pl:567 #, perl-format msgid "No such %s" msgstr "Não existe tal %s" #: ../share/kildclient.pl:298 ../share/kildclient.pl:316 #: ../share/kildclient.pl:334 ../share/kildclient.pl:352 #: ../share/kildclient.pl:370 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: Número errado de argumentos." #: ../share/kildclient.pl:403 ../share/kildclient.pl:411 #: ../share/kildclient.pl:489 ../share/kildclient.pl:497 #, perl-format msgid "No such %s." msgstr "Não existe tal %s." #: ../share/kildclient.pl:425 #, perl-format msgid "No %s deleted." msgstr "Nenhum %s apagado." #: ../share/kildclient.pl:427 #, perl-format msgid "One %s deleted." msgstr "Um %s apagado." #: ../share/kildclient.pl:429 #, perl-format msgid "%d %s deleted." msgstr "%d %s apagados." #: ../share/kildclient.pl:506 #, perl-format msgid "Successfully moved %s." msgstr "Sucesso ao mover %s." #: ../share/kildclient.pl:898 msgid "Could not open file." msgstr "Não foi possível abrir o arquivo." #: ../share/kildclient.pl:928 msgid "Unknown" msgstr "Desconhecido" #: ../share/kildclient.pl:935 msgid "Invalid plugin file." msgstr "Arquivo de plugin inválido." #: ../share/kildclient.pl:966 msgid "Plugin already loaded. Try enabling it." msgstr "Plugin já carregado. Tente habilitá-lo." #: ../share/kildclient.pl:968 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "Versão %s desse plugin já está carregada." #: ../share/kildclient.pl:978 #, perl-format msgid "Error in plugin file: %s" msgstr "Erro no arquivo de plugin: %s" #: ../share/kildclient.pl:990 msgid "Cannot load a plugin in another world." msgstr "Não é possível carregar um plugin em outro mundo." #: ../share/kildclient.pl:995 ../share/kildclient.pl:1015 msgid "Plugin not specified" msgstr "Plugin não especificado." #: ../share/kildclient.pl:1002 ../share/kildclient.pl:1033 msgid "Plugin not loaded." msgstr "Plugin não carregado." #: ../share/kildclient.pl:1005 #, perl-format msgid "Plugin '%s' loaded." msgstr "Plugin '%s' carregado." #: ../share/kildclient.pl:1021 #, perl-format msgid "Could not load plugin %s" msgstr "Impossível carregar plugin %s" #: ../share/kildclient.pl:1097 msgid "Plugin enabled." msgstr "Plugin habilitado." #: ../share/kildclient.pl:1130 msgid "Plugin disabled." msgstr "Plugin desabilitado." #: ../share/kildclient.pl:1279 msgid "Cannot open help file." msgstr "Não foi possível abrir o arquivo de ajuda." #: ../share/kildclient.pl:1297 msgid "Help topic not found." msgstr "Tópico de ajuda não encontrado." #: ../share/kildclient.pl:1394 msgid "" "Warning: the getwindowsize() function is deprecated and will be removed." msgstr "Aviso: a função getwindowsize() será removida no futuro." #: ../share/kildclient.pl:1395 msgid "Use $window->getsize() instead." msgstr "Use $window->getsize() no lugar dela." #: ../share/kildclient.pl:1400 msgid "Warning: the minimize() function is deprecated and will be removed." msgstr "Aviso: a função minimize() será removida no futuro." #: ../share/kildclient.pl:1401 msgid "Use $window->minimize() instead." msgstr "Use $window->minimize() no lugar dela." #: ../share/kildclient.pl:1406 msgid "Warning: the path() function is deprecated and will be removed." msgstr "Aviso: a função path() será removida no futuro." #: ../share/kildclient.pl:1407 msgid "Use $world->path() instead." msgstr "Use $world->path() no lugar dela." kildclient-3.0.0/kildclient.desktop0000644000175000017500000000106412354344664014306 00000000000000[Desktop Entry] Version=1.0 Type=Application Exec=kildclient Icon=kildclient Terminal=false Categories=Network;RolePlaying; Name=KildClient Name[eo]=KildClient Name[pt_BR]=KildClient GenericName=MUD Client GenericName[eo]=Kliento por konekti al MUD-oj GenericName[pt_BR]=Cliente de MUD Comment=Connect to MUDs (Multi User Dungeons) Comment[eo]=Konektu al MUD-oj (Multi User Dungeons) Comment[pt_BR]=Conecte-se a MUDs (Multi User Dungeons) Keywords=connect;play;dungeon;mush; Keywords[eo]=konecti;ludi;dungeon;mush; Keywords[pt_BR]=conectar;jogar;dungeon;mush; kildclient-3.0.0/README0000644000175000017500000000555012367156733011457 00000000000000KildClient 3.0.0 ---------------- KildClient is a MUD client using the GTK+ toolkit. Its main feature is the support for Perl scripting, which allows you to do basically whatever you want. Other standard features of mud clients (triggers, gags, macros, etc.) are also supported. See the features page for a more detailed list of features. Installation follows the standard procedure: ./configure make make install After that, run with the `kildclient' command. Several libraries are required in order to use KildClient. Here is a list: - gtk+ >= 3.10.0 - glib >= 2.32.0 - libperl Note that some of those have further dependencies, which need to be installed also. If you need to compile the client, you'll need the development files in addition to the runtime files (if your distribution uses packages, look for packages ending in -dev). You might want the gtkspell library also. It is not necessary, but if found you can have spell checking in the client. You also need the Locale::Gettext and JSON Perl modules. For documentation, see the KildClient manual, which should be installed in {prefix}/share/doc/kildclient. {prefix} if by default /usr/local, but it can be changed via configure. SSL Support ----------- KildClient has the hability to connect to muds securily via SSL (for servers that support it, naturally). To build a SSL-enabled KildClient, you need the gnutls library, version 2.10.0 or greater. The configure script will search for it. If the library is found, SSL support will be enabled. If it is not found, the built KildClient will not have that feature. You can always disable that feature by passing the --without-libgnutls option to the configure script. KildClient and gtk3-perl ------------------------ If you have the gtk3-perl bindings, you can use plugins that make use of the GTK+ library. It is not necessary to have gtk2-perl installed, but if you have, you'll be able to use a greater range of plugins. Some standard plugins distributed with KildClient (such as the notes plugin) use it, and so may some third-party ones. Building from git ----------------- If you have a copy of KildClient that comes from the git repository (and not a tarball that you downloaded), the building process is more complicated. You must first run the autogen.sh script, and then proceed with the configure script. However, you will need some extra tools: automake, autoconf, glib-gettextize (part of glib, which is in turn used by gtk) and intltool. You will also need the development files of the libraries used by KildClient. Copyright --------- KildClient is Copyright 2004-2014 by Eduardo Kalinowski (eduardo@kalinowski.com.br). KildClient is free software; you can distribute this software 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. kildclient-3.0.0/NEWS0000644000175000017500000010533412374460043011265 00000000000000Changes in version 3.0.0 ------------------------ - The code responsible for interpreting the lines received from the server and displaying them has been rewritten to take advantage of newer processors by doing things in parallel. That should make the program more responsive, especially when there are many triggers. - KildClient has been upgraded to use GTK+ 3. This should not affect your user experience, but plugins that use gtk2-perl for graphical interface need to be upgraded to use gtk3-perl. In most cases, just replacing s/Gtk2/Gtk3/ should be sufficient. But if the plugin used deprecated functions, bigger changes might be necessary. See the following link for more information on upgrading: https://metacpan.org/release/Gtk3/ - KildClient now supports the GMCP (also called ATCP2) and MSDP protocols for data transfer between the server and client. - KildClient now supports HTTP proxies. - Timers can now have sub-second intervals. The syntax is the same, but you can now use an interval of "0.5" to run the timer twice per second. - New functions have been created to enable/disable triggers, aliases, macros, timers and hooks without printing the "Trigger modified" message (or similar): silentenatrigger/silentdistrigger and similarly for the other objects. - New function $world->cmdseparator() to set and retrieve the command separator. - When opening log files, parent directories are created as necessary automatically. - New function getclientname() returns the name of the client ("KildClient"). - Bug fixed: KildClient no longer crashes when importing triggers or aliases from the World Selector. - Bug fixed: Some telnet commands (used to configure protocols for communication between KildClient and the server) could be ignored if immediately following a new line. Changes in version 2.11.1 ------------------------- - Bug fixed: the SSL handshake locked the interface. And KildClient would wait forever if it never completed, requiring a forced close. - Fixed bug with some 256-color ansi sequences. - Fixed a bug that caused the program to freeze when deleting a trigger or alias of a Word edited from the World Selector. - If a plugin fails to load, any objects created by that plugin are removed. - Fixed bug that prevented copying text from the scroll window. - Fixed crash that happened if you had a rewriter trigger without an action. (Thanks to dmzkrsk.) Changes in version 2.11.0 ------------------------- - Added an option to disable up/down for navigating the command history (Alt+up/down will remain working.) This allows the use of input methods that use the arrow keys as part of the input process. - Included the 'channels' plugin by Jack Mudge. It allows for capturing all lines of text matching a regexp to a separate window. - The path() function has been changed, it should now be called as $world->path(). It now respects the delay and grouping settings in the Preferences dialog instead of sending all commands at once. - The Windows version now supports SSL.xb - Bug fixed: the clear button in KCWin windows is now working. - Bug fixed: under some systems (PC-BSD, for example) connections do not always fail anymore. Changes in version 2.10.0 ------------------------- - Added German translation, courtesy of René Küttner. - It is now possible to use the matched substrings captured with () groups in triggers even if the action is not a Perl command: use $1 to represent the first matched substring, $2 for the second, and so on. - It is now possible to split the screen so that you can see simultaneously the newly received text and some other part of the scrollback buffer. - New wrapping options added: it is possible to indent wrapped lines, and lines can be wrapped after a specific number of characters, if the window is wider. - It is now possible to disable the tooltips with the time when a line was received. - You can now pass a host name in the command line to connect to a World. If you need to specify a port other than 4000, use hostname:port. Also, telnet:// URLs are recognized. - Added an option to enable TCP Keep Alive. (Based on patch by Tasci Synx.) - Fixed bug that prevented the World Editor to be opened again if it was closed by pressing ESC or using the X button of the title bar. - Fixed bug: when the World Editor is cancelled, changes you made are reverted if it's opened again. - Fixed a bug that caused the program to freeze when editing or creating a new World from the World Selector. - Fixed bug: worlds with only one auto-logon character now also have an option to disable auto-logon in the World Selector. - Fixed bug that caused on the OnCloseConnected hook to be executed when it shouldn't (before a connection is really established, or when the server closes the connection). - Fixed a bug that reported an error when loading plugins even when there was no error. Changes in version 2.9.0 ------------------------ - The Command History dialog now displays the most recent commands in the top. - If you type a command that you had typed before, now only one copy is stored in the command history. - It is now possible to customize what's displayed in the tab for each World, including for example the name of the character logged in. - When you start logging, you can now include lines already present in the scrollback buffer. - Added the $world->interpret() function, that takes its argument and interprets it as if it were typed in the input box. - Added the $world->expandalias() function to expand aliases in a given string. - When defining the file name for logging, it is possible to use the escapes %Kw and %Kc to represent the world's name and auto-logon character name, respectively. - Added the $world->sendlines() function to easily send several lines with a delay between each line (or group of lines). - Added the $world->mlsend() function to emulate the Multi-line send feature (and all its possibilities) from within a perl script. - The $world->sendfile() function now returns true for success (the file was sent) and false if the file could not be opened. - Added the $world->getline() function to retrieve a line from the scrollback buffer. - In the "Edit Default World" dialog, some settings related to logging that did not make sense in that context are not displayed anymore. - Bug fixed: using the '>' character in a trigger or alias does not cause errors anymore. - Bug fixed: warnings about editing a plugin's object (triggers, aliases, etc.) now only show when the object edited really is from a plugin. - Bug fixed: if you change a world's name, the tab now changes to the new name immediately. - Bug fixed: you can define macros containing keys such as the arrows and Page Up/Page Down. Care is recommended when doing that, though, because it can conflict with built-in commands for moving the cursor, for example. Changes in version 2.8.1 ------------------------ - Added Swedish translation, thanks to Niklas Grahn. - Backspace characters received from the MUD work, erasing the previous char. Changes in version 2.8.0 ------------------------ - SOCKS proxy support has been added. - The tab bar can be hidden if there is only open open tab. - If all the text you type is displayed as black dots (like it was a password), you can now set an option to prevent that and see the text in the input box. (This is necessary with a few servers that do the command echoing themselves.) - In the multi-line input box, Shift+Enter and Ctrl+Enter now allow you to enter a new line of text, instead of sending the contents of the box. - The $world->deltrigger() function (and the other ones for aliases, macros, etc.) now return the number of objects deleted. - Bug fixed: If you edit the list of auto-logon characters (reordering them or deleting entries), you could reconnect with the wrong character or get a crash. Now you always reconnect with the same character, even if the order is changed; if that auto-logon character is deleted, then auto-logon is disabled. Changes in version 2.7.0 ------------------------ - Added a $window variable pointing to the main window. The minimize() function is now $window->minimize() and getwindowsize() is now $window->getsize(). Because of this change, some of your scripts may need to be rewritten. - The name of the currently open world is displayed in the title bar. - Added the $window->settitle() function to set the title of the window. - Added the $window->seturgencyhint() function to force a request of attention to that window. - Fixed bug that caused a crash on startup in Ubuntu 8.04 (and possibly other systems). - Fixed bug that prevented a plugin from using its permanent variables during initialization of the plugin. - OnGetFocus and OnLoseFocus triggers are now run after the setting of the window title and urgency hint, so the triggers can override the default behavior. - Added functions to get a trigger/alias/macro/timer/hook's number based on its name. - The URL in the about box can now be clicked to go to KildClient's web site. - Added the $world->getlogfile() function to retrieve the name of the file to which the output is logged. Changes in version 2.6.0 ------------------------ - There is now a close button in the tabs for quickly closing the world. - It is now possible to reorder the Worlds by dragging the tabs to the new desired position. - When trying to connect to a Mud server, KildClient does not freeze anymore (it tries connecting asynchronously). (Includes patch by Zephaniah E. Hull.) - It is now easier to set up session logging, as logging can be configured and started/stopped from the World Editor. It is even possible to configure logging to automatically start from there. - Added the option not to store the command history between sections. (Patch by Zephaniah E. Hull.) - The keypad keys can now be used in the input box and in dialogs. (Patch by Zephaniah E. Hull.) - You can now alternate worlds with Ctrl-Tab and Ctrl-Shift-Tab. - Some bugs in the Windows version regarding network handling were fixed. - Added the $world->ispermanent function to check if a variable is permanent. - Added the $world->getcharacter function to return the name of the character used to auto log in to the mud. - Changed the delimiter for pattern matching in triggers and alias substitution (from <> to ASCII character 5, ^E). This should allow '>' (used in ->, for example) to be used in an easier way in aliases. - Bug fixed: When you open two worls in the Windows version and close one, or when you try to connect to another one in the same session, the program does not crash anymore. - Fixed a bug that sometime caused KildClient under Windows to crash when switching to another world. - Bug fixed: If a timer has an interval or repeat count that is a large number, the output of $world->listtimer is now properly aligned. - Bug fixed: When reading XML files (Worlds or triggers/etc to import), KildClient recognizes the files properly even if they do not end in a newline. Changes in version 2.5.1 ------------------------ - The last openened world is not selected and displayed on-screen when the World Selector dialog is shown. - The default strings for calling a browser and playing a sound now use quotes around the argument. - The tooltip with information about the line is not shown anymore at the same time as the "Disconnected" message box, so it does not cover the buttons in that dialog. - Bug fixed: If the kildclient.cfg file does not exist (which happens usually in the first run), KildClient does not crash anymore. - Bug fixed: In single-line input mode, pressing Shift+Enter or CTRL+Enter now sends the line to the mud. - Bug fixed: KildClient does not crash anymore if you try to connect to a world with invalid XML. Changes in version 2.5.0 ------------------------ - You can now change the color and style of a line that matched a trigger (also known as highlighting). - When new text is received, the window now flashes to draw your attention to it (if your window manager supports the "Urgent" hint). This feature can be disabled, however. - You can now specify another directory to store configuration files and saved Worlds, instead of the default ~/.kildclient (Linux) or %APPDATA%\kildclient (Windows), with the -c command-line option. - You can now manipulate, from a given World, another World. You get a pointer to it with the getworld() function, and then call functions on that pointer. - Added a new hook: OnCloseDisconnected. This hook is executed when you forcedly close a world while it is disconnected (via the menu World->Close, $world->close() or by quitting the program). So you can put "quit" in there to always exit the mud nicely. - Added the SILENT attribute to worlds: if $world->{SILENT} is set to a true value, some messages (such as "Trigger added", "Alias enabled", etc.) are not printed. - Fixed bug that closed the client if the Help button was pressed in the World Editor for a plugin that does not define a help function. - Bug fixed: now you can only open the Test Triggers dialog if you are connected to the world. - Fixed a bug that cause NAWS information to be sent with each command if the server supports it. Changes in version 2.4.1 ------------------------ - Fixed bug that caused crashes on startup with messages like this: *** glibc detected *** free(): invalid pointer: 0x081903c0 *** Aborted - Bug fixed: now if two triggers match the same line, each capturing different parts of the line with () in the regular expression, the commands of each trigger will be run with the correct captured parts in the $_[X] variables. Changes in version 2.4.0 ------------------------ - When using the multi-line input box, the up and down arrows behave now more naturally: they either retrieve the previous/next command or move the cursor. They move the cursor if you have already moved the cursor in order to edit the line, and move through commands otherwise. - You can now type the start of a command and use Alt+Shift+Up and down arrows to recall previously entered commands. - The keyboard shortcuts for moving through worlds were wrong: now they behave correctly: ctrl+page_down for next world and ctrl+page_up for previous world. - Added spell checking support to check what you type in real-time. - Pressing ENTER when in the "host" or "port" fields of the World Selector now works. - Pressing ENTER when in the search box activates Find Next, and pressing ESC closes the search bar. - If you try to exit the program when there are open worlds, a confirmation dialog is now displayed. - When using the Multi-Line Send feature, you can now choose not to close the dialog after sending. - A new function, $world->sendfile() has been added, that allows the contents of a file to be sent to the mud. - Two new functions, $world->getconntime() and $world->getidletime() retrieve the time connected and idle time, respectively. - Now by default MCCP is only activated if the request from the server to enable it comes at most 1 minute after the connection. This is to prevent other users in a MUD from trying to crash your client by sending the special sequence that turns on compression (however, well written MUD servers will not allow players to send such sequences). You can, however, cause MCCP to work if started anytime, or disable it altogether. - When Debug Matches is on, the name of triggers and aliases is now displayed when there is a match. - Fixed a bug that caused a crash (or at least a warning) when the Preferences Dialog was opened a second time. - Fixed a bug that prevented changing the input bar size when editing a World from the World Editor. - Fixed a bug that didn't show the status of the input bar correctly when editing a World. - Fixed a bug that caused a crash when very long lines were received when compression is active. - Fixed a bug that caused a crash when the Manual menu was selected for the second time. - Bug fixed: if compression is disabled during the MUD session, the status bar and Statistics dialog now reflect that fact. - Bug fixed: weird error messages are not shown anymore when a connection is closed cleanly. Changes in version 2.3.0 ------------------------ - Added a feature to search the buffer for a given string. - The input bar can now have more than one line, to ease typing long commands. - Added the "Edit" menu with the usual Cut, Copy, Paste and Delete. - When you have a prompt and some command echoes text in the screen, this text is printed above the command and not after the prompt. - Triggers and aliases can now match case-insensitively. - The play() function has been added. This function allows you to play WAV files. - It is now possible to export triggers, aliases, macros, timers, permanent variables and hooks and import them in other worlds. - The order of permanent variables can now be changed (but this is only for grouping of realted variables, there is no real effect in the world). - The entry boxes in the Multi Line Send dialog are now 80 characters wide. - In the editors for triggers, aliases, etc., you can now select more than one item and delete all selected items at once. - You can display items defined by plugins in the editors for triggers, aliases, etc. The changes, however, are NOT made in the plugin file. - KildClient can now connect with SSL to servers that support Telnet Over SSL, and the MUD session will be encrypted. (Note: this feature can be disabled at compilation time.) - Added the functions $world->triggerenabled(), $world->aliasenabled(), $world->macroenabled(), $world->timerenabled() and $world->hookenabled() to check if a - given trigger, alias, etc. is enabled. These functions can also be used to check for existence of triggers, aliases, etc. - Plugins can define two functions ENABLE and DISABLE to be called when the plugin is to be enabled or disabled, if this action requires some extra functionality that the default actions are not enough. - Fixed a bug that caused macros not to be run when non-English keymaps are used. (Thanks to Sergey Bogdanov.) - Fixed a bug that caused the wrong number of lines that fit in the window to be calculated (and sent to the server if NAWS is being used) under some circunstances. - Fixed a bug that caused a segfault when a recursive alias definition was found. Now alias processing stops after the command line gets too big. - Fixed a bug that caused a segfault after a world was closed. Changes in version 2.2.2 ------------------------ - In colorize(), you can now use && and ^^ to insert a literal & or ^ character. - URLs with username and password for authenticated login are now detected correctly and made clickable. - Removed some big memory leaks that caused KildClient's memory comsumption to get very high in long sessions. - Fixed a security bug that caused a segmentation fault when a very long ANSI sequence was receveived. - Fixed a bug that caused a crash when a connection was broken abruptly (ie, not in a tidy way, generally because of a network failure). - Fixed a bug that caused a segfault in the Windows version when $world->listtrigger was used and there was a trigger without an action. - Fixed a bug that caused text to be displayed in the wrong colors or attributes when non-recognized ANSI sequences were received. Changes in version 2.2.1 ------------------------ - Fixed a bug that caused a crash (segfault) when trying to connect to a World. This bug affects the Windows version. Changes in version 2.2.0 ------------------------ - KildClient has now much more complete support for ANSI codes: if you mud server uses it, KildClient can display text underlined (singly and doubly), in italics, striked through, in reverse video and in hidden mode. The colorize() function has been extended to include codes to turn on these attributes. - KildClient now supports vt100's line-drawing mode, which allows tables to be built with proper characters (and not +, - and |) that look really nice. (But the server must use these characters, naturally.) - KildClient now supports xterm's sequences to access a 256-colour mode instead of only the default 16. The colorize() function has been extended to allow a way to access these additional colors so you can use them in echoed text even if you mud server does not use them. - You can set some world parameters (such as fonts, colors, and others) as defaults, and all new worlds will use these defaults when they are created. - You can now have more than one character for auto-login. When a World has more than one character defined for auto-login, its entry in the World Selector can be expanded to show all characters and you can select which one to use for auto-login. - Added the hability to test triggers and see how they would react to lines sent from the MUD. - The line count in the status bar now displays the total number of lines received for that session, and not the number of lines in the scrollback buffer (which never increases, once the limit is reached). - The Reconnect and Connect to Another menu itens now have shortcuts (CTRL+R and CTRL+SHIFT+R, respectively). - You can now set default values for the command group size and delay between sending command groups (used in the Multi-line Send and Command History dialogs) in the Preferences dialog. - In the editors for triggers, aliases, etc, you can now delect a line by selecting it and pressing the DEL key. - When you connect to a world that uses MCCP, that information is now displayed in the status bar. - Fixed a bug that caused an infinite loop when there was an OnSentCommand hook and two triggers matched and caused commands to be sent. - Fixed a bug that sometimes caused segfaults when "Connect to Another World" was selected. Changes in version 2.1.0 ------------------------ - KildClient now records the time at which each line of the MUD output was received. You can see this time by leaving the mouse over a line of output for a brief time. - A new dialog has been added in which you can review the command history, send commands again, find commands, etc. - The shortcut for moving to the next or previous world is not CTRL+Page Up or CTRL+Page Down, respectively, but the old ones (ALT+Right or Left arrow) still work. There are also new shortcuts: ALT+ where is a number from 1 to 9 will move to the corresponding world. - There's an option in the Advanced section of the World Editor that allows you to skip the confirmation dialog when deleting a trigger, alias, etc. - The Reconnect menu item (and the $world->reconnect function) now work even if you are connected, closing the connection and trying to reconnect. - Added a new hook, OnDisconnect, triggered after you are disconnected from a World. - Fixed a bug that caused a newline to be sent when a pure gag trigger (one without an action) matched. - Fixed a bug that caused you to be disconnected if a very long line was sent by the mud. - Fixed a bug that caused the first line of output not to be correcty displayed in some circunstances. Changes in version 2.0.0 ------------------------ - It is now possible to add, edit, remove, plugins, triggers, aliases, macros, timers, hooks and permanent variables using a Graphical User Interface, accessible from the World Editor. Dealing with Perl is not necessary anymore for that. - Having the World Editor open does not prevent you from using the program anymore. - URLs in the MUD window are now more clearly marked, and pressing the left mouse button opens them automatically. The right mouse button still pops up a menu with an option to open it or copy the URL's address. - Dialog windows (especially the World Selector) now appear in the center of the screen, and not in awkward places. - The output from the MUD is not shown anymore in a vte widget, but in a TextView. This should not bring any big changes, things should still work as before with small modifications. The only thing that has been removed is the hability to have a transparent or image background. - KCWin's now use a TextView also. Gnome2::Vte::Terminal is not necessary anymore. If you used the ->{VTE} widget directly, you will need to make some changes to you plugins. The other functions (especially feed()) still work as before. - Added the $world->movetrigger() function to reorder triggers, and similar functions for aliases, times, macros and hooks. - Fixed a bug that attributed an invalid name to some hooks. - Bug fixed: macro names are displayed in $world->listmacro(). - Bug fixed: attempting to edit an offline World no longer crashes KildClient. - Corrected some problems that caused build failures for some versions of the Perl library. Changes in version 1.3.2 ------------------------ - Bug fixed: KildClient does not segfault anymore when opening a new world for the first time. - Bug fixed: & and < can be used in the command separator and this does not cause the world to stop being recognized anymore. Changes in version 1.3.1 ------------------------ - This version fix a library dependency problem. It brings no new features and bugfixes, but if you had problems building version 1.3.0, try using this version. Changes in version 1.3.0 ------------------------ - You can now specify one or more world names in the command line, and these worlds will be automatically opened. - The status bar is more informative and more configurable: it can display the time connected and/or idle, and the font can be changed. - When you are disconnected from a world, there is another option you can select: Offline, to keep that window open, so that you can review the screen, run Perl commands, etc. - Two new function: $world->reconnect() reconnects to the world that was open, when in offline mode. $world->connectanother() closes the current connection (if one is open) and allows you to select another world to connect to, using the same tab. - The command history is now more functional, behaving similary to the command history used in the Bash shell and other programs using the same library. The most noticeable feature is that if you start typing something and move to another command, the partially typed command is not lost. - More parts of KildClient appear translated (if there is a translation for that language, naturally). - The substitution of aliases can now be evaluated as a Perl statement (using the s//e construct). See the manual for more details. - KildClient now identifies itself using the Telnet TERMINAL TYPE option. - KildClient now supports the Telnet NAWS option to inform the server of the current window size. - A new menu has been added: Debug Matches in the Preferences menu. When this option is selected, information about matched triggers and alises will be output to stderr. - The enaXXX, disXXX and listXXX functions now support several arguments, for example: $world->distrigger(1, 3). - Bug fixed: when sending something to the server that contains the Telnet IAC character, that character is now correctly escaped. - Bug fixed: timers with names now have this name loaded correctly upon loading a world. Changes in version 1.2.0 ------------------------ - The list of save worlds is now displayed sorted alphabetically. - It is now possible to temporarily disable all trigger (or all macros, or all aliases, or all timers) via the Preferences menu. - The command separator can now be configured instead of having to be %;. (But %; is still the default.) - KildClient now supports MCCP (Mud Client Compression Protocol) version 1 and 2. This protocol, supported by several servers, compresses that sent by the server, thus reducing greatly the bandwidth used. And this happens transparently, so the user doesn't need to do anything. - A new trigger mode: rewriter triggers. Rewriter triggers run before normal triggers and can change the received line, so that further triggers work on the changed line. - Hooks work now more similary to triggers, aliases, etc: for each event, you can connect any number of hooks, and later edit them, disable them, etc. This is mainly for the use of plugins that want to define hooks. There have been some changes in the functions that deal with hooks. Also, a new hook has been added: OnSentCommand, run after each sent command. - When a plugin is unloaded (that is, when the world that loaded it is closed, KildClient will call the plugin's UNLOAD function automatically. - New functions, $world->getname(), $world->getmainfont() and $world->getentryfont() that return the name of the world, the main window font, and the command entry font, respectively. - New functions, getversion() and $world->getpluginversion() to return the version of KildClient or of a given plugin. - A new stardard helper plugin, KCWin, meant to be used in other plugins that require a little window for input and output. - A new standard plugin, notes, to associate notes with a world. - A new standard plugin, easypath, makes using paths easier. - A new plugin allows peer to peer chat with other users or KildClient or of other compatible clients that implement the MudMaster or zChat protocols. - Fixed a bug when it was not possible to connect to the first world tried when the program was started. (It used to pop two World Selector dialogs). - Fixed a bug that caused a crash when the user tried to enable or disable a plugin that was not loaded. Changes in version 1.1.2 ------------------------ - Bug fixed: pressing up arrow to retrieve the last command now correctly retrieves it in all cases. - Bug fixed: the anti-flood mechanism now works correctly even with multiple open worlds. - Bug fixed: some worlds were marked with new text and not be unmarked when focused, this does not happen anymore. - Bug fixed: the Preferences dialog now displays correctly when opened. - Bug fixed: avoided duplicate creation of plugin timers when the plugin is loaded from a script file. - Bug fixed: when the MUD sends lot of text at once, KildClient does not lock until all the text has been received, and does not show it all at once anymore. - Bug fixed: $world->setstatus() now correctly works even if the window does not have the focus when the function is called. - Bug fixed: when deleting a world, all its files are deleted, not only the .wrl file. - Bug fixed: when the last world is disconnected, "Connect to another world is selected" and then "Cancel" is clicked, the program now exits correctly instead of keeping an open window. - The check for trigger (done for each received line) and for aliases (done for each typed command) should be faster now, as some optimizations regarding that have been done. Changes in version 1.1.1 ------------------------ - Some changes regarding plugins: * The format for the plugin file has been slightly changed (there is no need to enclose the file in a block now). Plugins will have to be changed, but this change should be very easy to do. * If the plugin cannot be loaded by some reason (syntax error, it requires a non-existent Perl module, etc), loadplugin() will not consider the plugin as loaded anymore. * Similar to the above, if die() is called in a BEGIN block in the plugin file, the loading of the plugin can be aborted. This can be used to test for some condition and abort the loading if that is not met. * A function has been added, $world->requireplugin, that is similar to loadplugin(), but first checks if the plugin is already loaded. If it is, it returns successfully. If not, it tries loading the plugin (silently). If this succeeds, the function returns successfully, if not, it die()'s. This function is useful in plugins that require other plugins, and is meant to be called in a BEGIN block of a plugin that requires another. - Hyperlinks that appear in the MUD window can now be open in a web browser (or other program), or have they URLs copied, by clicking the right mouse button over them. - The keys for moving between worlds are now Alt+Left or Right arrow, because Ctrl+these arrows is used to move between words in the command entry box. - Corrected bug that caused the About dialog to be displayed only in the first time it was requested. Changes in version 1.1.0 ------------------------ - There is now support for plugins, which are Perl scripts that add new functionality to the client. Plugins can define functions, triggers, timers, macros, aliases, etc. - Triggers, aliases, macros and timers can be given names. These names can be used when enabling, disabling and deleting them. Several triggers (or aliases, macros, timers) can have the same name. In this case, a group is formed, and operations for enabling, disabling and deleting them work on all of them at once. - The World Selector dialog now starts with the last open world selected. - There are menu entries for moving between worlds. The shortcuts Ctrl+Left Arrow and Ctrl+Right Arrow can also be used. - Added the getwindowsize() function to return the size of the window, in characters. - Added the $world->commandecho() function to set or get the value of the command echo option of the world. - Added the $world->sendecho() and $world->sendnoecho() functions that behave just as $world->send(), but which never or always, respectively, echo the sent commands. - Added the Esperanto translation. - Some bugs fixed. Changes in version 1.0.0 ------------------------ - This is the first public release. kildclient-3.0.0/config.sub0000755000175000017500000010563412333512665012557 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-05-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: kildclient-3.0.0/missing0000755000175000017500000001533012302342414012151 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: kildclient-3.0.0/depcomp0000755000175000017500000005601612302342414012135 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: kildclient-3.0.0/COPYING0000644000175000017500000004325411715730227011625 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. kildclient-3.0.0/aclocal.m40000644000175000017500000017713412376345610012441 00000000000000# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 1995-2002 Free Software Foundation, Inc. # Copyright (C) 2001-2003,2004 Red Hat, Inc. # # This file is free software, distributed under the terms of the GNU # General Public License. As a special exception to the GNU General # Public License, this file may be distributed as part of a program # that contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # # Macro to add for using GNU gettext. # Ulrich Drepper , 1995, 1996 # # Modified to never use included libintl. # Owen Taylor , 12/15/1998 # # Major rework to remove unused code # Owen Taylor , 12/11/2002 # # Added better handling of ALL_LINGUAS from GNU gettext version # written by Bruno Haible, Owen Taylor 5/30/3002 # # Modified to require ngettext # Matthias Clasen 08/06/2004 # # We need this here as well, since someone might use autoconf-2.5x # to configure GLib then an older version to configure a package # using AM_GLIB_GNU_GETTEXT AC_PREREQ(2.53) dnl dnl We go to great lengths to make sure that aclocal won't dnl try to pull in the installed version of these macros dnl when running aclocal in the glib directory. dnl m4_copy([AC_DEFUN],[glib_DEFUN]) m4_copy([AC_REQUIRE],[glib_REQUIRE]) dnl dnl At the end, if we're not within glib, we'll define the public dnl definitions in terms of our private definitions. dnl # GLIB_LC_MESSAGES #-------------------- glib_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) # GLIB_PATH_PROG_WITH_TEST #---------------------------- dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], dnl NLS is obligatory [USE_NLS=yes AC_SUBST(USE_NLS) gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, [AC_TRY_LINK([ #include ], [return !ngettext ("","", 1)], gt_cv_func_ngettext_libc=yes, gt_cv_func_ngettext_libc=no) ]) if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, [AC_TRY_LINK([ #include ], [return !dgettext ("","")], gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no) ]) fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CHECK_FUNCS(bind_textdomain_codeset) fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dgettext, gt_cv_func_dgettext_libintl=yes)])]) if test "$gt_cv_func_dgettext_libintl" != "yes" ; then AC_MSG_CHECKING([if -liconv is needed to use gettext]) AC_MSG_RESULT([]) AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dcgettext, [gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv], :,-liconv)], :,-liconv) fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset AC_CHECK_FUNCS(bind_textdomain_codeset) LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then AC_DEFINE(HAVE_GETTEXT,1, [Define if the GNU gettext() function is already present or preinstalled.]) GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" AC_CHECK_FUNCS(dcgettext) MSGFMT_OPTS= AC_MSG_CHECKING([if msgfmt accepts -c]) GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" ], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) AC_SUBST(MSGFMT_OPTS) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share and dnl and CATOBJEXT=.gmo in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac]) LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi ]) if test "$gt_cv_have_gettext" = "yes" ; then AC_DEFINE(ENABLE_NLS, 1, [always defined to indicate that i18n is enabled]) fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is not GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.ac. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLLIBS) AC_SUBST(PO_IN_DATADIR_TRUE) AC_SUBST(PO_IN_DATADIR_FALSE) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) # AM_GLIB_GNU_GETTEXT # ------------------- # Do checks necessary for use of gettext. If a suitable implementation # of gettext is found in either in libintl or in the C library, # it will set INTLLIBS to the libraries needed for use of gettext # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl glib_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])dnl GLIB_LC_MESSAGES GLIB_WITH_NLS if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- # Define VARIABLE to the location where catalog files will # be installed by po/Makefile. glib_DEFUN([GLIB_DEFINE_LOCALEDIR], [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl glib_save_prefix="$prefix" glib_save_exec_prefix="$exec_prefix" glib_save_datarootdir="$datarootdir" test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix=$prefix datarootdir=`eval echo "${datarootdir}"` if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" exec_prefix="$glib_save_exec_prefix" datarootdir="$glib_save_datarootdir" AC_DEFINE_UNQUOTED($1, "$localedir", [Define the location where the catalogs will be installed]) ]) dnl dnl Now the definitions that aclocal will find dnl ifdef(glib_configure_ac,[],[ AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) ])dnl # GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) # # Create a temporary file with TEST-FILE as its contents and pass the # file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with # 0 and perform ACTION-IF-FAIL for any other exit status. AC_DEFUN([GLIB_RUN_PROG], [cat >conftest.foo <<_ACEOF $2 _ACEOF if AC_RUN_LOG([$1 conftest.foo]); then m4_ifval([$3], [$3], [:]) m4_ifvaln([$4], [else $4])dnl echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD fi]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # PKG_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable pkgconfigdir as the location where a module # should install pkg-config .pc files. By default the directory is # $libdir/pkgconfig, but the default can be changed by passing # DIRECTORY. The user can override through the --with-pkgconfigdir # parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_INSTALLDIR # PKG_NOARCH_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable noarch_pkgconfigdir as the location where a # module should install arch-independent pkg-config .pc files. By # default the directory is $datadir/pkgconfig, but the default can be # changed by passing DIRECTORY. The user can override through the # --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_NOARCH_INSTALLDIR # PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # ------------------------------------------- # Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])# PKG_CHECK_VAR # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([acinclude.m4]) kildclient-3.0.0/acinclude.m40000644000175000017500000000132311715730227012752 00000000000000AC_DEFUN([AC_PROG_PERL_MODULES],[dnl ac_perl_modules="$1" # Make sure we have perl if test -z "$PERL"; then AC_CHECK_PROG(PERL,perl,perl) fi if test "x$PERL" != x; then ac_perl_modules_failed=0 for ac_perl_module in $ac_perl_modules; do AC_MSG_CHECKING(for perl module $ac_perl_module) # Would be nice to log result here, but can't rely on autoconf internals $PERL "-M$ac_perl_module" -e exit > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_RESULT(no); ac_perl_modules_failed=1 else AC_MSG_RESULT(ok); fi done # Run optional shell commands if test "$ac_perl_modules_failed" = 0; then : $2 else : $3 fi else AC_MSG_WARN(could not find perl) fi])dnl kildclient-3.0.0/kildclient.spec0000644000175000017500000002130112367156733013565 00000000000000Name: kildclient Version: 3.0.0 Release: 1%{dist} Summary: A powerful MUD client with a built-in Perl interpreter Summary(pt_BR): Um poderoso cliente de MUD com um interpretador Perl embutido License: GPLv2+ Group: Amusements/Games Icon: kildclient.xpm URL: http://www.kildclient.org Source: http://download.sourceforge.net/%{name}/%{name}-%{version}.tar.gz BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildRequires: glib2-devel >= 2.32.0 BuildRequires: gtk3-devel >= 3.10.0 BuildRequires: gtkspell3-devel BuildRequires: gnutls-devel >= 2.10.0 BuildRequires: perl-devel >= 5.8.3 BuildRequires: perl-ExtUtils-Embed BuildRequires: zlib-devel BuildRequires: gettext >= 0.14.5 BuildRequires: desktop-file-utils Requires: perl-gettext Requires: perl-JSON %description KildClient is a MUD Client written with the GTK+ windowing toolkit. It supports many common features of other clients, such as triggers, gags, aliases, macros, timers, and much more. But its main feature is the built-in Perl interpreter. You can at any moment execute Perl statements and functions to do things much more powerful than simply sending text the mud. Perl statements can also be run, for example, as the action of a trigger, allowing you to do complex things. Some built-in functions of KildClient allow interaction with the world, such as sending commands to it. KildClient's ANSI support is extensive: it supports not only the common 16 colors, but also support underlined text (singly and doubly), text in italics, text striked through, reverse video and "hidden" text. It also supports vt100's line-drawing characters, and xterm's escape sequences for a 256-color mode. All these features make KildClient one of the clients with the most features for displaying the mud output. KildClient supports the MCCP (Mud Client Compression Protocol) protocol, versions 1 and 2, to reduce the necessary bandwidth. KildClient allows connection through SOCKS4/5 and HTTP proxy servers. KildClient supports the GMCP (also called ATCP2) and MSDP protocols for out-of-band communications between server and client. %description -l pt_BR KildClient é um cliente de MUD escrito com a biblioteca gráfica GTK. Ele suporta muitos recursos comuns aos outros clientes, como triggers, gags, aliases, macros, temporizadores e muito mais. Mas seu principal recurso é um interpretador Perl embutido. A qualquer momento, você pode executar declarações Perl e funções para fazer coisas muito mais poderosas que simplesmente enviar texto para o MUD. Declarações Perl podem também ser executadas, por exemplo, como ação de um trigger, lhe permitindo fazer coisas mais complexas. Algumas funções nativas do KildClient permitem interação com o mundo, como enviar comandos para ele. O suporte ANSI do KildClient é extenso: ele suporta não apenas as 16 cores comuns, mas também suporta texto sublinhado (simples e duplo), texto em itálico, texto tachado, texto em vídeo reverso e texto "escondido". Ele suporta os caracteres para desenho de linhas do vt100, e as seqüências do xterm para um mode com 256 cores. Todos esses recursos fazem o KildClient um dos cliente com mais recursos para mostrar o texto do mud. O KildClient suporta o protocolo MCCP (Mud Client Compression Protocol, Protocolo de Compressão para Clientes de MUD), versões 1 e 2, para reduzir a banda necessária. O KildClient suporta conexão através de servidores proxy SOCKS4/5 e HTTP. O KildClient suporta os protocols GMCP (também chamado ATCP2) e MSDP para comunicação fora de banda entre cliente e servidor. %prep %setup -q %build %configure make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install %find_lang %{name} desktop-file-install --vendor "fedora" --delete-original \ --dir $RPM_BUILD_ROOT%{_datadir}/applications \ $RPM_BUILD_ROOT%{_datadir}/applications/kildclient.desktop %clean rm -rf $RPM_BUILD_ROOT %files -f %{name}.lang %defattr(-, root, root, -) %{_bindir}/kildclient %doc %{_datadir}/doc/%{name} %{_mandir}/man6/kildclient.* %{_datadir}/%{name} %{_datadir}/pixmaps/kildclient.png %{_datadir}/pixmaps/kildclient.xpm %{_datadir}/applications/fedora-kildclient.desktop %changelog * Tue Jul 8 2014 Eduardo M Kalinowski - 3.0.0-1 - New version: 3.0.0. - Updated homepage to the new URL. - Added required Perl modules. - glib >= 2.32.0 is now required. - gtk+3 >= 3.10.0 is now required. - gtkspell 3 is now required - gnutls-devel >= 2.10.0 is now required. * Sat May 28 2011 Eduardo M Kalinowski - 2.11.1-1 - New version: 2.11.1. - Fixed minimum required version of gnutls. * Sun Feb 13 2011 Eduardo M Kalinowski - 2.11.0-1 - New version: 2.11.0. * Sun Jun 13 2010 Eduardo M Kalinowski - 2.10.0-1 - Require glib >= 2.14.0, gtk >= 2.18.0, but does not require libglade anymore. - Added zlib-devel as build requirement. -lz is also specified when linking. * Sat May 23 2009 Eduardo M Kalinowski - 2.9.0-1 - New version: 2.9.0. * Tue Jan 27 2009 Eduardo M Kalinowski - 2.8.1-1 - New version: 2.8.1. * Sat Jan 03 2009 Eduardo M Kalinowski - 2.8.0-1 - New version: 2.8.0. - Small changes in description to remove an occurrence of 'the the' and advertise proxy support. * Tue May 13 2008 Eduardo M Kalinowski - 2.7.0-1 - New version: 2.7.0. * Tue Jan 8 2008 Eduardo M Kalinowski - 2.6.0-5 - Removed manual Requires. - Removed unnecessary %%doc of manpage in %%files. - Fixed %%files so that %%{_datadir}/%%{name} is owned by the package. - Corrected call to desktop-file-install. * Fri Dec 28 2007 Eduardo M Kalinowski - 2.6.0-4 - Removed Vendor & Packager. - Added dist tag. - Added full URL in Source. - Changed the BuildRoot to use mktemp. - Support for SMP build flags. - Removed the use of %%makeinstall; standard make is called. - %%find_lang is now used. - Added call to desktop-file-install. * Thu Dec 20 2007 Eduardo M Kalinowski - 2.6.0-3aei - Included an icon. - Changed group to Amusements/Games. - Removed cleaning in the prep stage, and added cleaning in the install stage. - Specified the language for the .mo files. - Minor tweaks in descriptive fields. * Wed Dec 12 2007 Eduardo M Kalinowski - 2.6.0-2aei - Changed gtk+2-devel to gtk2-devel and gtk+2 to gtk2. - Added some files that were missing. * Wed Nov 28 2007 Eduardo M Kalinowski - New version: 2.6.0. * Mon May 21 2007 Eduardo M Kalinowski - New version: 2.5.1. * Sat Aug 12 2006 Eduardo M Kalinowski - New version: 2.5.0. - Requiring GTK+ version 2.8.X now. * Sun Mar 26 2006 Eduardo M Kalinowski - New version: 2.4.1. * Fri Feb 17 2006 Eduardo M Kalinowski - New version: 2.4.0. - Added gtkspell requirement. * Wed Dec 21 2005 Eduardo M Kalinowski - New version: 2.3.0. - Added Requires and BuildRequires for libgnutls. - Updated required version of gtk+ and libglade. * Sat Oct 01 2005 Eduardo M Kalinowski - Updated version to 2.2.2. - Removed intltool dependency. * Tue Sep 20 2005 Eduardo M Kalinowski - Updated version to 2.2.1. * Mon Sep 19 2005 Eduardo M Kalinowski - Updated version to 2.2.0. - Changed the description to describe some new features. * Thu Aug 25 2005 Eduardo M Kalinowski - Updated version to 2.1.0. * Wed Jul 27 2005 Eduardo M Kalinowski - Updated version to 2.0.0. - Removed dependency of libvte, which is not used anymore. * Sun Jul 03 2005 Eduardo M Kalinowski - Updated version to 1.3.2. * Tue May 31 2005 Eduardo M Kalinowski - Updated version to 1.3.1. - Added a requirement for glib >= 2.6.0. * Fri May 27 2005 Eduardo M Kalinowski - Updated for version 1.3.0 of the program. - Added perl-gettext as a requirement. * Wed Apr 20 2005 Eduardo M Kalinowski - Updated for version 1.2.0 of the program. - Mentioned MCCP in the description. - Added intltool to BuildRequires * Fri Mar 25 2005 Eduardo M Kalinowski - Updated for version 1.1.2 of the program. * Fri Mar 11 2005 Eduardo M Kalinowski - Updated for version 1.1.1 of the program. * Mon Feb 28 2005 Eduardo M Kalinowski - Included man file in package * Sun Feb 20 2005 Alexandre Erwin Ittner - New version: 1.1.0 * Thu Jan 13 2005 Alexandre Erwin Ittner - RPM for Conectiva 10 (but should work on any distro)