diff --git a/Misc/README.AIX b/Misc/README.AIX
deleted file mode 100644
index d928f53..0000000
--- a/Misc/README.AIX
+++ /dev/null
@@ -1,155 +0,0 @@
-Subject: AIX - Misc/AIX-NOTES
-From: Vladimir Marangozov <Vladimir.Marangozov@imag.fr>
-To: guido@CNRI.Reston.Va.US (Guido van Rossum)
-Date: Wed, 6 Aug 1997 11:41:00 +0200 (EET)
-
-==============================================================================
-                              COMPILER INFORMATION
-------------------------------------------------------------------------------
-
-(1) A problem has been reported with "make test" failing because of "weird
-    indentation."  Searching the comp.lang.python newsgroup reveals several
-    threads on this subject, and it seems to be a compiler bug in an old
-    version of the AIX CC compiler.  However, the compiler/OS combination
-    which has this problem is not identified.  In preparation for the 1.4
-    release, Vladimir Marangozov (Vladimir.Marangozov@imag.fr) and Manus Hand
-    (mhand@csn.net) reported no such troubles for the following compilers and
-    operating system versions:
-       AIX C compiler version 3.1.2 on AIX 4.1.3 and AIX 4.1.4
-       AIX C compiler version 1.3.0 on AIX 3.2.5
-    If you have this problem, please report the compiler/OS version.
-
-(2) Stefan Esser (se@MI.Uni-Koeln.DE), in work done to compile Python
-    1.0.0 on AIX 3.2.4, reports that AIX compilers don't like the LANG
-    environment varaiable set to European locales.  This makes the compiler
-    generate floating point constants using "," as the decimal separator,
-    which the assembler doesn't understand (or perhaps it is the other way
-    around, with the assembler expecting, but not getting "," in float
-    numbers).  "LANG=C; export LANG" solves the problem, as does
-    "LANG=C $(MAKE) ..." in the master Makefile.
-
-(3) The cc (or xlc) compiler considers "Python/ceval.c" too complex to
-    optimize, except when invoked with "-qmaxmem=4000"
-
-(4) Some problems (due to _AIX not being #defined) when python 1.0.0 was
-    compiled using 'gcc -ansi' were reported by Stefan Esser, but were not
-    investigated.
-
-(5) The cc compiler has internal variables named "__abs" and "__div".  These
-    names are reserved and may not be used as program variables in compiled
-    source.  (As an anecdote in support of this, the implementation of
-    Python/operator.c had this problem in the 1.4 beta releases, and the
-    solution was to re#define some core-source variables having these names,
-    to give these python variables different names if the build is being done
-    on AIX.)
-
-(6) As mentioned in the README, builds done immediately after previous builds
-    (without "make clean" or "make clobber") sometimes fail for mysterious
-    reasons.  There are some unpredictable results when the configuration
-    is changed (that is, if you "configure" with different parameters) or if
-    intermediate changes are made to some files.  Performing "make clean" or
-    "make clobber" resolves the problems.
-
-==============================================================================
-                                THREAD SUPPORT
-------------------------------------------------------------------------------
-
-As of AIX version 4, there are two (incompatible) types of pthreads on AIX:
-        a)  AIX DCE pthreads (on AIX 3.2.5)
-        b)  AIX 4 pthreads (on AIX 4.1 and up)
-Support has been added to Python to handle the distinction.
-
-The cc and gcc compilers do not initialize pthreads properly. The only
-compilers that can initialize pthreads properly are IBM *_r* compilers,
-which use the crt0_r.o module, and which invoke ld with the reentrant
-version of libc (libc_r).
-
-In order to enable thread support, follow these steps:
-   1.  Uncomment the thread module in Modules/Setup
-   2.  configure --without-gcc --with-thread ...
-   3.  make CC="cc_r" OPT="-O -qmaxmem=4000"
-
-For example, to make with both threads and readline, use:
-  ./configure --without-gcc --with-thread --with-readline=/usr/local/lib
-  make CC=cc_r OPT="-O2 -qmaxmem=4000"
-
-If the "make" which is used ignores the "CC=cc_r" directive, one could alias
-the cc command to cc_r (for example, in C-shell, perform an "alias cc cc_r").
-
-Vladimir Marangozov (Vladimir.Marangozov@imag.fr) provided this information,
-and he reports that a cc_r build initializes threads properly and that all
-demos on threads run okay with cc_r.
-
-==============================================================================
-                            SHARED LIBRARY SUPPORT
-------------------------------------------------------------------------------
-
-AIX shared library support was added to Python in the 1.4 release by Manus
-Hand (mhand@csn.net) and Vladimir Marangozov (Vladimir.Marangozov@imag.fr).
-
-Python modules may now be built as shared libraries on AIX using the normal
-process of uncommenting the "*shared*" line in Modules/Setup before the
-build.
-
-AIX shared libraries require that an "export" and "import" file be provided
-at compile time to list all extern symbols which may be shared between
-modules.  The "export" file (named python.exp) for the modules and the
-libraries that belong to the Python core is created by the "makexp_aix"
-script before performing the link of the python binary. It lists all global
-symbols (exported during the link) of the modules and the libraries that
-make up the python executable.
-
-When shared library modules (.so files) are made, a second shell script
-is invoked.  This script is named "ld_so_aix" and is also provided with
-the distribution in the Modules subdirectory.  This script acts as an "ld"
-wrapper which hides the explicit management of "export" and "import" files;
-it adds the appropriate arguments (in the appropriate order) to the link
-command that creates the shared module.  Among other things, it specifies
-that the "python.exp" file is an "import" file for the shared module.
-
-At the time of this writing, neither the python.exp file nor the makexp_aix
-or ld_so_aix scripts are installed by the make procedure, so you should
-remember to keep these and/or copy them to a different location for
-safekeeping if you wish to use them to add shared extension modules to
-python.  However, if the make process has been updated since this writing,
-these files MAY have been installed for you during the make by the
-LIBAINSTALL rule, in which case the need to make safe copies is obviated.
-
-If you wish to add a shared extension module to the language, you would follow
-the steps given in the example below (the example adds the shared extension
-module "spam" to python):
-    1.  Make sure that "ld_so_aix" and "makexp_aix" are in your path.
-    2.  The "python.exp" file should be in the current directory.
-    3.  Issue the following commands or include them in your Makefile:
-            cc -c spammodule.c
-            ld_so_aix cc spammodule.o -o spammodule.so
-
-For more detailed information on the shared library support, examine the
-contents of the "ld_so_aix" and "makexp_aix" scripts or refer to the AIX
-documentation.
-
-NOTE:  If the extension module is written in C++ and contains templates,
-       an alternative to "ld_so_aix" is the /usr/lpp/xlC/bin/makeC++SharedLib
-       script.  Chris Myers (myers@TC.Cornell.EDU) reports that ld_so_aix
-       works well for some C++ (including the C++ that is generated
-       automatically by the Python SWIG package [SWIG can be found at
-       http://www.cs.utah.edu/~beazley/SWIG/swig.html]).  However, it is not
-       known whether makeC++SharedLib can be used as a complete substitute
-       for ld_so_aix.
-
-According to Gary Hook from IBM, the format of the export file changed
-in AIX 4.2.  For AIX 4.2 and later, a period "." is required on the
-first line after "#!".  If python crashes while importing a shared
-library, you can try modifying the LINKCC variable in the Makefile.
-It probably looks like this:
-
-	LINKCC=     $(srcdir)/Modules/makexp_aix Modules/python.exp \"\" $(LIBRARY); $(PURIFY) $(CXX)
-
-You should modify the \"\" to be a period:
-
-	LINKCC=     $(srcdir)/Modules/makexp_aix Modules/python.exp . $(LIBRARY); $(PURIFY) $(CXX)
-
-Using a period fixed the problem in the snake farm.  YMMV.
-This fix has been incorporated into Python 2.3.
-
-==============================================================================
diff --git a/Misc/README.OpenBSD b/Misc/README.OpenBSD
deleted file mode 100644
index b417ecc..0000000
--- a/Misc/README.OpenBSD
+++ /dev/null
@@ -1,38 +0,0 @@
-
-2005-01-08
-
-If you are have a problem building on OpenBSD and see output like this
-while running configure:
-
-checking curses.h presence... yes
-configure: WARNING: curses.h: present but cannot be compiled
-configure: WARNING: curses.h: check for missing prerequisite headers?
-configure: WARNING: curses.h: see the Autoconf documentation
-configure: WARNING: curses.h: section "Present But Cannot Be Compiled"
-configure: WARNING: curses.h: proceeding with the preprocessor's result
-configure: WARNING: curses.h: in the future, the compiler will take precedence
-
-there is likely a problem that will prevent building python.  
-If you see the messages above and are able to completely build python,
-please tell python-dev@python.org indicating your version of OpenBSD
-and any other relevant system configuration.
-
-The build error that occurs while making may look something like this:
-
-    /usr/include/sys/event.h:53: error: syntax error before "u_int"
-    /usr/include/sys/event.h:55: error: syntax error before "u_short"
-
-To fix this problem, you will probably need update Python's configure
-script to disable certain options.  Search for a line that looks like:
-
-    OpenBSD/2.* | OpenBSD/3.@<:@012345678@:>@)
-
-If your version is not in that list, e.g., 3.9, add the version
-number.  In this case, you would just need to add a 9 after the 8.
-If you modify configure.in, you will need to regenerate configure
-with autoconf.
-
-If your version is already in the list, this is not a known problem.
-Please submit a bug report here:
-
-    http://sourceforge.net/tracker/?group_id=5470&atid=105470
diff --git a/Misc/cheatsheet b/Misc/cheatsheet
deleted file mode 100644
index ebbf1d4..0000000
--- a/Misc/cheatsheet
+++ /dev/null
@@ -1,2179 +0,0 @@
-                          Python 2.3 Quick Reference
-
-
- 25 Jan 2003  upgraded by Raymond Hettinger for Python 2.3
- 16 May 2001  upgraded by Richard Gruet and Simon Brunning for Python 2.0
- 2000/07/18  upgraded by Richard Gruet, rgruet@intraware.com for Python 1.5.2
-from V1.3 ref
-1995/10/30, by Chris Hoffmann, choffman@vicorp.com
-
-Based on:
-    Python Bestiary, Author: Ken Manheimer, ken.manheimer@nist.gov
-    Python manuals, Authors: Guido van Rossum and Fred Drake
-    What's new in Python 2.0, Authors: A.M. Kuchling and Moshe Zadka
-    python-mode.el, Author: Tim Peters, tim_one@email.msn.com
-
-    and the readers of comp.lang.python
-
-Python's nest: http://www.python.org     Developement: http://
-python.sourceforge.net/    ActivePython : http://www.ActiveState.com/ASPN/
-Python/
-newsgroup: comp.lang.python  Help desk: help@python.org
-Resources: http://starship.python.net/
-           http://www.vex.net/parnassus/
-           http://aspn.activestate.com/ASPN/Cookbook/Python
-FAQ:       http://www.python.org/cgi-bin/faqw.py
-Full documentation: http://www.python.org/doc/
-Excellent reference books:
-           Python Essential Reference by David Beazley (New Riders)
-           Python Pocket Reference by Mark Lutz (O'Reilly)
-
-
-Invocation Options
-
-python [-diOStuUvxX?] [-c command | script | - ] [args]
-
-                              Invocation Options
-Option                                  Effect
--c cmd  program passed in as string (terminates option list)
--d      Outputs parser debugging information (also PYTHONDEBUG=x)
--E      ignore environment variables (such as PYTHONPATH)
--h      print this help message and exit
--i      Inspect interactively after running script (also PYTHONINSPECT=x) and
-        force prompts, even if stdin appears not to be a terminal
--m mod  run library module as a script (terminates option list
--O      optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)
--OO     remove doc-strings in addition to the -O optimizations
--Q arg  division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew
--S      Don't perform 'import site' on initialization
--u      Unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x).
--v      Verbose (trace import statements) (also PYTHONVERBOSE=x)
--W arg : warning control (arg is action:message:category:module:lineno)
--x      Skip first line of source, allowing use of non-unix Forms of #!cmd
--?      Help!
--c      Specify the command to execute (see next section). This terminates the
-command option list (following options are passed as arguments to the command).
-        the name of a python file (.py) to execute read from stdin.
-script  Anything afterward is passed as options to python script or command,
-        not interpreted as an option to interpreter itself.
-args    passed to script or command (in sys.argv[1:])
-        If no script or command, Python enters interactive mode.
-
-  * Available IDEs in std distrib: IDLE (tkinter based, portable), Pythonwin
-    (Windows).
-
-
-
-Environment variables
-
-                             Environment variables
-    Variable                                 Effect
-PYTHONHOME       Alternate prefix directory (or prefix;exec_prefix). The
-                 default module search path uses prefix/lib
-                 Augments the default search path for module files. The format
-                 is the same as the shell's $PATH: one or more directory
-                 pathnames separated by ':' or ';' without spaces around
-                 (semi-)colons!
-PYTHONPATH       On Windows first search for Registry key HKEY_LOCAL_MACHINE\
-                 Software\Python\PythonCore\x.y\PythonPath (default value). You
-                 may also define a key named after your application with a
-                 default string value giving the root directory path of your
-                 app.
-                 If this is the name of a readable file, the Python commands in
-PYTHONSTARTUP    that file are executed before the first prompt is displayed in
-                 interactive mode (no default).
-PYTHONDEBUG      If non-empty, same as -d option
-PYTHONINSPECT    If non-empty, same as -i option
-PYTHONSUPPRESS   If non-empty, same as -s option
-PYTHONUNBUFFERED If non-empty, same as -u option
-PYTHONVERBOSE    If non-empty, same as -v option
-PYTHONCASEOK     If non-empty, ignore case in file/module names (imports)
-
-
-
-
-Notable lexical entities
-
-Keywords
-
-    and       del       for       is        raise
-    assert    elif      from      lambda    return
-    break     else      global    not       try
-    class     except    if        or        while
-    continue  exec      import    pass      yield
-    def       finally   in        print
-
-  * (list of keywords in std module: keyword)
-  * Illegitimate Tokens (only valid in strings): @ $ ?
-  * A statement must all be on a single line. To break a statement over
-    multiple lines use "\", as with the C preprocessor.
-    Exception: can always break when inside any (), [], or {} pair, or in
-    triple-quoted strings.
-  * More than one statement can appear on a line if they are separated with
-    semicolons (";").
-  * Comments start with "#" and continue to end of line.
-
-Identifiers
-
-        (letter | "_")  (letter | digit | "_")*
-
-  * Python identifiers keywords, attributes, etc. are case-sensitive.
-  * Special forms: _ident (not imported by 'from module import *'); __ident__
-    (system defined name);
-               __ident (class-private name mangling)
-
-Strings
-
-    "a string enclosed by double quotes"
-    'another string delimited by single quotes and with a " inside'
-    '''a string containing embedded newlines and quote (') marks, can be
-    delimited with triple quotes.'''
-    """ may also use 3- double quotes as delimiters """
-    u'a unicode string'   U"Another unicode string"
-    r'a raw string where \ are kept (literalized): handy for regular
-    expressions and windows paths!'
-    R"another raw string"    -- raw strings cannot end with a \
-    ur'a unicode raw string'   UR"another raw unicode"
-
-        Use \ at end of line to continue a string on next line.
-        adjacent strings are concatened, e.g. 'Monty' ' Python' is the same as
-        'Monty Python'.
-        u'hello' + ' world'  --> u'hello world'   (coerced to unicode)
-
-    String Literal Escapes
-
-     \newline  Ignored (escape newline)
-     \\ Backslash (\)        \e Escape (ESC)        \v Vertical Tab (VT)
-     \' Single quote (')     \f Formfeed (FF)       \OOO char with octal value OOO
-     \" Double quote (")     \n Linefeed (LF)
-     \a Bell (BEL)           \r Carriage Return (CR) \xHH  char with hex value HH
-     \b Backspace (BS)       \t Horizontal Tab (TAB)
-     \uHHHH  unicode char with hex value HHHH, can only be used in unicode string
-     \UHHHHHHHH  unicode char with hex value HHHHHHHH, can only be used in unicode string
-     \AnyOtherChar is left as-is
-
-  * NUL byte (\000) is NOT an end-of-string marker; NULs may be embedded in
-    strings.
-  * Strings (and tuples) are immutable: they cannot be modified.
-
-Numbers
-
-    Decimal integer: 1234, 1234567890546378940L        (or l)
-    Octal integer: 0177, 0177777777777777777 (begin with a 0)
-    Hex integer: 0xFF, 0XFFFFffffFFFFFFFFFF (begin with 0x or 0X)
-    Long integer (unlimited precision): 1234567890123456
-    Float (double precision): 3.14e-10, .001, 10., 1E3
-    Complex: 1J, 2+3J, 4+5j (ends with J or j, + separates (float) real and
-    imaginary parts)
-
-Sequences
-
-  * String of length 0, 1, 2 (see above)
-    '', '1', "12", 'hello\n'
-  * Tuple of length 0, 1, 2, etc:
-    () (1,) (1,2)     # parentheses are optional if len > 0
-  * List of length 0, 1, 2, etc:
-    [] [1] [1,2]
-
-Indexing is 0-based. Negative indices (usually) mean count backwards from end
-of sequence.
-
-Sequence slicing [starting-at-index : but-less-than-index]. Start defaults to
-'0'; End defaults to 'sequence-length'.
-
-a = (0,1,2,3,4,5,6,7)
-    a[3] ==> 3
-    a[-1] ==> 7
-    a[2:4] ==> (2, 3)
-    a[1:] ==> (1, 2, 3, 4, 5, 6, 7)
-    a[:3] ==> (0, 1, 2)
-    a[:] ==> (0,1,2,3,4,5,6,7)  # makes a copy of the sequence.
-
-Dictionaries (Mappings)
-
-    {}                              # Zero length empty dictionary
-    {1 : 'first'}                   # Dictionary with one (key, value) pair
-    {1 : 'first',  'next': 'second'}
-    dict([('one',1),('two',2)])     # Construct a dict from an item list
-    dict('one'=1, 'two'=2)          # Construct a dict using keyword args
-    dict.fromkeys(['one', 'keys'])  # Construct a dict from a sequence
-
-Operators and their evaluation order
-
-                     Operators and their evaluation order
-Highest             Operator                             Comment
-        (...) [...] {...} `...`           Tuple, list & dict. creation; string
-                                          conv.
-        s[i]  s[i:j]  s.attr f(...)       indexing & slicing; attributes, fct
-                                          calls
-        +x, -x, ~x                        Unary operators
-        x**y                              Power
-        x*y  x/y  x%y x//y                mult, division, modulo, floor division
-        x+y  x-y                          addition, subtraction
-        x<<y   x>>y                       Bit shifting
-        x&y                               Bitwise and
-        x^y                               Bitwise exclusive or
-        x|y                               Bitwise or
-        x<y  x<=y  x>y  x>=y  x==y x!=y   Comparison,
-        x is y   x is not y               membership
-        x in s   x not in s
-        not x                             boolean negation
-        x and y                           boolean and
-        x or y                            boolean or
-Lowest  lambda args: expr                 anonymous function
-
-Alternate names are defined in module operator (e.g. __add__ and add for +)
-Most operators are overridable.
-
-Many binary operators also support augmented assignment:
-        x += 1                            # Same as x = x + 1
-
-
-Basic Types and Their Operations
-
-Comparisons (defined between *any* types)
-
-               Comparisons
-Comparison         Meaning          Notes
-<          strictly less than        (1)
-<=         less than or equal to
->          strictly greater than
->=         greater than or equal to
-==         equal to
-!=         not equal to
-is         object identity           (2)
-is not     negated object identity   (2)
-
-Notes :
-    Comparison behavior can be overridden for a given class by defining special
-method __cmp__.
-    The above comparisons return True or False which are of type bool
-(a subclass of int) and behave exactly as 1 or 0 except for their type and
-that they print as True or False instead of 1 or 0.
-    (1) X < Y < Z < W has expected meaning, unlike C
-    (2) Compare object identities (i.e. id(object)), not object values.
-
-Boolean values and operators
-
-                         Boolean values and operators
-              Value or Operator                         Returns           Notes
-None, numeric zeros, empty sequences and      False
-mappings
-all other values                              True
-not x                                         True if x is False, else
-                                              True
-x or y                                        if x is False then y, else   (1)
-                                              x
-x and y                                       if x is False then x, else   (1)
-                                              y
-
-Notes :
-    Truth testing behavior can be overridden for a given class by defining
-special method __bool__.
-    (1) Evaluate second arg only if necessary to determine outcome.
-
-None
-
-    None is used as default return value on functions. Built-in single object
-    with type NoneType.
-    Input that evaluates to None does not print when running Python
-    interactively.
-
-Numeric types
-
-Floats and integers.
-
-    Floats are implemented with C doubles.
-    Integers have unlimited size (only limit is system resources)
-
-Operators on all numeric types
-
-           Operators on all numeric types
- Operation                    Result
-abs(x)       the absolute value of x
-int(x)       x converted to integer
-float(x)     x converted to floating point
--x           x negated
-+x           x unchanged
-x + y        the sum of x and y
-x - y        difference of x and y
-x * y        product of x and y
-x / y        quotient of x and y
-x % y        remainder of x / y
-divmod(x, y) the tuple (x/y, x%y)
-x ** y       x to the power y (the same as pow(x, y))
-
-Bit operators on integers
-
-              Bit operators
-Operation             >Result
-~x        the bits of x inverted
-x ^ y     bitwise exclusive or of x and y
-x & y     bitwise and of x and y
-x | y     bitwise or of x and y
-x << n    x shifted left by n bits
-x >> n    x shifted right by n bits
-
-Complex Numbers
-
-  * represented as a pair of machine-level double precision floating point
-    numbers.
-  * The real and imaginary value of a complex number z can be retrieved through
-    the attributes z.real and z.imag.
-
-Numeric exceptions
-
-TypeError
-    raised on application of arithmetic operation to non-number
-OverflowError
-     numeric bounds exceeded
-ZeroDivisionError
-     raised when zero second argument of div or modulo op
-FloatingPointError
-     raised when a floating point operation fails
-
-Operations on all sequence types (lists, tuples, strings)
-
-                Operations on all sequence types
-Operation                     Result                     Notes
-x in s     True if an item of s is equal to x, else False
-x not in s False if an item of s is equal to x, else True
-for x in s: loops over the sequence
-s + t      the concatenation of s and t
-s * n, n*s n copies of s concatenated
-s[i]       i'th item of s, origin 0                       (1)
-s[i:j]     slice of s from i (included) to j (excluded) (1), (2)
-len(s)     length of s
-min(s)     smallest item of s
-max(s)     largest item of (s)
-iter(s)    returns an iterator over s.  iterators define __iter__ and next()
-
-Notes :
-    (1) if i or j is negative, the index is relative to the end of the string,
-ie len(s)+ i or len(s)+j is
-         substituted. But note that -0 is still 0.
-    (2) The slice of s from i to j is defined as the sequence of items with
-index k such that i <= k < j.
-          If i or j is greater than len(s), use len(s). If i is omitted, use
-len(s). If i is greater than or
-          equal to j, the slice is empty.
-
-Operations on mutable (=modifiable) sequences (lists)
-
-                 Operations on mutable sequences
-   Operation                      Result                   Notes
-s[i] =x          item i of s is replaced by x
-s[i:j] = t       slice of s from i to j is replaced by t
-del s[i:j]       same as s[i:j] = []
-s.append(x)      same as s[len(s) : len(s)] = [x]
-s.count(x)       return number of i's for which s[i] == x
-s.extend(x)      same as s[len(s):len(s)]= x
-s.index(x)       return smallest i such that s[i] == x      (1)
-s.insert(i, x)   same as s[i:i] = [x] if i >= 0
-s.pop([i])       same as x = s[i]; del s[i]; return x       (4)
-s.remove(x)      same as del s[s.index(x)]                  (1)
-s.reverse()      reverse the items of s in place            (3)
-s.sort([cmpFct]) sort the items of s in place             (2), (3)
-
-Notes :
-    (1) raise a ValueError exception when x is not found in s (i.e. out of
-range).
-     (2) The sort() method takes an optional argument specifying a comparison
-fct of 2 arguments (list items) which should
-          return -1, 0, or 1 depending on whether the 1st argument is
-considered smaller than, equal to, or larger than the 2nd
-          argument. Note that this slows the sorting process down considerably.
-     (3) The sort() and reverse() methods modify the list in place for economy
-of space when sorting or reversing a large list.
-           They don't return the sorted or reversed list to remind you of this
-side effect.
-     (4) [New 1.5.2] The optional  argument i defaults to -1, so that by default the last
-item is removed and returned.
-
-
-
-Operations on mappings (dictionaries)
-
-                         Operations on mappings
-        Operation                          Result                  Notes
-len(d)                     the number of items in d
-d[k]                       the item of d with key k                 (1)
-d[k] = x                   set d[k] to x
-del d[k]                   remove d[k] from d                       (1)
-d.clear()                  remove all items from d
-d.copy()                   a shallow copy of d
-d.get(k,defaultval)        the item of d with key k                 (4)
-d.has_key(k)               True if d has key k, else False
-d.items()                  a copy of d's list of (key, item) pairs  (2)
-d.iteritems()              an iterator over (key, value) pairs      (7)
-d.iterkeys()               an iterator over the keys of d           (7)
-d.itervalues()             an iterator over the values of d         (7)
-d.keys()                   a copy of d's list of keys               (2)
-d1.update(d2)              for k, v in d2.items(): d1[k] = v        (3)
-d.values()                 a copy of d's list of values             (2)
-d.pop(k)                   remove d[k] and return its value
-d.popitem()                remove and return an arbitrary           (6)
-                           (key, item) pair
-d.setdefault(k,defaultval) the item of d with key k                 (5)
-
-    Notes :
-      TypeError is raised if key is not acceptable
-      (1) KeyError is raised if key k is not in the map
-      (2) Keys and values are listed in random order
-      (3) d2 must be of the same type as d1
-      (4) Never raises an exception if k is not in the map, instead it returns
-    defaultVal.
-          defaultVal is optional, when not provided and k is not in the map,
-    None is returned.
-      (5) Never raises an exception if k is not in the map, instead it returns
-    defaultVal, and adds k to map with value defaultVal. defaultVal is
-    optional. When not provided and k is not in the map, None is returned and
-    added to map.
-      (6) Raises a KeyError if the dictionary is emtpy.
-      (7) While iterating over a dictionary, the values may be updated but
-          the keys cannot be changed.
-
-Operations on strings
-
-Note that these string methods largely (but not completely) supersede the
-functions available in the string module.
-
-
-                             Operations on strings
-    Operation                             Result                          Notes
-s.capitalize()    return a copy of s with only its first character
-                  capitalized.
-s.center(width)   return a copy of s centered in a string of length width  (1)
-                  .
-s.count(sub[      return the number of occurrences of substring sub in     (2)
-,start[,end]])    string s.
-s.decode(([       return a decoded version of s.                           (3)
-  encoding
-  [,errors]])
-s.encode([        return an encoded version of s. Default encoding is the
-  encoding        current default string encoding.                         (3)
-  [,errors]])
-s.endswith(suffix return true if s ends with the specified suffix,         (2)
-  [,start[,end]]) otherwise return False.
-s.expandtabs([    return a copy of s where all tab characters are          (4)
-tabsize])         expanded using spaces.
-s.find(sub[,start return the lowest index in s where substring sub is      (2)
-[,end]])          found. Return -1 if sub is not found.
-s.index(sub[      like find(), but raise ValueError when the substring is  (2)
-,start[,end]])    not found.
-s.isalnum()       return True if all characters in s are alphanumeric,     (5)
-                  False otherwise.
-s.isalpha()       return True if all characters in s are alphabetic,       (5)
-                  False otherwise.
-s.isdigit()       return True if all characters in s are digit             (5)
-                  characters, False otherwise.
-s.islower()       return True if all characters in s are lowercase, False  (6)
-                  otherwise.
-s.isspace()       return True if all characters in s are whitespace        (5)
-                  characters, False otherwise.
-s.istitle()       return True if string s is a titlecased string, False    (7)
-                  otherwise.
-s.isupper()       return True if all characters in s are uppercase, False  (6)
-                  otherwise.
-s.join(seq)       return a concatenation of the strings in the sequence
-                  seq, separated by 's's.
-s.ljust(width)    return s left justified in a string of length width.    (1),
-                                                                           (8)
-s.lower()         return a copy of s converted to lowercase.
-s.lstrip()        return a copy of s with leading whitespace removed.
-s.replace(old,    return a copy of s with all occurrences of substring     (9)
-new[, maxsplit])  old replaced by new.
-s.rfind(sub[      return the highest index in s where substring sub is     (2)
-,start[,end]])    found. Return -1 if sub is not found.
-s.rindex(sub[     like rfind(), but raise ValueError when the substring    (2)
-,start[,end]])    is not found.
-s.rjust(width)    return s right justified in a string of length width.   (1),
-                                                                           (8)
-s.rstrip()        return a copy of s with trailing whitespace removed.
-s.split([sep[     return a list of the words in s, using sep as the       (10)
-,maxsplit]])      delimiter string.
-s.splitlines([    return a list of the lines in s, breaking at line       (11)
-keepends])        boundaries.
-s.startswith      return true if s starts with the specified prefix,
-(prefix[,start[   otherwise return false.                                  (2)
-,end]])
-s.strip()         return a copy of s with leading and trailing whitespace
-                  removed.
-s.swapcase()      return a copy of s with uppercase characters converted
-                  to lowercase and vice versa.
-                  return a titlecased copy of s, i.e. words start with
-s.title()         uppercase characters, all remaining cased characters
-                  are lowercase.
-s.translate(table return a copy of s mapped through translation table     (12)
-[,deletechars])   table.
-s.upper()         return a copy of s converted to uppercase.
-s.zfill(width)    return a string padded with zeroes on the left side and
-                  sliding a minus sign left if necessary.  never truncates.
-
-Notes :
-    (1) Padding is done using spaces.
-    (2) If optional argument start is supplied, substring s[start:] is
-processed. If optional arguments start and end are supplied, substring s[start:
-end] is processed.
-    (3) Optional argument errors may be given to set a different error handling
-scheme. The default for errors is 'strict', meaning that encoding errors raise
-a ValueError. Other possible values are 'ignore' and 'replace'.
-    (4) If optional argument tabsize is not given, a tab size of 8 characters
-is assumed.
-    (5) Returns false if string s does not contain at least one character.
-    (6) Returns false if string s does not contain at least one cased
-character.
-    (7) A titlecased string is a string in which uppercase characters may only
-follow uncased characters and lowercase characters only cased ones.
-    (8) s is returned if width is less than len(s).
-    (9) If the optional argument maxsplit is given, only the first maxsplit
-occurrences are replaced.
-    (10) If sep is not specified or None, any whitespace string is a separator.
-If maxsplit is given, at most maxsplit splits are done.
-    (11) Line breaks are not included in the resulting list unless keepends is
-given and true.
-    (12) table must be a string of length 256. All characters occurring in the
-optional argument deletechars are removed prior to translation.
-
-String formatting with the % operator
-
-formatString % args--> evaluates to a string
-
-  * formatString uses C printf format codes : %, c, s, i, d, u, o, x, X, e, E,
-    f, g, G, r (details below).
-  * Width and precision may be a * to specify that an integer argument gives
-    the actual width or precision.
-  * The flag characters -, +, blank, # and 0 are understood. (details below)
-  * %s will convert any type argument to string (uses str() function)
-  * args may be a single arg or a tuple of args
-
-        '%s has %03d quote types.' % ('Python', 2)  # => 'Python has 002 quote types.'
-
-  * Right-hand-side can also be a mapping:
-
-        a = '%(lang)s has %(c)03d quote types.' % {'c':2, 'lang':'Python}
-(vars() function very handy to use on right-hand-side.)
-
-                                 Format codes
-Conversion                               Meaning
-d          Signed integer decimal.
-i          Signed integer decimal.
-o          Unsigned octal.
-u          Unsigned decimal.
-x          Unsigned hexadecimal (lowercase).
-X          Unsigned hexadecimal (uppercase).
-e          Floating point exponential format (lowercase).
-E          Floating point exponential format (uppercase).
-f          Floating point decimal format.
-F          Floating point decimal format.
-g          Same as "e" if exponent is greater than -4 or less than precision,
-           "f" otherwise.
-G          Same as "E" if exponent is greater than -4 or less than precision,
-           "F" otherwise.
-c          Single character (accepts integer or single character string).
-r          String (converts any python object using repr()).
-s          String (converts any python object using str()).
-%          No argument is converted, results in a "%" character in the result.
-           (The complete specification is %%.)
-
-                          Conversion flag characters
-Flag                                  Meaning
-#    The value conversion will use the ``alternate form''.
-0    The conversion will be zero padded.
--    The converted value is left adjusted (overrides "-").
-     (a space) A blank should be left before a positive number (or empty
-     string) produced by a signed conversion.
-+    A sign character ("+" or "-") will precede the conversion (overrides a
-     "space" flag).
-
-File Objects
-
-Created with built-in function open; may be created by other modules' functions
-as well.
-
-Operators on file objects
-
-                                File operations
-    Operation                                Result
-f.close()         Close file f.
-f.fileno()        Get fileno (fd) for file f.
-f.flush()         Flush file f's internal buffer.
-f.isatty()        True if file f is connected to a tty-like dev, else False.
-f.read([size])    Read at most size bytes from file f and return as a string
-                  object. If size omitted, read to EOF.
-f.readline()      Read one entire line from file f.
-f.readlines()     Read until EOF with readline() and return list of lines read.
-                  Set file f's position, like "stdio's fseek()".
-f.seek(offset[,   whence == 0 then use absolute indexing.
-whence=0])        whence == 1 then offset relative to current pos.
-                  whence == 2 then offset relative to file end.
-f.tell()          Return file f's current position (byte offset).
-f.write(str)      Write string to file f.
-f.writelines(list Write list of strings to file f.
-)
-
-File Exceptions
-
-  EOFError
-     End-of-file hit when reading (may be raised many times, e.g. if f is a
-    tty).
-  IOError
-     Other I/O-related I/O operation failure.
-  OSError
-     OS system call failed.
-
-
-    Advanced Types
-
-    -See manuals for more details -
-      + Module objects
-      + Class objects
-      + Class instance objects
-      + Type objects (see module: types)
-      + File objects (see above)
-      + Slice objects
-      + XRange objects
-      + Callable types:
-          o User-defined (written in Python):
-              # User-defined Function objects
-              # User-defined Method objects
-          o Built-in (written in C):
-              # Built-in Function objects
-              # Built-in Method objects
-      + Internal Types:
-          o Code objects (byte-compile executable Python code: bytecode)
-          o Frame objects (execution frames)
-          o Traceback objects (stack trace of an exception)
-
-
-    Statements
-
-    pass            -- Null statement
-    del name[,name]* -- Unbind name(s) from object. Object will be indirectly
-                        (and automatically) deleted only if no longer referenced.
-    print [>> fileobject,] [s1 [, s2 ]* [,]
-                    -- Writes to sys.stdout, or to fileobject if supplied.
-                       Puts spaces between arguments. Puts newline at end
-                       unless statement ends with comma.
-                       Print is not required when running interactively,
-                       simply typing an expression will print its value,
-                       unless the value is None.
-    exec x [in globals [,locals]]
-                    -- Executes x in namespaces provided. Defaults
-                       to current namespaces. x can be a string, file
-                       object or a function object.
-    callable(value,... [id=value], [*args], [**kw])
-                    -- Call function callable with parameters. Parameters can
-                       be passed by name or be omitted if function
-                       defines default values. E.g. if callable is defined as
-                       "def callable(p1=1, p2=2)"
-                       "callable()"       <=>  "callable(1, 2)"
-                       "callable(10)"     <=>  "callable(10, 2)"
-                       "callable(p2=99)"  <=>  "callable(1, 99)"
-                       *args is a tuple of positional arguments.
-                       **kw is a dictionary of keyword arguments.
-
-    Assignment operators
-
-                              Caption
-    Operator                    Result                     Notes
-    a = b    Basic assignment - assign object b to label a  (1)
-    a += b   Roughly equivalent to a = a + b                (2)
-    a -= b   Roughly equivalent to a = a - b                (2)
-    a *= b   Roughly equivalent to a = a * b                (2)
-    a /= b   Roughly equivalent to a = a / b                (2)
-    a %= b   Roughly equivalent to a = a % b                (2)
-    a **= b  Roughly equivalent to a = a ** b               (2)
-    a &= b   Roughly equivalent to a = a & b                (2)
-    a |= b   Roughly equivalent to a = a | b                (2)
-    a ^= b   Roughly equivalent to a = a ^ b                (2)
-    a >>= b  Roughly equivalent to a = a >> b               (2)
-    a <<= b  Roughly equivalent to a = a << b               (2)
-
-    Notes :
-        (1) Can unpack tuples, lists, and strings.
-           first, second = a[0:2]; [f, s] = range(2); c1,c2,c3='abc'
-           Tip: x,y = y,x swaps x and y.
-        (2) Not exactly equivalent - a is evaluated only once. Also, where
-    possible, operation performed in-place - a is modified rather than
-    replaced.
-
-    Control Flow
-
-    if condition: suite
-    [elif condition: suite]*
-    [else: suite]   -- usual if/else_if/else statement
-    while condition: suite
-    [else: suite]
-                    -- usual while statement. "else" suite is executed
-                       after loop exits, unless the loop is exited with
-                       "break"
-    for element in sequence: suite
-    [else: suite]
-                    -- iterates over sequence, assigning each element to element.
-                       Use built-in range function to iterate a number of times.
-                       "else" suite executed at end unless loop exited
-                       with "break"
-    break           -- immediately exits "for" or "while" loop
-    continue        -- immediately does next iteration of "for" or "while" loop
-    return [result] -- Exits from function (or method) and returns result (use a tuple to
-                       return more than one value). If no result given, then returns None.
-    yield result    -- Freezes the execution frame of a generator and returns the result
-                       to the iterator's .__next__() method.  Upon the next call to __next__(),
-                       resumes execution at the frozen point with all of the local variables
-                       still intact.
-
-    Exception Statements
-
-    assert expr[, message]
-                    -- expr is evaluated. if false, raises exception AssertionError
-                       with message. Inhibited if __debug__ is 0.
-    try: suite1
-    [except [exception [, value]: suite2]+
-    [else: suite3]
-                    -- statements in suite1 are executed. If an exception occurs, look
-                       in "except" clauses for matching <exception>. If matches or bare
-                       "except" execute suite of that clause. If no exception happens
-                       suite in "else" clause is executed after suite1.
-                       If exception has a value, it is put in value.
-                       exception can also be tuple of exceptions, e.g.
-                       "except (KeyError, NameError), val: print val"
-    try: suite1
-    finally: suite2
-                    -- statements in suite1 are executed. If no
-                       exception, execute suite2 (even if suite1 is
-                       exited with a "return", "break" or "continue"
-                       statement). If exception did occur, executes
-                       suite2 and then immediately reraises exception.
-    raise exception [,value [, traceback]]
-                    -- raises exception with optional value
-                       value. Arg traceback specifies a traceback object to
-                       use when printing the exception's backtrace.
-    raise           -- a raise statement without arguments re-raises
-                       the last exception raised in the current function
-An exception is either a string (object) or a class instance.
-  Can create a new one simply by creating a new string:
-
-              my_exception = 'You did something wrong'
-      try:
-                   if bad:
-              raise my_exception, bad
-      except my_exception, value:
-                    print 'Oops', value
-
-Exception classes must be derived from the predefined class: Exception, e.g.:
-            class text_exception(Exception): pass
-            try:
-                if bad:
-                    raise text_exception()
-                    # This is a shorthand for the form
-                    # "raise <class>, <instance>"
-             except Exception:
-                 print 'Oops'
-                 # This will be printed because
-                 # text_exception is a subclass of Exception
-When an error message is printed for an unhandled exception which is a
-class, the class name is printed, then a colon and a space, and
-finally the instance converted to a string using the built-in function
-str().
-All built-in exception classes derives from Exception, itself
-derived from BaseException.
-
-Name Space Statements
-
-[1.51: On Mac & Windows, the case of module file names must now match the case
-as used
-  in the import statement]
-Packages (>1.5): a package is a name space which maps to a directory including
-                module(s) and the special initialization module '__init__.py'
-                (possibly empty). Packages/dirs can be nested. You address a
-                module's symbol via '[package.[package...]module.symbol's.
-import module1 [as name1] [, module2]*
-                -- imports modules. Members of module must be
-                   referred to by qualifying with [package.]module name:
-                   "import sys; print sys.argv:"
-                   "import package1.subpackage.module; package1.subpackage.module.foo()"
-                   module1 renamed as name1, if supplied.
-from module import name1 [as othername1] [, name2]*
-                -- imports names from module module in current namespace.
-                   "from sys import argv; print argv"
-                   "from package1 import module; module.foo()"
-                   "from package1.module import foo; foo()"
-                   name1 renamed as othername1, if supplied.
-from module import *
-                -- imports all names in module, except those starting with "_";
-                   *to be used sparsely, beware of name clashes* :
-                   "from sys import *; print argv"
-                   "from package.module import *; print x'
-                    NB: "from package import *" only imports the symbols defined
-                    in the package's __init__.py file, not those in the
-                    template modules!
-global name1 [, name2]*
-                -- names are from global scope (usually meaning from module)
-                   rather than local (usually meaning only in function).
-                -- E.g. in fct without "global" statements, assuming
-                   "a" is name that hasn't been used in fct or module
-                   so far:
-                   -Try to read from "a" -> NameError
-                   -Try to write to "a" -> creates "a" local to fcn
-                   -If "a" not defined in fct, but is in module, then
-                       -Try to read from "a", gets value from module
-                       -Try to write to "a", creates "a" local to fct
-                   But note "a[0]=3" starts with search for "a",
-                   will use to global "a" if no local "a".
-
-Function Definition
-
-def func_id ([param_list]): suite
-                -- Creates a function object & binds it to name func_id.
-
-    param_list ::= [id [, id]*]
-    id ::= value | id = value | *id | **id
-    [Args are passed by value.Thus only args representing a mutable object
-    can be modified (are inout parameters). Use a tuple to return more than
-    one value]
-
-Example:
-        def test (p1, p2 = 1+1, *rest, **keywords):
-            -- Parameters with "=" have default value (v is
-               evaluated when function defined).
-               If list has "*id" then id is assigned a tuple of
-               all remaining args passed to function (like C vararg)
-               If list has "**id" then id is assigned a dictionary of
-               all extra arguments passed as keywords.
-
-Class Definition
-
-class <class_id> [(<super_class1> [,<super_class2>]*)]: <suite>
-        -- Creates a class object and assigns it name <class_id>
-           <suite> may contain local "defs" of class methods and
-           assignments to class attributes.
-Example:
-       class my_class (class1, class_list[3]): ...
-                  Creates a class object inheriting from both "class1" and whatever
-                  class object "class_list[3]" evaluates to. Assigns new
-                  class object to name "my_class".
-        - First arg to class methods is always instance object, called 'self'
-          by convention.
-        - Special method __init__() is called when instance is created.
-        - Special method __del__() called when no more reference to object.
-        - Create instance by "calling" class object, possibly with arg
-          (thus instance=apply(aClassObject, args...) creates an instance!)
-        - In current implementation, can't subclass off built-in
-          classes. But can "wrap" them, see UserDict & UserList modules,
-          and see __getattr__() below.
-Example:
-        class c (c_parent):
-           def __init__(self, name): self.name = name
-           def print_name(self): print "I'm", self.name
-           def call_parent(self): c_parent.print_name(self)
-           instance = c('tom')
-           print instance.name
-           'tom'
-           instance.print_name()
-           "I'm tom"
-        Call parent's super class by accessing parent's method
-        directly and passing "self" explicitly (see "call_parent"
-        in example above).
-        Many other special methods available for implementing
-        arithmetic operators, sequence, mapping indexing, etc.
-
-Documentation Strings
-
-Modules, classes and functions may be documented by placing a string literal by
-itself as the first statement in the suite. The documentation can be retrieved
-by getting the '__doc__' attribute from the module, class or function.
-Example:
-        class C:
-            "A description of C"
-            def __init__(self):
-                "A description of the constructor"
-                # etc.
-Then c.__doc__ == "A description of C".
-Then c.__init__.__doc__ == "A description of the constructor".
-
-Others
-
-lambda [param_list]: returnedExpr
-                -- Creates an anonymous function. returnedExpr must be
-                   an expression, not a statement (e.g., not "if xx:...",
-                   "print xxx", etc.) and thus can't contain newlines.
-                   Used mostly for filter(), map() functions, and GUI callbacks..
-List comprehensions
-result = [expression for item1 in sequence1  [if condition1]
-                        [for item2 in sequence2 ... for itemN in sequenceN]
-                      ]
-is equivalent to:
-result = []
-for item1 in sequence1:
-    for item2 in sequence2:
-    ...
-        for itemN in sequenceN:
-             if (condition1) and furthur conditions:
-                  result.append(expression)
-
-
-
-Built-In Functions
-
-                              Built-In Functions
-     Function                                 Result
-__import__(name[,   Imports module within the given context (see lib ref for
-globals[, locals[,  more details)
-fromlist]]])
-abs(x)              Return the absolute value of number x.
-bool(x)             Returns True when the argument x is true and False otherwise.
-buffer(obj)         Creates a buffer reference to an object.
-chr(i)              Returns one-character string whose ASCII code isinteger i
-classmethod(f)      Converts a function f, into a method with the class as the
-                    first argument.  Useful for creating alternative constructors.
-cmp(x,y)            Returns negative, 0, positive if x <, ==, > to y
-compile(string,     from which the code was read, or eg. '<string>'if not read
-filename, kind)     from file.kind can be 'eval' if string is a single stmt, or
-                    'single' which prints the output of expression statements
-                    that evaluate to something else than None, or be 'exec'.
-complex(real[,      Builds a complex object (can also be done using J or j
-image])             suffix,e.g. 1+3J)
-delattr(obj, name)  deletes attribute named name of object obj <=> del obj.name
-                    If no args, returns the list of names in current
-dict([items])       Create a new dictionary from the specified item list.
-dir([object])       local symbol table. With a module, class or class
-                    instance object as arg, returns list of names in its attr.
-                    dict.
-divmod(a,b)         Returns tuple of (a/b, a%b)
-enumerate(seq)      Return a iterator giving:  (0, seq[0]), (1, seq[1]), ...
-eval(s[, globals[,  Eval string s in (optional) globals, locals contexts.s must
-locals]])           have no NUL's or newlines. s can also be acode object.
-                    Example: x = 1; incr_x = eval('x + 1')
-filter(function,    Constructs a list from those elements of sequence for which
-sequence)           function returns true. function takes one parameter.
-float(x)            Converts a number or a string to floating point.
-getattr(object,     [<default> arg added in 1.5.2]Gets attribute called name
-name[, default]))   from object,e.g. getattr(x, 'f') <=> x.f). If not found,
-                    raises AttributeError or returns default if specified.
-globals()           Returns a dictionary containing current global variables.
-hasattr(object,     Returns true if object has attr called name.
-name)
-hash(object)        Returns the hash value of the object (if it has one)
-help(f)             Display documentation on object f.
-hex(x)              Converts a number x to a hexadecimal string.
-id(object)          Returns a unique 'identity' integer for an object.
-int(x[, base])      base paramenter specifies base from which to convert string
-                    values.
-isinstance(obj,     Returns true if obj is an instance of class. Ifissubclass
-class)              (A,B) then isinstance(x,A) => isinstance(x,B)
-issubclass(class1,  returns true if class1 is derived from class2
-class2)
-                    Returns the length (the number of items) of an object
-iter(collection)    Returns an iterator over the collection.
-len(obj)            (sequence, dictionary, or instance of class implementing
-                    __len__).
-list(sequence)      Converts sequence into a list. If already a list,returns a
-                    copy of it.
-locals()            Returns a dictionary containing current local variables.
-                    Applies function to every item of list and returns a listof
-map(function, list, the results. If additional arguments are passed,function
-...)                must take that many arguments and it is givento function on
-                    each call.
-max(seq)            Returns the largest item of the non-empty sequence seq.
-min(seq)            Returns the smallest item of a non-empty sequence seq.
-oct(x)              Converts a number to an octal string.
-open(filename [,    Returns a new file object. First two args are same asthose
-mode='r', [bufsize= for C's "stdio open" function. bufsize is 0for unbuffered,
-implementation      1 for line-buffered, negative forsys-default, all else, of
-dependent]])        (about) given size.
-ord(c)              Returns integer ASCII value of c (a string of len 1). Works
-                    with Unicode char.
-object()            Create a base type.  Used as a superclass for new-style objects.
-open(name           Open a file.
-  [, mode
-  [, buffering]])
-pow(x, y [, z])     Returns x to power y [modulo z]. See also ** operator.
-property()          Created a property with access controlled by functions.
-range(start [,end   Returns list of ints from >= start and < end. With 1 arg,
-[, step]])          list from 0..arg-1. With 2 args, list from start..end-1.
-                    With 3 args, list from start up to end by step
-                    after fixing it.
-repr(object)        Returns a string containing a printable and if possible
-                    evaluable representation of an object. 
-                    Class redefinable (__repr__). See also str().
-round(x, n=0)       Returns the floating point value x rounded to n digitsafter
-                    the decimal point.
-setattr(object,     This is the counterpart of getattr(). setattr(o, 'foobar',
-name, value)        3) <=> o.foobar = 3. Creates attribute if it doesn't exist!
-slice([start,] stop Returns a slice object representing a range, with R/
-[, step])           O attributes: start, stop, step.
-staticmethod()      Convert a function to method with no self or class
-                    argument.  Useful for methods associated with a class that
-                    do not need access to an object's internal state.
-str(object)         Returns a string containing a nicely
-                    printable representation of an object. Class overridable
-                    (__str__).See also repr().
-super(type)         Create an unbound super object.  Used to call cooperative
-                    superclass methods.
-sum(sequence,       Add the values in the sequence and return the sum.
-    [start]) 
-tuple(sequence)     Creates a tuple with same elements as sequence. If already
-                    a tuple, return itself (not a copy).
-                    Returns a type object [see module types] representing
-                    thetype of obj. Example: import typesif type(x) ==
-type(obj)           types.StringType: print 'It is a string'NB: it is
-                    recommanded to use the following form:if isinstance(x,
-                    types.StringType): etc...
-unichr(code)        code.
-unicode(string[,    Creates a Unicode string from a 8-bit string, using
-encoding[, error    thegiven encoding name and error treatment ('strict',
-]]])                'ignore',or 'replace'}.
-                    Without arguments, returns a dictionary correspondingto the
-                    current local symbol table. With a module,class or class
-vars([object])      instance object as argumentreturns a dictionary
-                    corresponding to the object'ssymbol table. Useful with "%"
-                    formatting operator.
-zip(seq1[, seq2,    Returns an iterator of tuples where each tuple contains
-...])               the nth element of each of the argument sequences.
-
-
-
-Built-In Exceptions
-
-Exception>
-         Root class for all exceptions
-    SystemExit
-         On 'sys.exit()'
-    StopIteration
-         Signal the end from iterator.__next__()
-        ArithmeticError
-                 Base class for OverflowError, ZeroDivisionError,
-    FloatingPointError
-            FloatingPointError
-                       When a floating point operation fails.
-            OverflowError
-                            On excessively large arithmetic operation
-            ZeroDivisionError
-                  On division or modulo operation with 0 as 2nd arg
-            AssertionError
-                When an assert statement fails.
-        AttributeError
-                    On attribute reference or assignment failure
-        EnvironmentError    [new in 1.5.2]
-                On error outside Python; error arg tuple is (errno, errMsg...)
-            IOError    [changed in 1.5.2]
-               I/O-related operation failure
-            OSError    [new in 1.5.2]
-               used by the os module's os.error exception.
-        EOFError
-                    Immediate end-of-file hit by input() or raw_input()
-        ImportError
-         On failure of `import' to find module or name
-        KeyboardInterrupt
-         On user entry of the interrupt key (often `Control-C')
-        LookupError
-                base class for IndexError, KeyError
-            IndexError
-                 On out-of-range sequence subscript
-            KeyError
-                 On reference to a non-existent mapping (dict) key
-        MemoryError
-         On recoverable memory exhaustion
-        NameError
-         On failure to find a local or global (unqualified) name
-        RuntimeError
-         Obsolete catch-all; define a suitable error instead
-          NotImplementedError   [new in 1.5.2]
-                On method not implemented
-        SyntaxError
-         On parser encountering a syntax error
-       IndentationError
-           On parser encountering an indentation syntax error
-       TabError
-           On parser encountering an indentation syntax error
-        SystemError
-         On non-fatal interpreter error - bug - report it
-        TypeError
-         On passing inappropriate type to built-in op or func
-        ValueError
-         On arg error not covered by TypeError or more precise
-    Warning
-              UserWarning
-              DeprecationWarning
-              PendingDeprecationWarning
-              SyntaxWarning
-              RuntimeWarning
-              FutureWarning
-
-
-
-Standard methods & operators redefinition in classes
-
-Standard methods & operators map to special '__methods__' and thus may be
- redefined (mostly in user-defined classes), e.g.:
-    class x:
-         def __init__(self, v): self.value = v
-         def __add__(self, r): return self.value + r
-    a = x(3) # sort of like calling x.__init__(a, 3)
-    a + 4    # is equivalent to a.__add__(4)
-
-Special methods for any class
-
-(s: self, o: other)
-        __init__(s, args) instance initialization (on construction)
-        __del__(s)        called on object demise (refcount becomes 0)
-        __repr__(s)       repr() and `...` conversions
-        __str__(s)        str() and 'print' statement
-        __cmp__(s, o)     Compares s to o and returns <0, 0, or >0.
-                          Implements >, <, == etc...
-        __hash__(s)       Compute a 32 bit hash code; hash() and dictionary ops
-        __bool__(s)    Returns False or True for truth value testing
-        __getattr__(s, name)  called when attr lookup doesn't find <name>
-        __setattr__(s, name, val) called when setting an attr
-                                  (inside, don't use "self.name = value"
-                                   use "self.__dict__[name] = val")
-        __delattr__(s, name)  called to delete attr <name>
-        __call__(self, *args) called when an instance is called as function.
-
-Operators
-
-    See list in the operator module. Operator function names are provided with
-    2 variants, with or without
-    ading & trailing '__' (eg. __add__ or add).
-
-    Numeric operations special methods
-    (s: self, o: other)
-
-        s+o       =  __add__(s,o)         s-o        =  __sub__(s,o)
-        s*o       =  __mul__(s,o)         s/o        =  __div__(s,o)
-        s%o       =  __mod__(s,o)         divmod(s,o) = __divmod__(s,o)
-        s**o      =  __pow__(s,o)
-        s&o       =  __and__(s,o)
-        s^o       =  __xor__(s,o)         s|o        =  __or__(s,o)
-        s<<o      =  __lshift__(s,o)      s>>o       =  __rshift__(s,o)
-        bool(s) = __bool__(s) (used in boolean testing)
-        -s        =  __neg__(s)           +s         =  __pos__(s)
-        abs(s)    =  __abs__(s)           ~s         =  __invert__(s)  (bitwise)
-        s+=o      =  __iadd__(s,o)        s-=o       =  __isub__(s,o)
-        s*=o      =  __imul__(s,o)        s/=o       =  __idiv__(s,o)
-        s%=o      =  __imod__(s,o)
-        s**=o     =  __ipow__(s,o)
-        s&=o      =  __iand__(s,o)
-        s^=o      =  __ixor__(s,o)        s|=o       =  __ior__(s,o)
-        s<<=o     =  __ilshift__(s,o)     s>>=o      =  __irshift__(s,o)
-        Conversions
-        int(s)    =  __int__(s)
-        float(s)  =  __float__(s)         complex(s)    =  __complex__(s)
-        oct(s)    =  __oct__(s)           hex(s)     =  __hex__(s)
-        Right-hand-side equivalents for all binary operators exist;
-        are called when class instance is on r-h-s of operator:
-        a + 3  calls __add__(a, 3)
-        3 + a  calls __radd__(a, 3)
-
-    All seqs and maps, general operations plus:
-    (s: self, i: index or key)
-
-        len(s)    = __len__(s)        length of object, >= 0.  Length 0 == false
-        s[i]      = __getitem__(s,i)  Element at index/key i, origin 0
-
-    Sequences, general methods, plus:
-      s[i]=v           = __setitem__(s,i,v)
-      del s[i]         = __delitem__(s,i)
-      s[i:j]           = __getslice__(s,i,j)
-      s[i:j]=seq       = __setslice__(s,i,j,seq)
-      del s[i:j]       = __delslice__(s,i,j)   == s[i:j] = []
-      seq * n          = __repeat__(seq, n)
-      s1 + s2          = __concat__(s1, s2)
-      i in s           = __contains__(s, i)
-    Mappings, general methods, plus
-      hash(s)          = __hash__(s) - hash value for dictionary references
-      s[k]=v           = __setitem__(s,k,v)
-      del s[k]         = __delitem__(s,k)
-
-Special informative state attributes for some types:
-
-    Modules:
-        __doc__ (string/None, R/O): doc string (<=> __dict__['__doc__'])
-        __name__(string, R/O): module name (also in __dict__['__name__'])
-        __dict__ (dict, R/O): module's name space
-        __file__(string/undefined, R/O): pathname of .pyc, .pyo or .pyd (undef for
-                 modules statically linked to the interpreter)
-
-    Classes:    [in bold: writable since 1.5.2]
-        __doc__ (string/None, R/W): doc string (<=> __dict__['__doc__'])
-        __module__ is the module name in which the class was defined
-        __name__(string, R/W): class name (also in __dict__['__name__'])
-        __bases__ (tuple, R/W): parent classes
-        __dict__ (dict, R/W): attributes (class name space)
-
-    Instances:
-        __class__ (class, R/W): instance's class
-        __dict__ (dict, R/W): attributes
-
-    User-defined functions: [bold: writable since 1.5.2]
-        __doc__ (string/None, R/W): doc string
-        __name__(string, R/O): function name
-        func_doc (R/W): same as __doc__
-        func_name (R/O): same as __name__
-        func_defaults (tuple/None, R/W): default args values if any
-        func_code (code, R/W): code object representing the compiled function body
-        func_globals (dict, R/O): ref to dictionary of func global variables
-        func_dict (dict, R/W):  same as __dict__ contains the namespace supporting
-            arbitrary function attributes
-        func_closure (R/O): None or a tuple of cells that contain bindings
-            for the function's free variables.
-
-
-    User-defined Methods:
-        __doc__ (string/None, R/O): doc string
-        __name__(string, R/O): method name (same as im_func.__name__)
-        im_class (class, R/O): class defining the method (may be a base class)
-        im_self (instance/None, R/O): target instance object (None if unbound)
-        im_func (function, R/O): function object
-
-    Built-in Functions & methods:
-        __doc__ (string/None, R/O): doc string
-        __name__ (string, R/O): function name
-        __self__ : [methods only] target object
-
-    Codes:
-        co_name (string, R/O): function name
-        co_argcount (int, R/0): number of positional args
-        co_nlocals (int, R/O): number of local vars (including args)
-        co_varnames (tuple, R/O): names of local vars (starting with args)
-        co_cellvars (tuple, R/O)) the names of local variables referenced by
-            nested functions
-        co_freevars (tuple, R/O)) names of free variables
-        co_code (string, R/O): sequence of bytecode instructions
-        co_consts (tuple, R/O): litterals used by the bytecode, 1st one is
-                                fct doc (or None)
-        co_names (tuple, R/O): names used by the bytecode
-        co_filename (string, R/O): filename from which the code was compiled
-        co_firstlineno (int, R/O): first line number of the function
-        co_lnotab (string, R/O): string encoding bytecode offsets to line numbers.
-        co_stacksize (int, R/O): required stack size (including local vars)
-        co_flags (int, R/O): flags for the interpreter
-                           bit 2 set if fct uses "*arg" syntax
-                           bit 3 set if fct uses '**keywords' syntax
-    Frames:
-        f_back (frame/None, R/O): previous stack frame (toward the caller)
-        f_code (code, R/O): code object being executed in this frame
-        f_locals (dict, R/O): local vars
-        f_globals (dict, R/O): global vars
-        f_builtins (dict, R/O): built-in (intrinsic) names
-        f_restricted (int, R/O): flag indicating whether fct is executed in
-                                 restricted mode
-        f_lineno (int, R/O): current line number
-        f_lasti (int, R/O): precise instruction (index into bytecode)
-        f_trace (function/None, R/W): debug hook called at start of each source line
-    Tracebacks:
-        tb_next (frame/None, R/O): next level in stack trace (toward the frame where
-                                  the exception occurred)
-        tb_frame (frame, R/O): execution frame of the current level
-        tb_lineno (int, R/O): line number where the exception occurred
-        tb_lasti (int, R/O): precise instruction (index into bytecode)
-
-    Slices:
-        start (any/None, R/O): lowerbound
-        stop (any/None, R/O): upperbound
-        step (any/None, R/O): step value
-
-    Complex numbers:
-        real (float, R/O): real part
-        imag (float, R/O): imaginary part
-
-
-Important Modules
-
-                                      sys
-
-                              Some sys variables
-      Variable                                Content
-argv                 The list of command line arguments passed to aPython
-                     script. sys.argv[0] is the script name.
-builtin_module_names A list of strings giving the names of all moduleswritten
-                     in C that are linked into this interpreter.
-check_interval       How often to check for thread switches or signals(measured
-                     in number of virtual machine instructions)
-last_type,           Set only when an exception not handled andinterpreter
-last_value,          prints an error. Used by debuggers.
-last_traceback
-maxint               maximum positive value for integers
-modules              Dictionary of modules that have already been loaded.
-path                 Search path for external modules. Can be modifiedby
-                     program. sys.path[0] == dir of script executing
-platform             The current platform, e.g. "sunos5", "win32"
-ps1, ps2             prompts to use in interactive mode.
-                     File objects used for I/O. One can redirect byassigning a
-stdin, stdout,       new file object to them (or any object:.with a method
-stderr               write(string) for stdout/stderr,.with a method readline()
-                     for stdin)
-version              string containing version info about Python interpreter.
-                     (and also: copyright, dllhandle, exec_prefix, prefix)
-version_info         tuple containing Python version info - (major, minor,
-                     micro, level, serial).
-
-                              Some sys functions
-     Function                                 Result
-exit(n)            Exits with status n. Raises SystemExit exception.(Hence can
-                   be caught and ignored by program)
-getrefcount(object Returns the reference count of the object. Generally one
-)                  higher than you might expect, because of object arg temp
-                   reference.
-setcheckinterval(  Sets the interpreter's thread switching interval (in number
-interval)          of virtual code instructions, default:100).
-settrace(func)     Sets a trace function: called before each line ofcode is
-                   exited.
-setprofile(func)   Sets a profile function for performance profiling.
-                   Info on exception currently being handled; this is atuple
-                   (exc_type, exc_value, exc_traceback).Warning: assigning the
-exc_info()         traceback return value to a local variable in a
-                   function handling an exception will cause a circular
-                   reference.
-getrecursionlimit  Retrieve maximum recursion depth.
-()
-setrecursionlimit  Set maximum recursion depth. (Defaults to 1000.)
-()
-
-
-
-                                      os
-"synonym" for whatever O/S-specific module is proper for current environment.
-this module uses posix whenever possible.
-(see also M.A. Lemburg's utility http://www.lemburg.com/files/python/
-platform.py)
-
-                               Some os variables
-     Variable                                 Meaning
-name                name of O/S-specific module (e.g. "posix", "mac", "nt")
-path                O/S-specific module for path manipulations.
-                    On Unix, os.path.split() <=> posixpath.split()
-curdir              string used to represent current directory ('.')
-pardir              string used to represent parent directory ('..')
-sep                 string used to separate directories ('/' or '\'). Tip: use
-                    os.path.join() to build portable paths.
-altsep              Alternate sep
-if applicable (None
-otherwise)
-pathsep             character used to separate search path components (as in
-                    $PATH), eg. ';' for windows.
-linesep             line separator as used in binary files, ie '\n' on Unix, '\
-                    r\n' on Dos/Win, '\r'
-
-                               Some os functions
-     Function                                 Result
-makedirs(path[,     Recursive directory creation (create required intermediary
-mode=0777])         dirs); os.error if fails.
-removedirs(path)    Recursive directory delete (delete intermediary empty
-                    dirs); if fails.
-renames(old, new)   Recursive directory or file renaming; os.error if fails.
-
-
-
-                                     posix
-don't import this module directly, import os instead !
-(see also module: shutil for file copy & remove fcts)
-
-                            posix Variables
-Variable                             Meaning
-environ  dictionary of environment variables, e.g.posix.environ['HOME'].
-error    exception raised on POSIX-related error.
-         Corresponding value is tuple of errno code and perror() string.
-
-                             Some posix functions
-   Function                                 Result
-chdir(path)     Changes current directory to path.
-chmod(path,     Changes the mode of path to the numeric mode
-mode)
-close(fd)       Closes file descriptor fd opened with posix.open.
-_exit(n)        Immediate exit, with no cleanups, no SystemExit,etc. Should use
-                this to exit a child process.
-execv(p, args)  "Become" executable p with args args
-getcwd()        Returns a string representing the current working directory
-getpid()        Returns the current process id
-fork()          Like C's fork(). Returns 0 to child, child pid to parent.[Not
-                on Windows]
-kill(pid,       Like C's kill [Not on Windows]
-signal)
-listdir(path)   Lists (base)names of entries in directory path, excluding '.'
-                and '..'
-lseek(fd, pos,  Sets current position in file fd to position pos, expressedas
-how)            an offset relative to beginning of file (how=0), tocurrent
-                position (how=1), or to end of file (how=2)
-mkdir(path[,    Creates a directory named path with numeric mode (default 0777)
-mode])
-open(file,      Like C's open(). Returns file descriptor. Use file object
-flags, mode)    fctsrather than this low level ones.
-pipe()          Creates a pipe. Returns pair of file descriptors (r, w) [Not on
-                Windows].
-popen(command,  Opens a pipe to or from command. Result is a file object to
-mode='r',       read to orwrite from, as indicated by mode being 'r' or 'w'.
-bufSize=0)      Use it to catch acommand output ('r' mode) or to feed it ('w'
-                mode).
-remove(path)    See unlink.
-rename(src, dst Renames/moves the file or directory src to dst. [error iftarget
-)               name already exists]
-rmdir(path)     Removes the empty directory path
-read(fd, n)     Reads n bytes from file descriptor fd and return as string.
-                Returns st_mode, st_ino, st_dev, st_nlink, st_uid,st_gid,
-stat(path)      st_size, st_atime, st_mtime, st_ctime.[st_ino, st_uid, st_gid
-                are dummy on Windows]
-system(command) Executes string command in a subshell. Returns exitstatus of
-                subshell (usually 0 means OK).
-                Returns accumulated CPU times in sec (user, system, children's
-times()         user,children's sys, elapsed real time). [3 last not on
-                Windows]
-unlink(path)    Unlinks ("deletes") the file (not dir!) path. same as: remove
-utime(path, (   Sets the access & modified time of the file to the given tuple
-aTime, mTime))  of values.
-wait()          Waits for child process completion. Returns tuple ofpid,
-                exit_status [Not on Windows]
-waitpid(pid,    Waits for process pid to complete. Returns tuple ofpid,
-options)        exit_status [Not on Windows]
-write(fd, str)  Writes str to file fd. Returns nb of bytes written.
-
-
-
-                                   posixpath
-Do not import this module directly, import os instead and refer to this module
-as os.path. (e.g. os.path.exists(p)) !
-
-                           Some posixpath functions
- Function                                 Result
-abspath(p) Returns absolute path for path p, taking current working dir in
-           account.
-dirname/
-basename(p directory and name parts of the path p. See also split.
-)
-exists(p)  True if string p is an existing path (file or directory)
-expanduser Returns string that is (a copy of) p with "~" expansion done.
-(p)
-expandvars Returns string that is (a copy of) p with environment vars expanded.
-(p)        [Windows: case significant; must use Unix: $var notation, not %var%]
-getsize(   return the size in bytes of filename. raise os.error.
-filename)
-getmtime(  return last modification time of filename (integer nb of seconds
-filename)  since epoch).
-getatime(  return last access time of filename (integer nb of seconds since
-filename)  epoch).
-isabs(p)   True if string p is an absolute path.
-isdir(p)   True if string p is a directory.
-islink(p)  True if string p is a symbolic link.
-ismount(p) True if string p is a mount point [true for all dirs on Windows].
-join(p[,q  Joins one or more path components intelligently.
-[,...]])
-           Splits p into (head, tail) where tail is lastpathname component and
-split(p)   <head> is everything leadingup to that. <=> (dirname(p), basename
-           (p))
-splitdrive Splits path p in a pair ('drive:', tail) [Windows]
-(p)
-splitext(p Splits into (root, ext) where last comp of root contains no periods
-)          and ext is empty or startswith a period.
-           Calls the function visit with arguments(arg, dirname, names) for
-           each directory recursively inthe directory tree rooted at p
-walk(p,    (including p itself if it's a dir)The argument dirname specifies the
-visit, arg visited directory, the argumentnames lists the files in the
-)          directory. The visit function maymodify names to influence the set
-           of directories visited belowdirname, e.g., to avoid visiting certain
-           parts of the tree.
-
-
-
-                                    shutil
-high-level file operations (copying, deleting).
-
-                             Main shutil functions
-     Function                                 Result
-copy(src, dst)     Copies the contents of file src to file dst, retaining file
-                   permissions.
-copytree(src, dst  Recursively copies an entire directory tree rooted at src
-[, symlinks])      into dst (which should not already exist). If symlinks is
-                   true, links insrc are kept as such in dst.
-rmtree(path[,      Deletes an entire directory tree, ignoring errors if
-ignore_errors[,    ignore_errors true,or calling onerror(func, path,
-onerror]])         sys.exc_info()) if supplied with
-
-(and also: copyfile, copymode, copystat, copy2)
-
-time
-
-                                  Variables
-Variable                               Meaning
-altzone  signed offset of local DST timezone in sec west of the 0th meridian.
-daylight nonzero if a DST timezone is specified
-
-                                   Functions
-  Function                                 Result
-time()        return a float representing UTC time in seconds since the epoch.
-gmtime(secs), return a tuple representing time : (year aaaa, month(1-12),day
-localtime(    (1-31), hour(0-23), minute(0-59), second(0-59), weekday(0-6, 0 is
-secs)         monday), Julian day(1-366), daylight flag(-1,0 or 1))
-asctime(
-timeTuple),
-strftime(
-format,       return a formatted string representing time.
-timeTuple)
-mktime(tuple) inverse of localtime(). Return a float.
-strptime(     parse a formatted string representing time, return tuple as in
-string[,      gmtime().
-format])
-sleep(secs)   Suspend execution for <secs> seconds. <secs> can be a float.
-
-and also: clock, ctime.
-
-                                    string
-
-As of Python 2.0, much (though not all) of the functionality provided by the
-string module have been superseded by built-in string methods - see Operations
-on strings for details.
-
-                             Some string variables
-              Variable                                Meaning
-digits                               The string '0123456789'
-hexdigits, octdigits                 legal hexadecimal & octal digits
-letters, uppercase, lowercase,       Strings containing the appropriate
-whitespace                           characters
-index_error                          Exception raised by index() if substr not
-                                     found.
-
-                             Some string functions
-     Function                                 Result
-expandtabs(s,      returns a copy of string <s> with tabs expanded.
-tabSize)
-find/rfind(s, sub  Return the lowest/highest index in <s> where the substring
-[, start=0[, end=  <sub> is found such that <sub> is wholly contained ins
-0])                [start:end]. Return -1 if <sub> not found.
-ljust/rjust/center Return a copy of string <s> left/right justified/centerd in
-(s, width)         afield of given width, padded with spaces. <s> is
-                   nevertruncated.
-lower/upper(s)     Return a string that is (a copy of) <s> in lowercase/
-                   uppercase
-split(s[, sep=     Return a list containing the words of the string <s>,using
-whitespace[,       the string <sep> as a separator.
-maxsplit=0]])
-join(words[, sep=' Concatenate a list or tuple of words with
-'])                interveningseparators; inverse of split.
-replace(s, old,    Returns a copy of string <s> with all occurrences of
-new[, maxsplit=0]  substring<old> replaced by <new>. Limits to <maxsplit>
-                   firstsubstitutions if specified.
-strip(s)           Return a string that is (a copy of) <s> without leadingand
-                   trailing whitespace. see also lstrip, rstrip.
-
-
-
-                                   re (sre)
-
-Handles Unicode strings. Implemented in new module sre, re now a mere front-end
-for compatibility.
-Patterns are specified as strings. Tip: Use raw strings (e.g. r'\w*') to
-litteralize backslashes.
-
-
-                           Regular expression syntax
-   Form                                Description
-.          matches any character (including newline if DOTALL flag specified)
-^          matches start of the string (of every line in MULTILINE mode)
-$          matches end of the string (of every line in MULTILINE mode)
-*          0 or more of preceding regular expression (as many as possible)
-+          1 or more of preceding regular expression (as many as possible)
-?          0 or 1 occurrence of preceding regular expression
-*?, +?, ?? Same as *, + and ? but matches as few characters as possible
-{m,n}      matches from m to n repetitions of preceding RE
-{m,n}?     idem, attempting to match as few repetitions as possible
-[ ]        defines character set: e.g. '[a-zA-Z]' to match all letters(see also
-           \w \S)
-[^ ]       defines complemented character set: matches if char is NOT in set
-           escapes special chars '*?+&$|()' and introduces special sequences
-\          (see below). Due to Python string rules, write as '\\' orr'\' in the
-           pattern string.
-\\         matches a litteral '\'; due to Python string rules, write as '\\\\
-           'in pattern string, or better using raw string: r'\\'.
-|          specifies alternative: 'foo|bar' matches 'foo' or 'bar'
-(...)      matches any RE inside (), and delimits a group.
-(?:...)    idem but doesn't delimit a group.
-           matches if ... matches next, but doesn't consume any of the string
-(?=...)    e.g. 'Isaac (?=Asimov)' matches 'Isaac' only if followed by
-           'Asimov'.
-(?!...)    matches if ... doesn't match next. Negative of (?=...)
-(?P<name   matches any RE inside (), and delimits a named group. (e.g. r'(?P
->...)      <id>[a-zA-Z_]\w*)' defines a group named id)
-(?P=name)  matches whatever text was matched by the earlier group named name.
-(?#...)    A comment; ignored.
-(?letter)  letter is one of 'i','L', 'm', 's', 'x'. Set the corresponding flags
-           (re.I, re.L, re.M, re.S, re.X) for the entire RE.
-
-                               Special sequences
-Sequence                              Description
-number   matches content of the group of the same number; groups are numbered
-         starting from 1
-\A       matches only at the start of the string
-\b       empty str at beg or end of word: '\bis\b' matches 'is', but not 'his'
-\B       empty str NOT at beginning or end of word
-\d       any decimal digit (<=> [0-9])
-\D       any non-decimal digit char (<=> [^O-9])
-\s       any whitespace char (<=> [ \t\n\r\f\v])
-\S       any non-whitespace char (<=> [^ \t\n\r\f\v])
-\w       any alphaNumeric char (depends on LOCALE flag)
-\W       any non-alphaNumeric char (depends on LOCALE flag)
-\Z       matches only at the end of the string
-
-                         Variables
-Variable                       Meaning
-error    Exception when pattern string isn't a valid regexp.
-
-                                   Functions
-   Function                                 Result
-               Compile a RE pattern string into a regular expression object.
-               Flags (combinable by |):
-
-               I or IGNORECASE or (?i)
-                   case insensitive matching
-compile(       L or LOCALE or (?L)
-pattern[,          make \w, \W, \b, \B dependent on thecurrent locale
-flags=0])      M or MULTILINE or (?m)
-                   matches every new line and not onlystart/end of the whole
-                   string
-               S or DOTALL or (?s)
-                   '.' matches ALL chars, including newline
-               X or VERBOSE or (?x)
-                   Ignores whitespace outside character sets
-escape(string) return (a copy of) string with all non-alphanumerics
-               backslashed.
-match(pattern, if 0 or more chars at beginning of <string> match the RE pattern
-string[, flags string,return a corresponding MatchObject instance, or None if
-])             no match.
-search(pattern scan thru <string> for a location matching <pattern>, return
-, string[,     acorresponding MatchObject instance, or None if no match.
-flags])
-split(pattern, split <string> by occurrences of <pattern>. If capturing () are
-string[,       used inpattern, then occurrences of patterns or subpatterns are
-maxsplit=0])   also returned.
-findall(       return a list of non-overlapping matches in <pattern>, either a
-pattern,       list ofgroups or a list of tuples if the pattern has more than 1
-string)        group.
-               return string obtained by replacing the (<count> first) lefmost
-sub(pattern,   non-overlapping occurrences of <pattern> (a string or a RE
-repl, string[, object) in <string>by <repl>; <repl> can be a string or a fct
-count=0])      called with a single MatchObj arg, which must return the
-               replacement string.
-subn(pattern,
-repl, string[, same as sub(), but returns a tuple (newString, numberOfSubsMade)
-count=0])
-
-Regular Expression Objects
-
-
-(RE objects are returned by the compile fct)
-
-                          re object attributes
-Attribute                            Descrition
-flags      flags arg used when RE obj was compiled, or 0 if none provided
-groupindex dictionary of {group name: group number} in pattern
-pattern    pattern string from which RE obj was compiled
-
-                               re object methods
-  Method                                  Result
-            If zero or more characters at the beginning of string match this
-            regular expression, return a corresponding MatchObject instance.
-            Return None if the string does not match the pattern; note that
-            this is different from a zero-length match.
-            The optional second parameter pos gives an index in the string
-match(      where the search is to start; it defaults to 0. This is not
-string[,    completely equivalent to slicing the string; the '' pattern
-pos][,      character matches at the real beginning of the string and at
-endpos])    positions just after a newline, but not necessarily at the index
-            where the search is to start.
-            The optional parameter endpos limits how far the string will be
-            searched; it will be as if the string is endpos characters long, so
-            only the characters from pos to endpos will be searched for a
-            match.
-            Scan through string looking for a location where this regular
-search(     expression produces a match, and return a corresponding MatchObject
-string[,    instance. Return None if no position in the string matches the
-pos][,      pattern; note that this is different from finding a zero-length
-endpos])    match at some point in the string.
-            The optional pos and endpos parameters have the same meaning as for
-            the match() method.
-split(
-string[,    Identical to the split() function, using the compiled pattern.
-maxsplit=
-0])
-findall(    Identical to the findall() function, using the compiled pattern.
-string)
-sub(repl,
-string[,    Identical to the sub() function, using the compiled pattern.
-count=0])
-subn(repl,
-string[,    Identical to the subn() function, using the compiled pattern.
-count=0])
-
-Match Objects
-
-
-(Match objects are returned by the match & search functions)
-
-                            Match object attributes
-Attribute                              Description
-pos       value of pos passed to search or match functions; index intostring at
-          which RE engine started search.
-endpos    value of endpos passed to search or match functions; index intostring
-          beyond which RE engine won't go.
-re        RE object whose match or search fct produced this MatchObj instance
-string    string passed to match() or search()
-
-                            Match object functions
-Function                                 Result
-          returns one or more groups of the match. If one arg, result is a
-group([g1 string;if multiple args, result is a tuple with one item per arg. If
-, g2,     gi is 0,return value is entire matching string; if 1 <= gi <= 99,
-...])     returnstring matching group #gi (or None if no such group); gi may
-          also bea group name.
-          returns a tuple of all groups of the match; groups not
-groups()  participatingto the match have a value of None. Returns a string
-          instead of tupleif len(tuple)=1
-start(
-group),   returns indices of start & end of substring matched by group (or
-end(group Noneif group exists but doesn't contribute to the match)
-)
-span(     returns the 2-tuple (start(group), end(group)); can be (None, None)if
-group)    group didn't contibute to the match.
-
-
-
-                                     math
-
-Variables:
-pi
-e
-Functions (see ordinary C man pages for info):
-acos(x)
-asin(x)
-atan(x)
-atan2(x, y)
-ceil(x)
-cos(x)
-cosh(x)
-degrees(x)
-exp(x)
-fabs(x)
-floor(x)
-fmod(x, y)
-frexp(x)        -- Unlike C: (float, int) = frexp(float)
-ldexp(x, y)
-log(x [,base])
-log10(x)
-modf(x)         -- Unlike C: (float, float) = modf(float)
-pow(x, y)
-radians(x)
-sin(x)
-sinh(x)
-sqrt(x)
-tan(x)
-tanh(x)
-
-                                    getopt
-
-Functions:
-getopt(list, optstr)    -- Similar to C. <optstr> is option
-                           letters to look for. Put ':' after letter
-                           if option takes arg. E.g.
-    # invocation was "python test.py -c hi -a arg1 arg2"
-       opts, args =  getopt.getopt(sys.argv[1:], 'ab:c:')
-    # opts would be
-       [('-c', 'hi'), ('-a', '')]
-    # args would be
-       ['arg1', 'arg2']
-
-
-List of modules and packages in base distribution
-
-(built-ins and content of python Lib directory)
-(Python NT distribution, may be slightly different in other distributions)
-
-                           Standard library modules
-   Operation                                 Result
-aifc             Stuff to parse AIFF-C and AIFF files.
-asynchat         Support for 'chat' style protocols
-asyncore         Asynchronous File I/O (in select style)
-atexit           Register functions to be called at exit of Python interpreter.
-base64           Conversions to/from base64 RFC-MIME transport encoding .
-bdb              A generic Python debugger base class.
-binhex           Macintosh binhex compression/decompression.
-bisect           List bisection algorithms.
-bz2              Support for bz2 compression/decompression.
-calendar         Calendar printing functions.
-cgi              Wraps the WWW Forms Common Gateway Interface (CGI).
-cgitb            Utility for handling CGI tracebacks.
-cmd              A generic class to build line-oriented command interpreters.
-datetime         Basic date and time types.
-code             Utilities needed to emulate Python's interactive interpreter
-codecs           Lookup existing Unicode encodings and register new ones.
-colorsys         Conversion functions between RGB and other color systems.
-compileall       Force "compilation" of all .py files in a directory.
-configparser     Configuration file parser (much like windows .ini files)
-copy             Generic shallow and deep copying operations.
-copyreg          Helper to provide extensibility for pickle/cPickle.
-csv              Read and write files with comma separated values.
-dbm              Generic interface to all dbm clones (dbm.bsd, dbm.gnu,
-                 dbm.ndbm, dbm.dumb).
-dircache         Sorted list of files in a dir, using a cache.
-difflib          Tool for creating delta between sequences.
-dis              Bytecode disassembler.
-distutils        Package installation system.
-doctest          Tool for running and verifying tests inside doc strings.
-dospath          Common operations on DOS pathnames.
-email            Comprehensive support for internet email.
-filecmp          File comparison.
-fileinput        Helper class to quickly write a loop over all standard input
-                 files.
-fnmatch          Filename matching with shell patterns.
-formatter        A test formatter.
-fpformat         General floating point formatting functions.
-ftplib           An FTP client class. Based on RFC 959.
-gc               Perform garbacge collection, obtain GC debug stats, and tune
-                 GC parameters.
-getopt           Standard command line processing. See also ftp://
-                 www.pauahtun.org/pub/getargspy.zip
-getpass          Utilities to get a password and/or the current user name.
-glob             filename globbing.
-gzip             Read & write gzipped files.
-heapq            Priority queue implemented using lists organized as heaps.
-hmac             Keyed-Hashing for Message Authentication -- RFC 2104.
-html.entities    HTML entity definitions.
-html.parser      A parser for HTML and XHTML.
-http.client      HTTP client class.
-http.server      HTTP server services.
-ihooks           Hooks into the "import" mechanism.
-imaplib          IMAP4 client.Based on RFC 2060.
-imghdr           Recognizing image files based on their first few bytes.
-imputil          Privides a way of writing customised import hooks.
-inspect          Tool for probing live Python objects.
-keyword          List of Python keywords.
-linecache        Cache lines from files.
-locale           Support for number formatting using the current locale
-                 settings.
-logging          Python logging facility.
-macpath          Pathname (or related) operations for the Macintosh.
-macurl2path      Mac specific module for conversion between pathnames and URLs.
-mailbox          A class to handle a unix-style or mmdf-style mailbox.
-mailcap          Mailcap file handling (RFC 1524).
-mhlib            MH (mailbox) interface.
-mimetypes        Guess the MIME type of a file.
-mmap             Interface to memory-mapped files - they behave like mutable
-                 strings./font>
-multifile        Class to make multi-file messages easier to handle.
-mutex            Mutual exclusion -- for use with module sched.
-netrc
-nntplib          An NNTP client class. Based on RFC 977.
-ntpath           Common operations on DOS pathnames.
-nturl2path       Mac specific module for conversion between pathnames and URLs.
-optparse         A comprehensive tool for processing command line options.
-os               Either mac, dos or posix depending system.
-pdb              A Python debugger.
-pickle           Pickling (save and restore) of Python objects (a faster
-                 Cimplementation exists in built-in module: cPickle).
-pipes            Conversion pipeline templates.
-pkgunil          Utilities for working with Python packages.
-poplib           A POP3 client class. Based on the J. Myers POP3 draft.
-posixpath        Common operations on POSIX pathnames.
-pprint           Support to pretty-print lists, tuples, & dictionaries
-                 recursively.
-profile          Class for profiling python code.
-pstats           Class for printing reports on profiled python code.
-pydoc            Utility for generating documentation from source files.
-pty              Pseudo terminal utilities.
-pyexpat          Interface to the Expay XML parser.
-py_compile       Routine to "compile" a .py file to a .pyc file.
-pyclbr           Parse a Python file and retrieve classes and methods.
-queue            A multi-producer, multi-consumer queue.
-quopri           Conversions to/from quoted-printable transport encoding.
-random           Random variable generators
-re               Regular Expressions.
-reprlib          Redo repr() but with limits on most sizes.
-rlcompleter      Word completion for GNU readline 2.0.
-sched            A generally useful event scheduler class.
-shelve           Manage shelves of pickled objects.
-shlex            Lexical analyzer class for simple shell-like syntaxes.
-shutil           Utility functions usable in a shell-like program.
-site             Append module search paths for third-party packages to
-                 sys.path.
-smtplib          SMTP Client class (RFC 821)
-sndhdr           Several routines that help recognizing sound.
-socketserver     Generic socket server classes.
-stat             Constants and functions for interpreting stat/lstat struct.
-statvfs          Constants for interpreting statvfs struct as returned by
-                 os.statvfs()and os.fstatvfs() (if they exist).
-string           A collection of string operations.
-sunau            Stuff to parse Sun and NeXT audio files.
-sunaudio         Interpret sun audio headers.
-symbol           Non-terminal symbols of Python grammar (from "graminit.h").
-tabnanny         Check Python source for ambiguous indentation.
-tarfile          Facility for reading and writing to the *nix tarfile format.
-telnetlib        TELNET client class. Based on RFC 854.
-tempfile         Temporary file name allocation.
-textwrap         Object for wrapping and filling text.
-threading        Proposed new higher-level threading interfaces
-token            Tokens (from "token.h").
-tokenize         Compiles a regular expression that recognizes Python tokens.
-traceback        Format and print Python stack traces.
-tty              Terminal utilities.
-turtle           LogoMation-like turtle graphics
-types            Define names for all type symbols in the std interpreter.
-tzparse          Parse a timezone specification.
-unicodedata      Interface to unicode properties.
-urllib.parse     Parse URLs according to latest draft of standard.
-urllib.request   Open an arbitrary URL.
-urllib.robotparser  Parse robots.txt files, useful for web spiders.
-user             Hook to allow user-specified customization code to run.
-uu               UUencode/UUdecode.
-unittest         Utilities for implementing unit testing.
-wave             Stuff to parse WAVE files.
-weakref          Tools for creating and managing weakly referenced objects.
-webbrowser       Platform independent URL launcher.
-xdrlib           Implements (a subset of) Sun XDR (eXternal Data
-                 Representation).
-xml.dom          Classes for processing XML using the Document Object Model.
-xml.sax          Classes for processing XML using the SAX API.
-xmlrpc.client    Support for remote procedure calls using XML.
-xmlrpc.server    Create XMLRPC servers.
-zipfile          Read & write PK zipped files.
-
-
-
-* Built-ins *
-
-            sys                 Interpreter state vars and functions
-            __built-in__        Access to all built-in python identifiers
-            __main__            Scope of the interpreters main program, script or stdin
-            array               Obj efficiently representing arrays of basic values
-            math                Math functions of C standard
-            time                Time-related functions (also the newer datetime module)
-            marshal             Read and write some python values in binary format
-            struct              Convert between python values and C structs
-
-* Standard *
-
-            getopt              Parse cmd line args in sys.argv.  A la UNIX 'getopt'.
-            os                  A more portable interface to OS dependent functionality
-            re                  Functions useful for working with regular expressions
-            string              Useful string and characters functions and exceptions
-            random              Mersenne Twister pseudo-random number generator
-            _thread             Low-level primitives for working with process threads
-            threading           idem, new recommended interface.
-
-* Unix/Posix *
-
-            dbm                 Interface to Unix dbm databases
-            grp                 Interface to Unix group database
-            posix               OS functionality standardized by C and POSIX standards
-            posixpath           POSIX pathname functions
-            pwd                 Access to the Unix password database
-            select              Access to Unix select multiplex file synchronization
-            socket              Access to BSD socket interface
-
-* Tk User-interface Toolkit *
-
-            tkinter             Main interface to Tk
-
-* Multimedia *
-
-            audioop             Useful operations on sound fragments
-            imageop             Useful operations on images
-            jpeg                Access to jpeg image compressor and decompressor
-            rgbimg              Access SGI imglib image files
-
-* Cryptographic Extensions *
-
-            md5         Interface to RSA's MD5 message digest algorithm
-            sha         Interface to the SHA message digest algorithm
-            HMAC        Keyed-Hashing for Message Authentication -- RFC 2104.
-
-* SGI IRIX * (4 & 5)
-
-            al          SGI audio facilities
-            AL          al constants
-            fl          Interface to FORMS library
-            FL          fl constants
-            flp Functions for form designer
-            fm          Access to font manager library
-            gl          Access to graphics library
-            GL          Constants for gl
-            DEVICE      More constants for gl
-            imgfile     Imglib image file interface
-
-
-Workspace exploration and idiom hints
-
-        dir(<module>)   list functions, variables in <module>
-        dir()           get object keys, defaults to local name space
-        if __name__ == '__main__': main()            invoke main if running as script
-        map(None, lst1, lst2, ...)                   merge lists
-        b = a[:]                                     create copy of seq structure
-        _                       in interactive mode, is last value printed
-
-
-
-
-
-
-
-Python Mode for Emacs
-
-(Not revised, possibly not up to date)
-Type C-c ? when in python-mode for extensive help.
-INDENTATION
-Primarily for entering new code:
-        TAB      indent line appropriately
-        LFD      insert newline, then indent
-        DEL      reduce indentation, or delete single character
-Primarily for reindenting existing code:
-        C-c :    guess py-indent-offset from file content; change locally
-        C-u C-c :        ditto, but change globally
-        C-c TAB  reindent region to match its context
-        C-c <    shift region left by py-indent-offset
-        C-c >    shift region right by py-indent-offset
-MARKING & MANIPULATING REGIONS OF CODE
-C-c C-b         mark block of lines
-M-C-h           mark smallest enclosing def
-C-u M-C-h       mark smallest enclosing class
-C-c #           comment out region of code
-C-u C-c #       uncomment region of code
-MOVING POINT
-C-c C-p         move to statement preceding point
-C-c C-n         move to statement following point
-C-c C-u         move up to start of current block
-M-C-a           move to start of def
-C-u M-C-a       move to start of class
-M-C-e           move to end of def
-C-u M-C-e       move to end of class
-EXECUTING PYTHON CODE
-C-c C-c sends the entire buffer to the Python interpreter
-C-c |   sends the current region
-C-c !   starts a Python interpreter window; this will be used by
-        subsequent C-c C-c or C-c | commands
-C-c C-w runs PyChecker
-
-VARIABLES
-py-indent-offset        indentation increment
-py-block-comment-prefix comment string used by py-comment-region
-py-python-command       shell command to invoke Python interpreter
-py-scroll-process-buffer        t means always scroll Python process buffer
-py-temp-directory       directory used for temp files (if needed)
-py-beep-if-tab-change   ring the bell if tab-width is changed
-
-
-The Python Debugger
-
-(Not revised, possibly not up to date, see 1.5.2 Library Ref section 9.1; in 1.5.2, you may also use debugger integrated in IDLE)
-
-Accessing
-
-import pdb      (it's a module written in Python)
-        -- defines functions :
-           run(statement[,globals[, locals]])
-                        -- execute statement string under debugger control, with optional
-                           global & local environment.
-           runeval(expression[,globals[, locals]])
-                        -- same as run, but evaluate expression and return value.
-           runcall(function[, argument, ...])
-                        -- run function object with given arg(s)
-           pm()         -- run postmortem on last exception (like debugging a core file)
-           post_mortem(t)
-                        -- run postmortem on traceback object <t>
-
-        -- defines class Pdb :
-           use Pdb to create reusable debugger objects. Object
-           preserves state (i.e. break points) between calls.
-
-        runs until a breakpoint hit, exception, or end of program
-        If exception, variable '__exception__' holds (exception,value).
-
-Commands
-
-h, help
-        brief reminder of commands
-b, break [<arg>]
-        if <arg> numeric, break at line <arg> in current file
-        if <arg> is function object, break on entry to fcn <arg>
-        if no arg, list breakpoints
-cl, clear [<arg>]
-        if <arg> numeric, clear breakpoint at <arg> in current file
-        if no arg, clear all breakpoints after confirmation
-w, where
-        print current call stack
-u, up
-        move up one stack frame (to top-level caller)
-d, down
-        move down one stack frame
-s, step
-        advance one line in the program, stepping into calls
-n, next
-        advance one line, stepping over calls
-r, return
-        continue execution until current function returns
-        (return value is saved in variable "__return__", which
-        can be printed or manipulated from debugger)
-c, continue
-        continue until next breakpoint
-j, jump lineno
-        Set the next line that will be executed
-a, args
-        print args to current function
-rv, retval
-        prints return value from last function that returned
-p, print <arg>
-        prints value of <arg> in current stack frame
-l, list [<first> [, <last>]]
-               List source code for the current file.
-               Without arguments, list 11 lines around the current line
-               or continue the previous listing.
-               With one argument, list 11 lines starting at that line.
-               With two arguments, list the given range;
-               if the second argument is less than the first, it is a count.
-whatis <arg>
-        prints type of <arg>
-!
-        executes rest of line as a Python statement in the current stack frame
-q quit
-        immediately stop execution and leave debugger
-<return>
-        executes last command again
-Any input debugger doesn't recognize as a command is assumed to be a
-Python statement to execute in the current stack frame, the same way
-the exclamation mark ("!") command does.
-
-Example
-
-(1394) python
-Python 1.0.3 (Sep 26 1994)
-Copyright 1991-1994 Stichting Mathematisch Centrum, Amsterdam
->>> import rm
->>> rm.run()
-Traceback (innermost last):
-         File "<stdin>", line 1
-         File "./rm.py", line 7
-           x = div(3)
-         File "./rm.py", line 2
-           return a / r
-ZeroDivisionError: integer division or modulo
->>> import pdb
->>> pdb.pm()
-> ./rm.py(2)div: return a / r
-(Pdb) list
-         1     def div(a):
-         2  ->     return a / r
-         3
-         4     def run():
-         5         global r
-         6         r = 0
-         7         x = div(3)
-         8         print x
-[EOF]
-(Pdb) print r
-0
-(Pdb) q
->>> pdb.runcall(rm.run)
-etc.
-
-Quirks
-
-Breakpoints are stored as filename, line number tuples. If a module is reloaded
-after editing, any remembered breakpoints are likely to be wrong.
-
-Always single-steps through top-most stack frame. That is, "c" acts like "n".
