diff --git a/Tools/faqwiz/README b/Tools/faqwiz/README
deleted file mode 100644
index a1e4d44..0000000
--- a/Tools/faqwiz/README
+++ /dev/null
@@ -1,114 +0,0 @@
-FAQ Wizard
-----------
-
-Author: Guido van Rossum <guido@python.org>
-Version: 1.0
-Date:  6 April 1998
-
-
-This is a CGI program that maintains a user-editable FAQ.  It uses RCS
-to keep track of changes to individual FAQ entries.  It is fully
-configurable; everything you might want to change when using this
-program to maintain some other FAQ than the Python FAQ is contained in
-the configuration module, faqconf.py.
-
-Note that the bulk of the code is not an executable script; it's an
-importable module.  The actual script in cgi-bin is minimal.
-
-Files:
-
-faqw.py		executable script to be edited and installed in cgi-bin
-faqwiz.py	main module, lives in same directory as FAQ entry files
-faqconf.py	main configuration module
-faqcust.py	additional local customization module (optional)
-move-faqwiz.sh  Script to move faqwiz entries.
-
-
-What's New?
------------
-
-Version 1.0 corrects some minor bugs and uses tab-agnostic
-indentation; it is otherwise unchanged from version 0.9.0.
-
-Version 0.9.0 uses the re module (Perl style regular expressions) for
-all its regular expression needs, instead of the regex and regsub
-modules (Emacs style).  This affects the syntax for regular
-expressions entered by the user as search strings (with "regular
-expression" checked), hence the version number jump.
-
-
-Setup Information
------------------
-
-This assumes you are familiar with Python, with your http server, and
-with running CGI scripts under your http server.  You need Python 1.5
-or better.
-
-Select a place where the Python modules that constitute the FAQ wizard
-will live (the directory where you unpacked it is an obvious choice).
-This will be called the SRCDIR.  This directory should not be writable
-by other users of your system (since they would be able to execute
-arbitrary code by invoking the FAQ wizard's CGI script).
-
-Create a dedicated working directory, preferably one that's not
-directly reachable from your http server.  This will be called the
-FAQDIR.  Create a subdirectory named RCS.  Make both the working
-directory and the RCS subdirectory wrld-writable.  (This is essential,
-since the FAQ wizard runs as use nobody, and needs to create
-additional files here!)
-
-Edit faqconf.py to reflect your setup.  You only need to edit the top
-part, up till the line of all dashes.  The comments should guide you
-in your edits.  (Actually, you can also choose to add your changes to
-faqcust.py and leave faqconf.py alone.  This is essential if you are
-maintaining multiple FAQs; see below.)
-
-Don't forget to edit the SECTION_TITLES variables to reflect the set
-of section titles for your FAQ!
-
-Next, edit faqw.py to reflect the pathname of your Python interpreter
-and the values for SRCDIR and FAQDIR that you just chose.  Then
-install faqw.py in your cgi-bin directory.  Make sure that it is
-world-executable.  You should now be able to connect to the FAQ wizard
-by entering the following URL in your web client (subsituting the
-appropriate host and port for "your.web.server", and perhaps
-specifying a different directory for "cgi-bin" if local conventions so
-dictate):
-
-	http://your.web.server/cgi-bin/faqw.py
-
-If you are unable to get this working, check your server's error_log
-file.  The documentation for Python's cgi module in the Python Library
-Reference Manual gives plentyu additional information about installing
-and debugging CGI scripts, including setup debugging.  This
-documentation is repeated in the doc string in the cgi module; try
-``import cgi; print cgi.__doc__''.
-
-Assuming this works, you should now be able to add the first entry to
-your FAQ using the FAQ wizard interface.  This creates a file
-faq01.001.htp in your working directory and an RCS revision history
-file faq01.001.htp,v in the RCS subdirectory.  You can now exercise
-the other FAQ wizard features (search, index, whole FAQ, what's new,
-roulette, and so on).
-
-
-Maintaining Multiple FAQs
--------------------------
-
-If you have multiple FAQs, you need a separate FAQDIR per FAQ, and a
-different customization file per FAQ.  The easiest thing to do would
-be to have the faqcust.py for each FAQ live in the FAQDIR for that
-FAQ, but that creates some security concerns, since the FAQDIR must be
-world writable: *if* someone who breaks into your system (or a
-legitimate user) manages to edit the faqcust.py file they can get
-arbitrary code to execute through the FAQ wizard.  Therefore, you will
-need a more complex setup.
-
-The best way is probably to have a directory that is only writable by
-you for each FAQ, where you place the copy of faqcust.py for that FAQ,
-and have a world-writable subdirectory DATA for the data.  You then
-set FAQDIR to point to the DATA directory and change the faqw.py
-bootstrap script to add FAQDIR/.. to sys.path (in front of SRCDIR, so
-the dummy faqcust.py from SRCDIR is ignored).
-
---Guido van Rossum (home page: http://www.python.org/~guido/)
diff --git a/Tools/faqwiz/faqconf.py b/Tools/faqwiz/faqconf.py
deleted file mode 100644
index d1acd80..0000000
--- a/Tools/faqwiz/faqconf.py
+++ /dev/null
@@ -1,577 +0,0 @@
-"""FAQ Wizard customization module.
-
-Edit this file to customize the FAQ Wizard.  For normal purposes, you
-should only have to change the FAQ section titles and the small group
-of parameters below it.
-
-"""
-
-# Titles of FAQ sections
-
-SECTION_TITLES = {
-    # SectionNumber : SectionTitle; need at least one entry
-    1: "General information and availability",
-}
-
-# Parameters you definitely want to change
-
-SHORTNAME = "Generic"                   # FAQ name with "FAQ" omitted
-PASSWORD = ""                           # Password for editing
-OWNERNAME = "FAQ owner"                 # Name for feedback
-OWNEREMAIL = "nobody@anywhere.org"      # Email for feedback
-HOMEURL = "http://www.python.org"       # Related home page
-HOMENAME = "Python home"                # Name of related home page
-RCSBINDIR = "/usr/local/bin/"           # Directory containing RCS commands
-                                        # (must end in a slash)
-
-# Parameters you can normally leave alone
-
-MAXHITS = 10                            # Max #hits to be shown directly
-COOKIE_LIFETIME = 28*24*3600            # Cookie expiration in seconds
-                                        # (28*24*3600 = 28 days = 4 weeks)
-PROCESS_PREFORMAT = 1                   # toggle whether preformatted text
-                                        # will replace urls and emails with
-                                        # HTML links
-
-# Markers appended to title to indicate recently change
-# (may contain HTML, e.g. <IMG>); and corresponding
-
-MARK_VERY_RECENT = " **"                # Changed very recently
-MARK_RECENT = " *"                      # Changed recently
-DT_VERY_RECENT = 24*3600                # 24 hours
-DT_RECENT = 7*24*3600                   # 7 days
-
-EXPLAIN_MARKS = """
-<P>(Entries marked with ** were changed within the last 24 hours;
-entries marked with * were changed within the last 7 days.)
-<P>
-"""
-
-# Version -- don't change unless you edit faqwiz.py
-
-WIZVERSION = "1.0.4"                    # FAQ Wizard version
-
-import os, sys
-if os.name in ['nt',]:
-    # On NT we'll probably be running python from a batch file,
-    # so sys.argv[0] is not helpful
-    FAQCGI = 'faq.bat'                  # Relative URL of the FAQ cgi script
-    # LOGNAME is not typically set on NT
-    os.environ[ 'LOGNAME' ] = "FAQWizard"
-else:
-    # This parameter is normally overwritten with a dynamic value
-    FAQCGI = 'faqw.py'                  # Relative URL of the FAQ cgi script
-    FAQCGI = os.path.basename(sys.argv[0]) or FAQCGI
-del os, sys
-
-# Perl (re module) style regular expression to recognize FAQ entry
-# files: group(1) should be the section number, group(2) should be the
-# question number.  Both should be fixed width so simple-minded
-# sorting yields the right order.
-
-OKFILENAME = r"^faq(\d\d)\.(\d\d\d)\.htp$"
-
-# Format to construct a FAQ entry file name
-
-NEWFILENAME = "faq%02d.%03d.htp"
-
-# Load local customizations on top of the previous parameters
-
-try:
-    from faqcust import *
-except ImportError:
-    pass
-
-# Calculated parameter names
-
-COOKIE_NAME = SHORTNAME + "-FAQ-Wizard" # Name used for Netscape cookie
-FAQNAME = SHORTNAME + " FAQ"            # Name of the FAQ
-
-# ----------------------------------------------------------------------
-
-# Anything below this point normally needn't be changed; you would
-# change this if you were to create e.g. a French translation or if
-# you just aren't happy with the text generated by the FAQ Wizard.
-
-# Most strings here are subject to substitution (string%dictionary)
-
-# RCS commands
-
-import os
-if os.name in ['nt', ]:
-    SH_RLOG = RCSBINDIR + "rlog %(file)s < NUL"
-    SH_RLOG_H = RCSBINDIR + "rlog -h %(file)s  < NUL"
-    SH_RDIFF = RCSBINDIR + "rcsdiff -r%(prev)s -r%(rev)s %(file)s < NUL"
-    SH_REVISION = RCSBINDIR + "co -p%(rev)s %(file)s < NUL"
-    ### Have to use co -l, or the file is not marked rw on NT
-    SH_LOCK = RCSBINDIR + "co -l %(file)s < NUL"
-    SH_CHECKIN =  RCSBINDIR + "ci -u %(file)s < %(tfn)s"
-else:
-    SH_RLOG = RCSBINDIR + "rlog %(file)s </dev/null 2>&1"
-    SH_RLOG_H = RCSBINDIR + "rlog -h %(file)s </dev/null 2>&1"
-    SH_RDIFF = RCSBINDIR + "rcsdiff -r%(prev)s -r%(rev)s %(file)s </dev/null 2>&1"
-    SH_REVISION = RCSBINDIR + "co -p%(rev)s %(file)s </dev/null 2>&1"
-    SH_LOCK = RCSBINDIR + "rcs -l %(file)s </dev/null 2>&1"
-    SH_CHECKIN =  RCSBINDIR + "ci -u %(file)s <%(tfn)s 2>&1"
-del os
-
-# Titles for various output pages (not subject to substitution)
-
-T_HOME = FAQNAME + " Wizard " + WIZVERSION
-T_ERROR = "Sorry, an error occurred"
-T_ROULETTE = FAQNAME + " Roulette"
-T_ALL = "The Whole " + FAQNAME
-T_INDEX = FAQNAME + " Index"
-T_SEARCH = FAQNAME + " Search Results"
-T_RECENT = "What's New in the " + FAQNAME
-T_SHOW = FAQNAME + " Entry"
-T_LOG = "RCS log for %s entry" % FAQNAME
-T_REVISION = "RCS revision for %s entry" % FAQNAME
-T_DIFF = "RCS diff for %s entry" % FAQNAME
-T_ADD = "Add an entry to the " + FAQNAME
-T_DELETE = "Deleting an entry from the " + FAQNAME
-T_EDIT = FAQNAME + " Edit Wizard"
-T_REVIEW = T_EDIT + " - Review Changes"
-T_COMMITTED = T_EDIT + " - Changes Committed"
-T_COMMITFAILED = T_EDIT + " - Commit Failed"
-T_CANTCOMMIT = T_EDIT + " - Commit Rejected"
-T_HELP = T_EDIT + " - Help"
-
-# Generic prologue and epilogue
-
-PROLOGUE = '''
-<HTML>
-<HEAD>
-<TITLE>%(title)s</TITLE>
-</HEAD>
-
-<BODY
-      BGCOLOR="#FFFFFF"
-      TEXT="#000000"
-      LINK="#AA0000"
-      VLINK="#906A6A">
-<H1>%(title)s</H1>
-'''
-
-EPILOGUE = '''
-<HR>
-<A HREF="%(HOMEURL)s">%(HOMENAME)s</A> /
-<A HREF="%(FAQCGI)s?req=home">%(FAQNAME)s Wizard %(WIZVERSION)s</A> /
-Feedback to <A HREF="mailto:%(OWNEREMAIL)s">%(OWNERNAME)s</A>
-
-</BODY>
-</HTML>
-'''
-
-# Home page
-
-HOME = """
-<H2>Search the %(FAQNAME)s:</H2>
-
-<BLOCKQUOTE>
-
-<FORM ACTION="%(FAQCGI)s">
-    <INPUT TYPE=text NAME=query>
-    <INPUT TYPE=submit VALUE="Search"><BR>
-    <INPUT TYPE=radio NAME=querytype VALUE=simple CHECKED>
-        Simple string
-        /
-    <INPUT TYPE=radio NAME=querytype VALUE=regex>
-        Regular expression
-        /<BR>
-    <INPUT TYPE=radio NAME=querytype VALUE=anykeywords>
-        Keywords (any)
-        /
-    <INPUT TYPE=radio NAME=querytype VALUE=allkeywords>
-        Keywords (all)
-        <BR>
-    <INPUT TYPE=radio NAME=casefold VALUE=yes CHECKED>
-        Fold case
-        /
-    <INPUT TYPE=radio NAME=casefold VALUE=no>
-        Case sensitive
-        <BR>
-    <INPUT TYPE=hidden NAME=req VALUE=search>
-</FORM>
-
-</BLOCKQUOTE>
-
-<HR>
-
-<H2>Other forms of %(FAQNAME)s access:</H2>
-
-<UL>
-<LI><A HREF="%(FAQCGI)s?req=index">FAQ index</A>
-<LI><A HREF="%(FAQCGI)s?req=all">The whole FAQ</A>
-<LI><A HREF="%(FAQCGI)s?req=recent">What's new in the FAQ?</A>
-<LI><A HREF="%(FAQCGI)s?req=roulette">FAQ roulette</A>
-<LI><A HREF="%(FAQCGI)s?req=add">Add a FAQ entry</A>
-<LI><A HREF="%(FAQCGI)s?req=delete">Delete a FAQ entry</A>
-</UL>
-"""
-
-# Index formatting
-
-INDEX_SECTION = """
-<P>
-<HR>
-<H2>%(sec)s. %(title)s</H2>
-<UL>
-"""
-
-INDEX_ADDSECTION = """
-<P>
-<LI><A HREF="%(FAQCGI)s?req=new&amp;section=%(sec)s">Add new entry</A>
-(at this point)
-"""
-
-INDEX_ENDSECTION = """
-</UL>
-"""
-
-INDEX_ENTRY = """\
-<LI><A HREF="%(FAQCGI)s?req=show&amp;file=%(file)s">%(title)s</A>
-"""
-
-LOCAL_ENTRY = """\
-<LI><A HREF="#%(sec)s.%(num)s">%(title)s</A>
-"""
-
-# Entry formatting
-
-ENTRY_HEADER1 = """
-<HR>
-<H2><A NAME="%(sec)s.%(num)s">%(title)s</A>\
-"""
-
-ENTRY_HEADER2 = """\
-</H2>
-"""
-
-ENTRY_FOOTER = """
-<A HREF="%(FAQCGI)s?req=edit&amp;file=%(file)s">Edit this entry</A> /
-<A HREF="%(FAQCGI)s?req=log&amp;file=%(file)s">Log info</A>
-"""
-
-ENTRY_LOGINFO = """
-/ Last changed on %(last_changed_date)s by
-<A HREF="mailto:%(last_changed_email)s">%(last_changed_author)s</A>
-"""
-
-# Search
-
-NO_HITS = """
-No hits.
-"""
-
-ONE_HIT = """
-Your search matched the following entry:
-"""
-
-FEW_HITS = """
-Your search matched the following %(count)s entries:
-"""
-
-MANY_HITS = """
-Your search matched more than %(MAXHITS)s entries.
-The %(count)s matching entries are presented here ordered by section:
-"""
-
-# RCS log and diff
-
-LOG = """
-Click on a revision line to see the diff between that revision and the
-previous one.
-"""
-
-REVISIONLINK = """\
-<A HREF="%(FAQCGI)s?req=revision&amp;file=%(file)s&amp;rev=%(rev)s"
->%(line)s</A>\
-"""
-DIFFLINK = """\
- (<A HREF="%(FAQCGI)s?req=diff&amp;file=%(file)s&amp;\
-prev=%(prev)s&amp;rev=%(rev)s"
->diff -r%(prev)s -r%(rev)s</A>)\
-"""
-
-# Recently changed entries
-
-NO_RECENT = """
-<HR>
-No %(FAQNAME)s entries were changed in the last %(period)s.
-"""
-
-VIEW_MENU = """
-<HR>
-View entries changed in the last...
-<UL>
-<LI><A HREF="%(FAQCGI)s?req=recent&amp;days=1">24 hours</A>
-<LI><A HREF="%(FAQCGI)s?req=recent&amp;days=2">2 days</A>
-<LI><A HREF="%(FAQCGI)s?req=recent&amp;days=3">3 days</A>
-<LI><A HREF="%(FAQCGI)s?req=recent&amp;days=7">week</A>
-<LI><A HREF="%(FAQCGI)s?req=recent&amp;days=28">4 weeks</A>
-<LI><A HREF="%(FAQCGI)s?req=recent&amp;days=365250">millennium</A>
-</UL>
-"""
-
-ONE_RECENT = VIEW_MENU + """
-The following %(FAQNAME)s entry was changed in the last %(period)s:
-"""
-
-SOME_RECENT = VIEW_MENU + """
-The following %(count)s %(FAQNAME)s entries were changed
-in the last %(period)s, most recently changed shown first:
-"""
-
-TAIL_RECENT = VIEW_MENU
-
-# Last changed banner on "all" (strftime format)
-LAST_CHANGED = "Last changed on %c %Z"
-
-# "Compat" command prologue (this has no <BODY> tag)
-COMPAT = """
-<H1>The whole %(FAQNAME)s</H1>
-See also the <A HREF="%(FAQCGI)s?req=home">%(FAQNAME)s Wizard</A>.
-<P>
-"""
-
-# Editing
-
-EDITHEAD = """
-<A HREF="%(FAQCGI)s?req=help">Click for Help</A>
-"""
-
-REVIEWHEAD = EDITHEAD
-
-
-EDITFORM1 = """
-<FORM ACTION="%(FAQCGI)s" METHOD=POST>
-<INPUT TYPE=hidden NAME=req VALUE=review>
-<INPUT TYPE=hidden NAME=file VALUE=%(file)s>
-<INPUT TYPE=hidden NAME=editversion VALUE=%(editversion)s>
-<HR>
-"""
-
-EDITFORM2 = """
-Title: <INPUT TYPE=text SIZE=70 NAME=title VALUE="%(title)s"><BR>
-<TEXTAREA COLS=72 ROWS=20 NAME=body>%(body)s
-</TEXTAREA><BR>
-Log message (reason for the change):<BR>
-<TEXTAREA COLS=72 ROWS=5 NAME=log>%(log)s
-</TEXTAREA><BR>
-Please provide the following information for logging purposes:
-<TABLE FRAME=none COLS=2>
-    <TR>
-        <TD>Name:
-        <TD><INPUT TYPE=text SIZE=40 NAME=author VALUE="%(author)s">
-    <TR>
-        <TD>Email:
-        <TD><INPUT TYPE=text SIZE=40 NAME=email VALUE="%(email)s">
-    <TR>
-        <TD>Password:
-        <TD><INPUT TYPE=password SIZE=20 NAME=password VALUE="%(password)s">
-</TABLE>
-
-<INPUT TYPE=submit NAME=review VALUE="Preview Edit">
-Click this button to preview your changes.
-"""
-
-EDITFORM3 = """
-</FORM>
-"""
-
-COMMIT = """
-<INPUT TYPE=submit NAME=commit VALUE="Commit">
-Click this button to commit your changes.
-<HR>
-"""
-
-NOCOMMIT_HEAD = """
-To commit your changes, please correct the following errors in the
-form below and click the Preview Edit button.
-<UL>
-"""
-NOCOMMIT_TAIL = """
-</UL>
-<HR>
-"""
-
-CANTCOMMIT_HEAD = """
-Some required information is missing:
-<UL>
-"""
-NEED_PASSWD = "<LI>You must provide the correct password.\n"
-NEED_AUTHOR = "<LI>You must enter your name.\n"
-NEED_EMAIL = "<LI>You must enter your email address.\n"
-NEED_LOG = "<LI>You must enter a log message.\n"
-CANTCOMMIT_TAIL = """
-</UL>
-Please use your browser's Back command to correct the form and commit
-again.
-"""
-
-NEWCONFLICT = """
-<P>
-You are creating a new entry, but the entry number specified is not
-correct.
-<P>
-The two most common causes of this problem are:
-<UL>
-<LI>After creating the entry yourself, you went back in your browser,
-    edited the entry some more, and clicked Commit again.
-<LI>Someone else started creating a new entry in the same section and
-    committed before you did.
-</UL>
-(It is also possible that the last entry in the section was physically
-deleted, but this should not happen except through manual intervention
-by the FAQ maintainer.)
-<P>
-<A HREF="%(FAQCGI)s?req=new&amp;section=%(sec)s">Click here to try
-again.</A>
-<P>
-"""
-
-VERSIONCONFLICT = """
-<P>
-You edited version %(editversion)s but the current version is %(version)s.
-<P>
-The two most common causes of this problem are:
-<UL>
-<LI>After committing a change, you went back in your browser,
-    edited the entry some more, and clicked Commit again.
-<LI>Someone else started editing the same entry and committed
-    before you did.
-</UL>
-<P>
-<A HREF="%(FAQCGI)s?req=show&amp;file=%(file)s">Click here to reload
-the entry and try again.</A>
-<P>
-"""
-
-CANTWRITE = """
-Can't write file %(file)s (%(why)s).
-"""
-
-FILEHEADER = """\
-Title: %(title)s
-Last-Changed-Date: %(date)s
-Last-Changed-Author: %(author)s
-Last-Changed-Email: %(email)s
-Last-Changed-Remote-Host: %(REMOTE_HOST)s
-Last-Changed-Remote-Address: %(REMOTE_ADDR)s
-"""
-
-LOGHEADER = """\
-Last-Changed-Date: %(date)s
-Last-Changed-Author: %(author)s
-Last-Changed-Email: %(email)s
-Last-Changed-Remote-Host: %(REMOTE_HOST)s
-Last-Changed-Remote-Address: %(REMOTE_ADDR)s
-
-%(log)s
-"""
-
-COMMITTED = """
-Your changes have been committed.
-"""
-
-COMMITFAILED = """
-Exit status %(sts)s.
-"""
-
-# Add/Delete
-
-ADD_HEAD = """
-At the moment, new entries can only be added at the end of a section.
-This is because the entry numbers are also their
-unique identifiers -- it's a bad idea to renumber entries.
-<P>
-Click on the section to which you want to add a new entry:
-<UL>
-"""
-
-ADD_SECTION = """\
-<LI><A HREF="%(FAQCGI)s?req=new&amp;section=%(section)s">%(section)s. %(title)s</A>
-"""
-
-ADD_TAIL = """
-</UL>
-"""
-
-ROULETTE = """
-<P>Hit your browser's Reload button to play again.<P>
-"""
-
-DELETE = """
-At the moment, there's no direct way to delete entries.
-This is because the entry numbers are also their
-unique identifiers -- it's a bad idea to renumber entries.
-<P>
-If you really think an entry needs to be deleted,
-change the title to "(deleted)" and make the body
-empty (keep the entry number in the title though).
-"""
-
-# Help file for the FAQ Edit Wizard
-
-HELP = """
-Using the %(FAQNAME)s Edit Wizard speaks mostly for itself.  Here are
-some answers to questions you are likely to ask:
-
-<P><HR>
-
-<H2>I can review an entry but I can't commit it.</H2>
-
-The commit button only appears if the following conditions are met:
-
-<UL>
-
-<LI>The Name field is not empty.
-
-<LI>The Email field contains at least an @ character.
-
-<LI>The Log message box is not empty.
-
-<LI>The Password field contains the proper password.
-
-</UL>
-
-<P><HR>
-
-<H2>What is the password?</H2>
-
-At the moment, only PSA members will be told the password.  This is a
-good time to join the PSA!  See <A
-HREF="http://www.python.org/psa/">the PSA home page</A>.
-
-<P><HR>
-
-<H2>Can I use HTML in the FAQ entry?</H2>
-
-Yes, if you include it in &lt;HTML&rt; and &lt;/HTML&gt; tags.
-<P>
-Also, if you include a URL or an email address in the text it will
-automatigally become an anchor of the right type.  Also, *word*
-is made italic (but only for single alphabetic words).
-
-<P><HR>
-
-<H2>How do I delineate paragraphs?</H2>
-
-Use blank lines to separate paragraphs.
-
-<P><HR>
-
-<H2>How do I enter example text?</H2>
-
-Any line that begins with a space or tab is assumed to be part of
-literal text.  Blocks of literal text delineated by blank lines are
-placed inside &lt;PRE&gt;...&lt;/PRE&gt;.
-"""
-
-# Load local customizations again, in case they set some other variables
-
-try:
-    from faqcust import *
-except ImportError:
-    pass
diff --git a/Tools/faqwiz/faqcust.py b/Tools/faqwiz/faqcust.py
deleted file mode 100644
index 8f16781..0000000
--- a/Tools/faqwiz/faqcust.py
+++ /dev/null
@@ -1 +0,0 @@
-# Add your customizations here -- modified copies of what's in faqconf.py.
diff --git a/Tools/faqwiz/faqw.py b/Tools/faqwiz/faqw.py
deleted file mode 100755
index 01536c0..0000000
--- a/Tools/faqwiz/faqw.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env python3
-
-"""FAQ wizard bootstrap."""
-
-# This is a longer version of the bootstrap script given at the end of
-# faqwin.py; it prints timing statistics at the end of the regular CGI
-# script's output (so you can monitor how it is doing).
-
-# This script should be placed in your cgi-bin directory and made
-# executable.
-
-# You need to edit the first line and the lines that define FAQDIR and
-# SRCDIR, below: change /usr/local/bin/python to where your Python
-# interpreter lives, change the value for FAQDIR to where your FAQ
-# lives, and change the value for SRCDIR to where your faqwiz.py
-# module lives.  The faqconf.py and faqcust.py files live there, too.
-
-import os
-t1 = os.times() # If this doesn't work, just get rid of the timing code!
-try:
-    FAQDIR = "/usr/people/guido/python/FAQ"
-    SRCDIR = "/usr/people/guido/python/src/Tools/faqwiz"
-    import os, sys
-    os.chdir(FAQDIR)
-    sys.path.insert(0, SRCDIR)
-    import faqwiz
-except SystemExit as n:
-    sys.exit(n)
-except:
-    t, v, tb = sys.exc_info()
-    print()
-    import cgi
-    cgi.print_exception(t, v, tb)
diff --git a/Tools/faqwiz/faqwiz.py b/Tools/faqwiz/faqwiz.py
deleted file mode 100644
index b9ab65d..0000000
--- a/Tools/faqwiz/faqwiz.py
+++ /dev/null
@@ -1,840 +0,0 @@
-"""Generic FAQ Wizard.
-
-This is a CGI program that maintains a user-editable FAQ.  It uses RCS
-to keep track of changes to individual FAQ entries.  It is fully
-configurable; everything you might want to change when using this
-program to maintain some other FAQ than the Python FAQ is contained in
-the configuration module, faqconf.py.
-
-Note that this is not an executable script; it's an importable module.
-The actual script to place in cgi-bin is faqw.py.
-
-"""
-
-import sys, time, os, stat, re, cgi, faqconf
-from faqconf import *                   # This imports all uppercase names
-now = time.time()
-
-class FileError:
-    def __init__(self, file):
-        self.file = file
-
-class InvalidFile(FileError):
-    pass
-
-class NoSuchSection(FileError):
-    def __init__(self, section):
-        FileError.__init__(self, NEWFILENAME %(section, 1))
-        self.section = section
-
-class NoSuchFile(FileError):
-    def __init__(self, file, why=None):
-        FileError.__init__(self, file)
-        self.why = why
-
-def escape(s):
-    s = s.replace('&', '&amp;')
-    s = s.replace('<', '&lt;')
-    s = s.replace('>', '&gt;')
-    return s
-
-def escapeq(s):
-    s = escape(s)
-    s = s.replace('"', '&quot;')
-    return s
-
-def _interpolate(format, args, kw):
-    try:
-        quote = kw['_quote']
-    except KeyError:
-        quote = 1
-    d = (kw,) + args + (faqconf.__dict__,)
-    m = MagicDict(d, quote)
-    return format % m
-
-def interpolate(format, *args, **kw):
-    return _interpolate(format, args, kw)
-
-def emit(format, *args, **kw):
-    try:
-        f = kw['_file']
-    except KeyError:
-        f = sys.stdout
-    f.write(_interpolate(format, args, kw))
-
-translate_prog = None
-
-def translate(text, pre=0):
-    global translate_prog
-    if not translate_prog:
-        translate_prog = prog = re.compile(
-            r'\b(http|ftp|https)://\S+(\b|/)|\b[-.\w]+@[-.\w]+')
-    else:
-        prog = translate_prog
-    i = 0
-    list = []
-    while 1:
-        m = prog.search(text, i)
-        if not m:
-            break
-        j = m.start()
-        list.append(escape(text[i:j]))
-        i = j
-        url = m.group(0)
-        while url[-1] in '();:,.?\'"<>':
-            url = url[:-1]
-        i = i + len(url)
-        url = escape(url)
-        if not pre or (pre and PROCESS_PREFORMAT):
-            if ':' in url:
-                repl = '<A HREF="%s">%s</A>' % (url, url)
-            else:
-                repl = '<A HREF="mailto:%s">%s</A>' % (url, url)
-        else:
-            repl = url
-        list.append(repl)
-    j = len(text)
-    list.append(escape(text[i:j]))
-    return ''.join(list)
-
-def emphasize(line):
-    return re.sub(r'\*([a-zA-Z]+)\*', r'<I>\1</I>', line)
-
-revparse_prog = None
-
-def revparse(rev):
-    global revparse_prog
-    if not revparse_prog:
-        revparse_prog = re.compile(r'^(\d{1,3})\.(\d{1,4})$')
-    m = revparse_prog.match(rev)
-    if not m:
-        return None
-    [major, minor] = map(int, m.group(1, 2))
-    return major, minor
-
-logon = 0
-def log(text):
-    if logon:
-        logfile = open("logfile", "a")
-        logfile.write(text + "\n")
-        logfile.close()
-
-def load_cookies():
-    if 'HTTP_COOKIE' not in os.environ:
-        return {}
-    raw = os.environ['HTTP_COOKIE']
-    words = [s.strip() for s in raw.split(';')]
-    cookies = {}
-    for word in words:
-        i = word.find('=')
-        if i >= 0:
-            key, value = word[:i], word[i+1:]
-            cookies[key] = value
-    return cookies
-
-def load_my_cookie():
-    cookies = load_cookies()
-    try:
-        value = cookies[COOKIE_NAME]
-    except KeyError:
-        return {}
-    import urllib.parse
-    value = urllib.parse.unquote(value)
-    words = value.split('/')
-    while len(words) < 3:
-        words.append('')
-    author = '/'.join(words[:-2])
-    email = words[-2]
-    password = words[-1]
-    return {'author': author,
-            'email': email,
-            'password': password}
-
-def send_my_cookie(ui):
-    name = COOKIE_NAME
-    value = "%s/%s/%s" % (ui.author, ui.email, ui.password)
-    import urllib.parse
-    value = urllib.parse.quote(value)
-    then = now + COOKIE_LIFETIME
-    gmt = time.gmtime(then)
-    path = os.environ.get('SCRIPT_NAME', '/cgi-bin/')
-    print("Set-Cookie: %s=%s; path=%s;" % (name, value, path), end=' ')
-    print(time.strftime("expires=%a, %d-%b-%y %X GMT", gmt))
-
-class MagicDict:
-
-    def __init__(self, d, quote):
-        self.__d = d
-        self.__quote = quote
-
-    def __getitem__(self, key):
-        for d in self.__d:
-            try:
-                value = d[key]
-                if value:
-                    value = str(value)
-                    if self.__quote:
-                        value = escapeq(value)
-                    return value
-            except KeyError:
-                pass
-        return ''
-
-class UserInput:
-
-    def __init__(self):
-        self.__form = cgi.FieldStorage()
-        #log("\n\nbody: " + self.body)
-
-    def __getattr__(self, name):
-        if name[0] == '_':
-            raise AttributeError
-        try:
-            value = self.__form[name].value
-        except (TypeError, KeyError):
-            value = ''
-        else:
-            value = value.strip()
-        setattr(self, name, value)
-        return value
-
-    def __getitem__(self, key):
-        return getattr(self, key)
-
-class FaqEntry:
-
-    def __init__(self, fp, file, sec_num):
-        self.file = file
-        self.sec, self.num = sec_num
-        if fp:
-            import email
-            self.__headers = email.message_from_file(fp)
-            self.body = fp.read().strip()
-        else:
-            self.__headers = {'title': "%d.%d. " % sec_num}
-            self.body = ''
-
-    def __getattr__(self, name):
-        if name[0] == '_':
-            raise AttributeError
-        key = '-'.join(name.split('_'))
-        try:
-            value = self.__headers[key]
-        except KeyError:
-            value = ''
-        setattr(self, name, value)
-        return value
-
-    def __getitem__(self, key):
-        return getattr(self, key)
-
-    def load_version(self):
-        command = interpolate(SH_RLOG_H, self)
-        p = os.popen(command)
-        version = ''
-        while 1:
-            line = p.readline()
-            if not line:
-                break
-            if line[:5] == 'head:':
-                version = line[5:].strip()
-        p.close()
-        self.version = version
-
-    def getmtime(self):
-        if not self.last_changed_date:
-            return 0
-        try:
-            return os.stat(self.file)[stat.ST_MTIME]
-        except os.error:
-            return 0
-
-    def emit_marks(self):
-        mtime = self.getmtime()
-        if mtime >= now - DT_VERY_RECENT:
-            emit(MARK_VERY_RECENT, self)
-        elif mtime >= now - DT_RECENT:
-            emit(MARK_RECENT, self)
-
-    def show(self, edit=1):
-        emit(ENTRY_HEADER1, self)
-        self.emit_marks()
-        emit(ENTRY_HEADER2, self)
-        pre = 0
-        raw = 0
-        for line in self.body.split('\n'):
-            # Allow the user to insert raw html into a FAQ answer
-            # (Skip Montanaro, with changes by Guido)
-            tag = line.rstrip().lower()
-            if tag == '<html>':
-                raw = 1
-                continue
-            if tag == '</html>':
-                raw = 0
-                continue
-            if raw:
-                print(line)
-                continue
-            if not line.strip():
-                if pre:
-                    print('</PRE>')
-                    pre = 0
-                else:
-                    print('<P>')
-            else:
-                if not line[0].isspace():
-                    if pre:
-                        print('</PRE>')
-                        pre = 0
-                else:
-                    if not pre:
-                        print('<PRE>')
-                        pre = 1
-                if '/' in line or '@' in line:
-                    line = translate(line, pre)
-                elif '<' in line or '&' in line:
-                    line = escape(line)
-                if not pre and '*' in line:
-                    line = emphasize(line)
-                print(line)
-        if pre:
-            print('</PRE>')
-            pre = 0
-        if edit:
-            print('<P>')
-            emit(ENTRY_FOOTER, self)
-            if self.last_changed_date:
-                emit(ENTRY_LOGINFO, self)
-        print('<P>')
-
-class FaqDir:
-
-    entryclass = FaqEntry
-
-    __okprog = re.compile(OKFILENAME)
-
-    def __init__(self, dir=os.curdir):
-        self.__dir = dir
-        self.__files = None
-
-    def __fill(self):
-        if self.__files is not None:
-            return
-        self.__files = files = []
-        okprog = self.__okprog
-        for file in os.listdir(self.__dir):
-            if self.__okprog.match(file):
-                files.append(file)
-        files.sort()
-
-    def good(self, file):
-        return self.__okprog.match(file)
-
-    def parse(self, file):
-        m = self.good(file)
-        if not m:
-            return None
-        sec, num = m.group(1, 2)
-        return int(sec), int(num)
-
-    def list(self):
-        # XXX Caller shouldn't modify result
-        self.__fill()
-        return self.__files
-
-    def open(self, file):
-        sec_num = self.parse(file)
-        if not sec_num:
-            raise InvalidFile(file)
-        try:
-            fp = open(file)
-        except IOError as msg:
-            raise NoSuchFile(file, msg)
-        try:
-            return self.entryclass(fp, file, sec_num)
-        finally:
-            fp.close()
-
-    def show(self, file, edit=1):
-        self.open(file).show(edit=edit)
-
-    def new(self, section):
-        if section not in SECTION_TITLES:
-            raise NoSuchSection(section)
-        maxnum = 0
-        for file in self.list():
-            sec, num = self.parse(file)
-            if sec == section:
-                maxnum = max(maxnum, num)
-        sec_num = (section, maxnum+1)
-        file = NEWFILENAME % sec_num
-        return self.entryclass(None, file, sec_num)
-
-class FaqWizard:
-
-    def __init__(self):
-        self.ui = UserInput()
-        self.dir = FaqDir()
-
-    def go(self):
-        print('Content-type: text/html')
-        req = self.ui.req or 'home'
-        mname = 'do_%s' % req
-        try:
-            meth = getattr(self, mname)
-        except AttributeError:
-            self.error("Bad request type %r." % (req,))
-        else:
-            try:
-                meth()
-            except InvalidFile as exc:
-                self.error("Invalid entry file name %s" % exc.file)
-            except NoSuchFile as exc:
-                self.error("No entry with file name %s" % exc.file)
-            except NoSuchSection as exc:
-                self.error("No section number %s" % exc.section)
-        self.epilogue()
-
-    def error(self, message, **kw):
-        self.prologue(T_ERROR)
-        emit(message, kw)
-
-    def prologue(self, title, entry=None, **kw):
-        emit(PROLOGUE, entry, kwdict=kw, title=escape(title))
-
-    def epilogue(self):
-        emit(EPILOGUE)
-
-    def do_home(self):
-        self.prologue(T_HOME)
-        emit(HOME)
-
-    def do_debug(self):
-        self.prologue("FAQ Wizard Debugging")
-        form = cgi.FieldStorage()
-        cgi.print_form(form)
-        cgi.print_environ(os.environ)
-        cgi.print_directory()
-        cgi.print_arguments()
-
-    def do_search(self):
-        query = self.ui.query
-        if not query:
-            self.error("Empty query string!")
-            return
-        if self.ui.querytype == 'simple':
-            query = re.escape(query)
-            queries = [query]
-        elif self.ui.querytype in ('anykeywords', 'allkeywords'):
-            words = [_f for _f in re.split('\W+', query) if _f]
-            if not words:
-                self.error("No keywords specified!")
-                return
-            words = [r'\b%s\b' % w for w in words]
-            if self.ui.querytype[:3] == 'any':
-                queries = ['|'.join(words)]
-            else:
-                # Each of the individual queries must match
-                queries = words
-        else:
-            # Default to regular expression
-            queries = [query]
-        self.prologue(T_SEARCH)
-        progs = []
-        for query in queries:
-            if self.ui.casefold == 'no':
-                p = re.compile(query)
-            else:
-                p = re.compile(query, re.IGNORECASE)
-            progs.append(p)
-        hits = []
-        for file in self.dir.list():
-            try:
-                entry = self.dir.open(file)
-            except FileError:
-                constants
-            for p in progs:
-                if not p.search(entry.title) and not p.search(entry.body):
-                    break
-            else:
-                hits.append(file)
-        if not hits:
-            emit(NO_HITS, self.ui, count=0)
-        elif len(hits) <= MAXHITS:
-            if len(hits) == 1:
-                emit(ONE_HIT, count=1)
-            else:
-                emit(FEW_HITS, count=len(hits))
-            self.format_all(hits, headers=0)
-        else:
-            emit(MANY_HITS, count=len(hits))
-            self.format_index(hits)
-
-    def do_all(self):
-        self.prologue(T_ALL)
-        files = self.dir.list()
-        self.last_changed(files)
-        self.format_index(files, localrefs=1)
-        self.format_all(files)
-
-    def do_compat(self):
-        files = self.dir.list()
-        emit(COMPAT)
-        self.last_changed(files)
-        self.format_index(files, localrefs=1)
-        self.format_all(files, edit=0)
-        sys.exit(0)                     # XXX Hack to suppress epilogue
-
-    def last_changed(self, files):
-        latest = 0
-        for file in files:
-            entry = self.dir.open(file)
-            if entry:
-                mtime = mtime = entry.getmtime()
-                if mtime > latest:
-                    latest = mtime
-        print(time.strftime(LAST_CHANGED, time.localtime(latest)))
-        emit(EXPLAIN_MARKS)
-
-    def format_all(self, files, edit=1, headers=1):
-        sec = 0
-        for file in files:
-            try:
-                entry = self.dir.open(file)
-            except NoSuchFile:
-                continue
-            if headers and entry.sec != sec:
-                sec = entry.sec
-                try:
-                    title = SECTION_TITLES[sec]
-                except KeyError:
-                    title = "Untitled"
-                emit("\n<HR>\n<H1>%(sec)s. %(title)s</H1>\n",
-                     sec=sec, title=title)
-            entry.show(edit=edit)
-
-    def do_index(self):
-        self.prologue(T_INDEX)
-        files = self.dir.list()
-        self.last_changed(files)
-        self.format_index(files, add=1)
-
-    def format_index(self, files, add=0, localrefs=0):
-        sec = 0
-        for file in files:
-            try:
-                entry = self.dir.open(file)
-            except NoSuchFile:
-                continue
-            if entry.sec != sec:
-                if sec:
-                    if add:
-                        emit(INDEX_ADDSECTION, sec=sec)
-                    emit(INDEX_ENDSECTION, sec=sec)
-                sec = entry.sec
-                try:
-                    title = SECTION_TITLES[sec]
-                except KeyError:
-                    title = "Untitled"
-                emit(INDEX_SECTION, sec=sec, title=title)
-            if localrefs:
-                emit(LOCAL_ENTRY, entry)
-            else:
-                emit(INDEX_ENTRY, entry)
-            entry.emit_marks()
-        if sec:
-            if add:
-                emit(INDEX_ADDSECTION, sec=sec)
-            emit(INDEX_ENDSECTION, sec=sec)
-
-    def do_recent(self):
-        if not self.ui.days:
-            days = 1
-        else:
-            days = float(self.ui.days)
-        try:
-            cutoff = now - days * 24 * 3600
-        except OverflowError:
-            cutoff = 0
-        list = []
-        for file in self.dir.list():
-            entry = self.dir.open(file)
-            if not entry:
-                continue
-            mtime = entry.getmtime()
-            if mtime >= cutoff:
-                list.append((mtime, file))
-        list.sort()
-        list.reverse()
-        self.prologue(T_RECENT)
-        if days <= 1:
-            period = "%.2g hours" % (days*24)
-        else:
-            period = "%.6g days" % days
-        if not list:
-            emit(NO_RECENT, period=period)
-        elif len(list) == 1:
-            emit(ONE_RECENT, period=period)
-        else:
-            emit(SOME_RECENT, period=period, count=len(list))
-        self.format_all([mtime_file[1] for mtime_file in list], headers=0)
-        emit(TAIL_RECENT)
-
-    def do_roulette(self):
-        import random
-        files = self.dir.list()
-        if not files:
-            self.error("No entries.")
-            return
-        file = random.choice(files)
-        self.prologue(T_ROULETTE)
-        emit(ROULETTE)
-        self.dir.show(file)
-
-    def do_help(self):
-        self.prologue(T_HELP)
-        emit(HELP)
-
-    def do_show(self):
-        entry = self.dir.open(self.ui.file)
-        self.prologue(T_SHOW)
-        entry.show()
-
-    def do_add(self):
-        self.prologue(T_ADD)
-        emit(ADD_HEAD)
-        sections = sorted(SECTION_TITLES.items())
-        for section, title in sections:
-            emit(ADD_SECTION, section=section, title=title)
-        emit(ADD_TAIL)
-
-    def do_delete(self):
-        self.prologue(T_DELETE)
-        emit(DELETE)
-
-    def do_log(self):
-        entry = self.dir.open(self.ui.file)
-        self.prologue(T_LOG, entry)
-        emit(LOG, entry)
-        self.rlog(interpolate(SH_RLOG, entry), entry)
-
-    def rlog(self, command, entry=None):
-        output = os.popen(command).read()
-        sys.stdout.write('<PRE>')
-        athead = 0
-        lines = output.split('\n')
-        while lines and not lines[-1]:
-            del lines[-1]
-        if lines:
-            line = lines[-1]
-            if line[:1] == '=' and len(line) >= 40 and \
-               line == line[0]*len(line):
-                del lines[-1]
-        headrev = None
-        for line in lines:
-            if entry and athead and line[:9] == 'revision ':
-                rev = line[9:].split()
-                mami = revparse(rev)
-                if not mami:
-                    print(line)
-                else:
-                    emit(REVISIONLINK, entry, rev=rev, line=line)
-                    if mami[1] > 1:
-                        prev = "%d.%d" % (mami[0], mami[1]-1)
-                        emit(DIFFLINK, entry, prev=prev, rev=rev)
-                    if headrev:
-                        emit(DIFFLINK, entry, prev=rev, rev=headrev)
-                    else:
-                        headrev = rev
-                    print()
-                athead = 0
-            else:
-                athead = 0
-                if line[:1] == '-' and len(line) >= 20 and \
-                   line == len(line) * line[0]:
-                    athead = 1
-                    sys.stdout.write('<HR>')
-                else:
-                    print(line)
-        print('</PRE>')
-
-    def do_revision(self):
-        entry = self.dir.open(self.ui.file)
-        rev = self.ui.rev
-        mami = revparse(rev)
-        if not mami:
-            self.error("Invalid revision number: %r." % (rev,))
-        self.prologue(T_REVISION, entry)
-        self.shell(interpolate(SH_REVISION, entry, rev=rev))
-
-    def do_diff(self):
-        entry = self.dir.open(self.ui.file)
-        prev = self.ui.prev
-        rev = self.ui.rev
-        mami = revparse(rev)
-        if not mami:
-            self.error("Invalid revision number: %r." % (rev,))
-        if prev:
-            if not revparse(prev):
-                self.error("Invalid previous revision number: %r." % (prev,))
-        else:
-            prev = '%d.%d' % (mami[0], mami[1])
-        self.prologue(T_DIFF, entry)
-        self.shell(interpolate(SH_RDIFF, entry, rev=rev, prev=prev))
-
-    def shell(self, command):
-        output = os.popen(command).read()
-        sys.stdout.write('<PRE>')
-        print(escape(output))
-        print('</PRE>')
-
-    def do_new(self):
-        entry = self.dir.new(section=int(self.ui.section))
-        entry.version = '*new*'
-        self.prologue(T_EDIT)
-        emit(EDITHEAD)
-        emit(EDITFORM1, entry, editversion=entry.version)
-        emit(EDITFORM2, entry, load_my_cookie())
-        emit(EDITFORM3)
-        entry.show(edit=0)
-
-    def do_edit(self):
-        entry = self.dir.open(self.ui.file)
-        entry.load_version()
-        self.prologue(T_EDIT)
-        emit(EDITHEAD)
-        emit(EDITFORM1, entry, editversion=entry.version)
-        emit(EDITFORM2, entry, load_my_cookie())
-        emit(EDITFORM3)
-        entry.show(edit=0)
-
-    def do_review(self):
-        send_my_cookie(self.ui)
-        if self.ui.editversion == '*new*':
-            sec, num = self.dir.parse(self.ui.file)
-            entry = self.dir.new(section=sec)
-            entry.version = "*new*"
-            if entry.file != self.ui.file:
-                self.error("Commit version conflict!")
-                emit(NEWCONFLICT, self.ui, sec=sec, num=num)
-                return
-        else:
-            entry = self.dir.open(self.ui.file)
-            entry.load_version()
-        # Check that the FAQ entry number didn't change
-        if self.ui.title.split()[:1] != entry.title.split()[:1]:
-            self.error("Don't change the entry number please!")
-            return
-        # Check that the edited version is the current version
-        if entry.version != self.ui.editversion:
-            self.error("Commit version conflict!")
-            emit(VERSIONCONFLICT, entry, self.ui)
-            return
-        commit_ok = ((not PASSWORD
-                      or self.ui.password == PASSWORD)
-                     and self.ui.author
-                     and '@' in self.ui.email
-                     and self.ui.log)
-        if self.ui.commit:
-            if not commit_ok:
-                self.cantcommit()
-            else:
-                self.commit(entry)
-            return
-        self.prologue(T_REVIEW)
-        emit(REVIEWHEAD)
-        entry.body = self.ui.body
-        entry.title = self.ui.title
-        entry.show(edit=0)
-        emit(EDITFORM1, self.ui, entry)
-        if commit_ok:
-            emit(COMMIT)
-        else:
-            emit(NOCOMMIT_HEAD)
-            self.errordetail()
-            emit(NOCOMMIT_TAIL)
-        emit(EDITFORM2, self.ui, entry, load_my_cookie())
-        emit(EDITFORM3)
-
-    def cantcommit(self):
-        self.prologue(T_CANTCOMMIT)
-        print(CANTCOMMIT_HEAD)
-        self.errordetail()
-        print(CANTCOMMIT_TAIL)
-
-    def errordetail(self):
-        if PASSWORD and self.ui.password != PASSWORD:
-            emit(NEED_PASSWD)
-        if not self.ui.log:
-            emit(NEED_LOG)
-        if not self.ui.author:
-            emit(NEED_AUTHOR)
-        if not self.ui.email:
-            emit(NEED_EMAIL)
-
-    def commit(self, entry):
-        file = entry.file
-        # Normalize line endings in body
-        if '\r' in self.ui.body:
-            self.ui.body = re.sub('\r\n?', '\n', self.ui.body)
-        # Normalize whitespace in title
-        self.ui.title = ' '.join(self.ui.title.split())
-        # Check that there were any changes
-        if self.ui.body == entry.body and self.ui.title == entry.title:
-            self.error("You didn't make any changes!")
-            return
-
-        # need to lock here because otherwise the file exists and is not writable (on NT)
-        command = interpolate(SH_LOCK, file=file)
-        p = os.popen(command)
-        output = p.read()
-
-        try:
-            os.unlink(file)
-        except os.error:
-            pass
-        try:
-            f = open(file, 'w')
-        except IOError as why:
-            self.error(CANTWRITE, file=file, why=why)
-            return
-        date = time.ctime(now)
-        emit(FILEHEADER, self.ui, os.environ, date=date, _file=f, _quote=0)
-        f.write('\n')
-        f.write(self.ui.body)
-        f.write('\n')
-        f.close()
-
-        import tempfile
-        tf = tempfile.NamedTemporaryFile()
-        emit(LOGHEADER, self.ui, os.environ, date=date, _file=tf)
-        tf.flush()
-        tf.seek(0)
-
-        command = interpolate(SH_CHECKIN, file=file, tfn=tf.name)
-        log("\n\n" + command)
-        p = os.popen(command)
-        output = p.read()
-        sts = p.close()
-        log("output: " + output)
-        log("done: " + str(sts))
-        log("TempFile:\n" + tf.read() + "end")
-
-        if not sts:
-            self.prologue(T_COMMITTED)
-            emit(COMMITTED)
-        else:
-            self.error(T_COMMITFAILED)
-            emit(COMMITFAILED, sts=sts)
-        print('<PRE>%s</PRE>' % escape(output))
-
-        try:
-            os.unlink(tf.name)
-        except os.error:
-            pass
-
-        entry = self.dir.open(file)
-        entry.show()
-
-wiz = FaqWizard()
-wiz.go()
diff --git a/Tools/faqwiz/move-faqwiz.sh b/Tools/faqwiz/move-faqwiz.sh
deleted file mode 100755
index b3bcc92..0000000
--- a/Tools/faqwiz/move-faqwiz.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/sh
-#
-# Christian Reis <kiko@async.com.br>
-#
-# Moves 
-# 
-# Example:
-#
-#   blackjesus:~> ./move-faqwiz.sh 2\.1 3\.2
-#   Moving FAQ question 02.001 to 03.002
-
-if [ x$2 = x ]; then
-    echo "Need 2 args: original_version final_version."
-    exit 2
-fi
-
-if [ ! -d data -o ! -d data/RCS ]; then
-    echo "Run this inside the faqwiz data/ directory's parent dir."
-    exit 2
-fi
-
-cut_n_pad() {
-    t=`echo $1 | cut -d. -f $2`
-    export $3=`echo $t | awk "{ tmp = \\$0; l = length(tmp); for (i = 0; i < $2-l+1; i++) { tmp = "0".tmp } print tmp  }"`
-}
-
-cut_n_pad $1 1 prefix1
-cut_n_pad $1 2 suffix1
-cut_n_pad $2 1 prefix2
-cut_n_pad $2 2 suffix2
-if which tempfile >/dev/null; then
-    tmpfile=$(tempfile -d .)
-elif [ -n "$RANDOM" ]; then
-    tmpfile=tmp$RANDOM.tmp
-else
-    tmpfile=tmp$$.tmp
-fi
-file1=faq$prefix1.$suffix1.htp
-file2=faq$prefix2.$suffix2.htp
-
-echo "Moving FAQ question $prefix1.$suffix1 to $prefix2.$suffix2" 
-
-sed -e "s/$1\./$2\./g" data/$file1 > ${tmpfile}1
-sed -e "s/$1\./$2\./g" data/RCS/$file1,v > ${tmpfile}2
-
-if [ -f data/$file2 ]; then
-    echo "Target FAQ exists. Won't clobber."
-    exit 2
-fi
-
-mv ${tmpfile}1 data/$file2
-mv ${tmpfile}2 data/RCS/$file2,v
-mv data/$file1 data/$file1.orig
-mv data/RCS/$file1,v data/RCS/$file1,v.orig
-
