Untabify to pass the -tt test.
diff --git a/Lib/httplib.py b/Lib/httplib.py
index fade694..a43adde 100644
--- a/Lib/httplib.py
+++ b/Lib/httplib.py
@@ -44,27 +44,27 @@
 
 class FakeSocket:
     def __init__(self, sock, ssl):
-	self.__sock = sock
-	self.__ssl = ssl
-	return
+        self.__sock = sock
+        self.__ssl = ssl
+        return
 
-    def makefile(self, mode):		# hopefully, never have to write
-	msgbuf = ""
-	while 1:
-	    try:
-		msgbuf = msgbuf + self.__ssl.read()
-	    except socket.sslerror, msg:
-		break
-	return StringIO(msgbuf)
+    def makefile(self, mode):           # hopefully, never have to write
+        msgbuf = ""
+        while 1:
+            try:
+                msgbuf = msgbuf + self.__ssl.read()
+            except socket.sslerror, msg:
+                break
+        return StringIO(msgbuf)
 
     def send(self, stuff, flags = 0):
-	return self.__ssl.write(stuff)
+        return self.__ssl.write(stuff)
 
     def recv(self, len = 1024, flags = 0):
-	return self.__ssl.read(len)
+        return self.__ssl.read(len)
 
     def __getattr__(self, attr):
-	return getattr(self.__sock, attr)
+        return getattr(self.__sock, attr)
 
 class HTTP:
     """This class manages a connection to an HTTP server."""
diff --git a/Lib/mailbox.py b/Lib/mailbox.py
index 108967d..6d5f6e4 100755
--- a/Lib/mailbox.py
+++ b/Lib/mailbox.py
@@ -8,269 +8,269 @@
 
 class _Mailbox:
 
-	def __init__(self, fp):
-		self.fp = fp
-		self.seekp = 0
+        def __init__(self, fp):
+                self.fp = fp
+                self.seekp = 0
 
-	def seek(self, pos, whence=0):
-		if whence==1:		# Relative to current position
-			self.pos = self.pos + pos
-		if whence==2:		# Relative to file's end
-			self.pos = self.stop + pos
-		else:			# Default - absolute position
-			self.pos = self.start + pos
+        def seek(self, pos, whence=0):
+                if whence==1:           # Relative to current position
+                        self.pos = self.pos + pos
+                if whence==2:           # Relative to file's end
+                        self.pos = self.stop + pos
+                else:                   # Default - absolute position
+                        self.pos = self.start + pos
 
-	def next(self):
-		while 1:
-			self.fp.seek(self.seekp)
-			try:
-				self._search_start()
-			except EOFError:
-				self.seekp = self.fp.tell()
-				return None
-			start = self.fp.tell()
-			self._search_end()
-			self.seekp = stop = self.fp.tell()
-			if start <> stop:
-				break
-		return rfc822.Message(_Subfile(self.fp, start, stop))
+        def next(self):
+                while 1:
+                        self.fp.seek(self.seekp)
+                        try:
+                                self._search_start()
+                        except EOFError:
+                                self.seekp = self.fp.tell()
+                                return None
+                        start = self.fp.tell()
+                        self._search_end()
+                        self.seekp = stop = self.fp.tell()
+                        if start <> stop:
+                                break
+                return rfc822.Message(_Subfile(self.fp, start, stop))
 
 class _Subfile:
 
-	def __init__(self, fp, start, stop):
-		self.fp = fp
-		self.start = start
-		self.stop = stop
-		self.pos = self.start
+        def __init__(self, fp, start, stop):
+                self.fp = fp
+                self.start = start
+                self.stop = stop
+                self.pos = self.start
 
-	def read(self, length = None):
-		if self.pos >= self.stop:
-			return ''
-		remaining = self.stop - self.pos
-		if length is None or length < 0:
-			length = remaining
-		elif length > remaining:
-			length = remaining
-		self.fp.seek(self.pos)
-		data = self.fp.read(length)
-		self.pos = self.fp.tell()
-		return data
+        def read(self, length = None):
+                if self.pos >= self.stop:
+                        return ''
+                remaining = self.stop - self.pos
+                if length is None or length < 0:
+                        length = remaining
+                elif length > remaining:
+                        length = remaining
+                self.fp.seek(self.pos)
+                data = self.fp.read(length)
+                self.pos = self.fp.tell()
+                return data
 
-	def readline(self, length = None):
-		if self.pos >= self.stop:
-			return ''
-		if length is None:
-			length = self.stop - self.pos
-		self.fp.seek(self.pos)
-		data = self.fp.readline(length)
-		self.pos = self.fp.tell()
-		return data
+        def readline(self, length = None):
+                if self.pos >= self.stop:
+                        return ''
+                if length is None:
+                        length = self.stop - self.pos
+                self.fp.seek(self.pos)
+                data = self.fp.readline(length)
+                self.pos = self.fp.tell()
+                return data
 
         def readlines(self, sizehint = -1):
-		lines = []
-		while 1:
-			line = self.readline()
-			if not line:
-				break
-			lines.append(line)
-			if sizehint >= 0:
-				sizehint = sizehint - len(line)
-				if sizehint <= 0:
-					break
-		return lines
+                lines = []
+                while 1:
+                        line = self.readline()
+                        if not line:
+                                break
+                        lines.append(line)
+                        if sizehint >= 0:
+                                sizehint = sizehint - len(line)
+                                if sizehint <= 0:
+                                        break
+                return lines
 
-	def tell(self):
-		return self.pos - self.start
+        def tell(self):
+                return self.pos - self.start
 
-	def seek(self, pos, whence=0):
-		if whence == 0:
-			self.pos = self.start + pos
-		elif whence == 1:
-			self.pos = self.pos + pos
-		elif whence == 2:
-			self.pos = self.stop + pos
+        def seek(self, pos, whence=0):
+                if whence == 0:
+                        self.pos = self.start + pos
+                elif whence == 1:
+                        self.pos = self.pos + pos
+                elif whence == 2:
+                        self.pos = self.stop + pos
 
-	def close(self):
-		del self.fp
+        def close(self):
+                del self.fp
 
 class UnixMailbox(_Mailbox):
 
-	def _search_start(self):
-		while 1:
-			line = self.fp.readline()
-			if not line:
-				raise EOFError
-			if line[:5] == 'From ' and self._isrealfromline(line):
-				return
+        def _search_start(self):
+                while 1:
+                        line = self.fp.readline()
+                        if not line:
+                                raise EOFError
+                        if line[:5] == 'From ' and self._isrealfromline(line):
+                                return
 
-	def _search_end(self):
-		while 1:
-			pos = self.fp.tell()
-			line = self.fp.readline()
-			if not line:
-				return
-			if line[:5] == 'From ' and self._isrealfromline(line):
-				self.fp.seek(pos)
-				return
+        def _search_end(self):
+                while 1:
+                        pos = self.fp.tell()
+                        line = self.fp.readline()
+                        if not line:
+                                return
+                        if line[:5] == 'From ' and self._isrealfromline(line):
+                                self.fp.seek(pos)
+                                return
 
-	# An overridable mechanism to test for From-line-ness.
-	# You can either specify a different regular expression
-	# or define a whole new _isrealfromline() method.
-	# Note that this only gets called for lines starting with
-	# the 5 characters "From ".
+        # An overridable mechanism to test for From-line-ness.
+        # You can either specify a different regular expression
+        # or define a whole new _isrealfromline() method.
+        # Note that this only gets called for lines starting with
+        # the 5 characters "From ".
 
-	_fromlinepattern = r"From \s*[^\s]+\s+\w\w\w\s+\w\w\w\s+\d?\d\s+" \
-			   r"\d?\d:\d\d(:\d\d)?(\s+[^\s]+)?\s+\d\d\d\d\s*$"
-	_regexp = None
+        _fromlinepattern = r"From \s*[^\s]+\s+\w\w\w\s+\w\w\w\s+\d?\d\s+" \
+                           r"\d?\d:\d\d(:\d\d)?(\s+[^\s]+)?\s+\d\d\d\d\s*$"
+        _regexp = None
 
-	def _isrealfromline(self, line):
-		if not self._regexp:
-			import re
-			self._regexp = re.compile(self._fromlinepattern)
-		return self._regexp.match(line)
+        def _isrealfromline(self, line):
+                if not self._regexp:
+                        import re
+                        self._regexp = re.compile(self._fromlinepattern)
+                return self._regexp.match(line)
 
 class MmdfMailbox(_Mailbox):
 
-	def _search_start(self):
-		while 1:
-			line = self.fp.readline()
-			if not line:
-				raise EOFError
-			if line[:5] == '\001\001\001\001\n':
-				return
+        def _search_start(self):
+                while 1:
+                        line = self.fp.readline()
+                        if not line:
+                                raise EOFError
+                        if line[:5] == '\001\001\001\001\n':
+                                return
 
-	def _search_end(self):
-		while 1:
-			pos = self.fp.tell()
-			line = self.fp.readline()
-			if not line:
-				return
-			if line == '\001\001\001\001\n':
-				self.fp.seek(pos)
-				return
+        def _search_end(self):
+                while 1:
+                        pos = self.fp.tell()
+                        line = self.fp.readline()
+                        if not line:
+                                return
+                        if line == '\001\001\001\001\n':
+                                self.fp.seek(pos)
+                                return
 
 class MHMailbox:
 
-	def __init__(self, dirname):
-		import re
-		pat = re.compile('^[0-9][0-9]*$')
-		self.dirname = dirname
-		files = os.listdir(self.dirname)
-		self.boxes = []
-		for f in files:
-			if pat.match(f):
-				self.boxes.append(f)
+        def __init__(self, dirname):
+                import re
+                pat = re.compile('^[0-9][0-9]*$')
+                self.dirname = dirname
+                files = os.listdir(self.dirname)
+                self.boxes = []
+                for f in files:
+                        if pat.match(f):
+                                self.boxes.append(f)
 
-	def next(self):
-		if not self.boxes:
-			return None
-		fn = self.boxes[0]
-		del self.boxes[0]
-		fp = open(os.path.join(self.dirname, fn))
-		return rfc822.Message(fp)
+        def next(self):
+                if not self.boxes:
+                        return None
+                fn = self.boxes[0]
+                del self.boxes[0]
+                fp = open(os.path.join(self.dirname, fn))
+                return rfc822.Message(fp)
 
 class Maildir:
 
-	# Qmail directory mailbox
+        # Qmail directory mailbox
 
-	def __init__(self, dirname):
-		import string
-		self.dirname = dirname
-		self.boxes = []
+        def __init__(self, dirname):
+                import string
+                self.dirname = dirname
+                self.boxes = []
 
-		# check for new mail
-		newdir = os.path.join(self.dirname, 'new')
-		for file in os.listdir(newdir):
-			if len(string.split(file, '.')) > 2:
-				self.boxes.append(os.path.join(newdir, file))
+                # check for new mail
+                newdir = os.path.join(self.dirname, 'new')
+                for file in os.listdir(newdir):
+                        if len(string.split(file, '.')) > 2:
+                                self.boxes.append(os.path.join(newdir, file))
 
-		# Now check for current mail in this maildir
-		curdir = os.path.join(self.dirname, 'cur')
-		for file in os.listdir(curdir):
-			if len(string.split(file, '.')) > 2:
-				self.boxes.append(os.path.join(curdir, file))
+                # Now check for current mail in this maildir
+                curdir = os.path.join(self.dirname, 'cur')
+                for file in os.listdir(curdir):
+                        if len(string.split(file, '.')) > 2:
+                                self.boxes.append(os.path.join(curdir, file))
 
-	def next(self):
-		if not self.boxes:
-			return None
-		fn = self.boxes[0]
-		del self.boxes[0]
-		fp = open(os.path.join(self.dirname, fn))
-		return rfc822.Message(fp)
+        def next(self):
+                if not self.boxes:
+                        return None
+                fn = self.boxes[0]
+                del self.boxes[0]
+                fp = open(os.path.join(self.dirname, fn))
+                return rfc822.Message(fp)
 
 class BabylMailbox(_Mailbox):
 
-	def _search_start(self):
-		while 1:
-			line = self.fp.readline()
-			if not line:
-				raise EOFError
-			if line == '*** EOOH ***\n':
-				return
+        def _search_start(self):
+                while 1:
+                        line = self.fp.readline()
+                        if not line:
+                                raise EOFError
+                        if line == '*** EOOH ***\n':
+                                return
 
-	def _search_end(self):
-		while 1:
-			pos = self.fp.tell()
-			line = self.fp.readline()
-			if not line:
-				return
-			if line == '\037\014\n':
-				self.fp.seek(pos)
-				return
+        def _search_end(self):
+                while 1:
+                        pos = self.fp.tell()
+                        line = self.fp.readline()
+                        if not line:
+                                return
+                        if line == '\037\014\n':
+                                self.fp.seek(pos)
+                                return
 
 
 def _test():
-	import time
-	import sys
-	import string
-	import os
+        import time
+        import sys
+        import string
+        import os
 
-	args = sys.argv[1:]
-	if not args:
-		for key in 'MAILDIR', 'MAIL', 'LOGNAME', 'USER':
-			if os.environ.has_key(key):
-				mbox = os.environ[key]
-				break
-		else:
-			print "$MAIL, $LOGNAME nor $USER set -- who are you?"
-			return
-	else:
-		mbox = args[0]
-	if mbox[:1] == '+':
-		mbox = os.environ['HOME'] + '/Mail/' + mbox[1:]
-	elif not '/' in mbox:
-		mbox = '/usr/mail/' + mbox
-	if os.path.isdir(mbox):
-		if os.path.isdir(os.path.join(mbox, 'cur')):
-			mb = Maildir(mbox)
-		else:
-			mb = MHMailbox(mbox)
-	else:
-		fp = open(mbox, 'r')
-		mb = UnixMailbox(fp)
-	
-	msgs = []
-	while 1:
-		msg = mb.next()
-		if msg is None:
-			break
-		msgs.append(msg)
-		if len(args) <= 1:
-			msg.fp = None
-	if len(args) > 1:
-		num = string.atoi(args[1])
-		print 'Message %d body:'%num
-		msg = msgs[num-1]
-		msg.rewindbody()
-		sys.stdout.write(msg.fp.read())
-	else:
-		print 'Mailbox',mbox,'has',len(msgs),'messages:'
-		for msg in msgs:
-			f = msg.getheader('from') or ""
-			s = msg.getheader('subject') or ""
-			d = msg.getheader('date') or ""
-			print '%20.20s   %18.18s   %-30.30s'%(f, d[5:], s)
+        args = sys.argv[1:]
+        if not args:
+                for key in 'MAILDIR', 'MAIL', 'LOGNAME', 'USER':
+                        if os.environ.has_key(key):
+                                mbox = os.environ[key]
+                                break
+                else:
+                        print "$MAIL, $LOGNAME nor $USER set -- who are you?"
+                        return
+        else:
+                mbox = args[0]
+        if mbox[:1] == '+':
+                mbox = os.environ['HOME'] + '/Mail/' + mbox[1:]
+        elif not '/' in mbox:
+                mbox = '/usr/mail/' + mbox
+        if os.path.isdir(mbox):
+                if os.path.isdir(os.path.join(mbox, 'cur')):
+                        mb = Maildir(mbox)
+                else:
+                        mb = MHMailbox(mbox)
+        else:
+                fp = open(mbox, 'r')
+                mb = UnixMailbox(fp)
+        
+        msgs = []
+        while 1:
+                msg = mb.next()
+                if msg is None:
+                        break
+                msgs.append(msg)
+                if len(args) <= 1:
+                        msg.fp = None
+        if len(args) > 1:
+                num = string.atoi(args[1])
+                print 'Message %d body:'%num
+                msg = msgs[num-1]
+                msg.rewindbody()
+                sys.stdout.write(msg.fp.read())
+        else:
+                print 'Mailbox',mbox,'has',len(msgs),'messages:'
+                for msg in msgs:
+                        f = msg.getheader('from') or ""
+                        s = msg.getheader('subject') or ""
+                        d = msg.getheader('date') or ""
+                        print '%20.20s   %18.18s   %-30.30s'%(f, d[5:], s)
 
 
 if __name__ == '__main__':
-	_test()
+        _test()
diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py
index cbc060b..9dc3645 100644
--- a/Lib/mimetypes.py
+++ b/Lib/mimetypes.py
@@ -30,8 +30,8 @@
 knownfiles = [
     "/usr/local/etc/httpd/conf/mime.types",
     "/usr/local/lib/netscape/mime.types",
-    "/usr/local/etc/httpd/conf/mime.types",	# Apache 1.2
-    "/usr/local/etc/mime.types",		# Apache 1.3
+    "/usr/local/etc/httpd/conf/mime.types",     # Apache 1.2
+    "/usr/local/etc/mime.types",                # Apache 1.3
     ]
 
 inited = 0
@@ -56,24 +56,24 @@
         init()
     scheme, url = urllib.splittype(url)
     if scheme == 'data':
-	# syntax of data URLs:
-	# dataurl   := "data:" [ mediatype ] [ ";base64" ] "," data
-	# mediatype := [ type "/" subtype ] *( ";" parameter )
-	# data      := *urlchar
-	# parameter := attribute "=" value
-	# type/subtype defaults to "text/plain"
-	comma = string.find(url, ',')
-	if comma < 0:
-	    # bad data URL
-	    return None, None
-	semi = string.find(url, ';', 0, comma)
-	if semi >= 0:
-	    type = url[:semi]
-	else:
-	    type = url[:comma]
-	if '=' in type or '/' not in type:
-	    type = 'text/plain'
-	return type, None		# never compressed, so encoding is None
+        # syntax of data URLs:
+        # dataurl   := "data:" [ mediatype ] [ ";base64" ] "," data
+        # mediatype := [ type "/" subtype ] *( ";" parameter )
+        # data      := *urlchar
+        # parameter := attribute "=" value
+        # type/subtype defaults to "text/plain"
+        comma = string.find(url, ',')
+        if comma < 0:
+            # bad data URL
+            return None, None
+        semi = string.find(url, ';', 0, comma)
+        if semi >= 0:
+            type = url[:semi]
+        else:
+            type = url[:comma]
+        if '=' in type or '/' not in type:
+            type = 'text/plain'
+        return type, None               # never compressed, so encoding is None
     base, ext = posixpath.splitext(url)
     while suffix_map.has_key(ext):
         base, ext = posixpath.splitext(base + suffix_map[ext])
diff --git a/Lib/rfc822.py b/Lib/rfc822.py
index b937038..bb17614 100644
--- a/Lib/rfc822.py
+++ b/Lib/rfc822.py
@@ -332,11 +332,11 @@
         """
         raw = []
         for h in self.getallmatchingheaders(name):
-	    if h[0] in ' \t':
-	        raw.append(h)
-	    else:
-	        if raw:
-		    raw.append(', ')
+            if h[0] in ' \t':
+                raw.append(h)
+            else:
+                if raw:
+                    raw.append(', ')
                 i = string.find(h, ':')
                 if i > 0:
                     addr = h[i+1:]
@@ -786,7 +786,7 @@
 
 _monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul',
                'aug', 'sep', 'oct', 'nov', 'dec',
-	       'january', 'february', 'march', 'april', 'may', 'june', 'july',
+               'january', 'february', 'march', 'april', 'may', 'june', 'july',
                'august', 'september', 'october', 'november', 'december']
 _daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
 
@@ -837,16 +837,16 @@
     mm = _monthnames.index(mm)+1
     if mm > 12: mm = mm - 12
     if dd[-1] == ',':
-	dd = dd[:-1]
+        dd = dd[:-1]
     i = string.find(yy, ':')
     if i > 0:
-	yy, tm = tm, yy
+        yy, tm = tm, yy
     if yy[-1] == ',':
-	yy = yy[:-1]
+        yy = yy[:-1]
     if yy[0] not in string.digits:
-	yy, tz = tz, yy
+        yy, tz = tz, yy
     if tm[-1] == ',':
-	tm = tm[:-1]
+        tm = tm[:-1]
     tm = string.splitfields(tm, ':')
     if len(tm) == 2:
         [thh, tmm] = tm
diff --git a/Lib/shelve.py b/Lib/shelve.py
index 807a0bb..a068536 100644
--- a/Lib/shelve.py
+++ b/Lib/shelve.py
@@ -10,19 +10,19 @@
 To summarize the interface (key is a string, data is an arbitrary
 object):
 
-	import shelve
-	d = shelve.open(filename) # open, with (g)dbm filename -- no suffix
+        import shelve
+        d = shelve.open(filename) # open, with (g)dbm filename -- no suffix
 
-	d[key] = data	# store data at key (overwrites old data if
-			# using an existing key)
-	data = d[key]	# retrieve data at key (raise KeyError if no
-			# such key)
-	del d[key]	# delete data stored at key (raises KeyError
-			# if no such key)
-	flag = d.has_key(key)	# true if the key exists
-	list = d.keys()	# a list of all existing keys (slow!)
+        d[key] = data   # store data at key (overwrites old data if
+                        # using an existing key)
+        data = d[key]   # retrieve data at key (raise KeyError if no
+                        # such key)
+        del d[key]      # delete data stored at key (raises KeyError
+                        # if no such key)
+        flag = d.has_key(key)   # true if the key exists
+        list = d.keys() # a list of all existing keys (slow!)
 
-	d.close()	# close it
+        d.close()       # close it
 
 Dependent on the implementation, closing a persistent dictionary may
 or may not be necessary to flush changes to disk.
@@ -31,127 +31,127 @@
 # Try using cPickle and cStringIO if available.
 
 try:
-	from cPickle import Pickler, Unpickler
+        from cPickle import Pickler, Unpickler
 except ImportError:
-	from pickle import Pickler, Unpickler
+        from pickle import Pickler, Unpickler
 
 try:
-	from cStringIO import StringIO
+        from cStringIO import StringIO
 except ImportError:
-	from StringIO import StringIO
+        from StringIO import StringIO
 
 
 class Shelf:
-	"""Base class for shelf implementations.
+        """Base class for shelf implementations.
 
-	This is initialized with a dictionary-like object.
-	See the module's __doc__ string for an overview of the interface.
-	"""
+        This is initialized with a dictionary-like object.
+        See the module's __doc__ string for an overview of the interface.
+        """
 
-	def __init__(self, dict):
-		self.dict = dict
-	
-	def keys(self):
-		return self.dict.keys()
-	
-	def __len__(self):
-		return len(self.dict)
-	
-	def has_key(self, key):
-		return self.dict.has_key(key)
+        def __init__(self, dict):
+                self.dict = dict
+        
+        def keys(self):
+                return self.dict.keys()
+        
+        def __len__(self):
+                return len(self.dict)
+        
+        def has_key(self, key):
+                return self.dict.has_key(key)
 
-	def get(self, key, default=None):
-	        if self.dict.has_key(key):
-			return self[key]
-		return default
-	
-	def __getitem__(self, key):
-		f = StringIO(self.dict[key])
-		return Unpickler(f).load()
-	
-	def __setitem__(self, key, value):
-		f = StringIO()
-		p = Pickler(f)
-		p.dump(value)
-		self.dict[key] = f.getvalue()
-	
-	def __delitem__(self, key):
-		del self.dict[key]
-	
-	def close(self):
-		try:
-			self.dict.close()
-		except:
-			pass
-		self.dict = 0
+        def get(self, key, default=None):
+                if self.dict.has_key(key):
+                        return self[key]
+                return default
+        
+        def __getitem__(self, key):
+                f = StringIO(self.dict[key])
+                return Unpickler(f).load()
+        
+        def __setitem__(self, key, value):
+                f = StringIO()
+                p = Pickler(f)
+                p.dump(value)
+                self.dict[key] = f.getvalue()
+        
+        def __delitem__(self, key):
+                del self.dict[key]
+        
+        def close(self):
+                try:
+                        self.dict.close()
+                except:
+                        pass
+                self.dict = 0
 
-	def __del__(self):
-		self.close()
+        def __del__(self):
+                self.close()
 
-	def sync(self):
-		if hasattr(self.dict, 'sync'):
-			self.dict.sync()
-	    
+        def sync(self):
+                if hasattr(self.dict, 'sync'):
+                        self.dict.sync()
+            
 
 class BsdDbShelf(Shelf):
-	"""Shelf implementation using the "BSD" db interface.
+        """Shelf implementation using the "BSD" db interface.
 
-	This adds methods first(), next(), previous(), last() and
-	set_location() that have no counterpart in [g]dbm databases.
+        This adds methods first(), next(), previous(), last() and
+        set_location() that have no counterpart in [g]dbm databases.
 
-	The actual database must be opened using one of the "bsddb"
-	modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or
-	bsddb.rnopen) and passed to the constructor.
+        The actual database must be opened using one of the "bsddb"
+        modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or
+        bsddb.rnopen) and passed to the constructor.
 
-	See the module's __doc__ string for an overview of the interface.
-	"""
+        See the module's __doc__ string for an overview of the interface.
+        """
 
-	def __init__(self, dict):
-	    Shelf.__init__(self, dict)
+        def __init__(self, dict):
+            Shelf.__init__(self, dict)
 
-	def set_location(self, key):
-	     (key, value) = self.dict.set_location(key)
-	     f = StringIO(value)
-	     return (key, Unpickler(f).load())
+        def set_location(self, key):
+             (key, value) = self.dict.set_location(key)
+             f = StringIO(value)
+             return (key, Unpickler(f).load())
 
-	def next(self):
-	     (key, value) = self.dict.next()
-	     f = StringIO(value)
-	     return (key, Unpickler(f).load())
+        def next(self):
+             (key, value) = self.dict.next()
+             f = StringIO(value)
+             return (key, Unpickler(f).load())
 
-	def previous(self):
-	     (key, value) = self.dict.previous()
-	     f = StringIO(value)
-	     return (key, Unpickler(f).load())
+        def previous(self):
+             (key, value) = self.dict.previous()
+             f = StringIO(value)
+             return (key, Unpickler(f).load())
 
-	def first(self):
-	     (key, value) = self.dict.first()
-	     f = StringIO(value)
-	     return (key, Unpickler(f).load())
+        def first(self):
+             (key, value) = self.dict.first()
+             f = StringIO(value)
+             return (key, Unpickler(f).load())
 
-	def last(self):
-	     (key, value) = self.dict.last()
-	     f = StringIO(value)
-	     return (key, Unpickler(f).load())
+        def last(self):
+             (key, value) = self.dict.last()
+             f = StringIO(value)
+             return (key, Unpickler(f).load())
 
 
 class DbfilenameShelf(Shelf):
-	"""Shelf implementation using the "anydbm" generic dbm interface.
+        """Shelf implementation using the "anydbm" generic dbm interface.
 
-	This is initialized with the filename for the dbm database.
-	See the module's __doc__ string for an overview of the interface.
-	"""
-	
-	def __init__(self, filename, flag='c'):
-		import anydbm
-		Shelf.__init__(self, anydbm.open(filename, flag))
+        This is initialized with the filename for the dbm database.
+        See the module's __doc__ string for an overview of the interface.
+        """
+        
+        def __init__(self, filename, flag='c'):
+                import anydbm
+                Shelf.__init__(self, anydbm.open(filename, flag))
 
 
 def open(filename, flag='c'):
-	"""Open a persistent dictionary for reading and writing.
+        """Open a persistent dictionary for reading and writing.
 
-	Argument is the filename for the dbm database.
-	See the module's __doc__ string for an overview of the interface.
-	"""
-	
-	return DbfilenameShelf(filename, flag)
+        Argument is the filename for the dbm database.
+        See the module's __doc__ string for an overview of the interface.
+        """
+        
+        return DbfilenameShelf(filename, flag)
diff --git a/Lib/stringold.py b/Lib/stringold.py
index 2c3083e..8fa7dd4 100644
--- a/Lib/stringold.py
+++ b/Lib/stringold.py
@@ -199,10 +199,10 @@
 
     """
     if type(s) == _StringType:
-	return _float(s)
+        return _float(s)
     else:
-	raise TypeError('argument 1: expected string, %s found' %
-			type(s).__name__)
+        raise TypeError('argument 1: expected string, %s found' %
+                        type(s).__name__)
 
 # Convert string to integer
 def atoi(*args):
@@ -217,18 +217,18 @@
 
     """
     try:
-	s = args[0]
+        s = args[0]
     except IndexError:
-	raise TypeError('function requires at least 1 argument: %d given' %
-			len(args))
+        raise TypeError('function requires at least 1 argument: %d given' %
+                        len(args))
     # Don't catch type error resulting from too many arguments to int().  The
     # error message isn't compatible but the error type is, and this function
     # is complicated enough already.
     if type(s) == _StringType:
-	return _apply(_int, args)
+        return _apply(_int, args)
     else:
-	raise TypeError('argument 1: expected string, %s found' %
-			type(s).__name__)
+        raise TypeError('argument 1: expected string, %s found' %
+                        type(s).__name__)
 
 
 # Convert string to long integer
@@ -245,18 +245,18 @@
 
     """
     try:
-	s = args[0]
+        s = args[0]
     except IndexError:
-	raise TypeError('function requires at least 1 argument: %d given' %
-			len(args))
+        raise TypeError('function requires at least 1 argument: %d given' %
+                        len(args))
     # Don't catch type error resulting from too many arguments to long().  The
     # error message isn't compatible but the error type is, and this function
     # is complicated enough already.
     if type(s) == _StringType:
-	return _apply(_long, args)
+        return _apply(_long, args)
     else:
-	raise TypeError('argument 1: expected string, %s found' %
-			type(s).__name__)
+        raise TypeError('argument 1: expected string, %s found' %
+                        type(s).__name__)
 
 
 # Left-justify a string
@@ -298,8 +298,8 @@
     if n <= 0: return s
     half = n/2
     if n%2 and width%2:
-	# This ensures that center(center(s, i), j) = center(s, j)
-	half = half+1
+        # This ensures that center(center(s, i), j) = center(s, j)
+        half = half+1
     return ' '*half +  s + ' '*(n-half)
 
 # Zero-fill a number, e.g., (12, 3) --> '012' and (-3, 3) --> '-03'
@@ -318,7 +318,7 @@
     if n >= width: return s
     sign = ''
     if s[0] in ('-', '+'):
-	sign, s = s[0], s[1:]
+        sign, s = s[0], s[1:]
     return sign + '0'*(width-n) + s
 
 # Expand tabs in a string.
@@ -333,12 +333,12 @@
     """
     res = line = ''
     for c in s:
-	if c == '\t':
-	    c = ' '*(tabsize - len(line) % tabsize)
-	line = line + c
-	if c == '\n':
-	    res = res + line
-	    line = ''
+        if c == '\t':
+            c = ' '*(tabsize - len(line) % tabsize)
+        line = line + c
+        if c == '\n':
+            res = res + line
+            line = ''
     return res + line
 
 # Character translation through look-up table.
@@ -387,14 +387,14 @@
 
     """
     if len(fromstr) != len(tostr):
-	raise ValueError, "maketrans arguments must have same length"
+        raise ValueError, "maketrans arguments must have same length"
     global _idmapL
     if not _idmapL:
-	_idmapL = map(None, _idmap)
+        _idmapL = map(None, _idmap)
     L = _idmapL[:]
     fromstr = map(ord, fromstr)
     for i in range(len(fromstr)):
-	L[fromstr[i]] = tostr[i]
+        L[fromstr[i]] = tostr[i]
     return joinfields(L, "")
 
 # Substring replacement (global)
@@ -428,4 +428,4 @@
     from strop import maketrans, lowercase, uppercase, whitespace
     letters = lowercase + uppercase
 except ImportError:
-    pass					  # Use the original versions
+    pass                                          # Use the original versions
diff --git a/Lib/urllib2.py b/Lib/urllib2.py
index f1b4113..c147560 100644
--- a/Lib/urllib2.py
+++ b/Lib/urllib2.py
@@ -148,57 +148,57 @@
     # URLError is a sub-type of IOError, but it doesn't share any of
     # the implementation.  need to override __init__ and __str__
     def __init__(self, reason):
-	self.reason = reason
+        self.reason = reason
 
     def __str__(self):
-	return '<urlopen error %s>' % self.reason
+        return '<urlopen error %s>' % self.reason
 
 class HTTPError(URLError, addinfourl):
     """Raised when HTTP error occurs, but also acts like non-error return"""
 
     def __init__(self, url, code, msg, hdrs, fp):
-	addinfourl.__init__(self, fp, hdrs, url)
-	self.code = code
-	self.msg = msg
-	self.hdrs = hdrs
-	self.fp = fp
-	# XXX
-	self.filename = url
-	
+        addinfourl.__init__(self, fp, hdrs, url)
+        self.code = code
+        self.msg = msg
+        self.hdrs = hdrs
+        self.fp = fp
+        # XXX
+        self.filename = url
+        
     def __str__(self):
-	return 'HTTP Error %s: %s' % (self.code, self.msg)
+        return 'HTTP Error %s: %s' % (self.code, self.msg)
 
     def __del__(self):
-	# XXX is this safe? what if user catches exception, then
-	# extracts fp and discards exception?
-	self.fp.close()
+        # XXX is this safe? what if user catches exception, then
+        # extracts fp and discards exception?
+        self.fp.close()
 
 class GopherError(URLError):
     pass
 
 class Request:
     def __init__(self, url, data=None, headers={}):
-	# unwrap('<URL:type://host/path>') --> 'type://host/path'
-	self.__original = unwrap(url)
-	self.type = None
-	# self.__r_type is what's left after doing the splittype
-	self.host = None
-	self.port = None
+        # unwrap('<URL:type://host/path>') --> 'type://host/path'
+        self.__original = unwrap(url)
+        self.type = None
+        # self.__r_type is what's left after doing the splittype
+        self.host = None
+        self.port = None
         self.data = data
-	self.headers = {}
+        self.headers = {}
         self.headers.update(headers)
 
     def __getattr__(self, attr):
-	# XXX this is a fallback mechanism to guard against these
-	# methods getting called in a non-standard order.  this may be 
-	# too complicated and/or unnecessary.
-	# XXX should the __r_XXX attributes be public?
-	if attr[:12] == '_Request__r_':
-	    name = attr[12:]
-	    if hasattr(Request, 'get_' + name):
-		getattr(self, 'get_' + name)()
-		return getattr(self, attr)
-	raise AttributeError, attr
+        # XXX this is a fallback mechanism to guard against these
+        # methods getting called in a non-standard order.  this may be 
+        # too complicated and/or unnecessary.
+        # XXX should the __r_XXX attributes be public?
+        if attr[:12] == '_Request__r_':
+            name = attr[12:]
+            if hasattr(Request, 'get_' + name):
+                getattr(self, 'get_' + name)()
+                return getattr(self, attr)
+        raise AttributeError, attr
 
     def add_data(self, data):
         self.data = data
@@ -213,34 +213,34 @@
         return self.__original
 
     def get_type(self):
-	if self.type is None:
-	    self.type, self.__r_type = splittype(self.__original)
-	return self.type
+        if self.type is None:
+            self.type, self.__r_type = splittype(self.__original)
+        return self.type
 
     def get_host(self):
-	if self.host is None:
-	    self.host, self.__r_host = splithost(self.__r_type)
-	    if self.host:
-		self.host = unquote(self.host)
-	return self.host
+        if self.host is None:
+            self.host, self.__r_host = splithost(self.__r_type)
+            if self.host:
+                self.host = unquote(self.host)
+        return self.host
 
     def get_selector(self):
-	return self.__r_host
+        return self.__r_host
 
     def set_proxy(self, proxy):
-	self.__proxy = proxy
-	# XXX this code is based on urllib, but it doesn't seem
-	# correct.  specifically, if the proxy has a port number then
-	# splittype will return the hostname as the type and the port
-	# will be include with everything else
-	self.type, self.__r_type = splittype(self.__proxy)
-	self.host, XXX = splithost(self.__r_type)
-	self.host = unquote(self.host)
-	self.__r_host = self.__original
+        self.__proxy = proxy
+        # XXX this code is based on urllib, but it doesn't seem
+        # correct.  specifically, if the proxy has a port number then
+        # splittype will return the hostname as the type and the port
+        # will be include with everything else
+        self.type, self.__r_type = splittype(self.__proxy)
+        self.host, XXX = splithost(self.__r_type)
+        self.host = unquote(self.host)
+        self.__r_host = self.__original
 
     def add_header(self, key, val):
-	# useful for something like authentication
-	self.headers[key] = val
+        # useful for something like authentication
+        self.headers[key] = val
 
 class OpenerDirector:
     def __init__(self):
@@ -302,21 +302,21 @@
                 return result
 
     def open(self, fullurl, data=None):
-	# accept a URL or a Request object
-	if type(fullurl) == types.StringType:
-	    req = Request(fullurl, data)
+        # accept a URL or a Request object
+        if type(fullurl) == types.StringType:
+            req = Request(fullurl, data)
         else:
             req = fullurl
             if data is not None:
                 req.add_data(data)
-	assert isinstance(req, Request) # really only care about interface
+        assert isinstance(req, Request) # really only care about interface
         
         result = self._call_chain(self.handle_open, 'default',
                                   'default_open', req)  
         if result:
             return result
 
-	type_ = req.get_type()
+        type_ = req.get_type()
         result = self._call_chain(self.handle_open, type_, type_ + \
                                   '_open', req) 
         if result:
@@ -350,11 +350,11 @@
     # not quite like builtin callable (which I didn't know existed),
     # not entirely sure it needs to be different
     if type(obj) in (types.BuiltinFunctionType,
-		     types.BuiltinMethodType,  types.LambdaType,
-		     types.MethodType):
-	return 1
+                     types.BuiltinMethodType,  types.LambdaType,
+                     types.MethodType):
+        return 1
     if type(obj) == types.InstanceType:
-	return hasattr(obj, '__call__')
+        return hasattr(obj, '__call__')
     return 0
 
 def get_methods(inst):
@@ -370,8 +370,8 @@
             if type(attr) == types.UnboundMethodType:
                 methods[name] = 1
     for name in dir(inst):
-	if is_callable(getattr(inst, name)):
-	    methods[name] = 1
+        if is_callable(getattr(inst, name)):
+            methods[name] = 1
     return methods.keys()
 
 # XXX probably also want an abstract factory that knows things like
@@ -423,7 +423,7 @@
 
 class HTTPDefaultErrorHandler(BaseHandler):
     def http_error_default(self, req, fp, code, msg, hdrs):
-	raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
+        raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
 
 class HTTPRedirectHandler(BaseHandler):
     # Implementation note: To avoid the server sending us into an
@@ -461,114 +461,114 @@
 
 class ProxyHandler(BaseHandler):
     def __init__(self, proxies=None):
-	if proxies is None:
-	    proxies = getproxies()
-	assert hasattr(proxies, 'has_key'), "proxies must be a mapping"
-	self.proxies = proxies
-	for type, url in proxies.items():
-	    setattr(self, '%s_open' % type, 
-		    lambda r, proxy=url, type=type, meth=self.proxy_open: \
-		    meth(r, proxy, type))
+        if proxies is None:
+            proxies = getproxies()
+        assert hasattr(proxies, 'has_key'), "proxies must be a mapping"
+        self.proxies = proxies
+        for type, url in proxies.items():
+            setattr(self, '%s_open' % type, 
+                    lambda r, proxy=url, type=type, meth=self.proxy_open: \
+                    meth(r, proxy, type))
 
     def proxy_open(self, req, proxy, type):
-	orig_type = req.get_type()
-	req.set_proxy(proxy)
-	if orig_type == type:
-	    # let other handlers take care of it
-	    # XXX this only makes sense if the proxy is before the
-	    # other handlers
-	    return None
-	else:
-	    # need to start over, because the other handlers don't
-	    # grok the proxy's URL type
-	    return self.parent.open(req)
+        orig_type = req.get_type()
+        req.set_proxy(proxy)
+        if orig_type == type:
+            # let other handlers take care of it
+            # XXX this only makes sense if the proxy is before the
+            # other handlers
+            return None
+        else:
+            # need to start over, because the other handlers don't
+            # grok the proxy's URL type
+            return self.parent.open(req)
 
 # feature suggested by Duncan Booth
 # XXX custom is not a good name
 class CustomProxy:
     # either pass a function to the constructor or override handle
     def __init__(self, proto, func=None, proxy_addr=None):
-	self.proto = proto
-	self.func = func
-	self.addr = proxy_addr
+        self.proto = proto
+        self.func = func
+        self.addr = proxy_addr
 
     def handle(self, req):
-	if self.func and self.func(req):
-	    return 1
+        if self.func and self.func(req):
+            return 1
 
     def get_proxy(self):
-	return self.addr
+        return self.addr
 
 class CustomProxyHandler(BaseHandler):
     def __init__(self, *proxies):
-	self.proxies = {}
+        self.proxies = {}
 
     def proxy_open(self, req):
-	proto = req.get_type()
-	try:
-	    proxies = self.proxies[proto]
-	except KeyError:
-	    return None
-	for p in proxies:
-	    if p.handle(req):
-		req.set_proxy(p.get_proxy())
-		return self.parent.open(req)
-	return None
+        proto = req.get_type()
+        try:
+            proxies = self.proxies[proto]
+        except KeyError:
+            return None
+        for p in proxies:
+            if p.handle(req):
+                req.set_proxy(p.get_proxy())
+                return self.parent.open(req)
+        return None
 
     def do_proxy(self, p, req):
-	p
-	return self.parent.open(req)
+        p
+        return self.parent.open(req)
 
     def add_proxy(self, cpo):
-	if self.proxies.has_key(cpo.proto):
-	    self.proxies[cpo.proto].append(cpo)
-	else:
-	    self.proxies[cpo.proto] = [cpo]
+        if self.proxies.has_key(cpo.proto):
+            self.proxies[cpo.proto].append(cpo)
+        else:
+            self.proxies[cpo.proto] = [cpo]
 
 class HTTPPasswordMgr:
     def __init__(self):
-	self.passwd = {}
+        self.passwd = {}
 
     def add_password(self, realm, uri, user, passwd):
-	# uri could be a single URI or a sequence
-	if type(uri) == types.StringType:
-	    uri = [uri]
-	uri = tuple(map(self.reduce_uri, uri))
-	if not self.passwd.has_key(realm):
-	    self.passwd[realm] = {}
-	self.passwd[realm][uri] = (user, passwd)
+        # uri could be a single URI or a sequence
+        if type(uri) == types.StringType:
+            uri = [uri]
+        uri = tuple(map(self.reduce_uri, uri))
+        if not self.passwd.has_key(realm):
+            self.passwd[realm] = {}
+        self.passwd[realm][uri] = (user, passwd)
 
     def find_user_password(self, realm, authuri):
-	domains = self.passwd.get(realm, {})
-	authuri = self.reduce_uri(authuri)
-	for uris, authinfo in domains.items():
-	    for uri in uris:
-		if self.is_suburi(uri, authuri):
-		    return authinfo
-	return None, None
+        domains = self.passwd.get(realm, {})
+        authuri = self.reduce_uri(authuri)
+        for uris, authinfo in domains.items():
+            for uri in uris:
+                if self.is_suburi(uri, authuri):
+                    return authinfo
+        return None, None
 
     def reduce_uri(self, uri):
-	"""Accept netloc or URI and extract only the netloc and path"""
-	parts = urlparse.urlparse(uri)
-	if parts[1]:
-	    return parts[1], parts[2] or '/'
-	else:
-	    return parts[2], '/'
+        """Accept netloc or URI and extract only the netloc and path"""
+        parts = urlparse.urlparse(uri)
+        if parts[1]:
+            return parts[1], parts[2] or '/'
+        else:
+            return parts[2], '/'
 
     def is_suburi(self, base, test):
-	"""Check if test is below base in a URI tree
+        """Check if test is below base in a URI tree
 
-	Both args must be URIs in reduced form.
-	"""
-	if base == test:
-	    return 1
-	if base[0] != test[0]:
-	    return 0
-	common = os.path.commonprefix((base[1], test[1]))
-	if len(common) == len(base[1]):
-	    return 1
-	return 0
-	
+        Both args must be URIs in reduced form.
+        """
+        if base == test:
+            return 1
+        if base[0] != test[0]:
+            return 0
+        common = os.path.commonprefix((base[1], test[1]))
+        if len(common) == len(base[1]):
+            return 1
+        return 0
+        
 
 class HTTPBasicAuthHandler(BaseHandler):
     rx = re.compile('[ \t]*([^ \t]+)[ \t]+realm="([^"]*)"')
@@ -579,15 +579,15 @@
 
     def __init__(self):
         self.passwd = HTTPPasswordMgr()
-	self.add_password = self.passwd.add_password
-	self.__current_realm = None
-	# if __current_realm is not None, then the server must have
-	# refused our name/password and is asking for authorization
-	# again.  must be careful to set it to None on successful
-	# return. 
+        self.add_password = self.passwd.add_password
+        self.__current_realm = None
+        # if __current_realm is not None, then the server must have
+        # refused our name/password and is asking for authorization
+        # again.  must be careful to set it to None on successful
+        # return. 
     
     def http_error_401(self, req, fp, code, msg, headers):
-	# XXX could be mult. headers
+        # XXX could be mult. headers
         authreq = headers.get('www-authenticate', None)
         if authreq:
             mo = HTTPBasicAuthHandler.rx.match(authreq)
@@ -597,23 +597,23 @@
                     return self.retry_http_basic_auth(req, realm)
 
     def retry_http_basic_auth(self, req, realm):
-	if self.__current_realm is None:
-	    self.__current_realm = realm
-	else:
-	    self.__current_realm = realm
-	    return None
-	# XXX host isn't really the correct URI?
+        if self.__current_realm is None:
+            self.__current_realm = realm
+        else:
+            self.__current_realm = realm
+            return None
+        # XXX host isn't really the correct URI?
         host = req.get_host()
         user,pw = self.passwd.find_user_password(realm, host)
         if pw:
-	    raw = "%s:%s" % (user, pw)
-	    auth = string.strip(base64.encodestring(raw))
+            raw = "%s:%s" % (user, pw)
+            auth = string.strip(base64.encodestring(raw))
             req.add_header('Authorization', 'Basic %s' % auth)
             resp = self.parent.open(req)
-	    self.__current_realm = None
-	    return resp
+            self.__current_realm = None
+            return resp
         else:
-	    self.__current_realm = None
+            self.__current_realm = None
             return None
 
 class HTTPDigestAuthHandler(BaseHandler):
@@ -624,111 +624,111 @@
     """
 
     def __init__(self):
-	self.passwd = HTTPPasswordMgr()
-	self.add_password = self.passwd.add_password
-	self.__current_realm = None
+        self.passwd = HTTPPasswordMgr()
+        self.add_password = self.passwd.add_password
+        self.__current_realm = None
 
     def http_error_401(self, req, fp, code, msg, headers):
-	# XXX could be mult. headers
-	authreq = headers.get('www-authenticate', None)
-	if authreq:
-	    kind = string.split(authreq)[0]
-	    if kind == 'Digest':
-		return self.retry_http_digest_auth(req, authreq)
+        # XXX could be mult. headers
+        authreq = headers.get('www-authenticate', None)
+        if authreq:
+            kind = string.split(authreq)[0]
+            if kind == 'Digest':
+                return self.retry_http_digest_auth(req, authreq)
 
     def retry_http_digest_auth(self, req, auth):
-	token, challenge = string.split(auth, ' ', 1)
-	chal = parse_keqv_list(parse_http_list(challenge))
-	auth = self.get_authorization(req, chal)
-	if auth:
-	    req.add_header('Authorization', 'Digest %s' % auth)
-	    resp = self.parent.open(req)
-	    self.__current_realm = None
-	    return resp
+        token, challenge = string.split(auth, ' ', 1)
+        chal = parse_keqv_list(parse_http_list(challenge))
+        auth = self.get_authorization(req, chal)
+        if auth:
+            req.add_header('Authorization', 'Digest %s' % auth)
+            resp = self.parent.open(req)
+            self.__current_realm = None
+            return resp
 
     def get_authorization(self, req, chal):
-	try:
-	    realm = chal['realm']
-	    nonce = chal['nonce']
-	    algorithm = chal.get('algorithm', 'MD5')
-	    # mod_digest doesn't send an opaque, even though it isn't
-	    # supposed to be optional
-	    opaque = chal.get('opaque', None)
-	except KeyError:
-	    return None
+        try:
+            realm = chal['realm']
+            nonce = chal['nonce']
+            algorithm = chal.get('algorithm', 'MD5')
+            # mod_digest doesn't send an opaque, even though it isn't
+            # supposed to be optional
+            opaque = chal.get('opaque', None)
+        except KeyError:
+            return None
 
-	if self.__current_realm is None:
-	    self.__current_realm = realm
-	else:
-	    self.__current_realm = realm
-	    return None
+        if self.__current_realm is None:
+            self.__current_realm = realm
+        else:
+            self.__current_realm = realm
+            return None
 
-	H, KD = self.get_algorithm_impls(algorithm)
-	if H is None:
-	    return None
+        H, KD = self.get_algorithm_impls(algorithm)
+        if H is None:
+            return None
 
-	user, pw = self.passwd.find_user_password(realm,
-						  req.get_full_url()) 
-	if user is None:
-	    return None
+        user, pw = self.passwd.find_user_password(realm,
+                                                  req.get_full_url()) 
+        if user is None:
+            return None
 
-	# XXX not implemented yet
-	if req.has_data():
-	    entdig = self.get_entity_digest(req.get_data(), chal)
-	else:
-	    entdig = None
+        # XXX not implemented yet
+        if req.has_data():
+            entdig = self.get_entity_digest(req.get_data(), chal)
+        else:
+            entdig = None
 
-	A1 = "%s:%s:%s" % (user, realm, pw)
-	A2 = "%s:%s" % (req.has_data() and 'POST' or 'GET',
-			# XXX selector: what about proxies and full urls
-			req.get_selector())
-	respdig = KD(H(A1), "%s:%s" % (nonce, H(A2)))
-	# XXX should the partial digests be encoded too?
+        A1 = "%s:%s:%s" % (user, realm, pw)
+        A2 = "%s:%s" % (req.has_data() and 'POST' or 'GET',
+                        # XXX selector: what about proxies and full urls
+                        req.get_selector())
+        respdig = KD(H(A1), "%s:%s" % (nonce, H(A2)))
+        # XXX should the partial digests be encoded too?
 
-	base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \
-	       'response="%s"' % (user, realm, nonce, req.get_selector(),
-				  respdig)
-	if opaque:
-	    base = base + ', opaque="%s"' % opaque
-	if entdig:
-	    base = base + ', digest="%s"' % entdig
-	if algorithm != 'MD5':
-	    base = base + ', algorithm="%s"' % algorithm
-	return base
+        base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \
+               'response="%s"' % (user, realm, nonce, req.get_selector(),
+                                  respdig)
+        if opaque:
+            base = base + ', opaque="%s"' % opaque
+        if entdig:
+            base = base + ', digest="%s"' % entdig
+        if algorithm != 'MD5':
+            base = base + ', algorithm="%s"' % algorithm
+        return base
 
     def get_algorithm_impls(self, algorithm):
-	# lambdas assume digest modules are imported at the top level
-	if algorithm == 'MD5':
-	    H = lambda x, e=encode_digest:e(md5.new(x).digest())
-	elif algorithm == 'SHA':
-	    H = lambda x, e=encode_digest:e(sha.new(x).digest())
-	# XXX MD5-sess
-	KD = lambda s, d, H=H: H("%s:%s" % (s, d))
-	return H, KD
+        # lambdas assume digest modules are imported at the top level
+        if algorithm == 'MD5':
+            H = lambda x, e=encode_digest:e(md5.new(x).digest())
+        elif algorithm == 'SHA':
+            H = lambda x, e=encode_digest:e(sha.new(x).digest())
+        # XXX MD5-sess
+        KD = lambda s, d, H=H: H("%s:%s" % (s, d))
+        return H, KD
 
     def get_entity_digest(self, data, chal):
-	# XXX not implemented yet
-	return None
+        # XXX not implemented yet
+        return None
 
 def encode_digest(digest):
     hexrep = []
     for c in digest:
-	n = (ord(c) >> 4) & 0xf
-	hexrep.append(hex(n)[-1])
-	n = ord(c) & 0xf
-	hexrep.append(hex(n)[-1])
+        n = (ord(c) >> 4) & 0xf
+        hexrep.append(hex(n)[-1])
+        n = ord(c) & 0xf
+        hexrep.append(hex(n)[-1])
     return string.join(hexrep, '')
-	
+        
         
 class HTTPHandler(BaseHandler):
     def http_open(self, req):
         # XXX devise a new mechanism to specify user/password
-	host = req.get_host()
+        host = req.get_host()
         if not host:
             raise URLError('no host given')
 
         h = httplib.HTTP(host) # will parse host:port
-##	h.set_debuglevel(1)
+##      h.set_debuglevel(1)
         if req.has_data():
             data = req.get_data()
             h.putrequest('POST', req.get_selector())
@@ -740,8 +740,8 @@
         h.putheader('Host', host)
         for args in self.parent.addheaders:
             apply(h.putheader, args)
-	for k, v in req.headers.items():
-	    h.putheader(k, v)
+        for k, v in req.headers.items():
+            h.putheader(k, v)
         h.endheaders()
         if req.has_data():
             h.send(data + '\r\n')
@@ -761,17 +761,17 @@
 
 class UnknownHandler(BaseHandler):
     def unknown_open(self, req):
-	type = req.get_type()
+        type = req.get_type()
         raise URLError('unknown url type: %s' % type)
 
 def parse_keqv_list(l):
     """Parse list of key=value strings where keys are not duplicated."""
     parsed = {}
     for elt in l:
-	k, v = string.split(elt, '=', 1)
-	if v[0] == '"' and v[-1] == '"':
-	    v = v[1:-1]
-	parsed[k] = v
+        k, v = string.split(elt, '=', 1)
+        if v[0] == '"' and v[-1] == '"':
+            v = v[1:-1]
+        parsed[k] = v
     return parsed
 
 def parse_http_list(s):
@@ -789,104 +789,104 @@
     inquote = 0
     start = 0
     while i < end:
-	cur = s[i:]
-	c = string.find(cur, ',')
-	q = string.find(cur, '"')
-	if c == -1:
-	    list.append(s[start:])
-	    break
-	if q == -1:
-	    if inquote:
-		raise ValueError, "unbalanced quotes"
-	    else:
-		list.append(s[start:i+c])
-		i = i + c + 1
-		continue
-	if inquote:
-	    if q < c:
-		list.append(s[start:i+c])
-		i = i + c + 1
-		start = i
-		inquote = 0
-	    else:
-		i = i + q 
-	else:
-	    if c < q:
-		list.append(s[start:i+c])
-		i = i + c + 1
-		start = i
-	    else:
-		inquote = 1
-		i = i + q + 1
+        cur = s[i:]
+        c = string.find(cur, ',')
+        q = string.find(cur, '"')
+        if c == -1:
+            list.append(s[start:])
+            break
+        if q == -1:
+            if inquote:
+                raise ValueError, "unbalanced quotes"
+            else:
+                list.append(s[start:i+c])
+                i = i + c + 1
+                continue
+        if inquote:
+            if q < c:
+                list.append(s[start:i+c])
+                i = i + c + 1
+                start = i
+                inquote = 0
+            else:
+                i = i + q 
+        else:
+            if c < q:
+                list.append(s[start:i+c])
+                i = i + c + 1
+                start = i
+            else:
+                inquote = 1
+                i = i + q + 1
     return map(string.strip, list)
 
 class FileHandler(BaseHandler):
     # Use local file or FTP depending on form of URL
     def file_open(self, req):
-	url = req.get_selector()
-	if url[:2] == '//' and url[2:3] != '/':
-	    req.type = 'ftp'
-	    return self.parent.open(req)
-	else:
-	    return self.open_local_file(req)
+        url = req.get_selector()
+        if url[:2] == '//' and url[2:3] != '/':
+            req.type = 'ftp'
+            return self.parent.open(req)
+        else:
+            return self.open_local_file(req)
 
     # names for the localhost
     names = None
     def get_names(self):
-	if FileHandler.names is None:
-	    FileHandler.names = (socket.gethostbyname('localhost'), 
-				 socket.gethostbyname(socket.gethostname()))
-	return FileHandler.names
+        if FileHandler.names is None:
+            FileHandler.names = (socket.gethostbyname('localhost'), 
+                                 socket.gethostbyname(socket.gethostname()))
+        return FileHandler.names
 
     # not entirely sure what the rules are here
     def open_local_file(self, req):
-	mtype = mimetypes.guess_type(req.get_selector())[0]
-	headers = mimetools.Message(StringIO('Content-Type: %s\n' \
-					     % (mtype or 'text/plain')))
-	host = req.get_host()
-	file = req.get_selector()
-	if host:
-	    host, port = splitport(host)
-	if not host or \
-	   (not port and socket.gethostbyname(host) in self.get_names()):
-	    return addinfourl(open(url2pathname(file), 'rb'),
-			      headers, 'file:'+file)
-	raise URLError('file not on local host')
+        mtype = mimetypes.guess_type(req.get_selector())[0]
+        headers = mimetools.Message(StringIO('Content-Type: %s\n' \
+                                             % (mtype or 'text/plain')))
+        host = req.get_host()
+        file = req.get_selector()
+        if host:
+            host, port = splitport(host)
+        if not host or \
+           (not port and socket.gethostbyname(host) in self.get_names()):
+            return addinfourl(open(url2pathname(file), 'rb'),
+                              headers, 'file:'+file)
+        raise URLError('file not on local host')
 
 class FTPHandler(BaseHandler):
     def ftp_open(self, req):
-	host = req.get_host()
-	if not host:
-	    raise IOError, ('ftp error', 'no host given')
-	# XXX handle custom username & password
-	host = socket.gethostbyname(host)
-	host, port = splitport(host)
-	if port is None:
-	    port = ftplib.FTP_PORT
-	path, attrs = splitattr(req.get_selector())
-	path = unquote(path)
-	dirs = string.splitfields(path, '/')
-	dirs, file = dirs[:-1], dirs[-1]
-	if dirs and not dirs[0]:
-	    dirs = dirs[1:]
-	user = passwd = '' # XXX
-	try:
-	    fw = self.connect_ftp(user, passwd, host, port, dirs)
-	    type = file and 'I' or 'D'
-	    for attr in attrs:
-		attr, value = splitattr(attr)
-		if string.lower(attr) == 'type' and \
-		   value in ('a', 'A', 'i', 'I', 'd', 'D'):
-		    type = string.upper(value)
-	    fp, retrlen = fw.retrfile(file, type)
-	    if retrlen is not None and retrlen >= 0:
-		sf = StringIO('Content-Length: %d\n' % retrlen)
-		headers = mimetools.Message(sf)
-	    else:
-		headers = noheaders()
-	    return addinfourl(fp, headers, req.get_full_url())
-	except ftplib.all_errors, msg:
-	    raise IOError, ('ftp error', msg), sys.exc_info()[2]
+        host = req.get_host()
+        if not host:
+            raise IOError, ('ftp error', 'no host given')
+        # XXX handle custom username & password
+        host = socket.gethostbyname(host)
+        host, port = splitport(host)
+        if port is None:
+            port = ftplib.FTP_PORT
+        path, attrs = splitattr(req.get_selector())
+        path = unquote(path)
+        dirs = string.splitfields(path, '/')
+        dirs, file = dirs[:-1], dirs[-1]
+        if dirs and not dirs[0]:
+            dirs = dirs[1:]
+        user = passwd = '' # XXX
+        try:
+            fw = self.connect_ftp(user, passwd, host, port, dirs)
+            type = file and 'I' or 'D'
+            for attr in attrs:
+                attr, value = splitattr(attr)
+                if string.lower(attr) == 'type' and \
+                   value in ('a', 'A', 'i', 'I', 'd', 'D'):
+                    type = string.upper(value)
+            fp, retrlen = fw.retrfile(file, type)
+            if retrlen is not None and retrlen >= 0:
+                sf = StringIO('Content-Length: %d\n' % retrlen)
+                headers = mimetools.Message(sf)
+            else:
+                headers = noheaders()
+            return addinfourl(fp, headers, req.get_full_url())
+        except ftplib.all_errors, msg:
+            raise IOError, ('ftp error', msg), sys.exc_info()[2]
 
     def connect_ftp(self, user, passwd, host, port, dirs):
         fw = ftpwrapper(user, passwd, host, port, dirs)
@@ -901,13 +901,13 @@
         self.timeout = {}
         self.soonest = 0
         self.delay = 60
-	self.max_conns = 16
+        self.max_conns = 16
 
     def setTimeout(self, t):
         self.delay = t
 
     def setMaxConns(self, m):
-	self.max_conns = m
+        self.max_conns = m
 
     def connect_ftp(self, user, passwd, host, port, dirs):
         key = user, passwd, host, port
@@ -916,11 +916,11 @@
         else:
             self.cache[key] = ftpwrapper(user, passwd, host, port, dirs)
             self.timeout[key] = time.time() + self.delay
-	self.check_cache()
+        self.check_cache()
         return self.cache[key]
 
     def check_cache(self):
-	# first check for old ones
+        # first check for old ones
         t = time.time()
         if self.soonest <= t:
             for k, v in self.timeout.items():
@@ -931,56 +931,56 @@
         self.soonest = min(self.timeout.values())
 
         # then check the size
-	if len(self.cache) == self.max_conns:
-	    for k, v in self.timeout.items():
-		if v == self.soonest:
-		    del self.cache[k]
-		    del self.timeout[k]
-		    break
-	    self.soonest = min(self.timeout.values())
+        if len(self.cache) == self.max_conns:
+            for k, v in self.timeout.items():
+                if v == self.soonest:
+                    del self.cache[k]
+                    del self.timeout[k]
+                    break
+            self.soonest = min(self.timeout.values())
 
 class GopherHandler(BaseHandler):
     def gopher_open(self, req):
-	host = req.get_host()
-	if not host:
-	    raise GopherError('no host given')
-	host = unquote(host)
-	selector = req.get_selector()
-	type, selector = splitgophertype(selector)
-	selector, query = splitquery(selector)
-	selector = unquote(selector)
-	if query:
-	    query = unquote(query)
-	    fp = gopherlib.send_query(selector, query, host)
-	else:
-	    fp = gopherlib.send_selector(selector, host)
-	return addinfourl(fp, noheaders(), req.get_full_url())
+        host = req.get_host()
+        if not host:
+            raise GopherError('no host given')
+        host = unquote(host)
+        selector = req.get_selector()
+        type, selector = splitgophertype(selector)
+        selector, query = splitquery(selector)
+        selector = unquote(selector)
+        if query:
+            query = unquote(query)
+            fp = gopherlib.send_query(selector, query, host)
+        else:
+            fp = gopherlib.send_selector(selector, host)
+        return addinfourl(fp, noheaders(), req.get_full_url())
 
 #bleck! don't use this yet
 class OpenerFactory:
 
     default_handlers = [UnknownHandler, HTTPHandler,
-			HTTPDefaultErrorHandler, HTTPRedirectHandler, 
-			FTPHandler, FileHandler]
+                        HTTPDefaultErrorHandler, HTTPRedirectHandler, 
+                        FTPHandler, FileHandler]
     proxy_handlers = [ProxyHandler]
     handlers = []
     replacement_handlers = []
 
     def add_proxy_handler(self, ph):
-	self.proxy_handlers = self.proxy_handlers + [ph]
+        self.proxy_handlers = self.proxy_handlers + [ph]
 
     def add_handler(self, h):
-	self.handlers = self.handlers + [h]
+        self.handlers = self.handlers + [h]
 
     def replace_handler(self, h):
-	pass
+        pass
 
     def build_opener(self):
-	opener = OpenerDirectory()
-	for ph in self.proxy_handlers:
-	    if type(ph) == types.ClassType:
-		ph = ph()
-	    opener.add_handler(ph)
+        opener = OpenerDirectory()
+        for ph in self.proxy_handlers:
+            if type(ph) == types.ClassType:
+                ph = ph()
+            opener.add_handler(ph)
 
 if __name__ == "__main__":
     # XXX some of the test code depends on machine configurations that 
@@ -993,24 +993,24 @@
     else:
         localhost = None
     urls = [
-	# Thanks to Fred for finding these!
-	'gopher://gopher.lib.ncsu.edu/11/library/stacks/Alex',
-	'gopher://gopher.vt.edu:10010/10/33',
+        # Thanks to Fred for finding these!
+        'gopher://gopher.lib.ncsu.edu/11/library/stacks/Alex',
+        'gopher://gopher.vt.edu:10010/10/33',
 
-	'file:/etc/passwd',
-	'file://nonsensename/etc/passwd',
-	'ftp://www.python.org/pub/tmp/httplib.py',
+        'file:/etc/passwd',
+        'file://nonsensename/etc/passwd',
+        'ftp://www.python.org/pub/tmp/httplib.py',
         'ftp://www.python.org/pub/tmp/imageop.c',
         'ftp://www.python.org/pub/tmp/blat',
-  	'http://www.espn.com/', # redirect
-  	'http://www.python.org/Spanish/Inquistion/',
-  	('http://grail.cnri.reston.va.us/cgi-bin/faqw.py',
-  	 'query=pythonistas&querytype=simple&casefold=yes&req=search'),
-  	'http://www.python.org/',
+        'http://www.espn.com/', # redirect
+        'http://www.python.org/Spanish/Inquistion/',
+        ('http://grail.cnri.reston.va.us/cgi-bin/faqw.py',
+         'query=pythonistas&querytype=simple&casefold=yes&req=search'),
+        'http://www.python.org/',
         'ftp://prep.ai.mit.edu/welcome.msg',
         'ftp://www.python.org/pub/tmp/figure.prn',
         'ftp://www.python.org/pub/tmp/interp.pl',
-	'http://checkproxy.cnri.reston.va.us/test/test.html',
+        'http://checkproxy.cnri.reston.va.us/test/test.html',
             ]
 
     if localhost is not None:
@@ -1034,10 +1034,10 @@
 
     # XXX try out some custom proxy objects too!
     def at_cnri(req):
-	host = req.get_host()
-	print host
-	if host[-18:] == '.cnri.reston.va.us':
-	    return 1
+        host = req.get_host()
+        print host
+        if host[-18:] == '.cnri.reston.va.us':
+            return 1
     p = CustomProxy('http', at_cnri, 'proxy.cnri.reston.va.us')
     ph = CustomProxyHandler(p)
 
@@ -1052,9 +1052,9 @@
         try:
             f = urlopen(url, req)
         except IOError, err:
-	    print "IOError:", err
-	except socket.error, err:
-	    print "socket.error:", err
+            print "IOError:", err
+        except socket.error, err:
+            print "socket.error:", err
         else:
             buf = f.read()
             f.close()
diff --git a/Lib/whichdb.py b/Lib/whichdb.py
index aa1761c..4dd4e3a 100644
--- a/Lib/whichdb.py
+++ b/Lib/whichdb.py
@@ -56,7 +56,7 @@
 
     # BSD hash v2 has a 12-byte NULL pad in front of the file type
     try:
-	(magic,) = struct.unpack("=l", s16[-4:])
+        (magic,) = struct.unpack("=l", s16[-4:])
     except struct.error:
         return ""