changeset 90381:65ca8fb66a0d

Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-54 Merge from emacs--devo--0 Patches applied: * emacs--devo--0 (patch 190-203) - Update from CVS - Undo incorrect merge of etc/images/README from Gnus 5.10 - Merge from gnus--rel--5.10 * gnus--rel--5.10 (patch 74-80) - Update from CVS - Update from CVS: README: Addition from 5.10.6 tar ball.
author Miles Bader <miles@gnu.org>
date Sun, 09 Apr 2006 00:38:22 +0000
parents 4bf7966e0788 (current diff) 20130dbb0f1e (diff)
children 1ff941930e18
files etc/ChangeLog etc/NEWS etc/TODO lib-src/ChangeLog lib-src/b2m.c lib-src/fakemail.c lisp/ChangeLog lisp/abbrev.el lisp/add-log.el lisp/dired.el lisp/emacs-lisp/bytecomp.el lisp/emacs-lisp/lisp-mode.el lisp/files.el lisp/gnus/ChangeLog lisp/gnus/nnweb.el lisp/ibuf-macs.el lisp/ibuffer.el lisp/ido.el lisp/info.el lisp/international/characters.el lisp/international/mule-cmds.el lisp/man.el lisp/mh-e/ChangeLog lisp/mh-e/mh-e.el lisp/net/rcirc.el lisp/progmodes/compile.el lisp/progmodes/gdb-ui.el lisp/progmodes/idlw-rinfo.el lisp/progmodes/idlw-shell.el lisp/progmodes/idlw-toolbar.el lisp/progmodes/idlwave.el lisp/recentf.el lisp/rect.el lisp/simple.el lisp/sort.el lisp/startup.el lisp/subr.el lisp/textmodes/fill.el lisp/textmodes/ispell.el lisp/textmodes/paragraphs.el lisp/textmodes/reftex-vars.el lisp/woman.el lispref/ChangeLog lispref/display.texi lispref/strings.texi man/ChangeLog man/emacs.texi man/gnus.texi man/idlwave.texi man/killing.texi man/mh-e.texi man/misc.texi man/programs.texi man/sending.texi man/texinfo.tex man/text.texi man/trouble.texi src/ChangeLog src/alloc.c src/editfns.c src/image.c src/keymap.c src/lisp.h src/macterm.c src/process.c src/process.h src/w32fns.c
diffstat 73 files changed, 8093 insertions(+), 7512 deletions(-) [+]
line wrap: on
line diff
--- a/etc/ChangeLog	Fri Apr 07 12:02:40 2006 +0000
+++ b/etc/ChangeLog	Sun Apr 09 00:38:22 2006 +0000
@@ -1,3 +1,7 @@
+2006-04-07  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* NEWS: Add string-or-null-p.
+
 2006-03-28  Bill Wohler  <wohler@newt.com>
 
 	* images/README: Update with following information.
--- a/etc/NEWS	Fri Apr 07 12:02:40 2006 +0000
+++ b/etc/NEWS	Sun Apr 09 00:38:22 2006 +0000
@@ -3699,6 +3699,11 @@
 
 If it is non-nil, the function lists only faces matching this regexp.
 
++++
+*** New function `string-or-null-p'.
+
+Return t if OBJECT is a string or nil.  Otherwise, return nil.
+
 ** Lisp code indentation features:
 
 +++
--- a/etc/TODO	Fri Apr 07 12:02:40 2006 +0000
+++ b/etc/TODO	Sun Apr 09 00:38:22 2006 +0000
@@ -9,6 +9,12 @@
 
 * Small but important fixes needed in existing features:
 
+** Make vc-checkin avoid reverting the buffer if has not changed after
+   the checkin. Comparing (md5 BUFFER) to (md5 FILE) should be enough.
+
+** Make vc-annotate show place the cursor in the annotate buffer at the 
+   same line as the current buffer.
+
 ** buffer-offer-save should be a permanent local.
 
 ** revert-buffer should eliminate overlays and the mark.
--- a/etc/images/README	Fri Apr 07 12:02:40 2006 +0000
+++ b/etc/images/README	Sun Apr 09 00:38:22 2006 +0000
@@ -1,71 +1,43 @@
-The following icons are from GNOME 2.6:
+All of the following icons are not part of Emacs, but distributed and
+used by Emacs.
+
+* The following icons are from GTK+ 2.x:
 
-    attach.xpm (stock_attach)
-    connect.xpm (stock_connect)
-    contact.xpm (stock_contact)
-    delete.xpm (stock_delete)
-    describe.xpm (stock_properties)
-    disconnect.xpm (stock_disconnect)
-    exit.xpm (stock_exit)
-    lock-broken.xpm (stock_lock_broken)
-    lock-ok.xpm (stock_lock_ok)
-    lock.xpm (stock_lock)
-    next-page.xpm (stock_next-page)
-    refresh.xpm (stock_refresh)
-    sort-ascending.xpm (stock_sort-ascending)
-    sort-column-ascending.xpm (stock_sort-column-ascending)
-    sort-criteria.xpm (stock_sort-criteria)
-    sort-descending.xpm (stock_sort-descending)
-    sort-row-ascending.xpm (stock_sort-row-ascending)
+    close.xpm copy.xpm cut.xpm find-replace.xpm help.xpm home.xpm
+    index.xpm jump-to.xpm left-arrow.xpm new.xpm open.xpm paste.xpm
+    preferences.xpm print.xpm refresh.xpm right-arrow.xpm save.xpm
+    saveas.xpm search.xpm sort-ascending.xpm sort-descending.xpm
+    spell.xpm undo.xpm up-arrow.xpm
 
-    gnus/toggle-subscription.xpm (stock_task-recurring)
+    back-arrow.xpm and fwd-arrow.xpm are slightly modified undo and redo.
 
-    mail/compose.xpm (stock_mail-compose)
-    mail/copy.xpm (stock_mail-copy)
-    mail/forward.xpm (stock_mail-forward)
-    mail/inbox.xpm (stock_inbox)
-    mail/move.xpm (stock_mail-move)
-    mail/not-spam.xpm (stock_not-spam)
-    mail/outbox.xpm (stock_outbox)
-    mail/reply-all.xpm (stock_mail-reply-to-all)
-    mail/reply.xpm (stock_mail-reply)
-    mail/save-draft.xpm (stock_mail-handling)
-    mail/send.xpm (stock_mail-send)
-    mail/spam.xpm (stock_spam)
+    diropen.xpm is file-manager.png from Gnome hicolor theme.
 
+* The following icons are from GNOME 2.x:
 
-The following icons were contributed by Adam Sjøgren <asjo@koldfront.dk>:
-
-    mail/preview.xpm (combining stock_mail and stock_zoom)
-    mail/save.xpm    (combining stock_mail, stock_save and stock_convert) 
-
-
-The folling icon are duplicated from Emacs 22.  They are either not present in
-Emacs 21 or look different there.
+    attach.xpm connect.xpm contact.xpm data-save.xpm delete.xpm
+    describe.xpm disconnect.xpm exit.xpm gnus/toggle-subscription.xpm
+    lock-broken.xpm lock-ok.xpm lock.xpm mail/compose.xpm
+    mail/copy.xpm mail/flag-for-followup.xpm mail/forward.xpm
+    mail/inbox.xpm mail/move.xpm mail/not-spam.xpm mail/outbox.xpm
+    mail/preview.xpm mail/reply-all.xpm mail/reply.xpm
+    mail/save-draft.xpm mail/save.xpm mail/send.xpm mail/spam.xpm
+    next-page.xpm refresh.xpm separator.xpm sort-ascending.xpm
+    sort-column-ascending.xpm sort-criteria.xpm sort-descending.xpm
+    sort-row-ascending.xpm zoom-in.xpm zoom-out.xpm 
 
-    cancel.xpm
-    copy.xpm
-    diropen.xpm
-    help.xpm
-    left-arrow.xpm
-    paste.xpm
-    print.xpm
-    redo.xpm
-    right-arrow.xpm
-    save.xpm
-    search.xpm
-    separator.xpm
+* Note that the default GTK icons were not overridden by the GNOME theme
+due to a bug which was fixed in GNOME 2.15.  Once GNOME 2.16 is in wide
+circulation, then the GTK icons should be replaced with the equivalent
+GNOME icons.
+
+* Recipe for Creating PBM Versions
 
-The GNOME's stock_*.png files were converted to XPM using the following GIMP
-script:
+1. Edit .xpm image in GIMP.
+2. Image > Mode > Indexed. Check Use Black/White Palette and No
+   Color Dithering.
+3. File > Save As file.xbm.
+4. Run xbmtopbm < file.xbm > file.pbm.
 
-;; -*- scheme -*-
-;; Put this file in ~/.gimp-*/scripts/
-;; gimp -i -b '(rs-save-as-xpm "foo.png" "foo.xpm" 127)'  '(gimp-quit 0)'
-(define (rs-save-as-xpm filename filename2 threshold)
-  (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
-	 (drawable (car (gimp-image-get-active-layer image))))
-    (file-xpm-save RUN-NONINTERACTIVE image drawable
-		   filename2 filename2 threshold)
-    (gimp-image-delete image)))
-;; end
+Thanks to jan.h.d@swipnet.se for the help.
+
--- a/lib-src/ChangeLog	Fri Apr 07 12:02:40 2006 +0000
+++ b/lib-src/ChangeLog	Sun Apr 09 00:38:22 2006 +0000
@@ -1,3 +1,13 @@
+2006-04-02  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* b2m.c (main): Don't include <limits.h>.
+	(TM_YEAR_BASE): New macro.
+	(TM_YEAR_IN_ASCTIME_RANGE): Don't define if already defined, so
+	that s/ files can override this.  Use the more-conservative range
+	1000-9999.
+	(main): Check for asctime returning NULL.
+	* fakemail.c: Likewise.
+
 2006-03-27  Paul Eggert  <eggert@cs.ucla.edu>
 
 	* b2m.c: Include <limits.h>.
--- a/lib-src/b2m.c	Fri Apr 07 12:02:40 2006 +0000
+++ b/lib-src/b2m.c	Sun Apr 09 00:38:22 2006 +0000
@@ -26,7 +26,6 @@
 #undef static
 #endif
 
-#include <limits.h>
 #include <stdio.h>
 #include <time.h>
 #include <sys/types.h>
@@ -45,15 +44,13 @@
 
 typedef int logical;
 
-/* True if TM_YEAR is a struct tm's tm_year value that is acceptable
-   to asctime.  Glibc asctime returns a useful string unless TM_YEAR
-   is nearly INT_MAX, but the C Standard lets C libraries overrun a
-   buffer if TM_YEAR needs more than 4 bytes.  */
-#ifdef __GLIBC__
-# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) ((tm_year) <= INT_MAX - 1900)
-#else
+#define TM_YEAR_BASE 1900
+
+/* Nonzero if TM_YEAR is a struct tm's tm_year value that causes
+   asctime to have well-defined behavior.  */
+#ifndef TM_YEAR_IN_ASCTIME_RANGE
 # define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \
-    (-999 - 1900 <= (tm_year) && (tm_year) <= 9999 - 1900)
+    (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE)
 #endif
 
 /*
@@ -148,9 +145,9 @@
      Don't use 'ctime', as that might dump core if the hardware clock
      is set to a bizarre value.  */
   tm = localtime (&ltoday);
-  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)))
+  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)
+	 && (today = asctime (tm))))
     fatal ("current time is out of range");
-  today = asctime (tm);
   data.size = 200;
   data.buffer = xnew (200, char);
 
--- a/lib-src/fakemail.c	Fri Apr 07 12:02:40 2006 +0000
+++ b/lib-src/fakemail.c	Sun Apr 09 00:38:22 2006 +0000
@@ -53,7 +53,6 @@
 #include "ntlib.h"
 #endif
 
-#include <limits.h>
 #include <stdio.h>
 #include <string.h>
 #include <ctype.h>
@@ -71,15 +70,13 @@
 #define true 1
 #define false 0
 
-/* True if TM_YEAR is a struct tm's tm_year value that is acceptable
-   to asctime.  Glibc asctime returns a useful string unless TM_YEAR
-   is nearly INT_MAX, but the C Standard lets C libraries overrun a
-   buffer if TM_YEAR needs more than 4 bytes.  */
-#ifdef __GLIBC__
-# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) ((tm_year) <= INT_MAX - 1900)
-#else
+#define TM_YEAR_BASE 1900
+
+/* Nonzero if TM_YEAR is a struct tm's tm_year value that causes
+   asctime to have well-defined behavior.  */
+#ifndef TM_YEAR_IN_ASCTIME_RANGE
 # define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \
-    (-999 - 1900 <= (tm_year) && (tm_year) <= 9999 - 1900)
+    (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE)
 #endif
 
 /* Various lists */
@@ -378,9 +375,9 @@
      Don't use 'ctime', as that might dump core if the hardware clock
      is set to a bizarre value.  */
   tm = localtime (&idiotic_interface);
-  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)))
+  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)
+	 && (the_date = asctime (tm))))
     fatal ("current time is out of range", 0);
-  the_date = asctime (tm);
   /* the_date has an unwanted newline at the end */
   date_length = strlen (the_date) - 1;
   the_date[date_length] = '\0';
--- a/lisp/ChangeLog	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/ChangeLog	Sun Apr 09 00:38:22 2006 +0000
@@ -1,3 +1,300 @@
+2006-04-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* emacs-lisp/bytecomp.el (byte-compile-form): Don't call
+	cl-byte-compile-compiler-macro unless it exists.
+
+2006-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* files.el (hack-local-variables-confirm) <offer-save>:
+	Clarify message text.  Suggested by Ralf Angeli.
+
+2006-04-08  Michael Cadilhac  <michael.cadilhac@lrde.org>  (tiny change)
+
+	* rect.el (kill-rectangle): Don't barf if `kill-read-only-ok' is set.
+	(delete-extract-rectangle-line): Use `filter-buffer-substring'
+	instead of `buffer-substring' and `delete-region'.  (Most of the
+	code actually copied from `kill-region'.)
+
+2006-04-08  Ryan Yeske  <rcyeske@gmail.com>
+
+	* rcirc.el (rcirc-default-server): Rename from rcirc-server.
+	(rcirc-default-port): Rename from rcirc-port.
+	(rcirc-default-nick): Rename from rcirc-nick.
+	(rcirc-default-user-name): Rename from rcirc-user-name.
+	(rcirc-default-user-full-name): Rename from rcirc-user-full-name.
+	(rcirc-low-priority-flag): New variable.
+	(rcirc-decode-coding-system): New defcustom.
+	(rcirc-encode-coding-system): New defcustom.
+	(rcirc-coding-system-alist): New defcustom.
+	(rcirc-multiline-major-mode): New defcustom.
+	(rcirc-nick): New internal variable.
+	(rcirc-process): Remove variable.
+	(rcirc-server-buffer): New variable.
+	(rcirc): Update to use rcirc-default-* variables above.
+	(rcirc-connect): Do not add window-configuration-hook-here.
+	(rcirc-server): New internal variable.
+	(rcirc-connect): Do not send keepalive pings if
+	rcirc-keepalive-seconds is nil.
+	(with-rcirc-server-buffer): New macro.
+	(rcirc-send-string): Encode with rcirc-encode-coding-system.
+	(rcirc-server-name): Rename from rcirc-server.
+	(rcirc-buffer-process): New function.
+	(rcirc-buffer-nick): New function.
+	(rcirc-buffer-target): Remove function.
+	(set-rcirc-decode-coding-system, set-rcirc-encode-coding-system):
+	New commands.
+	(rcirc-mode-map): Change binding of C-c C-l to
+	rcirc-toggle-low-priority.
+	(rcirc-mode): Initialize coding system based on
+	rcirc-coding-system-alist.  New change-major-mode-hook to part the
+	channel on a mode change.  Make kill-buffer-hook buffer-local.
+	(rcirc-change-major-mode-hook): New function.
+	(rcirc-clean-up-buffer): Rename from rcirc-kill-buffer-hook-1.
+	(rcirc-last-post-time): New variable.
+	(rcirc-process-message): Store the last time user posted a message
+	to this target.
+	(rcirc-multiline-minor-mode): New mode.
+	(rcirc-multiline-minor-mode-map): New mode map.
+	(rcirc-edit-multiline): Put multiline-edit buffer in
+	rcirc-multiline-major-mode along with rcirc-multiline-minor-mode.
+	(rcirc-print): Any line starting with an ignored nick will be
+	ignored.
+	(rcirc-print): Decode using rcirc-decode-coding-system.
+	(rcirc-track-minor-mode): Update global-mode-string when disabling
+	this mode.
+	(minor-mode-alist): add LowPri indicator.
+	(rcirc-toggle-low-priority): New function.
+	(rcirc-last-non-irc-buffer): Prefix arg now no means switch to
+	next lowpriority buffer with activity.
+	(rcirc-record-activity): Sort buffers in rcirc-activity by the
+	last time the user posted a message in to the target.
+	(rcirc-update-activity-string): New formatting for low priority
+	buffers.
+	(rcirc-split-activity): New function.
+	(rcirc-handler-PART, rcirc-handler-KICK)
+	(rcirc-handler-PART-or-KICK): Kick responses are printed properly.
+	(rcirc-nick-away-alist): New variable.
+	(rcirc-handler-301): New handler.  Away messages are printed once
+	per change.
+
+2006-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* info.el (Info-follow-nearest-node): Doc fix.
+
+	* international/mule-cmds.el (set-locale-environment): Make sure
+	the coding-system preferred by the locale's language has the same
+	EOL conversion type as the original buffer-file-coding-system.
+	(locale-language-names): Add a few MS Windows language codes.
+
+2006-04-07  Richard Stallman  <rms@gnu.org>
+
+	* simple.el (eval-expression): Doc fix.
+
+	* emacs-lisp/lisp-mode.el (eval-print-last-sexp, eval-last-sexp)
+	(eval-defun): Doc fixes.
+
+2006-04-07  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* pgg-gpg.el: Revert to revision 1.8 to allow the use of
+	gpg-agent.
+
+2006-04-07  Nick Roberts  <nickrob@snap.net.nz>
+
+	* progmodes/gdb-ui.el (gdb-init-2): Set current filename using
+	GDB list command without argument for greater generality.
+
+2006-04-06  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* subr.el (string-or-null-p): New function.
+
+	* textmodes/paragraphs.el (sentence-end): Use string-or-null-p.
+
+	* textmodes/ispell.el (ispell-local-dictionary): Use
+	string-or-null-p.
+
+	* files.el: Update comment about safe-local-variable declarations.
+
+2006-04-06  J.D. Smith  <jdsmith@as.arizona.edu>
+
+	* progmodes/idlwave.el: Updated to IDLWAVE version 6.0.  See
+	idlwave.org.
+
+	* progmodes/idlw-shell.el: Updated to IDLWAVE version 6.0.  See
+	idlwave.org.  Includes code to obsolete idlw-rinfo.el.
+
+	* progmodes/idlw-help.el: Updated to IDLWAVE version 6.0.  See
+	idlwave.org.
+
+	* progmodes/idlw-complete-structtag.el: Updated to IDLWAVE
+	version 6.0 (minimal changes).  See idlwave.org.
+
+	* progmodes/idlw-toolbar.el: Updated to IDLWAVE version
+	6.0 (minimal changes).  See idlwave.org.
+
+	* progmodes/idlw-rinfo.el: File obsoleted and removed.
+
+2006-04-06  Romain Francoise  <romain@orebokech.com>
+
+	* pgg-gpg.el: Sync back with Gnus 5.10, reverting changes that add
+	symmetric encryption features and a new asynchronous interface to
+	GnuPG.  This new version is version 1.4, plus whitespace changes.
+
+2006-04-06  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* files.el: Move some `safe-local-variable' declarations to the
+	respective files.
+
+	* textmodes/ispell.el (ispell-check-comments)
+	(ispell-local-dictionary): Mark as safe.
+
+	* abbrev.el (abbrev-mode): Mark as safe.
+
+	* add-log.el (change-log-default-name): Mark as safe.
+
+	* textmodes/reftex-vars.el (reftex-vref-is-default)
+	(reftex-fref-is-default, reftex-level-indent)
+	(reftex-guess-label-type): Mark as safe.
+
+	* textmodes/fill.el (colon-double-space): Mark as safe.
+
+	* textmodes/paragraphs.el (paragraph-start, paragraph-separate)
+	(sentence-end-double-space, sentence-end-without-period)
+	(sentence-end-without-space, sentence-end, sentence-end-base)
+	(page-delimiter, paragraph-ignore-fill-prefix): Mark as safe.
+
+2006-04-06  Kim F. Storm  <storm@cua.dk>
+
+	* ido.el (ido-mode): Remove ido-ignore-unc-host-regexps from
+	the :set-after list.
+	(ido-downcase-unc-hosts): New user option.  Default on.
+	(ido-ignore-unc-host-regexps): Don't reset ido-unc-hosts-cache
+	when it is set, as regexps are now applied on the fly.
+	(ido-unc-hosts): Keep all known hosts in ido-unc-hosts-cache.
+	Make C-a DTRT--filter hosts through ido-ignore-unc-host-regexps
+	on the fly, but only when ido-process-ignore-lists is set.
+	Do case insensitive filtering if ido-downcase-unc-hosts is set.
+	Only downcase names if ido-downcase-unc-hosts is set.
+
+2006-04-06  Juanma Barranquero  <lekktu@gmail.com>
+
+	* ido.el (ido-unc-hosts-cache): Fix typo in docstring.
+
+	* woman.el (WoMan-xref-man-page): Fix call to `substring'.
+
+2006-04-05  Kim F. Storm  <storm@cua.dk>
+
+	* ido.el (ido-mode): Set after ido-unc-hosts and
+	ido-ignore-unc-host-regexps.
+	(ido-save-history): Save ido-unc-hosts-cache.
+	(ido-load-history): Load ido-unc-hosts-cache.
+	(ido-reread-directory): Refresh unc hosts cache in // dir.
+
+	* startup.el (fancy-splash-screens): Set emulation-mode-map-alists
+	to nil while displaying slash screen.
+
+2006-04-05  Daiki Ueno  <ueno@unixuser.org>
+
+	* pgg-gpg.el (pgg-gpg-encrypt-region, pgg-gpg-sign-region): Wait
+	for BEGIN_SIGNING too, new in GnuPG 1.4.3.
+
+2006-04-05  Kenichi Handa  <handa@m17n.org>
+
+	* international/characters.el: Setup cases of Latin, Greek, and
+	Cyrillic characters in CJK charsets.
+
+2006-03-29  Daiki Ueno  <ueno@unixuser.org>
+
+	* pgg-gpg.el (pgg-gpg-start-process): Don't bind
+	default-enable-multibyte-characters.  This reverts the change from
+	revision 6.17 which is no longer necessary because the passphrase
+	is sent separately now.  GnuPG messages are unreadable under
+	multibyte locales with default-enable-multibyte-characters set to
+	nil.
+
+2006-04-04  Andreas Schwab  <schwab@suse.de>
+
+	* files.el: Mark `left-margin', `byte-compile-dynamic-docstrings'
+	and `byte-compile-warnings' as `safe-local-variable'.
+
+2006-04-04  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	* man.el (Man-mode-map): Restore the \r binding.
+	(Man-abstract-xref-man-page): If Man-target-string is a function,
+	call it.
+	(Man-highlight-references): Use Man-default-man-entry to get the
+	target. Deal with xrefs too.
+	(Man-highlight-references0): Don't call the target function.
+
+	* woman.el (WoMan-xref-man-page): Strip the section number, woman
+	cannot deal with it.
+
+2006-04-04  Daiki Ueno  <ueno@unixuser.org>
+
+	* pgg-gpg.el: Clean up process buffers every time gpg processes
+	complete.
+
+2006-04-04  Kenichi Handa  <handa@m17n.org>
+
+	* sort.el (sort-build-lists): Don't bind inhibit-field-text-motion
+	here.
+	(sort-lines, sort-numeric-fields, sort-fields, sort-columns):
+	Temporarily bind inhibit-field-text-motion to t.
+
+2006-04-03  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* startup.el (normal-splash-screen): Only set mode-line-format in the
+	splash buffer, so as not to interfere when debugging the code.
+	Ignore errors when switching buffer.
+
+2006-04-03  Romain Francoise  <romain@orebokech.com>
+
+	* dired.el (dired-dnd-protocol-alist): Fix typo.
+
+2006-04-03  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* savehist.el (savehist): Add :version.
+	(savehist-ignored-variables): New variable.
+	(savehist-minibuffer-hook): Don't save variables listed in
+	`savehist-ignored-variables'.
+
+	* dired.el (dired-dnd-protocol-alist): Mention that change does
+	only apply to new buffers in doc string.
+
+2006-04-03  Lennart Borgman  <lennart.borgman.073@student.lu.se>  (tiny change)
+
+	* recentf.el (recentf-open-files-item): Include newline in button
+	field, so opening a file will work, when the point is at the end
+	of the file name.  Allow, for example, to [i]search a file by
+	extension and just push RET to open it.
+
+2006-04-03  Daiki Ueno  <ueno@unixuser.org>
+
+	* pgg-gpg.el (pgg-gpg-process-filter)
+	(pgg-gpg-wait-for-completion): Check if buffer is alive.
+
+	* pgg-gpg.el (pgg-gpg-process-sentinel): Don't remove GNUPG:
+	lines, temporary fix.
+
+2006-04-02  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	* ibuf-macs.el (define-ibuffer-column): Document the new parameter.
+
+2006-04-02  Richard Stallman  <rms@gnu.org>
+
+	* progmodes/compile.el (compilation-message-face): Make it defcustom.
+
+2006-04-02  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	* ibuf-macs.el (define-ibuffer-column): Add a new key:
+	header-mouse-map.
+
+	* ibuffer.el (ibuffer-name-header-map, ibuffer-size-header-map)
+	(ibuffer-mode-header-map): New keymaps.
+	(ibuffer-update-title-and-summary): Enable mouse face highlighting
+	and keybindings for column headers.
+	(name,size,mode) <define-ibuffer-column>: Add a header-mouse-map
+	property.
+
 2006-04-02  Drew Adams  <drew.adams@oracle.com>  (tiny change)
 
 	* speedbar.el (speedbar-after-create-hook): Doc fix.
@@ -61,8 +358,7 @@
 
 2006-03-27  Carsten Dominik  <dominik@science.uva.nl>
 
-	* textmodes/org.el (org-get-level-face): Fix bug with level
-	counting.
+	* textmodes/org.el (org-get-level-face): Fix bug with level counting.
 
 2006-03-26  Andreas Schwab  <schwab@suse.de>
 
@@ -97,8 +393,8 @@
 	(cua--init-keymaps): Use it instead of fixed C-return.
 	(cua-mode): Set after it.
 
-	* emulation/cua-rect.el (cua--init-rectangles): Use
-	cua-rectangle-mark-key instead of fixed C-return.
+	* emulation/cua-rect.el (cua--init-rectangles):
+	Use cua-rectangle-mark-key instead of fixed C-return.
 
 2006-03-25  Nick Roberts  <nickrob@snap.net.nz>
 
@@ -134,8 +430,7 @@
 	* progmodes/gdb-ui.el (gdb-continuation): Declare earlier to
 	prevent compiler warnings.
 	(gdb-stopped): Check for gud-last-last-frame (case: signal).
-	(breakpoint-disabled): Make lighter for contrast with overlay
-	arrow.
+	(breakpoint-disabled): Make lighter for contrast with overlay arrow.
 	(gdb-assembler-custom): Use hollow-right-triangle for assembler
 	buffer too.
 
@@ -1060,7 +1355,7 @@
 	(org-format-org-table-html, org-format-table-table-html):
 	Fix typos in docstrings.
 
-12006-02-23  Carsten Dominik  <dominik@science.uva.nl>
+2006-02-23  Carsten Dominik  <dominik@science.uva.nl>
 
 	* textmodes/org.el (org-cleaned-string-for-export)
 	(org-solidify-link-text): New function.
@@ -6372,7 +6667,7 @@
 
 2005-11-24  Carsten Dominik  <dominik@science.uva.nl>
 
-	* textmodes/org.el (org-export-plain-list-max-depth): Renamed from
+	* textmodes/org.el (org-export-plain-list-max-depth): Rename from
 	`org-export-local-list-max-depth'.  Change default value to 3.
 	(org-auto-renumber-ordered-lists)
 	(org-plain-list-ordered-item-terminator): New options.
--- a/lisp/abbrev.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/abbrev.el	Sun Apr 09 00:38:22 2006 +0000
@@ -58,6 +58,7 @@
 to enable or disable Abbrev mode in the current buffer."
   :type 'boolean
   :group 'abbrev-mode)
+;;;###autoload(put 'abbrev-mode 'safe-local-variable t)
 
 
 (defvar edit-abbrevs-map
--- a/lisp/add-log.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/add-log.el	Sun Apr 09 00:38:22 2006 +0000
@@ -45,6 +45,8 @@
   :type '(choice (const :tag "default" nil)
 		 string)
   :group 'change-log)
+(put 'change-log-default-name 'safe-local-variable
+     (lambda (a) (or (stringp a) (null a))))
 
 (defcustom change-log-mode-hook nil
   "Normal hook run by `change-log-mode'."
--- a/lisp/dired.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/dired.el	Sun Apr 09 00:38:22 2006 +0000
@@ -206,7 +206,8 @@
     ("^file:"    . dired-dnd-handle-local-file))
   "The functions to call when a drop in `dired-mode' is made.
 See `dnd-protocol-alist' for more information.  When nil, behave
-as in other buffers."
+as in other buffers.  Changing this option is effective only for
+new dired buffers."
   :type '(choice (repeat (cons (regexp) (function)))
 		 (const :tag "Behave as in other buffers" nil))
   :version "22.1"
--- a/lisp/emacs-lisp/bytecomp.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/emacs-lisp/bytecomp.el	Sun Apr 09 00:38:22 2006 +0000
@@ -2765,9 +2765,15 @@
 		(byte-compile-warn "`%s' used from Lisp code\n\
 That command is designed for interactive use only" fn))
 	   (if (and handler
-		    (or (not (byte-compile-version-cond
-			      byte-compile-compatibility))
-			(not (get (get fn 'byte-opcode) 'emacs19-opcode))))
+                    ;; Make sure that function exists.  This is important
+                    ;; for CL compiler macros since the symbol may be
+                    ;; `cl-byte-compile-compiler-macro' but if CL isn't
+                    ;; loaded, this function doesn't exist.
+                    (or (not (memq handler '(cl-byte-compile-compiler-macro)))
+                        (fboundp handler))
+		    (not (and (byte-compile-version-cond
+                               byte-compile-compatibility)
+                              (get (get fn 'byte-opcode) 'emacs19-opcode))))
                (funcall handler form)
 	     (when (memq 'callargs byte-compile-warnings)
 	       (if (memq fn '(custom-declare-group custom-declare-variable custom-declare-face))
--- a/lisp/emacs-lisp/lisp-mode.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/emacs-lisp/lisp-mode.el	Sun Apr 09 00:38:22 2006 +0000
@@ -443,6 +443,9 @@
 (defun eval-print-last-sexp ()
   "Evaluate sexp before point; print value into current buffer.
 
+If `eval-expression-debug-on-error' is non-nil, which is the default,
+this command arranges for all errors to enter the debugger.
+
 Note that printing the result is controlled by the variables
 `eval-expression-print-length' and `eval-expression-print-level',
 which see."
@@ -614,7 +617,10 @@
 
 (defun eval-last-sexp (eval-last-sexp-arg-internal)
   "Evaluate sexp before point; print value in minibuffer.
-Interactively, with prefix argument, print output into current buffer."
+Interactively, with prefix argument, print output into current buffer.
+
+If `eval-expression-debug-on-error' is non-nil, which is the default,
+this command arranges for all errors to enter the debugger."
   (interactive "P")
   (if (null eval-expression-debug-on-error)
       (eval-last-sexp-1 eval-last-sexp-arg-internal)
@@ -722,6 +728,9 @@
 \(Normally `defvar' and `defcustom' do not alter the value if there
 already is one.)
 
+If `eval-expression-debug-on-error' is non-nil, which is the default,
+this command arranges for all errors to enter the debugger.
+
 With a prefix argument, instrument the code for Edebug.
 
 If acting on a `defun' for FUNCTION, and the function was
--- a/lisp/files.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/files.el	Sun Apr 09 00:38:22 2006 +0000
@@ -2322,40 +2322,44 @@
 
 ;; Safe local variables:
 ;;
-;; For variables defined by minor modes, put the safety declarations
-;; here, not in the file defining the minor mode (when Emacs visits a
-;; file specifying that local variable, the minor mode file may not be
-;; loaded yet).  For variables defined by major modes, the safety
-;; declarations can go into the major mode's file, since that will be
-;; loaded before file variables are processed.
-
+;; For variables defined by major modes, the safety declarations can go into
+;; the major mode's file, since that will be loaded before file variables are
+;; processed.
+;;
+;; For variables defined by minor modes, put the safety declarations in the
+;; file defining the minor mode after the defcustom/defvar using an autoload
+;; cookie, e.g.:
+;;
+;;   ;;;###autoload(put 'variable 'safe-local-variable 'stringp)
+;;
+;; Otherwise, when Emacs visits a file specifying that local variable, the
+;; minor mode file may not be loaded yet.
+;;
+;; For variables defined in the C source code the declaration should go here:
+
+;; FIXME: Some variables should be moved according to the rules above.
 (let ((string-or-null (lambda (a) (or (stringp a) (null a)))))
   (eval
    `(mapc (lambda (pair)
 	    (put (car pair) 'safe-local-variable (cdr pair)))
 	  '((byte-compile-dynamic . t)
+	    (byte-compile-dynamic-docstrings . t)
+	    (byte-compile-warnings . t)
 	    (c-basic-offset     .  integerp)
 	    (c-file-style       .  stringp)
 	    (c-indent-level     .  integerp)
 	    (comment-column     .  integerp)
-	    (compile-command    . ,string-or-null)
+	    (compile-command    .  string-or-null-p)
 	    (fill-column        .  integerp)
-	    (fill-prefix        . ,string-or-null)
+	    (fill-prefix        .  string-or-null-p)
 	    (indent-tabs-mode   .  t)
-	    (ispell-check-comments . (lambda (a)
-				       (memq a '(nil t exclusive))))
-	    (ispell-local-dictionary . ,string-or-null)
 	    (kept-new-versions  .  integerp)
+	    (left-margin        .  t)
 	    (no-byte-compile    .  t)
 	    (no-update-autoloads . t)
-	    (outline-regexp     . ,string-or-null)
-	    (page-delimiter     . ,string-or-null)
-	    (paragraph-start    . ,string-or-null)
-	    (paragraph-separate . ,string-or-null)
-	    (sentence-end       . ,string-or-null)
-	    (sentence-end-double-space . t)
-	    (tab-width          .  integerp)
-	    (truncate-lines     .  t)
+	    (outline-regexp     .  string-or-null-p)
+	    (tab-width          .  integerp) ;; C source code
+	    (truncate-lines     .  t) ;; C source code
 	    (version-control    .  t)))))
 
 (put 'c-set-style 'safe-local-eval-function t)
@@ -2388,8 +2392,8 @@
 n  -- to ignore the local variables list.")
 	  (if offer-save
 	      (insert "
-!  -- to apply the local variables list, and mark these values (*) as
-      safe (in the future, they can be set automatically.)\n\n")
+!  -- to apply the local variables list, and permanently mark these
+      values (*) as safe (in the future, they will be set automatically.)\n\n")
 	    (insert "\n\n"))
 	  (dolist (elt vars)
 	    (cond ((member elt unsafe-vars)
--- a/lisp/gnus/ChangeLog	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/gnus/ChangeLog	Sun Apr 09 00:38:22 2006 +0000
@@ -1,3 +1,13 @@
+2006-04-06  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* gnus-fun.el (gnus): Require it for gnus-directory.
+
+2006-04-04  Andreas Seltenreich  <uwi7@rz.uni-karlsruhe.de>
+
+	* nnweb.el (nnweb-google-create-mapping): Update regexp.  Some
+	whitespace was matched into the url, which broke browsing hits
+	> 100 when mm-url-use-external was nil.
+
 2006-03-31  Reiner Steib  <Reiner.Steib@gmx.de>
 
 	* gnus-group.el (gnus-group-update-tool-bar): Add :initialize and
@@ -2137,6 +2147,10 @@
 	* nnrss.el (nnrss-fetch): Signal an error if w3-parse-buffer also
 	failed.
 
+2005-04-06  Joakim Verona  <joakim@verona.se>  (tiny change)
+
+	* nnrss.el (nnrss-read-group-data): Fix off-by-one error.
+
 2005-04-06  Jesper Harder  <harder@ifa.au.dk>
 
 	* mm-util.el (mm-subst-char-in-string): Support inplace.
@@ -2147,9 +2161,8 @@
 	(nnrss-request-delete-group): Use nnrss-make-filename.
 	(nnrss-read-server-data): Use nnrss-make-filename; use load.
 	(nnrss-save-server-data): Use nnrss-make-filename; use gnus-prin1.
-	(nnrss-read-group-data): Fix off-by-one error.  From Joakim Verona
-	<joakim@verona.se>; hash on description if link is missing; use
-	nnrss-make-filename; use load.
+	(nnrss-read-group-data): hash on description if link is missing;
+	use nnrss-make-filename; use load.
 	(nnrss-save-group-data): Use nnrss-make-filename; use gnus-prin1.
 	(nnrss-make-filename): New function.
 	(nnrss-close): New function.
@@ -2298,11 +2311,10 @@
 	* nnmaildir.el (nnmaildir-request-accept-article):
 	Use `nnheader-cancel-timer' for compatibility with current XEmacs.
 
-2005-03-13  Steve Youngs  <steve@sxemacs.org>
+2005-03-13  Andrey Slusar  <anrays@gmail.com>  (tiny change)
 
 	* gnus.el: Don't try and mark `gnus-agent-save-groups' as an
 	autoloaded function.
-	From: Andrey Slusar <anrays@gmail.com>.
 
 2005-03-13  Steve Youngs  <steve@sxemacs.org>
 
@@ -2664,6 +2676,11 @@
 	article buffer with a draft file.  This is a temporary measure
 	against the 2004-08-22 change to gnus-article-edit-mode.
 
+2004-11-02  From Ilya N. Golubev  <gin@mo.msk.ru>.
+
+	* mm-util.el (mm-mime-mule-charset-alist): Add the windows-1251
+	entry.
+
 2004-11-02  Katsumi Yamaoka  <yamaoka@jpl.org>
 
 	* html2text.el (html2text-get-attr): Remove unused argument `tag'.
@@ -2672,11 +2689,9 @@
 	* mm-util.el (mm-enrich-utf-8-by-mule-ucs): Fix cleaning of
 	after-load-alist.
 
-	* mm-util.el (mm-mime-mule-charset-alist): Add the windows-1251
-	entry.  From Ilya N. Golubev <gin@mo.msk.ru>.
-	(mm-enrich-utf-8-by-mule-ucs): New function run when Mule-UCS is
-	loaded under XEmacs.
-	(): Don't make duplicated entries in mm-mime-mule-charset-alist.
+	* mm-util.el (mm-enrich-utf-8-by-mule-ucs): New function run when
+	Mule-UCS is loaded under XEmacs.
+	(mm-mime-mule-charset-alist): Avoid duplicated entries.
 
 	* mm-util.el (mm-coding-system-p): Return a coding-system.
 	(mm-mime-mule-charset-alist): Use shift_jis instead of
@@ -3282,6 +3297,10 @@
 
 	* mm-decode.el (mm-copy-to-buffer): Don't use set-buffer-multibyte.
 
+2004-09-26  Christian Neukirchen  <chneukirchen@yahoo.de>  (tiny change)
+
+	* mm-util.el (mm-image-load-path): Handle nil in load-path.
+
 2004-09-26  Jesper Harder  <harder@ifa.au.dk>
 
 	* gnus-msg.el (gnus-post-news): Use blank Newsgroups line if
@@ -3311,9 +3330,6 @@
 	* gnus-cache.el (gnus-cache-save-buffers): Check if buffer is
 	alive.  Reported by Laurent Martelli <laurent@aopsys.com>.
 
-	* mm-util.el (mm-image-load-path): Handle nil in load-path.
-	From Christian Neukirchen <chneukirchen@yahoo.de>.
-
 	* html2text.el (html2text-replace-list): Add &amp; and &apos;.
 
 	* nnheader.el (nnheader-max-head-length): Increase to 8192.
@@ -3537,7 +3553,8 @@
 
 	* gnus-sum.el (gnus-summary-insert-subject): Remove list identifiers.
 
-	From Hiroshi Fujishima <pooh@nature.tsukuba.ac.jp> (tiny change).
+2004-09-03  Hiroshi Fujishima <pooh@nature.tsukuba.ac.jp>  (tiny change)
+
 	* spam-stat.el (spam-stat-reduce-size): Set spam-stat-dirty.
 	(spam-stat-save): Accept prefix argument.
 
@@ -3560,7 +3577,7 @@
 
 	* pgg-pgp.el (pgg-pgp-verify-region): Clean up.
 
-2004-05-19  Michael Schierl  <schierlm-usenet@gmx.de>
+2004-05-19  Michael Schierl  <schierlm-usenet@gmx.de>  (tiny change)
 
 	* pgg-pgp.el (pgg-pgp-verify-region): Default when signature
 	isn't a string.
@@ -3679,8 +3696,25 @@
 
 	* gnus-agent.el (gnus-agent-restore-gcc): Use ^ and regexp-quote.
 
-	* gnus-sum.el (gnus-newsgroup-variables): Doc fix (tiny change).
-	From Helmut Waitzmann <Helmut.Waitzmann@web.de>.
+2004-08-30  Helmut Waitzmann  <Helmut.Waitzmann@web.de>  (tiny change)
+
+	* gnus-sum.el (gnus-newsgroup-variables): Doc fix.
+
+2004-08-26  YAGI Tatsuya <ynyaaa@ybb.ne.jp>  (tiny change)
+
+	* gnus-art.el (gnus-article-next-page): Fix the way to find a real
+	end-of-buffer.
+
+2004-08-26  Stefan Wiens <s.wi@gmx.net>  (tiny change)
+
+	* gnus-sum.el (gnus-read-header): Don't remove a header for the
+	parent article of a sparse article in the thread hashtb.
+
+2004-08-26  David Hedbor <dhedbor@real.com>  (tiny change)
+
+	* nnmail.el (nnmail-split-lowercase-expanded): New user option.
+	(nnmail-expand-newtext): Lowercase expanded entries if
+	nnmail-split-lowercase-expanded is non-nil.
 
 	* gnus-agent.el (gnus-agent-regenerate-group): Activate the group
 	when the group's active is not available.
@@ -3688,8 +3722,6 @@
 	* gnus-art.el (article-hide-headers): Refer to the values for
 	gnus-ignored-headers and gnus-visible-headers in the summary
 	buffer since a user may have set them as group parameters.
-	(gnus-article-next-page): Fix the way to find a real end-of-buffer
-	(tiny change).  From YAGI Tatsuya <ynyaaa@ybb.ne.jp>.
 	(gnus-article-read-summary-keys): Restore new window-start and
 	hscroll to summary window.
 	(gnus-prev-page-map): Remove duplicated one.
@@ -3718,10 +3750,6 @@
 	* gnus-spec.el (gnus-update-format): Replace pp-to-string with
 	gnus-pp-to-string.
 
-	* gnus-sum.el (gnus-read-header): Don't remove a header for the
-	parent article of a sparse article in the thread hashtb.
-	From Stefan Wiens <s.wi@gmx.net>.
-
 	* gnus-util.el (gnus-bind-print-variables): New macro.
 	(gnus-prin1): Use it.
 	(gnus-prin1-to-string): Use it.
@@ -3761,11 +3789,6 @@
 	(nndoc-rfc822-forward-generate-article): New function.
 	(nndoc-rfc822-forward-generate-head): New function.
 
-	From David Hedbor <dhedbor@real.com>.
-	* nnmail.el (nnmail-split-lowercase-expanded): New user option.
-	(nnmail-expand-newtext): Lowercase expanded entries if
-	nnmail-split-lowercase-expanded is non-nil.
-
 	* score-mode.el (gnus-score-pretty-print): Replace pp with gnus-pp.
 
 	* webmail.el (webmail-debug): Replace pp with gnus-pp.
--- a/lisp/gnus/gnus-fun.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/gnus/gnus-fun.el	Sun Apr 09 00:38:22 2006 +0000
@@ -32,6 +32,7 @@
 (require 'mm-util)
 (require 'gnus-ems)
 (require 'gnus-util)
+(require 'gnus)
 
 (defcustom gnus-x-face-directory (expand-file-name "x-faces" gnus-directory)
   "*Directory where X-Face PBM files are stored."
--- a/lisp/gnus/nnweb.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/gnus/nnweb.el	Sun Apr 09 00:38:22 2006 +0000
@@ -415,7 +415,7 @@
 	    (goto-char (point-min))
 	    (incf i 100)
 	    (if (or (not (re-search-forward
-			  "<a href=\"\n\\([^>\"]+\\)\"><img src=\"[^\"]+next"
+			  "<a href=\"\n\\([^>\" \n\t]+\\)[^<]*<img src=[^>]+next"
 			  nil t))
 		    (>= i nnweb-max-hits))
 		(setq more nil)
--- a/lisp/ibuf-macs.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/ibuf-macs.el	Sun Apr 09 00:38:22 2006 +0000
@@ -75,8 +75,8 @@
 ;; (put 'ibuffer-save-marks 'lisp-indent-function 0)
 
 ;;;###autoload
-(defmacro* define-ibuffer-column (symbol (&key name inline props
-					       summarizer) &rest body)
+(defmacro* define-ibuffer-column (symbol (&key name inline props summarizer 
+					       header-mouse-map) &rest body)
   "Define a column SYMBOL for use with `ibuffer-formats'.
 
 BODY will be called with `buffer' bound to the buffer object, and
@@ -90,6 +90,9 @@
 function which will be passed a list of all the strings in its column;
 it should return a string to display at the bottom.
 
+If HEADER-MOUSE-MAP is given, it will be used as a keymap for the
+title of the column.
+
 Note that this macro expands into a `defun' for a function named
 ibuffer-make-column-NAME.  If INLINE is non-nil, then the form will be
 inlined into the compiled format versions.  This means that if you
@@ -115,6 +118,7 @@
 	    ,(if (stringp name)
 		 name
 	       (capitalize (symbol-name symbol))))
+       ,(if header-mouse-map `(put (quote ,sym) 'header-mouse-map ,header-mouse-map))
        ,(if summarizer
 	    ;; Store the name of the summarizing function.
 	    `(put (quote ,sym) 'ibuffer-column-summarizer
--- a/lisp/ibuffer.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/ibuffer.el	Sun Apr 09 00:38:22 2006 +0000
@@ -829,6 +829,21 @@
     (define-key map (kbd "RET") 'ibuffer-interactive-filter-by-mode)
     map))
 
+(defvar ibuffer-name-header-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [(mouse-1)] 'ibuffer-do-sort-by-alphabetic)
+    map))
+
+(defvar ibuffer-size-header-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [(mouse-1)] 'ibuffer-do-sort-by-size)
+    map))
+
+(defvar ibuffer-mode-header-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [(mouse-1)] 'ibuffer-do-sort-by-major-mode)
+    map))
+
 (defvar ibuffer-mode-filter-group-map
   (let ((map (make-sparse-keymap)))
     (define-key map [(mouse-1)] 'ibuffer-mouse-toggle-mark)
@@ -1666,6 +1681,7 @@
 
 (define-ibuffer-column name
   (:inline t
+   :header-mouse-map ibuffer-name-header-map
    :props
    ('mouse-face 'highlight 'keymap ibuffer-name-map
 		'ibuffer-name-column t
@@ -1682,6 +1698,7 @@
 
 (define-ibuffer-column size
   (:inline t
+   :header-mouse-map ibuffer-size-header-map
    :summarizer
    (lambda (column-strings)
      (let ((total 0))
@@ -1695,6 +1712,7 @@
 
 (define-ibuffer-column mode
   (:inline t
+   :header-mouse-map ibuffer-mode-header-map
    :props
    ('mouse-face 'highlight
 		'keymap ibuffer-mode-name-map
@@ -2009,12 +2027,18 @@
 		  (setq min (- min)))
 		(let* ((name (or (get sym 'ibuffer-column-name)
 				 (error "Unknown column %s in ibuffer-formats" sym)))
-		       (len (length name)))
-		  (if (< len min)
-		      (ibuffer-format-column name
-					     (- min len)
-					     align)
-		    name))))))
+		       (len (length name))
+		       (hmap (get sym 'header-mouse-map))
+		       (strname (if (< len min)
+				    (ibuffer-format-column name
+							   (- min len)
+							   align)
+				  name)))
+		  (when hmap
+		    (setq
+		     strname 
+		     (propertize strname 'mouse-face 'highlight 'keymap hmap)))
+		  strname)))))
 	 (add-text-properties opos (point) `(ibuffer-title-header t))
 	 (insert "\n")
 	 ;; Add the underlines
--- a/lisp/ido.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/ido.el	Sun Apr 09 00:38:22 2006 +0000
@@ -360,7 +360,10 @@
   :initialize 'custom-initialize-set
   :require 'ido
   :link '(emacs-commentary-link "ido.el")
-  :set-after '(ido-save-directory-list-file)
+  :set-after '(ido-save-directory-list-file
+	       ;; This will clear ido-unc-hosts-cache, so set it
+	       ;; before loading history file.
+	       ido-unc-hosts)
   :type '(choice (const :tag "Turn on only buffer" buffer)
                  (const :tag "Turn on only file" file)
                  (const :tag "Turn on both buffer and file" both)
@@ -631,7 +634,7 @@
   :group 'ido)
 
 (defvar ido-unc-hosts-cache t
-  "Cached value from ido-unc-hosts function.")
+  "Cached value from `ido-unc-hosts' function.")
 
 (defcustom ido-unc-hosts nil
   "*List of known UNC host names to complete after initial //.
@@ -646,12 +649,15 @@
 	   (setq ido-unc-hosts-cache t))
   :group 'ido)
 
+(defcustom ido-downcase-unc-hosts t
+  "*Non-nil if UNC host names should be downcased."
+  :type 'boolean
+  :group 'ido)
+
 (defcustom ido-ignore-unc-host-regexps nil
-  "*List of regexps matching UNC hosts to ignore."
+  "*List of regexps matching UNC hosts to ignore.
+Case is ignored if `ido-downcase-unc-hosts' is set."
   :type '(repeat regexp)
-  :set #'(lambda (symbol value)
-	   (set symbol value)
-	   (setq ido-unc-hosts-cache t))
   :group 'ido)
 
 (defcustom ido-cache-unc-host-shares-time 8.0
@@ -1132,33 +1138,40 @@
 
 (defun ido-unc-hosts (&optional query)
   "Return list of UNC host names."
-  (cond
-   ((listp ido-unc-hosts)
-    ido-unc-hosts)		;; static list or nil
-   ((listp ido-unc-hosts-cache)
-    ido-unc-hosts-cache)	;; result of net search
-   ((and query (fboundp ido-unc-hosts))
-    (message "Searching for UNC hosts...")
-    (let ((hosts (funcall ido-unc-hosts)) host re-list re)
-      (setq ido-unc-hosts-cache nil)
-      (while hosts
-	(setq host (downcase (car hosts))
-	      hosts (cdr hosts)
-	      re-list ido-ignore-unc-host-regexps)
-	(while re-list
-	  (setq re (car re-list)
-		re-list (cdr re-list))
-	  (if (string-match re host)
-	      (setq re-list nil
-		    host nil)))
-	(if host
-	    (setq ido-unc-hosts-cache (cons host ido-unc-hosts-cache)))))
-    (message nil)
-    (setq ido-unc-hosts-cache
-	  (sort ido-unc-hosts-cache #'string<)))
-   (query
-    (setq ido-unc-hosts-cache nil))
-   (t (fboundp ido-unc-hosts))))
+  (let ((hosts
+	 (cond
+	  ((listp ido-unc-hosts)
+	   ido-unc-hosts)		;; static list or nil
+	  ((listp ido-unc-hosts-cache)
+	   ido-unc-hosts-cache)	;; result of net search
+	  ((and query (fboundp ido-unc-hosts))
+	   (message (propertize "Searching for UNC hosts..." 'face 'highlight))
+	   (setq ido-unc-hosts-cache (funcall ido-unc-hosts))
+	   (message nil)
+	   ido-unc-hosts-cache)
+	  (query
+	   (setq ido-unc-hosts-cache nil))
+	  (t (fboundp ido-unc-hosts)))))
+    (when query
+      (let ((case-fold-search ido-downcase-unc-hosts)
+	    res host re-list re)
+	(while hosts
+	  (setq host (car hosts)
+		hosts (cdr hosts)
+		re-list (and ido-process-ignore-lists
+			     ido-ignore-unc-host-regexps))
+	  (while re-list
+	    (setq re (car re-list)
+		  re-list (cdr re-list))
+	    (if (string-match re host)
+		(setq re-list nil
+		      host nil)))
+	  (when host
+	    (when ido-downcase-unc-hosts
+	      (setq host (downcase host)))
+	    (setq res (cons host res))))
+	(setq hosts (sort res #'string<))))
+    hosts))
 
 (defun ido-unc-hosts-net-view ()
   "Query network for list of UNC host names using `NET VIEW'."
@@ -1280,6 +1293,9 @@
 	    (ido-pp 'ido-work-directory-list)
 	    (ido-pp 'ido-work-file-list)
 	    (ido-pp 'ido-dir-file-cache "\n\n ")
+	    (if (listp ido-unc-hosts-cache)
+		(ido-pp 'ido-unc-hosts-cache)
+	      (insert "\n;; ----- ido-unc-hosts-cache -----\nt\n"))
 	    (insert "\n")
 	    (write-file ido-save-directory-list-file nil))
 	(kill-buffer buf)))))
@@ -1301,7 +1317,8 @@
 		    (setq ido-last-directory-list (read (current-buffer))
 			  ido-work-directory-list (read (current-buffer))
 			  ido-work-file-list (read (current-buffer))
-			  ido-dir-file-cache (read (current-buffer)))
+			  ido-dir-file-cache (read (current-buffer))
+			  ido-unc-hosts-cache (read (current-buffer)))
 		  (error nil)))
 	    (kill-buffer buf)))))
   (ido-wash-history))
@@ -2582,7 +2599,9 @@
   (interactive)
   (if (and ido-mode (eq ido-cur-item 'file))
       (progn
-	(ido-remove-cached-dir ido-current-directory)
+	(if (ido-is-unc-root)
+	    (setq ido-unc-hosts-cache t)
+	  (ido-remove-cached-dir ido-current-directory))
 	(setq ido-text-init ido-text)
 	(setq ido-rotate-temp t)
 	(setq ido-exit 'refresh)
--- a/lisp/info.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/info.el	Sun Apr 09 00:38:22 2006 +0000
@@ -3044,7 +3044,11 @@
 (defun Info-follow-nearest-node (&optional fork)
   "Follow a node reference near point.
 If point is on a reference, follow that reference.  Otherwise,
-if point is in a menu item description, follow that menu item."
+if point is in a menu item description, follow that menu item.
+
+If FORK is non-nil (interactively with a prefix arg), show the node in
+a new Info buffer.
+If FORK is a string, it is the name to use for the new buffer."
   (interactive "P")
   (or (Info-try-follow-nearest-node fork)
       (when (save-excursion
--- a/lisp/international/characters.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/international/characters.el	Sun Apr 09 00:38:22 2006 +0000
@@ -135,6 +135,17 @@
 (map-charset-chars #'modify-category-entry 'chinese-gb2312 ?Y #x2721 #x277E)
 (map-charset-chars #'modify-category-entry 'chinese-gb2312 ?C #x3021 #x7E7E)
 
+(let ((tbl (standard-case-table)))
+  (dotimes (i 26)
+    (set-case-syntax-pair (make-char 'chinese-gb2312 #x23 (+ #x41 i))
+			  (make-char 'chinese-gb2312 #x23 (+ #x61 i)) tbl))
+  (dotimes (i 24)
+    (set-case-syntax-pair (make-char 'chinese-gb2312 #x26 (+ #x21 i))
+			  (make-char 'chinese-gb2312 #x26 (+ #x41 i)) tbl))
+  (dotimes (i 33)
+    (set-case-syntax-pair (make-char 'chinese-gb2312 #x27 (+ #x21 i))
+			  (make-char 'chinese-gb2312 #x27 (+ #x51 i)) tbl)))
+
 ;; Chinese character set (BIG5)
 
 (map-charset-chars #'modify-category-entry 'big5 ?c)
@@ -425,6 +436,17 @@
       (if lc (modify-category-entry lc ?v)))
     (setq i (1+ i))))
 
+(let ((tbl (standard-case-table)))
+  (dotimes (i 22)
+    (set-case-syntax-pair (decode-big5-char (+ #xA2CF i))
+			  (decode-big5-char (+ #xA2CF i 26)) tbl))
+  (dotimes (i 4)
+    (set-case-syntax-pair (decode-big5-char (+ #xA2E4 i))
+			  (decode-big5-char (+ #xA340 i)) tbl))
+  (dotimes (i 24)
+    (set-case-syntax-pair (decode-big5-char (+ #xA344 i))
+			  (decode-big5-char (+ #xA344 i 24)) tbl)))
+
 
 ;; Latin
 
--- a/lisp/international/mule-cmds.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/international/mule-cmds.el	Sun Apr 09 00:38:22 2006 +0000
@@ -2085,6 +2085,7 @@
     ("cy" "Welsh" iso-8859-14)
     ("da" . "Latin-1") ; Danish
     ("de" "German" iso-8859-1)
+    ; dv Divehi
     ; dz Bhutani
     ("el" "Greek" iso-8859-7)
     ;; Users who specify "en" explicitly typically want Latin-1, not ASCII.
@@ -2246,6 +2247,10 @@
     ("jp" . "Japanese") ; e.g. MS Windows
     ("chs" . "Chinese-GB") ; MS Windows Chinese Simplified
     ("cht" . "Chinese-BIG5") ; MS Windows Chinese Traditional
+    ("gbz" . "UTF-8") ; MS Windows Dari Persian
+    ("div" . "UTF-8") ; MS Windows Divehi (Maldives)
+    ("wee" . "Latin-2") ; MS Windows Lower Sorbian
+    ("wen" . "Latin-2") ; MS Windows Upper Sorbian
     ))
   "Alist of locale regexps vs the corresponding languages and coding systems.
 Each element has these form:
@@ -2446,6 +2451,8 @@
 	     (locale-name-match locale locale-language-names))
 	    (charset-language-name
 	     (locale-name-match locale locale-charset-language-names))
+	    (default-eol-type (coding-system-eol-type
+			       default-buffer-file-coding-system))
 	    (coding-system
 	     (or (locale-name-match locale locale-preferred-coding-systems)
 		 (when locale
@@ -2466,6 +2473,13 @@
 	  (if (not language-name)
 	      (setq language-name charset-language-name)))
 
+	;; If a specific EOL conversion was specified in the default
+	;; buffer-file-coding-system, preserve it in the coding system
+	;; we will be using from now on.
+	(if (memq default-eol-type '(0 1 2 unix dos mac))
+	    (setq coding-system (coding-system-change-eol-conversion
+				 coding-system default-eol-type)))
+
 	(when language-name
 
 	  ;; Set up for this character set.  This is now the right way
--- a/lisp/man.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/man.el	Sun Apr 09 00:38:22 2006 +0000
@@ -416,6 +416,9 @@
   (define-key Man-mode-map "k"    'Man-kill)
   (define-key Man-mode-map "q"    'Man-quit)
   (define-key Man-mode-map "m"    'man)
+  ;; Not all the man references get buttons currently. The text in the
+  ;; manual page can contain references to other man pages
+  (define-key Man-mode-map "\r"   'man-follow)
   (define-key Man-mode-map "?"    'describe-mode))
 
 ;; buttons
@@ -423,10 +426,13 @@
   'follow-link t
   'help-echo "mouse-2, RET: display this man page"
   'func nil
-  'action (lambda (button) (funcall 
-			    (button-get button 'func)
-			    (or (button-get button 'Man-target-string)
-				(button-label button)))))
+  'action (lambda (button) 
+	    (funcall 
+	     (button-get button 'func)
+	     (let ((func (button-get button 'Man-target-string)))
+	       (if func
+		   (if (functionp func) (funcall func) func)
+		 (button-label button))))))
 
 (define-button-type 'Man-xref-man-page 
   :supertype 'Man-abstract-xref-man-page
@@ -929,15 +935,14 @@
     (setq Man-arguments ""))
   (if (string-match "-k " Man-arguments)
       (progn
-	(Man-highlight-references0 nil Man-reference-regexp 1 nil
+	(Man-highlight-references0 nil Man-reference-regexp 1
+				   'Man-default-man-entry
 				   (or xref-man-type 'Man-xref-man-page))
 	(Man-highlight-references0 nil Man-apropos-regexp 1
-				   (lambda ()
-				     (format "%s(%s)"
-					     (match-string 1)
-					     (match-string 2)))
+				   'Man-default-man-entry
 				   (or xref-man-type 'Man-xref-man-page)))
-    (Man-highlight-references0 Man-see-also-regexp Man-reference-regexp 1 nil
+    (Man-highlight-references0 Man-see-also-regexp Man-reference-regexp 1 
+			       'Man-default-man-entry
 			       (or xref-man-type 'Man-xref-man-page))
     (Man-highlight-references0 Man-synopsis-regexp Man-header-regexp 0 2
 			       'Man-xref-header-file)
@@ -966,7 +971,7 @@
 			     ((numberp target) 
 			      (match-string target))
 			     ((functionp target)
-			      (funcall target))
+			      target)
 			     (t nil)))))))
 
 (defun Man-cleanup-manpage (&optional interactive)
--- a/lisp/mh-e/ChangeLog	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/mh-e/ChangeLog	Sun Apr 09 00:38:22 2006 +0000
@@ -1,3 +1,8 @@
+2006-04-07  Bill Wohler  <wohler@newt.com>
+
+	* mh-e.el (mh-path, mh-variant): Define with mh-defcustom and add
+	:package-version keyword.
+
 2006-03-31  Bill Wohler  <wohler@newt.com>
 
 	* mh-e.el (mh-strip-package-version): Move before use to avoid
--- a/lisp/mh-e/mh-e.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/mh-e/mh-e.el	Sun Apr 09 00:38:22 2006 +0000
@@ -644,13 +644,66 @@
 
 
 
+;;; MH-E Customization Support Routines
+
+;; Shush compiler (Emacs 21 and XEmacs).
+(defvar customize-package-emacs-version-alist)
+
+;; Temporary function and data structure used customization.
+;; These will be unbound after the options are defined.
+(defmacro mh-strip-package-version (args)
+  "Strip :package-version keyword and its value from ARGS.
+In Emacs versions that support the :package-version keyword,
+ARGS is returned unchanged."
+  `(if (boundp 'customize-package-emacs-version-alist)
+       ,args
+     (let (seen)
+       (loop for keyword in ,args
+             if (cond ((eq keyword ':package-version) (setq seen t) nil)
+                      (seen (setq seen nil) nil)
+                      (t t))
+             collect keyword))))
+
+(defmacro mh-defgroup (symbol members doc &rest args)
+  "Declare SYMBOL as a customization group containing MEMBERS.
+See documentation for `defgroup' for a description of the arguments
+SYMBOL, MEMBERS, DOC and ARGS.
+This macro is used by Emacs versions that lack the :package-version
+keyword, introduced in Emacs 22."
+  (declare (doc-string 3))
+  `(defgroup ,symbol ,members ,doc ,@(mh-strip-package-version args)))
+(put 'mh-defgroup 'lisp-indent-function 'defun)
+
+(defmacro mh-defcustom (symbol value doc &rest args)
+  "Declare SYMBOL as a customizable variable that defaults to VALUE.
+See documentation for `defcustom' for a description of the arguments
+SYMBOL, VALUE, DOC and ARGS.
+This macro is used by Emacs versions that lack the :package-version
+keyword, introduced in Emacs 22."
+  (declare (doc-string 3))
+  `(defcustom ,symbol ,value ,doc ,@(mh-strip-package-version args)))
+(put 'mh-defcustom 'lisp-indent-function 'defun)
+
+(defmacro mh-defface (face spec doc &rest args)
+  "Declare FACE as a customizable face that defaults to SPEC.
+See documentation for `defface' for a description of the arguments
+FACE, SPEC, DOC and ARGS.
+This macro is used by Emacs versions that lack the :package-version
+keyword, introduced in Emacs 22."
+  (declare (doc-string 3))
+  `(defface ,face ,spec ,doc ,@(mh-strip-package-version args)))
+(put 'mh-defface 'lisp-indent-function 'defun)
+
+
+
 ;;; Variant Support
 
-(defcustom mh-path nil
+(mh-defcustom mh-path nil
   "*Additional list of directories to search for MH.
 See `mh-variant'."
   :group 'mh-e
-  :type '(repeat (directory)))
+  :type '(repeat (directory))
+  :package-version '(MH-E "8.0"))
 
 (defun mh-variants ()
   "Return a list of installed variants of MH on the system.
@@ -859,7 +912,7 @@
                (mapconcat '(lambda (x) (format "%s" (car x)))
                           (mh-variants) " or "))))))
 
-(defcustom mh-variant 'autodetect
+(mh-defcustom mh-variant 'autodetect
   "*Specifies the variant used by MH-E.
 
 The default setting of this option is \"Auto-detect\" which means
@@ -884,59 +937,8 @@
   :set (lambda (symbol value)
          (set-default symbol value)     ;Done in mh-variant-set-variant!
          (mh-variant-set value))
-  :group 'mh-e)
-
-
-
-;;; MH-E Customization Support Routines
-
-;; Shush compiler (Emacs 21 and XEmacs).
-(defvar customize-package-emacs-version-alist)
-
-;; Temporary function and data structure used customization.
-;; These will be unbound after the options are defined.
-(defmacro mh-strip-package-version (args)
-  "Strip :package-version keyword and its value from ARGS.
-In Emacs versions that support the :package-version keyword,
-ARGS is returned unchanged."
-  `(if (boundp 'customize-package-emacs-version-alist)
-       ,args
-     (let (seen)
-       (loop for keyword in ,args
-             if (cond ((eq keyword ':package-version) (setq seen t) nil)
-                      (seen (setq seen nil) nil)
-                      (t t))
-             collect keyword))))
-
-(defmacro mh-defgroup (symbol members doc &rest args)
-  "Declare SYMBOL as a customization group containing MEMBERS.
-See documentation for `defgroup' for a description of the arguments
-SYMBOL, MEMBERS, DOC and ARGS.
-This macro is used by Emacs versions that lack the :package-version
-keyword, introduced in Emacs 22."
-  (declare (doc-string 3))
-  `(defgroup ,symbol ,members ,doc ,@(mh-strip-package-version args)))
-(put 'mh-defgroup 'lisp-indent-function 'defun)
-
-(defmacro mh-defcustom (symbol value doc &rest args)
-  "Declare SYMBOL as a customizable variable that defaults to VALUE.
-See documentation for `defcustom' for a description of the arguments
-SYMBOL, VALUE, DOC and ARGS.
-This macro is used by Emacs versions that lack the :package-version
-keyword, introduced in Emacs 22."
-  (declare (doc-string 3))
-  `(defcustom ,symbol ,value ,doc ,@(mh-strip-package-version args)))
-(put 'mh-defcustom 'lisp-indent-function 'defun)
-
-(defmacro mh-defface (face spec doc &rest args)
-  "Declare FACE as a customizable face that defaults to SPEC.
-See documentation for `defface' for a description of the arguments
-FACE, SPEC, DOC and ARGS.
-This macro is used by Emacs versions that lack the :package-version
-keyword, introduced in Emacs 22."
-  (declare (doc-string 3))
-  `(defface ,face ,spec ,doc ,@(mh-strip-package-version args)))
-(put 'mh-defface 'lisp-indent-function 'defun)
+  :group 'mh-e
+  :package-version '(MH-E "8.0"))
 
 
 
--- a/lisp/net/rcirc.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/net/rcirc.el	Sun Apr 09 00:38:22 2006 +0000
@@ -53,27 +53,27 @@
   :link '(custom-manual "(rcirc)")
   :group 'applications)
 
-(defcustom rcirc-server "irc.freenode.net"
+(defcustom rcirc-default-server "irc.freenode.net"
   "The default server to connect to."
   :type 'string
   :group 'rcirc)
 
-(defcustom rcirc-port 6667
+(defcustom rcirc-default-port 6667
   "The default port to connect to."
   :type 'integer
   :group 'rcirc)
 
-(defcustom rcirc-nick (user-login-name)
+(defcustom rcirc-default-nick (user-login-name)
   "Your nick."
   :type 'string
   :group 'rcirc)
 
-(defcustom rcirc-user-name (user-login-name)
+(defcustom rcirc-default-user-name (user-login-name)
   "Your user name sent to the server when connecting."
   :type 'string
   :group 'rcirc)
 
-(defcustom rcirc-user-full-name (if (string= (user-full-name) "")
+(defcustom rcirc-default-user-full-name (if (string= (user-full-name) "")
 				 rcirc-user-name
 			       (user-full-name))
   "The full name sent to the server when connecting."
@@ -112,6 +112,10 @@
   "If non-nil, ignore activity in this buffer.")
 (make-variable-buffer-local 'rcirc-ignore-buffer-activity-flag)
 
+(defvar rcirc-low-priority-flag nil
+  "If non-nil, activity in this buffer is considered low priority.")
+(make-variable-buffer-local 'rcirc-low-priority-flag)
+
 (defcustom rcirc-time-format "%H:%M "
   "*Describes how timestamps are printed.
 Used as the first arg to `format-time-string'."
@@ -213,6 +217,43 @@
   :type 'boolean
   :group 'rcirc)
 
+(defcustom rcirc-decode-coding-system 'undecided
+  "Coding system used to decode incoming irc messages."
+  :type 'coding-system
+  :group 'rcirc)
+
+(defcustom rcirc-encode-coding-system 'utf-8
+  "Coding system used to encode outgoing irc messages."
+  :type 'coding-system
+  :group 'rcirc)
+
+(defcustom rcirc-coding-system-alist nil
+  "Alist to decide a coding system to use for a file I/O operation.
+The format is ((PATTERN . VAL) ...).
+PATTERN is either a string or a cons of strings.
+If PATTERN is a string, it is used to match a target.
+If PATTERN is a cons of strings, the car part is used to match a
+target, and the cdr part is used to match a server.
+VAL is either a coding system or a cons of coding systems.
+If VAL is a coding system, it is used for both decoding and encoding
+messages.
+If VAL is a cons of coding systems, the car part is used for decoding,
+and the cdr part is used for encoding."
+  :type '(alist :key-type (choice (string :tag "Channel Regexp")
+					  (cons (string :tag "Channel Regexp")
+						(string :tag "Server Regexp")))
+		:value-type (choice coding-system
+				    (cons (coding-system :tag "Decode")
+					  (coding-system :tag "Encode"))))
+  :group 'rcirc)
+
+(defcustom rcirc-multiline-major-mode 'fundamental-mode
+  "Major-mode function to use in multiline edit buffers."
+  :type 'function
+  :group 'rcirc)
+
+(defvar rcirc-nick nil)
+
 (defvar rcirc-prompt-start-marker nil)
 (defvar rcirc-prompt-end-marker nil)
 
@@ -230,14 +271,14 @@
 (defvar rcirc-buffer-alist nil)
 
 (defvar rcirc-activity nil
-  "List of channels with unviewed activity.")
+  "List of buffers with unviewed activity.")
 
 (defvar rcirc-activity-string ""
   "String displayed in modeline representing `rcirc-activity'.")
 (put 'rcirc-activity-string 'risky-local-variable t)
 
-(defvar rcirc-process nil
-  "The server process associated with this buffer.")
+(defvar rcirc-server-buffer nil
+  "The server buffer associated with this channel buffer.")
 
 (defvar rcirc-target nil
   "The channel or user associated with this buffer.")
@@ -246,7 +287,8 @@
   "List of urls seen in the current buffer.")
 
 (defvar rcirc-keepalive-seconds 60
-  "Number of seconds between keepalive pings.")
+  "Number of seconds between keepalive pings.
+If nil, do not send keepalive pings.")
 
 (defconst rcirc-id-string (concat "rcirc on GNU Emacs " emacs-version))
 
@@ -257,31 +299,30 @@
 If ARG is non-nil, prompt for a server to connect to."
   (interactive "P")
   (if arg
-      (let* ((server (read-string "IRC Server: " rcirc-server))
-	     (port (read-string "IRC Port: " (number-to-string rcirc-port)))
-	     (nick (read-string "IRC Nick: " rcirc-nick))
+      (let* ((server (read-string "IRC Server: " rcirc-default-server))
+	     (port (read-string "IRC Port: " (number-to-string rcirc-default-port)))
+	     (nick (read-string "IRC Nick: " rcirc-default-nick))
 	     (channels (split-string
 			(read-string "IRC Channels: "
-				     (mapconcat 'identity
-						(rcirc-startup-channels server)
-						" "))
+				     (mapconcat 'identity (rcirc-startup-channels server) " "))
 			"[, ]+" t)))
-	(rcirc-connect server port nick rcirc-user-name rcirc-user-full-name
+	(rcirc-connect server port nick rcirc-default-user-name rcirc-default-user-full-name
 		       channels))
     ;; make new connection using defaults unless already connected to
     ;; the default rcirc-server
-    (let ((default-server (default-value 'rcirc-server))
-	  connected)
+    (let (connected)
       (dolist (p (rcirc-process-list))
-	(when (string= default-server (process-name p))
+	(when (string= rcirc-default-server (process-name p))
 	  (setq connected p)))
       (if (not connected)
-	  (rcirc-connect rcirc-server rcirc-port rcirc-nick
-			 rcirc-user-name rcirc-user-full-name
-			 (rcirc-startup-channels rcirc-server))
+	  (rcirc-connect rcirc-default-server rcirc-default-port 
+			 rcirc-default-nick rcirc-default-user-name
+			 rcirc-default-user-full-name
+			 (rcirc-startup-channels rcirc-default-server))
 	(switch-to-buffer (process-buffer connected))
-	(message "Connected to %s" rcirc-server)))))
-
+	(message "Connected to %s" 
+		 (process-contact (get-buffer-process (current-buffer))
+				  :host))))))
 ;;;###autoload
 (defalias 'irc 'rcirc)
 
@@ -290,12 +331,10 @@
 (defvar rcirc-topic nil)
 (defvar rcirc-keepalive-timer nil)
 (defvar rcirc-last-server-message-time nil)
+(defvar rcirc-server nil)
 
 ;;;###autoload
 (defun rcirc-connect (&optional server port nick user-name full-name startup-channels)
-  (add-hook 'window-configuration-change-hook
-	    'rcirc-window-configuration-change)
-
   (save-excursion
     (message "Connecting to %s..." server)
     (let* ((inhibit-eol-conversion)
@@ -303,26 +342,26 @@
 			    (if (stringp port)
 				(string-to-number port)
 			      port)
-			  rcirc-port))
-	   (server (or server rcirc-server))
-	   (nick (or nick rcirc-nick))
-	   (user-name (or user-name rcirc-user-name))
-	   (full-name (or full-name rcirc-user-full-name))
-	   (startup-channels (or startup-channels (rcirc-startup-channels server)))
+			  rcirc-default-port))
+	   (server (or server rcirc-default-server))
+	   (nick (or nick rcirc-default-nick))
+	   (user-name (or user-name rcirc-default-user-name))
+	   (full-name (or full-name rcirc-default-user-full-name))
+	   (startup-channels startup-channels)
            (process (open-network-stream server nil server port-number)))
       ;; set up process
       (set-process-coding-system process 'raw-text 'raw-text)
-      (set-process-filter process 'rcirc-filter)
       (switch-to-buffer (rcirc-generate-new-buffer-name process nil))
       (set-process-buffer process (current-buffer))
+      (rcirc-mode process nil)
       (set-process-sentinel process 'rcirc-sentinel)
-      (rcirc-mode process nil)
+      (set-process-filter process 'rcirc-filter)
+      (make-local-variable 'rcirc-server)
+      (setq rcirc-server server)
       (make-local-variable 'rcirc-buffer-alist)
       (setq rcirc-buffer-alist nil)
       (make-local-variable 'rcirc-nick-table)
       (setq rcirc-nick-table (make-hash-table :test 'equal))
-      (make-local-variable 'rcirc-server)
-      (setq rcirc-server server)
       (make-local-variable 'rcirc-nick)
       (setq rcirc-nick nick)
       (make-local-variable 'rcirc-process-output)
@@ -339,9 +378,10 @@
                                       full-name))
 
       ;; setup ping timer if necessary
-      (unless rcirc-keepalive-timer
-        (setq rcirc-keepalive-timer
-              (run-at-time 0 rcirc-keepalive-seconds 'rcirc-keepalive)))
+      (when rcirc-keepalive-seconds
+	(unless rcirc-keepalive-timer
+	  (setq rcirc-keepalive-timer
+		(run-at-time 0 rcirc-keepalive-seconds 'rcirc-keepalive))))
 
       (message "Connecting to %s...done" server)
 
@@ -353,6 +393,11 @@
   `(with-current-buffer (process-buffer ,process)
      ,@body))
 
+(defmacro with-rcirc-server-buffer (&rest body)
+  (declare (indent 0) (debug t))
+  `(with-current-buffer rcirc-server-buffer
+     ,@body))
+
 (defun rcirc-keepalive ()
   "Send keep alive pings to active rcirc processes.
 Kill processes that have not received a server message since the
@@ -471,24 +516,35 @@
 
 (defun rcirc-send-string (process string)
   "Send PROCESS a STRING plus a newline."
-  (let ((string (concat (encode-coding-string string
-                                              buffer-file-coding-system)
+  (let ((string (concat (encode-coding-string string rcirc-encode-coding-system)
                         "\n")))
-    (unless (eq (process-status rcirc-process) 'open)
+    (unless (eq (process-status process) 'open)
       (error "Network connection to %s is not open"
-             (process-name rcirc-process)))
+             (process-name process)))
     (rcirc-debug process string)
     (process-send-string process string)))
 
-(defun rcirc-server (process)
-  "Return PROCESS server, given by the 001 response."
+(defun rcirc-buffer-process (&optional buffer)
+  "Return the process associated with channel BUFFER.
+With no argument or nil as argument, use the current buffer."
+  (get-buffer-process (or buffer rcirc-server-buffer)))
+
+(defun rcirc-server-name (process)
+  "Return PROCESS server name, given by the 001 response."
   (with-rcirc-process-buffer process
-    rcirc-server))
+    (or rcirc-server rcirc-default-server)))
 
 (defun rcirc-nick (process)
   "Return PROCESS nick."
-  (with-rcirc-process-buffer process
-    rcirc-nick))
+  (with-rcirc-process-buffer process 
+    (or rcirc-nick rcirc-default-nick)))
+
+(defun rcirc-buffer-nick (&optional buffer)
+  "Return the nick associated with BUFFER.
+With no argument or nil as argument, use the current buffer."
+  (with-current-buffer (or buffer (current-buffer))
+    (with-current-buffer rcirc-server-buffer
+      (or rcirc-nick rcirc-default-nick))))
 
 (defvar rcirc-max-message-length 450
   "Messages longer than this value will be split.")
@@ -554,8 +610,8 @@
 		 rcirc-nick-completion-start-offset)
 	      (point))
 	     (mapcar (lambda (x) (cons x nil))
-		     (rcirc-channel-nicks rcirc-process
-					  (rcirc-buffer-target)))))))
+		     (rcirc-channel-nicks (rcirc-buffer-process)
+					  rcirc-target))))))
   (let ((completion (car rcirc-nick-completions)))
     (when completion
       (delete-region (+ rcirc-prompt-end-marker
@@ -567,11 +623,15 @@
                              rcirc-prompt-end-marker)
                           ": "))))))
 
-(defun rcirc-buffer-target (&optional buffer)
-  "Return the name of target for BUFFER.
-If buffer is nil, return the target of the current buffer."
-  (with-current-buffer (or buffer (current-buffer))
-    rcirc-target))
+(defun set-rcirc-decode-coding-system (coding-system)
+  "Set the decode coding system used in this channel."
+  (interactive "zCoding system for incoming messages: ")
+  (setq rcirc-decode-coding-system coding-system))
+
+(defun set-rcirc-encode-coding-system (coding-system)
+  "Set the encode coding system used in this channel."
+  (interactive "zCoding system for outgoing messages: ")
+  (setq rcirc-encode-coding-system coding-system))
 
 (defvar rcirc-mode-map (make-sparse-keymap)
   "Keymap for rcirc mode.")
@@ -584,7 +644,7 @@
 (define-key rcirc-mode-map (kbd "C-c C-c") 'rcirc-edit-multiline)
 (define-key rcirc-mode-map (kbd "C-c C-j") 'rcirc-cmd-join)
 (define-key rcirc-mode-map (kbd "C-c C-k") 'rcirc-cmd-kick)
-(define-key rcirc-mode-map (kbd "C-c C-l") 'rcirc-cmd-list)
+(define-key rcirc-mode-map (kbd "C-c C-l") 'rcirc-toggle-low-priority)
 (define-key rcirc-mode-map (kbd "C-c C-d") 'rcirc-cmd-mode)
 (define-key rcirc-mode-map (kbd "C-c C-m") 'rcirc-cmd-msg)
 (define-key rcirc-mode-map (kbd "C-c C-r") 'rcirc-cmd-nick) ; rename
@@ -612,6 +672,8 @@
 (defvar rcirc-mode-hook nil
   "Hook run when setting up rcirc buffer.")
 
+(defvar rcirc-last-post-time nil)
+
 (defun rcirc-mode (process target)
   "Major mode for IRC channel buffers.
 
@@ -623,12 +685,14 @@
 
   (make-local-variable 'rcirc-input-ring)
   (setq rcirc-input-ring (make-ring rcirc-input-ring-size))
-  (make-local-variable 'rcirc-process)
-  (setq rcirc-process process)
+  (make-local-variable 'rcirc-server-buffer)
+  (setq rcirc-server-buffer (process-buffer process))
   (make-local-variable 'rcirc-target)
   (setq rcirc-target target)
   (make-local-variable 'rcirc-topic)
   (setq rcirc-topic nil)
+  (make-local-variable 'rcirc-last-post-time)
+  (setq rcirc-last-post-time (current-time))
 
   (make-local-variable 'rcirc-short-buffer-name)
   (setq rcirc-short-buffer-name nil)
@@ -636,6 +700,16 @@
   (setq rcirc-urls nil)
   (setq use-hard-newlines t)
 
+  (make-local-variable 'rcirc-decode-coding-system)
+  (make-local-variable 'rcirc-encode-coding-system)
+  (dolist (i rcirc-coding-system-alist)
+    (let ((chan (if (consp (car i)) (caar i) (car i)))
+	  (serv (if (consp (car i)) (cdar i) "")))
+      (when (and (string-match chan (or target ""))
+		 (string-match serv (rcirc-server-name process)))
+	(setq rcirc-decode-coding-system (if (consp (cdr i)) (cadr i) i)
+	      rcirc-encode-coding-system (if (consp (cdr i)) (cddr i) i)))))
+
   ;; setup the prompt and markers
   (make-local-variable 'rcirc-prompt-start-marker)
   (setq rcirc-prompt-start-marker (make-marker))
@@ -649,6 +723,13 @@
   (setq overlay-arrow-position (make-marker))
   (set-marker overlay-arrow-position nil)
 
+  ;; if the user changes the major mode or kills the buffer, there is
+  ;; cleanup work to do
+  (make-local-variable 'change-major-mode-hook)
+  (add-hook 'change-major-mode-hook 'rcirc-change-major-mode-hook)
+  (make-local-variable 'kill-buffer-hook)
+  (add-hook 'kill-buffer-hook 'rcirc-kill-buffer-hook)
+
   ;; add to buffer list, and update buffer abbrevs
   (when target				; skip server buffer
     (let ((buffer (current-buffer)))
@@ -675,11 +756,9 @@
 	  (prompt (or rcirc-prompt "")))
       (mapc (lambda (rep)
 	      (setq prompt
-		    (replace-regexp-in-string (car rep) (regexp-quote (cdr rep)) prompt)))
-	    (list (cons "%n" (with-rcirc-process-buffer rcirc-process
-			       rcirc-nick))
-		  (cons "%s" (with-rcirc-process-buffer rcirc-process
-			       rcirc-server))
+		    (replace-regexp-in-string (car rep) (cdr rep) prompt)))
+	    (list (cons "%n" (rcirc-buffer-nick))
+		  (cons "%s" (with-rcirc-server-buffer (or rcirc-server "")))
 		  (cons "%t" (or rcirc-target ""))))
       (save-excursion
 	(delete-region rcirc-prompt-start-marker rcirc-prompt-end-marker)
@@ -713,27 +792,29 @@
 (defun rcirc-kill-buffer-hook ()
   "Part the channel when killing an rcirc buffer."
   (when (eq major-mode 'rcirc-mode)
-    (rcirc-kill-buffer-hook-1)))
-(defun rcirc-kill-buffer-hook-1 ()
+    (rcirc-clean-up-buffer "Killed buffer")))
+
+(defun rcirc-change-major-mode-hook ()
+  "Part the channel when changing the major-mode."
+  (rcirc-clean-up-buffer "Changed major mode"))
+
+(defun rcirc-clean-up-buffer (reason)
   (let ((buffer (current-buffer)))
     (rcirc-clear-activity buffer)
-    (when (and rcirc-process
-	       (eq (process-status rcirc-process) 'open))
-      (with-rcirc-process-buffer rcirc-process
-	(setq rcirc-buffer-alist
-	      (rassq-delete-all buffer rcirc-buffer-alist)))
+    (when (and (rcirc-buffer-process)
+	       (eq (process-status (rcirc-buffer-process)) 'open))
+      (with-rcirc-server-buffer
+       (setq rcirc-buffer-alist
+	     (rassq-delete-all buffer rcirc-buffer-alist)))
       (rcirc-update-short-buffer-names)
       (if (rcirc-channel-p rcirc-target)
-	  (rcirc-send-string rcirc-process
-			     (concat "PART " rcirc-target
-				     " :Killed buffer"))
+	  (rcirc-send-string (rcirc-buffer-process)
+			     (concat "PART " rcirc-target " :" reason))
 	(when rcirc-target
-	  (rcirc-remove-nick-channel rcirc-process
-				     (rcirc-nick rcirc-process)
+	  (rcirc-remove-nick-channel (rcirc-buffer-process)
+				     (rcirc-buffer-nick)
 				     rcirc-target))))))
 
-(add-hook 'kill-buffer-hook 'rcirc-kill-buffer-hook)
-
 (defun rcirc-generate-new-buffer-name (process target)
   "Return a buffer name based on PROCESS and TARGET.
 This is used for the initial name given to IRC buffers."
@@ -756,7 +837,7 @@
   "Return the buffer associated with the PROCESS and TARGET.
 Create the buffer if it doesn't exist."
   (let ((buffer (rcirc-get-buffer process target)))
-    (if buffer
+    (if (and buffer (buffer-live-p buffer))
 	(with-current-buffer buffer
 	  (when (not rcirc-target)
  	    (setq rcirc-target target))
@@ -789,22 +870,20 @@
 		   (buffer-substring-no-properties start end)))))
     ;; process input
     (goto-char (point-max))
-    (let ((target (rcirc-buffer-target))
-	  (start rcirc-prompt-end-marker))
-      (when (not (equal 0 (- (point) start)))
-	;; delete a trailing newline
-	(when (eq (point) (point-at-bol))
-	  (delete-backward-char 1))
-	(let ((input (buffer-substring-no-properties
-		      rcirc-prompt-end-marker (point))))
-	  (dolist (line (split-string input "\n"))
-	    (rcirc-process-input-line rcirc-process target line))
-	  ;; add to input-ring
-	  (save-excursion
-	    (ring-insert rcirc-input-ring input)
-	    (setq rcirc-input-ring-index 0)))))))
+    (when (not (equal 0 (- (point) rcirc-prompt-end-marker)))
+      ;; delete a trailing newline
+      (when (eq (point) (point-at-bol))
+	(delete-backward-char 1))
+      (let ((input (buffer-substring-no-properties
+		    rcirc-prompt-end-marker (point))))
+	(dolist (line (split-string input "\n"))
+	  (rcirc-process-input-line line))
+	;; add to input-ring
+	(save-excursion
+	  (ring-insert rcirc-input-ring input)
+	  (setq rcirc-input-ring-index 0))))))
 
-(defun rcirc-process-input-line (process target line)
+(defun rcirc-process-input-line (line)
   (if (string-match "^/\\([^ ]+\\) ?\\(.*\\)$" line)
       (rcirc-process-command (match-string 1 line)
 			     (match-string 2 line)
@@ -813,27 +892,29 @@
 
 (defun rcirc-process-message (line)
   (if (not rcirc-target)
-      (message "Not joined")
+      (message "Not joined (no target)")
     (delete-region rcirc-prompt-end-marker (point))
-    (rcirc-send-message rcirc-process rcirc-target line)))
+    (rcirc-send-message (rcirc-buffer-process) rcirc-target line)
+    (setq rcirc-last-post-time (current-time))))
 
 (defun rcirc-process-command (command args line)
   (if (eq (aref command 0) ?/)
       ;; "//text" will send "/text" as a message
       (rcirc-process-message (substring line 1))
-    (let* ((fun (intern-soft (concat "rcirc-cmd-" command))))
+    (let ((fun (intern-soft (concat "rcirc-cmd-" command)))
+	  (process (rcirc-buffer-process)))
       (newline)
       (with-current-buffer (current-buffer)
 	(delete-region rcirc-prompt-end-marker (point))
 	(if (string= command "me")
-	    (rcirc-print rcirc-process (rcirc-nick rcirc-process)
+	    (rcirc-print process (rcirc-buffer-nick)
 			 "ACTION" rcirc-target args)
-	  (rcirc-print rcirc-process (rcirc-nick rcirc-process)
+	  (rcirc-print process (rcirc-buffer-nick)
 		       "COMMAND" rcirc-target line))
 	(set-marker rcirc-prompt-end-marker (point))
 	(if (fboundp fun)
-	    (funcall fun args rcirc-process rcirc-target)
-	  (rcirc-send-string rcirc-process
+	    (funcall fun args process rcirc-target)
+	  (rcirc-send-string process
 			     (concat command " " args)))))))
 
 (defvar rcirc-parent-buffer nil)
@@ -844,38 +925,41 @@
   (let ((pos (1+ (- (point) rcirc-prompt-end-marker))))
     (goto-char (point-max))
     (let ((text (buffer-substring rcirc-prompt-end-marker (point)))
-          (parent (buffer-name))
-          (process rcirc-process))
+          (parent (buffer-name)))
       (delete-region rcirc-prompt-end-marker (point))
       (setq rcirc-window-configuration (current-window-configuration))
       (pop-to-buffer (concat "*multiline " parent "*"))
-      (rcirc-multiline-edit-mode)
+      (funcall rcirc-multiline-major-mode)
+      (rcirc-multiline-minor-mode 1)
       (setq rcirc-parent-buffer parent)
-      (setq rcirc-process process)
       (insert text)
       (and (> pos 0) (goto-char pos))
       (message "Type C-c C-c to return text to %s, or C-c C-k to cancel" parent))))
 
-(define-derived-mode rcirc-multiline-edit-mode
-  text-mode "rcirc multi"
-  "Major mode for multiline edits
-\\{rcirc-multiline-edit-mode-map}"
-  (make-local-variable 'rcirc-parent-buffer)
-  (make-local-variable 'rcirc-process))
+(defvar rcirc-multiline-minor-mode-map (make-sparse-keymap)
+  "Keymap for multiline mode in rcirc.")
+(define-key rcirc-multiline-minor-mode-map 
+  (kbd "C-c C-c") 'rcirc-multiline-minor-submit)
+(define-key rcirc-multiline-minor-mode-map
+  (kbd "C-x C-s") 'rcirc-multiline-minor-submit)
+(define-key rcirc-multiline-minor-mode-map
+  (kbd "C-c C-k") 'rcirc-multiline-minor-cancel)
+(define-key rcirc-multiline-minor-mode-map
+  (kbd "ESC ESC ESC") 'rcirc-multiline-minor-cancel)
 
-(define-key rcirc-multiline-edit-mode-map
-  (kbd "C-c C-c") 'rcirc-multiline-edit-submit)
-(define-key rcirc-multiline-edit-mode-map
-  (kbd "C-x C-s") 'rcirc-multiline-edit-submit)
-(define-key rcirc-multiline-edit-mode-map
-  (kbd "C-c C-k") 'rcirc-multiline-edit-cancel)
-(define-key rcirc-multiline-edit-mode-map
-  (kbd "ESC ESC ESC") 'rcirc-multiline-edit-cancel)
+(define-minor-mode rcirc-multiline-minor-mode
+  "Minor mode for editing multiple lines in rcirc."
+  :init-value nil
+  :lighter " rcirc-mline"
+  :keymap rcirc-multiline-minor-mode-map
+  :global nil
+  :group 'rcirc
+  (make-local-variable 'rcirc-parent-buffer)
+  (put 'rcirc-parent-buffer 'permanent-local t))
 
-(defun rcirc-multiline-edit-submit ()
+(defun rcirc-multiline-minor-submit ()
   "Send the text in buffer back to parent buffer."
   (interactive)
-  (assert (eq major-mode 'rcirc-multiline-edit-mode))
   (assert rcirc-parent-buffer)
   (untabify (point-min) (point-max))
   (let ((text (buffer-substring (point-min) (point-max)))
@@ -888,10 +972,9 @@
     (set-window-configuration rcirc-window-configuration)
     (goto-char (+ rcirc-prompt-end-marker (1- pos)))))
 
-(defun rcirc-multiline-edit-cancel ()
+(defun rcirc-multiline-minor-cancel ()
   "Cancel the multiline edit."
   (interactive)
-  (assert (eq major-mode 'rcirc-multiline-edit-mode))
   (kill-buffer (current-buffer))
   (set-window-configuration rcirc-window-configuration))
 
@@ -903,7 +986,7 @@
       (if (and buffer
 	       (with-current-buffer buffer
 		 (and (eq major-mode 'rcirc-mode)
-		      (eq rcirc-process process))))
+		      (eq (rcirc-buffer-process) process))))
 	  buffer
 	(process-buffer process)))))
 
@@ -932,8 +1015,7 @@
   %fs       Following text uses the face `rcirc-server'
   %f[FACE]  Following text uses the face FACE
   %f-       Following text uses the default face
-  %%        A literal `%' character
-"
+  %%        A literal `%' character"
   :type '(alist :key-type (choice (string :tag "Type")
 				  (const :tag "Default" t))
 		:value-type string)
@@ -963,8 +1045,8 @@
 		   "%")
 		  ((or (eq key ?n) (eq key ?N))
 		   ;; %n/%N -- nick
-		   (let ((nick (concat (if (string= (with-rcirc-process-buffer
-							process rcirc-server)
+		   (let ((nick (concat (if (string= (with-rcirc-process-buffer process
+						      rcirc-server)
 						    sender)
 					   ""
 					 sender)
@@ -1037,13 +1119,18 @@
 
 (defvar rcirc-activity-type nil)
 (make-variable-buffer-local 'rcirc-activity-type)
+(defvar rcirc-last-sender nil)
+(make-variable-buffer-local 'rcirc-last-sender)
+(defvar rcirc-gray-toggle nil)
+(make-variable-buffer-local 'rcirc-gray-toggle)
 (defun rcirc-print (process sender response target text &optional activity)
   "Print TEXT in the buffer associated with TARGET.
 Format based on SENDER and RESPONSE.  If ACTIVITY is non-nil,
 record activity."
+  (or text (setq text ""))
   (unless (or (member sender rcirc-ignore-list)
 	      (member (with-syntax-table rcirc-nick-syntax-table
-			(when (string-match "^\\([^/]\\w*\\)[:,]" text)
+			(when (string-match "^\\([^/]\\w*\\)\\b" text)
 			  (match-string 1 text))) rcirc-ignore-list))
     (let* ((buffer (rcirc-target-buffer process sender response target text))
 	   (inhibit-read-only t))
@@ -1054,8 +1141,7 @@
 
 	  (unless (string= sender (rcirc-nick process))
 	    ;; only decode text from other senders, not ours
-	    (setq text (decode-coding-string (or text "")
-					     buffer-file-coding-system))
+	    (setq text (decode-coding-string text rcirc-decode-coding-system))
 	    ;; mark the line with overlay arrow
 	    (unless (or (marker-position overlay-arrow-position)
 			(get-buffer-window (current-buffer)))
@@ -1142,7 +1228,8 @@
 		      nick-match)
 	      (rcirc-record-activity
 	       (current-buffer)
-	       (when (or nick-match (not (rcirc-channel-p rcirc-target)))
+	       (when (or nick-match (and (not (rcirc-channel-p rcirc-target))
+					 (not rcirc-low-priority-flag)))
 		 'nick)))))
 
 	(sit-for 0)			; displayed text before hook
@@ -1215,18 +1302,21 @@
           (puthash nick newchans rcirc-nick-table)
         (remhash nick rcirc-nick-table)))))
 
-(defun rcirc-channel-nicks (process channel)
-  "Return the list of nicks in CHANNEL sorted by last activity."
-  (with-rcirc-process-buffer process
-    (let (nicks)
-      (maphash
-       (lambda (k v)
-         (let ((record (assoc-string channel v t)))
-           (if record
-               (setq nicks (cons (cons k (cdr record)) nicks)))))
-       rcirc-nick-table)
-      (mapcar (lambda (x) (car x))
-              (sort nicks (lambda (x y) (time-less-p (cdr y) (cdr x))))))))
+(defun rcirc-channel-nicks (process target)
+  "Return the list of nicks associated with TARGET sorted by last activity."
+  (when target
+    (if (rcirc-channel-p target)
+	(with-rcirc-process-buffer process
+	  (let (nicks)
+	    (maphash
+	     (lambda (k v)
+	       (let ((record (assoc-string target v t)))
+		 (if record
+		     (setq nicks (cons (cons k (cdr record)) nicks)))))
+	     rcirc-nick-table)
+	    (mapcar (lambda (x) (car x))
+		    (sort nicks (lambda (x y) (time-less-p (cdr y) (cdr x)))))))
+      (list target))))
 
 (defun rcirc-ignore-update-automatic (nick)
   "Remove NICK from `rcirc-ignore-list'
@@ -1256,15 +1346,23 @@
   (or global-mode-string (setq global-mode-string '("")))
   ;; toggle the mode-line channel indicator
   (if rcirc-track-minor-mode
-      (and (not (memq 'rcirc-activity-string global-mode-string))
-	   (setq global-mode-string
-		 (append global-mode-string '(rcirc-activity-string))))
+      (progn
+	(and (not (memq 'rcirc-activity-string global-mode-string))
+	     (setq global-mode-string
+		   (append global-mode-string '(rcirc-activity-string))))
+	(add-hook 'window-configuration-change-hook
+		  'rcirc-window-configuration-change))
     (setq global-mode-string 
-	  (delete 'rcirc-activity-string global-mode-string))))
+	  (delete 'rcirc-activity-string global-mode-string))
+    (remove-hook 'window-configuration-change-hook
+		 'rcirc-window-configuration-change)))
 
 (or (assq 'rcirc-ignore-buffer-activity-flag minor-mode-alist)
     (setq minor-mode-alist
           (cons '(rcirc-ignore-buffer-activity-flag " Ignore") minor-mode-alist)))
+(or (assq 'rcirc-low-priority-flag minor-mode-alist)
+    (setq minor-mode-alist
+          (cons '(rcirc-low-priority-flag " LowPri") minor-mode-alist)))
 
 (defun rcirc-toggle-ignore-buffer-activity ()
   "Toggle the value of `rcirc-ignore-buffer-activity-flag'."
@@ -1276,6 +1374,16 @@
 	     "Notice activity in this buffer"))
   (force-mode-line-update))
 
+(defun rcirc-toggle-low-priority ()
+  "Toggle the value of `rcirc-ignore-buffer-activity-flag'."
+  (interactive)
+  (setq rcirc-low-priority-flag
+	(not rcirc-low-priority-flag))
+  (message (if rcirc-low-priority-flag
+	       "Activity in this buffer is low priority"
+	     "Activity in this buffer is normal priority"))
+  (force-mode-line-update))
+
 (defvar rcirc-switch-to-buffer-function 'switch-to-buffer
   "Function to use when switching buffers.
 Possible values are `switch-to-buffer', `pop-to-buffer', and
@@ -1284,7 +1392,7 @@
 (defun rcirc-switch-to-server-buffer ()
   "Switch to the server buffer associated with current channel buffer."
   (interactive)
-  (funcall rcirc-switch-to-buffer-function (process-buffer rcirc-process)))
+  (funcall rcirc-switch-to-buffer-function rcirc-server-buffer))
 
 (defun rcirc-jump-to-first-unread-line ()
   "Move the point to the first unread line in this buffer."
@@ -1296,27 +1404,35 @@
   "The buffer to switch to when there is no more activity.")
 
 (defun rcirc-next-active-buffer (arg)
-  "Go to the ARGth rcirc buffer with activity.
+  "Go to the next rcirc buffer with activity.
+With prefix ARG, go to the next low priority buffer with activity.
 The function given by `rcirc-switch-to-buffer-function' is used to
 show the buffer."
-  (interactive "p")
-  (if rcirc-activity
-      (progn
-        (unless (eq major-mode 'rcirc-mode)
-          (setq rcirc-last-non-irc-buffer (current-buffer)))
-        (if (and (> arg 0)
-                 (<= arg (length rcirc-activity)))
-            (funcall rcirc-switch-to-buffer-function
-		     (nth (1- arg) rcirc-activity))
-          (message "Invalid arg: %d" arg)))
-    (if (eq major-mode 'rcirc-mode)
-        (if (not (and rcirc-last-non-irc-buffer
-                      (buffer-live-p rcirc-last-non-irc-buffer)))
-            (message "No IRC activity.  Start something.")
-	  (message "No more IRC activity.  Go back to work.")
-          (funcall rcirc-switch-to-buffer-function rcirc-last-non-irc-buffer)
-          (setq rcirc-last-non-irc-buffer nil))
-      (message "No IRC activity."))))
+  (interactive "P")
+  (let* ((pair (rcirc-split-activity rcirc-activity))
+	 (lopri (car pair))
+	 (hipri (cdr pair)))		
+    (if (or (and (not arg) hipri)
+	    (and arg lopri))
+	(progn
+	  (unless (eq major-mode 'rcirc-mode)
+	    (setq rcirc-last-non-irc-buffer (current-buffer)))
+	  (funcall rcirc-switch-to-buffer-function
+		   (car (if arg lopri hipri))))
+      (if (eq major-mode 'rcirc-mode)
+	  (if (not (and rcirc-last-non-irc-buffer
+			(buffer-live-p rcirc-last-non-irc-buffer)))
+	      (message "No IRC activity.  Start something.")
+	    (message "No more IRC activity.  Go back to work.")
+	    (funcall rcirc-switch-to-buffer-function rcirc-last-non-irc-buffer)
+	    (setq rcirc-last-non-irc-buffer nil))
+	(message (concat 
+		  "No IRC activity."
+		  (when lopri
+		    (concat 
+		     "  Type C-u "
+		     (key-description (this-command-keys))
+		     " for low priority activity."))))))))
 
 (defvar rcirc-activity-hooks nil
   "Hook to be run when there is channel activity.
@@ -1325,13 +1441,18 @@
 activity.  Only run if the buffer is not visible and
 `rcirc-ignore-buffer-activity-flag' is non-nil.")
 
-(defun rcirc-record-activity (buffer type)
+(defun rcirc-record-activity (buffer &optional type)
   "Record BUFFER activity with TYPE."
   (with-current-buffer buffer
     (when (not (get-buffer-window (current-buffer) t))
-      (add-to-list 'rcirc-activity (current-buffer))
+      (setq rcirc-activity
+	    (sort (add-to-list 'rcirc-activity (current-buffer))
+		  (lambda (b1 b2)
+		    (let ((t1 (with-current-buffer b1 rcirc-last-post-time))
+			  (t2 (with-current-buffer b2 rcirc-last-post-time)))
+		      (time-less-p t2 t1)))))
       (if (not rcirc-activity-type)
-          (setq rcirc-activity-type type))
+	  (setq rcirc-activity-type type))
       (rcirc-update-activity-string)))
   (run-hook-with-args 'rcirc-activity-hooks buffer))
 
@@ -1341,22 +1462,45 @@
   (with-current-buffer buffer
     (setq rcirc-activity-type nil)))
 
+(defun rcirc-split-activity (activity)
+  "Return a cons cell with ACTIVITY split into (lopri . hipri)."
+  (let (lopri hipri)
+    (dolist (buf rcirc-activity)
+      (with-current-buffer buf
+	(if (and rcirc-low-priority-flag
+		 (not (eq rcirc-activity-type 'nick)))
+	    (add-to-list 'lopri buf t)
+	  (add-to-list 'hipri buf t))))
+    (cons lopri hipri)))
+
 ;; TODO: add mouse properties
 (defun rcirc-update-activity-string ()
   "Update mode-line string."
-  (setq rcirc-activity-string
-	(if (not rcirc-activity)
-	       ""
-	  (concat "-["
-		  (mapconcat
-		   (lambda (b)
-		     (let ((s (rcirc-short-buffer-name b)))
-		       (with-current-buffer b
-			 (if (not (eq rcirc-activity-type 'nick))
-			     s
-			   (rcirc-facify s 'rcirc-mode-line-nick)))))
-		   rcirc-activity ",")
-		  "]-"))))
+  (let* ((pair (rcirc-split-activity rcirc-activity))
+	 (lopri (car pair))
+	 (hipri (cdr pair)))
+    (setq rcirc-activity-string
+	  (if (or hipri lopri)
+	      (concat "-"
+		      (and hipri "[")
+		      (rcirc-activity-string hipri)
+		      (and hipri lopri ",")
+		      (and lopri
+			   (concat "("
+				   (rcirc-activity-string lopri)
+				   ")"))
+		      (and hipri "]")
+		      "-")
+	    "-[]-"))))
+
+(defun rcirc-activity-string (buffers)
+  (mapconcat (lambda (b)
+	       (let ((s (rcirc-short-buffer-name b)))
+		 (with-current-buffer b
+		   (if (not (eq rcirc-activity-type 'nick))
+		       s
+		     (rcirc-facify s 'rcirc-mode-line-nick)))))
+	     buffers ","))
 
 (defun rcirc-short-buffer-name (buffer)
   "Return a short name for BUFFER to use in the modeline indicator."
@@ -1370,9 +1514,11 @@
   (let ((current-now-hidden t))
     (walk-windows (lambda (w)
 		    (let ((buf (window-buffer w)))
-		      (rcirc-clear-activity buf)
-		      (when (eq buf rcirc-current-buffer)
-			(setq current-now-hidden nil)))))
+		      (when (eq major-mode 'rcirc-mode)
+			(rcirc-clear-activity buf)
+			(when (eq buf rcirc-current-buffer)
+			  (setq current-now-hidden nil))))))
+    ;; add overlay arrow if the buffer isn't displayed
     (when (and rcirc-current-buffer current-now-hidden)
       (with-current-buffer rcirc-current-buffer
 	(when (eq major-mode 'rcirc-mode)
@@ -1395,8 +1541,9 @@
 				    rcirc-buffer-alist))
 				(rcirc-process-list)))))
     (dolist (i (rcirc-abbreviate bufalist))
-      (with-current-buffer (cdr i)
-	(setq rcirc-short-buffer-name (car i))))))
+      (when (buffer-live-p (cdr i))
+	(with-current-buffer (cdr i)
+	  (setq rcirc-short-buffer-name (car i)))))))
 
 (defun rcirc-abbreviate (pairs)
   (apply 'append (mapcar 'rcirc-rebuild-tree (rcirc-make-trees pairs))))
@@ -1451,11 +1598,10 @@
   "Define a command."
   `(defun ,(intern (concat "rcirc-cmd-" (symbol-name command)))
      (,@argument &optional process target)
-     ,(concat docstring "\n\nNote: If PROCESS or TARGET are nil, the values of"
-              "\nbuffer local variables `rcirc-process' and `rcirc-target',"
-              "\nwill be used.")
+     ,(concat docstring "\n\nNote: If PROCESS or TARGET are nil, the values given"
+              "\nby `rcirc-buffer-process' and `rcirc-target' will be used.")
      ,interactive-form
-     (let ((process (or process rcirc-process))
+     (let ((process (or process (rcirc-buffer-process)))
            (target (or target rcirc-target)))
        ,@body)))
 
@@ -1465,8 +1611,8 @@
   (if (null message)
       (progn
         (setq target (completing-read "Message nick: "
-                                      (with-rcirc-process-buffer rcirc-process
-                                        rcirc-nick-table)))
+                                      (with-rcirc-server-buffer 
+					rcirc-nick-table)))
         (when (> (length target) 0)
           (setq message (read-string (format "Message %s: " target)))
           (when (> (length message) 0)
@@ -1480,8 +1626,7 @@
 (defun-rcirc-command query (nick)
   "Open a private chat buffer to NICK."
   (interactive (list (completing-read "Query nick: "
-                                      (with-rcirc-process-buffer rcirc-process
-                                        rcirc-nick-table))))
+                                      (with-rcirc-server-buffer rcirc-nick-table))))
   (let ((existing-buffer (rcirc-get-buffer process nick)))
     (switch-to-buffer (or existing-buffer
 			  (rcirc-get-buffer-create process nick)))
@@ -1493,9 +1638,9 @@
   (interactive "sJoin channel: ")
   (let ((buffer (rcirc-get-buffer-create process
                                          (car (split-string channel)))))
+    (rcirc-send-string process (concat "JOIN " channel))
     (when (not (eq (selected-window) (minibuffer-window)))
-      (funcall rcirc-switch-to-buffer-function buffer))
-    (rcirc-send-string process (concat "JOIN " channel))))
+      (funcall rcirc-switch-to-buffer-function buffer))))
 
 (defun-rcirc-command part (channel)
   "Part CHANNEL."
@@ -1544,8 +1689,7 @@
   "Request information from server about NICK."
   (interactive (list
                 (completing-read "Whois: "
-                                 (with-rcirc-process-buffer rcirc-process
-                                   rcirc-nick-table))))
+                                 (with-rcirc-server-buffer rcirc-nick-table))))
   (rcirc-send-string process (concat "WHOIS " nick)))
 
 (defun-rcirc-command mode (args)
@@ -1573,8 +1717,9 @@
   "Kick NICK from current channel."
   (interactive (list
                 (concat (completing-read "Kick nick: "
-                                         (rcirc-channel-nicks rcirc-process
-                                                              rcirc-target))
+                                         (rcirc-channel-nicks 
+					  (rcirc-buffer-process)
+					  rcirc-target))
                         (read-from-minibuffer "Kick reason: "))))
   (let* ((arglist (split-string arg))
          (argstring (concat (car arglist) " :"
@@ -1768,7 +1913,7 @@
 			 ((string-match "^\\[\\(#[^ ]+\\)\\]" message)
 			  (match-string 1 message))
 			 (sender
-			  (if (string= sender (rcirc-server process))
+			  (if (string= sender (rcirc-server-name process))
 			      nil	; server notice
 			    sender)))
                  message t))))
@@ -1782,19 +1927,14 @@
     (rcirc-print process sender "JOIN" channel "")
 
     ;; print in private chat buffer if it exists
-    (when (rcirc-get-buffer rcirc-process sender)
+    (when (rcirc-get-buffer (rcirc-buffer-process) sender)
       (rcirc-print process sender "JOIN" sender channel))
 
     (rcirc-put-nick-channel process sender channel)))
 
 ;; PART and KICK are handled the same way
 (defun rcirc-handler-PART-or-KICK (process response channel sender nick args)
-  (rcirc-print process sender response channel (concat channel " " args))
-
-  ;; print in private chat buffer if it exists
-  (when (rcirc-get-buffer rcirc-process nick)
-    (rcirc-print process sender response nick (concat channel " " args)))
-
+  (rcirc-ignore-update-automatic nick)
   (if (not (string= nick (rcirc-nick process)))
       ;; this is someone else leaving
       (rcirc-remove-nick-channel process nick channel)
@@ -1810,14 +1950,27 @@
 	  (setq rcirc-target nil))))))
 
 (defun rcirc-handler-PART (process sender args text)
-  (rcirc-ignore-update-automatic sender)
-  (rcirc-handler-PART-or-KICK process "PART"
-                              (car args) sender sender
-                              (cadr args)))
+  (let* ((channel (car args))
+	 (reason (cadr args))
+	 (message (concat channel " " reason)))
+    (rcirc-print process sender "PART" channel message)
+    ;; print in private chat buffer if it exists
+    (when (rcirc-get-buffer (rcirc-buffer-process) sender)
+      (rcirc-print process sender "PART" sender message))
+
+    (rcirc-handler-PART-or-KICK process "PART" channel sender sender reason)))
 
 (defun rcirc-handler-KICK (process sender args text)
-  (rcirc-handler-PART-or-KICK process "KICK" (car args) sender (cadr args)
-                              (caddr args)))
+  (let* ((channel (car args))
+	 (nick (cadr args))
+	 (reason (caddr args))
+	 (message (concat nick " " channel " " reason)))
+    (rcirc-print process sender "KICK" channel message t)
+    ;; print in private chat buffer if it exists
+    (when (rcirc-get-buffer (rcirc-buffer-process) nick)
+      (rcirc-print process sender "KICK" nick message))
+
+    (rcirc-handler-PART-or-KICK process "KICK" channel sender nick reason)))
 
 (defun rcirc-handler-QUIT (process sender args text)
   (rcirc-ignore-update-automatic sender)
@@ -1826,7 +1979,7 @@
 	(rcirc-nick-channels process sender))
 
   ;; print in private chat buffer if it exists
-  (when (rcirc-get-buffer rcirc-process sender)
+  (when (rcirc-get-buffer (rcirc-buffer-process) sender)
     (rcirc-print process sender "QUIT" sender (apply 'concat args)))
 
   (rcirc-nick-remove process sender))
@@ -1875,6 +2028,21 @@
     (with-current-buffer (rcirc-get-buffer process (car args))
       (setq rcirc-topic topic))))
 
+(defvar rcirc-nick-away-alist nil)
+(defun rcirc-handler-301 (process sender args text)
+  "RPL_AWAY"
+  (let* ((nick (cadr args))
+	 (rec (assoc-string nick rcirc-nick-away-alist))
+	 (away-message (caddr args)))
+    (when (or (not rec)
+	      (not (string= (cdr rec) away-message)))
+      ;; away message has changed
+      (rcirc-handler-generic process "AWAY" nick (cdr args) text)
+      (if rec
+	  (setcdr rec away-message)
+	(setq rcirc-nick-away-alist (cons (cons nick away-message)
+					  rcirc-nick-away-alist))))))
+
 (defun rcirc-handler-332 (process sender args text)
   "RPL_TOPIC"
   (let ((buffer (or (rcirc-get-buffer process (cadr args))
@@ -1948,9 +2116,10 @@
   "Send authentication to process associated with current buffer.
 Passwords are stored in `rcirc-authinfo' (which see)."
   (interactive)
-  (with-rcirc-process-buffer rcirc-process
+  (with-rcirc-server-buffer
     (dolist (i rcirc-authinfo)
-      (let ((server (car i))
+      (let ((process (rcirc-buffer-process))
+	    (server (car i))
 	    (nick (caddr i))
 	    (method (cadr i))
 	    (args (cdddr i)))
@@ -1958,19 +2127,19 @@
 		   (string-match nick rcirc-nick))
 	  (cond ((equal method 'nickserv)
 		 (rcirc-send-string
-		  rcirc-process
+		  process
 		  (concat
 		   "PRIVMSG nickserv :identify "
 		   (car args))))
 		((equal method 'chanserv)
 		 (rcirc-send-string
-		  rcirc-process
+		  process
 		  (concat
 		   "PRIVMSG chanserv :identify "
 		   (cadr args) " " (car args))))
 		((equal method 'bitlbee)
 		 (rcirc-send-string
-		  rcirc-process
+		  process
 		  (concat "PRIVMSG &bitlbee :identify " (car args))))
 		(t
 		 (message "No %S authentication method defined"
@@ -2102,6 +2271,7 @@
   '((t (:bold t)))
   "The face used indicate activity directed at you."
   :group 'rcirc-faces)
+
 
 ;; When using M-x flyspell-mode, only check words after the prompt
 (put 'rcirc-mode 'flyspell-mode-predicate 'rcirc-looking-at-input)
--- a/lisp/pgg-gpg.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/pgg-gpg.el	Sun Apr 09 00:38:22 2006 +0000
@@ -4,7 +4,8 @@
 ;;   2005, 2006 Free Software Foundation, Inc.
 
 ;; Author: Daiki Ueno <ueno@unixuser.org>
-;; Symmetric encryption support added by: Sascha Wilde <wilde@sha-bang.de>
+;; Symmetric encryption and gpg-agent support added by: 
+;;   Sascha Wilde <wilde@sha-bang.de>
 ;; Created: 1999/10/28
 ;; Keywords: PGP, OpenPGP, GnuPG
 
@@ -28,6 +29,7 @@
 ;;; Code:
 
 (eval-when-compile
+  (require 'cl)				; for gpg macros
   (require 'pgg))
 
 (defgroup pgg-gpg ()
@@ -58,183 +60,85 @@
 (defvar pgg-gpg-user-id nil
   "GnuPG ID of your default identity.")
 
-(defvar pgg-gpg-user-id-alist nil
-  "An alist mapping from key ID to user ID.")
-
-(defvar pgg-gpg-read-point nil)
-(defvar pgg-gpg-output-file-name nil)
-(defvar pgg-gpg-pending-status-list nil)
-(defvar pgg-gpg-key-id nil)
-(defvar pgg-gpg-passphrase nil)
-(defvar pgg-gpg-debug nil)
-
-(defun pgg-gpg-start-process (args)
-  (let* ((output-file-name (pgg-make-temp-file "pgg-output"))
+(defun pgg-gpg-process-region (start end passphrase program args)
+  (let* ((use-agent (pgg-gpg-use-agent-p)) 
+	 (output-file-name (pgg-make-temp-file "pgg-output"))
 	 (args
-	  (append (list "--no-tty"
-			"--status-fd" "1"
-			"--command-fd" "0"
-			"--yes" ; overwrite
-			"--output" output-file-name)
-		  (if pgg-gpg-use-agent '("--use-agent"))
-		  pgg-gpg-extra-args
-		  args))
-	 (coding-system-for-write 'binary)
-	 (process-connection-type nil)
+	  `("--status-fd" "2"
+	    ,@(if use-agent '("--use-agent")
+		(if passphrase '("--passphrase-fd" "0")))
+	    "--yes" ; overwrite
+	    "--output" ,output-file-name
+	    ,@pgg-gpg-extra-args ,@args))
+	 (output-buffer pgg-output-buffer)
+	 (errors-buffer pgg-errors-buffer)
 	 (orig-mode (default-file-modes))
-	 default-enable-multibyte-characters
-	 (buffer (generate-new-buffer " *pgg-gpg*"))
-	 process)
-    (with-current-buffer buffer
-      (make-local-variable 'pgg-gpg-read-point)
-      (setq pgg-gpg-read-point (point-min))
-      (make-local-variable 'pgg-gpg-output-file-name)
-      (setq pgg-gpg-output-file-name output-file-name)
-      (make-local-variable 'pgg-gpg-pending-status-list)
-      (setq pgg-gpg-pending-status-list nil)
-      (make-local-variable 'pgg-gpg-key-id)
-      (setq pgg-gpg-key-id nil)
-      (make-local-variable 'pgg-gpg-passphrase)
-      (setq pgg-gpg-passphrase nil))
+	 (process-connection-type nil)
+	 exit-status)
+    (with-current-buffer (get-buffer-create errors-buffer)
+      (buffer-disable-undo)
+      (erase-buffer))
     (unwind-protect
 	(progn
 	  (set-default-file-modes 448)
-	  (setq process
-		(apply #'start-process "pgg-gpg" buffer pgg-gpg-program args)))
-      (set-default-file-modes orig-mode))
-    (set-process-filter process #'pgg-gpg-process-filter)
-    (set-process-sentinel process #'pgg-gpg-process-sentinel)
-    process))
-
-(defun pgg-gpg-process-filter (process input)
-  (save-excursion
-    (if pgg-gpg-debug
-	(save-excursion
-	  (set-buffer (get-buffer-create  " *pgg-gpg-debug*"))
-	  (goto-char (point-max))
-	  (insert input)))
-    (set-buffer (process-buffer process))
-    (goto-char (point-max))
-    (insert input)
-    (goto-char pgg-gpg-read-point)
-    (beginning-of-line)
-    (while (looking-at ".*\n")		;the input line is finished
-      (save-excursion
-	(if (looking-at "\\[GNUPG:] \\([A-Z_]+\\)\\>.*")
-	    (let* ((status (match-string 1))
-		   (symbol (intern-soft (concat "pgg-gpg-status-" status)))
-		   (entry (member status pgg-gpg-pending-status-list)))
-	      (if entry
-		  (setq pgg-gpg-pending-status-list
-			(delq (car entry)
-			      pgg-gpg-pending-status-list)))
-	      (if (and symbol
-		       (fboundp symbol))
-		  (funcall symbol process (buffer-substring (match-beginning 1)
-							    (match-end 0)))))))
-      (forward-line))
-    (setq pgg-gpg-read-point (point))))
-
-(defun pgg-gpg-process-sentinel (process status)
-  (set-process-filter process nil)
-  (save-excursion
-    ;; Copy the contents of process-buffer to pgg-errors-buffer.
-    (set-buffer (get-buffer-create pgg-errors-buffer))
-    (buffer-disable-undo)
-    (erase-buffer)
-    (when (buffer-live-p (process-buffer process))
-      (insert-buffer-substring (process-buffer process))
-      (goto-char (point-min))
-      (delete-matching-lines "^\\[GNUPG:] ")
-      (goto-char (point-min))
-      (while (re-search-forward "^gpg: " nil t)
-	(replace-match "")))
-    ;; Read the contents of the output file to pgg-output-buffer.
-    (set-buffer (get-buffer-create pgg-output-buffer))
-    (buffer-disable-undo)
-    (erase-buffer)
-    (if (and (equal status "finished\n")
-	     (buffer-live-p (process-buffer process)))
-	(let ((output-file-name (with-current-buffer (process-buffer process)
-				  pgg-gpg-output-file-name)))
-	  (when (file-exists-p output-file-name)
-	    (let ((coding-system-for-read (if pgg-text-mode
-					      'raw-text
-					    'binary)))
-	      (insert-file-contents output-file-name))
-	    (delete-file output-file-name))))))
+	  (let ((coding-system-for-write 'binary)
+		(input (buffer-substring-no-properties start end))
+		(default-enable-multibyte-characters nil))
+	    (with-temp-buffer
+	      (when passphrase
+		(insert passphrase "\n"))
+	      (insert input)
+	      (setq exit-status
+		    (apply #'call-process-region (point-min) (point-max) program
+			   nil errors-buffer nil args))))
+	  (with-current-buffer (get-buffer-create output-buffer)
+	    (buffer-disable-undo)
+	    (erase-buffer)
+	    (if (file-exists-p output-file-name)
+		(let ((coding-system-for-read (if pgg-text-mode
+						  'raw-text
+						'binary)))
+		  (insert-file-contents output-file-name)))
+	    (set-buffer errors-buffer)
+	    (if (not (equal exit-status 0))
+		(insert (format "\n%s exited abnormally: '%s'\n"
+				program exit-status)))))
+      (if (file-exists-p output-file-name)
+	  (delete-file output-file-name))
+      (set-default-file-modes orig-mode))))
 
-(defun pgg-gpg-wait-for-status (process status-list)
-  (with-current-buffer (process-buffer process)
-    (setq pgg-gpg-pending-status-list status-list)
-    (while (and (eq (process-status process) 'run)
-		pgg-gpg-pending-status-list)
-      (accept-process-output process 1))))
-
-(defun pgg-gpg-wait-for-completion (process &optional status-list)
-  (process-send-eof process)
-  (while (eq (process-status process) 'run)
-    (sit-for 0.1))
-  (save-excursion
-    (set-buffer (process-buffer process))
-    (setq status-list (copy-sequence status-list))
-    (let ((pointer status-list))
-      (while pointer
-	(goto-char (point-min))
-	(unless (re-search-forward
-		 (concat "^\\[GNUPG:] " (car pointer) "\\>")
-		 nil t)
-	  (setq status-list (delq (car pointer) status-list)))
-	(setq pointer (cdr pointer))))
-    (kill-buffer (process-buffer process))
-    status-list))
-
-(defun pgg-gpg-status-USERID_HINT (process line)
-  (if (string-match "\\`USERID_HINT \\([^ ]+\\) \\(.*\\)" line)
-      (let* ((key-id (match-string 1 line))
-	     (user-id (match-string 2 line))
-	     (entry (assoc key-id pgg-gpg-user-id-alist)))
-	(if entry
-	    (setcdr entry user-id)
-	  (setq pgg-gpg-user-id-alist (cons (cons key-id user-id)
-					    pgg-gpg-user-id-alist))))))
+(defun pgg-gpg-possibly-cache-passphrase (passphrase &optional key notruncate)
+  (if (and passphrase
+	   pgg-cache-passphrase
+	   (progn
+	     (goto-char (point-min))
+	     (re-search-forward "^\\[GNUPG:] \\(GOOD_PASSPHRASE\\>\\)\\|\\(SIG_CREATED\\)" nil t)))
+      (pgg-add-passphrase-to-cache
+       (or key
+	   (progn
+	     (goto-char (point-min))
+	     (if (re-search-forward
+		  "^\\[GNUPG:] NEED_PASSPHRASE\\(_PIN\\)? \\w+ ?\\w*" nil t)
+		 (substring (match-string 0) -8))))
+       passphrase
+       notruncate)))
 
-(defun pgg-gpg-status-NEED_PASSPHRASE (process line)
-  (if (string-match "\\`NEED_PASSPHRASE \\([^ ]+\\)" line)
-      (setq pgg-gpg-key-id (match-string 1 line))))
-
-(defun pgg-gpg-status-NEED_PASSPHRASE_SYM (process line)
-  (setq pgg-gpg-key-id 'SYM))
-
-(defun pgg-gpg-status-NEED_PASSPHRASE_PIN (process line)
-  (setq pgg-gpg-key-id 'PIN))
+(defvar pgg-gpg-all-secret-keys 'unknown)
 
-(defun pgg-gpg-status-GET_HIDDEN (process line)
-  (let ((entry (assoc pgg-gpg-key-id pgg-gpg-user-id-alist)))
-    (if (setq pgg-gpg-passphrase
-	      (if (eq pgg-gpg-key-id 'SYM)
-		  (pgg-read-passphrase
-		   "GnuPG passphrase for symmetric encryption: ")
-		(pgg-read-passphrase
-		 (format "GnuPG passphrase for %s: "
-			 (if entry
-			     (cdr entry)
-			   pgg-gpg-key-id))
-		 (if (eq pgg-gpg-key-id 'PIN)
-		     "PIN"
-		   pgg-gpg-key-id))))
-	(process-send-string process (concat pgg-gpg-passphrase "\n")))))
-
-(defun pgg-gpg-status-GOOD_PASSPHRASE (process line)
-  (when (and pgg-gpg-passphrase
-	     (stringp pgg-gpg-key-id))
-    (pgg-add-passphrase-to-cache pgg-gpg-key-id pgg-gpg-passphrase)
-    (setq pgg-gpg-passphrase nil)))
-
-(defun pgg-gpg-status-BAD_PASSPHRASE (process line)
-  (when pgg-gpg-passphrase
-    (fillarray pgg-gpg-passphrase 0)
-    (setq pgg-gpg-passphrase nil)))
+(defun pgg-gpg-lookup-all-secret-keys ()
+  "Return all secret keys present in secret key ring."
+  (when (eq pgg-gpg-all-secret-keys 'unknown)
+    (setq pgg-gpg-all-secret-keys '())
+    (let ((args (list "--with-colons" "--no-greeting" "--batch"
+		      "--list-secret-keys")))
+      (with-temp-buffer
+	(apply #'call-process pgg-gpg-program nil t nil args)
+	(goto-char (point-min))
+	(while (re-search-forward
+		"^\\(sec\\|pub\\):[^:]*:[^:]*:[^:]*:\\([^:]*\\)" nil t)
+	  (push (substring (match-string 2) 8)
+		pgg-gpg-all-secret-keys)))))
+  pgg-gpg-all-secret-keys)
 
 (defun pgg-gpg-lookup-key (string &optional type)
   "Search keys associated with STRING."
@@ -248,15 +152,52 @@
 			     nil t)
 	  (substring (match-string 2) 8)))))
 
+(defun pgg-gpg-lookup-key-owner (string &optional all)
+  "Search keys associated with STRING and return owner of identified key.
+
+The value may be just the bare key id, or it may be a combination of the
+user name associated with the key and the key id, with the key id enclosed
+in \"<...>\" angle brackets.
+
+Optional ALL non-nil means search all keys, including secret keys."
+  (let ((args (list "--with-colons" "--no-greeting" "--batch"
+		    (if all "--list-secret-keys" "--list-keys")
+		    string))
+	(key-regexp (concat "^\\(sec\\|pub\\)"
+			    ":[^:]*:[^:]*:[^:]*:\\([^:]*\\):[^:]*"
+			    ":[^:]*:[^:]*:[^:]*:\\([^:]*\\):")))
+    (with-temp-buffer
+      (apply #'call-process pgg-gpg-program nil t nil args)
+      (goto-char (point-min))
+      (if (re-search-forward key-regexp
+			     nil t)
+	  (match-string 3)))))
+
+(defun pgg-gpg-key-id-from-key-owner (key-owner)
+  (cond ((not key-owner) nil)
+	;; Extract bare key id from outermost paired angle brackets, if any:
+	((string-match "[^<]*<\\(.+\\)>[^>]*" key-owner)
+	 (substring key-owner (match-beginning 1)(match-end 1)))
+	(key-owner)))
+
 (defun pgg-gpg-encrypt-region (start end recipients &optional sign passphrase)
   "Encrypt the current region between START and END.
 
-If optional argument SIGN is non-nil, do a combined sign and encrypt."
+If optional argument SIGN is non-nil, do a combined sign and encrypt.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
   (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
+	 (passphrase (or passphrase
+			 (when (and sign (not (pgg-gpg-use-agent-p)))
+			   (pgg-read-passphrase
+			    (format "GnuPG passphrase for %s: "
+				    pgg-gpg-user-id)
+			    pgg-gpg-user-id))))
 	 (args
 	  (append
-	   '("--armor" "--always-trust" "--encrypt")
-	   (if pgg-text-mode '("--textmode"))
+	   (list "--batch" "--armor" "--always-trust" "--encrypt")
+	   (if pgg-text-mode (list "--textmode"))
 	   (if sign (list "--sign" "--local-user" pgg-gpg-user-id))
 	   (if recipients
 	       (apply #'nconc
@@ -264,71 +205,178 @@
 				(list pgg-gpg-recipient-argument rcpt))
 			      (append recipients
 				      (if pgg-encrypt-for-me
-					  (list pgg-gpg-user-id))))))))
-	 (process (pgg-gpg-start-process args)))
-    (if (and sign (not pgg-gpg-use-agent))
-	(pgg-gpg-wait-for-status process '("GOOD_PASSPHRASE")))
-    (process-send-region process start end)
-    (pgg-gpg-wait-for-completion process '("SIG_CREATED" "END_ENCRYPTION"))))
+					  (list pgg-gpg-user-id)))))))))
+    (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
+    (when sign
+      (with-current-buffer pgg-errors-buffer
+	;; Possibly cache passphrase under, e.g. "jas", for future sign.
+	(pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id)
+	;; Possibly cache passphrase under, e.g. B565716F, for future decrypt.
+	(pgg-gpg-possibly-cache-passphrase passphrase)))
+    (pgg-process-when-success)))
 
 (defun pgg-gpg-encrypt-symmetric-region (start end &optional passphrase)
-  "Encrypt the current region between START and END with symmetric cipher."
-  (let* ((args
-	  (append '("--armor" "--symmetric")
-		  (if pgg-text-mode '("--textmode"))))
-	 (process (pgg-gpg-start-process args)))
-    (pgg-gpg-wait-for-status process '("BEGIN_ENCRYPTION"))
-    (process-send-region process start end)
-    (pgg-gpg-wait-for-completion process '("END_ENCRYPTION"))))
+  "Encrypt the current region between START and END with symmetric cipher.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
+  (let* ((passphrase (or passphrase
+			 (when (not (pgg-gpg-use-agent-p))
+			   (pgg-read-passphrase
+			    "GnuPG passphrase for symmetric encryption: "))))
+	 (args
+	  (append (list "--batch" "--armor" "--symmetric" )
+		  (if pgg-text-mode (list "--textmode")))))
+    (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
+    (pgg-process-when-success)))
 
 (defun pgg-gpg-decrypt-region (start end &optional passphrase)
-  "Decrypt the current region between START and END."
-  (let* ((args '("--decrypt"))
-	 (process (pgg-gpg-start-process args)))
-    (process-send-region process start end)
-    (pgg-gpg-wait-for-status process '("BEGIN_DECRYPTION"))
-    (pgg-gpg-wait-for-completion process '("GOODSIG" "DECRYPTION_OKAY"))))
+  "Decrypt the current region between START and END.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
+  (let* ((current-buffer (current-buffer))
+	 (message-keys (with-temp-buffer
+			 (insert-buffer-substring current-buffer)
+			 (pgg-decode-armor-region (point-min) (point-max))))
+	 (secret-keys (pgg-gpg-lookup-all-secret-keys))
+	 ;; XXX the user is stuck if they need to use the passphrase for
+	 ;;     any but the first secret key for which the message is
+	 ;;     encrypted.  ideally, we would incrementally give them a
+	 ;;     chance with subsequent keys each time they fail with one.
+	 (key (pgg-gpg-select-matching-key message-keys secret-keys))
+	 (key-owner (and key (pgg-gpg-lookup-key-owner key t)))
+	 (key-id (pgg-gpg-key-id-from-key-owner key-owner))
+	 (pgg-gpg-user-id (or key-id key
+			      pgg-gpg-user-id pgg-default-user-id))
+	 (passphrase (or passphrase
+			 (when (not (pgg-gpg-use-agent-p))
+			   (pgg-read-passphrase
+			    (format (if (pgg-gpg-symmetric-key-p message-keys)
+					"Passphrase for symmetric decryption: "
+				      "GnuPG passphrase for %s: ")
+				    (or key-owner "??"))
+			    pgg-gpg-user-id))))
+	 (args '("--batch" "--decrypt")))
+    (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
+    (with-current-buffer pgg-errors-buffer
+      (pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id)
+      (goto-char (point-min))
+      (re-search-forward "^\\[GNUPG:] DECRYPTION_OKAY\\>" nil t))))
+
+;;;###autoload
+(defun pgg-gpg-symmetric-key-p (message-keys)
+  "True if decoded armor MESSAGE-KEYS has symmetric encryption indicator."
+  (let (result)
+    (dolist (key message-keys result)
+      (when (and (eq (car key) 3)
+		 (member '(symmetric-key-algorithm) key))
+	(setq result key)))))
+
+(defun pgg-gpg-select-matching-key (message-keys secret-keys)
+  "Choose a key from MESSAGE-KEYS that matches one of the keys in SECRET-KEYS."
+  (loop for message-key in message-keys
+	for message-key-id = (and (equal (car message-key) 1)
+				  (cdr (assq 'key-identifier
+					     (cdr message-key))))
+	for key = (and message-key-id (pgg-lookup-key message-key-id 'encrypt))
+	when (and key (member key secret-keys)) return key))
 
 (defun pgg-gpg-sign-region (start end &optional cleartext passphrase)
   "Make detached signature from text between START and END."
   (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
+	 (passphrase (or passphrase
+			 (when (not (pgg-gpg-use-agent-p))
+			   (pgg-read-passphrase
+			    (format "GnuPG passphrase for %s: "
+				    pgg-gpg-user-id)
+			    pgg-gpg-user-id))))
 	 (args
 	  (append (list (if cleartext "--clearsign" "--detach-sign")
-			"--armor" "--verbose"
+			"--armor" "--batch" "--verbose"
 			"--local-user" pgg-gpg-user-id)
-		  (if pgg-text-mode '("--textmode"))))
-	 (process (pgg-gpg-start-process args)))
-    (unless pgg-gpg-use-agent
-      (pgg-gpg-wait-for-status process '("GOOD_PASSPHRASE")))
-    (process-send-region process start end)
-    (pgg-gpg-wait-for-completion process '("SIG_CREATED"))))
+		  (if pgg-text-mode (list "--textmode"))))
+	 (inhibit-read-only t)
+	 buffer-read-only)
+    (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
+    (with-current-buffer pgg-errors-buffer
+      ;; Possibly cache passphrase under, e.g. "jas", for future sign.
+      (pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id)
+      ;; Possibly cache passphrase under, e.g. B565716F, for future decrypt.
+      (pgg-gpg-possibly-cache-passphrase passphrase))
+    (pgg-process-when-success)))
 
 (defun pgg-gpg-verify-region (start end &optional signature)
   "Verify region between START and END as the detached signature SIGNATURE."
-  (let ((args '("--verify"))
-	process)
+  (let ((args '("--batch" "--verify")))
     (when (stringp signature)
       (setq args (append args (list signature))))
-    (setq process (pgg-gpg-start-process (append args '("-"))))
-    (process-send-region process start end)
-    (pgg-gpg-wait-for-completion process '("GOODSIG"))))
+    (setq args (append args '("-")))
+    (pgg-gpg-process-region start end nil pgg-gpg-program args)
+    (with-current-buffer pgg-errors-buffer
+      (goto-char (point-min))
+      (while (re-search-forward "^gpg: \\(.*\\)\n" nil t)
+	(with-current-buffer pgg-output-buffer
+	  (insert-buffer-substring pgg-errors-buffer
+				   (match-beginning 1) (match-end 0)))
+	(delete-region (match-beginning 0) (match-end 0)))
+      (goto-char (point-min))
+      (re-search-forward "^\\[GNUPG:] GOODSIG\\>" nil t))))
 
 (defun pgg-gpg-insert-key ()
   "Insert public key at point."
   (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
-	 (args (list "--export" "--armor"
-		     pgg-gpg-user-id))
-	 (process (pgg-gpg-start-process args)))
-    (pgg-gpg-wait-for-completion process)
+	 (args (list "--batch" "--export" "--armor"
+		     pgg-gpg-user-id)))
+    (pgg-gpg-process-region (point)(point) nil pgg-gpg-program args)
     (insert-buffer-substring pgg-output-buffer)))
 
 (defun pgg-gpg-snarf-keys-region (start end)
   "Add all public keys in region between START and END to the keyring."
-  (let* ((args '("--import" "-"))
-	 (process (pgg-gpg-start-process args))
-	 status)
-    (process-send-region process start end)
-    (pgg-gpg-wait-for-completion process '("IMPORT_RES"))))
+  (let ((args '("--import" "--batch" "-")) status)
+    (pgg-gpg-process-region start end nil pgg-gpg-program args)
+    (set-buffer pgg-errors-buffer)
+    (goto-char (point-min))
+    (when (re-search-forward "^\\[GNUPG:] IMPORT_RES\\>" nil t)
+      (setq status (buffer-substring (match-end 0)
+				     (progn (end-of-line)(point)))
+	    status (vconcat (mapcar #'string-to-number (split-string status))))
+      (erase-buffer)
+      (insert (format "Imported %d key(s).
+\tArmor contains %d key(s) [%d bad, %d old].\n"
+		      (+ (aref status 2)
+			 (aref status 10))
+		      (aref status 0)
+		      (aref status 1)
+		      (+ (aref status 4)
+			 (aref status 11)))
+	      (if (zerop (aref status 9))
+		  ""
+		"\tSecret keys are imported.\n")))
+    (append-to-buffer pgg-output-buffer (point-min)(point-max))
+    (pgg-process-when-success)))
+
+(defun pgg-gpg-update-agent ()
+  "Try to connet to gpg-agent and send UPDATESTARTUPTTY."
+  (if (fboundp 'make-network-process)
+      (let* ((agent-info (getenv "GPG_AGENT_INFO"))
+	     (socket (and agent-info
+			  (string-match "^\\([^:]*\\)" agent-info)
+			  (match-string 1 agent-info)))
+	     (conn (and socket
+			(make-network-process :name "gpg-agent-process"
+					      :host 'local :family 'local
+					      :service socket))))
+	(when (and conn (eq (process-status conn) 'open))
+	  (process-send-string conn "UPDATESTARTUPTTY\n")
+	  (delete-process conn)
+	  t))
+    ;; We can't check, so assume gpg-agent is up.
+    t))
+
+(defun pgg-gpg-use-agent-p ()
+  "Return t if `pgg-gpg-use-agent' is t and gpg-agent is available."
+  (and pgg-gpg-use-agent (pgg-gpg-update-agent)))
 
 (provide 'pgg-gpg)
 
--- a/lisp/progmodes/compile.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/progmodes/compile.el	Sun Apr 09 00:38:22 2006 +0000
@@ -527,11 +527,14 @@
   :group 'compilation
   :version "22.1")
 
-(defvar compilation-message-face 'underline
+(defcustom compilation-message-face 'underline
   "Face name to use for whole messages.
 Faces `compilation-error-face', `compilation-warning-face',
 `compilation-info-face', `compilation-line-face' and
-`compilation-column-face' get prepended to this, when applicable.")
+`compilation-column-face' get prepended to this, when applicable."
+  :type 'face
+  :group 'compilation
+  :version "22.1")
 
 (defvar compilation-error-face 'compilation-error
   "Face name to use for file name in error messages.")
--- a/lisp/progmodes/gdb-ui.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/progmodes/gdb-ui.el	Sun Apr 09 00:38:22 2006 +0000
@@ -571,9 +571,9 @@
 	   'gdb-set-gud-minor-mode-existing-buffers-1))
     (setq gdb-locals-font-lock-keywords gdb-locals-font-lock-keywords-2))
 
-  ;; find source file and compilation directory here
-  (gdb-enqueue-input (list "server list main\n"   'ignore))   ; C program
-  (gdb-enqueue-input (list "server list MAIN__\n" 'ignore))   ; Fortran program
+  ;; Find source file and compilation directory here.
+  ;; Works for C, C++, Fortran and Ada but not Java (GDB 6.4)
+  (gdb-enqueue-input (list "server list\n" 'ignore))
   (gdb-enqueue-input (list "server info source\n" 'gdb-source-info))
 
   (run-hooks 'gdba-mode-hook))
--- a/lisp/progmodes/idlw-complete-structtag.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/progmodes/idlw-complete-structtag.el	Sun Apr 09 00:38:22 2006 +0000
@@ -1,8 +1,7 @@
 ;;; idlw-complete-structtag.el --- Completion of structure tags.
-;; Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006
-;; Free Software Foundation, Inc.
+;; Copyright (c) 2001,2002,2003,2004,2005,2006 Free Software Foundation
 
-;; Author: Carsten Dominik <dominik@science.uva.nl>
+;; Author: Carsten Dominik <dominik@astro.uva.nl>
 ;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
 ;; Version: 1.2
 ;; Keywords: languages
@@ -54,10 +53,10 @@
 ;;
 ;; INSTALLATION
 ;; ============
-;; Put this file on the emacs load path and load it with the following
+;; Put this file on the emacs load path and load it with the following 
 ;; line in your .emacs file:
 ;;
-;;   (add-hook 'idlwave-load-hook
+;;   (add-hook 'idlwave-load-hook 
 ;;             (lambda () (require 'idlw-complete-structtag)))
 ;;
 ;; DESCRIPTION
@@ -88,7 +87,7 @@
 ;;  - You can force an update of the tag list with the usual command
 ;;    to update routine info in IDLWAVE: C-c C-i
 
-(defvar idlwave-completion-help-info)
+(require 'idlwave)
 
 ;; Some variables to identify the previously used structure
 (defvar idlwave-current-tags-var nil)
@@ -107,7 +106,7 @@
 (add-hook 'idlwave-update-rinfo-hook 'idlwave-structtag-reset)
 
 ;;; The main code follows below
-
+(defvar idlwave-completion-help-info)
 (defun idlwave-complete-structure-tag ()
   "Complete a structure tag.
 This works by looking in the current file for a structure assignment to a
@@ -146,9 +145,9 @@
                   (not (equal start idlwave-current-tags-completion-pos)))
 	      (idlwave-prepare-structure-tag-completion var))
           (setq idlwave-current-tags-completion-pos start)
-	  (setq idlwave-completion-help-info
+	  (setq idlwave-completion-help-info 
 		(list 'idlwave-complete-structure-tag-help))
-	  (idlwave-complete-in-buffer 'structtag 'structtag
+	  (idlwave-complete-in-buffer 'structtag 'structtag 
 				      idlwave-current-struct-tags nil
 				      "Select a structure tag" "structure tag")
 	  t) ; we did the completion: return t to skip other completions
@@ -167,7 +166,7 @@
   (if (eq major-mode 'idlwave-shell-mode)
       ;; OK, we are in the shell, do it dynamically
       (progn
-        (message "preparing shell tags")
+        (message "preparing shell tags") 
         ;; The following call puts the tags into `idlwave-current-struct-tags'
         (idlwave-complete-structure-tag-query-shell var)
         ;; initialize
@@ -189,7 +188,7 @@
             ;; Find possible definitions of the structure.
             (while (idlwave-find-structure-definition var nil 'all)
               (let ((tags (idlwave-struct-tags)))
-                (when tags
+                (when tags 
                   ;; initialize
                   (setq idlwave-sint-structtags nil
                         idlwave-current-tags-buffer (current-buffer)
--- a/lisp/progmodes/idlw-help.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/progmodes/idlw-help.el	Sun Apr 09 00:38:22 2006 +0000
@@ -1,12 +1,12 @@
 ;;; idlw-help.el --- HTML Help code for IDLWAVE
 ;; Copyright (c) 2000 Carsten Dominik
 ;; Copyright (c) 2001, 2002 J.D. Smith
-;; Copyright (c) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+;; Copyright (c) 2003,2004,2005,2006 Free Software Foundation
 ;;
 ;; Authors: J.D. Smith <jdsmith@as.arizona.edu>
 ;;          Carsten Dominik <dominik@science.uva.nl>
 ;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
-;; Version: 5.7_22
+;; Version: 6.0_em22
 
 ;; This file is part of GNU Emacs.
 
@@ -36,13 +36,12 @@
 ;; information, at:
 ;;
 ;;           http://idlwave.org
-;;
+;; 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
+
 ;;; Code:
-(defvar browse-url-generic-args)
-
 (defvar idlwave-help-browse-url-available nil
   "Whether browse-url is available")
 
@@ -60,25 +59,32 @@
   :group 'idlwave-online-help
   :type 'boolean)
 
-(defvar idlwave-html-link-sep
+(defvar idlwave-html-link-sep 
   (if idlwave-html-help-pre-v6 "#" "#wp"))
 
-(defcustom idlwave-html-help-location
-  (if (memq system-type '(ms-dos windows-nt))
-      nil
-    "/usr/local/etc/")
-  "The directory where the idl_html_help/ dir or idl.chm help file
-(Windows only) lives."
+(defcustom idlwave-html-system-help-location   "help/online_help/"
+  "The directory, relative to idlwave-system-directory, where the idl
+HTML help files live, for IDL 6.2 and later.  This location, if found,
+is used in preference to the old idlwave-html-help-location."
   :group 'idlwave-online-help
   :type 'directory)
 
-(defcustom idlwave-help-use-hh nil
-  "Whether to use the HTMLHelp viewer with idl.chm (Windows only)."
+(defcustom idlwave-html-help-location 
+   (if (memq system-type '(ms-dos windows-nt))
+      nil
+    "/usr/local/etc/")
+  "The directory where the idl_html_help/ dir lives.  Obsolete for IDL
+6.2 or later (see idlwave-html-system-help-location)."
   :group 'idlwave-online-help
-  :type '(choice :tag "use help viewer"
-		 (const :tag "<none>" nil)
-		 (const :tag "hh" 'hh)
-		 (const :tag "keyhh" 'keyhh)))
+  :type 'directory)
+
+(defvar idlwave-help-use-hh nil
+  "Obsolete variable.") 
+
+(defcustom idlwave-help-use-assistant t
+  "Whether to use the IDL Assistant as the help browser."
+  :group 'idlwave-online-help
+  :type 'boolean)
 
 (defcustom idlwave-help-browser-function browse-url-browser-function
   "Function to use to display html help.
@@ -91,7 +97,9 @@
   :group 'idlwave-online-help
   :type 'string)
 
-(defcustom idlwave-help-browser-generic-args
+(defvar browse-url-generic-args)
+
+(defcustom idlwave-help-browser-generic-args 
   (if (boundp 'browse-url-generic-args)
       browse-url-generic-args "")
   "Program args to use if using browse-url-generic-program."
@@ -198,7 +206,7 @@
 
 (defvar idlwave-help-activate-links-aggressively nil
   "Obsolete variable.")
-
+  
 (defvar idlwave-completion-help-info)
 
 (defvar idlwave-help-frame nil
@@ -289,22 +297,39 @@
   (set (make-local-variable 'idlwave-help-def-pos) nil)
   (set (make-local-variable 'idlwave-help-args) nil)
   (set (make-local-variable 'idlwave-help-in-header) nil)
-  (run-mode-hooks 'idlwave-help-mode-hook))
+  (run-hooks 'idlwave-help-mode-hook))
 
-(defvar idlwave-system-directory)
 (defun idlwave-html-help-location ()
   "Return the help directory where HTML files are, or nil if that is unknown."
-  (or (and (stringp idlwave-html-help-location)
-	   (> (length idlwave-html-help-location) 0)
-	   (file-directory-p idlwave-html-help-location)
-	   idlwave-html-help-location)
-      (getenv "IDLWAVE_HELP_LOCATION")
-      (and (memq system-type '(ms-dos windows-nt)) ; Base it on sysdir
-	   idlwave-help-use-hh
-	   (stringp idlwave-system-directory)
-	   (> (length idlwave-system-directory) 0)
-	   (file-directory-p idlwave-system-directory)
-	   (expand-file-name "HELP" idlwave-system-directory))))
+  (let ((syshelp-dir (expand-file-name 
+		      idlwave-html-system-help-location (idlwave-sys-dir)))
+	(help-dir (or (and (stringp idlwave-html-help-location)
+			   (> (length idlwave-html-help-location) 0)
+			   idlwave-html-help-location)
+		      (getenv "IDLWAVE_HELP_LOCATION"))))
+    (if (file-directory-p syshelp-dir) 
+	syshelp-dir
+      (setq help-dir (expand-file-name "idl_html_help" help-dir))
+      (if (file-directory-p help-dir) help-dir))))
+      
+(defvar idlwave-help-assistant-available nil) 
+
+(defun idlwave-help-check-locations ()
+  ;; Check help locations and assistant.
+  (let ((sys-dir (idlwave-sys-dir))
+	(help-loc (idlwave-html-help-location)))
+    (if (or (not (file-directory-p sys-dir))
+	    (not (file-directory-p help-loc)))
+	(message
+	 "HTML help location not found: try setting `idlwave-system-directory' and/or `idlwave-html-help-location'."))
+    ;; see if we have the assistant
+    (when (and idlwave-help-use-assistant
+	       (not (eq (idlwave-help-assistant-available) t)))
+      (message "Cannot locate IDL Assistant, enabling default browser.")
+      (setq idlwave-help-use-assistant nil)
+      (unless idlwave-help-browse-url-available
+	(error "browse-url is not available; install it or IDL Assistant to use HTML help.")))))
+
 
 (defvar idlwave-current-obj_new-class)
 (defvar idlwave-help-diagnostics)
@@ -326,7 +351,7 @@
       (setq idlwave-last-context-help-pos marker)
       (idlwave-do-context-help1 arg)
       (if idlwave-help-diagnostics
-	  (message "%s" (mapconcat 'identity
+	  (message "%s" (mapconcat 'identity 
 				   (nreverse idlwave-help-diagnostics)
 				   "; "))))))
 
@@ -339,7 +364,7 @@
 (defun idlwave-do-context-help1 (&optional arg)
   "The work-horse version of `idlwave-context-help', which see."
   (save-excursion
-    (if (equal (char-after) ?/)
+    (if (equal (char-after) ?/) 
 	(forward-char 1)
       (if (equal (char-before) ?=)
 	  (backward-char 1)))
@@ -349,15 +374,15 @@
 	   (beg (save-excursion (skip-chars-backward chars) (point)))
 	   (end (save-excursion (skip-chars-forward chars) (point)))
 	   (this-word (buffer-substring-no-properties beg end))
-	   (st-ass (assoc (downcase this-word)
-			  idlwave-help-special-topic-words))
+	   (st-ass (assoc-string this-word
+				 idlwave-help-special-topic-words t))
 	   (classtag (and (string-match "self\\." this-word)
 			  (< beg (- end 4))))
 	   (structtag (and (fboundp 'idlwave-complete-structure-tag)
 			   (string-match "\\`\\([^.]+\\)\\." this-word)
 			   (< beg (- end 4))))
 	   module keyword cw mod1 mod2 mod3)
-      (if (or arg
+      (if (or arg 
 	      (and (not st-ass)
 		   (not classtag)
 		   (not structtag)
@@ -376,15 +401,15 @@
 		      (setq module (list "init" 'fun (match-string 1 str))
 			    idlwave-current-obj_new-class (match-string 1 str))
 		    )))))
-      (cond
+      (cond 
        (arg (setq mod1 module))
-
+       
        ;; A special topic -- only system help
        (st-ass (setq mod1 (list (cdr st-ass))))
-
+       
        ;; A system variable -- only system help
-       ((string-match
-	 "\\`!\\([a-zA-Z0-9_]+\\)\\(\.\\([A-Za-z0-9_]+\\)\\)?"
+       ((string-match 
+	 "\\`!\\([a-zA-Z0-9_]+\\)\\(\.\\([A-Za-z0-9_]+\\)\\)?" 
 	 this-word)
 	(let* ((word  (match-string-no-properties 1 this-word))
 	       (entry (assq (idlwave-sintern-sysvar word)
@@ -396,10 +421,10 @@
 				      (cdr (assq 'tags entry))))))
 	       (link (nth 1 (assq 'link entry))))
 	  (if tag-target
-	      (setq link (idlwave-substitute-link-target link
+	      (setq link (idlwave-substitute-link-target link 
 							 tag-target)))
 	  (setq mod1 (list link))))
-
+			  
        ;; An executive command -- only system help
        ((string-match "^\\.\\([A-Z_]+\\)" this-word)
 	(let* ((word  (match-string 1 this-word))
@@ -407,7 +432,7 @@
 			    word
 			    idlwave-executive-commands-alist t))))
 	  (setq mod1 (list link))))
-
+       
        ;; A class -- system OR in-text help (via class__define).
        ((and (eq cw 'class)
 	     (or (idlwave-in-quote)  ; e.g. obj_new
@@ -421,28 +446,28 @@
 	       (name   (concat (downcase this-word) "__define"))
 	       (link   (nth 1 (assq 'link entry))))
 	  (setq mod1 (list link name 'pro))))
-
+       
        ;; A class structure tag (self.BLAH) -- only in-text help available
        (classtag
 	(let ((tag (substring this-word (match-end 0)))
 	      class-with found-in)
-	  (when (setq class-with
+	  (when (setq class-with 
 		      (idlwave-class-or-superclass-with-tag
 		       (nth 2 (idlwave-current-routine))
 		       tag))
 	    (setq found-in (idlwave-class-found-in class-with))
-	    (if (assq (idlwave-sintern-class class-with)
+	    (if (assq (idlwave-sintern-class class-with) 
 		      idlwave-system-class-info)
 		(error "No help available for system class tags"))
 	    (setq idlwave-help-do-class-struct-tag t)
-	    (setq mod1 (list nil
+	    (setq mod1 (list nil 
 			     (if found-in
 				 (cons (concat found-in "__define") class-with)
 			       (concat class-with "__define"))
 			     'pro
 			     nil ; no class.... it's a procedure!
 			     tag)))))
-
+       
        ;; A regular structure tag -- only in text, and if
        ;; optional `complete-structtag' loaded.
        (structtag
@@ -453,7 +478,7 @@
 	  (setq idlwave-help-do-struct-tag
 		idlwave-structtag-struct-location
 		mod1 (list nil nil nil nil tag))))
-
+       
        ;; A routine keyword -- in text or system help
        ((and (memq cw '(function-keyword procedure-keyword))
 	     (stringp this-word)
@@ -495,7 +520,7 @@
 	       (setq mod1 (append (list t) module (list keyword))
 		     mod2 (list t this-word 'fun nil)
 		     mod3 (append (list t) module)))))
-
+       
        ;; Everything else
        (t
 	(setq mod1 (append (list t) module))))
@@ -528,14 +553,14 @@
 	 word link)
     (mouse-set-point ev)
 
-
+	  
     ;; See if we can also find help somewhere, e.g. for multiple classes
     (setq word (idlwave-this-word))
     (if (string= word "")
 	(error "No help item selected"))
     (setq link (get-text-property 0 'link word))
     (select-window cw)
-    (cond
+    (cond 
      ;; Routine name
      ((memq what '(procedure function routine))
       (setq name word)
@@ -546,9 +571,9 @@
 			   type)))
 	    (setq link t)		; No specific link valid yet
 	    (if sclasses
-		(setq classes (idlwave-members-only
+		(setq classes (idlwave-members-only 
 			       classes (cons class sclasses))))
-	    (setq class (idlwave-popup-select ev classes
+	    (setq class (idlwave-popup-select ev classes 
 					      "Select Class" 'sort))))
 
       ;; XXX is this necessary, given all-method-classes?
@@ -568,7 +593,7 @@
 			   type)))
 	    (setq link t) ; Link can't be correct yet
 	    (if sclasses
-		(setq classes (idlwave-members-only
+		(setq classes (idlwave-members-only 
 			       classes (cons class sclasses))))
 	    (setq class (idlwave-popup-select ev classes
 					      "Select Class" 'sort))
@@ -580,14 +605,14 @@
 	(if (string= (downcase name) "obj_new")
 	    (setq class idlwave-current-obj_new-class
 		  name "Init"))))
-
+	  
      ;; Class name
      ((eq what 'class)
       (setq class word
 	    word nil))
-
+     
      ;; A special named function to call which sets some of our variables
-     ((and (symbolp what)
+     ((and (symbolp what) 
 	   (fboundp what))
       (funcall what 'set word))
 
@@ -602,7 +627,7 @@
   "Highlight all completions for which help is available and attach link.
 Those words in `idlwave-completion-help-links' have links.  The
 `idlwave-help-link' face is used for this."
-  (if idlwave-highlight-help-links-in-completion
+  (if idlwave-highlight-help-links-in-completion      
       (with-current-buffer (get-buffer "*Completions*")
 	(save-excursion
 	  (let* ((case-fold-search t)
@@ -618,7 +643,7 @@
 	      (setq beg (match-beginning 1) end (match-end 1)
 		    word (match-string 1) doit nil)
 	      ;; Call special completion function test
-	      (if (and (symbolp what)
+	      (if (and (symbolp what) 
 		       (fboundp what))
 		  (setq doit (funcall what 'test word))
 		;; Look for special link property passed in help-links
@@ -649,13 +674,13 @@
 	     ;; Try to select the return frame.
 	     ;; This can crash on slow network connections, obviously when
 	     ;; we kill the help frame before the return-frame is selected.
-	     ;; To protect the workings, we wait for up to one second
+	     ;; To protect the workings, we wait for up to one second 
 	     ;; and check if the return-frame *is* now selected.
 	     ;; This is marked "eperimental" since we are not sure when its OK.
 	     (let ((maxtime 1.0) (time 0.) (step 0.1))
 	       (select-frame idlwave-help-return-frame)
 	       (while (and (sit-for step)
-			   (not (eq (selected-frame)
+			   (not (eq (selected-frame) 
 				    idlwave-help-return-frame))
 			   (< (setq time (+ time step)) maxtime)))))
 	 (delete-frame idlwave-help-frame))
@@ -668,7 +693,7 @@
 (defvar default-toolbar-visible-p)
 
 (defun idlwave-help-display-help-window (&optional pos-or-func)
-  "Display the help window.
+  "Display the help window.  
 Move window start to POS-OR-FUNC, if passed as a position, or call it
 if passed as a function.  See `idlwave-help-use-dedicated-frame'."
   (let ((cw (selected-window))
@@ -679,13 +704,13 @@
 	  (switch-to-buffer buf))
       ;; Do it in this frame and save the window configuration
       (if (not (get-buffer-window buf nil))
-	  (setq idlwave-help-window-configuration
+	  (setq idlwave-help-window-configuration 
 		(current-window-configuration)))
       (display-buffer buf nil (selected-frame))
       (select-window (get-buffer-window buf)))
     (raise-frame)
-    (if pos-or-func
-	(if (functionp pos-or-func)
+    (if pos-or-func 
+	(if (functionp pos-or-func) 
 	    (funcall pos-or-func)
 	  (goto-char pos-or-func)
 	  (recenter 0)))
@@ -707,31 +732,43 @@
       (select-frame idlwave-help-return-frame)))
 
 (defun idlwave-online-help (link &optional name type class keyword)
-  "Display HTML or other special help on a certain topic.
+  "Display HTML or other special help on a certain topic.  
 Either loads an HTML link, if LINK is non-nil, or gets special-help on
 the optional arguments, if any special help is defined.  If LINK is
 `t', first look up the optional arguments in the routine info list to
 see if a link is set for it.  Try extra help functions if necessary."
   ;; Lookup link
-  (if (eq link t)
-      (let ((entry (idlwave-best-rinfo-assoc name type class
+  (if (eq link t) 
+      (let ((entry (idlwave-best-rinfo-assoc name type class 
 					     (idlwave-routines) nil t)))
-	(cond
-	 ;; Try keyword link
-	 ((and keyword
-	       (setq link (cdr (idlwave-entry-find-keyword entry keyword)))))
-	 ;; Default, regular entry link
-	 (t (setq link (idlwave-entry-has-help entry))))))
+	(if entry
+	    (cond
+	     ;; Try keyword link
+	     ((and keyword 
+		   (setq link (cdr 
+			       (idlwave-entry-find-keyword entry keyword)))))
+	     ;; Default, regular entry link
+	     (t (setq link (idlwave-entry-has-help entry))))
+	  (if (and 
+	       class
+	       ;; Check for system class help
+	       (setq entry (assq (idlwave-sintern-class class)
+				 idlwave-system-class-info)
+		     link (nth 1 (assq 'link entry))))
+	      (message 
+	       (concat "No routine info for %s"
+		       ", falling back on class help.")
+	       (idlwave-make-full-name class name))))))
 
   (cond
    ;; An explicit link
-   ((stringp link)
+   ((stringp link) 
     (idlwave-help-html-link link))
-
+   
    ;; Any extra help
    (idlwave-extra-help-function
     (idlwave-help-get-special-help name type class keyword))
-
+   
    ;; Nothing worked
    (t (idlwave-help-error name type class keyword))))
 
@@ -742,7 +779,7 @@
 	 (help-pos (save-excursion
 		     (set-buffer (idlwave-help-get-help-buffer))
 		     (let ((buffer-read-only nil))
-		       (funcall idlwave-extra-help-function
+		       (funcall idlwave-extra-help-function 
 				name type class keyword)))))
     (if help-pos
 	(idlwave-help-display-help-window help-pos)
@@ -757,36 +794,22 @@
 	;(browse-url-generic-args idlwave-help-browser-generic-args)
 	full-link)
 
-    (unless idlwave-help-browse-url-available
-      (error "browse-url is not available -- install it to use HTML help."))
+    ;; Just a regular file name (+ anchor name)
+    (unless (and (stringp help-loc)
+		 (file-directory-p help-loc))
+      (error "Invalid help location."))
+    (setq full-link (browse-url-file-url (expand-file-name link help-loc)))
 
-    (if (and (memq system-type '(ms-dos windows-nt))
-	     idlwave-help-use-hh)
-	(progn
-	  (setq browse-url-browser-function 'browse-url-generic
-		full-link (concat (expand-file-name "idl.chm" help-loc)
-				  "::/"
-				  link))
-	  (if (memq 'keyhh idlwave-help-use-hh)
-	      (setq browse-url-generic-program "KEYHH"
-		    browse-url-generic-args '("-IDLWAVE"))
-	    (setq browse-url-generic-program "HH")))
-      ;; Just a regular file name (+ anchor name)
-      (unless (and (stringp help-loc)
-		   (file-directory-p help-loc))
-	(error
-	 "Invalid help location; customize `idlwave-html-help-location'."))
-      (setq full-link (concat
-		       "file://"
-		       (expand-file-name
-			link
-			(expand-file-name "idl_html_help" help-loc)))))
+    ;; Select the browser
+    (cond
+     (idlwave-help-use-assistant
+      (idlwave-help-assistant-open-link link))
 
-    ;; Check for a local browser
-    (if (or idlwave-help-browser-is-local
-	    (string-match "w3" (symbol-name idlwave-help-browser-function)))
-	(idlwave-help-display-help-window '(lambda () (browse-url full-link)))
-      (browse-url full-link))))
+     ((or idlwave-help-browser-is-local
+	  (string-match "w3" (symbol-name idlwave-help-browser-function)))
+      (idlwave-help-display-help-window '(lambda () (browse-url full-link))))
+
+     (t (browse-url full-link)))))
 
 ;; A special help routine for source-level syntax help in files.
 (defvar idlwave-help-fontify-source-code)
@@ -814,7 +837,7 @@
     (if class-only   ;Help with class?  Using "Init" as source.
 	(setq name "Init"
 	      type 'fun))
-    (if (not struct-tag)
+    (if (not struct-tag) 
 	(setq file
 	      (idlwave-routine-source-file
 	       (nth 3 (idlwave-best-rinfo-assoc
@@ -827,16 +850,15 @@
     (if (or struct-tag (stringp file))
 	(progn
 	  (setq in-buf ; structure-tag completion is always in current buffer
-		(if struct-tag
+		(if struct-tag 
 		    idlwave-current-tags-buffer
 		  (idlwave-get-buffer-visiting file)))
 	  ;; see if file is in a visited buffer, insert those contents
 	  (if in-buf
 	      (progn
 		(setq file (buffer-file-name in-buf))
-		(erase-buffer)
-		(insert-buffer-substring in-buf)
-                (goto-char (point-min)))
+		(erase-buffer)		
+		(insert-buffer-substring in-buf))
 	    (if (file-exists-p file) ;; otherwise just load the file
 		(progn
 		  (erase-buffer)
@@ -850,19 +872,19 @@
     ;; Try to find a good place to display
     (setq def-pos
 	  ;; Find the class structure tag if that's what we're after
-	  (cond
+	  (cond 
 	   ;; Class structure tags: find the class or named structure
 	   ;; definition
 	   (class-struct-tag
-	    (save-excursion
+	    (save-excursion 
 	      (setq class
-		    (if (string-match "[a-zA-Z0-9]\\(__\\)" name)
+		    (if (string-match "[a-zA-Z0-9]\\(__\\)" name) 
 			(substring name 0 (match-beginning 1))
 		      idlwave-current-tags-class))
 	      (and
 	       (idlwave-find-class-definition class nil real-class)
 	       (idlwave-find-struct-tag keyword))))
-
+	   
 	   ;; Generic structure tags: the structure definition
 	   ;; location within the file has been recorded in
 	   ;; `struct-tag'
@@ -872,14 +894,14 @@
 	       (integerp struct-tag)
 	       (goto-char struct-tag)
 	       (idlwave-find-struct-tag keyword))))
-
+	   
 	   ;; Just find the routine definition
 	   (t
 	    (if class-only (point-min)
 	      (idlwave-help-find-routine-definition name type class keyword))))
 	  idlwave-help-def-pos def-pos)
 
-    (if (and idlwave-help-source-try-header
+    (if (and idlwave-help-source-try-header 
 	     (not (or struct-tag class-struct-tag)))
 	;; Check if we can find the header
 	(save-excursion
@@ -889,7 +911,7 @@
 		idlwave-help-in-header header-pos)))
 
     (if (or header-pos def-pos)
-	(progn
+	(progn 
 	  (if (boundp 'idlwave-help-min-frame-width)
 	      (setq idlwave-help-min-frame-width 80))
 	  (goto-char (or header-pos def-pos)))
@@ -903,7 +925,7 @@
 KEYWORD is ignored. Returns the point of match if successful, nil otherwise."
   (save-excursion
     (goto-char (point-max))
-    (if (re-search-backward
+    (if (re-search-backward 
 	 (concat "^[ \t]*"
 		 (if (eq type 'pro) "pro"
 		   (if (eq type 'fun) "function"
@@ -949,22 +971,22 @@
 If there is a match, we assume it is the keyword description."
   (let* ((case-fold-search t)
 	 (rname (if (stringp class)
-		    (concat
+		    (concat 
 		     "\\("
 		     ;; Traditional name or class::name
 		     "\\("
 		     "\\(" (regexp-quote (downcase class)) "::\\)?"
 		     (regexp-quote (downcase name))
 		     "\\>\\)"
-		     (concat
+		     (concat 
 		      "\\|"
 		      ;; class__define or just class
 		      (regexp-quote (downcase class)) "\\(__define\\)?")
 		     "\\)")
 		  (regexp-quote (downcase name))))
-
+	 
 	 ;; NAME tag plus the routine name.  The new version is from JD.
-	 (name-re (concat
+	 (name-re (concat 
 		   "\\(^;+\\*?[ \t]*"
 		   idlwave-help-doclib-name
 		   "\\([ \t]*:\\|[ \t]*$\\)[ \t]*\\(\n;+[ \t]*\\)*"
@@ -999,7 +1021,7 @@
 		       (regexp-quote (upcase keyword))
 		      "\\>")))
 	 dstart dend name-pos kwds-pos kwd-pos)
-    (catch 'exit
+    (catch 'exit 
       (save-excursion
 	(goto-char (point-min))
 	(while (and (setq dstart (re-search-forward idlwave-doclib-start nil t))
@@ -1007,7 +1029,7 @@
 	  ;; found a routine header
 	  (goto-char dstart)
 	  (if (setq name-pos (re-search-forward name-re dend t))
-	      (progn
+	      (progn 
 		(if keyword
 		    ;; We do need a keyword
 		    (progn
@@ -1089,7 +1111,7 @@
       (idlwave-help-find-first-header nil)
     (setq idlwave-help-in-header nil)
     (idlwave-help-toggle-header-match-and-def arg 'top)))
-
+  
 (defun idlwave-help-toggle-header-match-and-def (arg &optional top)
   (interactive "P")
   (let ((args idlwave-help-args)
@@ -1101,7 +1123,7 @@
 	  (setq pos idlwave-help-def-pos))
       ;; Try to display header
       (setq pos (apply 'idlwave-help-find-in-doc-header
-		       (if top
+		       (if top 
 			   (list (car args) (nth 1 args) (nth 2 args) nil)
 			 args)))
       (if pos
@@ -1135,7 +1157,7 @@
 	      (font-lock-fontify-buffer))
 	  (set-syntax-table syntax-table)))))
 
-
+      
 (defun idlwave-help-error (name type class keyword)
   (error "Can't find help on %s%s %s"
 	 (or (and (or class name) (idlwave-make-full-name class name))
@@ -1191,6 +1213,98 @@
   (let ((entry (idlwave-best-rinfo-assoc name type class (idlwave-routines))))
     (idlwave-entry-has-help entry)))
 
+;;----- Control the IDL Assistant, which shipped with IDL v6.2
+(defvar idlwave-help-assistant-process nil)
+(defvar idlwave-help-assistant-socket nil)
+
+;; The Windows version does not have a !DIR/bin/* set of front-end
+;; scripts, but instead only links directly to bin.x86.  As a result,
+;; we must pass the -profile argument as well.
+(defvar idlwave-help-assistant-command 
+  (if (memq system-type '(ms-dos windows-nt))
+      "bin/bin.x86/idl_assistant"
+    "bin/idl_assistant")
+  "The command, rooted at idlwave-system-directory, which invokes the
+IDL assistant.")
+
+(defun idlwave-help-assistant-available ()
+  (if idlwave-help-assistant-available
+      (eq idlwave-help-assistant-available t)
+    (setq idlwave-help-assistant-available
+	  (if (file-executable-p (idlwave-help-assistant-command))
+	      t
+	    'not-available))))
+
+(defun idlwave-help-assistant-command ()
+  (expand-file-name idlwave-help-assistant-command (idlwave-sys-dir)))
+
+(defun idlwave-help-assistant-start (&optional link)
+  "Start the IDL Assistant, loading LINK, if passed."
+  (when (or (not idlwave-help-assistant-socket)
+	    (not (eq (process-status idlwave-help-assistant-socket) 'open)))
+    (let* ((help-loc (idlwave-html-help-location))
+	   (command (idlwave-help-assistant-command))
+	   (extra-args 
+	    (nconc
+	     (if (memq system-type '(ms-dos windows-nt))
+		 `("-profile" ,(expand-file-name "idl.adp" help-loc)))
+	     (if link 
+		 `("-file" ,(expand-file-name link help-loc)))))
+	   port)
+      (if idlwave-help-assistant-socket 
+	  (delete-process idlwave-help-assistant-socket))
+	
+      (setq idlwave-help-assistant-process 
+	    (apply 'start-process 
+		   "IDL_ASSISTANT_PROC" nil command "-server" extra-args))
+      
+      (set-process-filter idlwave-help-assistant-process
+			  (lambda (proc string)
+			    (setq port (string-to-number string))))
+      (unless (accept-process-output idlwave-help-assistant-process 15)
+	(error "Failed binding IDL_ASSISTANT socket"))
+      (if (not port)
+	  (error "Unable to open IDL_ASSISTANT.")
+	(set-process-filter idlwave-help-assistant-process nil)
+	(setq idlwave-help-assistant-socket 
+	      (open-network-stream "IDL_ASSISTANT_SOCK" 
+				   nil "localhost" port))
+	(if (eq (process-status idlwave-help-assistant-socket) 'open)
+	    (process-send-string  idlwave-help-assistant-socket
+				  (concat "setHelpPath " help-loc "\n"))
+	  (idlwave-help-assistant-close)
+	  (error "Cannot communicate with IDL_ASSISTANT"))))))
+
+(defun idlwave-help-assistant-raise ()
+  (idlwave-help-assistant-start)
+  (process-send-string idlwave-help-assistant-socket "raise\n"))
+
+(defun idlwave-help-assistant-open-link (&optional link)
+  ;; Open a link (file name with anchor, no leading path) in the assistant.
+  (if link 
+      (let ((file (expand-file-name link (idlwave-html-help-location))))
+	(idlwave-help-assistant-start link)
+	(process-send-string idlwave-help-assistant-socket
+			     (concat "openLink " file "\n"))
+	(string-match "\.html" link)
+	(process-send-string idlwave-help-assistant-socket
+			     (concat "searchIndexNoOpen " 
+				     (substring link 0 (match-beginning 0))
+				     "\n")))
+    (idlwave-help-assistant-raise)))
+  
+(defun idlwave-help-assistant-close ()
+  (when (and idlwave-help-assistant-process
+	     (eq (process-status idlwave-help-assistant-process) 'run))
+    (when idlwave-help-assistant-socket
+      (process-send-string idlwave-help-assistant-socket "quit\n")
+      (delete-process idlwave-help-assistant-socket))
+    (stop-process idlwave-help-assistant-process)
+    (delete-process idlwave-help-assistant-process)
+    (setq idlwave-help-assistant-socket nil
+	  idlwave-help-assistant-process nil)))
+
+
 (provide 'idlw-help)
 (provide 'idlwave-help)
 
--- a/lisp/progmodes/idlw-rinfo.el	Fri Apr 07 12:02:40 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2069 +0,0 @@
-;;; idlw-rinfo.el --- Routine Information for IDLWAVE
-;; Copyright (c) 1999 Carsten Dominik
-;; Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-;; Free Software Foundation, Inc.
-
-;; Author: J.D. Smith <jdsmith@as.arizona.edu>
-;; Version: 5.7_22
-;; Keywords: languages
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs 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.
-
-;; GNU Emacs 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 GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
-
-;;; Commentary:
-
-;; The constants which contain information about IDLs builtin
-;; functions, procedures, system variables and class tags.  This
-;; information is extracted automatically from the IDL documentation
-;; and by talking to IDL.
-;;
-;; Created by get_html_rinfo on Wed May 11 14:52:40 2005
-;; IDL version: 6.1
-;; Number of files scanned:  3393
-;; Number of routines found: 1850
-;; Number of keywords found: 7685
-;;
-;; New versions of IDLWAVE, documentation, and more information
-;; available from:
-;;                 http://idlwave.org
-;; 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; Code:
-(defconst idlwave-system-routines
-  '(
-    ("ANNOTATE" pro nil (system) "%s" ("A9.html" ("COLOR_INDICES" . 756628) ("DRAWABLE" . 756633) ("LOAD_FILE" . 756636) ("TEK_COLORS" . 756639) ("WINDOW" . 756642)))
-    ("ARROW" pro nil (system) "%s, X0, Y0, X1, Y1" ("A15.html" ("COLOR" . 756673) ("DATA" . 756664) ("HSIZE" . 756670) ("HTHICK" . 756676) ("NORMALIZED" . 756667) ("SOLID" . 756679) ("THICK" . 756682)))
-    ("AXIS" pro nil (system) "%s [, X [, Y [, Z]]]" ("A20.html" ("SAVE" . 986499) ("XAXIS" . 983775) ("XLOG" . 983760) ("YAXIS" . 983765) ("YLOG" . 983752) ("YNOZERO" . 158293) ("ZAXIS" . 983724)) ("graphkeyw2.html" ("CHARSIZE" . 266973) ("CHARTHICK" . 331668) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("FONT" . 331795) ("NODATA" . 316018) ("NOERASE" . 316024) ("NORMAL" . 315963) ("SUBTITLE" . 316057) ("T3D" . 315956) ("TICKLEN" . 332207) ("XCHARSIZE" . 331699) ("XGRIDSTYLE" . 332009) ("XMARGIN" . 332038) ("XMINOR" . 332061) ("XRANGE" . 332090) ("XSTYLE" . 332116) ("XTHICK" . 332298) ("XTICK_GET" . 332321) ("XTICKFORMAT" . 332347) ("XTICKINTERVAL" . 332463) ("XTICKLAYOUT" . 332488) ("XTICKLEN" . 332513) ("XTICKNAME" . 332536) ("XTICKS" . 332559) ("XTICKUNITS" . 332586) ("XTICKV" . 332628) ("XTITLE" . 316100) ("YCHARSIZE" . 331699) ("YGRIDSTYLE" . 332009) ("YMARGIN" . 332038) ("YMINOR" . 332061) ("YRANGE" . 332090) ("YSTYLE" . 332116) ("YTHICK" . 332298) ("YTICK_GET" . 332321) ("YTICKFORMAT" . 332347) ("YTICKINTERVAL" . 332463) ("YTICKLAYOUT" . 332488) ("YTICKLEN" . 332513) ("YTICKNAME" . 332536) ("YTICKS" . 332559) ("YTICKUNITS" . 332586) ("YTICKV" . 332628) ("YTITLE" . 316100) ("ZCHARSIZE" . 331699) ("ZGRIDSTYLE" . 332009) ("ZMARGIN" . 332038) ("ZMINOR" . 332061) ("ZRANGE" . 332090) ("ZSTYLE" . 332116) ("ZTHICK" . 332298) ("ZTICK_GET" . 332321) ("ZTICKFORMAT" . 332347) ("ZTICKINTERVAL" . 332463) ("ZTICKLAYOUT" . 332488) ("ZTICKLEN" . 332513) ("ZTICKNAME" . 332536) ("ZTICKS" . 332559) ("ZTICKUNITS" . 332586) ("ZTICKV" . 332628) ("ZTITLE" . 316100) ("ZVALUE" . 316102)))
-    ("BAR_PLOT" pro nil (system) "%s, Values" ("B.html" ("BACKGROUND" . 756719) ("BARNAMES" . 756722) ("BAROFFSET" . 756725) ("BARSPACE" . 756728) ("BARWIDTH" . 756731) ("BASELINES" . 756734) ("BASERANGE" . 756737) ("COLORS" . 756740) ("OUTLINE" . 756743) ("OVERPLOT" . 756746) ("ROTATE" . 756749) ("TITLE" . 756752) ("XTITLE" . 756755) ("YTITLE" . 756758)))
-    ("BLAS_AXPY" pro nil (system) "%s, Y, A, X [, D1, Loc1 [, D2, Range]]" ("B13.html"))
-    ("BOX_CURSOR" pro nil (system) "%s, [ X0, Y0, NX, NY]" ("B15.html" ("FIXED_SIZE" . 756816) ("INIT" . 756813) ("MESSAGE" . 756819)))
-    ("BREAK" pro nil (system) "%s" ("B16.html"))
-    ("BREAKPOINT" pro nil (system) "%s [, File], Index" ("B17.html" ("AFTER" . 113854) ("CLEAR" . 675862) ("CONDITION" . 113859) ("DISABLE" . 907385) ("ENABLE" . 984755) ("ON_RECOMPILE" . 984772) ("ONCE" . 990987) ("SET" . 675866)))
-    ("BYTEORDER" pro nil (system) "%s, Variable1, ..., Variablen" ("B21.html" ("DTOVAX" . 906658) ("DTOXDR" . 906876) ("FTOVAX" . 675911) ("FTOXDR" . 906884) ("HTONL" . 906665) ("HTONS" . 675913) ("L64SWAP" . 965960) ("LSWAP" . 675915) ("NTOHL" . 675917) ("NTOHS" . 675919) ("SSWAP" . 675921) ("SWAP_IF_BIG_ENDIAN" . 906711) ("SWAP_IF_LITTLE_ENDIAN" . 906720) ("VAXTOD" . 675923) ("VAXTOF" . 906693) ("XDRTOD" . 906679) ("XDRTOF" . 675925)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("CALDAT" pro nil (system) "%s, Julian, Month [, Day [, Year [, Hour [, Minute [, Second]]]]]" ("C2.html"))
-    ("CALENDAR" pro nil (system) "%s [[, Month] , Year]" ("C3.html"))
-    ("CALL_METHOD" pro nil (system) "%s, Name, ObjRef, [, P1, ..., Pn]" ("C6.html"))
-    ("CALL_PROCEDURE" pro nil (system) "%s, Name [, P1, ..., Pn]" ("C7.html"))
-    ("CATCH" pro nil (system) "%s, [Variable]" ("C9.html" ("CANCEL" . 716974)))
-    ("CD" pro nil (system) "%s [, Directory]" ("C10.html" ("CURRENT" . 676059)))
-    ("CDF_ATTDELETE" pro nil (system) "%s, Id, Attribute [, EntryNum]" ("CDF-routines9.html" ("ZVARIABLE" . 1002456)))
-    ("CDF_ATTGET" pro nil (system) "%s, Id, Attribute, EntryNum, Value" ("CDF-routines11.html" ("CDF_TYPE" . 1003937) ("ZVARIABLE" . 997078)))
-    ("CDF_ATTINQ" pro nil (system) "%s, Id, Attribute, Name, Scope, MaxEntry [, MaxZEntry]" ("CDF-routines12.html"))
-    ("CDF_ATTPUT" pro nil (system) "%s, Id, Attribute, EntryNum, Value" ("CDF-routines14.html" ("ZVARIABLE" . 997143)))
-    ("CDF_ATTRENAME" pro nil (system) "%s, Id, OldAttr, NewName" ("CDF-routines15.html"))
-    ("CDF_CLOSE" pro nil (system) "%s, Id" ("CDF-routines16.html"))
-    ("CDF_COMPRESSION" pro nil (system) "%s, Id" ("CDF-routines17.html" ("GET_COMPRESSION" . 1019949) ("GET_GZIP_LEVEL" . 1019952) ("GET_VAR_COMPRESSION" . 1019955) ("GET_VAR_GZIP_LEVEL" . 1019957) ("SET_COMPRESSION" . 1019965) ("SET_GZIP_LEVEL" . 1020981) ("SET_VAR_COMPRESSION" . 1019968) ("SET_VAR_GZIP_LEVEL" . 1026491) ("VARIABLE" . 1026493) ("ZVARIABLE" . 1019982)))
-    ("CDF_CONTROL" pro nil (system) "%s, Id" ("CDF-routines18.html" ("ATTRIBUTE" . 997198) ("GET_ATTR_INFO" . 997201) ("GET_CACHESIZE" . 997209) ("GET_COPYRIGHT" . 997212) ("GET_FILENAME" . 997215) ("GET_FORMAT" . 997218) ("GET_NEGTOPOSFP0_MODE" . 997226) ("GET_NUMATTRS" . 997229) ("GET_READONLY_MODE" . 1047427) ("GET_RVAR_CACHESIZE" . 997236) ("GET_VAR_INFO" . 997242) ("GET_ZMODE" . 997259) ("GET_ZVAR_CACHESIZE" . 997266) ("SET_CACHESIZE" . 997269) ("SET_EXTENDRECS" . 997272) ("SET_INITIALRECS" . 997275) ("SET_NEGTOPOSFP0_MODE" . 997278) ("SET_PADVALUE" . 997281) ("SET_READONLY_MODE" . 997284) ("SET_RVAR_CACHESIZE" . 997287) ("SET_RVARS_CACHESIZE" . 997290) ("SET_ZMODE" . 997293) ("SET_ZVAR_CACHESIZE" . 997296) ("SET_ZVARS_CACHESIZE" . 997298) ("VARIABLE" . 997301) ("ZVARIABLE" . 997307)))
-    ("CDF_DELETE" pro nil (system) "%s, Id" ("CDF-routines20.html"))
-    ("CDF_DOC" pro nil (system) "%s, Id, Version, Release, Copyright" ("CDF-routines21.html" ("INCREMENT" . 997427)))
-    ("CDF_EPOCH" pro nil (system) "%s, Epoch, Year [, Month, Day, Hour, Minute, Second, Milli]" ("CDF-routines23.html" ("BREAKDOWN_EPOCH" . 997509) ("COMPUTE_EPOCH" . 997512)))
-    ("CDF_LIB_INFO" pro nil (system) "%s" ("CDF-routines27.html" ("COPYRIGHT" . 997623) ("INCREMENT" . 997626) ("RELEASE" . 997629) ("SUBINCREMENT" . 997632) ("VERSION" . 997635)))
-    ("CDF_VARDELETE" pro nil (system) "%s, Id, Variable" ("CDF-routines31.html" ("ZVARIABLE" . 997776)))
-    ("CDF_VARGET" pro nil (system) "%s, Id, Variable, Value" ("CDF-routines32.html" ("COUNT" . 997847) ("INTERVAL" . 997850) ("OFFSET" . 997853) ("REC_COUNT" . 997856) ("REC_INTERVAL" . 997859) ("REC_START" . 997862) ("STRING" . 997865) ("ZVARIABLE" . 997868)))
-    ("CDF_VARGET1" pro nil (system) "%s, Id, Variable, Value" ("CDF-routines33.html" ("OFFSET" . 997909) ("REC_START" . 997912) ("STRING" . 997915) ("ZVARIABLE" . 997918)))
-    ("CDF_VARPUT" pro nil (system) "%s, Id, Variable, Value" ("CDF-routines36.html" ("COUNT" . 998005) ("INTERVAL" . 998008) ("OFFSET" . 998011) ("REC_INTERVAL" . 998014) ("REC_START" . 998017) ("ZVARIABLE" . 998020)))
-    ("CDF_VARRENAME" pro nil (system) "%s, Id, OldVariable, NewName" ("CDF-routines37.html" ("ZVARIABLE" . 998048)))
-    ("CHOLDC" pro nil (system) "%s, A, P" ("C17.html" ("DOUBLE" . 1108599)))
-    ("CIR_3PNT" pro nil (system) "%s, X, Y, R, X0, Y0" ("C20.html"))
-    ("CLOSE" pro nil (system) "%s[, Unit1, ..., Unitn]" ("C21.html" ("ALL" . 676122) ("EXIT_STATUS" . 1017312) ("FILE" . 1017618) ("FORCE" . 1017321)))
-    ("COLOR_CONVERT" pro nil (system) "%s, I0, I1, I2, O0, O1, O2" ("C25.html" ("HLS_RGB" . 861671) ("HSV_RGB" . 861673) ("RGB_HLS" . 861669) ("RGB_HSV" . 676146)))
-    ("CONSTRAINED_MIN" pro nil (system) "%s, X, Xbnd, Gbnd, Nobj, Gcomp, Inform" ("C38.html" ("EPSTOP" . 908210) ("LIMSER" . 927415) ("MAXIMIZE" . 927406) ("NSTOP" . 975889) ("REPORT" . 942066) ("TITLE" . 927408)))
-    ("CONTOUR" pro nil (system) "%s, Z [, X, Y]" ("C40.html" ("C_ANNOTATION" . 1023103) ("C_CHARSIZE" . 676279) ("C_CHARTHICK" . 905138) ("C_COLORS" . 676281) ("C_LABELS" . 676286) ("C_LINESTYLE" . 676292) ("C_ORIENTATION" . 676298) ("C_SPACING" . 676300) ("C_THICK" . 676302) ("CELL_FILL" . 892176) ("CLOSED" . 676304) ("DOWNHILL" . 676306) ("FILL" . 676308) ("FOLLOW" . 676311) ("IRREGULAR" . 879096) ("ISOTROPIC" . 676316) ("LEVELS" . 927695) ("MAX_VALUE" . 676323) ("MIN_VALUE" . 47033) ("NLEVELS" . 676325) ("OVERPLOT" . 861732) ("PATH_DATA_COORDS" . 879089) ("PATH_DOUBLE" . 1015046) ("PATH_FILENAME" . 676329) ("PATH_INFO" . 746342) ("PATH_XY" . 746343) ("TRIANGULATION" . 746344) ("XLOG" . 158329) ("YLOG" . 158344) ("ZAXIS" . 676344)))
-    ("COPY_LUN" pro nil (system) "%s, FromUnit, ToUnit [, Num]" ("C44.html" ("EOF" . 1090923) ("LINES" . 1090926) ("TRANSFER_COUNT" . 1090928)))
-    ("CPU" pro nil (system) "%s" ("C48.html" ("RESET" . 1178606) ("RESTORE" . 1178609) ("TPOOL_MAX_ELTS" . 1032362) ("TPOOL_MIN_ELTS" . 1032364) ("TPOOL_NTHREADS" . 1032366) ("VECTOR_ENABLE" . 1032368)))
-    ("CREATE_VIEW" pro nil (system) "%s" ("C52.html" ("AX" . 756876) ("AY" . 756879) ("AZ" . 756882) ("PERSP" . 756885) ("RADIANS" . 756888) ("WINX" . 756891) ("WINY" . 756894) ("XMAX" . 756897) ("XMIN" . 756900) ("YMAX" . 756903) ("YMIN" . 756906) ("ZFAC" . 756909) ("ZMAX" . 756912) ("ZMIN" . 756915) ("ZOOM" . 756918)))
-    ("CURSOR" pro nil (system) "%s, X, Y [, Wait]" ("C57.html" ("CHANGE" . 676458) ("DATA" . 676460) ("DEVICE" . 676464) ("DOWN" . 676462) ("NORMAL" . 676466) ("NOWAIT" . 676468) ("UP" . 676470) ("WAIT" . 676472)))
-    ("CW_ANIMATE_GETP" pro nil (system) "%s, Widget, Pixmaps" ("C62.html" ("KILL_ANYWAY" . 853956)))
-    ("CW_ANIMATE_LOAD" pro nil (system) "%s, Widget" ("C63.html" ("CYCLE" . 853989) ("FRAME" . 853992) ("IMAGE" . 853995) ("ORDER" . 853998) ("WINDOW" . 854001) ("XOFFSET" . 854006) ("YOFFSET" . 854009)))
-    ("CW_ANIMATE_RUN" pro nil (system) "%s, Widget [, Rate]" ("C64.html" ("NFRAMES" . 854045) ("STOP" . 854048)))
-    ("CW_LIGHT_EDITOR_GET" pro nil (system) "%s, WidgetID" ("C75.html" ("DIRECTION_DISABLED" . 1001479) ("DRAG_EVENTS" . 1001481) ("HIDE_DISABLED" . 1001485) ("LIGHT" . 1001487) ("LOCATION_DISABLED" . 1001489) ("TYPE_DISABLED" . 1001491) ("XRANGE" . 1001493) ("XSIZE" . 1001495) ("YRANGE" . 1001497) ("YSIZE" . 1001499) ("ZRANGE" . 1001501)))
-    ("CW_LIGHT_EDITOR_SET" pro nil (system) "%s, WidgetID" ("C76.html" ("DIRECTION_DISABLED" . 1001515) ("DRAG_EVENTS" . 1001517) ("HIDE_DISABLED" . 1001521) ("LIGHT" . 1001523) ("LOCATION_DISABLED" . 1001525) ("TYPE_DISABLED" . 1001527) ("XRANGE" . 1001529) ("XSIZE" . 1001531) ("YRANGE" . 1001533) ("YSIZE" . 1001535) ("ZRANGE" . 1001537)))
-    ("CW_PALETTE_EDITOR_GET" pro nil (system) "%s, WidgetID" ("C79.html" ("ALPHA" . 1001551) ("HISTOGRAM" . 1001677)))
-    ("CW_PALETTE_EDITOR_SET" pro nil (system) "%s, WidgetID" ("C80.html" ("ALPHA" . 1001567) ("HISTOGRAM" . 1001569)))
-    ("DEFINE_KEY" pro nil (system) "%s, Key [, Value]" ("D5.html" ("BACK_CHARACTER" . 1001954) ("BACK_WORD" . 1001956) ("CONTROL" . 1001958) ("DELETE_CHARACTER" . 1001962) ("DELETE_CURRENT" . 1001964) ("DELETE_EOL" . 1001966) ("DELETE_LINE" . 1001968) ("DELETE_WORD" . 1001970) ("END_OF_FILE" . 1001974) ("END_OF_LINE" . 1001972) ("ENTER_LINE" . 1001976) ("ESCAPE" . 1001978) ("FORWARD_CHARACTER" . 1001984) ("FORWARD_WORD" . 1001986) ("INSERT_OVERSTRIKE_TOGGLE" . 1001988) ("MATCH_PREVIOUS" . 676503) ("NEXT_LINE" . 1002066) ("NOECHO" . 676505) ("PREVIOUS_LINE" . 1002076) ("RECALL" . 1002078) ("REDRAW" . 1002103) ("START_OF_LINE" . 1002105) ("TERMINATE" . 676507)))
-    ("DEFINE_MSGBLK" pro nil (system) "%s, BlockName, ErrorNames, ErrorFormats" ("D6.html" ("IGNORE_DUPLICATE" . 991846) ("PREFIX" . 991848)))
-    ("DEFINE_MSGBLK_FROM_FILE" pro nil (system) "%s, Filename" ("D7.html" ("BLOCK" . 991885) ("IGNORE_DUPLICATE" . 991890) ("PREFIX" . 991892) ("VERBOSE" . 991894)))
-    ("DEFSYSV" pro nil (system) "%s, Name, Value [, Read_Only]" ("D9.html" ("EXISTS" . 676585)))
-    ("DELVAR" pro nil (system) "%s, V1, ..., Vn" ("D10.html"))
-    ("DENDRO_PLOT" pro nil (system) "%s, Clusters, Linkdistance" ("D11.html" ("LABEL_CHARSIZE" . 1033249) ("LABEL_CHARTHICK" . 1032525) ("LABEL_COLOR" . 1032528) ("LABEL_NAMES" . 1032531) ("LABEL_ORIENTATION" . 1032535) ("LINECOLOR" . 1032538) ("ORIENTATION" . 1032541) ("OVERPLOT" . 1032569)) ("graphkeyw2.html" ("BACKGROUND" . 328424) ("CHARSIZE" . 266973) ("CHARTHICK" . 331668) ("CLIP" . 315949) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("FONT" . 331795) ("LINESTYLE" . 331728) ("NOCLIP" . 323508) ("NODATA" . 316018) ("NOERASE" . 316024) ("NORMAL" . 315963) ("POSITION" . 316026) ("PSYM" . 316038) ("SUBTITLE" . 316057) ("SYMSIZE" . 316061) ("T3D" . 315956) ("THICK" . 316006) ("TICKLEN" . 332207) ("TITLE" . 332238) ("XCHARSIZE" . 331699) ("XGRIDSTYLE" . 332009) ("XMARGIN" . 332038) ("XMINOR" . 332061) ("XRANGE" . 332090) ("XSTYLE" . 332116) ("XTHICK" . 332298) ("XTICK_GET" . 332321) ("XTICKFORMAT" . 332347) ("XTICKINTERVAL" . 332463) ("XTICKLAYOUT" . 332488) ("XTICKLEN" . 332513) ("XTICKNAME" . 332536) ("XTICKS" . 332559) ("XTICKUNITS" . 332586) ("XTICKV" . 332628) ("XTITLE" . 316100) ("YCHARSIZE" . 331699) ("YGRIDSTYLE" . 332009) ("YMARGIN" . 332038) ("YMINOR" . 332061) ("YRANGE" . 332090) ("YSTYLE" . 332116) ("YTHICK" . 332298) ("YTICK_GET" . 332321) ("YTICKFORMAT" . 332347) ("YTICKINTERVAL" . 332463) ("YTICKLAYOUT" . 332488) ("YTICKLEN" . 332513) ("YTICKNAME" . 332536) ("YTICKS" . 332559) ("YTICKUNITS" . 332586) ("YTICKV" . 332628) ("YTITLE" . 316100) ("ZCHARSIZE" . 331699) ("ZGRIDSTYLE" . 332009) ("ZMARGIN" . 332038) ("ZMINOR" . 332061) ("ZRANGE" . 332090) ("ZSTYLE" . 332116) ("ZTHICK" . 332298) ("ZTICK_GET" . 332321) ("ZTICKFORMAT" . 332347) ("ZTICKINTERVAL" . 332463) ("ZTICKLAYOUT" . 332488) ("ZTICKLEN" . 332513) ("ZTICKNAME" . 332536) ("ZTICKS" . 332559) ("ZTICKUNITS" . 332586) ("ZTICKV" . 332628) ("ZTITLE" . 316100) ("ZVALUE" . 316102)))
-    ("DENDROGRAM" pro nil (system) "%s, Clusters, Linkdistance, Outverts, Outconn" ("D12.html" ("LEAFNODES" . 1032898)))
-    ("DEVICE" pro nil (system) "%s" ("D16.html" ) ("devices4.html" ("AVANTGARDE" . 482989) ("AVERAGE_LINES" . 144491) ("BINARY" . 144309) ("BITS_PER_PIXEL" . 144308) ("BKMAN" . 143940) ("BOLD" . 144497) ("BOOK" . 144499) ("BYPASS_TRANSLATION" . 144256) ("CLOSE" . 144712) ("CLOSE_DOCUMENT" . 451438) ("CLOSE_FILE" . 144158) ("CMYK" . 732196) ("COLOR" . 144479) ("COLORS" . 144313) ("COPY" . 143954) ("COURIER" . 144503) ("CURSOR_CROSSHAIR" . 144502) ("CURSOR_IMAGE" . 143934) ("CURSOR_MASK" . 144824) ("CURSOR_ORIGINAL" . 144828) ("CURSOR_STANDARD" . 144830) ("CURSOR_XY" . 143722) ("DECOMPOSED" . 144834) ("DEMI" . 143930) ("DIRECT_COLOR" . 145006) ("EJECT" . 143752) ("ENCAPSULATED" . 143751) ("ENCODING" . 144315) ("FILENAME" . 143748) ("FLOYD" . 144833) ("FONT_INDEX" . 143943) ("FONT_SIZE" . 144522) ("GET_CURRENT_FONT" . 144518) ("GET_DECOMPOSED" . 554681) ("GET_FONTNAMES" . 554610) ("GET_FONTNUM" . 144326) ("GET_GRAPHICS_FUNCTION" . 145007) ("GET_PAGE_SIZE" . 587045) ("GET_SCREEN_SIZE" . 149759) ("GET_VISUAL_DEPTH" . 452299) ("GET_VISUAL_NAME" . 551382) ("GET_WINDOW_POSITION" . 143947) ("GET_WRITE_MASK" . 143949) ("GIN_CHARS" . 143951) ("GLYPH_CACHE" . 499334) ("HELVETICA" . 144524) ("INCHES" . 144166) ("INDEX_COLOR" . 451483) ("ISOLATIN1" . 144322) ("ITALIC" . 143723) ("LANDSCAPE" . 606950) ("LANGUAGE_LEVEL" . 144167) ("LIGHT" . 618160) ("MEDIUM" . 144529) ("NARROW" . 417784) ("NCAR" . 144157) ("OBLIQUE" . 562813) ("OPTIMIZE" . 144405) ("ORDERED" . 143941) ("OUTPUT" . 144538) ("PALATINO" . 144366) ("PIXELS" . 144468) ("PLOT_TO" . 485584) ("PLOTTER_ON_OFF" . 144371) ("POLYFILL" . 144368) ("PORTRAIT" . 144170) ("PRE_DEPTH" . 144169) ("PRE_XSIZE" . 601831) ("PRE_YSIZE" . 597448) ("PREVIEW" . 601886) ("PRINT_FILE" . 556886) ("PSEUDO_COLOR" . 144688) ("RESET_STRING" . 144455) ("RESOLUTION" . 144473) ("RETAIN" . 144472) ("SCALE_FACTOR" . 144547) ("SCHOOLBOOK" . 144551) ("SET_CHARACTER_SIZE" . 486143) ("SET_COLORMAP" . 161043) ("SET_COLORS" . 486222) ("SET_FONT" . 499045) ("SET_GRAPHICS_FUNCTION" . 499029) ("SET_RESOLUTION" . 144941) ("SET_STRING" . 144466) ("SET_TRANSLATION" . 150093) ("SET_WRITE_MASK" . 143957) ("STATIC_COLOR" . 144842) ("STATIC_GRAY" . 144844) ("SYMBOL" . 144554) ("TEK4014" . 144553) ("TEK4100" . 144475) ("TEXT" . 144841) ("THRESHOLD" . 144376) ("TIMES" . 144557) ("TRANSLATION" . 144556) ("TRUE_COLOR" . 144849) ("TT_FONT" . 542703) ("TTY" . 144477) ("VT240" . 144174) ("VT241" . 144174) ("VT340" . 144532) ("VT341" . 144532) ("WINDOW_STATE" . 144546) ("XOFFSET" . 143719) ("XON_XOFF" . 144379) ("XSIZE" . 144540) ("YOFFSET" . 144175) ("YSIZE" . 144568) ("Z_BUFFERING" . 144512) ("ZAPFCHANCERY" . 144513) ("ZAPFDINGBATS" . 144515)))
-    ("DFPMIN" pro nil (system) "%s, X, Gtol, Fmin, Func, Dfunc" ("D17.html" ("DOUBLE" . 50547) ("EPS" . 50550) ("ITER" . 50553) ("ITMAX" . 50556) ("STEPMAX" . 50559) ("TOLX" . 50562)))
-    ("DISSOLVE" pro nil (system) "%s, Image" ("D28.html" ("DELAY" . 757174) ("ORDER" . 757177) ("SIZ" . 757180) ("X0" . 757184) ("Y0" . 757184)))
-    ("DLM_LOAD" pro nil (system) "%s, DLMNameStr1 [, DLMNameStr2,..., DLMNameStrn]" ("D31.html"))
-    ("DLM_REGISTER" pro nil (system) "%s, DLMDefFilePath1 [, DLMDefFilePath2, ..., DLMDefFilePathn]" ("D32.html"))
-    ("DOC_LIBRARY" pro nil (system) "%s [, Name]" ("D33.html" ("DIRECTORY" . 1003439) ("MULTI" . 1003447) ("PRINT" . 42998)))
-    ("DRAW_ROI" pro nil (system) "%s, oROI" ("D35.html" ("LINE_FILL" . 986287) ("SPACING" . 986289)) ("graphkeyw2.html" ("CLIP" . 315949) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("LINESTYLE" . 331728) ("NOCLIP" . 323508) ("NORMAL" . 315963) ("ORIENTATION" . 315964) ("PSYM" . 316038) ("SYMSIZE" . 316061) ("T3D" . 315956) ("THICK" . 316006)))
-    ("EFONT" pro nil (system) "%s [, Init_Font]" ("E.html" ("BLOCK" . 921048) ("GROUP" . 988298)))
-    ("EMPTY" pro nil (system) "%s" ("E5.html"))
-    ("ENABLE_SYSRTN" pro nil (system) "%s [, Routines]" ("E6.html" ("DISABLE" . 986251) ("EXCLUSIVE" . 986253) ("FUNCTIONS" . 986256)))
-    ("ERASE" pro nil (system) "%s [, Background_Color]" ("E9.html" ("CHANNEL" . 676712) ("COLOR" . 676714)))
-    ("ERRPLOT" pro nil (system) "%s, [ X, ] Low, High" ("E14.html" ("WIDTH" . 757212)))
-    ("EXIT" pro nil (system) "%s" ("E16.html" ("NO_CONFIRM" . 126978) ("STATUS" . 126983)))
-    ("EXPAND" pro nil (system) "%s, A, Nx, Ny, Result" ("E18.html" ("FILLVAL" . 986579) ("MAXVAL" . 757253)))
-    ("FILE_CHMOD" pro nil (system) "%s, File [, Mode]" ("F6.html" ("A_EXECUTE" . 882191) ("A_READ" . 882193) ("A_WRITE" . 882195) ("G_EXECUTE" . 882197) ("G_READ" . 882199) ("G_WRITE" . 882201) ("NOEXPAND_PATH" . 882956) ("O_EXECUTE" . 882203) ("O_READ" . 882205) ("O_WRITE" . 882207) ("SETGID" . 900602) ("SETUID" . 900604) ("STICKY_BIT" . 900606) ("U_EXECUTE" . 882209) ("U_READ" . 882211) ("U_WRITE" . 882213)))
-    ("FILE_COPY" pro nil (system) "%s, SourcePath, DestPath" ("F7.html" ("ALLOW_SAME" . 906390) ("COPY_NAMED_PIPE" . 906392) ("COPY_SYMLINK" . 906394) ("FORCE" . 906396) ("NOEXPAND_PATH" . 906399) ("OVERWRITE" . 906404) ("RECURSIVE" . 906406) ("REQUIRE_DIRECTORY" . 906412) ("VERBOSE" . 906414)))
-    ("FILE_DELETE" pro nil (system) "%s, File1 [,... Filen]" ("F8.html" ("ALLOW_NONEXISTENT" . 882944) ("NOEXPAND_PATH" . 906788) ("QUIET" . 906823) ("RECURSIVE" . 892369) ("VERBOSE" . 906799)))
-    ("FILE_LINK" pro nil (system) "%s, SourcePath, DestPath" ("F13.html" ("ALLOW_SAME" . 906533) ("HARDLINK" . 906535) ("NOEXPAND_PATH" . 906537) ("VERBOSE" . 906542)))
-    ("FILE_MKDIR" pro nil (system) "%s, File1 [,... FileN]" ("F14.html" ("NOEXPAND_PATH" . 882989)))
-    ("FILE_MOVE" pro nil (system) "%s, SourcePath, DestPath" ("F15.html" ("ALLOW_SAME" . 906590) ("NOEXPAND_PATH" . 906592) ("OVERWRITE" . 906597) ("REQUIRE_DIRECTORY" . 906599) ("VERBOSE" . 906601)))
-    ("FLICK" pro nil (system) "%s, A, B [, Rate]" ("F25.html"))
-    ("FLOW3" pro nil (system) "%s, Vx, Vy, Vz" ("F28.html" ("ARROWSIZE" . 757304) ("BLOB" . 757307) ("LEN" . 757310) ("NSTEPS" . 757313) ("NVECS" . 757316) ("SX" . 757321) ("SY" . 757321) ("SZ" . 757321)))
-    ("FLUSH" pro nil (system) "%s, Unit1, ..., Unitn" ("F30.html"))
-    ("FREE_LUN" pro nil (system) "%s [, Unit1, ..., Unitn]" ("F34.html" ("EXIT_STATUS" . 875865) ("FORCE" . 875880)))
-    ("FUNCT" pro nil (system) "%s, X, A, F [, Pder]" ("F37.html"))
-    ("GAMMA_CT" pro nil (system) "%s, Gamma" ("G2.html" ("CURRENT" . 759174) ("INTENSITY" . 759177)))
-    ("GET_LUN" pro nil (system) "%s, Unit" ("G10.html"))
-    ("GRID_INPUT" pro nil (system) "%s, X, Y, F, X1, Y1, F1" ("G14.html" ("DEGREES" . 877045) ("DUPLICATES" . 877047) ("EPSILON" . 877086) ("EXCLUDE" . 877088) ("POLAR" . 877090) ("SPHERE" . 877092)))
-    ("H5_CLOSE" pro nil (system) "%s" ("HDF5-routines10.html"))
-    ("H5_OPEN" pro nil (system) "%s" ("HDF5-routines12.html"))
-    ("H5A_CLOSE" pro nil (system) "%s, Attribute_id" ("HDF5-routines14.html"))
-    ("H5D_CLOSE" pro nil (system) "%s, Dataset_id" ("HDF5-routines22.html"))
-    ("H5F_CLOSE" pro nil (system) "%s, File_id" ("HDF5-routines28.html"))
-    ("H5G_CLOSE" pro nil (system) "%s, Group_id" ("HDF5-routines31.html"))
-    ("H5S_CLOSE" pro nil (system) "%s, Dataspace_id" ("HDF5-routines41.html"))
-    ("H5S_OFFSET_SIMPLE" pro nil (system) "%s, Dataspace_id, Offset" ("HDF5-routines55.html"))
-    ("H5S_SELECT_ALL" pro nil (system) "%s, Dataspace_id" ("HDF5-routines56.html"))
-    ("H5S_SELECT_ELEMENTS" pro nil (system) "%s, Dataspace_id, Coordinates" ("HDF5-routines57.html" ("RESET" . 1149840)))
-    ("H5S_SELECT_HYPERSLAB" pro nil (system) "%s, Dataspace_id, Start, Count" ("HDF5-routines58.html" ("BLOCK" . 1149884) ("RESET" . 1149886) ("STRIDE" . 1149888)))
-    ("H5S_SELECT_NONE" pro nil (system) "%s, Dataspace_id" ("HDF5-routines59.html"))
-    ("H5T_CLOSE" pro nil (system) "%s, Datatype_id" ("HDF5-routines61.html"))
-    ("H_EQ_CT" pro nil (system) "%s [, Image]" ("H.html"))
-    ("H_EQ_INT" pro nil (system) "%s [, Image]" ("H2.html"))
-    ("HDF_AN_END" pro nil (system) "%s, Annotation_id" ("HDF-routines13.html"))
-    ("HDF_AN_ENDACCESS" pro nil (system) "%s, Annotation_id" ("HDF-routines14.html"))
-    ("HDF_CLOSE" pro nil (system) "%s, FileHandle" ("HDF-routines25.html"))
-    ("HDF_DELDD" pro nil (system) "%s, FileHandle, Tag, Ref" ("HDF-routines26.html"))
-    ("HDF_DF24_ADDIMAGE" pro nil (system) "%s, Filename, Image" ("HDF-routines27.html" ("FORCE_BASELINE" . 1025840) ("JPEG" . 1025843) ("QUALITY" . 1025857) ("RLE" . 1025860)))
-    ("HDF_DF24_GETIMAGE" pro nil (system) "%s, Filename, Image" ("HDF-routines28.html" ("LINE" . 996986) ("PIXEL" . 996989) ("PLANE" . 996992)))
-    ("HDF_DF24_GETINFO" pro nil (system) "%s, Filename, Width, Height, Interlace" ("HDF-routines29.html"))
-    ("HDF_DF24_READREF" pro nil (system) "%s, Filename, Reference_number" ("HDF-routines32.html"))
-    ("HDF_DF24_RESTART" pro nil (system) "%s" ("HDF-routines33.html"))
-    ("HDF_DFAN_ADDFDS" pro nil (system) "%s, Filename, Description" ("HDF-routines34.html"))
-    ("HDF_DFAN_ADDFID" pro nil (system) "%s, Filename, Label" ("HDF-routines35.html"))
-    ("HDF_DFAN_GETDESC" pro nil (system) "%s, Filename, Tag, Ref, Description" ("HDF-routines36.html" ("STRING" . 997205)))
-    ("HDF_DFAN_GETFDS" pro nil (system) "%s, Filename, Description" ("HDF-routines37.html" ("FIRST" . 997250) ("STRING" . 997253)))
-    ("HDF_DFAN_GETFID" pro nil (system) "%s, Filename, Label" ("HDF-routines38.html" ("FIRST" . 997305)))
-    ("HDF_DFAN_GETLABEL" pro nil (system) "%s, Filename, Tag, Ref, Label" ("HDF-routines39.html"))
-    ("HDF_DFAN_PUTDESC" pro nil (system) "%s, Filename, Tag, Ref, Description" ("HDF-routines42.html"))
-    ("HDF_DFAN_PUTLABEL" pro nil (system) "%s, Filename, Tag, Ref, Label" ("HDF-routines43.html"))
-    ("HDF_DFP_ADDPAL" pro nil (system) "%s, Filename, Palette" ("HDF-routines44.html"))
-    ("HDF_DFP_GETPAL" pro nil (system) "%s, Filename, Palette" ("HDF-routines45.html"))
-    ("HDF_DFP_PUTPAL" pro nil (system) "%s, Filename, Palette" ("HDF-routines48.html" ("DELETE" . 1016492) ("OVERWRITE" . 997545)))
-    ("HDF_DFP_READREF" pro nil (system) "%s, Filename, Reference_number" ("HDF-routines49.html"))
-    ("HDF_DFP_RESTART" pro nil (system) "%s" ("HDF-routines50.html"))
-    ("HDF_DFP_WRITEREF" pro nil (system) "%s, Filename, Reference_number" ("HDF-routines51.html"))
-    ("HDF_DFR8_ADDIMAGE" pro nil (system) "%s, Filename, Image" ("HDF-routines52.html" ("FORCE_BASELINE" . 997601) ("IMCOMP" . 1025489) ("JPEG" . 1025496) ("PALETTE" . 997604) ("QUALITY" . 997612) ("RLE" . 1025510)))
-    ("HDF_DFR8_GETIMAGE" pro nil (system) "%s, Filename, Image [, Palette]" ("HDF-routines53.html"))
-    ("HDF_DFR8_GETINFO" pro nil (system) "%s, Filename, Width, Height, Has_Palette" ("HDF-routines54.html"))
-    ("HDF_DFR8_PUTIMAGE" pro nil (system) "%s, Filename, Image" ("HDF-routines57.html" ("FORCE_BASELINE" . 1025782) ("IMCOMP" . 1025788) ("JPEG" . 1025785) ("PALETTE" . 1025813) ("QUALITY" . 1025821) ("RLE" . 1025802)))
-    ("HDF_DFR8_READREF" pro nil (system) "%s, Filename, Reference_number" ("HDF-routines58.html"))
-    ("HDF_DFR8_RESTART" pro nil (system) "%s" ("HDF-routines59.html"))
-    ("HDF_DFR8_SETPALETTE" pro nil (system) "%s, Palette" ("HDF-routines60.html"))
-    ("HDF_DUPDD" pro nil (system) "%s, FileHandle, NewTag, NewRef, OldTag, OldRef" ("HDF-routines61.html"))
-    ("HDF_GR_END" pro nil (system) "%s, gr_id" ("HDF-routines65.html"))
-    ("HDF_GR_ENDACCESS" pro nil (system) "%s, ri_id" ("HDF-routines66.html"))
-    ("HDF_LIB_INFO" pro nil (system) "%s, [FileHandle]" ("HDF-routines92.html" ("MAJOR" . 1031740) ("MINOR" . 1031746) ("RELEASE" . 1031752) ("VERSION" . 1031973)))
-    ("HDF_SD_ADDDATA" pro nil (system) "%s, SDdataset_id, Data" ("HDF-routines97.html" ("COUNT" . 1053602) ("NOREVERSE" . 1053605) ("START" . 1053608) ("STRIDE" . 1053611)))
-    ("HDF_SD_ATTRINFO" pro nil (system) "%s, SD_id, Attr_Index" ("HDF-routines99.html" ("COUNT" . 1053698) ("DATA" . 1053701) ("HDF_TYPE" . 1053704) ("NAME" . 1053707) ("TYPE" . 1053710)))
-    ("HDF_SD_ATTRSET" pro nil (system) "%s, SD_id, Attr_Name, Values [, Count]" ("HDF-routines100.html" ("BYTE" . 1053770) ("DFNT_CHAR" . 1053773) ("DFNT_FLOAT32" . 1053776) ("DFNT_FLOAT64" . 1053779) ("DFNT_INT16" . 1053785) ("DFNT_INT32" . 1053788) ("DFNT_INT8" . 1053782) ("DFNT_UINT16" . 1053794) ("DFNT_UINT32" . 1053797) ("DFNT_UINT8" . 1053791) ("DOUBLE" . 1053800) ("FLOAT" . 1053803) ("INT" . 1053806) ("LONG" . 1053809) ("SHORT" . 1053812) ("STRING" . 1053815)))
-    ("HDF_SD_DIMGET" pro nil (system) "%s, Dim_ID" ("HDF-routines102.html" ("COMPATIBILITY" . 1053946) ("COUNT" . 1053944) ("FORMAT" . 1053948) ("LABEL" . 1053950) ("NAME" . 1053952) ("NATTR" . 1053954) ("SCALE" . 1053956) ("TYPE" . 1053958) ("UNIT" . 1053960)))
-    ("HDF_SD_DIMSET" pro nil (system) "%s, Dim_ID" ("HDF-routines104.html" ("BW_INCOMP" . 1054021) ("FORMAT" . 1054025) ("LABEL" . 1054027) ("NAME" . 1054029) ("SCALE" . 1054031) ("UNIT" . 1054033)))
-    ("HDF_SD_END" pro nil (system) "%s, SDinterface_id" ("HDF-routines105.html"))
-    ("HDF_SD_ENDACCESS" pro nil (system) "%s, SDinterface_id" ("HDF-routines106.html"))
-    ("HDF_SD_FILEINFO" pro nil (system) "%s, SDinterface_id, Datasets, Attributes" ("HDF-routines107.html"))
-    ("HDF_SD_GETDATA" pro nil (system) "%s, SDdataset_id, Data" ("HDF-routines108.html" ("COUNT" . 1054195) ("NOREVERSE" . 1054198) ("START" . 1054201) ("STRIDE" . 1054204)))
-    ("HDF_SD_GETINFO" pro nil (system) "%s, SDdataset_id" ("HDF-routines109.html" ("CALDATA" . 1054234) ("COORDSYS" . 1054238) ("DIMS" . 1054241) ("FILL" . 1054244) ("FORMAT" . 1054247) ("HDF_TYPE" . 1054250) ("LABEL" . 1054253) ("NAME" . 1054256) ("NATTS" . 1054259) ("NDIMS" . 1054262) ("NOREVERSE" . 1054265) ("RANGE" . 1054268) ("TYPE" . 1054271) ("UNIT" . 1054274)))
-    ("HDF_SD_SETCOMPRESS" pro nil (system) "%s, SDdataset_id, comptype" ("HDF-routines115.html" ("EFFORT" . 1074118)))
-    ("HDF_SD_SETEXTFILE" pro nil (system) "%s, SDdataset_id, Filename" ("HDF-routines116.html" ("OFFSET" . 1054488)))
-    ("HDF_SD_SETINFO" pro nil (system) "%s, SDdataset_id" ("HDF-routines117.html" ("CALDATA" . 1205515) ("COORDSYS" . 1205576) ("FILL" . 1054536) ("FORMAT" . 1054539) ("LABEL" . 1054542) ("RANGE" . 1054545) ("UNIT" . 1054548)))
-    ("HDF_UNPACKDATA" pro nil (system) "%s, packeddata, data1 [, data2 [, data3 [, data4 [, data5 [, data6 [, data7 [, data8]]]]]]]" ("HDF-routines119.html" ("HDF_ORDER" . 1042997) ("HDF_TYPE" . 1043000) ("NREC" . 1043003)))
-    ("HDF_VD_ATTRINFO" pro nil (system) "%s, VData, FieldID, AttrID" ("HDF-routines122.html" ("COUNT" . 1109959) ("DATA" . 1109961) ("HDF_TYPE" . 1109963) ("NAME" . 1109965) ("TYPE" . 1109967)))
-    ("HDF_VD_ATTRSET" pro nil (system) "%s, VData, FieldID, Attr_Name, Values [, Count]" ("HDF-routines123.html" ("BYTE" . 1110005) ("DFNT_CHAR88" . 1110007) ("DFNT_FLOAT32" . 1110009) ("DFNT_FLOAT64" . 1110011) ("DFNT_INT16" . 1110015) ("DFNT_INT32" . 1110017) ("DFNT_INT8" . 1110013) ("DFNT_UCHAR88" . 1110019) ("DFNT_UINT16" . 1110023) ("DFNT_UINT32" . 1110025) ("DFNT_UINT8" . 1110021) ("DOUBLE" . 1110027) ("FLOAT" . 1110029) ("INT" . 1110031) ("LONG" . 1110033) ("SHORT" . 1110035) ("STRING" . 1110037) ("UINT" . 1110039) ("ULONG" . 1110041)))
-    ("HDF_VD_DETACH" pro nil (system) "%s, VData" ("HDF-routines124.html"))
-    ("HDF_VD_FDEFINE" pro nil (system) "%s, VData, Fieldname" ("HDF-routines125.html" ("BYTE" . 999536) ("DOUBLE" . 999539) ("FLOAT" . 999542) ("INT" . 999545) ("LONG" . 999548) ("ORDER" . 999551)))
-    ("HDF_VD_GET" pro nil (system) "%s, VData" ("HDF-routines128.html" ("CLASS" . 999597) ("COUNT" . 999600) ("FIELDS" . 999603) ("INTERLACE" . 999606) ("NAME" . 999609) ("NFIELDS" . 999612) ("REF" . 999615) ("SIZE" . 999618) ("TAG" . 999621)))
-    ("HDF_VD_GETINFO" pro nil (system) "%s, VData, Index" ("HDF-routines130.html" ("NAME" . 999666) ("ORDER" . 999669) ("SIZE" . 999672) ("TYPE" . 999675)))
-    ("HDF_VD_INSERT" pro nil (system) "%s, VGroup, VData(or Vgroup)" ("HDF-routines131.html" ("POSITION" . 1141285)))
-    ("HDF_VD_SEEK" pro nil (system) "%s, VData, Record" ("HDF-routines138.html"))
-    ("HDF_VD_SETINFO" pro nil (system) "%s, VData" ("HDF-routines139.html" ("CLASS" . 999834) ("FULL_INTERLACE" . 999837) ("NAME" . 999840) ("NO_INTERLACE" . 999843)))
-    ("HDF_VD_WRITE" pro nil (system) "%s, VData, Fields, Data" ("HDF-routines140.html" ("FULL_INTERLACE" . 999876) ("NO_INTERLACE" . 999879) ("NRECORDS" . 999882)))
-    ("HDF_VG_ADDTR" pro nil (system) "%s, VGroup, Tag, Ref" ("HDF-routines141.html"))
-    ("HDF_VG_DETACH" pro nil (system) "%s, VGroup" ("HDF-routines143.html"))
-    ("HDF_VG_GETINFO" pro nil (system) "%s, VGroup" ("HDF-routines145.html" ("CLASS" . 1000002) ("NAME" . 1000005) ("NENTRIES" . 1000008) ("REF" . 1109613) ("TAG" . 1109591)))
-    ("HDF_VG_GETTR" pro nil (system) "%s, VGroup, Index, Tags, Refs" ("HDF-routines147.html"))
-    ("HDF_VG_GETTRS" pro nil (system) "%s, VGroup, Tags, Refs" ("HDF-routines148.html" ("MAXSIZE" . 1000064)))
-    ("HDF_VG_INSERT" pro nil (system) "%s, VGroup, VData(or Vgroup)" ("HDF-routines150.html" ("POSITION" . 1234250)))
-    ("HDF_VG_SETINFO" pro nil (system) "%s, VGroup" ("HDF-routines155.html" ("CLASSNAME" . 1000182) ("NAME" . 1000184)))
-    ("HEAP_FREE" pro nil (system) "%s, Var" ("H9.html" ("OBJ" . 877472) ("PTR" . 877474) ("VERBOSE" . 877477)))
-    ("HEAP_GC" pro nil (system) "%s" ("H10.html" ("OBJ" . 871683) ("PTR" . 832713) ("VERBOSE" . 832717)))
-    ("HELP" pro nil (system) "%s, Expression1, ..., Expressionn" ("H11.html" ("ALL_KEYS" . 677134) ("BREAKPOINTS" . 677136) ("BRIEF" . 870534) ("CALLS" . 870532) ("DEVICE" . 677140) ("DLM" . 677142) ("FILES" . 843801) ("FULL" . 832176) ("FUNCTIONS" . 870207) ("HEAP_VARIABLES" . 870621) ("KEYS" . 677144) ("LAST_MESSAGE" . 843755) ("LEVEL" . 897567) ("MEMORY" . 677146) ("MESSAGES" . 677148) ("NAMES" . 843817) ("OBJECTS" . 832180) ("OUTPUT" . 832171) ("PATH_CACHE" . 677150) ("PROCEDURES" . 888071) ("RECALL_COMMANDS" . 870903) ("ROUTINES" . 869603) ("SHARED_MEMORY" . 880202) ("SOURCE_FILES" . 168290) ("STRUCTURES" . 677154) ("SYSTEM_VARIABLES" . 677156) ("TRACEBACK" . 677158)))
-    ("HLS" pro nil (system) "%s, Litlo, Lithi, Satlo, Sathi, Hue, Loops [, Colr]" ("H16.html"))
-    ("HSV" pro nil (system) "%s, Vlo, Vhi, Satlo, Sathi, Hue, Loops [, Colr]" ("H19.html"))
-    ("ICONTOUR" pro nil (system) "%s[, Z[, X, Y]]" ("I2.html" ("AM_PM" . 937300) ("ANISOTROPY" . 937305) ("BACKGROUND_COLOR" . 963582) ("C_COLOR" . 963600) ("C_FILL_PATTERN" . 937326) ("C_LABEL_INTERVAL" . 937328) ("C_LABEL_NOGAPS" . 937330) ("C_LABEL_OBJECTS" . 937332) ("C_LABEL_SHOW" . 937341) ("C_LINESTYLE" . 937343) ("C_THICK" . 937356) ("C_USE_LABEL_COLOR" . 937358) ("C_USE_LABEL_ORIENTATION" . 937360) ("C_VALUE" . 937362) ("CLIP_PLANES" . 937364) ("COLOR" . 937367) ("DAYS_OF_WEEK" . 937369) ("DEPTH_OFFSET" . 963869) ("DIMENSIONS" . 937374) ("DOWNHILL" . 937376) ("FILL" . 937378) ("GRID_UNITS" . 964865) ("HIDE" . 937391) ("IDENTIFIER" . 937395) ("LABEL_FONT" . 937397) ("LABEL_FORMAT" . 937399) ("LABEL_FRMTDATA" . 937406) ("LABEL_UNITS" . 937408) ("LOCATION" . 937422) ("MACRO_NAMES" . 964542) ("MAX_VALUE" . 937424) ("MIN_VALUE" . 937431) ("MONTHS" . 937426) ("N_LEVELS" . 937435) ("NAME" . 937433) ("NO_SAVEPROMPT" . 982371) ("OVERPLOT" . 937437) ("PLANAR" . 937440) ("RGB_INDICES" . 937445) ("RGB_TABLE" . 937451) ("SHADE_RANGE" . 937458) ("SHADING" . 937460) ("STYLE_NAME" . 964365) ("TICKINTERVAL" . 937465) ("TICKLEN" . 937467) ("TITLE" . 937469) ("USE_TEXT_ALIGNMENTS" . 937471) ("VIEW_GRID" . 937473) ("VIEW_NEXT" . 937475) ("VIEW_NUMBER" . 937478) ("XGRIDSTYLE" . 937481) ("XMAJOR" . 961791) ("XMINOR" . 937483) ("XRANGE" . 937485) ("XSUBTICKLEN" . 937487) ("XTEXT_COLOR" . 937489) ("XTICKFONT_INDEX" . 937491) ("XTICKFONT_SIZE" . 937499) ("XTICKFONT_STYLE" . 937501) ("XTICKFORMAT" . 937508) ("XTICKINTERVAL" . 937526) ("XTICKLAYOUT" . 937530) ("XTICKLEN" . 937538) ("XTICKNAME" . 937540) ("XTICKUNITS" . 937542) ("XTICKVALUES" . 937558) ("XTITLE" . 937560) ("YGRIDSTYLE" . 937481) ("YMAJOR" . 961791) ("YMINOR" . 937483) ("YRANGE" . 937485) ("YSUBTICKLEN" . 937487) ("YTEXT_COLOR" . 937489) ("YTICKFONT_INDEX" . 937491) ("YTICKFONT_SIZE" . 937499) ("YTICKFONT_STYLE" . 937501) ("YTICKFORMAT" . 937508) ("YTICKINTERVAL" . 937526) ("YTICKLAYOUT" . 937530) ("YTICKLEN" . 937538) ("YTICKNAME" . 937540) ("YTICKUNITS" . 937542) ("YTICKVALUES" . 937558) ("YTITLE" . 937560) ("ZGRIDSTYLE" . 937481) ("ZMAJOR" . 961791) ("ZMINOR" . 937483) ("ZRANGE" . 937485) ("ZSUBTICKLEN" . 937487) ("ZTEXT_COLOR" . 937489) ("ZTICKFONT_INDEX" . 937491) ("ZTICKFONT_SIZE" . 937499) ("ZTICKFONT_STYLE" . 937501) ("ZTICKFORMAT" . 937508) ("ZTICKINTERVAL" . 937526) ("ZTICKLAYOUT" . 937530) ("ZTICKLEN" . 937538) ("ZTICKNAME" . 937540) ("ZTICKUNITS" . 937542) ("ZTICKVALUES" . 937558) ("ZTITLE" . 937560) ("ZVALUE" . 937562)))
-    ("IIMAGE" pro nil (system) "%s[, Image[, X, Y]]" ("I8.html" ("ALPHA_CHANNEL" . 942273) ("BACKGROUND_COLOR" . 963611) ("BLUE_CHANNEL" . 940200) ("CHANNEL" . 940203) ("CLIP_PLANES" . 940205) ("DIMENSIONS" . 940208) ("GREEN_CHANNEL" . 940210) ("GRID_UNITS" . 964788) ("HIDE" . 940212) ("IDENTIFIER" . 940216) ("IMAGE_DIMENSIONS" . 940218) ("IMAGE_LOCATION" . 940220) ("INTERPOLATE" . 940222) ("LOCATION" . 940224) ("MACRO_NAMES" . 964551) ("NAME" . 940226) ("NO_SAVEPROMPT" . 982596) ("ORDER" . 964559) ("OVERPLOT" . 940230) ("RED_CHANNEL" . 940233) ("RGB_TABLE" . 940235) ("STYLE_NAME" . 964392) ("TITLE" . 940237) ("VIEW_GRID" . 940239) ("VIEW_NEXT" . 940241) ("VIEW_NUMBER" . 940244) ("XGRIDSTYLE" . 961815) ("XMAJOR" . 940247) ("XMINOR" . 940249) ("XRANGE" . 940251) ("XSUBTICKLEN" . 940253) ("XTEXT_COLOR" . 940255) ("XTICKFONT_INDEX" . 940257) ("XTICKFONT_SIZE" . 940264) ("XTICKFONT_STYLE" . 940266) ("XTICKFORMAT" . 940272) ("XTICKINTERVAL" . 940289) ("XTICKLAYOUT" . 940292) ("XTICKLEN" . 940299) ("XTICKNAME" . 940301) ("XTICKUNITS" . 940303) ("XTICKVALUES" . 940318) ("XTITLE" . 940320) ("YGRIDSTYLE" . 961815) ("YMAJOR" . 940247) ("YMINOR" . 940249) ("YRANGE" . 940251) ("YSUBTICKLEN" . 940253) ("YTEXT_COLOR" . 940255) ("YTICKFONT_INDEX" . 940257) ("YTICKFONT_SIZE" . 940264) ("YTICKFONT_STYLE" . 940266) ("YTICKFORMAT" . 940272) ("YTICKINTERVAL" . 940289) ("YTICKLAYOUT" . 940292) ("YTICKLEN" . 940299) ("YTICKNAME" . 940301) ("YTICKUNITS" . 940303) ("YTICKVALUES" . 940318) ("YTITLE" . 940320)))
-    ("IMAGE_CONT" pro nil (system) "%s, A" ("I9.html" ("ASPECT" . 757356) ("INTERP" . 757359) ("WINDOW_SCALE" . 757362)))
-    ("IMAGE_STATISTICS" pro nil (system) "%s, Data" ("I10.html" ("COUNT" . 873572) ("DATA_SUM" . 873574) ("LABELED" . 873576) ("LUT" . 873582) ("MASK" . 873584) ("MAXIMUM" . 873586) ("MEAN" . 873588) ("MINIMUM" . 873590) ("STDDEV" . 873592) ("SUM_OF_SQUARES" . 873594) ("VARIANCE" . 873596) ("VECTOR" . 873598) ("WEIGHT_SUM" . 873600) ("WEIGHTED" . 873603)))
-    ("IMAP" pro nil (system) "%s" ("I12.html" ("BACKGROUND_COLOR" . 966654) ("CENTER_LATITUDE" . 966771) ("CENTER_LONGITUDE" . 966773) ("CONTOUR" . 966500) ("DATUM" . 966775) ("DIMENSIONS" . 966656) ("FALSE_EASTING" . 966916) ("FALSE_NORTHING" . 966918) ("GRID_UNITS" . 981023) ("HEIGHT" . 966920) ("HOM_AZIM_ANGLE" . 966924) ("HOM_AZIM_LONGITUDE" . 966922) ("HOM_LATITUDE1" . 966926) ("HOM_LATITUDE2" . 966928) ("HOM_LONGITUDE1" . 966930) ("HOM_LONGITUDE2" . 966932) ("IDENTIFIER" . 966658) ("IS_JUSTIFY" . 966936) ("IS_ZONES" . 966934) ("LIMIT" . 966941) ("LOCATION" . 966660) ("MACRO_NAMES" . 966666) ("MAP_PROJECTION" . 966503) ("MERCATOR_SCALE" . 966943) ("NAME" . 966668) ("NO_SAVEPROMPT" . 982447) ("OEA_ANGLE" . 966945) ("OEA_SHAPEM" . 966947) ("OEA_SHAPEN" . 966950) ("OVERPLOT" . 966670) ("SEMIMAJOR_AXIS" . 966953) ("SEMIMINOR_AXIS" . 966955) ("SOM_FLAG" . 966965) ("SOM_INCLINATION" . 966957) ("SOM_LANDSAT_NUMBER" . 966967) ("SOM_LANDSAT_PATH" . 966969) ("SOM_LONGITUDE" . 966959) ("SOM_PERIOD" . 966961) ("SOM_RATIO" . 966963) ("SPHERE_RADIUS" . 966971) ("STANDARD_PAR1" . 966975) ("STANDARD_PAR2" . 966977) ("STANDARD_PARALLEL" . 966973) ("STYLE_NAME" . 966673) ("TITLE" . 966678) ("TRUE_SCALE_LATITUDE" . 966979) ("VIEW_GRID" . 966680) ("VIEW_NEXT" . 966682) ("VIEW_NUMBER" . 966685) ("XGRIDSTYLE" . 966688) ("XMAJOR" . 966690) ("XMINOR" . 966692) ("XRANGE" . 966694) ("XSUBTICKLEN" . 966696) ("XTEXT_COLOR" . 966698) ("XTICKFONT_INDEX" . 966700) ("XTICKFONT_SIZE" . 966707) ("XTICKFONT_STYLE" . 966709) ("XTICKFORMAT" . 966715) ("XTICKINTERVAL" . 966736) ("XTICKLAYOUT" . 966739) ("XTICKLEN" . 966746) ("XTICKNAME" . 966748) ("XTICKUNITS" . 966750) ("XTICKVALUES" . 966766) ("XTITLE" . 966768) ("YGRIDSTYLE" . 966688) ("YMAJOR" . 966690) ("YMINOR" . 966692) ("YRANGE" . 966694) ("YSUBTICKLEN" . 966696) ("YTEXT_COLOR" . 966698) ("YTICKFONT_INDEX" . 966700) ("YTICKFONT_SIZE" . 966707) ("YTICKFONT_STYLE" . 966709) ("YTICKFORMAT" . 966715) ("YTICKINTERVAL" . 966736) ("YTICKLAYOUT" . 966739) ("YTICKLEN" . 966746) ("YTICKNAME" . 966748) ("YTICKUNITS" . 966750) ("YTICKVALUES" . 966766) ("YTITLE" . 966768) ("ZONE" . 966981)) ("I2.html" ("AM_PM" . 937300) ("ANISOTROPY" . 937305) ("BACKGROUND_COLOR" . 963582) ("C_COLOR" . 963600) ("C_FILL_PATTERN" . 937326) ("C_LABEL_INTERVAL" . 937328) ("C_LABEL_NOGAPS" . 937330) ("C_LABEL_OBJECTS" . 937332) ("C_LABEL_SHOW" . 937341) ("C_LINESTYLE" . 937343) ("C_THICK" . 937356) ("C_USE_LABEL_COLOR" . 937358) ("C_USE_LABEL_ORIENTATION" . 937360) ("C_VALUE" . 937362) ("CLIP_PLANES" . 937364) ("COLOR" . 937367) ("DAYS_OF_WEEK" . 937369) ("DEPTH_OFFSET" . 963869) ("DIMENSIONS" . 937374) ("DOWNHILL" . 937376) ("FILL" . 937378) ("GRID_UNITS" . 964865) ("HIDE" . 937391) ("IDENTIFIER" . 937395) ("LABEL_FONT" . 937397) ("LABEL_FORMAT" . 937399) ("LABEL_FRMTDATA" . 937406) ("LABEL_UNITS" . 937408) ("LOCATION" . 937422) ("MACRO_NAMES" . 964542) ("MAX_VALUE" . 937424) ("MIN_VALUE" . 937431) ("MONTHS" . 937426) ("N_LEVELS" . 937435) ("NAME" . 937433) ("NO_SAVEPROMPT" . 982371) ("OVERPLOT" . 937437) ("PLANAR" . 937440) ("RGB_INDICES" . 937445) ("RGB_TABLE" . 937451) ("SHADE_RANGE" . 937458) ("SHADING" . 937460) ("STYLE_NAME" . 964365) ("TICKINTERVAL" . 937465) ("TICKLEN" . 937467) ("TITLE" . 937469) ("USE_TEXT_ALIGNMENTS" . 937471) ("VIEW_GRID" . 937473) ("VIEW_NEXT" . 937475) ("VIEW_NUMBER" . 937478) ("XGRIDSTYLE" . 937481) ("XMAJOR" . 961791) ("XMINOR" . 937483) ("XRANGE" . 937485) ("XSUBTICKLEN" . 937487) ("XTEXT_COLOR" . 937489) ("XTICKFONT_INDEX" . 937491) ("XTICKFONT_SIZE" . 937499) ("XTICKFONT_STYLE" . 937501) ("XTICKFORMAT" . 937508) ("XTICKINTERVAL" . 937526) ("XTICKLAYOUT" . 937530) ("XTICKLEN" . 937538) ("XTICKNAME" . 937540) ("XTICKUNITS" . 937542) ("XTICKVALUES" . 937558) ("XTITLE" . 937560) ("YGRIDSTYLE" . 937481) ("YMAJOR" . 961791) ("YMINOR" . 937483) ("YRANGE" . 937485) ("YSUBTICKLEN" . 937487) ("YTEXT_COLOR" . 937489) ("YTICKFONT_INDEX" . 937491) ("YTICKFONT_SIZE" . 937499) ("YTICKFONT_STYLE" . 937501) ("YTICKFORMAT" . 937508) ("YTICKINTERVAL" . 937526) ("YTICKLAYOUT" . 937530) ("YTICKLEN" . 937538) ("YTICKNAME" . 937540) ("YTICKUNITS" . 937542) ("YTICKVALUES" . 937558) ("YTITLE" . 937560) ("ZGRIDSTYLE" . 937481) ("ZMAJOR" . 961791) ("ZMINOR" . 937483) ("ZRANGE" . 937485) ("ZSUBTICKLEN" . 937487) ("ZTEXT_COLOR" . 937489) ("ZTICKFONT_INDEX" . 937491) ("ZTICKFONT_SIZE" . 937499) ("ZTICKFONT_STYLE" . 937501) ("ZTICKFORMAT" . 937508) ("ZTICKINTERVAL" . 937526) ("ZTICKLAYOUT" . 937530) ("ZTICKLEN" . 937538) ("ZTICKNAME" . 937540) ("ZTICKUNITS" . 937542) ("ZTICKVALUES" . 937558) ("ZTITLE" . 937560) ("ZVALUE" . 937562)) ("I8.html" ("ALPHA_CHANNEL" . 942273) ("BACKGROUND_COLOR" . 963611) ("BLUE_CHANNEL" . 940200) ("CHANNEL" . 940203) ("CLIP_PLANES" . 940205) ("DIMENSIONS" . 940208) ("GREEN_CHANNEL" . 940210) ("GRID_UNITS" . 964788) ("HIDE" . 940212) ("IDENTIFIER" . 940216) ("IMAGE_DIMENSIONS" . 940218) ("IMAGE_LOCATION" . 940220) ("INTERPOLATE" . 940222) ("LOCATION" . 940224) ("MACRO_NAMES" . 964551) ("NAME" . 940226) ("NO_SAVEPROMPT" . 982596) ("ORDER" . 964559) ("OVERPLOT" . 940230) ("RED_CHANNEL" . 940233) ("RGB_TABLE" . 940235) ("STYLE_NAME" . 964392) ("TITLE" . 940237) ("VIEW_GRID" . 940239) ("VIEW_NEXT" . 940241) ("VIEW_NUMBER" . 940244) ("XGRIDSTYLE" . 961815) ("XMAJOR" . 940247) ("XMINOR" . 940249) ("XRANGE" . 940251) ("XSUBTICKLEN" . 940253) ("XTEXT_COLOR" . 940255) ("XTICKFONT_INDEX" . 940257) ("XTICKFONT_SIZE" . 940264) ("XTICKFONT_STYLE" . 940266) ("XTICKFORMAT" . 940272) ("XTICKINTERVAL" . 940289) ("XTICKLAYOUT" . 940292) ("XTICKLEN" . 940299) ("XTICKNAME" . 940301) ("XTICKUNITS" . 940303) ("XTICKVALUES" . 940318) ("XTITLE" . 940320) ("YGRIDSTYLE" . 961815) ("YMAJOR" . 940247) ("YMINOR" . 940249) ("YRANGE" . 940251) ("YSUBTICKLEN" . 940253) ("YTEXT_COLOR" . 940255) ("YTICKFONT_INDEX" . 940257) ("YTICKFONT_SIZE" . 940264) ("YTICKFONT_STYLE" . 940266) ("YTICKFORMAT" . 940272) ("YTICKINTERVAL" . 940289) ("YTICKLAYOUT" . 940292) ("YTICKLEN" . 940299) ("YTICKNAME" . 940301) ("YTICKUNITS" . 940303) ("YTICKVALUES" . 940318) ("YTITLE" . 940320)))
-    ("INTERVAL_VOLUME" pro nil (system) "%s, Data, Value0, Value1, Outverts, Outconn" ("I20.html" ("AUXDATA_IN" . 877934) ("AUXDATA_OUT" . 877937) ("GEOM_XYZ" . 877940) ("PROGRESS_CALLBACK" . 904666) ("PROGRESS_METHOD" . 904664) ("PROGRESS_OBJECT" . 904694) ("PROGRESS_PERCENT" . 904705) ("PROGRESS_USERDATA" . 904717) ("TETRAHEDRA" . 904724)))
-    ("IPLOT" pro nil (system) "%s, [X,] Y or %s, X, Y, Z or %s[, R], Theta" ("I23.html" ("BACKGROUND_COLOR" . 940548) ("CLIP_PLANES" . 963636) ("COLOR" . 940551) ("DIMENSIONS" . 984454) ("ERRORBAR_CAPSIZE" . 940557) ("ERRORBAR_COLOR" . 940555) ("FILL_BACKGROUND" . 940559) ("FILL_COLOR" . 940561) ("FILL_LEVEL" . 940563) ("HIDE" . 940565) ("HISTOGRAM" . 940569) ("IDENTIFIER" . 940571) ("LINESTYLE" . 940573) ("LOCATION" . 940586) ("MACRO_NAMES" . 964589) ("MAX_VALUE" . 940588) ("MIN_VALUE" . 940591) ("NAME" . 940594) ("NO_SAVEPROMPT" . 982649) ("NSUM" . 940596) ("OVERPLOT" . 940598) ("POLAR" . 940601) ("RGB_TABLE" . 940603) ("SCATTER" . 940605) ("STYLE_NAME" . 964415) ("SYM_COLOR" . 940607) ("SYM_INCREMENT" . 940610) ("SYM_INDEX" . 940612) ("SYM_SIZE" . 940623) ("SYM_THICK" . 940625) ("THICK" . 940627) ("TITLE" . 940629) ("TRANSPARENCY" . 940631) ("USE_DEFAULT_COLOR" . 940633) ("VERT_COLORS" . 940637) ("VIEW_GRID" . 940639) ("VIEW_NEXT" . 940641) ("VIEW_NUMBER" . 940644) ("X_ERRORBARS" . 940649) ("X_LOG" . 940651) ("XERROR" . 940653) ("XGRIDSTYLE" . 961829) ("XMAJOR" . 940655) ("XMINOR" . 940657) ("XRANGE" . 940659) ("XSUBTICKLEN" . 940661) ("XTEXT_COLOR" . 940663) ("XTICKFONT_INDEX" . 940665) ("XTICKFONT_SIZE" . 940673) ("XTICKFONT_STYLE" . 940675) ("XTICKFORMAT" . 940682) ("XTICKINTERVAL" . 940700) ("XTICKLAYOUT" . 940704) ("XTICKLEN" . 940712) ("XTICKNAME" . 940714) ("XTICKUNITS" . 940716) ("XTICKVALUES" . 940732) ("XTITLE" . 940734) ("XY_SHADOW" . 940647) ("XZ_SHADOW" . 940736) ("Y_ERRORBARS" . 940649) ("Y_LOG" . 940651) ("YERROR" . 940653) ("YGRIDSTYLE" . 961829) ("YMAJOR" . 940655) ("YMINOR" . 940657) ("YRANGE" . 940659) ("YSUBTICKLEN" . 940661) ("YTEXT_COLOR" . 940663) ("YTICKFONT_INDEX" . 940665) ("YTICKFONT_SIZE" . 940673) ("YTICKFONT_STYLE" . 940675) ("YTICKFORMAT" . 940682) ("YTICKINTERVAL" . 940700) ("YTICKLAYOUT" . 940704) ("YTICKLEN" . 940712) ("YTICKNAME" . 940714) ("YTICKUNITS" . 940716) ("YTICKVALUES" . 940732) ("YTITLE" . 940734) ("YZ_SHADOW" . 940738) ("Z_ERRORBARS" . 940649) ("Z_LOG" . 940651) ("ZERROR" . 940653) ("ZGRIDSTYLE" . 961829) ("ZMAJOR" . 940655) ("ZMINOR" . 940657) ("ZRANGE" . 940659) ("ZSUBTICKLEN" . 940661) ("ZTEXT_COLOR" . 940663) ("ZTICKFONT_INDEX" . 940665) ("ZTICKFONT_SIZE" . 940673) ("ZTICKFONT_STYLE" . 940675) ("ZTICKFORMAT" . 940682) ("ZTICKINTERVAL" . 940700) ("ZTICKLAYOUT" . 940704) ("ZTICKLEN" . 940712) ("ZTICKNAME" . 940714) ("ZTICKUNITS" . 940716) ("ZTICKVALUES" . 940732) ("ZTITLE" . 940734)))
-    ("ISOCONTOUR" pro nil (system) "%s, Values, Outverts, Outconn" ("I25.html" ("AUXDATA_IN" . 873707) ("AUXDATA_OUT" . 873709) ("C_LABEL_INTERVAL" . 873711) ("C_LABEL_SHOW" . 880877) ("C_VALUE" . 880888) ("DOUBLE" . 875352) ("FILL" . 873713) ("GEOMX" . 873715) ("GEOMY" . 873717) ("GEOMZ" . 873719) ("LEVEL_VALUES" . 873723) ("N_LEVELS" . 873725) ("OUT_LABEL_OFFSETS" . 873727) ("OUT_LABEL_POLYLINES" . 880899) ("OUT_LABEL_STRINGS" . 880914) ("OUTCONN_INDICES" . 880934) ("POLYGONS" . 873730)))
-    ("ISOSURFACE" pro nil (system) "%s, Data, Value, Outverts, Outconn" ("I26.html" ("AUXDATA_IN" . 873750) ("AUXDATA_OUT" . 873753) ("GEOM_XYZ" . 873756) ("PROGRESS_CALLBACK" . 873759) ("PROGRESS_METHOD" . 904740) ("PROGRESS_OBJECT" . 904767) ("PROGRESS_PERCENT" . 904780) ("PROGRESS_USERDATA" . 904786) ("TETRAHEDRA" . 904793)))
-    ("ISURFACE" pro nil (system) "%s[, Z [, X, Y]]" ("I27.html" ("BACKGROUND_COLOR" . 940941) ("BOTTOM" . 963651) ("CLIP_PLANES" . 940943) ("COLOR" . 940946) ("DEPTH_OFFSET" . 940950) ("DIMENSIONS" . 940948) ("EXTENDED_LEGO" . 940960) ("HIDDEN_LINES" . 940962) ("HIDE" . 940964) ("IDENTIFIER" . 940968) ("LINESTYLE" . 940970) ("LOCATION" . 940983) ("MACRO_NAMES" . 964571) ("NAME" . 940985) ("NO_SAVEPROMPT" . 982715) ("OVERPLOT" . 940987) ("RGB_TABLE" . 940990) ("SHADING" . 940992) ("SHOW_SKIRT" . 940997) ("SKIRT" . 940999) ("STYLE" . 941001) ("STYLE_NAME" . 964441) ("TEXTURE_ALPHA" . 941010) ("TEXTURE_BLUE" . 941012) ("TEXTURE_GREEN" . 941014) ("TEXTURE_HIGHRES" . 941016) ("TEXTURE_IMAGE" . 941019) ("TEXTURE_INTERP" . 941021) ("TEXTURE_RED" . 941023) ("THICK" . 941025) ("TITLE" . 941027) ("USE_TRIANGLES" . 941029) ("VERT_COLORS" . 941031) ("VIEW_GRID" . 941033) ("VIEW_NEXT" . 941035) ("VIEW_NUMBER" . 941038) ("XGRIDSTYLE" . 961847) ("XMAJOR" . 941041) ("XMINOR" . 941043) ("XRANGE" . 941045) ("XSUBTICKLEN" . 941047) ("XTEXT_COLOR" . 941049) ("XTICKFONT_INDEX" . 941051) ("XTICKFONT_SIZE" . 941058) ("XTICKFONT_STYLE" . 941060) ("XTICKFORMAT" . 941066) ("XTICKINTERVAL" . 941083) ("XTICKLAYOUT" . 941086) ("XTICKLEN" . 941093) ("XTICKNAME" . 941095) ("XTICKUNITS" . 941097) ("XTICKVALUES" . 941112) ("XTITLE" . 941114) ("YGRIDSTYLE" . 961847) ("YMAJOR" . 941041) ("YMINOR" . 941043) ("YRANGE" . 941045) ("YSUBTICKLEN" . 941047) ("YTEXT_COLOR" . 941049) ("YTICKFONT_INDEX" . 941051) ("YTICKFONT_SIZE" . 941058) ("YTICKFONT_STYLE" . 941060) ("YTICKFORMAT" . 941066) ("YTICKINTERVAL" . 941083) ("YTICKLAYOUT" . 941086) ("YTICKLEN" . 941093) ("YTICKNAME" . 941095) ("YTICKUNITS" . 941097) ("YTICKVALUES" . 941112) ("YTITLE" . 941114) ("ZERO_OPACITY_SKIP" . 941116) ("ZGRIDSTYLE" . 961847) ("ZMAJOR" . 941041) ("ZMINOR" . 941043) ("ZRANGE" . 941045) ("ZSUBTICKLEN" . 941047) ("ZTEXT_COLOR" . 941049) ("ZTICKFONT_INDEX" . 941051) ("ZTICKFONT_SIZE" . 941058) ("ZTICKFONT_STYLE" . 941060) ("ZTICKFORMAT" . 941066) ("ZTICKINTERVAL" . 941083) ("ZTICKLAYOUT" . 941086) ("ZTICKLEN" . 941093) ("ZTICKNAME" . 941095) ("ZTICKUNITS" . 941097) ("ZTICKVALUES" . 941112) ("ZTITLE" . 941114)))
-    ("ITCURRENT" pro nil (system) "%s, iToolID" ("I28.html"))
-    ("ITDELETE" pro nil (system) "%s[, iToolID]" ("I29.html"))
-    ("ITREGISTER" pro nil (system) "%s, Name, ItemName" ("I31.html" ("ANNOTATION" . 961620) ("DEFAULT" . 980906) ("FILE_READER" . 961629) ("FILE_WRITER" . 961635) ("TYPES" . 941578) ("UI_PANEL" . 941581) ("UI_SERVICE" . 941584) ("USER_INTERFACE" . 961874) ("VISUALIZATION" . 941586)))
-    ("ITRESET" pro nil (system) "%s" ("I32.html" ("NO_PROMPT" . 941670)))
-    ("ITRESOLVE" pro nil (system) "%s" ("I33.html" ("PATH" . 969191)))
-    ("IVOLUME" pro nil (system) "%s[, Vol0[, Vol1][, Vol2, Vol3]]" ("I34.html" ("AMBIENT" . 941804) ("AUTO_RENDER" . 941806) ("BACKGROUND_COLOR" . 941809) ("BOUNDS" . 963673) ("CLIP_PLANES" . 963690) ("COMPOSITE_FUNCTION" . 941815) ("DEPTH_CUE" . 941828) ("DIMENSIONS" . 941837) ("EXTENTS_TRANSPARENCY" . 964340) ("HIDE" . 941839) ("HINTS" . 941843) ("IDENTIFIER" . 941849) ("INTERPOLATE" . 941851) ("LIGHTING_MODEL" . 941853) ("LOCATION" . 941856) ("MACRO_NAMES" . 964580) ("NAME" . 941858) ("NO_SAVEPROMPT" . 982766) ("OPACITY_TABLE0" . 941860) ("OPACITY_TABLE1" . 941862) ("OVERPLOT" . 941864) ("RENDER_EXTENTS" . 941867) ("RENDER_QUALITY" . 941874) ("RENDER_STEP" . 941872) ("RGB_TABLE0" . 941879) ("RGB_TABLE1" . 941881) ("STYLE_NAME" . 964479) ("SUBVOLUME" . 941883) ("TITLE" . 941885) ("TWO_SIDED" . 941887) ("VIEW_GRID" . 941889) ("VIEW_NEXT" . 941891) ("VIEW_NUMBER" . 941894) ("VOLUME_DIMENSIONS" . 941897) ("VOLUME_LOCATION" . 941899) ("XGRIDSTYLE" . 961859) ("XMAJOR" . 941901) ("XMINOR" . 941903) ("XRANGE" . 941905) ("XSUBTICKLEN" . 941907) ("XTEXT_COLOR" . 941909) ("XTICKFONT_INDEX" . 941911) ("XTICKFONT_SIZE" . 941918) ("XTICKFONT_STYLE" . 941920) ("XTICKFORMAT" . 941926) ("XTICKINTERVAL" . 941943) ("XTICKLAYOUT" . 941946) ("XTICKLEN" . 941953) ("XTICKNAME" . 941955) ("XTICKUNITS" . 941957) ("XTICKVALUES" . 941972) ("XTITLE" . 941974) ("YGRIDSTYLE" . 961859) ("YMAJOR" . 941901) ("YMINOR" . 941903) ("YRANGE" . 941905) ("YSUBTICKLEN" . 941907) ("YTEXT_COLOR" . 941909) ("YTICKFONT_INDEX" . 941911) ("YTICKFONT_SIZE" . 941918) ("YTICKFONT_STYLE" . 941920) ("YTICKFORMAT" . 941926) ("YTICKINTERVAL" . 941943) ("YTICKLAYOUT" . 941946) ("YTICKLEN" . 941953) ("YTICKNAME" . 941955) ("YTICKUNITS" . 941957) ("YTICKVALUES" . 941972) ("YTITLE" . 941974) ("ZBUFFER" . 941976) ("ZERO_OPACITY_SKIP" . 941978) ("ZGRIDSTYLE" . 961859) ("ZMAJOR" . 941901) ("ZMINOR" . 941903) ("ZRANGE" . 941905) ("ZSUBTICKLEN" . 941907) ("ZTEXT_COLOR" . 941909) ("ZTICKFONT_INDEX" . 941911) ("ZTICKFONT_SIZE" . 941918) ("ZTICKFONT_STYLE" . 941920) ("ZTICKFORMAT" . 941926) ("ZTICKINTERVAL" . 941943) ("ZTICKLAYOUT" . 941946) ("ZTICKLEN" . 941953) ("ZTICKNAME" . 941955) ("ZTICKUNITS" . 941957) ("ZTICKVALUES" . 941972) ("ZTITLE" . 941974)))
-    ("JOURNAL" pro nil (system) "%s [, Arg]" ("J.html"))
-    ("LA_CHOLDC" pro nil (system) "%s, Array" ("L2.html" ("DOUBLE" . 969070) ("STATUS" . 969072) ("UPPER" . 969077)))
-    ("LA_LUDC" pro nil (system) "%s, Array, Index" ("L16.html" ("DOUBLE" . 970769) ("STATUS" . 970771)))
-    ("LA_SVD" pro nil (system) "%s, Array, W, U, V" ("L19.html" ("DIVIDE_CONQUER" . 971149) ("DOUBLE" . 971151) ("STATUS" . 971153)))
-    ("LA_TRIDC" pro nil (system) "%s, AL, A, AU, U2, Index" ("L20.html" ("DOUBLE" . 971273) ("STATUS" . 971275)))
-    ("LA_TRIQL" pro nil (system) "%s, D, E [, A]" ("L22.html" ("DOUBLE" . 971540) ("STATUS" . 971542)))
-    ("LA_TRIRED" pro nil (system) "%s, Array, D, E" ("L23.html" ("DOUBLE" . 971643) ("UPPER" . 971645)))
-    ("LINKIMAGE" pro nil (system) "%s, Name, Image [, Type [, Entry]]" ("L34.html" ("DEVICE" . 855619) ("FUNCT" . 855622) ("KEYWORDS" . 855625) ("MAX_ARGS" . 855628) ("MIN_ARGS" . 855632)))
-    ("LOADCT" pro nil (system) "%s [, Table]" ("L40.html" ("BOTTOM" . 168327) ("FILE" . 759299) ("GET_NAMES" . 759305) ("NCOLORS" . 759308) ("SILENT" . 759311)))
-    ("LUDC" pro nil (system) "%s, A, Index" ("L51.html" ("COLUMN" . 58718) ("DOUBLE" . 50959) ("INTERCHANGES" . 50962)))
-    ("MAKE_DLL" pro nil (system) "%s, InputFiles [, OutputFile], ExportedRoutineNames" ("M4.html" ("CC" . 960457) ("COMPILE_DIRECTORY" . 960459) ("DLL_PATH" . 960461) ("EXPORTED_DATA" . 960463) ("EXTRA_CFLAGS" . 960465) ("EXTRA_LFLAGS" . 960467) ("INPUT_DIRECTORY" . 960469) ("LD" . 960471) ("NOCLEANUP" . 960473) ("OUTPUT_DIRECTORY" . 960502) ("REUSE_EXISTING" . 973081) ("SHOW_ALL_OUTPUT" . 960504) ("VERBOSE" . 960506)))
-    ("MAP_CONTINENTS" pro nil (system) "%s" ("M6.html" ("COASTS" . 1048587) ("COLOR" . 887531) ("CONTINENTS" . 957787) ("COUNTRIES" . 887534) ("FILL_CONTINENTS" . 887537) ("HIRES" . 887540) ("LIMIT" . 957885) ("MAP_STRUCTURE" . 1059750) ("MLINESTYLE" . 1059754) ("MLINETHICK" . 887584) ("ORIENTATION" . 887588) ("RIVERS" . 887591) ("SPACING" . 887594) ("USA" . 887597)) ("graphkeyw2.html" ("T3D" . 315956) ("ZVALUE" . 316102)))
-    ("MAP_GRID" pro nil (system) "%s" ("M7.html" ("BOX_AXES" . 919039) ("CHARSIZE" . 887636) ("CLIP_TEXT" . 919041) ("COLOR" . 887639) ("FILL_HORIZON" . 958045) ("GLINESTYLE" . 887642) ("GLINETHICK" . 887648) ("HORIZON" . 958090) ("INCREMENT" . 958092) ("LABEL" . 958064) ("LATALIGN" . 887654) ("LATDEL" . 887657) ("LATLAB" . 887660) ("LATNAMES" . 887663) ("LATS" . 887668) ("LONALIGN" . 887673) ("LONDEL" . 887676) ("LONLAB" . 887679) ("LONNAMES" . 887682) ("LONS" . 887687) ("MAP_STRUCTURE" . 1059914) ("NO_GRID" . 958111) ("ORIENTATION" . 887692)) ("graphkeyw2.html" ("T3D" . 315956) ("ZVALUE" . 316102)))
-    ("MAP_PROJ_INFO" pro nil (system) "%s [, iproj]" ("M12.html" ("AZIMUTHAL" . 918995) ("CIRCLE" . 928077) ("CURRENT" . 918999) ("CYLINDRICAL" . 919001) ("LL_LIMITS" . 919003) ("NAME" . 919005) ("PROJ_NAMES" . 919007) ("UV_LIMITS" . 919011) ("UV_RANGE" . 928995)))
-    ("MAP_SET" pro nil (system) "%s [, P0lat, P0lon, Rot]" ("M15.html" ("ADVANCE" . 887984) ("AITOFF" . 957265) ("ALBERS" . 887925) ("AZIMUTHAL" . 887931) ("CENTRAL_AZIMUTH" . 888123) ("CHARSIZE" . 887987) ("CLIP" . 887990) ("COLOR" . 887997) ("CON_COLOR" . 888003) ("CONIC" . 887934) ("CONTINENTS" . 888000) ("CYLINDRICAL" . 887940) ("E_CONTINENTS" . 888006) ("E_GRID" . 888009) ("E_HORIZON" . 888013) ("ELLIPSOID" . 888127) ("GLINESTYLE" . 888019) ("GLINETHICK" . 888025) ("GNOMIC" . 887943) ("GOODESHOMOLOSINE" . 918601) ("GRID" . 949681) ("HAMMER" . 887946) ("HIRES" . 888031) ("HORIZON" . 888034) ("ISOTROPIC" . 888134) ("LABEL" . 918537) ("LAMBERT" . 887950) ("LATALIGN" . 888043) ("LATDEL" . 888049) ("LATLAB" . 888046) ("LIMIT" . 888141) ("LONALIGN" . 888052) ("LONDEL" . 888055) ("LONLAB" . 888058) ("MERCATOR" . 887953) ("MILLER_CYLINDRICAL" . 887956) ("MLINESTYLE" . 888061) ("MLINETHICK" . 888101) ("MOLLWEIDE" . 887959) ("NAME" . 958229) ("NOBORDER" . 958173) ("NOERASE" . 888107) ("ORTHOGRAPHIC" . 887962) ("REVERSE" . 888110) ("ROBINSON" . 919362) ("SAT_P" . 888146) ("SATELLITE" . 887965) ("SCALE" . 958134) ("SINUSOIDAL" . 887971) ("STANDARD_PARALLELS" . 888156) ("STEREOGRAPHIC" . 887974) ("TITLE" . 958298) ("TRANSVERSE_MERCATOR" . 887977) ("USA" . 888113) ("XMARGIN" . 958356) ("YMARGIN" . 888119)) ("graphkeyw2.html" ("POSITION" . 316026) ("T3D" . 315956) ("ZVALUE" . 316102)))
-    ("MESH_OBJ" pro nil (system) "%s, Type, Vertex_List, Polygon_List, Array1 [, Array2]" ("M29.html" ("CLOSED" . 888559) ("DEGREES" . 965212) ("P1" . 888562) ("P5")))
-    ("MESSAGE" pro nil (system) "%s, [Text]" ("M34.html" ("BLOCK" . 888669) ("CONTINUE" . 965245) ("INFORMATIONAL" . 888672) ("IOERROR" . 888676) ("LEVEL" . 965401) ("NAME" . 965353) ("NONAME" . 965554) ("NOPREFIX" . 888682) ("NOPRINT" . 888686) ("REISSUE_LAST" . 1016375) ("RESET" . 1016373) ("TRACEBACK" . 888698)))
-    ("MK_HTML_HELP" pro nil (system) "%s, Sources, Filename" ("M37.html" ("STRICT" . 888862) ("TITLE" . 888864) ("VERBOSE" . 888866)))
-    ("MODIFYCT" pro nil (system) "%s, Itab, Name, R, G, B" ("M38.html" ("FILE" . 962516)))
-    ("MPEG_CLOSE" pro nil (system) "%s, mpegID" ("M47.html"))
-    ("MPEG_PUT" pro nil (system) "%s, mpegID" ("M49.html" ("COLOR" . 889108) ("FRAME" . 915949) ("IMAGE" . 889110) ("ORDER" . 889112) ("WINDOW" . 889114)))
-    ("MPEG_SAVE" pro nil (system) "%s, mpegID" ("M50.html" ("FILENAME" . 889150)))
-    ("MULTI" pro nil (system) "%s, N" ("M51.html"))
-    ("NCDF_ATTCDEL" pro nil (system) "%s, Cdfid [, Varid]" ("NetCDF-routines12.html" ("GLOBAL" . 996962)))
-    ("NCDF_ATTGET" pro nil (system) "%s, Cdfid [, Varid]" ("NetCDF-routines13.html" ("GLOBAL" . 996996)))
-    ("NCDF_ATTPUT" pro nil (system) "%s, Cdfid [, Varid]" ("NetCDF-routines16.html" ("BYTE" . 997126) ("CHAR" . 997129) ("DOUBLE" . 997132) ("FLOAT" . 997135) ("GLOBAL" . 997116) ("LENGTH" . 997119) ("LONG" . 997138) ("SHORT" . 997141)))
-    ("NCDF_ATTRENAME" pro nil (system) "%s, Cdfid [, Varid]" ("NetCDF-routines17.html" ("GLOBAL" . 997166)))
-    ("NCDF_CLOSE" pro nil (system) "%s, Cdfid" ("NetCDF-routines18.html"))
-    ("NCDF_CONTROL" pro nil (system) "%s, Cdfid" ("NetCDF-routines19.html" ("ABORT" . 997195) ("ENDEF" . 997198) ("FILL" . 997201) ("NOFILL" . 997237) ("NOVERBOSE" . 997240) ("OLDFILL" . 997243) ("REDEF" . 997247) ("SYNC" . 997250) ("VERBOSE" . 997253)))
-    ("NCDF_DIMINQ" pro nil (system) "%s, Cdfid, Dimid, Name, Size" ("NetCDF-routines23.html"))
-    ("NCDF_DIMRENAME" pro nil (system) "%s, Cdfid, Dimid, NewName" ("NetCDF-routines24.html"))
-    ("NCDF_VARGET" pro nil (system) "%s, Cdfid, Varid, Value" ("NetCDF-routines29.html" ("COUNT" . 997494) ("OFFSET" . 997497) ("STRIDE" . 997500)))
-    ("NCDF_VARGET1" pro nil (system) "%s, Cdfid, Varid, Value" ("NetCDF-routines30.html" ("OFFSET" . 997545)))
-    ("NCDF_VARPUT" pro nil (system) "%s, Cdfid, Varid, Value" ("NetCDF-routines33.html" ("COUNT" . 997627) ("OFFSET" . 997630) ("STRIDE" . 997633)))
-    ("NCDF_VARRENAME" pro nil (system) "%s, Cdfid, Varid, Name" ("NetCDF-routines34.html"))
-    ("OBJ" pro nil (system) "%s - > [IDLffJPEG2000::]Cleanup" ("objects_ff37.html"))
-    ("OBJ_DESTROY" pro nil (system) "%s, Obj" ("objects_ff89.html"))
-    ("ON_ERROR" pro nil (system) "%s, N" ("O7.html"))
-    ("ON_IOERROR" pro nil (system) "%s, Label" ("O8.html"))
-    ("ONLINE_HELP" pro nil (system) "%s [, Value]" ("O9.html" ("BOOK" . 889642) ("CONTEXT" . 934178) ("FOLD_CASE" . 934187) ("FULL_PATH" . 932136) ("PAGE" . 934194) ("QUIT" . 932700) ("SUPPRESS_PLUGIN_ERRORS" . 940902) ("TOPICS" . 931860)))
-    ("ONLINE_HELP_PDF_INDEX" pro nil (system) "%s [, SearchTerm]" ("O10.html"))
-    ("OPENR" pro nil (system) "%s, Unit, File" ("O11.html" ("APPEND" . 889709) ("BUFSIZE" . 889712) ("COMPRESS" . 928372) ("DELETE" . 928370) ("ERROR" . 889720) ("F77_UNFORMATTED" . 889729) ("GET_LUN" . 889739) ("MORE" . 889747) ("NOEXPAND_PATH" . 929441) ("RAWIO" . 934244) ("STDIO" . 930929) ("SWAP_ENDIAN" . 889764) ("SWAP_IF_BIG_ENDIAN" . 889767) ("SWAP_IF_LITTLE_ENDIAN" . 889770) ("VAX_FLOAT" . 889773) ("WIDTH" . 889787) ("XDR" . 889796)))
-    ("OPENU" pro nil (system) "%s, Unit, File" ("O11.html" ("APPEND" . 889709) ("BUFSIZE" . 889712) ("COMPRESS" . 928372) ("DELETE" . 928370) ("ERROR" . 889720) ("F77_UNFORMATTED" . 889729) ("GET_LUN" . 889739) ("MORE" . 889747) ("NOEXPAND_PATH" . 929441) ("RAWIO" . 934244) ("STDIO" . 930929) ("SWAP_ENDIAN" . 889764) ("SWAP_IF_BIG_ENDIAN" . 889767) ("SWAP_IF_LITTLE_ENDIAN" . 889770) ("VAX_FLOAT" . 889773) ("WIDTH" . 889787) ("XDR" . 889796)))
-    ("OPENW" pro nil (system) "%s, Unit, File" ("O11.html" ("APPEND" . 889709) ("BUFSIZE" . 889712) ("COMPRESS" . 928372) ("DELETE" . 928370) ("ERROR" . 889720) ("F77_UNFORMATTED" . 889729) ("GET_LUN" . 889739) ("MORE" . 889747) ("NOEXPAND_PATH" . 929441) ("RAWIO" . 934244) ("STDIO" . 930929) ("SWAP_ENDIAN" . 889764) ("SWAP_IF_BIG_ENDIAN" . 889767) ("SWAP_IF_LITTLE_ENDIAN" . 889770) ("VAX_FLOAT" . 889773) ("WIDTH" . 889787) ("XDR" . 889796)))
-    ("OPLOT" pro nil (system) "%s, [X,] Y" ("O12.html" ("MAX_VALUE" . 889969) ("MIN_VALUE" . 889976) ("NSUM" . 889983) ("POLAR" . 889990) ("THICK" . 889995)) ("graphkeyw2.html" ("CLIP" . 315949) ("COLOR" . 315952) ("LINESTYLE" . 331728) ("NOCLIP" . 323508) ("PSYM" . 316038) ("SYMSIZE" . 316061) ("T3D" . 315956) ("ZVALUE" . 316102)))
-    ("OPLOTERR" pro nil (system) "%s, [ X ,] Y , Err [, Psym]" ("O13.html"))
-    ("PARTICLE_TRACE" pro nil (system) "%s, Data, Seeds, Verts, Conn [, Normals]" ("P2.html" ("ANISOTROPY" . 1071147) ("INTEGRATION" . 1071149) ("MAX_ITERATIONS" . 1071158) ("MAX_STEPSIZE" . 1071160) ("SEED_NORMAL" . 1071154) ("TOLERANCE" . 1071156) ("UNIFORM" . 1071162)))
-    ("PATH_CACHE" pro nil (system) "%s" ("P3.html" ("CLEAR" . 1105531) ("ENABLE" . 1105534) ("REBUILD" . 1105537)))
-    ("PLOT" pro nil (system) "%s, [X,] Y" ("P6.html" ("ISOTROPIC" . 948898) ("MAX_VALUE" . 678098) ("MIN_VALUE" . 47057) ("NSUM" . 678100) ("POLAR" . 678103) ("THICK" . 678106) ("XLOG" . 810411) ("YLOG" . 810463) ("YNOZERO" . 810415)) ("graphkeyw2.html" ("BACKGROUND" . 328424) ("CHARSIZE" . 266973) ("CHARTHICK" . 331668) ("CLIP" . 315949) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("FONT" . 331795) ("LINESTYLE" . 331728) ("NOCLIP" . 323508) ("NODATA" . 316018) ("NOERASE" . 316024) ("NORMAL" . 315963) ("POSITION" . 316026) ("PSYM" . 316038) ("SUBTITLE" . 316057) ("SYMSIZE" . 316061) ("T3D" . 315956) ("TICKLEN" . 332207) ("TITLE" . 332238) ("XCHARSIZE" . 331699) ("XGRIDSTYLE" . 332009) ("XMARGIN" . 332038) ("XMINOR" . 332061) ("XRANGE" . 332090) ("XSTYLE" . 332116) ("XTHICK" . 332298) ("XTICK_GET" . 332321) ("XTICKFORMAT" . 332347) ("XTICKINTERVAL" . 332463) ("XTICKLAYOUT" . 332488) ("XTICKLEN" . 332513) ("XTICKNAME" . 332536) ("XTICKS" . 332559) ("XTICKUNITS" . 332586) ("XTICKV" . 332628) ("XTITLE" . 316100) ("YCHARSIZE" . 331699) ("YGRIDSTYLE" . 332009) ("YMARGIN" . 332038) ("YMINOR" . 332061) ("YRANGE" . 332090) ("YSTYLE" . 332116) ("YTHICK" . 332298) ("YTICK_GET" . 332321) ("YTICKFORMAT" . 332347) ("YTICKINTERVAL" . 332463) ("YTICKLAYOUT" . 332488) ("YTICKLEN" . 332513) ("YTICKNAME" . 332536) ("YTICKS" . 332559) ("YTICKUNITS" . 332586) ("YTICKV" . 332628) ("YTITLE" . 316100) ("ZCHARSIZE" . 331699) ("ZGRIDSTYLE" . 332009) ("ZMARGIN" . 332038) ("ZMINOR" . 332061) ("ZRANGE" . 332090) ("ZSTYLE" . 332116) ("ZTHICK" . 332298) ("ZTICK_GET" . 332321) ("ZTICKFORMAT" . 332347) ("ZTICKINTERVAL" . 332463) ("ZTICKLAYOUT" . 332488) ("ZTICKLEN" . 332513) ("ZTICKNAME" . 332536) ("ZTICKS" . 332559) ("ZTICKUNITS" . 332586) ("ZTICKV" . 332628) ("ZTITLE" . 316100) ("ZVALUE" . 316102)))
-    ("PLOT_3DBOX" pro nil (system) "%s, X, Y, Z" ("P7.html" ("GRIDSTYLE" . 137555) ("PSYM" . 137608) ("SOLID_WALLS" . 835291) ("XY_PLANE" . 137639) ("XYSTYLE" . 137642) ("XZ_PLANE" . 137637) ("XZSTYLE" . 137638) ("YZ_PLANE" . 137640) ("YZSTYLE" . 137643)) ("S75.html" ("AX" . 679220) ("AZ" . 679225) ("ZAXIS" . 679256)))
-    ("PLOT_FIELD" pro nil (system) "%s, U, V" ("P8.html" ("ASPECT" . 757604) ("LENGTH" . 757607) ("N" . 757610) ("TITLE" . 757613)))
-    ("PLOTERR" pro nil (system) "%s, [ X ,] Y , Err" ("P9.html" ("PSYM" . 757654) ("TYPE" . 757647)))
-    ("PLOTS" pro nil (system) "%s, X [, Y [, Z]]" ("P10.html" ("CONTINUE" . 678168)) ("graphkeyw2.html" ("CLIP" . 315949) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("LINESTYLE" . 331728) ("NOCLIP" . 323508) ("NORMAL" . 315963) ("PSYM" . 316038) ("SYMSIZE" . 316061) ("T3D" . 315956) ("THICK" . 316006) ("Z" . 332658)))
-    ("POINT_LUN" pro nil (system) "%s, Unit, Position" ("P12.html"))
-    ("POLAR_CONTOUR" pro nil (system) "%s, Z, Theta, R" ("P13.html" ("SHOW_TRIANGULATION" . 128404)) ("C40.html" ("C_ANNOTATION" . 1023103) ("C_CHARSIZE" . 676279) ("C_CHARTHICK" . 905138) ("C_COLORS" . 676281) ("C_LINESTYLE" . 676292) ("C_ORIENTATION" . 676298) ("C_SPACING" . 676300) ("C_THICK" . 676302) ("CLOSED" . 676304) ("FILL" . 676308) ("IRREGULAR" . 879096) ("LEVELS" . 927695) ("MAX_VALUE" . 676323) ("MIN_VALUE" . 47033) ("NLEVELS" . 676325) ("OVERPLOT" . 861732) ("PATH_DATA_COORDS" . 879089) ("TRIANGULATION" . 746344) ("XLOG" . 158329) ("YLOG" . 158344) ("ZAXIS" . 676344)))
-    ("POLYFILL" pro nil (system) "%s, X [, Y [, Z]]" ("P19.html" ("IMAGE_COORD" . 678254) ("IMAGE_INTERP" . 678256) ("LINE_FILL" . 678258) ("PATTERN" . 678260) ("SPACING" . 678269) ("TRANSPARENT" . 678271)) ("graphkeyw2.html" ("CLIP" . 315949) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("LINESTYLE" . 331728) ("NOCLIP" . 323508) ("NORMAL" . 315963) ("ORIENTATION" . 315964) ("T3D" . 315956) ("THICK" . 316006) ("Z" . 332658)))
-    ("POLYWARP" pro nil (system) "%s, Xi, Yi, Xo, Yo, Degree, Kx, Ky" ("P22.html" ("DOUBLE" . 1075034) ("STATUS" . 1075060)))
-    ("POPD" pro nil (system) "%s" ("P23.html"))
-    ("POWELL" pro nil (system) "%s, P, Xi, Ftol, Fmin, Func" ("P24.html" ("DOUBLE" . 51467) ("ITER" . 51470) ("ITMAX" . 51473)))
-    ("PRINT" pro nil (system) "%s [, Expr1, ..., Exprn]" ("P26.html" ("AM_PM" . 678362) ("DAYS_OF_WEEK" . 1015582) ("FORMAT" . 1015576) ("MONTHS" . 1015619) ("STDIO_NON_FINITE" . 1015513)))
-    ("PRINTD" pro nil (system) "%s" ("P27.html"))
-    ("PRINTF" pro nil (system) "%s [, Unit, Expr1, ..., Exprn]" ("P26.html" ("AM_PM" . 678362) ("DAYS_OF_WEEK" . 1015582) ("FORMAT" . 1015576) ("MONTHS" . 1015619) ("STDIO_NON_FINITE" . 1015513)))
-    ("PROFILER" pro nil (system) "%s [, Module]" ("P31.html" ("CLEAR" . 900205) ("DATA" . 1088814) ("OUTPUT" . 900155) ("REPORT" . 900194) ("RESET" . 900195) ("SYSTEM" . 900159)))
-    ("PROFILES" pro nil (system) "%s, Image" ("P32.html" ("ORDER" . 757719) ("SX" . 757722) ("SY" . 757725) ("WSIZE" . 757728)))
-    ("PS_SHOW_FONTS" pro nil (system) "%s" ("P34.html" ("NOLATIN" . 762026)))
-    ("PSAFM" pro nil (system) "%s, Input_Filename, Output_Filename" ("P35.html"))
-    ("PSEUDO" pro nil (system) "%s, Litlo, Lithi, Satlo, Sathi, Hue, Loops [, Colr]" ("P36.html"))
-    ("PTR_FREE" pro nil (system) "%s, P1, ... ..., Pn" ("P37.html"))
-    ("PUSHD" pro nil (system) "%s, Dir" ("P41.html"))
-    ("QHULL" pro nil (system) "%s, V, Tr or, %s, V0 , V1, [, V2 ... [, V6] ] , Tr" ("Q2.html" ("BOUNDS" . 1073465) ("CONNECTIVITY" . 1073467) ("DELAUNAY" . 1073473) ("SPHERE" . 1073475) ("VDIAGRAM" . 1073477) ("VNORMALS" . 1073481) ("VVERTICES" . 1073483)))
-    ("RDPIX" pro nil (system) "%s, Image [, X0, Y0]" ("R7.html"))
-    ("READ" pro nil (system) "%s, [Prompt,] Var1, ..., Varn" ("R8.html" ("AM_PM" . 1015647) ("DAYS_OF_WEEK" . 1015649) ("FORMAT" . 1015645) ("MONTHS" . 1015670) ("PROMPT" . 863855)))
-    ("READ_GIF" pro nil (system) "%s, Filename, Image [, R, G, B]" ("R13.html" ("CLOSE" . 1165757) ("MULTIPLE" . 1165763)))
-    ("READ_INTERFILE" pro nil (system) "%s, File, Data" ("R15.html"))
-    ("READ_JPEG" pro nil (system) "%s [, Filename] , Image [, Colortable]" ("R16.html" ("BUFFER" . 279694) ("COLORS" . 279696) ("DITHER" . 279697) ("GRAYSCALE" . 1064444) ("ORDER" . 868283) ("TRUE" . 279699) ("TWO_PASS_QUANTIZE" . 279700) ("UNIT" . 279701)))
-    ("READ_PICT" pro nil (system) "%s, Filename, Image [, R, G, B]" ("R19.html"))
-    ("READ_PPM" pro nil (system) "%s, Filename, Image" ("R21.html" ("MAXVAL" . 67809)))
-    ("READ_SRF" pro nil (system) "%s, Filename, Image [, R, G, B]" ("R23.html"))
-    ("READ_WAVE" pro nil (system) "%s, File, Variables, Names, Dimensions" ("R27.html" ("MESHNAMES" . 756240)))
-    ("READ_X11_BITMAP" pro nil (system) "%s, File, Bitmap [, X, Y]" ("R28.html" ("EXPAND_TO_BYTES" . 756264)))
-    ("READF" pro nil (system) "%s, [Prompt,] Unit, Var1, ..., Varn" ("R8.html" ("AM_PM" . 1015647) ("DAYS_OF_WEEK" . 1015649) ("FORMAT" . 1015645) ("MONTHS" . 1015670) ("PROMPT" . 863855)))
-    ("READS" pro nil (system) "%s, Input, Var1, ..., Varn" ("R30.html" ("AM_PM" . 1015707) ("DAYS_OF_WEEK" . 1015709) ("FORMAT" . 678457) ("MONTHS" . 1015728)))
-    ("READU" pro nil (system) "%s, Unit, Var1, ..., Varn" ("R31.html" ("TRANSFER_COUNT" . 678471)))
-    ("REDUCE_COLORS" pro nil (system) "%s, Image, Values" ("R36.html"))
-    ("REGISTER_CURSOR" pro nil (system) "%s, Name, Image" ("R39.html" ("HOTSPOT" . 1108842) ("MASK" . 1108840) ("OVERWRITE" . 1108844)))
-    ("REPLICATE_INPLACE" pro nil (system) "%s, X, Value [, D1, Loc1 [, D2, Range]]" ("R43.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("RESOLVE_ALL" pro nil (system) "%s" ("R44.html" ("CLASS" . 1114080) ("CONTINUE_ON_ERROR" . 1114078) ("QUIET" . 1014991) ("RESOLVE_EITHER" . 1166218) ("RESOLVE_FUNCTION" . 1166223) ("RESOLVE_PROCEDURE" . 1166248) ("SKIP_ROUTINES" . 1166262) ("UNRESOLVED" . 1166255)))
-    ("RESOLVE_ROUTINE" pro nil (system) "%s, Name" ("R45.html" ("COMPILE_FULL_FILE" . 1069898) ("EITHER" . 1073138) ("IS_FUNCTION" . 1069896) ("NO_RECOMPILE" . 1069991)))
-    ("RESTORE" pro nil (system) "%s [[, Filename]]" ("R46.html" ("DESCRIPTION" . 1135778) ("FILENAME" . 678568) ("RELAXED_STRUCTURE_ASSIGNMENT" . 900571) ("RESTORED_OBJECTS" . 900564) ("VERBOSE" . 678570)))
-    ("RETALL" pro nil (system) "%s" ("R47.html"))
-    ("SAVE" pro nil (system) "%s [, Var1, ..., Varn]" ("S2.html" ("ALL" . 678631) ("COMM" . 678633) ("COMPRESS" . 1074405) ("DESCRIPTION" . 678635) ("FILENAME" . 1199210) ("ROUTINES" . 678637) ("SYSTEM_VARIABLES" . 678639) ("VARIABLES" . 678642) ("VERBOSE" . 678644)))
-    ("SCALE3" pro nil (system) "%s" ("S4.html" ("AX" . 787108) ("AZ" . 787111) ("XRANGE" . 787099) ("YRANGE" . 787102) ("ZRANGE" . 787105)))
-    ("SCALE3D" pro nil (system) "%s" ("S5.html"))
-    ("SET_PLOT" pro nil (system) "%s, Device" ("S11.html" ("COPY" . 862592) ("INTERPOLATE" . 862599)))
-    ("SET_SHADING" pro nil (system) "%s" ("S12.html" ("GOURAUD" . 678682) ("LIGHT" . 678685) ("REJECT" . 678687) ("VALUES" . 678689)))
-    ("SETENV" pro nil (system) "%s, Environment_Expression" ("S13.html"))
-    ("SETUP_KEYS" pro nil (system) "%s" ("S14.html" ("ANSI" . 43203) ("APP_KEYPAD" . 43217) ("EIGHTBIT" . 1015422) ("HP9000" . 43209) ("IBM" . 1015421) ("MIPS" . 43211) ("NUM_KEYPAD" . 43219) ("SGI" . 43215) ("SUN" . 43205) ("VT200" . 43207)))
-    ("SHADE_SURF" pro nil (system) "%s, Z [, X, Y]" ("S16.html" ("AX" . 678754) ("AZ" . 678759) ("IMAGE" . 678761) ("MAX_VALUE" . 678763) ("MIN_VALUE" . 47127) ("PIXELS" . 844042) ("SAVE" . 678765) ("SHADES" . 678767) ("XLOG" . 158361) ("YLOG" . 158393)) ("graphkeyw2.html" ("CHARSIZE" . 266973) ("CHARTHICK" . 331668) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("FONT" . 331795) ("NODATA" . 316018) ("NORMAL" . 315963) ("POSITION" . 316026) ("SUBTITLE" . 316057) ("T3D" . 315956) ("THICK" . 316006) ("TICKLEN" . 332207) ("TITLE" . 332238) ("XCHARSIZE" . 331699) ("XGRIDSTYLE" . 332009) ("XMARGIN" . 332038) ("XMINOR" . 332061) ("XRANGE" . 332090) ("XSTYLE" . 332116) ("XTHICK" . 332298) ("XTICK_GET" . 332321) ("XTICKFORMAT" . 332347) ("XTICKINTERVAL" . 332463) ("XTICKLAYOUT" . 332488) ("XTICKLEN" . 332513) ("XTICKNAME" . 332536) ("XTICKS" . 332559) ("XTICKUNITS" . 332586) ("XTICKV" . 332628) ("XTITLE" . 316100) ("YCHARSIZE" . 331699) ("YGRIDSTYLE" . 332009) ("YMARGIN" . 332038) ("YMINOR" . 332061) ("YRANGE" . 332090) ("YSTYLE" . 332116) ("YTHICK" . 332298) ("YTICK_GET" . 332321) ("YTICKFORMAT" . 332347) ("YTICKINTERVAL" . 332463) ("YTICKLAYOUT" . 332488) ("YTICKLEN" . 332513) ("YTICKNAME" . 332536) ("YTICKS" . 332559) ("YTICKUNITS" . 332586) ("YTICKV" . 332628) ("YTITLE" . 316100) ("ZCHARSIZE" . 331699) ("ZGRIDSTYLE" . 332009) ("ZMARGIN" . 332038) ("ZMINOR" . 332061) ("ZRANGE" . 332090) ("ZSTYLE" . 332116) ("ZTHICK" . 332298) ("ZTICK_GET" . 332321) ("ZTICKFORMAT" . 332347) ("ZTICKINTERVAL" . 332463) ("ZTICKLAYOUT" . 332488) ("ZTICKLEN" . 332513) ("ZTICKNAME" . 332536) ("ZTICKS" . 332559) ("ZTICKUNITS" . 332586) ("ZTICKV" . 332628) ("ZTITLE" . 316100) ("ZVALUE" . 316102)))
-    ("SHADE_SURF_IRR" pro nil (system) "%s, Z, X, Y" ("S17.html" ("AX" . 787162) ("AZ" . 787165) ("IMAGE" . 787168) ("PLIST" . 787171) ("T3D" . 867401)))
-    ("SHADE_VOLUME" pro nil (system) "%s, Volume, Value, Vertex, Poly" ("S18.html" ("LOW" . 678801) ("SHADES" . 678803) ("VERBOSE" . 678805) ("XRANGE" . 678807) ("YRANGE" . 678809) ("ZRANGE" . 678811)))
-    ("SHMMAP" pro nil (system) "%s [, SegmentName] [, D1, ..., D8]" ("S21.html" ("BYTE" . 1143213) ("COMPLEX" . 1143215) ("DCOMPLEX" . 1143217) ("DESTROY_SEGMENT" . 1143219) ("DIMENSION" . 1143226) ("DOUBLE" . 1143228) ("FILENAME" . 1143230) ("FLOAT" . 1143234) ("GET_NAME" . 1143237) ("GET_OS_HANDLE" . 1143240) ("INTEGER" . 1143245) ("L64" . 1143247) ("LONG" . 1143252) ("OFFSET" . 1143254) ("OS_HANDLE" . 1143259) ("PRIVATE" . 1143277) ("SIZE" . 1143281) ("SYSV" . 1143286) ("TEMPLATE" . 1143291) ("TYPE" . 1143293) ("UINT" . 1143298) ("UL64" . 1143302) ("ULONG" . 1143300)))
-    ("SHMUNMAP" pro nil (system) "%s, SegmentName" ("S22.html"))
-    ("SHOW3" pro nil (system) "%s, Image [, X, Y]" ("S24.html" ("E_CONTOUR" . 863032) ("E_SURFACE" . 863036) ("INTERP" . 862964) ("SSCALE" . 787203)))
-    ("SHOWFONT" pro nil (system) "%s, Font, Name" ("S25.html" ("ENCAPSULATED" . 762072) ("TT_FONT" . 901959)))
-    ("SKIP_LUN" pro nil (system) "%s, FromUnit, [, Num]" ("S32.html" ("EOF" . 1143762) ("LINES" . 1143765) ("TRANSFER_COUNT" . 1143767)))
-    ("SLICER3" pro nil (system) "%s [, hData3D]" ("S33.html" ("DATA_NAMES" . 914863) ("DETACH" . 914866) ("GROUP" . 914869) ("MODAL" . 914872)))
-    ("SLIDE_IMAGE" pro nil (system) "%s [, Image]" ("S34.html" ("BLOCK" . 923990) ("CONGRID" . 787344) ("FULL_WINDOW" . 787347) ("GROUP" . 787350) ("ORDER" . 787353) ("REGISTER" . 787356) ("RETAIN" . 787360) ("SHOW_FULL" . 787366) ("SLIDE_WINDOW" . 787363) ("TITLE" . 900068) ("TOP_ID" . 787369) ("XSIZE" . 787374) ("XVISIBLE" . 787377) ("YSIZE" . 787380) ("YVISIBLE" . 787383)))
-    ("SOCKET" pro nil (system) "%s, Unit, Host, Port" ("S37.html" ("CONNECT_TIMEOUT" . 1098145) ("ERROR" . 1098148) ("GET_LUN" . 1142975) ("RAWIO" . 1098160) ("READ_TIMEOUT" . 1098166) ("STDIO" . 1133828) ("SWAP_ENDIAN" . 1098168) ("SWAP_IF_BIG_ENDIAN" . 1098171) ("SWAP_IF_LITTLE_ENDIAN" . 1098175) ("WIDTH" . 1098179) ("WRITE_TIMEOUT" . 1098187)))
-    ("SPAWN" pro nil (system) "%s [, Command [, Result] [, ErrResult]]" ("S39.html" ("COUNT" . 678969) ("EXIT_STATUS" . 678971) ("HIDE" . 1133996) ("LOG_OUTPUT" . 1134006) ("NOSHELL" . 1108410) ("NOTTYRESET" . 1134017) ("NOWAIT" . 1134051) ("NULL_STDIN" . 1134151) ("PID" . 1084167) ("SH" . 1133965) ("STDERR" . 1133968) ("UNIT" . 1133975)))
-    ("SPH_4PNT" pro nil (system) "%s, X, Y, Z, Xc, Yc, Zc, R" ("S40.html" ("DOUBLE" . 1094107)))
-    ("SPLINE_P" pro nil (system) "%s, X, Y, Xr, Yr" ("S46.html" ("DOUBLE" . 1187959) ("INTERVAL" . 758561) ("TAN0" . 758564) ("TAN1" . 758567)))
-    ("STOP" pro nil (system) "%s [, Expr1, ..., Exprn]" ("S54.html"))
-    ("STREAMLINE" pro nil (system) "%s, Verts, Conn, Normals, Outverts, Outconn" ("S58.html" ("ANISOTROPY" . 1078861) ("PROFILE" . 1078865) ("SIZE" . 1078863)))
-    ("STRETCH" pro nil (system) "%s [, Low, High [, Gamma]]" ("S60.html" ("CHOP" . 759533)))
-    ("STRPUT" pro nil (system) "%s, Destination, Source [, Position]" ("S69.html"))
-    ("STRUCT_ASSIGN" pro nil (system) "%s, Source, Destination" ("S72.html" ("NOZERO" . 1074356) ("VERBOSE" . 901018)))
-    ("STRUCT_HIDE" pro nil (system) "%s, Arg1 [, Arg2, ..., Argn]" ("S73.html"))
-    ("SURFACE" pro nil (system) "%s, Z [, X, Y]" ("S75.html" ("AX" . 679220) ("AZ" . 679225) ("BOTTOM" . 679227) ("HORIZONTAL" . 679229) ("LEGO" . 716839) ("LOWER_ONLY" . 679231) ("MAX_VALUE" . 679233) ("MIN_VALUE" . 47161) ("SAVE" . 679235) ("SHADES" . 679245) ("SKIRT" . 679247) ("UPPER_ONLY" . 679250) ("XLOG" . 158409) ("YLOG" . 158414) ("ZAXIS" . 679256) ("ZLOG" . 862016)))
-    ("SURFR" pro nil (system) "%s" ("S76.html" ("AX" . 787417) ("AZ" . 787420)))
-    ("SVDC" pro nil (system) "%s, A, W, U, V" ("S77.html" ("COLUMN" . 58767) ("DOUBLE" . 52115) ("ITMAX" . 1095860)))
-    ("SWAP_ENDIAN_INPLACE" pro nil (system) "%s, Variable" ("S81.html" ("SWAP_IF_BIG_ENDIAN" . 1143824) ("SWAP_IF_LITTLE_ENDIAN" . 1143826)))
-    ("T3D" pro nil (system) "%s [, Array]" ("T3.html" ("MATRIX" . 787453) ("OBLIQUE" . 1076313) ("PERSPECTIVE" . 787459) ("RESET" . 787462) ("ROTATE" . 787465) ("SCALE" . 787468) ("TRANSLATE" . 787471) ("XYEXCH" . 787474) ("XZEXCH" . 787477) ("YZEXCH" . 787480)))
-    ("TEK_COLOR" pro nil (system) "%s [, Start_Index, Colors]" ("T7.html"))
-    ("THREED" pro nil (system) "%s, A [, Sp]" ("T13.html" ("TITLE" . 787515) ("XTITLE" . 787518) ("YTITLE" . 787521)))
-    ("TIME_TEST2" pro nil (system) "%s [, Filename]" ("T14.html"))
-    ("TRIANGULATE" pro nil (system) "%s, X, Y, Triangles [, B]" ("T21.html" ("CONNECTIVITY" . 679547) ("DEGREES" . 126686) ("FVALUE" . 126695) ("REPEATS" . 679555) ("SPHERE" . 126681)))
-    ("TRIQL" pro nil (system) "%s, D, E, A" ("T23.html" ("DOUBLE" . 52221)))
-    ("TRIRED" pro nil (system) "%s, A, D, E" ("T24.html" ("DOUBLE" . 52282)))
-    ("TRUNCATE_LUN" pro nil (system) "%s, Unit1, ..., Unitn" ("T26.html"))
-    ("TV" pro nil (system) "%s, Image [, Position] or %s, Image [, X, Y [, Channel]]" ("T31.html" ("CENTIMETERS" . 679682) ("INCHES" . 679690) ("ORDER" . 679694) ("TRUE" . 679698) ("WORDS" . 679701) ("XSIZE" . 679703) ("YSIZE" . 679705)) ("graphkeyw2.html" ("CHANNEL" . 315931) ("DATA" . 315961) ("DEVICE" . 315977) ("NORMAL" . 315963) ("T3D" . 315956) ("Z" . 332658)))
-    ("TVCRS" pro nil (system) "%s [, ON_OFF] or %s [, X, Y]" ("T32.html" ("CENTIMETERS" . 679732) ("HIDE_CURSOR" . 817846) ("INCHES" . 817861)) ("graphkeyw2.html" ("DATA" . 315961) ("DEVICE" . 315977) ("NORMAL" . 315963) ("T3D" . 315956) ("Z" . 332658)))
-    ("TVLCT" pro nil (system) "%s, V1, V2, V3 [, Start]" ("T33.html" ("GET" . 844142) ("HLS" . 679761) ("HSV" . 679763)))
-    ("TVSCL" pro nil (system) "%s, Image [, Position] or %s, Image [, X, Y [, Channel]]" ("T35.html" ("CENTIMETERS") ("INCHES") ("NAN" . 902069) ("ORDER") ("TOP" . 218988) ("TRUE") ("WORDS") ("XSIZE") ("YSIZE")) ("T31.html" ("CENTIMETERS" . 679682) ("INCHES" . 679690) ("ORDER" . 679694) ("TRUE" . 679698) ("WORDS" . 679701) ("XSIZE" . 679703) ("YSIZE" . 679705)) ("graphkeyw2.html" ("CHANNEL" . 315931) ("DATA" . 315961) ("DEVICE" . 315977) ("NORMAL" . 315963) ("T3D" . 315956) ("Z" . 332658)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("USERSYM" pro nil (system) "%s, X [, Y]" ("U12.html" ("COLOR" . 886945) ("FILL" . 886948) ("THICK" . 886951)))
-    ("VECTOR_FIELD" pro nil (system) "%s, Field, Outverts, Outconn" ("V3.html" ("ANISOTROPY" . 957083) ("SCALE" . 957085) ("VERTICES" . 957087)))
-    ("VEL" pro nil (system) "%s, U, V" ("V4.html" ("LENGTH" . 956021) ("NSTEPS" . 956033) ("NVECS" . 787550) ("TITLE" . 956041) ("XMAX" . 787553)))
-    ("VELOVECT" pro nil (system) "%s, U, V [, X, Y]" ("V5.html" ("COLOR" . 787592) ("DOTS" . 787595) ("LENGTH" . 787598) ("MISSING" . 787601) ("OVERPLOT" . 957555)) ("P6.html" ("ISOTROPIC" . 948898) ("MAX_VALUE" . 678098) ("MIN_VALUE" . 47057) ("NSUM" . 678100) ("POLAR" . 678103) ("THICK" . 678106) ("XLOG" . 810411) ("YLOG" . 810463) ("YNOZERO" . 810415)))
-    ("VORONOI" pro nil (system) "%s, X, Y, I0, C, Xp, Yp, Rect" ("V8.html"))
-    ("WAIT" pro nil (system) "%s, Seconds" ("W.html"))
-    ("WDELETE" pro nil (system) "%s [, Window_Index [, ...]]" ("W5.html"))
-    ("WF_DRAW" pro nil (system) "%s, X, Y" ("W6.html" ("COLD" . 787681) ("COLOR" . 787684) ("CONVERGENCE" . 787687) ("DATA" . 787690) ("DEVICE" . 787693) ("FRONT_TYPE" . 787696) ("INTERVAL" . 787699) ("NORMAL" . 787702) ("OCCLUDED" . 787705) ("PSYM" . 787708) ("STATIONARY" . 787714) ("SYM_HT" . 787717) ("SYM_LEN" . 787720) ("THICK" . 787723) ("WARM" . 787726)))
-    ("WIDGET_CONTROL" pro nil (system) "%s [, Widget_ID]" ("W13.html" ("ALIGNMENT" . 894840) ("ALL_TABLE_EVENTS" . 894849) ("ALL_TEXT_EVENTS" . 680079) ("AM_PM" . 949789) ("APPEND" . 886776) ("BAD_ID" . 680083) ("BASE_SET_TITLE" . 977104) ("BITMAP" . 1077396) ("CANCEL_BUTTON" . 910691) ("CLEAR_EVENTS" . 978647) ("COLUMN_LABELS" . 894928) ("COLUMN_WIDTHS" . 894930) ("COMBOBOX_ADDITEM" . 981369) ("COMBOBOX_DELETEITEM" . 981434) ("COMBOBOX_INDEX" . 981376) ("CONTEXT_EVENTS" . 949802) ("DAYS_OF_WEEK" . 970733) ("DEFAULT_BUTTON" . 909921) ("DEFAULT_FONT" . 680087) ("DELAY_DESTROY" . 680090) ("DELETE_COLUMNS" . 894963) ("DELETE_ROWS" . 919067) ("DESTROY" . 680094) ("DRAW_BUTTON_EVENTS" . 680097) ("DRAW_EXPOSE_EVENTS" . 907371) ("DRAW_KEYBOARD_EVENTS" . 985153) ("DRAW_MOTION_EVENTS" . 680099) ("DRAW_VIEWPORT_EVENTS" . 680101) ("DRAW_XSIZE" . 58243) ("DRAW_YSIZE" . 58244) ("DYNAMIC_RESIZE" . 192830) ("EDIT_CELL" . 895011) ("EDITABLE" . 889314) ("EVENT_FUNC" . 895036) ("EVENT_PRO" . 680108) ("FORMAT" . 895067) ("FUNC_GET_VALUE" . 680113) ("GET_DRAW_VIEW" . 680115) ("GET_UVALUE" . 680117) ("GET_VALUE" . 680122) ("GROUP_LEADER" . 933268) ("HOURGLASS" . 680134) ("ICONIFY" . 680136) ("INPUT_FOCUS" . 680138) ("INSERT_COLUMNS" . 895129) ("INSERT_ROWS" . 895131) ("KBRD_FOCUS_EVENTS" . 919052) ("KILL_NOTIFY" . 680140) ("MANAGED" . 680144) ("MAP" . 680146) ("MONTHS" . 949815) ("MULTIPLE_PROPERTIES" . 1100768) ("NO_COPY" . 680150) ("NO_NEWLINE" . 680152) ("NOTIFY_REALIZE" . 67586) ("PRO_SET_VALUE" . 680154) ("PROPERTYSHEET_SETSELECTED" . 1070765) ("PUSHBUTTON_EVENTS" . 1020091) ("REALIZE" . 680156) ("REFRESH_PROPERTY" . 1018381) ("RESET" . 1018400) ("ROW_HEIGHTS" . 895150) ("ROW_LABELS" . 895148) ("SCR_XSIZE" . 58190) ("SCR_YSIZE" . 58191) ("SEND_EVENT" . 58210) ("SENSITIVE" . 680164) ("SET_BUTTON" . 680167) ("SET_COMBOBOX_SELECT" . 981513) ("SET_DRAW_VIEW" . 680169) ("SET_DROPLIST_SELECT" . 680172) ("SET_LIST_SELECT" . 58235) ("SET_LIST_TOP" . 680175) ("SET_SLIDER_MAX" . 680177) ("SET_SLIDER_MIN" . 680179) ("SET_TAB_CURRENT" . 977118) ("SET_TAB_MULTILINE" . 977124) ("SET_TABLE_SELECT" . 895216) ("SET_TABLE_VIEW" . 895208) ("SET_TEXT_SELECT" . 680181) ("SET_TEXT_TOP_LINE" . 680185) ("SET_TREE_BITMAP" . 978535) ("SET_TREE_EXPANDED" . 978542) ("SET_TREE_SELECT" . 978548) ("SET_TREE_VISIBLE" . 978561) ("SET_UNAME" . 1095671) ("SET_UVALUE" . 949285) ("SET_VALUE" . 680190) ("SHOW" . 680199) ("TAB_MODE" . 1069607) ("TABLE_BLANK" . 1069681) ("TABLE_DISJOINT_SELECTION" . 987414) ("TABLE_XSIZE" . 895238) ("TABLE_YSIZE" . 895244) ("TIMER" . 680201) ("TLB_GET_OFFSET" . 680204) ("TLB_GET_SIZE" . 680206) ("TLB_ICONIFY_EVENTS" . 984722) ("TLB_KILL_REQUEST_EVENTS" . 192837) ("TLB_MOVE_EVENTS" . 984735) ("TLB_SET_TITLE" . 680208) ("TLB_SET_XOFFSET" . 680210) ("TLB_SET_YOFFSET" . 680212) ("TLB_SIZE_EVENTS" . 984752) ("TOOLTIP" . 982093) ("TRACKING_EVENTS" . 58183) ("UNITS" . 895316) ("UPDATE" . 680214) ("USE_TABLE_SELECT" . 934621) ("USE_TEXT_SELECT" . 192856) ("X_BITMAP_EXTRA" . 680216) ("XOFFSET" . 58269) ("XSIZE" . 58220) ("YOFFSET" . 58279) ("YSIZE" . 58221)))
-    ("WIDGET_DISPLAYCONTEXTMENU" pro nil (system) "%s, Parent, X, Y, ContextBase_ID" ("W14.html"))
-    ("WINDOW" pro nil (system) "%s [, Window_Index]" ("W27.html" ("COLORS" . 896410) ("FREE" . 680620) ("PIXMAP" . 680622) ("RETAIN" . 680624) ("TITLE" . 680625) ("XPOS" . 680628) ("XSIZE" . 680635) ("YPOS" . 680633) ("YSIZE" . 680637)))
-    ("WRITE_BMP" pro nil (system) "%s, Filename, Image[, R, G, B]" ("W28.html" ("FOUR_BIT" . 756441) ("HEADER_DEFINE" . 756447) ("IHDR" . 756444) ("RGB" . 964751)))
-    ("WRITE_GIF" pro nil (system) "%s, Filename, Image[, R, G, B]" ("W29.html" ("CLOSE" . 1068115) ("MULTIPLE" . 1068121)))
-    ("WRITE_IMAGE" pro nil (system) "%s, Filename, Format, Data [, Red, Green, Blue]" ("W30.html" ("APPEND" . 961233)))
-    ("WRITE_JPEG" pro nil (system) "%s [, Filename] , Image" ("W31.html" ("ORDER" . 279735) ("PROGRESSIVE" . 912025) ("QUALITY" . 279736) ("TRUE" . 279737) ("UNIT" . 896438)))
-    ("WRITE_JPEG2000" pro nil (system) "%s, Filename, Image [, Red, Green, Blue]" ("W32.html" ("N_LAYERS" . 1112356) ("N_LEVELS" . 1112359) ("ORDER" . 1112362) ("REVERSIBLE" . 1112365)))
-    ("WRITE_NRIF" pro nil (system) "%s, File, Image [, R, G, B]" ("W33.html"))
-    ("WRITE_PICT" pro nil (system) "%s, Filename [, Image, R, G, B]" ("W34.html"))
-    ("WRITE_PNG" pro nil (system) "%s, Filename, Image[, R, G, B]" ("W35.html" ("ORDER" . 950656) ("TRANSPARENT" . 950659) ("VERBOSE" . 964556)))
-    ("WRITE_PPM" pro nil (system) "%s, Filename, Image" ("W36.html" ("ASCII" . 67923)))
-    ("WRITE_SPR" pro nil (system) "%s, AS, Filename" ("W37.html"))
-    ("WRITE_SRF" pro nil (system) "%s, Filename [, Image, R, G, B]" ("W38.html" ("ORDER" . 756556) ("WRITE_32" . 756559)))
-    ("WRITE_TIFF" pro nil (system) "%s, Filename [, Image]" ("W40.html" ("APPEND" . 945440) ("BITS_PER_SAMPLE" . 945448) ("BLUE" . 960346) ("CMYK" . 1049851) ("COMPRESSION" . 972526) ("DESCRIPTION" . 1049872) ("DOCUMENT_NAME" . 1049881) ("DOT_RANGE" . 1049890) ("FLOAT" . 945539) ("GEOTIFF" . 945456) ("GREEN" . 960346) ("ICC_PROFILE" . 1049899) ("LONG" . 945853) ("ORIENTATION" . 972561) ("PHOTOSHOP" . 1049908) ("PLANARCONFIG" . 896473) ("RED" . 960346) ("SHORT" . 945559) ("UNITS" . 960431) ("VERBOSE" . 972627) ("XPOSITION" . 1063829) ("XRESOL" . 896478) ("YPOSITION" . 1063850) ("YRESOL" . 917320)))
-    ("WRITE_WAV" pro nil (system) "%s, Filename, Data, Rate" ("W41.html"))
-    ("WRITE_WAVE" pro nil (system) "%s, File, Array" ("W42.html" ("BIN" . 756580) ("DATANAME" . 756583) ("MESHNAME" . 756586) ("NOMESHDEF" . 756589) ("VECTOR" . 756592)))
-    ("WRITEU" pro nil (system) "%s, Unit, Expr1 ..., Exprn" ("W43.html" ("TRANSFER_COUNT" . 680669)))
-    ("WSET" pro nil (system) "%s [, Window_Index]" ("W44.html"))
-    ("WSHOW" pro nil (system) "%s [, Window_Index [, Show]]" ("W45.html" ("ICONIC" . 680709)))
-    ("WV_APPLET" pro nil (system) "%s [, Input]" ("ref4.html" ("ARRAY" . 1004583) ("GROUP_LEADER" . 1004841) ("NO_SPLASH" . 1004848) ("TOOLS" . 1004856) ("WAVELETS" . 1005269)))
-    ("WV_IMPORT_DATA" pro nil (system) "%s, Data" ("ref16.html" ("MESSAGE_OUT" . 1006957) ("PARENT" . 1008033)))
-    ("WV_IMPORT_WAVELET" pro nil (system) "%s [, Wavelet]" ("ref17.html" ("RESET" . 1007019)))
-    ("XBM_EDIT" pro nil (system) "%s" ("X.html" ("BLOCK" . 937479) ("FILENAME" . 762711) ("GROUP" . 762714) ("XSIZE" . 762717) ("YSIZE" . 762720)))
-    ("XDISPLAYFILE" pro nil (system) "%s, Filename" ("X2.html" ("BLOCK" . 937490) ("DONE_BUTTON" . 960338) ("EDITABLE" . 960341) ("FONT" . 960336) ("GROUP" . 762749) ("HEIGHT" . 762752) ("MODAL" . 933305) ("TEXT" . 762755) ("TITLE" . 762758) ("WIDTH" . 762761) ("WTEXT" . 960359)))
-    ("XDXF" pro nil (system) "%s [, Filename]" ("X3.html" ("BLOCK" . 976345) ("GROUP" . 976354) ("SCALE" . 976358) ("TEST" . 976360)))
-    ("XINTERANIMATE" pro nil (system) "%s [, Rate]" ("X5.html" ("BLOCK" . 964691) ("CLOSE" . 894369) ("CYCLE" . 894339) ("FRAME" . 894353) ("GROUP" . 964285) ("IMAGE" . 894356) ("KEEP_PIXMAPS" . 894375) ("MODAL" . 964292) ("MPEG_BITRATE" . 964699) ("MPEG_CLOSE" . 941497) ("MPEG_FILENAME" . 934000) ("MPEG_IFRAME_GAP" . 964723) ("MPEG_MOTION_VEC_LENGTH" . 964730) ("MPEG_OPEN" . 934051) ("MPEG_QUALITY" . 964762) ("ORDER" . 894359) ("SET" . 894336) ("SHOWLOAD" . 894342) ("TITLE" . 894348) ("TRACK" . 894345) ("WINDOW" . 894362) ("XOFFSET" . 894378) ("YOFFSET" . 894381)))
-    ("XLOADCT" pro nil (system) "%s" ("X6.html" ("BLOCK" . 937520) ("BOTTOM" . 937526) ("FILE" . 937512) ("GROUP" . 959363) ("MODAL" . 930516) ("NCOLORS" . 930518) ("SILENT" . 761913) ("UPDATECALLBACK" . 950093) ("UPDATECBDATA" . 950095) ("USE_CURRENT" . 761916)))
-    ("XMANAGER" pro nil (system) "%s [, Name, ID]" ("X7.html" ("CATCH" . 919187) ("CLEANUP" . 762794) ("EVENT_HANDLER" . 762797) ("GROUP_LEADER" . 762800) ("JUST_REG" . 762804) ("NO_BLOCK" . 921241)))
-    ("XMNG_TMPL" pro nil (system) "%s" ("X8.html" ("BLOCK" . 937533) ("GROUP" . 762854)))
-    ("XMTOOL" pro nil (system) "%s" ("X9.html" ("BLOCK" . 937544) ("GROUP" . 762874)))
-    ("XOBJVIEW" pro nil (system) "%s, Obj" ("X10.html" ("BACKGROUND" . 956927) ("BLOCK" . 964889) ("DOUBLE_VIEW" . 956930) ("GROUP" . 960389) ("JUST_REG" . 959168) ("MODAL" . 988927) ("REFRESH" . 959524) ("RENDERER" . 980622) ("SCALE" . 969430) ("STATIONARY" . 959520) ("TEST" . 959458) ("TITLE" . 959454) ("TLB" . 1013972) ("XOFFSET" . 959432) ("XSIZE" . 1000024) ("YOFFSET" . 973883) ("YSIZE" . 1000026)))
-    ("XOBJVIEW_ROTATE" pro nil (system) "%s, Axis, Angle" ("X11.html" ("PREMULTIPLY" . 984371)))
-    ("XOBJVIEW_WRITE_IMAGE" pro nil (system) "%s, Filename, Format" ("X12.html" ("DIMENSIONS" . 984402)))
-    ("XPALETTE" pro nil (system) "%s" ("X13.html" ("BLOCK" . 937555) ("GROUP" . 761941) ("UPDATECALLBACK" . 949914) ("UPDATECBDATA" . 949916)))
-    ("XPCOLOR" pro nil (system) "%s" ("X14.html" ("GROUP" . 976510)))
-    ("XPLOT3D" pro nil (system) "%s, X, Y, Z" ("X15.html" ("BLOCK" . 976543) ("COLOR" . 976552) ("DOUBLE_VIEW" . 976554) ("GROUP" . 976556) ("LINESTYLE" . 976558) ("MODAL" . 976571) ("NAME" . 976577) ("OVERPLOT" . 976579) ("SYMBOL" . 976581) ("TEST" . 976583) ("THICK" . 976585) ("TITLE" . 976587) ("XRANGE" . 976589) ("XTITLE" . 1014240) ("YRANGE" . 976591) ("YTITLE" . 1014248) ("ZRANGE" . 976593) ("ZTITLE" . 976599)))
-    ("XROI" pro nil (system) "%s [, ImageData] [, R] [, G] [, B]" ("X17.html" ("BLOCK" . 984509) ("FLOATING" . 984515) ("GROUP" . 984518) ("MODAL" . 984520) ("REGIONS_IN" . 984522) ("REGIONS_OUT" . 984530) ("REJECTED" . 984535) ("RENDERER" . 984540) ("ROI_COLOR" . 984544) ("ROI_GEOMETRY" . 984546) ("ROI_SELECT_COLOR" . 984572) ("STATISTICS" . 984574) ("TITLE" . 984608) ("TOOLS" . 984610) ("X_SCROLL_SIZE" . 999474) ("Y_SCROLL_SIZE" . 999479)))
-    ("XSURFACE" pro nil (system) "%s, Data" ("X19.html" ("BLOCK" . 937566) ("GROUP" . 787853)))
-    ("XVAREDIT" pro nil (system) "%s, Var" ("X20.html" ("GROUP" . 759115) ("NAME" . 917618) ("X_SCROLL_SIZE" . 917623) ("Y_SCROLL_SIZE" . 917633)))
-    ("XVOLUME" pro nil (system) "%s, Vol" ("X21.html" ("BLOCK" . 977093) ("GROUP" . 977102) ("INTERPOLATE" . 977104) ("MODAL" . 977106) ("RENDERER" . 977112) ("REPLACE" . 977116) ("SCALE" . 977121) ("TEST" . 977123) ("XSIZE" . 977128) ("YSIZE" . 977130)))
-    ("XVOLUME_ROTATE" pro nil (system) "%s, Axis, Angle" ("X22.html" ("PREMULTIPLY" . 977322)))
-    ("XVOLUME_WRITE_IMAGE" pro nil (system) "%s, Filename, Format" ("X23.html" ("DIMENSIONS" . 977402)))
-    ("XYOUTS" pro nil (system) "%s, [X, Y,] String" ("X24.html" ("ALIGNMENT" . 680731) ("CHARSIZE" . 680733) ("CHARTHICK" . 680735) ("TEXT_AXES" . 680737) ("WIDTH" . 680739)) ("graphkeyw2.html" ("CLIP" . 315949) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("FONT" . 331795) ("NOCLIP" . 323508) ("NORMAL" . 315963) ("ORIENTATION" . 315964) ("T3D" . 315956) ("Z" . 332658)))
-    ("ZOOM" pro nil (system) "%s" ("Z.html" ("CONTINUOUS" . 787879) ("FACT" . 787882) ("INTERP" . 787885) ("KEEP" . 787888) ("NEW_WINDOW" . 787891) ("XSIZE" . 787894) ("YSIZE" . 787897) ("ZOOM_WINDOW" . 787900)))
-    ("ZOOM_24" pro nil (system) "%s" ("Z2.html" ("FACT" . 787920) ("RIGHT" . 787923) ("XSIZE" . 787926) ("YSIZE" . 787929)))
-    ("A_CORRELATE" fun nil (system) "Result = %s(X, Lag)" ("A2.html" ("COVARIANCE" . 54405) ("DOUBLE" . 826748)))
-    ("ABS" fun nil (system) "Result = %s(X)" ("A3.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ACOS" fun nil (system) "Result = %s(X)" ("A4.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ADAPT_HIST_EQUAL" fun nil (system) "Result = %s (Image)" ("A5.html" ("CLIP" . 985045) ("FCN" . 987804) ("NREGIONS" . 985047) ("TOP" . 985049)))
-    ("ALOG" fun nil (system) "Result = %s(X)" ("A6.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ALOG10" fun nil (system) "Result = %s(X)" ("A7.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("AMOEBA" fun nil (system) "Result = %s( Ftol)" ("A8.html" ("FUNCTION_NAME" . 864079) ("FUNCTION_VALUE" . 864085) ("NCALLS" . 864089) ("NMAX" . 864091) ("P0" . 864094) ("SCALE" . 864103) ("SIMPLEX" . 864424)))
-    ("APP_USER_DIR" fun nil (system) "Result = %s(AuthorDirname, AuthorDesc, AppDirname, AppDesc, AppReadmeText, AppReadmeVersion)" ("A10.html" ("AUTHOR_README_TEXT" . 1011596) ("AUTHOR_README_VERSION" . 1011600) ("RESTRICT_APPVERSION" . 1011616) ("RESTRICT_ARCH" . 1011619) ("RESTRICT_FAMILY" . 1011624) ("RESTRICT_FILE_OFFSET_BITS" . 1011630) ("RESTRICT_IDL_RELEASE" . 1011635) ("RESTRICT_MEMORY_BITS" . 1011640) ("RESTRICT_OS" . 1011645)))
-    ("APP_USER_DIR_QUERY" fun nil (system) "Result = %s(AuthorDirname, AppDirname)" ("A11.html" ("COUNT" . 1011749) ("EXCLUDE_CURRENT" . 1011751) ("QUERY_APPVERSION" . 1011762) ("QUERY_ARCH" . 1011764) ("QUERY_FAMILY" . 1011766) ("QUERY_FILE_OFFSET_BITS" . 1011768) ("QUERY_IDL_RELEASE" . 1011770) ("QUERY_MEMORY_BITS" . 1011772) ("QUERY_OS" . 1011774)))
-    ("ARG_PRESENT" fun nil (system) "Result = %s(Variable)" ("A12.html"))
-    ("ARRAY_EQUAL" fun nil (system) "Result = %s( Op1 , Op2)" ("A13.html" ("NO_TYPECONV" . 987069)))
-    ("ARRAY_INDICES" fun nil (system) "Result = %s(Array, Index)" ("A14.html"))
-    ("ASCII_TEMPLATE" fun nil (system) "Result = %s( [Filename])" ("A16.html" ("BROWSE_LINES" . 871007) ("CANCEL" . 871139) ("GROUP" . 884032)))
-    ("ASIN" fun nil (system) "Result = %s(X)" ("A17.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ASSOC" fun nil (system) "Result = %s( Unit, Array_Structure [, Offset])" ("A18.html" ("PACKED" . 906241)))
-    ("ATAN" fun nil (system) "Result = %s([Y,] X)" ("A19.html" ("PHASE" . 995606)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("BESELI" fun nil (system) "Result = %s(X, N)" ("B3.html" ("DOUBLE" . 998579) ("ITER" . 998584)))
-    ("BESELJ" fun nil (system) "Result = %s(X, N)" ("B4.html" ("DOUBLE" . 998704) ("ITER" . 998706)))
-    ("BESELK" fun nil (system) "Result = %s( X, N)" ("B5.html" ("DOUBLE" . 998712) ("ITER" . 998714)))
-    ("BESELY" fun nil (system) "Result = %s(X, N)" ("B6.html" ("DOUBLE" . 998720) ("ITER" . 998722)))
-    ("BETA" fun nil (system) "Result = %s( Z, W)" ("B7.html" ("DOUBLE" . 50234)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("BILINEAR" fun nil (system) "Result = %s(P, IX, JY)" ("B8.html" ("MISSING" . 996637)))
-    ("BIN_DATE" fun nil (system) "Result = %s(Ascii_Time)" ("B9.html"))
-    ("BINARY_TEMPLATE" fun nil (system) "Result = %s ( [Filename])" ("B10.html" ("CANCEL" . 985257) ("GROUP" . 985259) ("N_ROWS" . 985261) ("TEMPLATE" . 988405)))
-    ("BINDGEN" fun nil (system) "Result = %s(D1 [, ...,D8])" ("B11.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("BINOMIAL" fun nil (system) "Result = %s(V, N, P)" ("B12.html" ("DOUBLE" . 988094) ("GAUSSIAN" . 988097)))
-    ("BLK_CON" fun nil (system) "Result = %s( Filter, Signal)" ("B14.html" ("B_LENGTH" . 749505) ("DOUBLE" . 987871)))
-    ("BROYDEN" fun nil (system) "Result = %s( X, Vecfunc)" ("B18.html" ("CHECK" . 50283) ("DOUBLE" . 50286) ("EPS" . 50289) ("ITMAX" . 989330) ("STEPMAX" . 50292) ("TOLF" . 50295) ("TOLMIN" . 50298) ("TOLX" . 50301)))
-    ("BYTARR" fun nil (system) "Result = %s( D1[, ..., D8])" ("B19.html" ("NOZERO" . 675878)))
-    ("BYTE" fun nil (system) "Result = %s( Expression[, Offset [, D1[, ..., D8]]] )" ("B20.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("BYTSCL" fun nil (system) "Result = %s( Array)" ("B22.html" ("MAX" . 675964) ("MIN" . 675966) ("NAN" . 47179) ("TOP" . 675968)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("C_CORRELATE" fun nil (system) "Result = %s( X, Y, Lag)" ("C.html" ("COVARIANCE" . 54458) ("DOUBLE" . 826756)))
-    ("CALL_EXTERNAL" fun nil (system) "Result = %s(Image, Entry [, P0, ..., PN-1])" ("C4.html" ("ALL_VALUE" . 905908) ("AUTO_GLUE" . 1025677) ("B_VALUE" . 951311) ("CC" . 1012394) ("CDECL" . 905911) ("COMPILE_DIRECTORY" . 1012398) ("D_VALUE" . 905920) ("EXTRA_CFLAGS" . 1012436) ("EXTRA_LFLAGS" . 1012440) ("F_VALUE" . 905923) ("I_VALUE" . 905926) ("IGNORE_EXISTING_GLUE" . 1012444) ("L64_VALUE" . 951332) ("LD" . 1012449) ("NOCLEANUP" . 1012453) ("RETURN_TYPE" . 1029187) ("S_VALUE" . 951354) ("SHOW_ALL_OUTPUT" . 1012458) ("UI_VALUE" . 951320) ("UL64_VALUE" . 965882) ("UL_VALUE" . 965879) ("UNLOAD" . 993357) ("VALUE" . 905936) ("VERBOSE" . 1012497) ("WRITE_WRAPPER" . 1029198)))
-    ("CALL_FUNCTION" fun nil (system) "Result = %s(Name [, P1, ..., Pn])" ("C5.html"))
-    ("CALL_METHOD" fun nil (system) "Result = %s, Name, ObjRef, [, P1, ..., Pn]" ("C6.html"))
-    ("CDF_ATTCREATE" fun nil (system) "Result = %s( Id, Attribute_Name)" ("CDF-routines8.html" ("GLOBAL_SCOPE" . 996934) ("VARIABLE_SCOPE" . 996937)))
-    ("CDF_ATTEXISTS" fun nil (system) "Result = %s( Id, Attribute [, EntryNum])" ("CDF-routines10.html" ("ZVARIABLE" . 1002462)))
-    ("CDF_ATTNUM" fun nil (system) "Result = %s(Id, Attribute_Name)" ("CDF-routines13.html"))
-    ("CDF_CREATE" fun nil (system) "Result = %s( Filename, [Dimensions])" ("CDF-routines19.html" ("ALPHAOSF1_DECODING" . 1017799) ("ALPHAOSF1_ENCODING" . 997337) ("ALPHAVMSD_DECODING" . 1017802) ("ALPHAVMSD_ENCODING" . 997340) ("ALPHAVMSG_DECODING" . 1017805) ("ALPHAVMSG_ENCODING" . 997343) ("CLOBBER" . 1017643) ("COL_MAJOR" . 1017646) ("DECSTATION_DECODING" . 1017808) ("DECSTATION_ENCODING" . 1017778) ("HOST_DECODING" . 1017811) ("HOST_ENCODING" . 997349) ("HP_DECODING" . 1017814) ("HP_ENCODING" . 997352) ("IBMPC_DECODING" . 1017817) ("IBMPC_ENCODING" . 1017767) ("IBMRS_DECODING" . 1017820) ("IBMRS_ENCODING" . 997355) ("MAC_DECODING" . 1017823) ("MAC_ENCODING" . 997367) ("MULTI_FILE" . 1017715) ("NETWORK_DECODING" . 1017826) ("NETWORK_ENCODING" . 997378) ("NEXT_DECODING" . 1017829) ("NEXT_ENCODING" . 997381) ("ROW_MAJOR" . 1017746) ("SGI_DECODING" . 1017832) ("SGI_ENCODING" . 1017789) ("SINGLE_FILE" . 1017749) ("SUN_DECODING" . 1017835) ("SUN_ENCODING" . 997390)))
-    ("CDF_ENCODE_EPOCH" fun nil (system) "Result = %s(Epoch)" ("CDF-routines22.html" ("EPOCH" . 997448)))
-    ("CDF_ERROR" fun nil (system) "Result = %s(Status)" ("CDF-routines24.html"))
-    ("CDF_EXISTS" fun nil (system) "Result = %s( )" ("CDF-routines25.html"))
-    ("CDF_INQUIRE" fun nil (system) "Result = %s(Id)" ("CDF-routines26.html"))
-    ("CDF_OPEN" fun nil (system) "Result = %s(Filename)" ("CDF-routines28.html"))
-    ("CDF_PARSE_EPOCH" fun nil (system) "Result = %s(Epoch_string)" ("CDF-routines29.html"))
-    ("CDF_VARCREATE" fun nil (system) "Result = %s( Id, Name [, DimVary])" ("CDF-routines30.html" ("ALLOCATERECS" . 997736) ("DIMENSIONS" . 997739) ("NUMELEM" . 997744) ("REC_NOVARY" . 997747) ("REC_VARY" . 997750) ("VARIABLETYPE" . 1027601) ("ZVARIABLE" . 997753)))
-    ("CDF_VARINQ" fun nil (system) "Result = %s( Id, Variable)" ("CDF-routines34.html" ("ZVARIABLE" . 997944)))
-    ("CDF_VARNUM" fun nil (system) "Result = %s( Id, VarName [, IsZVar] )" ("CDF-routines35.html"))
-    ("CEIL" fun nil (system) "Result = %s(X)" ("C12.html" ("L64" . 1015251)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("CHEBYSHEV" fun nil (system) "Result = %s(D, N)" ("C13.html"))
-    ("CHECK_MATH" fun nil (system) "Result = %s()" ("C14.html" ("MASK" . 993110) ("NOCLEAR" . 993190) ("PRINT" . 993188)))
-    ("CHISQR_CVF" fun nil (system) "Result = %s(P, Df)" ("C15.html"))
-    ("CHISQR_PDF" fun nil (system) "Result = %s(V, Df)" ("C16.html"))
-    ("CHOLSOL" fun nil (system) "Result = %s( A, P, B)" ("C18.html" ("DOUBLE" . 50387)))
-    ("CINDGEN" fun nil (system) "Result = %s(D1[, ..., D8])" ("C19.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("CLUST_WTS" fun nil (system) "Result = %s( Array)" ("C22.html" ("DOUBLE" . 862498) ("N_CLUSTERS" . 862487) ("N_ITERATIONS" . 862488) ("VARIABLE_WTS" . 862545)))
-    ("CLUSTER" fun nil (system) "Result = %s( Array, Weights)" ("C23.html" ("DOUBLE" . 862580) ("N_CLUSTERS" . 862583)))
-    ("CLUSTER_TREE" fun nil (system) "Result = %s( Pairdistance, Linkdistance)" ("C24.html" ("DATA" . 1196682) ("LINKAGE" . 1196686) ("MEASURE" . 1196715) ("POWER_MEASURE" . 1196749)))
-    ("COLOR_QUAN" fun nil (system) "Result = %s( Image_R, Image_G, Image_B, R, G, B) or Result = %s( Image, Dim, R, G, B )" ("C26.html" ("COLORS" . 676177) ("CUBE" . 676179) ("DITHER" . 676181) ("ERROR" . 676183) ("GET_TRANSLATION" . 676185) ("MAP_ALL" . 676187) ("TRANSLATION" . 676189)))
-    ("COLORMAP_APPLICABLE" fun nil (system) "Result = %s( redrawRequired )" ("C27.html"))
-    ("COMFIT" fun nil (system) "Result = %s( X, Y, A)" ("C28.html" ("EXPONENTIAL" . 53208) ("GEOMETRIC" . 838932) ("GOMPERTZ" . 838937) ("HYPERBOLIC" . 838944) ("LOGISTIC" . 838961) ("LOGSQUARE" . 838970) ("SIGMA" . 838980) ("WEIGHTS" . 53265) ("YFIT" . 53268)))
-    ("COMPLEX" fun nil (system) "Result = %s( Real [, Imaginary])" ("C31.html" ("DOUBLE" . 1041956)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("COMPLEXARR" fun nil (system) "Result = %s( D1[, ..., D8])" ("C32.html" ("NOZERO" . 676236)))
-    ("COMPLEXROUND" fun nil (system) "Result = %s(Input)" ("C33.html"))
-    ("COMPUTE_MESH_NORMALS" fun nil (system) "Result = %s( fVerts[, iConn] )" ("C34.html"))
-    ("COND" fun nil (system) "Result = %s( A)" ("C35.html" ("DOUBLE" . 749542) ("LNORM" . 1042001)))
-    ("CONGRID" fun nil (system) "Result = %s( Array, X, Y, Z)" ("C36.html" ("CENTER" . 757848) ("CUBIC" . 1042041) ("INTERP" . 757851) ("MINUS_ONE" . 757854)))
-    ("CONJ" fun nil (system) "Result = %s(X)" ("C37.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("CONVERT_COORD" fun nil (system) "Result = %s( X [, Y [, Z]])" ("C41.html" ("DATA" . 676377) ("DEVICE" . 676379) ("DOUBLE" . 1015017) ("NORMAL" . 676381) ("T3D" . 676383) ("TO_DATA" . 676385) ("TO_DEVICE" . 676387) ("TO_NORMAL" . 676389)))
-    ("CONVOL" fun nil (system) "Result = %s( Array, Kernel [, Scale_Factor])" ("C42.html" ("CENTER" . 676409) ("EDGE_TRUNCATE" . 746326) ("EDGE_WRAP" . 228821) ("MISSING" . 1028668) ("NAN" . 1028683)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("COORD2TO3" fun nil (system) "Result = %s( Mx, My, Dim, D0 [, PTI] )" ("C43.html"))
-    ("CORRELATE" fun nil (system) "Result = %s( X [, Y])" ("C45.html" ("COVARIANCE" . 53307) ("DOUBLE" . 868819)))
-    ("COS" fun nil (system) "Result = %s(X)" ("C46.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("COSH" fun nil (system) "Result = %s(X)" ("C47.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("CRAMER" fun nil (system) "Result = %s( A, B)" ("C49.html" ("DOUBLE" . 749607) ("ZERO" . 749609)))
-    ("CREATE_CURSOR" fun nil (system) "Result = %s( StringArray)" ("C50.html" ("HOTSPOT" . 1192516) ("MASK" . 1222423)))
-    ("CREATE_STRUCT" fun nil (system) "Result = %s( [Tag1, Values1, ..., Tagn, Valuesn] [, Structuresn])" ("C51.html" ("NAME" . 279439)))
-    ("CROSSP" fun nil (system) "Result = %s(V1, V2)" ("C53.html"))
-    ("CRVLENGTH" fun nil (system) "Result = %s( X, Y)" ("C54.html" ("DOUBLE" . 862840)))
-    ("CT_LUMINANCE" fun nil (system) "Result = %s( [R, G, B])" ("C55.html" ("BRIGHT" . 759145) ("DARK" . 759148) ("READ_TABLES" . 759151)))
-    ("CTI_TEST" fun nil (system) "Result = %s( Obfreq)" ("C56.html" ("COEFF" . 53357) ("CORRECTED" . 53360) ("CRAMV" . 53363) ("DF" . 53366) ("EXFREQ" . 53369) ("RESIDUAL" . 53372)))
-    ("CURVEFIT" fun nil (system) "Result = %s( X, Y, Weights, A [, Sigma])" ("C58.html" ("CHISQ" . 1024958) ("DOUBLE" . 1024093) ("FITA" . 148399) ("FUNCTION_NAME" . 1118305) ("ITER" . 150209) ("ITMAX" . 150211) ("NODERIVATIVE" . 150222) ("STATUS" . 1107869) ("TOL" . 1108021) ("YERROR" . 1053331)))
-    ("CV_COORD" fun nil (system) "Result = %s()" ("C59.html" ("DEGREES" . 756965) ("DOUBLE" . 1025482) ("FROM_CYLIN" . 756968) ("FROM_POLAR" . 756971) ("FROM_RECT" . 756974) ("FROM_SPHERE" . 756977) ("TO_CYLIN" . 1109055) ("TO_POLAR" . 756983) ("TO_RECT" . 756986) ("TO_SPHERE" . 756989)))
-    ("CVTTOBM" fun nil (system) "Result = %s( Array)" ("C60.html" ("THRESHOLD" . 871509)))
-    ("CW_ANIMATE" fun nil (system) "Result = %s( Parent, Sizex, Sizey, Nframes)" ("C61.html" ("NO_KILL" . 853861) ("OPEN_FUNC" . 853864) ("PIXMAPS" . 853868) ("TAB_MODE" . 1189372) ("TRACK" . 853871) ("UNAME" . 996617) ("UVALUE" . 853874)))
-    ("CW_ARCBALL" fun nil (system) "Result = %s( Parent)" ("C65.html" ("COLORS" . 755064) ("FRAME" . 755074) ("LABEL" . 755077) ("RETAIN" . 755080) ("SIZE" . 755108) ("TAB_MODE" . 1189488) ("UNAME" . 996624) ("UPDATE" . 1189483) ("UVALUE" . 755114) ("VALUE" . 755117)))
-    ("CW_BGROUP" fun nil (system) "Result = %s( Parent, Names)" ("C66.html" ("BUTTON_UVALUE" . 755175) ("COLUMN" . 755178) ("EVENT_FUNC" . 755181) ("EXCLUSIVE" . 755184) ("FONT" . 755187) ("FRAME" . 755190) ("IDS" . 755193) ("LABEL_LEFT" . 755196) ("LABEL_TOP" . 755199) ("MAP" . 755202) ("NO_RELEASE" . 755208) ("NONEXCLUSIVE" . 755205) ("RETURN_ID" . 755211) ("RETURN_INDEX" . 755214) ("RETURN_NAME" . 755217) ("ROW" . 755220) ("SCROLL" . 755223) ("SET_VALUE" . 755226) ("SPACE" . 755230) ("TAB_MODE" . 1189560) ("UNAME" . 996707) ("UVALUE" . 755233) ("X_SCROLL_SIZE" . 755245) ("XOFFSET" . 755236) ("XPAD" . 755239) ("XSIZE" . 755242) ("Y_SCROLL_SIZE" . 755257) ("YOFFSET" . 755248) ("YPAD" . 755251) ("YSIZE" . 755254)))
-    ("CW_CLR_INDEX" fun nil (system) "Result = %s( Parent)" ("C67.html" ("COLOR_VALUES" . 854099) ("EVENT_FUNC" . 854102) ("FRAME" . 854105) ("LABEL" . 854108) ("NCOLORS" . 854111) ("START_COLOR" . 854114) ("TAB_MODE" . 1189650) ("UNAME" . 996631) ("UVALUE" . 854117) ("VALUE" . 854120) ("XSIZE" . 1025090) ("YSIZE" . 854123)))
-    ("CW_COLORSEL" fun nil (system) "Result = %s( Parent)" ("C68.html" ("FRAME" . 854194) ("TAB_MODE" . 1189739) ("UNAME" . 996638) ("UVALUE" . 1233223) ("XOFFSET" . 854200) ("YOFFSET" . 854203)))
-    ("CW_DEFROI" fun nil (system) "Result = %s( Draw)" ("C69.html" ("IMAGE_SIZE" . 755439) ("OFFSET" . 755442) ("ORDER" . 755445) ("RESTORE" . 755448) ("TAB_MODE" . 1189809) ("ZOOM" . 755451)))
-    ("CW_FIELD" fun nil (system) "Result = %s( Parent)" ("C70.html" ("ALL_EVENTS" . 755508) ("COLUMN" . 755511) ("FIELDFONT" . 755514) ("FLOATING" . 755517) ("FONT" . 755520) ("FRAME" . 755523) ("INTEGER" . 755526) ("LONG" . 755529) ("NOEDIT" . 755532) ("RETURN_EVENTS" . 755535) ("ROW" . 755540) ("STRING" . 755543) ("TAB_MODE" . 1189883) ("TEXT_FRAME" . 755546) ("TITLE" . 1029040) ("UNAME" . 996600) ("UVALUE" . 755549) ("VALUE" . 755552) ("XSIZE" . 755555) ("YSIZE" . 755558)))
-    ("CW_FILESEL" fun nil (system) "Result = %s ( Parent)" ("C71.html" ("FILENAME" . 1001063) ("FILTER" . 1001065) ("FIX_FILTER" . 1001072) ("FRAME" . 1001074) ("IMAGE_FILTER" . 1001076) ("MULTIPLE" . 1001078) ("PATH" . 1001080) ("SAVE" . 1024908) ("TAB_MODE" . 1189963) ("UNAME" . 1001082) ("UVALUE" . 1001085) ("WARN_EXIST" . 1024611)))
-    ("CW_FORM" fun nil (system) "Result = %s( [Parent,] Desc)" ("C72.html" ("COLUMN" . 141396) ("IDS" . 141399) ("TAB_MODE" . 1190037) ("TITLE" . 141402) ("UNAME" . 996652) ("UVALUE" . 141405)))
-    ("CW_FSLIDER" fun nil (system) "Result = %s( Parent)" ("C73.html" ("DOUBLE" . 755581) ("DRAG" . 1028998) ("EDIT" . 755584) ("FORMAT" . 755587) ("FRAME" . 755590) ("MAXIMUM" . 755593) ("MINIMUM" . 755596) ("SCROLL" . 218849) ("SUPPRESS_VALUE" . 755599) ("TAB_MODE" . 1190109) ("TITLE" . 755602) ("UNAME" . 996664) ("UVALUE" . 755605) ("VALUE" . 755608) ("VERTICAL" . 755611) ("XSIZE" . 755614) ("YSIZE" . 755617)))
-    ("CW_ITMENU" fun nil (system) "Result = %s(Parent, UI, Target)" ("fw_cw_ref4.html" ("CONTEXT_MENU" . 999147) ("UNAME" . 999150) ("UVALUE" . 999153)))
-    ("CW_ITPANEL" fun nil (system) "Result = %s(Parent, UI)" ("fw_cw_ref5.html" ("ORIENTATION" . 999520) ("UNAME" . 999524) ("UVALUE" . 999527)))
-    ("CW_ITSTATUSBAR" fun nil (system) "Result = %s(Parent, UI)" ("fw_cw_ref6.html" ("UNAME" . 999554) ("UVALUE" . 999557) ("XSIZE" . 999560)))
-    ("CW_ITTOOLBAR" fun nil (system) "Result = %s(Parent, UI, Target)" ("fw_cw_ref7.html" ("EXCLUSIVE" . 999187) ("ROW" . 999190) ("UNAME" . 1001835) ("UVALUE" . 999196)))
-    ("CW_ITWINDOW" fun nil (system) "Result = %s(Parent, UI)" ("fw_cw_ref8.html" ("DIMENSIONS" . 999225) ("UNAME" . 999229) ("UVALUE" . 999232) ("VIRTUAL_DIMENSIONS" . 1002122)))
-    ("CW_LIGHT_EDITOR" fun nil (system) "Result = %s (Parent)" ("C74.html" ("DIRECTION_DISABLED" . 1001420) ("DRAG_EVENTS" . 1001422) ("FRAME" . 1001426) ("HIDE_DISABLED" . 1001428) ("LIGHT" . 1001430) ("LOCATION_DISABLED" . 1001432) ("TAB_MODE" . 1239092) ("TYPE_DISABLED" . 1001434) ("UNAME" . 1001436) ("UVALUE" . 1001439) ("XRANGE" . 1001441) ("XSIZE" . 1001443) ("YRANGE" . 1001445) ("YSIZE" . 1001447) ("ZRANGE" . 1001449)))
-    ("CW_ORIENT" fun nil (system) "Result = %s( Parent)" ("C77.html" ("AX" . 755637) ("AZ" . 755640) ("FRAME" . 755643) ("TAB_MODE" . 1190182) ("TITLE" . 755646) ("UNAME" . 996671) ("UVALUE" . 755649) ("XSIZE" . 755652) ("YSIZE" . 755655)))
-    ("CW_PALETTE_EDITOR" fun nil (system) "Result = %s (Parent)" ("C78.html" ("DATA" . 1001627) ("FRAME" . 1001629) ("HISTOGRAM" . 1001631) ("HORIZONTAL" . 1001633) ("SELECTION" . 1001635) ("TAB_MODE" . 1190256) ("UNAME" . 1001637) ("UVALUE" . 1001640) ("XSIZE" . 1001642) ("YSIZE" . 1001644)))
-    ("CW_PDMENU" fun nil (system) "Result = %s( Parent, Desc)" ("C81.html" ("COLUMN" . 755708) ("CONTEXT_MENU" . 1025506) ("DELIMITER" . 1042113) ("FONT" . 67046) ("HELP" . 855550) ("IDS" . 860166) ("MBAR" . 1188103) ("RETURN_FULL_NAME" . 755726) ("RETURN_ID" . 1188112) ("RETURN_INDEX" . 755720) ("RETURN_NAME" . 755723) ("TAB_MODE" . 1190329) ("UNAME" . 996678) ("UVALUE" . 755731) ("XOFFSET" . 755734) ("YOFFSET" . 755737)))
-    ("CW_RGBSLIDER" fun nil (system) "Result = %s( Parent)" ("C82.html" ("CMY" . 755795) ("COLOR_INDEX" . 755798) ("DRAG" . 755801) ("FRAME" . 755804) ("GRAPHICS_LEVEL" . 755807) ("HLS" . 755810) ("HSV" . 1025517) ("LENGTH" . 755813) ("RGB" . 755816) ("TAB_MODE" . 1190402) ("UNAME" . 996685) ("UVALUE" . 755819) ("VALUE" . 755822) ("VERTICAL" . 1025592)))
-    ("CW_TMPL" fun nil (system) "Result = %s( Parent)" ("C83.html" ("TAB_MODE" . 1239165) ("UNAME" . 996692) ("UVALUE" . 137507)))
-    ("CW_ZOOM" fun nil (system) "Result = %s( Parent)" ("C84.html" ("FRAME" . 755848) ("MAX" . 755851) ("MIN" . 755854) ("RETAIN" . 755857) ("SAMPLE" . 755885) ("SCALE" . 755888) ("TAB_MODE" . 1190480) ("TRACK" . 755891) ("UNAME" . 996700) ("UVALUE" . 755894) ("X_SCROLL_SIZE" . 755900) ("X_ZSIZE" . 755903) ("XSIZE" . 755897) ("Y_SCROLL_SIZE" . 755909) ("Y_ZSIZE" . 755912) ("YSIZE" . 755906)))
-    ("DB_EXISTS" fun nil (system) "status = %s()" ("api5.html"))
-    ("DBLARR" fun nil (system) "Result = %s( D1[, ..., D8])" ("D.html" ("NOZERO" . 676487)))
-    ("DCINDGEN" fun nil (system) "Result = %s( D1 [, ..., D8 ])" ("D2.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("DCOMPLEX" fun nil (system) "Result = %s( Real [, Imaginary] ) or Result = %s( Expression, Offset [, D1 [, ..., D8]] )" ("D3.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("DCOMPLEXARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("D4.html" ("NOZERO" . 37699)))
-    ("DEFROI" fun nil (system) "Result = %s( Sx, Sy [, Xverts, Yverts])" ("D8.html" ("NOFILL" . 757032) ("NOREGION" . 757029) ("RESTORE" . 757035) ("X0" . 757039) ("Y0" . 757039) ("ZOOM" . 757042)))
-    ("DERIV" fun nil (system) "Result = %s([X,] Y)" ("D13.html"))
-    ("DERIVSIG" fun nil (system) "Result = %s( [X, Y, Sigx,] Sigy )" ("D14.html"))
-    ("DETERM" fun nil (system) "Result = %s( A)" ("D15.html" ("CHECK" . 749767) ("DOUBLE" . 37196) ("ZERO" . 749769)))
-    ("DIAG_MATRIX" fun nil (system) "Result = %s(A [, Diag] )" ("D18.html"))
-    ("DIALOG_DBCONNECT" fun nil (system) "status = %s(DBobj)" ("api4.html" ("DATASOURCE" . 1007548) ("DIALOG_PARENT" . 1007555) ("PASSWORD" . 1007553) ("USER_ID" . 1007551)))
-    ("DIALOG_MESSAGE" fun nil (system) "Result = %s( Message_Text)" ("D19.html" ("CANCEL" . 863012) ("DEFAULT_CANCEL" . 863015) ("DEFAULT_NO" . 863018) ("DIALOG_PARENT" . 863021) ("DISPLAY_NAME" . 871724) ("ERROR" . 863025) ("INFORMATION" . 863028) ("QUESTION" . 863031) ("RESOURCE_NAME" . 863035) ("TITLE" . 863041)))
-    ("DIALOG_PICKFILE" fun nil (system) "Result = %s()" ("D20.html" ("DEFAULT_EXTENSION" . 1010269) ("DIALOG_PARENT" . 907482) ("DIRECTORY" . 951270) ("DISPLAY_NAME" . 907484) ("FILE" . 862313) ("FILTER" . 907329) ("FIX_FILTER" . 907334) ("GET_PATH" . 862316) ("GROUP" . 862319) ("MULTIPLE_FILES" . 907351) ("MUST_EXIST" . 1009929) ("OVERWRITE_PROMPT" . 1009949) ("PATH" . 1009942) ("READ" . 862322) ("RESOURCE_NAME" . 1006308) ("TITLE" . 907359) ("WRITE" . 862325)))
-    ("DIALOG_PRINTERSETUP" fun nil (system) "Result = %s( [PrintDestination])" ("D21.html" ("DIALOG_PARENT" . 984460) ("DISPLAY_NAME" . 984463) ("RESOURCE_NAME" . 984466) ("TITLE" . 984469)))
-    ("DIALOG_PRINTJOB" fun nil (system) "Result = %s( [PrintDestination])" ("D22.html" ("DIALOG_PARENT" . 863760) ("DISPLAY_NAME" . 870902) ("RESOURCE_NAME" . 870904) ("TITLE" . 870915)))
-    ("DIALOG_READ_IMAGE" fun nil (system) "Result = %s ( [Filename])" ("D23.html" ("BLUE" . 986778) ("DIALOG_PARENT" . 986218) ("FILE" . 986220) ("FILTER_TYPE" . 986222) ("FIX_FILTER" . 986226) ("GET_PATH" . 986785) ("GREEN" . 990353) ("IMAGE" . 986228) ("PATH" . 986230) ("QUERY" . 986232) ("RED" . 986234) ("TITLE" . 986240)))
-    ("DIALOG_WRITE_IMAGE" fun nil (system) "Result = %s ( Image [, R, G, B])" ("D24.html" ("DIALOG_PARENT" . 986258) ("FILE" . 986260) ("FIX_TYPE" . 986262) ("NOWRITE" . 986264) ("OPTIONS" . 986266) ("PATH" . 986268) ("TITLE" . 986270) ("TYPE" . 986272) ("WARN_EXIST" . 990326)))
-    ("DIGITAL_FILTER" fun nil (system) "Result = %s( Flow, Fhigh, A, Nterms)" ("D25.html" ("DOUBLE" . 1002899)))
-    ("DILATE" fun nil (system) "Result = %s( Image, Structure [, X0 [, Y0 [, Z0]]])" ("D26.html" ("BACKGROUND" . 984751) ("CONSTRAINED" . 984770) ("GRAY" . 984614) ("PRESERVE_TYPE" . 984778) ("UINT" . 984780) ("ULONG" . 984782) ("VALUES" . 984617)))
-    ("DINDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("D27.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("DIST" fun nil (system) "Result = %s(N [, M])" ("D29.html"))
-    ("DISTANCE_MEASURE" fun nil (system) "Result = %s( Array)" ("D30.html" ("DOUBLE" . 1033017) ("MATRIX" . 1033020) ("MEASURE" . 1033023) ("POWER_MEASURE" . 1033069)))
-    ("DOUBLE" fun nil (system) "Result = %s(Expression[, Offset [, D1 [, ..., D8]]])" ("D34.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("EIGENQL" fun nil (system) "Result = %s( A)" ("E2.html" ("ABSOLUTE" . 870576) ("ASCENDING" . 862897) ("DOUBLE" . 862899) ("EIGENVECTORS" . 870583) ("OVERWRITE" . 862901) ("RESIDUAL" . 862903)))
-    ("EIGENVEC" fun nil (system) "Result = %s( A, Eval)" ("E3.html" ("DOUBLE" . 47356) ("ITMAX" . 47358) ("RESIDUAL" . 47286)))
-    ("ELMHES" fun nil (system) "Result = %s( A)" ("E4.html" ("COLUMN" . 983389) ("DOUBLE" . 50601) ("NO_BALANCE" . 50604)))
-    ("EOF" fun nil (system) "Result = %s(Unit)" ("E7.html"))
-    ("EOS_EH_CONVANG" fun nil (system) "Result = %s(inAngle, code)" ("EOS-routines8.html"))
-    ("EOS_EH_GETVERSION" fun nil (system) "Result = %s(fid, version)" ("EOS-routines9.html"))
-    ("EOS_EH_IDINFO" fun nil (system) "Result = %s(fid, HDFfid, sdInterfaceID)" ("EOS-routines10.html"))
-    ("EOS_EXISTS" fun nil (system) "Result = %s( )" ("EOS-routines11.html"))
-    ("EOS_GD_ATTACH" fun nil (system) "Result = %s(fid, gridname)" ("EOS-routines12.html"))
-    ("EOS_GD_ATTRINFO" fun nil (system) "Result = %s(gridID, attrname, numbertype, count)" ("EOS-routines13.html"))
-    ("EOS_GD_BLKSOMOFFSET" fun nil (system) "Result = %s(gridID, offset, code)" ("EOS-routines14.html"))
-    ("EOS_GD_CLOSE" fun nil (system) "Result = %s(fid)" ("EOS-routines15.html"))
-    ("EOS_GD_COMPINFO" fun nil (system) "Result = %s(gridID, fieldname, compcode, compparm)" ("EOS-routines16.html"))
-    ("EOS_GD_CREATE" fun nil (system) "Result = %s(fid, gridname, xdimsize, ydimsize, upleftpt, lowrightpt)" ("EOS-routines17.html"))
-    ("EOS_GD_DEFBOXREGION" fun nil (system) "Result = %s(gridID, cornerlon, cornerlat)" ("EOS-routines18.html"))
-    ("EOS_GD_DEFCOMP" fun nil (system) "Result = %s(gridID, compcode [, compparm] )" ("EOS-routines19.html"))
-    ("EOS_GD_DEFDIM" fun nil (system) "Result = %s(gridID, dimname, dim)" ("EOS-routines20.html"))
-    ("EOS_GD_DEFFIELD" fun nil (system) "Result = %s(gridID, fieldname, dimlist, numbertype)" ("EOS-routines21.html" ("MERGE" . 1030256)))
-    ("EOS_GD_DEFORIGIN" fun nil (system) "Result = %s(gridID, origincode)" ("EOS-routines22.html"))
-    ("EOS_GD_DEFPIXREG" fun nil (system) "Result = %s(gridID, pixreg)" ("EOS-routines23.html"))
-    ("EOS_GD_DEFPROJ" fun nil (system) "Result = %s(gridID, projcode, zonecode, spherecode, projparm)" ("EOS-routines24.html"))
-    ("EOS_GD_DEFTILE" fun nil (system) "Result = %s( gridID, tilecode [, tilerank, tiledims] )" ("EOS-routines25.html"))
-    ("EOS_GD_DEFVRTREGION" fun nil (system) "Result = %s(gridID, regionID, vertObj, range)" ("EOS-routines26.html"))
-    ("EOS_GD_DETACH" fun nil (system) "Result = %s(gridID)" ("EOS-routines27.html"))
-    ("EOS_GD_DIMINFO" fun nil (system) "Result = %s(gridID, dimname)" ("EOS-routines28.html"))
-    ("EOS_GD_DUPREGION" fun nil (system) "Result = %s(regionID)" ("EOS-routines29.html"))
-    ("EOS_GD_EXTRACTREGION" fun nil (system) "Result = %s(gridID, regionID, fieldname, buffer)" ("EOS-routines30.html"))
-    ("EOS_GD_FIELDINFO" fun nil (system) "Result = %s(gridID, fieldname, rank, dims, numbertype, dimlist)" ("EOS-routines31.html"))
-    ("EOS_GD_GETFILLVALUE" fun nil (system) "Result = %s(gridID, fieldname, fillvalue)" ("EOS-routines32.html"))
-    ("EOS_GD_GETPIXELS" fun nil (system) "Result = %s(gridID, nLonLat, lonVal, latVal, pixRow, pixCol)" ("EOS-routines33.html"))
-    ("EOS_GD_GETPIXVALUES" fun nil (system) "Result = %s(gridID, nPixels, pixCol, pixRow, fieldname, buffer)" ("EOS-routines34.html"))
-    ("EOS_GD_GRIDINFO" fun nil (system) "Result = %s(gridID, xdimsize, ydimsize, upleft, lowright)" ("EOS-routines35.html"))
-    ("EOS_GD_INQATTRS" fun nil (system) "Result = %s( gridID, attrlist)" ("EOS-routines36.html" ("LENGTH" . 1030732)))
-    ("EOS_GD_INQDIMS" fun nil (system) "Result = %s(gridID, dimname, dims)" ("EOS-routines37.html"))
-    ("EOS_GD_INQFIELDS" fun nil (system) "Result = %s(gridID, fieldlist, rank, numbertype)" ("EOS-routines38.html"))
-    ("EOS_GD_INQGRID" fun nil (system) "Result = %s( filename, gridlist)" ("EOS-routines39.html" ("LENGTH" . 1030811)))
-    ("EOS_GD_INTERPOLATE" fun nil (system) "Result = %s(gridID, Interp, lonVal, latVal, fieldname, interpVal)" ("EOS-routines40.html"))
-    ("EOS_GD_NENTRIES" fun nil (system) "Result = %s( gridID, entrycode)" ("EOS-routines41.html" ("LENGTH" . 1030866)))
-    ("EOS_GD_OPEN" fun nil (system) "Result = %s( filename, access)" ("EOS-routines42.html" ("CREATE" . 1030919) ("RDWR" . 1030921) ("READ" . 1030923)))
-    ("EOS_GD_ORIGININFO" fun nil (system) "Result = %s(gridID, origincode)" ("EOS-routines43.html"))
-    ("EOS_GD_PIXREGINFO" fun nil (system) "Result = %s(gridID, pixregcode)" ("EOS-routines44.html"))
-    ("EOS_GD_PROJINFO" fun nil (system) "Result = %s(gridID, projcode, zonecode, spherecode, projparm)" ("EOS-routines45.html"))
-    ("EOS_GD_QUERY" fun nil (system) "Result = %s( Filename, GridName, [Info])" ("EOS-routines46.html"))
-    ("EOS_GD_READATTR" fun nil (system) "Result = %s(gridID, attrname, datbuf)" ("EOS-routines47.html"))
-    ("EOS_GD_READFIELD" fun nil (system) "Result = %s( gridID, fieldname, buffer)" ("EOS-routines48.html" ("EDGE" . 1031035) ("START" . 1031037) ("STRIDE" . 1031039)))
-    ("EOS_GD_READTILE" fun nil (system) "Result = %s(gridID, fieldname, tilecoords, buffer)" ("EOS-routines49.html"))
-    ("EOS_GD_REGIONINFO" fun nil (system) "Result = %s(gridID, regionID, fieldname, ntype, rank, dims, size, upleftpt, lowrightpt)" ("EOS-routines50.html"))
-    ("EOS_GD_SETFILLVALUE" fun nil (system) "Result = %s(gridID, fieldname, fillvalue)" ("EOS-routines51.html"))
-    ("EOS_GD_SETTILECACHE" fun nil (system) "Result = %s(gridID, fieldname, maxcache, cachecode)" ("EOS-routines52.html"))
-    ("EOS_GD_TILEINFO" fun nil (system) "Result = %s(gridID, fieldname, tilecode, tilerank, tiledims)" ("EOS-routines53.html"))
-    ("EOS_GD_WRITEATTR" fun nil (system) "Result = %s( gridID, attrname, datbuf)" ("EOS-routines54.html" ("COUNT" . 1031201) ("HDF_TYPE" . 1031203)))
-    ("EOS_GD_WRITEFIELD" fun nil (system) "Result = %s( gridID, fieldname, data)" ("EOS-routines55.html" ("EDGE" . 1031230) ("START" . 1031232) ("STRIDE" . 1031234)))
-    ("EOS_GD_WRITEFIELDMETA" fun nil (system) "Result = %s(gridID, fieldname, dimlist, numbertype)" ("EOS-routines56.html"))
-    ("EOS_GD_WRITETILE" fun nil (system) "Result = %s(gridID, fieldname, tilecoords, data)" ("EOS-routines57.html"))
-    ("EOS_PT_ATTACH" fun nil (system) "Result = %s(fid, pointname)" ("EOS-routines58.html"))
-    ("EOS_PT_ATTRINFO" fun nil (system) "Result = %s( pointID, attrname, numbertype, count)" ("EOS-routines59.html"))
-    ("EOS_PT_BCKLINKINFO" fun nil (system) "Result = %s(pointID, level, linkfield)" ("EOS-routines60.html"))
-    ("EOS_PT_CLOSE" fun nil (system) "Result = %s(fid)" ("EOS-routines61.html"))
-    ("EOS_PT_CREATE" fun nil (system) "Result = %s(fid, pointname)" ("EOS-routines62.html"))
-    ("EOS_PT_DEFBOXREGION" fun nil (system) "Result = %s(pointID, cornerlon, cornerlat)" ("EOS-routines63.html"))
-    ("EOS_PT_DEFLEVEL" fun nil (system) "Result = %s(pointID, levelname, fieldlist, fieldtype, fieldorder)" ("EOS-routines64.html"))
-    ("EOS_PT_DEFLINKAGE" fun nil (system) "Result = %s(pointID, parent, child, linkfield)" ("EOS-routines65.html"))
-    ("EOS_PT_DEFTIMEPERIOD" fun nil (system) "Result = %s(pointID, starttime, stoptime)" ("EOS-routines66.html"))
-    ("EOS_PT_DEFVRTREGION" fun nil (system) "Result = %s( pointID, regionID, vertObj, range)" ("EOS-routines67.html"))
-    ("EOS_PT_DETACH" fun nil (system) "Result = %s(pointID)" ("EOS-routines68.html"))
-    ("EOS_PT_EXTRACTPERIOD" fun nil (system) "Result = %s(pointID, periodID, level, fieldlist, buffer)" ("EOS-routines69.html"))
-    ("EOS_PT_EXTRACTREGION" fun nil (system) "Result = %s( pointID, regionID, level, fieldlist, buffer)" ("EOS-routines70.html"))
-    ("EOS_PT_FWDLINKINFO" fun nil (system) "Result = %s(pointID, level, linkfield)" ("EOS-routines71.html"))
-    ("EOS_PT_GETLEVELNAME" fun nil (system) "Result = %s( pointID, level, levelname)" ("EOS-routines72.html" ("LENGTH" . 1017099)))
-    ("EOS_PT_GETRECNUMS" fun nil (system) "Result = %s( pointID, inlevel, outlevel, inNrec, inRecs, outNrec, outRecs)" ("EOS-routines73.html"))
-    ("EOS_PT_INQATTRS" fun nil (system) "Result = %s( pointID, attrlist)" ("EOS-routines74.html" ("LENGTH" . 1017172)))
-    ("EOS_PT_INQPOINT" fun nil (system) "Result = %s( filename, pointlist)" ("EOS-routines75.html" ("LENGTH" . 1017203)))
-    ("EOS_PT_LEVELINDX" fun nil (system) "Result = %s( pointID, levelname)" ("EOS-routines76.html"))
-    ("EOS_PT_LEVELINFO" fun nil (system) "Result = %s(pointID, level, fieldlist, fldtype, fldorder)" ("EOS-routines77.html"))
-    ("EOS_PT_NFIELDS" fun nil (system) "Result = %s( pointID, level)" ("EOS-routines78.html" ("LENGTH" . 1017295)))
-    ("EOS_PT_NLEVELS" fun nil (system) "Result = %s(pointID)" ("EOS-routines79.html"))
-    ("EOS_PT_NRECS" fun nil (system) "Result = %s( pointID, level)" ("EOS-routines80.html"))
-    ("EOS_PT_OPEN" fun nil (system) "Result = %s( fieldname)" ("EOS-routines81.html" ("CREATE" . 1017375) ("RDWR" . 1024341) ("READ" . 1024343)))
-    ("EOS_PT_PERIODINFO" fun nil (system) "Result = %s(pointID, periodID, level, fieldlist, size)" ("EOS-routines82.html"))
-    ("EOS_PT_PERIODRECS" fun nil (system) "Result = %s(pointID, periodID, level, nrec, recs)" ("EOS-routines83.html"))
-    ("EOS_PT_QUERY" fun nil (system) "Result = %s( Filename, PointName, [Info] )" ("EOS-routines84.html"))
-    ("EOS_PT_READATTR" fun nil (system) "Result = %s(pointID, attrname, datbuf)" ("EOS-routines85.html"))
-    ("EOS_PT_READLEVEL" fun nil (system) "Result = %s(pointID, level, fieldlist, nrec, recs, buffer)" ("EOS-routines86.html"))
-    ("EOS_PT_REGIONINFO" fun nil (system) "Result = %s(pointID, regionID, level, fieldlist, size)" ("EOS-routines87.html"))
-    ("EOS_PT_REGIONRECS" fun nil (system) "Result = %s(pointID, regionID, level, nrec, recs)" ("EOS-routines88.html"))
-    ("EOS_PT_SIZEOF" fun nil (system) "Result = %s(pointID, fieldlist, fldlevel)" ("EOS-routines89.html"))
-    ("EOS_PT_UPDATELEVEL" fun nil (system) "Result = %s(pointID, level, field, list, nrec, recs, data)" ("EOS-routines90.html"))
-    ("EOS_PT_WRITEATTR" fun nil (system) "Result = %s( pointID, attrname, datbuf)" ("EOS-routines91.html" ("COUNT" . 1017685) ("HDF_TYPE" . 1024378)))
-    ("EOS_PT_WRITELEVEL" fun nil (system) "Result = %s(pointID, level, nrec, data)" ("EOS-routines92.html"))
-    ("EOS_QUERY" fun nil (system) "Result = %s( Filename, [Info] )" ("EOS-routines93.html"))
-    ("EOS_SW_ATTACH" fun nil (system) "Result = %s(fid, swathname)" ("EOS-routines94.html"))
-    ("EOS_SW_ATTRINFO" fun nil (system) "Result = %s(swathID, attrname, numbertype, count)" ("EOS-routines95.html"))
-    ("EOS_SW_CLOSE" fun nil (system) "Result = %s(fid)" ("EOS-routines96.html"))
-    ("EOS_SW_COMPINFO" fun nil (system) "Result = %s(swathID, fieldname, compcode, compparm)" ("EOS-routines97.html"))
-    ("EOS_SW_CREATE" fun nil (system) "Result = %s(fid, swathname)" ("EOS-routines98.html"))
-    ("EOS_SW_DEFBOXREGION" fun nil (system) "Result = %s(swathID, cornerlon, cornerlat, mode)" ("EOS-routines99.html"))
-    ("EOS_SW_DEFCOMP" fun nil (system) "Result = %s( swathID, compcode, [, compparm] )" ("EOS-routines100.html"))
-    ("EOS_SW_DEFDATAFIELD" fun nil (system) "Result = %s( swathID, fieldname, dimlist, numbertype)" ("EOS-routines101.html" ("MERGE" . 1017975)))
-    ("EOS_SW_DEFDIM" fun nil (system) "Result = %s(swathID, fieldname, dim)" ("EOS-routines102.html"))
-    ("EOS_SW_DEFDIMMAP" fun nil (system) "Result = %s(swathID, geodim, datadim, offset, increment)" ("EOS-routines103.html"))
-    ("EOS_SW_DEFGEOFIELD" fun nil (system) "Result = %s( swathID, fieldname, dimlist, numbertype)" ("EOS-routines104.html" ("MERGE" . 1022830)))
-    ("EOS_SW_DEFIDXMAP" fun nil (system) "Result = %s(swathID, geodim, datadim, index)" ("EOS-routines105.html"))
-    ("EOS_SW_DEFTIMEPERIOD" fun nil (system) "Result = %s(swathID, starttime , stoptime, mode)" ("EOS-routines106.html"))
-    ("EOS_SW_DEFVRTREGION" fun nil (system) "Result = %s(swathID, regionID, vertObj, range)" ("EOS-routines107.html"))
-    ("EOS_SW_DETACH" fun nil (system) "Result = %s(swathID)" ("EOS-routines108.html"))
-    ("EOS_SW_DIMINFO" fun nil (system) "Result = %s(swathID, dimname)" ("EOS-routines109.html"))
-    ("EOS_SW_DUPREGION" fun nil (system) "Result = %s(regionID)" ("EOS-routines110.html"))
-    ("EOS_SW_EXTRACTPERIOD" fun nil (system) "Result = %s(swathID, periodID, fieldname, external_mode, buffer)" ("EOS-routines111.html"))
-    ("EOS_SW_EXTRACTREGION" fun nil (system) "Result = %s(swathID, regionID, fieldname, external_mode, buffer)" ("EOS-routines112.html"))
-    ("EOS_SW_FIELDINFO" fun nil (system) "Result = %s(swathID, fieldname, rank, dims, numbertype, dimlist)" ("EOS-routines113.html"))
-    ("EOS_SW_GETFILLVALUE" fun nil (system) "Result = %s(swathID, fieldname, fillvalue)" ("EOS-routines114.html"))
-    ("EOS_SW_IDXMAPINFO" fun nil (system) "Result = %s(swathID, geodim, datadim, index)" ("EOS-routines115.html"))
-    ("EOS_SW_INQATTRS" fun nil (system) "Result = %s( swathID, attrlist)" ("EOS-routines116.html" ("LENGTH" . 1018488)))
-    ("EOS_SW_INQDATAFIELDS" fun nil (system) "Result = %s(swathID, fieldlist, rank, numbertype)" ("EOS-routines117.html"))
-    ("EOS_SW_INQDIMS" fun nil (system) "Result = %s(swathID, dimname, dim)" ("EOS-routines118.html"))
-    ("EOS_SW_INQGEOFIELDS" fun nil (system) "Result = %s(swathID, fieldlist, rank, numbertype)" ("EOS-routines119.html"))
-    ("EOS_SW_INQIDXMAPS" fun nil (system) "Result = %s(swathID, idxmap, idxsizes)" ("EOS-routines120.html"))
-    ("EOS_SW_INQMAPS" fun nil (system) "Result = %s(swathID, dimmap, offset, increment)" ("EOS-routines121.html"))
-    ("EOS_SW_INQSWATH" fun nil (system) "Result = %s( filename, swathlist)" ("EOS-routines122.html" ("LENGTH" . 1018674)))
-    ("EOS_SW_MAPINFO" fun nil (system) "Result = %s(swathID, geodim, datadim, offset, increment)" ("EOS-routines123.html"))
-    ("EOS_SW_NENTRIES" fun nil (system) "Result = %s( swathID, entrycode)" ("EOS-routines124.html" ("LENGTH" . 1018745)))
-    ("EOS_SW_OPEN" fun nil (system) "Result = %s( filename)" ("EOS-routines125.html" ("CREATE" . 1018776) ("RDWR" . 1024156) ("READ" . 1024157)))
-    ("EOS_SW_PERIODINFO" fun nil (system) "Result = %s(swathID, periodID, fieldname, ntype, rank, dims, size)" ("EOS-routines126.html"))
-    ("EOS_SW_QUERY" fun nil (system) "Result=%s(Filename, SwathName, [Info])" ("EOS-routines127.html"))
-    ("EOS_SW_READATTR" fun nil (system) "Result = %s(swathID, attrname, datbuf)" ("EOS-routines128.html"))
-    ("EOS_SW_READFIELD" fun nil (system) "Result = %s( swathID, fieldname, buffer)" ("EOS-routines129.html" ("EDGE" . 1018883) ("START" . 1024163) ("STRIDE" . 1024164)))
-    ("EOS_SW_REGIONINFO" fun nil (system) "Result = %s(swathID, regionID, fieldname, ntype, rank, dims, size)" ("EOS-routines130.html"))
-    ("EOS_SW_SETFILLVALUE" fun nil (system) "Result = %s(swathID, fieldname, fillvalue)" ("EOS-routines131.html"))
-    ("EOS_SW_WRITEATTR" fun nil (system) "Result = %s( swathID, attrname, datbuf)" ("EOS-routines132.html" ("COUNT" . 1019002) ("HDF_TYPE" . 1024170)))
-    ("EOS_SW_WRITEDATAMETA" fun nil (system) "Result = %s(swathID, fieldname, dimlist, numbertype)" ("EOS-routines133.html"))
-    ("EOS_SW_WRITEFIELD" fun nil (system) "Result = %s( swathID, fieldname, data)" ("EOS-routines134.html" ("EDGE" . 1026788) ("START" . 1026786) ("STRIDE" . 1025378)))
-    ("EOS_SW_WRITEGEOMETA" fun nil (system) "Result = %s(swathID, fieldname, dimlist, numbertype)" ("EOS-routines135.html"))
-    ("ERF" fun nil (system) "Result = %s(Z)" ("E10.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ERFC" fun nil (system) "Result = %s(Z)" ("E11.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ERFCX" fun nil (system) "Result = %s(Z)" ("E12.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ERODE" fun nil (system) "Result = %s( Image, Structure [, X0 [, Y0 [, Z0]]])" ("E13.html" ("GRAY" . 989437) ("PRESERVE_TYPE" . 989439) ("UINT" . 989441) ("ULONG" . 989443) ("VALUES" . 989445)))
-    ("EXECUTE" fun nil (system) "Result = %s(String [, QuietCompile] [, QuietExecution])" ("E15.html"))
-    ("EXP" fun nil (system) "Result = %s(Expression)" ("E17.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("EXPAND_PATH" fun nil (system) "Result = %s( String)" ("E19.html" ("ALL_DIRS" . 987744) ("ARRAY" . 987739) ("COUNT" . 676819) ("DLM" . 987893) ("HELP" . 987895)))
-    ("EXPINT" fun nil (system) "Result = %s( N, X)" ("E20.html" ("DOUBLE" . 50644) ("EPS" . 997966) ("ITER" . 997968) ("ITMAX" . 997920)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("EXTRAC" fun nil (system) "Result = %s( Array, C1, C2, ..., Cn, S1, S2, ..., Sn )" ("E21.html"))
-    ("EXTRACT_SLICE" fun nil (system) "Result = %s( Vol, Xsize, Ysize, Xcenter, Ycenter, Zcenter, Xrot, Yrot, Zrot)" ("E22.html" ("ANISOTROPY" . 985393) ("OUT_VAL" . 988206) ("RADIANS" . 758834) ("SAMPLE" . 758840) ("VERTICES" . 985402)))
-    ("F_CVF" fun nil (system) "Result = %s(P, Dfn, Dfd)" ("F.html"))
-    ("F_PDF" fun nil (system) "Result = %s(V, Dfn, Dfd)" ("F2.html"))
-    ("FACTORIAL" fun nil (system) "Result = %s( N)" ("F3.html" ("STIRLING" . 54500) ("UL64" . 880257)))
-    ("FFT" fun nil (system) "Result = %s( Array [, Direction])" ("F4.html" ("DIMENSION" . 37862) ("DOUBLE" . 882851) ("INVERSE" . 37868) ("OVERWRITE" . 676843)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("FILE_BASENAME" fun nil (system) "Result = %s(Path [, RemoveSuffix])" ("F5.html" ("FOLD_CASE" . 922324)))
-    ("FILE_DIRNAME" fun nil (system) "Result = %s(Path)" ("F9.html" ("MARK_DIRECTORY" . 922462)))
-    ("FILE_EXPAND_PATH" fun nil (system) "Result = %s (Path)" ("F10.html"))
-    ("FILE_INFO" fun nil (system) "Result = %s(Path)" ("F11.html" ("NOEXPAND_PATH" . 883815)))
-    ("FILE_LINES" fun nil (system) "Result = %s(Path)" ("F12.html" ("COMPRESS" . 910561) ("NOEXPAND_PATH" . 910559)))
-    ("FILE_READLINK" fun nil (system) "Result = %s(Path)" ("F16.html" ("ALLOW_NONEXISTENT" . 906651) ("ALLOW_NONSYMLINK" . 906653) ("NOEXPAND_PATH" . 906655)))
-    ("FILE_SAME" fun nil (system) "Result = %s(Path1, Path2)" ("F17.html" ("NOEXPAND_PATH" . 906717)))
-    ("FILE_SEARCH" fun nil (system) "Result = %s(Path_Specification) or Result = %s(Dir_Specification, Recur_Pattern)" ("F18.html" ("COUNT" . 883932) ("EXPAND_ENVIRONMENT" . 883934) ("EXPAND_TILDE" . 883941) ("FOLD_CASE" . 883947) ("FULLY_QUALIFY_PATH" . 883949) ("ISSUE_ACCESS_ERROR" . 883957) ("MARK_DIRECTORY" . 883959) ("MATCH_ALL_INITIAL_DOT" . 883965) ("MATCH_INITIAL_DOT" . 883967) ("NOSORT" . 883969) ("QUOTE" . 883975) ("TEST_BLOCK_SPECIAL" . 900969) ("TEST_CHARACTER_SPECIAL" . 900971) ("TEST_DANGLING_SYMLINK" . 900973) ("TEST_DIRECTORY" . 883984) ("TEST_EXECUTABLE" . 883986) ("TEST_GROUP" . 900983) ("TEST_NAMED_PIPE" . 900993) ("TEST_READ" . 883991) ("TEST_REGULAR" . 883994) ("TEST_SETGID" . 901003) ("TEST_SETUID" . 901005) ("TEST_SOCKET" . 901015) ("TEST_STICKY_BIT" . 901017) ("TEST_SYMLINK" . 901019) ("TEST_USER" . 901021) ("TEST_WRITE" . 883996) ("TEST_ZERO_LENGTH" . 883999) ("WINDOWS_SHORT_NAMES" . 932747)))
-    ("FILE_TEST" fun nil (system) "Result = %s( File)" ("F19.html" ("BLOCK_SPECIAL" . 901098) ("CHARACTER_SPECIAL" . 901108) ("DANGLING_SYMLINK" . 901110) ("DIRECTORY" . 882375) ("EXECUTABLE" . 882377) ("GET_MODE" . 882382) ("GROUP" . 901120) ("NAMED_PIPE" . 901122) ("NOEXPAND_PATH" . 883024) ("READ" . 882391) ("REGULAR" . 882393) ("SETGID" . 901132) ("SETUID" . 901134) ("SOCKET" . 901136) ("STICKY_BIT" . 901143) ("SYMLINK" . 901145) ("USER" . 901152) ("WRITE" . 882395) ("ZERO_LENGTH" . 882397)))
-    ("FILE_WHICH" fun nil (system) "Result = %s( [Path, ] File)" ("F20.html" ("INCLUDE_CURRENT_DIR" . 882459)))
-    ("FILEPATH" fun nil (system) "Result = %s( Filename)" ("F21.html" ("ROOT_DIR" . 762284) ("SUBDIRECTORY" . 762286) ("TERMINAL" . 762290) ("TMP" . 762292)))
-    ("FINDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("F22.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("FINITE" fun nil (system) "Result = %s( X)" ("F23.html" ("INFINITY" . 862771) ("NAN" . 862772) ("SIGN" . 887616)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("FIX" fun nil (system) "Result = %s( Expression [, Offset [, D1 [, ..., D8]]])" ("F24.html" ("PRINT" . 871518) ("TYPE" . 871524)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("FLOAT" fun nil (system) "Result = %s( Expression [, Offset [, D1 [, ..., D8]]] )" ("F26.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("FLOOR" fun nil (system) "Result = %s(X)" ("F27.html" ("L64" . 875894)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("FLTARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("F29.html" ("NOZERO" . 676947)))
-    ("FORMAT_AXIS_VALUES" fun nil (system) "Result = %s( Values )" ("F32.html"))
-    ("FSTAT" fun nil (system) "Result = %s(Unit)" ("F35.html"))
-    ("FULSTR" fun nil (system) "Result = %s(A)" ("F36.html"))
-    ("FV_TEST" fun nil (system) "Result = %s(X, Y)" ("F39.html"))
-    ("FX_ROOT" fun nil (system) "Result = %s(X, Func)" ("F40.html" ("DOUBLE" . 749893) ("ITMAX" . 749897) ("STOP" . 749899) ("TOL" . 749901)))
-    ("FZ_ROOTS" fun nil (system) "Result = %s(C)" ("F41.html" ("DOUBLE" . 52525) ("EPS" . 902541) ("NO_POLISH" . 902543)))
-    ("GAMMA" fun nil (system) "Result = %s(Z)" ("G.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("GAUSS2DFIT" fun nil (system) "Result = %s( Z, A [, X, Y])" ("G5.html" ("NEGATIVE" . 199709) ("TILT" . 199711)))
-    ("GAUSS_CVF" fun nil (system) "Result = %s(P)" ("G3.html"))
-    ("GAUSS_PDF" fun nil (system) "Result = %s(V)" ("G4.html"))
-    ("GAUSSFIT" fun nil (system) "Result = %s( X, Y [, A])" ("G6.html" ("CHISQ" . 881490) ("ESTIMATES" . 841704) ("MEASURE_ERRORS" . 841712) ("NTERMS" . 889863) ("SIGMA" . 881498) ("YERROR" . 881500)))
-    ("GAUSSINT" fun nil (system) "Result = %s(X)" ("G7.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("GET_DRIVE_LIST" fun nil (system) "Result = %s()" ("G8.html" ("CDROM" . 884482) ("COUNT" . 876351) ("FIXED" . 876358) ("REMOTE" . 878573) ("REMOVABLE" . 878575)))
-    ("GET_KBRD" fun nil (system) "Result = %s(Wait)" ("G9.html"))
-    ("GET_SCREEN_SIZE" fun nil (system) "Result = %s( [Display_name])" ("G11.html" ("DISPLAY_NAME" . 841676) ("RESOLUTION" . 853571)))
-    ("GETENV" fun nil (system) "Result = %s( Name)" ("G12.html" ("ENVIRONMENT" . 887078)))
-    ("GRID3" fun nil (system) "Result = %s( X, Y, Z, F, Gx, Gy, Gz)" ("G16.html" ("DELTA" . 677098) ("DTOL" . 168207) ("GRID" . 677100) ("NGRID" . 677102) ("START" . 677104)))
-    ("GRID_TPS" fun nil (system) "Result = %s (Xp, Yp, Values)" ("G15.html" ("COEFFICIENTS" . 871830) ("DELTA" . 871832) ("NGRID" . 871834) ("START" . 871836)))
-    ("GRIDDATA" fun nil (system) "Result = %s( X, F ) or Result = %s( X, Y, F ) or Result = %s( X, Y, Z, F)" ("G17.html" ("ANISOTROPY" . 877568) ("DEGREES" . 877573) ("DELTA" . 877575) ("DIMENSION" . 877578) ("EMPTY_SECTORS" . 877581) ("FAULT_POLYGONS" . 877584) ("FAULT_XY" . 877588) ("FUNCTION_TYPE" . 877591) ("GRID" . 877652) ("INVERSE_DISTANCE" . 877655) ("KRIGING" . 877657) ("LINEAR" . 877659) ("MAX_PER_SECTOR" . 877661) ("METHOD" . 877664) ("MIN_CURVATURE" . 877713) ("MIN_POINTS" . 877715) ("MISSING" . 877719) ("NATURAL_NEIGHBOR" . 877723) ("NEAREST_NEIGHBOR" . 877726) ("NEIGHBORHOOD" . 877729) ("POLYNOMIAL_REGRESSION" . 877733) ("POWER" . 877749) ("QUINTIC" . 877752) ("RADIAL_BASIS_FUNCTION" . 877755) ("SEARCH_ELLIPSE" . 877757) ("SECTORS" . 877761) ("SHEPARDS" . 877763) ("SMOOTHING" . 877766) ("SPHERE" . 877769) ("START" . 877771) ("TRIANGLES" . 877774) ("VARIOGRAM" . 877778) ("XOUT" . 877781) ("YOUT" . 877784)))
-    ("GS_ITER" fun nil (system) "Result = %s( A, B)" ("G18.html" ("CHECK" . 750095) ("DOUBLE" . 875451) ("LAMBDA" . 750097) ("MAX_ITER" . 750102) ("TOL" . 872926) ("X_0" . 750104)))
-    ("H5_BROWSER" fun nil (system) "Result = %s([Files])" ("H4.html" ("DIALOG_READ" . 885865)))
-    ("H5_GET_LIBVERSION" fun nil (system) "Result = %s( )" ("HDF5-routines11.html"))
-    ("H5_PARSE" fun nil (system) "Result = %s (File)" ("HDF5-routines13.html" ("FILE" . 1148311) ("PATH" . 1148313) ("READ_DATA" . 1148315)))
-    ("H5A_GET_NAME" fun nil (system) "Result = %s(Attribute_id)" ("HDF5-routines15.html"))
-    ("H5A_GET_NUM_ATTRS" fun nil (system) "Result = %s(Loc_id)" ("HDF5-routines16.html"))
-    ("H5A_GET_SPACE" fun nil (system) "Result = %s(Attribute_id)" ("HDF5-routines17.html"))
-    ("H5A_GET_TYPE" fun nil (system) "Result = %s(Attribute_id)" ("HDF5-routines18.html"))
-    ("H5A_OPEN_IDX" fun nil (system) "Result = %s(Loc_id, Index)" ("HDF5-routines19.html"))
-    ("H5A_OPEN_NAME" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines20.html"))
-    ("H5A_READ" fun nil (system) "Result = %s(Attribute_id)" ("HDF5-routines21.html"))
-    ("H5D_GET_SPACE" fun nil (system) "Result = %s(Dataset_id)" ("HDF5-routines23.html"))
-    ("H5D_GET_STORAGE_SIZE" fun nil (system) "Result = %s(Dataset_id)" ("HDF5-routines24.html"))
-    ("H5D_GET_TYPE" fun nil (system) "Result = %s(Dataset_id)" ("HDF5-routines25.html"))
-    ("H5D_OPEN" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines26.html"))
-    ("H5D_READ" fun nil (system) "Result = %s(Dataset_id)" ("HDF5-routines27.html" ("FILE_SPACE" . 1148824) ("MEMORY_SPACE" . 1148826)))
-    ("H5F_IS_HDF5" fun nil (system) "Result = %s(Filename)" ("HDF5-routines29.html"))
-    ("H5F_OPEN" fun nil (system) "Result = %s(Filename)" ("HDF5-routines30.html"))
-    ("H5G_GET_COMMENT" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines32.html"))
-    ("H5G_GET_LINKVAL" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines33.html"))
-    ("H5G_GET_MEMBER_NAME" fun nil (system) "Result = %s(Loc_id, Name, Index)" ("HDF5-routines34.html"))
-    ("H5G_GET_NMEMBERS" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines35.html"))
-    ("H5G_GET_OBJINFO" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines36.html" ("FOLLOW_LINK" . 1149214)))
-    ("H5G_OPEN" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines37.html"))
-    ("H5I_GET_TYPE" fun nil (system) "Result = %s(Obj_id)" ("HDF5-routines38.html"))
-    ("H5R_DEREFERENCE" fun nil (system) "Result = %s(Loc_id, Reference)" ("HDF5-routines39.html"))
-    ("H5R_GET_OBJECT_TYPE" fun nil (system) "Result = %s(Loc_id, Reference)" ("HDF5-routines40.html"))
-    ("H5S_COPY" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines42.html"))
-    ("H5S_CREATE_SIMPLE" fun nil (system) "Result = %s(Dimensions)" ("HDF5-routines43.html" ("MAX_DIMENSIONS" . 1149414)))
-    ("H5S_GET_SELECT_BOUNDS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines44.html"))
-    ("H5S_GET_SELECT_ELEM_NPOINTS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines45.html"))
-    ("H5S_GET_SELECT_ELEM_POINTLIST" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines46.html" ("NUMBER" . 1149508) ("START" . 1149506)))
-    ("H5S_GET_SELECT_HYPER_BLOCKLIST" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines47.html" ("NUMBER" . 1149544) ("START" . 1149542)))
-    ("H5S_GET_SELECT_HYPER_NBLOCKS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines48.html"))
-    ("H5S_GET_SELECT_NPOINTS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines49.html"))
-    ("H5S_GET_SIMPLE_EXTENT_DIMS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines50.html" ("MAX_DIMENSIONS" . 1149642)))
-    ("H5S_GET_SIMPLE_EXTENT_NDIMS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines51.html"))
-    ("H5S_GET_SIMPLE_EXTENT_NPOINTS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines52.html"))
-    ("H5S_GET_SIMPLE_EXTENT_TYPE" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines53.html"))
-    ("H5S_IS_SIMPLE" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines54.html"))
-    ("H5S_SELECT_VALID" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines60.html"))
-    ("H5T_COMMITTED" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines62.html"))
-    ("H5T_COPY" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines63.html"))
-    ("H5T_EQUAL" fun nil (system) "Result = %s(Datatype_id1, Datatype_id2)" ("HDF5-routines64.html"))
-    ("H5T_GET_ARRAY_DIMS" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines65.html" ("PERMUTATIONS" . 1150077)))
-    ("H5T_GET_ARRAY_NDIMS" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines66.html"))
-    ("H5T_GET_CLASS" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines67.html"))
-    ("H5T_GET_CSET" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines68.html"))
-    ("H5T_GET_EBIAS" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines69.html"))
-    ("H5T_GET_FIELDS" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines70.html"))
-    ("H5T_GET_INPAD" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines71.html"))
-    ("H5T_GET_MEMBER_CLASS" fun nil (system) "Result = %s(Datatype_id, Member)" ("HDF5-routines72.html"))
-    ("H5T_GET_MEMBER_NAME" fun nil (system) "Result = %s(Datatype_id, Member)" ("HDF5-routines73.html"))
-    ("H5T_GET_MEMBER_OFFSET" fun nil (system) "Result = %s(Datatype_id, Member)" ("HDF5-routines74.html"))
-    ("H5T_GET_MEMBER_TYPE" fun nil (system) "Result = %s(Datatype_id, Member)" ("HDF5-routines75.html"))
-    ("H5T_GET_NMEMBERS" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines76.html"))
-    ("H5T_GET_NORM" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines77.html"))
-    ("H5T_GET_OFFSET" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines78.html"))
-    ("H5T_GET_ORDER" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines79.html"))
-    ("H5T_GET_PAD" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines80.html"))
-    ("H5T_GET_PRECISION" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines81.html"))
-    ("H5T_GET_SIGN" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines82.html"))
-    ("H5T_GET_SIZE" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines83.html"))
-    ("H5T_GET_STRPAD" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines84.html"))
-    ("H5T_GET_SUPER" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines85.html"))
-    ("H5T_IDLTYPE" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines86.html" ("ARRAY_DIMENSIONS" . 1150764) ("STRUCTURE" . 1150766)))
-    ("H5T_MEMTYPE" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines87.html"))
-    ("H5T_OPEN" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines88.html"))
-    ("HANNING" fun nil (system) "Result = %s( N1 [, N2])" ("H5.html" ("ALPHA" . 758100) ("DOUBLE" . 874103)))
-    ("HDF_AN_ANNLEN" fun nil (system) "Result = %s(Annotation_id)" ("HDF-routines8.html"))
-    ("HDF_AN_ANNLIST" fun nil (system) "Result = %s(Annotation_id, Annotation_type, Object_tag, Object_ref, Annotation_list)" ("HDF-routines9.html"))
-    ("HDF_AN_ATYPE2TAG" fun nil (system) "Result = %s(Annotation_type)" ("HDF-routines10.html"))
-    ("HDF_AN_CREATE" fun nil (system) "Result = %s(Annotation_id, Object_tag, Object_ref, Annotation_type)" ("HDF-routines11.html"))
-    ("HDF_AN_CREATEF" fun nil (system) "Result = %s(Annotation_id, Annotation_type)" ("HDF-routines12.html"))
-    ("HDF_AN_FILEINFO" fun nil (system) "Result = %s(Annotation_id, n_file_labels, n_file_descs, n_data_labels, n_data_descs)" ("HDF-routines15.html"))
-    ("HDF_AN_GET_TAGREF" fun nil (system) "Result = %s(Annotation_id, index, Annotation_type, Annotation_tag, Annotation_ref)" ("HDF-routines16.html"))
-    ("HDF_AN_NUMANN" fun nil (system) "Result = %s(Annotation_id, Annotation_type, Object_tag, Object_ref)" ("HDF-routines18.html"))
-    ("HDF_AN_READANN" fun nil (system) "Result = %s( Annotation_id, annotation)" ("HDF-routines19.html" ("LENGTH" . 1056839)))
-    ("HDF_AN_SELECT" fun nil (system) "Result = %s(Annotation_id, index, Annotation_type)" ("HDF-routines20.html"))
-    ("HDF_AN_START" fun nil (system) "Result = %s(file_id)" ("HDF-routines21.html"))
-    ("HDF_AN_WRITEANN" fun nil (system) "Result = %s( Annotation_id, annotation)" ("HDF-routines24.html" ("LENGTH" . 1056941)))
-    ("HDF_ANNOTATION_ID2TAGREF" fun nil (system) "Result = %s(Annotation_id, Annotation_tag, Annotation_ref)" ("HDF-routines17.html"))
-    ("HDF_ANNOTATION_TAG2ATYPE" fun nil (system) "Result = %s(Annotation_tag)" ("HDF-routines22.html"))
-    ("HDF_ANNOTATION_TAGREF2ID" fun nil (system) "Result = %s(Annotation_id, Annotation_tag, Annotation_ref)" ("HDF-routines23.html"))
-    ("HDF_BROWSER" fun nil (system) "Template = %s([Filename])" ("H7.html" ("CANCEL" . 852206) ("GROUP" . 870963) ("PREFIX" . 852209)))
-    ("HDF_DF24_LASTREF" fun nil (system) "Result = %s( )" ("HDF-routines30.html"))
-    ("HDF_DF24_NIMAGES" fun nil (system) "Result = %s(Filename)" ("HDF-routines31.html"))
-    ("HDF_DFAN_LABLIST" fun nil (system) "Result = %s( Filename, Tag, Reflist, Labellist)" ("HDF-routines40.html" ("LISTSIZE" . 997374) ("MAXLABEL" . 997377) ("STARTPOS" . 997380) ("STRING" . 997383)))
-    ("HDF_DFAN_LASTREF" fun nil (system) "Result = %s( )" ("HDF-routines41.html"))
-    ("HDF_DFP_LASTREF" fun nil (system) "Result = %s( )" ("HDF-routines46.html"))
-    ("HDF_DFP_NPALS" fun nil (system) "Result = %s(Filename)" ("HDF-routines47.html"))
-    ("HDF_DFR8_LASTREF" fun nil (system) "Result = %s( )" ("HDF-routines55.html"))
-    ("HDF_DFR8_NIMAGES" fun nil (system) "Result = %s(Filename)" ("HDF-routines56.html"))
-    ("HDF_EXISTS" fun nil (system) "Result = %s( )" ("HDF-routines62.html"))
-    ("HDF_GR_ATTRINFO" fun nil (system) "Result = %s(obj_id, attr_index, name, data_type, count)" ("HDF-routines63.html"))
-    ("HDF_GR_CREATE" fun nil (system) "Result = %s(gr_id, name, ncomp, data_type, interlace_mode, dim_sizes)" ("HDF-routines64.html"))
-    ("HDF_GR_FILEINFO" fun nil (system) "Result = %s(gr_id, n_images, n_file_attrs)" ("HDF-routines67.html"))
-    ("HDF_GR_FINDATTR" fun nil (system) "Result = %s(obj_id, attr_name)" ("HDF-routines68.html"))
-    ("HDF_GR_GETATTR" fun nil (system) "Result = %s(obj_id, attr_index, values)" ("HDF-routines69.html"))
-    ("HDF_GR_GETCHUNKINFO" fun nil (system) "Result = %s(ri_id, dim_length, flag)" ("HDF-routines70.html"))
-    ("HDF_GR_GETIMINFO" fun nil (system) "Result = %s(ri_id, gr_name, ncomp, data_type, interlace_mode, dim_sizes, num_attrs)" ("HDF-routines71.html"))
-    ("HDF_GR_GETLUTID" fun nil (system) "Result = %s(ri_id, pal_index)" ("HDF-routines72.html"))
-    ("HDF_GR_GETLUTINFO" fun nil (system) "Result = %s(pal_id, ncomp, data_type, interlace_mode, num_entries)" ("HDF-routines73.html"))
-    ("HDF_GR_IDTOREF" fun nil (system) "Result = %s(ri_id)" ("HDF-routines74.html"))
-    ("HDF_GR_LUTTOREF" fun nil (system) "Result = %s(pal_id)" ("HDF-routines75.html"))
-    ("HDF_GR_NAMETOINDEX" fun nil (system) "Result = %s(gr_id, gr_name)" ("HDF-routines76.html"))
-    ("HDF_GR_READIMAGE" fun nil (system) "Result = %s( ri_id, data)" ("HDF-routines77.html" ("EDGE" . 1057619) ("INTERLACE" . 1057617) ("START" . 1057607) ("STRIDE" . 1057609)))
-    ("HDF_GR_READLUT" fun nil (system) "Result = %s( pal_id, pal_data)" ("HDF-routines78.html" ("INTERLACE" . 1057387)))
-    ("HDF_GR_REFTOINDEX" fun nil (system) "Result = %s(gr_id, gr_ref)" ("HDF-routines79.html"))
-    ("HDF_GR_SELECT" fun nil (system) "Result = %s(gr_id, index)" ("HDF-routines80.html"))
-    ("HDF_GR_SETATTR" fun nil (system) "Result = %s(obj_id, attr_name, data_type, count, values)" ("HDF-routines81.html"))
-    ("HDF_GR_SETCHUNK" fun nil (system) "Result = %s(ri_id, dim_length, comp_type, comp_prm)" ("HDF-routines82.html"))
-    ("HDF_GR_SETCHUNKCACHE" fun nil (system) "Result = %s(ri_id, maxcache, flags)" ("HDF-routines83.html"))
-    ("HDF_GR_SETCOMPRESS" fun nil (system) "Result = %s(ri_id, comp_type, comp_prm)" ("HDF-routines84.html"))
-    ("HDF_GR_SETEXTERNALFILE" fun nil (system) "Result = %s(ri_id, filename, offset)" ("HDF-routines85.html"))
-    ("HDF_GR_START" fun nil (system) "Result = %s(file_id)" ("HDF-routines86.html"))
-    ("HDF_GR_WRITEIMAGE" fun nil (system) "Result = %s( ri_id, data)" ("HDF-routines87.html" ("EDGE" . 1057693) ("INTERLACE" . 1057699) ("START" . 1057691) ("STRIDE" . 1057681)))
-    ("HDF_GR_WRITELUT" fun nil (system) "Result = %s( pal_id, pal_data )" ("HDF-routines88.html"))
-    ("HDF_HDF2IDLTYPE" fun nil (system) "Result = %s( hdftypecode )" ("HDF-routines89.html"))
-    ("HDF_IDL2HDFTYPE" fun nil (system) "Result = %s( idltypecode )" ("HDF-routines90.html"))
-    ("HDF_ISHDF" fun nil (system) "Result = %s(Filename)" ("HDF-routines91.html"))
-    ("HDF_NEWREF" fun nil (system) "Result = %s(FileHandle)" ("HDF-routines93.html"))
-    ("HDF_NUMBER" fun nil (system) "Result = %s( FileHandle)" ("HDF-routines94.html" ("TAG" . 998362)))
-    ("HDF_OPEN" fun nil (system) "Result = %s( Filename)" ("HDF-routines95.html" ("ALL" . 998379) ("CREATE" . 998383) ("NUM_DD" . 998386) ("RDWR" . 998390) ("READ" . 998394) ("WRITE" . 998397)))
-    ("HDF_PACKDATA" fun nil (system) "Result = %s( data1 [, data2 [, data3 [, data4 [, data5 [, data6 [, data7 [, data8]]]]]]])" ("HDF-routines96.html" ("HDF_ORDER" . 1042936) ("HDF_TYPE" . 1042939) ("NREC" . 1042942)))
-    ("HDF_READ" fun nil (system) "Result = %s( [Filename])" ("H8.html" ("DF24" . 852278) ("DFR8" . 852275) ("PREFIX" . 871657) ("TEMPLATE" . 852281)))
-    ("HDF_SD_ATTRFIND" fun nil (system) "Result = %s(SD_id, Name)" ("HDF-routines98.html"))
-    ("HDF_SD_CREATE" fun nil (system) "Result = %s( SDinterface_id, Name, Dims)" ("HDF-routines101.html" ("BYTE" . 1053869) ("DFNT_CHAR88" . 1053872) ("DFNT_FLOAT32" . 1053875) ("DFNT_FLOAT64" . 1053878) ("DFNT_INT16" . 1053884) ("DFNT_INT32" . 1053887) ("DFNT_INT8" . 1053881) ("DFNT_UINT16" . 1053893) ("DFNT_UINT32" . 1053896) ("DFNT_UINT8" . 1053890) ("DOUBLE" . 1053899) ("FLOAT" . 1053902) ("HDF_TYPE" . 1106175) ("INT" . 1106171) ("LONG" . 1053908) ("SHORT" . 1053911) ("STRING" . 1053914)))
-    ("HDF_SD_DIMGETID" fun nil (system) "Result = %s(SDdataset_id, Dimension_Number)" ("HDF-routines103.html"))
-    ("HDF_SD_ISCOORDVAR" fun nil (system) "Result = %s(SDdataset_id)" ("HDF-routines111.html"))
-    ("HDF_SD_NAMETOINDEX" fun nil (system) "Result = %s(SDinterface_id, SDS_Name)" ("HDF-routines112.html"))
-    ("HDF_SD_REFTOINDEX" fun nil (system) "Result = %s(SDinterface_id, Reference_number)" ("HDF-routines113.html"))
-    ("HDF_SD_SELECT" fun nil (system) "Result = %s(SDinterface_id, Number)" ("HDF-routines114.html"))
-    ("HDF_SD_START" fun nil (system) "Result = %s( Filename)" ("HDF-routines118.html" ("CREATE" . 1054663) ("RDWR" . 1054661) ("READ" . 1054659)))
-    ("HDF_SDINTERFACE_IDTOREF" fun nil (system) "Result = %s(SDdataset_id)" ("HDF-routines110.html"))
-    ("HDF_VD_ATTACH" fun nil (system) "Result = %s( FileHandle, VData_id)" ("HDF-routines120.html" ("READ" . 999503) ("WRITE" . 999506)))
-    ("HDF_VD_ATTRFIND" fun nil (system) "Result = %s(VData, FieldID, Name)" ("HDF-routines121.html"))
-    ("HDF_VD_FEXIST" fun nil (system) "Result = %s(VData, Fieldnames)" ("HDF-routines126.html"))
-    ("HDF_VD_FIND" fun nil (system) "Result = %s(FileHandle, Name)" ("HDF-routines127.html"))
-    ("HDF_VD_GETID" fun nil (system) "Result = %s(FileHandle, VData_id)" ("HDF-routines129.html"))
-    ("HDF_VD_ISATTR" fun nil (system) "Result = %s(VData)" ("HDF-routines132.html"))
-    ("HDF_VD_ISVD" fun nil (system) "Result = %s(VGroup, Id)" ("HDF-routines133.html"))
-    ("HDF_VD_LONE" fun nil (system) "Result = %s( FileHandle)" ("HDF-routines135.html" ("MAXSIZE" . 999761)))
-    ("HDF_VD_NATTRS" fun nil (system) "Result = %s( VData, FieldID )" ("HDF-routines136.html"))
-    ("HDF_VD_READ" fun nil (system) "Result = %s( VData, Data)" ("HDF-routines137.html" ("FIELDS" . 999788) ("FULL_INTERLACE" . 999791) ("NO_INTERLACE" . 999794) ("NRECORDS" . 999797)))
-    ("HDF_VG_ATTACH" fun nil (system) "Result = %s( FileHandle, VGroup_id)" ("HDF-routines142.html" ("READ" . 999942) ("WRITE" . 999945)))
-    ("HDF_VG_GETID" fun nil (system) "Result = %s(FileHandle, VGroup_id)" ("HDF-routines144.html"))
-    ("HDF_VG_GETNEXT" fun nil (system) "Result = %s(VGroup, Id)" ("HDF-routines146.html"))
-    ("HDF_VG_INQTR" fun nil (system) "Result = %s(VGroup, Tag, Ref)" ("HDF-routines149.html"))
-    ("HDF_VG_ISVD" fun nil (system) "Result = %s(VGroup, Id)" ("HDF-routines151.html"))
-    ("HDF_VG_ISVG" fun nil (system) "Result = %s(VGroup, Id)" ("HDF-routines152.html"))
-    ("HDF_VG_LONE" fun nil (system) "Result = %s( FileHandle)" ("HDF-routines153.html" ("MAXSIZE" . 1000150)))
-    ("HDF_VG_NUMBER" fun nil (system) "Result = %s(VGroup)" ("HDF-routines154.html"))
-    ("HILBERT" fun nil (system) "Result = %s(X [, D])" ("H12.html"))
-    ("HIST_2D" fun nil (system) "Result = %s( V1, V2)" ("H13.html" ("BIN1" . 832830) ("BIN2" . 832832) ("MAX1" . 832284) ("MAX2" . 832345) ("MIN1" . 832837) ("MIN2" . 832839)))
-    ("HIST_EQUAL" fun nil (system) "Result = %s( A)" ("H14.html" ("BINSIZE" . 871698) ("FCN" . 876498) ("HISTOGRAM_ONLY" . 874403) ("MAXV" . 874687) ("MINV" . 758160) ("OMAX" . 875087) ("OMIN" . 875100) ("PERCENT" . 874600) ("TOP" . 874602)))
-    ("HISTOGRAM" fun nil (system) "Result = %s( Array)" ("H15.html" ("BINSIZE" . 677175) ("INPUT" . 677177) ("L64" . 677180) ("LOCATIONS" . 886107) ("MAX" . 886113) ("MIN" . 677182) ("NAN" . 197674) ("NBINS" . 677184) ("OMAX" . 873903) ("OMIN" . 677186) ("REVERSE_INDICES" . 677188)))
-    ("HOUGH" fun nil (system) "Result = %s( Array)" ("H17.html" ("BACKPROJECT" . 875957) ("DOUBLE" . 875960) ("DRHO" . 875962) ("DX" . 875964) ("DY" . 875966) ("GRAY" . 875968) ("NRHO" . 875970) ("NTHETA" . 875972) ("NX" . 875974) ("NY" . 875976) ("RHO" . 875978) ("RMIN" . 875980) ("THETA" . 875982) ("XMIN" . 875984) ("YMIN" . 875986)))
-    ("HQR" fun nil (system) "Result = %s( A)" ("H18.html" ("COLUMN" . 871729) ("DOUBLE" . 50748)))
-    ("IBETA" fun nil (system) "Result = %s( A, B, Z)" ("I.html" ("DOUBLE" . 875616) ("EPS" . 875618) ("ITER" . 875967) ("ITMAX" . 875622)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("IDENTITY" fun nil (system) "Result = %s( N)" ("I3.html" ("DOUBLE" . 832664)))
-    ("IDL_VALIDNAME" fun nil (system) "Result = %s(String)" ("I4.html" ("CONVERT_ALL" . 937159) ("CONVERT_SPACES" . 937166)))
-    ("IDLITSYS_CREATETOOL" fun nil (system) "Result = %s(StrTool)" ("I5.html" ("DIMENSIONS" . 984612) ("IDENTIFIER" . 984573) ("INITIAL_DATA" . 939956) ("LOCATION" . 984462) ("MACRO_NAMES" . 964508) ("NO_SAVEPROMPT" . 982826) ("OVERPLOT" . 939958) ("STYLE_NAME" . 984522) ("USER_INTERFACE" . 983497) ("VIEW_GRID" . 939979) ("VIEW_NEXT" . 939981) ("VIEW_NUMBER" . 939984) ("VISUALIZATION_TYPE" . 939987)))
-    ("IGAMMA" fun nil (system) "Result = %s( A, Z)" ("I7.html" ("DOUBLE" . 875550) ("EPS" . 875548) ("ITER" . 875581) ("ITMAX" . 875579) ("METHOD" . 875520)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("IMAGINARY" fun nil (system) "Result = %s(Complex_Expression)" ("I11.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("INDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("I13.html" ("BYTE" . 862684) ("COMPLEX" . 862699) ("DCOMPLEX" . 862701) ("DOUBLE" . 862705) ("FLOAT" . 862707) ("L64" . 862711) ("LONG" . 862927) ("STRING" . 862930) ("TYPE" . 862752) ("UINT" . 862746) ("UL64" . 862748) ("ULONG" . 862750)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("INT_2D" fun nil (system) "Result = %s( Fxy, AB_Limits, PQ_Limits, Pts)" ("I14.html" ("DOUBLE" . 832191) ("ORDER" . 813280)))
-    ("INT_3D" fun nil (system) "Result = %s( Fxyz, AB_Limits, PQ_Limits, UV_Limits, Pts)" ("I15.html" ("DOUBLE" . 813293)))
-    ("INT_TABULATED" fun nil (system) "Result = %s( X, F)" ("I16.html" ("DOUBLE" . 875649) ("SORT" . 750310)))
-    ("INTARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("I17.html" ("NOZERO" . 677253)))
-    ("INTERPOL" fun nil (system) "Result = %s( V, N)" ("I18.html" ("LSQUADRATIC" . 872067) ("QUADRATIC" . 872072) ("SPLINE" . 872076)))
-    ("INTERPOLATE" fun nil (system) "Result = %s( P, X [, Y [, Z]])" ("I19.html" ("CUBIC" . 680782) ("GRID" . 680781) ("MISSING" . 677276)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("INVERT" fun nil (system) "Result = %s( Array [, Status])" ("I21.html" ("DOUBLE" . 50809)))
-    ("IOCTL" fun nil (system) "Result = %s( File_Unit [, Request, Arg])" ("I22.html" ("BY_VALUE" . 677325) ("MT_OFFLINE" . 677327) ("MT_REWIND" . 677329) ("MT_SKIP_FILE" . 677331) ("MT_SKIP_RECORD" . 677333) ("MT_WEOF" . 677335) ("SUPPRESS_ERROR" . 677337)))
-    ("ISHFT" fun nil (system) "Result = %s(P1, P2)" ("I24.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ITGETCURRENT" fun nil (system) "Result = %s()" ("I30.html" ("TOOL" . 941481)))
-    ("JULDAY" fun nil (system) "Result = %s(Month, Day, Year, Hour, Minute, Second)" ("J2.html"))
-    ("KEYWORD_SET" fun nil (system) "Result = %s(Expression)" ("K.html"))
-    ("KRIG2D" fun nil (system) "Result = %s( Z [, X, Y])" ("K2.html" ("BOUNDS" . 750620) ("EXPONENTIAL" . 750596) ("GS" . 930292) ("NX" . 750622) ("NY" . 750624) ("REGULAR" . 750607) ("SPHERICAL" . 750598) ("XGRID" . 750609) ("XVALUES" . 750611) ("YGRID" . 750613) ("YVALUES" . 750615)))
-    ("KURTOSIS" fun nil (system) "Result = %s(X)" ("K3.html" ("DOUBLE" . 859078) ("NAN" . 860892)))
-    ("KW_TEST" fun nil (system) "Result = %s( X)" ("K4.html" ("DF" . 53675) ("MISSING" . 53678)))
-    ("L64INDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("L.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LA_CHOLMPROVE" fun nil (system) "Result = %s( Array, Achol, B, X)" ("L3.html" ("BACKWARD_ERROR" . 969194) ("DOUBLE" . 969196) ("FORWARD_ERROR" . 969198) ("UPPER" . 969200)))
-    ("LA_CHOLSOL" fun nil (system) "Result = %s( A, B)" ("L4.html" ("DOUBLE" . 969317) ("UPPER" . 969319)))
-    ("LA_DETERM" fun nil (system) "Result = %s( A)" ("L5.html" ("CHECK" . 969400) ("DOUBLE" . 969402) ("ZERO" . 969404)))
-    ("LA_EIGENPROBLEM" fun nil (system) "Result = %s( A [, B])" ("L6.html" ("ALPHA" . 969502) ("BALANCE" . 969505) ("BETA" . 969512) ("DOUBLE" . 969515) ("EIGENVECTORS" . 969517) ("LEFT_EIGENVECTORS" . 969520) ("NORM_BALANCE" . 969523) ("PERMUTE_RESULT" . 969525) ("RCOND_VALUE" . 969527) ("RCOND_VECTOR" . 969529) ("SCALE_RESULT" . 969531) ("STATUS" . 969533)))
-    ("LA_EIGENQL" fun nil (system) "Result = %s( A [, B])" ("L7.html" ("DOUBLE" . 969688) ("EIGENVECTORS" . 969690) ("FAILED" . 969692) ("GENERALIZED" . 969695) ("METHOD" . 969701) ("RANGE" . 969707) ("SEARCH_RANGE" . 969709) ("STATUS" . 969712) ("TOLERANCE" . 969723)))
-    ("LA_EIGENVEC" fun nil (system) "Result = %s( T, QZ)" ("L8.html" ("BALANCE" . 969898) ("DOUBLE" . 969901) ("EIGENINDEX" . 969903) ("LEFT_EIGENVECTORS" . 969906) ("PERMUTE_RESULT" . 969908) ("RCOND_VALUE" . 969910) ("RCOND_VECTOR" . 969912) ("SCALE_RESULT" . 969914) ("SELECT" . 969916)))
-    ("LA_ELMHES" fun nil (system) "Result = %s( Array [, Q])" ("L9.html" ("BALANCE" . 970060) ("DOUBLE" . 970067) ("NORM_BALANCE" . 970069) ("PERMUTE_RESULT" . 970071) ("SCALE_RESULT" . 970073)))
-    ("LA_GM_LINEAR_MODEL" fun nil (system) "Result = %s( A, B, D, Y)" ("L10.html" ("DOUBLE" . 970161)))
-    ("LA_HQR" fun nil (system) "Result = %s(H [, Q])" ("L11.html" ("DOUBLE" . 970266) ("PERMUTE_RESULT" . 970268) ("STATUS" . 970270)))
-    ("LA_INVERT" fun nil (system) "Result = %s( A)" ("L12.html" ("DOUBLE" . 970351) ("STATUS" . 970353)))
-    ("LA_LEAST_SQUARE_EQUALITY" fun nil (system) "Result = %s( A, B, C, D)" ("L13.html" ("DOUBLE" . 970448) ("RESIDUAL" . 970450)))
-    ("LA_LEAST_SQUARES" fun nil (system) "Result = %s( A, B)" ("L14.html" ("DOUBLE" . 970563) ("METHOD" . 970565) ("RANK" . 970571) ("RCONDITION" . 970573) ("RESIDUAL" . 970575) ("STATUS" . 970577)))
-    ("LA_LINEAR_EQUATION" fun nil (system) "Result = %s( Array, B)" ("L15.html" ("BACKWARD_ERROR" . 970657) ("DOUBLE" . 970659) ("FORWARD_ERROR" . 970661) ("STATUS" . 970663)))
-    ("LA_LUMPROVE" fun nil (system) "Result = %s( Array, Aludc, Index, B, X)" ("L17.html" ("BACKWARD_ERROR" . 970892) ("DOUBLE" . 970894) ("FORWARD_ERROR" . 970896)))
-    ("LA_LUSOL" fun nil (system) "Result = %s( A, Index, B)" ("L18.html" ("DOUBLE" . 971007)))
-    ("LA_TRIMPROVE" fun nil (system) "Result = %s( AL, A, AU, DAL, DA, DAU, DU2, Index, B, X)" ("L21.html" ("BACKWARD_ERROR" . 971423) ("DOUBLE" . 971425) ("FORWARD_ERROR" . 971427)))
-    ("LA_TRISOL" fun nil (system) "Result = %s( AL, A, AU, U2, Index, B)" ("L24.html" ("DOUBLE" . 971725)))
-    ("LABEL_DATE" fun nil (system) "Result = %s()" ("L25.html" ("AM_PM" . 939222) ("DATE_FORMAT" . 939215) ("DAYS_OF_WEEK" . 939285) ("MONTHS" . 939288) ("OFFSET" . 939291) ("ROUND_UP" . 940951)))
-    ("LABEL_REGION" fun nil (system) "Result = %s( Data)" ("L26.html" ("ALL_NEIGHBORS" . 930484) ("EIGHT" . 828027) ("ULONG" . 677395)))
-    ("LADFIT" fun nil (system) "Result = %s( X, Y)" ("L27.html" ("ABSDEV" . 53730) ("DOUBLE" . 837069)))
-    ("LAGUERRE" fun nil (system) "Result = %s( X, N [, K])" ("L28.html" ("COEFFICIENTS" . 942495) ("DOUBLE" . 942497)))
-    ("LEEFILT" fun nil (system) "Result = %s( A [, N [, Sig]])" ("L29.html" ("DOUBLE" . 939800) ("EXACT" . 833703)))
-    ("LEGENDRE" fun nil (system) "Result = %s( X, L [, M])" ("L30.html" ("DOUBLE" . 942590)))
-    ("LINBCG" fun nil (system) "Result = %s( A, B, X)" ("L31.html" ("DOUBLE" . 50883) ("ITER" . 50896) ("ITMAX" . 50899) ("ITOL" . 50886) ("TOL" . 50893)))
-    ("LINDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("L32.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LINFIT" fun nil (system) "Result = %s( X, Y)" ("L33.html" ("CHISQ" . 53778) ("COVAR" . 940616) ("DOUBLE" . 837073) ("MEASURE_ERRORS" . 53781) ("PROB" . 941301) ("SDEV" . 941420) ("SIGMA" . 941423) ("YFIT" . 941298)))
-    ("LL_ARC_DISTANCE" fun nil (system) "Result = %s( Lon_lat0, Arc_Dist, Az)" ("L35.html" ("DEGREES" . 758227)))
-    ("LMFIT" fun nil (system) "Result = %s( X, Y, A)" ("L36.html" ("ALPHA" . 849263) ("CHISQ" . 831462) ("CONVERGENCE" . 831464) ("COVAR" . 831689) ("DOUBLE" . 831466) ("FITA" . 831077) ("FUNCTION_NAME" . 831083) ("ITER" . 831471) ("ITMAX" . 831092) ("ITMIN" . 831094) ("MEASURE_ERRORS" . 941497) ("SIGMA" . 940586) ("TOL" . 940573) ("WEIGHTS" . 940578)))
-    ("LMGR" fun nil (system) "Result = %s()" ("L37.html" ("CLIENTSERVER" . 879327) ("DEMO" . 856060) ("EMBEDDED" . 856064) ("EXPIRE_DATE" . 932522) ("FORCE_DEMO" . 856072) ("INSTALL_NUM" . 932505) ("LMHOSTID" . 856081) ("RUNTIME" . 856085) ("SITE_NOTICE" . 932539) ("STUDENT" . 856089) ("TRIAL" . 856094) ("VM" . 996553)))
-    ("LNGAMMA" fun nil (system) "Result = %s(Z)" ("L38.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LNP_TEST" fun nil (system) "Result = %s( X, Y)" ("L39.html" ("DOUBLE" . 54544) ("HIFAC" . 941916) ("JMAX" . 54547) ("OFAC" . 54550) ("WK1" . 54553) ("WK2" . 54556)))
-    ("LOCALE_GET" fun nil (system) "Result = %s( )" ("L41.html"))
-    ("LOGICAL_AND" fun nil (system) "Result = %s(Arg1, Arg2)" ("L42.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LOGICAL_OR" fun nil (system) "Result = %s(Arg1, Arg2)" ("L43.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LOGICAL_TRUE" fun nil (system) "Result = %s(Arg)" ("L44.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LON64ARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("L45.html" ("NOZERO" . 918880)))
-    ("LONARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("L46.html" ("NOZERO" . 916558)))
-    ("LONG" fun nil (system) "Result = %s( Expression[, Offset [, D1 [, ..., D8]]] )" ("L47.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LONG64" fun nil (system) "Result = %s( Expression[, Offset [, D1 [, ..., D8]]] )" ("L48.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LSODE" fun nil (system) "Result = %s( Y, X, H, Derivs[, Status])" ("L49.html" ("ATOL" . 904984) ("QUIET" . 1014877) ("RTOL" . 905036)))
-    ("LU_COMPLEX" fun nil (system) "Result = %s( A, B)" ("L50.html" ("DOUBLE" . 750791) ("INVERSE" . 48859) ("SPARSE" . 37275)))
-    ("LUMPROVE" fun nil (system) "Result = %s( A, Alud, Index, B, X)" ("L52.html" ("COLUMN" . 58736) ("DOUBLE" . 51323)))
-    ("LUSOL" fun nil (system) "Result = %s(A, Index, B)" ("L53.html" ("COLUMN" . 58727) ("DOUBLE" . 50997)))
-    ("M_CORRELATE" fun nil (system) "Result = %s( X, Y)" ("M.html" ("DOUBLE" . 956112)))
-    ("MACHAR" fun nil (system) "Result = %s()" ("M2.html" ("DOUBLE" . 928847)))
-    ("MAKE_ARRAY" fun nil (system) "Result = %s ( [D1 [, ..., D8]])" ("M3.html" ("BYTE" . 887432) ("COMPLEX" . 887435) ("DCOMPLEX" . 887438) ("DIMENSION" . 887441) ("DOUBLE" . 887444) ("FLOAT" . 887447) ("INDEX" . 887450) ("INTEGER" . 887453) ("L64" . 916074) ("LONG" . 887456) ("NOZERO" . 887459) ("OBJ" . 887462) ("PTR" . 887465) ("SIZE" . 887468) ("STRING" . 887471) ("TYPE" . 887474) ("UINT" . 918501) ("UL64" . 918504) ("ULONG" . 916082) ("VALUE" . 887480)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("MAP_2POINTS" fun nil (system) "Result = %s( lon0, lat0, lon1, lat1)" ("M5.html" ("DPATH" . 960572) ("METERS" . 960574) ("MILES" . 960576) ("NPATH" . 960578) ("PARAMETERS" . 960581) ("RADIANS" . 960583) ("RADIUS" . 960585) ("RHUMB" . 960587)))
-    ("MAP_IMAGE" fun nil (system) "Result = %s( Image [, Startx, Starty [, Xsize, Ysize]])" ("M8.html" ("BILINEAR" . 903532) ("COMPRESS" . 887760) ("LATMAX" . 887748) ("LATMIN" . 887745) ("LONMAX" . 887754) ("LONMIN" . 887751) ("MAP_STRUCTURE" . 1060029) ("MASK" . 1061279) ("MAX_VALUE" . 887766) ("MIN_VALUE" . 887770) ("MISSING" . 887774) ("SCALE" . 887763)))
-    ("MAP_PATCH" fun nil (system) "Result = %s( Image_Orig [, Lons, Lats])" ("M9.html" ("LAT0" . 958167) ("LAT1" . 887838) ("LON0" . 887841) ("LON1" . 887844) ("MAX_VALUE" . 928019) ("MISSING" . 887847) ("TRIANGULATE" . 887853) ("XSIZE" . 887856) ("XSTART" . 887859) ("YSIZE" . 887862) ("YSTART" . 887865)))
-    ("MAP_PROJ_FORWARD" fun nil (system) "Result = %s(Longitude [, Latitude])" ("M10.html" ("CONNECTIVITY" . 999199) ("FILL" . 999209) ("MAP_STRUCTURE" . 1059849) ("POLYGONS" . 999214) ("POLYLINES" . 999218) ("RADIANS" . 999222)))
-    ("MAP_PROJ_IMAGE" fun nil (system) "Result = %s(Image [, Range])" ("M11.html" ("BILINEAR" . 1062551) ("DIMENSIONS" . 1062553) ("IMAGE_STRUCTURE" . 1062555) ("MAP_STRUCTURE" . 1062557) ("MASK" . 1062562) ("MAX_VALUE" . 1062565) ("MIN_VALUE" . 1062567) ("MISSING" . 1062569) ("UVRANGE" . 1062571)))
-    ("MAP_PROJ_INIT" fun nil (system) "Result = %s(Projection)" ("M13.html" ("CENTER_AZIMUTH" . 999986) ("CENTER_LATITUDE" . 999988) ("CENTER_LONGITUDE" . 999990) ("DATUM" . 999770) ("FALSE_EASTING" . 999992) ("FALSE_NORTHING" . 999994) ("GCTP" . 999952) ("HEIGHT" . 999996) ("HOM_AZIM_ANGLE" . 1000000) ("HOM_AZIM_LONGITUDE" . 999998) ("HOM_LATITUDE1" . 1000002) ("HOM_LATITUDE2" . 1000004) ("HOM_LONGITUDE1" . 1000006) ("HOM_LONGITUDE2" . 1000008) ("IS_JUSTIFY" . 1000012) ("IS_ZONES" . 1000010) ("LIMIT" . 999954) ("MERCATOR_SCALE" . 1000036) ("OEA_ANGLE" . 1000038) ("OEA_SHAPEM" . 1000040) ("OEA_SHAPEN" . 1000042) ("RADIANS" . 999959) ("RELAXED" . 999961) ("ROTATION" . 1000045) ("SAT_TILT" . 1000074) ("SEMIMAJOR_AXIS" . 1000048) ("SEMIMINOR_AXIS" . 1000050) ("SOM_FLAG" . 1000060) ("SOM_INCLINATION" . 1000052) ("SOM_LANDSAT_NUMBER" . 1000062) ("SOM_LANDSAT_PATH" . 1000064) ("SOM_LONGITUDE" . 1000054) ("SOM_PERIOD" . 1000056) ("SOM_RATIO" . 1000058) ("SPHERE_RADIUS" . 1000066) ("STANDARD_PAR1" . 1000070) ("STANDARD_PAR2" . 1000072) ("STANDARD_PARALLEL" . 1000068) ("TRUE_SCALE_LATITUDE" . 1000076) ("ZONE" . 1000078)))
-    ("MAP_PROJ_INVERSE" fun nil (system) "Result = %s (X [, Y])" ("M14.html" ("MAP_STRUCTURE" . 1000165) ("RADIANS" . 1000170)))
-    ("MATRIX_MULTIPLY" fun nil (system) "Result = %s( A, B)" ("M16.html" ("ATRANSPOSE" . 960661) ("BTRANSPOSE" . 960663)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("MATRIX_POWER" fun nil (system) "Result = %s(Array, N)" ("M17.html" ("DOUBLE" . 1000204) ("STATUS" . 1000207)))
-    ("MAX" fun nil (system) "Result = %s( Array [, Max_Subscript])" ("M18.html" ("ABSOLUTE" . 1047888) ("DIMENSION" . 888204) ("MIN" . 963501) ("NAN" . 888207) ("SUBSCRIPT_MIN" . 929038)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("MD_TEST" fun nil (system) "Result = %s( X)" ("M19.html" ("ABOVE" . 888251) ("BELOW" . 888254) ("MDC" . 888257)))
-    ("MEAN" fun nil (system) "Result = %s( X)" ("M20.html" ("DOUBLE" . 888313) ("NAN" . 888316)))
-    ("MEANABSDEV" fun nil (system) "Result = %s( X)" ("M21.html" ("DOUBLE" . 888362) ("MEDIAN" . 888365) ("NAN" . 888368)))
-    ("MEDIAN" fun nil (system) "Result = %s ( Array [, Width])" ("M22.html" ("DIMENSION" . 978207) ("DOUBLE" . 1047845) ("EVEN" . 978204)))
-    ("MEMORY" fun nil (system) "Result = %s()" ("M23.html" ("CURRENT" . 960747) ("HIGHWATER" . 960749) ("L64" . 960751) ("NUM_ALLOC" . 960754) ("NUM_FREE" . 960756) ("STRUCTURE" . 960758)))
-    ("MESH_CLIP" fun nil (system) "Result = %s (Plane, Vertsin, Connin, Vertsout, Connout)" ("M24.html" ("AUXDATA_IN" . 948402) ("AUXDATA_OUT" . 948404) ("CUT_VERTS" . 948406)))
-    ("MESH_DECIMATE" fun nil (system) "Result = %s (Verts, Conn, Connout)" ("M25.html" ("PERCENT_POLYGONS" . 948433) ("PERCENT_VERTICES" . 948431) ("PROGRESS_CALLBACK" . 1051741) ("PROGRESS_METHOD" . 1020618) ("PROGRESS_OBJECT" . 1020641) ("PROGRESS_PERCENT" . 1020654) ("PROGRESS_USERDATA" . 1020660) ("VERTICES" . 1020667)))
-    ("MESH_ISSOLID" fun nil (system) "Result = %s (Conn)" ("M26.html"))
-    ("MESH_MERGE" fun nil (system) "Result = %s (Verts, Conn, Verts1, Conn1)" ("M27.html" ("COMBINE_VERTICES" . 948474) ("TOLERANCE" . 948480)))
-    ("MESH_NUMTRIANGLES" fun nil (system) "Result = %s (Conn)" ("M28.html"))
-    ("MESH_SMOOTH" fun nil (system) "Result = %s (Verts, Conn)" ("M30.html" ("FIXED_EDGE_VERTICES" . 948537) ("FIXED_VERTICES" . 948535) ("ITERATIONS" . 948533) ("LAMBDA" . 948539)))
-    ("MESH_SURFACEAREA" fun nil (system) "Result = %s ( Verts, Conn)" ("M31.html" ("AUXDATA" . 948575) ("MOMENT" . 948577)))
-    ("MESH_VALIDATE" fun nil (system) "Result = %s ( Verts, Conn)" ("M32.html" ("COMBINE_VERTICES" . 948607) ("PACK_VERTICES" . 949513) ("REMOVE_NAN" . 948611) ("TOLERANCE" . 948613)))
-    ("MESH_VOLUME" fun nil (system) "Result = %s ( Verts, Conn)" ("M33.html" ("SIGNED" . 948632)))
-    ("MIN" fun nil (system) "Result = %s( Array [, Min_Subscript])" ("M35.html" ("ABSOLUTE" . 1047943) ("DIMENSION" . 965599) ("MAX" . 963567) ("NAN" . 888740) ("SUBSCRIPT_MAX" . 965815)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("MIN_CURVE_SURF" fun nil (system) "Result = %s(Z [, X, Y])" ("M36.html" ("BOUNDS" . 888798) ("CONST" . 956696) ("DOUBLE" . 929725) ("GS" . 888796) ("NX" . 888800) ("NY" . 888802) ("REGULAR" . 888785) ("SPHERE" . 956689) ("TPS" . 888782) ("XGRID" . 888787) ("XOUT" . 888804) ("XPOUT" . 888808) ("XVALUES" . 888789) ("YGRID" . 888791) ("YOUT" . 888806) ("YPOUT" . 888808) ("YVALUES" . 888793)))
-    ("MOMENT" fun nil (system) "Result = %s( X)" ("M39.html" ("DOUBLE" . 888958) ("MDEV" . 888961) ("NAN" . 888964) ("SDEV" . 888970)))
-    ("MORPH_CLOSE" fun nil (system) "Result = %s (Image, Structure)" ("M40.html" ("GRAY" . 948649) ("PRESERVE_TYPE" . 948651) ("UINT" . 948653) ("ULONG" . 948655) ("VALUES" . 948657)))
-    ("MORPH_DISTANCE" fun nil (system) "Result = %s (Data)" ("M41.html" ("BACKGROUND" . 948898) ("NEIGHBOR_SAMPLING" . 948900) ("NO_COPY" . 948943)))
-    ("MORPH_GRADIENT" fun nil (system) "Result = %s (Image, Structure)" ("M42.html" ("PRESERVE_TYPE" . 948983) ("UINT" . 948985) ("ULONG" . 948987) ("VALUES" . 948989)))
-    ("MORPH_HITORMISS" fun nil (system) "Result = %s (Image, HitStructure, MissStructure)" ("M43.html"))
-    ("MORPH_OPEN" fun nil (system) "Result = %s (Image, Structure)" ("M44.html" ("GRAY" . 949085) ("PRESERVE_TYPE" . 949087) ("UINT" . 949089) ("ULONG" . 949091) ("VALUES" . 949093)))
-    ("MORPH_THIN" fun nil (system) "Result = %s ( Image, HitStructure, MissStructure )" ("M45.html"))
-    ("MORPH_TOPHAT" fun nil (system) "Result = %s ( Image, Structure)" ("M46.html" ("PRESERVE_TYPE" . 949148) ("UINT" . 949150) ("ULONG" . 949152) ("VALUES" . 949154)))
-    ("MPEG_OPEN" fun nil (system) "mpegID = %s( Dimensions)" ("M48.html" ("BITRATE" . 958969) ("FILENAME" . 958930) ("IFRAME_GAP" . 958935) ("MOTION_VEC_LENGTH" . 958939) ("QUALITY" . 958887)))
-    ("N_ELEMENTS" fun nil (system) "Result = %s(Expression)" ("N.html"))
-    ("N_PARAMS" fun nil (system) "Result = %s()" ("N2.html"))
-    ("N_TAGS" fun nil (system) "Result = %s( Expression)" ("N3.html" ("DATA_LENGTH" . 889267) ("LENGTH" . 928988)))
-    ("NCDF_ATTCOPY" fun nil (system) "Result = %s( Incdf [, Invar])" ("NetCDF-routines11.html" ("IN_GLOBAL" . 996938) ("OUT_GLOBAL" . 996942)))
-    ("NCDF_ATTINQ" fun nil (system) "Result = %s( Cdfid [, Varid])" ("NetCDF-routines14.html" ("GLOBAL" . 997032)))
-    ("NCDF_ATTNAME" fun nil (system) "Result = %s( Cdfid [, Varid])" ("NetCDF-routines15.html" ("GLOBAL" . 997094)))
-    ("NCDF_CREATE" fun nil (system) "Result = %s( Filename)" ("NetCDF-routines20.html" ("CLOBBER" . 997292) ("NOCLOBBER" . 997295)))
-    ("NCDF_DIMDEF" fun nil (system) "Result = %s( Cdfid, DimName, Size)" ("NetCDF-routines21.html" ("UNLIMITED" . 997333)))
-    ("NCDF_DIMID" fun nil (system) "Result = %s( Cdfid, DimName )" ("NetCDF-routines22.html"))
-    ("NCDF_EXISTS" fun nil (system) "Result = %s( )" ("NetCDF-routines25.html"))
-    ("NCDF_INQUIRE" fun nil (system) "Result = %s(Cdfid)" ("NetCDF-routines26.html"))
-    ("NCDF_OPEN" fun nil (system) "Result = %s( Filename)" ("NetCDF-routines27.html" ("NOWRITE" . 997434) ("WRITE" . 997437)))
-    ("NCDF_VARDEF" fun nil (system) "Result = %s( Cdfid, Name [, Dim])" ("NetCDF-routines28.html" ("BYTE" . 997458) ("CHAR" . 997461) ("DOUBLE" . 997464) ("FLOAT" . 997467) ("LONG" . 997470) ("SHORT" . 997473)))
-    ("NCDF_VARID" fun nil (system) "Result = %s(Cdfid, Name)" ("NetCDF-routines31.html"))
-    ("NCDF_VARINQ" fun nil (system) "Result = %s(Cdfid, Varid)" ("NetCDF-routines32.html"))
-    ("NEWTON" fun nil (system) "Result = %s( X, Vecfunc)" ("N5.html" ("CHECK" . 889318) ("DOUBLE" . 889321) ("ITMAX" . 928608) ("STEPMAX" . 889327) ("TOLF" . 889330) ("TOLMIN" . 889334) ("TOLX" . 889337)))
-    ("NORM" fun nil (system) "Result = %s( A)" ("N6.html" ("DOUBLE" . 889381) ("LNORM" . 929047)))
-    ("OBJ" fun nil (system) "Result = %s->[IDLitManipulatorManager::][IDLitManipulatorManager::]->GetDefaultManipulator()" ("objects_it125.html" ("REFERENCE" . 1004397)))
-    ("OBJ_CLASS" fun nil (system) "Result = %s( [Arg])" ("O.html" ("COUNT" . 889415) ("SUPERCLASS" . 889418)))
-    ("OBJ_ISA" fun nil (system) "Result = %s(ObjectInstance, ClassName)" ("O3.html"))
-    ("OBJ_NEW" fun nil (system) "Result = %s( [ObjectClassName [, Arg1......Argn]] )" ("O4.html"))
-    ("OBJ_VALID" fun nil (system) "Result = %s( [Arg])" ("O5.html" ("CAST" . 889505) ("COUNT" . 889508)))
-    ("OBJARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("O6.html" ("NOZERO" . 889547)))
-    ("P_CORRELATE" fun nil (system) "Result = %s( X, Y, C)" ("P.html" ("DOUBLE" . 1073021)))
-    ("PATH_SEP" fun nil (system) "Result = %s()" ("P4.html" ("PARENT_DIRECTORY" . 1076856) ("SEARCH_PATH" . 1076858)))
-    ("PCOMP" fun nil (system) "Result = %s( A)" ("P5.html" ("COEFFICIENTS" . 844766) ("COVARIANCE" . 844768) ("DOUBLE" . 844770) ("EIGENVALUES" . 844772) ("NVARIABLES" . 844774) ("STANDARDIZE" . 844776) ("VARIANCES" . 844778)))
-    ("PNT_LINE" fun nil (system) "Result = %s( P0, L0, L1 [, Pl])" ("P11.html" ("INTERVAL" . 758337)))
-    ("POLAR_SURFACE" fun nil (system) "Result = %s( Z, R, Theta)" ("P14.html" ("BOUNDS" . 753641) ("GRID" . 753637) ("MISSING" . 753645) ("QUINTIC" . 753643) ("SPACING" . 753639)))
-    ("POLY" fun nil (system) "Result = %s(X, C)" ("P15.html"))
-    ("POLY_2D" fun nil (system) "Result = %s( Array, P, Q [, Interp [, Dimx, Dimy]])" ("P16.html" ("CUBIC" . 678217) ("MISSING" . 680892)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("POLY_AREA" fun nil (system) "Result = %s( X, Y)" ("P17.html" ("DOUBLE" . 1074988) ("SIGNED" . 1074986)))
-    ("POLY_FIT" fun nil (system) "Result = %s( X, Y, Degree)" ("P18.html" ("CHISQ" . 1073859) ("COVAR" . 1073862) ("DOUBLE" . 837040) ("MEASURE_ERRORS" . 1074498) ("SIGMA" . 1074050) ("STATUS" . 1073417) ("YBAND" . 1074058) ("YERROR" . 1074060) ("YFIT" . 1074062)))
-    ("POLYFILLV" fun nil (system) "Result = %s( X, Y, Sx, Sy [, Run_Length] )" ("P20.html"))
-    ("POLYSHADE" fun nil (system) "Result = %s( Vertices, Polygons) or Result = %s(X, Y, Z, Polygons)" ("P21.html" ("DATA" . 678323) ("NORMAL" . 678325) ("POLY_SHADES" . 678327) ("SHADES" . 678329) ("T3D" . 678331) ("TOP" . 678333) ("XSIZE" . 678335) ("YSIZE" . 678338)))
-    ("PRIMES" fun nil (system) "Result = %s(K)" ("P25.html"))
-    ("PRODUCT" fun nil (system) "Result = %s(Array [, Dimension])" ("P29.html" ("CUMULATIVE" . 1088999) ("INTEGER" . 1111663) ("NAN" . 1089001) ("PRESERVE_TYPE" . 1112722)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("PROFILE" fun nil (system) "Result = %s( Image [, XX, YY])" ("P30.html" ("NOMARK" . 757684) ("XSTART" . 757687) ("YSTART" . 757690)))
-    ("PROJECT_VOL" fun nil (system) "Result = %s( Vol, X_Sample, Y_Sample, Z_Sample)" ("P33.html" ("AVG_INTENSITY" . 786865) ("CUBIC" . 1105686) ("DEPTH_Q" . 1105735) ("OPAQUE" . 786868) ("TRANS" . 786871) ("XSIZE" . 1105761) ("YSIZE" . 1105822) ("Z_BUFFER" . 1105820)))
-    ("PTR_NEW" fun nil (system) "Result = %s( [InitExpr])" ("P38.html" ("ALLOCATE_HEAP" . 845063) ("NO_COPY" . 845065)))
-    ("PTR_VALID" fun nil (system) "Result = %s( [Arg])" ("P39.html" ("CAST" . 863586) ("COUNT" . 863622)))
-    ("PTRARR" fun nil (system) "Result = %s( D1, ... ..., D8)" ("P40.html" ("ALLOCATE_HEAP" . 845095) ("NOZERO" . 845097)))
-    ("QGRID3" fun nil (system) "Result = %s( XYZ, F, Tetrahedra)" ("Q.html" ("DELTA" . 1073303) ("DIMENSION" . 1073305) ("MISSING" . 1073307) ("START" . 1073309)))
-    ("QROMB" fun nil (system) "Result = %s( Func, A, B)" ("Q3.html" ("DOUBLE" . 51533) ("EPS" . 51536) ("JMAX" . 51539) ("K" . 51542)))
-    ("QROMO" fun nil (system) "Result = %s(Func, A [, B])" ("Q4.html" ("DOUBLE" . 51594) ("EPS" . 51597) ("JMAX" . 51600) ("K" . 51603) ("MIDEXP" . 51606) ("MIDINF" . 51609) ("MIDPNT" . 51612) ("MIDSQL" . 51615) ("MIDSQU" . 51618)))
-    ("QSIMP" fun nil (system) "Result = %s( Func, A, B)" ("Q5.html" ("DOUBLE" . 51671) ("EPS" . 51674) ("JMAX" . 51677)))
-    ("QUERY_BMP" fun nil (system) "Result = %s ( Filename [, Info] )" ("Q7.html"))
-    ("QUERY_DICOM" fun nil (system) "Result = %s( Filename [, Info])" ("Q8.html" ("IMAGE_INDEX" . 1045358)))
-    ("QUERY_GIF" fun nil (system) "Result = %s ( Filename [, Info] )" ("Q9.html"))
-    ("QUERY_IMAGE" fun nil (system) "Result = %s ( Filename[, Info])" ("Q10.html" ("CHANNELS" . 1070109) ("DIMENSIONS" . 1070111) ("HAS_PALETTE" . 1070113) ("IMAGE_INDEX" . 1070115) ("NUM_IMAGES" . 1070117) ("PIXEL_TYPE" . 1070119) ("SUPPORTED_READ" . 1070131) ("SUPPORTED_WRITE" . 1070133) ("TYPE" . 1104573)))
-    ("QUERY_JPEG" fun nil (system) "Result = %s ( Filename [, Info] )" ("Q11.html"))
-    ("QUERY_JPEG2000" fun nil (system) "Result = %s(Filename [, Info] )" ("Q12.html"))
-    ("QUERY_MRSID" fun nil (system) "Result = %s( Filename [, Info])" ("Q13.html" ("LEVEL" . 1073601)))
-    ("QUERY_PICT" fun nil (system) "Result = %s ( Filename [, Info] )" ("Q14.html"))
-    ("QUERY_PNG" fun nil (system) "Result = %s ( Filename [, Info] )" ("Q15.html"))
-    ("QUERY_PPM" fun nil (system) "Result = %s ( Filename [, Info])" ("Q16.html" ("MAXVAL" . 1045715)))
-    ("QUERY_SRF" fun nil (system) "Result = %s (Filename [, Info] )" ("Q17.html"))
-    ("QUERY_TIFF" fun nil (system) "Result = %s ( Filename [, Info])" ("Q18.html" ("GEOTIFF" . 1091493) ("IMAGE_INDEX" . 1045788)))
-    ("QUERY_WAV" fun nil (system) "Result = %s ( Filename[, Info] )" ("Q19.html"))
-    ("R_CORRELATE" fun nil (system) "Result = %s( X, Y)" ("R.html" ("D" . 54014) ("KENDALL" . 54017) ("PROBD" . 54020) ("ZD" . 54023)))
-    ("R_TEST" fun nil (system) "Result = %s( X)" ("R2.html" ("N0" . 54060) ("N1" . 54063) ("R" . 54066)))
-    ("RADON" fun nil (system) "Result = %s( Array)" ("R3.html" ("BACKPROJECT" . 1081929) ("DOUBLE" . 1081932) ("DRHO" . 1081934) ("DX" . 1081936) ("DY" . 1081938) ("GRAY" . 1081940) ("LINEAR" . 1081942) ("NRHO" . 1081944) ("NTHETA" . 1081946) ("NX" . 1081948) ("NY" . 1081950) ("RHO" . 1081952) ("RMIN" . 1081954) ("THETA" . 1081956) ("XMIN" . 1081958) ("YMIN" . 1081960)))
-    ("RANDOMN" fun nil (system) "Result = %s( Seed [, D1 [, ..., D8]])" ("R4.html" ("BINOMIAL" . 867947) ("DOUBLE" . 867736) ("GAMMA" . 1080709) ("LONG" . 1080819) ("NORMAL" . 867741) ("POISSON" . 867743) ("UNIFORM" . 867744)))
-    ("RANDOMU" fun nil (system) "Result = %s( Seed [, D1 [, ..., D8]])" ("R5.html" ("BINOMIAL" . 868252) ("DOUBLE" . 1080874) ("GAMMA" . 868213) ("LONG" . 1080854) ("NORMAL" . 868216) ("POISSON" . 868219) ("UNIFORM" . 868222)))
-    ("RANKS" fun nil (system) "Result = %s(X)" ("R6.html"))
-    ("READ_ASCII" fun nil (system) "Result = %s( [Filename])" ("R9.html" ("COMMENT_SYMBOL" . 864824) ("COUNT" . 864541) ("DATA_START" . 864606) ("DELIMITER" . 865250) ("HEADER" . 865253) ("MISSING_VALUE" . 864515) ("NUM_RECORDS" . 864373) ("RECORD_START" . 678426) ("TEMPLATE" . 863940) ("VERBOSE" . 863965)))
-    ("READ_BINARY" fun nil (system) "Result = %s ([Filename] | FileUnit)" ("R10.html" ("DATA_DIMS" . 1071927) ("DATA_START" . 1071929) ("DATA_TYPE" . 1071931) ("ENDIAN" . 1071933) ("TEMPLATE" . 1071937)))
-    ("READ_BMP" fun nil (system) "Result = %s( Filename, [, R, G, B] [, Ihdr])" ("R11.html" ("RGB" . 867600)))
-    ("READ_DICOM" fun nil (system) "Result = %s (Filename [, Red, Green, Blue])" ("R12.html" ("IMAGE_INDEX" . 1045423)))
-    ("READ_IMAGE" fun nil (system) "Result = %s (Filename [, Red, Green, Blue])" ("R14.html" ("IMAGE_INDEX" . 1071963)))
-    ("READ_JPEG2000" fun nil (system) "Result = %s(Filename [, Red, Green, Blue])" ("R17.html" ("DISCARD_LEVELS" . 1171494) ("MAX_LAYERS" . 1171497) ("ORDER" . 1171500) ("REGION" . 1171503)))
-    ("READ_MRSID" fun nil (system) "Result = %s ( Filename)" ("R18.html" ("LEVEL" . 1086317) ("SUB_RECT" . 1086319)))
-    ("READ_PNG" fun nil (system) "Result = %s ( Filename [, R, G, B])" ("R20.html" ("ORDER" . 1045842) ("TRANSPARENT" . 1045845) ("VERBOSE" . 1075225)))
-    ("READ_SPR" fun nil (system) "Result = %s(Filename)" ("R22.html"))
-    ("READ_SYLK" fun nil (system) "Result = %s( File)" ("R24.html" ("ARRAY" . 67837) ("COLMAJOR" . 67840) ("NCOLS" . 67844) ("NROWS" . 67847) ("STARTCOL" . 67850) ("STARTROW" . 67853) ("USEDOUBLES" . 67856) ("USELONGS" . 67859)))
-    ("READ_TIFF" fun nil (system) "Result = %s( Filename [, R, G, B])" ("R25.html" ("CHANNELS" . 1078044) ("DOT_RANGE" . 1134312) ("GEOTIFF" . 966463) ("ICC_PROFILE" . 1134317) ("IMAGE_INDEX" . 966504) ("INTERLEAVE" . 1077871) ("ORIENTATION" . 948922) ("PHOTOSHOP" . 1134329) ("PLANARCONFIG" . 1086578) ("SUB_RECT" . 966525) ("VERBOSE" . 966492)))
-    ("READ_WAV" fun nil (system) "Result = %s ( Filename [, Rate] )" ("R26.html"))
-    ("READ_XWD" fun nil (system) "Result = %s( Filename[, R, G, B] )" ("R29.html"))
-    ("REAL_PART" fun nil (system) "Result = %s(Z)" ("R32.html"))
-    ("REBIN" fun nil (system) "Result = %s( Array, D1 [, ..., D8])" ("R33.html" ("SAMPLE" . 678500)))
-    ("RECALL_COMMANDS" fun nil (system) "Result = %s()" ("R34.html"))
-    ("RECON3" fun nil (system) "Result = %s( Images, Obj_Rot, Obj_Pos, Focal, Dist,Vol_Pos, Img_Ref, Img_Mag, Vol_Size)" ("R35.html" ("CUBIC" . 1079063) ("MISSING" . 787003) ("MODE" . 787006) ("QUIET" . 1086709)))
-    ("REFORM" fun nil (system) "Result = %s( Array, D1 [, ..., D8])" ("R37.html" ("OVERWRITE" . 678529)))
-    ("REGION_GROW" fun nil (system) "Result = %s(Array, ROIPixels)" ("R38.html" ("ALL_NEIGHBORS" . 1086463) ("NAN" . 1168470) ("STDDEV_MULTIPLIER" . 1086465) ("THRESHOLD" . 1086469)))
-    ("REGRESS" fun nil (system) "Result = %s( X, Y)" ("R40.html" ("CHISQ" . 1078522) ("CONST" . 1078527) ("CORRELATION" . 1078530) ("DOUBLE" . 1078533) ("FTEST" . 1078535) ("MCORRELATION" . 1078538) ("MEASURE_ERRORS" . 1080427) ("RELATIVE_WEIGHT" . 1080465) ("SIGMA" . 1080460) ("STATUS" . 1078543) ("YFIT" . 1078803)))
-    ("REPLICATE" fun nil (system) "Result = %s( Value, D1 [, ..., D8] )" ("R42.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("REVERSE" fun nil (system) "Result = %s( Array [, Subscript_Index])" ("R49.html" ("OVERWRITE" . 1077839)))
-    ("RK4" fun nil (system) "Result = %s( Y, Dydx, X, H, Derivs)" ("R50.html" ("DOUBLE" . 51771)))
-    ("ROBERTS" fun nil (system) "Result = %s(Image)" ("R51.html"))
-    ("ROT" fun nil (system) "Result = %s( A, Angle, [Mag, X0, Y0])" ("R52.html" ("CUBIC" . 758912) ("INTERP" . 758909) ("MISSING" . 758915) ("PIVOT" . 758918)))
-    ("ROTATE" fun nil (system) "Result = %s(Array, Direction)" ("R53.html"))
-    ("ROUND" fun nil (system) "Result = %s(X)" ("R54.html" ("L64" . 1073244)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ROUTINE_INFO" fun nil (system) "Result = %s( [Routine])" ("R55.html" ("DISABLED" . 1068792) ("ENABLED" . 1068823) ("FUNCTIONS" . 1068790) ("PARAMETERS" . 845189) ("SOURCE" . 845200) ("SYSTEM" . 845207) ("UNRESOLVED" . 845209) ("VARIABLES" . 845211)))
-    ("RS_TEST" fun nil (system) "Result = %s( X, Y)" ("R56.html" ("UX" . 54144) ("UY" . 54147)))
-    ("S_TEST" fun nil (system) "Result = %s( X, Y)" ("S.html" ("ZDIFF" . 54194)))
-    ("SAVGOL" fun nil (system) "Result = %s( Nleft, Nright, Order, Degree)" ("S3.html" ("DOUBLE" . 1098051)))
-    ("SCOPE_LEVEL" fun nil (system) "Result = %s()" ("S6.html"))
-    ("SCOPE_VARFETCH" fun nil (system) "Result = %s(VarName)" ("S7.html" ("COMMON" . 1215122) ("ENTER" . 1215135) ("LEVEL" . 1215145) ("REF_EXTRA" . 1215173)))
-    ("SCOPE_VARNAME" fun nil (system) "Result = %s( [Var1[, ..., Varn]])" ("S8.html" ("COMMON" . 1215382) ("COUNT" . 1215393) ("LEVEL" . 1215399)))
-    ("SEARCH2D" fun nil (system) "Result = %s( Array, Xpos, Ypos, Min_Val, Max_Val)" ("S9.html" ("DECREASE" . 758963) ("DIAGONAL" . 758972) ("INCREASE" . 758966) ("LPF_BAND" . 758969)))
-    ("SEARCH3D" fun nil (system) "Result = %s( Array, Xpos, Ypos, Zpos, Min_Val, Max_Val)" ("S10.html" ("DECREASE" . 759017) ("DIAGONAL" . 759026) ("INCREASE" . 759020) ("LPF_BAND" . 759023)))
-    ("SFIT" fun nil (system) "Result = %s( Data, Degree)" ("S15.html" ("IRREGULAR" . 1198892) ("KX" . 1199079) ("MAX_DEGREE" . 1198955)))
-    ("SHIFT" fun nil (system) "Result = %s(Array, S1, ..., Sn)" ("S19.html"))
-    ("SHMDEBUG" fun nil (system) "Result = %s(Enable)" ("S20.html"))
-    ("SHMVAR" fun nil (system) "Result = %s(SegmentName [, D1, ..., D8])" ("S23.html" ("BYTE" . 1143650) ("COMPLEX" . 1143652) ("DCOMPLEX" . 1143654) ("DIMENSION" . 1143656) ("DOUBLE" . 1143658) ("FLOAT" . 1143660) ("INTEGER" . 1143662) ("L64" . 1143664) ("LONG" . 1143666) ("SIZE" . 1143668) ("TEMPLATE" . 1143673) ("TYPE" . 1143675) ("UINT" . 1143680) ("UL64" . 1143684) ("ULONG" . 1143682)))
-    ("SIMPLEX" fun nil (system) "Result = %s( Zequation, Constraints, M1, M2, M3 [, Tableau [, Izrov [, Iposv]]])" ("S26.html" ("DOUBLE" . 1103779) ("EPS" . 1103781) ("STATUS" . 1103783)))
-    ("SIN" fun nil (system) "Result = %s(X)" ("S27.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("SINDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("S28.html"))
-    ("SINH" fun nil (system) "Result = %s(X)" ("S29.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("SIZE" fun nil (system) "Result = %s( Expression)" ("S30.html" ("DIMENSIONS" . 901281) ("FILE_LUN" . 901288) ("FILE_OFFSET" . 1199822) ("L64" . 1082592) ("N_DIMENSIONS" . 1082662) ("N_ELEMENTS" . 901298) ("SNAME" . 1199867) ("STRUCTURE" . 901301) ("TNAME" . 901328) ("TYPE" . 901331)))
-    ("SKEWNESS" fun nil (system) "Result = %s( X)" ("S31.html" ("DOUBLE" . 901912) ("NAN" . 903224)))
-    ("SMOOTH" fun nil (system) "Result = %s( Array, Width)" ("S35.html" ("EDGE_TRUNCATE" . 113915) ("MISSING" . 1101098) ("NAN" . 1101095)))
-    ("SOBEL" fun nil (system) "Result = %s(Image)" ("S36.html"))
-    ("SORT" fun nil (system) "Result = %s(Array)" ("S38.html" ("L64" . 1082892)))
-    ("SPH_SCAT" fun nil (system) "Result = %s( Lon, Lat, F)" ("S41.html" ("BOUNDS" . 126851) ("BOUT" . 126868) ("GOUT" . 126871) ("GS" . 126862) ("NLAT" . 126875) ("NLON" . 126858)))
-    ("SPHER_HARM" fun nil (system) "Result = %s( Theta, Phi, L, M)" ("S42.html" ("DOUBLE" . 1098257)))
-    ("SPL_INIT" fun nil (system) "Result = %s( X, Y)" ("S43.html" ("DOUBLE" . 51818) ("YP0" . 51822) ("YPN_1" . 1095878)))
-    ("SPL_INTERP" fun nil (system) "Result = %s( X, Y, Y2, X2)" ("S44.html" ("DOUBLE" . 51859)))
-    ("SPLINE" fun nil (system) "Result = %s( X, Y, T [, Sigma])" ("S45.html" ("DOUBLE" . 1134574)))
-    ("SPRSAB" fun nil (system) "Result = %s( A, B)" ("S47.html" ("DOUBLE" . 51917) ("THRESHOLD" . 51920)))
-    ("SPRSAX" fun nil (system) "Result = %s( A, X)" ("S48.html" ("DOUBLE" . 51985)))
-    ("SPRSIN" fun nil (system) "Result = %s( A)" ("S49.html" ("COLUMN" . 58754) ("DOUBLE" . 52033) ("THRESHOLD" . 52036)))
-    ("SPRSTP" fun nil (system) "Result = %s(A)" ("S50.html"))
-    ("SQRT" fun nil (system) "Result = %s(X)" ("S51.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("STANDARDIZE" fun nil (system) "Result = %s( A)" ("S52.html" ("DOUBLE" . 844918)))
-    ("STDDEV" fun nil (system) "Result = %s( X)" ("S53.html" ("DOUBLE" . 901885) ("NAN" . 903234)))
-    ("STRARR" fun nil (system) "Result = %s(D1 [, ..., D8])" ("S55.html"))
-    ("STRCMP" fun nil (system) "Result = %s( String1, String2 [, N])" ("S56.html" ("FOLD_CASE" . 1069071)))
-    ("STRCOMPRESS" fun nil (system) "Result = %s( String)" ("S57.html" ("REMOVE_ALL" . 679044)))
-    ("STREGEX" fun nil (system) "Result = %s( StringExpression, RegularExpression)" ("S59.html" ("BOOLEAN" . 1069164) ("EXTRACT" . 1069170) ("FOLD_CASE" . 1069177) ("LENGTH" . 1069182) ("SUBEXPR" . 1069190)))
-    ("STRING" fun nil (system) "Result = %s( Expression1, ..., Expressionn)" ("S61.html" ("AM_PM" . 1015738) ("DAYS_OF_WEEK" . 1015740) ("FORMAT" . 1015736) ("MONTHS" . 1015759) ("PRINT" . 679063)))
-    ("STRJOIN" fun nil (system) "Result = %s( String [, Delimiter])" ("S62.html" ("SINGLE" . 1070986)))
-    ("STRLEN" fun nil (system) "Result = %s(Expression)" ("S63.html"))
-    ("STRLOWCASE" fun nil (system) "Result = %s(String)" ("S64.html"))
-    ("STRMATCH" fun nil (system) "Result = %s( String, SearchString)" ("S65.html" ("FOLD_CASE" . 1071246)))
-    ("STRMESSAGE" fun nil (system) "Result = %s( Err)" ("S66.html" ("BLOCK" . 923971) ("CODE" . 923974) ("NAME" . 923979)))
-    ("STRMID" fun nil (system) "Result = %s(Expression, First_Character [, Length])" ("S67.html" ("REVERSE_OFFSET" . 1074174)))
-    ("STRPOS" fun nil (system) "Result = %s( Expression, Search_String [, Pos])" ("S68.html" ("REVERSE_OFFSET" . 1074185) ("REVERSE_SEARCH" . 1074254)))
-    ("STRSPLIT" fun nil (system) "Result = %s( String [, Pattern])" ("S70.html" ("COUNT" . 1071730) ("ESCAPE" . 1153687) ("EXTRACT" . 1071749) ("FOLD_CASE" . 1071757) ("LENGTH" . 1071761) ("PRESERVE_NULL" . 1071767) ("REGEX" . 1071772)))
-    ("STRTRIM" fun nil (system) "Result = %s( String [, Flag] )" ("S71.html"))
-    ("STRUPCASE" fun nil (system) "Result = %s(String)" ("S74.html"))
-    ("SVDFIT" fun nil (system) "Result = %s( X, Y [, M])" ("S78.html" ("A" . 845481) ("CHISQ" . 845501) ("COVAR" . 845503) ("DOUBLE" . 845488) ("FUNCTION_NAME" . 754160) ("LEGENDRE" . 1093586) ("MEASURE_ERRORS" . 1094756) ("SIGMA" . 1093549) ("SING_VALUES" . 1144017) ("SINGULAR" . 845513) ("STATUS" . 1143910) ("TOL" . 1144024) ("VARIANCE" . 845515) ("WEIGHTS" . 1093555) ("YFIT" . 754165)))
-    ("SVSOL" fun nil (system) "Result = %s( U, W, V, B)" ("S79.html" ("COLUMN" . 58776) ("DOUBLE" . 52150)))
-    ("SWAP_ENDIAN" fun nil (system) "Result = %s(Variable)" ("S80.html" ("SWAP_IF_BIG_ENDIAN" . 1110629) ("SWAP_IF_LITTLE_ENDIAN" . 1110632)))
-    ("SYSTIME" fun nil (system) "String = %s( [0 [, ElaspedSeconds]])" ("S83.html" ("JULIAN" . 1015505) ("SECONDS" . 1015507) ("UTC" . 1083080)))
-    ("T_CVF" fun nil (system) "Result = %s(P, Df)" ("T.html"))
-    ("T_PDF" fun nil (system) "Result = %s(V, Df)" ("T2.html"))
-    ("TAG_NAMES" fun nil (system) "Result = %s( Expression)" ("T4.html" ("STRUCTURE_NAME" . 679363)))
-    ("TAN" fun nil (system) "Result = %s(X)" ("T5.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("TANH" fun nil (system) "Result = %s(X)" ("T6.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("TEMPORARY" fun nil (system) "Result = %s(Variable)" ("T8.html"))
-    ("TETRA_CLIP" fun nil (system) "Result = %s ( Plane, Vertsin, Connin, Vertsout, Connout)" ("T9.html" ("AUXDATA_IN" . 1071827) ("AUXDATA_OUT" . 1071829) ("CUT_VERTS" . 1071831)))
-    ("TETRA_SURFACE" fun nil (system) "Result = %s (Verts, Connin)" ("T10.html"))
-    ("TETRA_VOLUME" fun nil (system) "Result = %s ( Verts, Conn)" ("T11.html" ("AUXDATA" . 1071864) ("MOMENT" . 1071866)))
-    ("THIN" fun nil (system) "Result = %s( Image)" ("T12.html" ("NEIGHBOR_COUNT" . 1069698) ("PRUNE" . 1069716)))
-    ("TIMEGEN" fun nil (system) "Result = %s( [D1,...,D8])" ("T15.html" ("DAYS" . 1077148) ("FINAL" . 1077151) ("HOURS" . 1077154) ("MINUTES" . 1077156) ("MONTHS" . 1077158) ("SECONDS" . 1077160) ("START" . 1077162) ("STEP_SIZE" . 1077166) ("UNITS" . 1077168) ("YEAR" . 1077211)))
-    ("TM_TEST" fun nil (system) "Result = %s( X, Y)" ("T16.html" ("PAIRED" . 54299) ("UNEQUAL" . 54302)))
-    ("TOTAL" fun nil (system) "Result = %s( Array [, Dimension])" ("T17.html" ("CUMULATIVE" . 1070565) ("DOUBLE" . 1070569) ("INTEGER" . 1115757) ("NAN" . 47220) ("PRESERVE_TYPE" . 1116699)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("TRACE" fun nil (system) "Result = %s( A)" ("T18.html" ("DOUBLE" . 845005)))
-    ("TRANSPOSE" fun nil (system) "Result = %s( Array [, P] )" ("T19.html"))
-    ("TRI_SURF" fun nil (system) "Result = %s( Z [, X, Y])" ("T20.html" ("BOUNDS" . 758634) ("EXTRAPOLATE" . 758607) ("GS" . 758631) ("LINEAR" . 758610) ("MISSING" . 949473) ("NX" . 758637) ("NY" . 758640) ("REGULAR" . 851712) ("XGRID" . 758617) ("XVALUES" . 758620) ("YGRID" . 758623) ("YVALUES" . 758626)))
-    ("TRIGRID" fun nil (system) "Result = %s( X, Y, Z, Triangles [, GS, Limits] ) or Result = %s( F , GS, Limits)" ("T22.html" ("DEGREES" . 679620) ("EXTRAPOLATE" . 126730) ("INPUT" . 128106) ("MAX_VALUE" . 128088) ("MIN_VALUE" . 128089) ("MISSING" . 679622) ("NX" . 1076987) ("NY" . 1076989) ("QUINTIC" . 679624) ("SPHERE" . 126737) ("XGRID" . 837019) ("XOUT" . 1075935) ("YGRID" . 837021) ("YOUT" . 1075879)))
-    ("TRISOL" fun nil (system) "Result = %s( A, B, C, R)" ("T25.html" ("DOUBLE" . 52330)))
-    ("TS_COEF" fun nil (system) "Result = %s( X, P)" ("T27.html" ("DOUBLE" . 1076434) ("MSE" . 54734)))
-    ("TS_DIFF" fun nil (system) "Result = %s( X, K)" ("T28.html" ("DOUBLE" . 861958)))
-    ("TS_FCAST" fun nil (system) "Result = %s( X, P, Nvalues)" ("T29.html" ("BACKCAST" . 223046) ("DOUBLE" . 223055)))
-    ("TS_SMOOTH" fun nil (system) "Result = %s( X, Nvalues)" ("T30.html" ("BACKWARD" . 223123) ("DOUBLE" . 223168) ("FORWARD" . 223093) ("ORDER" . 223094)))
-    ("TVRD" fun nil (system) "Result = %s( [X0 [, Y0 [, Nx [, Ny [, Channel]]]]])" ("T34.html" ("CHANNEL" . 679790) ("ORDER" . 679793) ("TRUE" . 679795) ("WORDS" . 679797)))
-    ("UINDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("U.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("UINT" fun nil (system) "Result = %s( Expression[, Offset [, D1 [, ..., D8]]] )" ("U2.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("UINTARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("U3.html" ("NOZERO" . 950261)))
-    ("UL64INDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("U4.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ULINDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("U5.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ULON64ARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("U6.html" ("NOZERO" . 950420)))
-    ("ULONARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("U7.html" ("NOZERO" . 950477)))
-    ("ULONG" fun nil (system) "Result = %s( Expression[, Offset [, D1 [, ..., D8]]] )" ("U8.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ULONG64" fun nil (system) "Result = %s( Expression[, Offset [, D1 [, ..., D8]]] )" ("U9.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("UNIQ" fun nil (system) "Result = %s( Array [, Index] )" ("U10.html"))
-    ("UNSHARP_MASK" fun nil (system) "Result = %s(Image)" ("U11.html" ("AMOUNT" . 968717) ("RADIUS" . 968720) ("THRESHOLD" . 968725) ("TRUE" . 968729)))
-    ("VALUE_LOCATE" fun nil (system) "Result = %s ( Vector, Value)" ("V.html" ("L64" . 957054)))
-    ("VARIANCE" fun nil (system) "Result = %s( X)" ("V2.html" ("DOUBLE" . 938748) ("NAN" . 938858)))
-    ("VERT_T3D" fun nil (system) "Result = %s( Vertex_List)" ("V6.html" ("DOUBLE" . 787625) ("MATRIX" . 957551) ("NO_COPY" . 787628) ("NO_DIVIDE" . 787631) ("SAVE_DIVIDE" . 787634)))
-    ("VOIGT" fun nil (system) "Result = %s(A, U)" ("V7.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("VOXEL_PROJ" fun nil (system) "Result = %s( V [, RGBO])" ("V9.html" ("BACKGROUND" . 677308) ("CUTTING_PLANE" . 680823) ("INTERPOLATE" . 680824) ("MAXIMUM_INTENSITY" . 680825) ("STEP" . 680826) ("XSIZE" . 680827) ("YSIZE" . 680828) ("ZBUFFER" . 680829) ("ZPIXELS" . 680830)))
-    ("WARP_TRI" fun nil (system) "Result = %s( Xo, Yo, Xi, Yi, Image)" ("W2.html" ("EXTRAPOLATE" . 758734) ("OUTPUT_SIZE" . 758728) ("QUINTIC" . 758731) ("TPS" . 967342)))
-    ("WATERSHED" fun nil (system) "Result = %s ( Image)" ("W3.html" ("CONNECTIVITY" . 961172) ("LONG" . 1049951) ("NREGIONS" . 1049960)))
-    ("WHERE" fun nil (system) "Result = %s( Array_Expression [, Count])" ("W7.html" ("COMPLEMENT" . 964874) ("L64" . 964006) ("NCOMPLEMENT" . 964887)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("WIDGET_ACTIVEX" fun nil (system) "Result = %s( Parent, COM_ID)" ("W9.html" ("ALIGN_BOTTOM" . 970441) ("ALIGN_CENTER" . 970444) ("ALIGN_LEFT" . 970446) ("ALIGN_RIGHT" . 970448) ("ALIGN_TOP" . 970450) ("EVENT_FUNC" . 970453) ("EVENT_PRO" . 970455) ("FUNC_GET_VALUE" . 970458) ("ID_TYPE" . 970461) ("KILL_NOTIFY" . 970465) ("NO_COPY" . 970471) ("NOTIFY_REALIZE" . 970475) ("PRO_SET_VALUE" . 970479) ("SCR_XSIZE" . 970483) ("SCR_YSIZE" . 970486) ("SENSITIVE" . 970488) ("UNAME" . 1003671) ("UNITS" . 970503) ("UVALUE" . 970505) ("XOFFSET" . 970510) ("XSIZE" . 970513) ("YOFFSET" . 970515) ("YSIZE" . 970518)))
-    ("WIDGET_BASE" fun nil (system) "Result = %s( [Parent])" ("W10.html" ("ALIGN_BOTTOM" . 679920) ("ALIGN_CENTER" . 107036) ("ALIGN_LEFT" . 107030) ("ALIGN_RIGHT" . 107035) ("ALIGN_TOP" . 107037) ("BASE_ALIGN_BOTTOM" . 107046) ("BASE_ALIGN_CENTER" . 107047) ("BASE_ALIGN_LEFT" . 107048) ("BASE_ALIGN_RIGHT" . 107049) ("BASE_ALIGN_TOP" . 107050) ("COLUMN" . 107029) ("CONTEXT_EVENTS" . 917417) ("CONTEXT_MENU" . 970908) ("DISPLAY_NAME" . 970988) ("EVENT_FUNC" . 679923) ("EVENT_PRO" . 679925) ("EXCLUSIVE" . 679927) ("FLOATING" . 911154) ("FRAME" . 679931) ("FUNC_GET_VALUE" . 679933) ("GRID_LAYOUT" . 679935) ("GROUP_LEADER" . 895915) ("KBRD_FOCUS_EVENTS" . 912183) ("KILL_NOTIFY" . 679938) ("MAP" . 108526) ("MBAR" . 934563) ("MODAL" . 910174) ("NO_COPY" . 106818) ("NONEXCLUSIVE" . 679946) ("NOTIFY_REALIZE" . 67508) ("PRO_SET_VALUE" . 679949) ("RESOURCE_NAME" . 281150) ("RNAME_MBAR" . 72437) ("ROW" . 679951) ("SCR_XSIZE" . 948019) ("SCR_YSIZE" . 58070) ("SCROLL" . 679954) ("SENSITIVE" . 948204) ("SPACE" . 679957) ("TAB_MODE" . 1068884) ("TITLE" . 679959) ("TLB_FRAME_ATTR" . 977197) ("TLB_ICONIFY_EVENTS" . 984484) ("TLB_KILL_REQUEST_EVENTS" . 192742) ("TLB_MOVE_EVENTS" . 984511) ("TLB_SIZE_EVENTS" . 679965) ("TOOLBAR" . 978753) ("TRACKING_EVENTS" . 58059) ("UNAME" . 949220) ("UNITS" . 895507) ("UVALUE" . 679967) ("X_SCROLL_SIZE" . 679980) ("XOFFSET" . 679972) ("XPAD" . 679975) ("XSIZE" . 679977) ("Y_SCROLL_SIZE" . 679991) ("YOFFSET" . 679983) ("YPAD" . 679986) ("YSIZE" . 679988)))
-    ("WIDGET_BUTTON" fun nil (system) "Result = %s( Parent)" ("W11.html" ("ACCELERATOR" . 1069174) ("ALIGN_CENTER" . 680015) ("ALIGN_LEFT" . 57956) ("ALIGN_RIGHT" . 57957) ("BITMAP" . 192775) ("CHECKED_MENU" . 978512) ("DYNAMIC_RESIZE" . 978508) ("EVENT_FUNC" . 106419) ("EVENT_PRO" . 680017) ("FONT" . 680019) ("FRAME" . 680021) ("FUNC_GET_VALUE" . 108837) ("GROUP_LEADER" . 680025) ("HELP" . 57994) ("KILL_NOTIFY" . 680028) ("MENU" . 680031) ("NO_COPY" . 109087) ("NO_RELEASE" . 680036) ("NOTIFY_REALIZE" . 67569) ("PRO_SET_VALUE" . 680038) ("PUSHBUTTON_EVENTS" . 1019958) ("RESOURCE_NAME" . 724023) ("SCR_XSIZE" . 67277) ("SCR_YSIZE" . 67280) ("SENSITIVE" . 948118) ("SEPARATOR" . 58000) ("TAB_MODE" . 1069036) ("TOOLTIP" . 982062) ("TRACKING_EVENTS" . 982064) ("UNAME" . 949273) ("UNITS" . 895525) ("UVALUE" . 680040) ("VALUE" . 680044) ("X_BITMAP_EXTRA" . 680046) ("XOFFSET" . 680048) ("XSIZE" . 680051) ("YOFFSET" . 680054) ("YSIZE" . 680057)))
-    ("WIDGET_COMBOBOX" fun nil (system) "Result = %s( Parent)" ("W12.html" ("DYNAMIC_RESIZE" . 1011945) ("EDITABLE" . 1011949) ("EVENT_FUNC" . 1011951) ("EVENT_PRO" . 1011953) ("FONT" . 1011955) ("FRAME" . 1011964) ("FUNC_GET_VALUE" . 1011967) ("GROUP_LEADER" . 1011969) ("IGNORE_ACCELERATORS" . 1096967) ("KILL_NOTIFY" . 1011972) ("NO_COPY" . 1011975) ("NOTIFY_REALIZE" . 1011978) ("PRO_SET_VALUE" . 1011980) ("RESOURCE_NAME" . 1011983) ("SCR_XSIZE" . 1011991) ("SCR_YSIZE" . 1011993) ("SENSITIVE" . 1011995) ("TAB_MODE" . 1071311) ("TRACKING_EVENTS" . 1012005) ("UNAME" . 1012013) ("UNITS" . 1012019) ("UVALUE" . 1012021) ("VALUE" . 1012025) ("XOFFSET" . 1012027) ("XSIZE" . 1012030) ("YOFFSET" . 1012032) ("YSIZE" . 1012035)))
-    ("WIDGET_DRAW" fun nil (system) "Result = %s(Parent)" ("W15.html" ("APP_SCROLL" . 680227) ("BUTTON_EVENTS" . 941808) ("COLOR_MODEL" . 930114) ("COLORS" . 896380) ("EVENT_FUNC" . 680234) ("EVENT_PRO" . 680236) ("EXPOSE_EVENTS" . 907355) ("FRAME" . 680238) ("FUNC_GET_VALUE" . 680240) ("GRAPHICS_LEVEL" . 914743) ("GROUP_LEADER" . 680242) ("IGNORE_ACCELERATORS" . 1097640) ("KEYBOARD_EVENTS" . 1097628) ("KILL_NOTIFY" . 680245) ("MOTION_EVENTS" . 153791) ("NO_COPY" . 680251) ("NOTIFY_REALIZE" . 67601) ("PRO_SET_VALUE" . 680253) ("RENDERER" . 930656) ("RESOURCE_NAME" . 947866) ("RETAIN" . 680255) ("SCR_XSIZE" . 67289) ("SCR_YSIZE" . 67292) ("SCROLL" . 67286) ("SENSITIVE" . 948221) ("TOOLTIP" . 982084) ("TRACKING_EVENTS" . 67368) ("UNAME" . 949316) ("UNITS" . 895543) ("UVALUE" . 680259) ("VALUE" . 680263) ("VIEWPORT_EVENTS" . 279483) ("X_SCROLL_SIZE" . 680274) ("XOFFSET" . 680268) ("XSIZE" . 680271) ("Y_SCROLL_SIZE" . 680283) ("YOFFSET" . 680277) ("YSIZE" . 680280)))
-    ("WIDGET_DROPLIST" fun nil (system) "Result = %s( Parent)" ("W16.html" ("DYNAMIC_RESIZE" . 192790) ("EVENT_FUNC" . 192787) ("EVENT_PRO" . 58393) ("FONT" . 963245) ("FRAME" . 58399) ("FUNC_GET_VALUE" . 58404) ("GROUP_LEADER" . 58412) ("KILL_NOTIFY" . 58424) ("NO_COPY" . 67153) ("NOTIFY_REALIZE" . 67614) ("PRO_SET_VALUE" . 67133) ("RESOURCE_NAME" . 67140) ("SCR_XSIZE" . 67120) ("SCR_YSIZE" . 67123) ("SENSITIVE" . 948234) ("TAB_MODE" . 1071560) ("TITLE" . 888903) ("TRACKING_EVENTS" . 58334) ("UNAME" . 949326) ("UNITS" . 895561) ("UVALUE" . 67166) ("VALUE" . 67174) ("XOFFSET" . 67194) ("XSIZE" . 67198) ("YOFFSET" . 67201) ("YSIZE" . 67205)))
-    ("WIDGET_EVENT" fun nil (system) "Result = %s([Widget_ID])" ("W17.html" ("BAD_ID" . 680307) ("NOWAIT" . 680311) ("SAVE_HOURGLASS" . 680313) ("YIELD_TO_TTY" . 675439)))
-    ("WIDGET_INFO" fun nil (system) "Result = %s( [Widget_ID] )" ("W18.html" ("ACTIVE" . 680342) ("BUTTON_SET" . 978692) ("CHILD" . 978690) ("COLUMN_WIDTHS" . 895941) ("COMBOBOX_GETTEXT" . 981639) ("COMBOBOX_NUMBER" . 981602) ("COMPONENT" . 1018415) ("CONTEXT_EVENTS" . 1018413) ("DRAW_BUTTON_EVENTS" . 971032) ("DRAW_EXPOSE_EVENTS" . 909787) ("DRAW_KEYBOARD_EVENTS" . 985204) ("DRAW_MOTION_EVENTS" . 985200) ("DRAW_VIEWPORT_EVENTS" . 680350) ("DROPLIST_NUMBER" . 58164) ("DROPLIST_SELECT" . 58165) ("DYNAMIC_RESIZE" . 192872) ("EVENT_FUNC" . 680352) ("EVENT_PRO" . 680354) ("FIND_BY_UNAME" . 58144) ("FONTNAME" . 980336) ("GEOMETRY" . 980339) ("KBRD_FOCUS_EVENTS" . 1012790) ("LIST_MULTIPLE" . 934733) ("LIST_NUM_VISIBLE" . 680358) ("LIST_NUMBER" . 911616) ("LIST_SELECT" . 680360) ("LIST_TOP" . 680362) ("MANAGED" . 907337) ("MAP" . 982652) ("MODAL" . 910752) ("MULTIPLE_PROPERTIES" . 1100808) ("NAME" . 1100833) ("PARENT" . 680364) ("PROPERTY_VALID" . 1018429) ("PROPERTY_VALUE" . 1018452) ("PROPERTYSHEET_NSELECTED" . 1070799) ("PROPERTYSHEET_SELECTED" . 1082483) ("PUSHBUTTON_EVENTS" . 1020048) ("REALIZED" . 1018448) ("ROW_HEIGHTS" . 895972) ("SENSITIVE" . 982686) ("SIBLING" . 680368) ("SLIDER_MIN_MAX" . 680889) ("SYSTEM_COLORS" . 895977) ("TAB_CURRENT" . 976997) ("TAB_MODE" . 1069869) ("TAB_MULTILINE" . 977009) ("TAB_NUMBER" . 977045) ("TABLE_ALL_EVENTS" . 971069) ("TABLE_DISJOINT_SELECTION" . 987431) ("TABLE_EDIT_CELL" . 895981) ("TABLE_EDITABLE" . 895979) ("TABLE_SELECT" . 895983) ("TABLE_VIEW" . 895985) ("TEXT_ALL_EVENTS" . 680895) ("TEXT_EDITABLE" . 680899) ("TEXT_NUMBER" . 680370) ("TEXT_OFFSET_TO_XY" . 680903) ("TEXT_SELECT" . 680906) ("TEXT_TOP_LINE" . 680913) ("TEXT_XY_TO_OFFSET" . 899965) ("TLB_ICONIFY_EVENTS" . 984875) ("TLB_KILL_REQUEST_EVENTS" . 192881) ("TLB_MOVE_EVENTS" . 984854) ("TLB_SIZE_EVENTS" . 984889) ("TOOLTIP" . 982130) ("TRACKING_EVENTS" . 58086) ("TREE_EXPANDED" . 978324) ("TREE_ROOT" . 986723) ("TREE_SELECT" . 978331) ("TYPE" . 680072) ("UNAME" . 949465) ("UNITS" . 949467) ("UPDATE" . 680371) ("USE_TABLE_SELECT" . 896009) ("VALID_ID" . 891030) ("VERSION" . 680373) ("VISIBLE" . 984410)))
-    ("WIDGET_LABEL" fun nil (system) "Result = %s( Parent)" ("W19.html" ("ALIGN_CENTER" . 57967) ("ALIGN_LEFT" . 57970) ("ALIGN_RIGHT" . 57973) ("DYNAMIC_RESIZE" . 192801) ("FONT" . 680390) ("FRAME" . 680392) ("FUNC_GET_VALUE" . 680394) ("GROUP_LEADER" . 680396) ("KILL_NOTIFY" . 680399) ("NO_COPY" . 680402) ("NOTIFY_REALIZE" . 67628) ("PRO_SET_VALUE" . 680404) ("RESOURCE_NAME" . 724047) ("SCR_XSIZE" . 67301) ("SCR_YSIZE" . 67304) ("SENSITIVE" . 948248) ("SUNKEN_FRAME" . 978731) ("TRACKING_EVENTS" . 67390) ("UNAME" . 949494) ("UNITS" . 949487) ("UVALUE" . 680406) ("VALUE" . 680410) ("XOFFSET" . 680412) ("XSIZE" . 680415) ("YOFFSET" . 680418) ("YSIZE" . 680421)))
-    ("WIDGET_LIST" fun nil (system) "Result = %s( Parent)" ("W20.html" ("CONTEXT_EVENTS" . 970955) ("EVENT_FUNC" . 680433) ("EVENT_PRO" . 680435) ("FONT" . 680437) ("FRAME" . 680439) ("FUNC_GET_VALUE" . 680441) ("GROUP_LEADER" . 680443) ("KILL_NOTIFY" . 680446) ("MULTIPLE" . 934705) ("NO_COPY" . 680449) ("NOTIFY_REALIZE" . 67642) ("PRO_SET_VALUE" . 680451) ("RESOURCE_NAME" . 724057) ("SCR_XSIZE" . 67319) ("SCR_YSIZE" . 1001133) ("SENSITIVE" . 948262) ("TAB_MODE" . 1071684) ("TRACKING_EVENTS" . 1071674) ("UNAME" . 949504) ("UNITS" . 895619) ("UVALUE" . 680453) ("VALUE" . 680457) ("XOFFSET" . 680460) ("XSIZE" . 680463) ("YOFFSET" . 680466) ("YSIZE" . 58021)))
-    ("WIDGET_PROPERTYSHEET" fun nil (system) "Result = %s(Parent)" ("W21.html" ("ALIGN_BOTTOM" . 1036791) ("ALIGN_CENTER" . 1036794) ("ALIGN_LEFT" . 1036796) ("ALIGN_RIGHT" . 1036798) ("ALIGN_TOP" . 1036800) ("CONTEXT_EVENTS" . 1036802) ("EDITABLE" . 1078422) ("EVENT_FUNC" . 1036806) ("EVENT_PRO" . 1036808) ("FONT" . 1036810) ("FRAME" . 1070614) ("FUNC_GET_VALUE" . 1036813) ("IGNORE_ACCELERATORS" . 1097821) ("KILL_NOTIFY" . 1036815) ("MULTIPLE_PROPERTIES" . 1100848) ("NO_COPY" . 1036819) ("NOTIFY_REALIZE" . 1036822) ("PRO_SET_VALUE" . 1036824) ("SCR_XSIZE" . 1036826) ("SCR_YSIZE" . 1036828) ("SENSITIVE" . 1036830) ("SUNKEN_FRAME" . 1070660) ("TRACKING_EVENTS" . 1036836) ("UNAME" . 1036838) ("UNITS" . 1036841) ("UVALUE" . 1036843) ("VALUE" . 1036847) ("XOFFSET" . 1036853) ("XSIZE" . 1036856) ("YOFFSET" . 1036858) ("YSIZE" . 1036861)))
-    ("WIDGET_SLIDER" fun nil (system) "Result = %s( Parent)" ("W22.html" ("DRAG" . 680487) ("EVENT_FUNC" . 680490) ("EVENT_PRO" . 680492) ("FONT" . 680494) ("FRAME" . 680496) ("FUNC_GET_VALUE" . 680498) ("GROUP_LEADER" . 680500) ("KILL_NOTIFY" . 680503) ("MAXIMUM" . 680506) ("MINIMUM" . 680508) ("NO_COPY" . 680510) ("NOTIFY_REALIZE" . 67656) ("PRO_SET_VALUE" . 680512) ("RESOURCE_NAME" . 724067) ("SCR_XSIZE" . 67331) ("SCR_YSIZE" . 67334) ("SCROLL" . 680514) ("SENSITIVE" . 948276) ("SUPPRESS_VALUE" . 680516) ("TAB_MODE" . 1071832) ("TITLE" . 1071823) ("TRACKING_EVENTS" . 67418) ("UNAME" . 949514) ("UNITS" . 895638) ("UVALUE" . 680519) ("VALUE" . 680523) ("VERTICAL" . 680527) ("XOFFSET" . 680529) ("XSIZE" . 680532) ("YOFFSET" . 680535) ("YSIZE" . 680538)))
-    ("WIDGET_TAB" fun nil (system) "Result = %s( Parent)" ("W23.html" ("ALIGN_BOTTOM" . 1012200) ("ALIGN_CENTER" . 1012202) ("ALIGN_LEFT" . 1012204) ("ALIGN_RIGHT" . 1012206) ("ALIGN_TOP" . 1012208) ("EVENT_FUNC" . 1012210) ("EVENT_PRO" . 1012212) ("FUNC_GET_VALUE" . 1012214) ("GROUP_LEADER" . 1012216) ("KILL_NOTIFY" . 1012219) ("LOCATION" . 1012223) ("MULTILINE" . 1012253) ("NO_COPY" . 1012263) ("NOTIFY_REALIZE" . 1012266) ("PRO_SET_VALUE" . 1012268) ("SCR_XSIZE" . 1012270) ("SCR_YSIZE" . 1012272) ("SENSITIVE" . 1012274) ("TAB_MODE" . 1071955) ("TRACKING_EVENTS" . 1018541) ("UNAME" . 1012284) ("UNITS" . 1012290) ("UVALUE" . 1012292) ("XOFFSET" . 1012296) ("XSIZE" . 1012299) ("YOFFSET" . 1012301) ("YSIZE" . 1012304)))
-    ("WIDGET_TABLE" fun nil (system) "Result = %s( Parent)" ("W24.html" ("ALIGNMENT" . 896042) ("ALL_EVENTS" . 941688) ("AM_PM" . 1076926) ("COLUMN_LABELS" . 1076933) ("COLUMN_MAJOR" . 909845) ("COLUMN_WIDTHS" . 896114) ("CONTEXT_EVENTS" . 1074773) ("DAYS_OF_WEEK" . 949838) ("DISJOINT_SELECTION" . 987345) ("EDITABLE" . 987346) ("EVENT_FUNC" . 896120) ("EVENT_PRO" . 896123) ("FONT" . 896126) ("FORMAT" . 896130) ("FRAME" . 896133) ("FUNC_GET_VALUE" . 896136) ("GROUP_LEADER" . 896151) ("IGNORE_ACCELERATORS" . 1097865) ("KBRD_FOCUS_EVENTS" . 911525) ("KILL_NOTIFY" . 896155) ("MONTHS" . 949844) ("NO_COLUMN_HEADERS" . 1074713) ("NO_COPY" . 896163) ("NO_HEADERS" . 909873) ("NO_ROW_HEADERS" . 1074723) ("NOTIFY_REALIZE" . 896166) ("PRO_SET_VALUE" . 896169) ("RESIZEABLE_COLUMNS" . 896172) ("RESIZEABLE_ROWS" . 901244) ("RESOURCE_NAME" . 896175) ("ROW_HEIGHTS" . 909879) ("ROW_LABELS" . 896181) ("ROW_MAJOR" . 909886) ("SCR_XSIZE" . 896187) ("SCR_YSIZE" . 896190) ("SCROLL" . 896193) ("SENSITIVE" . 948291) ("TAB_MODE" . 1072083) ("TRACKING_EVENTS" . 896200) ("UNAME" . 949524) ("UNITS" . 896203) ("UVALUE" . 896207) ("VALUE" . 896212) ("X_SCROLL_SIZE" . 896223) ("XOFFSET" . 896215) ("XSIZE" . 896219) ("Y_SCROLL_SIZE" . 896235) ("YOFFSET" . 896227) ("YSIZE" . 896231)))
-    ("WIDGET_TEXT" fun nil (system) "Result = %s( Parent)" ("W25.html" ("ALL_EVENTS" . 680556) ("CONTEXT_EVENTS" . 970972) ("EDITABLE" . 886884) ("EVENT_FUNC" . 680561) ("EVENT_PRO" . 680563) ("FONT" . 680565) ("FRAME" . 680567) ("FUNC_GET_VALUE" . 680569) ("GROUP_LEADER" . 680571) ("IGNORE_ACCELERATORS" . 1097921) ("KBRD_FOCUS_EVENTS" . 911545) ("KILL_NOTIFY" . 680574) ("NO_COPY" . 680577) ("NO_NEWLINE" . 680579) ("NOTIFY_REALIZE" . 67670) ("PRO_SET_VALUE" . 680581) ("RESOURCE_NAME" . 724077) ("SCR_XSIZE" . 67343) ("SCR_YSIZE" . 67346) ("SCROLL" . 680583) ("SENSITIVE" . 948305) ("TAB_MODE" . 1072230) ("TRACKING_EVENTS" . 67432) ("UNAME" . 949534) ("UNITS" . 895656) ("UVALUE" . 680586) ("VALUE" . 680590) ("WRAP" . 58056) ("XOFFSET" . 680592) ("XSIZE" . 680595) ("YOFFSET" . 680598) ("YSIZE" . 680601)))
-    ("WIDGET_TREE" fun nil (system) "Result = %s( Parent)" ("W26.html" ("ALIGN_BOTTOM" . 1012440) ("ALIGN_CENTER" . 1012442) ("ALIGN_LEFT" . 1012444) ("ALIGN_RIGHT" . 1012446) ("ALIGN_TOP" . 1012448) ("BITMAP" . 1012450) ("CONTEXT_EVENTS" . 1012452) ("EVENT_FUNC" . 1012461) ("EVENT_PRO" . 1012463) ("EXPANDED" . 1012465) ("FOLDER" . 1012468) ("FUNC_GET_VALUE" . 1012472) ("GROUP_LEADER" . 1012474) ("KILL_NOTIFY" . 1012477) ("MULTIPLE" . 1012481) ("NO_COPY" . 1012484) ("NOTIFY_REALIZE" . 1012487) ("PRO_SET_VALUE" . 1012489) ("SCR_XSIZE" . 1012491) ("SCR_YSIZE" . 1012493) ("SENSITIVE" . 1012495) ("TAB_MODE" . 1072351) ("TOP" . 1012505) ("TRACKING_EVENTS" . 1018556) ("UNAME" . 1012508) ("UNITS" . 1012514) ("UVALUE" . 1012516) ("VALUE" . 1012520) ("XOFFSET" . 1012523) ("XSIZE" . 1012526) ("YOFFSET" . 1012528) ("YSIZE" . 1012531)))
-    ("WRITE_SYLK" fun nil (system) "Result = %s( File, Data)" ("W39.html" ("STARTCOL" . 67955) ("STARTROW" . 67958)))
-    ("WTN" fun nil (system) "Result = %s( A, Coef)" ("W46.html" ("COLUMN" . 58787) ("DOUBLE" . 52415) ("INVERSE" . 52418) ("OVERWRITE" . 52421)))
-    ("WV_CW_WAVELET" fun nil (system) "Result = %s( [Parent])" ("ref5.html" ("DISCRETE" . 1003928) ("NO_COLOR" . 1015397) ("NO_DRAW_WINDOW" . 1015435) ("TITLE" . 1015385) ("UNAME" . 1004532) ("UVALUE" . 1003932) ("VALUE" . 1015413) ("WAVELETS" . 1008397)))
-    ("WV_CWT" fun nil (system) "Result = %s(Array, Family, Order)" ("ref6.html" ("DOUBLE" . 1009356) ("DSCALE" . 1009358) ("NSCALE" . 1009484) ("PAD" . 1009489) ("SCALE" . 1009494) ("START_SCALE" . 1009568)))
-    ("WV_DENOISE" fun nil (system) "Result = %s(Array [, Family, Order])" ("ref7.html" ("COEFFICIENTS" . 1010533) ("CUTOFF" . 1010481) ("DENOISE_STATE" . 1010485) ("DOUBLE" . 1010505) ("DWT_FILTERED" . 1010508) ("PERCENT" . 1010511) ("THRESHOLD" . 1010517) ("WPS_FILTERED" . 1010522)))
-    ("WV_DWT" fun nil (system) "Result = %s(Array, Scaling, Wavelet, Ioff, Joff)" ("ref8.html" ("DOUBLE" . 1003349) ("INVERSE" . 1003353) ("N_LEVELS" . 1043639)))
-    ("WV_FN_COIFLET" fun nil (system) "Result = %s( [Order, Scaling, Wavelet, Ioff, Joff] )" ("ref9.html"))
-    ("WV_FN_DAUBECHIES" fun nil (system) "Result = %s( [Order, Scaling, Wavelet, Ioff, Joff] )" ("ref10.html"))
-    ("WV_FN_GAUSSIAN" fun nil (system) "Result = %s( [Order] [, Scale, N])" ("ref11.html" ("DOUBLE" . 1018338) ("FREQUENCY" . 1018340) ("SPATIAL" . 1018342) ("WAVELET" . 1018344)))
-    ("WV_FN_HAAR" fun nil (system) "Result = %s( [Order, Scaling, Wavelet, Ioff, Joff] )" ("ref12.html"))
-    ("WV_FN_MORLET" fun nil (system) "Result = %s( [Order] [, Scale, N])" ("ref13.html" ("DOUBLE" . 1009779) ("FREQUENCY" . 1015564) ("SPATIAL" . 1015558) ("WAVELET" . 1009789)))
-    ("WV_FN_PAUL" fun nil (system) "Result = %s( [Order] [, Scale, N])" ("ref14.html" ("DOUBLE" . 1010078) ("FREQUENCY" . 1015576) ("SPATIAL" . 1010080) ("WAVELET" . 1010082)))
-    ("WV_FN_SYMLET" fun nil (system) "Result = %s( [Order, Scaling, Wavelet, Ioff, Joff] )" ("ref15.html"))
-    ("WV_PLOT3D_WPS" fun nil (system) "Result = %s( Array [, X] [, Y])" ("ref18.html" ("GROUP_LEADER" . 1006236) ("SURFACE_STYLE" . 1015696) ("TITLE" . 1006239) ("UNITS" . 1006241) ("XTITLE" . 1006243) ("XUNITS" . 1006245) ("YTITLE" . 1006247) ("YUNITS" . 1006249)))
-    ("WV_PLOT_MULTIRES" fun nil (system) "Result = %s( Array [, X] [, Y])" ("ref19.html" ("GROUP_LEADER" . 1008291) ("TITLE" . 1008295) ("UNITS" . 1008298) ("XTITLE" . 1008301) ("XUNITS" . 1008304) ("YTITLE" . 1008307) ("YUNITS" . 1008310)))
-    ("WV_PWT" fun nil (system) "Result = %s( A, Scaling, Wavelet, Ioff, Joff)" ("ref20.html" ("DOUBLE" . 1006192) ("INVERSE" . 1006194)))
-    ("WV_TOOL_DENOISE" fun nil (system) "Result = %s( Array [, X] [, Y])" ("ref21.html" ("GROUP_LEADER" . 1008330) ("TITLE" . 1008334) ("UNITS" . 1008337) ("XTITLE" . 1008340) ("XUNITS" . 1008343) ("YTITLE" . 1008346) ("YUNITS" . 1008349)))
-    ("XFONT" fun nil (system) "Result = %s()" ("X4.html" ("GROUP" . 762100) ("PRESERVE_FONT_INFO" . 762103)))
-    ("XREGISTERED" fun nil (system) "Result = %s(Name)" ("X16.html" ("NOSHOW" . 762898)))
-    ("XSQ_TEST" fun nil (system) "Result = %s( Obfreq, Exfreq)" ("X18.html" ("EXCELL" . 137437) ("OBCELL" . 137440) ("RESIDUAL" . 137443)))
-    ("Add" pro "IDL_Container" (system) "Obj->[%s::]%s, Objects" ("objects_misc5.html" ("POSITION" . 1010605)))
-    ("Cleanup" pro "IDL_Container" (system) "Obj->[%s::]%s" ("objects_misc6.html"))
-    ("Move" pro "IDL_Container" (system) "Obj->[%s::]%s, Source, Destination" ("objects_misc11.html"))
-    ("Remove" pro "IDL_Container" (system) "Obj->[%s::]%s [, Child_object]" ("objects_misc12.html" ("ALL" . 1010855) ("POSITION" . 1010857)))
-    ("Count" fun "IDL_Container" (system) "Result = Obj->[%s::]%s()" ("objects_misc7.html"))
-    ("Get" fun "IDL_Container" (system) "Result = Obj->[%s::]%s ()" ("objects_misc8.html" ("ALL" . 1010708) ("COUNT" . 1010710) ("ISA" . 1010712) ("POSITION" . 1010715)))
-    ("Init" fun "IDL_Container" (system) "Result = Obj->[%s::]%s()" ("objects_misc9.html" ))
-    ("IsContained" fun "IDL_Container" (system) "Result = Obj->[%s::]%s( Object)" ("objects_misc10.html" ("POSITION" . 1010785)))
-    ("IDL" pro "IDL_Savefile" (system) "Obj->[IDL_Savefile::]IDL_Savefile::Cleanup" ("objects_misc15.html"))
-    ("Restore" pro "IDL_Savefile" (system) "Obj->[%s::]%s, SaveItem" ("objects_misc19.html" ("COMMON" . 1034877) ("FUNCTION" . 1034881) ("NEW_HEAPVAR" . 1034884) ("OBJECT_HEAPVAR" . 1034892) ("POINTER_HEAPVAR" . 1034898) ("PROCEDURE" . 1034904) ("RESTORED_OBJECTS" . 1034907) ("STRUCTURE_DEFINITION" . 1034910) ("VERBOSE" . 1034913)))
-    ("Contents" fun "IDL_Savefile" (system) "Result = Obj->[%s::]%s()" ("objects_misc16.html"))
-    ("IDL" fun "IDL_Savefile" (system) "Result = Obj->[IDL_Savefile::]IDL_Savefile::Init([, Filename])" ("objects_misc17.html" ("FILENAME" . 1034717) ("RELAXED_STRUCTURE_ASSIGNMENT" . 1034721)))
-    ("Names" fun "IDL_Savefile" (system) "Result = Obj->[%s::]%s()" ("objects_misc18.html" ("COMMON_BLOCK" . 1034777) ("COMMON_VARIABLE" . 1034780) ("COUNT" . 1034783) ("FUNCTION" . 1034786) ("OBJECT_HEAPVAR" . 1034789) ("POINTER_HEAPVAR" . 1034800) ("PROCEDURE" . 1034811) ("STRUCTURE_DEFINITION" . 1034814) ("SYSTEM_VARIABLE" . 1034817)))
-    ("Size" fun "IDL_Savefile" (system) "Result = Obj->[%s::]%s(SaveItem [, Keywords])" ("objects_misc20.html"))
-    ("AppendData" pro "IDLanROI" (system) "Obj->[%s::]%s, X [, Y] [, Z]" ("objects_an5.html" ("XRANGE" . 1003740) ("YRANGE" . 1003742) ("ZRANGE" . 1003744)))
-    ("Cleanup" pro "IDLanROI" (system) "Obj->[%s::]%s" ("objects_an6.html"))
-    ("GetProperty" pro "IDLanROI" (system) "Obj->[%s::]%s" ("objects_an10.html" ) ("objects_an4.html" ("ALL" . 1011351) ("BLOCK_SIZE" . 1011320) ("DATA" . 1011322) ("DOUBLE" . 1011324) ("INTERIOR" . 1011326) ("N_VERTS" . 1011660) ("ROI_XRANGE" . 1011699) ("ROI_YRANGE" . 1011726) ("ROI_ZRANGE" . 1011728) ("TYPE" . 1011328)))
-    ("RemoveData" pro "IDLanROI" (system) "Obj->[%s::]%s" ("objects_an12.html" ("COUNT" . 1004077) ("START" . 1004079) ("XRANGE" . 1004081) ("YRANGE" . 1004083) ("ZRANGE" . 1004085)))
-    ("ReplaceData" pro "IDLanROI" (system) "Obj->[%s::]%s, X[, Y[, Z]]" ("objects_an13.html" ("FINISH" . 1004123) ("START" . 1004130) ("XRANGE" . 1004136) ("YRANGE" . 1004138) ("ZRANGE" . 1004140)))
-    ("Rotate" pro "IDLanROI" (system) "Obj->[%s::]%s, Axis, Angle" ("objects_an14.html" ("CENTER" . 1004176)))
-    ("Scale" pro "IDLanROI" (system) "Obj->[%s::]%s, Sx[, Sy[, Sz]]" ("objects_an15.html"))
-    ("SetProperty" pro "IDLanROI" (system) "Obj->[%s::]%s" ("objects_an16.html" ) ("objects_an4.html" ("BLOCK_SIZE" . 1011320) ("DATA" . 1011322) ("DOUBLE" . 1011324) ("INTERIOR" . 1011326)))
-    ("Translate" pro "IDLanROI" (system) "Obj->[%s::]%s, Tx[, Ty[, Tz]]" ("objects_an17.html"))
-    ("ComputeGeometry" fun "IDLanROI" (system) "Result = Obj->[%s::]%s()" ("objects_an7.html" ("AREA" . 1003819) ("CENTROID" . 1003821) ("PERIMETER" . 1003823) ("SPATIAL_OFFSET" . 1003825) ("SPATIAL_SCALE" . 1003827)))
-    ("ComputeMask" fun "IDLanROI" (system) "Result = Obj->[%s::]%s()" ("objects_an8.html" ("DIMENSIONS" . 1003872) ("INITIALIZE" . 1003874) ("LOCATION" . 1003879) ("MASK_IN" . 1003881) ("MASK_RULE" . 1003883) ("PIXEL_CENTER" . 1003888) ("PLANE_NORMAL" . 1011165) ("PLANE_XAXIS" . 1003890) ("RUN_LENGTH" . 1003892)))
-    ("ContainsPoints" fun "IDLanROI" (system) "Result = Obj->[%s::]%s( X [, Y [, Z]] )" ("objects_an9.html"))
-    ("Init" fun "IDLanROI" (system) "Result = Obj->[%s::]%s([, X [, Y [, Z]]])" ("objects_an11.html" ) ("objects_an4.html" ("BLOCK_SIZE" . 1011320) ("DATA" . 1011322) ("DOUBLE" . 1011324) ("INTERIOR" . 1011326) ("TYPE" . 1011328)))
-    ("Add" pro "IDLanROIGroup" (system) "Obj->[%s::]%s, ROI" ("objects_an20.html"))
-    ("Cleanup" pro "IDLanROIGroup" (system) "Obj->[%s::]%s" ("objects_an21.html"))
-    ("GetProperty" pro "IDLanROIGroup" (system) "Obj->[%s::]%s" ("objects_an25.html" ) ("objects_an19.html" ("ALL" . 1011995) ("ROIGROUP_XRANGE" . 1011998) ("ROIGROUP_YRANGE" . 1012000) ("ROIGROUP_ZRANGE" . 1012002)))
-    ("Rotate" pro "IDLanROIGroup" (system) "Obj->[%s::]%s, Axis, Angle" ("objects_an27.html" ("CENTER" . 1004731)))
-    ("Scale" pro "IDLanROIGroup" (system) "Obj->[%s::]%s, Sx[, Sy[, Sz]]" ("objects_an28.html"))
-    ("Translate" pro "IDLanROIGroup" (system) "Obj->[%s::]%s, Tx[, Ty[, Tz]]" ("objects_an29.html"))
-    ("ComputeMask" fun "IDLanROIGroup" (system) "Result = Obj->[%s::]%s()" ("objects_an22.html" ("DIMENSIONS" . 1004482) ("INITIALIZE" . 1004484) ("LOCATION" . 1004489) ("MASK_IN" . 1004491) ("MASK_RULE" . 1004493) ("PLANE_NORMAL" . 1004498) ("PLANE_XAXIS" . 1004500) ("RUN_LENGTH" . 1004502)))
-    ("ComputeMesh" fun "IDLanROIGroup" (system) "Result = Obj->[%s::]%s( Vertices, Conn)" ("objects_an23.html" ("CAPPED" . 1004551) ("SURFACE_AREA" . 1004556)))
-    ("ContainsPoints" fun "IDLanROIGroup" (system) "Result = Obj->[%s::]%s( X[, Y[, Z]] )" ("objects_an24.html"))
-    ("Init" fun "IDLanROIGroup" (system) "Result = Obj->[%s::]%s()" ("objects_an26.html" ))
-    ("GetProperty" pro "IDLcomIDispatch" (system) "Obj->[%s::]%s" ("objects_misc25.html" ("KEYWORD")))
-    ("SetProperty" pro "IDLcomIDispatch" (system) "Obj->[%s::]%s" ("objects_misc27.html" ("KEYWORD")))
-    ("Init" fun "IDLcomIDispatchCLSID" (system) "Result = Obj -> [%s::]%s()" ("objects_misc26.html"))
-    ("Init" fun "IDLcomIDispatchPROGID" (system) "Result = Obj -> [%s::]%s()" ("objects_misc26.html"))
-    ("Connect" pro "IDLdbDatabase" (system) "DBobj -> [%s::]%s" ("api8.html" ("CONNECTION" . 998610) ("DATASOURCE" . 998682) ("PASSWORD" . 998786) ("USER_ID" . 998733)))
-    ("ExecuteSQL" pro "IDLdbDatabase" (system) "DBobj -> [%s::]%s, strSQL" ("api9.html"))
-    ("GetProperty" pro "IDLdbDatabase" (system) "DBobj -> [%s::]%s" ("api11.html" ) ("api7.html" ("CAN_GET_TABLES" . 1029718) ("DBMS_NAME" . 1029721) ("DBMS_VERSION" . 1029727) ("DRIVER_ODBC_LEVEL" . 1029724) ("DRIVER_VERSION" . 1029730) ("IS_CONNECTED" . 1029733) ("IS_READONLY" . 1029736) ("MAX_CONNECTIONS" . 1029739) ("MAX_RECORDSETS" . 1029742) ("ODBC_LEVEL" . 1029745) ("SQL_LEVEL" . 1029748) ("SQL_SERVER_NAME" . 1029751) ("USE_CURSOR_LIB" . 1029754) ("USER_NAME" . 1029760)))
-    ("SetProperty" pro "IDLdbDatabase" (system) "DBobj -> [%s::]%s" ("api13.html" ) ("api7.html" ("USE_CURSOR_LIB" . 1029754) ("VERBOSE" . 1029819)))
-    ("GetDatasources" fun "IDLdbDatabase" (system) "Datasources = DBobj -> [%s::]%s()" ("api10.html"))
-    ("GetTables" fun "IDLdbDatabase" (system) "Tables = DBobj -> [%s::]%s()" ("api12.html"))
-    ("AddRecord" pro "IDLdbRecordset" (system) "RSobj -> [%s::]%s[, field1[, field2[, ...[, fieldn]]]]" ("api16.html" ("SET_AUTOINCREMENT" . 1014791)))
-    ("DeleteRecord" pro "IDLdbRecordset" (system) "RSobj -> [%s::]%s" ("api18.html"))
-    ("GetProperty" pro "IDLdbRecordset" (system) "RSobj -> [%s::]%s" ("api20.html" ) ("api15.html" ("CAN_MOVE_ABSOLUTE" . 1030659) ("CAN_MOVE_FIRST" . 1030662) ("CAN_MOVE_LAST" . 1030665) ("CAN_MOVE_NEXT" . 1030668) ("CAN_MOVE_PRIOR" . 1030671) ("CAN_MOVE_RELATIVE" . 1030674) ("FIELD_INFO" . 1030677) ("GET_DATABASE" . 1030697) ("IS_READONLY" . 1030700) ("N_BUFFERS" . 1030703) ("RECORDSET_SOURCE" . 1030706)))
-    ("SetField" pro "IDLdbRecordset" (system) "RSobj -> [%s::]%s, iFieldNumber, Value" ("api24.html" ("NULL" . 1014812)))
-    ("CurrentRecord" fun "IDLdbRecordset" (system) "number = RSobj -> [%s::]%s()" ("api17.html"))
-    ("GetField" fun "IDLdbRecordset" (system) "value = RSobj -> [%s::]%s(iFieldNumber)" ("api19.html" ("IS_NULL" . 1013507) ("NULL_VALUE" . 1013559)))
-    ("GetRecord" fun "IDLdbRecordset" (system) "Result = RSobj -> [%s::]%s()" ("api21.html"))
-    ("MoveCursor" fun "IDLdbRecordset" (system) "Result = RSobj -> [%s::]%s()" ("api22.html" ("ABSOLUTE" . 1001009) ("FIRST" . 1001067) ("LAST" . 1001125) ("NEXT" . 1001187) ("PRIOR" . 1001255) ("RELATIVE" . 1001313)))
-    ("NFields" fun "IDLdbRecordset" (system) "status = RSobj -> [%s::]%s()" ("api23.html"))
-    ("Cleanup" pro "IDLffDICOM" (system) "Obj->[%s::]%s" ("objects_ff6.html"))
-    ("DumpElements" pro "IDLffDICOM" (system) "Obj->[%s::]%s [, Filename]" ("objects_ff7.html"))
-    ("Reset" pro "IDLffDICOM" (system) "Obj->[%s::]%s" ("objects_ff20.html"))
-    ("GetChildren" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s(Reference)" ("objects_ff8.html"))
-    ("GetDescription" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s([Group [, Element]])" ("objects_ff9.html" ("REFERENCE" . 1004342)))
-    ("GetGroup" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s([Group[, Element]])" ("objects_ff11.html" ("REFERENCE" . 1004455)))
-    ("GetLength" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s([Group [, Element]])" ("objects_ff12.html" ("REFERENCE" . 1004513)))
-    ("GetParent" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s(ReferenceList)" ("objects_ff13.html"))
-    ("GetPreamble" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s()" ("objects_ff14.html"))
-    ("GetReference" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s([Group [, Element]])" ("objects_ff15.html" ("DESCRIPTION" . 1004671) ("VR" . 1004673)))
-    ("GetValue" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s([Group [, Element]])" ("objects_ff16.html" ("NO_COPY" . 1004738) ("REFERENCE" . 1004736)))
-    ("GetVR" fun "IDLffDICOM" (system) "array = Obj->[%s::]%s([Group [, Element]])" ("objects_ff17.html" ("REFERENCE" . 1004843)))
-    ("Init" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s([, Filename])" ("objects_ff18.html" ) ("objects_ff5.html" ("VERBOSE" . 1024027)))
-    ("Read" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s(Filename)" ("objects_ff19.html" ("ENDIAN" . 1004946)))
-    ("Cleanup" pro "IDLffDXF" (system) "Obj->[%s::]%s" ("objects_ff23.html"))
-    ("GetPalette" pro "IDLffDXF" (system) "Obj->[%s::]%s, Red, Green, Blue" ("objects_ff26.html"))
-    ("PutEntity" pro "IDLffDXF" (system) "Obj->[%s::]%s, Data" ("objects_ff28.html"))
-    ("RemoveEntity" pro "IDLffDXF" (system) "Obj->[%s::]%s[, Type]" ("objects_ff30.html" ("INDEX" . 1006265)))
-    ("Reset" pro "IDLffDXF" (system) "Obj->[%s::]%s" ("objects_ff31.html"))
-    ("SetPalette" pro "IDLffDXF" (system) "Obj->[%s::]%s, Red, Green, Blue" ("objects_ff32.html"))
-    ("GetContents" fun "IDLffDXF" (system) "Result = Obj->[%s::]%s( [Filter])" ("objects_ff24.html" ("BLOCK" . 1005307) ("COUNT" . 1005309) ("LAYER" . 1005311)))
-    ("GetEntity" fun "IDLffDXF" (system) "Result = Obj->[%s::]%s(Type)" ("objects_ff25.html" ("BLOCK" . 1005352) ("INDEX" . 1005354) ("LAYER" . 1005356)))
-    ("Init" fun "IDLffDXF" (system) "Result = Obj->[%s::]%s([, Filename] )" ("objects_ff27.html" ))
-    ("Read" fun "IDLffDXF" (system) "Result = Obj->[%s::]%s(Filename)" ("objects_ff29.html"))
-    ("Write" fun "IDLffDXF" (system) "Result = Obj->[%s::]%s(Filename)" ("objects_ff33.html"))
-    ("SetData" pro "IDLffJPEG2000" (system) "Obj->[%s::]%s ([P1, ..., Pn])" ("objects_ff42.html" ("COMPONENT" . 1141582) ("ORDER" . 1141585) ("TILE_INDEX" . 1141588)))
-    ("GetData" fun "IDLffJPEG2000" (system) "Result = Obj->[%s::]%s()" ("objects_ff38.html" ("COMPONENT" . 1141336) ("DISCARD_LEVELS" . 1141339) ("MAX_LAYERS" . 1141342) ("N_COMPONENTS" . 1141345) ("ORDER" . 1141348) ("REGION" . 1141351) ("RGB" . 1141355) ("TILE_INDEX" . 1141363)))
-    ("Init" fun "IDLffJPEG2000" (system) "Result = Obj->[%s::]%s(, Filename)" ("objects_ff41.html" ) ("objects_ff36.html" ("BIT_DEPTH" . 1140492) ("COMMENT" . 1140557) ("DIMENSIONS" . 1140585) ("DISPLAY_RESOLUTION" . 1140613) ("FILENAME" . 1140643) ("N_COMPONENTS" . 1181381) ("N_LAYERS" . 1140729) ("N_LEVELS" . 1140758) ("OFFSET" . 1140815) ("PALETTE" . 1140843) ("PERSISTENT" . 1140875) ("PROGRESSION" . 1140903) ("QUIET" . 1140953) ("READ" . 1140981) ("REVERSIBLE" . 1141009) ("SIGNED" . 1141037) ("TILE_DIMENSIONS" . 1141095) ("TILE_OFFSET" . 1141123) ("WRITE" . 1141181) ("XML" . 1141209) ("YCC" . 1141237)))
-    ("Cleanup" pro "IDLffLangCat" (system) "Obj->[%s::]%s" ("objects_ff47.html"))
-    ("GetProperty" pro "IDLffLangCat" (system) "Obj->[%s::]%s" ("objects_ff48.html" ) ("objects_ff45.html" ("APP_NAME" . 1126713) ("APP_PATH" . 1126741) ("AVAILABLE_LANGUAGES" . 1126769) ("DEFAULT_KEYS" . 1126797) ("DEFAULT_LANGUAGE" . 1126825) ("DEFAULT_N_KEYS" . 1126853) ("FILENAME" . 1126881) ("KEYS" . 1126909) ("LANGUAGE" . 1126937) ("N_KEYS" . 1126965) ("VERBOSE" . 1126993)))
-    ("SetProperty" pro "IDLffLangCat" (system) "Obj->[%s::]%s" ("objects_ff51.html" ) ("objects_ff45.html" ("LANGUAGE" . 1126937) ("VERBOSE" . 1126993)))
-    ("AppendCatalog" fun "IDLffLangCat" (system) "Result = Obj->[%s::]%s()" ("objects_ff46.html" ("APP_NAME" . 1127041) ("APP_PATH" . 1127050) ("FILENAME" . 1127056)))
-    ("Init" fun "IDLffLangCat" (system) "Result = Obj->[%s::]%s" ("objects_ff49.html" ("CONTINUE_ON_ERROR" . 1127135)) ("objects_ff45.html" ("APP_NAME" . 1126713) ("APP_PATH" . 1126741) ("DEFAULT_LANGUAGE" . 1126825) ("FILENAME" . 1126881) ("LANGUAGE" . 1126937) ("VERBOSE" . 1126993)))
-    ("Query" fun "IDLffLangCat" (system) "Result = Obj->[%s::]%s( Key)" ("objects_ff50.html" ("DEFAULT_STRING" . 1127154)))
-    ("Cleanup" pro "IDLffMrSID" (system) "Obj->[%s::]%s" ("objects_ff54.html"))
-    ("GetProperty" pro "IDLffMrSID" (system) "Obj->[%s::]%s" ("objects_ff57.html" ("CHANNELS" . 1006873) ("DIMENSIONS" . 1006875) ("GEO_ORIGIN" . 1064441) ("GEO_PROJTYPE" . 1064460) ("GEO_RESOLUTION" . 1064466) ("GEO_VALID" . 1064449) ("LEVELS" . 1006877) ("PIXEL_TYPE" . 1006879) ("TYPE" . 1006884)))
-    ("GetDimsAtLevel" fun "IDLffMrSID" (system) "Result = Obj->[%s::]%s (Level)" ("objects_ff55.html"))
-    ("GetImageData" fun "IDLffMrSID" (system) "Result = Obj->[%s::]%s ()" ("objects_ff56.html" ("LEVEL" . 1006785) ("SUB_RECT" . 1006788)))
-    ("Init" fun "IDLffMrSID" (system) "Result = Obj->[%s::]%s(, Filename)" ("objects_ff58.html" ) ("objects_ff53.html" ("QUIET" . 1026758)))
-    ("AddAttribute" pro "IDLffShape" (system) "Obj->[%s::]%s, Name, Type, Width" ("objects_ff62.html" ("PRECISION" . 1007582)))
-    ("Cleanup" pro "IDLffShape" (system) "Obj->[%s::]%s" ("objects_ff63.html"))
-    ("Close" pro "IDLffShape" (system) "Obj->[%s::]%s" ("objects_ff64.html"))
-    ("DestroyEntity" pro "IDLffShape" (system) "Obj->[%s::]%s, Entity" ("objects_ff65.html"))
-    ("GetProperty" pro "IDLffShape" (system) "Obj->[%s::]%s" ("objects_ff68.html" ) ("objects_ff61.html" ("ATTRIBUTE_INFO" . 1027034) ("ATTRIBUTE_NAMES" . 1027309) ("ENTITY_TYPE" . 1027088) ("FILENAME" . 1027353) ("IS_OPEN" . 1027563) ("N_ATTRIBUTES" . 1027361) ("N_ENTITIES" . 1027330) ("N_RECORDS" . 1027328)))
-    ("PutEntity" pro "IDLffShape" (system) "Obj->[%s::]%s, Data" ("objects_ff71.html"))
-    ("SetAttributes" pro "IDLffShape" (system) "Obj->[%s::]%s, Index, Attribute_Num, Value or Obj->[%s::]%s, Index, Attributes" ("objects_ff72.html"))
-    ("GetAttributes" fun "IDLffShape" (system) "Result = Obj->[%s::]%s([Index])" ("objects_ff66.html" ("ALL" . 1007785) ("ATTRIBUTE_STUCTURE" . 1007787)))
-    ("GetEntity" fun "IDLffShape" (system) "Result = Obj->[%s::]%s([Index])" ("objects_ff67.html" ("ALL" . 1007853) ("ATTRIBUTES" . 1007855)))
-    ("Init" fun "IDLffShape" (system) "Result = Obj->[%s::]%s([, Filename])" ("objects_ff69.html" ) ("objects_ff61.html" ("DBF_ONLY" . 1027319) ("ENTITY_TYPE" . 1027088) ("UPDATE" . 1027071)))
-    ("Open" fun "IDLffShape" (system) "Result = Obj->[%s::]%s( `Filename')" ("objects_ff70.html" ("DBF_ONLY" . 1008149) ("ENTITY_TYPE" . 1008154) ("UPDATE" . 1054733)))
-    ("SetValue" pro "IDLffXMLDOMAttr" (system) "Obj->[%s::]%s, Value" ("objects_ff81.html"))
-    ("GetName" fun "IDLffXMLDOMAttr" (system) "Result = Obj->[%s::]%s()" ("objects_ff77.html"))
-    ("GetSpecified" fun "IDLffXMLDOMAttr" (system) "Result = Obj->[%s::]%s()" ("objects_ff78.html"))
-    ("GetValue" fun "IDLffXMLDOMAttr" (system) "Result = Obj->[%s::]%s()" ("objects_ff79.html"))
-    ("AppendData" pro "IDLffXMLDOMCharacterData" (system) "Obj->[%s::]%s, String" ("objects_ff88.html"))
-    ("DeleteData" pro "IDLffXMLDOMCharacterData" (system) "Obj->[%s::]%s, Offset, Count" ("objects_ff90.html"))
-    ("InsertData" pro "IDLffXMLDOMCharacterData" (system) "Obj->[%s::]%s, Offset, String" ("objects_ff94.html"))
-    ("ReplaceData" pro "IDLffXMLDOMCharacterData" (system) "Obj->[%s::]%s, Offset, Count, String" ("objects_ff95.html"))
-    ("SetData" pro "IDLffXMLDOMCharacterData" (system) "Obj->[%s::]%s, String" ("objects_ff96.html"))
-    ("GetData" fun "IDLffXMLDOMCharacterData" (system) "Result = Obj->[%s::]%s()" ("objects_ff91.html"))
-    ("GetLength" fun "IDLffXMLDOMCharacterData" (system) "Result = Obj->[%s::]%s()" ("objects_ff92.html"))
-    ("SubstringData" fun "IDLffXMLDOMCharacterData" (system) "Result = Obj->[%s::]%s( Offset, Count )" ("objects_ff97.html"))
-    ("Cleanup" pro "IDLffXMLDOMDocument" (system) "Obj->[%s::]%s" ("objects_ff104.html"))
-    ("Load" pro "IDLffXMLDOMDocument" (system) "Obj->[%s::]%s" ("objects_ff117.html" ("EXCLUDE_IGNORABLE_WHITESPACE" . 1128132) ("EXPAND_ENTITY_REFERENCES" . 1128141) ("FILENAME" . 1128144) ("MSG_ERROR" . 1128147) ("MSG_FATAL" . 1128154) ("MSG_WARNING" . 1128160) ("QUIET" . 1128166) ("VALIDATION_MODE" . 1128169)))
-    ("Save" pro "IDLffXMLDOMDocument" (system) "Obj->[%s::]%s" ("objects_ff118.html" ("EXPAND_ENTITY_REFERENCES" . 1128198) ("FILENAME" . 1128201) ("PRETTY_PRINT" . 1128204)))
-    ("CreateAttribute" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff105.html"))
-    ("CreateCDATASection" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( String )" ("objects_ff106.html"))
-    ("CreateComment" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( String )" ("objects_ff107.html"))
-    ("CreateDocumentFragment" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s()" ("objects_ff108.html"))
-    ("CreateElement" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( TagName )" ("objects_ff109.html"))
-    ("CreateEntityReference" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff110.html"))
-    ("CreateProcessingInstruction" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( Target, Data )" ("objects_ff111.html"))
-    ("CreateTextNode" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( String )" ("objects_ff112.html"))
-    ("GetDoctype" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s()" ("objects_ff113.html"))
-    ("GetDocumentElement" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s()" ("objects_ff114.html"))
-    ("GetElementsByTagName" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( TagName )" ("objects_ff115.html"))
-    ("Init" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s()" ("objects_ff116.html" ("EXCLUDE_IGNORABLE_WHITESPACE" . 1128039) ("EXPAND_ENTITY_REFERENCES" . 1128048) ("FILENAME" . 1128051) ("MSG_ERROR" . 1128054) ("MSG_FATAL" . 1128061) ("MSG_WARNING" . 1128067) ("QUIET" . 1128073) ("VALIDATION_MODE" . 1128076)))
-    ("GetEntities" fun "IDLffXMLDOMDocumentType" (system) "Result = Obj->[%s::]%s()" ("objects_ff126.html"))
-    ("GetName" fun "IDLffXMLDOMDocumentType" (system) "Result = Obj->[%s::]%s()" ("objects_ff127.html"))
-    ("GetNotations" fun "IDLffXMLDOMDocumentType" (system) "Result = Obj->[%s::]%s()" ("objects_ff128.html"))
-    ("SetAttribute" pro "IDLffXMLDOMElement" (system) "Obj->[%s::]%s, Name, Value" ("objects_ff140.html"))
-    ("GetAttribute" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff133.html"))
-    ("GetAttributeNode" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff134.html"))
-    ("GetElementsByTagName" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s( TagName )" ("objects_ff135.html"))
-    ("GetTagName" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s()" ("objects_ff136.html"))
-    ("RemoveAttribute" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff138.html"))
-    ("RemoveAttributeNode" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s( OldAttr )" ("objects_ff139.html"))
-    ("SetAttributeNode" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s( NewAttr )" ("objects_ff141.html"))
-    ("GetNotationName" fun "IDLffXMLDOMEntity" (system) "Result = Obj->[%s::]%s()" ("objects_ff145.html"))
-    ("GetPublicId" fun "IDLffXMLDOMEntity" (system) "Result = Obj->[%s::]%s()" ("objects_ff146.html"))
-    ("GetSystemId" fun "IDLffXMLDOMEntity" (system) "Result = Obj->[%s::]%s()" ("objects_ff147.html"))
-    ("GetLength" fun "IDLffXMLDOMNamedNodeMap" (system) "Result = Obj->[%s::]%s()" ("objects_ff156.html"))
-    ("GetNamedItem" fun "IDLffXMLDOMNamedNodeMap" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff157.html"))
-    ("Item" fun "IDLffXMLDOMNamedNodeMap" (system) "Result = Obj->[%s::]%s( Index )" ("objects_ff159.html"))
-    ("RemoveNamedItem" fun "IDLffXMLDOMNamedNodeMap" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff160.html"))
-    ("SetNamedItem" fun "IDLffXMLDOMNamedNodeMap" (system) "Result = Obj->[%s::]%s( Node )" ("objects_ff161.html"))
-    ("SetNodeValue" pro "IDLffXMLDOMNode" (system) "Obj->[%s::]%s( NodeValue )" ("objects_ff183.html"))
-    ("AppendChild" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s( NewChild )" ("objects_ff164.html"))
-    ("CloneNode" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff166.html" ("DEEP" . 1129314)))
-    ("GetAttributes" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff167.html"))
-    ("GetChildNodes" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff168.html"))
-    ("GetFirstChild" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff169.html"))
-    ("GetLastChild" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff170.html"))
-    ("GetNextSibling" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff171.html"))
-    ("GetNodeName" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff172.html"))
-    ("GetNodeType" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff173.html"))
-    ("GetNodeValue" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff174.html"))
-    ("GetOwnerDocument" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff175.html"))
-    ("GetParentNode" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff176.html"))
-    ("GetPreviousSibling" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff177.html"))
-    ("HasChildNodes" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff178.html"))
-    ("InsertBefore" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s( NewChild [, RefChild] )" ("objects_ff180.html"))
-    ("RemoveChild" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s( OldChild )" ("objects_ff181.html"))
-    ("ReplaceChild" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s( NewChild, OldChild )" ("objects_ff182.html"))
-    ("GetLength" fun "IDLffXMLDOMNodeList" (system) "Result = Obj->[%s::]%s()" ("objects_ff187.html"))
-    ("Item" fun "IDLffXMLDOMNodeList" (system) "Result = Obj->[%s::]%s( Index )" ("objects_ff189.html"))
-    ("GetPublicId" fun "IDLffXMLDOMNotation" (system) "Result = Obj->[%s::]%s()" ("objects_ff193.html"))
-    ("GetSystemId" fun "IDLffXMLDOMNotation" (system) "Result = Obj->[%s::]%s()" ("objects_ff194.html"))
-    ("SetData" pro "IDLffXMLDOMProcessingInstruction" (system) "Obj->[%s::]%s, Content" ("objects_ff202.html"))
-    ("GetData" fun "IDLffXMLDOMProcessingInstruction" (system) "Result = Obj->[%s::]%s()" ("objects_ff199.html"))
-    ("GetTarget" fun "IDLffXMLDOMProcessingInstruction" (system) "Result = Obj->[%s::]%s()" ("objects_ff200.html"))
-    ("IsIgnorableWhitespace" fun "IDLffXMLDOMText" (system) "Result = Obj->[%s::]%s()" ("objects_ff207.html"))
-    ("SplitText" fun "IDLffXMLDOMText" (system) "Result = Obj->[%s::]%s( Offset )" ("objects_ff208.html"))
-    ("AttributeDecl" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, eName, aName, Type, Mode, Value" ("objects_ff211.html"))
-    ("Characters" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Chars" ("objects_ff212.html"))
-    ("Cleanup" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff213.html"))
-    ("Comment" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Comment" ("objects_ff214.html"))
-    ("ElementDecl" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name, Model" ("objects_ff215.html"))
-    ("EndCDATA" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff216.html"))
-    ("EndDocument" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff217.html"))
-    ("EndDTD" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff218.html"))
-    ("EndElement" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, URI, Local, qName" ("objects_ff219.html"))
-    ("EndEntity" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name" ("objects_ff220.html"))
-    ("EndPrefixMapping" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Prefix" ("objects_ff221.html"))
-    ("Error" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, SystemID, LineNumber, ColumnNumber, Message" ("objects_ff222.html"))
-    ("ExternalEntityDecl" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name, PublicID, SystemID" ("objects_ff223.html"))
-    ("FatalError" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, SystemID, LineNumber, ColumnNumber, Message" ("objects_ff224.html"))
-    ("GetProperty" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff225.html" ) ("objects_ff210.html" ("FILENAME" . 1027975) ("NAMESPACE_PREFIXES" . 1028045) ("PARSER_LOCATION" . 1028043) ("PARSER_PUBLICID" . 1027979) ("PARSER_URI" . 1027981) ("SCHEMA_CHECKING" . 1027990) ("VALIDATION_MODE" . 1028403)))
-    ("IgnorableWhitespace" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Chars" ("objects_ff226.html"))
-    ("InternalEntityDecl" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name, Value" ("objects_ff228.html"))
-    ("NotationDecl" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name, PublicID, SystemID" ("objects_ff229.html"))
-    ("ParseFile" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Filename" ("objects_ff230.html"))
-    ("ProcessingInstruction" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Target, Data" ("objects_ff231.html"))
-    ("SetProperty" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff232.html" ) ("objects_ff210.html" ("NAMESPACE_PREFIXES" . 1028045) ("SCHEMA_CHECKING" . 1027990) ("VALIDATION_MODE" . 1028403)))
-    ("SkippedEntity" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name" ("objects_ff233.html"))
-    ("StartCDATA" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff234.html"))
-    ("StartDocument" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff235.html"))
-    ("StartDTD" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name, PublicID, SystemID" ("objects_ff236.html"))
-    ("StartElement" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, URI, Local, qName [, attName, attValue]" ("objects_ff237.html"))
-    ("StartEntity" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name" ("objects_ff238.html"))
-    ("StartPrefixmapping" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Prefix, URI" ("objects_ff239.html"))
-    ("StopParsing" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff240.html"))
-    ("UnparsedEntityDecl" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name, PublicID, SystemID, Notation" ("objects_ff241.html"))
-    ("Warning" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, SystemID, LineNumber, ColumnNumber, Message" ("objects_ff242.html"))
-    ("Init" fun "IDLffXMLSAX" (system) "Result = Obj->[%s::]%s()" ("objects_ff227.html" ) ("objects_ff210.html" ("NAMESPACE_PREFIXES" . 1028045) ("SCHEMA_CHECKING" . 1027990) ("VALIDATION_MODE" . 1028403)))
-    ("Cleanup" pro "IDLgrAxis" (system) "Obj->[%s::]%s" ("objects_gr5.html"))
-    ("GetProperty" pro "IDLgrAxis" (system) "Obj->[%s::]%s" ("objects_gr7.html" ) ("objects_gr4.html" ("ALL" . 1045686) ("ALPHA_CHANNEL" . 1486818) ("AM_PM" . 1045715) ("CLIP_PLANES" . 1045717) ("COLOR" . 1045723) ("CRANGE" . 1047485) ("DAYS_OF_WEEK" . 1045725) ("DEPTH_TEST_DISABLE" . 1045727) ("DEPTH_TEST_FUNCTION" . 1093233) ("DEPTH_WRITE_DISABLE" . 1093333) ("DIRECTION" . 1093366) ("EXACT" . 1045730) ("EXTEND" . 1045732) ("GRIDSTYLE" . 1045735) ("HIDE" . 1048340) ("LOCATION" . 1048266) ("LOG" . 1045756) ("MAJOR" . 1045758) ("MINOR" . 1045760) ("MONTHS" . 1045762) ("NOTEXT" . 1045766) ("PALETTE" . 1045768) ("PARENT" . 1047517) ("RANGE" . 1045770) ("SUBTICKLEN" . 1093445) ("TEXTALIGNMENTS" . 1045774) ("TEXTBASELINE" . 1048408) ("TEXTPOS" . 1045782) ("TEXTUPDIR" . 1045815) ("THICK" . 1045821) ("TICKDIR" . 1045823) ("TICKFORMAT" . 1565506) ("TICKFRMTDATA" . 1565556) ("TICKINTERVAL" . 1045845) ("TICKLAYOUT" . 1045848) ("TICKLEN" . 1045855) ("TICKTEXT" . 1362754) ("TICKUNITS" . 1362791) ("TICKVALUES" . 1281692) ("TITLE" . 1045882) ("USE_TEXT_COLOR" . 1045887) ("XCOORD_CONV" . 1045891) ("XRANGE" . 1047679) ("YCOORD_CONV" . 1045897) ("YRANGE" . 1047646) ("ZCOORD_CONV" . 1045903) ("ZRANGE" . 1047606)))
-    ("SetProperty" pro "IDLgrAxis" (system) "Obj->[%s::]%s" ("objects_gr9.html" ) ("objects_gr4.html" ("ALPHA_CHANNEL" . 1486818) ("AM_PM" . 1045715) ("CLIP_PLANES" . 1045717) ("COLOR" . 1045723) ("DAYS_OF_WEEK" . 1045725) ("DEPTH_TEST_DISABLE" . 1045727) ("DEPTH_TEST_FUNCTION" . 1093233) ("DEPTH_WRITE_DISABLE" . 1093333) ("DIRECTION" . 1093366) ("EXACT" . 1045730) ("EXTEND" . 1045732) ("GRIDSTYLE" . 1045735) ("HIDE" . 1048340) ("LOCATION" . 1048266) ("LOG" . 1045756) ("MAJOR" . 1045758) ("MINOR" . 1045760) ("MONTHS" . 1045762) ("NOTEXT" . 1045766) ("RANGE" . 1045770) ("SUBTICKLEN" . 1093445) ("TEXTALIGNMENTS" . 1045774) ("TEXTBASELINE" . 1048408) ("TEXTPOS" . 1045782) ("TEXTUPDIR" . 1045815) ("THICK" . 1045821) ("TICKDIR" . 1045823) ("TICKFORMAT" . 1565506) ("TICKFRMTDATA" . 1565556) ("TICKINTERVAL" . 1045845) ("TICKLAYOUT" . 1045848) ("TICKLEN" . 1045855) ("TICKTEXT" . 1362754) ("TICKUNITS" . 1362791) ("TICKVALUES" . 1281692) ("TITLE" . 1045882) ("USE_TEXT_COLOR" . 1045887) ("XCOORD_CONV" . 1045891) ("YCOORD_CONV" . 1045897) ("ZCOORD_CONV" . 1045903)))
-    ("GetCTM" fun "IDLgrAxis" (system) "Result = Obj->[%s::]%s()" ("objects_gr6.html" ("DESTINATION" . 1092556) ("PATH" . 1007341) ("TOP" . 1007347)))
-    ("Init" fun "IDLgrAxis" (system) "Result = Obj->[%s::]%s([, Direction])" ("objects_gr8.html" ) ("objects_gr4.html" ("ALPHA_CHANNEL" . 1486818) ("AM_PM" . 1045715) ("CLIP_PLANES" . 1045717) ("COLOR" . 1045723) ("DAYS_OF_WEEK" . 1045725) ("DEPTH_TEST_DISABLE" . 1045727) ("DEPTH_TEST_FUNCTION" . 1093233) ("DEPTH_WRITE_DISABLE" . 1093333) ("DIRECTION" . 1093366) ("EXACT" . 1045730) ("EXTEND" . 1045732) ("GRIDSTYLE" . 1045735) ("HIDE" . 1048340) ("LOCATION" . 1048266) ("LOG" . 1045756) ("MAJOR" . 1045758) ("MINOR" . 1045760) ("MONTHS" . 1045762) ("NOTEXT" . 1045766) ("RANGE" . 1045770) ("REGISTER_PROPERTIES" . 1045772) ("SUBTICKLEN" . 1093445) ("TEXTALIGNMENTS" . 1045774) ("TEXTBASELINE" . 1048408) ("TEXTPOS" . 1045782) ("TEXTUPDIR" . 1045815) ("THICK" . 1045821) ("TICKDIR" . 1045823) ("TICKFORMAT" . 1565506) ("TICKFRMTDATA" . 1565556) ("TICKINTERVAL" . 1045845) ("TICKLAYOUT" . 1045848) ("TICKLEN" . 1045855) ("TICKTEXT" . 1362754) ("TICKUNITS" . 1362791) ("TICKVALUES" . 1281692) ("TITLE" . 1045882) ("USE_TEXT_COLOR" . 1045887) ("XCOORD_CONV" . 1045891) ("YCOORD_CONV" . 1045897) ("ZCOORD_CONV" . 1045903)))
-    ("Cleanup" pro "IDLgrBuffer" (system) "Obj->[%s::]%s" ("objects_gr12.html"))
-    ("Draw" pro "IDLgrBuffer" (system) "Obj->[%s::]%s [, Picture]" ("objects_gr13.html" ("CREATE_INSTANCE" . 1007844) ("DRAW_INSTANCE" . 1007846)))
-    ("Erase" pro "IDLgrBuffer" (system) "Obj->[%s::]%s" ("objects_gr14.html" ("COLOR" . 1007879)))
-    ("GetDeviceInfo" pro "IDLgrBuffer" (system) "Obj->[%s::]%s" ("objects_gr16.html" ("ALL" . 1007957) ("MAX_NUM_CLIP_PLANES" . 1007959) ("MAX_TEXTURE_DIMENSIONS" . 1007961) ("MAX_VIEWPORT_DIMENSIONS" . 1007963) ("NAME" . 1007965) ("NUM_CPUS" . 1007967) ("VENDOR" . 1007970) ("VERSION" . 1007972)))
-    ("GetProperty" pro "IDLgrBuffer" (system) "Obj->[%s::]%s" ("objects_gr18.html" ) ("objects_gr11.html" ("ALL" . 1050118) ("COLOR_MODEL" . 1050137) ("DIMENSIONS" . 1050141) ("GRAPHICS_TREE" . 1050143) ("IMAGE_DATA" . 1050202) ("N_COLORS" . 1092707) ("PALETTE" . 1050147) ("QUALITY" . 1050149) ("RESOLUTION" . 1093499) ("SCREEN_DIMENSIONS" . 1050191) ("UNITS" . 1050189) ("ZBUFFER_DATA" . 1050181)))
-    ("SetProperty" pro "IDLgrBuffer" (system) "Obj->[%s::]%s" ("objects_gr24.html" ) ("objects_gr11.html" ("COLOR_MODEL" . 1050137) ("DIMENSIONS" . 1050141) ("GRAPHICS_TREE" . 1050143) ("PALETTE" . 1050147) ("QUALITY" . 1050149) ("RESOLUTION" . 1093499) ("UNITS" . 1050189)))
-    ("GetContiguousPixels" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s()" ("objects_gr15.html"))
-    ("GetFontnames" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s( FamilyName)" ("objects_gr17.html" ("IDL_FONTS" . 1008013) ("STYLES" . 1008015)))
-    ("GetTextDimensions" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s( TextObj)" ("objects_gr19.html" ("DESCENT" . 1008088) ("PATH" . 1008090)))
-    ("Init" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s()" ("objects_gr20.html" ) ("objects_gr11.html" ("COLOR_MODEL" . 1050137) ("DIMENSIONS" . 1050141) ("GRAPHICS_TREE" . 1050143) ("N_COLORS" . 1092707) ("PALETTE" . 1050147) ("QUALITY" . 1050149) ("REGISTER_PROPERTIES" . 1050154) ("RESOLUTION" . 1093499) ("UNITS" . 1050189)))
-    ("PickData" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s( View, Object, Location, XYZLocation)" ("objects_gr21.html" ("DIMENSIONS" . 1008204) ("PATH" . 1008208) ("PICK_STATUS" . 1008214)))
-    ("Read" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s()" ("objects_gr22.html"))
-    ("Select" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s(Picture, XY)" ("objects_gr23.html" ("DIMENSIONS" . 1008316) ("ORDER" . 1008320) ("SUB_SELECTION" . 1343723) ("UNITS" . 1008323)))
-    ("Cleanup" pro "IDLgrClipboard" (system) "Obj->[%s::]%s" ("objects_gr27.html"))
-    ("Draw" pro "IDLgrClipboard" (system) "Obj->[%s::]%s [, Picture]" ("objects_gr28.html" ("CMYK" . 1345463) ("FILENAME" . 1008514) ("POSTSCRIPT" . 1008516) ("VECT_SHADING" . 1340124) ("VECT_SORTING" . 1340189) ("VECT_TEXT_RENDER_METHOD" . 1340235) ("VECTOR" . 1008518)))
-    ("GetDeviceInfo" pro "IDLgrClipboard" (system) "Obj->[%s::]%s" ("objects_gr30.html" ("ALL" . 1008688) ("MAX_NUM_CLIP_PLANES" . 1008690) ("MAX_TEXTURE_DIMENSIONS" . 1008692) ("MAX_VIEWPORT_DIMENSIONS" . 1008694) ("NAME" . 1008696) ("NUM_CPUS" . 1008698) ("VENDOR" . 1008701) ("VERSION" . 1008703)))
-    ("GetProperty" pro "IDLgrClipboard" (system) "Obj->[%s::]%s" ("objects_gr32.html" ) ("objects_gr26.html" ("ALL" . 1050377) ("COLOR_MODEL" . 1050391) ("DIMENSIONS" . 1050395) ("GRAPHICS_TREE" . 1050397) ("N_COLORS" . 1050399) ("PALETTE" . 1050401) ("QUALITY" . 1050403) ("RESOLUTION" . 1093541) ("SCREEN_DIMENSIONS" . 1050442) ("UNITS" . 1050439)))
-    ("SetProperty" pro "IDLgrClipboard" (system) "Obj->[%s::]%s" ("objects_gr35.html" ) ("objects_gr26.html" ("DIMENSIONS" . 1050395) ("GRAPHICS_TREE" . 1050397) ("PALETTE" . 1050401) ("QUALITY" . 1050403) ("RESOLUTION" . 1093541) ("UNITS" . 1050439)))
-    ("GetContiguousPixels" fun "IDLgrClipboard" (system) "Result = Obj->[%s::]%s()" ("objects_gr29.html"))
-    ("GetFontnames" fun "IDLgrClipboard" (system) "Result = Obj->[%s::]%s( FamilyName)" ("objects_gr31.html" ("IDL_FONTS" . 1008744) ("STYLES" . 1008746)))
-    ("GetTextDimensions" fun "IDLgrClipboard" (system) "Result = Obj->[%s::]%s( TextObj)" ("objects_gr33.html" ("DESCENT" . 1008820) ("PATH" . 1008822)))
-    ("Init" fun "IDLgrClipboard" (system) "Result = Obj->[%s::]%s()" ("objects_gr34.html" ) ("objects_gr26.html" ("COLOR_MODEL" . 1050391) ("DIMENSIONS" . 1050395) ("GRAPHICS_TREE" . 1050397) ("N_COLORS" . 1050399) ("PALETTE" . 1050401) ("QUALITY" . 1050403) ("REGISTER_PROPERTIES" . 1050408) ("RESOLUTION" . 1093541) ("UNITS" . 1050439)))
-    ("Cleanup" pro "IDLgrColorbar" (system) "Obj->[%s::]%s" ("objects_gr38.html"))
-    ("GetProperty" pro "IDLgrColorbar" (system) "Obj->[%s::]%s" ("objects_gr40.html" ) ("objects_gr37.html" ("ALL" . 1050584) ("BLUE_VALUES" . 1050601) ("COLOR" . 1050603) ("DIMENSIONS" . 1050605) ("GREEN_VALUES" . 1050607) ("HIDE" . 1050609) ("MAJOR" . 1050613) ("MINOR" . 1050615) ("PALETTE" . 1050619) ("PARENT" . 1050728) ("RED_VALUES" . 1050726) ("SHOW_AXIS" . 1050623) ("SHOW_OUTLINE" . 1050628) ("SUBTICKLEN" . 1050632) ("THICK" . 1050634) ("THREED" . 1050636) ("TICKFORMAT" . 1050638) ("TICKFRMTDATA" . 1050643) ("TICKLEN" . 1050645) ("TICKTEXT" . 1050647) ("TICKVALUES" . 1050649) ("TITLE" . 1050651) ("XCOORD_CONV" . 1050655) ("XRANGE" . 1050718) ("YCOORD_CONV" . 1050716) ("YRANGE" . 1050708) ("ZCOORD_CONV" . 1050706) ("ZRANGE" . 1050697)))
-    ("SetProperty" pro "IDLgrColorbar" (system) "Obj->[%s::]%s" ("objects_gr42.html" ) ("objects_gr37.html" ("BLUE_VALUES" . 1050601) ("COLOR" . 1050603) ("DIMENSIONS" . 1050605) ("GREEN_VALUES" . 1050607) ("HIDE" . 1050609) ("MAJOR" . 1050613) ("MINOR" . 1050615) ("PALETTE" . 1050619) ("RED_VALUES" . 1050726) ("SHOW_AXIS" . 1050623) ("SHOW_OUTLINE" . 1050628) ("SUBTICKLEN" . 1050632) ("THICK" . 1050634) ("THREED" . 1050636) ("TICKFORMAT" . 1050638) ("TICKFRMTDATA" . 1050643) ("TICKLEN" . 1050645) ("TICKTEXT" . 1050647) ("TICKVALUES" . 1050649) ("TITLE" . 1050651) ("XCOORD_CONV" . 1050655) ("YCOORD_CONV" . 1050716) ("ZCOORD_CONV" . 1050706)))
-    ("ComputeDimensions" fun "IDLgrColorbar" (system) "Result = Obj->[%s::]%s( DestinationObj)" ("objects_gr39.html" ("PATH" . 1009084)))
-    ("Init" fun "IDLgrColorbar" (system) "Result = Obj->[%s::]%s([, aRed, aGreen, aBlue])" ("objects_gr41.html" ) ("objects_gr37.html" ("BLUE_VALUES" . 1050601) ("COLOR" . 1050603) ("DIMENSIONS" . 1050605) ("GREEN_VALUES" . 1050607) ("HIDE" . 1050609) ("MAJOR" . 1050613) ("MINOR" . 1050615) ("PALETTE" . 1050619) ("RED_VALUES" . 1050726) ("SHOW_AXIS" . 1050623) ("SHOW_OUTLINE" . 1050628) ("SUBTICKLEN" . 1050632) ("THICK" . 1050634) ("THREED" . 1050636) ("TICKFORMAT" . 1050638) ("TICKFRMTDATA" . 1050643) ("TICKLEN" . 1050645) ("TICKTEXT" . 1050647) ("TICKVALUES" . 1050649) ("TITLE" . 1050651) ("XCOORD_CONV" . 1050655) ("YCOORD_CONV" . 1050716) ("ZCOORD_CONV" . 1050706)))
-    ("AdjustLabelOffsets" pro "IDLgrContour" (system) "Obj->[%s::]%s, LevelIndex, LabelOffsets" ("objects_gr45.html"))
-    ("Cleanup" pro "IDLgrContour" (system) "Obj->[%s::]%s" ("objects_gr46.html"))
-    ("GetLabelInfo" pro "IDLgrContour" (system) "Obj->[%s::]%s, Destination, LevelIndex" ("objects_gr48.html" ("LABEL_OBJECTS" . 1009508) ("LABEL_OFFSETS" . 1009503) ("LABEL_POLYLINES" . 1009505)))
-    ("GetProperty" pro "IDLgrContour" (system) "Obj->[%s::]%s" ("objects_gr49.html" ) ("objects_gr44.html" ("ALL" . 1050990) ("ALPHA_CHANNEL" . 1312243) ("AM_PM" . 1051012) ("ANISOTROPY" . 1051014) ("C_COLOR" . 1051029) ("C_FILL_PATTERN" . 1051031) ("C_LABEL_INTERVAL" . 1051033) ("C_LABEL_NOGAPS" . 1051035) ("C_LABEL_OBJECTS" . 1051037) ("C_LABEL_SHOW" . 1051044) ("C_LINESTYLE" . 1051046) ("C_THICK" . 1051056) ("C_USE_LABEL_COLOR" . 1066031) ("C_USE_LABEL_ORIENTATION" . 1051060) ("C_VALUE" . 1051062) ("CLIP_PLANES" . 1051064) ("COLOR" . 1051069) ("DATA_VALUES" . 1051071) ("DAYS_OF_WEEK" . 1051073) ("DEPTH_OFFSET" . 1051075) ("DEPTH_TEST_DISABLE" . 1051081) ("DEPTH_TEST_FUNCTION" . 1093566) ("DEPTH_WRITE_DISABLE" . 1093567) ("DOUBLE_DATA" . 1093568) ("DOUBLE_GEOM" . 1051083) ("DOWNHILL" . 1051085) ("FILL" . 1051087) ("GEOM" . 1051284) ("HIDE" . 1051101) ("LABEL_FONT" . 1051105) ("LABEL_FORMAT" . 1051107) ("LABEL_UNITS" . 1051116) ("MAX_VALUE" . 1051130) ("MIN_VALUE" . 1051134) ("MONTHS" . 1051132) ("N_LEVELS" . 1051138) ("PARENT" . 1051274) ("PLANAR" . 1051272) ("POLYGONS" . 1051144) ("SHADE_RANGE" . 1094439) ("SHADING" . 1051149) ("TICKINTERVAL" . 1051154) ("TICKLEN" . 1051156) ("USE_TEXT_ALIGNMENTS" . 1051158) ("XCOORD_CONV" . 1051162) ("XRANGE" . 1051264) ("YCOORD_CONV" . 1051168) ("YRANGE" . 1051250) ("ZCOORD_CONV" . 1051174) ("ZRANGE" . 1051240)))
-    ("SetProperty" pro "IDLgrContour" (system) "Obj->[%s::]%s" ("objects_gr51.html" ) ("objects_gr44.html" ("ALPHA_CHANNEL" . 1312243) ("AM_PM" . 1051012) ("ANISOTROPY" . 1051014) ("C_COLOR" . 1051029) ("C_FILL_PATTERN" . 1051031) ("C_LABEL_INTERVAL" . 1051033) ("C_LABEL_NOGAPS" . 1051035) ("C_LABEL_OBJECTS" . 1051037) ("C_LABEL_SHOW" . 1051044) ("C_LINESTYLE" . 1051046) ("C_THICK" . 1051056) ("C_USE_LABEL_COLOR" . 1066031) ("C_USE_LABEL_ORIENTATION" . 1051060) ("C_VALUE" . 1051062) ("CLIP_PLANES" . 1051064) ("COLOR" . 1051069) ("DATA_VALUES" . 1051071) ("DAYS_OF_WEEK" . 1051073) ("DEPTH_OFFSET" . 1051075) ("DEPTH_TEST_DISABLE" . 1051081) ("DEPTH_TEST_FUNCTION" . 1093566) ("DEPTH_WRITE_DISABLE" . 1093567) ("DOUBLE_DATA" . 1093568) ("DOUBLE_GEOM" . 1051083) ("DOWNHILL" . 1051085) ("FILL" . 1051087) ("GEOMX" . 1051282) ("GEOMY" . 1051091) ("GEOMZ" . 1051093) ("HIDE" . 1051101) ("LABEL_FONT" . 1051105) ("LABEL_FORMAT" . 1051107) ("LABEL_UNITS" . 1051116) ("MAX_VALUE" . 1051130) ("MIN_VALUE" . 1051134) ("MONTHS" . 1051132) ("N_LEVELS" . 1051138) ("PLANAR" . 1051272) ("POLYGONS" . 1051144) ("SHADE_RANGE" . 1094439) ("SHADING" . 1051149) ("TICKINTERVAL" . 1051154) ("TICKLEN" . 1051156) ("USE_TEXT_ALIGNMENTS" . 1051158) ("XCOORD_CONV" . 1051162) ("YCOORD_CONV" . 1051168) ("ZCOORD_CONV" . 1051174)))
-    ("GetCTM" fun "IDLgrContour" (system) "Result = Obj->[%s::]%s()" ("objects_gr47.html" ("DESTINATION" . 1009456) ("PATH" . 1009458) ("TOP" . 1009464)))
-    ("Init" fun "IDLgrContour" (system) "Result = Obj->[%s::]%s([, Values])" ("objects_gr50.html" ) ("objects_gr44.html" ("ALPHA_CHANNEL" . 1312243) ("AM_PM" . 1051012) ("ANISOTROPY" . 1051014) ("C_COLOR" . 1051029) ("C_FILL_PATTERN" . 1051031) ("C_LABEL_INTERVAL" . 1051033) ("C_LABEL_NOGAPS" . 1051035) ("C_LABEL_OBJECTS" . 1051037) ("C_LABEL_SHOW" . 1051044) ("C_LINESTYLE" . 1051046) ("C_THICK" . 1051056) ("C_USE_LABEL_COLOR" . 1066031) ("C_USE_LABEL_ORIENTATION" . 1051060) ("C_VALUE" . 1051062) ("CLIP_PLANES" . 1051064) ("COLOR" . 1051069) ("DATA_VALUES" . 1051071) ("DAYS_OF_WEEK" . 1051073) ("DEPTH_OFFSET" . 1051075) ("DEPTH_TEST_DISABLE" . 1051081) ("DEPTH_TEST_FUNCTION" . 1093566) ("DEPTH_WRITE_DISABLE" . 1093567) ("DOUBLE_DATA" . 1093568) ("DOUBLE_GEOM" . 1051083) ("DOWNHILL" . 1051085) ("FILL" . 1051087) ("GEOMX" . 1051282) ("GEOMY" . 1051091) ("GEOMZ" . 1051093) ("HIDE" . 1051101) ("LABEL_FONT" . 1051105) ("LABEL_FORMAT" . 1051107) ("LABEL_FRMTDATA" . 1051113) ("LABEL_UNITS" . 1051116) ("MAX_VALUE" . 1051130) ("MIN_VALUE" . 1051134) ("MONTHS" . 1051132) ("N_LEVELS" . 1051138) ("PALETTE" . 1051140) ("PLANAR" . 1051272) ("POLYGONS" . 1051144) ("REGISTER_PROPERTIES" . 1051147) ("SHADE_RANGE" . 1094439) ("SHADING" . 1051149) ("TICKINTERVAL" . 1051154) ("TICKLEN" . 1051156) ("USE_TEXT_ALIGNMENTS" . 1051158) ("XCOORD_CONV" . 1051162) ("YCOORD_CONV" . 1051168) ("ZCOORD_CONV" . 1051174)))
-    ("Cleanup" pro "IDLgrFont" (system) "Obj->[%s::]%s" ("objects_gr54.html"))
-    ("GetProperty" pro "IDLgrFont" (system) "Obj->[%s::]%s" ("objects_gr55.html" ) ("objects_gr53.html" ("ALL" . 1051913) ("SIZE" . 1051936) ("SUBSTITUTE" . 1051938) ("THICK" . 1051940)))
-    ("SetProperty" pro "IDLgrFont" (system) "Obj->[%s::]%s" ("objects_gr57.html" ) ("objects_gr53.html" ("SIZE" . 1051936) ("SUBSTITUTE" . 1051938) ("THICK" . 1051940)))
-    ("Init" fun "IDLgrFont" (system) "Result = Obj->[%s::]%s([, Fontname])" ("objects_gr56.html" ) ("objects_gr53.html" ("SIZE" . 1051936) ("SUBSTITUTE" . 1051938) ("THICK" . 1051940)))
-    ("Cleanup" pro "IDLgrImage" (system) "Obj->[%s::]%s" ("objects_gr60.html"))
-    ("GetProperty" pro "IDLgrImage" (system) "Obj->[%s::]%s" ("objects_gr62.html" ) ("objects_gr59.html" ("ALL" . 1052050) ("BLEND_FUNCTION" . 1052068) ("CHANNEL" . 1052124) ("CLIP_PLANES" . 1287882) ("DATA" . 1052132) ("DEPTH_TEST_DISABLE" . 1095165) ("DEPTH_TEST_FUNCTION" . 1095212) ("DEPTH_WRITE_DISABLE" . 1095251) ("DIMENSIONS" . 1095169) ("GREYSCALE" . 1052136) ("HIDE" . 1052140) ("INTERLEAVE" . 1052144) ("INTERPOLATE" . 1052150) ("LOCATION" . 1052152) ("NO_COPY" . 1052156) ("ORDER" . 1052158) ("PALETTE" . 1052160) ("PARENT" . 1052253) ("SUB_RECT" . 1052171) ("XCOORD_CONV" . 1052175) ("XRANGE" . 1052243) ("YCOORD_CONV" . 1052181) ("YRANGE" . 1052233) ("ZCOORD_CONV" . 1052187) ("ZRANGE" . 1052223)))
-    ("SetProperty" pro "IDLgrImage" (system) "Obj->[%s::]%s" ("objects_gr64.html" ) ("objects_gr59.html" ("BLEND_FUNCTION" . 1052068) ("CHANNEL" . 1052124) ("CLIP_PLANES" . 1287882) ("DATA" . 1052132) ("DEPTH_TEST_DISABLE" . 1095165) ("DEPTH_TEST_FUNCTION" . 1095212) ("DEPTH_WRITE_DISABLE" . 1095251) ("DIMENSIONS" . 1095169) ("GREYSCALE" . 1052136) ("HIDE" . 1052140) ("INTERLEAVE" . 1052144) ("INTERPOLATE" . 1052150) ("LOCATION" . 1052152) ("NO_COPY" . 1052156) ("ORDER" . 1052158) ("PALETTE" . 1052160) ("RESET_DATA" . 1093772) ("SHARE_DATA" . 1052169) ("SUB_RECT" . 1052171) ("XCOORD_CONV" . 1052175) ("YCOORD_CONV" . 1052181) ("ZCOORD_CONV" . 1052187)))
-    ("GetCTM" fun "IDLgrImage" (system) "Result = Obj->[%s::]%s()" ("objects_gr61.html" ("DESTINATION" . 1010164) ("PATH" . 1010166) ("TOP" . 1010172)))
-    ("Init" fun "IDLgrImage" (system) "Result = Obj->[%s::]%s([, ImageData])" ("objects_gr63.html" ) ("objects_gr59.html" ("BLEND_FUNCTION" . 1052068) ("CHANNEL" . 1052124) ("CLIP_PLANES" . 1287882) ("DATA" . 1052132) ("DEPTH_TEST_DISABLE" . 1095165) ("DEPTH_TEST_FUNCTION" . 1095212) ("DEPTH_WRITE_DISABLE" . 1095251) ("DIMENSIONS" . 1095169) ("GREYSCALE" . 1052136) ("HIDE" . 1052140) ("INTERLEAVE" . 1052144) ("INTERPOLATE" . 1052150) ("LOCATION" . 1052152) ("NO_COPY" . 1052156) ("ORDER" . 1052158) ("PALETTE" . 1052160) ("REGISTER_PROPERTIES" . 1052251) ("RESET_DATA" . 1093772) ("SHARE_DATA" . 1052169) ("SUB_RECT" . 1052171) ("XCOORD_CONV" . 1052175) ("YCOORD_CONV" . 1052181) ("ZCOORD_CONV" . 1052187)))
-    ("Cleanup" pro "IDLgrLegend" (system) "Obj->[%s::]%s" ("objects_gr67.html"))
-    ("GetProperty" pro "IDLgrLegend" (system) "Obj->[%s::]%s" ("objects_gr69.html" ) ("objects_gr66.html" ("ALL" . 1053896) ("BORDER_GAP" . 1053903) ("COLUMNS" . 1053905) ("FILL_COLOR" . 1053907) ("FONT" . 1053909) ("GAP" . 1053912) ("GLYPH_WIDTH" . 1053914) ("HIDE" . 1053916) ("ITEM_COLOR" . 1069308) ("ITEM_LINESTYLE" . 1053922) ("ITEM_NAME" . 1053935) ("ITEM_OBJECT" . 1053937) ("ITEM_THICK" . 1053940) ("ITEM_TYPE" . 1053942) ("OUTLINE_COLOR" . 1053948) ("OUTLINE_THICK" . 1053950) ("PARENT" . 1055362) ("SHOW_FILL" . 1053952) ("SHOW_OUTLINE" . 1053956) ("TEXT_COLOR" . 1053960) ("TITLE" . 1053962) ("XCOORD_CONV" . 1053966) ("XRANGE" . 1055399) ("YCOORD_CONV" . 1053972) ("YRANGE" . 1055389) ("ZCOORD_CONV" . 1053978) ("ZRANGE" . 1070059)))
-    ("SetProperty" pro "IDLgrLegend" (system) "Obj->[%s::]%s" ("objects_gr71.html" ) ("objects_gr66.html" ("BORDER_GAP" . 1053903) ("COLUMNS" . 1053905) ("FILL_COLOR" . 1053907) ("FONT" . 1053909) ("GAP" . 1053912) ("GLYPH_WIDTH" . 1053914) ("HIDE" . 1053916) ("ITEM_COLOR" . 1069308) ("ITEM_LINESTYLE" . 1053922) ("ITEM_NAME" . 1053935) ("ITEM_OBJECT" . 1053937) ("ITEM_THICK" . 1053940) ("ITEM_TYPE" . 1053942) ("OUTLINE_COLOR" . 1053948) ("OUTLINE_THICK" . 1053950) ("RECOMPUTE" . 1055360) ("SHOW_FILL" . 1053952) ("SHOW_OUTLINE" . 1053956) ("TEXT_COLOR" . 1053960) ("TITLE" . 1053962) ("XCOORD_CONV" . 1053966) ("YCOORD_CONV" . 1053972) ("ZCOORD_CONV" . 1053978)))
-    ("ComputeDimensions" fun "IDLgrLegend" (system) "Result = Obj->[%s::]%s( DestinationObject)" ("objects_gr68.html" ("PATH" . 1010563)))
-    ("Init" fun "IDLgrLegend" (system) "Result = Obj->[%s::]%s([, aItemNames])" ("objects_gr70.html" ) ("objects_gr66.html" ("BORDER_GAP" . 1053903) ("COLUMNS" . 1053905) ("FILL_COLOR" . 1053907) ("FONT" . 1053909) ("GAP" . 1053912) ("GLYPH_WIDTH" . 1053914) ("HIDE" . 1053916) ("ITEM_COLOR" . 1069308) ("ITEM_LINESTYLE" . 1053922) ("ITEM_NAME" . 1053935) ("ITEM_OBJECT" . 1053937) ("ITEM_THICK" . 1053940) ("ITEM_TYPE" . 1053942) ("OUTLINE_COLOR" . 1053948) ("OUTLINE_THICK" . 1053950) ("SHOW_FILL" . 1053952) ("SHOW_OUTLINE" . 1053956) ("TEXT_COLOR" . 1053960) ("TITLE" . 1053962) ("XCOORD_CONV" . 1053966) ("YCOORD_CONV" . 1053972) ("ZCOORD_CONV" . 1053978)))
-    ("Cleanup" pro "IDLgrLight" (system) "Obj->[%s::]%s" ("objects_gr74.html"))
-    ("GetProperty" pro "IDLgrLight" (system) "Obj->[%s::]%s" ("objects_gr76.html" ) ("objects_gr73.html" ("ALL" . 1055555) ("ATTENUATION" . 1055572) ("COLOR" . 1055581) ("CONEANGLE" . 1055583) ("DIRECTION" . 1055585) ("FOCUS" . 1055588) ("HIDE" . 1055590) ("INTENSITY" . 1055595) ("LOCATION" . 1055597) ("PALETTE" . 1088211) ("PARENT" . 1055635) ("TYPE" . 1093801) ("XCOORD_CONV" . 1055609) ("YCOORD_CONV" . 1055615) ("ZCOORD_CONV" . 1055621)))
-    ("SetProperty" pro "IDLgrLight" (system) "Obj->[%s::]%s" ("objects_gr78.html" ) ("objects_gr73.html" ("ATTENUATION" . 1055572) ("COLOR" . 1055581) ("CONEANGLE" . 1055583) ("DIRECTION" . 1055585) ("FOCUS" . 1055588) ("HIDE" . 1055590) ("INTENSITY" . 1055595) ("LOCATION" . 1055597) ("PALETTE" . 1088211) ("TYPE" . 1093801) ("XCOORD_CONV" . 1055609) ("YCOORD_CONV" . 1055615) ("ZCOORD_CONV" . 1055621)))
-    ("GetCTM" fun "IDLgrLight" (system) "Result = Obj->[%s::]%s()" ("objects_gr75.html" ("DESTINATION" . 1010900) ("PATH" . 1010902) ("TOP" . 1010908)))
-    ("Init" fun "IDLgrLight" (system) "Result = Obj->[%s::]%s()" ("objects_gr77.html" ) ("objects_gr73.html" ("ATTENUATION" . 1055572) ("COLOR" . 1055581) ("CONEANGLE" . 1055583) ("DIRECTION" . 1055585) ("FOCUS" . 1055588) ("HIDE" . 1055590) ("INTENSITY" . 1055595) ("LOCATION" . 1055597) ("PALETTE" . 1088211) ("REGISTER_PROPERTIES" . 1088158) ("TYPE" . 1093801) ("XCOORD_CONV" . 1055609) ("YCOORD_CONV" . 1055615) ("ZCOORD_CONV" . 1055621)))
-    ("Add" pro "IDLgrModel" (system) "Obj->[%s::]%s, Object" ("objects_gr81.html" ("ALIAS" . 1011206) ("POSITION" . 1011208)))
-    ("Cleanup" pro "IDLgrModel" (system) "Obj->[%s::]%s" ("objects_gr82.html"))
-    ("Draw" pro "IDLgrModel" (system) "Obj->[%s::]%s, Destination, Picture" ("objects_gr83.html"))
-    ("GetProperty" pro "IDLgrModel" (system) "Obj->[%s::]%s" ("objects_gr86.html" ) ("objects_gr80.html" ("ALL" . 1055726) ("CLIP_PLANES" . 1055740) ("DEPTH_TEST_DISABLE" . 1094976) ("DEPTH_TEST_FUNCTION" . 1095322) ("DEPTH_WRITE_DISABLE" . 1095361) ("HIDE" . 1088312) ("LIGHTING" . 1055751) ("PARENT" . 1055781) ("SELECT_TARGET" . 1093831) ("TRANSFORM" . 1055764)))
-    ("Reset" pro "IDLgrModel" (system) "Obj->[%s::]%s" ("objects_gr88.html"))
-    ("Rotate" pro "IDLgrModel" (system) "Obj->[%s::]%s, Axis, Angle" ("objects_gr89.html" ("PREMULTIPLY" . 1011584)))
-    ("Scale" pro "IDLgrModel" (system) "Obj->[%s::]%s, Sx, Sy, Sz" ("objects_gr90.html" ("PREMULTIPLY" . 1011618)))
-    ("SetProperty" pro "IDLgrModel" (system) "Obj->[%s::]%s" ("objects_gr91.html" ) ("objects_gr80.html" ("CLIP_PLANES" . 1055740) ("DEPTH_TEST_DISABLE" . 1094976) ("DEPTH_TEST_FUNCTION" . 1095322) ("DEPTH_WRITE_DISABLE" . 1095361) ("HIDE" . 1088312) ("LIGHTING" . 1055751) ("SELECT_TARGET" . 1093831) ("TRANSFORM" . 1055764)))
-    ("Translate" pro "IDLgrModel" (system) "Obj->[%s::]%s, Tx, Ty, Tz" ("objects_gr92.html" ("PREMULTIPLY" . 1011687)))
-    ("GetByName" fun "IDLgrModel" (system) "Result = Obj->[%s::]%s(Name)" ("objects_gr84.html"))
-    ("GetCTM" fun "IDLgrModel" (system) "Result = Obj->[%s::]%s()" ("objects_gr85.html" ("DESTINATION" . 1011369) ("PATH" . 1011371) ("TOP" . 1011377)))
-    ("Init" fun "IDLgrModel" (system) "Result = Obj->[%s::]%s()" ("objects_gr87.html" ) ("objects_gr80.html" ("CLIP_PLANES" . 1055740) ("DEPTH_TEST_DISABLE" . 1094976) ("DEPTH_TEST_FUNCTION" . 1095322) ("DEPTH_WRITE_DISABLE" . 1095361) ("HIDE" . 1088312) ("LIGHTING" . 1055751) ("REGISTER_PROPERTIES" . 1055779) ("SELECT_TARGET" . 1093831) ("TRANSFORM" . 1055764)))
-    ("Cleanup" pro "IDLgrMPEG" (system) "Obj->[%s::]%s" ("objects_gr95.html"))
-    ("GetProperty" pro "IDLgrMPEG" (system) "Obj->[%s::]%s" ("objects_gr96.html" ) ("objects_gr94.html" ("ALL" . 1055838) ("BITRATE" . 1055845) ("FILENAME" . 1055875) ("FORMAT" . 1055877) ("FRAME_RATE" . 1055881) ("IFRAME_GAP" . 1055927) ("INTERLACED" . 1055934) ("MOTION_VEC_LENGTH" . 1055936) ("QUALITY" . 1055964) ("SCALE" . 1055967) ("STATISTICS" . 1055969)))
-    ("Put" pro "IDLgrMPEG" (system) "Obj->[%s::]%s, Image[, Frame]" ("objects_gr98.html"))
-    ("Save" pro "IDLgrMPEG" (system) "Obj->[%s::]%s" ("objects_gr99.html" ("FILENAME" . 1012062)))
-    ("SetProperty" pro "IDLgrMPEG" (system) "Obj->[%s::]%s" ("objects_gr100.html" ) ("objects_gr94.html" ("BITRATE" . 1055845) ("FILENAME" . 1055875) ("FORMAT" . 1055877) ("FRAME_RATE" . 1055881) ("IFRAME_GAP" . 1055927) ("INTERLACED" . 1055934) ("MOTION_VEC_LENGTH" . 1055936) ("QUALITY" . 1055964) ("SCALE" . 1055967) ("STATISTICS" . 1055969)))
-    ("Init" fun "IDLgrMPEG" (system) "Result = Obj->[%s::]%s()" ("objects_gr97.html" ) ("objects_gr94.html" ("BITRATE" . 1055845) ("FILENAME" . 1055875) ("FORMAT" . 1055877) ("FRAME_RATE" . 1055881) ("IFRAME_GAP" . 1055927) ("INTERLACED" . 1055934) ("MOTION_VEC_LENGTH" . 1055936) ("QUALITY" . 1055964) ("SCALE" . 1055967) ("STATISTICS" . 1055969) ("TEMP_DIRECTORY" . 1055971)))
-    ("Cleanup" pro "IDLgrPalette" (system) "Obj->[%s::]%s" ("objects_gr103.html"))
-    ("GetProperty" pro "IDLgrPalette" (system) "Obj->[%s::]%s" ("objects_gr105.html" ) ("objects_gr102.html" ("ALL" . 1056048) ("BLUE_VALUES" . 1056069) ("BOTTOM_STRETCH" . 1056071) ("GAMMA" . 1056073) ("GREEN_VALUES" . 1056075) ("N_COLORS" . 1056093) ("RED_VALUES" . 1056079) ("TOP_STRETCH" . 1056081)))
-    ("LoadCT" pro "IDLgrPalette" (system) "Obj->[%s::]%s, TableNum" ("objects_gr107.html" ("FILE" . 1012379)))
-    ("SetProperty" pro "IDLgrPalette" (system) "Obj->[%s::]%s" ("objects_gr110.html" ) ("objects_gr102.html" ("BLUE_VALUES" . 1056069) ("BOTTOM_STRETCH" . 1056071) ("GAMMA" . 1056073) ("GREEN_VALUES" . 1056075) ("RED_VALUES" . 1056079) ("TOP_STRETCH" . 1056081)))
-    ("SetRGB" pro "IDLgrPalette" (system) "Obj->[%s::]%s, Index, Red, Green, Blue" ("objects_gr109.html"))
-    ("GetRGB" fun "IDLgrPalette" (system) "Result = Obj->[%s::]%s(Index)" ("objects_gr104.html"))
-    ("Init" fun "IDLgrPalette" (system) "Result = Obj->[%s::]%s(, aRed, aGreen, aBlue)" ("objects_gr106.html" ) ("objects_gr102.html" ("BLUE_VALUES" . 1056069) ("BOTTOM_STRETCH" . 1056071) ("GAMMA" . 1056073) ("GREEN_VALUES" . 1056075) ("RED_VALUES" . 1056079) ("TOP_STRETCH" . 1056081)))
-    ("NearestColor" fun "IDLgrPalette" (system) "Result = Obj->[%s::]%s(Red, Green, Blue)" ("objects_gr108.html"))
-    ("Cleanup" pro "IDLgrPattern" (system) "Obj->[%s::]%s" ("objects_gr113.html"))
-    ("GetProperty" pro "IDLgrPattern" (system) "Obj->[%s::]%s" ("objects_gr114.html" ) ("objects_gr112.html" ("ALL" . 1056154) ("ORIENTATION" . 1056165) ("PATTERN" . 1056169) ("SPACING" . 1056171) ("STYLE" . 1056173)))
-    ("SetProperty" pro "IDLgrPattern" (system) "Obj->[%s::]%s" ("objects_gr116.html" ) ("objects_gr112.html" ("ORIENTATION" . 1056165) ("PATTERN" . 1056169) ("SPACING" . 1056171) ("STYLE" . 1056173)))
-    ("Init" fun "IDLgrPattern" (system) "Result = Obj->[%s::]%s([, Style])" ("objects_gr115.html" ) ("objects_gr112.html" ("ORIENTATION" . 1056165) ("PATTERN" . 1056169) ("SPACING" . 1056171) ("STYLE" . 1056173) ("THICK" . 1056179)))
-    ("Cleanup" pro "IDLgrPlot" (system) "Obj->[%s::]%s" ("objects_gr119.html"))
-    ("GetProperty" pro "IDLgrPlot" (system) "Obj->[%s::]%s" ("objects_gr121.html" ) ("objects_gr118.html" ("ALL" . 1056243) ("ALPHA_CHANNEL" . 1056258) ("CLIP_PLANES" . 1314217) ("COLOR" . 1056263) ("DATA" . 1056381) ("DEPTH_TEST_DISABLE" . 1094982) ("DEPTH_TEST_FUNCTION" . 1095444) ("DEPTH_WRITE_DISABLE" . 1095483) ("DOUBLE" . 1056269) ("HIDE" . 1056271) ("HISTOGRAM" . 1092755) ("LINESTYLE" . 1056277) ("MAX_VALUE" . 1056290) ("MIN_VALUE" . 1056292) ("NSUM" . 1056296) ("PALETTE" . 1056298) ("PARENT" . 1056392) ("POLAR" . 1056389) ("SYMBOL" . 1056306) ("THICK" . 1056311) ("VERT_COLORS" . 1056317) ("XCOORD_CONV" . 1056319) ("XRANGE" . 1056325) ("YCOORD_CONV" . 1056327) ("YRANGE" . 1056333) ("ZCOORD_CONV" . 1056335) ("ZRANGE" . 1074286) ("ZVALUE" . 1056400)))
-    ("SetProperty" pro "IDLgrPlot" (system) "Obj->[%s::]%s" ("objects_gr123.html" ) ("objects_gr118.html" ("ALPHA_CHANNEL" . 1056258) ("CLIP_PLANES" . 1314217) ("COLOR" . 1056263) ("DATAX" . 1056378) ("DATAY" . 1056267) ("DEPTH_TEST_DISABLE" . 1094982) ("DEPTH_TEST_FUNCTION" . 1095444) ("DEPTH_WRITE_DISABLE" . 1095483) ("DOUBLE" . 1056269) ("HIDE" . 1056271) ("HISTOGRAM" . 1092755) ("LINESTYLE" . 1056277) ("MAX_VALUE" . 1056290) ("MIN_VALUE" . 1056292) ("NSUM" . 1056296) ("PALETTE" . 1056298) ("POLAR" . 1056389) ("RESET_DATA" . 1093845) ("SHARE_DATA" . 1056304) ("SYMBOL" . 1056306) ("THICK" . 1056311) ("VERT_COLORS" . 1056317) ("XCOORD_CONV" . 1056319) ("XRANGE" . 1056325) ("YCOORD_CONV" . 1056327) ("YRANGE" . 1056333) ("ZCOORD_CONV" . 1056335) ("ZVALUE" . 1056400)))
-    ("GetCTM" fun "IDLgrPlot" (system) "Result = Obj->[%s::]%s()" ("objects_gr120.html" ("DESTINATION" . 1012838) ("PATH" . 1012840) ("TOP" . 1012846)))
-    ("Init" fun "IDLgrPlot" (system) "Result = Obj->[%s::]%s([, [X,] Y])" ("objects_gr122.html" ) ("objects_gr118.html" ("ALPHA_CHANNEL" . 1056258) ("CLIP_PLANES" . 1314217) ("COLOR" . 1056263) ("DATAX" . 1056378) ("DATAY" . 1056267) ("DEPTH_TEST_DISABLE" . 1094982) ("DEPTH_TEST_FUNCTION" . 1095444) ("DEPTH_WRITE_DISABLE" . 1095483) ("DOUBLE" . 1056269) ("HIDE" . 1056271) ("HISTOGRAM" . 1092755) ("LINESTYLE" . 1056277) ("MAX_VALUE" . 1056290) ("MIN_VALUE" . 1056292) ("NSUM" . 1056296) ("PALETTE" . 1056298) ("POLAR" . 1056389) ("REGISTER_PROPERTIES" . 1056302) ("RESET_DATA" . 1093845) ("SHARE_DATA" . 1056304) ("SYMBOL" . 1056306) ("THICK" . 1056311) ("USE_ZVALUE" . 1056313) ("VERT_COLORS" . 1056317) ("XCOORD_CONV" . 1056319) ("XRANGE" . 1056325) ("YCOORD_CONV" . 1056327) ("YRANGE" . 1056333) ("ZCOORD_CONV" . 1056335) ("ZVALUE" . 1056400)))
-    ("Cleanup" pro "IDLgrPolygon" (system) "Obj->[%s::]%s" ("objects_gr126.html"))
-    ("GetProperty" pro "IDLgrPolygon" (system) "Obj->[%s::]%s" ("objects_gr128.html" ) ("objects_gr125.html" ("ALL" . 1056563) ("ALPHA_CHANNEL" . 1316054) ("AMBIENT" . 1309898) ("BOTTOM" . 1074388) ("CLIP_PLANES" . 1056581) ("COLOR" . 1056586) ("DATA" . 1309971) ("DEPTH_OFFSET" . 1056590) ("DEPTH_TEST_DISABLE" . 1094995) ("DEPTH_TEST_FUNCTION" . 1095559) ("DEPTH_WRITE_DISABLE" . 1095598) ("DIFFUSE" . 1310292) ("DOUBLE" . 1310286) ("EMISSION" . 1310032) ("FILL_PATTERN" . 1056598) ("HIDE" . 1056602) ("LINESTYLE" . 1056606) ("NORMALS" . 1056621) ("PARENT" . 1056792) ("POLYGONS" . 1056790) ("REJECT" . 1093870) ("SHADE_RANGE" . 1056643) ("SHADING" . 1056645) ("SHININESS" . 1310128) ("SPECULAR" . 1310225) ("STYLE" . 1310253) ("TEXTURE_COORD" . 1214343) ("TEXTURE_INTERP" . 1056664) ("TEXTURE_MAP" . 1056666) ("THICK" . 1056674) ("VERT_COLORS" . 1056679) ("XCOORD_CONV" . 1088401) ("XRANGE" . 1056808) ("YCOORD_CONV" . 1075980) ("YRANGE" . 1056822) ("ZCOORD_CONV" . 1056694) ("ZERO_OPACITY_SKIP" . 1056700) ("ZRANGE" . 1056834)))
-    ("SetProperty" pro "IDLgrPolygon" (system) "Obj->[%s::]%s" ("objects_gr130.html" ) ("objects_gr125.html" ("ALPHA_CHANNEL" . 1316054) ("AMBIENT" . 1309898) ("BOTTOM" . 1074388) ("CLIP_PLANES" . 1056581) ("COLOR" . 1056586) ("DATA" . 1309971) ("DEPTH_OFFSET" . 1056590) ("DEPTH_TEST_DISABLE" . 1094995) ("DEPTH_TEST_FUNCTION" . 1095559) ("DEPTH_WRITE_DISABLE" . 1095598) ("DIFFUSE" . 1310292) ("DOUBLE" . 1310286) ("EMISSION" . 1310032) ("FILL_PATTERN" . 1056598) ("HIDE" . 1056602) ("LINESTYLE" . 1056606) ("NORMALS" . 1056621) ("POLYGONS" . 1056790) ("REJECT" . 1093870) ("RESET_DATA" . 1056641) ("SHADE_RANGE" . 1056643) ("SHADING" . 1056645) ("SHARE_DATA" . 1056650) ("SHININESS" . 1310128) ("SPECULAR" . 1310225) ("STYLE" . 1310253) ("TEXTURE_COORD" . 1214343) ("TEXTURE_INTERP" . 1056664) ("TEXTURE_MAP" . 1056666) ("THICK" . 1056674) ("VERT_COLORS" . 1056679) ("XCOORD_CONV" . 1088401) ("YCOORD_CONV" . 1075980) ("ZCOORD_CONV" . 1056694) ("ZERO_OPACITY_SKIP" . 1056700)))
-    ("GetCTM" fun "IDLgrPolygon" (system) "Result = Obj->[%s::]%s()" ("objects_gr127.html" ("DESTINATION" . 1013188) ("PATH" . 1013190) ("TOP" . 1013196)))
-    ("Init" fun "IDLgrPolygon" (system) "Result = Obj->[%s::]%s([, X [, Y[, Z]]])" ("objects_gr129.html" ) ("objects_gr125.html" ("ALPHA_CHANNEL" . 1316054) ("AMBIENT" . 1309898) ("BOTTOM" . 1074388) ("CLIP_PLANES" . 1056581) ("COLOR" . 1056586) ("DATA" . 1309971) ("DEPTH_OFFSET" . 1056590) ("DEPTH_TEST_DISABLE" . 1094995) ("DEPTH_TEST_FUNCTION" . 1095559) ("DEPTH_WRITE_DISABLE" . 1095598) ("DIFFUSE" . 1310292) ("DOUBLE" . 1310286) ("EMISSION" . 1310032) ("FILL_PATTERN" . 1056598) ("HIDDEN_LINES" . 1056600) ("HIDE" . 1056602) ("LINESTYLE" . 1056606) ("NORMALS" . 1056621) ("PALETTE" . 1056629) ("POLYGONS" . 1056790) ("REGISTER_PROPERTIES" . 1327262) ("REJECT" . 1093870) ("RESET_DATA" . 1056641) ("SHADE_RANGE" . 1056643) ("SHADING" . 1056645) ("SHARE_DATA" . 1056650) ("SHININESS" . 1310128) ("SPECULAR" . 1310225) ("STYLE" . 1310253) ("TEXTURE_COORD" . 1214343) ("TEXTURE_INTERP" . 1056664) ("TEXTURE_MAP" . 1056666) ("THICK" . 1056674) ("VERT_COLORS" . 1056679) ("XCOORD_CONV" . 1088401) ("YCOORD_CONV" . 1075980) ("ZCOORD_CONV" . 1056694) ("ZERO_OPACITY_SKIP" . 1056700)))
-    ("Cleanup" pro "IDLgrPolyline" (system) "Obj->[%s::]%s" ("objects_gr133.html"))
-    ("GetProperty" pro "IDLgrPolyline" (system) "Obj->[%s::]%s" ("objects_gr135.html" ) ("objects_gr132.html" ("ALL" . 1056980) ("ALPHA_CHANNEL" . 1329463) ("CLIP_PLANES" . 1056996) ("COLOR" . 1057001) ("DATA" . 1057003) ("DEPTH_TEST_DISABLE" . 1095001) ("DEPTH_TEST_FUNCTION" . 1095681) ("DEPTH_WRITE_DISABLE" . 1095720) ("DOUBLE" . 1057005) ("HIDE" . 1057007) ("LABEL_NOGAPS" . 1057011) ("LABEL_OBJECTS" . 1057019) ("LABEL_OFFSETS" . 1057017) ("LABEL_POLYLINES" . 1057330) ("LABEL_USE_VERTEX_COLOR" . 1077987) ("LINESTYLE" . 1057029) ("PALETTE" . 1057044) ("PARENT" . 1057101) ("POLYLINES" . 1057099) ("SHADING" . 1057051) ("SYMBOL" . 1057058) ("THICK" . 1057063) ("USE_LABEL_COLOR" . 1057065) ("USE_LABEL_ORIENTATION" . 1057067) ("USE_TEXT_ALIGNMENTS" . 1057069) ("VERT_COLORS" . 1057073) ("XCOORD_CONV" . 1057075) ("XRANGE" . 1057143) ("YCOORD_CONV" . 1057081) ("YRANGE" . 1057133) ("ZCOORD_CONV" . 1077892) ("ZRANGE" . 1057121)))
-    ("SetProperty" pro "IDLgrPolyline" (system) "Obj->[%s::]%s" ("objects_gr137.html" ) ("objects_gr132.html" ("ALPHA_CHANNEL" . 1329463) ("CLIP_PLANES" . 1056996) ("COLOR" . 1057001) ("DATA" . 1057003) ("DEPTH_TEST_DISABLE" . 1095001) ("DEPTH_TEST_FUNCTION" . 1095681) ("DEPTH_WRITE_DISABLE" . 1095720) ("DOUBLE" . 1057005) ("HIDE" . 1057007) ("LABEL_NOGAPS" . 1057011) ("LABEL_OBJECTS" . 1057019) ("LABEL_OFFSETS" . 1057017) ("LABEL_POLYLINES" . 1057330) ("LABEL_USE_VERTEX_COLOR" . 1077987) ("LINESTYLE" . 1057029) ("PALETTE" . 1057044) ("POLYLINES" . 1057099) ("RESET_DATA" . 1093906) ("SHADING" . 1057051) ("SHARE_DATA" . 1057056) ("SYMBOL" . 1057058) ("THICK" . 1057063) ("USE_LABEL_COLOR" . 1057065) ("USE_LABEL_ORIENTATION" . 1057067) ("USE_TEXT_ALIGNMENTS" . 1057069) ("VERT_COLORS" . 1057073) ("XCOORD_CONV" . 1057075) ("YCOORD_CONV" . 1057081) ("ZCOORD_CONV" . 1077892)))
-    ("GetCTM" fun "IDLgrPolyline" (system) "Result = Obj->[%s::]%s()" ("objects_gr134.html" ("DESTINATION" . 1013579) ("PATH" . 1013581) ("TOP" . 1013587)))
-    ("Init" fun "IDLgrPolyline" (system) "Result = Obj->[%s::]%s([, X [, Y[, Z]]])" ("objects_gr136.html" ) ("objects_gr132.html" ("ALPHA_CHANNEL" . 1329463) ("CLIP_PLANES" . 1056996) ("COLOR" . 1057001) ("DATA" . 1057003) ("DEPTH_TEST_DISABLE" . 1095001) ("DEPTH_TEST_FUNCTION" . 1095681) ("DEPTH_WRITE_DISABLE" . 1095720) ("DOUBLE" . 1057005) ("HIDE" . 1057007) ("LABEL_NOGAPS" . 1057011) ("LABEL_OBJECTS" . 1057019) ("LABEL_OFFSETS" . 1057017) ("LABEL_POLYLINES" . 1057330) ("LABEL_USE_VERTEX_COLOR" . 1077987) ("LINESTYLE" . 1057029) ("PALETTE" . 1057044) ("POLYLINES" . 1057099) ("REGISTER_PROPERTIES" . 1057049) ("RESET_DATA" . 1093906) ("SHADING" . 1057051) ("SHARE_DATA" . 1057056) ("SYMBOL" . 1057058) ("THICK" . 1057063) ("USE_LABEL_COLOR" . 1057065) ("USE_LABEL_ORIENTATION" . 1057067) ("USE_TEXT_ALIGNMENTS" . 1057069) ("VERT_COLORS" . 1057073) ("XCOORD_CONV" . 1057075) ("YCOORD_CONV" . 1057081) ("ZCOORD_CONV" . 1077892)))
-    ("Cleanup" pro "IDLgrPrinter" (system) "Obj->[%s::]%s" ("objects_gr140.html"))
-    ("Draw" pro "IDLgrPrinter" (system) "Obj->[%s::]%s [, Picture]" ("objects_gr141.html" ("VECT_SORTING" . 1340440) ("VECT_TEXT_RENDER_METHOD" . 1340452) ("VECTOR" . 1013979)))
-    ("GetProperty" pro "IDLgrPrinter" (system) "Obj->[%s::]%s" ("objects_gr144.html" ) ("objects_gr139.html" ("ALL" . 1057354) ("COLOR_MODEL" . 1057403) ("DIMENSIONS" . 1057476) ("GAMMA" . 1057474) ("GRAPHICS_TREE" . 1057413) ("LANDSCAPE" . 1057415) ("N_COLORS" . 1057418) ("N_COPIES" . 1057420) ("NAME" . 1344875) ("PALETTE" . 1057464) ("PRINT_QUALITY" . 1057428) ("QUALITY" . 1057435) ("RESOLUTION" . 1093938) ("UNITS" . 1057441)))
-    ("NewDocument" pro "IDLgrPrinter" (system) "Obj->[%s::]%s" ("objects_gr147.html"))
-    ("NewPage" pro "IDLgrPrinter" (system) "Obj->[%s::]%s" ("objects_gr148.html"))
-    ("SetProperty" pro "IDLgrPrinter" (system) "Obj->[%s::]%s" ("objects_gr149.html" ) ("objects_gr139.html" ("GAMMA" . 1057474) ("GRAPHICS_TREE" . 1057413) ("LANDSCAPE" . 1057415) ("N_COPIES" . 1057420) ("PALETTE" . 1057464) ("PRINT_QUALITY" . 1057428) ("QUALITY" . 1057435) ("UNITS" . 1057441)))
-    ("GetContiguousPixels" fun "IDLgrPrinter" (system) "Result = Obj->[%s::]%s()" ("objects_gr142.html"))
-    ("GetFontnames" fun "IDLgrPrinter" (system) "Result = Obj->[%s::]%s( FamilyName)" ("objects_gr143.html" ("IDL_FONTS" . 1014147) ("STYLES" . 1014149)))
-    ("GetTextDimensions" fun "IDLgrPrinter" (system) "Result = Obj->[%s::]%s( TextObj)" ("objects_gr145.html" ("DESCENT" . 1014231) ("PATH" . 1014233)))
-    ("Init" fun "IDLgrPrinter" (system) "Result = Obj->[%s::]%s()" ("objects_gr146.html" ) ("objects_gr139.html" ("COLOR_MODEL" . 1057403) ("GAMMA" . 1057474) ("GRAPHICS_TREE" . 1057413) ("LANDSCAPE" . 1057415) ("N_COLORS" . 1057418) ("N_COPIES" . 1057420) ("PALETTE" . 1057464) ("PRINT_QUALITY" . 1057428) ("QUALITY" . 1057435) ("REGISTER_PROPERTIES" . 1057456) ("UNITS" . 1057441)))
-    ("Cleanup" pro "IDLgrROI" (system) "Obj->[%s::]%s" ("objects_gr152.html"))
-    ("GetProperty" pro "IDLgrROI" (system) "Obj->[%s::]%s" ("objects_gr153.html" ) ("objects_gr151.html" ("ALL" . 1057567) ("ALPHA_CHANNEL" . 1315614) ("CLIP_PLANES" . 1057587) ("COLOR" . 1057592) ("DEPTH_TEST_DISABLE" . 1095007) ("DEPTH_TEST_FUNCTION" . 1095803) ("DEPTH_WRITE_DISABLE" . 1095842) ("DOUBLE" . 1078228) ("HIDE" . 1078231) ("LINESTYLE" . 1057600) ("PALETTE" . 1057611) ("PARENT" . 1345141) ("STYLE" . 1093956) ("SYMBOL" . 1057621) ("THICK" . 1057626) ("XCOORD_CONV" . 1057630) ("XRANGE" . 1057656) ("YCOORD_CONV" . 1057636) ("YRANGE" . 1057668) ("ZCOORD_CONV" . 1057666) ("ZRANGE" . 1057574)))
-    ("SetProperty" pro "IDLgrROI" (system) "Obj->[%s::]%s" ("objects_gr156.html" ) ("objects_gr151.html" ("ALPHA_CHANNEL" . 1315614) ("CLIP_PLANES" . 1057587) ("COLOR" . 1057592) ("DEPTH_TEST_DISABLE" . 1095007) ("DEPTH_TEST_FUNCTION" . 1095803) ("DEPTH_WRITE_DISABLE" . 1095842) ("DOUBLE" . 1078228) ("HIDE" . 1078231) ("LINESTYLE" . 1057600) ("PALETTE" . 1057611) ("STYLE" . 1093956) ("SYMBOL" . 1057621) ("THICK" . 1057626) ("XCOORD_CONV" . 1057630) ("YCOORD_CONV" . 1057636) ("ZCOORD_CONV" . 1057666)))
-    ("Init" fun "IDLgrROI" (system) "Result = Obj->[%s::]%s([, X[, Y[, Z]]])" ("objects_gr154.html" ) ("objects_gr151.html" ("ALPHA_CHANNEL" . 1315614) ("CLIP_PLANES" . 1057587) ("COLOR" . 1057592) ("DEPTH_TEST_DISABLE" . 1095007) ("DEPTH_TEST_FUNCTION" . 1095803) ("DEPTH_WRITE_DISABLE" . 1095842) ("DOUBLE" . 1078228) ("HIDE" . 1078231) ("LINESTYLE" . 1057600) ("PALETTE" . 1057611) ("REGISTER_PROPERTIES" . 1057616) ("STYLE" . 1093956) ("SYMBOL" . 1057621) ("THICK" . 1057626) ("XCOORD_CONV" . 1057630) ("YCOORD_CONV" . 1057636) ("ZCOORD_CONV" . 1057666)))
-    ("PickVertex" fun "IDLgrROI" (system) "Result = Obj->[%s::]%s( Dest, View, Point)" ("objects_gr155.html" ("PATH" . 1014753)))
-    ("Add" pro "IDLgrROIGroup" (system) "Obj->[%s::]%s, ROI" ("objects_gr159.html"))
-    ("Cleanup" pro "IDLgrROIGroup" (system) "Obj->[%s::]%s" ("objects_gr160.html"))
-    ("GetProperty" pro "IDLgrROIGroup" (system) "Obj->[%s::]%s" ("objects_gr161.html" ) ("objects_gr158.html" ("ALL" . 1057772) ("CLIP_PLANES" . 1057798) ("COLOR" . 1057803) ("DEPTH_TEST_DISABLE" . 1095013) ("DEPTH_TEST_FUNCTION" . 1095918) ("DEPTH_WRITE_DISABLE" . 1095957) ("HIDE" . 1057805) ("PARENT" . 1057863) ("XCOORD_CONV" . 1057861) ("XRANGE" . 1057853) ("YCOORD_CONV" . 1057851) ("YRANGE" . 1080305) ("ZCOORD_CONV" . 1057839) ("ZRANGE" . 1057781)))
-    ("SetProperty" pro "IDLgrROIGroup" (system) "Obj->[%s::]%s" ("objects_gr164.html" ) ("objects_gr158.html" ("CLIP_PLANES" . 1057798) ("COLOR" . 1057803) ("DEPTH_TEST_DISABLE" . 1095013) ("DEPTH_TEST_FUNCTION" . 1095918) ("DEPTH_WRITE_DISABLE" . 1095957) ("HIDE" . 1057805) ("XCOORD_CONV" . 1057861) ("YCOORD_CONV" . 1057851) ("ZCOORD_CONV" . 1057839)))
-    ("Init" fun "IDLgrROIGroup" (system) "Result = Obj->[%s::]%s()" ("objects_gr162.html" ) ("objects_gr158.html" ("CLIP_PLANES" . 1057798) ("COLOR" . 1057803) ("DEPTH_TEST_DISABLE" . 1095013) ("DEPTH_TEST_FUNCTION" . 1095918) ("DEPTH_WRITE_DISABLE" . 1095957) ("HIDE" . 1057805) ("XCOORD_CONV" . 1057861) ("YCOORD_CONV" . 1057851) ("ZCOORD_CONV" . 1057839)))
-    ("PickRegion" fun "IDLgrROIGroup" (system) "Result = Obj->[%s::]%s( Dest, View, Point)" ("objects_gr163.html" ("PATH" . 1015096)))
-    ("Add" pro "IDLgrScene" (system) "Obj->[%s::]%s, View" ("objects_gr167.html" ("POSITION" . 1015243)))
-    ("Cleanup" pro "IDLgrScene" (system) "Obj->[%s::]%s" ("objects_gr168.html"))
-    ("GetProperty" pro "IDLgrScene" (system) "Obj->[%s::]%s" ("objects_gr170.html" ) ("objects_gr166.html" ("ALL" . 1057953) ("COLOR" . 1080480) ("TRANSPARENT" . 1093982)))
-    ("SetProperty" pro "IDLgrScene" (system) "Obj->[%s::]%s" ("objects_gr172.html" ) ("objects_gr166.html" ("COLOR" . 1080480) ("TRANSPARENT" . 1093982)))
-    ("GetByName" fun "IDLgrScene" (system) "Result = Obj->[%s::]%s(Name)" ("objects_gr169.html"))
-    ("Init" fun "IDLgrScene" (system) "Result = Obj->[%s::]%s()" ("objects_gr171.html" ) ("objects_gr166.html" ("COLOR" . 1080480) ("HIDE" . 1057961) ("REGISTER_PROPERTIES" . 1057969)))
-    ("Cleanup" pro "IDLgrSurface" (system) "Obj->[%s::]%s" ("objects_gr175.html"))
-    ("GetProperty" pro "IDLgrSurface" (system) "Obj->[%s::]%s" ("objects_gr177.html" ) ("objects_gr174.html" ("ALL" . 1058014) ("ALPHA_CHANNEL" . 1314657) ("AMBIENT" . 1310692) ("BOTTOM" . 1058035) ("CLIP_PLANES" . 1058037) ("COLOR" . 1058042) ("DATA" . 1339889) ("DEPTH_OFFSET" . 1058050) ("DEPTH_TEST_DISABLE" . 1095019) ("DEPTH_TEST_FUNCTION" . 1096040) ("DEPTH_WRITE_DISABLE" . 1096079) ("DIFFUSE" . 1310743) ("DOUBLE" . 1058056) ("EMISSION" . 1310780) ("EXTENDED_LEGO" . 1058059) ("HIDDEN_LINES" . 1058061) ("HIDE" . 1058063) ("LINESTYLE" . 1058067) ("MAX_VALUE" . 1058080) ("MIN_VALUE" . 1058082) ("PALETTE" . 1058086) ("PARENT" . 1058283) ("SHADE_RANGE" . 1058090) ("SHADING" . 1058092) ("SHININESS" . 1310817) ("SHOW_SKIRT" . 1058099) ("SKIRT" . 1058101) ("SPECULAR" . 1310884) ("STYLE" . 1058103) ("TEXTURE_COORD" . 1604848) ("TEXTURE_HIGHRES" . 1058120) ("TEXTURE_INTERP" . 1058123) ("TEXTURE_MAP" . 1058125) ("THICK" . 1058136) ("USE_TRIANGLES" . 1058140) ("VERT_COLORS" . 1058142) ("XCOORD_CONV" . 1058145) ("XRANGE" . 1058297) ("YCOORD_CONV" . 1058295) ("YRANGE" . 1058309) ("ZCOORD_CONV" . 1058307) ("ZERO_OPACITY_SKIP" . 1058163) ("ZRANGE" . 1082521)))
-    ("SetProperty" pro "IDLgrSurface" (system) "Obj->[%s::]%s" ("objects_gr179.html" ) ("objects_gr174.html" ("ALPHA_CHANNEL" . 1314657) ("AMBIENT" . 1310692) ("BOTTOM" . 1058035) ("CLIP_PLANES" . 1058037) ("COLOR" . 1058042) ("DATAX" . 1339826) ("DATAY" . 1058046) ("DATAZ" . 1058048) ("DEPTH_OFFSET" . 1058050) ("DEPTH_TEST_DISABLE" . 1095019) ("DEPTH_TEST_FUNCTION" . 1096040) ("DEPTH_WRITE_DISABLE" . 1096079) ("DIFFUSE" . 1310743) ("DOUBLE" . 1058056) ("EMISSION" . 1310780) ("EXTENDED_LEGO" . 1058059) ("HIDDEN_LINES" . 1058061) ("HIDE" . 1058063) ("LINESTYLE" . 1058067) ("MAX_VALUE" . 1058080) ("MIN_VALUE" . 1058082) ("PALETTE" . 1058086) ("RESET_DATA" . 1094044) ("SHADE_RANGE" . 1058090) ("SHADING" . 1058092) ("SHARE_DATA" . 1082385) ("SHININESS" . 1310817) ("SHOW_SKIRT" . 1058099) ("SKIRT" . 1058101) ("SPECULAR" . 1310884) ("STYLE" . 1058103) ("TEXTURE_COORD" . 1604848) ("TEXTURE_HIGHRES" . 1058120) ("TEXTURE_INTERP" . 1058123) ("TEXTURE_MAP" . 1058125) ("THICK" . 1058136) ("USE_TRIANGLES" . 1058140) ("VERT_COLORS" . 1058142) ("XCOORD_CONV" . 1058145) ("YCOORD_CONV" . 1058295) ("ZCOORD_CONV" . 1058307) ("ZERO_OPACITY_SKIP" . 1058163)))
-    ("GetCTM" fun "IDLgrSurface" (system) "Result = Obj->[%s::]%s()" ("objects_gr176.html" ("DESTINATION" . 1015591) ("PATH" . 1015593) ("TOP" . 1015599)))
-    ("Init" fun "IDLgrSurface" (system) "Result = Obj->[%s::]%s([, Z [, X, Y]])" ("objects_gr178.html" ) ("objects_gr174.html" ("ALPHA_CHANNEL" . 1314657) ("AMBIENT" . 1310692) ("BOTTOM" . 1058035) ("CLIP_PLANES" . 1058037) ("COLOR" . 1058042) ("DATAX" . 1339826) ("DATAY" . 1058046) ("DATAZ" . 1058048) ("DEPTH_OFFSET" . 1058050) ("DEPTH_TEST_DISABLE" . 1095019) ("DEPTH_TEST_FUNCTION" . 1096040) ("DEPTH_WRITE_DISABLE" . 1096079) ("DIFFUSE" . 1310743) ("DOUBLE" . 1058056) ("EMISSION" . 1310780) ("EXTENDED_LEGO" . 1058059) ("HIDDEN_LINES" . 1058061) ("HIDE" . 1058063) ("LINESTYLE" . 1058067) ("MAX_VALUE" . 1058080) ("MIN_VALUE" . 1058082) ("PALETTE" . 1058086) ("REGISTER_PROPERTIES" . 1094041) ("RESET_DATA" . 1094044) ("SHADE_RANGE" . 1058090) ("SHADING" . 1058092) ("SHARE_DATA" . 1082385) ("SHININESS" . 1310817) ("SHOW_SKIRT" . 1058099) ("SKIRT" . 1058101) ("SPECULAR" . 1310884) ("STYLE" . 1058103) ("TEXTURE_COORD" . 1604848) ("TEXTURE_HIGHRES" . 1058120) ("TEXTURE_INTERP" . 1058123) ("TEXTURE_MAP" . 1058125) ("THICK" . 1058136) ("USE_TRIANGLES" . 1058140) ("VERT_COLORS" . 1058142) ("XCOORD_CONV" . 1058145) ("YCOORD_CONV" . 1058295) ("ZCOORD_CONV" . 1058307) ("ZERO_OPACITY_SKIP" . 1058163)))
-    ("Cleanup" pro "IDLgrSymbol" (system) "Obj->[%s::]%s" ("objects_gr182.html"))
-    ("GetProperty" pro "IDLgrSymbol" (system) "Obj->[%s::]%s" ("objects_gr183.html" ) ("objects_gr181.html" ("ALL" . 1058799) ("ALPHA_CHANNEL" . 1315142) ("COLOR" . 1058811) ("DATA" . 1058813) ("SIZE" . 1058817) ("THICK" . 1058823)))
-    ("SetProperty" pro "IDLgrSymbol" (system) "Obj->[%s::]%s" ("objects_gr185.html" ) ("objects_gr181.html" ("ALPHA_CHANNEL" . 1315142) ("COLOR" . 1058811) ("DATA" . 1058813) ("SIZE" . 1058817) ("THICK" . 1058823)))
-    ("Init" fun "IDLgrSymbol" (system) "Result = Obj->[%s::]%s([, Data])" ("objects_gr184.html" ) ("objects_gr181.html" ("ALPHA_CHANNEL" . 1315142) ("COLOR" . 1058811) ("DATA" . 1058813) ("SIZE" . 1058817) ("THICK" . 1058823)))
-    ("AddPolygon" pro "IDLgrTessellator" (system) "Obj->[%s::]%s, X [, Y[, Z]]" ("objects_gr188.html" ("AUXDATA" . 1016227) ("INTERIOR" . 1016232) ("POLYGON" . 1308631)))
-    ("Cleanup" pro "IDLgrTessellator" (system) "Obj->[%s::]%s" ("objects_gr189.html"))
-    ("Reset" pro "IDLgrTessellator" (system) "Obj->[%s::]%s" ("objects_gr191.html"))
-    ("Init" fun "IDLgrTessellator" (system) "Result = Obj->[%s::]%s()" ("objects_gr190.html" ))
-    ("Tessellate" fun "IDLgrTessellator" (system) "Result = Obj->[%s::]%s( Vertices, Poly)" ("objects_gr192.html" ("AUXDATA" . 1016374) ("QUIET" . 1016376)))
-    ("Cleanup" pro "IDLgrText" (system) "Obj->[%s::]%s" ("objects_gr195.html"))
-    ("GetProperty" pro "IDLgrText" (system) "Obj->[%s::]%s" ("objects_gr197.html" ) ("objects_gr194.html" ("ALIGNMENT" . 1058986) ("ALL" . 1058984) ("ALPHA_CHANNEL" . 1096721) ("BASELINE" . 1096723) ("CHAR_DIMENSIONS" . 1058905) ("CLIP_PLANES" . 1058910) ("COLOR" . 1058915) ("DEPTH_TEST_DISABLE" . 1095025) ("DEPTH_TEST_FUNCTION" . 1096162) ("DEPTH_WRITE_DISABLE" . 1096201) ("ENABLE_FORMATTING" . 1058917) ("FILL_BACKGROUND" . 1058922) ("FILL_COLOR" . 1090549) ("FONT" . 1090557) ("HIDE" . 1058929) ("KERNING" . 1058933) ("LOCATIONS" . 1090561) ("ONGLASS" . 1058937) ("PALETTE" . 1058939) ("PARENT" . 1058996) ("RECOMPUTE_DIMENSIONS" . 1058994) ("RENDER_METHOD" . 1096891) ("STRINGS" . 1096894) ("UPDIR" . 1058950) ("VERTICAL_ALIGNMENT" . 1058954) ("XCOORD_CONV" . 1058956) ("XRANGE" . 1059010) ("YCOORD_CONV" . 1059008) ("YRANGE" . 1059022) ("ZCOORD_CONV" . 1058968) ("ZRANGE" . 1058890)))
-    ("SetProperty" pro "IDLgrText" (system) "Obj->[%s::]%s" ("objects_gr199.html" ) ("objects_gr194.html" ("ALIGNMENT" . 1058986) ("ALPHA_CHANNEL" . 1096721) ("BASELINE" . 1096723) ("CHAR_DIMENSIONS" . 1058905) ("CLIP_PLANES" . 1058910) ("COLOR" . 1058915) ("DEPTH_TEST_DISABLE" . 1095025) ("DEPTH_TEST_FUNCTION" . 1096162) ("DEPTH_WRITE_DISABLE" . 1096201) ("ENABLE_FORMATTING" . 1058917) ("FILL_BACKGROUND" . 1058922) ("FILL_COLOR" . 1090549) ("FONT" . 1090557) ("HIDE" . 1058929) ("KERNING" . 1058933) ("LOCATIONS" . 1090561) ("ONGLASS" . 1058937) ("PALETTE" . 1058939) ("RECOMPUTE_DIMENSIONS" . 1058994) ("RENDER_METHOD" . 1096891) ("STRINGS" . 1096894) ("UPDIR" . 1058950) ("VERTICAL_ALIGNMENT" . 1058954) ("XCOORD_CONV" . 1058956) ("YCOORD_CONV" . 1059008) ("ZCOORD_CONV" . 1058968)))
-    ("GetCTM" fun "IDLgrText" (system) "Result = Obj->[%s::]%s()" ("objects_gr196.html" ("DESTINATION" . 1016508) ("PATH" . 1016510) ("TOP" . 1016516)))
-    ("Init" fun "IDLgrText" (system) "Result = Obj->[%s::]%s([, String or vector of strings])" ("objects_gr198.html" ) ("objects_gr194.html" ("ALIGNMENT" . 1058986) ("ALPHA_CHANNEL" . 1096721) ("BASELINE" . 1096723) ("CHAR_DIMENSIONS" . 1058905) ("CLIP_PLANES" . 1058910) ("COLOR" . 1058915) ("DEPTH_TEST_DISABLE" . 1095025) ("DEPTH_TEST_FUNCTION" . 1096162) ("DEPTH_WRITE_DISABLE" . 1096201) ("ENABLE_FORMATTING" . 1058917) ("FILL_BACKGROUND" . 1058922) ("FILL_COLOR" . 1090549) ("FONT" . 1090557) ("HIDE" . 1058929) ("KERNING" . 1058933) ("LOCATIONS" . 1090561) ("ONGLASS" . 1058937) ("PALETTE" . 1058939) ("RECOMPUTE_DIMENSIONS" . 1058994) ("REGISTER_PROPERTIES" . 1058946) ("RENDER_METHOD" . 1096891) ("STRINGS" . 1096894) ("UPDIR" . 1058950) ("VERTICAL_ALIGNMENT" . 1058954) ("XCOORD_CONV" . 1058956) ("YCOORD_CONV" . 1059008) ("ZCOORD_CONV" . 1058968)))
-    ("Add" pro "IDLgrView" (system) "Obj->[%s::]%s, Model" ("objects_gr202.html" ("POSITION" . 1016823)))
-    ("Cleanup" pro "IDLgrView" (system) "Obj->[%s::]%s" ("objects_gr203.html"))
-    ("GetProperty" pro "IDLgrView" (system) "Obj->[%s::]%s" ("objects_gr205.html" ) ("objects_gr201.html" ("ALL" . 1059162) ("COLOR" . 1059182) ("DEPTH_CUE" . 1059184) ("DIMENSIONS" . 1059192) ("DOUBLE" . 1059194) ("EYE" . 1059197) ("HIDE" . 1059199) ("LOCATION" . 1090641) ("PARENT" . 1092817) ("PROJECTION" . 1059231) ("TRANSPARENT" . 1094108) ("UNITS" . 1059207) ("VIEWPLANE_RECT" . 1059216) ("ZCLIP" . 1059219)))
-    ("SetProperty" pro "IDLgrView" (system) "Obj->[%s::]%s" ("objects_gr207.html" ) ("objects_gr201.html" ("COLOR" . 1059182) ("DEPTH_CUE" . 1059184) ("DIMENSIONS" . 1059192) ("DOUBLE" . 1059194) ("EYE" . 1059197) ("HIDE" . 1059199) ("LOCATION" . 1090641) ("PROJECTION" . 1059231) ("TRANSPARENT" . 1094108) ("UNITS" . 1059207) ("VIEWPLANE_RECT" . 1059216) ("ZCLIP" . 1059219)))
-    ("GetByName" fun "IDLgrView" (system) "Result = Obj->[%s::]%s(Name)" ("objects_gr204.html"))
-    ("Init" fun "IDLgrView" (system) "Result = Obj->[%s::]%s()" ("objects_gr206.html" ) ("objects_gr201.html" ("COLOR" . 1059182) ("DEPTH_CUE" . 1059184) ("DIMENSIONS" . 1059192) ("DOUBLE" . 1059194) ("EYE" . 1059197) ("HIDE" . 1059199) ("LOCATION" . 1090641) ("PROJECTION" . 1059231) ("REGISTER_PROPERTIES" . 1059205) ("TRANSPARENT" . 1094108) ("UNITS" . 1059207) ("VIEWPLANE_RECT" . 1059216) ("ZCLIP" . 1059219)))
-    ("Add" pro "IDLgrViewgroup" (system) "Obj->[%s::]%s, Object" ("objects_gr210.html" ("POSITION" . 1017170)))
-    ("Cleanup" pro "IDLgrViewgroup" (system) "Obj->[%s::]%s" ("objects_gr211.html"))
-    ("GetProperty" pro "IDLgrViewgroup" (system) "Obj->[%s::]%s" ("objects_gr213.html" ) ("objects_gr209.html" ("ALL" . 1077311) ("HIDE" . 1059327) ("PARENT" . 1084394)))
-    ("SetProperty" pro "IDLgrViewgroup" (system) "Obj->[%s::]%s" ("objects_gr215.html" ) ("objects_gr209.html" ("HIDE" . 1059327)))
-    ("GetByName" fun "IDLgrViewgroup" (system) "Result = Obj->[%s::]%s(Name)" ("objects_gr212.html"))
-    ("Init" fun "IDLgrViewgroup" (system) "Result = Obj->[%s::]%s()" ("objects_gr214.html" ) ("objects_gr209.html" ("HIDE" . 1059327) ("REGISTER_PROPERTIES" . 1059341)))
-    ("Cleanup" pro "IDLgrVolume" (system) "Obj->[%s::]%s" ("objects_gr218.html"))
-    ("ComputeBounds" pro "IDLgrVolume" (system) "Obj->[%s::]%s" ("objects_gr219.html" ("OPACITY" . 1017518) ("RESET" . 1017520) ("VOLUMES" . 1017522)))
-    ("GetProperty" pro "IDLgrVolume" (system) "Obj->[%s::]%s" ("objects_gr221.html" ) ("objects_gr217.html" ("ALL" . 1059382) ("ALPHA_CHANNEL" . 1315212) ("AMBIENT" . 1059403) ("BOUNDS" . 1059406) ("CLIP_PLANES" . 1059408) ("COMPOSITE_FUNCTION" . 1092822) ("DATA0" . 1059427) ("DATA1" . 1059429) ("DATA2" . 1059431) ("DATA3" . 1059433) ("DEPTH_CUE" . 1059436) ("DEPTH_TEST_DISABLE" . 1095038) ("DEPTH_TEST_FUNCTION" . 1096277) ("DEPTH_WRITE_DISABLE" . 1096316) ("HIDE" . 1059445) ("HINTS" . 1059449) ("INTERPOLATE" . 1059455) ("LIGHTING_MODEL" . 1059457) ("NO_COPY" . 1059462) ("OPACITY_TABLE0" . 1086135) ("OPACITY_TABLE1" . 1059466) ("PARENT" . 1088485) ("RENDER_STEP" . 1096662) ("RGB_TABLE0" . 1088582) ("RGB_TABLE1" . 1059472) ("TWO_SIDED" . 1059474) ("VALID_DATA" . 1059634) ("VOLUME_SELECT" . 1059632) ("XCOORD_CONV" . 1059489) ("XRANGE" . 1059648) ("YCOORD_CONV" . 1059495) ("YRANGE" . 1059660) ("ZBUFFER" . 1059501) ("ZCOORD_CONV" . 1059503) ("ZERO_OPACITY_SKIP" . 1059509) ("ZRANGE" . 1059393)))
-    ("SetProperty" pro "IDLgrVolume" (system) "Obj->[%s::]%s" ("objects_gr224.html" ) ("objects_gr217.html" ("ALPHA_CHANNEL" . 1315212) ("AMBIENT" . 1059403) ("BOUNDS" . 1059406) ("CLIP_PLANES" . 1059408) ("COMPOSITE_FUNCTION" . 1092822) ("DATA0" . 1059427) ("DATA1" . 1059429) ("DATA2" . 1059431) ("DATA3" . 1059433) ("DEPTH_CUE" . 1059436) ("DEPTH_TEST_DISABLE" . 1095038) ("DEPTH_TEST_FUNCTION" . 1096277) ("DEPTH_WRITE_DISABLE" . 1096316) ("HIDE" . 1059445) ("HINTS" . 1059449) ("INTERPOLATE" . 1059455) ("LIGHTING_MODEL" . 1059457) ("NO_COPY" . 1059462) ("OPACITY_TABLE0" . 1086135) ("OPACITY_TABLE1" . 1059466) ("RENDER_STEP" . 1096662) ("RGB_TABLE0" . 1088582) ("RGB_TABLE1" . 1059472) ("TWO_SIDED" . 1059474) ("VOLUME_SELECT" . 1059632) ("XCOORD_CONV" . 1059489) ("YCOORD_CONV" . 1059495) ("ZBUFFER" . 1059501) ("ZCOORD_CONV" . 1059503) ("ZERO_OPACITY_SKIP" . 1059509)))
-    ("GetCTM" fun "IDLgrVolume" (system) "Result = Obj->[%s::]%s()" ("objects_gr220.html" ("DESTINATION" . 1017555) ("PATH" . 1017557) ("TOP" . 1017563)))
-    ("Init" fun "IDLgrVolume" (system) "Result = Obj->[%s::]%s([, vol0 [, vol1 [, vol2 [, vol3]]]])" ("objects_gr222.html" ) ("objects_gr217.html" ("ALPHA_CHANNEL" . 1315212) ("AMBIENT" . 1059403) ("BOUNDS" . 1059406) ("CLIP_PLANES" . 1059408) ("COMPOSITE_FUNCTION" . 1092822) ("DATA0" . 1059427) ("DATA1" . 1059429) ("DATA2" . 1059431) ("DATA3" . 1059433) ("DEPTH_CUE" . 1059436) ("DEPTH_TEST_DISABLE" . 1095038) ("DEPTH_TEST_FUNCTION" . 1096277) ("DEPTH_WRITE_DISABLE" . 1096316) ("HIDE" . 1059445) ("HINTS" . 1059449) ("INTERPOLATE" . 1059455) ("LIGHTING_MODEL" . 1059457) ("NO_COPY" . 1059462) ("OPACITY_TABLE0" . 1086135) ("OPACITY_TABLE1" . 1059466) ("REGISTER_PROPERTIES" . 1059616) ("RENDER_STEP" . 1096662) ("RGB_TABLE0" . 1088582) ("RGB_TABLE1" . 1059472) ("TWO_SIDED" . 1059474) ("VOLUME_SELECT" . 1059632) ("XCOORD_CONV" . 1059489) ("YCOORD_CONV" . 1059495) ("ZBUFFER" . 1059501) ("ZCOORD_CONV" . 1059503) ("ZERO_OPACITY_SKIP" . 1059509)))
-    ("PickVoxel" fun "IDLgrVolume" (system) "Result = Obj->[%s::]%s ( Win, View, Point)" ("objects_gr223.html" ("PATH" . 1017818)))
-    ("Cleanup" pro "IDLgrVRML" (system) "Obj->[%s::]%s" ("objects_gr227.html"))
-    ("Draw" pro "IDLgrVRML" (system) "Obj->[%s::]%s [, Picture]" ("objects_gr228.html"))
-    ("GetDeviceInfo" pro "IDLgrVRML" (system) "Obj->[%s::]%s" ("objects_gr229.html" ("ALL" . 1018053) ("MAX_NUM_CLIP_PLANES" . 1018055) ("MAX_TEXTURE_DIMENSIONS" . 1018057) ("MAX_VIEWPORT_DIMENSIONS" . 1018059) ("NAME" . 1018061) ("NUM_CPUS" . 1018063) ("VENDOR" . 1018066) ("VERSION" . 1018068)))
-    ("GetProperty" pro "IDLgrVRML" (system) "Obj->[%s::]%s" ("objects_gr231.html" ) ("objects_gr226.html" ("ALL" . 1059804) ("COLOR_MODEL" . 1059817) ("DIMENSIONS" . 1059821) ("FILENAME" . 1059824) ("GRAPHICS_TREE" . 1059826) ("N_COLORS" . 1059828) ("PALETTE" . 1059830) ("QUALITY" . 1059832) ("RESOLUTION" . 1094159) ("SCREEN_DIMENSIONS" . 1059862) ("UNITS" . 1059860)))
-    ("SetProperty" pro "IDLgrVRML" (system) "Obj->[%s::]%s" ("objects_gr234.html" ) ("objects_gr226.html" ("DIMENSIONS" . 1059821) ("FILENAME" . 1059824) ("GRAPHICS_TREE" . 1059826) ("PALETTE" . 1059830) ("QUALITY" . 1059832) ("RESOLUTION" . 1094159) ("UNITS" . 1059860)))
-    ("GetFontnames" fun "IDLgrVRML" (system) "Result = Obj->[%s::]%s( FamilyName)" ("objects_gr230.html" ("IDL_FONTS" . 1018109) ("STYLES" . 1018111)))
-    ("GetTextDimensions" fun "IDLgrVRML" (system) "Result = Obj->[%s::]%s( TextObj)" ("objects_gr232.html" ("DESCENT" . 1018185) ("PATH" . 1018187)))
-    ("Init" fun "IDLgrVRML" (system) "Result = Obj->[%s::]%s()" ("objects_gr233.html" ) ("objects_gr226.html" ("COLOR_MODEL" . 1059817) ("DIMENSIONS" . 1059821) ("FILENAME" . 1059824) ("GRAPHICS_TREE" . 1059826) ("N_COLORS" . 1059828) ("PALETTE" . 1059830) ("QUALITY" . 1059832) ("REGISTER_PROPERTIES" . 1059837) ("RESOLUTION" . 1094159) ("UNITS" . 1059860) ("WORLDINFO" . 1059848) ("WORLDTITLE" . 1059850)))
-    ("Cleanup" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr237.html"))
-    ("Draw" pro "IDLgrWindow" (system) "Obj->[%s::]%s [, Picture]" ("objects_gr238.html" ("CREATE_INSTANCE" . 1018509) ("DRAW_INSTANCE" . 1018511)))
-    ("Erase" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr239.html" ("COLOR" . 1018544)))
-    ("GetDeviceInfo" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr241.html" ("ALL" . 1018622) ("MAX_NUM_CLIP_PLANES" . 1018624) ("MAX_TEXTURE_DIMENSIONS" . 1018626) ("MAX_VIEWPORT_DIMENSIONS" . 1018628) ("NAME" . 1018630) ("NUM_CPUS" . 1018632) ("VENDOR" . 1018635) ("VERSION" . 1018637)))
-    ("GetProperty" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr244.html" ) ("objects_gr236.html" ("ALL" . 1059951) ("COLOR_MODEL" . 1059974) ("CURRENT_ZOOM" . 1249228) ("DIMENSIONS" . 1249231) ("DISPLAY_NAME (X Only)" . 1059985) ("GRAPHICS_TREE" . 1059987) ("IMAGE_DATA" . 1060084) ("LOCATION" . 1060082) ("MINIMUM_VIRTUAL_DIMENSIONS" . 1343479) ("N_COLORS" . 1059992) ("PALETTE" . 1059998) ("QUALITY" . 1060003) ("RENDERER" . 1094184) ("RESOLUTION" . 1060060) ("RETAIN" . 1060058) ("SCREEN_DIMENSIONS" . 1060073) ("TITLE" . 1060071) ("UNITS" . 1060033) ("VIRTUAL_DIMENSIONS" . 1060050) ("VISIBLE_LOCATION" . 1097046) ("ZBUFFER_DATA" . 1091007) ("ZOOM_BASE" . 1342797) ("ZOOM_NSTEP" . 1342953)))
-    ("Iconify" pro "IDLgrWindow" (system) "Obj->[%s::]%s, IconFlag" ("objects_gr246.html"))
-    ("SetCurrentCursor" pro "IDLgrWindow" (system) "Obj->[%s::]%s [, CursorName]" ("objects_gr251.html" ("HOTSPOT" . 1019148) ("IMAGE" . 1019144) ("MASK" . 1019146) ("STANDARD" . 1019150)))
-    ("SetCurrentZoom" pro "IDLgrWindow" (system) "Obj-> [%s::]%s, ZoomFactor" ("objects_gr252.html" ("RESET" . 1360383)))
-    ("SetProperty" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr253.html" ) ("objects_gr236.html" ("DIMENSIONS" . 1249231) ("DISPLAY_NAME (X Only)" . 1059985) ("GRAPHICS_TREE" . 1059987) ("LOCATION" . 1060082) ("MINIMUM_VIRTUAL_DIMENSIONS" . 1343479) ("PALETTE" . 1059998) ("QUALITY" . 1060003) ("TITLE" . 1060071) ("UNITS" . 1060033) ("VIRTUAL_DIMENSIONS" . 1060050) ("VISIBLE_LOCATION" . 1097046) ("ZOOM_BASE" . 1342797)))
-    ("Show" pro "IDLgrWindow" (system) "Obj->[%s::]%s, Position" ("objects_gr254.html"))
-    ("ZoomIn" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr255.html"))
-    ("ZoomOut" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr256.html"))
-    ("GetContiguousPixels" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s()" ("objects_gr240.html"))
-    ("GetDimensions" fun "IDLgrWindow" (system) "Result = Obj -> [%s::]%s ()" ("objects_gr242.html" ("MINIMUM_VIRTUAL_DIMENSIONS" . 1360348) ("ORIGINAL_VIRTUAL_DIMENSIONS" . 1360355) ("VIRTUAL_DIMENSIONS" . 1360358) ("VISIBLE_LOCATION" . 1360361)))
-    ("GetFontnames" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s(FamilyName)" ("objects_gr243.html" ("IDL_FONTS" . 1018678) ("STYLES" . 1018680)))
-    ("GetTextDimensions" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s( TextObj)" ("objects_gr245.html" ("DESCENT" . 1018765) ("PATH" . 1018767)))
-    ("Init" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s()" ("objects_gr247.html" ) ("objects_gr236.html" ("COLOR_MODEL" . 1059974) ("DIMENSIONS" . 1249231) ("GRAPHICS_TREE" . 1059987) ("LOCATION" . 1060082) ("MINIMUM_VIRTUAL_DIMENSIONS" . 1343479) ("N_COLORS" . 1059992) ("PALETTE" . 1059998) ("QUALITY" . 1060003) ("REGISTER_PROPERTIES" . 1060008) ("RENDERER" . 1094184) ("RETAIN" . 1060058) ("TITLE" . 1060071) ("UNITS" . 1060033) ("VIRTUAL_DIMENSIONS" . 1060050) ("VISIBLE_LOCATION" . 1097046) ("ZOOM_BASE" . 1342797)))
-    ("PickData" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s( View, Object, Location, XYZLocation)" ("objects_gr248.html" ("DIMENSIONS" . 1018957) ("PATH" . 1018961) ("PICK_STATUS" . 1018967)))
-    ("Read" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s()" ("objects_gr249.html"))
-    ("Select" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s( Picture, XY)" ("objects_gr250.html" ("DIMENSIONS" . 1019069) ("ORDER" . 1019073) ("SUB_SELECTION" . 1343670) ("UNITS" . 1019076)))
-    ("Cleanup" pro "IDLitCommand" (system) "Obj->[%s::]%s" ("objects_it6.html"))
-    ("GetProperty" pro "IDLitCommand" (system) "Obj->[%s::]%s" ("objects_it8.html" ) ("objects_it4.html" ("OPERATION_IDENTIFIER" . 1042072) ("TARGET_IDENTIFIER" . 1042044)))
-    ("SetProperty" pro "IDLitCommand" (system) "Obj->[%s::]%s" ("objects_it11.html" ) ("objects_it4.html" ("OPERATION_IDENTIFIER" . 1042072) ("TARGET_IDENTIFIER" . 1042044)))
-    ("AddItem" fun "IDLitCommand" (system) "Result = Obj->[%s::]%s(StrItem, Item)" ("objects_it5.html" ("OVERWRITE" . 1042134)))
-    ("GetItem" fun "IDLitCommand" (system) "Result = Obj->[%s::]%s(StrItem, Item)" ("objects_it7.html"))
-    ("GetSize" fun "IDLitCommand" (system) "Result = Obj->[%s::]%s()" ("objects_it9.html" ("KILOBYTES" . 1042275)))
-    ("Init" fun "IDLitCommand" (system) "Result = Obj->[%s::]%s()" ("objects_it10.html" ) ("objects_it4.html" ("OPERATION_IDENTIFIER" . 1042072) ("TARGET_IDENTIFIER" . 1042044)))
-    ("Cleanup" pro "IDLitCommandSet" (system) "Obj->[%s::]%s" ("objects_it14.html"))
-    ("Init" fun "IDLitCommandSet" (system) "Result = Obj->[%s::]%s()" ("objects_it16.html" ))
-    ("Cleanup" pro "IDLitComponent" (system) "Obj->[%s::]%s" ("objects_it19.html"))
-    ("GetProperty" pro "IDLitComponent" (system) "Obj->[%s::]%s" ("objects_it22.html" ) ("objects_it18.html" ("COMPONENT_VERSION" . 1068963) ("DESCRIPTION" . 1286379) ("HELP" . 1069022) ("ICON" . 1281308) ("IDENTIFIER" . 1069050) ("NAME" . 1069084) ("PRIVATE" . 1069111) ("UVALUE" . 1069139)))
-    ("GetPropertyAttribute" pro "IDLitComponent" (system) "Obj->[%s::]%s, PropertyIdentifier" ("objects_it23.html" ("TYPE" . 1069368)))
-    ("RegisterProperty" pro "IDLitComponent" (system) "Obj->[%s::]%s, PropertyIdentifier[, Type]" ("objects_it27.html" ("BOOLEAN" . 1069541) ("COLOR" . 1069543) ("DESCRIPTION" . 1069545) ("ENUMLIST" . 1069547) ("FLOAT" . 1069549) ("HIDE" . 1069551) ("INTEGER" . 1069553) ("LINESTYLE" . 1069555) ("NAME" . 1069563) ("SENSITIVE" . 1069565) ("STRING" . 1069567) ("SYMBOL" . 1069569) ("THICKNESS" . 1069574) ("UNDEFINED" . 1069576) ("USERDEF" . 1069579) ("VALID_RANGE" . 1069581)))
-    ("Restore" pro "IDLitComponent" (system) "Obj->[%s::]%s" ("objects_it28.html"))
-    ("SetProperty" pro "IDLitComponent" (system) "Obj->[%s::]%s" ("objects_it29.html" ) ("objects_it18.html" ("DESCRIPTION" . 1286379) ("HELP" . 1069022) ("ICON" . 1281308) ("IDENTIFIER" . 1069050) ("NAME" . 1069084) ("PRIVATE" . 1069111) ("UVALUE" . 1069139)))
-    ("SetPropertyAttribute" pro "IDLitComponent" (system) "Obj->[%s::]%s , PropertyIdentifier" ("objects_it30.html"))
-    ("SetPropertyByIdentifier" pro "IDLitComponent" (system) "Obj->[%s::]%s, PropertyIdentifier, Value" ("objects_it31.html"))
-    ("UpdateComponentVersion" pro "IDLitComponent" (system) "Obj->[%s::]%s" ("objects_it32.html"))
-    ("EditUserDefProperty" fun "IDLitComponent" (system) "Result = Obj->[%s::]%s(iTool, PropertyIdentifier)" ("objects_it20.html"))
-    ("GetFullIdentifier" fun "IDLitComponent" (system) "Result = Obj->[%s::]%s([Objref])" ("objects_it21.html"))
-    ("GetPropertyByIdentifier" fun "IDLitComponent" (system) "Result = Obj->[%s::]%s(PropertyIdentifier, Value)" ("objects_it24.html"))
-    ("Init" fun "IDLitComponent" (system) "Result = Obj->[%s::]%s()" ("objects_it25.html" ) ("objects_it18.html" ("DESCRIPTION" . 1286379) ("HELP" . 1069022) ("ICON" . 1281308) ("IDENTIFIER" . 1069050) ("NAME" . 1069084) ("PRIVATE" . 1069111) ("UVALUE" . 1069139)))
-    ("QueryProperty" fun "IDLitComponent" (system) "Result = Obj->[%s::]%s([PropertyIdentifier])" ("objects_it26.html"))
-    ("Add" pro "IDLitContainer" (system) "Obj->[%s::]%s, Components" ("objects_it35.html" ("NO_NOTIFY" . 1070004)))
-    ("AddByIdentifier" pro "IDLitContainer" (system) "Obj->[%s::]%s, Identifier, Item" ("objects_it36.html"))
-    ("Cleanup" pro "IDLitContainer" (system) "Obj->[%s::]%s" ("objects_it37.html"))
-    ("Remove" pro "IDLitContainer" (system) "Obj->[%s::]%s, Components" ("objects_it42.html" ("NO_NOTIFY" . 1070225)))
-    ("Get" fun "IDLitContainer" (system) "Result = Obj->[%s::]%s()" ("objects_it39.html" ("ALL" . 1070110) ("COUNT" . 1070112) ("ISA" . 1070114) ("POSITION" . 1070117) ("SKIP_PRIVATE" . 1070119)))
-    ("GetByIdentifier" fun "IDLitContainer" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it40.html"))
-    ("IDLitContainer" fun "IDLitContainer" (system) "Result = Obj->[%s::]%s::FindIdentifiers([Pattern])" ("objects_it38.html" ("COUNT" . 1297331) ("LEAF_NODES" . 1297334)))
-    ("Init" fun "IDLitContainer" (system) "Result = Obj->[%s::]%s()" ("objects_it41.html" ))
-    ("RemoveByIdentifier" fun "IDLitContainer" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it43.html"))
-    ("AddDataObserver" pro "IDLitData" (system) "Obj->[%s::]%s, Observer" ("objects_it46.html"))
-    ("Cleanup" pro "IDLitData" (system) "Obj->[%s::]%s" ("objects_it47.html"))
-    ("GetProperty" pro "IDLitData" (system) "Obj->[%s::]%s" ("objects_it51.html" ) ("objects_it45.html" ("HIDE" . 1070552) ("READ_ONLY" . 1070608) ("TYPE" . 1070636)))
-    ("NotifyDataChange" pro "IDLitData" (system) "Obj->[%s::]%s" ("objects_it54.html"))
-    ("NotifyDataComplete" pro "IDLitData" (system) "Obj->[%s::]%s" ("objects_it55.html"))
-    ("RemoveDataObserver" pro "IDLitData" (system) "Obj->[%s::]%s, Observer" ("objects_it56.html"))
-    ("SetProperty" pro "IDLitData" (system) "Obj->[%s::]%s" ("objects_it58.html" ) ("objects_it45.html" ("HIDE" . 1070552) ("READ_ONLY" . 1070608)))
-    ("Copy" fun "IDLitData" (system) "Result = Obj->[%s::]%s()" ("objects_it48.html"))
-    ("GetByType" fun "IDLitData" (system) "Result = Obj->[%s::]%s(Type)" ("objects_it49.html" ("COUNT" . 1070828)))
-    ("GetData" fun "IDLitData" (system) "Result = Obj->[%s::]%s(Data[, Identifier])" ("objects_it50.html" ("NAN" . 1070867) ("NO_COPY" . 1154511)))
-    ("GetSize" fun "IDLitData" (system) "Result = Obj->[%s::]%s()" ("objects_it52.html"))
-    ("Init" fun "IDLitData" (system) "Result = Obj->[%s::]%s([, Data])" ("objects_it53.html" ) ("objects_it45.html" ("HIDE" . 1070552) ("NO_COPY" . 1070580) ("READ_ONLY" . 1070608) ("TYPE" . 1070636)))
-    ("SetData" fun "IDLitData" (system) "Result = Obj->[%s::]%s(Data[, Identifier])" ("objects_it57.html" ("NO_COPY" . 1071158) ("NULL" . 1071160)))
-    ("Add" pro "IDLitDataContainer" (system) "Obj->[%s::]%s, Data" ("objects_it61.html" ("NO_NOTIFY" . 1275026)))
-    ("Cleanup" pro "IDLitDataContainer" (system) "Obj->[%s::]%s" ("objects_it62.html"))
-    ("GetProperty" pro "IDLitDataContainer" (system) "Obj->[%s::]%s" ("objects_it65.html" ))
-    ("SetProperty" pro "IDLitDataContainer" (system) "Obj->[%s::]%s" ("objects_it68.html" ))
-    ("GetData" fun "IDLitDataContainer" (system) "Result = Obj->[%s::]%s(Data [, Identifier])" ("objects_it63.html" ("NO_COPY" . 1071642)))
-    ("GetIdentifiers" fun "IDLitDataContainer" (system) "Result = Obj->[%s::]%s([Pattern])" ("objects_it64.html" ("LEAF" . 1071682)))
-    ("Init" fun "IDLitDataContainer" (system) "Result = Obj->[%s::]%s([, Data])" ("objects_it66.html" ))
-    ("SetData" fun "IDLitDataContainer" (system) "Result = Obj->[%s::]%s(Data, Identifier)" ("objects_it67.html" ("NO_COPY" . 1071799) ("NULL" . 1071801)))
-    ("GetProperty" pro "IDLitDataOperation" (system) "Obj->[%s::]%s" ("objects_it74.html" ))
-    ("SetProperty" pro "IDLitDataOperation" (system) "Obj->[%s::]%s" ("objects_it76.html" ))
-    ("DoExecuteUI" fun "IDLitDataOperation" (system) "Result = Obj->[%s::]%s()" ("objects_it72.html"))
-    ("Execute" fun "IDLitDataOperation" (system) "Result = Obj->[%s::]%s(Data)" ("objects_it73.html"))
-    ("Init" fun "IDLitDataOperation" (system) "Result = Obj->[%s::]%s()" ("objects_it75.html" ))
-    ("UndoExecute" fun "IDLitDataOperation" (system) "Result = Obj->[%s::]%s(Data)" ("objects_it77.html"))
-    ("AddOnNotifyObserver" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, IdObserver, IdSubject" ("objects_it80.html"))
-    ("DoOnNotify" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, IdOriginator, IdMessage, Value" ("objects_it81.html"))
-    ("ErrorMessage" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, StrMessage" ("objects_it82.html" ("SEVERITY" . 1079859) ("TITLE" . 1079864) ("USE_LAST_ERROR" . 1079866)))
-    ("ProbeStatusMessage" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, StrMessage" ("objects_it84.html"))
-    ("RemoveOnNotifyObserver" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, IdObserver, IdSubject" ("objects_it88.html"))
-    ("SignalError" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, StrMessage" ("objects_it89.html" ("CODE" . 1080072) ("SEVERITY" . 1080074)))
-    ("StatusMessage" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, StrMessage" ("objects_it90.html" ("SEGMENT_IDENTIFIER" . 1287131)))
-    ("GetTool" fun "IDLitIMessaging" (system) "Result = Obj->[%s::]%s()" ("objects_it83.html"))
-    ("ProgressBar" fun "IDLitIMessaging" (system) "Result = Obj->[%s::]%s(StrMessage)" ("objects_it85.html" ("CANCEL" . 1270494) ("PERCENT" . 1079974) ("SHUTDOWN" . 1079976)))
-    ("PromptUserText" fun "IDLitIMessaging" (system) "Result = Obj->[%s::]%s(StrPrompt, Answer)" ("objects_it86.html" ("TITLE" . 1080016)))
-    ("PromptUserYesNo" fun "IDLitIMessaging" (system) "Result = Obj->[%s::]%s(StrPrompt, Answer)" ("objects_it87.html" ("TITLE" . 1080036)))
-    ("Cleanup" pro "IDLitManipulator" (system) "Obj->[%s::]%s" ("objects_it93.html"))
-    ("GetProperty" pro "IDLitManipulator" (system) "Obj->[%s::]%s" ("objects_it96.html" ) ("objects_it92.html" ("BUTTON_EVENTS" . 1080361) ("DESCRIPTION" . 1080417) ("KEYBOARD_EVENTS" . 1080504) ("MOTION_EVENTS" . 1080532) ("OPERATION_IDENTIFIER" . 1080560) ("PARAMETER_IDENTIFIER" . 1080588) ("TRANSIENT_DEFAULT" . 1080617) ("TRANSIENT_MOTION" . 1080650) ("TYPES" . 1080678) ("VISUAL_TYPE" . 1080735)))
-    ("OnKeyboard" pro "IDLitManipulator" (system) "Obj->[%s::]%s, Win, IsASCII, Character, KeyValue, X, Y, Press, Release, KeyMods" ("objects_it98.html"))
-    ("OnLoseCurrentManipulator" pro "IDLitManipulator" (system) "Obj->[%s::]%s" ("objects_it99.html"))
-    ("OnMouseDown" pro "IDLitManipulator" (system) "Obj->[%s::]%s, Win, X, Y, IButton, KeyMods, NClicks" ("objects_it100.html"))
-    ("OnMouseMotion" pro "IDLitManipulator" (system) "Obj->[%s::]%s, Win, X, Y, KeyMods" ("objects_it101.html"))
-    ("OnMouseUp" pro "IDLitManipulator" (system) "Obj->[%s::]%s, Win, X, Y, IButton" ("objects_it102.html"))
-    ("RegisterCursor" pro "IDLitManipulator" (system) "Obj->[%s::]%s, ArrCursor, Name" ("objects_it104.html" ("DEFAULT" . 1281810)))
-    ("SetCurrentManipulator" pro "IDLitManipulator" (system) "Obj->[%s::]%s [, Item]" ("objects_it105.html"))
-    ("SetProperty" pro "IDLitManipulator" (system) "Obj->[%s::]%s" ("objects_it120.html" ) ("objects_it92.html" ("BUTTON_EVENTS" . 1080361) ("DESCRIPTION" . 1080417) ("DISABLE" . 1080445) ("KEYBOARD_EVENTS" . 1080504) ("MOTION_EVENTS" . 1080532) ("OPERATION_IDENTIFIER" . 1080560) ("PARAMETER_IDENTIFIER" . 1080588) ("TRANSIENT_DEFAULT" . 1080617) ("TRANSIENT_MOTION" . 1080650) ("VISUAL_TYPE" . 1080735)))
-    ("CommitUndoValues" fun "IDLitManipulator" (system) "Result = Obj->[%s::]%s()" ("objects_it94.html" ("UNCOMMIT" . 1080828)))
-    ("GetCursorType" fun "IDLitManipulator" (system) "Result = Obj->[%s::]%s(TypeIn, KeyMods)" ("objects_it95.html"))
-    ("Init" fun "IDLitManipulator" (system) "Result = Obj->[%s::]%s()" ("objects_it97.html" ) ("objects_it92.html" ("BUTTON_EVENTS" . 1080361) ("DEFAULT_CURSOR" . 1080389) ("DESCRIPTION" . 1080417) ("DISABLE" . 1080445) ("KEYBOARD_EVENTS" . 1080504) ("MOTION_EVENTS" . 1080532) ("OPERATION_IDENTIFIER" . 1080560) ("PARAMETER_IDENTIFIER" . 1080588) ("TRANSIENT_DEFAULT" . 1080617) ("TRANSIENT_MOTION" . 1080650) ("TYPES" . 1080678) ("VIEWS_ONLY" . 1080706) ("VISUAL_TYPE" . 1080735)))
-    ("RecordUndoValues" fun "IDLitManipulator" (system) "Result = Obj->[%s::]%s()" ("objects_it103.html"))
-    ("Add" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s, Manipulator" ("objects_it109.html"))
-    ("GetProperty" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s" ("objects_it112.html" ))
-    ("OnMouseDown" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s, Win, X, Y, IButton, KeyMods, NClicks" ("objects_it115.html"))
-    ("OnMouseMotion" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s, Win, X, Y, KeyMods" ("objects_it116.html"))
-    ("OnMouseUp" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s, Win, X, Y, IButton" ("objects_it117.html"))
-    ("SetCurrent" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s, Manipulator" ("objects_it118.html"))
-    ("SetCurrentManipulator" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s, Identifier" ("objects_it119.html"))
-    ("GetCurrent" fun "IDLitManipulatorContainer" (system) "Result = Obj->[%s::]%s()" ("objects_it110.html"))
-    ("GetCurrentManipulator" fun "IDLitManipulatorContainer" (system) "Result = Obj->[%s::]%s()" ("objects_it111.html" ("IDENTIFIER" . 1081635)))
-    ("Init" fun "IDLitManipulatorContainer" (system) "Result = Obj->[%s::]%s()" ("objects_it113.html" ) ("objects_it108.html" ("AUTO_SWITCH" . 1081512)))
-    ("Add" pro "IDLitManipulatorManager" (system) "Obj->[%s::]%s, Manipulator" ("objects_it123.html" ("DEFAULT" . 1082187)))
-    ("AddManipulatorObserver" pro "IDLitManipulatorManager" (system) "Obj->[%s::]%s, Observer" ("objects_it124.html"))
-    ("RemoveManipulatorObserver" pro "IDLitManipulatorManager" (system) "Obj->[%s::]%s, Observer" ("objects_it127.html"))
-    ("Init" fun "IDLitManipulatorManager" (system) "Result = Obj->[%s::]%s()" ("objects_it126.html" ))
-    ("Cleanup" pro "IDLitManipulatorVisual" (system) "Obj->[%s::]%s" ("objects_it130.html"))
-    ("GetProperty" pro "IDLitManipulatorVisual" (system) "Obj->[%s::]%s" ("objects_it131.html" ) ("objects_it129.html" ("UNIFORM_SCALE" . 1082429) ("VISUAL_TYPE" . 1082457)))
-    ("SetProperty" pro "IDLitManipulatorVisual" (system) "Obj->[%s::]%s" ("objects_it133.html" ) ("objects_it129.html" ("UNIFORM_SCALE" . 1082429) ("VISUAL_TYPE" . 1082457)))
-    ("Init" fun "IDLitManipulatorVisual" (system) "Result = Obj->[%s::]%s()" ("objects_it132.html" ) ("objects_it129.html" ("UNIFORM_SCALE" . 1082429) ("VISUAL_TYPE" . 1082457)))
-    ("Cleanup" pro "IDLitOperation" (system) "Obj->[%s::]%s" ("objects_it71.html"))
-    ("GetProperty" pro "IDLitOperation" (system) "Obj->[%s::]%s" ("objects_it138.html" ) ("objects_it135.html" ("EXPENSIVE_COMPUTATION" . 1072559) ("REVERSIBLE_OPERATION" . 1072587) ("SHOW_EXECUTION_UI" . 1072615) ("TYPES" . 1072643)))
-    ("SetProperty" pro "IDLitOperation" (system) "Obj->[%s::]%s" ("objects_it143.html" ))
-    ("DoAction" fun "IDLitOperation" (system) "Result = Obj->[%s::]%s(Tool)" ("objects_it137.html"))
-    ("Init" fun "IDLitOperation" (system) "Result = Obj->[%s::]%s()" ("objects_it139.html" ) ("objects_it135.html" ("EXPENSIVE_COMPUTATION" . 1072559) ("REVERSIBLE_OPERATION" . 1072587) ("SHOW_EXECUTION_UI" . 1072615) ("TYPES" . 1072643)))
-    ("RecordFinalValues" fun "IDLitOperation" (system) "Result = Obj->[%s::]%s(CommandSet, Targets [, IdProperty] )" ("objects_it140.html"))
-    ("RecordInitialValues" fun "IDLitOperation" (system) "Result = Obj->[%s::]%s(CommandSet, Targets [, IdProperty])" ("objects_it141.html"))
-    ("RedoOperation" fun "IDLitOperation" (system) "Result = Obj->[%s::]%s(CommandSet)" ("objects_it142.html"))
-    ("UndoOperation" fun "IDLitOperation" (system) "Result = Obj->[%s::]%s(CommandSet)" ("objects_it144.html"))
-    ("Cleanup" pro "IDLitParameter" (system) "Obj->[%s::]%s" ("objects_it147.html"))
-    ("IDLitParameter" pro "IDLitParameter" (system) "Obj->[%s::]%s::SetParameterAttribute(ParamName)" ("objects_it157.html" ("KEYWORD")))
-    ("OnDataChangeUpdate" pro "IDLitParameter" (system) "Obj->[%s::]%s, Data, ParameterName" ("objects_it152.html"))
-    ("OnDataDisconnect" pro "IDLitParameter" (system) "Obj->[%s::]%s, ParameterName" ("objects_it153.html"))
-    ("RegisterParameter" pro "IDLitParameter" (system) "Obj->[%s::]%s, Name" ("objects_it155.html" ("BY_VALUE" . 1083371) ("DESCRIPTION" . 1083373) ("INPUT" . 1083375) ("OPTARGET" . 1083377) ("OPTIONAL" . 1083379) ("OUTPUT" . 1083381) ("TYPES" . 1083383)))
-    ("GetParameter" fun "IDLitParameter" (system) "Result = Obj->[%s::]%s(Name)" ("objects_it148.html" ("ALL" . 1083021) ("COUNT" . 1083023)))
-    ("GetParameterSet" fun "IDLitParameter" (system) "Result = Obj->[%s::]%s()" ("objects_it150.html" ("DEEP_COPY" . 1083153)))
-    ("IDLitParameter" fun "IDLitParameter" (system) "Result = Obj->[%s::]%s::QueryParameter([ParamName])" ("objects_it154.html" ("COUNT" . 1297407)))
-    ("Init" fun "IDLitParameter" (system) "Result = Obj->[%s::]%s()" ("objects_it151.html" ))
-    ("SetData" fun "IDLitParameter" (system) "Result = Obj->[%s::]%s(Data)" ("objects_it156.html" ("BY_VALUE" . 1083428) ("NO_UPDATE" . 1083430) ("PARAMETER_NAME" . 1083433)))
-    ("SetParameterSet" fun "IDLitParameter" (system) "Result = Obj->[%s::]%s(ParamSet)" ("objects_it158.html"))
-    ("Add" pro "IDLitParameterSet" (system) "Obj->[%s::]%s, Data" ("objects_it161.html" ("PARAMETER_NAME" . 1083838) ("PRESERVE_LOCATION" . 1083840)))
-    ("Cleanup" pro "IDLitParameterSet" (system) "Obj->[%s::]%s" ("objects_it162.html"))
-    ("Remove" pro "IDLitParameterSet" (system) "Obj->[%s::]%s [, Items]" ("objects_it168.html" ("ALL" . 1084212) ("POSITION" . 1084214)))
-    ("Copy" fun "IDLitParameterSet" (system) "Result = Obj->[%s::]%s()" ("objects_it163.html"))
-    ("Get" fun "IDLitParameterSet" (system) "Result = Obj->[%s::]%s()" ("objects_it164.html" ("ALL" . 1083998) ("COUNT" . 1084000) ("NAME" . 1084002) ("POSITION" . 1084004)))
-    ("GetByName" fun "IDLitParameterSet" (system) "Result = Obj->[%s::]%s( Names)" ("objects_it165.html" ("COUNT" . 1228440) ("NAME" . 1084087)))
-    ("GetParameterName" fun "IDLitParameterSet" (system) "Result = Obj->[%s::]%s(Data, Name)" ("objects_it166.html"))
-    ("Init" fun "IDLitParameterSet" (system) "Result = Obj->[%s::]%s()" ("objects_it167.html" ))
-    ("Cleanup" pro "IDLitReader" (system) "Obj->[%s::]%s" ("objects_it171.html"))
-    ("GetProperty" pro "IDLitReader" (system) "Obj->[%s::]%s" ("objects_it175.html" ))
-    ("SetFilename" pro "IDLitReader" (system) "Obj->[%s::]%s, Filename" ("objects_it178.html"))
-    ("SetProperty" pro "IDLitReader" (system) "Obj->[%s::]%s" ("objects_it179.html" ))
-    ("GetData" fun "IDLitReader" (system) "Result = Obj->[%s::]%s(Data)" ("objects_it172.html"))
-    ("GetFileExtensions" fun "IDLitReader" (system) "Result = Obj->[%s::]%s()" ("objects_it173.html" ("COUNT" . 1084646)))
-    ("GetFilename" fun "IDLitReader" (system) "Result = Obj->[%s::]%s()" ("objects_it174.html"))
-    ("Init" fun "IDLitReader" (system) "Result = Obj->[%s::]%s(, Extensions)" ("objects_it176.html" ))
-    ("IsA" fun "IDLitReader" (system) "Result = Obj->[%s::]%s(Filename)" ("objects_it177.html"))
-    ("ActivateManipulator" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it182.html" ("DEFAULT" . 1265856)))
-    ("Add" pro "IDLitTool" (system) "Obj->[%s::]%s, Item" ("objects_it183.html"))
-    ("AddService" pro "IDLitTool" (system) "Obj->[%s::]%s, Service" ("objects_it184.html"))
-    ("Cleanup" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it185.html"))
-    ("CommitActions" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it186.html"))
-    ("DisableUpdates" pro "IDLitTool" (system) "Obj->[%s::]%s ()" ("objects_it187.html" ("PREVIOUSLY_DISABLED" . 1078152)))
-    ("EnableUpdates" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it191.html"))
-    ("GetProperty" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it198.html" ) ("objects_it181.html" ("DESCRIPTION" . 1123541) ("ICON" . 1077825) ("NAME" . 1077853) ("VERBOSE" . 1077937) ("VERSION" . 1077965)))
-    ("RefreshCurrentWindow" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it203.html"))
-    ("Register" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it204.html" ("DEFAULT" . 1363277) ("DESCRIPTION" . 1078812) ("ICON" . 1078814) ("IDENTIFIER" . 1078816) ("PROXY" . 1078824)))
-    ("RegisterCustomization" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it205.html"))
-    ("RegisterFileReader" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it206.html" ("DEFAULT" . 1363382) ("DESCRIPTION" . 1078859) ("ICON" . 1078861) ("IDENTIFIER" . 1078863) ("PROXY" . 1078866)))
-    ("RegisterFileWriter" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it207.html" ("DEFAULT" . 1363460) ("DESCRIPTION" . 1078901) ("ICON" . 1078903) ("IDENTIFIER" . 1078905) ("PROXY" . 1078908)))
-    ("RegisterManipulator" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it208.html" ("DEFAULT" . 1078943) ("DESCRIPTION" . 1078945) ("ICON" . 1078947) ("IDENTIFIER" . 1078949)))
-    ("RegisterOperation" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it209.html" ("ACCELERATOR" . 1247195) ("CHECKED" . 1247213) ("DESCRIPTION" . 1078985) ("DISABLE" . 1247231) ("DROPLIST_EDIT" . 1292076) ("DROPLIST_INDEX" . 1292079) ("DROPLIST_ITEMS" . 1292082) ("ICON" . 1078987) ("IDENTIFIER" . 1078989) ("PROXY" . 1078992) ("SEPARATOR" . 1247249)))
-    ("RegisterStatusBarSegment" pro "IDLitTool" (system) "Obj->[%s::]%s, Name" ("objects_it210.html" ("IDENTIFIER" . 1286948) ("NORMALIZED_WIDTH" . 1286951)))
-    ("RegisterVisualization" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it211.html" ("DEFAULT" . 1079028) ("DESCRIPTION" . 1079030) ("ICON" . 1079032) ("IDENTIFIER" . 1079034) ("PROXY" . 1079037)))
-    ("SetProperty" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it212.html" ) ("objects_it181.html" ("DESCRIPTION" . 1123541) ("ICON" . 1077825) ("NAME" . 1077853) ("TYPE" . 1077881) ("UPDATE_BYTYPE" . 1077909) ("VERBOSE" . 1077937)))
-    ("UnRegister" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it213.html"))
-    ("UnRegisterCustomization" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it214.html"))
-    ("UnRegisterFileReader" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it215.html"))
-    ("UnRegisterFileWriter" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it216.html"))
-    ("UnRegisterManipulator" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it217.html"))
-    ("UnRegisterOperation" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it218.html"))
-    ("UnRegisterStatusBarSegment" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it219.html"))
-    ("UnRegisterVisualization" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it220.html"))
-    ("DoAction" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it188.html"))
-    ("DoSetProperty" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(TargetIdentifier, PropertyIdentifier, Value)" ("objects_it189.html"))
-    ("DoUIService" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(ServiceIdentifier, Requestor)" ("objects_it190.html"))
-    ("GetCurrentManipulator" fun "IDLitTool" (system) "Result = Obj->[%s::]%s()" ("objects_it193.html"))
-    ("GetFileReaders" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it194.html" ("ALL" . 1078392) ("COUNT" . 1078394)))
-    ("GetFileWriters" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it195.html" ("ALL" . 1078432) ("COUNT" . 1078434)))
-    ("GetManipulators" fun "IDLitTool" (system) "Result = Obj->[%s::]%s()" ("objects_it196.html" ("COUNT" . 1078470)))
-    ("GetOperations" fun "IDLitTool" (system) "Result = Obj->[%s::]%s()" ("objects_it197.html" ("COUNT" . 1228547) ("IDENTIFIER" . 1078507)))
-    ("GetSelectedItems" fun "IDLitTool" (system) "Result = Obj->[%s::]%s()" ("objects_it199.html" ("COUNT" . 1078577)))
-    ("GetService" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(IdService)" ("objects_it200.html"))
-    ("GetVisualizations" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it201.html" ("ALL" . 1078651) ("COUNT" . 1078653)))
-    ("IDLitTool" fun "IDLitTool" (system) "Result = Obj->[%s::]%s::FindIdentifiers([Pattern])" ("objects_it192.html" ("ANNOTATIONS" . 1297756) ("COUNT" . 1297759) ("DATA_MANAGER" . 1297762) ("FILE_READERS" . 1297765) ("FILE_WRITERS" . 1297768) ("LEAF_NODES" . 1297771) ("MANIPULATORS" . 1297775) ("OPERATIONS" . 1297778) ("VISUALIZATIONS" . 1297781)))
-    ("Init" fun "IDLitTool" (system) "Result = Obj->[%s::]%s()" ("objects_it202.html" ) ("objects_it181.html" ("DESCRIPTION" . 1123541) ("ICON" . 1077825) ("NAME" . 1077853) ("TYPE" . 1077881) ("UPDATE_BYTYPE" . 1077909) ("VERBOSE" . 1077937) ("VERSION" . 1077965)))
-    ("AddOnNotifyObserver" pro "IDLitUI" (system) "Obj->[%s::]%s, IdObserver, IdSubject" ("objects_it224.html"))
-    ("Cleanup" pro "IDLitUI" (system) "Obj->[%s::]%s" ("objects_it225.html"))
-    ("GetProperty" pro "IDLitUI" (system) "Obj->[%s::]%s" ("objects_it227.html" ) ("objects_it223.html" ("GROUP_LEADER" . 1085364)))
-    ("RemoveOnNotifyObserver" pro "IDLitUI" (system) "Obj->[%s::]%s, IdObserver, IdSubject" ("objects_it233.html"))
-    ("SetProperty" pro "IDLitUI" (system) "Obj->[%s::]%s" ("objects_it234.html" ))
-    ("UnRegisterUIService" pro "IDLitUI" (system) "Obj->[%s::]%s, Name" ("objects_it235.html"))
-    ("UnRegisterWidget" pro "IDLitUI" (system) "Obj->[%s::]%s, Name" ("objects_it236.html"))
-    ("DoAction" fun "IDLitUI" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it226.html"))
-    ("GetTool" fun "IDLitUI" (system) "Result = Obj->[%s::]%s()" ("objects_it228.html"))
-    ("GetWidgetByName" fun "IDLitUI" (system) "Result = Obj->[%s::]%s(Name)" ("objects_it229.html"))
-    ("Init" fun "IDLitUI" (system) "Result = Obj->[%s::]%s(, oTool)" ("objects_it230.html" ))
-    ("RegisterUIService" fun "IDLitUI" (system) "Restult = Obj->[%s::]%s(Name, Callback)" ("objects_it231.html"))
-    ("RegisterWidget" fun "IDLitUI" (system) "Result = Obj->[%s::]%s(wID, Name, Callback)" ("objects_it232.html" ("FLOATING" . 1085752)))
-    ("Add" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Objects" ("objects_it239.html" ("AGGREGATE" . 1086521) ("NO_UPDATE" . 1086525) ("POSITION" . 1086527)))
-    ("Aggregate" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Objects" ("objects_it240.html"))
-    ("BeginManipulation" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Manipulator" ("objects_it241.html"))
-    ("Cleanup" pro "IDLitVisualization" (system) "Obj->[%s::]%s" ("objects_it242.html"))
-    ("EndManipulation" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Manipulator" ("objects_it243.html"))
-    ("GetProperty" pro "IDLitVisualization" (system) "Obj->[%s::]%s" ("objects_it251.html" ) ("objects_it238.html" ("CENTER_OF_ROTATION" . 1086295) ("IMPACTS_RANGE" . 1255230) ("ISOTROPIC" . 1086379) ("MANIPULATOR_TARGET" . 1086407) ("PROPERTY_INTERSECTION" . 1153078)))
-    ("Move" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Source, Destination" ("objects_it261.html"))
-    ("On2DRotate" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier, IsRotated" ("objects_it262.html"))
-    ("OnAxesRequestChange" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier, AxesRequest" ("objects_it263.html"))
-    ("OnAxesStyleRequestChange" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier, StyleRequest" ("objects_it264.html"))
-    ("OnDataChange" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier" ("objects_it265.html"))
-    ("OnDataComplete" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier" ("objects_it266.html"))
-    ("OnDataRangeChange" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier, XRange, YRange, Zrange" ("objects_it267.html"))
-    ("OnDimensionChange" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier, Is3D" ("objects_it268.html"))
-    ("OnWorldDimensionChange" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier, Is3D" ("objects_it269.html"))
-    ("Remove" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Object" ("objects_it270.html" ("NO_UPDATE" . 1087640)))
-    ("Restore" pro "IDLitVisualization" (system) "Obj->[%s::]%s" ("objects_it272.html"))
-    ("Rotate" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Axis, Angle" ("objects_it273.html" ("CENTER_OF_ROTATION" . 1257870) ("PREMULTIPLY" . 1257943)))
-    ("Scale" pro "IDLitVisualization" (system) "Obj->[%s::]%s, SX, SY, SZ" ("objects_it274.html" ("CENTER_OF_ROTATION" . 1087711) ("PREMULTIPLY" . 1087713)))
-    ("Select" pro "IDLitVisualization" (system) "Obj->[%s::]%s[, Mode]" ("objects_it275.html" ("ADDITIVE" . 1087748) ("NO_NOTIFY" . 1087750) ("SELECT" . 1087752) ("TOGGLE" . 1087754) ("UNSELECT" . 1087756)))
-    ("Set3D" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Is3D" ("objects_it276.html" ("ALWAYS" . 1087787) ("AUTO_COMPUTE" . 1087789)))
-    ("SetAxesRequest" pro "IDLitVisualization" (system) "Obj->[%s::]%s [, AxesRequest]" ("objects_it277.html" ("ALWAYS" . 1264542) ("AUTO_COMPUTE" . 1264612) ("NO_NOTIFY" . 1264617)))
-    ("SetAxesStyleRequest" pro "IDLitVisualization" (system) "Obj->[%s::]%s, StyleRequest" ("objects_it278.html" ("NO_NOTIFY" . 1264441)))
-    ("SetCurrentSelectionVisual" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Manipulator" ("objects_it279.html"))
-    ("SetDefaultSelectionVisual" pro "IDLitVisualization" (system) "Obj->[%s::]%s, SelectionVisual" ("objects_it281.html" ("POSITION" . 1087891)))
-    ("SetProperty" pro "IDLitVisualization" (system) "Obj->[%s::]%s" ("objects_it283.html" ) ("objects_it238.html" ("CENTER_OF_ROTATION" . 1086295) ("IMPACTS_RANGE" . 1255230) ("ISOTROPIC" . 1086379) ("MANIPULATOR_TARGET" . 1086407) ("TYPE" . 1086465)))
-    ("UpdateSelectionVisual" pro "IDLitVisualization" (system) "Obj->[%s::]%s" ("objects_it284.html"))
-    ("VisToWindow" pro "IDLitVisualization" (system) "Obj->[%s::]%s, InX, InY, InZ, OutX, OutY, OutZ" ("objects_it285.html" ("NO_TRANSFORM" . 1157092)))
-    ("WindowToVis" pro "IDLitVisualization" (system) "Obj->[%s::]%s, InX, InY, InZ, OutX, OutY, OutZ or Obj->[%s::]%s, InX, InY, OutX, OutY or Obj->[%s::]%s, InVerts, OutVerts" ("objects_it286.html"))
-    ("Get" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it244.html" ("ALL" . 1086723) ("COUNT" . 1086725) ("ISA" . 1086727) ("POSITION" . 1086730) ("SKIP_PRIVATE" . 1086732)))
-    ("GetCenterRotation" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it245.html" ("NO_TRANSFORM" . 1086773) ("XRANGE" . 1086775) ("YRANGE" . 1086777) ("ZRANGE" . 1086779)))
-    ("GetCurrentSelectionVisual" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it246.html"))
-    ("GetDataSpace" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it247.html" ("UNNORMALIZED" . 1154562)))
-    ("GetDataString" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s(XYZLocation)" ("objects_it248.html"))
-    ("GetDefaultSelectionVisual" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it249.html"))
-    ("GetManipulatorTarget" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it250.html"))
-    ("GetRequestedAxesStyle" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s( )" ("objects_it252.html"))
-    ("GetSelectionVisual" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s(Manipulator)" ("objects_it253.html"))
-    ("GetTypes" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it254.html"))
-    ("GetXYZRange" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s(XRange,YRange, ZRange)" ("objects_it255.html" ("DATA" . 1087296) ("NO_TRANSFORM" . 1087298)))
-    ("Init" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it256.html" ) ("objects_it238.html" ("CENTER_OF_ROTATION" . 1086295) ("IMPACTS_RANGE" . 1255230) ("ISOTROPIC" . 1086379) ("MANIPULATOR_TARGET" . 1086407) ("PROPERTY_INTERSECTION" . 1153078) ("TYPE" . 1086465)))
-    ("Is3D" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it257.html"))
-    ("IsIsotropic" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it258.html"))
-    ("IsManipulatorTarget" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it259.html"))
-    ("IsSelected" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it260.html"))
-    ("RequestsAxes" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s( )" ("objects_it271.html"))
-    ("SetData" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s(Data)" ("objects_it280.html"))
-    ("SetParameterSet" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s(ParameterSet)" ("objects_it282.html"))
-    ("Add" pro "IDLitWindow" (system) "Obj->[%s::]%s, Objects" ("objects_it289.html" ("POSITION" . 1092060)))
-    ("AddWindowEventObserver" pro "IDLitWindow" (system) "Obj->[%s::]%s, Objects" ("objects_it290.html"))
-    ("Cleanup" pro "IDLitWindow" (system) "Obj->[%s::]%s" ("objects_it291.html"))
-    ("ClearSelections" pro "IDLitWindow" (system) "Obj->[%s::]%s" ("objects_it292.html"))
-    ("OnKeyboard" pro "IDLitWindow" (system) "Obj->[%s::]%s, IsASCII, Character, KeySymbol, X, Y, Press, Release, Modifiers" ("objects_it298.html"))
-    ("OnMouseDown" pro "IDLitWindow" (system) "Obj->[%s::]%s, X, Y, ButtonMask, Modifiers, NumClicks" ("objects_it299.html"))
-    ("OnMouseMotion" pro "IDLitWindow" (system) "Obj->[%s::]%s, X, Y, Modifiers" ("objects_it300.html"))
-    ("OnMouseUp" pro "IDLitWindow" (system) "Obj->[%s::]%s, X, Y, ButtonMask" ("objects_it301.html"))
-    ("OnScroll" pro "IDLitWindow" (system) "Obj->[%s::]%s, X, Y" ("objects_it302.html"))
-    ("Remove" pro "IDLitWindow" (system) "Obj->[%s::]%s, Object" ("objects_it303.html" ("ALL" . 1092903) ("POSITION" . 1092905)))
-    ("RemoveWindowEventObserver" pro "IDLitWindow" (system) "Obj->[%s::]%s, Objects" ("objects_it304.html"))
-    ("SetCurrentZoom" pro "IDLitWindow" (system) "Obj->[%s::]%s, ZoomFactor" ("objects_it305.html" ("RESET" . 1092996)))
-    ("SetEventMask" pro "IDLitWindow" (system) "Obj->[%s::]%s([EventMask])" ("objects_it306.html" ("BUTTON_EVENTS" . 1093069) ("KEYBOARD_EVENTS" . 1093071) ("MOTION_EVENTS" . 1093073) ("TRACKING_EVENTS" . 1093075)))
-    ("SetManipulatorManager" pro "IDLitWindow" (system) "Obj->[%s::]%s, Manager" ("objects_it307.html"))
-    ("SetProperty" pro "IDLitWindow" (system) "Obj->[%s::]%s" ("objects_it308.html" ))
-    ("ZoomIn" pro "IDLitWindow" (system) "Obj->[%s::]%s" ("objects_it309.html"))
-    ("ZoomOut" pro "IDLitWindow" (system) "Obj->[%s::]%s" ("objects_it310.html"))
-    ("DoHitTest" fun "IDLitWindow" (system) "Result = Obj->[%s::]%s(X, Y)" ("objects_it293.html" ("DIMENSIONS" . 1092195) ("ORDER" . 1247287) ("SUB_HIT" . 1092197) ("UNITS" . 1092202)))
-    ("GetEventMask" fun "IDLitWindow" (system) "Result = Obj->[%s::]%s()" ("objects_it294.html" ("BUTTON_EVENTS" . 1092316) ("KEYBOARD_EVENTS" . 1092318) ("MOTION_EVENTS" . 1092320) ("TRACKING_EVENTS" . 1092322)))
-    ("GetSelectedItems" fun "IDLitWindow" (system) "Result = Obj->[%s::]%s()" ("objects_it296.html" ("ALL" . 1247360) ("COUNT" . 1154724)))
-    ("Init" fun "IDLitWindow" (system) "Result = Obj->[%s::]%s()" ("objects_it297.html" ))
-    ("Cleanup" pro "IDLitWriter" (system) "Obj->[%s::]%s" ("objects_it313.html"))
-    ("GetProperty" pro "IDLitWriter" (system) "Obj->[%s::]%s" ("objects_it316.html" ) ("objects_it312.html" ("TYPES" . 1394697)))
-    ("SetFilename" pro "IDLitWriter" (system) "Obj->[%s::]%s, Filename" ("objects_it320.html"))
-    ("SetProperty" pro "IDLitWriter" (system) "Obj->[%s::]%s" ("objects_it321.html" ))
-    ("GetFileExtensions" fun "IDLitWriter" (system) "Result = Obj->[%s::]%s()" ("objects_it314.html" ("COUNT" . 1093562)))
-    ("GetFilename" fun "IDLitWriter" (system) "Result = Obj->[%s::]%s()" ("objects_it315.html"))
-    ("Init" fun "IDLitWriter" (system) "Result = Obj->[%s::]%s(, Extensions)" ("objects_it317.html" ) ("objects_it312.html" ("TYPES" . 1394697)))
-    ("IsA" fun "IDLitWriter" (system) "Result = Obj->[%s::]%s(Filename)" ("objects_it318.html"))
-    ("SetData" fun "IDLitWriter" (system) "Result = Obj->[%s::]%s(Data)" ("objects_it319.html"))
-    ("GetProperty" pro "IDLjavaObject" (system) "Obj->[%s::]%s" ("objects_misc30.html" ))
-    ("SetProperty" pro "IDLjavaObject" (system) "Obj->[%s::]%s" ("objects_misc32.html" ))
-    ("Init" fun "IDLjavaObject" (system) "Result = Obj -> [%s::]%s(, JavaClassName[, Arg1, ...])" ("objects_misc31.html" ))
-    ("Reset" pro "TrackBall" (system) "Obj->[%s::]%s, Center, Radius" ("objects_misc36.html" ("AXIS" . 1004145) ("CONSTRAIN" . 1004150) ("MOUSE" . 1004152)))
-    ("Init" fun "TrackBall" (system) "Result = Obj->[%s::]%s(, Center, Radius)" ("objects_misc35.html" ("AXIS") ("CONSTRAIN") ("MOUSE")) ("objects_misc34.html" ("AXIS" . 1010189) ("CONSTRAIN" . 1010194) ("MOUSE" . 1010196)))
-    ("Update" fun "TrackBall" (system) "Result = Obj->[%s::]%s( sEvent)" ("objects_misc37.html" ("MOUSE" . 1004192) ("TRANSFORM" . 1004197) ("TRANSLATE" . 1004199)))
-   )
-  "1850 builtin routines with 7685 keywords for IDL version 6.1.")
-
-(defvar idlwave-system-variables-alist
-  '(
-    ("C" (link "sysvars7.html#wp997337"))
-    ("CPU" (tags ("HW_VECTOR") ("VECTOR_ENABLE") ("HW_NCPU") ("TPOOL_NTHREADS") ("TPOOL_MIN_ELTS") ("TPOOL_MAX_ELTS")) (link "sysvars6.html#wp1014201"))
-    ("D" (tags ("NAME" . 997486) ("X_SIZE" . 997529) ("Y_SIZE" . 997529) ("X_VSIZE" . 997534) ("Y_VSIZE" . 997534) ("X_CH_SIZE" . 997518) ("Y_CH_SIZE" . 997518) ("X_PX_CM" . 997524) ("Y_PX_CM" . 997524) ("N_COLORS" . 997482) ("TABLE_SIZE" . 997494) ("FILL_DIST" . 997350) ("WINDOW" . 997514) ("UNIT" . 1008156) ("FLAGS" . 997354) ("ORIGIN" . 997490) ("ZOOM" . 997538)) (link "sysvars7.html#wp997347"))
-    ("DIR" (link "sysvars6.html#wp997072"))
-    ("DLM_PATH" (link "sysvars6.html#wp1004032"))
-    ("DPI" (link "sysvars4.html#wp996942"))
-    ("DTOR" (link "sysvars4.html#wp996946"))
-    ("EDIT_INPUT" (link "sysvars6.html#wp1004047"))
-    ("ERROR_STATE" (tags ("NAME") ("BLOCK") ("CODE") ("SYS_CODE") ("SYS_CODE_TYPE") ("MSG") ("SYS_MSG") ("MSG_PREFIX")) (link "sysvars5.html#wp1003013"))
-    ("EXCEPT" (link "sysvars5.html#wp1002623"))
-    ("HELP_PATH" (link "sysvars6.html#wp1000204"))
-    ("JOURNAL" (link "sysvars6.html#wp997085"))
-    ("MAKE_DLL" (tags ("COMPILE_DIRECTORY") ("COMPILER_NAME") ("CC") ("LD")) (link "sysvars6.html#wp1009307"))
-    ("MAP" (tags ("PROJECTION") ("SIMPLE") ("FILL_METHOD") ("UP_FLAGS") ("UP_NAME") ("P0LON") ("P0LAT") ("U0") ("V0") ("SINO") ("COSO") ("ROTATION") ("SINR") ("COSR") ("A") ("E2") ("UV") ("POLE") ("UV_BOX") ("LL_BOX") ("SEGMENT_LENGTH") ("P") ("PIPELINE")) (link "sysvars4.html#wp996950"))
-    ("MORE" (link "sysvars6.html#wp997090"))
-    ("MOUSE" (tags ("X") ("Y") ("BUTTON") ("TIME")) (link "sysvars5.html#wp1000051"))
-    ("ORDER" (link "sysvars7.html#wp997544"))
-    ("P" (tags ("BACKGROUND" . 997554) ("CHARSIZE" . 997560) ("CHARTHICK" . 997563) ("CLIP" . 997566) ("COLOR" . 997569) ("FONT" . 997572) ("LINESTYLE" . 997575) ("MULTI" . 1004014) ("NOCLIP" . 997613) ("NOERASE" . 997616) ("NSUM" . 997619) ("POSITION" . 1006945) ("PSYM" . 997627) ("REGION" . 997633) ("SUBTITLE" . 997636) ("SYMSIZE") ("T" . 997639) ("T3D" . 997642) ("THICK" . 997645) ("TITLE" . 997648) ("TICKLEN" . 997651) ("CHANNEL" . 997557)) (link "sysvars7.html#wp997551"))
-    ("PATH" (link "sysvars6.html#wp997094"))
-    ("PI" (link "sysvars4.html#wp996954"))
-    ("PROMPT" (link "sysvars6.html#wp997101"))
-    ("QUIET" (link "sysvars6.html#wp997106"))
-    ("RADEG" (link "sysvars4.html#wp996958"))
-    ("VALUES" (tags ("F_INFINITY") ("F_NAN") ("D_INFINITY") ("D_NAN")) (link "sysvars4.html#wp996962"))
-    ("VERSION" (tags ("ARCH") ("OS") ("OS_FAMILY") ("OS_NAME") ("RELEASE") ("BUILD_DATE") ("MEMORY_BITS") ("FILE_OFFSET_BITS")) (link "sysvars6.html#wp997111"))
-    ("WARN" (tags ("OBS_ROUTINES") ("OBS_SYSVARS") ("PARENS")) (link "sysvars5.html#wp1000387"))
-    ("X" (tags ("TITLE" . 997839) ("TYPE" . 997842) ("STYLE" . 997742) ("TICKS" . 999577) ("TICKLEN" . 1012793) ("THICK" . 997798) ("RANGE" . 997713) ("CRANGE" . 997670) ("S" . 997736) ("MARGIN" . 997689) ("OMARGIN" . 997702) ("WINDOW" . 997845) ("REGION" . 997724) ("CHARSIZE" . 1012787) ("MINOR" . 997699) ("TICKV" . 997833) ("TICKNAME" . 997811) ("GRIDSTYLE" . 998134) ("TICKFORMAT" . 997801) ("TICKINTERVAL" . 997808) ("TICKLAYOUT" . 1012924) ("TICKUNITS" . 1012962)) (link "sysvars7.html#wp997657"))
-    ("Y" (tags ("TITLE" . 997839) ("TYPE" . 997842) ("STYLE" . 997742) ("TICKS" . 999577) ("TICKLEN" . 1012793) ("THICK" . 997798) ("RANGE" . 997713) ("CRANGE" . 997670) ("S" . 997736) ("MARGIN" . 997689) ("OMARGIN" . 997702) ("WINDOW" . 997845) ("REGION" . 997724) ("CHARSIZE" . 1012787) ("MINOR" . 997699) ("TICKV" . 997833) ("TICKNAME" . 997811) ("GRIDSTYLE" . 998134) ("TICKFORMAT" . 997801) ("TICKINTERVAL" . 997808) ("TICKLAYOUT" . 1012924) ("TICKUNITS" . 1012962)) (link "sysvars7.html#wp997657"))
-    ("Z" (tags ("TITLE" . 997839) ("TYPE" . 997842) ("STYLE" . 997742) ("TICKS" . 999577) ("TICKLEN" . 1012793) ("THICK" . 997798) ("RANGE" . 997713) ("CRANGE" . 997670) ("S" . 997736) ("MARGIN" . 997689) ("OMARGIN" . 997702) ("WINDOW" . 997845) ("REGION" . 997724) ("CHARSIZE" . 1012787) ("MINOR" . 997699) ("TICKV" . 997833) ("TICKNAME" . 997811) ("GRIDSTYLE" . 998134) ("TICKFORMAT" . 997801) ("TICKINTERVAL" . 997808) ("TICKLAYOUT" . 1012924) ("TICKUNITS" . 1012962)) (link "sysvars7.html#wp997657"))))
-
-
-(defvar idlwave-system-class-info
-  '(
-    ("IDLgrContour" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRCONTOUR_TOP" "IDLGRCONTOURVERSION" "AM_PM" "ANISOTROPY" "DATA_FORMAT" "DATA" "DAYS_OF_WEEK" "GEOM_FORMAT" "GEOM" "CONTOURFLAGS" "C_COLOR" "C_FILLPATTERN" "C_LABEL_INTERVAL" "C_LABEL_NOGAPS" "C_LABEL_OBJECTS" "C_LABEL_SHOW" "C_LINESTYLE" "C_THICK" "C_USE_LABEL_COLOR" "C_USE_LABEL_ORIENTATION" "C_VALUE" "LABEL_DEFAULTS" "LABEL_FONT" "LABEL_FORMAT" "LABEL_FRMTDATA" "LABEL_UNITS" "LABEL_UNIT_CODE" "MAXVAL" "MINVAL" "MONTHS" "NLEVELS" "POLYGONS" "SHADERANGE" "SHADING" "TICKINTERVAL" "TICKLEN" "PRECISIONDATA" "PRECISIONGEOM" "PRECISIONGRAPH" "LEVELINFO" "CFILL1" "DEPTHOFFSET" "MAPINFO" "IDLGRCONTOUR_BOTTOM") (inherits "IDLitComponent") (link "objects_gr43.html"))
-    ("IDLgrAxis" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRAXIS_TOP" "IDLGRAXISVERSION" "AM_PM" "AXIS_TYPE" "CALCFLAGS" "DAYS_OF_WEEK" "DIRECTION" "AXISFLAGS" "GRIDSTYLE" "LOCATION" "MAJOR" "MINOR" "MONTHS" "OUTRANGE" "RANGE" "SUBTICKLEN" "TEXTALIGNMENTS" "TEXTBASELINE" "TEXTUPDIR" "THICK" "TICKDIR" "TICKFORMAT" "ARRAY_TICKFORMAT" "TICKFRMTDATA" "TICKINTERVAL" "TICKLAYOUT" "TICKLEN" "TICKTEXT" "TICKUNITCODES" "TICKUNITS" "TICKVALUES" "TITLE" "CURRENT_LEVEL" "LEVEL_DATA" "STEPRANGEUNITS" "STEPRANGE" "IDLGRAXIS_BOTTOM") (inherits "IDLitComponent") (link "objects_gr3.html"))
-    ("IDLitWindow" (tags "IDLITWINDOW_TOP" "IDLITWINDOWFLAGS" "EVENTMASK" "EVENTNOTIFIER" "SCENE" "PEVENTS" "IDLITWIN_FILL1" "PEVENTTAIL" "IDLITWIN_FILL2" "IDLITWINDOW_BOTTOM") (inherits "IDLgrWindow") (link "objects_it287.html"))
-    ("IDLitVisualization" (tags "_BISMESSAGER" "_CLASSNAME" "_OCHILDREN" "_OPROPINTERSECTION" "_OAGGCHILDREN" "__$$__" "GEOMREFCOUNT" "CENTERROTATION" "IHAVECENTERROTATION" "IMPACTSRANGE" "ISSELECTED" "IS3D" "DIMMETHOD" "ISOTROPIC" "ISMANIPULATORTARGET" "_SELECTIONPAD" "OGROUPPARENT" "OCURRSELECTIONVISUAL" "_CREATEDDURINGINIT" "_OSELECTIONVISUAL" "_PSTRTYPE" "AXESREQUEST" "AXESMETHOD" "AXESSTYLEREQUEST" "DOREQUESTAXESSTYLE" "_BISDELETED") (inherits "IDLgrModel" "IDLitParameter" "IDLitIMessaging") (link "objects_it237.html"))
-    ("IDLitManipulatorVisual" (tags "_BISMESSAGER" "_CLASSNAME" "_OCHILDREN" "_OPROPINTERSECTION" "_OAGGCHILDREN" "__$$__" "GEOMREFCOUNT" "CENTERROTATION" "IHAVECENTERROTATION" "IMPACTSRANGE" "ISSELECTED" "IS3D" "DIMMETHOD" "ISOTROPIC" "ISMANIPULATORTARGET" "_SELECTIONPAD" "OGROUPPARENT" "OCURRSELECTIONVISUAL" "_CREATEDDURINGINIT" "_OSELECTIONVISUAL" "_PSTRTYPE" "AXESREQUEST" "AXESMETHOD" "AXESSTYLEREQUEST" "DOREQUESTAXESSTYLE" "_STRVISUALTYPE" "_UNIFORMSCALE") (inherits "IDLgrModel" "IDLitIMessaging") (link "objects_it128.html"))
-    ("IDLgrSurface" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRSURFACE_TOP" "IDLGRSURFACEVERSION" "DATA" "PRECISION" "SKIRT" "VERTCOLORS" "BTMCOLOR" "AMBIENT" "DIFFUSE" "SPECULAR" "EMISSION" "SHININESS" "SURFACEFLAGS" "LINESTYLE" "MAXVALUE" "MINVALUE" "SHADING" "SHADERANGE" "STYLE" "NORMALS" "TXTRCOORD" "TXTRMAP" "TXTRHIGHRES" "THICK" "DEPTHOFFSET" "IDLGRSURFACE_BOTTOM") (inherits "IDLitComponent") (link "objects_gr173.html"))
-    ("IDLgrLegend" (tags "OSCALENODE" "BORDER_GAP" "COLUMNS" "OOUTLINE" "OFILL" "OFONT" "GAP" "GLYPHWIDTH" "PITEM_COLOR" "PITEM_LINESTYLE" "PITEM_NAME" "PITEM_OBJECT" "PITEM_THICK" "PITEM_TYPE" "OTITLE" "PTEXT_COLOR" "BRECOMPUTE" "PGLYPHS" "PTEXTS" "HGLYPHWIDTH" "VGLYPHWIDTH" "COLORMODE" "CLEANLEAVE" "CLEANGLYPHS" "IDLGRLEGENDVERSION") (inherits "IDLgrModel") (link "objects_gr65.html"))
-    ("IDLgrPolygon" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRPOLYGON_TOP" "IDLGRPOLYGONVERSION" "DATA" "PRECISION" "FILLPATTERN" "POLYGONS" "NORMALS" "POLYGONFLAGS" "SHADING" "SHADERANGE" "STYLE" "TXTRCOORD" "TXTRMAP" "VERTCOLORS" "BTMCOLOR" "AMBIENT" "DIFFUSE" "SPECULAR" "EMISSION" "SHININESS" "LINESTYLE" "THICK" "DEPTHOFFSET" "IDLGRPOLYGON_BOTTOM") (inherits "IDLitComponent") (link "objects_gr124.html"))
-    ("IDLgrWindow" (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRWINDOW_TOP" "IDLGRWINDOWVERSION" "WINDOWFLAGS" "CURRENT_ZOOM" "DIMENSIONS" "DISPLAYNAME" "INDEX" "LOCATION" "MINIMUM_VIRTUAL_DIMENSIONS" "ORIGINAL_VIRTUAL_DIMENSIONS" "RENDERER" "RETAIN" "SCREENDIMENSIONS" "SELF" "TITLE" "UNITS" "VIRTUAL_DIMENSIONS" "VISIBLE_LOCATION" "ZOOM_BASE" "ZOOM_NSTEP" "EXTERNAL_WINDOW" "NEXT" "WFILL1" "PARENT" "WFILL2" "IDLGRWINDOW_BOTTOM") (inherits "IDLitComponent") (link "objects_gr235.html"))
-    ("IDLgrPolyline" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRPOLYLINE_TOP" "IDLGRPOLYLINEVERSION" "POLYLINEFLAGS" "DATA" "PRECISION" "LABEL_NOGAPS" "LABEL_OBJECTS" "LABEL_OFFSETS" "LABEL_POLYLINES" "LINESTYLE" "POLYLINES" "SYMBOL" "PSYMBOL" "THICK" "SHADING" "USE_LABEL_COLOR" "USE_LABEL_ORIENTATION" "VERTCOLORS" "LABEL_INFO" "FILL1" "IDLGRPOLYLINE_BOTTOM") (inherits "IDLitComponent") (link "objects_gr131.html"))
-    ("IDLgrROI" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRROI_TOP" "IDLGRROIVERSION" "LINESTYLE" "STYLE" "SYMBOL" "THICK" "IDLGRROI_BOTTOM") (inherits "IDLanROI" "IDLitComponent") (link "objects_gr150.html"))
-    ("IDLitManipulatorManager" (tags "_OOLDCURR" "_ODEFAULT" "_OWINCURR" "_CURROBS") (inherits "IDLitManipulatorContainer") (link "objects_it121.html"))
-    ("IDLgrVolume" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRVOLUME_TOP" "IDLGRVOLUMEVERSION" "AMBIENT" "BOUNDS" "LIMITS" "DIMENSIONS" "COLORTABLE" "COMPOSITEFUNC" "CUTPLANES" "NUMCUTPLANES" "DEPTH_CUE" "OPACITYTABLE" "RENDERSTEP" "DATA" "EDM_VOLUME" "VOLUMEFLAGS" "IDLGRVOLUME_BOTTOM") (inherits "IDLitComponent") (link "objects_gr216.html"))
-    ("IDLgrPlot" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRPLOT_TOP" "IDLGRPLOTVERSION" "DATA" "PLOTFLAGS" "LINESTYLE" "PRECISION" "MAXVAL" "MINVAL" "NSUM" "SYMBOL" "PSYMBOL" "THICK" "VERTCOLORS" "ZVALUE" "LINEDATA" "PFILL1" "IDLGRPLOT_BOTTOM") (inherits "IDLitComponent") (link "objects_gr117.html"))
-    ("IDLgrROIGroup" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRROIGROUP_TOP" "IDLGRROIGROUPVERSION" "IDLGRROIGROUP_BOTTOM") (inherits "IDLanROIGroup" "IDLitComponent") (link "objects_gr157.html"))
-    ("IDLgrText" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRTEXT_TOP" "IDLGRTEXTVERSION" "TEXTFLAGS" "ALIGNMENT" "BASELINE" "CHAR_DIMENSIONS" "RECOMP_CTM" "FONT" "LOCATIONS" "STRINGS" "SUBPARENT" "UPDIR" "VERTICAL_ALIGNMENT" "FILL_COLOR" "RENDER_MODE" "IDLGRTEXT_BOTTOM") (inherits "IDLitComponent") (link "objects_gr193.html"))
-    ("IDLitManipulatorContainer" (tags "_BISMESSAGER" "_CLASSNAME" "_OCHILDREN" "M_BAUTOSWITCH" "M_CURRMANIP") (inherits "IDLitManipulator" "IDL_Container") (link "objects_it107.html"))
-    ("IDLgrColorbar" (tags "OCOORDCONVNODE" "OSCALENODE" "MAXDIM" "DIMENSIONS" "OAXIS" "OPOLY" "OSURF" "OIMAGE" "OPALETTE" "FREE_PALETTE" "SHOW_AXIS" "IDLGRCOLORBARVERSION") (inherits "IDLgrModel") (link "objects_gr36.html"))
-    ("IDLitTool" (tags "__VOID" "_STRTOOLNAME" "_STRFILENAME" "_IDCURRENT" "_STRVERSION" "_STRWORKINGDIRECTORY" "_OSYSTEM" "_MANIPULATORS" "_OUISERVICECONN" "_OUICONNECTION" "_OWINDOW" "_COMMANDBUFFER" "_OLASTERROR" "_PDISPATCHTABLE" "_TYPES" "_STATUSBAR" "_IBUFFERLOCATION" "_IDISABLEUPDATES" "_NSELCHANGE" "_CURRSTATUSSEGMENTID" "_BNOREDRAW" "_BDIRTY" "_NOSAVEPROMPT" "_BUPDATEBYTYPE" "_BCHANGEDIRECTORY") (inherits "IDLitContainer" "IDLitIMessaging") (link "objects_it180.html"))
-    ("IDLgrImage" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRIMAGE_TOP" "IDLGRIMAGEVERSION" "CHANNEL" "DATA" "DIMENSIONS" "SUB_RECT" "IMAGEFLAGS" "LOCATION" "INTERLEAVE" "INTERPOLATE" "BLEND_FUNCTIONS" "IDLGRIMAGE_BOTTOM") (inherits "IDLitComponent") (link "objects_gr58.html"))
-    ("IDLgrLight" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRLIGHT_TOP" "IDLGRLIGHTVERSION" "ATTENUATION" "CONEANGLE" "DIRECTION" "FOCUS" "INTENSITY" "LOCATION" "TYPE" "IDLGRLIGHT_BOTTOM") (inherits "IDLitComponent") (link "objects_gr72.html"))
-    ("IDLgrView" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRCONTAINER_TOP" "IDLGRCONTAINERVERSION" "ISDYING" "IDLGRCONTAINER_BOTTOM" "IDLGRVIEW_TOP" "IDLGRVIEWVERSION" "VIEWFLAGS" "COLOR" "DEPTH_CUE" "DIMENSIONS" "PRECISION" "EYE" "LOCATION" "OBLIQUE" "PROJECTION" "TRANSPARENT" "UNITS" "VIEW" "ZCLIP" "IDLGRVIEW_BOTTOM") (inherits "IDLitComponent" "IDL_Container") (link "objects_gr200.html"))
-    ("IDLgrVRML" (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRVRML_TOP" "IDLGRVRMLVERSION" "UNITS" "DIMENSIONS" "FILENAME" "WORLDINFO" "WORLDTITLE" "IDLGRVRML_BOTTOM") (inherits "IDLitComponent") (link "objects_gr225.html"))
-    ("IDLgrClipboard" (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRCLIPBOARD_TOP" "IDLGRCLIPBOARDVERSION" "UNITS" "DIMENSIONS" "FILENAME" "VECTOR" "POSTSCRIPT" "IDLGRCLIPBOARD_BOTTOM") (inherits "IDLitComponent") (link "objects_gr25.html"))
-    ("IDLgrPrinter" (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRPRINTER_TOP" "IDLGRPRINTERVERSION" "PRINTERFLAGS" "NCOPIES" "UNITS" "GAMMA" "IDLGRPRINTER_BOTTOM") (inherits "IDLitComponent") (link "objects_gr138.html"))
-    ("IDLitManipulator" (tags "PSELECTIONLIST" "NSELECTIONLIST" "BUTTONPRESS" "_OCMDSET" "_TYPES" "_OHITVIS" "_OHITVIEWGROUP" "_PSUBHITLIST" "_STRVISUALTYPE" "_IDOPERATION" "_IDPARAMETER" "_DEFAULTCURSOR" "_SUBTYPE" "_STRTMPMSG" "_SKIPMACROHISTORY" "_TRANSMOTION" "_INTRANSMOTION" "_TRANSIENT" "_KEYTRANSIENT" "_DISABLE" "_VIEWMODE" "_UIEVENTMASK" "_OLDQUALITY" "_DRAQQUAL" "_NORMALIZEDZ") (inherits "IDLitComponent" "IDLitIMessaging") (link "objects_it91.html"))
-    ("IDLgrModel" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRCONTAINER_TOP" "IDLGRCONTAINERVERSION" "ISDYING" "IDLGRCONTAINER_BOTTOM" "IDLGRMODEL_TOP" "IDLGRMODELVERSION" "MODELFLAGS" "CLIP_PLANES" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "TRANSFORM" "IDLGRMODEL_BOTTOM") (inherits "IDLitComponent" "IDL_Container") (link "objects_gr79.html"))
-    ("IDLgrBuffer" (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRBUFFER_TOP" "IDLGRBUFFERVERSION" "UNITS" "DIMENSIONS" "IDLGRBUFFER_BOTTOM") (inherits "IDLitComponent") (link "objects_gr10.html"))
-    ("IDLitParameterSet" (tags "_PNAMES") (inherits "IDLitDataContainer") (link "objects_it159.html"))
-    ("IDLitDataContainer" (tags "_ONOTIFIER" "_PDATA" "_PMETADATA" "_TYPE" "_AUTODELETE" "_NREF" "_PDESTRUCT" "_HIDE" "_READ_ONLY" "_IDISABLE" "_IUPDATES" "_BINSEARCH") (inherits "IDLitContainer") (link "objects_it59.html"))
-    ("IDLgrScene" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRCONTAINER_TOP" "IDLGRCONTAINERVERSION" "ISDYING" "IDLGRCONTAINER_BOTTOM" "IDLGRSCENE_TOP" "IDLGRSCENEVERSION" "COLOR" "TRANSPARENT" "IDLGRSCENE_BOTTOM") (inherits "IDLitComponent" "IDL_Container") (link "objects_gr165.html"))
-    ("IDLgrViewgroup" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRCONTAINER_TOP" "IDLGRCONTAINERVERSION" "ISDYING" "IDLGRCONTAINER_BOTTOM" "IDLGRVIEWGROUP_TOP" "IDLGRVIEWGROUPVERSION" "IDLGRVIEWGROUP_BOTTOM") (inherits "IDLitComponent" "IDL_Container") (link "objects_gr208.html"))
-    ("IDLitUI" (tags "_MENUBARS" "_TOOLBARS" "_STATUSBAR" "_UISERVICES" "_PDISPATCHSUBJECT" "_PDISPATCHOBSERVER" "_OTOOL" "_IDISPATCH" "_WBASE") (inherits "IDLitContainer") (link "objects_it222.html"))
-    ("IDLitDataOperation" (tags "_NAN" "_WITHINUI" "_RECORDPROPERTIES") (inherits "IDLitOperation") (link "objects_it69.html"))
-    ("IDLgrMPEG" (tags "IDLGRMPEG_TOP" "IDLGRMPEGVERSION" "DIMENSIONS" "FILENAME" "FORMAT" "FRAMERATE" "INTERLACED" "QUALITY" "SCALE" "STATISTICS" "DISPLAYDIMS" "FIRSTFRAME" "LASTFRAME" "MPEGID" "TEMPNODE" "TEMPNODEFILLER" "TEMP_DIRECTORY" "BITRATE" "IFRAME_GAP" "MOTION_LENGTH" "FLAGS" "IDLGRMPEG_BOTTOM") (link "objects_gr93.html"))
-    ("IDLitCommandSet" (inherits "IDLitCommand" "IDL_Container") (link "objects_it12.html"))
-    ("IDLitContainer" (tags "_BISMESSAGER" "_CLASSNAME" "_OCHILDREN") (inherits "IDLitComponent" "IDL_Container") (link "objects_it33.html"))
-    ("IDLitOperation" (tags "_BEXPENSIVE" "_REVERSIBLE" "_BSHOWEXECUTIONUI" "_BSKIPHISTORY" "_BSKIPMACRO" "_BMACROSHOWUIIFNULLCMD" "_BMACROSUPPRESSREFRESH" "_TYPES") (inherits "IDLitComponent" "IDLitIMessaging") (link "objects_it134.html"))
-    ("IDLitData" (tags "_ONOTIFIER" "_PDATA" "_PMETADATA" "_TYPE" "_AUTODELETE" "_NREF" "_PDESTRUCT" "_HIDE" "_READ_ONLY") (inherits "IDLitComponent") (link "objects_it44.html"))
-    ("IDLitWriter" (tags "_TYPES" "_BITDEPTH" "_GRAPHICSFORMAT" "_SCALEFACTOR") (inherits "IDLitReader") (link "objects_it311.html"))
-    ("IDLdbRecordset" (tags "IDLDBRECORDSET_TOP" "IDLDBRECORDSETVERSION" "ISTABLE" "PDBOBJ" "ISREADONLY" "NFIELDS" "CURROW" "SOURCE" "CURSORTYPE" "PFIELDS" "PSDEF" "ROWSTATUS" "ROWSET" "ROWPOS" "HSTMT" "HDBC" "IDLDBRECORDSET_BOTTOM") (link "api14.html"))
-    ("IDLffLangCat" (tags "FILENAMES" "_AVAILABLE_FILES" "LANGUAGE" "DEFAULT_LANGUAGE" "APPLICATIONS" "APPLICATION_PATH" "KEYS" "N_KEYS" "STRINGS" "DEF_KEYS" "N_DEF_KEYS" "DEF_STRINGS" "AVAILABLE_LANGUAGES" "VERBOSE" "STRICT" "IDLFFLANGCATVERSION") (link "objects_ff44.html"))
-    ("IDLitCommand" (tags "_PDATADICTIONARY" "_SIZEITEMS" "_STRIDTARGET" "_STRIDOPERATION") (inherits "IDLitComponent") (link "objects_it3.html"))
-    ("IDLdbDatabase" (tags "IDLDBDATABASE_TOP" "IDLDBDATABASEVERSION" "READONLY" "ISCONNECTED" "FETCHDIR" "POSOPS" "POSSTATEMENTS" "SCROLLCONCUR" "SCROLLOPTIONS" "STATICSENSE" "GETDATAEXT" "USINGCURSOR" "NSTATEMENTS" "P_RECOBJS" "HDBC" "IDLDBDATABASE_BOTTOM") (link "api6.html"))
-    ("IDLitReader" (tags "_STRFILENAME" "_PEXTENSIONS") (inherits "IDLitComponent" "IDLitIMessaging") (link "objects_it169.html"))
-    ("IDLanROI" (tags "IDLANROI_TOP" "IDLANROIVERSION" "IDLANROIFLAGS" "NALLOCVERTS" "NUSEDVERTS" "BLOCKSIZE" "DATA" "TYPE" "PRECISION" "PLANE" "ROI_XRANGE" "ROI_YRANGE" "ROI_ZRANGE" "IDLANROI_BOTTOM") (link "objects_an3.html"))
-    ("IDLanROIGroup" (tags "IDLANROIGROUP_TOP" "IDLANROIGROUPVERSION" "IDLANROIGROUPFLAGS" "ROIGROUP_XRANGE" "ROIGROUP_YRANGE" "ROIGROUP_ZRANGE" "IDLANROIGROUP_BOTTOM") (inherits "IDL_Container") (link "objects_an18.html"))
-    ("IDLffXMLDOMDocument" (tags "IDLFFXMLDOMDOCUMENT_TOP" "_DOM_IMPLEMENTATION" "_DOM_PARSER" "_DOM_ERROR_REPORTER" "_DOM_MEMORY_MANAGER" "IDLFFXMLDOMDOCUMENT_BOTTOM") (inherits "IDLffXMLDOMText") (link "objects_ff102.html"))
-    ("IDLgrPalette" (tags "IDLGRPALETTE_TOP" "IDLGRPALETTE_SERIALNUM" "IDLGRPALETTEVERSION" "GAMMA" "BOTTOMSTRETCH" "TOPSTRETCH" "NENTRIES" "ORIGLUT" "CURRLUT" "INVTABLE" "UVALUE" "NAME" "IDLGRPALETTE_BOTTOM") (link "objects_gr101.html"))
-    ("IDLitComponent" (tags "IDLITCOMPONENT_TOP" "IDLITCOMPONENTVERSION" "DESCRIPTION" "NAME" "ICON" "IDENTIFIER" "HELP" "UVALUE" "_PARENT" "PROPERTYDESCRIPTORS" "_FLAGS" "IDLITCOMPONENT_BOTTOM") (link "objects_it17.html"))
-    ("IDLgrSymbol" (tags "IDLGRSYMBOL_TOP" "IDLGRSYMBOLVERSION" "COLOR" "DATA" "SIZE" "THICK" "FLAGS" "UVALUE" "NAME" "ALPHA_CHANNEL" "IDLGRSYMBOL_BOTTOM") (link "objects_gr180.html"))
-    ("IDLgrFont" (tags "IDLGRFONT_TOP" "IDLGRFONTVERSION" "FONTFLAGS" "HERSHEY" "NAME" "SIZE" "SUBSTITUTE" "THICK" "ID" "UVALUE" "IDLGRFONT_BOTTOM") (link "objects_gr52.html"))
-    ("IDLgrPattern" (tags "IDLGRPATTERN_TOP" "IDLGRPATTERNVERSION" "ORIENTATION" "PATTERN" "SPACING" "STYLE" "THICK" "UVALUE" "NAME" "IDLGRPATTERN_BOTTOM") (link "objects_gr111.html"))
-    ("IDLffDXF" (tags "IDLFFDXF_TOP" "IDLFFDXFVERSION" "DXFREADVALID" "DXFHANDLEVALID" "DXFLUT" "SERIAL" "DXFHANDLE" "DXFHANDLEFILLER" "IDLFFDXF_BOTTOM") (link "objects_ff21.html"))
-    ("IDLffShape" (tags "IDLFFSHAPE_TOP" "IDLFFSHAPEVERSION" "FILENAME" "ISOPEN" "SHPTYPE" "PATTRIBUTE" "SHAPEHANDLE" "DBFHANDLE" "IDLFFSHAPE_BOTTOM") (link "objects_ff59.html"))
-    ("IDLffXMLSAX" (tags "IDLFFXMLSAX_TOP" "IDLFFXMLSAXVERSION" "VALIDATION_MODE" "HALT_PROCESSING" "FILENAME" "_XML_PARSER" "_XML_LOCATOR" "IDLFFXMLSAX_BOTTOM") (link "objects_ff209.html"))
-    ("TrackBall" (tags "BTNDOWN" "AXIS" "CONSTRAIN" "MOUSE" "CENTER" "RADIUS" "PT0" "PT1") (link "objects_misc33.html"))
-    ("IDLgrTessellator" (tags "IDLGRTESSELLATOR_TOP" "IDLGRTESSELLATORVERSION" "ITESSFLAGS" "IVERTS" "HVIDLIST" "IAUXSIZE" "IAUXTYPE" "IDLGRTESSELLATOR_BOTTOM") (link "objects_gr186.html"))
-    ("IDLffDICOM" (tags "IDLFFDICOM_TOP" "IDLFFDICOMVERSION" "DICOMFLAGS" "DICOMELEMENTS" "DICOMPREAMBLE" "DICOMHANDLE" "DICOMHANDLEFILLER" "IDLFFDICOM_BOTTOM") (link "objects_ff3.html"))
-    ("IDLffXMLDOMText" (inherits "IDLffXMLDOMProcessingInstruction") (link "objects_ff203.html"))
-    ("IDLffXMLDOMProcessingInstruction" (inherits "IDLffXMLDOMAttr") (link "objects_ff196.html"))
-    ("IDLffXMLDOMAttr" (inherits "IDLffXMLDOMElement") (link "objects_ff74.html"))
-    ("IDLffXMLDOMElement" (inherits "IDLffXMLDOMNode") (link "objects_ff130.html"))
-    ("IDLffXMLDOMNamedNodeMap" (tags "IDLFFXMLDOMNAMEDNODEMAP_TOP" "IDLFFXMLDOMNAMEDNODEMAPVERSION" "_IDLFFXMLDOMNAMEDNODEMAPNODE" "_IDLFFXMLDOMNAMEDNODEMAPOWNEDNODES" "_IDLFFXMLDOMNAMEDNODEMAPOWNER" "_IDLFFXMLDOMNAMEDNODEMAPDOCUMENT" "IDLFFXMLDOMNAMEDNODEMAP_BOTTOM") (link "objects_ff153.html"))
-    ("IDLffXMLDOMNode" (inherits "IDLffXMLDOMNotation") (link "objects_ff162.html"))
-    ("IDLffXMLDOMNotation" (inherits "IDLffXMLDOMCharacterData") (link "objects_ff190.html"))
-    ("IDLffXMLDOMNodeList" (tags "IDLFFXMLDOMNODELIST_TOP" "IDLFFXMLDOMNODELISTVERSION" "_IDLFFXMLDOMNODELISTNODE" "_IDLFFXMLDOMNODELISTOWNEDNODES" "_IDLFFXMLDOMNODELISTOWNER" "_IDLFFXMLDOMNODELISTDOCUMENT" "IDLFFXMLDOMNODELIST_BOTTOM") (link "objects_ff184.html"))
-    ("IDLffXMLDOMCharacterData" (inherits "IDLffXMLDOMEntity") (link "objects_ff86.html"))
-    ("IDLffXMLDOMEntity" (inherits "IDLffXMLDOMDocumentType") (link "objects_ff142.html"))
-    ("IDLffXMLDOMDocumentType" (tags "IDLFFXMLDOMNODE_TOP" "IDLFFXMLDOMNODEVERSION" "_IDLFFXMLDOMNODEDOMNODE" "_IDLFFXMLDOMNODEOWNEDNODES" "_IDLFFXMLDOMNODEOWNER" "_IDLFFXMLDOMNODEDOCUMENT" "IDLFFXMLDOMNODE_BOTTOM") (link "objects_ff123.html"))
-    ("IDL_Container" (tags "IDL_CONTAINER_TOP" "IDLCONTAINERVERSION" "PHEAD" "PTAIL" "NLIST" "IDL_CONTAINER_BOTTOM") (link "objects_misc3.html"))
-    ("IDLffJPEG2000" (tags "IDLFFJPEG2000_TOP" "CJPEG2000PTR" "IDLFFJPEG2000_BOTTOM") (link "objects_ff34.html"))
-    ("IDLitParameter" (tags "_OPARAMETERDESCRIPTORS" "_OPARAMETERSET" "_PPARAMNAMES") (link "objects_it145.html"))
-    ("IDL_Savefile" (tags "IDL_SAVEFILE_FILENAME" "IDL_SAVEFILE_RELAXED_STRUCTURE_ASSIGNMENT") (link "objects_misc13.html"))
-    ("IDLitIMessaging" (tags "__OTOOL") (link "objects_it78.html"))
-    ("IDLcomIDispatch" (link "objects_misc23.html"))
-    ("IDLffMrSID" (link "objects_ff52.html"))
-    ("IDLjavaObject" (link "objects_misc28.html"))))
-
-
-(defvar idlwave-executive-commands-alist '(
-    ("RESET_SESSION" . "symbols8.html")
-    ("TRACE" . "symbols15.html")
-    ("RNEW" . "symbols10.html")
-    ("EDIT" . "symbols4.html")
-    ("STEPOVER" . "symbols14.html")
-    ("OUT" . "symbols7.html")
-    ("RUN" . "symbols11.html")
-    ("CONTINUE" . "symbols3.html")
-    ("STEP" . "symbols13.html")
-    ("RETURN" . "symbols9.html")
-    ("GO" . "symbols6.html")
-    ("SKIP" . "symbols12.html")
-    ("FULL_RESET_SESSION" . "symbols5.html")
-    ("COMPILE" . "symbols2.html")
-))
-
-;; Special words with associated help topic files
-(defconst idlwave-help-special-topic-words
-  '(
-    ("begin" . "B2.html")
-    ("case" . "C8.html")
-    ("endcase" . "C8.html")
-    ("of" . "C8.html")
-    ("common" . "C29.html")
-    ("compile_opt" . "C30.html")
-    ("continue" . "C39.html")
-    ("endfor" . "F31.html")
-    ("for" . "F31.html")
-    ("else" . "I6.html")
-    ("endelse" . "I6.html")
-    ("endif" . "I6.html")
-    ("if" . "I6.html")
-    ("then" . "I6.html")
-    ("end" . "P28.html")
-    ("pro" . "P28.html")
-    ("endrep" . "R41.html")
-    ("repeat" . "R41.html")
-    ("until" . "R41.html")
-    ("return" . "R48.html")
-    ("endswitch" . "S82.html")
-    ("switch" . "S82.html")
-    ("do" . "W8.html")
-    ("endwhile" . "W8.html")
-    ("while" . "W8.html")
-)
-  "Association list of help files for special context words.")
-
-(provide 'idlw-rinfo)
-(provide 'idlwave-rinfo)
-
-;; arch-tag: d0b65da3-7f5e-4992-b8dd-885800b5cd6b
-;;; idlw-rinfo.el ends here
--- a/lisp/progmodes/idlw-shell.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/progmodes/idlw-shell.el	Sun Apr 09 00:38:22 2006 +0000
@@ -1,12 +1,12 @@
 ;; idlw-shell.el --- run IDL as an inferior process of Emacs.
 ;; Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-;; Free Software Foundation, Inc.
+;;    Free Software Foundation
 
 ;; Authors: J.D. Smith <jdsmith@as.arizona.edu>
 ;;          Carsten Dominik <dominik@astro.uva.nl>
 ;;          Chris Chase <chase@att.com>
 ;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
-;; Version: 5.7_22
+;; Version: 6.0_em22
 ;; Keywords: processes
 
 ;; This file is part of GNU Emacs.
@@ -138,6 +138,11 @@
 
 ;; (defcustom idlwave-shell-automatic-start...)  See idlwave.el
 
+(defcustom idlwave-shell-use-dedicated-window nil
+  "*Non-nil means, never replace the shell frame with another buffer."
+  :group 'idlwave-shell-general-setup
+  :type 'boolean) 
+
 (defcustom idlwave-shell-use-dedicated-frame nil
   "*Non-nil means, IDLWAVE should use a special frame to display shell buffer."
   :group 'idlwave-shell-general-setup
@@ -313,8 +318,15 @@
 	       (const :tag "All debug and stepping commands" 	   debug)
 	       (const :tag "Close, window, retall, etc. commands"  misc))))
 
+(defcustom idlwave-shell-max-print-length 200
+  "Maximum number of array elements to print when examining."
+  :group 'idlwave-shell-command-setup
+  :type 'integer)
+
 (defcustom idlwave-shell-examine-alist 
-  '(("Print"          	. "print,___")
+  `(("Print"          	. ,(concat "idlwave_print_safe,___," 
+				   (number-to-string 
+				    idlwave-shell-max-print-length)))
     ("Help"           	. "help,___")
     ("Structure Help"  	. "help,___,/STRUCTURE")
     ("Dimensions"     	. "print,size(___,/DIMENSIONS)")
@@ -322,6 +334,7 @@
     ("N_Elements"     	. "print,n_elements(___)")
     ("All Size Info"  	. "help,(__IWsz__=size(___,/STRUCTURE)),/STRUCTURE & print,__IWsz__.DIMENSIONS")
     ("Ptr Valid"      	. "print,ptr_valid(___)")
+    ("Arg Present"      . "print,arg_present(___)")
     ("Widget Valid"     . "print,widget_info(___,/VALID)")
     ("Widget Geometry"  . "help,widget_info(___,/GEOMETRY)"))
   "Alist of special examine commands for popup selection.  
@@ -437,6 +450,11 @@
   :group 'idlwave-shell-command-setup
   :type 'boolean)
 
+(defcustom idlwave-shell-reset-no-prompt nil
+  "If non-nil, skip the yes/no prompt when resetting the IDL session."
+  :group 'idlwave-shell-command-setup
+  :type 'boolean)
+
 ;; Breakpoint Overlays etc
 (defgroup idlwave-shell-highlighting-and-faces nil
   "Highlighting and Faces used by the IDLWAVE Shell mode."
@@ -488,11 +506,11 @@
 
 (defcustom idlwave-shell-electric-stop-line-face 
   (prog1
-      (copy-face 'modeline 'idlwave-shell-electric-stop-line-face)
-    (set-face-background 'idlwave-shell-electric-stop-line-face 
+      (copy-face 'modeline 'idlwave-shell-electric-stop-line)
+    (set-face-background 'idlwave-shell-electric-stop-line 
 			 idlwave-shell-electric-stop-color)
     (condition-case nil
-	(set-face-foreground 'idlwave-shell-electric-stop-line-face nil)
+	(set-face-foreground 'idlwave-shell-electric-stop-line nil)
       (error nil)))
   "*The face for `idlwave-shell-stop-line-overlay' when in electric debug mode.
 Allows you to choose the font, color and other properties for the line
@@ -553,6 +571,7 @@
     "Face for highlighting lines with breakpoints."
     :group 'idlwave-shell-highlighting-and-faces))
 
+
 (defcustom idlwave-shell-expression-face 'secondary-selection
   "*The face for `idlwave-shell-expression-overlay'.
 Allows you to choose the font, color and other properties for
@@ -652,7 +671,7 @@
   "The overlay for where IDL is currently stopped.")
 (defvar idlwave-shell-is-stopped nil)
 (defvar idlwave-shell-expression-overlay nil
-  "The overlay for where IDL is currently stopped.")
+  "The overlay for the examined expression.")
 (defvar idlwave-shell-output-overlay nil
   "The overlay for the last IDL output.")
 
@@ -700,10 +719,21 @@
 (setq idlwave-shell-expression-overlay (make-overlay 1 1))
 (overlay-put idlwave-shell-expression-overlay
 	     'face idlwave-shell-expression-face)
+(overlay-put idlwave-shell-expression-overlay
+	     'priority 1)
 (setq idlwave-shell-output-overlay (make-overlay 1 1))
 (overlay-put idlwave-shell-output-overlay
 	     'face idlwave-shell-output-face)
 
+(copy-face idlwave-shell-stop-line-face 
+	   'idlwave-shell-pending-stop)
+(copy-face idlwave-shell-electric-stop-line-face 
+	   'idlwave-shell-pending-electric-stop)
+(set-face-background 'idlwave-shell-pending-stop "gray70")
+(set-face-background 'idlwave-shell-pending-electric-stop "gray70")
+
+
+
 (defvar idlwave-shell-bp-query "help,/breakpoints"
   "Command to obtain list of breakpoints")
 
@@ -823,6 +853,7 @@
   ?          Help on expression near point or in region ([C-u ?]).
   x          Examine expression near point or in region ([C-u x]) with 
              letter completion of the examine type.
+  e          Prompt for an expression to print.
 
  Miscellaneous:
   q   	     Quit - end debugging session and return to the Shell's main level.
@@ -998,6 +1029,8 @@
   (setq idlwave-shell-default-directory default-directory)
   (setq idlwave-shell-hide-output nil)
 
+  ;; NB: `make-local-hook' needed for older/alternative Emacs compatibility
+  ;; (make-local-hook 'kill-buffer-hook)
   (add-hook 'kill-buffer-hook 'idlwave-shell-kill-shell-buffer-confirm
 	    nil 'local)
   (add-hook 'kill-buffer-hook 'idlwave-shell-delete-temp-files nil 'local)
@@ -1040,6 +1073,8 @@
   (set (make-local-variable 'comment-start) ";")
   (setq abbrev-mode t)
 
+  ;; NB: `make-local-hook' needed for older/alternative Emacs compatibility
+  ;; make-local-hook 'post-command-hook)
   (add-hook 'post-command-hook 'idlwave-command-hook nil t)
 
   ;; Read the command history?
@@ -1061,23 +1096,25 @@
   (idlwave-shell-send-command 
    (format "defsysv,'!idlwave_version','%s',1" idlwave-mode-version)
    nil 'hide)
-  ;; Get the paths if they weren't read in from file
-  (if (and (not idlwave-path-alist)
-	   (or (not (stringp idlwave-system-directory))
-	       (eq (length idlwave-system-directory) 0)))
-      (idlwave-shell-send-command idlwave-shell-path-query
-				  'idlwave-shell-get-path-info
-				  'hide)))
-
+  ;; Read the paths, and save if they changed
+  (idlwave-shell-send-command idlwave-shell-path-query
+			      'idlwave-shell-get-path-info
+			      'hide))
+
+(defvar idlwave-system-directory)
 (defun idlwave-shell-get-path-info (&optional no-write)
   "Get the path lists, writing to file unless NO-WRITE is set."
   (let* ((rpl (idlwave-shell-path-filter))
 	 (sysdir (car rpl))
 	 (dirs (cdr rpl))
-	 (old-path-alist idlwave-path-alist))
+	 (old-path-alist idlwave-path-alist)
+	 (old-sys-dir idlwave-system-directory)
+	 path-changed sysdir-changed)
     (when sysdir
       (setq idlwave-system-directory sysdir)
-      (put 'idlwave-system-directory 'from-shell t))
+      (if (setq sysdir-changed 
+		(not (string= idlwave-system-directory old-sys-dir)))
+	  (put 'idlwave-system-directory 'from-shell t)))
     ;; Preserve any existing flags
     (setq idlwave-path-alist 
 	  (mapcar (lambda (x)
@@ -1086,11 +1123,13 @@
 			  (cons x (cdr old-entry))
 			(list x))))
 		  dirs))
-    (put 'idlwave-path-alist 'from-shell t)
+    (if (setq path-changed (not (equal idlwave-path-alist old-path-alist)))
+	(put 'idlwave-path-alist 'from-shell t))
     (if idlwave-path-alist 
-	(if (and idlwave-auto-write-paths
-		 (not idlwave-library-path)
-		 (not no-write) )
+	(if (and (not no-write)
+		 idlwave-auto-write-paths
+		 (or sysdir-changed path-changed)
+		 (not idlwave-library-path))
 	    (idlwave-write-paths))
       ;; Fall back
       (setq idlwave-path-alist old-path-alist))))
@@ -1199,12 +1238,14 @@
 	  (current-window (selected-window)))
       (select-window window)
       (goto-char (point-max))
+      (if idlwave-shell-use-dedicated-window
+	  (set-window-dedicated-p window t))
       (select-window current-window)
       (if idlwave-shell-ready
 	  (raise-frame (window-frame window)))
       (if (eq (selected-frame) (window-frame window))
 	  (select-window window))))
-  ;; Save the paths at the end
+  ;; Save the paths at the end, if they are from the Shell and new.
   (add-hook 'idlwave-shell-sentinel-hook 
 	    (lambda ()
 	      (if (and 
@@ -1518,10 +1559,10 @@
 	    
 	    
 ;;; Test/Debug code
-;	      (save-excursion (set-buffer
-;			       (get-buffer-create "*idlwave-shell-output*"))
-;			      (goto-char (point-max))
-;			      (insert "\nSTRING===>\n" string "\n<====\n"))
+	      ;(with-current-buffer
+	      ;	  (get-buffer-create "*idlwave-shell-output*")
+	      ;	(goto-char (point-max))
+	      ;	(insert "\nReceived STRING\n===>\n" string "\n<====\n"))
 	    
 	      ;; Check for prompt in current accumulating output
 	      (when (setq idlwave-shell-ready
@@ -1536,14 +1577,14 @@
 		      (re-search-backward idlwave-shell-prompt-pattern nil t)
 		      (goto-char (match-end 0))
 		      (setq idlwave-shell-command-output
-		      (buffer-substring (point-min) (point)))
+		      (buffer-substring-no-properties (point-min) (point)))
 		      (delete-region (point-min) (point)))
 		  (setq idlwave-shell-command-output
 			(with-current-buffer (process-buffer proc)
-			(buffer-substring
+			(buffer-substring-no-properties
 			 (save-excursion
 			   (goto-char (process-mark proc))
-			   (forward-line 0)
+			   (forward-line 0) ; Emacs 21 (beginning-of-line nil)
 			   (point))
 			 comint-last-input-end))))
 
@@ -1570,10 +1611,10 @@
 		  ;; Call the post-command hook
 		  (if (listp idlwave-shell-post-command-hook)
 		      (progn
-					;(message "Calling list")
-					;(prin1 idlwave-shell-post-command-hook)
+			;;(message "Calling list")
+			;;(prin1 idlwave-shell-post-command-hook)
 			(eval idlwave-shell-post-command-hook))
-					;(message "Calling command function")
+		    ;;(message "Calling command function")
 		    (funcall idlwave-shell-post-command-hook))
 
 		  ;; Reset to default state for next command.
@@ -1668,6 +1709,8 @@
 All parts may contain linebreaks surrounded by spaces.  This is important
 in IDL5 which inserts random linebreaks in long module and file names.")
 
+(defvar idlwave-shell-electric-debug-mode) ; defined by easy-mmode
+
 (defun idlwave-shell-scan-for-state ()
   "Scan for state info.  Looks for messages in output from last IDL
 command indicating where IDL has stopped. The types of messages we are
@@ -1688,9 +1731,8 @@
 		     idlwave-shell-command-output)
        (string-match idlwave-shell-other-error
 		     idlwave-shell-command-output))
-      (save-excursion
-	(set-buffer
-	 (get-buffer-create idlwave-shell-error-buffer))
+      (with-current-buffer
+	  (get-buffer-create idlwave-shell-error-buffer)
 	(erase-buffer)
 	(insert idlwave-shell-command-output)
 	(goto-char (point-min))
@@ -1723,8 +1765,10 @@
 	     (substring idlwave-shell-command-output (match-end 0))))
       (setq idlwave-shell-current-state 'halt)
       ;; Don't debug trace messages
-      (idlwave-shell-display-line (idlwave-shell-pc-frame) nil
-				  (if trace 'no-debug)))
+      (idlwave-shell-display-line 
+       (idlwave-shell-pc-frame) nil
+       (if trace 'disable
+	 (if idlwave-shell-electric-debug-mode 'force))))
      
      ;; Fourth Priority: Breakpoints 
      ((string-match idlwave-shell-break-message
@@ -1763,29 +1807,29 @@
 
 
 (defun idlwave-shell-parse-line (string &optional skip-main)
-  "Parse IDL message for the subroutine, file name and line number.
-We need to work hard here to remove the stupid line breaks inserted by
-IDL5.  These line breaks can be right in the middle of procedure
-or file names.
-It is very difficult to come up with a robust solution.  This one seems
-to be pretty good though.  
-
-Here is in what ways it improves over the previous solution:
-
-1. The procedure name can be split and will be restored.
-2. The number can be split.  I have never seen this, but who knows.
-3. We do not require the `.pro' extension for files.
-
-This function can still break when the file name ends on a end line
-and the message line contains an additional line with garbage.  Then
-the first part of that garbage will be added to the file name.
-However, the function checks the existence of the files with and
-without this last part - thus the function only breaks if file name
-plus garbage match an existing regular file.  This is hopefully very
-unlikely.
-
-If optional arg SKIP-MAIN is non-nil, don't parse $MAIN$ routine stop
-statements."
+  "Parse IDL message for the subroutine, file name and line number."
+;We need to work hard here to remove the stupid line breaks inserted by
+;IDL5.  These line breaks can be right in the middle of procedure
+;or file names.
+;It is very difficult to come up with a robust solution.  This one seems
+;to be pretty good though.  
+;
+;Here is in what ways it improves over the previous solution:
+;
+;1. The procedure name can be split and will be restored.
+;2. The number can be split.  I have never seen this, but who knows.
+;3. We do not require the `.pro' extension for files.
+;
+;This function can still break when the file name ends on an end line
+;and the message line contains an additional line with garbage.  Then
+;the first part of that garbage will be added to the file name.
+;However, the function checks the existence of the files with and
+;without this last part - thus the function only breaks if file name
+;plus garbage match an existing regular file.  This is hopefully very
+;unlikely.
+;
+;If optional arg SKIP-MAIN is non-nil, don't parse $MAIN$ routine stop
+;statements.
 
   (let (number procedure file)
     (when (and (not (if skip-main (string-match ":\\s-*\\$MAIN" string)))
@@ -1926,14 +1970,17 @@
 HEAP_GC, /VERBOSE"
   ;; OBJ_DESTROY, OBJ_VALID()  FIXME: should this be added?
   (interactive "P")
-  (message "Resetting IDL")
-  (setq idlwave-shell-calling-stack-index 0)
-  (idlwave-shell-send-command "retall" nil hidden)
-  (idlwave-shell-send-command "widget_control,/reset" nil hidden)
-  (idlwave-shell-send-command "close,/all" nil hidden)
-  ;; (idlwave-shell-send-command "obj_destroy, obj_valid()" nil hidden)
-  (idlwave-shell-send-command "heap_gc,/verbose" nil hidden)
-  (idlwave-shell-display-line nil))
+  (when (or idlwave-shell-reset-no-prompt 
+	    (yes-or-no-p "Really Reset IDL and discard current session? "))
+    (message "Resetting IDL")
+    (setq idlwave-shell-calling-stack-index 0)
+    ;; Give widget exit handlers a chance
+    (idlwave-shell-send-command "retall" nil hidden)
+    (idlwave-shell-send-command "widget_control,/reset" nil hidden)
+    (idlwave-shell-send-command "close,/all" nil hidden)
+    ;; (idlwave-shell-send-command "obj_destroy, obj_valid()" nil hidden)
+    (idlwave-shell-send-command "heap_gc,/verbose" nil hidden)
+    (idlwave-shell-display-line nil)))
 
 (defun idlwave-shell-path-filter ()
   ;; Convert the output of the path query into a list of directories
@@ -1978,9 +2025,6 @@
 	  (message 
 	   "Routine Info warning: No match for END line in \n>>>\n%s\n<<<\n" 
 	   idlwave-shell-command-output)))
-    (if (string-match "\\S-" text)
-	;; Obviously, the pro worked.  Make a note that we have it now.
-	(setq idlwave-idlwave_routine_info-compiled t))
     ;; Match the output lines
     (while (string-match "^IDLWAVE-\\(PRO\\|FUN\\): \\(.*\\)" text start)
       (setq start (match-end 0))
@@ -2208,7 +2252,6 @@
     (looking-at "\\$")))
 
 ;; Debugging Commands ------------------------------------------------------
-(defvar idlwave-shell-electric-debug-mode) ; defined by easy-mmode
 
 (defun idlwave-shell-redisplay (&optional hide)
   "Tries to resync the display with where execution has stopped.
@@ -2259,14 +2302,14 @@
     (setq idlwave-shell-calling-stack-routine 
 	  (nth 2 (nth idlwave-shell-calling-stack-index stack)))
 
-    ;; only edebug if in that mode already
+    ;; force edebug for this frame if we're in that mode already
     (idlwave-shell-display-line 
      (nth idlwave-shell-calling-stack-index stack) nil
-     (unless idlwave-shell-electric-debug-mode 'no-debug)) 
+     (if idlwave-shell-electric-debug-mode 'force))
     (message "%s" (or message 
-		 (format "In routine %s (stack level %d)"
-			 idlwave-shell-calling-stack-routine
-			 (- idlwave-shell-calling-stack-index))))))
+		      (format "In routine %s (stack level %d)"
+			      idlwave-shell-calling-stack-routine
+			      (- idlwave-shell-calling-stack-index))))))
 
 (defun idlwave-shell-stack-up ()
   "Display the source code one step up the calling stack."
@@ -2302,30 +2345,38 @@
   "Check that frame is for an existing file."
   (file-readable-p (car frame)))
 
+(defun idlwave-shell-stop-line-pending ()
+  ;; Temporarily change the color of the stop line overlay
+  (if idlwave-shell-stop-line-overlay
+      (overlay-put idlwave-shell-stop-line-overlay 'face
+		   (if idlwave-shell-electric-debug-mode
+		       'idlwave-shell-pending-electric-stop
+		     'idlwave-shell-pending-stop))))
+
 (defvar idlwave-shell-suppress-electric-debug nil)
-(defun idlwave-shell-display-line (frame &optional col no-debug)
-  "Display FRAME file in other window with overlay arrow.
-
-FRAME is a list of file name, line number, and subroutine name.  If
-FRAME is nil then remove overlay.  If COL is set, move point to that
-column in the line.  If NO-DEBUG is non-nil, do *not* toggle the electric
-debug mode."
+(defun idlwave-shell-display-line (frame &optional col debug)
+  "display frame file in other window with overlay arrow.
+
+frame is a list of file name, line number, and subroutine name.  if
+frame is nil then remove overlay.  if col is set, move point to that
+column in the line.  if debug is non-nil, enable the electric debug
+mode.  if it is 'disable, do not enable no matter what the setting of
+'idlwave-shell-automatic-electric-debug'.  if it is 'force, enable no
+matter what the settings of that variable."
   (if (not frame)
-      ;; Remove stop-line overlay from old position
+      ;; remove stop-line overlay from old position
       (progn 
         (setq overlay-arrow-string nil)
 	(setq idlwave-shell-mode-line-info nil)
 	(setq idlwave-shell-is-stopped nil)
         (if idlwave-shell-stop-line-overlay
             (delete-overlay idlwave-shell-stop-line-overlay))
-	;; Turn off electric debug everywhere, if it's on
-	(if (and (not no-debug)
-		 idlwave-shell-automatic-electric-debug)
-	    (idlwave-shell-electric-debug-all-off)))
+	;; turn off electric debug everywhere, if it's on
+	(idlwave-shell-electric-debug-all-off))
     (if (not (idlwave-shell-valid-frame frame))
-	;; FIXME: errors are dangerous in shell filters.  But I think I
+	;; fixme: errors are dangerous in shell filters.  but i think i
 	;; have never encountered this one.
-        (error (concat "Invalid frame - unable to access file: " (car frame)))
+        (error (concat "invalid frame - unable to access file: " (car frame)))
 ;;;
 ;;; buffer : the buffer to display a line in.
 ;;; select-shell: current buffer is the shell.
@@ -2339,15 +2390,15 @@
              (select-shell (equal (buffer-name) (idlwave-shell-buffer)))
              window pos electric)
 
-	;; First make sure the shell window is visible
+	;; first make sure the shell window is visible
 	(idlwave-display-buffer (idlwave-shell-buffer)
 				nil (idlwave-shell-shell-frame))
 
-	;; Now display the buffer and remember which window it is.
+	;; now display the buffer and remember which window it is.
 	(setq window (idlwave-display-buffer buffer
 					     nil (idlwave-shell-source-frame)))
 
-	;; Enter the buffer and mark the line
+	;; enter the buffer and mark the line
         (save-excursion
           (set-buffer buffer)
           (save-restriction
@@ -2358,45 +2409,53 @@
 	    (setq idlwave-shell-is-stopped t)
 	    
             (if idlwave-shell-stop-line-overlay
-                ;; Move overlay
-		(move-overlay idlwave-shell-stop-line-overlay
-			      (point) (save-excursion (end-of-line) (point))
-			      (current-buffer))
-	      ;; Use the arrow instead, but only if marking is wanted.
+                (progn
+		  ;; restore face and move overlay 
+		  (overlay-put idlwave-shell-stop-line-overlay 'face
+			       (if idlwave-shell-electric-debug-mode
+                                   idlwave-shell-electric-stop-line-face 
+                                 idlwave-shell-stop-line-face))
+		  (move-overlay idlwave-shell-stop-line-overlay
+				(point) (save-excursion (end-of-line) (point))
+				(current-buffer)))
+	      ;; use the arrow instead, but only if marking is wanted.
 	      (if idlwave-shell-mark-stop-line
 		  (setq overlay-arrow-string idlwave-shell-overlay-arrow))
               (or overlay-arrow-position  ; create the marker if necessary
                   (setq overlay-arrow-position (make-marker)))
 	      (set-marker overlay-arrow-position (point) buffer)))
 
-	  ;; If the point is outside the restriction, widen the buffer.
+	  ;; if the point is outside the restriction, widen the buffer.
           (if (or (< pos (point-min)) (> pos (point-max)))
 	      (progn
 		(widen)
 		(goto-char pos)))
 
-	  ;; If we have the column of the error, move the cursor there.
+	  ;; if we have the column of the error, move the cursor there.
           (if col (move-to-column col))
           (setq pos (point))
 	  
-	  ;; Enter electric debug mode, if not prohibited and not in
+	  ;; enter electric debug mode, if not prohibited and not in
 	  ;; it already
-	  (when (and (or 
-		      (eq idlwave-shell-automatic-electric-debug t)
-		      (and 
-		       (eq idlwave-shell-automatic-electric-debug 'breakpoint)
-		       (not (eq idlwave-shell-current-state 'error))))
-		     (not no-debug)
-		     (not idlwave-shell-suppress-electric-debug)
-		     (not idlwave-shell-electric-debug-mode))
-	    (idlwave-shell-electric-debug-mode)
-	    (setq electric t)))
+	  (when  (and (not idlwave-shell-electric-debug-mode)
+		      (or (eq debug 'force)
+			  (and 
+			   (not (eq debug 'disable)) ;; explicitly disabled
+			   (or 
+			    (eq idlwave-shell-automatic-electric-debug t)
+			    (and 
+			     (eq idlwave-shell-automatic-electric-debug 
+				 'breakpoint)
+			     (not (eq idlwave-shell-current-state 'error))))
+			   (not idlwave-shell-suppress-electric-debug))))
+	    (idlwave-shell-electric-debug-mode t))
+	  (setq electric idlwave-shell-electric-debug-mode))
 	
 	;; Make sure pos is really displayed in the window.
 	(set-window-point window pos)
 	
 	;; If we came from the shell, go back there.  Otherwise select 
-	;; the window where the error is displayed.
+	;; the window where the error/halt is displayed.
         (if (or (and idlwave-shell-electric-zap-to-file electric)
 		(and (equal (buffer-name) (idlwave-shell-buffer)) 
 		     (not select-shell)))
@@ -2408,6 +2467,7 @@
   (interactive "p")
   (or (not arg) (< arg 1)
       (setq arg 1))
+  (idlwave-shell-stop-line-pending)
   (idlwave-shell-send-command 
    (concat ".s " (if (integerp arg) (int-to-string arg) arg))
    nil (if (idlwave-shell-hide-p 'debug) 'mostly) nil t))
@@ -2419,6 +2479,7 @@
   (interactive "p")
   (or (not arg) (< arg 1)
       (setq arg 1))
+  (idlwave-shell-stop-line-pending)
   (idlwave-shell-send-command 
    (concat ".so " (if (integerp arg) (int-to-string arg) arg))
    nil (if (idlwave-shell-hide-p 'debug) 'mostly) nil t))
@@ -2462,13 +2523,13 @@
               (beep)
               (y-or-n-p 
                (concat "Okay to recompile file "
-                       (idlwave-shell-bp-get bp 'file) "? ")))
+                       (idlwave-shell-bp-get bp 'file) "?")))
             ;; Recompile
             (progn
               ;; Clean up before retrying
               (idlwave-shell-command-failure)
               (idlwave-shell-send-command
-               (concat ".run " (idlwave-shell-bp-get bp 'file)) nil 
+               (concat ".run \"" (idlwave-shell-bp-get bp 'file) "\"") nil 
 	       (if (idlwave-shell-hide-p 'run) 'mostly) nil t)
               ;; Try setting breakpoint again
               (idlwave-shell-set-bp bp))
@@ -2496,6 +2557,7 @@
 (defun idlwave-shell-cont (&optional no-show)
   "Continue executing."
   (interactive)
+  (idlwave-shell-stop-line-pending)
   (idlwave-shell-send-command ".c" (unless no-show 
 				     '(idlwave-shell-redisplay 'hide))
 			      (if (idlwave-shell-hide-p 'debug) 'mostly) 
@@ -2504,6 +2566,7 @@
 (defun idlwave-shell-go ()
   "Run .GO.  This starts the main program of the last compiled file."
   (interactive)
+  (idlwave-shell-stop-line-pending)
   (idlwave-shell-send-command ".go" '(idlwave-shell-redisplay 'hide)
 			      (if (idlwave-shell-hide-p 'debug) 'mostly)
 			      nil t))
@@ -2511,6 +2574,7 @@
 (defun idlwave-shell-return ()
   "Run .RETURN (continue to next return, but stay in subprogram)."
   (interactive)
+  (idlwave-shell-stop-line-pending)
   (idlwave-shell-send-command ".return" '(idlwave-shell-redisplay 'hide)
 			      (if (idlwave-shell-hide-p 'debug) 'mostly)
 			      nil t))
@@ -2518,6 +2582,7 @@
 (defun idlwave-shell-skip ()
   "Run .SKIP (skip one line, then step)."
   (interactive)
+  (idlwave-shell-stop-line-pending)  
   (idlwave-shell-send-command ".skip" '(idlwave-shell-redisplay 'hide)
 			      (if (idlwave-shell-hide-p 'debug) 'mostly)
 			      nil t))
@@ -2603,6 +2668,7 @@
 (defun idlwave-shell-to-here ()
   "Set a breakpoint with count 1 then continue."
   (interactive)
+  ;; temporarily disable all other breakpoints
   (let ((disabled (idlwave-shell-enable-all-bp 'disable 'no-update)))
     (idlwave-shell-break-here 1 nil nil nil 'no-show)
     (idlwave-shell-cont 'no-show)
@@ -2739,13 +2805,18 @@
   `(lambda (event)
      "Expansion function for expression examination."
      (interactive "e")
-     (let ((transient-mark-mode t)
-	   (zmacs-regions t)
-	   (tracker (if (featurep 'xemacs) 
-			(if (fboundp 'default-mouse-track-event-is-with-button)
-			    'idlwave-xemacs-hack-mouse-track
-			  'mouse-track)
-		      'mouse-drag-region)))
+     (let* ((drag-track (fboundp 'mouse-drag-track))
+	    (transient-mark-mode t)
+	    (zmacs-regions t)
+	    (tracker (if (featurep 'xemacs) 
+			 (if (fboundp 
+			      'default-mouse-track-event-is-with-button)
+			     'idlwave-xemacs-hack-mouse-track
+			   'mouse-track)
+		       ;; Emacs 22 no longer completes the drag with
+		       ;; mouse-drag-region, without an additional
+		       ;; event.  mouse-drag-track does so.
+		       (if drag-track 'mouse-drag-track 'mouse-drag-region))))
        (funcall tracker event)
        (idlwave-shell-print (if (idlwave-region-active-p) '(4) nil)
 			    ,help ,ev))))
@@ -2756,8 +2827,9 @@
   t)
 
 (defun idlwave-xemacs-hack-mouse-track (event)
-  (if (featurep 'xemacs) 
-      (let ((oldfunc (symbol-function 'default-mouse-track-event-is-with-button)))
+  (if (featurep 'xemacs)
+      (let ((oldfunc (symbol-function 
+		      'default-mouse-track-event-is-with-button)))
 	(unwind-protect
 	    (progn
 	      (fset 'default-mouse-track-event-is-with-button 
@@ -2822,6 +2894,11 @@
 If instead COMPLETE-HELP-TYPE is non-nil, choose from
 idlw-shell-examine-alist via mini-buffer shortcut key."
   (interactive "P")
+
+  ;; For speed: assume the helper routine hasn't been lost, e.g. with
+  ;; .FULL_RESET_SESSION.  We'll recover if necessary
+  (unless idlwave-idlwave_routine_info-compiled
+    (idlwave-shell-compile-helper-routines))
   (save-excursion
     (let* ((process (get-buffer-process (current-buffer)))
 	   (process-mark (if process (process-mark process)))
@@ -2831,7 +2908,7 @@
 		(format "  [-%d:%s]" 
 			idlwave-shell-calling-stack-index 
 			idlwave-shell-calling-stack-routine)))
-	   expr beg end cmd examine-hook)
+	   expr beg end cmd)
       (cond
        ((equal arg '(16))
 	(setq expr (read-string "Expression: ")))
@@ -2874,10 +2951,6 @@
 		      (current-buffer))
 	(add-hook 'pre-command-hook 
 		  'idlwave-shell-delete-expression-overlay))
-      (setq examine-hook 
-	    (if idlwave-shell-separate-examine-output
-		'idlwave-shell-examine-display
-	      'idlwave-shell-examine-highlight))
       (add-hook 'pre-command-hook
 		'idlwave-shell-delete-output-overlay)
       
@@ -2939,7 +3012,7 @@
 	;;(idlwave-shell-recenter-shell-window)
 	(idlwave-shell-send-command 
 	 cmd 
-	 examine-hook 
+	 'idlwave-shell-check-compiled-and-display
 	 (if idlwave-shell-separate-examine-output 'hide))))))
 
 (defvar idlwave-shell-examine-window-alist nil
@@ -2949,6 +3022,15 @@
 (define-key idlwave-shell-examine-map "q" 'idlwave-shell-examine-display-quit)
 (define-key idlwave-shell-examine-map "c" 'idlwave-shell-examine-display-clear)
 
+
+(defun idlwave-shell-check-compiled-and-display ()
+  "Check examine output for warning about undefined procedure/function."
+  (if (string-match "% Attempt to call undefined" idlwave-shell-command-output)
+      (idlwave-shell-compile-helper-routines))
+  (if idlwave-shell-separate-examine-output
+      (idlwave-shell-examine-display)
+    (idlwave-shell-examine-highlight)))
+
 (defun idlwave-shell-examine-display ()
   "View the examine command output in a separate buffer."
   (let (win cur-beg cur-end)
@@ -3121,13 +3203,16 @@
 to insert expression in place of the marker ___, e.g.: print,
 size(___,/DIMENSIONS)"
   (cond
-   ((null help) (concat "print, " expr))
+   ((null help)
+    (concat "idlwave_print_safe, " expr "," 
+	    (number-to-string idlwave-shell-max-print-length)))
    ((stringp help) 
     (if (string-match "\\(^\\|[^_]\\)\\(___\\)\\([^_]\\|$\\)" help)
 	(concat (substring help 0 (match-beginning 2))
 		expr
 		(substring help (match-end 2)))))
-   (t (concat "help, " expr))))
+   (t 
+    (concat "help, " expr))))
    
 
 (defun idlwave-shell-examine-highlight ()
@@ -3221,7 +3306,8 @@
                  (idlwave-look-at "\\<end\\>")))
           (insert "\nend\n"))
       (save-buffer 0)))
-  (idlwave-shell-send-command (concat ".run " idlwave-shell-temp-pro-file)
+  (idlwave-shell-send-command (concat ".run \"" 
+				      idlwave-shell-temp-pro-file "\"")
 			      nil 
 			      (if (idlwave-shell-hide-p 'run) 'mostly)
 			      nil t)
@@ -3822,8 +3908,11 @@
 		       ((eq action 'compile) ".compile ")
 		       ((eq action 'batch)   "@")
 		       (t (error "Unknown action %s" action)))
-		 idlwave-shell-last-save-and-action-file)
-	 'idlwave-shell-maybe-update-routine-info
+		 "\""
+		 idlwave-shell-last-save-and-action-file
+		 "\"")
+	 `(idlwave-shell-maybe-update-routine-info nil
+	   ,idlwave-shell-last-save-and-action-file)
 	 (if (idlwave-shell-hide-p 'run) 'mostly) nil t)
 	(idlwave-shell-bp-query))
     (let ((msg (format "No such file %s" 
@@ -3831,14 +3920,14 @@
       (setq idlwave-shell-last-save-and-action-file nil)
       (error msg))))
 
-(defun idlwave-shell-maybe-update-routine-info (&optional wait)
+(defun idlwave-shell-maybe-update-routine-info (&optional wait file)
   "Update the routine info if the shell is not stopped at an error."
   (if (and (not idlwave-shell-is-stopped)
 	   (or (eq t idlwave-auto-routine-info-updates)
 	       (memq 'compile-buffer idlwave-auto-routine-info-updates))
 	   idlwave-query-shell-for-routine-info
 	   idlwave-routines)
-      (idlwave-shell-update-routine-info t nil wait)))
+      (idlwave-shell-update-routine-info t nil wait file)))
 
 (defvar idlwave-shell-sources-query "help,/source,/full"
   "IDL command to obtain source files for compiled procedures.")
@@ -3983,7 +4072,7 @@
       (setq idlwave-shell-error-last (point)))
     (if frame
         (progn
-          (idlwave-shell-display-line frame col 'no-debug))
+          (idlwave-shell-display-line frame col 'disable))
       (beep)
       (message "No more errors."))))
 
@@ -4158,6 +4247,8 @@
   'idlwave-shell-stack-down)
 (define-key idlwave-shell-electric-debug-mode-map "_" 
   'idlwave-shell-stack-down)
+(define-key idlwave-shell-electric-debug-mode-map "e" 
+  '(lambda () (interactive) (idlwave-shell-print '(16))))
 (define-key idlwave-shell-electric-debug-mode-map "q" 'idlwave-shell-retall)
 (define-key idlwave-shell-electric-debug-mode-map "t" 
   '(lambda () (interactive) (idlwave-shell-send-command "help,/TRACE")))
@@ -4181,9 +4272,11 @@
   ;; session until we return or hit $MAIN$.  Cancel this suppression
   ;; if it's explicitly turned on.
   (if idlwave-shell-electric-debug-mode
-      (setq idlwave-shell-suppress-electric-debug t)
-    (setq idlwave-shell-suppress-electric-debug nil))
-  (idlwave-shell-electric-debug-mode))
+      (progn ;; Turn it off, and make sure it stays off.
+	(setq idlwave-shell-suppress-electric-debug t)
+	(idlwave-shell-electric-debug-mode 0))
+    (setq idlwave-shell-suppress-electric-debug nil)
+    (idlwave-shell-electric-debug-mode t)))
 
 (defvar idlwave-shell-electric-debug-read-only) 
 (defvar idlwave-shell-electric-debug-buffers nil)
@@ -4196,9 +4289,9 @@
 
 When Electric Debug mode is enabled, the many debugging commands are
 available as single key sequences."
-  nil
-  " *Debugging*"
-  idlwave-shell-electric-debug-mode-map)
+nil
+" *Debugging*"
+idlwave-shell-electric-debug-mode-map)
 
 (add-hook 
  'idlwave-shell-electric-debug-mode-on-hook
@@ -4249,7 +4342,7 @@
 	  (when (and (eq major-mode 'idlwave-mode)
 		     buffer-file-name
 		     idlwave-shell-electric-debug-mode)
-	    (idlwave-shell-electric-debug-mode))))))
+	    (idlwave-shell-electric-debug-mode 0))))))
   (setq idlwave-shell-electric-debug-buffers nil))
 
 ;; Show the help text
--- a/lisp/progmodes/idlw-toolbar.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/progmodes/idlw-toolbar.el	Sun Apr 09 00:38:22 2006 +0000
@@ -1,10 +1,10 @@
 ;;; idlw-toolbar.el --- a debugging toolbar for IDLWAVE
 ;; Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-;; Free Software Foundation, Inc.
+;; Free Software Foundation
 
 ;; Author: Carsten Dominik <dominik@astro.uva.nl>
 ;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
-;; Version: 5.7_22
+;; Version: 6.0_em22
 ;; Keywords: processes
 
 ;; This file is part of GNU Emacs.
@@ -43,8 +43,8 @@
       (toolbar-make-button-list image)
     (list 'image :type 'xpm :data image)))
 
+(defvar idlwave-toolbar)
 (defvar default-toolbar)
-(defvar idlwave-toolbar)
 (defvar idlwave-toolbar-is-possible)
 
 (if (not (or (and (featurep 'xemacs)                ; This is XEmacs
--- a/lisp/progmodes/idlwave.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/progmodes/idlwave.el	Sun Apr 09 00:38:22 2006 +0000
@@ -1,12 +1,12 @@
 ;; idlwave.el --- IDL editing mode for GNU Emacs
 ;; Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-;;    Free Software Foundation, Inc.
+;;    Free Software Foundation
 
 ;; Authors: J.D. Smith <jdsmith@as.arizona.edu>
 ;;          Carsten Dominik <dominik@science.uva.nl>
 ;;          Chris Chase <chase@att.com>
 ;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
-;; Version: 5.7_22
+;; Version: 6.0_em22
 ;; Keywords: languages
 
 ;; This file is part of GNU Emacs.
@@ -28,7 +28,10 @@
 
 ;;; Commentary:
 
-;; IDLWAVE enables feature-rich development and interaction with IDL.
+;; IDLWAVE enables feature-rich development and interaction with IDL,
+;; the Interactive Data Language. It provides a compelling,
+;; full-featured alternative to the IDLDE development environment
+;; bundled with IDL.
 
 ;; In the remotely distant past, based on pascal.el, though bears
 ;; little resemblance to it now.
@@ -72,7 +75,7 @@
 ;; of the documentation is available from the maintainers webpage (see
 ;; SOURCE).
 ;;
-;;
+;; 
 ;; ACKNOWLEDGMENTS
 ;; ===============
 ;;
@@ -122,7 +125,7 @@
 ;;   up inserting the character that expanded the abbrev after moving
 ;;   point backward, e.g., "\cl" expanded with a space becomes
 ;;   "LONG( )" with point before the close paren.  This is solved by
-;;   using a temporary function in `post-command-hook' - not pretty,
+;;   using a temporary function in `post-command-hook' - not pretty, 
 ;;   but it works.
 ;;
 ;;   Tabs and spaces are treated equally as whitespace when filling a
@@ -160,6 +163,8 @@
   (defalias 'line-end-position 'point-at-eol))
 (unless (fboundp 'char-valid-p)
   (defalias 'char-valid-p 'characterp))
+(unless (fboundp 'match-string-no-properties)
+  (defalias 'match-string-no-properties 'match-string))
 
 (if (not (fboundp 'cancel-timer))
     (condition-case nil
@@ -173,13 +178,13 @@
       nil ;; We've got what we needed
     ;; We have the old or no custom-library, hack around it!
     (defmacro defgroup (&rest args) nil)
-    (defmacro defcustom (var value doc &rest args)
+    (defmacro defcustom (var value doc &rest args) 
       `(defvar ,var ,value ,doc))))
 
 (defgroup idlwave nil
   "Major mode for editing IDL .pro files."
   :tag "IDLWAVE"
-  :link '(url-link :tag "Home Page"
+  :link '(url-link :tag "Home Page" 
 		   "http://idlwave.org")
   :link '(emacs-commentary-link :tag "Commentary in idlw-shell.el"
 				"idlw-shell.el")
@@ -195,34 +200,34 @@
   "Indentation and formatting options for IDLWAVE mode."
   :group 'idlwave)
 
-(defcustom idlwave-main-block-indent 0
+(defcustom idlwave-main-block-indent 2
   "*Extra indentation for the main block of code.
 That is the block between the FUNCTION/PRO statement and the END
 statement for that program unit."
   :group 'idlwave-code-formatting
   :type 'integer)
 
-(defcustom idlwave-block-indent 4
+(defcustom idlwave-block-indent 3
   "*Extra indentation applied to block lines.
 If you change this, you probably also want to change `idlwave-end-offset'."
   :group 'idlwave-code-formatting
   :type 'integer)
 
-(defcustom idlwave-end-offset -4
+(defcustom idlwave-end-offset -3
   "*Extra indentation applied to block END lines.
 A value equal to negative `idlwave-block-indent' will make END lines
 line up with the block BEGIN lines."
   :group 'idlwave-code-formatting
   :type 'integer)
 
-(defcustom idlwave-continuation-indent 2
+(defcustom idlwave-continuation-indent 3
   "*Extra indentation applied to continuation lines.
 This extra offset applies to the first of a set of continuation lines.
 The following lines receive the same indentation as the first."
   :group 'idlwave-code-formatting
   :type 'integer)
 
-(defcustom idlwave-max-extra-continuation-indent 20
+(defcustom idlwave-max-extra-continuation-indent 40
   "*Maximum additional indentation for special continuation indent.
 Several special indentations are tried to help line up continuation
 lines in routine calls or definitions, other statements with
@@ -293,8 +298,8 @@
 
 (defcustom idlwave-auto-fill-split-string t
   "*If non-nil then auto fill will split strings with the IDL `+' operator.
-When the line end falls within a string, string concatenation with the
-'+' operator will be used to distribute a long string over lines.
+When the line end falls within a string, string concatenation with the 
+'+' operator will be used to distribute a long string over lines.  
 If nil and a string is split then a terminal beep and warning are issued.
 
 This variable is ignored when `idlwave-fill-comment-line-only' is
@@ -354,17 +359,20 @@
   :type 'boolean)
 
 (defcustom idlwave-init-rinfo-when-idle-after 10
-  "*Seconds of idle time before routine info is automatically initialized.
-Initializing the routine info can take long, in particular if a large
-library catalog is involved.  When Emacs is idle for more than the number
-of seconds specified by this variable, it starts the initialization.
-The process is split into five steps, in order to keep possible work
-interruption as short as possible.  If one of the steps finishes, and no
-user input has arrived in the mean time, initialization proceeds immediately
-to the next step.
-A good value for this variable is about 1/3 of the time initialization
-take in you setup.  So if you have a fast machine and no problems with a slow network connection, don't hesitate to set this to 2 seconds.
-A Value of 0 means, don't initialize automatically."
+  "*Seconds of idle time before routine info is automatically
+initialized.  Initializing the routine info can take a long time, in
+particular if a large number of library catalogs are involved.  When
+Emacs is idle for more than the number of seconds specified by this
+variable, it starts the initialization.  The process is split into
+five steps, in order to keep work interruption as short as possible.
+If one of the steps finishes, and no user input has arrived in the
+mean time, initialization proceeds immediately to the next step.  A
+good value for this variable is about 1/3 of the time initialization
+take in your setup.  So if you have a fast machine and no problems
+with a slow network connection, don't hesitate to set this to 2
+seconds.  A Value of 0 means, don't initialize automatically, but
+instead wait until routine information is needed, and initialize
+then."
   :group 'idlwave-routine-info
   :type 'number)
 
@@ -410,7 +418,7 @@
 	       (const :tag "When saving a buffer" save-buffer)
 	       (const :tag "After a buffer was killed" kill-buffer)
 	       (const :tag "After a buffer was compiled successfully, update shell info" compile-buffer))))
-
+	       
 (defcustom idlwave-rinfo-max-source-lines 5
   "*Maximum number of source files displayed in the Routine Info window.
 When an integer, it is the maximum number of source files displayed.
@@ -419,16 +427,17 @@
   :type 'integer)
 
 (defcustom idlwave-library-path nil
-  "Library path for Windows and MacOS.  Not needed under Unix.  When
-selecting the directories to scan for IDL user catalog routine info,
-IDLWAVE can, under UNIX, query the shell for the exact search path
-\(the value of !PATH).  However, under Windows and MacOS (pre-OSX),
-the IDLWAVE shell does not work.  In this case, this variable can be
-set to specify the paths where IDLWAVE can find PRO files.  The shell
-will only be asked for a list of paths when this variable is nil.  The
-value is a list of directories.  A directory preceeded by a `+' will
-be searched recursively.  If you set this variable on a UNIX system,
-the shell will not be queried.  See also `idlwave-system-directory'."
+  "Library path for Windows and MacOS (OS9).  Not needed under Unix.
+When selecting the directories to scan for IDL user catalog routine
+info, IDLWAVE can, under UNIX, query the shell for the exact search
+path \(the value of !PATH).  However, under Windows and MacOS
+(pre-OSX), the IDLWAVE shell does not work.  In this case, this
+variable can be set to specify the paths where IDLWAVE can find PRO
+files.  The shell will only be asked for a list of paths when this
+variable is nil.  The value is a list of directories.  A directory
+preceeded by a `+' will be searched recursively.  If you set this
+variable on a UNIX system, the shell will not be queried.  See also
+`idlwave-system-directory'."
   :group 'idlwave-routine-info
   :type '(repeat (directory)))
 
@@ -443,13 +452,15 @@
   :group 'idlwave-routine-info
   :type 'directory)
 
-(defcustom idlwave-config-directory
+;; Configuration files
+(defcustom idlwave-config-directory 
   (convert-standard-filename "~/.idlwave")
   "*Directory for configuration files and user-library catalog."
   :group 'idlwave-routine-info
   :type 'file)
 
 (defvar idlwave-user-catalog-file "idlusercat.el")
+(defvar idlwave-xml-system-rinfo-converted-file "idl_xml_rinfo.el")
 (defvar idlwave-path-file "idlpath.el")
 
 (defvar idlwave-libinfo-file nil
@@ -458,7 +469,7 @@
 (defcustom idlwave-special-lib-alist nil
   "Alist of regular expressions matching special library directories.
 When listing routine source locations, IDLWAVE gives a short hint where
-the file defining the routine is located.  By default it lists `SystemLib'
+the file defining the routine is located.  By default it lists `SystemLib' 
 for routines in the system library `!DIR/lib' and `Library' for anything
 else.  This variable can define additional types.  The car of each entry
 is a regular expression matching the file name (they normally will match
@@ -469,7 +480,7 @@
 	  (cons regexp string)))
 
 (defcustom idlwave-auto-write-paths t
-  "Write out path (!PATH) and system directory (!DIR) info automatically.
+  "Write out path (!PATH) and system directory (!DIR) info automatically.  
 Path info is needed to locate library catalog files.  If non-nil,
 whenever the path-list changes as a result of shell-query, etc., it is
 written to file.  Otherwise, the menu option \"Write Paths\" can be
@@ -500,7 +511,7 @@
 This variable determines the case (UPPER/lower/Capitalized...) of
 words inserted into the buffer by completion.  The preferred case can
 be specified separately for routine names, keywords, classes and
-methods.
+methods. 
 This alist should therefore have entries for `routine' (normal
 functions and procedures, i.e. non-methods), `keyword', `class', and
 `method'.  Plausible values are
@@ -587,7 +598,7 @@
 for which to assume this can be set here."
   :group 'idlwave-routine-info
   :type '(repeat (regexp :tag "Match method:")))
-
+  
 
 (defcustom idlwave-completion-show-classes 1
   "*Number of classes to show when completing object methods and keywords.
@@ -652,7 +663,7 @@
 specify if the class should be found during method and keyword
 completion, respectively.
 
-The alist may have additional entries specifying exceptions from the
+The alist may have additional entries specifying exceptions from the 
 keyword completion rule for specific methods, like INIT or
 GETPROPERTY.  In order to turn on class specification for the INIT
 method, add an entry (\"INIT\" . t).  The method name must be ALL-CAPS."
@@ -668,7 +679,7 @@
 	   (cons (string  :tag "MODULE" :value "")
 		 (boolean :tag "Determine class for this method")))))
 
-(defcustom idlwave-store-inquired-class nil
+(defcustom idlwave-store-inquired-class t
   "*Non-nil means, store class of a method call as text property on `->'.
 IDLWAVE sometimes has to ask the user for the class associated with a
 particular object method call.  This happens during the commands
@@ -676,7 +687,7 @@
 value of the variable `idlwave-query-class'.
 
 When you specify a class, this information can be stored as a text
-property on the `->' arrow in the source code, so that during the same
+property on the `->' arrow in the source code, so that during the same 
 editing session, IDLWAVE will not have to ask again.  When this
 variable is non-nil, IDLWAVE will store and reuse the class information.
 The class stored can be checked and removed with `\\[idlwave-routine-info]'
@@ -950,7 +961,7 @@
 For example you might set PATHNAME to the path for the
 lib_template.pro file included in the IDL distribution.")
 
-(defcustom idlwave-header-to-beginning-of-file nil
+(defcustom idlwave-header-to-beginning-of-file t
   "*Non-nil means, the documentation header will always be at start of file.
 When nil, the header is positioned between the PRO/FUNCTION line of
 the current routine and the code, allowing several routine headers in
@@ -987,10 +998,6 @@
   "Path locations of external commands used by IDLWAVE."
   :group 'idlwave)
 
-;; WARNING: The following variable has recently been moved from
-;; idlw-shell.el to this file.  I hope this does not break
-;; anything.
-
 (defcustom idlwave-shell-explicit-file-name "idl"
   "*If non-nil, this is the command to run IDL.
 Should be an absolute file path or path relative to the current environment
@@ -1015,7 +1022,8 @@
   :group 'idlwave-external-programs)
 
 (defcustom idlwave-help-application "idlhelp"
-  "*The external application providing reference help for programming."
+  "*The external application providing reference help for programming.
+Obsolete, if the IDL Assistant is being used for help."
   :group 'idlwave-external-programs
   :type 'string)
 
@@ -1057,7 +1065,7 @@
   :group 'idlwave-misc
   :type 'boolean)
 
-(defcustom idlwave-default-font-lock-items
+(defcustom idlwave-default-font-lock-items 
   '(pros-and-functions batch-files idlwave-idl-keywords label goto
 		       common-blocks class-arrows)
   "Items which should be fontified on the default fontification level 2.
@@ -1119,25 +1127,25 @@
 ;;; and Carsten Dominik...
 
 ;; The following are the reserved words in IDL.  Maybe we should
-;; highlight some more stuff as well?
+;; highlight some more stuff as well?       
 ;; Procedure declarations.  Fontify keyword plus procedure name.
 (defvar idlwave-idl-keywords
-  ;; To update this regexp, update the list of keywords and
+  ;; To update this regexp, update the list of keywords and 
   ;; evaluate the form.
-  ;;	(insert
+  ;;	(insert 
   ;;	 (prin1-to-string
-  ;;	  (concat
+  ;;	  (concat 
   ;;	   "\\<\\("
-  ;;	   (regexp-opt
+  ;;	   (regexp-opt 
   ;;	    '("||" "&&" "and" "or" "xor" "not"
-  ;;	      "eq" "ge" "gt" "le" "lt" "ne"
+  ;;	      "eq" "ge" "gt" "le" "lt" "ne" 
   ;;	      "for" "do" "endfor"
-  ;;	      "if" "then" "endif" "else" "endelse"
+  ;;	      "if" "then" "endif" "else" "endelse" 
   ;;	      "case" "of" "endcase"
   ;;	      "switch" "break" "continue" "endswitch"
   ;;	      "begin" "end"
   ;;	      "repeat" "until" "endrep"
-  ;;	      "while" "endwhile"
+  ;;	      "while" "endwhile" 
   ;;	      "goto" "return"
   ;;	      "inherits" "mod"
   ;;	      "compile_opt" "forward_function"
@@ -1158,9 +1166,9 @@
 	'("\\<\\(common\\)\\>[ \t]*\\(\\sw+\\)?[ \t]*,?"
 	  (1 font-lock-keyword-face)	          ; "common"
 	  (2 font-lock-reference-face nil t)      ; block name
-	  (font-lock-match-c++-style-declaration-item-and-skip-to-next
+	  ("[ \t]*\\(\\sw+\\)[ ,]*"
 	   ;; Start with point after block name and comma
-	   (goto-char (match-end 0))  ; needed for XEmacs, could be nil
+	   (goto-char (match-end 0))  ; needed for XEmacs, could be nil 
 	   nil
 	   (1 font-lock-variable-name-face)       ; variable names
 	   )))
@@ -1215,7 +1223,7 @@
        ;; All operators (not used because too noisy)
        (all-operators
 	'("[-*^#+<>/]" (0 font-lock-keyword-face)))
-
+	
        ;; Arrows with text property `idlwave-class'
        (class-arrows
 	'(idlwave-match-class-arrows (0 idlwave-class-arrow-face))))
@@ -1252,14 +1260,14 @@
 
 (defvar idlwave-font-lock-defaults
   '((idlwave-font-lock-keywords
-     idlwave-font-lock-keywords-1
+     idlwave-font-lock-keywords-1 
      idlwave-font-lock-keywords-2
      idlwave-font-lock-keywords-3)
-    nil t
-    ((?$ . "w") (?_ . "w") (?. . "w") (?| . "w") (?& . "w"))
+    nil t 
+    ((?$ . "w") (?_ . "w") (?. . "w") (?| . "w") (?& . "w")) 
     beginning-of-line))
 
-(put 'idlwave-mode 'font-lock-defaults
+(put 'idlwave-mode 'font-lock-defaults 
      idlwave-font-lock-defaults) ; XEmacs
 
 (defconst idlwave-comment-line-start-skip "^[ \t]*;"
@@ -1267,7 +1275,7 @@
 That is the _beginning_ of a line containing a comment delimiter `;' preceded
 only by whitespace.")
 
-(defconst idlwave-begin-block-reg
+(defconst idlwave-begin-block-reg 
   "\\<\\(pro\\|function\\|begin\\|case\\|switch\\)\\>"
   "Regular expression to find the beginning of a block. The case does
 not matter. The search skips matches in comments.")
@@ -1344,17 +1352,17 @@
    '(goto . ("goto\\>" nil))
    '(case . ("case\\>" nil))
    '(switch . ("switch\\>" nil))
-   (cons 'call (list (concat "\\(" idlwave-variable "\\) *= *"
+   (cons 'call (list (concat "\\(" idlwave-variable "\\) *= *" 
 			     "\\(" idlwave-method-call "\\s *\\)?"
 			     idlwave-identifier
 			     "\\s *(") nil))
-   (cons 'call (list (concat
+   (cons 'call (list (concat 
 		      "\\(" idlwave-method-call "\\s *\\)?"
-		      idlwave-identifier
+		      idlwave-identifier 
 		      "\\( *\\($\\|\\$\\)\\|\\s *,\\)") nil))
-   (cons 'assign (list (concat
+   (cons 'assign (list (concat 
 			"\\(" idlwave-variable "\\) *=") nil)))
-
+  
   "Associated list of statement matching regular expressions.
 Each regular expression matches the start of an IDL statement.  The
 first element of each association is a symbol giving the statement
@@ -1377,7 +1385,7 @@
 ;; Note that this is documented in the v18 manuals as being a string
 ;; of length one rather than a single character.
 ;; The code in this file accepts either format for compatibility.
-(defvar idlwave-comment-indent-char ?\
+(defvar idlwave-comment-indent-char ?\ 
   "Character to be inserted for IDL comment indentation.
 Normally a space.")
 
@@ -1385,7 +1393,7 @@
   "Character which is inserted as a last character on previous line by
    \\[idlwave-split-line] to begin a continuation line.  Normally $.")
 
-(defconst idlwave-mode-version "5.7_22")
+(defconst idlwave-mode-version "6.0_em22")
 
 (defmacro idlwave-keyword-abbrev (&rest args)
   "Creates a function for abbrev hooks to call `idlwave-check-abbrev' with args."
@@ -1536,7 +1544,7 @@
 (define-key idlwave-mode-map "\C-c\C-n" 'idlwave-next-statement)
 ;; (define-key idlwave-mode-map "\r"       'idlwave-newline)
 ;; (define-key idlwave-mode-map "\t"       'idlwave-indent-line)
-(define-key idlwave-mode-map [(shift tab)] 'idlwave-indent-statement)
+(define-key idlwave-mode-map [(shift iso-lefttab)] 'idlwave-indent-statement)
 (define-key idlwave-mode-map "\C-c\C-a" 'idlwave-auto-fill-mode)
 (define-key idlwave-mode-map "\M-q"     'idlwave-fill-paragraph)
 (define-key idlwave-mode-map "\M-s"     'idlwave-edit-in-idlde)
@@ -1549,15 +1557,15 @@
 	 (not (equal idlwave-shell-debug-modifiers '())))
   ;; Bind the debug commands also with the special modifiers.
   (let ((shift (memq 'shift idlwave-shell-debug-modifiers))
-	(mods-noshift (delq 'shift
+	(mods-noshift (delq 'shift 
 			    (copy-sequence idlwave-shell-debug-modifiers))))
-    (define-key idlwave-mode-map
+    (define-key idlwave-mode-map 
       (vector (append mods-noshift (list (if shift ?C ?c))))
       'idlwave-shell-save-and-run)
-    (define-key idlwave-mode-map
+    (define-key idlwave-mode-map 
       (vector (append mods-noshift (list (if shift ?B ?b))))
       'idlwave-shell-break-here)
-    (define-key idlwave-mode-map
+    (define-key idlwave-mode-map 
       (vector (append mods-noshift (list (if shift ?E ?e))))
       'idlwave-shell-run-region)))
 (define-key idlwave-mode-map "\C-c\C-d\C-c" 'idlwave-shell-save-and-run)
@@ -1594,25 +1602,28 @@
 (define-key idlwave-mode-map "\M-\C-i" 'idlwave-complete)
 (define-key idlwave-mode-map "\C-c\C-i" 'idlwave-update-routine-info)
 (define-key idlwave-mode-map "\C-c="    'idlwave-resolve)
-(define-key idlwave-mode-map
+(define-key idlwave-mode-map 
   (if (featurep 'xemacs) [(shift button3)] [(shift mouse-3)])
   'idlwave-mouse-context-help)
 
 ;; Set action and key bindings.
 ;; See description of the function `idlwave-action-and-binding'.
 ;; Automatically add spaces for the following characters
-;(idlwave-action-and-binding "&"  '(idlwave-surround -1 -1 '(?&) 1
-;						    (lambda (char) 0)))
-(idlwave-action-and-binding "<"  '(idlwave-surround -1 -1))
-;; Binding works for both > and ->, by changing the length of the token.
-(idlwave-action-and-binding ">"  '(idlwave-surround -1 -1 '(?-) 1
-						    'idlwave-gtr-pad-hook))
-(idlwave-action-and-binding "->" '(idlwave-surround -1 -1 nil 2) t)
-(idlwave-action-and-binding ","  '(idlwave-surround 0 -1))
-
-;; Automatically add spaces to equal sign if not keyword
+
+;; Actions for & are complicated by &&
+(idlwave-action-and-binding "&"  'idlwave-custom-ampersand-surround)
+
+;; Automatically add spaces to equal sign if not keyword.  This needs
+;; to go ahead of > and <, so >= and <= will be treated correctly
 (idlwave-action-and-binding "="  '(idlwave-expand-equal -1 -1))
 
+;; Actions for > and < are complicated by >=, <=, and ->... 
+(idlwave-action-and-binding "<"  '(idlwave-custom-ltgtr-surround nil))
+(idlwave-action-and-binding ">"  '(idlwave-custom-ltgtr-surround 'gtr))
+
+(idlwave-action-and-binding ","  '(idlwave-surround 0 -1 1))
+
+
 ;;;
 ;;; Abbrev Section
 ;;;
@@ -1639,7 +1650,7 @@
       (error (apply 'define-abbrev args)))))
 
 (condition-case nil
-    (modify-syntax-entry (string-to-char idlwave-abbrev-start-char)
+    (modify-syntax-entry (string-to-char idlwave-abbrev-start-char) 
 			 "w" idlwave-mode-syntax-table)
   (error nil))
 
@@ -1763,12 +1774,12 @@
 (defvar imenu-extract-index-name-function)
 (defvar imenu-prev-index-position-function)
 ;; defined later - so just make the compiler hush
-(defvar idlwave-mode-menu)
+(defvar idlwave-mode-menu)  
 (defvar idlwave-mode-debug-menu)
 
 ;;;###autoload
 (defun idlwave-mode ()
-  "Major mode for editing IDL source files (version 5.7_22).
+  "Major mode for editing IDL source files (version 6.0_em22).
 
 The main features of this mode are
 
@@ -1817,11 +1828,10 @@
 
 3. Online IDL Help
    ---------------
+
    \\[idlwave-context-help] displays the IDL documentation relevant
-   for the system variable, keyword, or routine at point.  A single
-   key stroke gets you directly to the right place in the docs.  The
-   HTML help files package must be installed for this to work -- check
-   the IDLWAVE webpage for the correct package for your version.  See
+   for the system variable, keyword, or routines at point.  A single
+   key stroke gets you directly to the right place in the docs.  See
    the manual to configure where and how the HTML help is displayed.
 
 4. Completion
@@ -1848,7 +1858,7 @@
    \\i         IF statement template
    \\elif      IF-ELSE statement template
    \\b         BEGIN
-
+   
    For a full list, use \\[idlwave-list-abbrevs].  Some templates also
    have direct keybindings - see the list of keybindings below.
 
@@ -1890,26 +1900,26 @@
 
   (interactive)
   (kill-all-local-variables)
-
+  
   (if idlwave-startup-message
       (message "Emacs IDLWAVE mode version %s." idlwave-mode-version))
   (setq idlwave-startup-message nil)
-
+  
   (setq local-abbrev-table idlwave-mode-abbrev-table)
   (set-syntax-table idlwave-mode-syntax-table)
-
+  
   (set (make-local-variable 'indent-line-function) 'idlwave-indent-and-action)
-
+  
   (make-local-variable idlwave-comment-indent-function)
   (set idlwave-comment-indent-function 'idlwave-comment-hook)
-
+  
   (set (make-local-variable 'comment-start-skip) ";+[ \t]*")
   (set (make-local-variable 'comment-start) ";")
-  (set (make-local-variable 'require-final-newline) mode-require-final-newline)
+  (set (make-local-variable 'require-final-newline) t)
   (set (make-local-variable 'abbrev-all-caps) t)
   (set (make-local-variable 'indent-tabs-mode) nil)
   (set (make-local-variable 'completion-ignore-case) t)
-
+  
   (use-local-map idlwave-mode-map)
 
   (when (featurep 'easymenu)
@@ -1919,11 +1929,11 @@
   (setq mode-name "IDLWAVE")
   (setq major-mode 'idlwave-mode)
   (setq abbrev-mode t)
-
+  
   (set (make-local-variable idlwave-fill-function) 'idlwave-auto-fill)
   (setq comment-end "")
   (set (make-local-variable 'comment-multi-line) nil)
-  (set (make-local-variable 'paragraph-separate)
+  (set (make-local-variable 'paragraph-separate) 
        "[ \t\f]*$\\|[ \t]*;+[ \t]*$\\|;+[+=-_*]+$")
   (set (make-local-variable 'paragraph-start) "[ \t\f]\\|[ \t]*;+[ \t]")
   (set (make-local-variable 'paragraph-ignore-fill-prefix) nil)
@@ -1932,7 +1942,7 @@
   ;; Set tag table list to use IDLTAGS as file name.
   (if (boundp 'tag-table-alist)
       (add-to-list 'tag-table-alist '("\\.pro$" . "IDLTAGS")))
-
+  
   ;; Font-lock additions - originally Phil Williams, then Ulrik Dickow
   ;; Following line is for Emacs - XEmacs uses the corresponding property
   ;; on the `idlwave-mode' symbol.
@@ -1947,11 +1957,16 @@
        'idlwave-prev-index-position)
 
   ;; Make a local post-command-hook and add our hook to it
+  ;; NB: `make-local-hook' needed for older/alternative Emacs compatibility
+  ;; (make-local-hook 'post-command-hook)
   (add-hook 'post-command-hook 'idlwave-command-hook nil 'local)
 
   ;; Make local hooks for buffer updates
+  ;; NB: `make-local-hook' needed for older/alternative Emacs compatibility
+  ;; (make-local-hook 'kill-buffer-hook)
   (add-hook 'kill-buffer-hook 'idlwave-kill-buffer-update nil 'local)
-  (add-hook 'after-save-hook 'idlwave-save-buffer-update nil 'local)
+  ;; (make-local-hook 'after-save-hook)
+  ;; (add-hook 'after-save-hook 'idlwave-save-buffer-update nil 'local)
   (add-hook 'after-save-hook 'idlwave-revoke-license-to-kill nil 'local)
 
   ;; Setup directories and file, if necessary
@@ -1960,6 +1975,9 @@
   ;; Update the routine info with info about current buffer?
   (idlwave-new-buffer-update)
 
+  ;; Check help location
+  (idlwave-help-check-locations)
+
   ;; Run the mode hook
   (run-mode-hooks 'idlwave-mode-hook))
 
@@ -1968,18 +1986,23 @@
   (unless idlwave-setup-done
     (if (not (file-directory-p idlwave-config-directory))
 	(make-directory idlwave-config-directory))
-    (setq idlwave-user-catalog-file (expand-file-name
-				     idlwave-user-catalog-file
-				     idlwave-config-directory)
-	idlwave-path-file (expand-file-name
-			   idlwave-path-file
-			   idlwave-config-directory))
+    (setq 
+     idlwave-user-catalog-file (expand-file-name 
+				idlwave-user-catalog-file 
+				idlwave-config-directory)
+     idlwave-xml-system-rinfo-converted-file 
+     (expand-file-name 
+      idlwave-xml-system-rinfo-converted-file
+      idlwave-config-directory)
+     idlwave-path-file (expand-file-name 
+			idlwave-path-file 
+			idlwave-config-directory))
     (idlwave-read-paths)  ; we may need these early
     (setq idlwave-setup-done t)))
 
 ;;
 ;; Code Formatting ----------------------------------------------------
-;;
+;; 
 
 (defun idlwave-push-mark (&rest rest)
   "Push mark for compatibility with Emacs 18/19."
@@ -2128,7 +2151,7 @@
 	(if (> end-pos eol-pos)
 	    (setq end-pos pos))
 	(goto-char end-pos)
-	(setq end (buffer-substring
+	(setq end (buffer-substring 
 		   (progn
 		     (skip-chars-backward "a-zA-Z")
 		     (point))
@@ -2150,7 +2173,7 @@
 	    (sit-for 1))
 	   (t
 	    (beep)
-	    (message "Warning: Shouldn't this be \"%s\" instead of \"%s\"?"
+	    (message "Warning: Shouldn't this be \"%s\" instead of \"%s\"?" 
 		     end1 end)
 	    (sit-for 1))))))))
   ;;(delete-char 1))
@@ -2162,8 +2185,8 @@
        ((looking-at "pro\\|case\\|switch\\|function\\>")
 	(assoc (downcase (match-string 0)) idlwave-block-matches))
        ((looking-at "begin\\>")
-	(let ((limit (save-excursion
-		       (idlwave-beginning-of-statement)
+	(let ((limit (save-excursion 
+		       (idlwave-beginning-of-statement) 
 		       (point))))
 	  (cond
 	   ((re-search-backward ":[ \t]*\\=" limit t)
@@ -2180,7 +2203,6 @@
 (defun idlwave-close-block ()
   "Terminate the current block with the correct END statement."
   (interactive)
-
   ;; Start new line if we are not in a new line
   (unless (save-excursion
 	    (skip-chars-backward " \t")
@@ -2191,12 +2213,27 @@
     (insert "end")
     (idlwave-show-begin)))
 
-(defun idlwave-gtr-pad-hook (char)
-  "Let the > symbol expand around -> if present.  The new token length
-is returned."
-  2)
-
-(defun idlwave-surround (&optional before after escape-chars length ec-hook)
+(defun idlwave-custom-ampersand-surround (&optional is-action)
+  "Surround &, leaving room for && (which surrround as well)."
+  (let* ((prev-char (char-after (- (point) 2)))
+	 (next-char (char-after (point)))
+	 (amp-left (eq prev-char ?&))
+	 (amp-right (eq next-char ?&))
+	 (len (if amp-left 2 1)))
+    (unless amp-right ;no need to do it twice, amp-left will catch it.
+      (idlwave-surround -1 (if (or is-action amp-left) -1) len))))
+
+(defun idlwave-custom-ltgtr-surround (gtr &optional is-action)
+  "Surround > and < by blanks, leaving room for >= and <=, and considering ->."
+  (let* ((prev-char (char-after (- (point) 2)))
+	(next-char (char-after (point)))
+	(method-invoke (and gtr (eq prev-char ?-)))
+	(len (if method-invoke 2 1)))
+    (unless  (eq next-char ?=)
+      ;; Key binding: pad only on left, to save for possible >=/<=
+      (idlwave-surround -1 (if (or is-action method-invoke) -1) len))))
+
+(defun idlwave-surround (&optional before after length is-action)
   "Surround the LENGTH characters before point with blanks.
 LENGTH defaults to 1.
 Optional arguments BEFORE and AFTER affect the behavior before and
@@ -2209,42 +2246,28 @@
 
 The function does nothing if any of the following conditions is true:
 - `idlwave-surround-by-blank' is nil
-- the character before point is inside a string or comment
-- the char preceeding the string to be surrounded is a member of ESCAPE-CHARS.
-  This hack is used to avoid padding of `>' when it is part of
-  the '->' operator.  In this case, ESCAPE-CHARS would be '(?-).
-
-If a function is passed in EC-HOOK, and an ESCAPE-CHARS match occurs,
-the named function will be called with a single argument of the
-preceeding character.  Then idlwave-surround will run as usual if
-EC-HOOK returns non-nil, and a new length will be taken from the
-return value."
+- the character before point is inside a string or comment"
   (when (and idlwave-surround-by-blank (not (idlwave-quoted)))
-    (let* ((length (or length 1)) ; establish a default for LENGTH
-	   (prev-char (char-after (- (point) (1+ length)))))
-      (when (or (not (memq prev-char escape-chars))
-		(and (fboundp ec-hook)
-		     (setq length
-			   (save-excursion (funcall ec-hook prev-char)))))
-	(backward-char length)
-	(save-restriction
-	  (let ((here (point)))
-	    (skip-chars-backward " \t")
-	    (if (bolp)
-		;; avoid clobbering indent
-		(progn
-		  (move-to-column (idlwave-calculate-indent))
-		  (if (<= (point) here)
-		      (narrow-to-region (point) here))
-		  (goto-char here)))
-	    (idlwave-make-space before))
-	  (skip-chars-forward " \t"))
-	(forward-char length)
-	(idlwave-make-space after)
-	;; Check to see if the line should auto wrap
-	(if (and (equal (char-after (1- (point))) ?\ )
-		 (> (current-column) fill-column))
-	    (funcall auto-fill-function))))))
+    (let ((length (or length 1))) ; establish a default for LENGTH
+      (backward-char length)
+      (save-restriction
+	(let ((here (point)))
+	  (skip-chars-backward " \t")
+	  (if (bolp)
+	      ;; avoid clobbering indent
+	      (progn
+		(move-to-column (idlwave-calculate-indent))
+		(if (<= (point) here)
+		    (narrow-to-region (point) here))
+		(goto-char here)))
+	  (idlwave-make-space before))
+	(skip-chars-forward " \t"))
+      (forward-char length)
+      (idlwave-make-space after)
+      ;; Check to see if the line should auto wrap
+      (if (and (equal (char-after (1- (point))) ?\ )
+	       (> (current-column) fill-column))
+	  (funcall auto-fill-function)))))
 
 (defun idlwave-make-space (n)
   "Make space at point.
@@ -2446,7 +2469,7 @@
         (let ((eos (save-excursion
                      (idlwave-block-jump-out -1 'nomark)
                      (point))))
-          (if (setq status (idlwave-find-key
+          (if (setq status (idlwave-find-key 
 			    idlwave-end-block-reg -1 'nomark eos))
               (idlwave-beginning-of-statement)
             (message "No nested block before beginning of containing block.")))
@@ -2454,7 +2477,7 @@
       (let ((eos (save-excursion
                    (idlwave-block-jump-out 1 'nomark)
                    (point))))
-        (if (setq status (idlwave-find-key
+        (if (setq status (idlwave-find-key 
 			  idlwave-begin-block-reg 1 'nomark eos))
             (idlwave-end-of-statement)
           (message "No nested block before end of containing block."))))
@@ -2468,7 +2491,7 @@
         (here (point)))
     (goto-char (point-max))
     (if (re-search-backward idlwave-doclib-start nil t)
-        (progn
+        (progn 
 	  (setq beg (progn (beginning-of-line) (point)))
 	  (if (re-search-forward idlwave-doclib-end nil t)
 	      (progn
@@ -2502,7 +2525,7 @@
    ((eq major-mode 'idlwave-shell-mode)
     (if (re-search-backward idlwave-shell-prompt-pattern nil t)
 	(goto-char (match-end 0))))
-   (t
+   (t	
     (if (save-excursion (forward-line -1) (idlwave-is-continuation-line))
 	(idlwave-previous-statement)
       (beginning-of-line)))))
@@ -2579,7 +2602,7 @@
   (let ((save-point (point)))
     (when (re-search-forward ".*&" lim t)
       (goto-char (match-end 0))
-      (if (idlwave-quoted)
+      (if (idlwave-quoted) 
 	  (goto-char save-point)
 	(if (eq (char-after (- (point) 2)) ?&) (goto-char save-point))))
     (point)))
@@ -2596,7 +2619,7 @@
   ;; - not in parenthesis (like a[0:3])
   ;; - not followed by another ":" in explicit class, ala a->b::c
   ;; As many in this mode, this function is heuristic and not an exact
-  ;; parser.
+  ;; parser. 
   (let* ((start (point))
 	 (eos (save-excursion (idlwave-end-of-statement) (point)))
 	 (end (idlwave-find-key ":" 1 'nomark eos)))
@@ -2665,7 +2688,7 @@
       (if st
           (append st (match-end 0))))))
 
-(defun idlwave-expand-equal (&optional before after)
+(defun idlwave-expand-equal (&optional before after is-action)
   "Pad '=' with spaces.  Two cases: Assignment statement, and keyword
 assignment.  Which case is determined using
 `idlwave-start-of-substatement' and `idlwave-statement-type'.  The
@@ -2673,7 +2696,7 @@
 `idlwave-pad-keyword' is t then keyword assignment is treated just
 like assignment statements.  When nil, spaces are removed for keyword
 assignment.  Any other value keeps the current space around the `='.
-Limits in for loops are treated as keyword assignment.
+Limits in for loops are treated as keyword assignment.  
 
 Starting with IDL 6.0, a number of op= assignments are available.
 Since ambiguities of the form:
@@ -2686,29 +2709,31 @@
 \(not just for padding, but for proper parsing by IDL too!).  Other
 operators, such as ##=, ^=, etc., will be pre-padded.
 
+IS-ACTION is ignored.
+
 See `idlwave-surround'."
   (if idlwave-surround-by-blank
-      (let
+      (let 
 	  ((non-an-ops "\\(##\\|\\*\\|\\+\\|-\\|/\\|<\\|>\\|\\^\\)\\=")
-	   (an-ops
+	   (an-ops 
 	    "\\s-\\(AND\\|EQ\\|GE\\|GT\\|LE\\|LT\\|MOD\\|NE\\|OR\\|XOR\\)\\=")
 	   (len 1))
-
-	(save-excursion
+	
+	(save-excursion 
 	  (let ((case-fold-search t))
 	    (backward-char)
-	    (if (or
+	    (if (or 
 		 (re-search-backward non-an-ops nil t)
 		 ;; Why doesn't ##? work for both?
-		 (re-search-backward "\\(#\\)\\=" nil t))
+		 (re-search-backward "\\(#\\)\\=" nil t)) 
 		(setq len (1+ (length (match-string 1))))
 	      (when (re-search-backward an-ops nil t)
 		;(setq begin nil) ; won't modify begin
 		(setq len (1+ (length (match-string 1))))))))
-
-	(if (eq t idlwave-pad-keyword)
+	
+	(if (eq t idlwave-pad-keyword)  
 	    ;; Everything gets padded equally
-	    (idlwave-surround before after nil len)
+	    (idlwave-surround before after len)
 	  ;; Treating keywords/for variables specially...
 	  (let ((st (save-excursion   ; To catch "for" variables
 		      (idlwave-start-of-substatement t)
@@ -2717,22 +2742,22 @@
 			(skip-chars-backward "= \t")
 			(nth 2 (idlwave-where)))))
 	    (cond ((or (memq what '(function-keyword procedure-keyword))
-		       (memq (caar st) '(for pdef)))
-		   (cond
+		       (memq (caar st) '(for pdef))) 
+		   (cond 
 		    ((null idlwave-pad-keyword)
 		     (idlwave-surround 0 0)
 		     ) ; remove space
 		    (t))) ; leave any spaces alone
-		  (t (idlwave-surround before after nil len))))))))
-
+		  (t (idlwave-surround before after len))))))))
+	      
 
 (defun idlwave-indent-and-action (&optional arg)
   "Call `idlwave-indent-line' and do expand actions.
 With prefix ARG non-nil, indent the entire sub-statement."
   (interactive "p")
   (save-excursion
-    (if	(and idlwave-expand-generic-end
-	     (re-search-backward "\\<\\(end\\)\\s-*\\="
+    (if	(and idlwave-expand-generic-end 
+	     (re-search-backward "\\<\\(end\\)\\s-*\\=" 
 				 (max 0 (- (point) 10)) t)
 	     (looking-at "\\(end\\)\\([ \n\t]\\|\\'\\)"))
 	(progn (goto-char (match-end 1))
@@ -2742,7 +2767,7 @@
   (when (and (not arg) current-prefix-arg)
     (setq arg current-prefix-arg)
     (setq current-prefix-arg nil))
-  (if arg
+  (if arg 
       (idlwave-indent-statement)
     (idlwave-indent-line t)))
 
@@ -2804,18 +2829,20 @@
     (set-marker mloc nil)))
 
 (defun idlwave-do-action (action)
-  "Perform an action repeatedly on a line.
-ACTION is a list (REG . FUNC).  REG is a regular expression.  FUNC is
-either a function name to be called with `funcall' or a list to be
-evaluated with `eval'.  The action performed by FUNC should leave point
-after the match for REG - otherwise an infinite loop may be entered."
+  "Perform an action repeatedly on a line.  ACTION is a list (REG
+. FUNC).  REG is a regular expression.  FUNC is either a function name
+to be called with `funcall' or a list to be evaluated with `eval'.
+The action performed by FUNC should leave point after the match for
+REG - otherwise an infinite loop may be entered.  FUNC is always
+passed a final argument of 'is-action, so it can discriminate between
+being run as an action, or a key binding"
   (let ((action-key (car action))
         (action-routine (cdr action)))
     (beginning-of-line)
     (while (idlwave-look-at action-key)
       (if (listp action-routine)
-          (eval action-routine)
-        (funcall action-routine)))))
+          (eval (append action-routine '('is-action)))
+        (funcall action-routine 'is-action)))))
 
 (defun idlwave-indent-to (col &optional min)
   "Indent from point with spaces until column COL.
@@ -2875,7 +2902,7 @@
 		(save-excursion
 		  (cond
 		   ;; Beginning of file
-		   ((prog1
+		   ((prog1 
 			(idlwave-previous-statement)
 		      (setq beg-prev-pos (point)))
 		    0)
@@ -2885,7 +2912,7 @@
 		       idlwave-main-block-indent))
 		   ;; Begin block
 		   ((idlwave-look-at idlwave-begin-block-reg t)
-		    (+ (idlwave-min-current-statement-indent)
+		    (+ (idlwave-min-current-statement-indent) 
 		       idlwave-block-indent))
 		   ;; End Block
 		   ((idlwave-look-at idlwave-end-block-reg t)
@@ -2896,7 +2923,7 @@
 		      (idlwave-min-current-statement-indent)))
 		      ;;		      idlwave-end-offset
 		      ;;		      idlwave-block-indent))
-
+		   
 		   ;; Default to current indent
 		   ((idlwave-current-statement-indent))))))
           ;; adjust the indentation based on the current statement
@@ -2912,7 +2939,7 @@
 
 (defun idlwave-calculate-paren-indent (beg-reg end-reg close-exp)
   "Calculate the continuation indent inside a paren group.
-Returns a cons-cell with (open . indent), where open is the
+Returns a cons-cell with (open . indent), where open is the 
 location of the open paren"
   (let ((open (nth 1 (parse-partial-sexp beg-reg end-reg))))
     ;; Found an innermost open paren.
@@ -2953,24 +2980,24 @@
            (end-reg (progn (beginning-of-line) (point)))
 	   (beg-last-statement (save-excursion (idlwave-previous-statement)
 					       (point)))
-           (beg-reg (progn (idlwave-start-of-substatement 'pre)
+           (beg-reg (progn (idlwave-start-of-substatement 'pre) 
 			   (if (eq (line-beginning-position) end-reg)
 			       (goto-char beg-last-statement)
 			     (point))))
 	   (basic-indent (+ (idlwave-min-current-statement-indent end-reg)
 			    idlwave-continuation-indent))
 	   fancy-nonparen-indent fancy-paren-indent)
-      (cond
+      (cond 
        ;; Align then with its matching if, etc.
        ((let ((matchers '(("\\<if\\>" . "[ \t]*then")
 			  ("\\<\\(if\\|end\\(if\\)?\\)\\>" . "[ \t]*else")
 			  ("\\<\\(for\\|while\\)\\>" . "[ \t]*do")
-			  ("\\<\\(repeat\\|end\\(rep\\)?\\)\\>" .
+			  ("\\<\\(repeat\\|end\\(rep\\)?\\)\\>" . 
 			   "[ \t]*until")
 			  ("\\<case\\>" . "[ \t]*of")))
 	      match cont-re)
 	  (goto-char end-reg)
-	  (and
+	  (and 
 	   (setq cont-re
 		 (catch 'exit
 		   (while (setq match (car matchers))
@@ -2979,7 +3006,7 @@
 		     (setq matchers (cdr matchers)))))
 	   (idlwave-find-key cont-re -1 'nomark beg-last-statement)))
 	(if (looking-at "end") ;; that one's special
-	    (- (idlwave-current-indent)
+	    (- (idlwave-current-indent) 
 	       (+ idlwave-block-indent idlwave-end-offset))
 	  (idlwave-current-indent)))
 
@@ -3005,7 +3032,7 @@
 	      (let* ((end-reg end-reg)
 		    (close-exp (progn
 				 (goto-char end-reg)
-				 (skip-chars-forward " \t")
+				 (skip-chars-forward " \t") 
 				 (looking-at "\\s)")))
 		    indent-cons)
 		(catch 'loop
@@ -3039,12 +3066,12 @@
 		   (if (save-match-data (looking-at "[ \t$]*\\(;.*\\)?$"))
 		       nil
 		     (current-column)))
-
+		  
 		  ;; Continued assignment (with =):
 		  ((catch 'assign ;
 		     (while (looking-at "[^=\n\r]*\\(=\\)[ \t]*")
 		       (goto-char (match-end 0))
-		       (if (null (idlwave-what-function beg-reg))
+		       (if (null (idlwave-what-function beg-reg)) 
 			   (throw 'assign t))))
 		   (unless (or
 			    (idlwave-in-quote)
@@ -3106,7 +3133,7 @@
   (let* ((here (point))
          (case-fold-search t)
          (limit (if (>= dir 0) (point-max) (point-min)))
-         (block-limit (if (>= dir 0)
+         (block-limit (if (>= dir 0) 
 			  idlwave-begin-block-reg
 			idlwave-end-block-reg))
          found
@@ -3117,7 +3144,7 @@
 			       (idlwave-find-key
 				idlwave-begin-unit-reg dir t limit)
 			     (end-of-line)
-			     (idlwave-find-key
+			     (idlwave-find-key 
 			      idlwave-end-unit-reg dir t limit)))
 			 limit)))
     (if (>= dir 0) (end-of-line)) ;Make sure we are in current block
@@ -3142,7 +3169,7 @@
 		  (or (null end-reg) (< (point) end-reg)))
 	(unless comm-or-empty (setq min (min min (idlwave-current-indent)))))
       (if (or comm-or-empty (and end-reg (>= (point) end-reg)))
-	  min
+	  min 
 	(min min (idlwave-current-indent))))))
 
 (defun idlwave-current-statement-indent (&optional last-line)
@@ -3168,10 +3195,10 @@
 Blank or comment-only lines following regular continuation lines (with
 `$') count as continuations too."
   (save-excursion
-    (or
+    (or 
      (idlwave-look-at "\\<\\$")
      (catch 'loop
-       (while (and (looking-at "^[ \t]*\\(;.*\\)?$")
+       (while (and (looking-at "^[ \t]*\\(;.*\\)?$") 
 		   (eq (forward-line -1) 0))
 	 (if (idlwave-look-at "\\<\\$") (throw 'loop t)))))))
 
@@ -3269,7 +3296,7 @@
                                           (beginning-of-line) (point))
                                         (point))))
                "[^;]"))
-
+	
         ;; Mark the beginning and end of the paragraph
         (goto-char bcl)
         (while (and (looking-at fill-prefix-reg)
@@ -3333,7 +3360,7 @@
                       (insert (make-string diff ?\ ))))
                 (forward-line -1))
               )
-
+	  
           ;; No hang. Instead find minimum indentation of paragraph
           ;; after first line.
           ;; For the following while statement, since START is at the
@@ -3365,7 +3392,7 @@
                   t)
                  (current-column))
                indent))
-
+	
         ;; try to keep point at its original place
         (goto-char here)
 
@@ -3414,7 +3441,7 @@
           (current-column)))))
 
 (defun idlwave-auto-fill ()
-  "Called to break lines in auto fill mode.
+  "Called to break lines in auto fill mode.  
 Only fills non-comment lines if `idlwave-fill-comment-line-only' is
 non-nil.  Places a continuation character at the end of the line if
 not in a comment.  Splits strings with IDL concatenation operator `+'
@@ -3565,7 +3592,7 @@
   (insert (current-time-string))
   (insert ", " (user-full-name))
   (if (boundp 'user-mail-address)
-      (insert " <" user-mail-address ">")
+      (insert " <" user-mail-address ">") 
     (insert " <" (user-login-name) "@" (system-name) ">"))
   ;; Remove extra spaces from line
   (idlwave-fill-paragraph)
@@ -3591,7 +3618,7 @@
 	     (setq end (match-end 0)))
 	(progn
 	  (goto-char beg)
-	  (if (re-search-forward
+	  (if (re-search-forward 
 	       (concat idlwave-doc-modifications-keyword ":")
 	       end t)
 	      (end-of-line)
@@ -3689,7 +3716,7 @@
      (not (idlwave-in-quote))
      (save-excursion
        (forward-char)
-       (re-search-backward (concat "\\(" idlwave-idl-keywords
+       (re-search-backward (concat "\\(" idlwave-idl-keywords 
 				   "\\|[[(*+-/=,^><]\\)\\s-*\\*") limit t)))))
 
 
@@ -3735,7 +3762,7 @@
 	  (indent-region beg end nil))
       (if (stringp prompt)
 	  (message prompt)))))
-
+  
 (defun idlwave-rw-case (string)
   "Make STRING have the case required by `idlwave-reserved-word-upcase'."
   (if idlwave-reserved-word-upcase
@@ -3753,7 +3780,7 @@
 (defun idlwave-case ()
   "Build skeleton IDL case statement."
   (interactive)
-  (idlwave-template
+  (idlwave-template 
    (idlwave-rw-case "case")
    (idlwave-rw-case " of\n\nendcase")
    "Selector expression"))
@@ -3761,7 +3788,7 @@
 (defun idlwave-switch ()
   "Build skeleton IDL switch statement."
   (interactive)
-  (idlwave-template
+  (idlwave-template 
    (idlwave-rw-case "switch")
    (idlwave-rw-case " of\n\nendswitch")
    "Selector expression"))
@@ -3769,7 +3796,7 @@
 (defun idlwave-for ()
   "Build skeleton for loop statment."
   (interactive)
-  (idlwave-template
+  (idlwave-template 
    (idlwave-rw-case "for")
    (idlwave-rw-case " do begin\n\nendfor")
    "Loop expression"))
@@ -3784,14 +3811,14 @@
 
 (defun idlwave-procedure ()
   (interactive)
-  (idlwave-template
+  (idlwave-template 
    (idlwave-rw-case "pro")
    (idlwave-rw-case "\n\nreturn\nend")
    "Procedure name"))
 
 (defun idlwave-function ()
   (interactive)
-  (idlwave-template
+  (idlwave-template 
    (idlwave-rw-case "function")
    (idlwave-rw-case "\n\nreturn\nend")
    "Function name"))
@@ -3805,7 +3832,7 @@
 
 (defun idlwave-while ()
   (interactive)
-  (idlwave-template
+  (idlwave-template 
    (idlwave-rw-case "while")
    (idlwave-rw-case " do begin\n\nendwhile")
    "Entry condition"))
@@ -3884,8 +3911,8 @@
 (defun idlwave-count-outlawed-buffers (tag)
   "How many outlawed buffers have tag TAG?"
   (length (delq nil
-		(mapcar
-		 (lambda (x) (eq (cdr x) tag))
+		(mapcar 
+		 (lambda (x) (eq (cdr x) tag)) 
 		 idlwave-outlawed-buffers))))
 
 (defun idlwave-do-kill-autoloaded-buffers (&rest reasons)
@@ -3899,9 +3926,9 @@
 		   (memq (cdr entry) reasons))
 	       (kill-buffer (car entry))
 	       (incf cnt)
-	       (setq idlwave-outlawed-buffers
+	       (setq idlwave-outlawed-buffers 
 		     (delq entry idlwave-outlawed-buffers)))
-	(setq idlwave-outlawed-buffers
+	(setq idlwave-outlawed-buffers 
 	      (delq entry idlwave-outlawed-buffers))))
     (message "%d buffer%s killed" cnt (if (= cnt 1) "" "s"))))
 
@@ -3913,7 +3940,7 @@
 	 (entry (assq buf idlwave-outlawed-buffers)))
     ;; Revoke license
     (if entry
-	(setq idlwave-outlawed-buffers
+	(setq idlwave-outlawed-buffers 
 	      (delq entry idlwave-outlawed-buffers)))
     ;; Remove this function from the hook.
     (remove-hook 'after-save-hook 'idlwave-revoke-license-to-kill 'local)))
@@ -3932,7 +3959,7 @@
 (defun idlwave-expand-lib-file-name (file)
   ;; Find FILE on the scanned lib path and return a buffer visiting it
   ;; This is for, e.g., finding source with no user catalog
-  (cond
+  (cond 
    ((null file) nil)
    ((file-name-absolute-p file) file)
    (t (idlwave-locate-lib-file file))))
@@ -3947,7 +3974,7 @@
   (interactive)
   (let (directory directories cmd append status numdirs dir getsubdirs
 		  buffer save_buffer files numfiles item errbuf)
-
+    
     ;;
     ;; Read list of directories
     (setq directory (read-string "Tag Directories: " "."))
@@ -3999,7 +4026,7 @@
 		    (message "%s" (concat "Tagging " item "..."))
 		    (setq errbuf (get-buffer-create "*idltags-error*"))
 		    (setq status (+ status
-				    (if (eq 0 (call-process
+				    (if (eq 0 (call-process 
 					       "sh" nil errbuf nil "-c"
 					       (concat cmd append item)))
 					0
@@ -4013,13 +4040,13 @@
 		  (setq numfiles (1+ numfiles))
 		  (setq item (nth numfiles files))
 		  )))
-
+	    
 	    (setq numdirs (1+ numdirs))
 	    (setq dir (nth numdirs directories)))
 	(progn
 	  (setq numdirs (1+ numdirs))
 	  (setq dir (nth numdirs directories)))))
-
+    
     (setq errbuf (get-buffer-create "*idltags-error*"))
     (if (= status 0)
 	(kill-buffer errbuf))
@@ -4095,7 +4122,7 @@
   ;; Make sure the hash functions are accessible.
   (if (or (not (fboundp 'gethash))
 	  (not (fboundp 'puthash)))
-      (progn
+      (progn 
 	(require 'cl)
 	(or (fboundp 'puthash)
 	    (defalias 'puthash 'cl-puthash))))
@@ -4109,22 +4136,22 @@
       for var = (car entry)
       do (if (not (consp (symbol-value var))) (set var (list nil))))
 
+    ;; Reset the system & library hash
     (when (or (eq what t) (eq what 'syslib)
 	      (null (cdr idlwave-sint-routines)))
-      ;; Reset the system & library hash
       (loop for entry in entries
 	for var = (car entry) for size = (nth 1 entry)
-	do (setcdr (symbol-value var)
+	do (setcdr (symbol-value var) 
 		   (make-hash-table ':size size ':test 'equal)))
       (setq idlwave-sint-dirs nil
 	    idlwave-sint-libnames nil))
 
+    ;; Reset the buffer & shell hash
     (when (or (eq what t) (eq what 'bufsh)
 	      (null (car idlwave-sint-routines)))
-      ;; Reset the buffer & shell hash
       (loop for entry in entries
 	for var = (car entry) for size = (nth 1 entry)
-	do (setcar (symbol-value var)
+	do (setcar (symbol-value var) 
 		   (make-hash-table ':size size ':test 'equal))))))
 
 (defun idlwave-sintern-routine-or-method (name &optional class set)
@@ -4211,11 +4238,11 @@
 	    (setq class (idlwave-sintern-class class set))
 	    (setq name (idlwave-sintern-method name set)))
 	(setq name (idlwave-sintern-routine name set)))
-
+      
       ;; The source
       (let ((source-type (car source))
 	    (source-file  (nth 1 source))
-	    (source-dir  (if default-dir
+	    (source-dir  (if default-dir  
 			     (file-name-as-directory default-dir)
 			   (nth 2 source)))
 	    (source-lib (nth 3 source)))
@@ -4224,7 +4251,7 @@
 	(if (stringp source-lib)
 	    (setq source-lib (idlwave-sintern-libname source-lib set)))
 	(setq source (list source-type source-file source-dir source-lib)))
-
+      
       ;; The keywords
       (setq kwds (mapcar (lambda (x)
 			   (idlwave-sintern-keyword-list x set))
@@ -4364,10 +4391,10 @@
 		     "-l" (expand-file-name "~/.emacs")
 		     "-l" "idlwave"
 		     "-f" "idlwave-rescan-catalog-directories"))
-	 (process (apply 'start-process "idlcat"
+	 (process (apply 'start-process "idlcat" 
 			 nil emacs args)))
     (setq idlwave-catalog-process process)
-    (set-process-sentinel
+    (set-process-sentinel 
      process
      (lambda (pro why)
        (when (string-match "finished" why)
@@ -4384,7 +4411,8 @@
 ;; ("ROUTINE" type class
 ;;  (system) | (lib pro_file dir "LIBNAME") | (user pro_file dir "USERLIB") |
 ;;  (buffer pro_file dir) | (compiled pro_file dir)
-;;   "calling_string" ("HELPFILE" (("KWD1" . link1) ...)))
+;;   "calling_string" ("HELPFILE" (("KWD1" . link1) ...)) 
+;;                    ("HELPFILE2" (("KWD2" . link) ...)) ...)
 ;;
 ;; DIR will be supplied dynamically while loading library catalogs,
 ;; and is sinterned to save space, as is LIBNAME.  PRO_FILE can be a
@@ -4442,7 +4470,7 @@
 	   ;; The override-idle means, even if the idle timer has done some
 	   ;; preparing work, load and renormalize everything anyway.
 	   (override-idle (or arg idlwave-buffer-case-takes-precedence)))
-
+      
       (setq idlwave-buffer-routines nil
 	    idlwave-compiled-routines nil
 	    idlwave-unresolved-routines nil)
@@ -4453,14 +4481,14 @@
 	(idlwave-reset-sintern (cond (load t)
 				     ((null idlwave-system-routines) t)
 				     (t 'bufsh))))
-
+      
       (if idlwave-buffer-case-takes-precedence
 	  ;; We can safely scan the buffer stuff first
 	  (progn
 	    (idlwave-update-buffer-routine-info)
-	    (and load (idlwave-load-system-rinfo override-idle)))
+	    (and load (idlwave-load-all-rinfo override-idle)))
 	;; We first do the system info, and then the buffers
-	(and load (idlwave-load-system-rinfo override-idle))
+	(and load (idlwave-load-all-rinfo override-idle))
 	(idlwave-update-buffer-routine-info))
 
       ;; Let's see if there is a shell
@@ -4468,9 +4496,9 @@
 				    (idlwave-shell-is-running)))
 	     (ask-shell (and shell-is-running
 			     idlwave-query-shell-for-routine-info)))
-
+      
 	;; Load the library catalogs again, first re-scanning the path
-	(when arg
+	(when arg 
 	  (if shell-is-running
 	      (idlwave-shell-send-command idlwave-shell-path-query
 					  '(progn
@@ -4490,7 +4518,7 @@
 	    ;;    Therefore, we do a concatenation now, even though
 	    ;;    the shell might do it again.
 	    (idlwave-concatenate-rinfo-lists nil 'run-hooks))
-
+      
 	(when ask-shell
 	  ;; Ask the shell about the routines it knows of.
 	  (message "Querying the shell")
@@ -4521,16 +4549,433 @@
 
 (defvar idlwave-library-routines nil "Obsolete variable.")
 
+;;------ XML Help routine info system
+(defun idlwave-load-system-routine-info ()
+  ;; Load the system routine info from the cached routine info file,
+  ;; which, if necessary, will be re-created from the XML file on
+  ;; disk.  As a last fallback, load the (likely outdated) idlw-rinfo
+  ;; file distributed with older IDLWAVE versions (<6.0)
+  (unless (and (load idlwave-xml-system-rinfo-converted-file 
+		     'noerror 'nomessage)
+	       (idlwave-xml-system-routine-info-up-to-date))
+    ;; See if we can create it from XML source
+    (condition-case nil
+	(idlwave-convert-xml-system-routine-info)
+      (error 
+       (unless (load idlwave-xml-system-rinfo-converted-file 
+		     'noerror 'nomessage)
+	 (if idlwave-system-routines
+	     (message 
+	      "Failed to load converted routine info, using old conversion.")
+	   (message 
+	    "Failed to convert XML routine info, falling back on idlw-rinfo.")
+	   (if (not (load "idlw-rinfo" 'noerror 'nomessage))
+	       (message 
+		"Could not locate any system routine information."))))))))
+
+(defun idlwave-xml-system-routine-info-up-to-date()
+  (let* ((dir (file-name-as-directory 
+	       (expand-file-name "help/online_help" (idlwave-sys-dir))))
+	 (catalog-file (expand-file-name "idl_catalog.xml" dir)))
+    (file-newer-than-file-p ;converted file is newer than catalog
+     idlwave-xml-system-rinfo-converted-file
+     catalog-file)))
+
+(defvar idlwave-system-class-info nil) ; Gathered from idlw-rinfo
+(defvar idlwave-system-variables-alist nil
+  "Alist of system variables and the associated structure tags.
+Gets set in cached XML rinfo, or `idlw-rinfo.el'.")
+(defvar idlwave-executive-commands-alist nil
+  "Alist of system variables and their help files.")
+(defvar idlwave-help-special-topic-words nil)
+
+		
+(defun idlwave-shorten-syntax (syntax name &optional class)
+  ;; From a list of syntax statments, shorten with %s and group with "or"
+  (let ((case-fold-search t))
+    (mapconcat 
+     (lambda (x)
+       (while (string-match name x)
+	 (setq x (replace-match "%s" t t x)))
+       (if class 
+	   (while (string-match class x)
+	     (setq x (replace-match "%s" t t x))))
+       x)
+     (nreverse syntax)
+     " or ")))
+
+(defun idlwave-xml-create-class-method-lists (xml-entry)
+  ;; Create a class list entry from the xml parsed list., returning a
+  ;; cons of form (class-entry method-entries).
+  (let* ((nameblock (nth 1 xml-entry))
+	 (class (cdr (assq 'name nameblock)))
+	 (link (cdr (assq 'link nameblock)))
+	 (params (cddr xml-entry))
+	 (case-fold-search t)
+	 class-entry
+	 method methods-entry extra-kwds
+	 props get-props set-props init-props inherits
+	 pelem ptype)
+    (while params
+      (setq pelem (car params))
+      (when (listp pelem)
+	(setq ptype (car pelem)
+	      props (car (cdr pelem)))
+	(cond
+	 ((eq ptype 'SUPERCLASS)
+	  (push (cdr (assq 'name props)) inherits))
+
+	 ((eq ptype 'PROPERTY)
+	  (let ((pname (cdr (assq 'name props)))
+		(plink (cdr (assq 'link props)))
+		(get (string= (cdr (assq 'get props)) "Yes"))
+		(set (string= (cdr (assq 'set props)) "Yes"))
+		(init (string= (cdr (assq 'init props)) "Yes")))
+	    (if get (push (list pname plink) get-props))
+	    (if set (push (list pname plink) set-props))
+	    (if init (push (list pname plink) init-props))))
+
+	 ((eq ptype 'METHOD)
+	  (setq method (cdr (assq 'name props)))
+	  (setq extra-kwds ;;Assume all property keywords are gathered already
+		(cond
+		 ((string-match (concat class "::Init") method)
+		  (put 'init-props 'matched t)
+		  init-props)
+		 ((string-match (concat class "::GetProperty") method)
+		  (put 'get-props 'matched t)
+		  get-props)
+		 ((string-match (concat class "::SetProperty") method)
+		  (put 'set-props 'matched t)
+		  set-props)
+		 (t nil)))
+	  (setq methods-entry 
+		(nconc (idlwave-xml-create-rinfo-list pelem class extra-kwds) 
+		       methods-entry)))
+	 (t)))
+      (setq params (cdr params)))
+    ;(unless (get 'init-props 'matched)
+    ;  (message "Failed to match Init in class %s" class))
+    ;(unless (get 'get-props 'matched)
+    ;  (message "Failed to match GetProperty in class %s" class))
+    ;(unless (get 'set-props 'matched)
+    ;  (message "Failed to match SetProperty in class %s" class))
+    (setq class-entry 
+	  (if inherits 
+	      (list class (append '(inherits) inherits) (list 'link link))
+	    (list class (list 'link link))))
+    (cons class-entry methods-entry)))
+    
+(defun idlwave-xml-create-rinfo-list (xml-entry &optional class extra-kws)
+  ;; Create correctly structured list elements from ROUTINE or METHOD
+  ;; XML list structures.  Return a list of list elements, with more
+  ;; than one sub-list possible if a routine can serve as both
+  ;; procedure and function (e.g. call_method).
+  (let* ((nameblock (nth 1 xml-entry))
+	 (name (cdr (assq 'name nameblock)))
+	 (link (cdr (assq 'link nameblock)))
+	 (params (cddr xml-entry))
+	 (syntax-vec (make-vector 3 nil)) ; procedure, function, exec command
+	 (case-fold-search t)
+	 syntax kwd klink pref-list kwds pelem ptype entry props result type)
+    (if class ;; strip out class name from class method name string
+	(if (string-match (concat class "::") name)
+	    (setq name (substring name (match-end 0)))))
+    (while params
+      (setq pelem (car params))
+      (when (listp pelem)
+	(setq ptype (car pelem)
+	      props (car (cdr pelem)))
+	(cond
+	 ((eq ptype 'SYNTAX)
+	  (setq syntax (cdr (assq 'name props)))
+	  (if (string-match "-&gt;" syntax)
+	      (setq syntax (replace-match "->" t nil syntax)))
+	  (setq type (cdr (assq 'type props)))
+	  (push syntax
+		(aref syntax-vec (cond
+				  ((string-match "^pro" type) 0)
+				  ((string-match "^fun" type) 1)
+				  ((string-match "^exec" type) 2)))))
+	 ((eq ptype 'KEYWORD)
+	  (setq kwd (cdr (assq 'name props))
+		klink (cdr (assq 'link props)))
+	  (if (string-match "^\\[XY\\(Z?\\)\\]" kwd)
+	      (progn 
+		(setq pref-list 
+		      (if (match-string 1 kwd) '("X" "Y" "Z") '("X" "Y"))
+		      kwd (substring kwd (match-end 0)))
+		(loop for x in pref-list do
+		      (push (list (concat x kwd) klink) kwds)))
+	    (push (list kwd klink) kwds)))
+
+	 (t))); Do nothing for the others
+      (setq params (cdr params)))
+    
+    ;; Debug
+;    (if (and (null (aref syntax-vec 0))
+;	     (null (aref syntax-vec 1))
+;	     (null (aref syntax-vec 2)))
+;	(with-current-buffer (get-buffer-create "IDL_XML_catalog_complaints")
+;	  (if class
+;	      (insert (format "Missing SYNTAX entry for %s::%s\n" class name))
+;	    (insert (message "Missing SYNTAX entry for %s\n" name)))))
+
+    ;; Executive commands are treated specially
+    (if (aref syntax-vec 2)
+	(cons (substring name 1) link)
+      (if extra-kws (setq kwds (nconc kwds extra-kws)))
+      (setq kwds (idlwave-rinfo-group-keywords kwds link))
+      (loop for idx from 0 to 1 do
+	    (if (aref syntax-vec idx)
+		(push (append (list name (if (eq idx 0) 'pro 'fun) 
+				    class '(system)
+				    (idlwave-shorten-syntax 
+				     (aref syntax-vec idx) name class))
+			      kwds) result)))
+      result)))
+
+
+(defun idlwave-rinfo-group-keywords (kwds master-link)
+  ;; Group keywords by link file, as a list with elements 
+  ;; (linkfile ( ("KWD1" . link1) ("KWD2" . link2))
+  (let (kwd link anchor linkfiles block master-elt)
+    (while kwds
+      (setq kwd (car kwds)
+	    link (idlwave-split-link-target (nth 1 kwd))
+	    anchor (cdr link)
+	    link (car link)
+	    kwd (car kwd))
+      (if (setq block (assoc link linkfiles))
+	  (push (cons kwd anchor) (cdr block))
+	(push (list link (cons kwd anchor)) linkfiles))
+      (setq kwds (cdr kwds)))
+    ;; Ensure the master link is there
+    (if (setq master-elt (assoc master-link linkfiles))
+	(if (eq (car linkfiles) master-elt)
+	    linkfiles
+ 	  (cons master-elt (delq master-elt linkfiles)))
+      (push (list master-link) linkfiles))))
+      
+(defun idlwave-convert-xml-clean-statement-aliases (aliases)
+  ;; Clean up the syntax of routines which are actually aliases by
+  ;; removing the "OR" from the statements
+  (let (syntax entry)
+    (loop for x in aliases do
+	  (setq entry (assoc x idlwave-system-routines))
+	  (when entry
+	    (while (string-match " +or +" (setq syntax (nth 4 entry)))
+	      (setf (nth 4 entry) (replace-match ", " t t syntax)))))))
+
+(defun idlwave-convert-xml-clean-routine-aliases (aliases)
+  ;; Duplicate and trim original routine aliases from rinfo list
+  ;; This if for, e.g. OPENR/OPENW/OPENU 
+  (let (alias remove-list new parts all-parts)
+    (loop for x in aliases do
+	  (when (setq parts (split-string (cdr x) "/"))
+	    (setq new (assoc (cdr x) all-parts))
+	    (unless new
+	      (setq new (cons (cdr x) parts))
+	      (push new all-parts))
+	    (setcdr new (delete (car x) (cdr new)))))
+    
+    ;; Add any missing aliases (separate by slashes)
+    (loop for x in all-parts do
+	  (if (cdr x)
+	      (push (cons (nth 1 x) (car x)) aliases)))
+
+    (loop for x in aliases do
+	  (when (setq alias (assoc (cdr x) idlwave-system-routines))
+	    (unless (memq alias remove-list) (push alias remove-list))
+	    (setq alias (copy-sequence alias))
+	    (setcar alias (car x))
+	    (push alias idlwave-system-routines)))
+    (loop for x in remove-list do
+	  (delq x idlwave-system-routines))))
+
+(defun idlwave-convert-xml-clean-sysvar-aliases (aliases)
+  ;; Duplicate and trim original routine aliases from rinfo list
+  ;; This if for, e.g. !X, !Y, !Z.
+  (let (alias remove-list new parts all-parts)
+    (loop for x in aliases do
+	  (when (setq alias (assoc (cdr x) idlwave-system-variables-alist))
+	    (unless (memq alias remove-list) (push alias remove-list))
+	    (setq alias (copy-sequence alias))
+	    (setcar alias (car x))
+	    (push alias idlwave-system-variables-alist)))
+    (loop for x in remove-list do
+	  (delq x idlwave-system-variables-alist))))
+
+
+(defun idlwave-xml-create-sysvar-alist (xml-entry)
+  ;; Create a sysvar list entry from the xml parsed list.
+  (let* ((nameblock (nth 1 xml-entry))
+	 (sysvar (substring (cdr (assq 'name nameblock)) 1))
+	 (link (cdr (assq 'link nameblock)))
+	 (params (cddr xml-entry))
+	 (case-fold-search t)
+	 pelem ptype props fields tags)
+    (while params
+      (setq pelem (car params))
+      (when (listp pelem)
+	(setq ptype (car pelem)
+	      props (car (cdr pelem)))
+	(cond
+	 ((eq ptype 'FIELD)
+	  (push (cons (cdr (assq 'name props)) 
+		      (cdr
+		       (idlwave-split-link-target (cdr (assq 'link props)))))
+		tags))))
+	(setq params (cdr params)))
+    (delq nil
+	  (list sysvar (if tags (cons 'tags tags)) (list 'link link)))))
+
+
+(defvar idlwave-xml-routine-info-file nil)
+
+(defun idlwave-save-routine-info ()
+  (if idlwave-xml-routine-info-file
+      (with-temp-file idlwave-xml-system-rinfo-converted-file
+	(insert 
+	 (concat ";; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+;; IDLWAVE Routine Information File (IDLWAVE version " idlwave-mode-version ") 
+;; Automatically generated from source file: 
+;;  " idlwave-xml-routine-info-file "
+;; on " (current-time-string) "
+;; Do not edit."))
+	(insert (format "\n(setq idlwave-xml-routine-info-file \n    \"%s\")"
+			idlwave-xml-routine-info-file))
+	(insert "\n(setq idlwave-system-routines\n    '")
+	(prin1 idlwave-system-routines (current-buffer))
+	(insert ")")
+	(insert "\n(setq idlwave-system-variables-alist\n    '")
+	(prin1 idlwave-system-variables-alist (current-buffer))
+	(insert ")")
+	(insert "\n(setq idlwave-system-class-info\n    '")
+	(prin1 idlwave-system-class-info (current-buffer))
+	(insert ")")
+	(insert "\n(setq idlwave-executive-commands-alist\n    '")
+	(prin1 idlwave-executive-commands-alist (current-buffer))
+	(insert ")")
+	(insert "\n(setq idlwave-help-special-topic-words\n    '")
+	(prin1 idlwave-help-special-topic-words (current-buffer))
+	(insert ")"))))
+
+(defun idlwave-convert-xml-system-routine-info ()
+  "Convert XML supplied IDL routine info into internal form.
+Cache to disk for quick recovery."
+  (interactive)
+  (let* ((dir (file-name-as-directory 
+	       (expand-file-name "help/online_help" (idlwave-sys-dir))))
+	 (catalog-file (expand-file-name "idl_catalog.xml" dir))
+	 (elem-cnt 0)
+	 props rinfo msg-cnt elem type nelem class-result alias 
+	 routines routine-aliases statement-aliases sysvar-aliases
+	 buf version-string)
+    (if (not (file-exists-p catalog-file))
+	(error "No such XML routine info file: %s" catalog-file)
+      (if (not (file-readable-p catalog-file))
+	  (error "Cannot read XML routine info file: %s" catalog-file)))
+    (require 'xml)
+    (message "Reading XML routine info...")   
+    (unwind-protect
+	(progn
+	  ;; avoid warnings about read-only files
+	  (setq buf (find-file-noselect catalog-file 'nowarn))
+	  (setq rinfo (xml-parse-file catalog-file)))
+      (if (bufferp buf) (kill-buffer buf)))
+    (message "Reading XML routine info...done")
+    (setq rinfo (assq 'CATALOG rinfo))
+    (unless rinfo (error "Failed to parse XML routine info"))
+    ;;(setq rinfo (car rinfo)) ; Skip the catalog stuff.
+    
+    (setq version-string (cdr (assq 'version (nth 1 rinfo)))
+	  rinfo (cddr rinfo))
+
+    (setq nelem (length rinfo)
+	  msg-cnt (/ nelem 20))
+    
+    (setq idlwave-xml-routine-info-file nil)
+    (message "Converting XML routine info...")
+    (setq idlwave-system-routines nil
+	  idlwave-system-variables-alist nil
+	  idlwave-system-class-info nil
+	  idlwave-executive-commands-alist nil
+	  idlwave-help-special-topic-words nil)
+
+    (while rinfo
+      (setq elem (car rinfo)
+	    rinfo (cdr rinfo))
+      (incf elem-cnt)
+      (when (listp elem)
+	(setq type (car elem)
+	      props (car (cdr elem)))
+	(if (= (mod elem-cnt msg-cnt) 0)
+	    (message "Converting XML routine info...%2d%%" 
+		     (/ (* elem-cnt 100) nelem)))
+	(cond 
+	 ((eq type 'ROUTINE)
+	  (if (setq alias (assq 'alias_to props))
+	      (push (cons (cdr (assq 'name props)) (cdr alias)) 
+		    routine-aliases)
+	    (setq routines (idlwave-xml-create-rinfo-list elem))
+	    (if (listp (cdr routines))
+		(setq idlwave-system-routines
+		      (nconc idlwave-system-routines routines))
+	      ;; a cons cell is an executive commands
+	      (push routines idlwave-executive-commands-alist))))
+	 
+	 ((eq type 'CLASS)
+	  (setq class-result (idlwave-xml-create-class-method-lists elem))
+	  (push (car class-result) idlwave-system-class-info)
+	  (setq idlwave-system-routines
+	  (nconc idlwave-system-routines (cdr class-result))))
+
+	 ((eq type 'STATEMENT)
+	  (push (cons (cdr (assq 'name props))
+		      (cdr (assq 'link props)))
+	  idlwave-help-special-topic-words)
+	  ;; Save the links to those which are statement aliases (not routines)
+	  (if (setq alias (assq 'alias_to props))
+	      (unless (member (cdr alias) statement-aliases)
+		(push (cdr alias) statement-aliases))))
+
+	 ((eq type 'SYSVAR)
+	  (if (setq alias (cdr (assq 'alias_to props)))
+	      (push (cons (substring (cdr (assq 'name props)) 1) 
+			  (substring alias 1))
+		    sysvar-aliases)
+	    (push (idlwave-xml-create-sysvar-alist elem) 
+		  idlwave-system-variables-alist)))
+	 (t))))
+    (idlwave-convert-xml-clean-routine-aliases routine-aliases)
+    (idlwave-convert-xml-clean-statement-aliases statement-aliases)
+    (idlwave-convert-xml-clean-sysvar-aliases sysvar-aliases)
+
+    (setq idlwave-xml-routine-info-file catalog-file)
+    (idlwave-save-routine-info)
+    (message "Converting XML routine info...done")))
+      
+    
+;; ("ROUTINE" type class
+;;  (system) | (lib pro_file dir "LIBNAME") | (user pro_file dir "USERLIB") |
+;;  (buffer pro_file dir) | (compiled pro_file dir)
+;;   "calling_string" ("HELPFILE" (("KWD1" . link1) ...)) 
+;;                    ("HELPFILE2" (("KWD2" . link) ...)) ...)
+
+
 (defun idlwave-load-rinfo-next-step ()
   (let ((inhibit-quit t)
 	(arr idlwave-load-rinfo-steps-done))
-    (when (catch 'exit
+    (if (catch 'exit
 	  (when (not (aref arr 0))
-	    (message "Loading idlw-rinfo.el in idle time...")
-	    (load "idlw-rinfo" 'noerror 'nomessage)
-	    (message "Loading idlw-rinfo.el in idle time...done")
+	    (message "Loading system routine info in idle time...")
+	    (idlwave-load-system-routine-info)
+	    ;;(load "idlw-rinfo" 'noerror 'nomessage)
+	    (message "Loading system routine info in idle time...done")
 	    (aset arr 0 t)
 	    (throw 'exit t))
+	  
 	  (when (not (aref arr 1))
 	    (message "Normalizing idlwave-system-routines in idle time...")
 	    (idlwave-reset-sintern t)
@@ -4540,6 +4985,7 @@
 	    (message "Normalizing idlwave-system-routines in idle time...done")
 	    (aset arr 1 t)
 	    (throw 'exit t))
+
 	  (when (not (aref arr 2))
 	    (when (and (stringp idlwave-user-catalog-file)
 		       (file-regular-p idlwave-user-catalog-file))
@@ -4554,23 +5000,25 @@
 		  (progn
 		    (setq idlwave-library-routines nil)
 		    (ding)
-		    (message "Outdated user catalog: %s... recreate"
+		    (message "Outdated user catalog: %s... recreate" 
 			     idlwave-user-catalog-file))
-		(message "Loading user catalog in idle time...done"))
-	      (aset arr 2 t)
-	      (throw 'exit t)))
+		(message "Loading user catalog in idle time...done")))
+	    (aset arr 2 t)
+	    (throw 'exit t))
+
 	  (when (not (aref arr 3))
 	    (when idlwave-user-catalog-routines
 	      (message "Normalizing user catalog routines in idle time...")
-	      (setq idlwave-user-catalog-routines
+	      (setq idlwave-user-catalog-routines 
 		    (idlwave-sintern-rinfo-list
 		     idlwave-user-catalog-routines 'sys))
-	      (message
+	      (message 
 	       "Normalizing user catalog routines in idle time...done"))
 	    (aset arr 3 t)
 	    (throw 'exit t))
+
 	  (when (not (aref arr 4))
-	    (idlwave-scan-library-catalogs
+	    (idlwave-scan-library-catalogs 
 	     "Loading and normalizing library catalogs in idle time...")
 	    (aset arr 4 t)
 	    (throw 'exit t))
@@ -4578,6 +5026,7 @@
 	    (message "Finishing initialization in idle time...")
 	    (idlwave-routines)
 	    (message "Finishing initialization in idle time...done")
+	    (aset arr 5 t)	    
 	    (throw 'exit nil)))
 	;; restart the timer
 	(if (sit-for 1)
@@ -4587,34 +5036,46 @@
 		 idlwave-init-rinfo-when-idle-after
 		 nil 'idlwave-load-rinfo-next-step))))))
 
-(defun idlwave-load-system-rinfo (&optional force)
-  ;; Load and case-treat the system and catalog files.
+(defun idlwave-load-all-rinfo (&optional force)
+  ;; Load and case-treat the system, user catalog, and library routine
+  ;; info files.
+
+  ;; System
   (when (or force (not (aref idlwave-load-rinfo-steps-done 0)))
-    (load "idlw-rinfo" 'noerror 'nomessage))
+    ;;(load "idlw-rinfo" 'noerror 'nomessage))
+    (idlwave-load-system-routine-info))
   (when (or force (not (aref idlwave-load-rinfo-steps-done 1)))
     (message "Normalizing idlwave-system-routines...")
     (setq idlwave-system-routines
 	  (idlwave-sintern-rinfo-list idlwave-system-routines 'sys))
     (message "Normalizing idlwave-system-routines...done"))
-  (setq idlwave-routines (copy-sequence idlwave-system-routines))
-  (setq idlwave-last-system-routine-info-cons-cell
-	(nthcdr (1- (length idlwave-routines)) idlwave-routines))
+  (when idlwave-system-routines
+    (setq idlwave-routines (copy-sequence idlwave-system-routines))
+    (setq idlwave-last-system-routine-info-cons-cell
+	  (nthcdr (1- (length idlwave-routines)) idlwave-routines)))
+
+  ;; User catalog
   (when (and (stringp idlwave-user-catalog-file)
 	     (file-regular-p idlwave-user-catalog-file))
     (condition-case nil
 	(when (or force (not (aref idlwave-load-rinfo-steps-done 2)))
 	  (load-file idlwave-user-catalog-file))
       (error nil))
-    (when (boundp 'idlwave-library-routines)
+    (when (and 
+	   (boundp 'idlwave-library-routines)
+	   idlwave-library-routines)
       (setq idlwave-library-routines nil)
-      (error "Outdated user catalog: %s... recreate" idlwave-user-catalog-file))
+      (error "Outdated user catalog: %s... recreate" 
+	     idlwave-user-catalog-file))
     (setq idlwave-true-path-alist nil)
     (when (or force (not (aref idlwave-load-rinfo-steps-done 3)))
       (message "Normalizing user catalog routines...")
-      (setq idlwave-user-catalog-routines
-	    (idlwave-sintern-rinfo-list
+      (setq idlwave-user-catalog-routines 
+	    (idlwave-sintern-rinfo-list 
 	     idlwave-user-catalog-routines 'sys))
       (message "Normalizing user catalog routines...done")))
+
+  ;; Library catalog
   (when (or force (not (aref idlwave-load-rinfo-steps-done 4)))
     (idlwave-scan-library-catalogs
      "Loading and normalizing library catalogs..."))
@@ -4623,11 +5084,11 @@
 
 (defun idlwave-update-buffer-routine-info ()
   (let (res)
-    (cond
+    (cond 
      ((eq idlwave-scan-all-buffers-for-routine-info t)
       ;; Scan all buffers, current buffer last
       (message "Scanning all buffers...")
-      (setq res (idlwave-get-routine-info-from-buffers
+      (setq res (idlwave-get-routine-info-from-buffers 
 		 (reverse (buffer-list)))))
      ((null idlwave-scan-all-buffers-for-routine-info)
       ;; Don't scan any buffers
@@ -4640,12 +5101,12 @@
 	    (setq res (idlwave-get-routine-info-from-buffers
 		       (list (current-buffer))))))))
     ;; Put the result into the correct variable
-    (setq idlwave-buffer-routines
+    (setq idlwave-buffer-routines 
 	  (idlwave-sintern-rinfo-list res 'set))))
 
 (defun idlwave-concatenate-rinfo-lists (&optional quiet run-hook)
   "Put the different sources for routine information together."
-  ;; The sequence here is important because earlier definitions shadow
+  ;; The sequence here is important because earlier definitions shadow 
   ;; later ones.  We assume that if things in the buffers are newer
   ;; then in the shell of the system, they are meant to be different.
   (setcdr idlwave-last-system-routine-info-cons-cell
@@ -4657,7 +5118,7 @@
 
   ;; Give a message with information about the number of routines we have.
   (unless quiet
-    (message
+    (message 
      "Routines Found: buffer(%d) compiled(%d) library(%d) user(%d) system(%d)"
      (length idlwave-buffer-routines)
      (length idlwave-compiled-routines)
@@ -4675,7 +5136,7 @@
 	  (when (and (setq class (nth 2 x))
 		     (not (assq class idlwave-class-alist)))
 	    (push (list class) idlwave-class-alist)))
-	idlwave-class-alist)))
+	idlwave-class-alist)))      
 
 ;; Three functions for the hooks
 (defun idlwave-save-buffer-update ()
@@ -4708,7 +5169,7 @@
 
 (defun idlwave-replace-buffer-routine-info (file new)
   "Cut the part from FILE out of `idlwave-buffer-routines' and add NEW."
-  (let ((list idlwave-buffer-routines)
+  (let ((list idlwave-buffer-routines) 
 	found)
     (while list
       ;; The following test uses eq to make sure it works correctly
@@ -4719,7 +5180,7 @@
 	    (setcar list nil)
 	    (setq found t))
 	(if found
-	    ;; End of that section reached. Jump.
+	    ;; End of that section reached. Jump. 
 	    (setq list nil)))
       (setq list (cdr list)))
     (setq idlwave-buffer-routines
@@ -4751,11 +5212,11 @@
       (save-restriction
 	(widen)
 	(goto-char (point-min))
-	(while (re-search-forward
+	(while (re-search-forward 
 		"^[ \t]*\\(pro\\|function\\)[ \t]" nil t)
 	  (setq string (buffer-substring-no-properties
 			(match-beginning 0)
-			(progn
+			(progn 
 			  (idlwave-end-of-statement)
 			  (point))))
 	  (setq entry (idlwave-parse-definition string))
@@ -4793,7 +5254,7 @@
 	(push (match-string 1 string) args)))
     ;; Normalize and sort.
     (setq args (nreverse args))
-    (setq keywords (sort keywords (lambda (a b)
+    (setq keywords (sort keywords (lambda (a b) 
 				    (string< (downcase a) (downcase b)))))
     ;; Make and return the entry
     ;; We don't know which argument are optional, so this information
@@ -4803,7 +5264,7 @@
 	  class
 	  (cond ((not (boundp 'idlwave-scanning-lib))
 		 (list  'buffer (buffer-file-name)))
-;		((string= (downcase
+;		((string= (downcase 
 ;			   (file-name-sans-extension
 ;			    (file-name-nondirectory (buffer-file-name))))
 ;			  (downcase name))
@@ -4811,7 +5272,7 @@
 ;		(t (cons 'lib (file-name-nondirectory (buffer-file-name))))
 		(t (list 'user (file-name-nondirectory (buffer-file-name))
 			 idlwave-scanning-lib-dir "UserLib")))
-	  (concat
+	  (concat 
 	   (if (string= type "function") "Result = " "")
 	   (if class "Obj ->[%s::]" "")
 	   "%s"
@@ -4837,7 +5298,6 @@
    (t "@@@@@@@@")))
 
 
-
 (defun idlwave-create-user-catalog-file (&optional arg)
   "Scan all files on selected dirs of IDL search path for routine information.
 
@@ -4858,10 +5318,10 @@
 	       (> (length idlwave-user-catalog-file) 0)
 	       (file-accessible-directory-p
 		(file-name-directory idlwave-user-catalog-file))
-	       (not (string= "" (file-name-nondirectory
+	       (not (string= "" (file-name-nondirectory 
 				 idlwave-user-catalog-file))))
     (error "`idlwave-user-catalog-file' does not point to a file in an accessible directory"))
-
+  
   (cond
     ;; Rescan the known directories
    ((and arg idlwave-path-alist
@@ -4871,13 +5331,13 @@
    ;; Expand the directories from library-path and run the widget
    (idlwave-library-path
     (idlwave-display-user-catalog-widget
-     (if idlwave-true-path-alist
+     (if idlwave-true-path-alist 
 	 ;; Propagate any flags on the existing path-alist
 	 (mapcar (lambda (x)
 		   (let ((path-entry (assoc (file-truename x)
 					    idlwave-true-path-alist)))
 		     (if path-entry
-			 (cons x (cdr path-entry))
+			 (cons x (cdr path-entry)) 
 		       (list x))))
 		 (idlwave-expand-path idlwave-library-path))
        (mapcar 'list (idlwave-expand-path idlwave-library-path)))))
@@ -4902,7 +5362,7 @@
     (idlwave-scan-library-catalogs "Locating library catalogs..." 'no-load)
     (idlwave-display-user-catalog-widget idlwave-path-alist)))
 
-(defconst idlwave-user-catalog-widget-help-string
+(defconst idlwave-user-catalog-widget-help-string 
   "This is the front-end to the creation of the IDLWAVE user catalog.
 Please select the directories on IDL's search path from which you
 would like to extract routine information, to be stored in the file:
@@ -4937,7 +5397,7 @@
   (make-local-variable 'idlwave-widget)
   (widget-insert (format idlwave-user-catalog-widget-help-string
 			 idlwave-user-catalog-file))
-
+  
   (widget-create 'push-button
 		 :notify 'idlwave-widget-scan-user-lib-files
 		 "Scan & Save")
@@ -4947,7 +5407,7 @@
 		 "Delete File")
   (widget-insert "  ")
   (widget-create 'push-button
-		 :notify
+		 :notify 
 		 '(lambda (&rest ignore)
 		    (let ((path-list (widget-get idlwave-widget :path-dirs)))
 		      (mapcar (lambda (x)
@@ -4958,7 +5418,7 @@
 		 "Select All Non-Lib")
   (widget-insert "  ")
   (widget-create 'push-button
-		 :notify
+		 :notify 
 		 '(lambda (&rest ignore)
 		    (let ((path-list (widget-get idlwave-widget :path-dirs)))
 		      (mapcar (lambda (x)
@@ -4974,18 +5434,18 @@
   (widget-insert "\n\n")
 
   (widget-insert "Select Directories: \n")
-
+  
   (setq idlwave-widget
 	(apply 'widget-create
 	       'checklist
-	       :value  (delq nil (mapcar (lambda (x)
-					   (if (memq 'user (cdr x))
+	       :value  (delq nil (mapcar (lambda (x) 
+					   (if (memq 'user (cdr x)) 
 					       (car x)))
 					 dirs-list))
 	       :greedy t
 	       :tag "List of directories"
-	       (mapcar (lambda (x)
-			 (list 'item
+	       (mapcar (lambda (x) 
+			 (list 'item 
 			       (if (memq 'lib (cdr x))
 				   (concat "[LIB] " (car x) )
 				 (car x)))) dirs-list)))
@@ -4995,7 +5455,7 @@
   (widget-setup)
   (goto-char (point-min))
   (delete-other-windows))
-
+  
 (defun idlwave-delete-user-catalog-file (&rest ignore)
   (if (yes-or-no-p
        (format "Delete file %s " idlwave-user-catalog-file))
@@ -5011,7 +5471,7 @@
 	 (this-path-alist path-alist)
 	 dir-entry)
     (while (setq dir-entry (pop this-path-alist))
-      (if (member
+      (if (member 
 	   (if (memq 'lib (cdr dir-entry))
 	       (concat "[LIB] " (car dir-entry))
 	     (car dir-entry))
@@ -5108,7 +5568,7 @@
     ;; Define the variable which knows the value of "!DIR"
     (insert (format "\n(setq idlwave-system-directory \"%s\")\n"
 		    idlwave-system-directory))
-
+  
     ;; Define the variable which contains a list of all scanned directories
     (insert "\n(setq idlwave-path-alist\n    '(")
     (let ((standard-output (current-buffer)))
@@ -5148,7 +5608,7 @@
       (when (file-directory-p dir)
 	(setq files (nreverse (directory-files dir t "[^.]")))
 	(while (setq file (pop files))
-	  (if (file-directory-p file)
+	  (if (file-directory-p file) 
 	      (push (file-name-as-directory file) path)))
 	(push dir path1)))
     path1))
@@ -5160,7 +5620,7 @@
 
 
 (defun idlwave-scan-library-catalogs (&optional message-base no-load)
-  "Scan for library catalog files (.idlwave_catalog) and ingest.
+  "Scan for library catalog files (.idlwave_catalog) and ingest.  
 
 All directories on `idlwave-path-alist' (or `idlwave-library-path'
 instead, if present) are searched.  Print MESSAGE-BASE along with the
@@ -5168,7 +5628,7 @@
 NO-LOAD is non-nil.  The variable `idlwave-use-library-catalogs' can
 be set to nil to disable library catalog scanning."
   (when idlwave-use-library-catalogs
-    (let ((dirs
+    (let ((dirs 
 	   (if idlwave-library-path
 	       (idlwave-expand-path idlwave-library-path)
 	     (mapcar 'car idlwave-path-alist)))
@@ -5177,7 +5637,7 @@
       (if message-base (message message-base))
       (while (setq dir (pop dirs))
 	(catch 'continue
-	  (when (file-readable-p
+	  (when (file-readable-p 
 		 (setq catalog (expand-file-name ".idlwave_catalog" dir)))
 	    (unless no-load
 	      (setq idlwave-library-catalog-routines nil)
@@ -5185,20 +5645,20 @@
 	      (condition-case nil
 		  (load catalog t t t)
 		(error (throw 'continue t)))
-	      (when (and
-		     message-base
-		     (not (string= idlwave-library-catalog-libname
+	      (when (and 
+		     message-base 
+		     (not (string= idlwave-library-catalog-libname 
 				   old-libname)))
-		(message "%s" (concat message-base
-				 idlwave-library-catalog-libname))
+		(message "%s" (concat message-base 
+				      idlwave-library-catalog-libname))
 		(setq old-libname idlwave-library-catalog-libname))
 	      (when idlwave-library-catalog-routines
 		(setq all-routines
-		      (append
+		      (append 
 		       (idlwave-sintern-rinfo-list
 			idlwave-library-catalog-routines 'sys dir)
 		       all-routines))))
-
+	    
 	    ;;  Add a 'lib flag if on path-alist
 	    (when (and idlwave-path-alist
 		       (setq dir-entry (assoc dir idlwave-path-alist)))
@@ -5209,17 +5669,28 @@
 ;;----- Communicating with the Shell -------------------
 
 ;; First, here is the idl program which can be used to query IDL for
-;; defined routines.
+;; defined routines. 
 (defconst idlwave-routine-info.pro
   "
 ;; START OF IDLWAVE SUPPORT ROUTINES
+pro idlwave_print_safe,item,limit
+  catch,err
+  if err ne 0 then begin
+     print,'Could not print item.'
+     return
+  endif
+  if n_elements(item) gt limit then $
+     print,item[0:limit-1],'<... truncated at ',strtrim(limit,2),' elements>' $
+  else print,item
+end
+
 pro idlwave_print_info_entry,name,func=func,separator=sep
   ;; See if it's an object method
   if name eq '' then return
-  func    = keyword_set(func)
+  func    = keyword_set(func) 
   methsep = strpos(name,'::')
   meth    = methsep ne -1
-
+  
   ;; Get routine info
   pars   = routine_info(name,/parameters,functions=func)
   source = routine_info(name,/source,functions=func)
@@ -5227,12 +5698,12 @@
   nkw    = pars.num_kw_args
   if nargs gt 0 then args = pars.args
   if nkw   gt 0 then kwargs = pars.kw_args
-
+  
   ;; Trim the class, and make the name
-  if meth then begin
+  if meth then begin 
       class = strmid(name,0,methsep)
       name  = strmid(name,methsep+2,strlen(name)-1)
-      if nargs gt 0 then begin
+      if nargs gt 0 then begin 
           ;; remove the self argument
           wh = where(args ne 'SELF',nargs)
           if nargs gt 0 then args = args[wh]
@@ -5241,7 +5712,7 @@
       ;; No class, just a normal routine.
       class = \"\"
   endelse
-
+   
   ;; Calling sequence
   cs = \"\"
   if func then cs = 'Result = '
@@ -5262,23 +5733,33 @@
           kwstring = kwstring + ' ' + kwargs[j]
       endfor
   endif
-
+  
   ret=(['IDLWAVE-PRO','IDLWAVE-FUN'])[func]
-
+  
   print,ret + ': ' + name + sep + class + sep + source[0].path  $
     + sep + cs + sep + kwstring
 end
 
-pro idlwave_routine_info
+pro idlwave_routine_info,file
   on_error,1
   sep = '<@>'
   print,'>>>BEGIN OF IDLWAVE ROUTINE INFO (\"' + sep + '\" IS THE SEPARATOR)'
   all = routine_info()
-  for i=0,n_elements(all)-1 do $
-    idlwave_print_info_entry,all[i],separator=sep
+  fileQ=n_elements(file) ne 0
+  if fileQ then file=strtrim(file,2)
+  for i=0L,n_elements(all)-1L do begin 
+     if fileQ then begin 
+        if (routine_info(all[i],/SOURCE)).path eq file then $
+           idlwave_print_info_entry,all[i],separator=sep
+     endif else idlwave_print_info_entry,all[i],separator=sep
+  endfor 
   all = routine_info(/functions)
-  for i=0,n_elements(all)-1 do $
-    idlwave_print_info_entry,all[i],/func,separator=sep
+  for i=0L,n_elements(all)-1L do begin 
+     if fileQ then begin 
+        if (routine_info(all[i],/FUNCTIONS,/SOURCE)).path eq file then $
+           idlwave_print_info_entry,all[i],separator=sep,/FUNC
+     endif else idlwave_print_info_entry,all[i],separator=sep,/FUNC
+  endfor 
   print,'>>>END OF IDLWAVE ROUTINE INFO'
 end
 
@@ -5291,7 +5772,7 @@
       help,/brief,output=s,/system_variables  ; ? unsafe use of OUTPUT=
       s = strtrim(strjoin(s,' ',/single),2)   ; make one line
       v = strsplit(s,' +',/regex,/extract)    ; get variables
-      for i=0,n_elements(v)-1 do begin
+      for i=0L,n_elements(v)-1 do begin
           t = ['']                            ; get tag list
           a=execute('if n_tags('+v[i]+') gt 0 then t=tag_names('+v[i]+')')
           print, 'IDLWAVE-SYSVAR: '+v[i]+' '+strjoin(t,' ',/single)
@@ -5304,7 +5785,7 @@
   if res then print,'IDLWAVE-CLASS-TAGS: '+class+' '+strjoin(tags,' ',/single)
 end
 ;; END OF IDLWAVE SUPPORT ROUTINES
-"
+" 
   "The idl programs to get info from the shell.")
 
 (defvar idlwave-idlwave_routine_info-compiled nil
@@ -5312,13 +5793,8 @@
 
 (defvar idlwave-shell-temp-pro-file)
 (defvar idlwave-shell-temp-rinfo-save-file)
-(defun idlwave-shell-update-routine-info (&optional quiet run-hooks wait)
-  "Query the shell for routine_info of compiled modules and update the lists."
-  ;; Save and compile the procedure.  The compiled procedure is then
-  ;; saved into an IDL SAVE file, to allow for fast RESTORE.
-  ;; We need to RESTORE the procedure each time we use it, since
-  ;; the user may have killed or redefined it.  In particular,
-  ;; .RESET_SESSION will kill all user procedures.
+
+(defun idlwave-shell-compile-helper-routines (&optional wait)
   (unless (and idlwave-idlwave_routine_info-compiled
 	       (file-readable-p (idlwave-shell-temp-file 'rinfo)))
     (save-excursion
@@ -5327,20 +5803,37 @@
       (erase-buffer)
       (insert idlwave-routine-info.pro)
       (save-buffer 0))
-    (idlwave-shell-send-command
-     (concat ".run " idlwave-shell-temp-pro-file)
+    (idlwave-shell-send-command 
+     (concat ".run \"" idlwave-shell-temp-pro-file "\"")
      nil 'hide wait)
-;    (message "SENDING SAVE") ; ????????????????????????
     (idlwave-shell-send-command
-     (format "save,'idlwave_routine_info','idlwave_print_info_entry','idlwave_get_class_tags','idlwave_get_sysvars',FILE='%s',/ROUTINES"
+     (format "save,'idlwave_print_safe','idlwave_routine_info','idlwave_print_info_entry','idlwave_get_class_tags','idlwave_get_sysvars',FILE='%s',/ROUTINES" 
 	     (idlwave-shell-temp-file 'rinfo))
-     nil 'hide wait))
-
-  ;; Restore and execute the procedure, analyze the output
-;  (message "SENDING RESTORE & EXECUTE") ; ????????????????????????
+     nil 'hide)
+    (setq idlwave-idlwave_routine_info-compiled t))
+
+  ;; Restore if necessary.  Must use execute to hide lame routine_info
+  ;; errors on undefinded routine
   (idlwave-shell-send-command
-   (format "RESTORE, '%s' & idlwave_routine_info"
+   (format "if execute(\"_v=routine_info('idlwave_routine_info',/SOURCE)\") eq 0 then restore,'%s' else if _v.path eq '' then restore,'%s'"
+	   idlwave-shell-temp-rinfo-save-file
 	   idlwave-shell-temp-rinfo-save-file)
+   nil 'hide))
+
+
+(defun idlwave-shell-update-routine-info (&optional quiet run-hooks wait file)
+  "Query the shell for routine_info of compiled modules and update the lists."
+  ;; Save and compile the procedure.  The compiled procedure is then
+  ;; saved into an IDL SAVE file, to allow for fast RESTORE.  We may
+  ;; need to test for and possibly RESTORE the procedure each time we
+  ;; use it, since the user may have killed or redefined it.  In
+  ;; particular, .RESET_SESSION will kill all user procedures.  If
+  ;; FILE is set, only update routine info for routines in that file.
+
+  (idlwave-shell-compile-helper-routines wait)
+  ; execute the routine_info procedure, and analyze the output
+  (idlwave-shell-send-command
+   (format "idlwave_routine_info%s" (if file (concat ",'" file "'") ""))
    `(progn
       (idlwave-shell-routine-info-filter)
       (idlwave-concatenate-rinfo-lists ,quiet ,run-hooks))
@@ -5415,7 +5908,7 @@
 	 (completion-regexp-list
 	  (if (equal arg '(16))
 	      (list (read-string (concat "Completion Regexp: "))))))
-
+    
     (if (and module (string-match "::" module))
 	(setq class (substring module 0 (match-beginning 0))
 	      module (substring module (match-end 0))))
@@ -5436,7 +5929,7 @@
      ;; Check for any special completion functions
      ((and idlwave-complete-special
 	   (idlwave-call-special idlwave-complete-special)))
-
+     
      ((null what)
       (error "Nothing to complete here"))
 
@@ -5453,7 +5946,7 @@
 			      (idlwave-all-class-inherits class-selector)))
 	     (isa (concat "procedure" (if class-selector "-method" "")))
 	     (type-selector 'pro))
-	(setq idlwave-completion-help-info
+	(setq idlwave-completion-help-info 
 	      (list 'routine nil type-selector class-selector nil super-classes))
 	(idlwave-complete-in-buffer
 	 'procedure (if class-selector 'method 'routine)
@@ -5461,8 +5954,8 @@
 	 (format "Select a %s name%s"
 		 isa
 		 (if class-selector
-		     (format " (class is %s)"
-			     (if (eq class-selector t)
+		     (format " (class is %s)" 
+			     (if (eq class-selector t) 
 				 "unknown" class-selector))
 		   ""))
 	 isa
@@ -5476,7 +5969,7 @@
 			      (idlwave-all-class-inherits class-selector)))
 	     (isa (concat "function" (if class-selector "-method" "")))
 	     (type-selector 'fun))
-	(setq idlwave-completion-help-info
+	(setq idlwave-completion-help-info 
 	      (list 'routine nil type-selector class-selector nil super-classes))
 	(idlwave-complete-in-buffer
 	 'function (if class-selector 'method 'routine)
@@ -5484,7 +5977,7 @@
 	 (format "Select a %s name%s"
 		 isa
 		 (if class-selector
-		     (format " (class is %s)"
+		     (format " (class is %s)" 
 			     (if (eq class-selector t)
 				 "unknown" class-selector))
 		   ""))
@@ -5512,18 +6005,18 @@
 	(unless (or entry (eq class t))
 	  (error "Nothing known about procedure %s"
 		 (idlwave-make-full-name class name)))
-	(setq list (idlwave-fix-keywords name 'pro class list
+	(setq list (idlwave-fix-keywords name 'pro class list 
 					 super-classes system))
 	(unless list (error "No keywords available for procedure %s"
 			    (idlwave-make-full-name class name)))
-	(setq idlwave-completion-help-info
+	(setq idlwave-completion-help-info 
 	      (list 'keyword name type-selector class-selector entry super-classes))
 	(idlwave-complete-in-buffer
 	 'keyword 'keyword list nil
 	 (format "Select keyword for procedure %s%s"
 		 (idlwave-make-full-name class name)
 		 (if (or (member '("_EXTRA") list)
-			 (member '("_REF_EXTRA") list))
+			 (member '("_REF_EXTRA") list))			 
 		     " (note _EXTRA)" ""))
 	 isa
 	 'idlwave-attach-keyword-classes)))
@@ -5546,7 +6039,7 @@
 	(unless (or entry (eq class t))
 	  (error "Nothing known about function %s"
 		 (idlwave-make-full-name class name)))
-	(setq list (idlwave-fix-keywords name 'fun class list
+	(setq list (idlwave-fix-keywords name 'fun class list 
 					 super-classes system))
 	;; OBJ_NEW: Messages mention the proper Init method
 	(setq msg-name (if (and (null class)
@@ -5556,13 +6049,13 @@
 			 (idlwave-make-full-name class name)))
 	(unless list (error "No keywords available for function %s"
 			    msg-name))
-	(setq idlwave-completion-help-info
+	(setq idlwave-completion-help-info 
 	      (list 'keyword name type-selector class-selector nil super-classes))
 	(idlwave-complete-in-buffer
 	 'keyword 'keyword list nil
 	 (format "Select keyword for function %s%s" msg-name
 		 (if (or (member '("_EXTRA") list)
-			 (member '("_REF_EXTRA") list))
+			 (member '("_REF_EXTRA") list))			 
 		     " (note _EXTRA)" ""))
 	 isa
 	 'idlwave-attach-keyword-classes)))
@@ -5600,10 +6093,10 @@
 		      ("class")))
 	 (module (idlwave-sintern-routine-or-method module class))
 	 (class (idlwave-sintern-class class))
-	 (what (cond
+	 (what (cond 
 		((equal what 0)
 		 (setq what
-		       (intern (completing-read
+		       (intern (completing-read 
 				"Complete what? " what-list nil t))))
 		((integerp what)
 		 (setq what (intern (car (nth (1- what) what-list)))))
@@ -5625,7 +6118,7 @@
 	     (super-classes nil)
 	     (type-selector 'pro)
 	     (pro (or module
-		      (idlwave-completing-read
+		      (idlwave-completing-read 
 		       "Procedure: " (idlwave-routines) 'idlwave-selector))))
 	(setq pro (idlwave-sintern-routine pro))
 	(list nil-list nil-list 'procedure-keyword
@@ -5639,7 +6132,7 @@
 	     (super-classes nil)
 	     (type-selector 'fun)
 	     (func (or module
-		       (idlwave-completing-read
+		       (idlwave-completing-read 
 			"Function: " (idlwave-routines) 'idlwave-selector))))
 	(setq func (idlwave-sintern-routine func))
 	(list nil-list nil-list 'function-keyword
@@ -5679,7 +6172,7 @@
 
      ((eq what 'class)
       (list nil-list nil-list 'class nil-list nil))
-
+     
      (t (error "Invalid value for WHAT")))))
 
 (defun idlwave-completing-read (&rest args)
@@ -5702,7 +6195,7 @@
 		    (stringp idlwave-shell-default-directory)
 		    (file-directory-p idlwave-shell-default-directory))
 	       idlwave-shell-default-directory
-	     default-directory)))
+	     default-directory)))	   
     (comint-dynamic-complete-filename)))
 
 (defun idlwave-make-full-name (class name)
@@ -5711,7 +6204,7 @@
 
 (defun idlwave-rinfo-assoc (name type class list)
   "Like `idlwave-rinfo-assq', but sintern strings first."
-  (idlwave-rinfo-assq
+  (idlwave-rinfo-assq 
    (idlwave-sintern-routine-or-method name class)
    type (idlwave-sintern-class class) list))
 
@@ -5735,7 +6228,7 @@
 	  (setq classes nil)))
     rtn))
 
-(defun idlwave-best-rinfo-assq (name type class list &optional with-file
+(defun idlwave-best-rinfo-assq (name type class list &optional with-file 
 				     keep-system)
   "Like `idlwave-rinfo-assq', but get all twins and sort, then return first.
 If WITH-FILE is passed, find the best rinfo entry with a file
@@ -5760,7 +6253,7 @@
 				    twins)))))
     (car twins)))
 
-(defun idlwave-best-rinfo-assoc (name type class list &optional with-file
+(defun idlwave-best-rinfo-assoc (name type class list &optional with-file 
 				     keep-system)
   "Like `idlwave-best-rinfo-assq', but sintern strings first."
   (idlwave-best-rinfo-assq
@@ -5851,7 +6344,7 @@
 Must accept two arguments: `apos' and `info'")
 
 (defun idlwave-determine-class (info type)
-  ;; Determine the class of a routine call.
+  ;; Determine the class of a routine call.  
   ;; INFO is the `cw-list' structure as returned by idlwave-where.
   ;; The second element in this structure is the class.  When nil, we
   ;; return nil.  When t, try to get the class from text properties at
@@ -5871,7 +6364,7 @@
 		      (dassoc (cdr dassoc))
 		      (t t)))
 	 (arrow (and apos (string= (buffer-substring apos (+ 2 apos)) "->")))
-	 (is-self
+	 (is-self 
 	  (and arrow
 	       (save-excursion (goto-char apos)
 			       (forward-word -1)
@@ -5892,19 +6385,19 @@
 	  (setq class (or (nth 2 (idlwave-current-routine)) class)))
 
       ;; Before prompting, try any special class determination routines
-      (when (and (eq t class)
+      (when (and (eq t class) 
 		 idlwave-determine-class-special
 		 (not force-query))
-	(setq special-class
+	(setq special-class 
 	      (idlwave-call-special idlwave-determine-class-special apos))
-	(if special-class
+	(if special-class 
 	    (setq class (idlwave-sintern-class special-class)
 		  store idlwave-store-inquired-class)))
-
+      
       ;; Prompt for a class, if we need to
       (when (and (eq class t)
 		 (or force-query query))
-	(setq class-alist
+	(setq class-alist 
 	      (mapcar 'list (idlwave-all-method-classes (car info) type)))
 	(setq class
 	      (idlwave-sintern-class
@@ -5913,9 +6406,9 @@
 		 (error "No classes available with method %s" (car info)))
 		((and (= (length class-alist) 1) (not force-query))
 		 (car (car class-alist)))
-		(t
+		(t 
 		 (setq store idlwave-store-inquired-class)
-		 (idlwave-completing-read
+		 (idlwave-completing-read 
 		  (format "Class%s: " (if (stringp (car info))
 					  (format " for %s method %s"
 						  type (car info))
@@ -5927,9 +6420,9 @@
 	;; We have a real class here
 	(when (and store arrow)
 	  (condition-case ()
-	      (add-text-properties
-	       apos (+ apos 2)
-	       `(idlwave-class ,class face ,idlwave-class-arrow-face
+	      (add-text-properties 
+	       apos (+ apos 2) 
+	       `(idlwave-class ,class face ,idlwave-class-arrow-face 
 			       rear-nonsticky t))
 	    (error nil)))
 	(setf (nth 2 info) class))
@@ -5957,14 +6450,14 @@
 
 
 (defun idlwave-where ()
-  "Find out where we are.
+  "Find out where we are. 
 The return value is a list with the following stuff:
 \(PRO-LIST FUNC-LIST COMPLETE-WHAT CW-LIST LAST-CHAR)
 
 PRO-LIST       (PRO POINT CLASS ARROW)
 FUNC-LIST      (FUNC POINT CLASS ARROW)
 COMPLETE-WHAT  a symbol indicating what kind of completion makes sense here
-CW-LIST        (PRO-OR-FUNC POINT CLASS ARROW)  Like PRO-LIST, for what can
+CW-LIST        (PRO-OR-FUNC POINT CLASS ARROW)  Like PRO-LIST, for what can 
                be completed here.
 LAST-CHAR      last relevant character before point (non-white non-comment,
                not part of current identifier or leading slash).
@@ -5976,7 +6469,7 @@
 CLASS:  What class has the routine (nil=no, t=is method, but class unknown)
 ARROW:  Location of the arrow"
   (idlwave-routines)
-  (let* (;(bos (save-excursion (idlwave-beginning-of-statement) (point)))
+  (let* (;(bos (save-excursion (idlwave-beginning-of-statement) (point))) 
          (bos (save-excursion (idlwave-start-of-substatement 'pre) (point)))
  	 (func-entry (idlwave-what-function bos))
          (func (car func-entry))
@@ -5998,8 +6491,8 @@
      ((string-match "\\`[ \t]*\\(pro\\|function\\)[ \t]+[a-zA-Z0-9_]*\\'"
                     match-string)
       (setq cw 'class))
-     ((string-match
-       "\\`[ \t]*\\([a-zA-Z][a-zA-Z0-9$_]*\\)?\\'"
+     ((string-match 
+       "\\`[ \t]*\\([a-zA-Z][a-zA-Z0-9$_]*\\)?\\'" 
        (if (> pro-point 0)
 	   (buffer-substring pro-point (point))
 	 match-string))
@@ -6010,11 +6503,11 @@
       nil)
      ((string-match "OBJ_NEW([ \t]*['\"]\\([a-zA-Z0-9$_]*\\)?\\'"
 		    match-string)
-      (setq cw 'class))
+      (setq cw 'class))                    
      ((string-match "\\<inherits\\s-+\\([a-zA-Z0-9$_]*\\)?\\'"
 		    match-string)
-      (setq cw 'class))
-     ((and func
+      (setq cw 'class))                    
+     ((and func 
 	   (> func-point pro-point)
 	   (= func-level 1)
 	   (memq last-char '(?\( ?,)))
@@ -6060,7 +6553,7 @@
   ;;    searches to this point.
 
   (catch 'exit
-    (let (pos
+    (let (pos 
 	  func-point
 	  (cnt 0)
 	  func arrow-start class)
@@ -6075,18 +6568,18 @@
 	     (setq pos (point))
 	     (incf cnt)
 	     (when (and (= (following-char) ?\()
-			(re-search-backward
+			(re-search-backward 
 			 "\\(::\\|\\<\\)\\([a-zA-Z][a-zA-Z0-9$_]*\\)[ \t]*\\="
 			 bound t))
 	       (setq func (match-string 2)
 		     func-point (goto-char (match-beginning 2))
 		     pos func-point)
-	       (if (re-search-backward
+	       (if (re-search-backward 
 		    "->[ \t]*\\(\\([a-zA-Z][a-zA-Z0-9$_]*\\)::\\)?\\=" bound t)
 		   (setq arrow-start (copy-marker (match-beginning 0))
 			 class (or (match-string 2) t)))
-	       (throw
-		'exit
+	       (throw 
+		'exit 
 		(list
 		 (idlwave-sintern-routine-or-method func class)
 		 (idlwave-sintern-class class)
@@ -6102,18 +6595,18 @@
   ;;    searches to this point.
   (let ((pos (point)) pro-point
 	pro class arrow-start string)
-    (save-excursion
+    (save-excursion 
       ;;(idlwave-beginning-of-statement)
       (idlwave-start-of-substatement 'pre)
       (setq string (buffer-substring (point) pos))
-      (if (string-match
+      (if (string-match 
 	   "\\`[ \t]*\\([a-zA-Z][a-zA-Z0-9$_]*\\)[ \t]*\\(,\\|\\'\\)" string)
 	  (setq pro (match-string 1 string)
 		pro-point (+ (point) (match-beginning 1)))
 	(if (and (idlwave-skip-object)
 		 (setq string (buffer-substring (point) pos))
-		 (string-match
-		  "\\`[ \t]*\\(->\\)[ \t]*\\(\\([a-zA-Z][a-zA-Z0-9$_]*\\)::\\)?\\([a-zA-Z][a-zA-Z0-9$_]*\\)?[ \t]*\\(,\\|\\(\\$\\s *\\(;.*\\)?\\)?$\\)"
+		 (string-match 
+		  "\\`[ \t]*\\(->\\)[ \t]*\\(\\([a-zA-Z][a-zA-Z0-9$_]*\\)::\\)?\\([a-zA-Z][a-zA-Z0-9$_]*\\)?[ \t]*\\(,\\|\\(\\$\\s *\\(;.*\\)?\\)?$\\)" 
 		  string))
 	    (setq pro (if (match-beginning 4)
 			  (match-string 4 string))
@@ -6157,7 +6650,7 @@
 	      (throw 'exit nil))))
 	(goto-char pos)
       nil)))
-
+  
 (defun idlwave-last-valid-char ()
   "Return the last character before point which is not white or a comment
 and also not part of the current identifier.  Since we do this in
@@ -6247,23 +6740,23 @@
      ((or (eq completion t)
 	  (and (= 1 (length (setq all-completions
 				  (idlwave-uniquify
-				   (all-completions part list
-						    (or special-selector
+				   (all-completions part list 
+						    (or special-selector 
 							selector))))))
 	       (equal dpart dcompletion)))
       ;; This is already complete
       (idlwave-after-successful-completion type slash beg)
       (message "%s is already the complete %s" part isa)
       nil)
-     (t
+     (t        
       ;; We cannot add something - offer a list.
       (message "Making completion list...")
-
+      
       (unless idlwave-completion-help-links ; already set somewhere?
 	(mapcar (lambda (x)  ; Pass link prop through to highlight-linked
 		  (let ((link (get-text-property 0 'link (car x))))
 		    (if link
-			(push (cons (car x) link)
+			(push (cons (car x) link) 
 			      idlwave-completion-help-links))))
 		list))
       (let* ((list all-completions)
@@ -6273,7 +6766,7 @@
 ;	     (completion-fixup-function               ; Emacs
 ;	      (lambda () (and (eq (preceding-char) ?>)
 ;			      (re-search-backward " <" beg t)))))
-
+	     
 	(setq list (sort list (lambda (a b)
 				(string< (downcase a) (downcase b)))))
 	(if prepare-display-function
@@ -6283,7 +6776,7 @@
 		     idlwave-complete-empty-string-as-lower-case)
 		 (not idlwave-completion-force-default-case))
 	    (setq list (mapcar (lambda (x)
-				 (if (listp x)
+				 (if (listp x) 
 				     (setcar x (downcase (car x)))
 				   (setq x (downcase x)))
 				 x)
@@ -6303,19 +6796,19 @@
 	   (re-search-backward "\\<\\(pro\\|function\\)[ \t]+\\="
 			       (- (point) 15) t)
 	   (goto-char (point-min))
-	   (re-search-forward
+	   (re-search-forward 
 	    "^[ \t]*\\(pro\\|function\\)[ \t]+\\([a-zA-Z0-9_]+::\\)" nil t))))
       ;; Yank the full class specification
       (insert (match-string 2))
     ;; Do the completion, using list gathered from `idlwave-routines'
-    (idlwave-complete-in-buffer
-     'class 'class (idlwave-class-alist) nil
+    (idlwave-complete-in-buffer 
+     'class 'class (idlwave-class-alist) nil 
      "Select a class" "class"
      '(lambda (list)  ;; Push it to help-links if system help available
 	(mapcar (lambda (x)
 		  (let* ((entry (idlwave-class-info x))
 			 (link (nth 1 (assq 'link entry))))
-		    (if link (push (cons x link)
+		    (if link (push (cons x link) 
 				   idlwave-completion-help-links))
 		    x))
 		list)))))
@@ -6327,7 +6820,7 @@
   ;; SHOW-CLASSES is the value of `idlwave-completion-show-classes'.
   (if (or (null show-classes)           ; don't want to see classes
 	  (null class-selector)         ; not a method call
-	  (and
+	  (and 
 	   (stringp class-selector) ; the class is already known
 	   (not super-classes)))    ; no possibilities for inheritance
       ;; In these cases, we do not have to do anything
@@ -6342,13 +6835,13 @@
 	   (max (abs show-classes))
 	   (lmax (if do-dots (apply 'max (mapcar 'length list))))
 	  classes nclasses class-info space)
-      (mapcar
+      (mapcar 
        (lambda (x)
 	 ;; get the classes
 	 (if (eq type 'class-tag)
 	     ;; Just one class for tags
 	     (setq classes
-		   (list
+		   (list 
 		    (idlwave-class-or-superclass-with-tag class-selector x)))
 	   ;; Multiple classes for method or method-keyword
 	   (setq classes
@@ -6357,7 +6850,7 @@
 		      method-selector x type-selector)
 		   (idlwave-all-method-classes x type-selector)))
 	   (if inherit
-	       (setq classes
+	       (setq classes 
 		     (delq nil
 			   (mapcar (lambda (x) (if (memq x inherit) x nil))
 				   classes)))))
@@ -6394,7 +6887,7 @@
 (defun idlwave-attach-class-tag-classes (list)
   ;; Call idlwave-attach-classes with class structure tags
   (idlwave-attach-classes list 'class-tag idlwave-completion-show-classes))
-
+					
 
 ;;----------------------------------------------------------------------
 ;;----------------------------------------------------------------------
@@ -6415,7 +6908,7 @@
 	  ((= 1 (length list))
 	   (setq rtn (car list)))
 	  ((featurep 'xemacs)
-	   (if sort (setq list (sort list (lambda (a b)
+	   (if sort (setq list (sort list (lambda (a b) 
 					    (string< (upcase a) (upcase b))))))
 	   (setq menu
 		 (append (list title)
@@ -6426,7 +6919,7 @@
 	   (setq resp (get-popup-menu-response menu))
 	   (funcall (event-function resp) (event-object resp)))
 	  (t
-	   (if sort (setq list (sort list (lambda (a b)
+	   (if sort (setq list (sort list (lambda (a b) 
 					    (string< (upcase a) (upcase b))))))
 	   (setq menu (cons title
 			    (list
@@ -6517,7 +7010,7 @@
     (setq idlwave-before-completion-wconf (current-window-configuration)))
 
   (if (featurep 'xemacs)
-      (idlwave-display-completion-list-xemacs
+      (idlwave-display-completion-list-xemacs 
        list)
     (idlwave-display-completion-list-emacs list))
 
@@ -6598,7 +7091,7 @@
             (mapcar (lambda(x)
                       (princ (nth 1 x))
                       (princ "\n"))
-                    keys-alist))
+                    keys-alist))            
           (setq char (read-char)))
       (setq char (read-char)))
     (message nil)
@@ -6718,7 +7211,7 @@
 (defun idlwave-make-modified-completion-map-emacs (old-map)
   "Replace `choose-completion' and `mouse-choose-completion' in OLD-MAP."
   (let ((new-map (copy-keymap old-map)))
-    (substitute-key-definition
+    (substitute-key-definition 
      'choose-completion 'idlwave-choose-completion new-map)
     (substitute-key-definition
      'mouse-choose-completion 'idlwave-mouse-choose-completion new-map)
@@ -6744,8 +7237,8 @@
 ;;
 ;; - Go again over the documentation how to write a completion
 ;;   plugin.  It is in self.el, but currently still very bad.
-;;   This could be in a separate file in the distribution, or
-;;   in an appendix for the manual.
+;;   This could be in a separate file in the distribution, or 
+;;   in an appendix for the manual.  
 
 (defvar idlwave-struct-skip
   "[ \t]*\\(\\$.*\n\\(^[ \t]*\\(\\$[ \t]*\\)?\\(;.*\\)?\n\\)*\\)?[ \t]*"
@@ -6784,7 +7277,7 @@
 	 (beg (car borders))
 	 (end (cdr borders))
 	 (case-fold-search t))
-    (re-search-forward (concat "\\(^[ \t]*\\|[,{][ \t]*\\)" tag "[ \t]*:")
+    (re-search-forward (concat "\\(^[ \t]*\\|[,{][ \t]*\\)" tag "[ \t]*:") 
 		       end t)))
 
 (defun idlwave-struct-inherits ()
@@ -6799,7 +7292,7 @@
       (goto-char beg)
       (save-restriction
 	(narrow-to-region beg end)
-	(while (re-search-forward
+	(while (re-search-forward 
 		(concat "[{,]"  ;leading comma/brace
 			idlwave-struct-skip ; 4 groups
 			"inherits"    ; The INHERITS tag
@@ -6849,9 +7342,9 @@
 		  (concat "\\<" (regexp-quote (downcase var)) "\\>" ws)
 		"\\(\\)")
 	      "=" ws "\\({\\)"
-	      (if name
+	      (if name 
 		  (if (stringp name)
-		      (concat ws "\\(\\<" (downcase name) "\\)[^a-zA-Z0-9_$]")
+		      (concat ws "\\(\\<" (downcase name) "\\)[^a-zA-Z0-9_$]") 
 		    ;; Just a generic name
 		    (concat ws "\\<\\([a-zA-Z_0-9$]+\\)" ws ","))
 		""))))
@@ -6862,8 +7355,7 @@
 	  (goto-char (match-beginning 3))
 	  (match-string-no-properties 5)))))
 
-(defvar idlwave-class-info nil)
-(defvar idlwave-system-class-info nil) ; Gathered from idlw-rinfo
+(defvar idlwave-class-info nil) 
 (defvar idlwave-class-reset nil) ; to reset buffer-local classes
 
 (add-hook 'idlwave-update-rinfo-hook
@@ -6875,13 +7367,13 @@
   (let (list entry)
     (if idlwave-class-info
 	(if idlwave-class-reset
-	    (setq
+	    (setq 	    
 	     idlwave-class-reset nil
 	     idlwave-class-info ; Remove any visited in a buffer
-	     (delq nil (mapcar
-			(lambda (x)
-			  (let ((filebuf
-				 (idlwave-class-file-or-buffer
+	     (delq nil (mapcar 
+			(lambda (x) 
+			  (let ((filebuf 
+				 (idlwave-class-file-or-buffer 
 				  (or (cdr (assq 'found-in x)) (car x)))))
 			    (if (cdr filebuf)
 				nil
@@ -6919,7 +7411,7 @@
 	  (progn
 	    ;; For everything there
 	    (setq end-lim (save-excursion (idlwave-end-of-subprogram) (point)))
-	    (while (setq name
+	    (while (setq name 
 			 (idlwave-find-structure-definition nil t end-lim))
 	      (funcall all-hook name)))
 	(idlwave-find-structure-definition nil (or alt-class class))))))
@@ -6957,11 +7449,11 @@
 	  (insert-file-contents file))
 	(save-excursion
 	  (goto-char 1)
-	  (idlwave-find-class-definition class
+	  (idlwave-find-class-definition class 
 	   ;; Scan all of the structures found there
 	   (lambda (name)
 	     (let* ((this-class (idlwave-sintern-class name))
-		    (entry
+		    (entry 
 		     (list this-class
 			   (cons 'tags (idlwave-struct-tags))
 			   (cons 'inherits (idlwave-struct-inherits)))))
@@ -6986,7 +7478,7 @@
   (condition-case err
       (apply 'append (mapcar 'idlwave-class-tags
 			     (cons class (idlwave-all-class-inherits class))))
-    (error
+    (error           
      (idlwave-class-tag-reset)
      (error "%s" (error-message-string err)))))
 
@@ -7023,24 +7515,24 @@
 	  all-inherits))))))
 
 (defun idlwave-entry-keywords (entry &optional record-link)
-  "Return the flat entry keywords alist from routine-info entry.
+  "Return the flat entry keywords alist from routine-info entry.  
 If RECORD-LINK is non-nil, the keyword text is copied and a text
 property indicating the link is added."
   (let (kwds)
     (mapcar
-     (lambda (key-list)
+     (lambda (key-list) 
        (let ((file (car key-list)))
 	 (mapcar (lambda (key-cons)
 		   (let ((key (car key-cons))
 			 (link (cdr key-cons)))
 		     (when (and record-link file)
 			 (setq key (copy-sequence key))
-			 (put-text-property
+			 (put-text-property 
 			  0 (length key)
-			  'link
-			  (concat
-			   file
-			   (if link
+			  'link 
+			  (concat 
+			   file 
+			   (if link 
 			       (concat idlwave-html-link-sep
 				       (number-to-string link))))
 			  key))
@@ -7053,13 +7545,13 @@
   "Find keyword KEYWORD in entry ENTRY, and return (with link) if set"
   (catch 'exit
     (mapc
-     (lambda (key-list)
+     (lambda (key-list) 
        (let ((file (car key-list))
 	     (kwd (assoc keyword (cdr key-list))))
 	 (when kwd
-	   (setq kwd (cons (car kwd)
+	   (setq kwd (cons (car kwd) 
 			   (if (and file (cdr kwd))
-			       (concat file
+			       (concat file 
 				       idlwave-html-link-sep
 				       (number-to-string (cdr kwd)))
 			     (cdr kwd))))
@@ -7097,14 +7589,14 @@
 	  ;; Check if we need to update the "current" class
 	  (if (not (equal class-selector idlwave-current-tags-class))
 	      (idlwave-prepare-class-tag-completion class-selector))
-	  (setq idlwave-completion-help-info
+	  (setq idlwave-completion-help-info 
 		(list 'idlwave-complete-class-structure-tag-help
-		      (idlwave-sintern-routine
+		      (idlwave-sintern-routine 
 		       (concat class-selector "__define"))
 		      nil))
 	  (let  ((idlwave-cpl-bold idlwave-current-native-class-tags))
 	    (idlwave-complete-in-buffer
-	     'class-tag 'class-tag
+	     'class-tag 'class-tag 
 	     idlwave-current-class-tags nil
 	     (format "Select a tag of class %s" class-selector)
 	     "class tag"
@@ -7139,12 +7631,6 @@
 (add-hook 'idlwave-update-rinfo-hook 'idlwave-sysvars-reset)
 (add-hook 'idlwave-after-load-rinfo-hook 'idlwave-sintern-sysvar-alist)
 
-(defvar idlwave-executive-commands-alist nil
-  "Alist of system variables and their help files.")
-
-(defvar idlwave-system-variables-alist nil
-  "Alist of system variables and the associated structure tags.
-Gets set in `idlw-rinfo.el'.")
 
 (defun idlwave-complete-sysvar-or-tag ()
   "Complete a system variable."
@@ -7156,7 +7642,7 @@
 	     (skip-chars-backward "[a-zA-Z0-9_$]")
 	     (equal (char-before) ?!))
 	   (setq idlwave-completion-help-info '(idlwave-complete-sysvar-help))
-	   (idlwave-complete-in-buffer 'sysvar 'sysvar
+	   (idlwave-complete-in-buffer 'sysvar 'sysvar 
 				       idlwave-system-variables-alist nil
 				       "Select a system variable"
 				       "system variable")
@@ -7175,14 +7661,15 @@
 	     (or tags (error "System variable !%s is not a structure" var))
 	     (setq idlwave-completion-help-info
 		   (list 'idlwave-complete-sysvar-tag-help var))
-	     (idlwave-complete-in-buffer 'sysvartag 'sysvartag
+	     (idlwave-complete-in-buffer 'sysvartag 'sysvartag 
 					 tags nil
 					 "Select a system variable tag"
 					 "system variable tag")
 	     t)) ; return t to skip other completions
 	  (t nil))))
 
-(defvar link) ;dynamic
+(defvar link) ;dynamic variables set by help callback
+(defvar props)
 (defun idlwave-complete-sysvar-help (mode word)
   (let ((word (or (nth 1 idlwave-completion-help-info) word))
 	(entry (assoc word idlwave-system-variables-alist)))
@@ -7203,13 +7690,19 @@
      ((eq mode 'test) ; we can at least link the main
       (and (stringp word) entry main))
      ((eq mode 'set)
-      (if entry
-	  (setq link
+      (if entry 
+	  (setq link 
 		(if (setq target (cdr (assoc word tags)))
 		  (idlwave-substitute-link-target main target)
 		main)))) ;; setting dynamic!!!
      (t (error "This should not happen")))))
 
+(defun idlwave-split-link-target (link)
+  "Split a given link into link file and anchor."
+  (if (string-match idlwave-html-link-sep link)
+      (cons (substring link 0 (match-beginning 0))
+	    (string-to-number (substring link (match-end 0))))))
+
 (defun idlwave-substitute-link-target (link target)
   "Substitute the target anchor for the given link."
   (let (main-base)
@@ -7222,7 +7715,7 @@
 
 ;; Fake help in the source buffer for class structure tags.
 ;; KWD AND NAME ARE GLOBAL-VARIABLES HERE.
-(defvar name)
+(defvar name) 
 (defvar kwd)
 (defvar idlwave-help-do-class-struct-tag nil)
 (defun idlwave-complete-class-structure-tag-help (mode word)
@@ -7231,11 +7724,11 @@
     nil)
    ((eq mode 'set)
     (let (class-with found-in)
-      (when (setq class-with
-		(idlwave-class-or-superclass-with-tag
+      (when (setq class-with 
+		(idlwave-class-or-superclass-with-tag 
 		 idlwave-current-tags-class
 		 word))
-	(if (assq (idlwave-sintern-class class-with)
+	(if (assq (idlwave-sintern-class class-with) 
 		  idlwave-system-class-info)
 	    (error "No help available for system class tags"))
 	(if (setq found-in (idlwave-class-found-in class-with))
@@ -7248,7 +7741,7 @@
 (defun idlwave-class-or-superclass-with-tag (class tag)
   "Find and return the CLASS or one of its superclass with the
 associated TAG, if any."
-  (let ((sclasses (cons class (cdr (assq 'all-inherits
+  (let ((sclasses (cons class (cdr (assq 'all-inherits 
 					 (idlwave-class-info class)))))
 	cl)
    (catch 'exit
@@ -7257,7 +7750,7 @@
        (let ((tags (idlwave-class-tags cl)))
 	 (while tags
 	   (if (eq t (compare-strings tag 0 nil (car tags) 0 nil t))
-	     (throw 'exit cl))
+	     (throw 'exit cl))	       
 	   (setq tags (cdr tags))))))))
 
 
@@ -7280,8 +7773,8 @@
       (setcar entry (idlwave-sintern-sysvar (car entry) 'set))
       (setq tags (assq 'tags entry))
       (if tags
-	  (setcdr tags
-		  (mapcar (lambda (x)
+	  (setcdr tags 
+		  (mapcar (lambda (x) 
 			    (cons (idlwave-sintern-sysvartag (car x) 'set)
 				  (cdr x)))
 			  (cdr tags)))))))
@@ -7298,19 +7791,19 @@
 			 text start)
       (setq start (match-end 0)
 	    var (match-string 1 text)
-	    tags (if (match-end 3)
+	    tags (if (match-end 3) 
 		     (idlwave-split-string (match-string 3 text))))
       ;; Maintain old links, if present
       (setq old-entry (assq (idlwave-sintern-sysvar var) old))
       (setq link (assq 'link old-entry))
       (setq idlwave-system-variables-alist
-	    (cons (list var
-			(cons
-			 'tags
-			 (mapcar (lambda (x)
-				   (cons x
-					 (cdr (assq
-					       (idlwave-sintern-sysvartag x)
+	    (cons (list var 
+			(cons 
+			 'tags 
+			 (mapcar (lambda (x) 
+				   (cons x 
+					 (cdr (assq 
+					       (idlwave-sintern-sysvartag x) 
 					       (cdr (assq 'tags old-entry))))))
 				 tags)) link)
 		  idlwave-system-variables-alist)))
@@ -7332,9 +7825,9 @@
 
 (defun idlwave-uniquify (list)
   (let ((ht (make-hash-table :size (length list) :test 'equal)))
-    (delq nil
+    (delq nil 
 	  (mapcar (lambda (x)
-		    (unless (gethash x ht)
+		    (unless (gethash x ht) 
 		      (puthash x t ht)
 		      x))
 		  list))))
@@ -7362,11 +7855,11 @@
       nil)))
 
   ;; Restore the pre-completion window configuration if this is safe.
-
-  (if (or (eq verify 'force)                                    ; force
-	  (and
+  
+  (if (or (eq verify 'force)                                    ; force 
+	  (and 
 	   (get-buffer-window "*Completions*")                  ; visible
-	   (idlwave-local-value 'idlwave-completion-p
+	   (idlwave-local-value 'idlwave-completion-p 
 				"*Completions*")                ; cib-buffer
 	   (eq (marker-buffer idlwave-completion-mark)
 	       (current-buffer))                                ; buffer OK
@@ -7464,7 +7957,7 @@
     (if (string-match "\\(pro\\|function\\)[ \t]+\\(\\(.*\\)::\\)?\\(.*\\)"
 		      resolve)
 	(setq type (match-string 1 resolve)
-	      class (if (match-beginning 2)
+	      class (if (match-beginning 2) 
 			(match-string 3 resolve)
 		      nil)
 	      name (match-string 4 resolve)))
@@ -7473,15 +7966,15 @@
 
     (cond
      ((null class)
-      (idlwave-shell-send-command
+      (idlwave-shell-send-command 
        (format "resolve_routine,'%s'%s" (downcase name) kwd)
        'idlwave-update-routine-info
        nil t))
      (t
-      (idlwave-shell-send-command
+      (idlwave-shell-send-command 
        (format "resolve_routine,'%s__define'%s" (downcase class) kwd)
-       (list 'idlwave-shell-send-command
-	     (format "resolve_routine,'%s__%s'%s"
+       (list 'idlwave-shell-send-command 
+	     (format "resolve_routine,'%s__%s'%s" 
 		     (downcase class) (downcase name) kwd)
 	     '(idlwave-update-routine-info)
 	     nil t))))))
@@ -7502,19 +7995,19 @@
 	 (this-buffer (equal arg '(4)))
 	 (module (idlwave-fix-module-if-obj_new (idlwave-what-module)))
 	 (default (if module
-		      (concat (idlwave-make-full-name
+		      (concat (idlwave-make-full-name 
 			       (nth 2 module) (car module))
 			      (if (eq (nth 1 module) 'pro) "<p>" "<f>"))
 		    "none"))
-	 (list
+	 (list 
 	  (idlwave-uniquify
 	   (delq nil
-		 (mapcar (lambda (x)
+		 (mapcar (lambda (x) 
 			   (if (eq 'system (car-safe (nth 3 x)))
 			       ;; Take out system routines with no source.
 			       nil
 			     (list
-			      (concat (idlwave-make-full-name
+			      (concat (idlwave-make-full-name 
 				       (nth 2 x) (car x))
 				      (if (eq (nth 1 x) 'pro) "<p>" "<f>")))))
 			 (if this-buffer
@@ -7543,10 +8036,10 @@
 		     (t t)))
     (idlwave-do-find-module name type class nil this-buffer)))
 
-(defun idlwave-do-find-module (name type class
+(defun idlwave-do-find-module (name type class 
 				    &optional force-source this-buffer)
   (let ((name1 (idlwave-make-full-name class name))
-	source buf1 entry
+	source buf1 entry 
 	(buf (current-buffer))
 	(pos (point))
 	file name2)
@@ -7556,11 +8049,11 @@
 	  name2 (if (nth 2 entry)
 		    (idlwave-make-full-name (nth 2 entry) name)
 		  name1))
-    (if source
+    (if source	
 	(setq file (idlwave-routine-source-file source)))
     (unless file  ; Try to find it on the path.
-      (setq file
-	    (idlwave-expand-lib-file-name
+      (setq file 
+	    (idlwave-expand-lib-file-name 
 	     (if class
 		 (format "%s__define.pro" (downcase class))
 	       (format "%s.pro" (downcase name))))))
@@ -7568,14 +8061,14 @@
      ((or (null name) (equal name ""))
       (error "Abort"))
      ((eq (car source) 'system)
-      (error "Source code for system routine %s is not available"
+      (error "Source code for system routine %s is not available" 
 	     name2))
      ((or (not file) (not (file-regular-p file)))
       (error "Source code for routine %s is not available"
 	     name2))
      (t
       (when (not this-buffer)
-	(setq buf1
+	(setq buf1 
 	      (idlwave-find-file-noselect file 'find))
 	(pop-to-buffer buf1 t))
       (goto-char (point-max))
@@ -7585,7 +8078,7 @@
 		     (cond ((eq type 'fun) "function")
 			   ((eq type 'pro) "pro")
 			   (t "\\(pro\\|function\\)"))
-		     "\\>[ \t]+"
+		     "\\>[ \t]+" 
 		     (regexp-quote (downcase name2))
 		     "[^a-zA-Z0-9_$]")
 	     nil t)
@@ -7622,17 +8115,17 @@
       (cond
        ((and (eq cw 'procedure)
 	     (not (equal this-word "")))
-	(setq this-word (idlwave-sintern-routine-or-method
+	(setq this-word (idlwave-sintern-routine-or-method 
 			 this-word (nth 2 (nth 3 where))))
 	(list this-word 'pro
-	      (idlwave-determine-class
+	      (idlwave-determine-class 
 	       (cons this-word (cdr (nth 3 where)))
 	       'pro)))
-       ((and (eq cw 'function)
+       ((and (eq cw 'function) 
 	     (not (equal this-word ""))
 	     (or (eq next-char ?\()	; exclude arrays, vars.
 		 (looking-at "[a-zA-Z0-9_]*[ \t]*(")))
-	(setq this-word (idlwave-sintern-routine-or-method
+	(setq this-word (idlwave-sintern-routine-or-method 
 			 this-word (nth 2 (nth 3 where))))
 	(list this-word 'fun
 	      (idlwave-determine-class
@@ -7669,7 +8162,7 @@
       class)))
 
 (defun idlwave-fix-module-if-obj_new (module)
-  "Check if MODULE points to obj_new.
+  "Check if MODULE points to obj_new.  
 If yes, and if the cursor is in the keyword region, change to the
 appropriate Init method."
   (let* ((name (car module))
@@ -7690,7 +8183,7 @@
 			     (idlwave-sintern-class class)))))
     module))
 
-(defun idlwave-fix-keywords (name type class keywords
+(defun idlwave-fix-keywords (name type class keywords 
 				  &optional super-classes system)
   "Update a list of keywords.
 Translate OBJ_NEW, adding all super-class keywords, or all keywords
@@ -7711,34 +8204,34 @@
 			     string)
 	       (setq class (idlwave-sintern-class (match-string 1 string)))
 	       (setq idlwave-current-obj_new-class class)
-	       (setq keywords
-		     (append keywords
+	       (setq keywords 
+		     (append keywords 
 			     (idlwave-entry-keywords
 			      (idlwave-rinfo-assq
 			       (idlwave-sintern-method "INIT")
 			       'fun
 			       class
 			       (idlwave-routines)) 'do-link))))))
-
+    
     ;; If the class is `t', combine all keywords of all methods NAME
     (when (eq class t)
       (mapc (lambda (entry)
 	      (and
 	       (nth 2 entry)             ; non-nil class
 	       (eq (nth 1 entry) type)   ; correct type
-	       (setq keywords
-		     (append keywords
+	       (setq keywords 
+		     (append keywords 
 			     (idlwave-entry-keywords entry 'do-link)))))
 	    (idlwave-all-assq name (idlwave-routines)))
       (setq keywords (idlwave-uniquify keywords)))
-
+    
     ;; If we have inheritance, add all keywords from superclasses, if
     ;; the user indicated that method in `idlwave-keyword-class-inheritance'
-    (when (and
+    (when (and 
 	   super-classes
 	   idlwave-keyword-class-inheritance
 	   (stringp class)
-	   (or
+	   (or 
 	    system
 	    (assq (idlwave-sintern-keyword "_extra") keywords)
 	    (assq (idlwave-sintern-keyword "_ref_extra") keywords))
@@ -7756,7 +8249,7 @@
 		 (mapcar (lambda (k) (add-to-list 'keywords k))
 			 (idlwave-entry-keywords entry 'do-link))))
       (setq keywords (idlwave-uniquify keywords)))
-
+    
     ;; Return the final list
     keywords))
 
@@ -7781,14 +8274,14 @@
 		    (assq (idlwave-sintern-keyword "_REF_EXTRA") kwd-alist)))
 	 (completion-ignore-case t)
 	 candidates)
-    (cond ((assq kwd kwd-alist)
+    (cond ((assq kwd kwd-alist) 
 	   kwd)
 	  ((setq candidates (all-completions kwd kwd-alist))
 	   (if (= (length candidates) 1)
 	       (car candidates)
 	     candidates))
 	  ((and entry extra)
-	   ;; Inheritance may cause this keyword to be correct
+	   ;; Inheritance may cause this keyword to be correct 
 	   keyword)
 	  (entry
 	   ;; We do know the function, which does not have the keyword.
@@ -7800,13 +8293,13 @@
 
 (defvar idlwave-rinfo-mouse-map (make-sparse-keymap))
 (defvar idlwave-rinfo-map (make-sparse-keymap))
-(define-key idlwave-rinfo-mouse-map
+(define-key idlwave-rinfo-mouse-map 
   (if (featurep 'xemacs) [button2] [mouse-2])
   'idlwave-mouse-active-rinfo)
-(define-key idlwave-rinfo-mouse-map
+(define-key idlwave-rinfo-mouse-map 
   (if (featurep 'xemacs) [(shift button2)] [(shift mouse-2)])
   'idlwave-mouse-active-rinfo-shift)
-(define-key idlwave-rinfo-mouse-map
+(define-key idlwave-rinfo-mouse-map 
   (if (featurep 'xemacs) [button3] [mouse-3])
   'idlwave-mouse-active-rinfo-right)
 (define-key idlwave-rinfo-mouse-map " " 'idlwave-active-rinfo-space)
@@ -7832,7 +8325,7 @@
   (let* ((initial-class (or initial-class class))
 	 (entry (or (idlwave-best-rinfo-assq name type class
 					     (idlwave-routines))
-		    (idlwave-rinfo-assq name type class
+		    (idlwave-rinfo-assq name type class 
 					idlwave-unresolved-routines)))
 	 (name (or (car entry) name))
 	 (class (or (nth 2 entry) class))
@@ -7855,9 +8348,9 @@
 	 (col 0)
 	 (data (list name type class (current-buffer) nil initial-class))
 	 (km-prop (if (featurep 'xemacs) 'keymap 'local-map))
-	 (face 'idlwave-help-link-face)
+	 (face 'idlwave-help-link)
 	 beg props win cnt total)
-    ;; Fix keywords, but don't add chained super-classes, since these
+    ;; Fix keywords, but don't add chained super-classes, since these 
     ;; are shown separately for that super-class
     (setq keywords (idlwave-fix-keywords name type class keywords))
     (cond
@@ -7899,7 +8392,7 @@
 			  km-prop idlwave-rinfo-mouse-map
 			  'help-echo help-echo-use
 			  'data (cons 'usage data)))
-	(if html-file (setq props (append (list 'face face 'link html-file)
+	(if html-file (setq props (append (list 'face face 'link html-file) 
 					  props)))
 	(insert "Usage:    ")
 	(setq beg (point))
@@ -7908,14 +8401,14 @@
 		  (format calling-seq name name name name))
 		"\n")
 	(add-text-properties beg (point) props)
-
+	
 	(insert "Keywords:")
 	(if (null keywords)
 	    (insert " No keywords accepted.")
 	  (setq col 9)
 	  (mapcar
 	   (lambda (x)
-	     (if (>= (+ col 1 (length (car x)))
+	     (if (>= (+ col 1 (length (car x))) 
 		     (window-width))
 		 (progn
 		   (insert "\n         ")
@@ -7933,7 +8426,7 @@
 	     (add-text-properties beg (point) props)
 	     (setq col (+ col 1 (length (car x)))))
 	   keywords))
-
+	
 	(setq cnt 1 total (length all))
 	;; Here entry is (key file (list of type-conses))
 	(while (setq entry (pop all))
@@ -7946,7 +8439,7 @@
 					  (cdr (car (nth 2 entry))))
 			    'data (cons 'source data)))
 	  (idlwave-insert-source-location
-	   (format "\n%-8s  %s"
+	   (format "\n%-8s  %s" 
 		   (if (equal cnt 1)
 		       (if (> total 1) "Sources:" "Source:")
 		     "")
@@ -7955,7 +8448,7 @@
 	  (incf cnt)
 	  (when (and all (> cnt idlwave-rinfo-max-source-lines))
 	    ;; No more source lines, please
-	    (insert (format
+	    (insert (format 
 		     "\n          Source information truncated to %d entries."
 		     idlwave-rinfo-max-source-lines))
 	    (setq all nil)))
@@ -7969,7 +8462,7 @@
 	      (unwind-protect
 		  (progn
 		    (select-window win)
-		    (enlarge-window (- (/ (frame-height) 2)
+		    (enlarge-window (- (/ (frame-height) 2) 
 				       (window-height)))
 		    (shrink-window-if-larger-than-buffer))
 		(select-window ww)))))))))
@@ -8006,9 +8499,9 @@
      ((and (not file) shell-flag)
       (insert "Unresolved"))
 
-     ((null file)
+     ((null file)               
       (insert "ERROR"))
-
+     
      ((idlwave-syslib-p file)
       (if (string-match "obsolete" (file-name-directory file))
 	  (insert "Obsolete  ")
@@ -8022,7 +8515,7 @@
      ;; Old special syntax: a matching regexp
      ((setq special (idlwave-special-lib-test file))
       (insert (format "%-10s" special)))
-
+     
      ;; Catch-all with file
      ((idlwave-lib-p file)      (insert "Library   "))
 
@@ -8037,7 +8530,7 @@
 	       (if shell-flag "S" "-")
 	       (if buffer-flag "B" "-")
 	       "] ")))
-    (when (> ndupl 1)
+    (when (> ndupl 1) 
       (setq beg (point))
       (insert (format "(%dx) " ndupl))
       (add-text-properties beg (point) (list 'face 'bold)))
@@ -8061,7 +8554,7 @@
 		  alist nil)))
       rtn)
      (t nil))))
-
+  
 (defun idlwave-mouse-active-rinfo-right (ev)
   (interactive "e")
   (idlwave-mouse-active-rinfo ev 'right))
@@ -8080,7 +8573,7 @@
 was pressed."
   (interactive "e")
   (if ev (mouse-set-point ev))
-  (let (data id name type class buf bufwin source link keyword
+  (let (data id name type class buf bufwin source link keyword 
 	     word initial-class)
     (setq data (get-text-property (point) 'data)
 	  source (get-text-property (point) 'source)
@@ -8095,9 +8588,9 @@
 
     (cond ((eq id 'class) ; Switch class being displayed
 	   (if (window-live-p bufwin) (select-window bufwin))
-	   (idlwave-display-calling-sequence
+	   (idlwave-display-calling-sequence 
 	    (idlwave-sintern-method name)
-	    type (idlwave-sintern-class word)
+	    type (idlwave-sintern-class word) 
 	    initial-class))
 	  ((eq id 'usage) ; Online help on this routine
 	   (idlwave-online-help link name type class))
@@ -8138,9 +8631,9 @@
       (setq bwin (get-buffer-window buffer)))
     (if (eq (preceding-char) ?/)
 	(insert keyword)
-      (unless (save-excursion
+      (unless (save-excursion 
 		(re-search-backward
-		 "[(,][ \t]*\\(\\$[ \t]*\\(;.*\\)?\n\\)?[ \t]*\\="
+		 "[(,][ \t]*\\(\\$[ \t]*\\(;.*\\)?\n\\)?[ \t]*\\=" 
 		 (min (- (point) 100) (point-min)) t))
 	(insert ", "))
       (if shift (insert "/"))
@@ -8192,7 +8685,7 @@
 command can be used to detect possible name clashes during this process."
   (idlwave-routines)  ; Make sure everything is loaded.
   (unless (or idlwave-user-catalog-routines idlwave-library-catalog-routines)
-    (or (y-or-n-p
+    (or (y-or-n-p 
 	 "You don't have any user or library catalogs.  Continue anyway? ")
 	(error "Abort")))
   (let* ((routines (append idlwave-system-routines
@@ -8205,11 +8698,10 @@
 	 (keymap (make-sparse-keymap))
 	 (props (list 'mouse-face 'highlight
 		      km-prop keymap
-		      'help-echo "Mouse2: Find source"))
+		      'help-echo "Mouse2: Find source"))      
 	 (nroutines (length (or special-routines routines)))
-	 (step (/ nroutines 99))
+	 (step (/ nroutines 100))
 	 (n 0)
-	 (next-perc 1)
 	 (cnt 0)
 	 (idlwave-sort-prefer-buffer-info nil)
 	 routine twins dtwins twin done props1 lroutines)
@@ -8229,13 +8721,13 @@
     (message "Sorting routines...done")
 
     (define-key keymap (if (featurep 'xemacs) [(button2)] [(mouse-2)])
-      (lambda (ev)
+      (lambda (ev) 
 	(interactive "e")
 	(mouse-set-point ev)
 	(apply 'idlwave-do-find-module
 	       (get-text-property (point) 'find-args))))
     (define-key keymap [(return)]
-      (lambda ()
+      (lambda () 
 	(interactive)
 	(apply 'idlwave-do-find-module
 	       (get-text-property (point) 'find-args))))
@@ -8245,11 +8737,9 @@
       (setq buffer-read-only nil)
       (erase-buffer)
       (while (setq routine (pop routines))
-	(setq n (1+ n))
-	(if (= (* next-perc step) n)
-	    (progn
-	      (message "Compiling list...(%2d%%)" next-perc)
-	      (setq next-perc (1+ next-perc))))
+	(if (= (mod (setq n (1+ n)) step) 0)
+	    (message "Compiling list...(%2d%%)" (/ (* n 100) nroutines)))
+
 	;; Get a list of all twins
 	(setq twins (idlwave-routine-twins routine (or lroutines routines)))
 	(if (memq routine done)
@@ -8263,13 +8753,13 @@
 		  (> (idlwave-count-memq 'buffer (nth 2 (car dtwins))) 1))
 	  (incf cnt)
 	  (insert (format "\n%s%s"
-			  (idlwave-make-full-name (nth 2 routine)
+			  (idlwave-make-full-name (nth 2 routine) 
 						  (car routine))
 			  (if (eq (nth 1 routine) 'fun) "()" "")))
 	  (while (setq twin (pop dtwins))
 	    (setq props1 (append (list 'find-args
-				       (list (nth 0 routine)
-					     (nth 1 routine)
+				       (list (nth 0 routine) 
+					     (nth 1 routine) 
 					     (nth 2 routine)))
 				 props))
 	    (idlwave-insert-source-location "\n   - " twin props1))))
@@ -8292,7 +8782,7 @@
 	     (or (not (stringp sfile))
 		 (not (string-match "\\S-" sfile))))
 	(setq stype 'unresolved))
-    (princ (format "      %-10s %s\n"
+    (princ (format "      %-10s %s\n" 
 		   stype
 		   (if sfile sfile "No source code available")))))
 
@@ -8311,20 +8801,20 @@
 	       (eq type (nth 1 candidate))
 	       (eq class (nth 2 candidate)))
 	  (push candidate twins)))
-    (if (setq candidate (idlwave-rinfo-assq name type class
+    (if (setq candidate (idlwave-rinfo-assq name type class 
 					    idlwave-unresolved-routines))
 	(push candidate twins))
     (cons entry (nreverse twins))))
 
 (defun idlwave-study-twins (entries)
-  "Return dangerous twins of first entry in ENTRIES.
+  "Return dangerous twins of first entry in ENTRIES.  
 Dangerous twins are routines with same name, but in different files on
 the load path.  If a file is in the system library and has an entry in
 the `idlwave-system-routines' list, we omit the latter as
 non-dangerous because many IDL routines are implemented as library
 routines, and may have been scanned."
   (let* ((entry (car entries))
-	 (name (car entry))      ;
+	 (name (car entry))      ; 
 	 (type (nth 1 entry))    ; Must be bound for
 	 (class (nth 2 entry))   ;  idlwave-routine-twin-compare
 	 (cnt 0)
@@ -8342,23 +8832,23 @@
 		      (t 'unresolved)))
 
       ;; Check for an entry in the system library
-      (if (and file
+      (if (and file 
 	       (not syslibp)
 	       (idlwave-syslib-p file))
 	  (setq syslibp t))
-
+      
       ;; If there's more than one matching entry for the same file, just
       ;; append the type-cons to the type list.
       (if (setq entry (assoc key alist))
 	  (push type-cons (nth 2 entry))
 	(push (list key file (list type-cons)) alist)))
-
+    
     (setq alist (nreverse alist))
-
+    
     (when syslibp
       ;; File is in system *library* - remove any 'system entry
       (setq alist (delq (assq 'system alist) alist)))
-
+    
     ;; If 'system remains and we've scanned the syslib, it's a builtin
     ;; (rather than a !DIR/lib/.pro file bundled as source).
     (when (and (idlwave-syslib-scanned-p)
@@ -8394,7 +8884,7 @@
      ((not (eq type (nth 1 b)))
       ;; Type decides
       (< (if (eq type 'fun) 1 0) (if (eq (nth 1 b) 'fun) 1 0)))
-     (t
+     (t	
       ;; A and B are twins - so the decision is more complicated.
       ;; Call twin-compare with the proper arguments.
       (idlwave-routine-entry-compare-twins a b)))))
@@ -8446,7 +8936,7 @@
 	 (tpath-alist (idlwave-true-path-alist))
 	 (apathp (and (stringp akey)
 		      (assoc (file-name-directory akey) tpath-alist)))
-	 (bpathp (and (stringp bkey)
+	 (bpathp (and (stringp bkey) 
 		      (assoc (file-name-directory bkey) tpath-alist)))
 	 ;; How early on search path?  High number means early since we
 	 ;; measure the tail of the path list
@@ -8482,7 +8972,7 @@
      (t                                nil))))	; Default
 
 (defun idlwave-routine-source-file (source)
-  (if (nth 2 source)
+  (if (nth 2 source) 
       (expand-file-name (nth 1 source) (nth 2 source))
     (nth 1 source)))
 
@@ -8572,7 +9062,7 @@
   (forward-sexp 2)
   (forward-sexp -1)
   (let ((begin (point)))
-    (re-search-forward
+    (re-search-forward 
      "[a-zA-Z_][a-zA-Z0-9$_]+\\(::[a-zA-Z_][a-zA-Z0-9$_]+\\)?")
     (if (fboundp 'buffer-substring-no-properties)
         (buffer-substring-no-properties begin (point))
@@ -8611,13 +9101,16 @@
   (interactive)
   (start-process "idldeclient" nil
 		 idlwave-shell-explicit-file-name "-c" "-e"
-                 (buffer-file-name) "&"))
-
+                 (buffer-file-name)))
+  
+(defvar idlwave-help-use-assistant)
 (defun idlwave-launch-idlhelp ()
   "Start the IDLhelp application."
   (interactive)
-  (start-process "idlhelp" nil idlwave-help-application))
-
+  (if idlwave-help-use-assistant
+      (idlwave-help-assistant-raise)
+    (start-process "idlhelp" nil idlwave-help-application)))
+ 
 ;; Menus - using easymenu.el
 (defvar idlwave-mode-menu-def
   `("IDLWAVE"
@@ -8636,8 +9129,10 @@
      ["Block" idlwave-mark-block t]
      ["Header" idlwave-mark-doclib t])
     ("Format"
+     ["Indent Entire Statement" idlwave-indent-statement 
+      :active t :keys "C-u \\[indent-for-tab-command]" ]
      ["Indent Subprogram" idlwave-indent-subprogram t]
-     ["(Un)Comment Region" idlwave-toggle-comment-region "C-c ;"]
+     ["(Un)Comment Region" idlwave-toggle-comment-region t]
      ["Continue/Split line" idlwave-split-line t]
      "--"
      ["Toggle Auto Fill" idlwave-auto-fill-mode :style toggle
@@ -8656,7 +9151,7 @@
      ["Close Block" idlwave-close-block t])
     ("Completion"
      ["Complete" idlwave-complete t]
-     ("Complete Special"
+     ("Complete Specific"
       ["1 Procedure Name" (idlwave-complete 'procedure) t]
       ["2 Procedure Keyword" (idlwave-complete 'procedure-keyword) t]
       "--"
@@ -8678,6 +9173,7 @@
      ["Resolve Routine" idlwave-resolve (featurep 'idlw-shell)]
      "--"
      ["Update Routine Info" idlwave-update-routine-info t]
+     ["Rescan XML Help Catalog" idlwave-convert-xml-system-routine-info t]
      "--"
      "IDL User Catalog"
      ["Select Catalog Directories" (idlwave-create-user-catalog-file nil) t]
@@ -8696,7 +9192,6 @@
      ["Insert TAB character" idlwave-hard-tab t])
      "--"
     ("External"
-     ["Generate IDL tags" idlwave-make-tags t]
      ["Start IDL shell" idlwave-shell t]
      ["Edit file in IDLDE" idlwave-edit-in-idlde t]
      ["Launch IDL Help" idlwave-launch-idlhelp t])
@@ -8704,7 +9199,7 @@
     ("Customize"
      ["Browse IDLWAVE Group" idlwave-customize t]
      "--"
-     ["Build Full Customize Menu" idlwave-create-customize-menu
+     ["Build Full Customize Menu" idlwave-create-customize-menu 
       (fboundp 'customize-menu-create)])
     ("Documentation"
      ["Describe Mode" describe-mode t]
@@ -8721,22 +9216,22 @@
   '("Debug"
     ["Start IDL shell" idlwave-shell t]
     ["Save and .RUN buffer" idlwave-shell-save-and-run
-     (and (boundp 'idlwave-shell-automatic-start)
+     (and (boundp 'idlwave-shell-automatic-start) 
 	  idlwave-shell-automatic-start)]))
 
 (if (or (featurep 'easymenu) (load "easymenu" t))
     (progn
-      (easy-menu-define idlwave-mode-menu idlwave-mode-map
-			"IDL and WAVE CL editing menu"
+      (easy-menu-define idlwave-mode-menu idlwave-mode-map 
+			"IDL and WAVE CL editing menu" 
 			idlwave-mode-menu-def)
-      (easy-menu-define idlwave-mode-debug-menu idlwave-mode-map
-			"IDL and WAVE CL editing menu"
+      (easy-menu-define idlwave-mode-debug-menu idlwave-mode-map 
+			"IDL and WAVE CL editing menu" 
 			idlwave-mode-debug-menu-def)))
 
 (defun idlwave-customize ()
   "Call the customize function with idlwave as argument."
   (interactive)
-  ;; Try to load the code for the shell, so that we can customize it
+  ;; Try to load the code for the shell, so that we can customize it 
   ;; as well.
   (or (featurep 'idlw-shell)
       (load "idlw-shell" t))
@@ -8747,11 +9242,11 @@
   (interactive)
   (if (fboundp 'customize-menu-create)
       (progn
-	;; Try to load the code for the shell, so that we can customize it
+	;; Try to load the code for the shell, so that we can customize it 
 	;; as well.
 	(or (featurep 'idlw-shell)
 	    (load "idlw-shell" t))
-	(easy-menu-change
+	(easy-menu-change 
 	 '("IDLWAVE") "Customize"
 	 `(["Browse IDLWAVE group" idlwave-customize t]
 	   "--"
@@ -8799,7 +9294,7 @@
   (let ((table (symbol-value 'idlwave-mode-abbrev-table))
 	abbrevs
 	str rpl func fmt (len-str 0) (len-rpl 0))
-    (mapatoms
+    (mapatoms 
      (lambda (sym)
        (if (symbol-value sym)
 	   (progn
@@ -8825,7 +9320,7 @@
     (with-output-to-temp-buffer "*Help*"
       (if arg
 	  (progn
-	    (princ "Abbreviations and Actions in IDLWAVE-Mode\n")
+	    (princ "Abbreviations and Actions in IDLWAVE-Mode\n") 
 	    (princ "=========================================\n\n")
 	    (princ (format fmt "KEY" "REPLACE" "HOOK"))
 	    (princ (format fmt "---" "-------" "----")))
@@ -8852,7 +9347,7 @@
 ;; Will only work on systems which support this.
 (or idlwave-routines (idlwave-start-load-rinfo-timer))
 
-;;;###autoload(add-to-list 'auto-mode-alist '("\\.[Pp][Rr][Oo]\\'" . idlwave-mode))
+;;;###autoload (add-to-list 'auto-mode-alist '("\\.[Pp][Rr][Oo]\\'" . idlwave-mode))
 
 ;; Run the hook
 (run-hooks 'idlwave-load-hook)
--- a/lisp/recentf.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/recentf.el	Sun Apr 09 00:38:22 2006 +0000
@@ -1165,7 +1165,7 @@
            :button-prefix ""
            :button-suffix ""
            :button-face default
-           :format "%[%t%]\n"
+           :format "%[%t\n%]"
            :help-echo ,(concat "Open " (cdr menu-element))
            :action recentf-open-files-action
            ,(cdr menu-element))))
--- a/lisp/rect.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/rect.el	Sun Apr 09 00:38:22 2006 +0000
@@ -141,8 +141,7 @@
       ;; else
       (setq pt (point))
       (move-to-column endcol t)
-      (setcdr lines (cons (buffer-substring pt (point)) (cdr lines)))
-      (delete-region pt (point)))
+      (setcdr lines (cons (filter-buffer-substring pt (point) t) (cdr lines))))
     ))
 
 ;; ### NOTE: this is actually the only function that needs to do complicated
@@ -233,12 +232,22 @@
 You might prefer to use `delete-extract-rectangle' from a program.
 
 With a prefix (or a FILL) argument, also fill lines where nothing has to be
-deleted."
-  (interactive "*r\nP")
-  (when buffer-read-only
-    (setq killed-rectangle (extract-rectangle start end))
-    (barf-if-buffer-read-only))
-  (setq killed-rectangle (delete-extract-rectangle start end fill)))
+deleted.
+
+If the buffer is read-only, Emacs will beep and refrain from deleting
+the rectangle, but put it in the kill ring anyway.  This means that
+you can use this command to copy text from a read-only buffer.
+\(If the variable `kill-read-only-ok' is non-nil, then this won't
+even beep.)"
+  (interactive "r\nP")
+  (condition-case nil
+      (setq killed-rectangle (delete-extract-rectangle start end fill))
+    ((buffer-read-only text-read-only)
+     (setq killed-rectangle (extract-rectangle start end))
+     (if kill-read-only-ok
+	 (progn (message "Read only text copied to kill ring") nil)
+       (barf-if-buffer-read-only)
+       (signal 'text-read-only (list (current-buffer)))))))
 
 ;; this one is untouched --dv
 ;;;###autoload
--- a/lisp/savehist.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/savehist.el	Sun Apr 09 00:38:22 2006 +0000
@@ -56,6 +56,7 @@
 
 (defgroup savehist nil
   "Save minibuffer history."
+  :version "22.1"
   :group 'minibuffer)
 
 ;;;###autoload
@@ -91,6 +92,11 @@
   :type '(repeat variable)
   :group 'savehist)
 
+(defcustom savehist-ignored-variables nil ;; '(command-history)
+  "*List of additional variables not to save."
+  :type '(repeat variable)
+  :group 'savehist)
+
 (defcustom savehist-file
   (cond
    ;; Backward compatibility with previous versions of savehist.
@@ -371,9 +377,10 @@
 	(error nil))))))
 
 (defun savehist-minibuffer-hook ()
-  ;; XEmacs sets minibuffer-history-variable to t to mean "no history
-  ;; is being recorded".
-  (unless (eq minibuffer-history-variable t)
+  (unless (or (eq minibuffer-history-variable t)
+	      ;; XEmacs sets minibuffer-history-variable to t to mean "no
+	      ;; history is being recorded".
+	      (memq minibuffer-history-variable savehist-ignored-variables))
     (add-to-list 'savehist-minibuffer-history-variables
 		 minibuffer-history-variable)))
 
--- a/lisp/simple.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/simple.el	Sun Apr 09 00:38:22 2006 +0000
@@ -1050,7 +1050,10 @@
 Value is also consed on to front of the variable `values'.
 Optional argument EVAL-EXPRESSION-INSERT-VALUE, if non-nil, means
 insert the result into the current buffer instead of printing it in
-the echo area."
+the echo area.
+
+If `eval-expression-debug-on-error' is non-nil, which is the default,
+this command arranges for all errors to enter the debugger."
   (interactive
    (list (read-from-minibuffer "Eval: "
 			       nil read-expression-map t
--- a/lisp/sort.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/sort.el	Sun Apr 09 00:38:22 2006 +0000
@@ -121,9 +121,6 @@
 (defun sort-build-lists (nextrecfun endrecfun startkeyfun endkeyfun)
   (let ((sort-lists ())
 	(start-rec nil)
-	;; To avoid such functins as `end-of-line' being affected by
-	;; fields.
-	(inhibit-field-text-motion t)
 	done key)
     ;; Loop over sort records.
     ;(goto-char (point-min)) -- it is the caller's responsibility to
@@ -205,7 +202,9 @@
     (save-restriction
       (narrow-to-region beg end)
       (goto-char (point-min))
-      (sort-subr reverse 'forward-line 'end-of-line))))
+      (let ;; To make `end-of-line' and etc. to ignore fields.
+	  ((inhibit-field-text-motion t))
+	(sort-subr reverse 'forward-line 'end-of-line)))))
 
 ;;;###autoload
 (defun sort-paragraphs (reverse beg end)
@@ -271,25 +270,27 @@
 Called from a program, there are three arguments:
 FIELD, BEG and END.  BEG and END specify region to sort."
   (interactive "p\nr")
-  (sort-fields-1 field beg end
-		 (lambda ()
-		   (sort-skip-fields field)
-		   (let* ((case-fold-search t)
-			  (base
-			   (if (looking-at "\\(0x\\)[0-9a-f]\\|\\(0\\)[0-7]")
-			       (cond ((match-beginning 1)
-				      (goto-char (match-end 1))
-				      16)
-				     ((match-beginning 2)
-				      (goto-char (match-end 2))
-				      8)
-				     (t nil)))))
-		     (string-to-number (buffer-substring (point)
-							 (save-excursion
-							   (forward-sexp 1)
-							   (point)))
-				       (or base sort-numeric-base))))
-		 nil))
+  (let ;; To make `end-of-line' and etc. to ignore fields.
+      ((inhibit-field-text-motion t))
+    (sort-fields-1 field beg end
+		   (lambda ()
+		     (sort-skip-fields field)
+		     (let* ((case-fold-search t)
+			    (base
+			     (if (looking-at "\\(0x\\)[0-9a-f]\\|\\(0\\)[0-7]")
+				 (cond ((match-beginning 1)
+					(goto-char (match-end 1))
+					16)
+				       ((match-beginning 2)
+					(goto-char (match-end 2))
+					8)
+				       (t nil)))))
+		       (string-to-number (buffer-substring (point)
+							   (save-excursion
+							     (forward-sexp 1)
+							     (point)))
+					 (or base sort-numeric-base))))
+		   nil)))
 
 ;;;;;###autoload
 ;;(defun sort-float-fields (field beg end)
@@ -322,11 +323,13 @@
 The variable `sort-fold-case' determines whether alphabetic case affects
 the sort order."
   (interactive "p\nr")
-  (sort-fields-1 field beg end
-		 (function (lambda ()
-			     (sort-skip-fields field)
-			     nil))
-		 (function (lambda () (skip-chars-forward "^ \t\n")))))
+  (let ;; To make `end-of-line' and etc. to ignore fields.
+      ((inhibit-field-text-motion t))
+    (sort-fields-1 field beg end
+		   (function (lambda ()
+			       (sort-skip-fields field)
+			       nil))
+		   (function (lambda () (skip-chars-forward "^ \t\n"))))))
 
 (defun sort-fields-1 (field beg end startkeyfun endkeyfun)
   (let ((tbl (syntax-table)))
@@ -471,7 +474,9 @@
 Use \\[untabify] to convert tabs to spaces before sorting."
   (interactive "P\nr")
   (save-excursion
-    (let (beg1 end1 col-beg1 col-end1 col-start col-end)
+    (let ;; To make `end-of-line' and etc. to ignore fields.
+	((inhibit-field-text-motion t)
+	 beg1 end1 col-beg1 col-end1 col-start col-end)
       (goto-char (min beg end))
       (setq col-beg1 (current-column))
       (beginning-of-line)
--- a/lisp/startup.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/startup.el	Sun Apr 09 00:38:22 2006 +0000
@@ -1337,6 +1337,7 @@
 	(fancy-splash-outer-buffer (current-buffer))
 	splash-buffer
 	(old-minor-mode-map-alist minor-mode-map-alist)
+	(old-emulation-mode-map-alists emulation-mode-map-alists)
 	(frame (fancy-splash-frame))
 	timer)
     (save-selected-window
@@ -1355,6 +1356,7 @@
 	      (setq cursor-type nil
 		    display-hourglass nil
 		    minor-mode-map-alist nil
+		    emulation-mode-map-alists nil
 		    buffer-undo-list t
 		    mode-line-format (propertize "---- %b %-"
 						 'face '(:weight bold))
@@ -1366,7 +1368,8 @@
 	      (recursive-edit))
 	  (cancel-timer timer)
 	  (setq display-hourglass old-hourglass
-		minor-mode-map-alist old-minor-mode-map-alist)
+		minor-mode-map-alist old-minor-mode-map-alist
+		emulation-mode-map-alists old-emulation-mode-map-alists)
 	  (kill-buffer splash-buffer))))))
 
 (defun fancy-splash-frame ()
@@ -1403,31 +1406,31 @@
   (let ((prev-buffer (current-buffer)))
     (unwind-protect
 	(with-current-buffer (get-buffer-create "GNU Emacs")
-	  (let ((tab-width 8)
-		(mode-line-format (propertize "---- %b %-"
-					      'face '(:weight bold))))
+	  (set (make-local-variable 'tab-width) 8)
+          (set (make-local-variable 'mode-line-format)
+               (propertize "---- %b %-" 'face '(:weight bold)))
 
-	    (if pure-space-overflow
-		(insert "Warning Warning  Pure space overflow   Warning Warning\n"))
+          (if pure-space-overflow
+              (insert "Warning Warning  Pure space overflow   Warning Warning\n"))
 
-	    ;; The convention for this piece of code is that
-	    ;; each piece of output starts with one or two newlines
-	    ;; and does not end with any newlines.
-	    (insert "Welcome to GNU Emacs")
-	    (insert
-	     (if (eq system-type 'gnu/linux)
-		 ", one component of the GNU/Linux operating system.\n"
-	       ", a part of the GNU operating system.\n"))
+          ;; The convention for this piece of code is that
+          ;; each piece of output starts with one or two newlines
+          ;; and does not end with any newlines.
+          (insert "Welcome to GNU Emacs")
+          (insert
+           (if (eq system-type 'gnu/linux)
+               ", one component of the GNU/Linux operating system.\n"
+             ", a part of the GNU operating system.\n"))
 
-	    (unless (equal (buffer-name prev-buffer) "*scratch*")
-	      (insert (substitute-command-keys
-		       "\nType \\[recenter] to begin editing your file.\n")))
+          (unless (equal (buffer-name prev-buffer) "*scratch*")
+            (insert (substitute-command-keys
+                     "\nType \\[recenter] to begin editing your file.\n")))
 
-	    (if (display-mouse-p)
-		;; The user can use the mouse to activate menus
-		;; so give help in terms of menu items.
-		(progn
-		  (insert "\
+          (if (display-mouse-p)
+              ;; The user can use the mouse to activate menus
+              ;; so give help in terms of menu items.
+              (progn
+                (insert "\
 You can do basic editing with the menu bar and scroll bar using the mouse.
 
 Useful File menu items:
@@ -1443,101 +1446,109 @@
 Getting New Versions	How to obtain the latest version of Emacs
 More Manuals / Ordering Manuals    How to order printed manuals from the FSF
 ")
-		  (insert "\n\n" (emacs-version)
-			  "
+                (insert "\n\n" (emacs-version)
+                        "
 Copyright (C) 2006 Free Software Foundation, Inc."))
 
-	      ;; No mouse menus, so give help using kbd commands.
+            ;; No mouse menus, so give help using kbd commands.
 
-	      ;; If keys have their default meanings,
-	      ;; use precomputed string to save lots of time.
-	      (if (and (eq (key-binding "\C-h") 'help-command)
-		       (eq (key-binding "\C-xu") 'advertised-undo)
-		       (eq (key-binding "\C-x\C-c") 'save-buffers-kill-emacs)
-		       (eq (key-binding "\C-ht") 'help-with-tutorial)
-		       (eq (key-binding "\C-hi") 'info)
-		       (eq (key-binding "\C-hr") 'info-emacs-manual)
-		       (eq (key-binding "\C-h\C-n") 'view-emacs-news))
-		  (insert "
+            ;; If keys have their default meanings,
+            ;; use precomputed string to save lots of time.
+            (if (and (eq (key-binding "\C-h") 'help-command)
+                     (eq (key-binding "\C-xu") 'advertised-undo)
+                     (eq (key-binding "\C-x\C-c") 'save-buffers-kill-emacs)
+                     (eq (key-binding "\C-ht") 'help-with-tutorial)
+                     (eq (key-binding "\C-hi") 'info)
+                     (eq (key-binding "\C-hr") 'info-emacs-manual)
+                     (eq (key-binding "\C-h\C-n") 'view-emacs-news))
+                (insert "
 Get help	   C-h  (Hold down CTRL and press h)
 Emacs manual	   C-h r
 Emacs tutorial	   C-h t           Undo changes     C-x u
 Buy manuals        C-h C-m         Exit Emacs	    C-x C-c
 Browse manuals     C-h i")
 
-		(insert (substitute-command-keys
-			 (format "\n
+              (insert (substitute-command-keys
+                       (format "\n
 Get help	   %s
 Emacs manual	   \\[info-emacs-manual]
 Emacs tutorial	   \\[help-with-tutorial]\tUndo changes\t\\[advertised-undo]
 Buy manuals        \\[view-order-manuals]\tExit Emacs\t\\[save-buffers-kill-emacs]
 Browse manuals     \\[info]"
-				 (let ((where (where-is-internal
-					       'help-command nil t)))
-				   (if where
-				       (key-description where)
-				     "M-x help"))))))
+                               (let ((where (where-is-internal
+                                             'help-command nil t)))
+                                 (if where
+                                     (key-description where)
+                                   "M-x help"))))))
 
-	      ;; Say how to use the menu bar with the keyboard.
-	      (if (and (eq (key-binding "\M-`") 'tmm-menubar)
-		       (eq (key-binding [f10]) 'tmm-menubar))
-		  (insert "
+            ;; Say how to use the menu bar with the keyboard.
+            (if (and (eq (key-binding "\M-`") 'tmm-menubar)
+                     (eq (key-binding [f10]) 'tmm-menubar))
+                (insert "
 Activate menubar   F10  or  ESC `  or   M-`")
-		(insert (substitute-command-keys "
+              (insert (substitute-command-keys "
 Activate menubar     \\[tmm-menubar]")))
 
-	      ;; Many users seem to have problems with these.
-	      (insert "
+            ;; Many users seem to have problems with these.
+            (insert "
 \(`C-' means use the CTRL key.  `M-' means use the Meta (or Alt) key.
 If you have no Meta key, you may instead type ESC followed by the character.)")
 
-	      (insert "\n\n" (emacs-version)
-		      "
+            (insert "\n\n" (emacs-version)
+                    "
 Copyright (C) 2006 Free Software Foundation, Inc.")
 
-	      (if (and (eq (key-binding "\C-h\C-c") 'describe-copying)
-		       (eq (key-binding "\C-h\C-d") 'describe-distribution)
-		       (eq (key-binding "\C-h\C-w") 'describe-no-warranty))
-		  (insert
-		   "\n
+            (if (and (eq (key-binding "\C-h\C-c") 'describe-copying)
+                     (eq (key-binding "\C-h\C-d") 'describe-distribution)
+                     (eq (key-binding "\C-h\C-w") 'describe-no-warranty))
+                (insert
+                 "\n
 GNU Emacs comes with ABSOLUTELY NO WARRANTY; type C-h C-w for full details.
 Emacs is Free Software--Free as in Freedom--so you can redistribute copies
 of Emacs and modify it; type C-h C-c to see the conditions.
 Type C-h C-d for information on getting the latest version.")
-		(insert (substitute-command-keys
-			 "\n
+              (insert (substitute-command-keys
+                       "\n
 GNU Emacs comes with ABSOLUTELY NO WARRANTY; type \\[describe-no-warranty] for full details.
 Emacs is Free Software--Free as in Freedom--so you can redistribute copies
 of Emacs and modify it; type \\[describe-copying] to see the conditions.
 Type \\[describe-distribution] for information on getting the latest version."))))
 
-	    ;; The rest of the startup screen is the same on all
-	    ;; kinds of terminals.
+          ;; The rest of the startup screen is the same on all
+          ;; kinds of terminals.
 
-	    ;; Give information on recovering, if there was a crash.
-	    (and auto-save-list-file-prefix
-		 ;; Don't signal an error if the
-		 ;; directory for auto-save-list files
-		 ;; does not yet exist.
-		 (file-directory-p (file-name-directory
-				    auto-save-list-file-prefix))
-		 (directory-files
-		  (file-name-directory auto-save-list-file-prefix)
-		  nil
-		  (concat "\\`"
-			  (regexp-quote (file-name-nondirectory
-					 auto-save-list-file-prefix)))
-		  t)
-		 (insert "\n\nIf an Emacs session crashed recently, "
-			 "type M-x recover-session RET\nto recover"
-			 " the files you were editing."))
+          ;; Give information on recovering, if there was a crash.
+          (and auto-save-list-file-prefix
+               ;; Don't signal an error if the
+               ;; directory for auto-save-list files
+               ;; does not yet exist.
+               (file-directory-p (file-name-directory
+                                  auto-save-list-file-prefix))
+               (directory-files
+                (file-name-directory auto-save-list-file-prefix)
+                nil
+                (concat "\\`"
+                        (regexp-quote (file-name-nondirectory
+                                       auto-save-list-file-prefix)))
+                t)
+               (insert "\n\nIf an Emacs session crashed recently, "
+                       "type M-x recover-session RET\nto recover"
+                       " the files you were editing."))
 
-	    ;; Display the input that we set up in the buffer.
-	    (set-buffer-modified-p nil)
-	    (goto-char (point-min))
-	    (save-window-excursion
-	      (switch-to-buffer (current-buffer))
-	      (sit-for 120))))
+          ;; Display the input that we set up in the buffer.
+          (set-buffer-modified-p nil)
+          (goto-char (point-min))
+          (save-window-excursion
+            (condition-case nil
+                (switch-to-buffer (current-buffer))
+              ;; In case we're in a dedicated or minibuffer-only window.
+              (error
+               ;; There's no point is using pop-to-buffer since creating
+               ;; a new frame will generate enough events that the
+               ;; subsequent `sit-for' will immediately return anyway.
+               ;; (pop-to-buffer (current-buffer))
+               ))
+            (sit-for 120)))
       ;; Unwind ... ensure splash buffer is killed
       (kill-buffer "GNU Emacs"))))
 
--- a/lisp/subr.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/subr.el	Sun Apr 09 00:38:22 2006 +0000
@@ -1916,6 +1916,12 @@
 				 "\\" (substring argument end (1+ end)))
 		  start (1+ end)))
 	  (concat result (substring argument start)))))))
+
+(defun string-or-null-p (object)
+  "Return t if OBJECT is a string or nil.
+Otherwise, return nil."
+  (or (stringp object) (null object)))
+
 
 ;;;; Support for yanking and text properties.
 
--- a/lisp/textmodes/fill.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/textmodes/fill.el	Sun Apr 09 00:38:22 2006 +0000
@@ -48,6 +48,7 @@
   "*Non-nil means put two spaces after a colon when filling."
   :type 'boolean
   :group 'fill)
+;;;###autoload(put 'colon-double-space 'safe-local-variable t)
 
 (defvar fill-paragraph-function nil
   "Mode-specific function to fill a paragraph, or nil if there is none.
--- a/lisp/textmodes/ispell.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/textmodes/ispell.el	Sun Apr 09 00:38:22 2006 +0000
@@ -267,6 +267,7 @@
 may produce undesired results."
   :type '(choice (const exclusive) (const :tag "off" nil) (const :tag "on" t))
   :group 'ispell)
+;;;###autoload(put 'ispell-check-comments 'safe-local-variable (lambda (a) (memq a '(nil t exclusive))))
 
 (defcustom ispell-query-replace-choices nil
   "*Corrections made throughout region when non-nil.
@@ -461,6 +462,7 @@
   :type '(choice string
 		 (const :tag "default" nil))
   :group 'ispell)
+;;;###autoload(put 'ispell-local-dictionary 'safe-local-variable 'string-or-null-p)
 
 (make-variable-buffer-local 'ispell-local-dictionary)
 
--- a/lisp/textmodes/paragraphs.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/textmodes/paragraphs.el	Sun Apr 09 00:38:22 2006 +0000
@@ -98,6 +98,7 @@
 hard newline are considered to match."
   :group 'paragraphs
   :type 'regexp)
+;;;###autoload(put 'paragraph-start 'safe-local-variable 'stringp)
 
 ;; paragraph-start requires a hard newline, but paragraph-separate does not:
 ;; It is assumed that paragraph-separate is distinctive enough to be believed
@@ -115,6 +116,7 @@
 text indented by a margin setting."
   :group 'paragraphs
   :type 'regexp)
+;;;###autoload(put 'paragraph-separate 'safe-local-variable 'stringp)
 
 (defcustom sentence-end-double-space t
   "*Non-nil means a single space does not end a sentence.
@@ -126,6 +128,7 @@
 `sentence-end' is nil.  See Info node `(elisp)Standard Regexps'."
   :type 'boolean
   :group 'fill)
+;;;###autoload(put 'sentence-end-double-space 'safe-local-variable t)
 
 (defcustom sentence-end-without-period nil
   "*Non-nil means a sentence will end without a period.
@@ -137,6 +140,7 @@
 `sentence-end' is nil.  See Info node `(elisp)Standard Regexps'."
   :type 'boolean
   :group 'fill)
+;;;###autoload(put 'sentence-end-without-period 'safe-local-variable t)
 
 (defcustom sentence-end-without-space
   "$B!#!%!)!*$A!##.#?#!$(0!$!%!)!*$(G!$!%!)!*(B"
@@ -147,6 +151,7 @@
 `sentence-end' is nil.  See Info node `(elisp)Standard Regexps'."
   :group 'paragraphs
   :type 'string)
+;;;###autoload(put 'sentence-end-without-space 'safe-local-variable t)
 
 (defcustom sentence-end nil
   "*Regexp describing the end of a sentence.
@@ -158,12 +163,14 @@
 to obtain the value of this variable."
   :group 'paragraphs
   :type '(choice regexp (const :tag "Use default value" nil)))
+;;;###autoload(put 'sentence-end 'safe-local-variable 'string-or-null-p)
 
 (defcustom sentence-end-base "[.?!][]\"'$B!I$,1r}(B)}]*"
   "*Regexp matching the basic end of a sentence, not including following space."
   :group 'paragraphs
   :type 'string
   :version "22.1")
+;;;###autoload(put 'sentence-end-base 'safe-local-variable 'stringp)
 
 (defun sentence-end ()
   "Return the regexp describing the end of a sentence.
@@ -191,12 +198,14 @@
   "*Regexp describing line-beginnings that separate pages."
   :group 'paragraphs
   :type 'regexp)
+;;;###autoload(put 'page-delimiter 'safe-local-variable t)
 
 (defcustom paragraph-ignore-fill-prefix nil
   "*Non-nil means the paragraph commands are not affected by `fill-prefix'.
 This is desirable in modes where blank lines are the paragraph delimiters."
   :group 'paragraphs
   :type 'boolean)
+;;;###autoload(put 'paragraph-ignore-fill-prefix 'safe-local-variable t)
 
 (defun forward-paragraph (&optional arg)
   "Move forward to end of paragraph.
--- a/lisp/textmodes/reftex-vars.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/textmodes/reftex-vars.el	Sun Apr 09 00:38:22 2006 +0000
@@ -948,6 +948,7 @@
 the label types for which it should be true."
   :group  'reftex-referencing-labels
   :type `(choice :tag "\\vref is default macro" ,@reftex-tmp))
+;;;###autoload(put 'reftex-vref-is-default 'safe-local-variable t)
 
 (defcustom reftex-fref-is-default nil
   "*Non-nil means, the fancyref macro \\fref is used as default.
@@ -958,11 +959,13 @@
 the label types for which it should be true."
   :group  'reftex-referencing-labels
   :type `(choice :tag "\\fref is default macro" ,@reftex-tmp))
+;;;###autoload(put 'reftex-fref-is-default 'safe-local-variable t)
 
 (defcustom reftex-level-indent 2
   "*Number of spaces to be used for indentation per section level."
   :group 'reftex-referencing-labels
   :type 'integer)
+;;;###autoload(put 'reftex-level-indent 'safe-local-variable 'integerp)
 
 (defcustom reftex-guess-label-type t
   "*Non-nil means, `reftex-reference' will try to guess the label type.
@@ -972,6 +975,7 @@
 a label type.  If you set this variable to nil, RefTeX will always prompt."
   :group 'reftex-referencing-labels
   :type 'boolean)
+;;;###autoload(put 'reftex-guess-label-type 'safe-local-variable t)
 
 (defcustom reftex-format-ref-function nil
   "Function which produces the string to insert as a reference.
--- a/lisp/woman.el	Fri Apr 07 12:02:40 2006 +0000
+++ b/lisp/woman.el	Sun Apr 09 00:38:22 2006 +0000
@@ -381,7 +381,7 @@
 ;; code fragments, general interest, etc.:
 ;;   Jari Aalto <jari.aalto@cs.tpu.fi>
 ;;   Dean Andrews <dean@dra.com>
-;;   Juanma Barranquero <barranquero@laley-actualidad.es>
+;;   Juanma Barranquero <lekktu@gmail.com>
 ;;   Karl Berry <kb@cs.umb.edu>
 ;;   Jim Chapman <jchapman@netcomuk.co.uk>
 ;;   Kin Cho <kin@neoscale.com>
@@ -426,9 +426,15 @@
 
 (require 'man)
 (require 'button)
-(define-button-type 'WoMan-xref-man-page 
+(define-button-type 'WoMan-xref-man-page
   :supertype 'Man-abstract-xref-man-page
-  'func 'woman)
+  'func (lambda (arg)
+	  (woman
+	   ;; `woman' cannot deal with arguments that contain a
+	   ;; section name, like close(2), so strip the section name.
+	   (if (string-match Man-reference-regexp arg)
+	       (substring arg 0 (match-end 1))
+	     arg))))
 
 (eval-when-compile			; to avoid compiler warnings
   (require 'dired)
--- a/lispref/ChangeLog	Fri Apr 07 12:02:40 2006 +0000
+++ b/lispref/ChangeLog	Sun Apr 09 00:38:22 2006 +0000
@@ -1,3 +1,12 @@
+2006-04-08  Thien-Thi Nguyen  <ttn@gnu.org>
+
+	* display.texi (Other Display Specs): Arrange a @code{DOTTED-LIST} to
+	be on one line to help makeinfo not render two spaces after the dot.
+
+2006-04-07  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* strings.texi (Predicates for Strings): Add string-or-null-p.
+
 2006-03-28  Kim F. Storm  <storm@cua.dk>
 
 	* processes.texi (Accepting Output): Remove obsolete (and incorrect)
--- a/lispref/display.texi	Fri Apr 07 12:02:40 2006 +0000
+++ b/lispref/display.texi	Sun Apr 09 00:38:22 2006 +0000
@@ -3500,9 +3500,13 @@
 faces used for the text.
 @end table
 
+@c We put all the `@code{(when ...)}' on one line to encourage
+@c makeinfo's end-of-sentence heuristics to DTRT.  Previously, the dot
+@c was at eol; the info file ended up w/ two spaces rendered after it.
   You can make any display specification conditional.  To do that,
-package it in another list of the form @code{(when @var{condition} .
-@var{spec})}.  Then the specification @var{spec} applies only when
+package it in another list of the form
+@code{(when @var{condition} . @var{spec})}.
+Then the specification @var{spec} applies only when
 @var{condition} evaluates to a non-@code{nil} value.  During the
 evaluation, @code{object} is bound to the string or buffer having the
 conditional @code{display} property.  @code{position} and
--- a/lispref/strings.texi	Fri Apr 07 12:02:40 2006 +0000
+++ b/lispref/strings.texi	Sun Apr 09 00:38:22 2006 +0000
@@ -102,6 +102,11 @@
 otherwise.
 @end defun
 
+@defun string-or-null-p object
+This function returns @code{t} if @var{object} is a string or nil,
+@code{nil} otherwise.
+@end defun
+
 @defun char-or-string-p object
 This function returns @code{t} if @var{object} is a string or a
 character (i.e., an integer), @code{nil} otherwise.
--- a/man/ChangeLog	Fri Apr 07 12:02:40 2006 +0000
+++ b/man/ChangeLog	Sun Apr 09 00:38:22 2006 +0000
@@ -1,3 +1,87 @@
+2006-04-07  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* gnus.texi (Summary Buffer Lines): Add `*'.
+
+2006-04-07  Jochen K,A|(Bpper  <jochen@fhi-berlin.mpg.de>
+
+	* gnus.texi (Group Parameters): Mention
+	gnus-permanently-visible-groups.
+
+2006-04-06  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* gnus.texi (Face): Fix typo.
+
+2006-04-05  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* gnus.texi (X-Face): Clarify.
+	(Face): Need Emacs with PNG support.
+
+2006-04-08  Kevin Ryde  <user42@zip.com.au>
+
+	* text.texi (Fill Commands): fill-nobreak-predicate is now a hook.
+
+2006-04-07  Richard Stallman  <rms@gnu.org>
+
+	* programs.texi (Comments, Comment Commands, Options for Comments)
+	(Multi-Line Comments): "Align", not "indent".
+	(Basic Indent): C-j deletes trailing whitespace before the newline.
+
+2006-04-06  Richard Stallman  <rms@gnu.org>
+
+	* idlwave.texi: Delete the blocks "not suitable for inclusion with
+	Emacs".
+
+	* programs.texi (Basic Indent): Clarify relationship of C-j to TAB.
+
+2006-04-06  Eli Zaretskii  <eliz@gnu.org>
+
+	* killing.texi (Rectangles): Add index entry for marking a
+	rectangle.
+
+2006-04-06  J.D. Smith  <jdsmith@as.arizona.edu>
+
+	* idlwave.texi: Updated for IDLWAVE version 6.0, factoring out
+	blocks not suitable for inclusion with Emacs using variable
+	PARTOFEMACS.
+
+2006-04-05  Richard Stallman  <rms@gnu.org>
+
+	* emacs.texi (Top): Update subnode menu.
+
+	* trouble.texi (Unasked-for Search): Node deleted.
+	(Lossage): Delete from menu.
+
+2006-04-04  Richard Stallman  <rms@gnu.org>
+
+	* trouble.texi: Various cleanups.
+	(Checklist): Don't bother saying how to snail a bug report.
+	(Emergency Escape): Much rewriting.
+	(After a Crash): Rename the core dump immediately.
+	(Total Frustration): Call it a psychotherapist.
+	(Bug Criteria): Avoid "illegal instruction".
+	(Sending Patches): We always put the contributor's name in.
+
+	* misc.texi (Thumbnails): Minor correction.
+
+2006-04-04  Simon Josefsson  <jas@extundo.com>
+
+	* gnus.texi (Security): Improve.
+
+2006-04-03  Richard Stallman  <rms@gnu.org>
+
+	* misc.texi (Thumbnails): Minor cleanup.
+
+2006-04-02  Karl Berry  <karl@gnu.org>
+
+	* sending.texi (Mail Sending): pxref to Top needs five args.
+
+	* texinfo.tex: update to current version (2006-03-21.13).
+
+2006-04-02  Bill Wohler  <wohler@newt.com>
+
+	* mh-e.texi (Getting Started, Junk, Bug Reports)
+	(MH FAQ and Support): Fix URLs.
+
 2006-03-31  Romain Francoise  <romain@orebokech.com>
 
 	* gnus.texi (Virtual Groups): `nnvirtual-always-rescan' defaults
--- a/man/emacs.texi	Fri Apr 07 12:02:40 2006 +0000
+++ b/man/emacs.texi	Sun Apr 09 00:38:22 2006 +0000
@@ -801,7 +801,6 @@
 * Stuck Recursive::     `[...]' in mode line around the parentheses.
 * Screen Garbled::      Garbage on the screen.
 * Text Garbled::        Garbage in the text.
-* Unasked-for Search::  Spontaneous entry to incremental search.
 * Memory Full::         How to cope when you run out of memory.
 * After a Crash::       Recovering editing in an Emacs session that crashed.
 * Emergency Escape::    Emergency escape---
--- a/man/gnus.texi	Fri Apr 07 12:02:40 2006 +0000
+++ b/man/gnus.texi	Sun Apr 09 00:38:22 2006 +0000
@@ -2758,6 +2758,9 @@
 that group will always be visible in the Group buffer, regardless
 of whether it has any unread articles.
 
+This parameter cannot be set via @code{gnus-parameters}. See
+@code{gnus-permanently-visible-groups} as an alternative.
+
 @item broken-reply-to
 @cindex broken-reply-to
 Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
@@ -3035,8 +3038,9 @@
 
 @vindex gnus-parameters
 Group parameters can be set via the @code{gnus-parameters} variable too.
-But some variables, such as @code{visible}, have no effect.  For
-example:
+But some variables, such as @code{visible}, have no effect (For this
+case see @code{gnus-permanently-visible-groups} as an alternative.).
+For example:
 
 @lisp
 (setq gnus-parameters
@@ -4675,6 +4679,8 @@
 The line number.
 @item O
 Download mark.
+@item *
+Desired cursor position (instead of after first colon).
 @item &user-date;
 Age sensitive date format.  Various date format is defined in
 @code{gnus-user-date-format-alist}.
@@ -10655,8 +10661,8 @@
 
 @end enumerate
 
-More information on how to set things up can be found in the message
-manual (@pxref{Security, ,Security, message, Message Manual}).
+The variables that control security functionality on reading messages
+include:
 
 @table @code
 @item mm-verify-option
@@ -10687,6 +10693,15 @@
 
 @end table
 
+By default the buttons that display security information are not
+shown, because they clutter reading the actual e-mail.  You can type
+@kbd{K b} manually to display the information.  Use the
+@code{gnus-buttonized-mime-types} and
+@code{gnus-unbuttonized-mime-types} variables to control this
+permanently.  @ref{MIME Commands} for further details, and hints on
+how to customize these variables to always display security
+information.
+
 @cindex snarfing keys
 @cindex importing PGP keys
 @cindex PGP key ring import
@@ -10707,6 +10722,10 @@
 This happens to also be the default action defined in
 @code{mailcap-mime-data}.
 
+More information on how to set things for sending outgoing signed and
+encrypted messages up can be found in the message manual
+(@pxref{Security, ,Security, message, Message Manual}).
+
 @node Mailing List
 @section Mailing List
 @cindex mailing list
@@ -22060,10 +22079,20 @@
 @end iftex
 @c @anchor{X-Face}
 
-Decoding an @code{X-Face} header either requires an Emacs that has
+Viewing an @code{X-Face} header either requires an Emacs that has
 @samp{compface} support (which most XEmacs versions has), or that you
-have @samp{compface} installed on your system.  If either is true,
-Gnus will default to displaying @code{X-Face} headers.
+have suitable conversion or display programs installed.  If your Emacs
+has image support the default action is to display the face before the
+@code{From} header.  If there's no native @code{X-Face} support, Gnus
+will try to convert the @code{X-Face} header using external programs
+from the @code{pbmplus} package and friends.  For XEmacs it's faster if
+XEmacs has been compiled with @code{X-Face} support.  The default action
+under Emacs without image support is to fork off the @code{display}
+program.
+
+On a GNU/Linux system, the @code{display} program is from the
+ImageMagick package.  For external conversion programs look for packages
+with names like @code{netpbm}, @code{libgr-progs} and @code{compface}.
 
 The variable that controls this is the
 @code{gnus-article-x-face-command} variable.  If this variable is a
@@ -22072,21 +22101,6 @@
 If the @code{gnus-article-x-face-too-ugly} (which is a regexp) matches
 the @code{From} header, the face will not be shown.
 
-The default action under Emacs without image support is to fork off the
-@code{display} program@footnote{@code{display} is from the ImageMagick
-package.  For the @code{uncompface} and @code{icontopbm} programs look
-for a package like @code{compface} or @code{faces-xface} on a GNU/Linux
-system.} to view the face.
-
-Under XEmacs or Emacs 21+ with suitable image support, the default
-action is to display the face before the @code{From} header.  (It's
-nicer if XEmacs has been compiled with @code{X-Face} support---that
-will make display somewhat faster.  If there's no native @code{X-Face}
-support, Gnus will try to convert the @code{X-Face} header using
-external programs from the @code{pbmplus} package and
-friends.@footnote{On a GNU/Linux system look for packages with names
-like @code{netpbm}, @code{libgr-progs} and @code{compface}.})
-
 (Note: @code{x-face} is used in the variable/function names, not
 @code{xface}).
 
@@ -22104,7 +22118,9 @@
 If you use posting styles, you can use an @code{x-face-file} entry in
 @code{gnus-posting-styles}, @xref{Posting Styles}.  If you don't, Gnus
 provides a few convenience functions and variables to allow easier
-insertion of X-Face headers in outgoing messages.
+insertion of X-Face headers in outgoing messages.  You also need the
+above mentioned ImageMagick, netpbm or other image conversion packages
+(depending the values of the variables below) for these functions.
 
 @findex gnus-random-x-face
 @vindex gnus-convert-pbm-to-x-face-command
@@ -22151,7 +22167,7 @@
 @subsection Face
 @cindex face
 
-@c #### FIXME: faces and x-faces'implementations should really be harmonized.
+@c #### FIXME: faces and x-faces' implementations should really be harmonized.
 
 @code{Face} headers are essentially a funkier version of @code{X-Face}
 ones. They describe a 48x48 pixel colored image that's supposed to
@@ -22163,6 +22179,13 @@
 See @uref{http://quimby.gnus.org/circus/face/} for the precise
 specifications.
 
+Viewing an @code{Face} header requires an Emacs that is able to display
+PNG images.
+@c Maybe add this:
+@c (if (featurep 'xemacs)
+@c     (featurep 'png)
+@c   (image-type-available-p 'png))
+
 Gnus provides a few convenience functions and variables to allow
 easier insertion of Face headers in outgoing messages.
 
--- a/man/idlwave.texi	Fri Apr 07 12:02:40 2006 +0000
+++ b/man/idlwave.texi	Sun Apr 09 00:38:22 2006 +0000
@@ -9,16 +9,16 @@
 @synindex ky cp
 @syncodeindex vr cp
 @syncodeindex fn cp
-@set VERSION 5.5
-@set EDITION 5.5
-@set IDLVERSION 6.1
-@set NSYSROUTINES 1850
-@set NSYSKEYWORDS 7685
-@set DATE March, 2005
+@set VERSION 6.0
+@set EDITION 6.0
+@set IDLVERSION 6.2
+@set NSYSROUTINES 1966
+@set DATE Feb, 2006
 @set AUTHOR J.D. Smith & Carsten Dominik
-@set AUTHOR-EMAIL jdsmith@@as.arizona.edu
+@set AUTHOREMAIL jdsmith@@as.arizona.edu
 @set MAINTAINER J.D. Smith
-@set MAINTAINER-EMAIL jdsmith@@as.arizona.edu
+@set MAINTAINEREMAIL jdsmith@@as.arizona.edu
+@set IDLWAVEHOMEPAGE http://idlwave.org/
 @c %**end of header
 @finalout
 
@@ -29,8 +29,8 @@
 This is edition @value{EDITION} of the IDLWAVE User Manual for IDLWAVE
 @value{VERSION}
 
-Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004,
-2005, 2006 Free Software Foundation, Inc.
+Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004, 2005, 
+          2006 Free Software Foundation, Inc.
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.2 or
@@ -60,8 +60,8 @@
 This is edition @value{EDITION} of the @cite{IDLWAVE User Manual} for
 IDLWAVE version @value{VERSION}, @value{DATE}.
 @sp 2
-Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004,
-2005, 2006 Free Software Foundation, Inc.
+Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004, 2005, 
+          2006 Free Software Foundation, Inc.
 @sp 2
 @cindex Copyright, of IDLWAVE
 Permission is granted to copy, distribute and/or modify this document
@@ -197,6 +197,8 @@
 @node Introduction, IDLWAVE in a Nutshell, Top, Top
 @chapter Introduction
 @cindex Introduction
+@cindex CORBA (Common Object Request Broker Architecture)
+@cindex Interface Definition Language
 @cindex Interactive Data Language
 @cindex cc-mode.el
 @cindex @file{idl.el}
@@ -204,15 +206,12 @@
 @cindex Feature overview
 
 IDLWAVE is a package which supports editing source files written in
-the Interactive Data Language, and running
-IDL as an inferior shell@footnote{Note that this package has nothing
-to do with the Interface Definition Language, part of the Common
-Object Request Broker Architecture (CORBA)}@footnote{IDLWAVE can also
-be used for editing source files for the related WAVE/CL language, but
-with only limited support.}.  It is a feature-rich replacement for the
-IDLDE development environment included with IDL, and uses the full
-power of Emacs to make editing and running IDL programs easier,
-quicker, and more structured.
+the Interactive Data Language (IDL), and running IDL as an inferior shell@footnote{IDLWAVE can also be used
+for editing source files for the related WAVE/CL language, but with only
+limited support.}.  It is a feature-rich replacement for the IDLDE
+development environment included with IDL, and uses the full power of
+Emacs to make editing and running IDL programs easier, quicker, and more
+structured.
 
 IDLWAVE consists of two main parts: a major mode for editing IDL
 source files (@code{idlwave-mode}) and a mode for running the IDL
@@ -231,8 +230,6 @@
 than 1000 native IDL routines, extendible to any additional number of
 local routines, and already available with many pre-scanned libraries.
 @item
-Routine name space conflict search with likelihood-of-use ranking.
-@item
 Fast, context-sensitive online HTML help, or source-header help for
 undocumented routines.
 @item
@@ -246,6 +243,8 @@
 @item
 Integrity checks and auto-termination of logical blocks.
 @item
+Routine name space conflict search with likelihood-of-use ranking.
+@item
 Support for @file{imenu} (Emacs) and @file{func-menu} (XEmacs).
 @item
 Documentation support.
@@ -254,6 +253,9 @@
 editing and all the completion and routine info capabilities present in
 IDL source buffers.
 @item
+Full handling of debugging with breakpoints, with interactive setting
+of break conditions, and easy stepping through code.
+@item
 Compilation, execution and interactive single-keystroke debugging of
 programs directly from the source buffer.
 @item
@@ -311,10 +313,12 @@
 @tab Indent the current line relative to context.
 @item @kbd{C-M-\}
 @tab Re-indent all lines in the current region.
+@item @kbd{C-M-q}
+@tab Re-indent all lines in the current routine.
 @item @kbd{C-u @key{TAB}}
 @tab Re-indent all lines in the current statement.
 @item @kbd{M-@key{RET}}
-@tab Start a continuation line, or split the current line at point.
+@tab Start a continuation line, splitting the current line at point.
 @item @kbd{M-q}
 @tab Fill the current comment paragraph.
 @item @kbd{C-c ?}
@@ -340,10 +344,10 @@
 
 @multitable @columnfractions .15 .85
 @item @kbd{C-c C-s}
-@tab Start IDL as a subprocess and/or switch to the interaction buffer.
-@item @kbd{M-p}
+@tab Start IDL as a subprocess and/or switch to the shell buffer.
+@item @key{Up}, @kbd{M-p}
 @tab Cycle back through IDL command history.
-@item @kbd{M-n}
+@item @key{Down},@kbd{M-n}
 @tab Cycle forward.
 @item @kbd{@key{TAB}}
 @tab Complete a procedure name, function name or keyword in the shell buffer.
@@ -368,12 +372,9 @@
 @subheading Commonly used Settings in @file{.emacs}
 @lisp
 ;; Change the indentation preferences
-(setq idlwave-main-block-indent 2   ; default  0
-      idlwave-block-indent 2        ; default  4
-      idlwave-end-offset -2)        ; default -4
 ;; Start autoloading routine info after 2 idle seconds
 (setq idlwave-init-rinfo-when-idle-after 2)
-;; Pad some operators with spaces
+;; Pad operators with spaces
 (setq idlwave-do-actions t
       idlwave-surround-by-blank t)
 ;; Syntax Highlighting
@@ -384,9 +385,10 @@
 (setq idlwave-shell-debug-modifiers '(control shift))
 @end lisp
 
-@ifhtml
+@html
 <A NAME="TUTORIAL"></A>
-@end ifhtml
+@end html
+
 @node Getting Started, The IDLWAVE Major Mode, IDLWAVE in a Nutshell, Top
 @chapter Getting Started (Tutorial)
 @cindex Quick-Start
@@ -490,7 +492,7 @@
 
 Now go back to the source window and type @kbd{C-c C-d C-c} to compile
 the program.  If you watch the shell buffer, you see that IDLWAVE types
-@samp{.run tutorial.pro} for you.  But the compilation fails because
+@samp{.run "tutorial.pro"} for you.  But the compilation fails because
 there is a comma in the line @samp{years=...}.  The line with the error
 is highlighted and the cursor positioned at the error, so remove the
 comma (you should only need to hit @kbd{Delete}!).  Compile again, using
@@ -548,7 +550,7 @@
 plot_wday,1,4
 @end example
 
-Oops, this looks very wrong.  All April fool's days cannot be Fridays!
+Oops, this looks very wrong.  All April Fool's days cannot be Fridays!
 We've got a bug in the program, perhaps in the @code{daynr} function.
 Let's put a breakpoint on the last line there.  Position the cursor on
 the @samp{return, d+...} line and press @kbd{C-c C-d C-b}.  IDL sets a
@@ -576,12 +578,12 @@
 @node  Lesson II -- Customization, Lesson III -- User Catalog, Lesson I -- Development Cycle, Getting Started
 @section Lesson II: Customization
 
-Emacs is probably the most customizable piece of software ever
-written, and it would be a shame if you did not make use of this and
-adapt IDLWAVE to your own preferences.  Customizing Emacs or IDLWAVE
-is accomplished by setting Lisp variables in the @file{.emacs} file in
-your home directory --- but do not be dismayed; for the most part, you
-can just copy and work from the examples given here.
+Emacs is probably the most customizable piece of software ever written,
+and it would be a shame if you did not make use of this to adapt IDLWAVE
+to your own preferences.  Customizing Emacs or IDLWAVE is accomplished
+by setting Lisp variables in the @file{.emacs} file in your home
+directory --- but do not be dismayed; for the most part, you can just
+copy and work from the examples given here.
 
 Let's first use a boolean variable.  These are variables which you turn
 on or off, much like a checkbox. A value of @samp{t} means on, a value
@@ -600,12 +602,12 @@
 restart Emacs.
 
 You likely have your own indentation preferences for IDL code.  For
-example, some like to indent the main block of an IDL program from the
-margin and use only 3 spaces as indentation between @code{BEGIN} and
-@code{END}.  Try the following lines in @file{.emacs}:
+example, some may prefer to indent the main block of an IDL program
+slightly from the margin and use only 3 spaces as indentation between
+@code{BEGIN} and @code{END}.  Try the following lines in @file{.emacs}:
 
 @lisp
-(setq idlwave-main-block-indent 2)
+(setq idlwave-main-block-indent 1)
 (setq idlwave-block-indent 3)
 (setq idlwave-end-offset -3)
 @end lisp
@@ -810,25 +812,26 @@
 @cindex Foreign code, adapting
 @cindex Indentation, of foreign code
 @kindex C-M-\
-To re-indent a larger portion of code (e.g. when working with foreign code
-written with different conventions), use @kbd{C-M-\}
+To re-indent a larger portion of code (e.g. when working with foreign
+code written with different conventions), use @kbd{C-M-\}
 (@code{indent-region}) after marking the relevant code.  Useful marking
-commands are @kbd{C-x h} (the entire file) or @kbd{C-M-h} (the
-current subprogram). @xref{Actions}, for information how to impose
-additional formatting conventions on foreign code.
-
-@defopt idlwave-main-block-indent (@code{0}) 
+commands are @kbd{C-x h} (the entire file) or @kbd{C-M-h} (the current
+subprogram).  The command @kbd{C-M-q} reindents the entire current
+routine.  @xref{Actions}, for information how to impose additional
+formatting conventions on foreign code.
+
+@defopt idlwave-main-block-indent (@code{2}) 
 Extra indentation for the main block of code.  That is the block between
 the FUNCTION/PRO statement and the END statement for that program
 unit.
 @end defopt
 
-@defopt idlwave-block-indent (@code{4})
+@defopt idlwave-block-indent (@code{3})
 Extra indentation applied to block lines.  If you change this, you
 probably also want to change @code{idlwave-end-offset}.
 @end defopt
 
-@defopt idlwave-end-offset (@code{-4})
+@defopt idlwave-end-offset (@code{-3})
 Extra indentation applied to block END lines.  A value equal to negative
 @code{idlwave-block-indent} will make END lines line up with the block
 BEGIN lines.
@@ -884,8 +887,8 @@
 statements with special continuation indentation, especially if
 @code{idlwave-max-extra-continuation-indent} is small, the key
 @kbd{C-u @key{TAB}} will re-indent all lines in the current statement.
-Note that @code{idlwave-indent-to-open-paren}, if non-@code{nil}, overrides
-the @code{idlwave-max-extra-continuation-indent} limit, for
+Note that @code{idlwave-indent-to-open-paren}, if non-@code{nil},
+overrides the @code{idlwave-max-extra-continuation-indent} limit, for
 parentheses only, forcing them always to line up.
 
 
@@ -1254,9 +1257,9 @@
 @end defopt
 
 
-@ifhtml
+@html
 <A NAME="ONLINE_HELP"></A>
-@end ifhtml
+@end html
 @node Online Help, Completion, Routine Info, The IDLWAVE Major Mode
 @section Online Help
 
@@ -1266,19 +1269,34 @@
 @cindex Installing online help
 @cindex Online Help, Installation
 @cindex Speed, of online help
-
-IDLWAVE can display help from an HTML version of the IDL documentation
-if it is available.  This is @emph{much} faster than using the IDL
-online help application, because IDLWAVE usually gets you to the right
-place in the documentation directly --- e.g. a specific keyword of a
-routine --- without any additional browsing and scrolling.  There are
-a variety of options for displaying the HTML help: see below.  Help
-for routines without HTML documentation is also available, using the
-routine documentation header and/or source.
-
-To make this feature work, you should set
-@code{idlwave-html-help-location} to the directory name of the
-directory where the IDL help files are installed.
+@cindex XML Help Catalog
+
+For IDL system routines, extensive documentation is supplied with IDL.
+IDLWAVE can access the HTML version of this documentation very quickly
+and accurately, based on the local context.  This can be @emph{much}
+faster than using the IDL online help application, because IDLWAVE
+usually gets you to the right place in the documentation directly ---
+e.g. a specific keyword of a routine --- without any additional browsing
+and scrolling.
+
+For this online help to work, an HTML version of the IDL documentation
+is required.  Beginning with IDL 6.2, HTML documentation is distributed
+directly with IDL, along with an XML-based catalog of routine
+information.  By default, IDLWAVE automatically attempts to convert this
+XML catalog into a format Emacs can more easily understand, and caches
+this information in your @code{idlwave_config_directory}
+(@file{~/.idlwave/}, by default).  It also re-scans the XML catalog if
+it is newer than the current cached version.  You can force rescan with
+the menu entry @code{IDLWAVE->Routine Info->Rescan XML Help Catalog}.
+
+Before IDL 6.2, the HTML help was not distributed with IDL, and was not
+part of the standalone IDLWAVE distribution, but had to be downloaded
+separately.  This is no longer necessary: all help and routine
+information is supplied with IDL versions 6.2 and later.
+
+There are a variety of options for displaying the HTML help: see below.
+Help for routines without HTML documentation is also available, by using
+the routine documentation header and/or routine source.
 
 @kindex M-?
 In any IDL program (or, as with most IDLWAVE commands, in the IDL
@@ -1288,19 +1306,21 @@
 
 @cindex Context, for online help
 @multitable @columnfractions .25 .75
-@item @i{Routine name}
+@item @i{Routine names}
 @tab The name of a routine (function, procedure, method).
-@item @i{Keyword Parameter}
+@item @i{Keyword Parameters}
 @tab A keyword parameter of a routine.
-@item @i{System Variable}
+@item @i{System Variables}
 @tab System variables like @code{!DPI}.
 @item @i{System Variable Tags}
 @tab System variables tags like @code{!D.X_SIZE}.
-@item @i{IDL Statement}
+@item @i{IDL Statements}
 @tab Statements like @code{PRO}, @code{REPEAT}, @code{COMPILE_OPT}, etc.
-@item @i{Class name}
+@item @i{IDL Controls}
+@tab Control structures like @code{FOR}, @code{SWITCH}, etc.
+@item @i{Class names}
 @tab A class name in an @code{OBJ_NEW} call.
-@item @i{Class Init}
+@item @i{Class Init Keywords}
 @tab Beyond the class name in an @code{OBJ_NEW} call.
 @item @i{Executive Command}
 @tab An executive command like @code{.RUN}.  Mostly useful in the shell.
@@ -1352,52 +1372,62 @@
 @cindex HTML Help
 @cindex Help using HTML manuals
 @cindex IDL manual, HTML version
+@cindex IDL Assistant
 
 Help using the HTML documentation is invoked with the built-in Emacs
 command @code{browse-url}, which displays the relevant help topic in a
-browser of your choosing.  There are many possible browsers to choose
+browser of your choosing.  Beginning with version 6.2, IDL comes with
+the help browser @emph{IDL Assistant}, which it uses by default for
+displaying online help on all supported platforms.  This browser
+offers topical searches, an index, and is also now the default and
+recommended IDLWAVE help browser.  The variable
+@code{idlwave-help-use-assistant} controls whether this browser is
+used.  Note that, due to limitations in the Assistant, invoking help
+within IDLWAVE and @code{? topic} within IDL will result in two
+running copies of Assistant.
+
+Aside from the IDL Assistant, there are many possible browsers to choose
 among, with differing advantages and disadvantages.  The variable
-@code{idlwave-help-browser-function} controls which browser help is
-sent to.  This function is used to set the variable
-@code{browse-url-browser-function} locally for IDLWAVE help only.
-Customize this variable to see what choices of browsers your system
-offers.
-
-Certain browsers like @code{w3} and @code{w3m}
-(@uref{http://emacs-w3m.namazu.org/}, the author's help browser of
-choice) are run within Emacs, and use Emacs buffers to display the
-HTML help.  This can be convenient, especially on small displays, and
-images can even be displayed in-line on new Emacs versions.  However,
-better formatting results are often achieved with external browsers,
-like Mozilla.  IDLWAVE assumes any browser function containing "w3" is
-displayed in a local buffer.  If you are using another Emacs-local
-browser for which this is not true, set the variable
-@code{idlwave-help-browser-is-local}.
-
-@emph{N.B. For Windows users}: IDLWAVE can bring up help directly
-from the Microsoft HTMLHelp documentation supplied with IDL: no
-additional help files are needed.  Be sure to set
-@code{idlwave-system-directory} and the help file will be found
-automatically (or, alternatively, specify its location directly with
-@code{idlwave-html-help-location}).  The variable
-@code{idlwave-help-use-hh} controls whether HTMLHelp is used, and
-which application is called to invoke it (@code{HH} is the default).
-The free helper application @code{KEYHH}
-(@uref{http://www.keyworks.net/keyhh.htm}) can be used instead, and is
-preferrable, as it permits loading new help topics into the same help
-window.  @code{KEYHH} must be downloaded and installed separately.
+@code{idlwave-help-browser-function} controls which browser help is sent
+to (as long as @code{idlwave-help-use-assistant} is not set).  This
+function is used to set the variable @code{browse-url-browser-function}
+locally for IDLWAVE help only.  Customize the latter variable to see
+what choices of browsers your system offers.  Certain browsers like
+@code{w3} (bundled with many versions of Emacs) and @code{w3m}
+(@uref{http://emacs-w3m.namazu.org/}) are run within Emacs, and use
+Emacs buffers to display the HTML help.  This can be convenient,
+especially on small displays, and images can even be displayed in-line
+on newer Emacs versions.  However, better formatting results are often
+achieved with external browsers, like Mozilla.  IDLWAVE assumes any
+browser function containing "w3" is displayed in a local buffer.  If you
+are using another Emacs-local browser for which this is not true, set
+the variable @code{idlwave-help-browser-is-local}.
+
+With IDL 6.2 or later, it is important to ensure that the variable
+@code{idlwave-system-directory} is set (@pxref{Catalogs}).  One easy way
+to ensure this is to run the IDL Shell (@kbd{C-c C-s}).  It will be
+queried for this directory, and the results will be cached to file for
+subsequent use.
 
 @xref{HTML Help Browser Tips}, for more information on selecting and
 configuring a browser for use with IDL's HTML help system.
 
-@defopt idlwave-html-help-location @file{/usr/local/etc}
-The directory where the @file{idl_html_help} dir or @file{idl.chm}
-HTMLHelp files live.
+@defopt idlwave-html-system-help-location @file{help/online_help}
+Relative directory of the system-supplied HTML help directory,
+considered with respect to @code{idlwave-system-directory}.  Relevant
+for IDL 6.2 and greater.  Should not change.
+@end defopt     
+
+@defopt idlwave-html-help-location @file{/usr/local/etc/}
+The directory where the @file{idl_html_help} HTML directory live.
+Obsolete and ignored for IDL 6.2 and greater
+(@code{idlwave-html-system-help-location} is used instead).
 @end defopt
 
-@defopt idlwave-help-use-hh @code{nil}
-If set to @code{'hh} or @code{'keyhh}, use Windows native HTMLHelp
-with the specified help application.
+@defopt idlwave-help-use-assistant @code{t}
+If set, use the IDL Assistant if possible for online HTML help,
+otherwise use the browser function specified in
+@code{idlwave-help-browser-function}.
 @end defopt
 
 @defopt idlwave-help-browser-function
@@ -1408,8 +1438,8 @@
 
 @defopt idlwave-help-browser-is-local
 Is the browser selected in @code{idlwave-help-browser-function} run in a
-local Emacs buffer?  Defaults to @code{t} if the function contains
-"-w3".
+local Emacs buffer or window?  Defaults to @code{t} if the function
+contains "-w3".
 @end defopt
 
 @defopt idlwave-help-link-face
@@ -1517,16 +1547,15 @@
 @kindex C-c C-i
 IDLWAVE offers completion for class names, routine names, keywords,
 system variables, system variable tags, class structure tags, regular
-structure tags and file names.  As in many programming modes,
-completion is bound to @kbd{M-@key{TAB}} (or @kbd{@key{TAB}} in the
-IDLWAVE Shell --- @pxref{Using the Shell}).  Completion uses exactly
-the same internal information as routine info, so when necessary
-(rarely) it can be updated with @kbd{C-c C-i}
-(@code{idlwave-update-routine-info}).
+structure tags and file names.  As in many programming modes, completion
+is bound to @kbd{M-@key{TAB}} (or simply @kbd{@key{TAB}} in the IDLWAVE
+Shell --- @pxref{Using the Shell}).  Completion uses exactly the same
+internal information as routine info, so when necessary (rarely) it can
+be updated with @kbd{C-c C-i} (@code{idlwave-update-routine-info}).
 
 The completion function is context sensitive and figures out what to
-complete based location of the point.  Here are example lines and what
-@kbd{M-@key{TAB}} would try to complete when the cursor is on the
+complete based on the location of the point.  Here are example lines and
+what @kbd{M-@key{TAB}} would try to complete when the cursor is on the
 position marked with a @samp{_}:
 
 @example
@@ -1536,7 +1565,7 @@
 plot,x,y,/x_            @r{Keyword of @code{plot} procedure}
 plot,min(_              @r{Keyword of @code{min} function}
 obj -> a_               @r{Object method (procedure)}
-a(2,3) = obj -> a_      @r{Object method (function)}
+a[2,3] = obj -> a_      @r{Object method (function)}
 x = obj_new('IDL_       @r{Class name}
 x = obj_new('MyCl',a_   @r{Keyword to @code{Init} method in class @code{MyCl}}
 pro A_                  @r{Class name}
@@ -1655,16 +1684,17 @@
 @cindex Class ambiguity
 @cindex @code{self} object, default class
 An object method is not uniquely determined without the object's class.
-Since the class is almost always omitted in the calling source, IDLWAVE
-considers all available methods in all classes as possible method name
-completions.  The combined list of keywords of the current method in
-@emph{all} known classes which contain that method will be considered
-for keyword completion.  In the @file{*Completions*} buffer, the
-matching classes will be shown next to each item (see option
+Since the class is almost always omitted in the calling source (as
+required to obtain the true benefits of object-based programming),
+IDLWAVE considers all available methods in all classes as possible
+method name completions.  The combined list of keywords of the current
+method in @emph{all} known classes which contain that method will be
+considered for keyword completion.  In the @file{*Completions*} buffer,
+the matching classes will be shown next to each item (see option
 @code{idlwave-completion-show-classes}).  As a special case, the class
 of an object called @samp{self} is always taken to be the class of the
-current routine.  All classes it inherits from are considered as well
-where appropriate.
+current routine, when in an IDLWAVE buffer.  All inherits classes are
+considered as well.
 
 @cindex Forcing class query.
 @cindex Class query, forcing
@@ -1674,7 +1704,7 @@
 @code{idlwave-query-class} can be configured to make such prompting the
 default for all methods (not recommended), or selectively for very
 common methods for which the number of completing keywords would be too
-large (e.g. @code{Init}).  
+large (e.g. @code{Init,SetProperty,GetProperty}).  
 
 @cindex Saving object class on @code{->}
 @cindex @code{->}
@@ -1683,9 +1713,9 @@
 editing session.  Subsequent completions in the same statement
 (e.g. keywords) can then reuse this class information.  This works by
 placing a text property on the method invocation operator @samp{->},
-after which the operator will be shown in a different face.  This is not
-enabled by default --- the variable @code{idlwave-store-inquired-class}
-can be used to turn it on.
+after which the operator will be shown in a different face (bold by
+default).  The variable @code{idlwave-store-inquired-class} can be used
+to turn it off or on.
 
 @defopt idlwave-completion-show-classes (@code{1})
 Non-@code{nil} means show up to that many classes in
@@ -1701,14 +1731,14 @@
 Association list governing query for object classes during completion.
 @end defopt
 
-@defopt idlwave-store-inquired-class (@code{nil})
+@defopt idlwave-store-inquired-class (@code{t})
 Non-@code{nil} means store class of a method call as text property on
 @samp{->}.
 @end defopt
 
 @defopt idlwave-class-arrow-face
-Face to highlight object operator arrows @samp{->} which carry a class
-text property.
+Face to highlight object operator arrows @samp{->} which carry a saved
+class text property.
 @end defopt
 
 @node Object Method Completion in the Shell, Class and Keyword Inheritance, Object Method Completion and Class Ambiguity, Completion
@@ -1722,9 +1752,7 @@
 determine the class of the object.  If this query is successful, the
 class found will be used to select appropriate completions, routine
 info, or help.  If unsuccessful, information from all known classes will
-be used (as in the buffer).  Setting the variable
-@code{idlwave-store-inquired-class} can eliminate unnecessary repetitive
-queries for the object's class, and speed up completion.
+be used (as in the buffer). 
 
 @node   Class and Keyword Inheritance, Structure Tag Completion, Object Method Completion in the Shell, Completion
 @subsection Class and Keyword Inheritance
@@ -1802,7 +1830,17 @@
 @end lisp
 
 Once enabled, you'll also be able to access online help on the structure
-tags, using the usual methods (@pxref{Online Help}).
+tags, using the usual methods (@pxref{Online Help}).  In addition,
+structure variables in the shell will be queried for tag names, similar
+to the way object variables in the shell are queried for method names.
+So, e.g.:
+
+@example
+IDL> st.[Tab]
+@end example
+
+@noindent will complete with all structure fields of the structure
+@code{st}.
 
 @node Routine Source, Resolving Routines, Completion, The IDLWAVE Major Mode
 @section Routine Source
@@ -1817,9 +1855,10 @@
 @code{idlwave-routine-info} would have used, taken from nearby buffer
 contents.  In the minibuffer, specify a complete routine name (including
 any class part).  IDLWAVE will display the source file in another
-window, positioned at the routine in question.  You can also visit a
-routine in the current buffer, with completion, by using a single prefix
-(@kbd{C-u C-c C-v}).
+window, positioned at the routine in question.  You can also limit this
+to a routine in the current buffer only, with completion, and a
+context-sensitive default, by using a single prefix (@kbd{C-u C-c C-v})
+or the convenience binding @kbd{C-c C-t}.
 
 @cindex Buffers, killing
 @cindex Killing autoloaded buffers
@@ -1838,7 +1877,8 @@
 The key sequence @kbd{C-c =} calls the command @code{idlwave-resolve}
 and sends the line @samp{RESOLVE_ROUTINE, '@var{routine_name}'} to IDL
 in order to resolve (compile) it.  The default routine to be resolved is
-taken from context, but you get a chance to edit it.
+taken from context, but you get a chance to edit it.  Usually this is
+not necessary, since IDL automatically discovers routines on its path.
 
 @code{idlwave-resolve} is one way to get a library module within reach
 of IDLWAVE's routine info collecting functions.  A better way is to
@@ -1983,6 +2023,8 @@
 @tab @code{print,}
 @item @code{\pt}
 @tab @code{plot,}
+@item @code{\pv}
+@tab @code{ptr_valid()}
 @item @code{\re}
 @tab @code{read,}
 @item @code{\rf}
@@ -2144,14 +2186,16 @@
 
 Some operators can be automatically surrounded by spaces.  This can
 happen when the operator is typed, or later when the line is indented.
-IDLWAVE can pad the operators @samp{&}, @samp{<}, @samp{>}, @samp{,},
-@samp{=}, and @samp{->}, but this feature is turned off by default.  If
-you want to turn it on, customize the variables
-@code{idlwave-surround-by-blank} and @code{idlwave-do-actions}.  You can
-also define similar actions for other operators by using the function
-@code{idlwave-action-and-binding} in the mode hook.  For example, to
-enforce space padding of the @samp{+} and @samp{*} operators, try this
-in @file{.emacs}
+IDLWAVE can pad the operators @samp{<}, @samp{>}, @samp{,}, @samp{=},
+and @samp{->}, as well as the modified assignment operators
+(@samp{AND=}, @samp{OR=}, etc.).  This feature is turned off by default.
+If you want to turn it on, customize the variables
+@code{idlwave-surround-by-blank} and @code{idlwave-do-actions} and turn
+both on.  You can also define similar actions for other operators by
+using the function @code{idlwave-action-and-binding} in the mode hook.
+For example, to enforce space padding of the @samp{+} and @samp{*}
+operators (outside of strings and comments, of course), try this in
+@file{.emacs}
 
 @lisp
 (add-hook 'idlwave-mode-hook
@@ -2161,14 +2205,26 @@
      (idlwave-action-and-binding "+" '(idlwave-surround 1 1))))
 @end lisp
 
+Note that the modified assignment operators which begin with a word
+(@samp{AND=}, @samp{OR=}, @samp{NOT=}, etc.) require a leading space to
+be recognized (e.g @code{vAND=4} would be intepreted as a variable
+@code{vAND}).  Also note that, since e.g., @code{>} and @code{>=} are
+both valid operators, it is impossible to surround both by blanks while
+they are being typed.  Similarly with @code{&} and @code{&&}.  For
+these, a compromise is made: the padding is placed on the left, and if
+the longer operator is keyed in, on the right as well (otherwise you
+must insert spaces to pad right yourself, or press simply press Tab to
+repad everything if @code{idlwave-do-actions} is on).
+
 @defopt idlwave-surround-by-blank (@code{nil})
 Non-@code{nil} means enable @code{idlwave-surround}.  If non-@code{nil},
-@samp{=}, @samp{<}, @samp{>}, @samp{&}, @samp{,}, @samp{->} are
+@samp{=}, @samp{<}, @samp{>}, @samp{&}, @samp{,}, @samp{->}, and the
+modified assignment operators (@samp{AND=}, @samp{OR=}, etc.) are
 surrounded with spaces by @code{idlwave-surround}.
 @end defopt
 
 @defopt idlwave-pad-keyword (@code{t})
-Non-@code{nil} means pad @samp{=} for keywords like assignments.
+Non-@code{nil} means space-pad the @samp{=} in keyword assignments.
 @end defopt
 
 @node Case Changes,  , Padding Operators, Actions
@@ -2328,8 +2384,6 @@
 Normal hook.  Executed when @file{idlwave.el} is loaded.
 @end defopt
 
-
-
 @node The IDLWAVE Shell, Acknowledgements, The IDLWAVE Major Mode, Top
 @chapter The IDLWAVE Shell
 @cindex IDLWAVE shell
@@ -2346,11 +2400,9 @@
 interactively, to compile and run IDL programs in Emacs buffers and to
 debug these programs.  The IDLWAVE shell is built on @file{comint}, an
 Emacs packages which handles the communication with the IDL program.
-Unfortunately IDL for Windows does not have command-prompt versions
-and thus do not allow the interaction with Emacs@footnote{Please
-inform the maintainer if you come up with a way to make the IDLWAVE
-shell work on these systems.} --- so the IDLWAVE shell currently only
-works under Unix and MacOSX.
+Unfortunately, IDL for Windows does not have command-prompt versions and
+thus do not allow the interaction with Emacs --- so the IDLWAVE shell
+currently only works under Unix and MacOSX.
 
 @menu
 * Starting the Shell::          How to launch IDL as a subprocess
@@ -2448,6 +2500,11 @@
 shell buffer.
 @end defopt
 
+@defopt idlwave-shell-use-dedicated-window (@code{nil})
+Non-@code{nil} means use a dedicated window for the shell, taking care
+not it replace it with other buffers.
+@end defopt
+
 @defopt idlwave-shell-frame-parameters
 The frame parameters for a dedicated idlwave-shell frame.
 @end defopt
@@ -2539,6 +2596,9 @@
 (@code{idlwave-update-routine-info})
 @item @kbd{C-c C-v}
 @tab Find the source file of a routine (@code{idlwave-find-module})
+@item @kbd{C-c C-t}
+@tab Find the source file of a routine in the currently visited file 
+(@code{idlwave-find-module-this-file}).
 @item @kbd{C-c =}
 @tab Compile a library routine (@code{idlwave-resolve})
 @end multitable
@@ -2760,16 +2820,20 @@
 and re-enabled: @kbd{C-c C-d C-\}
 (@code{idlwave-shell-toggle-enable-current-bp}).  
 
-
-Breakpoint lines are highlighted or indicated with an icon in the
-source code (different icons for conditional, after, and other break
-types).  Disabled breakpoints are @emph{grayed out} by default.  Note
-that IDL places breakpoints as close as possible on or after the line
-you specify.  IDLWAVE queries the shell for the actual breakpoint
-location which was set, so the exact line you specify may not be
-marked.  You can re-sync the breakpoint list and display at any time
-(e.g., if you add or remove some on the command line) using @kbd{C-c
-C-d C-l}.
+Breakpoint lines are highlighted or indicated with an icon in the source
+code (different icons for conditional, after, and other break types).
+Disabled breakpoints are @emph{grayed out} by default.  Note that IDL
+places breakpoints as close as possible on or after the line you
+specify.  IDLWAVE queries the shell for the actual breakpoint location
+which was set, so the exact line you specify may not be marked.  You can
+re-sync the breakpoint list and update the display at any time (e.g., if
+you add or remove some on the command line) using @kbd{C-c C-d C-l}.  
+
+In recent IDLWAVE versions, the breakpoint line is highlighted when the
+mouse is moved over it, and a tooltip pops up describing the break
+details.  @kbd{Mouse-3} on the breakpoint line pops up a menu of
+breakpoint actions, including clearing, disabling, and adding or
+changing break conditions or ``after'' break count.
 
 Once the program has stopped somewhere, you can step through it.  The
 most important stepping commands are @kbd{C-c C-d C-s} to execute one
@@ -2785,7 +2849,7 @@
 @item @kbd{C-c C-d C-b}
 @tab Set breakpoint (@code{idlwave-shell-break-here})
 @item @kbd{C-c C-d C-i}
-@tab Set breakpoint in function named here (@code{idlwave-shell-break-in})
+@tab Set breakpoint in module named here (@code{idlwave-shell-break-in})
 @item @kbd{C-c C-d C-d}
 @tab Clear current breakpoint (@code{idlwave-shell-clear-current-bp})
 @item @kbd{C-c C-d C-a}
@@ -2821,7 +2885,14 @@
 @end multitable
 
 All of these commands have equivalents in Electric Debug Mode, which
-provides faster access (@pxref{Electric Debug Mode}).
+provides faster single-key access (@pxref{Electric Debug Mode}).
+
+The line where IDL is currently stopped, at breakpoints, halts, and
+errors, etc., is marked with a color overlay or arrow, depending on the
+setting in @code{idlwave-shell-mark-stop-line}.  If an overlay face is
+used to mark the stop line (as it is by default), when stepping through
+code, the face color is temporarily changed to gray, until IDL completes
+the next command and moves to the new line.
 
 @defopt idlwave-shell-mark-breakpoints (@code{t})
 Non-@code{nil} means mark breakpoints in the source file buffers.  The
@@ -2834,6 +2905,28 @@
 @code{idlwave-shell-mark-breakpoints} has the value @code{face}.
 @end defopt
 
+@defopt idlwave-shell-breakpoint-popup-menu (@code{t})
+Whether to pop-up a menu and present a tooltip description on
+breakpoint lines.
+@end defopt
+
+@defopt idlwave-shell-mark-stop-line (@code{t})
+Non-@code{nil} means mark the source code line where IDL is currently
+stopped.  The value specifies the preferred method.  Valid values are
+@code{nil}, @code{t}, @code{arrow}, and @code{face}.
+@end defopt
+
+@defopt idlwave-shell-overlay-arrow (@code{">"})
+The overlay arrow to display at source lines where execution halts, if
+configured in @code{idlwave-shell-mark-stop-line}.
+@end defopt
+
+@defopt idlwave-shell-stop-line-face
+The face which highlights the source line where IDL is stopped, if
+configured in @code{idlwave-shell-mark-stop-line}.
+@end defopt
+
+
 @node Compiling Programs, Walking the Calling Stack, Breakpoints and Stepping, Debugging IDL Programs
 @subsection Compiling Programs
 @cindex Compiling programs
@@ -2860,22 +2953,6 @@
 been set (or you give two prefix arguments), the last command on the
 @code{comint} input history is sent.
 
-@defopt idlwave-shell-mark-stop-line (@code{t})
-Non-@code{nil} means mark the source code line where IDL is currently
-stopped.  The value specifies the preferred method.  Valid values are
-@code{nil}, @code{t}, @code{arrow}, and @code{face}.
-@end defopt
-
-@defopt idlwave-shell-overlay-arrow (@code{">"})
-The overlay arrow to display at source lines where execution halts, if
-configured in @code{idlwave-shell-mark-stop-line}.
-@end defopt
-
-@defopt idlwave-shell-stop-line-face
-The face which highlights the source line where IDL is stopped, if
-configured in @code{idlwave-shell-mark-stop-line}.
-@end defopt
-
 @node Walking the Calling Stack, Electric Debug Mode, Compiling Programs, Debugging IDL Programs
 @subsection Walking the Calling Stack
 @cindex Calling stack, walking
@@ -2895,26 +2972,27 @@
 for information how to examine the value of variables and expressions on
 higher calling stack levels.
 
-@ifhtml
+@html
 <A NAME="EDEBUG"></A>
-@end ifhtml
+@end html
 @node Electric Debug Mode,  , Walking the Calling Stack, Debugging IDL Programs
 @subsection Electric Debug Mode
 @cindex Electric Debug Mode
 @cindex @samp{*Debugging*}
 
 Even with a convenient debug key prefix enabled, repetitive stepping,
-variable examination (@pxref{Examining Variables}), and other
-debugging activities can be awkward and slow using commands which
-require multiple keystrokes.  Luckily, there's a better way, inspired
-by the lisp e-debug mode, and available through the @emph{Electric
-Debug Mode}.  By default, as soon as a breakpoint is hit, this minor
-mode is enabled.  The buffer showing the line where execution has
-halted is switched to Electric Debug Mode.  This mode is visible as
-@samp{*Debugging*} in the mode line, and a different face (violet by
-default, where color is available) for the line stopped at point.  The
-buffer is made read-only and single-character bindings for the most
-commonly used debugging commands are enabled:
+variable examination (@pxref{Examining Variables}), and other debugging
+activities can be awkward and slow using commands which require multiple
+keystrokes.  Luckily, there's a better way, inspired by the lisp e-debug
+mode, and available through the @emph{Electric Debug Mode}.  By default,
+as soon as a breakpoint is hit, this minor mode is enabled.  The buffer
+showing the line where execution has halted is switched to Electric
+Debug Mode.  This mode is visible as @samp{*Debugging*} in the mode
+line, and a different face (violet by default, if color is available)
+for the line stopped at point.  The buffer is made read-only and
+single-character bindings for the most commonly used debugging commands
+are enabled.  These character commands (a list of which is available
+with @kbd{C-?}) are:
 
 @multitable @columnfractions .2 .8
 @item @kbd{a}
@@ -2923,10 +3001,12 @@
 @tab Set breakpoint, @kbd{C-u b} for a conditional break, @kbd{C-n b} for nth hit (@code{idlwave-shell-break-here})
 @item @kbd{d}
 @tab Clear current breakpoint (@code{idlwave-shell-clear-current-bp})
+@item @kbd{e}
+@tab Prompt for expression to print (@code{idlwave-shell-clear-current-bp}).
 @item @kbd{h}
 @tab Continue to the line at cursor position (@code{idlwave-shell-to-here})
 @item @kbd{i}
-@tab Set breakpoint in function named here (@code{idlwave-shell-break-in})
+@tab Set breakpoint in module named here (@code{idlwave-shell-break-in})
 @item @kbd{[}
 @tab Go to the previous breakpoint in the file (@code{idlwave-shell-goto-previous-bp})
 @item @kbd{]}
@@ -2978,7 +3058,7 @@
 
 Most single-character electric debug bindings use the final keystroke
 of the equivalent multiple key commands (which are of course also
-still available), but some differ (e.g. @kbd{t},@kbd{q},@kbd{x}).
+still available), but some differ (e.g. @kbd{e},@kbd{t},@kbd{q},@kbd{x}).
 Some have additional convenience bindings (like @kbd{@key{SPACE}} for
 stepping).  All prefix and other argument options described in this
 section for the commands invoked by electric debug bindings are still
@@ -3014,15 +3094,24 @@
 halts.
 @end defopt
 
+@defopt idlwave-shell-electric-stop-color (Violet)
+Default color of the stopped line overlay when in electric debug mode.
+@end defopt        
+
+@defopt idlwave-shell-electric-stop-line-face 
+The face to use for the stopped line.  Defaults to a face similar to the
+modeline, with color @code{idlwave-shell-electric-stop-color}.
+@end defopt
+
 @defopt idlwave-shell-electric-zap-to-file (@code{t})
 If set, when entering electric debug mode, select the window displaying
 the file where point is stopped.  This takes point away from the shell
 window, but is useful for immediate stepping, etc.
 @end defopt
 
-@ifhtml
+@html
 <A NAME="EXAMINE"></A>
-@end ifhtml
+@end html
 @node Examining Variables, Custom Expression Examination, Debugging IDL Programs, The IDLWAVE Shell
 @section Examining Variables
 @cindex @code{PRINT} expressions
@@ -3033,15 +3122,15 @@
 @cindex Mouse binding to print expressions
 
 @kindex C-c C-d C-p
-Do you find yourself repeatedly typing,
-e.g. @code{print,n_elements(x)}, and similar statements to remind
-yourself of the type/size/structure/value/etc. of variables and
-expressions in your code or at the command line?  IDLWAVE has a suite
-of special commands to automate these types of variable or expression
-examinations.  They work by sending statements to the shell formatted
-to include the indicated expression.
-
-These examination commands can be used in the shell or buffer at any
+Do you find yourself repeatedly typing, e.g. @code{print,n_elements(x)},
+and similar statements to remind yourself of the
+type/size/structure/value/etc. of variables and expressions in your code
+or at the command line?  IDLWAVE has a suite of special commands to
+automate these types of variable or expression examinations.  They work
+by sending statements to the shell formatted to include the indicated
+expression, and can be accessed in several ways.
+
+These @emph{examine} commands can be used in the shell or buffer at any
 time (as long as the shell is running), and are very useful when
 execution is stopped in a buffer due to a triggered breakpoint or error,
 or while composing a long command in the IDLWAVE shell.  In the latter
@@ -3055,19 +3144,23 @@
 If the variable @code{idlwave-shell-separate-examine-output} is
 non-@code{nil} (the default), all examine output will be sent to a
 special @file{*Examine*} buffer, rather than the shell.  The output of
-prior examine commands is saved.  In this buffer @key{c} clears the
-contents, and @key{q} hides the buffer.
+prior examine commands is saved in this buffer.  In this buffer @key{c}
+clears the contents, and @key{q} hides the buffer.
 
 The two most basic examine commands are bound to @kbd{C-c C-d C-p}, to
 print the expression at point, and @kbd{C-c C-d ?}, to invoke help on
 this expression@footnote{Available as @kbd{p} and @kbd{?} in Electric
 Debug Mode (@pxref{Electric Debug Mode})}.  The expression at point is
-either an array expression or a function call, or the contents of a
-pair of parentheses.  The selected expression is highlighted, and
-simultaneously the resulting output is highlighted in the shell.
-Calling the above commands with a prefix argument will use the current
-region as expression instead of using the one at point.  Two prefix
-arguments (@kbd{C-u C-u C-c C-d C-p}) will prompt for an expression.
+either an array expression or a function call, or the contents of a pair
+of parentheses.  The chosen expression is highlighted, and
+simultaneously the resulting output is highlighted in the shell or
+separate output buffer.  Calling the above commands with a prefix
+argument will use the current region as expression instead of using the
+one at point. which can be useful for examining complicated, multi-line
+expressions.  Two prefix arguments (@kbd{C-u C-u C-c C-d C-p}) will
+prompt for an expression to print directly.  By default, when invoking
+print, only an initial portion of long arrays will be printed, up to
+@code{idlwave-shell-max-print-length}.
 
 For added speed and convenience, there are mouse bindings which allow
 you to click on expressions and examine their values.  Use
@@ -3121,6 +3214,11 @@
 @file{*Examine*} buffer, instead of in the shell itself. 
 @end defopt
 
+@defopt idlwave-shell-max-print-length (200)
+The maximum number of leading array entries to print, when examining
+array expressions.
+@end defopt
+
 @node Custom Expression Examination,  , Examining Variables, The IDLWAVE Shell
 @section Custom Expression Examination
 @cindex Expressions, custom examination
@@ -3191,7 +3289,6 @@
 (three underscores) are replaced by the indicated expression.
 @end defopt
 
-
 @node Acknowledgements, Sources of Routine Info, The IDLWAVE Shell, Top
 @chapter Acknowledgements
 @cindex Acknowledgements
@@ -3219,8 +3316,8 @@
 @item 
 @uref{mailto:jdsmith@@as.arizona.edu, @b{J.D. Smith}}, the current
 maintainer, as of version 4.10, helped shape object method completion
-and most new features introduced in versions 4.x, and added
-significant new capabilities for versions 5.x.
+and most new features introduced in versions 4.x, and introduced many
+new features for IDLWAVE versions 5.x and 6.x.
 @end itemize
 
 @noindent
@@ -3264,6 +3361,10 @@
 Paul Sorenson <aardvark62__at__msn.com>
 @end itemize
 
+Doug Dirks was instrumental in providing the crucial IDL XML catalog to
+support HTML help with IDL v6.2 and later, and Ali Bahrami provided
+scripts and documentation to interface with the IDL Assistant.
+
 @noindent
 Thanks to everyone!
 
@@ -3298,24 +3399,26 @@
 
 @enumerate
 @item 
-@emph{Builtin routines} are defined inside IDL itself.  The source
-code of such routines is not available.
+@emph{Builtin routines} are defined inside IDL itself.  The source code
+of such routines is not available, but instead are learned about through
+the IDL documentation.
 @item
 Routines which are @emph{part of the current program}, are defined in a
 file explicitly compiled by the user.  This file may or may not be
 located on the IDL search path.
 @item 
 @emph{Library routines} are defined in files located on IDL's search
-path, and will not need to be manually compiled.  When a library routine
-is called for the first time, IDL will find the source file and compile
-it dynamically.  A special sub-category of library routines are the
-@emph{system routines} distributed with IDL, and usually available in
-the @file{lib} subdirectory of the IDL distribution.
+path.  When a library routine is called for the first time, IDL will
+find the source file and compile it dynamically.  A special sub-category
+of library routines are the @emph{system routines} distributed with IDL,
+and usually available in the @file{lib} subdirectory of the IDL
+distribution.
 @item
 External routines written in other languages (like Fortran or C) can be
 called with @code{CALL_EXTERNAL}, linked into IDL via @code{LINKIMAGE},
 or included as dynamically loaded modules (DLMs).  Currently IDLWAVE
-cannot provide routine info and completion for such external routines.
+cannot provide routine info and completion for such external routines,
+except by querying the Shell for calling information (DLMs only).
 @end enumerate
 
 @node Routine Information Sources, Catalogs, Routine Definitions, Sources of Routine Info
@@ -3335,15 +3438,15 @@
 @item
 It has a @emph{builtin list} with information about the routines IDL
 ships with.  IDLWAVE @value{VERSION} is distributed with a list of
-@value{NSYSROUTINES} routines and @value{NSYSKEYWORDS} keywords,
-reflecting IDL version @value{IDLVERSION}.  This list has been created
-by scanning the IDL manuals and is stored in the file
-@file{idlw-rinfo.el}.  @xref{Documentation Scan}, for information on
-how to regenerate this file for new versions of IDL.
+@value{NSYSROUTINES} routines, reflecting IDL version
+@value{IDLVERSION}.  As of IDL v6.2, the routine info is distributed
+directly with IDL in the form of an XML catalog which IDLWAVE scans.
+Formerly, this list was created by scanning the IDL manuals to produce
+the file @file{idlw-rinfo.el}.
 
 @item 
-It @emph{scans} all @emph{buffers} of the current Emacs session for
-routine definitions.  This is done automatically when routine
+IDLWAVE @emph{scans} all its @emph{buffers} in the current Emacs session
+for routine definitions.  This is done automatically when routine
 information or completion is first requested by the user.  Each new
 buffer and each buffer saved after making changes is also scanned. The
 command @kbd{C-c C-i} (@code{idlwave-update-routine-info}) can be used
@@ -3353,16 +3456,18 @@
 If you have an IDLWAVE-Shell running in the Emacs session, IDLWAVE will
 @emph{query the shell} for compiled routines and their arguments.  This
 happens automatically when routine information or completion is first
-requested by the user, and each time an Emacs buffer is compiled with
-@kbd{C-c C-d C-c}.  Though rarely necessary, the command @kbd{C-c C-i}
-(@code{idlwave-update-routine-info}) can be used to update the shell
-routine data.
+requested by the user.  Each time an Emacs buffer is compiled with
+@kbd{C-c C-d C-c}, the routine info for that file is queried.  Though
+rarely necessary, the command @kbd{C-c C-i}
+(@code{idlwave-update-routine-info}) can be used to explicitly update
+the shell routine data.
 
 @item
-Many popular libraries are distributed with routine information
-already scanned into @emph{library catalogs} (@pxref{Library
-Catalogs}).  These per-directory catalog files can also be built by
-the user with the supplied @file{idlwave_catalog} tool.
+Many popular libraries are distributed with routine information already
+scanned into @emph{library catalogs} (@pxref{Library Catalogs}).  These
+per-directory catalog files can also be built by the user with the
+supplied @file{idlwave_catalog} tool.  They are automatically discovered
+by IDLWAVE.
 
 @item
 IDLWAVE can scan selected directories of source files and store the
@@ -3371,9 +3476,10 @@
 Catalog}, for information on how to scan files in this way.
 @end enumerate
 
-Loading routine and catalog information can be a time consuming process,
-especially over slow networks.  Depending on the system and network
-configuration it could take up to 30 seconds.  In order to minimize the
+Loading all the routine and catalog information can be a time consuming
+process, especially over slow networks.  Depending on the system and
+network configuration it could take up to 30 seconds (though locally on
+fast systems is usually only a few seconds).  In order to minimize the
 wait time upon your first completion or routine info command in a
 session, IDLWAVE uses Emacs idle time to do the initialization in six
 steps, yielding to user input in between.  If this gets into your way,
@@ -3399,9 +3505,9 @@
 Controls under what circumstances routine info is updated automatically.
 @end defopt
 
-@ifhtml
+@html
 <A NAME="CATALOGS"></A>
-@end ifhtml
+@end html
 @node Catalogs, Load-Path Shadows, Routine Information Sources, Sources of Routine Info
 @appendixsec Catalogs
 @cindex Catalogs
@@ -3426,7 +3532,12 @@
 information (e.g. Windows), a library path must be specified in
 @code{idlwave-library-path} to allow library catalogs to be located, and
 to setup directories for user catalog scan (@pxref{User Catalog} for
-more on this variable).
+more on this variable).  Note that, before the shell is running, IDLWAVE
+can only know about the IDL search path by consulting the file pointed
+to by @code{idlwave-path-file} (@file{~/.idlwave/idlpath.el}, by
+default).  If @code{idlwave-auto-write-path} is enabled (which is the
+default), the paths are written out whenever the IDLWAVE shell is
+started.
 
 @defopt idlwave-auto-write-path  (@code{t})
 Write out information on the !PATH and !DIR paths from IDL automatically
@@ -3435,17 +3546,20 @@
 @end defopt
 
 @defopt idlwave-library-path
-IDL library path for Windows and MacOS.  Not needed under Unix/MacOSX.
+IDL library path for Windows and MacOS.  Under Unix/MacOSX, will be
+obtained from the Shell when run.
 @end defopt
 
 @defopt idlwave-system-directory
-The IDL system directory for Windows and MacOS.  Not needed under
-Unix/MacOSX (obtained from the Shell).
+The IDL system directory for Windows and MacOS.  Also needed for
+locating HTML help and the IDL Assistant for IDL v6.2 and later.  Under
+Unix/MacOSX, will be obtained from the Shell and recorded, if run.
 @end defopt
 
 @defopt idlwave-config-directory (@file{~/.idlwave})
-Default path where IDLWAVE saves configuration information and any
-user catalog.
+Default path where IDLWAVE saves configuration information, a user
+catalog (if any), and a cached scan of the XML catalog (IDL v6.2 and
+later).
 @end defopt
 
 @menu
@@ -3453,23 +3567,23 @@
 * User Catalog::                
 @end menu
 
-@ifhtml
+@html
 <A NAME="LIBRARY_CATALOGS"></A>
-@end ifhtml
+@end html
 @node Library Catalogs, User Catalog, Catalogs, Catalogs
 @appendixsubsec Library Catalogs
 @cindex @file{.idlwave_catalog}
 @cindex Library catalogs
 @cindex @code{idlwave_catalog}
 
-Library catalogs are files named @file{.idlwave_catalog} stored in
-directories containing @code{.pro} routine files.  They are discovered
-on the IDL search path and loaded automatically when routine information
-is read.  Each catalog file documents the routines found in that
-directory --- one catalog per directory.  Every catalog has a library
-name associated with it (e.g. @emph{AstroLib}).  This name will be shown
-briefly when the catalog is found, and in the routine info of routines
-it documents.
+Library catalogs consist of files named @file{.idlwave_catalog} stored
+in directories containing @code{.pro} routine files.  They are
+discovered on the IDL search path and loaded automatically when routine
+information is read.  Each catalog file documents the routines found in
+that directory --- one catalog per directory.  Every catalog has a
+library name associated with it (e.g. @emph{AstroLib}).  This name will
+be shown briefly when the catalog is found, and in the routine info of
+routines it documents.
 
 Many popular libraries of routines are shipped with IDLWAVE catalog
 files by default, and so will be automatically discovered.  Library
@@ -3482,7 +3596,8 @@
 re-scanned automatically to gather updates, e.g. in a @file{cron} job.
 Scanning is much faster than with the built-in user catalog method.  One
 minor disadvantage: the entire IDL search path is scanned for catalog
-files every time IDLWAVE starts up, which might be slow over a network.
+files every time IDLWAVE starts up, which might be slow if accessing IDL
+routines over a slow network.
 
 A Perl tool to create library catalogs is distributed with IDLWAVE:
 @code{idlwave_catalog}.  It can be called quite simply:
@@ -3490,9 +3605,10 @@
 idlwave_catalog MyLib
 @end example
 
-@noindent This would scan all directories recursively beneath the current and
+@noindent This will scan all directories recursively beneath the current and
 populate them with @file{.idlwave_catalog} files, tagging the routines
-found with the name library ``MyLib''.  The full usage information:
+found there with the name library ``MyLib''.  The full usage
+information:
 
 @example
 Usage: idlwave_catalog  [-l] [-v] [-d] [-s] [-f] [-h] libname
@@ -3514,8 +3630,8 @@
 @kbd{C-u C-c C-i}.
 
 @defopt idlwave-use-library-catalogs  (@code{t})
-Whether to search for and load library catalogs.  Only disable if
-performance is a problem and the catalogs are not needed.
+Whether to search for and load library catalogs.  Disable if load
+performance is a problem and/or the catalogs are not needed.
 @end defopt
 
 @node User Catalog,  , Library Catalogs, Catalogs
@@ -3560,11 +3676,11 @@
 (setq idlwave-system-directory "c:/RSI/IDL56/")
 @end lisp
 
-@noindent Under GNU and UNIX, these values will be automatically gathered from
-the IDLWAVE shell.
+@noindent Under GNU/Linux and UNIX, these values will be automatically
+gathered from the IDLWAVE shell, if run.
 
 The command @kbd{M-x idlwave-create-user-catalog-file} (or the menu item
-@samp{IDLWAVE->Routine Info->Select Catalog Directories} can then be
+@samp{IDLWAVE->Routine Info->Select Catalog Directories}) can then be
 used to create a user catalog.  It brings up a widget in which you can
 select some or all directories on the search path.  Directories which
 already contain a library catalog are marked with @samp{[LIB]}, and need
@@ -3642,7 +3758,7 @@
 @cindex MacOS
 @cindex IDL variable @code{!DIR}
 @cindex @code{!DIR}, IDL variable
-Users of Windows and MacOS also must set the variable
+Users of Windows and MacOS (not X) also must set the variable
 @code{idlwave-system-directory} to the value of the @code{!DIR} system
 variable in IDL.  IDLWAVE appends @file{lib} to the value of this
 variable and assumes that all files found on that path are system
@@ -3658,21 +3774,31 @@
 @cindex Scanning the documentation
 @cindex Perl program, to create @file{idlw-rinfo.el}
 
+@strong{Starting with version 6.2, IDL is distributed directly with HTML
+online help, and an XML-based catalog of routine information}.  This
+makes scanning the manuals with the tool @file{get_html_rinfo}, and the
+@file{idlw-rinfo.el} file it produced, as described here, entirely
+unnecessary.  The information is left here for users wishing to produce
+a catalog of older IDL versions' help.
+
+
 IDLWAVE derives its knowledge about system routines from the IDL
 manuals.  The file @file{idlw-rinfo.el} contains the routine information
 for the IDL system routines, and links to relevant sections of the HTML
 documentation.  The Online Help feature of IDLWAVE requires HTML
-versions of the IDL manuals to be available.
+versions of the IDL manuals to be available; the HTML documentation is
+not distributed with IDLWAVE by default, but must be downloaded
+separately.
 
 The HTML files and related images can be produced from the
 @file{idl.chm} HTMLHelp file distributed with IDL using the free
 Microsoft HTML Help Workshop.  If you are lucky, the maintainer of
-IDLWAVE will always have access to the newest version of IDL and
-provide updates.  The IDLWAVE distribution also contains the Perl
-program @file{get_html_rinfo} which constructs the
-@file{idlw-rinfo.el} file by scanning the HTML documents produced from
-the IDL documentation.  Instructions on how to use
-@file{get_html_rinfo} are in the program itself.
+IDLWAVE will always have access to the newest version of IDL and provide
+updates.  The IDLWAVE distribution also contains the Perl program
+@file{get_html_rinfo} which constructs the @file{idlw-rinfo.el} file by
+scanning the HTML documents produced from the IDL documentation.
+Instructions on how to use @file{get_html_rinfo} are in the program
+itself.
 
 @node HTML Help Browser Tips, Configuration Examples, Sources of Routine Info, Top
 @appendix HTML Help Browser Tips
@@ -3680,39 +3806,41 @@
 
 There are a wide variety of possible browsers to use for displaying
 the online HTML help available with IDLWAVE (starting with version
-5.0).  Since IDLWAVE runs on a many different system types, a single
-browser configuration is not possible, but choices abound.
-
-Unfortunately, the HTML manuals decompiled from the original
-source contain formatting structures which Netscape 4.x does not
-handle well, though they are still readable.  A much better choice is
-Mozilla, or one of the Mozilla-derived browsers such as
+5.0). Since IDL v6.2, a single cross-platform HTML help browser, the
+@emph{IDL Assistant} is distributed with IDL.  If this help browser is
+available, it is the preferred choice, and the default.  The variable
+@code{idlwave-help-use-assistant}, enabled by default, controls
+whether this help browser is used.  If you use the IDL Assistant, the
+tips here are not relevant.
+
+Since IDLWAVE runs on a many different system types, a single browser
+configuration is not possible, but choices abound.  On many systems,
+the default browser configured in @code{browse-url-browser-function},
+and hence inherited by default by
+@code{idlwave-help-browser-function}, is Netscape.  Unfortunately, the
+HTML manuals decompiled from the original source contain formatting
+structures which Netscape 4.x does not handle well, though they are
+still readable.  A much better choice is Mozilla, or one of the
+Mozilla-derived browsers such as
 @uref{http://galeon.sourceforge.net/,Galeon} (GNU/Linux),
 @uref{http://www.mozilla.org/projects/camino/,Camino} (MacOSX), or
 @uref{http://www.mozilla.org/projects/firebird/,Firebird} (all
 platforms).  Newer versions of Emacs provide a browser-function choice
 @code{browse-url-gnome-moz} which uses the Gnome-configured browser.
 
-Note that the HTML files decompiled from  Microsoft Help sources
-contain specific references to the @samp{Symbol} font, which by default
-is not permitted in normal encodings (it's invalid, technically).  Though
-it only impacts a few symbols, you can trick Mozilla-based browsers into
+Note that the HTML files decompiled from the help sources contain
+specific references to the @samp{Symbol} font, which by default is not
+permitted in normal encodings (it's invalid, technically).  Though it
+only impacts a few symbols, you can trick Mozilla-based browsers into
 recognizing @samp{Symbol} by following the directions
-@uref{http://hutchinson.belmont.ma.us/tth/Xfonts.html, here}.  With this
-fix in place, HTML help pages look almost identical to their PDF
-equivalents (yet can be bookmarked, browsed as history, searched, etc.).
+@uref{http://hutchinson.belmont.ma.us/tth/Xfonts.html, here}.  With
+this fix in place, HTML help pages look almost identical to their PDF
+equivalents (yet can be bookmarked, browsed as history, searched,
+etc.).
 
 @noindent Individual platform recommendations:
 
 @itemize @bullet
-@item Windows: The native Microsoft HTMLHelp browser is preferred,
-with even better results using the free
-@uref{http://www.keyworks.net/keyhh.htm,@code{KEYHH}} program to
-permit IDL help to be targetted to a single window.  To use HTMLHelp,
-specify @code{idlwave-help-use-hh} as @code{'hh} or @code{'keyhh}.
-One bonus: since IDL is shipped with the @file{idl.chm} help file, you
-don't need to download the HTML help package.  @xref{Help with HTML
-Documentation}.
 @item Unix/MacOSX: The @uref{http://www.w3m.org,@code{w3m}} browser
 and its associated
 @uref{http://emacs-w3m.namazu.org/,@code{emacs-w3m}} emacs mode
@@ -3907,9 +4035,9 @@
                                         "help,___,/STRUCTURE"))))
 @end example
 
-@ifhtml
+@html
 <A NAME="WIN_MAC"></A>
-@end ifhtml
+@end html
 @node Windows and MacOS, Troubleshooting, Configuration Examples, Top
 @appendix Windows and MacOS
 @cindex Windows
@@ -3920,40 +4048,34 @@
 portability of Emacs, much of IDLWAVE does also work under different
 operating systems like Windows (with NTEmacs or NTXEmacs) or MacOS.
 
-The only real problem is that there is no command-line
-version of IDL for Windows or MacOS(<=9) with which IDLWAVE can
-interact.  As a result, the IDLWAVE Shell
-does not work and you have to rely on IDLDE to run and debug your
-programs.  However, editing IDL source files with Emacs/IDLWAVE works
-with all bells and whistles, including routine info, completion and fast
-online help.  Only a small amount of additional information must be
-specified in your @file{.emacs} file: the path names which, on a UNIX
-system, are automatically gathered by talking to the IDL program.
+The only real problem is that there is no command-line version of IDL
+for Windows or MacOS(<=9) with which IDLWAVE can interact.  As a
+result, the IDLWAVE Shell does not work and you have to rely on IDLDE
+to run and debug your programs.  However, editing IDL source files
+with Emacs/IDLWAVE works with all bells and whistles, including
+routine info, completion and fast online help.  Only a small amount of
+additional information must be specified in your @file{.emacs} file:
+the path names which, on a UNIX system, are automatically gathered by
+talking to the IDL program.
 
 Here is an example of the additional configuration needed for a Windows
 system.  I am assuming that IDLWAVE has been installed in
 @w{@samp{C:\Program Files\IDLWAVE}} and that IDL is installed in
-@w{@samp{C:\RSI\IDL55}}.
+@w{@samp{C:\RSI\IDL62}}.
 
 @lisp
-;; location of the lisp files (needed if IDLWAVE is not part of 
-;; the X/Emacs installation)
+;; location of the lisp files (only needed if IDLWAVE is not part of
+;; your default X/Emacs installation)
 (setq load-path (cons "c:/program files/IDLWAVE" load-path))
 
-;; The location of the IDL library files, both standard and your own.
+;; The location of the IDL library directories, both standard,  and your own.
 ;; note that the initial "+" expands the path recursively
 (setq idlwave-library-path
-        '("+c:/RSI/IDL55/lib/" "+c:/user/me/idllibs" ))
+        '("+c:/RSI/IDL55/lib/" "+c:/path/to/my/idllibs" ))
 
 ;; location of the IDL system directory (try "print,!DIR")
-(setq idlwave-system-directory "c:/RSI/IDL55/")
-
-;; specify using the HTMLHelp documentation for online help, with the
-;;  KEYHH helper routine (Windows only)
-(setq idlwave-use-hh 'keyhh)
-
-;; file in which to store the user catalog info
-(setq idlwave-user-catalog-file "c:/IDLWAVE/idlcat.el")
+(setq idlwave-system-directory "c:/RSI/IDL62/")
+
 @end lisp
 
 @noindent Furthermore, Windows sometimes tries to outsmart you --- make
@@ -3971,9 +4093,9 @@
 help can skip the browser and use the HTMLHelp functionality directly.
 @xref{Help with HTML Documentation}.
 
-@ifhtml
+@html
 <A NAME="TROUBLE"></A>
-@end ifhtml
+@end html
 @node Troubleshooting, Index, Windows and MacOS, Top
 @appendix Troubleshooting
 @cindex Troubleshooting
@@ -3996,7 +4118,7 @@
 if you prefer not to enter electric debug on breakpoints@dots{} but
 you really should try it before you disable it!  You can also
 customize this variable to enter debug mode when errors are
-encountered too.  
+encountered.  
 
 @item @strong{I get errors like @samp{Searching for program: no such
 file or directory, idl} when attempting to start the IDL shell.}
@@ -4020,11 +4142,11 @@
 there, or start Emacs and IDLWAVE from the shell.
 
 @item @strong{I get errors like @samp{Symbol's function is void:
-overlayp} when trying to start the shell in XEmacs}
+overlayp}}
 
 You don't have the @samp{fsf-compat} package installed, which IDLWAVE
-needs to run under XEmacs.  Install it and, if necessary, insert
-@code{(require 'overlay)} in your @file{.emacs}.
+needs to run under XEmacs.  Install it, or find an XEmacs distribution
+which includes it by default.
 
 @item @strong{I'm getting errors like @samp{Symbol's value as variable is void:
 cl-builtin-gethash} on completion or routine info.}
@@ -4035,7 +4157,7 @@
 place, and this is the source of the error.  If you recompile (or just
 "make; make install") from source, it should resolve this problem.
 Another option is to recompile the @file{idlw*.el} files by hand using
-@kbd{M-x byte-compile-file}.
+@kbd{M-x byte-compile-file}.  
 
 @item @strong{@kbd{M-@key{TAB}} doesn't complete words, it switches
 windows on my desktop.}
@@ -4063,7 +4185,7 @@
 in your @file{.emacs}:
 
 @lisp
-(setq idlwave-shell-prompt-pattern "^\\(ENVI\\|IDL\\)> ")
+(setq idlwave-shell-prompt-pattern "^\r? ?\\(ENVI\\|IDL\\)> ")
 @end lisp
 
 @item @strong{Attempts to set breakpoints fail: no breakpoint is
@@ -4095,7 +4217,8 @@
 @end lisp
 
 @noindent You can check on your load-path value using @kbd{C-h v
-load-path @key{RET}}.
+load-path @key{RET}}, and @kbd{C-h m} in an IDLWAVE buffer should show
+you the version Emacs is using.
 
 @item @strong{IDLWAVE is screwing up the formatting of my @file{.idl} files.}
 
@@ -4117,10 +4240,10 @@
 compiled in the shell should be up to date.  For other routines, the
 information is only as current as the most recent scan.  If you have a
 rapidly changing set of routines, and you'd like the latest routine
-information to be available for it, one powerful technique makes use of
-the library catalog tool, @samp{idlwave_catalog}.  Simply add a line to
-your @samp{cron} file (@samp{crontab -e} will let you edit this on some
-systems), like this:
+information to be available for it, one powerful technique is to make
+use of the library catalog tool, @samp{idlwave_catalog}.  Simply add a
+line to your @samp{cron} file (@samp{crontab -e} will let you edit this
+on some systems), like this
 
 @example
 45 3 * * 1-5 (cd /path/to/myidllib; /path/to/idlwave_catalog MyLib)
@@ -4130,14 +4253,15 @@
 rescan all @file{.pro} files at or below @file{/path/to/myidllib} every
 week night at 3:45am.  You can even scan site-wide libraries with this
 method, and the most recent information will be available to all users.
+Since the scanning is very fast, there is very little impact.
 
 @item @strong{All the Greek-font characters in the HTML help are
 displayed as Latin characters!}
 
-Unfortunately, the HTMLHelp files attempt to switch to
+Unfortunately, the HTMLHelp files RSI provides attempt to switch to
 @samp{Symbol} font to display Greek characters, which is not really an
 permitted method for doing this in HTML.  There is a "workaround" for
-many browsers: @xref{HTML Help Browser Tips}.
+some browsers: @xref{HTML Help Browser Tips}.
 
 @item @strong{In the shell, my long commands are truncated at 256 characters!}
 
@@ -4150,6 +4274,32 @@
 memory-bounded limit), but disables the processing of background
 widget events (those with @code{/NO_BLOCK} passed to @code{XManager}).
 
+@item @strong{When I invoke IDL HTML help on a routine, the page which
+is loaded is one page off, e.g. for @code{CONVERT_COORD}, I get
+@code{CONTOUR}.}
+
+You have a mismatch between your help index and the HTML help package
+you downloaded.  You need to ensure you download a ``downgrade kit'' if
+you are using anything older than the latest HTML help package.  A new
+help package apppears with each IDL release (assuming the documentation
+is updated).  
+Starting with IDL 6.2, the HTML help and its catalog are
+distributed with IDL, and so should never be inconsistent.
+
+@item @strong{I get errors such as @samp{void-variable
+browse-url-browser-function} or similar when attempting to load IDLWAVE
+under XEmacs.}
+
+You don't have the @samp{browse-url} (or other required) XEmacs package.
+Unlike GNU Emacs, XEmacs distributes many packages separately from the
+main program.  IDLWAVE is actually among these, but is not always the
+most up to date.  When installing IDLWAVE as an XEmacs package, it
+should prompt you for required additional packages.  When installing it
+from source, it won't and you'll get this error.  The easiest solution
+is to install all the packages when you install XEmacs (the so-called
+@samp{sumo} bundle).  The minimum set of XEmacs packages required by
+IDLWAVE is @samp{fsf-compat, xemacs-base, mail-lib}.
+
 @end enumerate
 
 @node Index,  , Troubleshooting, Top
--- a/man/killing.texi	Fri Apr 07 12:02:40 2006 +0000
+++ b/man/killing.texi	Sun Apr 09 00:38:22 2006 +0000
@@ -543,6 +543,7 @@
 commands are useful with text in multicolumn formats, and for changing
 text into or out of such formats.
 
+@cindex mark rectangle
   When you must specify a rectangle for a command to work on, you do it
 by putting the mark at one corner and point at the opposite corner.  The
 rectangle thus specified is called the @dfn{region-rectangle} because
--- a/man/mh-e.texi	Fri Apr 07 12:02:40 2006 +0000
+++ b/man/mh-e.texi	Sun Apr 09 00:38:22 2006 +0000
@@ -11,9 +11,9 @@
 @set VERSION 7.93
 @c Edition of the manual. It is either empty for the first edition or
 @c has the form ", nth Edition" (without the quotes).
-@set EDITION , 5th Edition
-@set UPDATED 2006-03-19
-@set UPDATE-MONTH March, 2006
+@set EDITION , 6th Edition
+@set UPDATED 2006-04-02
+@set UPDATE-MONTH April, 2006
 
 @c Other variables.
 @set MH-BOOK-HOME http://www.ics.uci.edu/~mh/book/mh
@@ -591,9 +591,9 @@
 If you've never run MH before, you need to run @command{install-mh}
 from the shell before you continue. This sets up your personal MH
 environment@footnote{See the section
-@uref{@value{MH-BOOK-HOME}/setup.htm, Setting Up MH} in the MH book.}.
-If you don't, you'll be greeted with the error message: @samp{Install
-MH and run install-mh before running MH-E}.
+@uref{@value{MH-BOOK-HOME}/../overall/setup.htm, Setting Up MH} in the
+MH book.}. If you don't, you'll be greeted with the error message:
+@samp{Install MH and run install-mh before running MH-E}.
 
 @cindex @samp{Path:} MH profile component
 @cindex MH profile
@@ -7502,7 +7502,7 @@
 @cindex spam filters, Spamassassin
 @cindex spam filters, bogofilter
 
-MH-E depends on @uref{http://www.spamassassin.org/, SpamAssassin},
+MH-E depends on @uref{http://spamassassin.apache.org/, SpamAssassin},
 @uref{http://bogofilter.sourceforge.net/, bogofilter}, or
 @uref{http://spamprobe.sourceforge.net/, SpamProbe} to throw the dreck
 away. This chapter describes briefly how to configure these programs
@@ -7557,7 +7557,7 @@
 
 SpamAssassin is one of the more popular spam filtering programs. Get
 it from your local distribution or from the
-@uref{http://spamassassin.org/, SpamAssassin web site}.
+@uref{http://spamassassin.apache.org/, SpamAssassin web site}.
 
 To use SpamAssassin, add the following recipes to @file{~/.procmailrc}:
 
@@ -8542,12 +8542,12 @@
 @kindex M-x mh-version
 
 Bug reports should be filed at
-@uref{https://sourceforge.net/bugs/?group_id=13357, SourceForge}. You
-need to be a SourceForge user to submit bug reports, but this is easy
-enough to do that it shouldn't be a restriction for you. Please
-include the output of @kbd{M-x mh-version} (@pxref{Miscellaneous}) in
-any bug report you send unless you're 110% positive we won't ask for
-it.
+@uref{https://sourceforge.net/tracker/?group_id=13357&atid=113357,
+SourceForge}. You need to be a SourceForge user to submit bug reports,
+but this is easy enough to do that it shouldn't be a restriction for
+you. Please include the output of @kbd{M-x mh-version}
+(@pxref{Miscellaneous}) in any bug report you send unless you're 110%
+positive we won't ask for it.
 
 @node Mailing Lists, MH FAQ and Support, Bug Reports, Odds and Ends
 @appendixsec MH-E Mailing Lists
@@ -8577,10 +8577,10 @@
 @cindex support
 
 You can find FAQs on MH-E at the
-@uref{https://sourceforge.net/support/?group_id=13357, Support
-Requests} page on SourceForge. If you don't find the answer to your
-question, file a support request and your question will become a new
-FAQ!
+@uref{https://sourceforge.net/tracker/?group_id=13357&atid=213357,
+Support Requests} page on SourceForge. If you don't find the answer to
+your question, file a support request and your question will become a
+new FAQ!
 
 @node Getting MH-E,  , MH FAQ and Support, Odds and Ends
 @appendixsec Getting MH-E
--- a/man/misc.texi	Fri Apr 07 12:02:40 2006 +0000
+++ b/man/misc.texi	Sun Apr 09 00:38:22 2006 +0000
@@ -2360,15 +2360,15 @@
 @cindex thumbnails
 
   Tumme is a facility for browsing image files.  It provides viewing
-of the original file, either as a thumbnail or in full size, inside
-Emacs or in an external viewer.
+the images either as thumbnails or in full size, either inside Emacs
+or through an external viewer.
 
   To enter Tumme, type @kbd{M-x tumme}.  It prompts for a directory;
 specify one that has images files.  This creates thumbnails for all
 the images in that directory, and displays them all in the ``thumbnail
 buffer''.  This takes a long time if the directory contains many image
-files, and it won't operate if the number of image files exceeds
-@code{tumme-show-all-from-dir-max-files}.
+files, and it asks for confirmation if the number of image files
+exceeds @code{tumme-show-all-from-dir-max-files}.
 
 @kindex C-t d @r{(Tumme)}
 @findex tumme-display-thumbs
@@ -2400,24 +2400,23 @@
 
   More advanced features include @dfn{image tags}, which are metadata
 used to categorize image files.  The tags are stored in a plain text
-file.
-@c ??? What is the file name?
-
-  To tag image files, mark them in the dired buffer and type @kbd{C-t
-t} (@code{tumme-tag-files}).  You will be prompted for a tag.  To mark
-files having a certain tag, type @kbd{C-t f}
+file configured by @code{tumme-db-file}.
+
+  To tag image files, mark them in the dired buffer (you can also mark
+files in Dired from the thumbnail buffer by typing @kbd{m}) and type
+@kbd{C-t t} (@code{tumme-tag-files}).  You will be prompted for a tag.
+To mark files having a certain tag, type @kbd{C-t f}
 (@code{tumme-mark-tagged-files}).  After marking image files with a
 certain tag, you can use @kbd{C-t d} to view them.
 
-@c ??? Remove what?  The tag?
-  You can also tag a file from the thumbnail buffer by typing @kbd{t
-t} and remove it by typing @kbd{t r}.  There is also a special ``tag''
-called ``comment'' for each file (it is not a tag in the exact same
-sense as the other tags, it is handled slightly different).  That is
-used to enter a comment or description about the image.  You comment a
-file from the thumbnail buffer by typing @kbd{c}.  You will be
-prompted for a comment.  Type @kbd{C-t c} to add a comment from Dired
-(@code{tumme-dired-comment-files}).
+  You can also tag a file directly from the thumbnail buffer by typing
+@kbd{t t} and you can remove a tag by typing @kbd{t r}.  There is also
+a special ``tag'' called ``comment'' for each file (it is not a tag in
+the exact same sense as the other tags, it is handled slightly
+different).  That is used to enter a comment or description about the
+image.  You comment a file from the thumbnail buffer by typing
+@kbd{c}.  You will be prompted for a comment.  Type @kbd{C-t c} to add
+a comment from Dired (@code{tumme-dired-comment-files}).
 
   Tumme also provides simple image manipulation.  In the thumbnail
 buffer, type @kbd{L} to rotate the original image 90 degrees anti
--- a/man/programs.texi	Fri Apr 07 12:02:40 2006 +0000
+++ b/man/programs.texi	Sun Apr 09 00:38:22 2006 +0000
@@ -360,7 +360,8 @@
 @item @key{TAB}
 Adjust indentation of current line.
 @item C-j
-Equivalent to @key{RET} followed by @key{TAB} (@code{newline-and-indent}).
+Insert a newline, then adjust indentation of following line
+(@code{newline-and-indent}).
 @end table
 
 @kindex TAB @r{(programming modes)}
@@ -385,9 +386,11 @@
 @kindex C-j
 @findex newline-and-indent
   When entering lines of new code, use @kbd{C-j}
-(@code{newline-and-indent}), which is equivalent to @key{RET}
-followed by @key{TAB}.  @kbd{C-j} at the end of a line creates a
-blank line and then gives it the appropriate indentation.
+(@code{newline-and-indent}), which inserts a newline and then adjusts
+indentation after it.  (It also deletes any trailing whitespace which
+remains before the new newline.)  Thus, @kbd{C-j} at the end of a line
+creates a blank line with appropriate indentation.  In programming
+language modes, it is equivalent to @key{RET} @key{TAB}.
 
   @key{TAB} indents a line that starts within a parenthetical grouping
 under the preceding line within the grouping, or the text after the
@@ -851,7 +854,7 @@
 (@pxref{Spelling}).
 
 @menu
-* Comment Commands::    Inserting, killing, and indenting comments.
+* Comment Commands::    Inserting, killing, and aligning comments.
 * Multi-Line Comments:: Commands for adding and editing multi-line comments.
 * Options for Comments::Customizing the comment features.
 @end menu
@@ -859,6 +862,7 @@
 @node Comment Commands
 @subsection Comment Commands
 @cindex indentation for comments
+@cindex alignment for comments
 
   The comment commands in this table insert, kill and align comments.
 They are described in this section and following sections.
@@ -897,11 +901,11 @@
 @kbd{M-;} inserts that after point, to keep the syntax valid.
 
   If the text of the line extends past the comment column, this
-command indents the comment start string to a suitable boundary
+command aligns the comment start string to a suitable boundary
 (usually, at least one space is inserted).
 
   You can also use @kbd{M-;} to align an existing comment.  If a line
-already contains the comment-start string, @kbd{M-;} reindents it to
+already contains the comment-start string, @kbd{M-;} realigns it to
 the conventional alignment and moves point after it.  (Exception:
 comments starting in column 0 are not moved.)  Even when an existing
 comment is properly aligned, @kbd{M-;} is still useful for moving
@@ -931,7 +935,7 @@
 A prefix argument used in these circumstances specifies how many
 comment delimiters to add or how many to delete.
 
-  Some major modes have special rules for indenting certain kinds of
+  Some major modes have special rules for aligning certain kinds of
 comments in certain contexts.  For example, in Lisp code, comments which
 start with two semicolons are indented as if they were lines of code,
 instead of at the comment column.  Comments which start with three
@@ -982,13 +986,13 @@
 opposite---it deletes comment delimiters from the lines in the region.
 
   With a positive argument, @code{comment-region} duplicates the last
-character of the comment start sequence it adds; the argument specifies
-how many copies of the character to insert.  Thus, in Lisp mode,
-@kbd{C-u 2 M-x comment-region} adds @samp{;;} to each line.  Duplicating
-the comment delimiter is a way of calling attention to the comment.  It
-can also affect how the comment is indented.  In Lisp, for proper
-indentation, you should use an argument of two or three, if between defuns;
-if within a defun, it must be three.
+character of the comment start sequence it adds; the argument
+specifies how many copies of the character to insert.  Thus, in Lisp
+mode, @kbd{C-u 2 M-x comment-region} adds @samp{;;} to each line.
+Duplicating the comment delimiter is a way of calling attention to the
+comment.  It can also affect how the comment is aligned or indented.
+In Lisp, for proper indentation, you should use an argument of two or
+three, if between defuns; if within a defun, it must be three.
 
   You can configure C Mode such that when you type a @samp{/} at the
 start of a line in a multi-line block comment, this closes the
@@ -1058,7 +1062,7 @@
 
 @vindex comment-indent-function
   The variable @code{comment-indent-function} should contain a function
-that will be called to compute the indentation for a newly inserted
+that will be called to compute the alignment for a newly inserted
 comment or for aligning an existing comment.  It is set differently by
 various major modes.  The function is called with no arguments, but with
 point at the beginning of the comment, or at the end of a line if a new
--- a/man/sending.texi	Fri Apr 07 12:02:40 2006 +0000
+++ b/man/sending.texi	Sun Apr 09 00:38:22 2006 +0000
@@ -459,9 +459,9 @@
 is @code{sendmail-send-it}, which delivers mail using the Sendmail
 installation on the local host.  To send mail through a SMTP server,
 set it to @code{smtpmail-send-it} and set up the Emacs SMTP library
-(@pxref{Top,, Sending mail via SMTP,smtpmail}).  A third option is
-@code{feedmail-send-it}, see the commentary section of the
-@file{feedmail.el} package for more information.
+(@pxref{Top,,Emacs SMTP Library, Sending mail via SMTP,smtpmail}).  A
+third option is @code{feedmail-send-it}, see the commentary section of
+the @file{feedmail.el} package for more information.
 
 @node Header Editing
 @subsection Mail Header Editing
--- a/man/texinfo.tex	Fri Apr 07 12:02:40 2006 +0000
+++ b/man/texinfo.tex	Sun Apr 09 00:38:22 2006 +0000
@@ -3,11 +3,11 @@
 % Load plain if necessary, i.e., if running under initex.
 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
 %
-\def\texinfoversion{2006-02-05.23}
-%
-% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994,
-%   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-%   2005, 2006 Free Software Foundation, Inc.
+\def\texinfoversion{2006-03-21.13}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free
+% Software Foundation, Inc.
 %
 % This texinfo.tex file is free software; you can redistribute it and/or
 % modify it under the terms of the GNU General Public License as
@@ -24,25 +24,18 @@
 % to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 % Boston, MA 02110-1301, USA.
 %
-% In other words, you are welcome to use, share and improve this program.
-% You are forbidden to forbid anyone else to use, share and improve
-% what you give them.   Help stamp out software-hoarding!
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction.  (This has been our intent since Texinfo was invented.)
 %
 % Please try the latest version of texinfo.tex before submitting bug
 % reports; you can get the latest version from:
-%   ftp://ftp.gnu.org/gnu/texinfo.tex
-%     (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
-%   ftp://texinfo.org/texinfo/texinfo.tex
+%   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
 %   ftp://tug.org/tex/texinfo.tex
-%     (and all CTAN mirrors, see http://www.ctan.org),
-%   and /home/gd/gnu/doc/texinfo.tex on the GNU machines.
-%
-% The texinfo.tex in any given Texinfo distribution could well be out
+%     (and all CTAN mirrors, see http://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
 % of date, so if that's what you're using, please check.
 %
-% Texinfo has a small home page at http://texinfo.org/ and also
-% http://www.gnu.org/software/texinfo.
-%
 % Send bug reports to bug-texinfo@gnu.org.  Please include including a
 % complete document in each bug report with which we can reproduce the
 % problem.  Patches are, of course, greatly appreciated.
@@ -59,8 +52,12 @@
 % Sometimes one run after texindex suffices, and sometimes you need more
 % than two; texi2dvi does it as many times as necessary.
 %
-% It is possible to adapt texinfo.tex for other languages.  You can get
-% the existing language-specific files from the full Texinfo distribution.
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent.  You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
 
 \message{Loading texinfo [version \texinfoversion]:}
 
@@ -70,7 +67,14 @@
 \everyjob{\message{[Texinfo version \texinfoversion]}%
   \catcode`+=\active \catcode`\_=\active}
 
-% Save some parts of plain tex whose names we will redefine.
+\message{Basics,}
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
 \let\ptexb=\b
 \let\ptexbullet=\bullet
 \let\ptexc=\c
@@ -80,23 +84,35 @@
 \let\ptexend=\end
 \let\ptexequiv=\equiv
 \let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
 \let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
 \let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
 \let\ptexrbrace=\}
+\let\ptexslash=\/
 \let\ptexstar=\*
 \let\ptext=\t
 
-% We never want plain's outer \+ definition in Texinfo.
-% For @tex, we can use \tabalign.
-\let\+ = \relax
-
-\message{Basics,}
-\chardef\other=12
-
 % If this character appears in an error message or help string, it
 % starts a new line in the output.
 \newlinechar = `^^J
 
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Pre-3.0.
+\else
+  \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
 % Set up fixed words for English if not already set.
 \ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
 \ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
@@ -135,44 +151,97 @@
 \ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
 \ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
 \ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
-\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
 \ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
-\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
+
+% Since the category of space is not known, we have to be careful.
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode`\ =\spacecat}
 
 % Ignore a token.
 %
 \def\gobble#1{}
 
-\hyphenation{ap-pen-dix}
-\hyphenation{mini-buf-fer mini-buf-fers}
-\hyphenation{eshell}
-\hyphenation{white-space}
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+  ap-pen-dix bit-map bit-maps
+  data-base data-bases eshell fall-ing half-way long-est man-u-script
+  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+  spell-ing spell-ings
+  stand-alone strong-est time-stamp time-stamps which-ever white-space
+  wide-spread wrap-around
+}
 
 % Margin to add to right of even pages, to left of odd pages.
-\newdimen \bindingoffset
-\newdimen \normaloffset
+\newdimen\bindingoffset
+\newdimen\normaloffset
 \newdimen\pagewidth \newdimen\pageheight
 
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @| inserts a changebar to the left of the current line.  It should
+% surround any changed text.  This approach does *not* work if the
+% change spans more than two lines of output.  To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+  % \vadjust can only be used in horizontal mode.
+  \leavevmode
+  %
+  % Append this vertical mode material after the current line in the output.
+  \vadjust{%
+    % We want to insert a rule with the height and depth of the current
+    % leading; that is exactly what \strutbox is supposed to record.
+    \vskip-\baselineskip
+    %
+    % \vadjust-items are inserted at the left edge of the type.  So
+    % the \llap here moves out into the left-hand margin.
+    \llap{%
+      %
+      % For a thicker or thinner bar, change the `1pt'.
+      \vrule height\baselineskip width1pt
+      %
+      % This is the space between the bar and the text.
+      \hskip 12pt
+    }%
+  }%
+}
+
 % Sometimes it is convenient to have everything in the transcript file
 % and nothing on the terminal.  We don't just call \tracingall here,
-% since that produces some useless output on the terminal.
+% since that produces some useless output on the terminal.  We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
 %
 \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
-\ifx\eTeXversion\undefined
-\def\loggingall{\tracingcommands2 \tracingstats2
-   \tracingpages1 \tracingoutput1 \tracinglostchars1
-   \tracingmacros2 \tracingparagraphs1 \tracingrestores1
-   \showboxbreadth\maxdimen\showboxdepth\maxdimen
+\def\loggingall{%
+  \tracingstats2
+  \tracingpages1
+  \tracinglostchars2  % 2 gives us more in etex
+  \tracingparagraphs1
+  \tracingoutput1
+  \tracingmacros2
+  \tracingrestores1
+  \showboxbreadth\maxdimen \showboxdepth\maxdimen
+  \ifx\eTeXversion\undefined\else % etex gives us more logging
+    \tracingscantokens1
+    \tracingifs1
+    \tracinggroups1
+    \tracingnesting2
+    \tracingassigns1
+  \fi
+  \tracingcommands3  % 3 gives us more in etex
+  \errorcontextlines16
 }%
-\else
-\def\loggingall{\tracingcommands3 \tracingstats2
-   \tracingpages1 \tracingoutput1 \tracinglostchars1
-   \tracingmacros2 \tracingparagraphs1 \tracingrestores1
-   \tracingscantokens1 \tracingassigns1 \tracingifs1
-   \tracinggroups1 \tracingnesting2
-   \showboxbreadth\maxdimen\showboxdepth\maxdimen
-}%
-\fi
 
 % add check for \lastpenalty to plain's definitions.  If the last thing
 % we did was a \nobreak, we don't want to insert more space.
@@ -223,13 +292,17 @@
     % take effect in \write's, yet the group defined by the \vbox ends
     % before the \shipout runs.
     %
-    \escapechar = `\\     % use backslash in output files.
     \indexdummies         % don't expand commands in the output.
     \normalturnoffactive  % \ in index entries must not stay \, e.g., if
-                   % the page break happens to be in the middle of an example.
+               % the page break happens to be in the middle of an example.
+               % We don't want .vr (or whatever) entries like this:
+               % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
+               % "\acronym" won't work when it's read back in;
+               % it needs to be 
+               % {\code {{\tt \backslashcurfont }acronym}
     \shipout\vbox{%
       % Do this early so pdf references go to the beginning of the page.
-      \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi
+      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
       %
       \ifcropmarks \vbox to \outervsize\bgroup
         \hsize = \outerhsize
@@ -277,7 +350,7 @@
       \egroup % \vbox from first cropmarks clause
       \fi
     }% end of \shipout\vbox
-  }% end of group with \turnoffactive
+  }% end of group with \indexdummies
   \advancepageno
   \ifnum\outputpenalty>-20000 \else\dosupereject\fi
 }
@@ -310,143 +383,161 @@
 % the input line (except we remove a trailing comment).  #1 should be a
 % macro which expects an ordinary undelimited TeX argument.
 %
-\def\parsearg#1{%
-  \let\next = #1%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+  \def\argtorun{#2}%
   \begingroup
     \obeylines
-    \futurelet\temp\parseargx
-}
-
-% If the next token is an obeyed space (from an @example environment or
-% the like), remove it and recurse.  Otherwise, we're done.
-\def\parseargx{%
-  % \obeyedspace is defined far below, after the definition of \sepspaces.
-  \ifx\obeyedspace\temp
-    \expandafter\parseargdiscardspace
-  \else
-    \expandafter\parseargline
-  \fi
-}
-
-% Remove a single space (as the delimiter token to the macro call).
-{\obeyspaces %
- \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
+    \spaceisspace
+    #1%
+    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
 
 {\obeylines %
   \gdef\parseargline#1^^M{%
     \endgroup % End of the group started in \parsearg.
-    %
-    % First remove any @c comment, then any @comment.
-    % Result of each macro is put in \toks0.
-    \argremovec #1\c\relax %
-    \expandafter\argremovecomment \the\toks0 \comment\relax %
-    %
-    % Call the caller's macro, saved as \next in \parsearg.
-    \expandafter\next\expandafter{\the\toks0}%
+    \argremovecomment #1\comment\ArgTerm%
   }%
 }
 
-% Since all \c{,omment} does is throw away the argument, we can let TeX
-% do that for us.  The \relax here is matched by the \relax in the call
-% in \parseargline; it could be more or less anything, its purpose is
-% just to delimit the argument to the \c.
-\def\argremovec#1\c#2\relax{\toks0 = {#1}}
-\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
-
-% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
 %    @end itemize  @c foo
-% will have two active spaces as part of the argument with the
-% `itemize'.  Here we remove all active spaces from #1, and assign the
-% result to \toks0.
-%
-% This loses if there are any *other* active characters besides spaces
-% in the argument -- _ ^ +, for example -- since they get expanded.
-% Fortunately, Texinfo does not define any such commands.  (If it ever
-% does, the catcode of the characters in questionwill have to be changed
-% here.)  But this means we cannot call \removeactivespaces as part of
-% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
-% that \parsearg gets might well have any character at all in it.
-%
-\def\removeactivespaces#1{%
-  \begingroup
-    \ignoreactivespaces
-    \edef\temp{#1}%
-    \global\toks0 = \expandafter{\temp}%
-  \endgroup
-}
-
-% Change the active space to expand to nothing.
-%
-\begingroup
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+  \def\temp{#3}%
+  \ifx\temp\empty
+    % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
+    \let\temp\finishparsearg
+  \else
+    \let\temp\argcheckspaces
+  \fi
+  % Put the space token in:
+  \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \argtorun.
+% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
+
+% \parseargdef\foo{...}
+%	is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick.  --kasal, 16nov03
+
+\def\parseargdef#1{%
+  \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+  \def#2{\parsearg#1}%
+  \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
   \obeyspaces
-  \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
-\endgroup
+  \gdef\obeyedspace{ }
+
+  % Make each space character in the input produce a normal interword
+  % space in the output.  Don't allow a line break at this space, as this
+  % is used only in environments like @example, where each line of input
+  % should produce a line of output anyway.
+  %
+  \gdef\sepspaces{\obeyspaces\let =\tie}
+
+  % If an index command is used in an @example environment, any spaces
+  % therein should become regular spaces in the raw index file, not the
+  % expansion of \tie (\leavevmode \penalty \@M \ ).
+  \gdef\unsepspaces{\let =\space}
+}
 
 
 \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
 
-%% These are used to keep @begin/@end levels from running away
-%% Call \inENV within environments (after a \begingroup)
-\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
-\def\ENVcheck{%
-\ifENV\errmessage{Still within an environment; press RETURN to continue}
-\endgroup\fi} % This is not perfect, but it should reduce lossage
-
-% @begin foo  is the same as @foo, for now.
-\newhelp\EMsimple{Press RETURN to continue.}
-
-\outer\def\begin{\parsearg\beginxxx}
-
-\def\beginxxx #1{%
-\expandafter\ifx\csname #1\endcsname\relax
-{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
-\csname #1\endcsname\fi}
+% Define the framework for environments in texinfo.tex.  It's used like this:
+%
+%   \envdef\foo{...}
+%   \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo.  \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches.  The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as enviroments; they don't open a group.  (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At runtime, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+  \def\temp{#1}%
+  \ifx\thisenv\temp
+  \else
+    \badenverr
+  \fi
+}
+
+% Evironment mismatch, #1 expected:
+\def\badenverr{%
+  \errhelp = \EMsimple
+  \errmessage{This command can appear only \inenvironment\temp,
+    not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+  \ifx#1\empty
+    out of any environment%
+  \else
+    in environment \expandafter\string#1%
+  \fi
+}
 
 % @end foo executes the definition of \Efoo.
-%
-\def\end{\parsearg\endxxx}
-\def\endxxx #1{%
-  \removeactivespaces{#1}%
-  \edef\endthing{\the\toks0}%
-  %
-  \expandafter\ifx\csname E\endthing\endcsname\relax
-    \expandafter\ifx\csname \endthing\endcsname\relax
-      % There's no \foo, i.e., no ``environment'' foo.
-      \errhelp = \EMsimple
-      \errmessage{Undefined command `@end \endthing'}%
-    \else
-      \unmatchedenderror\endthing
-    \fi
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+  \if 1\csname iscond.#1\endcsname
   \else
-    % Everything's ok; the right environment has been started.
-    \csname E\endthing\endcsname
+    % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+    \expandafter\checkenv\csname#1\endcsname
+    \csname E#1\endcsname
+    \endgroup
   \fi
 }
 
-% There is an environment #1, but it hasn't been started.  Give an error.
-%
-\def\unmatchedenderror#1{%
-  \errhelp = \EMsimple
-  \errmessage{This `@end #1' doesn't have a matching `@#1'}%
-}
-
-% Define the control sequence \E#1 to give an unmatched @end error.
-%
-\def\defineunmatchedend#1{%
-  \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
-}
-
-
-% Single-spacing is done by various environments (specifically, in
-% \nonfillstart and \quotations).
-\newskip\singlespaceskip \singlespaceskip = 12.5pt
-\def\singlespace{%
-  % Why was this kern here?  It messes up equalizing space above and below
-  % environments.  --karl, 6may93
-  %{\advance \baselineskip by -\singlespaceskip
-  %\kern \baselineskip}%
-  \setleading\singlespaceskip
-}
+\newhelp\EMsimple{Press RETURN to continue.}
+
 
 %% Simple single-character @ commands
 
@@ -467,16 +558,22 @@
 \let\{=\mylbrace
 \let\}=\myrbrace
 \begingroup
-  % Definitions to produce actual \{ & \} command in an index.
-  \catcode`\{ = 12 \catcode`\} = 12
+  % Definitions to produce \{ and \} commands for indices,
+  % and @{ and @} for the aux/toc files.
+  \catcode`\{ = \other \catcode`\} = \other
   \catcode`\[ = 1 \catcode`\] = 2
-  \catcode`\@ = 0 \catcode`\\ = 12
-  @gdef@lbracecmd[\{]%
-  @gdef@rbracecmd[\}]%
-@endgroup
+  \catcode`\! = 0 \catcode`\\ = \other
+  !gdef!lbracecmd[\{]%
+  !gdef!rbracecmd[\}]%
+  !gdef!lbraceatcmd[@{]%
+  !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
 
 % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
-% Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H.
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
 \let\, = \c
 \let\dotaccent = \.
 \def\ringaccent#1{{\accent23 #1}}
@@ -484,10 +581,12 @@
 \let\ubaraccent = \b
 \let\udotaccent = \d
 
-% Other special characters: @questiondown @exclamdown
-% Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss.
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
 \def\questiondown{?`}
 \def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
 
 % Dotless i and dotless j, used for accents.
 \def\imacro{i}
@@ -500,6 +599,25 @@
   \fi\fi
 }
 
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence.  (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo.  Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+  L\kern-.36em
+  {\setbox0=\hbox{T}%
+   \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+  \kern-.15em
+  \TeX
+}
+
 % Be sure we're in horizontal mode when doing a tie, since we make space
 % equivalent to this in @example-like environments. Otherwise, a space
 % at the beginning of a line will start with \penalty -- and
@@ -518,14 +636,32 @@
 % @* forces a line break.
 \def\*{\hfil\break\hbox{}\ignorespaces}
 
+% @/ allows a line break.
+\let\/=\allowbreak
+
 % @. is an end-of-sentence period.
-\def\.{.\spacefactor=3000 }
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
 
 % @! is an end-of-sentence bang.
-\def\!{!\spacefactor=3000 }
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
 
 % @? is an end-of-sentence query.
-\def\?{?\spacefactor=3000 }
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off  says whether to put extra space after punctuation.
+% 
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+  \def\temp{#1}%
+  \ifx\temp\onword \plainfrenchspacing
+  \else\ifx\temp\offword \plainnonfrenchspacing
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
+  \fi\fi
+}
 
 % @w prevents a word break.  Without the \leavevmode, @w at the
 % beginning of a paragraph, when TeX is still in vertical mode, would
@@ -540,47 +676,24 @@
 % therefore, no glue is inserted, and the space between the headline and
 % the text is small, which looks bad.
 %
-\def\group{\begingroup
-  \ifnum\catcode13=\active \else
+% Another complication is that the group might be very large.  This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material.  In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom.  The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+  \ifnum\catcode`\^^M=\active \else
     \errhelp = \groupinvalidhelp
     \errmessage{@group invalid in context where filling is enabled}%
   \fi
-  %
-  % The \vtop we start below produces a box with normal height and large
-  % depth; thus, TeX puts \baselineskip glue before it, and (when the
-  % next line of text is done) \lineskip glue after it.  (See p.82 of
-  % the TeXbook.)  Thus, space below is not quite equal to space
-  % above.  But it's pretty close.
-  \def\Egroup{%
-    \egroup           % End the \vtop.
-    \endgroup         % End the \group.
-  }%
-  %
-  \vtop\bgroup
-    % We have to put a strut on the last line in case the @group is in
-    % the midst of an example, rather than completely enclosing it.
-    % Otherwise, the interline space between the last line of the group
-    % and the first line afterwards is too small.  But we can't put the
-    % strut in \Egroup, since there it would be on a line by itself.
-    % Hence this just inserts a strut at the beginning of each line.
-    \everypar = {\strut}%
-    %
-    % Since we have a strut on every line, we don't need any of TeX's
-    % normal interline spacing.
-    \offinterlineskip
-    %
-    % OK, but now we have to do something about blank
-    % lines in the input in @example-like environments, which normally
-    % just turn into \lisppar, which will insert no space now that we've
-    % turned off the interline space.  Simplest is to make them be an
-    % empty paragraph.
-    \ifx\par\lisppar
-      \edef\par{\leavevmode \par}%
-      %
-      % Reset ^^M's definition to new definition of \par.
-      \obeylines
-    \fi
-    %
+  \startsavinginserts
+  %
+  \setbox\groupbox = \vtop\bgroup
     % Do @comment since we are called inside an environment such as
     % @example, where each end-of-line in the input causes an
     % end-of-line in the output.  We don't want the end-of-line after
@@ -590,6 +703,32 @@
     \comment
 }
 %
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it.  Thus, space below is not quite equal to space
+% above.  But it's pretty close.
+\def\Egroup{%
+    % To get correct interline space between the last line of the group
+    % and the first line afterwards, we have to propagate \prevdepth.
+    \endgraf % Not \par, as it may have been set to \lisppar.
+    \global\dimen1 = \prevdepth
+  \egroup           % End the \vtop.
+  % \dimen0 is the vertical size of the group's box.
+  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
+  % \dimen2 is how much space is left on the page (more or less).
+  \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
+  % if the group doesn't fit on the current page, and it's a big big
+  % group, force a page break.
+  \ifdim \dimen0 > \dimen2
+    \ifdim \pagetotal < \vfilllimit\pageheight
+      \page
+    \fi
+  \fi
+  \box\groupbox
+  \prevdepth = \dimen1
+  \checkinserts
+}
+%
 % TeX puts in an \escapechar (i.e., `@') at the beginning of the help
 % message, so this ends up printing `@group can only ...'.
 %
@@ -602,10 +741,8 @@
 
 \newdimen\mil  \mil=0.001in
 
-\def\need{\parsearg\needx}
-
 % Old definition--didn't work.
-%\def\needx #1{\par %
+%\parseargdef\need{\par %
 %% This method tries to make TeX break the page naturally
 %% if the depth of the box does not fit.
 %{\baselineskip=0pt%
@@ -613,7 +750,7 @@
 %\prevdepth=-1000pt
 %}}
 
-\def\needx#1{%
+\parseargdef\need{%
   % Ensure vertical mode, so we don't make a big box in the middle of a
   % paragraph.
   \par
@@ -652,37 +789,11 @@
   \fi
 }
 
-% @br   forces paragraph break
+% @br   forces paragraph break (and is undocumented).
 
 \let\br = \par
 
-% @dots{} output an ellipsis using the current font.
-% We do .5em per period so that it has the same spacing in a typewriter
-% font as three actual period characters.
-%
-\def\dots{%
-  \leavevmode
-  \hbox to 1.5em{%
-    \hskip 0pt plus 0.25fil minus 0.25fil
-    .\hss.\hss.%
-    \hskip 0pt plus 0.5fil minus 0.5fil
-  }%
-}
-
-% @enddots{} is an end-of-sentence ellipsis.
-%
-\def\enddots{%
-  \leavevmode
-  \hbox to 2em{%
-    \hskip 0pt plus 0.25fil minus 0.25fil
-    .\hss.\hss.\hss.%
-    \hskip 0pt plus 0.5fil minus 0.5fil
-  }%
-  \spacefactor=3000
-}
-
-
-% @page    forces the start of a new page
+% @page forces the start of a new page.
 %
 \def\page{\par\vfill\supereject}
 
@@ -694,13 +805,11 @@
 \newskip\exdentamount
 
 % This defn is used inside fill environments such as @defun.
-\def\exdent{\parsearg\exdentyyy}
-\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
 
 % This defn is used inside nofill environments such as @example.
-\def\nofillexdent{\parsearg\nofillexdentyyy}
-\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
-\leftline{\hskip\leftskip{\rm#1}}}}
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+  \leftline{\hskip\leftskip{\rm#1}}}}
 
 % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
 % paragraph.  For more general purposes, use the \margin insertion
@@ -752,37 +861,71 @@
 }
 
 % @include file    insert text of that file as input.
-% Allow normal characters that  we make active in the argument (a file name).
-\def\include{\begingroup
-  \catcode`\\=12
-  \catcode`~=12
-  \catcode`^=12
-  \catcode`_=12
-  \catcode`|=12
-  \catcode`<=12
-  \catcode`>=12
-  \catcode`+=12
-  \parsearg\includezzz}
-% Restore active chars for included file.
-\def\includezzz#1{\endgroup\begingroup
-  % Read the included file in a group so nested @include's work.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+  \pushthisfilestack
   \def\thisfile{#1}%
-  \input\thisfile
-\endgroup}
+  {%
+    \makevalueexpandable
+    \def\temp{\input #1 }%
+    \expandafter
+  }\temp
+  \popthisfilestack
+}
+\def\filenamecatcodes{%
+  \catcode`\\=\other
+  \catcode`~=\other
+  \catcode`^=\other
+  \catcode`_=\other
+  \catcode`|=\other
+  \catcode`<=\other
+  \catcode`>=\other
+  \catcode`+=\other
+  \catcode`-=\other
+}
+
+\def\pushthisfilestack{%
+  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+  \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+  the stack of filenames is empty.}}
 
 \def\thisfile{}
 
-% @center line   outputs that line, centered
-
-\def\center{\parsearg\centerzzz}
-\def\centerzzz #1{{\advance\hsize by -\leftskip
-\advance\hsize by -\rightskip
-\centerline{#1}}}
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+  \ifhmode
+    \let\next\centerH
+  \else
+    \let\next\centerV
+  \fi
+  \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+  {%
+    \hfil\break
+    \advance\hsize by -\leftskip
+    \advance\hsize by -\rightskip
+    \line{#1}%
+    \break
+  }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
 
 % @sp n   outputs n lines of vertical space
 
-\def\sp{\parsearg\spxxx}
-\def\spxxx #1{\vskip #1\baselineskip}
+\parseargdef\sp{\vskip #1\baselineskip}
 
 % @comment ...line which is ignored...
 % @c is the same as @comment
@@ -797,13 +940,13 @@
 
 % @paragraphindent NCHARS
 % We'll use ems for NCHARS, close enough.
-% We cannot implement @paragraphindent asis, though.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
 %
 \def\asisword{asis} % no translation, these are keywords
 \def\noneword{none}
 %
-\def\paragraphindent{\parsearg\doparagraphindent}
-\def\doparagraphindent#1{%
+\parseargdef\paragraphindent{%
   \def\temp{#1}%
   \ifx\temp\asisword
   \else
@@ -820,8 +963,7 @@
 % We'll use ems for NCHARS like @paragraphindent.
 % It seems @exampleindent asis isn't necessary, but
 % I preserve it to make it similar to @paragraphindent.
-\def\exampleindent{\parsearg\doexampleindent}
-\def\doexampleindent#1{%
+\parseargdef\exampleindent{%
   \def\temp{#1}%
   \ifx\temp\asisword
   \else
@@ -833,33 +975,76 @@
   \fi
 }
 
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading.  If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\noneword
+    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+  \else\ifx\temp\insertword
+    \let\suppressfirstparagraphindent = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @firstparagraphindent option `\temp'}%
+  \fi\fi
+}
+
+% Here is how we actually suppress indentation.  Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+  \gdef\indent{%
+    \restorefirstparagraphindent
+    \indent
+  }%
+  \gdef\noindent{%
+    \restorefirstparagraphindent
+    \noindent
+  }%
+  \global\everypar = {%
+    \kern -\parindent
+    \restorefirstparagraphindent
+  }%
+}
+
+\gdef\restorefirstparagraphindent{%
+  \global \let \indent = \ptexindent
+  \global \let \noindent = \ptexnoindent
+  \global \everypar = {}%
+}
+
+
 % @asis just yields its argument.  Used with @table, for example.
 %
 \def\asis#1{#1}
 
 % @math outputs its argument in math mode.
-% We don't use $'s directly in the definition of \math because we need
-% to set catcodes according to plain TeX first, to allow for subscripts,
-% superscripts, special math chars, etc.
-%
-% @math does not do math typesetting in section titles, index
-% entries, and other such contexts where the catcodes are set before
-% @math gets a chance to work.  This could perhaps be fixed, but for now
-% at least we can have real math in the main text, where it's needed most.
-%
-\let\implicitmath = $%$ font-lock fix
 %
 % One complication: _ usually means subscripts, but it could also mean
 % an actual _ character, as in @math{@var{some_variable} + 1}.  So make
-% _ within @math be active (mathcode "8000), and distinguish by seeing
-% if the current family is \slfam, which is what @var uses.
-%
-{\catcode95 = \active  % 95 = _
-\gdef\mathunderscore{%
-  \catcode95=\active
-  \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
-}}
-%
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+  \catcode`\_ = \active
+  \gdef\mathunderscore{%
+    \catcode`\_=\active
+    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+  }
+}
 % Another complication: we want \\ (and @\) to output a \ character.
 % FYI, plain.tex uses \\ as a temporary control sequence (why?), but
 % this is not advertised and we don't care.  Texinfo does not
@@ -870,14 +1055,58 @@
 %
 \def\math{%
   \tex
-  \mathcode`\_="8000 \mathunderscore
+  \mathunderscore
   \let\\ = \mathbackslash
-  \implicitmath\finishmath}
-\def\finishmath#1{#1\implicitmath\Etex}
+  \mathactive
+  $\finishmath
+}
+\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+  \catcode`^ = \active
+  \catcode`< = \active
+  \catcode`> = \active
+  \catcode`+ = \active
+  \gdef\mathactive{%
+    \let^ = \ptexhat
+    \let< = \ptexless
+    \let> = \ptexgtr
+    \let+ = \ptexplus
+  }
+}
 
 % @bullet and @minus need the same treatment as @math, just above.
-\def\bullet{\implicitmath\ptexbullet\implicitmath}
-\def\minus{\implicitmath-\implicitmath}
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+  \leavevmode
+  \hbox to 1.5em{%
+    \hskip 0pt plus 0.25fil
+    .\hfil.\hfil.%
+    \hskip 0pt plus 0.5fil
+  }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+  \dots
+  \spacefactor=\endofsentencespacefactor
+}
+
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+%
+\let\comma = ,
 
 % @refill is a no-op.
 \let\refill=\relax
@@ -893,20 +1122,20 @@
 % So open here the files we need to have open while reading the input.
 % This makes it possible to make a .fmt file for texinfo.
 \def\setfilename{%
+   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
    \iflinks
-     \readauxfile
+     \tryauxfile
+     % Open the new aux file.  TeX will close it automatically at exit.
+     \immediate\openout\auxfile=\jobname.aux
    \fi % \openindices needs to do some work in any case.
    \openindices
-   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
-   \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+   \let\setfilename=\comment % Ignore extra @setfilename cmds.
    %
    % If texinfo.cnf is present on the system, read it.
    % Useful for site-wide @afourpaper, etc.
-   % Just to be on the safe side, close the input stream before the \input.
    \openin 1 texinfo.cnf
-   \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
-   \closein1
-   \temp
+   \ifeof 1 \else \input texinfo.cnf \fi
+   \closein 1
    %
    \comment % Ignore the actual filename.
 }
@@ -942,17 +1171,72 @@
 \newif\ifpdf
 \newif\ifpdfmakepagedest
 
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set).  So we test for \relax and 0 as well as \undefined,
+% borrowed from ifpdf.sty.
 \ifx\pdfoutput\undefined
-  \pdffalse
-  \let\pdfmkdest = \gobble
-  \let\pdfurl = \gobble
-  \let\endlink = \relax
-  \let\linkcolor = \relax
-  \let\pdfmakeoutlines = \relax
 \else
-  \pdftrue
-  \pdfoutput = 1
+  \ifx\pdfoutput\relax
+  \else
+    \ifcase\pdfoutput
+    \else
+      \pdftrue
+    \fi
+  \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets,
+% for display in the outlines, and in other places.  Thus, we have to
+% double any backslashes.  Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e.  Not good.
+% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
+% (and related messages, the final outcome is that it is up to the TeX
+% user to double the backslashes and otherwise make the string valid, so
+% that's what we do).
+
+% double active backslashes.
+% 
+{\catcode`\@=0 \catcode`\\=\active
+ @gdef@activebackslashdouble{%
+   @catcode`@\=@active
+   @let\=@doublebackslash}
+}
+
+% To handle parens, we must adopt a different approach, since parens are
+% not active characters.  hyperref.dtx (which has the same problem as
+% us) handles it with this amazing macro to replace tokens.  I've
+% tinkered with it a little for texinfo, but it's definitely from there.
+% 
+% #1 is the tokens to replace.
+% #2 is the replacement.
+% #3 is the control sequence with the string.
+% 
+\def\HyPsdSubst#1#2#3{%
+  \def\HyPsdReplace##1#1##2\END{%
+    ##1%
+    \ifx\\##2\\%
+    \else
+      #2%
+      \HyReturnAfterFi{%
+        \HyPsdReplace##2\END
+      }%
+    \fi
+  }%
+  \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
+}
+\long\def\HyReturnAfterFi#1\fi{\fi#1}
+
+% #1 is a control sequence in which to do the replacements.
+\def\backslashparens#1{%
+  \xdef#1{#1}% redefine it as its expansion; the definition is simply
+             % \lastnode when called from \setref -> \pdfmkdest.
+  \HyPsdSubst{(}{\realbackslash(}{#1}%
+  \HyPsdSubst{)}{\realbackslash)}{#1}%
+}
+
+\ifpdf
   \input pdfcolor
+  \pdfcatalog{/PageMode /UseOutlines}%
   \def\dopdfimage#1#2#3{%
     \def\imagewidth{#2}%
     \def\imageheight{#3}%
@@ -966,15 +1250,26 @@
       \ifx\empty\imagewidth\else width \imagewidth \fi
       \ifx\empty\imageheight\else height \imageheight \fi
       \ifnum\pdftexversion<13
-	 #1.pdf%
+         #1.pdf%
        \else
          {#1.pdf}%
        \fi
     \ifnum\pdftexversion < 14 \else
       \pdfrefximage \pdflastximage
     \fi}
-  \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}}
-  \def\pdfmkpgn#1{#1}
+  \def\pdfmkdest#1{{%
+    % We have to set dummies so commands such as @code, and characters
+    % such as \, aren't expanded when present in a section title.
+    \atdummies
+    \activebackslashdouble
+    \def\pdfdestname{#1}%
+    \backslashparens\pdfdestname
+    \pdfdest name{\pdfdestname} xyz%
+  }}%
+  %
+  % used to mark target names; must be expandable.
+  \def\pdfmkpgn#1{#1}%
+  %
   \let\linkcolor = \Blue  % was Cyan, but that seems light?
   \def\endlink{\Black\pdfendlink}
   % Adding outlines to PDF; macros for calculating structure of outlines
@@ -982,80 +1277,106 @@
   \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
     \else \csname#1\endcsname \fi}
   \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
-    \advance\tempnum by1
+    \advance\tempnum by 1
     \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
-  \def\pdfmakeoutlines{{%
-    \openin 1 \jobname.toc
-    \ifeof 1\else\begingroup
-      \closein 1
-      \indexnofonts
-      \def\tt{}
-      \let\_ = \normalunderscore
+  %
+  % #1 is the section text, which is what will be displayed in the
+  % outline by the pdf viewer.  #2 is the pdf expression for the number
+  % of subentries (or empty, for subsubsections).  #3 is the node text,
+  % which might be empty if this toc entry had no corresponding node.
+  % #4 is the page number
+  %
+  \def\dopdfoutline#1#2#3#4{%
+    % Generate a link to the node text if that exists; else, use the
+    % page number.  We could generate a destination for the section
+    % text in the case where a section has no node, but it doesn't
+    % seem worth the trouble, since most documents are normally structured.
+    \def\pdfoutlinedest{#3}%
+    \ifx\pdfoutlinedest\empty
+      \def\pdfoutlinedest{#4}%
+    \else
+      % Doubled backslashes in the name.
+      {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
+       \backslashparens\pdfoutlinedest}%
+    \fi
+    %
+    % Also double the backslashes in the display string.
+    {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
+     \backslashparens\pdfoutlinetext}%
+    %
+    \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
+  }
+  %
+  \def\pdfmakeoutlines{%
+    \begingroup
       % Thanh's hack / proper braces in bookmarks
       \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
       \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
       %
-      \def\chapentry ##1##2##3{}
-      \let\appendixentry = \chapentry
-      \def\unnumbchapentry ##1##2{}
-      \def\secentry ##1##2##3##4{\advancenumber{chap##2}}
-      \def\unnumbsecentry ##1##2##3{\advancenumber{chap##2}}
-      \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}}
-      \def\unnumbsubsecentry ##1##2##3##4{\advancenumber{sec##2.##3}}
-      \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}}
-      \def\unnumbsubsubsecentry ##1##2##3##4##5{\advancenumber{subsec##2.##3.##4}}
-      \input \jobname.toc
-      \def\chapentry ##1##2##3{%
-        \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}}
-      \let\appendixentry = \chapentry
-      \def\unnumbchapentry ##1##2{%
-        \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
-      \def\secentry ##1##2##3##4{%
-        \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}}
-      \def\unnumbsecentry ##1##2##3{%
-        \pdfoutline goto name{\pdfmkpgn{##3}}{##1}}
-      \def\subsecentry ##1##2##3##4##5{%
-        \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}}
-      \def\unnumbsubsecentry ##1##2##3##4{%
-        \pdfoutline goto name{\pdfmkpgn{##4}}{##1}}
-      \def\subsubsecentry ##1##2##3##4##5##6{%
-        \pdfoutline goto name{\pdfmkpgn{##6}}{##1}}
-      \def\unnumbsubsubsecentry ##1##2##3##4##5{%
-        \pdfoutline goto name{\pdfmkpgn{##5}}{##1}}
+      % Read toc silently, to get counts of subentries for \pdfoutline.
+      \def\numchapentry##1##2##3##4{%
+	\def\thischapnum{##2}%
+	\def\thissecnum{0}%
+	\def\thissubsecnum{0}%
+      }%
+      \def\numsecentry##1##2##3##4{%
+	\advancenumber{chap\thischapnum}%
+	\def\thissecnum{##2}%
+	\def\thissubsecnum{0}%
+      }%
+      \def\numsubsecentry##1##2##3##4{%
+	\advancenumber{sec\thissecnum}%
+	\def\thissubsecnum{##2}%
+      }%
+      \def\numsubsubsecentry##1##2##3##4{%
+	\advancenumber{subsec\thissubsecnum}%
+      }%
+      \def\thischapnum{0}%
+      \def\thissecnum{0}%
+      \def\thissubsecnum{0}%
+      %
+      % use \def rather than \let here because we redefine \chapentry et
+      % al. a second time, below.
+      \def\appentry{\numchapentry}%
+      \def\appsecentry{\numsecentry}%
+      \def\appsubsecentry{\numsubsecentry}%
+      \def\appsubsubsecentry{\numsubsubsecentry}%
+      \def\unnchapentry{\numchapentry}%
+      \def\unnsecentry{\numsecentry}%
+      \def\unnsubsecentry{\numsubsecentry}%
+      \def\unnsubsubsecentry{\numsubsubsecentry}%
+      \readdatafile{toc}%
+      %
+      % Read toc second time, this time actually producing the outlines.
+      % The `-' means take the \expnumber as the absolute number of
+      % subentries, which we calculated on our first read of the .toc above.
+      %
+      % We use the node names as the destinations.
+      \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+      \def\numsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+      \def\numsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+      \def\numsubsubsecentry##1##2##3##4{% count is always zero
+        \dopdfoutline{##1}{}{##3}{##4}}%
+      %
+      % PDF outlines are displayed using system fonts, instead of
+      % document fonts.  Therefore we cannot use special characters,
+      % since the encoding is unknown.  For example, the eogonek from
+      % Latin 2 (0xea) gets translated to a | character.  Info from
+      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+      %
+      % xx to do this right, we have to translate 8-bit characters to
+      % their "best" equivalent, based on the @documentencoding.  Right
+      % now, I guess we'll just let the pdf reader have its way.
+      \indexnofonts
+      \setupdatafile
+      \catcode`\\=\active \otherbackslash
       \input \jobname.toc
-    \endgroup\fi
-  }}
-  \def\makelinks #1,{%
-    \def\params{#1}\def\E{END}%
-    \ifx\params\E
-      \let\nextmakelinks=\relax
-    \else
-      \let\nextmakelinks=\makelinks
-      \ifnum\lnkcount>0,\fi
-      \picknum{#1}%
-      \startlink attr{/Border [0 0 0]}
-        goto name{\pdfmkpgn{\the\pgn}}%
-      \linkcolor #1%
-      \advance\lnkcount by 1%
-      \endlink
-    \fi
-    \nextmakelinks
+    \endgroup
   }
-  \def\picknum#1{\expandafter\pn#1}
-  \def\pn#1{%
-    \def\p{#1}%
-    \ifx\p\lbrace
-      \let\nextpn=\ppn
-    \else
-      \let\nextpn=\ppnn
-      \def\first{#1}
-    \fi
-    \nextpn
-  }
-  \def\ppn#1{\pgn=#1\gobble}
-  \def\ppnn{\pgn=\first}
-  \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
-  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  %
   \def\skipspaces#1{\def\PP{#1}\def\D{|}%
     \ifx\PP\D\let\nextsp\relax
     \else\let\nextsp\skipspaces
@@ -1070,21 +1391,28 @@
   \else
     \let \startlink \pdfstartlink
   \fi
+  % make a live url in pdf output.
   \def\pdfurl#1{%
     \begingroup
-      \normalturnoffactive\def\@{@}%
-      \let\value=\expandablevalue
+      % it seems we really need yet another set of dummies; have not
+      % tried to figure out what each command should do in the context
+      % of @url.  for now, just make @/ a no-op, that's the only one
+      % people have actually reported a problem with.
+      % 
+      \normalturnoffactive
+      \def\@{@}%
+      \let\/=\empty
+      \makevalueexpandable
       \leavevmode\Red
       \startlink attr{/Border [0 0 0]}%
         user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
-        % #1
     \endgroup}
   \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
   \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
   \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
   \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
   \def\maketoks{%
-    \expandafter\poptoks\the\toksA|ENDTOKS|
+    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
     \ifx\first0\adn0
     \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
     \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
@@ -1104,20 +1432,44 @@
     \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
     \linkcolor #1\endlink}
   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
-\fi % \ifx\pdfoutput
+\else
+  \let\pdfmkdest = \gobble
+  \let\pdfurl = \gobble
+  \let\endlink = \relax
+  \let\linkcolor = \relax
+  \let\pdfmakeoutlines = \relax
+\fi  % \ifx\pdfoutput
 
 
 \message{fonts,}
-% Font-change commands.
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+  \csname ten#1\endcsname  % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
 
 % Texinfo sort of supports the sans serif font style, which plain TeX does not.
-% So we set up a \sf analogous to plain's \rm, etc.
+% So we set up a \sf.
 \newfam\sffam
-\def\sf{\fam=\sffam \tensf}
+\def\sf{\fam=\sffam \setfontstyle{sf}}
 \let\li = \sf % Sometimes we call it \li, not \sf.
 
-% We don't need math for this one.
-\def\ttsl{\tenttsl}
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
 
 % Default leading.
 \newdimen\textleading  \textleading = 13.2pt
@@ -1168,20 +1520,11 @@
 \def\scshape{csc}
 \def\scbshape{csc}
 
-\newcount\mainmagstep
-\ifx\bigger\relax
-  % not really supported.
-  \let\mainmagstep=\magstep1
-  \setfont\textrm\rmshape{12}{1000}
-  \setfont\texttt\ttshape{12}{1000}
-\else
-  \mainmagstep=\magstephalf
-  \setfont\textrm\rmshape{10}{\mainmagstep}
-  \setfont\texttt\ttshape{10}{\mainmagstep}
-\fi
-% Instead of cmb10, you many want to use cmbx10.
-% cmbx10 is a prettier font on its own, but cmb10
-% looks better when embedded in a line with cmr10.
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}
+\setfont\texttt\ttshape{10}{\mainmagstep}
 \setfont\textbf\bfshape{10}{\mainmagstep}
 \setfont\textit\itshape{10}{\mainmagstep}
 \setfont\textsl\slshape{10}{\mainmagstep}
@@ -1191,12 +1534,14 @@
 \font\texti=cmmi10 scaled \mainmagstep
 \font\textsy=cmsy10 scaled \mainmagstep
 
-% A few fonts for @defun, etc.
-\setfont\defbf\bxshape{10}{\magstep1} %was 1314
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}
 \setfont\deftt\ttshape{10}{\magstep1}
-\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+\setfont\defttsl\ttslshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
 
 % Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
 \setfont\smallrm\rmshape{9}{1000}
 \setfont\smalltt\ttshape{9}{1000}
 \setfont\smallbf\bfshape{10}{900}
@@ -1209,6 +1554,7 @@
 \font\smallsy=cmsy9
 
 % Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
 \setfont\smallerrm\rmshape{8}{1000}
 \setfont\smallertt\ttshape{8}{1000}
 \setfont\smallerbf\bfshape{10}{800}
@@ -1220,7 +1566,8 @@
 \font\smalleri=cmmi8
 \font\smallersy=cmsy8
 
-% Fonts for title page:
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
 \setfont\titlerm\rmbshape{12}{\magstep3}
 \setfont\titleit\itbshape{10}{\magstep4}
 \setfont\titlesl\slbshape{10}{\magstep4}
@@ -1232,8 +1579,10 @@
 \font\titlei=cmmi12 scaled \magstep3
 \font\titlesy=cmsy10 scaled \magstep4
 \def\authorrm{\secrm}
+\def\authortt{\sectt}
 
 % Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
 \setfont\chaprm\rmbshape{12}{\magstep2}
 \setfont\chapit\itbshape{10}{\magstep3}
 \setfont\chapsl\slbshape{10}{\magstep3}
@@ -1246,6 +1595,7 @@
 \font\chapsy=cmsy10 scaled \magstep3
 
 % Section fonts (14.4pt).
+\def\secnominalsize{14pt}
 \setfont\secrm\rmbshape{12}{\magstep1}
 \setfont\secit\itbshape{10}{\magstep2}
 \setfont\secsl\slbshape{10}{\magstep2}
@@ -1258,6 +1608,7 @@
 \font\secsy=cmsy10 scaled \magstep2
 
 % Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
 \setfont\ssecrm\rmbshape{12}{\magstephalf}
 \setfont\ssecit\itbshape{10}{1315}
 \setfont\ssecsl\slbshape{10}{1315}
@@ -1265,11 +1616,22 @@
 \setfont\ssecttsl\ttslshape{10}{1315}
 \setfont\ssecsf\sfbshape{12}{\magstephalf}
 \let\ssecbf\ssecrm
-\setfont\ssecsc\scbshape{10}{\magstep1}
+\setfont\ssecsc\scbshape{10}{1315}
 \font\sseci=cmmi12 scaled \magstephalf
 \font\ssecsy=cmsy10 scaled 1315
-% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
-% but that is not a standard magnification.
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}
+\setfont\reducedtt\ttshape{10}{1000}
+\setfont\reducedbf\bfshape{10}{1000}
+\setfont\reducedit\itshape{10}{1000}
+\setfont\reducedsl\slshape{10}{1000}
+\setfont\reducedsf\sfshape{10}{1000}
+\setfont\reducedsc\scshape{10}{1000}
+\setfont\reducedttsl\ttslshape{10}{1000}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
 
 % In order for the font changes to affect most math symbols and letters,
 % we have to define the \textfont of the standard families.  Since
@@ -1284,56 +1646,104 @@
 }
 
 % The font-changing commands redefine the meanings of \tenSTYLE, instead
-% of just \STYLE.  We do this so that font changes will continue to work
-% in math mode, where it is the current \fam that is relevant in most
-% cases, not the current font.  Plain TeX does \def\bf{\fam=\bffam
-% \tenbf}, for example.  By redefining \tenbf, we obviate the need to
-% redefine \bf itself.
+% of just \STYLE.  We do this because \STYLE needs to also set the
+% current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower).  These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
 \def\textfonts{%
   \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
   \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
-  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
+  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+  \let\tenttsl=\textttsl
+  \def\curfontsize{text}%
+  \def\lsize{reduced}\def\lllsize{smaller}%
   \resetmathfonts \setleading{\textleading}}
 \def\titlefonts{%
   \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
   \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
   \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
   \let\tenttsl=\titlettsl
+  \def\curfontsize{title}%
+  \def\lsize{chap}\def\lllsize{subsec}%
   \resetmathfonts \setleading{25pt}}
 \def\titlefont#1{{\titlefonts\rm #1}}
 \def\chapfonts{%
   \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
   \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
-  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
+  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+  \let\tenttsl=\chapttsl
+  \def\curfontsize{chap}%
+  \def\lsize{sec}\def\lllsize{text}%
   \resetmathfonts \setleading{19pt}}
 \def\secfonts{%
   \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
   \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
-  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
+  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+  \let\tenttsl=\secttsl
+  \def\curfontsize{sec}%
+  \def\lsize{subsec}\def\lllsize{reduced}%
   \resetmathfonts \setleading{16pt}}
 \def\subsecfonts{%
   \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
   \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
-  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
+  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+  \let\tenttsl=\ssecttsl
+  \def\curfontsize{ssec}%
+  \def\lsize{text}\def\lllsize{small}%
   \resetmathfonts \setleading{15pt}}
-\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+  \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+  \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+  \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+  \let\tenttsl=\reducedttsl
+  \def\curfontsize{reduced}%
+  \def\lsize{small}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{10.5pt}}
 \def\smallfonts{%
   \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
   \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
   \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
   \let\tenttsl=\smallttsl
+  \def\curfontsize{small}%
+  \def\lsize{smaller}\def\lllsize{smaller}%
   \resetmathfonts \setleading{10.5pt}}
 \def\smallerfonts{%
   \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
   \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
   \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
   \let\tenttsl=\smallerttsl
+  \def\curfontsize{smaller}%
+  \def\lsize{smaller}\def\lllsize{smaller}%
   \resetmathfonts \setleading{9.5pt}}
-\let\smallexamplefonts = \smallerfonts
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+%   8.5x11=86   smallbook=72  a4=90  a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+%   8.5x11=90+  smallbook=80  a4=90+  a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt.  So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+%   8.5x11=71  smallbook=60  a4=75  a5=58
+%
+% I wish the USA used A4 paper.
+% --karl, 24jan03.
+
 
 % Set up the default fonts, so we can use them for creating boxes.
 %
-\textfonts
+\textfonts \rm
 
 % Define these so they can be easily changed for other fonts.
 \def\angleleft{$\langle$}
@@ -1344,27 +1754,41 @@
 
 % Fonts for short table of contents.
 \setfont\shortcontrm\rmshape{12}{1000}
-\setfont\shortcontbf\bxshape{12}{1000}
+\setfont\shortcontbf\bfshape{10}{\magstep1}  % no cmb12
 \setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
 
 %% Add scribe-like font environments, plus @l for inline lisp (usually sans
 %% serif) and @ii for TeX italic
 
 % \smartitalic{ARG} outputs arg in italics, followed by an italic correction
 % unless the following character is such as not to need one.
-\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
-\def\smartslanted#1{{\sl #1}\futurelet\next\smartitalicx}
-\def\smartitalic#1{{\it #1}\futurelet\next\smartitalicx}
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+                    \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally use \sl.  We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
 
 \let\i=\smartitalic
+\let\slanted=\smartslanted
 \let\var=\smartslanted
 \let\dfn=\smartslanted
 \let\emph=\smartitalic
-\let\cite=\smartslanted
-
+
+% @b, explicit bold.
 \def\b#1{{\bf #1}}
 \let\strong=\b
 
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
 % We can't just use \exhyphenpenalty, because that only has effect at
 % the end of a paragraph.  Restore normal hyphenation at the end of the
 % group within which \nohyphenation is presumably called.
@@ -1372,11 +1796,35 @@
 \def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
 \def\restorehyphenation{\hyphenchar\font = `- }
 
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar   = `\.
+\chardef\exclamChar= `\!
+\chardef\questChar = `\?
+\chardef\semiChar  = `\;
+%
+\catcode`@=11
+  \def\plainfrenchspacing{%
+    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+    \def\endofsentencespacefactor{1000}% for @. and friends
+  }
+  \def\plainnonfrenchspacing{%
+    \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+    \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+    \def\endofsentencespacefactor{3000}% for @. and friends
+  }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
 \def\t#1{%
-  {\tt \rawbackslash \frenchspacing #1}%
+  {\tt \rawbackslash \plainfrenchspacing #1}%
   \null
 }
-\let\ttfont=\t
 \def\samp#1{`\tclose{#1}'\null}
 \setfont\keyrm\rmshape{8}{1000}
 \font\keysy=cmsy9
@@ -1411,13 +1859,13 @@
     \nohyphenation
     %
     \rawbackslash
-    \frenchspacing
+    \plainfrenchspacing
     #1%
   }%
   \null
 }
 
-% We *must* turn on hyphenation at `-' and `_' in \code.
+% We *must* turn on hyphenation at `-' and `_' in @code.
 % Otherwise, it is too hard to avoid overfull hboxes
 % in the Emacs manual, the Library manual, etc.
 
@@ -1431,14 +1879,16 @@
   \catcode`\_=\active
   %
   \global\def\code{\begingroup
-    \catcode`\-=\active \let-\codedash
-    \catcode`\_=\active \let_\codeunder
+    \catcode`\-=\active  \catcode`\_=\active
+    \ifallowcodebreaks
+     \let-\codedash
+     \let_\codeunder
+    \else
+     \let-\realdash
+     \let_\realunder
+    \fi
     \codex
   }
-  %
-  % If we end up with any active - characters when handling the index,
-  % just treat them as a normal -.
-  \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
 }
 
 \def\realdash{-}
@@ -1456,30 +1906,53 @@
 }
 \def\codex #1{\tclose{#1}\endgroup}
 
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__.  This is undesirable in
+% some manuals, especially if they don't have long identifiers in
+% general.  @allowcodebreaks provides a way to control this.
+% 
+\newif\ifallowcodebreaks  \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\keywordtrue
+    \allowcodebreakstrue
+  \else\ifx\txiarg\keywordfalse
+    \allowcodebreaksfalse
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
+  \fi\fi
+}
+
 % @kbd is like @code, except that if the argument is just one @key command,
 % then @kbd has no effect.
 
 % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
 %   `example' (@kbd uses ttsl only inside of @example and friends),
 %   or `code' (@kbd uses normal tty font always).
-\def\kbdinputstyle{\parsearg\kbdinputstylexxx}
-\def\kbdinputstylexxx#1{%
-  \def\arg{#1}%
-  \ifx\arg\worddistinct
+\parseargdef\kbdinputstyle{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\worddistinct
     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
-  \else\ifx\arg\wordexample
+  \else\ifx\txiarg\wordexample
     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
-  \else\ifx\arg\wordcode
+  \else\ifx\txiarg\wordcode
     \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
   \fi\fi\fi
 }
 \def\worddistinct{distinct}
 \def\wordexample{example}
 \def\wordcode{code}
 
-% Default is kbdinputdistinct.  (Too much of a hassle to call the macro,
-% the catcodes are wrong for parsearg to work.)
-\gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}
+% Default is `distinct.'
+\kbdinputstyle distinct
 
 \def\xkey{\key}
 \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
@@ -1487,8 +1960,8 @@
 \else{\tclose{\kbdfont\look}}\fi
 \else{\tclose{\kbdfont\look}}\fi}
 
-% For @url, @env, @command quotes seem unnecessary, so use \code.
-\let\url=\code
+% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
+\let\indicateurl=\code
 \let\env=\code
 \let\command=\code
 
@@ -1520,6 +1993,10 @@
   \endlink
 \endgroup}
 
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
 % rms does not like angle brackets --karl, 17may97.
 % So now @email is just like @uref, unless we are pdf.
 %
@@ -1561,12 +2038,101 @@
 \def\sc#1{{\smallcaps#1}}       % smallcaps font
 \def\ii#1{{\it #1}}             % italic font
 
-% @acronym downcases the argument and prints in smallcaps.
-\def\acronym#1{{\smallcaps \lowercase{#1}}}
-
-% @pounds{} is a sterling sign.
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+% 
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+  {\selectfonts\lsize #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+% 
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+  {\plainfrenchspacing #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
 \def\pounds{{\it\$}}
 
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+% 
+% Although only regular is the truly official Euro symbol, we ignore
+% that.  The Euro is designed to be slightly taller than the regular
+% font height.
+% 
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+% 
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+% 
+% Also doesn't work in math.  Do we need to do math with euro symbols?
+% Hope not.
+% 
+% 
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+  % We set the font at each command, rather than predefining it in
+  % \textfonts and the other font-switching commands, so that
+  % installations which never need the symbol don't have to have the
+  % font installed.
+  % 
+  % There is only one designed size (nominal 10pt), so we always scale
+  % that to the current nominal size.
+  % 
+  % By the way, simply using "at 1em" works for cmr10 and the like, but
+  % does not work for cmbx10 and other extended/shrunken fonts.
+  % 
+  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+  %
+  \ifx\curfontstyle\bfstylename 
+    % bold:
+    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+  \else 
+    % regular:
+    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+  \fi
+  \thiseurofont
+}
+
+% @registeredsymbol - R in a circle.  The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+  $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+               \hfil\crcr\Orb}}%
+    }$%
+}
+
+% Laurent Siebenmann reports \Orb undefined with:
+%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
+% so we'll define it if necessary.
+% 
+\ifx\Orb\undefined
+\def\Orb{\mathhexbox20D}
+\fi
+
 
 \message{page headings,}
 
@@ -1585,85 +2151,102 @@
 \newif\ifsetshortcontentsaftertitlepage
  \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
 
-\def\shorttitlepage{\parsearg\shorttitlepagezzz}
-\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
         \endgroup\page\hbox{}\page}
 
-\def\titlepage{\begingroup \parindent=0pt \textfonts
-   \let\subtitlerm=\tenrm
-   \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
-   %
-   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
-   %
-   % Leave some space at the very top of the page.
-   \vglue\titlepagetopglue
-   %
-   % Now you can print the title using @title.
-   \def\title{\parsearg\titlezzz}%
-   \def\titlezzz##1{\leftline{\titlefonts\rm ##1}
-                    % print a rule at the page bottom also.
-                    \finishedtitlepagefalse
-                    \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
-   % No rule at page bottom unless we print one at the top with @title.
-   \finishedtitlepagetrue
-   %
-   % Now you can put text using @subtitle.
-   \def\subtitle{\parsearg\subtitlezzz}%
-   \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
-   %
-   % @author should come last, but may come many times.
-   \def\author{\parsearg\authorzzz}%
-   \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
-      {\authorfont \leftline{##1}}}%
-   %
-   % Most title ``pages'' are actually two pages long, with space
-   % at the top of the second.  We don't want the ragged left on the second.
-   \let\oldpage = \page
-   \def\page{%
+\envdef\titlepage{%
+  % Open one extra group, as we want to close it in the middle of \Etitlepage.
+  \begingroup
+    \parindent=0pt \textfonts
+    % Leave some space at the very top of the page.
+    \vglue\titlepagetopglue
+    % No rule at page bottom unless we print one at the top with @title.
+    \finishedtitlepagetrue
+    %
+    % Most title ``pages'' are actually two pages long, with space
+    % at the top of the second.  We don't want the ragged left on the second.
+    \let\oldpage = \page
+    \def\page{%
       \iffinishedtitlepage\else
-         \finishtitlepage
+	 \finishtitlepage
       \fi
-      \oldpage
       \let\page = \oldpage
-      \hbox{}}%
-%   \def\page{\oldpage \hbox{}}
+      \page
+      \null
+    }%
 }
 
 \def\Etitlepage{%
-   \iffinishedtitlepage\else
-      \finishtitlepage
-   \fi
-   % It is important to do the page break before ending the group,
-   % because the headline and footline are only empty inside the group.
-   % If we use the new definition of \page, we always get a blank page
-   % after the title page, which we certainly don't want.
-   \oldpage
-   \endgroup
-   %
-   % Need this before the \...aftertitlepage checks so that if they are
-   % in effect the toc pages will come out with page numbers.
-   \HEADINGSon
-   %
-   % If they want short, they certainly want long too.
-   \ifsetshortcontentsaftertitlepage
-     \shortcontents
-     \contents
-     \global\let\shortcontents = \relax
-     \global\let\contents = \relax
-   \fi
-   %
-   \ifsetcontentsaftertitlepage
-     \contents
-     \global\let\contents = \relax
-     \global\let\shortcontents = \relax
-   \fi
+    \iffinishedtitlepage\else
+	\finishtitlepage
+    \fi
+    % It is important to do the page break before ending the group,
+    % because the headline and footline are only empty inside the group.
+    % If we use the new definition of \page, we always get a blank page
+    % after the title page, which we certainly don't want.
+    \oldpage
+  \endgroup
+  %
+  % Need this before the \...aftertitlepage checks so that if they are
+  % in effect the toc pages will come out with page numbers.
+  \HEADINGSon
+  %
+  % If they want short, they certainly want long too.
+  \ifsetshortcontentsaftertitlepage
+    \shortcontents
+    \contents
+    \global\let\shortcontents = \relax
+    \global\let\contents = \relax
+  \fi
+  %
+  \ifsetcontentsaftertitlepage
+    \contents
+    \global\let\contents = \relax
+    \global\let\shortcontents = \relax
+  \fi
 }
 
 \def\finishtitlepage{%
-   \vskip4pt \hrule height 2pt width \hsize
-   \vskip\titlepagebottomglue
-   \finishedtitlepagetrue
-}
+  \vskip4pt \hrule height 2pt width \hsize
+  \vskip\titlepagebottomglue
+  \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+		\let\tt=\authortt}
+
+\parseargdef\title{%
+  \checkenv\titlepage
+  \leftline{\titlefonts\rm #1}
+  % print a rule at the page bottom also.
+  \finishedtitlepagefalse
+  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+  \checkenv\titlepage
+  {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+  \def\temp{\quotation}%
+  \ifx\thisenv\temp
+    \def\quotationauthor{#1}% printed in \Equotation.
+  \else
+    \checkenv\titlepage
+    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+    {\authorfont \leftline{#1}}%
+  \fi
+}
+
 
 %%% Set up page headings and footings.
 
@@ -1674,7 +2257,7 @@
 \newtoks\evenfootline    % footline on even pages
 \newtoks\oddfootline     % footline on odd pages
 
-% Now make Tex use those variables
+% Now make TeX use those variables
 \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
                             \else \the\evenheadline \fi}}
 \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
@@ -1688,32 +2271,27 @@
 % @evenfooting @thisfile||
 % @oddfooting ||@thisfile
 
+
 \def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
 \def\oddheading{\parsearg\oddheadingxxx}
-\def\everyheading{\parsearg\everyheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
 
 \def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
 \def\oddfooting{\parsearg\oddfootingxxx}
-\def\everyfooting{\parsearg\everyfootingxxx}
-
-{\catcode`\@=0 %
-
-\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
-\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
-\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
-\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
-
-\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
-\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
-\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
   \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
   %
   % Leave some space for the footline.  Hopefully ok to assume
@@ -1722,9 +2300,8 @@
   \global\advance\vsize by -\baselineskip
 }
 
-\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
-%
-}% unbind the catcode of @.
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
 
 % @headings double      turns headings on for double-sided printing.
 % @headings single      turns headings on for single-sided printing.
@@ -1738,7 +2315,7 @@
 
 \def\headings #1 {\csname HEADINGS#1\endcsname}
 
-\def\HEADINGSoff{
+\def\HEADINGSoff{%
 \global\evenheadline={\hfil} \global\evenfootline={\hfil}
 \global\oddheadline={\hfil} \global\oddfootline={\hfil}}
 \HEADINGSoff
@@ -1747,7 +2324,7 @@
 % chapter name on inside top of right hand pages, document
 % title on inside top of left hand pages, and page numbers on outside top
 % edge of all pages.
-\def\HEADINGSdouble{
+\def\HEADINGSdouble{%
 \global\pageno=1
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
@@ -1759,7 +2336,7 @@
 
 % For single-sided printing, chapter title goes across top left of page,
 % page number on top right.
-\def\HEADINGSsingle{
+\def\HEADINGSsingle{%
 \global\pageno=1
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
@@ -1806,12 +2383,11 @@
 % @settitle line...  specifies the title of the document, for headings.
 % It generates no output of its own.
 \def\thistitle{\putwordNoTitle}
-\def\settitle{\parsearg\settitlezzz}
-\def\settitlezzz #1{\gdef\thistitle{#1}}
+\def\settitle{\parsearg{\gdef\thistitle}}
 
 
 \message{tables,}
-% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+% Tables -- @table, @ftable, @vtable, @item(x).
 
 % default indentation of table text
 \newdimen\tableindent \tableindent=.8in
@@ -1823,7 +2399,7 @@
 % used internally for \itemindent minus \itemmargin
 \newdimen\itemmax
 
-% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
 % these defs.
 % They also define \itemindex
 % to index the item name in whatever manner is desired (perhaps none).
@@ -1835,22 +2411,10 @@
 \def\internalBitem{\smallbreak \parsearg\itemzzz}
 \def\internalBitemx{\itemxpar \parsearg\itemzzz}
 
-\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
-\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
-
-\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
-\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
-
-\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
-                 \itemzzz {#1}}
-
-\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
-                 \itemzzz {#1}}
-
 \def\itemzzz #1{\begingroup %
   \advance\hsize by -\rightskip
   \advance\hsize by -\tableindent
-  \setbox0=\hbox{\itemfont{#1}}%
+  \setbox0=\hbox{\itemindicate{#1}}%
   \itemindex{#1}%
   \nobreak % This prevents a break before @itemx.
   %
@@ -1874,10 +2438,14 @@
     % \parskip glue -- logically it's part of the @item we just started.
     \nobreak \vskip-\parskip
     %
-    % Stop a page break at the \parskip glue coming up.  Unfortunately
-    % we can't prevent a possible page break at the following
-    % \baselineskip glue.
-    \nobreak
+    % Stop a page break at the \parskip glue coming up.  However, if
+    % what follows is an environment such as @example, there will be no
+    % \parskip glue; then the negative vskip we just inserted would
+    % cause the example and the item to crash together.  So we use this
+    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+    % \parskip glue after all.  Section titles are handled this way also.
+    % 
+    \penalty 10001
     \endgroup
     \itemxneedsnegativevskipfalse
   \else
@@ -1896,97 +2464,106 @@
   \fi
 }
 
-\def\item{\errmessage{@item while not in a table}}
-\def\itemx{\errmessage{@itemx while not in a table}}
-\def\kitem{\errmessage{@kitem while not in a table}}
-\def\kitemx{\errmessage{@kitemx while not in a table}}
-\def\xitem{\errmessage{@xitem while not in a table}}
-\def\xitemx{\errmessage{@xitemx while not in a table}}
-
-% Contains a kludge to get @end[description] to work.
-\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
 
 % @table, @ftable, @vtable.
-\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
-{\obeylines\obeyspaces%
-\gdef\tablex #1^^M{%
-\tabley\dontindex#1        \endtabley}}
-
-\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
-{\obeylines\obeyspaces%
-\gdef\ftablex #1^^M{%
-\tabley\fnitemindex#1        \endtabley
-\def\Eftable{\endgraf\afterenvbreak\endgroup}%
-\let\Etable=\relax}}
-
-\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
-{\obeylines\obeyspaces%
-\gdef\vtablex #1^^M{%
-\tabley\vritemindex#1        \endtabley
-\def\Evtable{\endgraf\afterenvbreak\endgroup}%
-\let\Etable=\relax}}
-
-\def\dontindex #1{}
-\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
-\def\vritemindex #1{\doind {vr}{\code{#1}}}%
-
-{\obeyspaces %
-\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
-\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
-
-\def\tablez #1#2#3#4#5#6{%
-\aboveenvbreak %
-\begingroup %
-\def\Edescription{\Etable}% Necessary kludge.
-\let\itemindex=#1%
-\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
-\ifnum 0#4>0 \tableindent=#4\mil \fi %
-\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
-\def\itemfont{#2}%
-\itemmax=\tableindent %
-\advance \itemmax by -\itemmargin %
-\advance \leftskip by \tableindent %
-\exdentamount=\tableindent
-\parindent = 0pt
-\parskip = \smallskipamount
-\ifdim \parskip=0pt \parskip=2pt \fi%
-\def\Etable{\endgraf\afterenvbreak\endgroup}%
-\let\item = \internalBitem %
-\let\itemx = \internalBitemx %
-\let\kitem = \internalBkitem %
-\let\kitemx = \internalBkitemx %
-\let\xitem = \internalBxitem %
-\let\xitemx = \internalBxitemx %
-}
+\envdef\table{%
+  \let\itemindex\gobble
+  \tablecheck{table}%
+}
+\envdef\ftable{%
+  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+  \tablecheck{ftable}%
+}
+\envdef\vtable{%
+  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+  \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+  \ifnum \the\catcode`\^^M=\active
+    \endgroup
+    \errmessage{This command won't work in this context; perhaps the problem is
+      that we are \inenvironment\thisenv}%
+    \def\next{\doignore{#1}}%
+  \else
+    \let\next\tablex
+  \fi
+  \next
+}
+\def\tablex#1{%
+  \def\itemindicate{#1}%
+  \parsearg\tabley
+}
+\def\tabley#1{%
+  {%
+    \makevalueexpandable
+    \edef\temp{\noexpand\tablez #1\space\space\space}%
+    \expandafter
+  }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+  \aboveenvbreak
+  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+  \ifnum 0#2>0 \tableindent=#2\mil \fi
+  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+  \itemmax=\tableindent
+  \advance \itemmax by -\itemmargin
+  \advance \leftskip by \tableindent
+  \exdentamount=\tableindent
+  \parindent = 0pt
+  \parskip = \smallskipamount
+  \ifdim \parskip=0pt \parskip=2pt \fi
+  \let\item = \internalBitem
+  \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
 
 % This is the counter used by @enumerate, which is really @itemize
 
 \newcount \itemno
 
-\def\itemize{\parsearg\itemizezzz}
-
-\def\itemizezzz #1{%
-  \begingroup % ended by the @end itemize
-  \itemizey {#1}{\Eitemize}
-}
-
-\def\itemizey #1#2{%
-\aboveenvbreak %
-\itemmax=\itemindent %
-\advance \itemmax by -\itemmargin %
-\advance \leftskip by \itemindent %
-\exdentamount=\itemindent
-\parindent = 0pt %
-\parskip = \smallskipamount %
-\ifdim \parskip=0pt \parskip=2pt \fi%
-\def#2{\endgraf\afterenvbreak\endgroup}%
-\def\itemcontents{#1}%
-\let\item=\itemizeitem}
-
-% Set sfcode to normal for the chars that usually have another value.
-% These are `.?!:;,'
-\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000
-  \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+  \aboveenvbreak
+  \itemmax=\itemindent
+  \advance\itemmax by -\itemmargin
+  \advance\leftskip by \itemindent
+  \exdentamount=\itemindent
+  \parindent=0pt
+  \parskip=\smallskipamount
+  \ifdim\parskip=0pt \parskip=2pt \fi
+  \def\itemcontents{#1}%
+  % @itemize with no arg is equivalent to @itemize @bullet.
+  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+  \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+  \advance\itemno by 1  % for enumerations
+  {\let\par=\endgraf \smallbreak}% reasonable place to break
+  {%
+   % If the document has an @itemize directly after a section title, a
+   % \nobreak will be last on the list, and \sectionheading will have
+   % done a \vskip-\parskip.  In that case, we don't want to zero
+   % parskip, or the item text will crash with the heading.  On the
+   % other hand, when there is normal text preceding the item (as there
+   % usually is), we do want to zero parskip, or there would be too much
+   % space.  In that case, we won't have a \nobreak before.  At least
+   % that's the theory.
+   \ifnum\lastpenalty<10000 \parskip=0in \fi
+   \noindent
+   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+   \vadjust{\penalty 1200}}% not good to break after first line of item.
+  \flushcr
+}
 
 % \splitoff TOKENS\endmark defines \first to be the first token in
 % TOKENS, and \rest to be the remainder.
@@ -1997,11 +2574,8 @@
 % or number, to specify the first label in the enumerated list.  No
 % argument is the same as `1'.
 %
-\def\enumerate{\parsearg\enumeratezzz}
-\def\enumeratezzz #1{\enumeratey #1  \endenumeratey}
+\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
 \def\enumeratey #1 #2\endenumeratey{%
-  \begingroup % ended by the @end enumerate
-  %
   % If we were given no argument, pretend we were given `1'.
   \def\thearg{#1}%
   \ifx\thearg\empty \def\thearg{1}\fi
@@ -2072,13 +2646,13 @@
   }%
 }
 
-% Call itemizey, adding a period to the first argument and supplying the
+% Call \doitemize, adding a period to the first argument and supplying the
 % common last two arguments.  Also subtract one from the initial value in
 % \itemno, since @item increments \itemno.
 %
 \def\startenumeration#1{%
   \advance\itemno by -1
-  \itemizey{#1.}\Eenumerate\flushcr
+  \doitemize{#1.}\flushcr
 }
 
 % @alphaenumerate and @capsenumerate are abbreviations for giving an arg
@@ -2089,16 +2663,6 @@
 \def\Ealphaenumerate{\Eenumerate}
 \def\Ecapsenumerate{\Eenumerate}
 
-% Definition of @item while inside @itemize.
-
-\def\itemizeitem{%
-\advance\itemno by 1
-{\let\par=\endgraf \smallbreak}%
-\ifhmode \errmessage{In hmode at itemizeitem}\fi
-{\parskip=0in \hskip 0pt
-\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
-\vadjust{\penalty 1200}}%
-\flushcr}
 
 % @multitable macros
 % Amy Hendrickson, 8/18/94, 3/6/96
@@ -2125,24 +2689,14 @@
 %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
 %   @item ...
 %   using the widest term desired in each column.
-%
-% For those who want to use more than one line's worth of words in
-% the preamble, break the line within one argument and it
-% will parse correctly, i.e.,
-%
-%     @multitable {Column 1 template} {Column 2 template} {Column 3
-%      template}
-% Not:
-%     @multitable {Column 1 template} {Column 2 template}
-%      {Column 3 template}
 
 % Each new table line starts with @item, each subsequent new column
 % starts with @tab. Empty columns may be produced by supplying @tab's
 % with nothing between them for as many times as empty columns are needed,
 % ie, @tab@tab@tab will produce two empty columns.
 
-% @item, @tab, @multitable or @end multitable do not need to be on their
-% own lines, but it will not hurt if they are.
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
 
 % Sample multitable:
 
@@ -2186,13 +2740,12 @@
 \def\xcolumnfractions{\columnfractions}
 \newif\ifsetpercent
 
-% #1 is the part of the @columnfraction before the decimal point, which
-% is presumably either 0 or the empty string (but we don't check, we
-% just throw it away).  #2 is the decimal part, which we use as the
-% percent of \hsize for this column.
-\def\pickupwholefraction#1.#2 {%
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1.  We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
   \global\advance\colcount by 1
-  \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
+  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
   \setuptable
 }
 
@@ -2209,8 +2762,8 @@
          \let\go\pickupwholefraction
       \else
          \global\advance\colcount by 1
-         \setbox0=\hbox{#1\unskip }% Add a normal word space as a separator;
-                            % typically that is always in the input, anyway.
+         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+                   % separator; typically that is always in the input, anyway.
          \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
       \fi
     \fi
@@ -2225,18 +2778,33 @@
   \go
 }
 
-% This used to have \hskip1sp.  But then the space in a template line is
-% not enough.  That is bad.  So let's go back to just & until we
-% encounter the problem it was intended to solve again.
-% --karl, nathan@acm.org, 20apr99.
-\def\tab{&}
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry.  Note that \everycr resets \everytab.
+\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
+%
+% A \tab used to include \hskip1sp.  But then the space in a template
+% line is not enough.  That is bad.  So let's go back to just `&' until
+% we encounter the problem it was intended to solve again.
+%					--karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
 
 % @multitable ... @end multitable definitions:
 %
-\def\multitable{\parsearg\dotable}
-\def\dotable#1{\bgroup
+\newtoks\everytab  % insert after every tab.
+%
+\envdef\multitable{%
   \vskip\parskip
-  \let\item\crcr
+  \startsavinginserts
+  %
+  % @item within a multitable starts a normal row.
+  % We use \def instead of \let so that if one of the multitable entries
+  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+  % \endtemplate) expanding \doitemize.
+  \def\item{\crcr}%
+  %
   \tolerance=9500
   \hbadness=9500
   \setmultitablespacing
@@ -2244,81 +2812,93 @@
   \parindent=\multitableparindent
   \overfullrule=0pt
   \global\colcount=0
-  \def\Emultitable{\global\setpercentfalse\cr\egroup\egroup}%
-  %
+  %
+  \everycr = {%
+    \noalign{%
+      \global\everytab={}%
+      \global\colcount=0 % Reset the column counter.
+      % Check for saved footnotes, etc.
+      \checkinserts
+      % Keeps underfull box messages off when table breaks over pages.
+      %\filbreak
+	% Maybe so, but it also creates really weird page breaks when the
+	% table breaks over pages. Wouldn't \vfil be better?  Wait until the
+	% problem manifests itself, so it can be fixed for real --karl.
+    }%
+  }%
+  %
+  \parsearg\domultitable
+}
+\def\domultitable#1{%
   % To parse everything between @multitable and @item:
   \setuptable#1 \endsetuptable
   %
-  % \everycr will reset column counter, \colcount, at the end of
-  % each line. Every column entry will cause \colcount to advance by one.
-  % The table preamble
-  % looks at the current \colcount to find the correct column width.
-  \everycr{\noalign{%
-  %
-  % \filbreak%% keeps underfull box messages off when table breaks over pages.
-  % Maybe so, but it also creates really weird page breaks when the table
-  % breaks over pages. Wouldn't \vfil be better?  Wait until the problem
-  % manifests itself, so it can be fixed for real --karl.
-    \global\colcount=0\relax}}%
-  %
   % This preamble sets up a generic column definition, which will
   % be used as many times as user calls for columns.
   % \vtop will set a single line and will also let text wrap and
   % continue for many paragraphs if desired.
-  \halign\bgroup&\global\advance\colcount by 1\relax
-    \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
-  %
-  % In order to keep entries from bumping into each other
-  % we will add a \leftskip of \multitablecolspace to all columns after
-  % the first one.
-  %
-  % If a template has been used, we will add \multitablecolspace
-  % to the width of each template entry.
-  %
-  % If the user has set preamble in terms of percent of \hsize we will
-  % use that dimension as the width of the column, and the \leftskip
-  % will keep entries from bumping into each other.  Table will start at
-  % left margin and final column will justify at right margin.
-  %
-  % Make sure we don't inherit \rightskip from the outer environment.
-  \rightskip=0pt
-  \ifnum\colcount=1
-    % The first column will be indented with the surrounding text.
-    \advance\hsize by\leftskip
-  \else
-    \ifsetpercent \else
-      % If user has not set preamble in terms of percent of \hsize
-      % we will advance \hsize by \multitablecolspace.
-      \advance\hsize by \multitablecolspace
-    \fi
-   % In either case we will make \leftskip=\multitablecolspace:
-  \leftskip=\multitablecolspace
-  \fi
-  % Ignoring space at the beginning and end avoids an occasional spurious
-  % blank line, when TeX decides to break the line at the space before the
-  % box from the multistrut, so the strut ends up on a line by itself.
-  % For example:
-  % @multitable @columnfractions .11 .89
-  % @item @code{#}
-  % @tab Legal holiday which is valid in major parts of the whole country.
-  % Is automatically provided with highlighting sequences respectively marking
-  % characters.
-  \noindent\ignorespaces##\unskip\multistrut}\cr
-}
-
-\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
-% If so, do nothing. If not, give it an appropriate dimension based on
-% current baselineskip.
+  \halign\bgroup &%
+    \global\advance\colcount by 1
+    \multistrut
+    \vtop{%
+      % Use the current \colcount to find the correct column width:
+      \hsize=\expandafter\csname col\the\colcount\endcsname
+      %
+      % In order to keep entries from bumping into each other
+      % we will add a \leftskip of \multitablecolspace to all columns after
+      % the first one.
+      %
+      % If a template has been used, we will add \multitablecolspace
+      % to the width of each template entry.
+      %
+      % If the user has set preamble in terms of percent of \hsize we will
+      % use that dimension as the width of the column, and the \leftskip
+      % will keep entries from bumping into each other.  Table will start at
+      % left margin and final column will justify at right margin.
+      %
+      % Make sure we don't inherit \rightskip from the outer environment.
+      \rightskip=0pt
+      \ifnum\colcount=1
+	% The first column will be indented with the surrounding text.
+	\advance\hsize by\leftskip
+      \else
+	\ifsetpercent \else
+	  % If user has not set preamble in terms of percent of \hsize
+	  % we will advance \hsize by \multitablecolspace.
+	  \advance\hsize by \multitablecolspace
+	\fi
+       % In either case we will make \leftskip=\multitablecolspace:
+      \leftskip=\multitablecolspace
+      \fi
+      % Ignoring space at the beginning and end avoids an occasional spurious
+      % blank line, when TeX decides to break the line at the space before the
+      % box from the multistrut, so the strut ends up on a line by itself.
+      % For example:
+      % @multitable @columnfractions .11 .89
+      % @item @code{#}
+      % @tab Legal holiday which is valid in major parts of the whole country.
+      % Is automatically provided with highlighting sequences respectively
+      % marking characters.
+      \noindent\ignorespaces##\unskip\multistrut
+    }\cr
+}
+\def\Emultitable{%
+  \crcr
+  \egroup % end the \halign
+  \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+  \def\multistrut{\strut}% just use the standard line spacing
+  %
+  % Compute \multitablelinespace (if not defined by user) for use in
+  % \multitableparskip calculation.  We used define \multistrut based on
+  % this, but (ironically) that caused the spacing to be off.
+  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
 \ifdim\multitablelinespace=0pt
 \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
 \global\advance\multitablelinespace by-\ht0
-%% strut to put in table in case some entry doesn't have descenders,
-%% to keep lines equally spaced
-\let\multistrut = \strut
-\else
-%% FIXME: what is \box0 supposed to be?
-\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
-width0pt\relax} \fi
+\fi
 %% Test to see if parskip is larger than space between lines of
 %% table. If not, do nothing.
 %%        If so, set to same dimension as multitablelinespace.
@@ -2335,237 +2915,114 @@
 
 
 \message{conditionals,}
-% Prevent errors for section commands.
-% Used in @ignore and in failing conditionals.
-\def\ignoresections{%
-  \let\chapter=\relax
-  \let\unnumbered=\relax
-  \let\top=\relax
-  \let\unnumberedsec=\relax
-  \let\unnumberedsection=\relax
-  \let\unnumberedsubsec=\relax
-  \let\unnumberedsubsection=\relax
-  \let\unnumberedsubsubsec=\relax
-  \let\unnumberedsubsubsection=\relax
-  \let\section=\relax
-  \let\subsec=\relax
-  \let\subsubsec=\relax
-  \let\subsection=\relax
-  \let\subsubsection=\relax
-  \let\appendix=\relax
-  \let\appendixsec=\relax
-  \let\appendixsection=\relax
-  \let\appendixsubsec=\relax
-  \let\appendixsubsection=\relax
-  \let\appendixsubsubsec=\relax
-  \let\appendixsubsubsection=\relax
-  \let\contents=\relax
-  \let\smallbook=\relax
-  \let\titlepage=\relax
-}
-
-% Used in nested conditionals, where we have to parse the Texinfo source
-% and so want to turn off most commands, in case they are used
-% incorrectly.
-%
-\def\ignoremorecommands{%
-  \let\defcodeindex = \relax
-  \let\defcv = \relax
-  \let\deffn = \relax
-  \let\deffnx = \relax
-  \let\defindex = \relax
-  \let\defivar = \relax
-  \let\defmac = \relax
-  \let\defmethod = \relax
-  \let\defop = \relax
-  \let\defopt = \relax
-  \let\defspec = \relax
-  \let\deftp = \relax
-  \let\deftypefn = \relax
-  \let\deftypefun = \relax
-  \let\deftypeivar = \relax
-  \let\deftypeop = \relax
-  \let\deftypevar = \relax
-  \let\deftypevr = \relax
-  \let\defun = \relax
-  \let\defvar = \relax
-  \let\defvr = \relax
-  \let\ref = \relax
-  \let\xref = \relax
-  \let\printindex = \relax
-  \let\pxref = \relax
-  \let\settitle = \relax
-  \let\setchapternewpage = \relax
-  \let\setchapterstyle = \relax
-  \let\everyheading = \relax
-  \let\evenheading = \relax
-  \let\oddheading = \relax
-  \let\everyfooting = \relax
-  \let\evenfooting = \relax
-  \let\oddfooting = \relax
-  \let\headings = \relax
-  \let\include = \relax
-  \let\lowersections = \relax
-  \let\down = \relax
-  \let\raisesections = \relax
-  \let\up = \relax
-  \let\set = \relax
-  \let\clear = \relax
-  \let\item = \relax
-}
-
-% Ignore @ignore, @ifhtml, @ifinfo, @ifplaintext, @ifnottex, @html, @menu,
-% @direntry, and @documentdescription.
-%
-\def\ignore{\doignore{ignore}}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed.  They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested.  But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+  \expandafter\let\csname #1\endcsname = \relax
+  \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
 \def\ifhtml{\doignore{ifhtml}}
 \def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
 \def\ifplaintext{\doignore{ifplaintext}}
-\def\ifnottex{\doignore{ifnottex}}
-\def\html{\doignore{html}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
 \def\menu{\doignore{menu}}
-\def\direntry{\doignore{direntry}}
-\def\documentdescription{\doignore{documentdescription}}
-\def\documentdescriptionword{documentdescription}
-
-% @dircategory CATEGORY  -- specify a category of the dir file
-% which this file should belong to.  Ignore this in TeX.
-\let\dircategory = \comment
-
-% Ignore text until a line `@end #1'.
-%
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
 \def\doignore#1{\begingroup
-  % Don't complain about control sequences we have declared \outer.
-  \ignoresections
-  %
-  % Define a command to swallow text until we reach `@end #1'.
-  % This @ is a catcode 12 token (that is the normal catcode of @ in
-  % this texinfo.tex file).  We change the catcode of @ below to match.
-  \long\def\doignoretext##1@end #1{\enddoignore}%
+  % Scan in ``verbatim'' mode:
+  \obeylines
+  \catcode`\@ = \other
+  \catcode`\{ = \other
+  \catcode`\} = \other
   %
   % Make sure that spaces turn into tokens that match what \doignoretext wants.
-  \catcode32 = 10
-  %
-  % Ignore braces, too, so mismatched braces don't cause trouble.
-  \catcode`\{ = 9
-  \catcode`\} = 9
-  %
-  % We must not have @c interpreted as a control sequence.
-  \catcode`\@ = 12
-  %
-  \def\ignoreword{#1}%
-  \ifx\ignoreword\documentdescriptionword
-    % The c kludge breaks documentdescription, since
-    % `documentdescription' contains a `c'.  Means not everything will
-    % be ignored inside @documentdescription, but oh well...
-  \else
-    % Make the letter c a comment character so that the rest of the line
-    % will be ignored. This way, the document can have (for example)
-    %   @c @end ifinfo
-    % and the @end ifinfo will be properly ignored.
-    % (We've just changed @ to catcode 12.)
-    \catcode`\c = 14
+  \spaceisspace
+  %
+  % Count number of #1's that we've seen.
+  \doignorecount = 0
+  %
+  % Swallow text until we reach the matching `@end #1'.
+  \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+  \obeylines %
+  %
+  \gdef\dodoignore#1{%
+    % #1 contains the command name as a string, e.g., `ifinfo'.
+    %
+    % Define a command to find the next `@end #1'.
+    \long\def\doignoretext##1^^M@end #1{%
+      \doignoretextyyy##1^^M@#1\_STOP_}%
+    %
+    % And this command to find another #1 command, at the beginning of a
+    % line.  (Otherwise, we would consider a line `@c @ifset', for
+    % example, to count as an @ifset for nesting.)
+    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+    %
+    % And now expand that command.
+    \doignoretext ^^M%
+  }%
+}
+
+\def\doignoreyyy#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty			% Nothing found.
+    \let\next\doignoretextzzz
+  \else					% Found a nested condition, ...
+    \advance\doignorecount by 1
+    \let\next\doignoretextyyy		% ..., look for another.
+    % If we're here, #1 ends with ^^M\ifinfo (for example).
   \fi
-  %
-  % And now expand the command defined above.
-  \doignoretext
-}
-
-% What we do to finish off ignored text.
-%
-\def\enddoignore{\endgroup\ignorespaces}%
-
-\newif\ifwarnedobs\warnedobsfalse
-\def\obstexwarn{%
-  \ifwarnedobs\relax\else
-  % We need to warn folks that they may have trouble with TeX 3.0.
-  % This uses \immediate\write16 rather than \message to get newlines.
-    \immediate\write16{}
-    \immediate\write16{WARNING: for users of Unix TeX 3.0!}
-    \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
-    \immediate\write16{If you are running another version of TeX, relax.}
-    \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
-    \immediate\write16{  Then upgrade your TeX installation if you can.}
-    \immediate\write16{  (See ftp://ftp.gnu.org/pub/gnu/TeX.README.)}
-    \immediate\write16{If you are stuck with version 3.0, run the}
-    \immediate\write16{  script ``tex3patch'' from the Texinfo distribution}
-    \immediate\write16{  to use a workaround.}
-    \immediate\write16{}
-    \global\warnedobstrue
-    \fi
-}
-
-% **In TeX 3.0, setting text in \nullfont hangs tex.  For a
-% workaround (which requires the file ``dummy.tfm'' to be installed),
-% uncomment the following line:
-%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
-
-% Ignore text, except that we keep track of conditional commands for
-% purposes of nesting, up to an `@end #1' command.
-%
-\def\nestedignore#1{%
-  \obstexwarn
-  % We must actually expand the ignored text to look for the @end
-  % command, so that nested ignore constructs work.  Thus, we put the
-  % text into a \vbox and then do nothing with the result.  To minimize
-  % the change of memory overflow, we follow the approach outlined on
-  % page 401 of the TeXbook: make the current font be a dummy font.
-  %
-  \setbox0 = \vbox\bgroup
-    % Don't complain about control sequences we have declared \outer.
-    \ignoresections
-    %
-    % Define `@end #1' to end the box, which will in turn undefine the
-    % @end command again.
-    \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
-    %
-    % We are going to be parsing Texinfo commands.  Most cause no
-    % trouble when they are used incorrectly, but some commands do
-    % complicated argument parsing or otherwise get confused, so we
-    % undefine them.
-    %
-    % We can't do anything about stray @-signs, unfortunately;
-    % they'll produce `undefined control sequence' errors.
-    \ignoremorecommands
-    %
-    % Set the current font to be \nullfont, a TeX primitive, and define
-    % all the font commands to also use \nullfont.  We don't use
-    % dummy.tfm, as suggested in the TeXbook, because not all sites
-    % might have that installed.  Therefore, math mode will still
-    % produce output, but that should be an extremely small amount of
-    % stuff compared to the main input.
-    %
-    \nullfont
-    \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont
-    \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont
-    \let\tensf=\nullfont
-    % Similarly for index fonts.
-    \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont
-    \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont
-    \let\smallsf=\nullfont
-    % Similarly for smallexample fonts.
-    \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont
-    \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont
-    \let\smallersf=\nullfont
-    %
-    % Don't complain when characters are missing from the fonts.
-    \tracinglostchars = 0
-    %
-    % Don't bother to do space factor calculations.
-    \frenchspacing
-    %
-    % Don't report underfull hboxes.
-    \hbadness = 10000
-    %
-    % Do minimal line-breaking.
-    \pretolerance = 10000
-    %
-    % Do not execute instructions in @tex
-    \def\tex{\doignore{tex}}%
-    % Do not execute macro definitions.
-    % `c' is a comment character, so the word `macro' will get cut off.
-    \def\macro{\doignore{ma}}%
-}
+  \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+  \ifnum\doignorecount = 0	% We have just found the outermost @end.
+    \let\next\enddoignore
+  \else				% Still inside a nested condition.
+    \advance\doignorecount by -1
+    \let\next\doignoretext      % Look for the next @end.
+  \fi
+  \next
+}
+
+% Finish off ignored text.
+{ \obeylines%
+  % Ignore anything after the last `@end #1'; this matters in verbatim
+  % environments, where otherwise the newline after an ignored conditional
+  % would result in a blank line in the output.
+  \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
+}
+
 
 % @set VAR sets the variable VAR to an empty value.
 % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
@@ -2573,56 +3030,63 @@
 % Since we want to separate VAR from REST-OF-LINE (which might be
 % empty), we can't just use \parsearg; we have to insert a space of our
 % own to delimit the rest of the line, and then take it out again if we
-% didn't need it.  Make sure the catcode of space is correct to avoid
-% losing inside @example, for instance.
-%
-\def\set{\begingroup\catcode` =10
-  \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
-  \parsearg\setxxx}
-\def\setxxx#1{\setyyy#1 \endsetyyy}
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
 \def\setyyy#1 #2\endsetyyy{%
-  \def\temp{#2}%
-  \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
-  \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
-  \fi
-  \endgroup
-}
-% Can't use \xdef to pre-expand #2 and save some time, since \temp or
-% \next or other control sequences that we've defined might get us into
-% an infinite loop. Consider `@set foo @cite{bar}'.
-\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
+  {%
+    \makevalueexpandable
+    \def\temp{#2}%
+    \edef\next{\gdef\makecsname{SET#1}}%
+    \ifx\temp\empty
+      \next{}%
+    \else
+      \setzzz#2\endsetzzz
+    \fi
+  }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
 
 % @clear VAR clears (i.e., unsets) the variable VAR.
 %
-\def\clear{\parsearg\clearxxx}
-\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
+\parseargdef\clear{%
+  {%
+    \makevalueexpandable
+    \global\expandafter\let\csname SET#1\endcsname=\relax
+  }%
+}
 
 % @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
 {
-  \catcode`\_ = \active
-  %
-  % We might end up with active _ or - characters in the argument if
-  % we're called from @code, as @code{@value{foo-bar_}}.  So \let any
-  % such active characters to their normal equivalents.
-  \gdef\value{\begingroup
-    \catcode`\-=12 \catcode`\_=12
-    \indexbreaks \let_\normalunderscore
-    \valuexxx}
-}
-\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+  \catcode`\- = \active \catcode`\_ = \active
+  %
+  \gdef\makevalueexpandable{%
+    \let\value = \expandablevalue
+    % We don't want these characters active, ...
+    \catcode`\-=\other \catcode`\_=\other
+    % ..., but we might end up with active ones in the argument if
+    % we're called from @code, as @code{@value{foo-bar_}}, though.
+    % So \let them to their normal equivalents.
+    \let-\realdash \let_\normalunderscore
+  }
+}
 
 % We have this subroutine so that we can handle at least some @value's
-% properly in indexes (we \let\value to this in \indexdummies).  Ones
-% whose names contain - or _ still won't work, but we can't do anything
-% about that.  The command has to be fully expandable, since the result
-% winds up in the index file.  This means that if the variable's value
-% contains other Texinfo commands, it's almost certain it will fail
-% (although perhaps we could fix that with sufficient work to do a
-% one-level expansion on the result, instead of complete).
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file.  This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
 %
 \def\expandablevalue#1{%
   \expandafter\ifx\csname SET#1\endcsname\relax
     {[No value for ``#1'']}%
+    \message{Variable `#1', used in @value, is not set.}%
   \else
     \csname SET#1\endcsname
   \fi
@@ -2631,68 +3095,36 @@
 % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
 % with @set.
 %
-\def\ifset{\parsearg\ifsetxxx}
-\def\ifsetxxx #1{%
-  \expandafter\ifx\csname SET#1\endcsname\relax
-    \expandafter\ifsetfail
-  \else
-    \expandafter\ifsetsucceed
-  \fi
-}
-\def\ifsetsucceed{\conditionalsucceed{ifset}}
-\def\ifsetfail{\nestedignore{ifset}}
-\defineunmatchedend{ifset}
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+  {%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname SET#2\endcsname\relax
+      #1% If not set, redefine \next.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifsetfail{\doignore{ifset}}
 
 % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
 % defined with @set, or has been undefined with @clear.
 %
-\def\ifclear{\parsearg\ifclearxxx}
-\def\ifclearxxx #1{%
-  \expandafter\ifx\csname SET#1\endcsname\relax
-    \expandafter\ifclearsucceed
-  \else
-    \expandafter\ifclearfail
-  \fi
-}
-\def\ifclearsucceed{\conditionalsucceed{ifclear}}
-\def\ifclearfail{\nestedignore{ifclear}}
-\defineunmatchedend{ifclear}
-
-% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we
-% read the text following, through the first @end iftex (etc.).  Make
-% `@end iftex' (etc.) valid only after an @iftex.
-%
-\def\iftex{\conditionalsucceed{iftex}}
-\def\ifnothtml{\conditionalsucceed{ifnothtml}}
-\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
-\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}}
-\defineunmatchedend{iftex}
-\defineunmatchedend{ifnothtml}
-\defineunmatchedend{ifnotinfo}
-\defineunmatchedend{ifnotplaintext}
-
-% We can't just want to start a group at @iftex (etc.) and end it at
-% @end iftex, since then @set commands inside the conditional have no
-% effect (they'd get reverted at the end of the group).  So we must
-% define \Eiftex to redefine itself to be its previous value.  (We can't
-% just define it to fail again with an ``unmatched end'' error, since
-% the @ifset might be nested.)
-%
-\def\conditionalsucceed#1{%
-  \edef\temp{%
-    % Remember the current value of \E#1.
-    \let\nece{prevE#1} = \nece{E#1}%
-    %
-    % At the `@end #1', redefine \E#1 to be its previous value.
-    \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}%
-  }%
-  \temp
-}
-
-% We need to expand lots of \csname's, but we don't want to expand the
-% control sequences after we've constructed them.
-%
-\def\nece#1{\expandafter\noexpand\csname#1\endcsname}
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY  -- specify a category of the dir file
+% which this file should belong to.  Ignore this in TeX.
+\let\dircategory=\comment
 
 % @defininfoenclose.
 \let\definfoenclose=\comment
@@ -2702,9 +3134,8 @@
 % Index generation facilities
 
 % Define \newwrite to be identical to plain tex's \newwrite
-% except not \outer, so it can be used within \newindex.
-{\catcode`\@=11
-\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
 
 % \newindex {foo} defines an index named foo.
 % It automatically defines \fooindex such that
@@ -2785,285 +3216,393 @@
 \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
 \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
 
-% Take care of texinfo commands likely to appear in an index entry.
-% (Must be a way to avoid doing expansion at all, and thus not have to
-% laboriously list every single command here.)
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
 %
 \def\indexdummies{%
-\def\ { }%
-\def\@{@}% change to @@ when we switch to @ as escape char in aux files.
-% Need these in case \tex is in effect and \{ is a \delimiter again.
-% But can't use \lbracecmd and \rbracecmd because texindex assumes
-% braces and backslashes are used only as delimiters.
-\let\{ = \mylbrace
-\let\} = \myrbrace
-\def\_{{\realbackslash _}}%
-\normalturnoffactive
-%
-% Take care of the plain tex accent commands.
-\def\,##1{\realbackslash ,{##1}}%
-\def\"{\realbackslash "}%
-\def\`{\realbackslash `}%
-\def\'{\realbackslash '}%
-\def\^{\realbackslash ^}%
-\def\~{\realbackslash ~}%
-\def\={\realbackslash =}%
-\def\b{\realbackslash b}%
-\def\c{\realbackslash c}%
-\def\d{\realbackslash d}%
-\def\u{\realbackslash u}%
-\def\v{\realbackslash v}%
-\def\H{\realbackslash H}%
-\def\dotless##1{\realbackslash dotless {##1}}%
-% Take care of the plain tex special European modified letters.
-\def\AA{\realbackslash AA}%
-\def\AE{\realbackslash AE}%
-\def\L{\realbackslash L}%
-\def\OE{\realbackslash OE}%
-\def\O{\realbackslash O}%
-\def\aa{\realbackslash aa}%
-\def\ae{\realbackslash ae}%
-\def\l{\realbackslash l}%
-\def\oe{\realbackslash oe}%
-\def\o{\realbackslash o}%
-\def\ss{\realbackslash ss}%
-%
-% Although these internals commands shouldn't show up, sometimes they do.
-\def\bf{\realbackslash bf }%
-\def\gtr{\realbackslash gtr}%
-\def\hat{\realbackslash hat}%
-\def\less{\realbackslash less}%
-%\def\rm{\realbackslash rm }%
-\def\sf{\realbackslash sf}%
-\def\sl{\realbackslash sl }%
-\def\tclose##1{\realbackslash tclose {##1}}%
-\def\tt{\realbackslash tt}%
-%
-\def\b##1{\realbackslash b {##1}}%
-\def\i##1{\realbackslash i {##1}}%
-\def\sc##1{\realbackslash sc {##1}}%
-\def\t##1{\realbackslash t {##1}}%
-\def\r##1{\realbackslash r {##1}}%
-%
-\def\TeX{\realbackslash TeX}%
-\def\LaTeX{\realbackslash LaTeX}%
-\def\acronym##1{\realbackslash acronym {##1}}%
-\def\cite##1{\realbackslash cite {##1}}%
-\def\code##1{\realbackslash code {##1}}%
-\def\command##1{\realbackslash command {##1}}%
-\def\dfn##1{\realbackslash dfn {##1}}%
-\def\dots{\realbackslash dots }%
-\def\emph##1{\realbackslash emph {##1}}%
-\def\env##1{\realbackslash env {##1}}%
-\def\file##1{\realbackslash file {##1}}%
-\def\kbd##1{\realbackslash kbd {##1}}%
-\def\key##1{\realbackslash key {##1}}%
-\def\math##1{\realbackslash math {##1}}%
-\def\option##1{\realbackslash option {##1}}%
-\def\samp##1{\realbackslash samp {##1}}%
-\def\strong##1{\realbackslash strong {##1}}%
-\def\uref##1{\realbackslash uref {##1}}%
-\def\url##1{\realbackslash url {##1}}%
-\def\var##1{\realbackslash var {##1}}%
-\def\w{\realbackslash w }%
-%
-% These math commands don't seem likely to be used in index entries.
-\def\copyright{\realbackslash copyright}%
-\def\equiv{\realbackslash equiv}%
-\def\error{\realbackslash error}%
-\def\expansion{\realbackslash expansion}%
-\def\point{\realbackslash point}%
-\def\print{\realbackslash print}%
-\def\result{\realbackslash result}%
-%
-% Handle some cases of @value -- where the variable name does not
-% contain - or _, and the value does not contain any
-% (non-fully-expandable) commands.
-\let\value = \expandablevalue
-%
-\unsepspaces
-% Turn off macro expansion
-\turnoffmacros
-}
-
-% If an index command is used in an @example environment, any spaces
-% therein should become regular spaces in the raw index file, not the
-% expansion of \tie (\leavevmode \penalty \@M \ ).
-{\obeyspaces
- \gdef\unsepspaces{\obeyspaces\let =\space}}
-
-% \indexnofonts no-ops all font-change commands.
-% This is used when outputting the strings to sort the index by.
-\def\indexdummyfont#1{#1}
-\def\indexdummytex{TeX}
-\def\indexdummydots{...}
-
+  \escapechar = `\\     % use backslash in output files.
+  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+  \def\ {\realbackslash\space }%
+  % Need these in case \tex is in effect and \{ is a \delimiter again.
+  % But can't use \lbracecmd and \rbracecmd because texindex assumes
+  % braces and backslashes are used only as delimiters.
+  \let\{ = \mylbrace
+  \let\} = \myrbrace
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% For the aux and toc files, @ is the escape character.  So we want to
+% redefine everything using @ as the escape character (instead of
+% \realbackslash, still used for index files).  When everything uses @,
+% this will be simpler.
+%
+\def\atdummies{%
+  \def\@{@@}%
+  \def\ {@ }%
+  \let\{ = \lbraceatcmd
+  \let\} = \rbraceatcmd
+  %
+  % Do the redefinitions.
+  \commondummies
+  \otherbackslash
+}
+
+% Called from \indexdummies and \atdummies.
+%
+\def\commondummies{%
+  %
+  % \definedummyword defines \#1 as \string\#1\space, thus effectively
+  % preventing its expansion.  This is used only for control% words,
+  % not control letters, because the \space would be incorrect for
+  % control characters, but is needed to separate the control word
+  % from whatever follows.
+  %
+  % For control letters, we have \definedummyletter, which omits the
+  % space.
+  %
+  % These can be used both for control words that take an argument and
+  % those that do not.  If it is followed by {arg} in the input, then
+  % that will dutifully get written to the index (or wherever).
+  %
+  \def\definedummyword  ##1{\def##1{\string##1\space}}%
+  \def\definedummyletter##1{\def##1{\string##1}}%
+  \let\definedummyaccent\definedummyletter
+  %
+  \commondummiesnofonts
+  %
+  \definedummyletter\_%
+  %
+  % Non-English letters.
+  \definedummyword\AA
+  \definedummyword\AE
+  \definedummyword\L
+  \definedummyword\OE
+  \definedummyword\O
+  \definedummyword\aa
+  \definedummyword\ae
+  \definedummyword\l
+  \definedummyword\oe
+  \definedummyword\o
+  \definedummyword\ss
+  \definedummyword\exclamdown
+  \definedummyword\questiondown
+  \definedummyword\ordf
+  \definedummyword\ordm
+  %
+  % Although these internal commands shouldn't show up, sometimes they do.
+  \definedummyword\bf
+  \definedummyword\gtr
+  \definedummyword\hat
+  \definedummyword\less
+  \definedummyword\sf
+  \definedummyword\sl
+  \definedummyword\tclose
+  \definedummyword\tt
+  %
+  \definedummyword\LaTeX
+  \definedummyword\TeX
+  %
+  % Assorted special characters.
+  \definedummyword\bullet
+  \definedummyword\comma
+  \definedummyword\copyright
+  \definedummyword\registeredsymbol
+  \definedummyword\dots
+  \definedummyword\enddots
+  \definedummyword\equiv
+  \definedummyword\error
+  \definedummyword\euro
+  \definedummyword\expansion
+  \definedummyword\minus
+  \definedummyword\pounds
+  \definedummyword\point
+  \definedummyword\print
+  \definedummyword\result
+  %
+  % We want to disable all macros so that they are not expanded by \write.
+  \macrolist
+  %
+  \normalturnoffactive
+  %
+  % Handle some cases of @value -- where it does not contain any
+  % (non-fully-expandable) commands.
+  \makevalueexpandable
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+\def\commondummiesnofonts{%
+  % Control letters and accents.
+  \definedummyletter\!%
+  \definedummyaccent\"%
+  \definedummyaccent\'%
+  \definedummyletter\*%
+  \definedummyaccent\,%
+  \definedummyletter\.%
+  \definedummyletter\/%
+  \definedummyletter\:%
+  \definedummyaccent\=%
+  \definedummyletter\?%
+  \definedummyaccent\^%
+  \definedummyaccent\`%
+  \definedummyaccent\~%
+  \definedummyword\u
+  \definedummyword\v
+  \definedummyword\H
+  \definedummyword\dotaccent
+  \definedummyword\ringaccent
+  \definedummyword\tieaccent
+  \definedummyword\ubaraccent
+  \definedummyword\udotaccent
+  \definedummyword\dotless
+  %
+  % Texinfo font commands.
+  \definedummyword\b
+  \definedummyword\i
+  \definedummyword\r
+  \definedummyword\sc
+  \definedummyword\t
+  %
+  % Commands that take arguments.
+  \definedummyword\acronym
+  \definedummyword\cite
+  \definedummyword\code
+  \definedummyword\command
+  \definedummyword\dfn
+  \definedummyword\emph
+  \definedummyword\env
+  \definedummyword\file
+  \definedummyword\kbd
+  \definedummyword\key
+  \definedummyword\math
+  \definedummyword\option
+  \definedummyword\pxref
+  \definedummyword\ref
+  \definedummyword\samp
+  \definedummyword\strong
+  \definedummyword\tie
+  \definedummyword\uref
+  \definedummyword\url
+  \definedummyword\var
+  \definedummyword\verb
+  \definedummyword\w
+  \definedummyword\xref
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names.  It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
 \def\indexnofonts{%
-\def\@{@}%
-% how to handle braces?
-\def\_{\normalunderscore}%
-%
-\let\,=\indexdummyfont
-\let\"=\indexdummyfont
-\let\`=\indexdummyfont
-\let\'=\indexdummyfont
-\let\^=\indexdummyfont
-\let\~=\indexdummyfont
-\let\==\indexdummyfont
-\let\b=\indexdummyfont
-\let\c=\indexdummyfont
-\let\d=\indexdummyfont
-\let\u=\indexdummyfont
-\let\v=\indexdummyfont
-\let\H=\indexdummyfont
-\let\dotless=\indexdummyfont
-% Take care of the plain tex special European modified letters.
-\def\AA{AA}%
-\def\AE{AE}%
-\def\L{L}%
-\def\OE{OE}%
-\def\O{O}%
-\def\aa{aa}%
-\def\ae{ae}%
-\def\l{l}%
-\def\oe{oe}%
-\def\o{o}%
-\def\ss{ss}%
-%
-% Don't no-op \tt, since it isn't a user-level command
-% and is used in the definitions of the active chars like <, >, |, etc.
-% Likewise with the other plain tex font commands.
-%\let\tt=\indexdummyfont
-%
-\let\b=\indexdummyfont
-\let\i=\indexdummyfont
-\let\r=\indexdummyfont
-\let\sc=\indexdummyfont
-\let\t=\indexdummyfont
-%
-\let\TeX=\indexdummytex
-\let\acronym=\indexdummyfont
-\let\cite=\indexdummyfont
-\let\code=\indexdummyfont
-\let\command=\indexdummyfont
-\let\dfn=\indexdummyfont
-\let\dots=\indexdummydots
-\let\emph=\indexdummyfont
-\let\env=\indexdummyfont
-\let\file=\indexdummyfont
-\let\kbd=\indexdummyfont
-\let\key=\indexdummyfont
-\let\math=\indexdummyfont
-\let\option=\indexdummyfont
-\let\samp=\indexdummyfont
-\let\strong=\indexdummyfont
-\let\uref=\indexdummyfont
-\let\url=\indexdummyfont
-\let\var=\indexdummyfont
-\let\w=\indexdummyfont
-}
-
-% To define \realbackslash, we must make \ not be an escape.
-% We must first make another character (@) an escape
-% so we do not become unable to do a definition.
-
-{\catcode`\@=0 \catcode`\\=\other
- @gdef@realbackslash{\}}
+  % Accent commands should become @asis.
+  \def\definedummyaccent##1{\let##1\asis}%
+  % We can just ignore other control letters.
+  \def\definedummyletter##1{\let##1\empty}%
+  % Hopefully, all control words can become @asis.
+  \let\definedummyword\definedummyaccent
+  %
+  \commondummiesnofonts
+  %
+  % Don't no-op \tt, since it isn't a user-level command
+  % and is used in the definitions of the active chars like <, >, |, etc.
+  % Likewise with the other plain tex font commands.
+  %\let\tt=\asis
+  %
+  \def\ { }%
+  \def\@{@}%
+  % how to handle braces?
+  \def\_{\normalunderscore}%
+  %
+  % Non-English letters.
+  \def\AA{AA}%
+  \def\AE{AE}%
+  \def\L{L}%
+  \def\OE{OE}%
+  \def\O{O}%
+  \def\aa{aa}%
+  \def\ae{ae}%
+  \def\l{l}%
+  \def\oe{oe}%
+  \def\o{o}%
+  \def\ss{ss}%
+  \def\exclamdown{!}%
+  \def\questiondown{?}%
+  \def\ordf{a}%
+  \def\ordm{o}%
+  %
+  \def\LaTeX{LaTeX}%
+  \def\TeX{TeX}%
+  %
+  % Assorted special characters.
+  % (The following {} will end up in the sort string, but that's ok.)
+  \def\bullet{bullet}%
+  \def\comma{,}%
+  \def\copyright{copyright}%
+  \def\registeredsymbol{R}%
+  \def\dots{...}%
+  \def\enddots{...}%
+  \def\equiv{==}%
+  \def\error{error}%
+  \def\euro{euro}%
+  \def\expansion{==>}%
+  \def\minus{-}%
+  \def\pounds{pounds}%
+  \def\point{.}%
+  \def\print{-|}%
+  \def\result{=>}%
+  %
+  % We need to get rid of all macros, leaving only the arguments (if present).
+  % Of course this is not nearly correct, but it is the best we can do for now.
+  % makeinfo does not expand macros in the argument to @deffn, which ends up
+  % writing an index entry, and texindex isn't prepared for an index sort entry
+  % that starts with \.
+  % 
+  % Since macro invocations are followed by braces, we can just redefine them
+  % to take a single TeX argument.  The case of a macro invocation that
+  % goes to end-of-line is not handled.
+  % 
+  \macrolist
+}
 
 \let\indexbackslash=0  %overridden during \printindex.
 \let\SETmarginindex=\relax % put index entries in margin (undocumented)?
 
-% For \ifx comparisons.
-\def\emptymacro{\empty}
-
 % Most index entries go through here, but \dosubind is the general case.
-%
-\def\doind#1#2{\dosubind{#1}{#2}\empty}
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
 
 % Workhorse for all \fooindexes.
 % #1 is name of index, #2 is stuff to put there, #3 is subentry --
-% \empty if called from \doind, as we usually are.  The main exception
-% is with defuns, which call us directly.
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
 %
 \def\dosubind#1#2#3{%
+  \iflinks
+  {%
+    % Store the main index entry text (including the third arg).
+    \toks0 = {#2}%
+    % If third arg is present, precede it with a space.
+    \def\thirdarg{#3}%
+    \ifx\thirdarg\empty \else
+      \toks0 = \expandafter{\the\toks0 \space #3}%
+    \fi
+    %
+    \edef\writeto{\csname#1indfile\endcsname}%
+    %
+    \ifvmode
+      \dosubindsanitize
+    \else
+      \dosubindwrite
+    \fi
+  }%
+  \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
   % Put the index entry in the margin if desired.
   \ifx\SETmarginindex\relax\else
-    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
   \fi
-  {%
-    \count255=\lastpenalty
-    {%
-      \indexdummies % Must do this here, since \bf, etc expand at this stage
-      \escapechar=`\\
-      {%
-        \let\folio = 0% We will expand all macros now EXCEPT \folio.
-        \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
-        % so it will be output as is; and it will print as backslash.
-        %
-        \def\thirdarg{#3}%
-        %
-        % If third arg is present, precede it with space in sort key.
-        \ifx\thirdarg\emptymacro
-          \let\subentry = \empty
-        \else
-          \def\subentry{ #3}%
-        \fi
-        %
-        % First process the index entry with all font commands turned
-        % off to get the string to sort by.
-        {\indexnofonts \xdef\indexsorttmp{#2\subentry}}%
-        %
-        % Now the real index entry with the fonts.
-        \toks0 = {#2}%
-        %
-        % If the third (subentry) arg is present, add it to the index
-        % line to write.
-        \ifx\thirdarg\emptymacro \else
-          \toks0 = \expandafter{\the\toks0{#3}}%
-        \fi
-        %
-        % Set up the complete index entry, with both the sort key and
-        % the original text, including any font commands.  We write
-        % three arguments to \entry to the .?? file (four in the
-        % subentry case), texindex reduces to two when writing the .??s
-        % sorted result.
-        \edef\temp{%
-          \write\csname#1indfile\endcsname{%
-            \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
-        }%
-        %
-        % If a skip is the last thing on the list now, preserve it
-        % by backing up by \lastskip, doing the \write, then inserting
-        % the skip again.  Otherwise, the whatsit generated by the
-        % \write will make \lastskip zero.  The result is that sequences
-        % like this:
-        % @end defun
-        % @tindex whatever
-        % @defun ...
-        % will have extra space inserted, because the \medbreak in the
-        % start of the @defun won't see the skip inserted by the @end of
-        % the previous defun.
-        %
-        % But don't do any of this if we're not in vertical mode.  We
-        % don't want to do a \vskip and prematurely end a paragraph.
-        %
-        % Avoid page breaks due to these extra skips, too.
-        %
-        \iflinks
-          \ifvmode
-            \skip0 = \lastskip
-            \ifdim\lastskip = 0pt \else \nobreak\vskip-\lastskip \fi
-          \fi
-          %
-          \temp % do the write
-          %
-          %
-          \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi
-        \fi
-      }%
-    }%
-    \penalty\count255
+  %
+  % Remember, we are within a group.
+  \indexdummies % Must do this here, since \bf, etc expand at this stage
+  \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+      % so it will be output as is; and it will print as backslash.
+  %
+  % Process the index entry with all font commands turned off, to
+  % get the string to sort by.
+  {\indexnofonts
+   \edef\temp{\the\toks0}% need full expansion
+   \xdef\indexsorttmp{\temp}%
+  }%
+  %
+  % Set up the complete index entry, with both the sort key and
+  % the original text, including any font commands.  We write
+  % three arguments to \entry to the .?? file (four in the
+  % subentry case), texindex reduces to two when writing the .??s
+  % sorted result.
+  \edef\temp{%
+    \write\writeto{%
+      \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
   }%
+  \temp
+}
+
+% Take care of unwanted page breaks:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again.  Otherwise, the whatsit generated by the
+% \write will make \lastskip zero.  The result is that sequences
+% like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode.  We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip.  \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip.  The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+% ..., ready, GO:
+%
+\def\dosubindsanitize{%
+  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+  \skip0 = \lastskip
+  \edef\lastskipmacro{\the\lastskip}%
+  \count255 = \lastpenalty
+  %
+  % If \lastskip is nonzero, that means the last item was a
+  % skip.  And since a skip is discardable, that means this
+  % -\skip0 glue we're inserting is preceded by a
+  % non-discardable item, therefore it is not a potential
+  % breakpoint, therefore no \nobreak needed.
+  \ifx\lastskipmacro\zeroskipmacro
+  \else
+    \vskip-\skip0
+  \fi
+  %
+  \dosubindwrite
+  %
+  \ifx\lastskipmacro\zeroskipmacro
+    % If \lastskip was zero, perhaps the last item was a penalty, and
+    % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
+    % to re-insert the same penalty (values >10000 are used for various
+    % signals); since we just inserted a non-discardable item, any
+    % following glue (such as a \parskip) would be a breakpoint.  For example:
+    % 
+    %   @deffn deffn-whatever
+    %   @vindex index-whatever
+    %   Description.
+    % would allow a break between the index-whatever whatsit
+    % and the "Description." paragraph.
+    \ifnum\count255>9999 \penalty\count255 \fi
+  \else
+    % On the other hand, if we had a nonzero \lastskip,
+    % this make-up glue would be preceded by a non-discardable item
+    % (the whatsit from the \write), so we must insert a \nobreak.
+    \nobreak\vskip\skip0
+  \fi
 }
 
 % The index entry written in the file actually looks like
@@ -3101,13 +3640,12 @@
 % @printindex causes a particular index (the ??s file) to get printed.
 % It does not print any chapter heading (usually an @unnumbered).
 %
-\def\printindex{\parsearg\doprintindex}
-\def\doprintindex#1{\begingroup
+\parseargdef\printindex{\begingroup
   \dobreak \chapheadingskip{10000}%
   %
   \smallfonts \rm
   \tolerance = 9500
-  \indexbreaks
+  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
   %
   % See if the index file exists and is nonempty.
   % Change catcode of @ here so that if the index file contains
@@ -3134,7 +3672,7 @@
       % Index files are almost Texinfo source, but we use \ as the escape
       % character.  It would be better to use @, but that's too big a change
       % to make right now.
-      \def\indexbackslash{\rawbackslashxx}%
+      \def\indexbackslash{\backslashcurfont}%
       \catcode`\\ = 0
       \escapechar = `\\
       \begindoublecolumns
@@ -3156,7 +3694,10 @@
   \removelastskip
   %
   % We like breaks before the index initials, so insert a bonus.
-  \penalty -300
+  \nobreak
+  \vskip 0pt plus 3\baselineskip
+  \penalty 0
+  \vskip 0pt plus -3\baselineskip
   %
   % Typeset the initial.  Making this add up to a whole number of
   % baselineskips increases the chance of the dots lining up from column
@@ -3166,80 +3707,100 @@
   % No shrink because it confuses \balancecolumns.
   \vskip 1.67\baselineskip plus .5\baselineskip
   \leftline{\secbf #1}%
-  \vskip .33\baselineskip plus .1\baselineskip
-  %
   % Do our best not to break after the initial.
   \nobreak
+  \vskip .33\baselineskip plus .1\baselineskip
 }}
 
-% This typesets a paragraph consisting of #1, dot leaders, and then #2
-% flush to the right margin.  It is used for index and table of contents
-% entries.  The paragraph is indented by \leftskip.
-%
-\def\entry#1#2{\begingroup
-  %
-  % Start a new paragraph if necessary, so our assignments below can't
-  % affect previous text.
-  \par
-  %
-  % Do not fill out the last line with white space.
-  \parfillskip = 0in
-  %
-  % No extra space above this paragraph.
-  \parskip = 0in
-  %
-  % Do not prefer a separate line ending with a hyphen to fewer lines.
-  \finalhyphendemerits = 0
-  %
-  % \hangindent is only relevant when the entry text and page number
-  % don't both fit on one line.  In that case, bob suggests starting the
-  % dots pretty far over on the line.  Unfortunately, a large
-  % indentation looks wrong when the entry text itself is broken across
-  % lines.  So we use a small indentation and put up with long leaders.
-  %
-  % \hangafter is reset to 1 (which is the value we want) at the start
-  % of each paragraph, so we need not do anything with that.
-  \hangindent = 2em
-  %
-  % When the entry text needs to be broken, just fill out the first line
-  % with blank space.
-  \rightskip = 0pt plus1fil
-  %
-  % A bit of stretch before each entry for the benefit of balancing columns.
-  \vskip 0pt plus1pt
-  %
-  % Start a ``paragraph'' for the index entry so the line breaking
-  % parameters we've set above will have an effect.
-  \noindent
-  %
-  % Insert the text of the index entry.  TeX will do line-breaking on it.
-  #1%
-  % The following is kludged to not output a line of dots in the index if
-  % there are no page numbers.  The next person who breaks this will be
-  % cursed by a Unix daemon.
-  \def\tempa{{\rm }}%
-  \def\tempb{#2}%
-  \edef\tempc{\tempa}%
-  \edef\tempd{\tempb}%
-  \ifx\tempc\tempd\ \else%
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin.  It is used for index
+% and table of contents entries.  The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+%	\def\entry#1#2{...
+% But this frozes the catcodes in the argument, and can cause problems to
+% @code, which sets - active.  This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+%
+% The right solution is to prevent \entry from swallowing the whole text.
+%                                 --kasal, 21nov03
+\def\entry{%
+  \begingroup
+    %
+    % Start a new paragraph if necessary, so our assignments below can't
+    % affect previous text.
+    \par
+    %
+    % Do not fill out the last line with white space.
+    \parfillskip = 0in
+    %
+    % No extra space above this paragraph.
+    \parskip = 0in
+    %
+    % Do not prefer a separate line ending with a hyphen to fewer lines.
+    \finalhyphendemerits = 0
+    %
+    % \hangindent is only relevant when the entry text and page number
+    % don't both fit on one line.  In that case, bob suggests starting the
+    % dots pretty far over on the line.  Unfortunately, a large
+    % indentation looks wrong when the entry text itself is broken across
+    % lines.  So we use a small indentation and put up with long leaders.
+    %
+    % \hangafter is reset to 1 (which is the value we want) at the start
+    % of each paragraph, so we need not do anything with that.
+    \hangindent = 2em
+    %
+    % When the entry text needs to be broken, just fill out the first line
+    % with blank space.
+    \rightskip = 0pt plus1fil
     %
-    % If we must, put the page number on a line of its own, and fill out
-    % this line with blank space.  (The \hfil is overwhelmed with the
-    % fill leaders glue in \indexdotfill if the page number does fit.)
-    \hfil\penalty50
-    \null\nobreak\indexdotfill % Have leaders before the page number.
+    % A bit of stretch before each entry for the benefit of balancing
+    % columns.
+    \vskip 0pt plus1pt
+    %
+    % Swallow the left brace of the text (first parameter):
+    \afterassignment\doentry
+    \let\temp =
+}
+\def\doentry{%
+    \bgroup % Instead of the swallowed brace.
+      \noindent
+      \aftergroup\finishentry
+      % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+    % #1 is the page number.
     %
-    % The `\ ' here is removed by the implicit \unskip that TeX does as
-    % part of (the primitive) \par.  Without it, a spurious underfull
-    % \hbox ensues.
-    \ifpdf
-      \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+    % The following is kludged to not output a line of dots in the index if
+    % there are no page numbers.  The next person who breaks this will be
+    % cursed by a Unix daemon.
+    \def\tempa{{\rm }}%
+    \def\tempb{#1}%
+    \edef\tempc{\tempa}%
+    \edef\tempd{\tempb}%
+    \ifx\tempc\tempd
+      \ %
     \else
-      \ #2% The page number ends the paragraph.
+      %
+      % If we must, put the page number on a line of its own, and fill out
+      % this line with blank space.  (The \hfil is overwhelmed with the
+      % fill leaders glue in \indexdotfill if the page number does fit.)
+      \hfil\penalty50
+      \null\nobreak\indexdotfill % Have leaders before the page number.
+      %
+      % The `\ ' here is removed by the implicit \unskip that TeX does as
+      % part of (the primitive) \par.  Without it, a spurious underfull
+      % \hbox ensues.
+      \ifpdf
+	\pdfgettoks#1.%
+	\ \the\toksA
+      \else
+	\ #1%
+      \fi
     \fi
-  \fi%
-  \par
-\endgroup}
+    \par
+  \endgroup
+}
 
 % Like \dotfill except takes at least 1 em.
 \def\indexdotfill{\cleaders
@@ -3408,6 +3969,12 @@
 \message{sectioning,}
 % Chapters, sections, etc.
 
+% \unnumberedno is an oxymoron, of course.  But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number".  We avoid collisions with chapter
+% numbers by starting them at 10000.  (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
 \newcount\chapno
 \newcount\secno        \secno=0
 \newcount\subsecno     \subsecno=0
@@ -3415,9 +3982,12 @@
 
 % This counter is funny since it counts through charcodes of letters A, B, ...
 \newcount\appendixno  \appendixno = `\@
+%
 % \def\appendixletter{\char\the\appendixno}
-% We do the following for the sake of pdftex, which needs the actual
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
 % letter in the expansion, not just typeset.
+%
 \def\appendixletter{%
   \ifnum\appendixno=`A A%
   \else\ifnum\appendixno=`B B%
@@ -3455,11 +4025,12 @@
 
 % Each @chapter defines this as the name of the chapter.
 % page headings and footings can use it.  @section does likewise.
+% However, they are not reliable, because we don't use marks.
 \def\thischapter{}
 \def\thissection{}
 
 \newcount\absseclevel % used to calculate proper heading level
-\newcount\secbase\secbase=0 % @raise/lowersections modify this count
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
 
 % @raisesections: treat @section as chapter, @subsection as section, etc.
 \def\raisesections{\global\advance\secbase by -1}
@@ -3469,288 +4040,246 @@
 \def\lowersections{\global\advance\secbase by 1}
 \let\down=\lowersections % original BFox name
 
-% Choose a numbered-heading macro
-% #1 is heading level if unmodified by @raisesections or @lowersections
-% #2 is text for heading
-\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
-  \chapterzzz{#2}
-\or
-  \seczzz{#2}
-\or
-  \numberedsubseczzz{#2}
-\or
-  \numberedsubsubseczzz{#2}
-\else
-  \ifnum \absseclevel<0
-    \chapterzzz{#2}
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achive this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unmlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+  % Compute the abs. sec. level:
+  \absseclevel=#2
+  \advance\absseclevel by \secbase
+  % Make sure \absseclevel doesn't fall outside the range:
+  \ifnum \absseclevel < 0
+    \absseclevel = 0
   \else
-    \numberedsubsubseczzz{#2}
+    \ifnum \absseclevel > 3
+      \absseclevel = 3
+    \fi
   \fi
-\fi
-}
-
-% like \numhead, but chooses appendix heading levels
-\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
-  \appendixzzz{#2}
-\or
-  \appendixsectionzzz{#2}
-\or
-  \appendixsubseczzz{#2}
-\or
-  \appendixsubsubseczzz{#2}
-\else
-  \ifnum \absseclevel<0
-    \appendixzzz{#2}
+  % The heading type:
+  \def\headtype{#1}%
+  \if \headtype U%
+    \ifnum \absseclevel < \unmlevel
+      \chardef\unmlevel = \absseclevel
+    \fi
   \else
-    \appendixsubsubseczzz{#2}
+    % Check for appendix sections:
+    \ifnum \absseclevel = 0
+      \edef\chapheadtype{\headtype}%
+    \else
+      \if \headtype A\if \chapheadtype N%
+	\errmessage{@appendix... within a non-appendix chapter}%
+      \fi\fi
+    \fi
+    % Check for numbered within unnumbered:
+    \ifnum \absseclevel > \unmlevel
+      \def\headtype{U}%
+    \else
+      \chardef\unmlevel = 3
+    \fi
+  \fi
+  % Now print the heading:
+  \if \headtype U%
+    \ifcase\absseclevel
+	\unnumberedzzz{#3}%
+    \or \unnumberedseczzz{#3}%
+    \or \unnumberedsubseczzz{#3}%
+    \or \unnumberedsubsubseczzz{#3}%
+    \fi
+  \else
+    \if \headtype A%
+      \ifcase\absseclevel
+	  \appendixzzz{#3}%
+      \or \appendixsectionzzz{#3}%
+      \or \appendixsubseczzz{#3}%
+      \or \appendixsubsubseczzz{#3}%
+      \fi
+    \else
+      \ifcase\absseclevel
+	  \chapterzzz{#3}%
+      \or \seczzz{#3}%
+      \or \numberedsubseczzz{#3}%
+      \or \numberedsubsubseczzz{#3}%
+      \fi
+    \fi
   \fi
-\fi
-}
-
-% like \numhead, but chooses numberless heading levels
-\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
-  \unnumberedzzz{#2}
-\or
-  \unnumberedseczzz{#2}
-\or
-  \unnumberedsubseczzz{#2}
-\or
-  \unnumberedsubsubseczzz{#2}
-\else
-  \ifnum \absseclevel<0
-    \unnumberedzzz{#2}
-  \else
-    \unnumberedsubsubseczzz{#2}
-  \fi
-\fi
-}
-
-% @chapter, @appendix, @unnumbered.
-\def\thischaptername{No Chapter Title}
-\outer\def\chapter{\parsearg\chapteryyy}
-\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
-\def\chapterzzz #1{%
-\secno=0 \subsecno=0 \subsubsecno=0
-\global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}%
-\chapmacro {#1}{\the\chapno}%
-\gdef\thissection{#1}%
-\gdef\thischaptername{#1}%
-% We don't substitute the actual chapter name into \thischapter
-% because we don't want its macros evaluated now.
-\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}%
-                                  {\the\chapno}}}%
-\temp
-\donoderef
-\global\let\section = \numberedsec
-\global\let\subsection = \numberedsubsec
-\global\let\subsubsection = \numberedsubsubsec
-}
-
-\outer\def\appendix{\parsearg\appendixyyy}
-\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
-\def\appendixzzz #1{%
-\secno=0 \subsecno=0 \subsubsecno=0
-\global\advance \appendixno by 1
-\message{\putwordAppendix\space \appendixletter}%
-\chapmacro {#1}{\putwordAppendix{} \appendixletter}%
-\gdef\thissection{#1}%
-\gdef\thischaptername{#1}%
-\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash appendixentry{\the\toks0}%
-                       {\appendixletter}}}%
-\temp
-\appendixnoderef
-\global\let\section = \appendixsec
-\global\let\subsection = \appendixsubsec
-\global\let\subsubsection = \appendixsubsubsec
+  \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v.  By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+  % section resetting is \global in case the chapter is in a group, such
+  % as an @include file.
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\chapno by 1
+  %
+  % Used for \float.
+  \gdef\chaplevelprefix{\the\chapno.}%
+  \resetallfloatnos
+  %
+  \message{\putwordChapter\space \the\chapno}%
+  %
+  % Write the actual heading.
+  \chapmacro{#1}{Ynumbered}{\the\chapno}%
+  %
+  % So @section and the like are numbered underneath this chapter.
+  \global\let\section = \numberedsec
+  \global\let\subsection = \numberedsubsec
+  \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\appendixno by 1
+  \gdef\chaplevelprefix{\appendixletter.}%
+  \resetallfloatnos
+  %
+  \def\appendixnum{\putwordAppendix\space \appendixletter}%
+  \message{\appendixnum}%
+  %
+  \chapmacro{#1}{Yappendix}{\appendixletter}%
+  %
+  \global\let\section = \appendixsec
+  \global\let\subsection = \appendixsubsec
+  \global\let\subsubsection = \appendixsubsubsec
+}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\unnumberedno by 1
+  %
+  % Since an unnumbered has no number, no prefix for figures.
+  \global\let\chaplevelprefix = \empty
+  \resetallfloatnos
+  %
+  % This used to be simply \message{#1}, but TeX fully expands the
+  % argument to \message.  Therefore, if #1 contained @-commands, TeX
+  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
+  % expanded @cite (which turns out to cause errors because \cite is meant
+  % to be executed, not expanded).
+  %
+  % Anyway, we don't want the fully-expanded definition of @cite to appear
+  % as a result of the \message, we just want `@cite' itself.  We use
+  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+  % simply yielding the contents of <toks register>.  (We also do this for
+  % the toc entries.)
+  \toks0 = {#1}%
+  \message{(\the\toks0)}%
+  %
+  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+  %
+  \global\let\section = \unnumberedsec
+  \global\let\subsection = \unnumberedsubsec
+  \global\let\subsubsection = \unnumberedsubsubsec
 }
 
 % @centerchap is like @unnumbered, but the heading is centered.
-\outer\def\centerchap{\parsearg\centerchapyyy}
-\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
+\outer\parseargdef\centerchap{%
+  % Well, we could do the following in a group, but that would break
+  % an assumption that \chapmacro is called at the outermost level.
+  % Thus we are safer this way:		--kasal, 24feb04
+  \let\centerparametersmaybe = \centerparameters
+  \unnmhead0{#1}%
+  \let\centerparametersmaybe = \relax
+}
 
 % @top is like @unnumbered.
-\outer\def\top{\parsearg\unnumberedyyy}
-
-\outer\def\unnumbered{\parsearg\unnumberedyyy}
-\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
-\def\unnumberedzzz #1{%
-\secno=0 \subsecno=0 \subsubsecno=0
-%
-% This used to be simply \message{#1}, but TeX fully expands the
-% argument to \message.  Therefore, if #1 contained @-commands, TeX
-% expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
-% expanded @cite (which turns out to cause errors because \cite is meant
-% to be executed, not expanded).
-%
-% Anyway, we don't want the fully-expanded definition of @cite to appear
-% as a result of the \message, we just want `@cite' itself.  We use
-% \the<toks register> to achieve this: TeX expands \the<toks> only once,
-% simply yielding the contents of <toks register>.  (We also do this for
-% the toc entries.)
-\toks0 = {#1}\message{(\the\toks0)}%
-%
-\unnumbchapmacro {#1}%
-\gdef\thischapter{#1}\gdef\thissection{#1}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash unnumbchapentry{\the\toks0}}}%
-\temp
-\unnumbnoderef
-\global\let\section = \unnumberedsec
-\global\let\subsection = \unnumberedsubsec
-\global\let\subsubsection = \unnumberedsubsubsec
-}
+\let\top\unnumbered
 
 % Sections.
-\outer\def\numberedsec{\parsearg\secyyy}
-\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
-\def\seczzz #1{%
-\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
-\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}%
-                                  {\the\chapno}{\the\secno}}}%
-\temp
-\donoderef
-\nobreak
-}
-
-\outer\def\appendixsection{\parsearg\appendixsecyyy}
-\outer\def\appendixsec{\parsearg\appendixsecyyy}
-\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
-\def\appendixsectionzzz #1{%
-\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
-\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}%
-                                  {\appendixletter}{\the\secno}}}%
-\temp
-\appendixnoderef
-\nobreak
-}
-
-\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
-\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
-\def\unnumberedseczzz #1{%
-\plainsecheading {#1}\gdef\thissection{#1}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsecentry%
-  {\the\toks0}{\the\chapno}}}%
-\temp
-\unnumbnoderef
-\nobreak
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
 }
 
 % Subsections.
-\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
-\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
-\def\numberedsubseczzz #1{%
-\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
-\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}%
-                                    {\the\chapno}{\the\secno}{\the\subsecno}}}%
-\temp
-\donoderef
-\nobreak
-}
-
-\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
-\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
-\def\appendixsubseczzz #1{%
-\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
-\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}%
-                                {\appendixletter}{\the\secno}{\the\subsecno}}}%
-\temp
-\appendixnoderef
-\nobreak
-}
-
-\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
-\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
-\def\unnumberedsubseczzz #1{%
-\plainsubsecheading {#1}\gdef\thissection{#1}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsecentry%
-  {\the\toks0}{\the\chapno}{\the\secno}}}%
-\temp
-\unnumbnoderef
-\nobreak
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno}%
 }
 
 % Subsubsections.
-\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
-\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
-\def\numberedsubsubseczzz #1{%
-\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
-\subsubsecheading {#1}
-  {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}%
-  {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}%
-\temp
-\donoderef
-\nobreak
-}
-
-\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
-\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
-\def\appendixsubsubseczzz #1{%
-\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
-\subsubsecheading {#1}
-  {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}%
-  {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}%
-\temp
-\appendixnoderef
-\nobreak
-}
-
-\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
-\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
-\def\unnumberedsubsubseczzz #1{%
-\plainsubsubsecheading {#1}\gdef\thissection{#1}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsubsecentry%
-  {\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}}}%
-\temp
-\unnumbnoderef
-\nobreak
-}
-
-% These are variants which are not "outer", so they can appear in @ifinfo.
-% Actually, they should now be obsolete; ordinary section commands should work.
-\def\infotop{\parsearg\unnumberedzzz}
-\def\infounnumbered{\parsearg\unnumberedzzz}
-\def\infounnumberedsec{\parsearg\unnumberedseczzz}
-\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
-\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
-
-\def\infoappendix{\parsearg\appendixzzz}
-\def\infoappendixsec{\parsearg\appendixseczzz}
-\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
-\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
-
-\def\infochapter{\parsearg\chapterzzz}
-\def\infosection{\parsearg\sectionzzz}
-\def\infosubsection{\parsearg\subsectionzzz}
-\def\infosubsubsection{\parsearg\subsubsectionzzz}
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynumbered}%
+                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
 
 % These macros control what the section commands do, according
 % to what kind of chapter we are in (ordinary, appendix, or unnumbered).
 % Define them by default for a numbered chapter.
-\global\let\section = \numberedsec
-\global\let\subsection = \numberedsubsec
-\global\let\subsubsection = \numberedsubsubsec
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
 
 % Define @majorheading, @heading and @subheading
 
@@ -3763,23 +4292,27 @@
 %          if justification is not attempted.  Hence \raggedright.
 
 
-\def\majorheading{\parsearg\majorheadingzzz}
-\def\majorheadingzzz #1{%
-{\advance\chapheadingskip by 10pt \chapbreak }%
-{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                  \parindent=0pt\raggedright
-                  \rm #1\hfill}}\bigskip \par\penalty 200}
-
-\def\chapheading{\parsearg\chapheadingzzz}
-\def\chapheadingzzz #1{\chapbreak %
-{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                  \parindent=0pt\raggedright
-                  \rm #1\hfill}}\bigskip \par\penalty 200}
+\def\majorheading{%
+  {\advance\chapheadingskip by 10pt \chapbreak }%
+  \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                    \parindent=0pt\raggedright
+                    \rm #1\hfill}}%
+  \bigskip \par\penalty 200\relax
+  \suppressfirstparagraphindent
+}
 
 % @heading, @subheading, @subsubheading.
-\def\heading{\parsearg\plainsecheading}
-\def\subheading{\parsearg\plainsubsecheading}
-\def\subsubheading{\parsearg\plainsubsubsecheading}
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
 
 % These macros generate a chapter, section, etc. heading only
 % (including whitespace, linebreaking, etc. around it),
@@ -3788,8 +4321,6 @@
 %%% Args are the skip and penalty (usually negative)
 \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
 
-\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
-
 %%% Define plain chapter starts, and page on/off switching for it
 % Parameter controlling skip before chapter headings (if needed)
 
@@ -3812,7 +4343,7 @@
 \global\let\pagealignmacro=\chappager
 \global\def\HEADINGSon{\HEADINGSsingle}}
 
-\def\CHAPPAGodd{
+\def\CHAPPAGodd{%
 \global\let\contentsalignmacro = \chapoddpage
 \global\let\pchapsepmacro=\chapoddpage
 \global\let\pagealignmacro=\chapoddpage
@@ -3820,107 +4351,201 @@
 
 \CHAPPAGon
 
-\def\CHAPFplain{
-\global\let\chapmacro=\chfplain
-\global\let\unnumbchapmacro=\unnchfplain
-\global\let\centerchapmacro=\centerchfplain}
-
-% Plain chapter opening.
-% #1 is the text, #2 the chapter number or empty if unnumbered.
-\def\chfplain#1#2{%
+% Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
   \pchapsepmacro
   {%
     \chapfonts \rm
-    \def\chapnum{#2}%
-    \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
+    %
+    % Have to define \thissection before calling \donoderef, because the
+    % xref code eventually uses it.  On the other hand, it has to be called
+    % after \pchapsepmacro, or the headline will change too soon.
+    \gdef\thissection{#1}%
+    \gdef\thischaptername{#1}%
+    %
+    % Only insert the separating space if we have a chapter/appendix
+    % number, and don't print the unnumbered ``number''.
+    \def\temptype{#2}%
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unnchap}%
+      \gdef\thischapter{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+      \def\toctype{omit}%
+      \gdef\thischapter{}%
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+      \def\toctype{app}%
+      % We don't substitute the actual chapter name into \thischapter
+      % because we don't want its macros evaluated now.  And we don't
+      % use \thissection because that changes with each section.
+      %
+      \xdef\thischapter{\putwordAppendix{} \appendixletter:
+                        \noexpand\thischaptername}%
+    \else
+      \setbox0 = \hbox{#3\enspace}%
+      \def\toctype{numchap}%
+      \xdef\thischapter{\putwordChapter{} \the\chapno:
+                        \noexpand\thischaptername}%
+    \fi\fi\fi
+    %
+    % Write the toc entry for this chapter.  Must come before the
+    % \donoderef, because we include the current node name in the toc
+    % entry, and \donoderef resets it to empty.
+    \writetocentry{\toctype}{#1}{#3}%
+    %
+    % For pdftex, we have to write out the node definition (aka, make
+    % the pdfdest) after any page break, but before the actual text has
+    % been typeset.  If the destination for the pdf outline is after the
+    % text, then jumping from the outline may wind up with the text not
+    % being visible, for instance under high magnification.
+    \donoderef{#2}%
+    %
+    % Typeset the actual heading.
     \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
-          \hangindent = \wd0 \centerparametersmaybe
+          \hangindent=\wd0 \centerparametersmaybe
           \unhbox0 #1\par}%
   }%
   \nobreak\bigskip % no page break after a chapter title
   \nobreak
 }
 
-% Plain opening for unnumbered.
-\def\unnchfplain#1{\chfplain{#1}{}}
-
 % @centerchap -- centered and unnumbered.
 \let\centerparametersmaybe = \relax
-\def\centerchfplain#1{{%
-  \def\centerparametersmaybe{%
-    \advance\rightskip by 3\rightskip
-    \leftskip = \rightskip
-    \parfillskip = 0pt
-  }%
-  \chfplain{#1}{}%
-}}
-
-\CHAPFplain % The default
-
+\def\centerparameters{%
+  \advance\rightskip by 3\rightskip
+  \leftskip = \rightskip
+  \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
 \def\unnchfopen #1{%
 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
                        \parindent=0pt\raggedright
                        \rm #1\hfill}}\bigskip \par\nobreak
 }
-
 \def\chfopen #1#2{\chapoddpage {\chapfonts
 \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
 \par\penalty 5000 %
 }
-
 \def\centerchfopen #1{%
 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
                        \parindent=0pt
                        \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
 }
-
-\def\CHAPFopen{
-\global\let\chapmacro=\chfopen
-\global\let\unnumbchapmacro=\unnchfopen
-\global\let\centerchapmacro=\centerchfopen}
-
-
-% Section titles.
+\def\CHAPFopen{%
+  \global\let\chapmacro=\chfopen
+  \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles.  These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
 \newskip\secheadingskip
-\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
-\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
-\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
 
 % Subsection titles.
-\newskip \subsecheadingskip
-\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
-\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
-\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
 
 % Subsubsection titles.
-\let\subsubsecheadingskip = \subsecheadingskip
-\let\subsubsecheadingbreak = \subsecheadingbreak
-\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
-\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
-
-
-% Print any size section title.
-%
-% #1 is the section type (sec/subsec/subsubsec), #2 is the section
-% number (maybe empty), #3 the text.
-\def\sectionheading#1#2#3{%
-  {%
-    \expandafter\advance\csname #1headingskip\endcsname by \parskip
-    \csname #1headingbreak\endcsname
-  }%
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\sectionheading#1#2#3#4{%
   {%
     % Switch to the right set of fonts.
-    \csname #1fonts\endcsname \rm
+    \csname #2fonts\endcsname \rm
+    %
+    % Insert space above the heading.
+    \csname #2headingbreak\endcsname
+    %
+    % Only insert the space after the number if we have a section number.
+    \def\sectionlevel{#2}%
+    \def\temptype{#3}%
     %
-    % Only insert the separating space if we have a section number.
-    \def\secnum{#2}%
-    \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unn}%
+      \gdef\thissection{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      % for @headings -- no section number, don't include in toc,
+      % and don't redefine \thissection.
+      \setbox0 = \hbox{}%
+      \def\toctype{omit}%
+      \let\sectionlevel=\empty
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{app}%
+      \gdef\thissection{#1}%
+    \else
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{num}%
+      \gdef\thissection{#1}%
+    \fi\fi\fi
+    %
+    % Write the toc entry (before \donoderef).  See comments in \chapmacro.
+    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
     %
+    % Write the node reference (= pdf destination for pdftex).
+    % Again, see comments in \chapmacro.
+    \donoderef{#3}%
+    %
+    % Interline glue will be inserted when the vbox is completed.
+    % That glue will be a valid breakpoint for the page, since it'll be
+    % preceded by a whatsit (usually from the \donoderef, or from the
+    % \writetocentry if there was no node).  We don't want to allow that
+    % break, since then the whatsits could end up on page n while the
+    % section is on page n+1, thus toc/etc. are wrong.  Debian bug 276000.
+    \nobreak
+    %
+    % Output the actual section heading.
     \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
-          \hangindent = \wd0 % zero if no section number
-          \unhbox0 #3}%
+          \hangindent=\wd0  % zero if no section number
+          \unhbox0 #1}%
   }%
-  \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak
+  % Add extra space after the heading -- half of whatever came above it.
+  % Don't allow stretch, though.
+  \kern .5 \csname #2headingskip\endcsname
+  %
+  % Do not let the kern be a potential breakpoint, as it would be if it
+  % was followed by glue.
+  \nobreak
+  %
+  % We'll almost certainly start a paragraph next, so don't let that
+  % glue accumulate.  (Not a breakpoint because it's preceded by a
+  % discardable item.)
+  \vskip-\parskip
+  % 
+  % This is purely so the last item on the list is a known \penalty >
+  % 10000.  This is so \startdefun can avoid allowing breakpoints after
+  % section headings.  Otherwise, it would insert a valid breakpoint between:
+  % 
+  %   @section sec-whatever
+  %   @deffn def-whatever
+  \penalty 10001
 }
 
 
@@ -3929,112 +4554,173 @@
 \newwrite\tocfile
 
 % Write an entry to the toc file, opening it if necessary.
-% Called from @chapter, etc.  We supply {\folio} at the end of the
-% argument, which will end up as the last argument to the \...entry macro.
-%
-% We open the .toc file here instead of at @setfilename or any other
-% fixed time so that @contents can be put in the document anywhere.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this.  The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything.  This is used for the
+% table of contents chapter openings themselves.
 %
 \newif\iftocfileopened
-\def\writetocentry#1{%
-  \iftocfileopened\else
-    \immediate\openout\tocfile = \jobname.toc
-    \global\tocfileopenedtrue
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+  \edef\writetoctype{#1}%
+  \ifx\writetoctype\omitkeyword \else
+    \iftocfileopened\else
+      \immediate\openout\tocfile = \jobname.toc
+      \global\tocfileopenedtrue
+    \fi
+    %
+    \iflinks
+      {\atdummies
+       \edef\temp{%
+         \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+       \temp
+      }%
+    \fi
   \fi
-  \iflinks \write\tocfile{#1{\folio}}\fi
-  %
-  % Tell \shipout to create a page destination if we're doing pdf, which
-  % will be the target of the links in the table of contents.  We can't
-  % just do it on every page because the title pages are numbered 1 and
-  % 2 (the page numbers aren't printed), and so are the first two pages
-  % of the document.  Thus, we'd have two destinations named `1', and
-  % two named `2'.
-  \ifpdf \pdfmakepagedesttrue \fi
+  %
+  % Tell \shipout to create a pdf destination on each page, if we're
+  % writing pdf.  These are used in the table of contents.  We can't
+  % just write one on every page because the title pages are numbered
+  % 1 and 2 (the page numbers aren't printed), and so are the first
+  % two pages of the document.  Thus, we'd have two destinations named
+  % `1', and two named `2'.
+  \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care.  This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+% 
+\def\activecatcodes{%
+  \catcode`\"=\active
+  \catcode`\$=\active
+  \catcode`\<=\active
+  \catcode`\>=\active
+  \catcode`\\=\active
+  \catcode`\^=\active
+  \catcode`\_=\active
+  \catcode`\|=\active
+  \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+  \setupdatafile
+  \activecatcodes
+  \input \jobname.toc
 }
 
 \newskip\contentsrightmargin \contentsrightmargin=1in
 \newcount\savepageno
 \newcount\lastnegativepageno \lastnegativepageno = -1
 
-% Finish up the main text and prepare to read what we've written
-% to \tocfile.
+% Prepare to read what we've written to \tocfile.
 %
 \def\startcontents#1{%
-   % If @setchapternewpage on, and @headings double, the contents should
-   % start on an odd page, unlike chapters.  Thus, we maintain
-   % \contentsalignmacro in parallel with \pagealignmacro.
-   % From: Torbjorn Granlund <tege@matematik.su.se>
-   \contentsalignmacro
-   \immediate\closeout\tocfile
-   %
-   % Don't need to put `Contents' or `Short Contents' in the headline.
-   % It is abundantly clear what they are.
-   \unnumbchapmacro{#1}\def\thischapter{}%
-   \savepageno = \pageno
-   \begingroup                  % Set up to handle contents files properly.
-      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
-      % We can't do this, because then an actual ^ in a section
-      % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
-      %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
-      \raggedbottom             % Worry more about breakpoints than the bottom.
-      \advance\hsize by -\contentsrightmargin % Don't use the full line length.
-      %
-      % Roman numerals for page numbers.
-      \ifnum \pageno>0 \pageno = \lastnegativepageno \fi
+  % If @setchapternewpage on, and @headings double, the contents should
+  % start on an odd page, unlike chapters.  Thus, we maintain
+  % \contentsalignmacro in parallel with \pagealignmacro.
+  % From: Torbjorn Granlund <tege@matematik.su.se>
+  \contentsalignmacro
+  \immediate\closeout\tocfile
+  %
+  % Don't need to put `Contents' or `Short Contents' in the headline.
+  % It is abundantly clear what they are.
+  \def\thischapter{}%
+  \chapmacro{#1}{Yomitfromtoc}{}%
+  %
+  \savepageno = \pageno
+  \begingroup                  % Set up to handle contents files properly.
+    \raggedbottom              % Worry more about breakpoints than the bottom.
+    \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+    %
+    % Roman numerals for page numbers.
+    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
 }
 
 
 % Normal (long) toc.
 \def\contents{%
-   \startcontents{\putwordTOC}%
-     \openin 1 \jobname.toc
-     \ifeof 1 \else
-       \closein 1
-       \input \jobname.toc
-     \fi
-     \vfill \eject
-     \contentsalignmacro % in case @setchapternewpage odd is in effect
-     \pdfmakeoutlines
-   \endgroup
-   \lastnegativepageno = \pageno
-   \pageno = \savepageno
+  \startcontents{\putwordTOC}%
+    \openin 1 \jobname.toc
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+    \ifeof 1 \else
+      \pdfmakeoutlines
+    \fi
+    \closein 1
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
 }
 
 % And just the chapters.
 \def\summarycontents{%
-   \startcontents{\putwordShortTOC}%
-      %
-      \let\chapentry = \shortchapentry
-      \let\appendixentry = \shortappendixentry
-      \let\unnumbchapentry = \shortunnumberedentry
-      % We want a true roman here for the page numbers.
-      \secfonts
-      \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl
-      \rm
-      \hyphenpenalty = 10000
-      \advance\baselineskip by 1pt % Open it up a little.
-      \def\secentry ##1##2##3##4{}
-      \def\unnumbsecentry ##1##2##3{}
-      \def\subsecentry ##1##2##3##4##5{}
-      \def\unnumbsubsecentry ##1##2##3##4{}
-      \def\subsubsecentry ##1##2##3##4##5##6{}
-      \def\unnumbsubsubsecentry ##1##2##3##4##5{}
-      \openin 1 \jobname.toc
-      \ifeof 1 \else
-        \closein 1
-        \input \jobname.toc
-      \fi
-     \vfill \eject
-     \contentsalignmacro % in case @setchapternewpage odd is in effect
-   \endgroup
-   \lastnegativepageno = \pageno
-   \pageno = \savepageno
+  \startcontents{\putwordShortTOC}%
+    %
+    \let\numchapentry = \shortchapentry
+    \let\appentry = \shortchapentry
+    \let\unnchapentry = \shortunnchapentry
+    % We want a true roman here for the page numbers.
+    \secfonts
+    \let\rm=\shortcontrm \let\bf=\shortcontbf
+    \let\sl=\shortcontsl \let\tt=\shortconttt
+    \rm
+    \hyphenpenalty = 10000
+    \advance\baselineskip by 1pt % Open it up a little.
+    \def\numsecentry##1##2##3##4{}
+    \let\appsecentry = \numsecentry
+    \let\unnsecentry = \numsecentry
+    \let\numsubsecentry = \numsecentry
+    \let\appsubsecentry = \numsecentry
+    \let\unnsubsecentry = \numsecentry
+    \let\numsubsubsecentry = \numsecentry
+    \let\appsubsubsecentry = \numsecentry
+    \let\unnsubsubsecentry = \numsecentry
+    \openin 1 \jobname.toc
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \closein 1
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
 }
 \let\shortcontents = \summarycontents
 
-\ifpdf
-  \pdfcatalog{/PageMode /UseOutlines}%
-\fi
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+  % This space should be enough, since a single number is .5em, and the
+  % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % But use \hss just in case.
+  % (This space doesn't include the extra space that gets added after
+  % the label; that gets put in by \shortchapentry above.)
+  %
+  % We'd like to right-justify chapter numbers, but that looks strange
+  % with appendix letters.  And right-justifying numbers and
+  % left-justifying letters looks strange when there is less than 10
+  % chapters.  Have to read the whole toc once to know how many chapters
+  % there are before deciding ...
+  \hbox to 1em{#1\hss}%
+}
 
 % These macros generate individual entries in the table of contents.
 % The first argument is the chapter or section name.
@@ -4042,57 +4728,46 @@
 % The arguments in between are the chapter number, section number, ...
 
 % Chapters, in the main contents.
-\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
 %
 % Chapters, in the short toc.
 % See comments in \dochapentry re vbox and related settings.
-\def\shortchapentry#1#2#3{%
-  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}%
+\def\shortchapentry#1#2#3#4{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
 }
 
 % Appendices, in the main contents.
-\def\appendixentry#1#2#3{\dochapentry{\putwordAppendix{} #2\labelspace#1}{#3}}
-%
-% Appendices, in the short toc.
-\let\shortappendixentry = \shortchapentry
-
-% Typeset the label for a chapter or appendix for the short contents.
-% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter.
-% We could simplify the code here by writing out an \appendixentry
-% command in the toc file for appendices, instead of using \chapentry
-% for both, but it doesn't seem worth it.
-%
-\newdimen\shortappendixwidth
-%
-\def\shortchaplabel#1{%
-  % This space should be enough, since a single number is .5em, and the
-  % widest letter (M) is 1em, at least in the Computer Modern fonts.
-  % But use \hss just in case.
-  % (This space doesn't include the extra space that gets added after
-  % the label; that gets put in by \shortchapentry above.)
-  \dimen0 = 1em
-  \hbox to \dimen0{#1\hss}%
-}
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+  % We use M since it's probably the widest letter.
+  \setbox0 = \hbox{\putwordAppendix{} M}%
+  \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
 
 % Unnumbered chapters.
-\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
-\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno\bgroup#2\egroup}}
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
 
 % Sections.
-\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
-\def\unnumbsecentry#1#2#3{\dosecentry{#1}{#3}}
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
 
 % Subsections.
-\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
-\def\unnumbsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
 
 % And subsubsections.
-\def\subsubsecentry#1#2#3#4#5#6{%
-  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
-\def\unnumbsubsubsecentry#1#2#3#4#5{\dosubsubsecentry{#1}{#5}}
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
 
 % This parameter controls the indentation of the various levels.
-\newdimen\tocindent \tocindent = 3pc
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
 
 % Now for the actual typesetting. In all these, #1 is the text and #2 is the
 % page number.
@@ -4123,17 +4798,8 @@
   \tocentry{#1}{\dopageno\bgroup#2\egroup}%
 \endgroup}
 
-% Final typesetting of a toc entry; we use the same \entry macro as for
-% the index entries, but we want to suppress hyphenation here.  (We
-% can't do that in the \entry macro, since index entries might consist
-% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
-\def\tocentry#1#2{\begingroup
-  \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
-  % Do not use \turnoffactive in these arguments.  Since the toc is
-  % typeset in cmr, characters such as _ would come out wrong; we
-  % have to do the usual translation tricks.
-  \entry{#1}{#2}%
-\endgroup}
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
 
 % Space between chapter (or whatever) number and the title.
 \def\labelspace{\hskip1em \relax}
@@ -4143,8 +4809,8 @@
 
 \def\chapentryfonts{\secfonts \rm}
 \def\secentryfonts{\textfonts}
-\let\subsecentryfonts = \textfonts
-\let\subsubsecentryfonts = \textfonts
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
 
 
 \message{environments,}
@@ -4171,10 +4837,10 @@
 % The text. (`r' is open on the right, `e' somewhat less so on the left.)
 \setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
 %
-\global\setbox\errorbox=\hbox to \dimen0{\hfil
+\setbox\errorbox=\hbox to \dimen0{\hfil
    \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
    \advance\hsize by -2\dimen2 % Rules.
-   \vbox{
+   \vbox{%
       \hrule height\dimen2
       \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
          \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
@@ -4188,17 +4854,16 @@
 % One exception: @ is still an escape character, so that @end tex works.
 % But \@ or @@ will get a plain tex @ character.
 
-\def\tex{\begingroup
+\envdef\tex{%
   \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
   \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
-  \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
+  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
   \catcode `\%=14
-  \catcode 43=12 % plus
-  \catcode`\"=12
-  \catcode`\==12
-  \catcode`\|=12
-  \catcode`\<=12
-  \catcode`\>=12
+  \catcode `\+=\other
+  \catcode `\"=\other
+  \catcode `\|=\other
+  \catcode `\<=\other
+  \catcode `\>=\other
   \escapechar=`\\
   %
   \let\b=\ptexb
@@ -4210,19 +4875,24 @@
   \let\equiv=\ptexequiv
   \let\!=\ptexexclam
   \let\i=\ptexi
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
   \let\{=\ptexlbrace
   \let\+=\tabalign
   \let\}=\ptexrbrace
+  \let\/=\ptexslash
   \let\*=\ptexstar
   \let\t=\ptext
+  \let\frenchspacing=\plainfrenchspacing
   %
   \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
   \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
   \def\@{@}%
-\let\Etex=\endgroup}
+}
+% There is no need to define \Etex.
 
 % Define @lisp ... @end lisp.
-% @lisp does a \begingroup so it can rebind things,
+% @lisp environment forms a group so it can rebind things,
 % including the definition of @end lisp (which normally is erroneous).
 
 % Amount to narrow the margins by for @lisp.
@@ -4233,34 +4903,25 @@
 % have any width.
 \def\lisppar{\null\endgraf}
 
-% Make each space character in the input produce a normal interword
-% space in the output.  Don't allow a line break at this space, as this
-% is used only in environments like @example, where each line of input
-% should produce a line of output anyway.
-%
-{\obeyspaces %
-\gdef\sepspaces{\obeyspaces\let =\tie}}
-
-% Define \obeyedspace to be our active space, whatever it is.  This is
-% for use in \parsearg.
-{\sepspaces%
-\global\let\obeyedspace= }
-
 % This space is always present above and below environments.
 \newskip\envskipamount \envskipamount = 0pt
 
 % Make spacing and below environment symmetrical.  We use \parskip here
 % to help in doing that, since in @example-like environments \parskip
 % is reset to zero; thus the \afterenvbreak inserts no space -- but the
-% start of the next paragraph will insert \parskip
+% start of the next paragraph will insert \parskip.
 %
 \def\aboveenvbreak{{%
-  \ifnum\lastpenalty < 10000
+  % =10000 instead of <10000 because of a special case in \itemzzz and
+  % \sectionheading, q.v.
+  \ifnum \lastpenalty=10000 \else
     \advance\envskipamount by \parskip
     \endgraf
     \ifdim\lastskip<\envskipamount
       \removelastskip
-      \penalty-50
+      % it's not a good place to break if the last penalty was \nobreak
+      % or better ...
+      \ifnum\lastpenalty<10000 \penalty-50 \fi
       \vskip\envskipamount
     \fi
   \fi
@@ -4268,7 +4929,8 @@
 
 \let\afterenvbreak = \aboveenvbreak
 
-% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
 \let\nonarrowing=\relax
 
 % @cartouche ... @end cartouche: draw rectangle w/rounded corners around
@@ -4292,181 +4954,187 @@
 %
 \newskip\lskip\newskip\rskip
 
-\long\def\cartouche{%
-\begingroup
-        \lskip=\leftskip \rskip=\rightskip
-        \leftskip=0pt\rightskip=0pt %we want these *outside*.
-        \cartinner=\hsize \advance\cartinner by-\lskip
-                          \advance\cartinner by-\rskip
-        \cartouter=\hsize
-        \advance\cartouter by 18.4pt % allow for 3pt kerns on either
-%                                    side, and for 6pt waste from
-%                                    each corner char, and rule thickness
-        \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
-        % Flag to tell @lisp, etc., not to narrow margin.
-        \let\nonarrowing=\comment
-        \vbox\bgroup
-                \baselineskip=0pt\parskip=0pt\lineskip=0pt
-                \carttop
-                \hbox\bgroup
-                        \hskip\lskip
-                        \vrule\kern3pt
-                        \vbox\bgroup
-                                \hsize=\cartinner
-                                \kern3pt
-                                \begingroup
-                                        \baselineskip=\normbskip
-                                        \lineskip=\normlskip
-                                        \parskip=\normpskip
-                                        \vskip -\parskip
+\envdef\cartouche{%
+  \ifhmode\par\fi  % can't be in the midst of a paragraph.
+  \startsavinginserts
+  \lskip=\leftskip \rskip=\rightskip
+  \leftskip=0pt\rightskip=0pt % we want these *outside*.
+  \cartinner=\hsize \advance\cartinner by-\lskip
+  \advance\cartinner by-\rskip
+  \cartouter=\hsize
+  \advance\cartouter by 18.4pt	% allow for 3pt kerns on either
+				% side, and for 6pt waste from
+				% each corner char, and rule thickness
+  \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+  % Flag to tell @lisp, etc., not to narrow margin.
+  \let\nonarrowing = t%
+  \vbox\bgroup
+      \baselineskip=0pt\parskip=0pt\lineskip=0pt
+      \carttop
+      \hbox\bgroup
+	  \hskip\lskip
+	  \vrule\kern3pt
+	  \vbox\bgroup
+	      \kern3pt
+	      \hsize=\cartinner
+	      \baselineskip=\normbskip
+	      \lineskip=\normlskip
+	      \parskip=\normpskip
+	      \vskip -\parskip
+	      \comment % For explanation, see the end of \def\group.
+}
 \def\Ecartouche{%
-                                \endgroup
-                                \kern3pt
-                        \egroup
-                        \kern3pt\vrule
-                        \hskip\rskip
-                \egroup
-                \cartbot
-        \egroup
-\endgroup
-}}
+              \ifhmode\par\fi
+	      \kern3pt
+	  \egroup
+	  \kern3pt\vrule
+	  \hskip\rskip
+      \egroup
+      \cartbot
+  \egroup
+  \checkinserts
+}
 
 
 % This macro is called at the beginning of all the @example variants,
 % inside a group.
 \def\nonfillstart{%
   \aboveenvbreak
-  \inENV % This group ends at the end of the body
   \hfuzz = 12pt % Don't be fussy
   \sepspaces % Make spaces be word-separators rather than space tokens.
-  \singlespace
   \let\par = \lisppar % don't ignore blank lines
   \obeylines % each line of input is a line of output
   \parskip = 0pt
   \parindent = 0pt
   \emergencystretch = 0pt % don't try to avoid overfull boxes
-  % @cartouche defines \nonarrowing to inhibit narrowing
-  % at next level down.
   \ifx\nonarrowing\relax
     \advance \leftskip by \lispnarrowing
     \exdentamount=\lispnarrowing
-    \let\exdent=\nofillexdent
-    \let\nonarrowing=\relax
+  \else
+    \let\nonarrowing = \relax
+  \fi
+  \let\exdent=\nofillexdent
+}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+%    @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+  \ifx\SETdispenvsize\smallword
+    \smallexamplefonts \rm
+  \fi
+}
+\def\setsmalldispenv{%
+  \ifx\SETdispenvsize\nosmallword
+  \else
+    \smallexamplefonts \rm
   \fi
 }
 
-% Define the \E... control sequence only if we are inside the particular
-% environment, so the error checking in \end will work.
-%
-% To end an @example-like environment, we first end the paragraph (via
-% \afterenvbreak's vertical glue), and then the group.  That way we keep
-% the zero \parskip that the environments set -- \parskip glue will be
-% inserted at the beginning of the next paragraph in the document, after
-% the environment.
-%
-\def\nonfillfinish{\afterenvbreak\endgroup}
-
-% @lisp: indented, narrowed, typewriter font.
-\def\lisp{\begingroup
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+  \expandafter\let\csname E#1\endcsname \afterenvbreak
+  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+  \makedispenv{#1}{#3}
+  \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvs {lisp}{example}{%
   \nonfillstart
-  \let\Elisp = \nonfillfinish
   \tt
   \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
   \gobble       % eat return
 }
 
-% @example: Same as @lisp.
-\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
-
-% @small... is usually equivalent to the non-small (@smallbook
-% redefines).  We must call \example (or whatever) last in the
-% definition, since it reads the return following the @example (or
-% whatever) command.
-%
-% This actually allows (for example) @end display inside an
-% @smalldisplay.  Too bad, but makeinfo will catch the error anyway.
-%
-\def\smalldisplay{\begingroup\def\Esmalldisplay{\nonfillfinish\endgroup}\display}
-\def\smallexample{\begingroup\def\Esmallexample{\nonfillfinish\endgroup}\lisp}
-\def\smallformat{\begingroup\def\Esmallformat{\nonfillfinish\endgroup}\format}
-\def\smalllisp{\begingroup\def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
-
-% Real @smallexample and @smalllisp (when @smallbook): use smaller fonts.
-% Originally contributed by Pavel@xerox.
-\def\smalllispx{\begingroup
-  \def\Esmalllisp{\nonfillfinish\endgroup}%
-  \def\Esmallexample{\nonfillfinish\endgroup}%
-  \smallexamplefonts
-  \lisp
-}
-
-% @display: same as @lisp except keep current font.
-%
-\def\display{\begingroup
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenv {display}{%
   \nonfillstart
-  \let\Edisplay = \nonfillfinish
   \gobble
 }
-%
-% @smalldisplay (when @smallbook): @display plus smaller fonts.
-%
-\def\smalldisplayx{\begingroup
-  \def\Esmalldisplay{\nonfillfinish\endgroup}%
-  \smallexamplefonts \rm
-  \display
-}
-
-% @format: same as @display except don't narrow margins.
-%
-\def\format{\begingroup
-  \let\nonarrowing = t
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenv{format}{%
+  \let\nonarrowing = t%
   \nonfillstart
-  \let\Eformat = \nonfillfinish
   \gobble
 }
-%
-% @smallformat (when @smallbook): @format plus smaller fonts.
-%
-\def\smallformatx{\begingroup
-  \def\Esmallformat{\nonfillfinish\endgroup}%
-  \smallexamplefonts \rm
-  \format
-}
-
-% @flushleft (same as @format).
-%
-\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+\let\Eflushleft = \afterenvbreak
 
 % @flushright.
 %
-\def\flushright{\begingroup
-  \let\nonarrowing = t
+\envdef\flushright{%
+  \let\nonarrowing = t%
   \nonfillstart
-  \let\Eflushright = \nonfillfinish
   \advance\leftskip by 0pt plus 1fill
   \gobble
 }
+\let\Eflushright = \afterenvbreak
 
 
 % @quotation does normal linebreaking (hence we can't use \nonfillstart)
-% and narrows the margins.
-%
-\def\quotation{%
-  \begingroup\inENV %This group ends at the end of the @quotation body
+% and narrows the margins.  We keep \parskip nonzero in general, since
+% we're doing normal filling.  So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\envdef\quotation{%
   {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
-  \singlespace
   \parindent=0pt
-  % We have retained a nonzero parskip for the environment, since we're
-  % doing normal filling. So to avoid extra space below the environment...
-  \def\Equotation{\parskip = 0pt \nonfillfinish}%
   %
   % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
   \ifx\nonarrowing\relax
     \advance\leftskip by \lispnarrowing
     \advance\rightskip by \lispnarrowing
     \exdentamount = \lispnarrowing
+  \else
     \let\nonarrowing = \relax
   \fi
+  \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+  \par
+  \ifx\quotationauthor\undefined\else
+    % indent a bit.
+    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+  \fi
+  {\parskip=0pt \afterenvbreak}%
+}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty \else
+    {\bf #1: }%
+  \fi
 }
 
 
@@ -4477,14 +5145,18 @@
 %
 % [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
 %
-% [Knuth] p. 344; only we need to do '@' too
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too.  Otherwise, they get lost as the first character on a
+% verbatim line.
 \def\dospecials{%
-  \do\ \do\\\do\@\do\{\do\}\do\$\do\&%
-  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~}
+  \do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+  \do\<\do\>\do\|\do\@\do+\do\"%
+}
 %
 % [Knuth] p. 380
 \def\uncatcodespecials{%
-  \def\do##1{\catcode`##1=12}\dospecials}
+  \def\do##1{\catcode`##1=\other}\dospecials}
 %
 % [Knuth] pp. 380,381,391
 % Disable Spanish ligatures ?` and !` of \tt font
@@ -4532,6 +5204,8 @@
   }
 \endgroup
 \def\setupverbatim{%
+  \let\nonarrowing = t%
+  \nonfillstart
   % Easiest (and conventionally used) font for verbatim
   \tt
   \def\par{\leavevmode\egroup\box0\endgraf}%
@@ -4553,7 +5227,7 @@
 %
 % [Knuth] p. 382; only eat outer {}
 \begingroup
-  \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12
+  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
   \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
 \endgroup
 %
@@ -4567,609 +5241,393 @@
 %
 % For Texinfo it's a lot easier than for LaTeX,
 % because texinfo's \verbatim doesn't stop at '\end{verbatim}':
-% we need not redefine '\', '{' and '}'
+% we need not redefine '\', '{' and '}'.
 %
 % Inspired by LaTeX's verbatim command set [latex.ltx]
-%% Include LaTeX hack for completeness -- never know
-%% \begingroup
-%% \catcode`|=0 \catcode`[=1
-%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active
-%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[
-%% #1|endgroup|def|Everbatim[]|end[verbatim]]
-%% |endgroup
+%
 \begingroup
   \catcode`\ =\active
-  \gdef\doverbatim#1@end verbatim{#1\end{verbatim}}
+  \obeylines %
+  % ignore everything up to the first ^^M, that's the newline at the end
+  % of the @verbatim input line itself.  Otherwise we get an extra blank
+  % line in the output.
+  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+  % We really want {...\end verbatim} in the body of the macro, but
+  % without the active space; thus we have to use \xdef and \gobble.
 \endgroup
 %
-\def\verbatim{%
-  \def\Everbatim{\nonfillfinish\endgroup}%
-  \begingroup
-    \nonfillstart
-    \advance\leftskip by -\defbodyindent
-    \begingroup\setupverbatim\doverbatim
-}
+\envdef\verbatim{%
+    \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
 
 % @verbatiminclude FILE - insert text of file in verbatim environment.
 %
-% Allow normal characters that we make active in the argument (a file name).
-\def\verbatiminclude{%
-  \begingroup
-    \catcode`\\=12
-    \catcode`~=12
-    \catcode`^=12
-    \catcode`_=12
-    \catcode`|=12
-    \catcode`<=12
-    \catcode`>=12
-    \catcode`+=12
-    \parsearg\doverbatiminclude
-}
-\def\setupverbatiminclude{%
-  \begingroup
-    \nonfillstart
-    \advance\leftskip by -\defbodyindent
-    \begingroup\setupverbatim
-}
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
 %
 \def\doverbatiminclude#1{%
-     % Restore active chars for included file.
-  \endgroup
-  \begingroup
-  \def\thisfile{#1}%
-  \expandafter\expandafter\setupverbatiminclude\input\thisfile
-  \endgroup\nonfillfinish\endgroup
+  {%
+    \makevalueexpandable
+    \setupverbatim
+    \input #1
+    \afterenvbreak
+  }%
 }
 
 % @copying ... @end copying.
 % Save the text away for @insertcopying later.
 %
-\newbox\copyingbox
-%
-\def\copying{\begingroup
-  \parindent = 0pt  % looks wrong on title page
-  \def\Ecopying{\egroup\endgroup}%
-  \global\setbox\copyingbox = \vbox\bgroup
-}
-
-% @insertcopying.
-%
-\def\insertcopying{\unvcopy\copyingbox}
-
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+  \begingroup
+    \parindent = 0pt  % paragraph indentation looks wrong on title page
+    \scanexp\copyingtext
+  \endgroup
+}
 
 \message{defuns,}
 % @defun etc.
 
-% Allow user to change definition object font (\df) internally
-\def\setdeffont #1 {\csname DEF#1\endcsname}
-
 \newskip\defbodyindent \defbodyindent=.4in
 \newskip\defargsindent \defargsindent=50pt
-\newskip\deftypemargin \deftypemargin=12pt
 \newskip\deflastargmargin \deflastargmargin=18pt
 
-\newcount\parencount
-% define \functionparens, which makes ( and ) and & do special things.
-% \functionparens affects the group it is contained in.
-\def\activeparens{%
-\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active
-\catcode`\[=\active \catcode`\]=\active}
-
-% Make control sequences which act like normal parenthesis chars.
-\let\lparen = ( \let\rparen = )
-
-{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
-
-% Be sure that we always have a definition for `(', etc.  For example,
-% if the fn name has parens in it, \boldbrax will not be in effect yet,
-% so TeX would otherwise complain about undefined control sequence.
-\global\let(=\lparen \global\let)=\rparen
-\global\let[=\lbrack \global\let]=\rbrack
-
-\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
-\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
-% This is used to turn on special parens
-% but make & act ordinary (given that it's active).
-\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
-
-% Definitions of (, ) and & used in args for functions.
-% This is the definition of ( outside of all parentheses.
-\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested
-  \global\advance\parencount by 1
-}
-%
-% This is the definition of ( when already inside a level of parens.
-\gdef\opnested{\char`\(\global\advance\parencount by 1 }
-%
-\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
-  % also in that case restore the outer-level definition of (.
-  \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
-  \global\advance \parencount by -1 }
-% If we encounter &foo, then turn on ()-hacking afterwards
-\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
-%
-\gdef\normalparens{\boldbrax\let&=\ampnr}
-} % End of definition inside \activeparens
-%% These parens (in \boldbrax) actually are a little bolder than the
-%% contained text.  This is especially needed for [ and ]
-\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
-\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
-\let\ampnr = \&
-\def\lbrb{{\bf\char`\[}}
-\def\rbrb{{\bf\char`\]}}
-
-% Active &'s sneak into the index arguments, so make sure it's defined.
-{
-  \catcode`& = 13
-  \global\let& = \ampnr
-}
-
-% First, defname, which formats the header line itself.
-% #1 should be the function name.
-% #2 should be the type of definition, such as "Function".
-
-\def\defname #1#2{%
-% Get the values of \leftskip and \rightskip as they were
-% outside the @def...
-\dimen2=\leftskip
-\advance\dimen2 by -\defbodyindent
-\noindent
-\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
-\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
-\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
-\parshape 2 0in \dimen0 \defargsindent \dimen1
-% Now output arg 2 ("Function" or some such)
-% ending at \deftypemargin from the right margin,
-% but stuck inside a box of width 0 so it does not interfere with linebreaking
-{% Adjust \hsize to exclude the ambient margins,
-% so that \rightline will obey them.
-\advance \hsize by -\dimen2
-\rlap{\rightline{{\rm #2}\hskip -1.25pc }}}%
-% Make all lines underfull and no complaints:
-\tolerance=10000 \hbadness=10000
-\advance\leftskip by -\defbodyindent
-\exdentamount=\defbodyindent
-{\df #1}\enskip        % Generate function name
-}
-
-% Common pieces to start any @def...
-% #1 is the \E... control sequence to end the definition (which we define).
-% #2 is the \...x control sequence (which our caller defines).
-% #3 is the control sequence to process the header, such as \defunheader.
-%
-\def\parsebodycommon#1#2#3{%
-  \begingroup\inENV
-  % If there are two @def commands in a row, we'll have a \nobreak,
-  % which is there to keep the function description together with its
-  % header.  But if there's nothing but headers, we want to allow a
-  % break after all.
-  \ifnum\lastpenalty = 10000 \penalty0 \fi
-  \medbreak
-  %
-  % Define the \E... end token that this defining construct specifies
-  % so that it will exit this group.
-  \def#1{\endgraf\endgroup\medbreak}%
+% Start the processing of @deffn:
+\def\startdefun{%
+  \ifnum\lastpenalty<10000
+    \medbreak
+  \else
+    % If there are two @def commands in a row, we'll have a \nobreak,
+    % which is there to keep the function description together with its
+    % header.  But if there's nothing but headers, we need to allow a
+    % break somewhere.  Check specifically for penalty 10002, inserted
+    % by \defargscommonending, instead of 10000, since the sectioning
+    % commands also insert a nobreak penalty, and we don't want to allow
+    % a break between a section heading and a defun.
+    % 
+    \ifnum\lastpenalty=10002 \penalty2000 \fi
+    %
+    % Similarly, after a section heading, do not allow a break.
+    % But do insert the glue.
+    \medskip  % preceded by discardable penalty, so not a breakpoint
+  \fi
   %
   \parindent=0in
   \advance\leftskip by \defbodyindent
   \exdentamount=\defbodyindent
 }
 
-% Process body of @defun, @deffn, @defmac, etc.
-%
-\def\defparsebody#1#2#3{%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
-  \catcode61=\active % 61 is `='
-  \begingroup\obeylines\activeparens
-  \spacesplit#3%
-}
-
-% #1, #2, #3 are the common arguments (see \defparsebody).
-% #4, delimited by the space, is the class name.
-%
-\def\defmethparsebody#1#2#3#4 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
-  \begingroup\obeylines\activeparens
-  \spacesplit{#3{#4}}%
-}
-
-% Used for @deftypemethod and @deftypeivar.
-% #1, #2, #3 are the common arguments (see \defparsebody).
-% #4, delimited by a space, is the class name.
-% #5 is the method's return type.
-%
-\def\deftypemethparsebody#1#2#3#4 #5 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 ##2 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}{##2}}}%
-  \begingroup\obeylines\activeparens
-  \spacesplit{#3{#4}{#5}}%
-}
-
-% Used for @deftypeop.  The change from \deftypemethparsebody is an
-% extra argument at the beginning which is the `category', instead of it
-% being the hardwired string `Method' or `Instance Variable'.  We have
-% to account for this both in the \...x definition and in parsing the
-% input at hand.  Thus also need a control sequence (passed as #5) for
-% the \E... definition to assign the category name to.
-%
-\def\deftypeopparsebody#1#2#3#4#5 #6 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 ##2 ##3 {%
-    \def#4{##1}%
-    \begingroup\obeylines\activeparens\spacesplit{#3{##2}{##3}}}%
-  \begingroup\obeylines\activeparens
-  \spacesplit{#3{#5}{#6}}%
-}
-
-% For @defop.
-\def\defopparsebody #1#2#3#4#5 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 ##2 {\def#4{##1}%
-    \begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
-  \begingroup\obeylines\activeparens
-  \spacesplit{#3{#5}}%
-}
-
-% These parsing functions are similar to the preceding ones
-% except that they do not make parens into active characters.
-% These are used for "variables" since they have no arguments.
-%
-\def\defvarparsebody #1#2#3{%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2{\begingroup\obeylines\spacesplit#3}%
-  \catcode61=\active %
-  \begingroup\obeylines
-  \spacesplit#3%
-}
-
-% @defopvar.
-\def\defopvarparsebody #1#2#3#4#5 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 ##2 {\def#4{##1}%
-    \begingroup\obeylines\spacesplit{#3{##2}}}%
-  \begingroup\obeylines
-  \spacesplit{#3{#5}}%
-}
-
-\def\defvrparsebody#1#2#3#4 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
-  \begingroup\obeylines
-  \spacesplit{#3{#4}}%
-}
-
-% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
-% type is just `struct', because we lose the braces in `{struct
-% termios}' when \spacesplit reads its undelimited argument.  Sigh.
-% \let\deftpparsebody=\defvrparsebody
-%
-% So, to get around this, we put \empty in with the type name.  That
-% way, TeX won't find exactly `{...}' as an undelimited argument, and
-% won't strip off the braces.
-%
-\def\deftpparsebody #1#2#3#4 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
-  \begingroup\obeylines
-  \spacesplit{\parsetpheaderline{#3{#4}}}\empty
-}
-
-% Fine, but then we have to eventually remove the \empty *and* the
-% braces (if any).  That's what this does.
-%
-\def\removeemptybraces\empty#1\relax{#1}
-
-% After \spacesplit has done its work, this is called -- #1 is the final
-% thing to call, #2 the type name (which starts with \empty), and #3
-% (which might be empty) the arguments.
-%
-\def\parsetpheaderline#1#2#3{%
-  #1{\removeemptybraces#2\relax}{#3}%
-}%
-
-% Split up #2 at the first space token.
-% call #1 with two arguments:
-%  the first is all of #2 before the space token,
-%  the second is all of #2 after that space token.
-% If #2 contains no space token, all of it is passed as the first arg
-% and the second is passed as empty.
-%
-{\obeylines
-\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%
-\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%
-\ifx\relax #3%
-#1{#2}{}\else #1{#2}{#3#4}\fi}}
-
-% Define @defun.
-
-% First, define the processing that is wanted for arguments of \defun
-% Use this to expand the args and terminate the paragraph they make up
-
-\def\defunargs#1{\functionparens \sl
-% Expand, preventing hyphenation at `-' chars.
-% Note that groups don't affect changes in \hyphenchar.
-% Set the font temporarily and use \font in case \setfont made \tensl a macro.
-{\tensl\hyphenchar\font=0}%
-#1%
-{\tensl\hyphenchar\font=45}%
-\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
-\interlinepenalty=10000
-\advance\rightskip by 0pt plus 1fil
-\endgraf\nobreak\vskip -\parskip\nobreak
-}
-
-\def\deftypefunargs #1{%
-% Expand, preventing hyphenation at `-' chars.
-% Note that groups don't affect changes in \hyphenchar.
-% Use \boldbraxnoamp, not \functionparens, so that & is not special.
-\boldbraxnoamp
-\tclose{#1}% avoid \code because of side effects on active chars
-\interlinepenalty=10000
-\advance\rightskip by 0pt plus 1fil
-\endgraf\nobreak\vskip -\parskip\nobreak
-}
-
-% Do complete processing of one @defun or @defunx line already parsed.
-
-% @deffn Command forward-char nchars
-
-\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
-
-\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
-\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defun == @deffn Function
-
-\def\defun{\defparsebody\Edefun\defunx\defunheader}
-
-\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{\putwordDeffunc}%
-\defunargs {#2}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @deftypefun int foobar (int @var{foo}, float @var{bar})
-
-\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
-
-% #1 is the data type.  #2 is the name and args.
-\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
-% #1 is the data type, #2 the name, #3 the args.
-\def\deftypefunheaderx #1#2 #3\relax{%
-\doind {fn}{\code{#2}}% Make entry in function index
-\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}%
-\deftypefunargs {#3}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
-
-\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
-
-% \defheaderxcond#1\relax$.$
-% puts #1 in @code, followed by a space, but does nothing if #1 is null.
-\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi}
-
-% #1 is the classification.  #2 is the data type.  #3 is the name and args.
-\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
-% #1 is the classification, #2 the data type, #3 the name, #4 the args.
-\def\deftypefnheaderx #1#2#3 #4\relax{%
-\doind {fn}{\code{#3}}% Make entry in function index
-\begingroup
-\normalparens % notably, turn off `&' magic, which prevents
-%               at least some C++ text from working
-\defname {\defheaderxcond#2\relax$.$#3}{#1}%
-\deftypefunargs {#4}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defmac == @deffn Macro
-
-\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
-
-\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{\putwordDefmac}%
-\defunargs {#2}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defspec == @deffn Special Form
-
-\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
-
-\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{\putwordDefspec}%
-\defunargs {#2}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defop CATEGORY CLASS OPERATION ARG...
-%
-\def\defop #1 {\def\defoptype{#1}%
-\defopparsebody\Edefop\defopx\defopheader\defoptype}
-%
-\def\defopheader#1#2#3{%
-\dosubind {fn}{\code{#2}}{\putwordon\ #1}% Make entry in function index
-\begingroup\defname {#2}{\defoptype\ \putwordon\ #1}%
-\defunargs {#3}\endgroup %
-}
-
-% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
-%
-\def\deftypeop #1 {\def\deftypeopcategory{#1}%
-  \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
-                       \deftypeopcategory}
-%
-% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
-\def\deftypeopheader#1#2#3#4{%
-  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+\def\dodefunx#1{%
+  % First, check whether we are in the right environment:
+  \checkenv#1%
+  %
+  % As above, allow line break if we have multiple x headers in a row.
+  % It's not a great place, though.
+  \ifnum\lastpenalty=10002 \penalty3000 \fi
+  %
+  % And now, it's time to reuse the body of the original defun:
+  \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
   \begingroup
-    \defname{\defheaderxcond#2\relax$.$#3}
-            {\deftypeopcategory\ \putwordon\ \code{#1}}%
-    \deftypefunargs{#4}%
-  \endgroup
-}
-
-% @deftypemethod CLASS TYPE METHOD ARG...
-%
-\def\deftypemethod{%
-  \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
-%
-% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
-\def\deftypemethodheader#1#2#3#4{%
-  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
-  \begingroup
-    \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}%
-    \deftypefunargs{#4}%
-  \endgroup
-}
-
-% @deftypeivar CLASS TYPE VARNAME
-%
-\def\deftypeivar{%
-  \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
-%
-% #1 is the class name, #2 the data type, #3 the variable name.
-\def\deftypeivarheader#1#2#3{%
-  \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
-  \begingroup
-    \defname{\defheaderxcond#2\relax$.$#3}
-            {\putwordInstanceVariableof\ \code{#1}}%
-    \defvarargs{#3}%
-  \endgroup
-}
-
-% @defmethod == @defop Method
-%
-\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
-%
-% #1 is the class name, #2 the method name, #3 the args.
-\def\defmethodheader#1#2#3{%
-  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
-  \begingroup
-    \defname{#2}{\putwordMethodon\ \code{#1}}%
-    \defunargs{#3}%
-  \endgroup
-}
-
-% @defcv {Class Option} foo-class foo-flag
-
-\def\defcv #1 {\def\defcvtype{#1}%
-\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
-
-\def\defcvarheader #1#2#3{%
-\dosubind {vr}{\code{#2}}{\putwordof\ #1}% Make entry in var index
-\begingroup\defname {#2}{\defcvtype\ \putwordof\ #1}%
-\defvarargs {#3}\endgroup %
-}
-
-% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
-%
-\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
-%
-\def\defivarheader#1#2#3{%
-  \dosubind {vr}{\code{#2}}{\putwordof\ #1}% entry in var index
-  \begingroup
-    \defname{#2}{\putwordInstanceVariableof\ #1}%
-    \defvarargs{#3}%
+    % call \deffnheader:
+    #1#2 \endheader
+    % common ending:
+    \interlinepenalty = 10000
+    \advance\rightskip by 0pt plus 1fil
+    \endgraf
+    \nobreak\vskip -\parskip
+    \penalty 10002  % signal to \startdefun and \dodefunx
+    % Some of the @defun-type tags do not enable magic parentheses,
+    % rendering the following check redundant.  But we don't optimize.
+    \checkparencounts
   \endgroup
 }
 
-% @defvar
-% First, define the processing that is wanted for arguments of @defvar.
-% This is actually simple: just print them in roman.
-% This must expand the args and terminate the paragraph they make up
-\def\defvarargs #1{\normalparens #1%
-\interlinepenalty=10000
-\endgraf\nobreak\vskip -\parskip\nobreak}
-
-% @defvr Counter foo-count
-
-\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
-
-\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
-\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
-
-% @defvar == @defvr Variable
-
-\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
-
-\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
-\begingroup\defname {#1}{\putwordDefvar}%
-\defvarargs {#2}\endgroup %
-}
-
-% @defopt == @defvr {User Option}
-
-\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
-
-\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
-\begingroup\defname {#1}{\putwordDefopt}%
-\defvarargs {#2}\endgroup %
-}
-
-% @deftypevar int foobar
-
-\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
-
-% #1 is the data type.  #2 is the name, perhaps followed by text that
-% is actually part of the data type, which should not be put into the index.
-\def\deftypevarheader #1#2{%
-\dovarind#2 \relax% Make entry in variables index
-\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}%
-\interlinepenalty=10000
-\endgraf\nobreak\vskip -\parskip\nobreak
-\endgroup}
-\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
-
-% @deftypevr {Global Flag} int enable
-
-\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
-
-\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
-\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1}
-\interlinepenalty=10000
-\endgraf\nobreak\vskip -\parskip\nobreak
-\endgroup}
-
-% Now define @deftp
-% Args are printed in bold, a slight difference from @defvar.
-
-\def\deftpargs #1{\bf \defvarargs{#1}}
-
-% @deftp Class window height width ...
-
-\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
-
-\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
-\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
-
-% These definitions are used if you use @defunx (etc.)
-% anywhere other than immediately after a @defun or @defunx.
-%
-\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
-\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
-\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
-\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
-\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
-\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
-\def\defopx#1 {\errmessage{@defopx in invalid context}}
-\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
-\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
-\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
-\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
-\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
-\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
-\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
-\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
-\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
-\def\defunx#1 {\errmessage{@defunx in invalid context}}
-\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
-\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remainnig is to define \deffnheader.
+%
+\def\makedefun#1{%
+  \expandafter\let\csname E#1\endcsname = \Edefun
+  \edef\temp{\noexpand\domakedefun
+    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+  \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+  \envdef#1{%
+    \startdefun
+    \parseargusing\activeparens{\printdefunline#3}%
+  }%
+  \def#2{\dodefunx#1}%
+  \def#3%
+}
+
+%%% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+  % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+  \dosubind{fn}{\code{#3}}{#1}%
+  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+%%% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{fn}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{vr}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+  \doind{tp}{\code{#2}}%
+  \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+  % Get the values of \leftskip and \rightskip as they were outside the @def...
+  \advance\leftskip by -\defbodyindent
+  %
+  % How we'll format the type name.  Putting it in brackets helps
+  % distinguish it from the body text that may end up on the next line
+  % just below it.
+  \def\temp{#1}%
+  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+  %
+  % Figure out line sizes for the paragraph shape.
+  % The first line needs space for \box0; but if \rightskip is nonzero,
+  % we need only space for the part of \box0 which exceeds it:
+  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
+  % The continuations:
+  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
+  % (plain.tex says that \dimen1 should be used only as global.)
+  \parshape 2 0in \dimen0 \defargsindent \dimen2
+  %
+  % Put the type name to the right margin.
+  \noindent
+  \hbox to 0pt{%
+    \hfil\box0 \kern-\hsize
+    % \hsize has to be shortened this way:
+    \kern\leftskip
+    % Intentionally do not respect \rightskip, since we need the space.
+  }%
+  %
+  % Allow all lines to be underfull without complaint:
+  \tolerance=10000 \hbadness=10000
+  \exdentamount=\defbodyindent
+  {%
+    % defun fonts. We use typewriter by default (used to be bold) because:
+    % . we're printing identifiers, they should be in tt in principle.
+    % . in languages with many accents, such as Czech or French, it's
+    %   common to leave accents off identifiers.  The result looks ok in
+    %   tt, but exceedingly strange in rm.
+    % . we don't want -- and --- to be treated as ligatures.
+    % . this still does not fix the ?` and !` ligatures, but so far no
+    %   one has made identifiers using them :).
+    \df \tt
+    \def\temp{#2}% return value type
+    \ifx\temp\empty\else \tclose{\temp} \fi
+    #3% output function name
+  }%
+  {\rm\enskip}% hskip 0.5 em of \tenrm
+  %
+  \boldbrax
+  % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name.  This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable.  Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+  % use sl by default (not ttsl),
+  % tt for the names.
+  \df \sl \hyphenchar\font=0
+  %
+  % On the other hand, if an argument has two dashes (for instance), we
+  % want a way to get ttsl.  Let's try @var for that.
+  \let\var=\ttslanted
+  #1%
+  \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+  \catcode`\(=\active \catcode`\)=\active
+  \catcode`\[=\active \catcode`\]=\active
+  \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc.  For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+  \activeparens
+  \global\let(=\lparen \global\let)=\rparen
+  \global\let[=\lbrack \global\let]=\rbrack
+  \global\let& = \&
+
+  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+  \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+  \ifampseen
+    % At the first level, print parens in roman,
+    % otherwise use the default font.
+    \ifnum \parencount=1 \rm \fi
+  \else
+    % The \sf parens (in \boldbrax) actually are a little bolder than
+    % the contained text.  This is especially needed for [ and ] .
+    \sf
+  \fi
+}
+\def\infirstlevel#1{%
+  \ifampseen
+    \ifnum\parencount=1
+      #1%
+    \fi
+  \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+  \global\advance\parencount by 1
+  {\parenfont(}%
+  \infirstlevel \bfafterword
+}
+\def\clnr{%
+  {\parenfont)}%
+  \infirstlevel \sl
+  \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+  \global\advance\brackcount by 1
+  {\bf[}%
+}
+\def\rbrb{%
+  {\bf]}%
+  \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+  \ifnum\parencount=0 \else \badparencount \fi
+  \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+\def\badparencount{%
+  \errmessage{Unbalanced parentheses in @def}%
+  \global\parencount=0
+}
+\def\badbrackcount{%
+  \errmessage{Unbalanced square braces in @def}%
+  \global\brackcount=0
+}
 
 
 \message{macros,}
@@ -5178,42 +5636,69 @@
 % To do this right we need a feature of e-TeX, \scantokens,
 % which we arrange to emulate with a temporary file in ordinary TeX.
 \ifx\eTeXversion\undefined
- \newwrite\macscribble
- \def\scanmacro#1{%
-   \begingroup \newlinechar`\^^M
-   % Undo catcode changes of \startcontents and \doprintindex
-   \catcode`\@=0 \catcode`\\=12 \escapechar=`\@
-   % Append \endinput to make sure that TeX does not see the ending newline.
-   \toks0={#1\endinput}%
-   \immediate\openout\macscribble=\jobname.tmp
-   \immediate\write\macscribble{\the\toks0}%
-   \immediate\closeout\macscribble
-   \let\xeatspaces\eatspaces
-   \input \jobname.tmp
-   \endgroup
-}
-\else
+  \newwrite\macscribble
+  \def\scantokens#1{%
+    \toks0={#1}%
+    \immediate\openout\macscribble=\jobname.tmp
+    \immediate\write\macscribble{\the\toks0}%
+    \immediate\closeout\macscribble
+    \input \jobname.tmp
+  }
+\fi
+
 \def\scanmacro#1{%
-\begingroup \newlinechar`\^^M
-% Undo catcode changes of \startcontents and \doprintindex
-\catcode`\@=0 \catcode`\\=12 \escapechar=`\@
-\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
-\fi
+  \begingroup
+    \newlinechar`\^^M
+    \let\xeatspaces\eatspaces
+    % Undo catcode changes of \startcontents and \doprintindex
+    % When called from @insertcopying or (short)caption, we need active
+    % backslash to get it printed correctly.  Previously, we had
+    % \catcode`\\=\other instead.  We'll see whether a problem appears
+    % with macro expansion.				--kasal, 19aug04
+    \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+    % ... and \example
+    \spaceisspace
+    %
+    % Append \endinput to make sure that TeX does not see the ending newline.
+    %
+    % I've verified that it is necessary both for e-TeX and for ordinary TeX
+    %							--kasal, 29nov03
+    \scantokens{#1\endinput}%
+  \endgroup
+}
+
+\def\scanexp#1{%
+  \edef\temp{\noexpand\scanmacro{#1}}%
+  \temp
+}
 
 \newcount\paramno   % Count of parameters
 \newtoks\macname    % Macro name
 \newif\ifrecursive  % Is it recursive?
-\def\macrolist{}    % List of all defined macros in the form
-                    % \do\macro1\do\macro2...
+
+% List of all defined macros in the form
+%    \definedummyword\macro1\definedummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+     \toks0 = \expandafter{\macrolist\definedummyword#1}%
+     \xdef\macrolist{\the\toks0}%
+}
 
 % Utility routines.
-% Thisdoes \let #1 = #2, except with \csnames.
+% This does \let #1 = #2, with \csnames; that is,
+%   \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+% 
 \def\cslet#1#2{%
-\expandafter\expandafter
-\expandafter\let
-\expandafter\expandafter
-\csname#1\endcsname
-\csname#2\endcsname}
+  \expandafter\let
+  \csname#1\expandafter\endcsname
+  \csname#2\endcsname
+}
 
 % Trim leading and trailing spaces off a string.
 % Concepts from aro-bend problem 15 (see CTAN).
@@ -5226,7 +5711,7 @@
 }
 
 % Trim a single trailing ^^M off a string.
-{\catcode`\^^M=12\catcode`\Q=3%
+{\catcode`\^^M=\other \catcode`\Q=3%
 \gdef\eatcr #1{\eatcra #1Q^^MQ}%
 \gdef\eatcra#1^^MQ{\eatcrb#1Q}%
 \gdef\eatcrb#1Q#2Q{#1}%
@@ -5240,30 +5725,36 @@
 % done by  making ^^M (\endlinechar) catcode 12 when reading the macro
 % body, and then making it the \newlinechar in \scanmacro.
 
+\def\scanctxt{%
+  \catcode`\"=\other
+  \catcode`\+=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\@=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\~=\other
+}
+
+\def\scanargctxt{%
+  \scanctxt
+  \catcode`\\=\other
+  \catcode`\^^M=\other
+}
+
 \def\macrobodyctxt{%
-  \catcode`\~=12
-  \catcode`\^=12
-  \catcode`\_=12
-  \catcode`\|=12
-  \catcode`\<=12
-  \catcode`\>=12
-  \catcode`\+=12
-  \catcode`\{=12
-  \catcode`\}=12
-  \catcode`\@=12
-  \catcode`\^^M=12
-  \usembodybackslash}
+  \scanctxt
+  \catcode`\{=\other
+  \catcode`\}=\other
+  \catcode`\^^M=\other
+  \usembodybackslash
+}
 
 \def\macroargctxt{%
-  \catcode`\~=12
-  \catcode`\^=12
-  \catcode`\_=12
-  \catcode`\|=12
-  \catcode`\<=12
-  \catcode`\>=12
-  \catcode`\+=12
-  \catcode`\@=12
-  \catcode`\\=12}
+  \scanctxt
+  \catcode`\\=\other
+}
 
 % \mbodybackslash is the definition of \ in @macro bodies.
 % It maps \foo\ => \csname macarg.foo\endcsname => #N
@@ -5294,42 +5785,39 @@
      \else \errmessage{Macro name \the\macname\space already defined}\fi
      \global\cslet{macsave.\the\macname}{\the\macname}%
      \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
-     % Add the macroname to \macrolist
-     \toks0 = \expandafter{\macrolist\do}%
-     \xdef\macrolist{\the\toks0
-       \expandafter\noexpand\csname\the\macname\endcsname}%
+     \addtomacrolist{\the\macname}%
   \fi
   \begingroup \macrobodyctxt
   \ifrecursive \expandafter\parsermacbody
   \else \expandafter\parsemacbody
   \fi}
 
-\def\unmacro{\parsearg\unmacroxxx}
-\def\unmacroxxx#1{%
+\parseargdef\unmacro{%
   \if1\csname ismacro.#1\endcsname
     \global\cslet{#1}{macsave.#1}%
     \global\expandafter\let \csname ismacro.#1\endcsname=0%
-    % Remove the macro name from \macrolist
+    % Remove the macro name from \macrolist:
     \begingroup
-      \edef\tempa{\expandafter\noexpand\csname#1\endcsname}%
-      \def\do##1{%
-        \def\tempb{##1}%
-        \ifx\tempa\tempb
-          % remove this
-        \else
-          \toks0 = \expandafter{\newmacrolist\do}%
-          \edef\newmacrolist{\the\toks0\expandafter\noexpand\tempa}%
-        \fi}%
-      \def\newmacrolist{}%
-      % Execute macro list to define \newmacrolist
-      \macrolist
-      \global\let\macrolist\newmacrolist
+      \expandafter\let\csname#1\endcsname \relax
+      \let\definedummyword\unmacrodo
+      \xdef\macrolist{\macrolist}%
     \endgroup
   \else
     \errmessage{Macro #1 not defined}%
   \fi
 }
 
+% Called by \do from \dounmacro on each macro.  The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+  \ifx #1\relax
+    % remove this
+  \else
+    \noexpand\definedummyword \noexpand#1%
+  \fi
+}
+
 % This makes use of the obscure feature that if the last token of a
 % <parameter list> is #, then the preceding argument is delimited by
 % an opening brace, and that opening brace is not consumed.
@@ -5439,31 +5927,29 @@
 % {.  If so it reads up to the closing }, if not, it reads the whole
 % line.  Whatever was read is then fed to the next control sequence
 % as an argument (by \parsebrace or \parsearg)
-\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
 \def\braceorlinexxx{%
   \ifx\nchar\bgroup\else
     \expandafter\parsearg
-  \fi \next}
-
-% We mant to disable all macros during \shipout so that they are not
-% expanded by \write.
-\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
-  \edef\next{\macrolist}\expandafter\endgroup\next}
+  \fi \macnamexxx}
 
 
 % @alias.
 % We need some trickery to remove the optional spaces around the equal
 % sign.  Just make them active and then expand them all to nothing.
-\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
 \def\aliasxxx #1{\aliasyyy#1\relax}
-\def\aliasyyy #1=#2\relax{\ignoreactivespaces
-\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
-           \expandafter\noexpand\csname#2\endcsname}%
-\expandafter\endgroup\next}
+\def\aliasyyy #1=#2\relax{%
+  {%
+    \expandafter\let\obeyedspace=\empty
+    \addtomacrolist{#1}%
+    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+  }%
+  \next
+}
 
 
 \message{cross references,}
-% @xref etc.
 
 \newwrite\auxfile
 
@@ -5475,56 +5961,68 @@
 \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
   node \samp{\ignorespaces#1{}}}
 
-% @node's job is to define \lastnode.
-\def\node{\ENVcheck\parsearg\nodezzz}
-\def\nodezzz#1{\nodexxx [#1,]}
-\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references.  The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross,  ,  , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
 \let\nwnode=\node
-\let\lastnode=\relax
-
-% The sectioning commands (@chapter, etc.) call these.
-\def\donoderef{%
-  \ifx\lastnode\relax\else
-    \expandafter\expandafter\expandafter\setref{\lastnode}%
-      {Ysectionnumberandtype}%
-    \global\let\lastnode=\relax
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node.  #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+  \ifx\lastnode\empty\else
+    \setref{\lastnode}{#1}%
+    \global\let\lastnode=\empty
   \fi
 }
-\def\unnumbnoderef{%
-  \ifx\lastnode\relax\else
-    \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}%
-    \global\let\lastnode=\relax
-  \fi
-}
-\def\appendixnoderef{%
-  \ifx\lastnode\relax\else
-    \expandafter\expandafter\expandafter\setref{\lastnode}%
-      {Yappendixletterandtype}%
-    \global\let\lastnode=\relax
-  \fi
-}
-
 
 % @anchor{NAME} -- define xref target at arbitrary point.
 %
 \newcount\savesfregister
-\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
-\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
-\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
-
-% \setref{NAME}{SNT} defines a cross-reference point NAME, namely
-% NAME-title, NAME-pg, and NAME-SNT.  Called from \foonoderef.  We have
-% to set \indexdummies so commands such as @code in a section title
-% aren't expanded.  It would be nicer not to expand the titles in the
-% first place, but there's so many layers that that is hard to do.
-%
-\def\setref#1#2{{%
-  \indexdummies
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \thissection,
+%                 or the anchor name.
+% 2) NAME-snt   - section number and type, passed as the SNT arg, or
+%                 empty for anchors.
+% 3) NAME-pg    - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat.  In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof   - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
   \pdfmkdest{#1}%
-  \dosetq{#1-title}{Ytitle}%
-  \dosetq{#1-pg}{Ypagenumber}%
-  \dosetq{#1-snt}{#2}%
-}}
+  \iflinks
+    {%
+      \atdummies  % preserve commands, but don't expand them
+      \edef\writexrdef##1##2{%
+	\write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+	  ##1}{##2}}% these are parameters of \writexrdef
+      }%
+      \toks0 = \expandafter{\thissection}%
+      \immediate \writexrdef{title}{\the\toks0 }%
+      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+      \writexrdef{pg}{\folio}% will be written later, during \shipout
+    }%
+  \fi
+}
 
 % @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
 % the node name, #2 the name of the Info cross-reference, #3 the printed
@@ -5537,137 +6035,159 @@
 \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
   \unsepspaces
   \def\printedmanual{\ignorespaces #5}%
-  \def\printednodename{\ignorespaces #3}%
-  \setbox1=\hbox{\printedmanual}%
-  \setbox0=\hbox{\printednodename}%
+  \def\printedrefname{\ignorespaces #3}%
+  \setbox1=\hbox{\printedmanual\unskip}%
+  \setbox0=\hbox{\printedrefname\unskip}%
   \ifdim \wd0 = 0pt
     % No printed node name was explicitly given.
     \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
       % Use the node name inside the square brackets.
-      \def\printednodename{\ignorespaces #1}%
+      \def\printedrefname{\ignorespaces #1}%
     \else
       % Use the actual chapter/section title appear inside
       % the square brackets.  Use the real section title if we have it.
       \ifdim \wd1 > 0pt
         % It is in another manual, so we don't have it.
-        \def\printednodename{\ignorespaces #1}%
+        \def\printedrefname{\ignorespaces #1}%
       \else
         \ifhavexrefs
           % We know the real title if we have the xref values.
-          \def\printednodename{\refx{#1-title}{}}%
+          \def\printedrefname{\refx{#1-title}{}}%
         \else
           % Otherwise just copy the Info node name.
-          \def\printednodename{\ignorespaces #1}%
+          \def\printedrefname{\ignorespaces #1}%
         \fi%
       \fi
     \fi
   \fi
   %
-  % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
-  % insert empty discretionaries after hyphens, which means that it will
-  % not find a line break at a hyphen in a node names.  Since some manuals
-  % are best written with fairly long node names, containing hyphens, this
-  % is a loss.  Therefore, we give the text of the node name again, so it
-  % is as if TeX is seeing it for the first time.
+  % Make link in pdf output.
   \ifpdf
     \leavevmode
     \getfilename{#4}%
-    {\normalturnoffactive
+    {\turnoffactive
+     % See comments at \activebackslashdouble.
+     {\activebackslashdouble \xdef\pdfxrefdest{#1}%
+      \backslashparens\pdfxrefdest}%
+     %
      \ifnum\filenamelength>0
        \startlink attr{/Border [0 0 0]}%
-         goto file{\the\filename.pdf} name{#1}%
+         goto file{\the\filename.pdf} name{\pdfxrefdest}%
      \else
        \startlink attr{/Border [0 0 0]}%
-         goto name{#1}%
+         goto name{\pdfmkpgn{\pdfxrefdest}}%
      \fi
     }%
     \linkcolor
   \fi
   %
-  \ifdim \wd1 > 0pt
-    \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
+  % Float references are printed completely differently: "Figure 1.2"
+  % instead of "[somenode], p.3".  We distinguish them by the
+  % LABEL-title being set to a magic string.
+  {%
+    % Have to otherify everything special to allow the \csname to
+    % include an _ in the xref name, etc.
+    \indexnofonts
+    \turnoffactive
+    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+      \csname XR#1-title\endcsname
+  }%
+  \iffloat\Xthisreftitle
+    % If the user specified the print name (third arg) to the ref,
+    % print it instead of our usual "Figure 1.2".
+    \ifdim\wd0 = 0pt
+      \refx{#1-snt}{}%
+    \else
+      \printedrefname
+    \fi
+    %
+    % if the user also gave the printed manual name (fifth arg), append
+    % "in MANUALNAME".
+    \ifdim \wd1 > 0pt
+      \space \putwordin{} \cite{\printedmanual}%
+    \fi
   \else
-    % _ (for example) has to be the character _ for the purposes of the
-    % control sequence corresponding to the node, but it has to expand
-    % into the usual \leavevmode...\vrule stuff for purposes of
-    % printing. So we \turnoffactive for the \refx-snt, back on for the
-    % printing, back off for the \refx-pg.
-    {\normalturnoffactive
-     % Only output a following space if the -snt ref is nonempty; for
-     % @unnumbered and @anchor, it won't be.
-     \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
-     \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
-    }%
-    % [mynode],
-    [\printednodename],\space
-    % page 3
-    \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+    % node/anchor (non-float) references.
+    %
+    % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+    % insert empty discretionaries after hyphens, which means that it will
+    % not find a line break at a hyphen in a node names.  Since some manuals
+    % are best written with fairly long node names, containing hyphens, this
+    % is a loss.  Therefore, we give the text of the node name again, so it
+    % is as if TeX is seeing it for the first time.
+    \ifdim \wd1 > 0pt
+      \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
+    \else
+      % _ (for example) has to be the character _ for the purposes of the
+      % control sequence corresponding to the node, but it has to expand
+      % into the usual \leavevmode...\vrule stuff for purposes of
+      % printing. So we \turnoffactive for the \refx-snt, back on for the
+      % printing, back off for the \refx-pg.
+      {\turnoffactive
+       % Only output a following space if the -snt ref is nonempty; for
+       % @unnumbered and @anchor, it won't be.
+       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+      }%
+      % output the `[mynode]' via a macro so it can be overridden.
+      \xrefprintnodename\printedrefname
+      %
+      % But we always want a comma and a space:
+      ,\space
+      %
+      % output the `page 3'.
+      \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+    \fi
   \fi
   \endlink
 \endgroup}
 
-% \dosetq is the interface for calls from other macros
-
-% Use \normalturnoffactive so that punctuation chars such as underscore
-% and backslash work in node names.  (\turnoffactive doesn't do \.)
-\def\dosetq#1#2{%
-  {\let\folio=0%
-   \normalturnoffactive
-   \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
-   \iflinks
-     \next
-   \fi
-  }%
-}
-
-% \internalsetq {foo}{page} expands into
-% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
-% When the aux file is read, ' is the escape character
-
-\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}}
-
-% Things to be expanded by \internalsetq
-
-\def\Ypagenumber{\folio}
-
-\def\Ytitle{\thissection}
-
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output.  It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents.  Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
 \def\Ynothing{}
-
-\def\Ysectionnumberandtype{%
-\ifnum\secno=0 \putwordChapter\xreftie\the\chapno %
-\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno %
-\else \ifnum \subsubsecno=0 %
-\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno %
-\else %
-\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
-\fi \fi \fi }
-
-\def\Yappendixletterandtype{%
-\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}%
-\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno %
-\else \ifnum \subsubsecno=0 %
-\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
-\else %
-\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
-\fi \fi \fi }
-
-\gdef\xreftie{'tie}
-
-% Use TeX 3.0's \inputlineno to get the line number, for better error
-% messages, but if we're using an old version of TeX, don't do anything.
-%
-\ifx\inputlineno\thisisundefined
-  \let\linenumber = \empty % Non-3.0.
-\else
-  \def\linenumber{\the\inputlineno:\space}
-\fi
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+  \ifnum\secno=0
+    \putwordChapter@tie \the\chapno
+  \else \ifnum\subsecno=0
+    \putwordSection@tie \the\chapno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+\def\Yappendix{%
+  \ifnum\secno=0
+     \putwordAppendix@tie @char\the\appendixno{}%
+  \else \ifnum\subsecno=0
+     \putwordSection@tie @char\the\appendixno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie
+      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
 
 % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
 % If its value is nonempty, SUFFIX is output afterward.
-
+%
 \def\refx#1#2{%
-  \expandafter\ifx\csname X#1\endcsname\relax
+  {%
+    \indexnofonts
+    \otherbackslash
+    \expandafter\global\expandafter\let\expandafter\thisrefX
+      \csname XR#1\endcsname
+  }%
+  \ifx\thisrefX\relax
     % If not defined, say something at least.
     \angleleft un\-de\-fined\angleright
     \iflinks
@@ -5682,22 +6202,50 @@
     \fi
   \else
     % It's defined, so just use it.
-    \csname X#1\endcsname
+    \thisrefX
   \fi
   #2% Output the suffix in any case.
 }
 
-% This is the macro invoked by entries in the aux file.
-%
-\def\xrdef#1{\begingroup
-  % Reenable \ as an escape while reading the second argument.
-  \catcode`\\ = 0
-  \afterassignment\endgroup
-  \expandafter\gdef\csname X#1\endcsname
+% This is the macro invoked by entries in the aux file.  Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions).  But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+  \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
+  %
+  % Was that xref control sequence that we just defined for a float?
+  \expandafter\iffloat\csname XR#1\endcsname
+    % it was a float, and we have the (safe) float type in \iffloattype.
+    \expandafter\let\expandafter\floatlist
+      \csname floatlist\iffloattype\endcsname
+    %
+    % Is this the first time we've seen this float type?
+    \expandafter\ifx\floatlist\relax
+      \toks0 = {\do}% yes, so just \do
+    \else
+      % had it before, so preserve previous elements in list.
+      \toks0 = \expandafter{\floatlist\do}%
+    \fi
+    %
+    % Remember this xref in the control sequence \floatlistFLOATTYPE,
+    % for later use in \listoffloats.
+    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}%
+  \fi
 }
 
 % Read the last existing aux file, if any.  No error if none exists.
-\def\readauxfile{\begingroup
+%
+\def\tryauxfile{%
+  \openin 1 \jobname.aux
+  \ifeof 1 \else
+    \readdatafile{aux}%
+    \global\havexrefstrue
+  \fi
+  \closein 1
+}
+
+\def\setupdatafile{%
   \catcode`\^^@=\other
   \catcode`\^^A=\other
   \catcode`\^^B=\other
@@ -5725,9 +6273,7 @@
   \catcode`\^^]=\other
   \catcode`\^^^=\other
   \catcode`\^^_=\other
-  \catcode`\@=\other
-  \catcode`\^=\other
-  % It was suggested to define this as 7, which would allow ^^e4 etc.
+  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
   % in xref tags, i.e., node names.  But since ^^e4 notation isn't
   % supported in the main text, it doesn't seem desirable.  Furthermore,
   % that is not enough: for node names that actually contain a ^
@@ -5740,6 +6286,9 @@
   % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
   % and then to call \auxhat in \setq.
   %
+  \catcode`\^=\other
+  %
+  % Special characters.  Should be turned off anyway, but...
   \catcode`\~=\other
   \catcode`\[=\other
   \catcode`\]=\other
@@ -5751,41 +6300,42 @@
   \catcode`\$=\other
   \catcode`\#=\other
   \catcode`\&=\other
+  \catcode`\%=\other
   \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
-  % Make the characters 128-255 be printing characters
+  %
+  % This is to support \ in node names and titles, since the \
+  % characters end up in a \csname.  It's easier than
+  % leaving it active and making its active definition an actual \
+  % character.  What I don't understand is why it works in the *value*
+  % of the xrdef.  Seems like it should be a catcode12 \, and that
+  % should not typeset properly.  But it works, so I'm moving on for
+  % now.  --karl, 15jan04.
+  \catcode`\\=\other
+  %
+  % Make the characters 128-255 be printing characters.
   {%
-    \count 1=128
+    \count1=128
     \def\loop{%
-      \catcode\count 1=\other
-      \advance\count 1 by 1
-      \ifnum \count 1<256 \loop \fi
+      \catcode\count1=\other
+      \advance\count1 by 1
+      \ifnum \count1<256 \loop \fi
     }%
   }%
-  % The aux file uses ' as the escape (for now).
-  % Turn off \ as an escape so we do not lose on
-  % entries which were dumped with control sequences in their names.
-  % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^
-  % Reference to such entries still does not work the way one would wish,
-  % but at least they do not bomb out when the aux file is read in.
+  %
+  % @ is our escape character in .aux files, and we need braces.
   \catcode`\{=1
   \catcode`\}=2
-  \catcode`\%=\other
-  \catcode`\'=0
-  \catcode`\\=\other
-  %
-  \openin 1 \jobname.aux
-  \ifeof 1 \else
-    \closein 1
-    \input \jobname.aux
-    \global\havexrefstrue
-    \global\warnedobstrue
-  \fi
-  % Open the new aux file.  TeX will close it automatically at exit.
-  \openout\auxfile=\jobname.aux
+  \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+  \setupdatafile
+  \input\jobname.#1
 \endgroup}
 
-
-% Footnotes.
+\message{insertions,}
+% including footnotes.
 
 \newcount \footnoteno
 
@@ -5799,37 +6349,39 @@
 % @footnotestyle is meaningful for info output only.
 \let\footnotestyle=\comment
 
-\let\ptexfootnote=\footnote
-
 {\catcode `\@=11
 %
 % Auto-number footnotes.  Otherwise like plain.
 \gdef\footnote{%
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
   \global\advance\footnoteno by \@ne
   \edef\thisfootno{$^{\the\footnoteno}$}%
   %
   % In case the footnote comes at the end of a sentence, preserve the
   % extra spacing after we do the footnote number.
   \let\@sf\empty
-  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
   %
   % Remove inadvertent blank space before typesetting the footnote number.
   \unskip
   \thisfootno\@sf
-  \footnotezzz
+  \dofootnote
 }%
 
 % Don't bother with the trickery in plain.tex to not require the
 % footnote text as a parameter.  Our footnotes don't need to be so general.
 %
-% Oh yes, they do; otherwise, @ifset and anything else that uses
-% \parseargline fail inside footnotes because the tokens are fixed when
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
 % the footnote is read.  --karl, 16nov96.
 %
-\long\gdef\footnotezzz{\insert\footins\bgroup
+\gdef\dofootnote{%
+  \insert\footins\bgroup
   % We want to typeset this text as a normal paragraph, even if the
   % footnote reference occurs in (for example) a display environment.
   % So reset some parameters.
+  \hsize=\pagewidth
   \interlinepenalty\interfootnotelinepenalty
   \splittopskip\ht\strutbox % top baseline for broken footnotes
   \splitmaxdepth\dp\strutbox
@@ -5859,48 +6411,68 @@
   \footstrut
   \futurelet\next\fo@t
 }
-\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t
-  \else\let\next\f@t\fi \next}
-\def\f@@t{\bgroup\aftergroup\@foot\let\next}
-\def\f@t#1{#1\@foot}
-\def\@foot{\strut\par\egroup}
-
 }%end \catcode `\@=11
 
-% @| inserts a changebar to the left of the current line.  It should
-% surround any changed text.  This approach does *not* work if the
-% change spans more than two lines of output.  To handle that, we would
-% have adopt a much more difficult approach (putting marks into the main
-% vertical list for the beginning and end of each change).
-%
-\def\|{%
-  % \vadjust can only be used in horizontal mode.
-  \leavevmode
-  %
-  % Append this vertical mode material after the current line in the output.
-  \vadjust{%
-    % We want to insert a rule with the height and depth of the current
-    % leading; that is exactly what \strutbox is supposed to record.
-    \vskip-\baselineskip
-    %
-    % \vadjust-items are inserted at the left edge of the type.  So
-    % the \llap here moves out into the left-hand margin.
-    \llap{%
-      %
-      % For a thicker or thinner bar, change the `1pt'.
-      \vrule height\baselineskip width1pt
-      %
-      % This is the space between the bar and the text.
-      \hskip 12pt
-    }%
-  }%
-}
-
-% For a final copy, take out the rectangles
-% that mark overfull boxes (in case you have decided
-% that the text looks ok even though it passes the margin).
-%
-\def\finalout{\overfullrule=0pt}
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished.  Otherwise, the insertion
+% would be lost.
+% Similarily, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes.  --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+  \ifx \insert\ptexinsert
+    \let\insert\saveinsert
+  \else
+    \let\checkinserts\relax
+  \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+  \afterassignment\next
+  % swallow the left brace
+  \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+    {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
+  \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+  \next
+}
+\def\newsaveinsX #1{%
+  \csname newbox\endcsname #1%
+  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+    \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
 
 % @image.  We use the macros from epsf.tex to support this.
 % If epsf.tex is not installed and @image is used, we complain.
@@ -5910,12 +6482,12 @@
 % undone and the next image would fail.
 \openin 1 = epsf.tex
 \ifeof 1 \else
-  \closein 1
-  % Do not bother showing banner with post-v2.7 epsf.tex (available in
-  % doc/epsf.tex until it shows up on ctan).
+  % Do not bother showing banner with epsf.tex v2.7k (available in
+  % doc/epsf.tex and on ctan).
   \def\epsfannounce{\toks0 = }%
   \input epsf.tex
 \fi
+\closein 1
 %
 % We will only complain once about lack of epsf.tex.
 \newif\ifwarnednoepsf
@@ -5954,7 +6526,7 @@
     % above and below.
     \nobreak\vskip\parskip
     \nobreak
-    \line\bgroup\hss
+    \line\bgroup
   \fi
   %
   % Output the image.
@@ -5967,10 +6539,275 @@
     \epsfbox{#1.eps}%
   \fi
   %
-  \ifimagevmode \hss \egroup \bigbreak \fi  % space after the image
+  \ifimagevmode \egroup \bigbreak \fi  % space after the image
 \endgroup}
 
 
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc.  We don't actually implement floating yet, we always include the
+% float "here".  But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label.  Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored.  It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+  \let\thiscaption=\empty
+  \let\thisshortcaption=\empty
+  %
+  % don't lose footnotes inside @float.
+  %
+  % BEWARE: when the floats start float, we have to issue warning whenever an
+  % insert appears inside a float which could possibly float. --kasal, 26may04
+  %
+  \startsavinginserts
+  %
+  % We can't be used inside a paragraph.
+  \par
+  %
+  \vtop\bgroup
+    \def\floattype{#1}%
+    \def\floatlabel{#2}%
+    \def\floatloc{#3}% we do nothing with this yet.
+    %
+    \ifx\floattype\empty
+      \let\safefloattype=\empty
+    \else
+      {%
+        % the floattype might have accents or other special characters,
+        % but we need to use it in a control sequence name.
+        \indexnofonts
+        \turnoffactive
+        \xdef\safefloattype{\floattype}%
+      }%
+    \fi
+    %
+    % If label is given but no type, we handle that as the empty type.
+    \ifx\floatlabel\empty \else
+      % We want each FLOATTYPE to be numbered separately (Figure 1,
+      % Table 1, Figure 2, ...).  (And if no label, no number.)
+      %
+      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+      \global\advance\floatno by 1
+      %
+      {%
+        % This magic value for \thissection is output by \setref as the
+        % XREFLABEL-title value.  \xrefX uses it to distinguish float
+        % labels (which have a completely different output format) from
+        % node and anchor labels.  And \xrdef uses it to construct the
+        % lists of floats.
+        %
+        \edef\thissection{\floatmagic=\safefloattype}%
+        \setref{\floatlabel}{Yfloat}%
+      }%
+    \fi
+    %
+    % start with \parskip glue, I guess.
+    \vskip\parskip
+    %
+    % Don't suppress indentation if a float happens to start a section.
+    \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption:    Foo 1.1
+% @float Foo & @caption{Cap}:     Foo: Cap
+% @float Foo & no caption:        Foo
+% @float ,lbl & Caption{Cap}:     1.1: Cap
+% @float ,lbl & no caption:       1.1
+% @float & @caption{Cap}:         Cap
+% @float & no caption:
+%
+\def\Efloat{%
+    \let\floatident = \empty
+    %
+    % In all cases, if we have a float type, it comes first.
+    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+    %
+    % If we have an xref label, the number comes next.
+    \ifx\floatlabel\empty \else
+      \ifx\floattype\empty \else % if also had float type, need tie first.
+        \appendtomacro\floatident{\tie}%
+      \fi
+      % the number.
+      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+    \fi
+    %
+    % Start the printed caption with what we've constructed in
+    % \floatident, but keep it separate; we need \floatident again.
+    \let\captionline = \floatident
+    %
+    \ifx\thiscaption\empty \else
+      \ifx\floatident\empty \else
+	\appendtomacro\captionline{: }% had ident, so need a colon between
+      \fi
+      %
+      % caption text.
+      \appendtomacro\captionline{\scanexp\thiscaption}%
+    \fi
+    %
+    % If we have anything to print, print it, with space before.
+    % Eventually this needs to become an \insert.
+    \ifx\captionline\empty \else
+      \vskip.5\parskip
+      \captionline
+      %
+      % Space below caption.
+      \vskip\parskip
+    \fi
+    %
+    % If have an xref label, write the list of floats info.  Do this
+    % after the caption, to avoid chance of it being a breakpoint.
+    \ifx\floatlabel\empty \else
+      % Write the text that goes in the lof to the aux file as
+      % \floatlabel-lof.  Besides \floatident, we include the short
+      % caption if specified, else the full caption if specified, else nothing.
+      {%
+        \atdummies
+        %
+        % since we read the caption text in the macro world, where ^^M
+        % is turned into a normal character, we have to scan it back, so
+        % we don't write the literal three characters "^^M" into the aux file.
+	\scanexp{%
+	  \xdef\noexpand\gtemp{%
+	    \ifx\thisshortcaption\empty
+	      \thiscaption
+	    \else
+	      \thisshortcaption
+	    \fi
+	  }%
+	}%
+        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+	  \ifx\gtemp\empty \else : \gtemp \fi}}%
+      }%
+    \fi
+  \egroup  % end of \vtop
+  %
+  % place the captured inserts
+  %
+  % BEWARE: when the floats start floating, we have to issue warning
+  % whenever an insert appears inside a float which could possibly
+  % float. --kasal, 26may04
+  %
+  \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+  \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use.  Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+  \ifx#1\relax
+      % Haven't seen this figure type before.
+      \csname newcount\endcsname #1%
+      %
+      % Remember to reset this floatno at the next chap.
+      \expandafter\gdef\expandafter\resetallfloatnos
+        \expandafter{\resetallfloatnos #1=0 }%
+  \fi
+  \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref.  That is, the magic
+% \thissection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
+% (safe) float type for this float.  We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+  \def\temp{#1}%
+  \def\iffloattype{#2}%
+  \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+  \def\floattype{#1}% floattype
+  {%
+    % the floattype might have accents or other special characters,
+    % but we need to use it in a control sequence name.
+    \indexnofonts
+    \turnoffactive
+    \xdef\safefloattype{\floattype}%
+  }%
+  %
+  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+    \ifhavexrefs
+      % if the user said @listoffloats foo but never @float foo.
+      \message{\linenumber No `\safefloattype' floats to list.}%
+    \fi
+  \else
+    \begingroup
+      \leftskip=\tocindent  % indent these entries like a toc
+      \let\do=\listoffloatsdo
+      \csname floatlist\safefloattype\endcsname
+    \endgroup
+  \fi
+}
+
+% This is called on each entry in a list of floats.  We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file.  We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+  % Can't fully expand XR#1-lof because it can contain anything.  Just
+  % pass the control sequence.  On the other hand, XR#1-pg is just the
+  % page number, and we want to fully expand that so we can get a link
+  % in pdf output.
+  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+  %
+  % use the same \entry macro we use to generate the TOC and index.
+  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+  \writeentry
+}}
+
 \message{localization,}
 % and i18n.
 
@@ -5979,19 +6816,17 @@
 % properly.  Single argument is the language abbreviation.
 % It would be nice if we could set up a hyphenation file here.
 %
-\def\documentlanguage{\parsearg\dodocumentlanguage}
-\def\dodocumentlanguage#1{%
+\parseargdef\documentlanguage{%
   \tex % read txi-??.tex file in plain TeX.
-  % Read the file if it exists.
-  \openin 1 txi-#1.tex
-  \ifeof1
-    \errhelp = \nolanghelp
-    \errmessage{Cannot read language file txi-#1.tex}%
-    \let\temp = \relax
-  \else
-    \def\temp{\input txi-#1.tex }%
-  \fi
-  \temp
+    % Read the file if it exists.
+    \openin 1 txi-#1.tex
+    \ifeof 1
+      \errhelp = \nolanghelp
+      \errmessage{Cannot read language file txi-#1.tex}%
+    \else
+      \input txi-#1.tex
+    \fi
+    \closein 1
   \endgroup
 }
 \newhelp\nolanghelp{The given language definition file cannot be found or
@@ -6036,12 +6871,14 @@
   \fi
 }
 
-% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
-% 4) hoffset; 5) binding offset; 6) topskip.  We also call
-% \setleading{\textleading}, so the caller should define \textleading.
-% The caller should also set \parskip.
-%
-\def\internalpagesizes#1#2#3#4#5#6{%
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading.  The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
   \voffset = #3\relax
   \topskip = #6\relax
   \splittopskip = \topskip
@@ -6060,55 +6897,88 @@
   \normaloffset = #4\relax
   \bindingoffset = #5\relax
   %
+  \ifpdf
+    \pdfpageheight #7\relax
+    \pdfpagewidth #8\relax
+  \fi
+  %
   \setleading{\textleading}
   %
   \parindent = \defaultparindent
   \setemergencystretch
 }
 
-% Use `small' versions.
-%
-\def\smallenvironments{%
-  \let\smalldisplay = \smalldisplayx
-  \let\smallexample = \smalllispx
-  \let\smallformat = \smallformatx
-  \let\smalllisp = \smalllispx
-}
-
 % @letterpaper (the default).
 \def\letterpaper{{\globaldefs = 1
   \parskip = 3pt plus 2pt minus 1pt
   \textleading = 13.2pt
   %
   % If page is nothing but text, make it come out even.
-  \internalpagesizes{46\baselineskip}{6in}{\voffset}{.25in}{\bindingoffset}{36pt}%
+  \internalpagesizes{46\baselineskip}{6in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{36pt}%
+                    {11in}{8.5in}%
 }}
 
-% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+% Use @smallbook to reset parameters for 7x9.25 trim size.
 \def\smallbook{{\globaldefs = 1
   \parskip = 2pt plus 1pt
   \textleading = 12pt
   %
-  \internalpagesizes{7.5in}{5.in}{\voffset}{.25in}{\bindingoffset}{16pt}%
+  \internalpagesizes{7.5in}{5in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{16pt}%
+                    {9.25in}{7in}%
   %
   \lispnarrowing = 0.3in
   \tolerance = 700
   \hfuzz = 1pt
   \contentsrightmargin = 0pt
-  \deftypemargin = 0pt
   \defbodyindent = .5cm
-  \smallenvironments
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+  \parskip = 1.5pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.4in}{4.8in}%
+                    {-.2in}{-.4in}%
+                    {0pt}{14pt}%
+                    {9in}{6in}%
+  %
+  \lispnarrowing = 0.25in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .4cm
 }}
 
 % Use @afourpaper to print on European A4 paper.
 \def\afourpaper{{\globaldefs = 1
   \parskip = 3pt plus 2pt minus 1pt
-  \textleading = 12pt
-  %
-  \internalpagesizes{53\baselineskip}{160mm}{\voffset}{4mm}{\bindingoffset}{44pt}%
+  \textleading = 13.2pt
+  %
+  % Double-side printing via postscript on Laserjet 4050
+  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+  % To change the settings for a different printer or situation, adjust
+  % \normaloffset until the front-side and back-side texts align.  Then
+  % do the same for \bindingoffset.  You can set these for testing in
+  % your texinfo source file like this:
+  % @tex
+  % \global\normaloffset = -6mm
+  % \global\bindingoffset = 10mm
+  % @end tex
+  \internalpagesizes{51\baselineskip}{160mm}
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{44pt}%
+                    {297mm}{210mm}%
   %
   \tolerance = 700
   \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 5mm
 }}
 
 % Use @afivepaper to print on European A5 paper.
@@ -6118,44 +6988,46 @@
   \parskip = 2pt plus 1pt minus 0.1pt
   \textleading = 12.5pt
   %
-  \internalpagesizes{166mm}{120mm}{\voffset}{-8mm}{\bindingoffset}{8pt}%
+  \internalpagesizes{160mm}{120mm}%
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{8pt}%
+                    {210mm}{148mm}%
   %
   \lispnarrowing = 0.2in
   \tolerance = 800
   \hfuzz = 1.2pt
-  \contentsrightmargin = 0mm
-  \deftypemargin = 0pt
+  \contentsrightmargin = 0pt
   \defbodyindent = 2mm
   \tableindent = 12mm
-  %
-  \smallenvironments
 }}
 
-% A specific text layout, 24x15cm overall, intended for A4 paper.  Top margin
-% 29mm, hence bottom margin 28mm, nominal side margin 3cm.
+% A specific text layout, 24x15cm overall, intended for A4 paper.
 \def\afourlatex{{\globaldefs = 1
-  \textleading = 13.6pt
-  %
   \afourpaper
-  \internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}%
-  %
-  % Must explicitly reset to 0 because we call \afourpaper, apparently,
-  % although this does not entirely make sense.
+  \internalpagesizes{237mm}{150mm}%
+                    {\voffset}{4.6mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  %
+  % Must explicitly reset to 0 because we call \afourpaper.
   \globaldefs = 0
 }}
 
-% Use @afourwide to print on European A4 paper in wide format.
-\def\afourwide{%
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
   \afourpaper
-  \internalpagesizes{6.5in}{9.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}%
-}
+  \internalpagesizes{241mm}{165mm}%
+                    {\voffset}{-2.95mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  \globaldefs = 0
+}}
 
 % @pagesizes TEXTHEIGHT[,TEXTWIDTH]
 % Perhaps we should allow setting the margins, \topskip, \parskip,
 % and/or leading, also. Or perhaps we should compute them somehow.
 %
-\def\pagesizes{\parsearg\pagesizesxxx}
-\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
 \def\pagesizesyyy#1,#2,#3\finish{{%
   \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
   \globaldefs = 1
@@ -6163,7 +7035,16 @@
   \parskip = 3pt plus 2pt minus 1pt
   \setleading{\textleading}%
   %
-  \internalpagesizes{#1}{\hsize}{\voffset}{\normaloffset}{\bindingoffset}{44pt}%
+  \dimen0 = #1
+  \advance\dimen0 by \voffset
+  %
+  \dimen2 = \hsize
+  \advance\dimen2 by \normaloffset
+  %
+  \internalpagesizes{#1}{\hsize}%
+                    {\voffset}{\normaloffset}%
+                    {\bindingoffset}{44pt}%
+                    {\dimen0}{\dimen2}%
 }}
 
 % Set default to letter.
@@ -6193,8 +7074,8 @@
 \def\normalplus{+}
 \def\normaldollar{$}%$ font-lock fix
 
-% This macro is used to make a character print one way in ttfont
-% where it can probably just be output, and another way in other fonts,
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
 % where something hairier probably needs to be done.
 %
 % #1 is what to print if we are indeed using \tt; #2 is what to print
@@ -6226,8 +7107,9 @@
 
 \catcode`\_=\active
 \def_{\ifusingtt\normalunderscore\_}
+\let\realunder=_
 % Subroutine for the previous macro.
-\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}}
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
 
 \catcode`\|=\active
 \def|{{\tt\char124}}
@@ -6241,15 +7123,6 @@
 \def+{{\tt \char 43}}
 \catcode`\$=\active
 \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
-%\catcode 27=\active
-%\def^^[{$\diamondsuit$}
-
-% Set up an active definition for =, but don't enable it most of the time.
-{\catcode`\==\active
-\global\def={{\tt \char 61}}}
-
-\catcode`+=\active
-\catcode`\_=\active
 
 % If a .fmt file is being used, characters that might appear in a file
 % name cannot be active until we have parsed the command line.
@@ -6257,46 +7130,53 @@
 % \otherifyactive is called near the end of this file.
 \def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
 
+% Used sometimes to turn off (effectively) the active characters even after
+% parsing them.
+\def\turnoffactive{%
+  \normalturnoffactive
+  \otherbackslash
+}
+
 \catcode`\@=0
 
-% \rawbackslashxx output one backslash character in current font
-\global\chardef\rawbackslashxx=`\\
-%{\catcode`\\=\other
-%@gdef@rawbackslashxx{\}}
-
-% \rawbackslash redefines \ as input to do \rawbackslashxx.
-{\catcode`\\=\active
-@gdef@rawbackslash{@let\=@rawbackslashxx }}
-
-% \normalbackslash outputs one backslash in fixed width font.
-\def\normalbackslash{{\tt\rawbackslashxx}}
-
-% \catcode 17=0   % Define control-q
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
+
+% In texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
 \catcode`\\=\active
-
-% Used sometimes to turn off (effectively) the active characters
-% even after parsing them.
-@def@turnoffactive{@let"=@normaldoublequote
-@let\=@realbackslash
-@let~=@normaltilde
-@let^=@normalcaret
-@let_=@normalunderscore
-@let|=@normalverticalbar
-@let<=@normalless
-@let>=@normalgreater
-@let+=@normalplus
-@let$=@normaldollar}%$ font-lock fix
-
-@def@normalturnoffactive{@let"=@normaldoublequote
-@let\=@normalbackslash
-@let~=@normaltilde
-@let^=@normalcaret
-@let_=@normalunderscore
-@let|=@normalverticalbar
-@let<=@normalless
-@let>=@normalgreater
-@let+=@normalplus
-@let$=@normaldollar}%$ font-lock fix
+@def@normalbackslash{{@tt@backslashcurfont}}
+% On startup, @fixbackslash assigns:
+%  @let \ = @normalbackslash
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+@gdef@rawbackslash{@let\=@backslashcurfont}
+@gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.
+% 
+@def@normalturnoffactive{%
+  @let\=@normalbackslash
+  @let"=@normaldoublequote
+  @let~=@normaltilde
+  @let^=@normalcaret
+  @let_=@normalunderscore
+  @let|=@normalverticalbar
+  @let<=@normalless
+  @let>=@normalgreater
+  @let+=@normalplus
+  @let$=@normaldollar %$ font-lock fix
+  @unsepspaces
+}
 
 % Make _ and + \other characters, temporarily.
 % This is canceled by @fixbackslash.
@@ -6310,9 +7190,9 @@
 @global@let\ = @eatinput
 
 % On the other hand, perhaps the file did not have a `\input texinfo'. Then
-% the first `\{ in the file would cause an error. This macro tries to fix
+% the first `\' in the file would cause an error. This macro tries to fix
 % that, assuming it is called before the first `\' could plausibly occur.
-% Also back turn on active characters that might appear in the input
+% Also turn back on active characters that might appear in the input
 % file name, in case not using a pre-dumped format.
 %
 @gdef@fixbackslash{%
@@ -6329,10 +7209,6 @@
 @catcode`@# = @other
 @catcode`@% = @other
 
-@c Set initial fonts.
-@textfonts
-@rm
-
 
 @c Local variables:
 @c eval: (add-hook 'write-file-hooks 'time-stamp)
@@ -6342,6 +7218,8 @@
 @c time-stamp-end: "}"
 @c End:
 
+@c vim:sw=2:
+
 @ignore
    arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
 @end ignore
--- a/man/text.texi	Fri Apr 07 12:02:40 2006 +0000
+++ b/man/text.texi	Sun Apr 09 00:38:22 2006 +0000
@@ -557,11 +557,11 @@
 fill commands put two spaces after a colon.
 
 @vindex fill-nobreak-predicate
-  The variable @code{fill-nobreak-predicate} specifies additional
-conditions for where line-breaking is allowed.  Its value is either
-@code{nil} or a Lisp function; the function is called with no
+  The variable @code{fill-nobreak-predicate} is a hook (an abnormal
+hook, @pxref{Hooks}) specifying additional conditions where
+line-breaking is not allowed.  Each function is called with no
 arguments, with point at a place where Emacs is considering breaking
-the line.  If the function returns a non-@code{nil} value, then that's
+the line.  If a function returns a non-@code{nil} value, then that's
 a bad place to break the line.  Two standard functions you can use are
 @code{fill-single-word-nobreak-p} (don't break after the first word of
 a sentence or before the last) and @code{fill-french-nobreak-p} (don't
--- a/man/trouble.texi	Fri Apr 07 12:02:40 2006 +0000
+++ b/man/trouble.texi	Sun Apr 09 00:38:22 2006 +0000
@@ -34,25 +34,25 @@
 Cancel a previously made change in the buffer contents (@code{undo}).
 @end table
 
-  There are two ways of canceling commands which are not finished
-executing: @dfn{quitting} with @kbd{C-g}, and @dfn{aborting} with
-@kbd{C-]} or @kbd{M-x top-level}.  Quitting cancels a partially typed
-command or one which is already running.  Aborting exits a recursive
-editing level and cancels the command that invoked the recursive edit.
+  There are two ways of canceling a command before it has finished:
+@dfn{quitting} with @kbd{C-g}, and @dfn{aborting} with @kbd{C-]} or
+@kbd{M-x top-level}.  Quitting cancels a partially typed command, or
+one which is still running.  Aborting exits a recursive editing level
+and cancels the command that invoked the recursive edit.
 (@xref{Recursive Edit}.)
 
 @cindex quitting
 @kindex C-g
-  Quitting with @kbd{C-g} is used for getting rid of a partially typed
+  Quitting with @kbd{C-g} is the way to get rid of a partially typed
 command, or a numeric argument that you don't want.  It also stops a
 running command in the middle in a relatively safe way, so you can use
 it if you accidentally give a command which takes a long time.  In
-particular, it is safe to quit out of killing; either your text will
-@emph{all} still be in the buffer, or it will @emph{all} be in the kill
-ring (or maybe both).  Quitting an incremental search does special
-things documented under searching; in general, it may take two
-successive @kbd{C-g} characters to get out of a search
-(@pxref{Incremental Search}).
+particular, it is safe to quit out of a kill command; either your text
+will @emph{all} still be in the buffer, or it will @emph{all} be in
+the kill ring, or maybe both.  Quitting an incremental search does
+special things, documented under searching; it may take two successive
+@kbd{C-g} characters to get out of a search (@pxref{Incremental
+Search}).
 
   On MS-DOS, the character @kbd{C-@key{BREAK}} serves as a quit character
 like @kbd{C-g}.  The reason is that it is not feasible, on MS-DOS, to
@@ -63,7 +63,7 @@
 @findex keyboard-quit
   @kbd{C-g} works by setting the variable @code{quit-flag} to @code{t}
 the instant @kbd{C-g} is typed; Emacs Lisp checks this variable
-frequently and quits if it is non-@code{nil}.  @kbd{C-g} is only
+frequently, and quits if it is non-@code{nil}.  @kbd{C-g} is only
 actually executed as a command if you type it while Emacs is waiting for
 input.  In that case, the command it runs is @code{keyboard-quit}.
 
@@ -72,15 +72,15 @@
 escape'' feature and return to the shell.  @xref{Emergency Escape}.
 
 @cindex NFS and quitting
-  There may be times when you cannot quit.  When Emacs is waiting for
-the operating system to do something, quitting is impossible unless
-special pains are taken for the particular system call within Emacs
-where the waiting occurs.  We have done this for the system calls that
-users are likely to want to quit from, but it's possible you will find
-another.  In one very common case---waiting for file input or output
-using NFS---Emacs itself knows how to quit, but many NFS implementations
-simply do not allow user programs to stop waiting for NFS when the NFS
-server is hung.
+  There are some situations where you cannot quit.  When Emacs is
+waiting for the operating system to do something, quitting is
+impossible unless special pains are taken for the particular system
+call within Emacs where the waiting occurs.  We have done this for the
+system calls that users are likely to want to quit from, but it's
+possible you will a case not handled.  In one very common
+case---waiting for file input or output using NFS---Emacs itself knows
+how to quit, but many NFS implementations simply do not allow user
+programs to stop waiting for NFS when the NFS server is hung.
 
 @cindex aborting recursive edit
 @findex abort-recursive-edit
@@ -96,16 +96,16 @@
 
 @findex keyboard-escape-quit
 @kindex ESC ESC ESC
-  The command @kbd{@key{ESC} @key{ESC} @key{ESC}}
-(@code{keyboard-escape-quit}) can either quit or abort.  This key was
-defined because @key{ESC} is used to ``get out'' in many PC programs.
-It can cancel a prefix argument, clear a selected region, or get out of
-a Query Replace, like @kbd{C-g}.  It can get out of the minibuffer or a
-recursive edit, like @kbd{C-]}.  It can also get out of splitting the
-frame into multiple windows, like @kbd{C-x 1}.  One thing it cannot do,
-however, is stop a command that is running.  That's because it executes
-as an ordinary command, and Emacs doesn't notice it until it is ready
-for a command.
+  The sequence @kbd{@key{ESC} @key{ESC} @key{ESC}}
+(@code{keyboard-escape-quit}) can either quit or abort.  (We defined
+it this way because @key{ESC} means ``get out'' in many PC programs.)
+It can cancel a prefix argument, clear a selected region, or get out
+of a Query Replace, like @kbd{C-g}.  It can get out of the minibuffer
+or a recursive edit, like @kbd{C-]}.  It can also get out of splitting
+the frame into multiple windows, as with @kbd{C-x 1}.  One thing it
+cannot do, however, is stop a command that is running.  That's because
+it executes as an ordinary command, and Emacs doesn't notice it until
+it is ready for the next command.
 
 @findex top-level
   The command @kbd{M-x top-level} is equivalent to ``enough'' @kbd{C-]}
@@ -137,7 +137,6 @@
 * Stuck Recursive::       `[...]' in mode line around the parentheses.
 * Screen Garbled::        Garbage on the screen.
 * Text Garbled::          Garbage in the text.
-* Unasked-for Search::    Spontaneous entry to incremental search.
 * Memory Full::           How to cope when you run out of memory.
 * After a Crash::         Recovering editing in an Emacs session that crashed.
 * Emergency Escape::      Emergency escape---
@@ -181,10 +180,10 @@
   In all of those cases, the immediate remedy is the same: use the
 command @kbd{M-x normal-erase-is-backspace-mode}.  This toggles
 between the two modes that Emacs supports for handling @key{DEL}, so
-if Emacs starts in the wrong mode, it should switch to the right mode.
-On a text-only terminal, if you want to ask for help when @key{BS} is
-treated as @key{DEL}, use @key{F1}; @kbd{C-?} may also work, if it
-sends character code 127.
+if Emacs starts in the wrong mode, this should switch to the right
+mode.  On a text-only terminal, if you want to ask for help when
+@key{BS} is treated as @key{DEL}, use @key{F1}; @kbd{C-?} may also
+work, if it sends character code 127.
 
 @findex normal-erase-is-backspace-mode
   To fix the problem automatically for every Emacs session, you can
@@ -244,25 +243,24 @@
 problem was entirely in the previous screen update.  (Otherwise, see
 the following section.)
 
-  Display updating problems often result from an incorrect termcap entry
-for the terminal you are using.  The file @file{etc/TERMS} in the Emacs
-distribution gives the fixes for known problems of this sort.
-@file{INSTALL} contains general advice for these problems in one of its
-sections.  Very likely there is simply insufficient padding for certain
-display operations.  To investigate the possibility that you have this sort
-of problem, try Emacs on another terminal made by a different manufacturer.
-If problems happen frequently on one kind of terminal but not another kind,
-it is likely to be a bad termcap entry, though it could also be due to a
-bug in Emacs that appears for terminals that have or that lack specific
-features.
+  Display updating problems often result from an incorrect terminfo
+entry for the terminal you are using.  The file @file{etc/TERMS} in
+the Emacs distribution gives the fixes for known problems of this
+sort.  @file{INSTALL} contains general advice for these problems in
+one of its sections.  To investigate the possibility that you have
+this sort of problem, try Emacs on another terminal made by a
+different manufacturer.  If problems happen frequently on one kind of
+terminal but not another kind, it is likely to be a bad terminfo entry,
+though it could also be due to a bug in Emacs that appears for
+terminals that have or that lack specific features.
 
 @node Text Garbled
 @subsection Garbage in the Text
 
-  If @kbd{C-l} shows that the text is wrong, try undoing the changes to it
-using @kbd{C-x u} until it gets back to a state you consider correct.  Also
-try @kbd{C-h l} to find out what command you typed to produce the observed
-results.
+  If @kbd{C-l} shows that the text is wrong, first type @kbd{C-h l} to
+see what commands you typed to produce the observed results.  Then try
+undoing the changes step by step using @kbd{C-x u}, until it gets back
+to a state you consider correct.
 
   If a large portion of text appears to be missing at the beginning or
 end of the buffer, check for the word @samp{Narrow} in the mode line.
@@ -270,42 +268,6 @@
 temporarily off-limits.  To make it accessible again, type @kbd{C-x n
 w}.  @xref{Narrowing}.
 
-@node Unasked-for Search
-@subsection Spontaneous Entry to Incremental Search
-
-  If Emacs spontaneously displays @samp{I-search:} at the bottom of the
-screen, it means that the terminal is sending @kbd{C-s} and @kbd{C-q}
-according to the poorly designed xon/xoff ``flow control'' protocol.
-
-  If this happens to you, your best recourse is to put the terminal in a
-mode where it will not use flow control, or give it so much padding that
-it will never send a @kbd{C-s}.  (One way to increase the amount of
-padding is to set the variable @code{baud-rate} to a larger value.  Its
-value is the terminal output speed, measured in the conventional units
-of baud.)
-
-@cindex flow control
-@cindex xon-xoff
-@findex enable-flow-control
-  If you don't succeed in turning off flow control, the next best thing
-is to tell Emacs to cope with it.  To do this, call the function
-@code{enable-flow-control}.
-
-@findex enable-flow-control-on
-  Typically there are particular terminal types with which you must use
-flow control.  You can conveniently ask for flow control on those
-terminal types only, using @code{enable-flow-control-on}.  For example,
-if you find you must use flow control on VT-100 and H19 terminals, put
-the following in your @file{.emacs} file:
-
-@example
-(enable-flow-control-on "vt100" "h19")
-@end example
-
-  When flow control is enabled, you must type @kbd{C-\} to get the
-effect of a @kbd{C-s}, and type @kbd{C-^} to get the effect of a
-@kbd{C-q}.
-
 @node Memory Full
 @subsection Running out of Memory
 @cindex memory full
@@ -342,12 +304,13 @@
 recover from.  Typically the one you want is the most recent one.  Move
 point to the one you choose, and type @kbd{C-c C-c}.
 
-  Then @code{recover-session} asks about each of the files that you were
-editing during that session; it asks whether to recover that file.  If
-you answer @kbd{y} for a file, it shows the dates of that file and its
-auto-save file, then asks once again whether to recover that file.  For
-the second question, you must confirm with @kbd{yes}.  If you do, Emacs
-visits the file but gets the text from the auto-save file.
+  Then @code{recover-session} considers each of the files that you
+were editing during that session; for each such file, it asks whether
+to recover that file.  If you answer @kbd{y} for a file, it shows the
+dates of that file and its auto-save file, then asks once again
+whether to recover that file.  For the second question, you must
+confirm with @kbd{yes}.  If you do, Emacs visits the file but gets the
+text from the auto-save file.
 
   When @code{recover-session} is done, the files you've chosen to
 recover are present in Emacs buffers.  You should then save them.  Only
@@ -361,6 +324,9 @@
 and that the Emacs executable was not stripped of its debugging
 symbols.
 
+  As soon as you get the core dump, rename it to another name such as
+@file{core.emacs}, so that another crash won't overwrite it.
+
   To use this script, run @code{gdb} with the file name of your Emacs
 executable and the file name of the core dump, e.g. @samp{gdb
 /usr/bin/emacs core.emacs}.  At the @code{(gdb)} prompt, load the
@@ -375,16 +341,18 @@
 @node Emergency Escape
 @subsection Emergency Escape
 
-  Because at times there have been bugs causing Emacs to loop without
-checking @code{quit-flag}, a special feature causes Emacs to be suspended
-immediately if you type a second @kbd{C-g} while the flag is already set,
-so you can always get out of GNU Emacs.  Normally Emacs recognizes and
-clears @code{quit-flag} (and quits!) quickly enough to prevent this from
-happening.  (On MS-DOS and compatible systems, type @kbd{C-@key{BREAK}}
-twice.)
+  On text-only terminals, the @dfn{emergency escape} feature suspends
+Emacs immediately if you type @kbd{C-g} a second time before Emacs can
+actually respond to the first one by quitting.  This is so you can
+always get out of GNU Emacs no matter how badly it might be hung.
+When things are working properly, Emacs recognizes and handles the
+first @kbd{C-g} so fast that the second one won't trigger emergency
+escape.  However, if some problem prevents Emacs from handling the
+first @kbd{C-g} properly, then the second one will get you back to the
+shell.
 
-  When you resume Emacs after a suspension caused by multiple @kbd{C-g}, it
-asks two questions before going back to what it had been doing:
+  When you resume Emacs after a suspension caused by emergency escape,
+it asks two questions before going back to what it had been doing:
 
 @example
 Auto-save? (y or n)
@@ -394,29 +362,31 @@
 @noindent
 Answer each one with @kbd{y} or @kbd{n} followed by @key{RET}.
 
-  Saying @kbd{y} to @samp{Auto-save?} causes immediate auto-saving of all
-modified buffers in which auto-saving is enabled.
+  Saying @kbd{y} to @samp{Auto-save?} causes immediate auto-saving of
+all modified buffers in which auto-saving is enabled.  Saying @kbd{n}
+skips this.
 
-  Saying @kbd{y} to @samp{Abort (and dump core)?} causes an illegal instruction to be
-executed, dumping core.  This is to enable a wizard to figure out why Emacs
-was failing to quit in the first place.  Execution does not continue
-after a core dump.  If you answer @kbd{n}, execution does continue.  With
-luck, GNU Emacs will ultimately check @code{quit-flag} and quit normally.
-If not, and you type another @kbd{C-g}, it is suspended again.
+  Saying @kbd{y} to @samp{Abort (and dump core)?} causes Emacs to
+crash, dumping core.  This is to enable a wizard to figure out why
+Emacs was failing to quit in the first place.  Execution does not
+continue after a core dump.
+
+  If you answer this question @kbd{n}, Emacs execution resumes.  With
+luck, Emacs will ultimately do the requested quit.  If not, each
+subsequent @kbd{C-g} invokes emergency escape again.
 
   If Emacs is not really hung, just slow, you may invoke the double
-@kbd{C-g} feature without really meaning to.  Then just resume and answer
-@kbd{n} to both questions, and you will arrive at your former state.
-Presumably the quit you requested will happen soon.
+@kbd{C-g} feature without really meaning to.  Then just resume and
+answer @kbd{n} to both questions, and you will get back to the former
+state.  The quit you requested will happen by and by.
 
-  The double @kbd{C-g} feature is turned off when Emacs is running under
-the X Window System, since you can use the window manager to kill Emacs
-or to create another window and run another program.
+  Emergency escape is active only for text terminals.  On a graphical
+display that supports multiple windows, you can use the window manager
+to kill Emacs, or to switch to some other program.
 
-  On MS-DOS and compatible systems, the emergency escape feature is
-sometimes unavailable, even if you press @kbd{C-@key{BREAK}} twice, when
-some system call (MS-DOS or BIOS) hangs, or when Emacs is stuck in a
-very tight endless loop (in C code, @strong{not} in Lisp code).
+  On MS-DOS, you must type @kbd{C-@key{BREAK}} (twice) to cause
+emergency escape---but there are cases where it won't work, when
+system call hangs or when Emacs is stuck in a tight loop in C code.
 
 @node Total Frustration
 @subsection Help for Total Frustration
@@ -433,9 +403,9 @@
 @findex doctor
   Second, type @kbd{M-x doctor @key{RET}}.
 
-  The doctor will help you feel better.  Each time you say something to
-the doctor, you must end it by typing @key{RET} @key{RET}.  This lets
-the doctor know you are finished.
+  The Emacs psychotherapist will help you feel better.  Each time you
+say something to the psychotherapist, you must end it by typing
+@key{RET} @key{RET}.  This indicates you are finished typing.
 
 @node Bugs, Contributing, Lossage, Top
 @section Reporting Bugs
@@ -467,9 +437,10 @@
 @node Bug Criteria
 @subsection When Is There a Bug
 
-  If Emacs executes an illegal instruction, or dies with an operating
-system error message that indicates a problem in the program (as opposed to
-something like ``disk full''), then it is certainly a bug.
+  If Emacs accesses an invalid memory location (``segmentation
+fault''), or exits with an operating system error message that
+indicates a problem in the program (as opposed to something like
+``disk full''), then it is certainly a bug.
 
   If Emacs updates the display in a way that does not correspond to what is
 in the buffer, then it is certainly a bug.  If a command seems to do the
@@ -502,9 +473,10 @@
 features.  It is probably best not to complain about such a problem
 until you have checked the documentation in the usual ways, feel
 confident that you understand it, and know for certain that what you
-want is not available.  If you are not sure what the command is
-supposed to do after a careful reading of the manual, check the index
-and glossary for any terms that may be unclear.
+want is not available.  Ask other Emacs users, too.  If you are not
+sure what the command is supposed to do after a careful reading of the
+manual, check the index and glossary for any terms that may be
+unclear.
 
   If after careful rereading of the manual you still do not understand
 what the command should do, that indicates a bug in the manual, which
@@ -533,10 +505,10 @@
 have no real information about the bug.
 
   For example, suppose that you type @kbd{C-x C-f /glorp/baz.ugh
-@key{RET}}, visiting a file which (you know) happens to be rather large,
-and Emacs displayed @samp{I feel pretty today}.  The best way to report
-the bug is with a sentence like the preceding one, because it gives all
-the facts.
+@key{RET}}, visiting a file which (you know) happens to be rather
+large, and Emacs displays @samp{I feel pretty today}.  The best way to
+report the bug is with a sentence like the preceding one, because it
+gives all the facts.
 
   A bad way would be to assume that the problem is due to the size of
 the file and say, ``I visited a large file, and Emacs displayed @samp{I
@@ -559,7 +531,7 @@
 you @emph{know} that it makes no difference which visiting command is used.
 Similarly, rather than saying ``if I have three characters on the line,''
 say ``after I type @kbd{@key{RET} A B C @key{RET} C-p},'' if that is
-the way you entered the text.@refill
+the way you entered the text.
 
   So please don't guess any explanations when you report a bug.  If you
 want to actually @emph{debug} the problem, and report explanations that
@@ -591,19 +563,6 @@
 instead, offer to send it on request, or make it available by ftp and
 say where.
 
-  If you can't send electronic mail, then mail the bug report on paper
-or machine-readable media to this address:
-
-@format
-GNU Emacs Bugs
-Free Software Foundation
-51 Franklin Street, Fifth Floor
-Boston, MA 02110-1301 USA
-@end format
-
-  We do not promise to fix the bug; but if the bug is serious,
-or ugly, or easy to fix, chances are we will want to.
-
 @findex report-emacs-bug
   A convenient way to send a bug report for Emacs is to use the command
 @kbd{M-x report-emacs-bug}.  This sets up a mail buffer (@pxref{Sending
@@ -658,7 +617,7 @@
   If you can tell us a way to cause the problem without visiting any files,
 please do so.  This makes it much easier to debug.  If you do need files,
 make sure you arrange for us to see their exact contents.  For example, it
-can often matter whether there are spaces at the ends of lines, or a
+can matter whether there are spaces at the ends of lines, or a
 newline after the last line in the buffer (nothing ought to care whether
 the last line is terminated, but try telling the bugs that).
 
@@ -668,7 +627,7 @@
 @findex open-dribble-file
 @cindex dribble file
 @cindex logging keystrokes
-  The easy way to record the input to Emacs precisely is to write a
+The easy way to record the input to Emacs precisely is to write a
 dribble file.  To start the file, execute the Lisp expression
 
 @example
@@ -705,7 +664,7 @@
 
 Be warned: it is often difficult, and sometimes impossible, to fix a
 terminal-dependent bug without access to a terminal of the type that
-stimulates the bug.@refill
+stimulates the bug.
 
 @item
 If non-@acronym{ASCII} text or internationalization is relevant, the locale that
@@ -765,7 +724,7 @@
 @pindex Edebug
 To make a backtrace for the error, use @kbd{M-x toggle-debug-on-error}
 before the error happens (that is to say, you must give that command
-and then make the bug happen).  This causes the error to run the Lisp
+and then make the bug happen).  This causes the error to start the Lisp
 debugger, which shows you a backtrace.  Copy the text of the
 debugger's backtrace into the bug report.  @xref{Debugger,, The Lisp
 Debugger, elisp, the Emacs Lisp Reference Manual}, for information on
@@ -1028,11 +987,9 @@
 feel that the purpose needs explaining, it probably does---but put the
 explanation in comments in the code.  It will be more useful there.
 
-Please read the @file{ChangeLog} files in the @file{src} and @file{lisp}
-directories to see what sorts of information to put in, and to learn the
-style that we use.  If you would like your name to appear in the header
-line, showing who made the change, send us the header line.
-@xref{Change Log}.
+Please read the @file{ChangeLog} files in the @file{src} and
+@file{lisp} directories to see what sorts of information to put in,
+and to learn the style that we use.  @xref{Change Log}.
 
 @item
 When you write the fix, keep in mind that we can't install a change that
@@ -1071,8 +1028,8 @@
 
 The development version of Emacs can be downloaded from the CVS
 repository where it is actively maintained by a group of developers.
-See the Emacs project page http://savannah.gnu.org/projects/emacs/ for
-details.
+See the Emacs project page
+@url{http://savannah.gnu.org/projects/emacs/} for details.
 
 @node Service, Copying, Contributing, Top
 @section How To Get Help with GNU Emacs
--- a/src/ChangeLog	Fri Apr 07 12:02:40 2006 +0000
+++ b/src/ChangeLog	Sun Apr 09 00:38:22 2006 +0000
@@ -1,3 +1,64 @@
+2006-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* w32fns.c (w32_wnd_proc) <WM_MOUSEMOVE>: Ignore mouse movements
+	if a menu is active on this frame.
+
+2006-04-08  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	* lisp.h (report_file_error): Mark as NO_RETURN.
+
+2006-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* alloc.c [STDC_HEADERS]: Include stddef.h.
+
+	* lisp.h (PSEUDOVECSIZE): Fix last change.
+
+2006-04-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
+	`raw_status_high', and `raw_status_low' with plain integers, and move
+	them to the end of the structure.
+
+	* alloc.c (allocate_process): Use PSEUDOVECSIZE to initialize the
+	pseudovector's size field so only the Lisp_Object fields get GC'd.
+
+	* process.c (update_status, make_process, Fdelete_process)
+	(Fprocess_status, list_processes_1, start_process_unwind)
+	(create_process, Fmake_network_process, server_accept_connection)
+	(wait_reading_process_output, send_process, Fprocess_running_child_p)
+	(process_send_signal, proc_encode_coding_system, Fprocess_send_eof)
+	(sigchld_handler, status_notify): Adjust to new non-Lisp fields for
+	`pid' and `raw_status'.
+	(Fprocess_id, Fsignal_process): Same, and additionally use floats when
+	representing PIDs that are larger than most-positive-fixnum.
+
+	* keymap.c (describe_map): Only use XINT if we checked INTEGERP.
+
+	* lisp.h (OFFSETOF, PSEUDOVECSIZE): New macros.
+
+2006-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* w32fns.c (Fx_show_tip): Add 3 to the 5th arg of SetWindowPos.
+
+2006-04-03  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* editfns.c (TM_YEAR_IN_ASCTIME_RANGE): New macro, identical to
+	../lib-src/b2m.c and ../lib-src/editfns.c.
+	(Fcurrent_time_string): Use it.
+	Document that the year might not consume 4 columns if it's outside
+	the range 1000-9999.
+	Check for asctime failure.
+	Don't assume that the output string length is always exactly 24.
+
+2006-04-03  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+	* macterm.c (XTread_socket): Initialize variable `f' before its use.
+
+2006-04-03  Kenichi Handa  <handa@m17n.org>
+
+	* image.c: Include "charset.h" and "coding.h".
+	(x_find_image_file): Return an encoded file name.
+
 2006-04-01  Eli Zaretskii  <eliz@gnu.org>
 
 	* configure: Regenerated.
--- a/src/alloc.c	Fri Apr 07 12:02:40 2006 +0000
+++ b/src/alloc.c	Sun Apr 09 00:38:22 2006 +0000
@@ -23,6 +23,10 @@
 #include <stdio.h>
 #include <limits.h>		/* For CHAR_BIT.  */
 
+#ifdef STDC_HEADERS
+#include <stddef.h>		/* For offsetof, used by PSEUDOVECSIZE. */
+#endif
+
 #ifdef ALLOC_DEBUG
 #undef INLINE
 #endif
@@ -3003,13 +3007,17 @@
 struct Lisp_Process *
 allocate_process ()
 {
-  EMACS_INT len = VECSIZE (struct Lisp_Process);
-  struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_PROCESS);
+  /* Memory-footprint of the object in nb of Lisp_Object fields.  */
+  EMACS_INT memlen = VECSIZE (struct Lisp_Process);
+  /* Size if we only count the actual Lisp_Object fields (which need to be
+     traced by the GC).  */
+  EMACS_INT lisplen = PSEUDOVECSIZE (struct Lisp_Process, pid);
+  struct Lisp_Vector *v = allocate_vectorlike (memlen, MEM_TYPE_PROCESS);
   EMACS_INT i;
 
-  for (i = 0; i < len; ++i)
+  for (i = 0; i < lisplen; ++i)
     v->contents[i] = Qnil;
-  v->size = len;
+  v->size = lisplen;
 
   return (struct Lisp_Process *) v;
 }
@@ -5515,6 +5523,10 @@
 	  if (size & PSEUDOVECTOR_FLAG)
 	    size &= PSEUDOVECTOR_SIZE_MASK;
 
+	  /* Note that this size is not the memory-footprint size, but only
+	     the number of Lisp_Object fields that we should trace.
+	     The distinction is used e.g. by Lisp_Process which places extra
+	     non-Lisp_Object fields at the end of the structure.  */
 	  for (i = 0; i < size; i++) /* and then mark its elements */
 	    mark_object (ptr->contents[i]);
 	}
--- a/src/editfns.c	Fri Apr 07 12:02:40 2006 +0000
+++ b/src/editfns.c	Sun Apr 09 00:38:22 2006 +0000
@@ -74,6 +74,13 @@
 
 #define TM_YEAR_BASE 1900
 
+/* Nonzero if TM_YEAR is a struct tm's tm_year value that causes
+   asctime to have well-defined behavior.  */
+#ifndef TM_YEAR_IN_ASCTIME_RANGE
+# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \
+    (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE)
+#endif
+
 extern size_t emacs_strftimeu P_ ((char *, size_t, const char *,
 				   const struct tm *, int));
 static int tm_diff P_ ((struct tm *, struct tm *));
@@ -1831,7 +1838,8 @@
 DEFUN ("current-time-string", Fcurrent_time_string, Scurrent_time_string, 0, 1, 0,
        doc: /* Return the current time, as a human-readable string.
 Programs can use this function to decode a time,
-since the number of columns in each field is fixed.
+since the number of columns in each field is fixed
+if the year is in the range 1000-9999.
 The format is `Sun Sep 16 01:03:52 1973'.
 However, see also the functions `decode-time' and `format-time-string'
 which provide a much more powerful and general facility.
@@ -1845,31 +1853,23 @@
      Lisp_Object specified_time;
 {
   time_t value;
-  char buf[30];
   struct tm *tm;
   register char *tem;
 
   if (! lisp_time_argument (specified_time, &value, NULL))
     error ("Invalid time specification");
-  /* Do not use ctime, since it has undefined behavior with
-     out-of-range time stamps.  This avoids a core dump triggered by
-     (current-time-string '(2814749767106 0)) on 64-bit Solaris 8. See
-     <http://www.opengroup.org/austin/mailarchives/ag/msg09294.html>
-     for more details about this portability problem.  */
+
+  /* Convert to a string, checking for out-of-range time stamps.
+     Don't use 'ctime', as that might dump core if VALUE is out of
+     range.  */
   tm = localtime (&value);
-  /* Checking for out-of-range time stamps avoids buffer overruns that
-     cause core dump on some systems (e.g., 64-bit Solaris), and also
-     preserves the historic behavior of always returning a fixed-size
-     24-character string.  */
-  if (! (tm && -999 - TM_YEAR_BASE <= tm->tm_year
-	 && tm->tm_year <= 9999 - TM_YEAR_BASE))
+  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year) && (tem = asctime (tm))))
     error ("Specified time is not representable");
-  tem = asctime (tm);
-
-  strncpy (buf, tem, 24);
-  buf[24] = 0;
-
-  return build_string (buf);
+
+  /* Remove the trailing newline.  */
+  tem[strlen (tem) - 1] = '\0';
+
+  return build_string (tem);
 }
 
 /* Yield A - B, measured in seconds.
--- a/src/image.c	Fri Apr 07 12:02:40 2006 +0000
+++ b/src/image.c	Sun Apr 09 00:38:22 2006 +0000
@@ -39,6 +39,8 @@
 #include "blockinput.h"
 #include "systime.h"
 #include <epaths.h>
+#include "charset.h"
+#include "coding.h"
 
 
 #ifdef HAVE_X_WINDOWS
@@ -2246,8 +2248,8 @@
 
 
 /* Find image file FILE.  Look in data-directory, then
-   x-bitmap-file-path.  Value is the full name of the file found, or
-   nil if not found.  */
+   x-bitmap-file-path.  Value is the encoded full name of the file
+   found, or nil if not found.  */
 
 Lisp_Object
 x_find_image_file (file)
@@ -2267,7 +2269,10 @@
   if (fd == -1)
     file_found = Qnil;
   else
-    close (fd);
+    {
+      file_found = ENCODE_FILE (file_found);
+      close (fd);
+    }
 
   UNGCPRO;
   return file_found;
--- a/src/keymap.c	Fri Apr 07 12:02:40 2006 +0000
+++ b/src/keymap.c	Sun Apr 09 00:38:22 2006 +0000
@@ -3362,7 +3362,7 @@
       if (INTEGERP (vect[i].event))
 	{
 	  while (i + 1 < slots_used
-		 && XINT (vect[i + 1].event) == XINT (vect[i].event) + 1
+		 && EQ (vect[i+1].event, make_number (XINT (vect[i].event) + 1))
 		 && !NILP (Fequal (vect[i + 1].definition, definition))
 		 && vect[i].shadowed == vect[i + 1].shadowed)
 	    i++;
--- a/src/lisp.h	Fri Apr 07 12:02:40 2006 +0000
+++ b/src/lisp.h	Sun Apr 09 00:38:22 2006 +0000
@@ -298,7 +298,11 @@
 #endif
 };
 
-/* For convenience, we also store the number of elements in these bits.  */
+/* For convenience, we also store the number of elements in these bits.
+   Note that this size is not necessarily the memory-footprint size, but
+   only the number of Lisp_Object fields (that need to be traced by the GC).
+   The distinction is used e.g. by Lisp_Process which places extra
+   non-Lisp_Object fields at the end of the structure.  */
 #define PSEUDOVECTOR_SIZE_MASK 0x1ff
 
 /* Number of bits to put in each character in the internal representation
@@ -705,12 +709,12 @@
     unsigned char *data;
   };
 
-/* If a struct is made to look like a vector, this macro returns the length
-   of the shortest vector that would hold that struct.  */
-#define VECSIZE(type) ((sizeof (type) - (sizeof (struct Lisp_Vector)  \
-                                         - sizeof (Lisp_Object))      \
-                        + sizeof(Lisp_Object) - 1) /* round up */     \
-		       / sizeof (Lisp_Object))
+#ifdef offsetof
+#define OFFSETOF(type,field) offsetof(type,field)
+#else
+#define OFFSETOF(type,field) \
+  ((int)((char*)&((type*)0)->field - (char*)0))
+#endif
 
 struct Lisp_Vector
   {
@@ -719,6 +723,20 @@
     Lisp_Object contents[1];
   };
 
+/* If a struct is made to look like a vector, this macro returns the length
+   of the shortest vector that would hold that struct.  */
+#define VECSIZE(type) ((sizeof (type) - (sizeof (struct Lisp_Vector)  \
+                                         - sizeof (Lisp_Object))      \
+                        + sizeof(Lisp_Object) - 1) /* round up */     \
+		       / sizeof (Lisp_Object))
+
+/* Like VECSIZE, but used when the pseudo-vector has non-Lisp_Object fields
+   at the end and we need to compute the number of Lisp_Object fields (the
+   ones that the GC needs to trace).  */
+#define PSEUDOVECSIZE(type, nonlispfield) \
+  ((OFFSETOF(type, nonlispfield) - OFFSETOF(struct Lisp_Vector, contents[0])) \
+   / sizeof (Lisp_Object))
+
 /* A char-table is a kind of vectorlike, with contents are like a
    vector but with a few other slots.  For some purposes, it makes
    sense to handle a char-table with type struct Lisp_Vector.  An
@@ -2880,7 +2898,7 @@
 EXFUN (Ffile_executable_p, 1);
 EXFUN (Fread_file_name, 6);
 extern Lisp_Object close_file_unwind P_ ((Lisp_Object));
-extern void report_file_error P_ ((const char *, Lisp_Object));
+extern void report_file_error P_ ((const char *, Lisp_Object)) NO_RETURN;
 extern int internal_delete_file P_ ((Lisp_Object));
 extern void syms_of_fileio P_ ((void));
 extern void init_fileio_once P_ ((void));
--- a/src/macterm.c	Fri Apr 07 12:02:40 2006 +0000
+++ b/src/macterm.c	Sun Apr 09 00:38:22 2006 +0000
@@ -10476,6 +10476,8 @@
 
 	    ObscureCursor ();
 
+	    f = mac_focus_frame (dpyinfo);
+
 	    if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight)
 		&& !EQ (f->tool_bar_window, dpyinfo->mouse_face_window))
 	      {
@@ -10521,7 +10523,7 @@
 	  inev.modifiers |= (extra_keyboard_modifiers
 			     & (meta_modifier | alt_modifier
 				| hyper_modifier | super_modifier));
-	  XSETFRAME (inev.frame_or_window, mac_focus_frame (dpyinfo));
+	  XSETFRAME (inev.frame_or_window, f);
 	  break;
 
 	case kHighLevelEvent:
--- a/src/process.c	Fri Apr 07 12:02:40 2006 +0000
+++ b/src/process.c	Sun Apr 09 00:38:22 2006 +0000
@@ -414,10 +414,10 @@
      struct Lisp_Process *p;
 {
   union { int i; WAITTYPE wt; } u;
-  u.i = XFASTINT (p->raw_status_low) + (XFASTINT (p->raw_status_high) << 16);
+  eassert (p->raw_status_new);
+  u.i = p->raw_status;
   p->status = status_convert (u.wt);
-  p->raw_status_low = Qnil;
-  p->raw_status_high = Qnil;
+  p->raw_status_new = 0;
 }
 
 /*  Convert a process status word in Unix format to
@@ -619,11 +619,10 @@
 
   XSETINT (p->infd, -1);
   XSETINT (p->outfd, -1);
-  XSETFASTINT (p->pid, 0);
   XSETFASTINT (p->tick, 0);
   XSETFASTINT (p->update_tick, 0);
-  p->raw_status_low = Qnil;
-  p->raw_status_high = Qnil;
+  p->pid = 0;
+  p->raw_status_new = 0;
   p->status = Qrun;
   p->mark = Fmake_marker ();
 
@@ -790,8 +789,7 @@
   process = get_process (process);
   p = XPROCESS (process);
 
-  p->raw_status_low = Qnil;
-  p->raw_status_high = Qnil;
+  p->raw_status_new = 0;
   if (NETCONN1_P (p))
     {
       p->status = Fcons (Qexit, Fcons (make_number (0), Qnil));
@@ -841,7 +839,7 @@
     return process;
 
   p = XPROCESS (process);
-  if (!NILP (p->raw_status_low))
+  if (p->raw_status_new)
     update_status (p);
   status = p->status;
   if (CONSP (status))
@@ -866,7 +864,7 @@
      register Lisp_Object process;
 {
   CHECK_PROCESS (process);
-  if (!NILP (XPROCESS (process)->raw_status_low))
+  if (XPROCESS (process)->raw_status_new)
     update_status (XPROCESS (process));
   if (CONSP (XPROCESS (process)->status))
     return XCAR (XCDR (XPROCESS (process)->status));
@@ -881,7 +879,9 @@
      register Lisp_Object process;
 {
   CHECK_PROCESS (process);
-  return XPROCESS (process)->pid;
+  return (XPROCESS (process)->pid
+	  ? make_fixnum_or_float (XPROCESS (process)->pid)
+	  : Qnil);
 }
 
 DEFUN ("process-name", Fprocess_name, Sprocess_name, 1, 1, 0,
@@ -1363,7 +1363,7 @@
       Finsert (1, &p->name);
       Findent_to (i_status, minspace);
 
-      if (!NILP (p->raw_status_low))
+      if (p->raw_status_new)
 	update_status (p);
       symbol = p->status;
       if (CONSP (p->status))
@@ -1735,7 +1735,7 @@
     abort ();
 
   /* Was PROC started successfully?  */
-  if (XINT (XPROCESS (proc)->pid) <= 0)
+  if (XPROCESS (proc)->pid <= 0)
     remove_process (proc);
 
   return Qnil;
@@ -1946,7 +1946,7 @@
      in the table after this function has returned; if it does
      it might cause call-process to hang and subsequent asynchronous
      processes to get their return values scrambled.  */
-  XSETINT (XPROCESS (process)->pid, -1);
+  XPROCESS (process)->pid = -1;
 
   BLOCK_INPUT;
 
@@ -2137,7 +2137,7 @@
   else
     {
       /* vfork succeeded.  */
-      XSETFASTINT (XPROCESS (process)->pid, pid);
+      XPROCESS (process)->pid = pid;
 
 #ifdef WINDOWSNT
       register_child (pid, inchannel);
@@ -3350,7 +3350,7 @@
     p->kill_without_query = Qt;
   if ((tem = Fplist_get (contact, QCstop), !NILP (tem)))
     p->command = Qt;
-  p->pid = Qnil;
+  p->pid = 0;
   XSETINT (p->infd, inch);
   XSETINT (p->outfd, outch);
   if (is_server && socktype == SOCK_STREAM)
@@ -4066,7 +4066,7 @@
   p->sentinel = ps->sentinel;
   p->filter = ps->filter;
   p->command = Qnil;
-  p->pid = Qnil;
+  p->pid = 0;
   XSETINT (p->infd, s);
   XSETINT (p->outfd, s);
   p->status = Qrun;
@@ -4366,9 +4366,9 @@
 
       /* Don't wait for output from a non-running process.  Just
          read whatever data has already been received.  */
-      if (wait_proc != 0 && !NILP (wait_proc->raw_status_low))
+      if (wait_proc && wait_proc->raw_status_new)
 	update_status (wait_proc);
-      if (wait_proc != 0
+      if (wait_proc
 	  && ! EQ (wait_proc->status, Qrun)
 	  && ! EQ (wait_proc->status, Qconnect))
 	{
@@ -4752,7 +4752,7 @@
 		  /* Preserve status of processes already terminated.  */
 		  XSETINT (XPROCESS (proc)->tick, ++process_tick);
 		  deactivate_process (proc);
-		  if (!NILP (XPROCESS (proc)->raw_status_low))
+		  if (XPROCESS (proc)->raw_status_new)
 		    update_status (XPROCESS (proc));
 		  if (EQ (XPROCESS (proc)->status, Qrun))
 		    XPROCESS (proc)->status
@@ -5293,7 +5293,7 @@
   VMS_PROC_STUFF *vs, *get_vms_process_pointer();
 #endif /* VMS */
 
-  if (! NILP (p->raw_status_low))
+  if (p->raw_status_new)
     update_status (p);
   if (! EQ (p->status, Qrun))
     error ("Process %s not running", SDATA (p->name));
@@ -5550,8 +5550,7 @@
       proc = process_sent_to;
       p = XPROCESS (proc);
 #endif
-      p->raw_status_low = Qnil;
-      p->raw_status_high = Qnil;
+      p->raw_status_new = 0;
       p->status = Fcons (Qexit, Fcons (make_number (256), Qnil));
       XSETINT (p->tick, ++process_tick);
       deactivate_process (proc);
@@ -5666,7 +5665,7 @@
 
   gid = emacs_get_tty_pgrp (p);
 
-  if (gid == XFASTINT (p->pid))
+  if (gid == p->pid)
     return Qnil;
   return Qt;
 }
@@ -5713,7 +5712,7 @@
   /* If we are using pgrps, get a pgrp number and make it negative.  */
   if (NILP (current_group))
     /* Send the signal to the shell's process group.  */
-    gid = XFASTINT (p->pid);
+    gid = p->pid;
   else
     {
 #ifdef SIGNALS_VIA_CHARACTERS
@@ -5832,7 +5831,7 @@
       if (gid == -1)
 	/* If we can't get the information, assume
 	   the shell owns the tty.  */
-	gid = XFASTINT (p->pid);
+	gid = p->pid;
 
       /* It is not clear whether anything really can set GID to -1.
 	 Perhaps on some system one of those ioctls can or could do so.
@@ -5842,12 +5841,12 @@
 #else  /* ! defined (TIOCGPGRP ) */
       /* Can't select pgrps on this system, so we know that
 	 the child itself heads the pgrp.  */
-      gid = XFASTINT (p->pid);
+      gid = p->pid;
 #endif /* ! defined (TIOCGPGRP ) */
 
       /* If current_group is lambda, and the shell owns the terminal,
 	 don't send any signal.  */
-      if (EQ (current_group, Qlambda) && gid == XFASTINT (p->pid))
+      if (EQ (current_group, Qlambda) && gid == p->pid)
 	return;
     }
 
@@ -5855,8 +5854,7 @@
     {
 #ifdef SIGCONT
     case SIGCONT:
-      p->raw_status_low = Qnil;
-      p->raw_status_high = Qnil;
+      p->raw_status_new = 0;
       p->status = Qrun;
       XSETINT (p->tick, ++process_tick);
       if (!nomsg)
@@ -5875,7 +5873,7 @@
 #endif
     case SIGKILL:
 #ifdef VMS
-      sys$forcex (&(XFASTINT (p->pid)), 0, 1);
+      sys$forcex (&(p->pid), 0, 1);
       whoosh:
 #endif
       flush_pending_output (XINT (p->infd));
@@ -5887,7 +5885,7 @@
      obvious alternative.  */
   if (no_pgrp)
     {
-      kill (XFASTINT (p->pid), signo);
+      kill (p->pid, signo);
       return;
     }
 
@@ -5900,7 +5898,7 @@
     }
   else
     {
-      gid = - XFASTINT (p->pid);
+      gid = - p->pid;
       kill (gid, signo);
     }
 #else /* ! defined (TIOCSIGSEND) */
@@ -6020,11 +6018,17 @@
      (process, sigcode)
      Lisp_Object process, sigcode;
 {
-  Lisp_Object pid;
+  pid_t pid;
 
   if (INTEGERP (process))
     {
-      pid = process;
+      pid = XINT (process);
+      goto got_it;
+    }
+
+  if (FLOATP (process))
+    {
+      pid = (pid_t) XFLOAT (process);
       goto got_it;
     }
 
@@ -6033,8 +6037,8 @@
       Lisp_Object tem;
       if (tem = Fget_process (process), NILP (tem))
 	{
-	  pid = Fstring_to_number (process, make_number (10));
-	  if (XINT (pid) != 0)
+	  pid = XINT (Fstring_to_number (process, make_number (10)));
+	  if (pid > 0)
 	    goto got_it;
 	}
       process = tem;
@@ -6047,7 +6051,7 @@
 
   CHECK_PROCESS (process);
   pid = XPROCESS (process)->pid;
-  if (!INTEGERP (pid) || XINT (pid) <= 0)
+  if (pid <= 0)
     error ("Cannot signal process %s", SDATA (XPROCESS (process)->name));
 
  got_it:
@@ -6166,7 +6170,7 @@
 
 #undef handle_signal
 
-  return make_number (kill (XINT (pid), XINT (sigcode)));
+  return make_number (kill (pid, XINT (sigcode)));
 }
 
 DEFUN ("process-send-eof", Fprocess_send_eof, Sprocess_send_eof, 0, 1, 0,
@@ -6190,7 +6194,7 @@
   coding = proc_encode_coding_system[XINT (XPROCESS (proc)->outfd)];
 
   /* Make sure the process is really alive.  */
-  if (! NILP (XPROCESS (proc)->raw_status_low))
+  if (XPROCESS (proc)->raw_status_new)
     update_status (XPROCESS (proc));
   if (! EQ (XPROCESS (proc)->status, Qrun))
     error ("Process %s not running", SDATA (XPROCESS (proc)->name));
@@ -6215,7 +6219,7 @@
 	 for communication with the subprocess, call shutdown to cause EOF.
 	 (In some old system, shutdown to socketpair doesn't work.
 	 Then we just can't win.)  */
-      if (NILP (XPROCESS (proc)->pid)
+      if (XPROCESS (proc)->pid == 0
 	  || XINT (XPROCESS (proc)->outfd) == XINT (XPROCESS (proc)->infd))
 	shutdown (XINT (XPROCESS (proc)->outfd), 1);
       /* In case of socketpair, outfd == infd, so don't close it.  */
@@ -6352,7 +6356,7 @@
 	{
 	  proc = XCDR (XCAR (tail));
 	  p = XPROCESS (proc);
-	  if (GC_EQ (p->childp, Qt) && XINT (p->pid) == pid)
+	  if (GC_EQ (p->childp, Qt) && p->pid == pid)
 	    break;
 	  p = 0;
 	}
@@ -6364,7 +6368,7 @@
 	  {
 	    proc = XCDR (XCAR (tail));
 	    p = XPROCESS (proc);
-	    if (GC_INTEGERP (p->pid) && XINT (p->pid) == -1)
+	    if (p->pid == -1)
 	      break;
 	    p = 0;
 	  }
@@ -6377,8 +6381,8 @@
 
 	  XSETINT (p->tick, ++process_tick);
 	  u.wt = w;
-	  XSETINT (p->raw_status_low, u.i & 0xffff);
-	  XSETINT (p->raw_status_high, u.i >> 16);
+	  p->raw_status = u.i;
+	  p->raw_status_new = 1;
 
 	  /* If process has terminated, stop waiting for its output.  */
 	  if ((WIFSIGNALED (w) || WIFEXITED (w))
@@ -6575,7 +6579,7 @@
 	  buffer = p->buffer;
 
 	  /* Get the text to use for the message.  */
-	  if (!NILP (p->raw_status_low))
+	  if (p->raw_status_new)
 	    update_status (p);
 	  msg = status_message (p);
 
--- a/src/process.h	Fri Apr 07 12:02:40 2006 +0000
+++ b/src/process.h	Sun Apr 09 00:38:22 2006 +0000
@@ -51,8 +51,6 @@
     Lisp_Object log;
     /* Buffer that output is going to */
     Lisp_Object buffer;
-    /* Number of this process */
-    Lisp_Object pid;
     /* t if this is a real child process.
        For a net connection, it is a plist based on the arguments to make-network-process.  */
     Lisp_Object childp;
@@ -63,10 +61,6 @@
     /* Non-nil means kill silently if Emacs is exited.
        This is the inverse of the `query-on-exit' flag.  */
     Lisp_Object kill_without_query;
-    /* Record the process status in the raw form in which it comes from `wait'.
-       This is to avoid consing in a signal handler.  */
-    Lisp_Object raw_status_low;
-    Lisp_Object raw_status_high;
     /* Symbol indicating status of process.
        This may be a symbol: run, open, or closed.
        Or it may be a list, whose car is stop, exit or signal
@@ -112,6 +106,19 @@
     Lisp_Object read_output_delay;
     /* Skip reading this process on next read.  */
     Lisp_Object read_output_skip;
+
+    /* After this point, there are no Lisp_Objects any more.  */
+
+    /* Number of this process.
+       allocate_process assumes this is the first non-Lisp_Object field.
+       A value 0 is used for pseudo-processes such as network connections.  */
+    pid_t pid;
+    /* Record the process status in the raw form in which it comes from `wait'.
+       This is to avoid consing in a signal handler.  The `raw_status_new'
+       flag indicates that `raw_status' contains a new status that still
+       needs to be synced to `status'.  */
+    int raw_status_new : 1;
+    int raw_status;
 };
 
 /* Every field in the preceding structure except for the first two
--- a/src/w32fns.c	Fri Apr 07 12:02:40 2006 +0000
+++ b/src/w32fns.c	Sun Apr 09 00:38:22 2006 +0000
@@ -3298,6 +3298,14 @@
       return (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONUP);
 
     case WM_MOUSEMOVE:
+      /* Ignore mouse movements as long as the menu is active.  These
+	 movements are processed by the window manager anyway, and
+	 it's wrong to handle them as if they happened on the
+	 underlying frame.  */
+      f = x_window_to_frame (dpyinfo, hwnd);
+      if (f && f->output_data.w32->menubar_active)
+	return 0;
+
       /* If the mouse has just moved into the frame, start tracking
 	 it, so we will be notified when it leaves the frame.  Mouse
 	 tracking only works under W98 and NT4 and later. On earlier
@@ -7730,9 +7738,12 @@
     AdjustWindowRect (&rect, f->output_data.w32->dwStyle,
 		      FRAME_EXTERNAL_MENU_BAR (f));
 
-    /* Position and size tooltip, and put it in the topmost group.  */
+    /* Position and size tooltip, and put it in the topmost group.
+       The add-on of 3 to the 5th argument is a kludge: without it,
+       some fonts cause the last character of the tip to be truncated,
+       for some obscure reason.  */
     SetWindowPos (FRAME_W32_WINDOW (f), HWND_TOPMOST,
-		  root_x, root_y, rect.right - rect.left,
+		  root_x, root_y, rect.right - rect.left + 3,
 		  rect.bottom - rect.top, SWP_NOACTIVATE);
 
     /* Ensure tooltip is on top of other topmost windows (eg menus).  */